/* === S Y N F I G ========================================================= */
/*! \file lyr_freetype.cpp
-** \brief Template Header
+** \brief Implementation of the "Text" layer
**
** $Id$
**
SYNFIG_LAYER_INIT(Layer_Freetype);
SYNFIG_LAYER_SET_NAME(Layer_Freetype,"text");
-SYNFIG_LAYER_SET_LOCAL_NAME(Layer_Freetype,_("Text"));
-SYNFIG_LAYER_SET_CATEGORY(Layer_Freetype,_("Other"));
+SYNFIG_LAYER_SET_LOCAL_NAME(Layer_Freetype,N_("Text"));
+SYNFIG_LAYER_SET_CATEGORY(Layer_Freetype,N_("Other"));
SYNFIG_LAYER_SET_VERSION(Layer_Freetype,"0.2");
SYNFIG_LAYER_SET_CVS_ID(Layer_Freetype,"$Id$");
//end evil hack
if(font_fam=="arial black")
+ {
#ifndef __APPLE__
- if(new_face("ariblk"))
+ if(new_face("ariblk"))
return true;
else
#endif
font_fam="sans serif";
+ }
if(font_fam=="sans serif" || font_fam=="arial")
{
IMPORT_PLUS(size, if(old_version){size/=2.0;} needs_sync_=true );
IMPORT_PLUS(text,needs_sync_=true);
IMPORT_PLUS(pos,needs_sync_=true);
- IMPORT(color);
+ IMPORT_PLUS(color, { if (color.get_a() == 0) { if (converted_blend_) {
+ set_blend_method(Color::BLEND_ALPHA_OVER);
+ color.set_a(1); } else transparent_color_ = true; } });
IMPORT(invert);
IMPORT_PLUS(orient,needs_sync_=true);
IMPORT_PLUS(compress,needs_sync_=true);
-- ** -- CREATE GLYPHS -------------------------------------------------------
*/
+ mbstate_t ps;
+ memset(&ps, 0, sizeof(ps));
+
lines.push_front(TextLine());
string::const_iterator iter;
for (iter=text.begin(); iter!=text.end(); ++iter)
glyph_index = FT_Get_Char_Index( face, ' ' );
}
else
- glyph_index = FT_Get_Char_Index( face, *iter );
+ {
+ wchar_t wc;
+ size_t converted = mbrtowc(&wc, &(*iter), text.end() - iter, &ps);
+
+ if(converted == (size_t)(-1))
+ {
+ synfig::warning("Layer_Freetype: multibyte: %s",
+ _("Invalid multibyte sequence - is the locale set?\n"));
+ continue;
+ }
+
+ if(converted == (size_t)(-2))
+ {
+ synfig::warning("Layer_Freetype: multibyte: %s",
+ _("Can't parse multibyte character.\n"));
+ continue;
+ }
+
+ glyph_index = FT_Get_Char_Index( face, wc );
+
+ if(converted > 1)
+ iter += converted - 1;
+ }
// retrieve kerning distance and move pen position
if ( FT_HAS_KERNING(face) && use_kerning && previous && glyph_index )