36#define FT_COMPONENT otsvg
39#ifdef FT_CONFIG_OPTION_SVG
43 ft_svg_init( FT_Module module )
45 SVG_Renderer render = (SVG_Renderer)module;
47 FT_Error error = FT_Err_Ok;
50 render->loaded = FALSE;
51 render->hooks_set = FALSE;
58 ft_svg_done( FT_Module module )
60 SVG_Renderer render = (SVG_Renderer)module;
63 if ( render->loaded == TRUE &&
64 render->hooks_set == TRUE )
65 render->hooks.free_svg( &render->state );
67 render->loaded = FALSE;
72 ft_svg_preset_slot( FT_Module module,
76 SVG_Renderer svg_renderer = (SVG_Renderer)module;
77 SVG_RendererHooks hooks = svg_renderer->hooks;
80 if ( svg_renderer->hooks_set == FALSE )
82 FT_TRACE1((
"Hooks are NOT set. Can't render OT-SVG glyphs\n" ));
83 return FT_THROW( Missing_SVG_Hooks );
86 if ( svg_renderer->loaded == FALSE )
88 FT_TRACE3((
"ft_svg_preset_slot: first presetting call,"
89 " calling init hook\n" ));
90 hooks.init_svg( &svg_renderer->state );
92 svg_renderer->loaded = TRUE;
95 return hooks.preset_slot( slot, cache, &svg_renderer->state );
100 ft_svg_render( FT_Renderer renderer,
103 const FT_Vector* origin )
105 SVG_Renderer svg_renderer = (SVG_Renderer)renderer;
107 FT_Library library = renderer->root.library;
108 FT_Memory memory = library->memory;
111 FT_ULong size_image_buffer;
113 SVG_RendererHooks hooks = svg_renderer->hooks;
119 if ( mode != FT_RENDER_MODE_NORMAL )
120 return FT_THROW( Bad_Argument );
122 if ( svg_renderer->hooks_set == FALSE )
124 FT_TRACE1((
"Hooks are NOT set. Can't render OT-SVG glyphs\n" ));
125 return FT_THROW( Missing_SVG_Hooks );
128 if ( svg_renderer->loaded == FALSE )
130 FT_TRACE3((
"ft_svg_render: first rendering, calling init hook\n" ));
131 error = hooks.init_svg( &svg_renderer->state );
133 svg_renderer->loaded = TRUE;
136 ft_svg_preset_slot( (FT_Module)renderer, slot, TRUE );
138 size_image_buffer = (FT_ULong)slot->bitmap.pitch * slot->bitmap.rows;
141 if ( FT_ALLOC( slot->bitmap.buffer, size_image_buffer ) )
144 error = hooks.render_svg( slot, &svg_renderer->state );
146 FT_FREE( slot->bitmap.buffer );
148 slot->internal->flags |= FT_GLYPH_OWN_BITMAP;
154 static const SVG_Interface svg_interface =
161 ft_svg_property_set( FT_Module module,
162 const char* property_name,
164 FT_Bool value_is_string )
166 FT_Error error = FT_Err_Ok;
167 SVG_Renderer renderer = (SVG_Renderer)module;
170 if ( !ft_strcmp( property_name,
"svg-hooks" ) )
172 SVG_RendererHooks* hooks;
175 if ( value_is_string == TRUE )
177 error = FT_THROW( Invalid_Argument );
181 hooks = (SVG_RendererHooks*)value;
183 if ( !hooks->init_svg ||
185 !hooks->render_svg ||
186 !hooks->preset_slot )
188 FT_TRACE0((
"ft_svg_property_set:"
189 " SVG rendering hooks not set because\n" ));
191 " at least one function pointer is NULL\n" ));
193 error = FT_THROW( Invalid_Argument );
197 renderer->hooks = *hooks;
198 renderer->hooks_set = TRUE;
201 error = FT_THROW( Missing_Property );
209 ft_svg_property_get( FT_Module module,
210 const char* property_name,
213 FT_Error error = FT_Err_Ok;
214 SVG_Renderer renderer = (SVG_Renderer)module;
217 if ( !ft_strcmp( property_name,
"svg-hooks" ) )
219 SVG_RendererHooks* hooks = (SVG_RendererHooks*)value;
222 *hooks = renderer->hooks;
225 error = FT_THROW( Missing_Property );
231 FT_DEFINE_SERVICE_PROPERTIESREC(
232 ft_svg_service_properties,
239 FT_DEFINE_SERVICEDESCREC1(
241 FT_SERVICE_ID_PROPERTIES, &ft_svg_service_properties )
244 FT_CALLBACK_DEF( FT_Module_Interface )
245 ft_svg_get_interface( FT_Module module,
246 const char* ft_svg_interface )
248 FT_Module_Interface result;
253 result = ft_service_list_lookup( ft_svg_services, ft_svg_interface );
262 ft_svg_transform( FT_Renderer renderer,
264 const FT_Matrix* _matrix,
265 const FT_Vector* _delta )
267 FT_SVG_Document doc = (FT_SVG_Document)slot->other;
268 FT_Matrix* matrix = (FT_Matrix*)_matrix;
269 FT_Vector* delta = (FT_Vector*)_delta;
271 FT_Matrix tmp_matrix;
278 FT_UNUSED( renderer );
282 tmp_matrix.xx = 0x10000;
285 tmp_matrix.yy = 0x10000;
287 matrix = &tmp_matrix;
300 FT_Matrix_Multiply( &b, &a );
303 x = ADD_LONG( ADD_LONG( FT_MulFix( matrix->xx, doc->delta.x ),
304 FT_MulFix( matrix->xy, doc->delta.y ) ),
306 y = ADD_LONG( ADD_LONG( FT_MulFix( matrix->yx, doc->delta.x ),
307 FT_MulFix( matrix->yy, doc->delta.y ) ),
320#ifdef FT_CONFIG_OPTION_SVG
321#define PUT_SVG_MODULE( a ) a
322#define SVG_GLYPH_FORMAT FT_GLYPH_FORMAT_SVG
324#define PUT_SVG_MODULE( a ) NULL
325#define SVG_GLYPH_FORMAT FT_GLYPH_FORMAT_NONE
330 ft_svg_renderer_class,
333 sizeof ( SVG_RendererRec ),
339 (
const void*)PUT_SVG_MODULE( &svg_interface ),
341 PUT_SVG_MODULE( ft_svg_init ),
342 PUT_SVG_MODULE( ft_svg_done ),
343 PUT_SVG_MODULE( ft_svg_get_interface ),
347 PUT_SVG_MODULE( ft_svg_render ),
348 PUT_SVG_MODULE( ft_svg_transform ),