47#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
55#define CF2_MAX_SIZE cf2_intToFixed( 2000 )
65 cf2_checkTransform(
const CF2_Matrix* transform,
71 if ( transform->a <= 0 || transform->d <= 0 )
72 return FT_THROW( Invalid_Size_Handle );
74 FT_ASSERT( unitsPerEm > 0 );
75 FT_ASSERT( transform->b == 0 && transform->c == 0 );
76 FT_ASSERT( transform->tx == 0 && transform->ty == 0 );
78 if ( unitsPerEm > 0x7FFF )
79 return FT_THROW( Glyph_Too_Big );
81 maxScale = FT_DivFix( CF2_MAX_SIZE, cf2_intToFixed( unitsPerEm ) );
83 if ( transform->a > maxScale || transform->d > maxScale )
84 return FT_THROW( Glyph_Too_Big );
91 cf2_setGlyphWidth( CF2_Outline outline,
94 PS_Decoder* decoder = outline->decoder;
99 if ( !decoder->builder.is_t1 )
100 *decoder->glyph_width = cf2_fixedToInt( width );
106 cf2_free_instance(
void* ptr )
108 CF2_Font font = (CF2_Font)ptr;
113 FT_Memory memory = font->memory;
116 FT_FREE( font->blend.lastNDV );
117 FT_FREE( font->blend.BV );
130 cf2_builder_moveTo( CF2_OutlineCallbacks callbacks,
131 const CF2_CallbackParams params )
134 CF2_Outline outline = (CF2_Outline)callbacks;
140 FT_ASSERT( outline && outline->decoder );
141 FT_ASSERT( params->op == CF2_PathOpMoveTo );
143 builder = &outline->decoder->builder;
146 ps_builder_close_contour( builder );
147 builder->path_begun = 0;
152 cf2_builder_lineTo( CF2_OutlineCallbacks callbacks,
153 const CF2_CallbackParams params )
158 CF2_Outline outline = (CF2_Outline)callbacks;
162 FT_ASSERT( outline && outline->decoder );
163 FT_ASSERT( params->op == CF2_PathOpLineTo );
165 builder = &outline->decoder->builder;
167 if ( !builder->path_begun )
171 error = ps_builder_start_point( builder,
176 if ( !*callbacks->error )
177 *callbacks->error = error;
183 error = ps_builder_add_point1( builder,
188 if ( !*callbacks->error )
189 *callbacks->error = error;
196 cf2_builder_cubeTo( CF2_OutlineCallbacks callbacks,
197 const CF2_CallbackParams params )
202 CF2_Outline outline = (CF2_Outline)callbacks;
206 FT_ASSERT( outline && outline->decoder );
207 FT_ASSERT( params->op == CF2_PathOpCubeTo );
209 builder = &outline->decoder->builder;
211 if ( !builder->path_begun )
215 error = ps_builder_start_point( builder,
220 if ( !*callbacks->error )
221 *callbacks->error = error;
227 error = ps_builder_check_points( builder, 3 );
230 if ( !*callbacks->error )
231 *callbacks->error = error;
235 ps_builder_add_point( builder,
238 ps_builder_add_point( builder,
241 ps_builder_add_point( builder,
248 cf2_outline_init( CF2_Outline outline,
254 outline->root.memory = memory;
255 outline->root.error = error;
257 outline->root.moveTo = cf2_builder_moveTo;
258 outline->root.lineTo = cf2_builder_lineTo;
259 outline->root.cubeTo = cf2_builder_cubeTo;
265 cf2_getScaleAndHintFlag( PS_Decoder* decoder,
271 FT_ASSERT( decoder && decoder->builder.glyph );
274 *hinted = decoder->builder.glyph->hint;
275 *scaled = decoder->builder.glyph->scaled;
279 *x_scale = ADD_INT32( decoder->builder.glyph->x_scale, 32 ) / 64;
280 *y_scale = ADD_INT32( decoder->builder.glyph->y_scale, 32 ) / 64;
296 cf2_getUnitsPerEm( PS_Decoder* decoder )
298 FT_ASSERT( decoder && decoder->builder.face );
300 return decoder->builder.face->units_per_EM;
305 FT_LOCAL_DEF( FT_Error )
306 cf2_decoder_parse_charstrings( PS_Decoder* decoder,
307 FT_Byte* charstring_base,
308 FT_ULong charstring_len )
311 FT_Error error = FT_Err_Ok;
314 FT_Bool is_t1 = decoder->builder.is_t1;
317 FT_ASSERT( decoder &&
318 ( is_t1 || decoder->cff ) );
320 if ( is_t1 && !decoder->current_subfont )
322 FT_ERROR((
"cf2_decoder_parse_charstrings (Type 1): "
323 "SubFont missing. Use `t1_make_subfont' first\n" ));
324 return FT_THROW( Invalid_Table );
327 memory = decoder->builder.memory;
330 font = (CF2_Font)decoder->cf2_instance->data;
333 if ( !decoder->cf2_instance->data )
335 decoder->cf2_instance->finalizer =
336 (FT_Generic_Finalizer)cf2_free_instance;
338 if ( FT_ALLOC( decoder->cf2_instance->data,
339 sizeof ( CF2_FontRec ) ) )
340 return FT_THROW( Out_Of_Memory );
342 font = (CF2_Font)decoder->cf2_instance->data;
344 font->memory = memory;
347 font->cffload = (FT_Service_CFFLoad)decoder->cff->cffload;
350 cf2_outline_init( &font->outline, font->memory, &font->error );
355 font->decoder = decoder;
356 font->outline.decoder = decoder;
361 PS_Builder* builder = &decoder->builder;
362 PS_Driver driver = (PS_Driver)FT_FACE_DRIVER( builder->face );
364 FT_Bool no_stem_darkening_driver =
365 driver->no_stem_darkening;
366 FT_Char no_stem_darkening_font =
367 builder->face->internal->no_stem_darkening;
370 FT_Error error2 = FT_Err_Ok;
372 CF2_Matrix transform;
373 CF2_F16Dot16 glyphWidth;
381 FT_ASSERT( charstring_base + charstring_len >= charstring_base );
385 buf.ptr = charstring_base;
386 buf.end = FT_OFFSET( charstring_base, charstring_len );
388 FT_ZERO( &transform );
390 cf2_getScaleAndHintFlag( decoder,
397 font->isCFF2 = FALSE;
401 font->isCFF2 = ((TT_Face)builder->face)->is_cff2;
405 font->renderingFlags = 0;
407 font->renderingFlags |= CF2_FlagsHinted;
408 if ( scaled && ( !no_stem_darkening_font ||
409 ( no_stem_darkening_font < 0 &&
410 !no_stem_darkening_driver ) ) )
411 font->renderingFlags |= CF2_FlagsDarkened;
413 font->darkenParams[0] = driver->darken_params[0];
414 font->darkenParams[1] = driver->darken_params[1];
415 font->darkenParams[2] = driver->darken_params[2];
416 font->darkenParams[3] = driver->darken_params[3];
417 font->darkenParams[4] = driver->darken_params[4];
418 font->darkenParams[5] = driver->darken_params[5];
419 font->darkenParams[6] = driver->darken_params[6];
420 font->darkenParams[7] = driver->darken_params[7];
424 font->unitsPerEm = (CF2_Int)cf2_getUnitsPerEm( decoder );
428 error2 = cf2_checkTransform( &transform, font->unitsPerEm );
433 error2 = cf2_getGlyphOutline( font, &buf, &transform, &glyphWidth );
435 return FT_ERR( Invalid_File_Format );
437 cf2_setGlyphWidth( &font->outline, glyphWidth );
445 FT_LOCAL_DEF( CFF_SubFont )
446 cf2_getSubfont( PS_Decoder* decoder )
448 FT_ASSERT( decoder && decoder->current_subfont );
450 return decoder->current_subfont;
455 FT_LOCAL_DEF( CFF_VStore )
456 cf2_getVStore( PS_Decoder* decoder )
458 FT_ASSERT( decoder && decoder->cff );
460 return &decoder->cff->vstore;
465 FT_LOCAL_DEF( FT_UInt )
466 cf2_getMaxstack( PS_Decoder* decoder )
468 FT_ASSERT( decoder && decoder->cff );
470 return decoder->cff->top_font.font_dict.maxstack;
474#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
479 FT_LOCAL_DEF( FT_Error )
480 cf2_getNormalizedVector( PS_Decoder* decoder,
485 FT_Service_MultiMasters mm;
488 FT_ASSERT( decoder && decoder->builder.face );
489 FT_ASSERT( vec && len );
490 FT_ASSERT( !decoder->builder.is_t1 );
492 face = (TT_Face)decoder->builder.face;
493 mm = (FT_Service_MultiMasters)face->mm;
495 return mm->get_var_blend( FT_FACE( face ), len, NULL, vec, NULL );
501 FT_LOCAL_DEF( CF2_Fixed )
502 cf2_getPpemY( PS_Decoder* decoder )
504 FT_ASSERT( decoder &&
505 decoder->builder.face &&
506 decoder->builder.face->size );
517 return cf2_intToFixed(
518 decoder->builder.face->size->metrics.y_ppem );
525 FT_LOCAL_DEF( CF2_Fixed )
526 cf2_getStdVW( PS_Decoder* decoder )
528 FT_ASSERT( decoder && decoder->current_subfont );
530 return cf2_intToFixed(
531 decoder->current_subfont->private_dict.standard_height );
535 FT_LOCAL_DEF( CF2_Fixed )
536 cf2_getStdHW( PS_Decoder* decoder )
538 FT_ASSERT( decoder && decoder->current_subfont );
540 return cf2_intToFixed(
541 decoder->current_subfont->private_dict.standard_width );
547 cf2_getBlueMetrics( PS_Decoder* decoder,
548 CF2_Fixed* blueScale,
549 CF2_Fixed* blueShift,
550 CF2_Fixed* blueFuzz )
552 FT_ASSERT( decoder && decoder->current_subfont );
554 *blueScale = FT_DivFix(
555 decoder->current_subfont->private_dict.blue_scale,
556 cf2_intToFixed( 1000 ) );
557 *blueShift = cf2_intToFixed(
558 decoder->current_subfont->private_dict.blue_shift );
559 *blueFuzz = cf2_intToFixed(
560 decoder->current_subfont->private_dict.blue_fuzz );
567 cf2_getBlueValues( PS_Decoder* decoder,
571 FT_ASSERT( decoder && decoder->current_subfont );
573 *count = decoder->current_subfont->private_dict.num_blue_values;
575 &decoder->current_subfont->private_dict.blue_values;
580 cf2_getOtherBlues( PS_Decoder* decoder,
584 FT_ASSERT( decoder && decoder->current_subfont );
586 *count = decoder->current_subfont->private_dict.num_other_blues;
588 &decoder->current_subfont->private_dict.other_blues;
593 cf2_getFamilyBlues( PS_Decoder* decoder,
597 FT_ASSERT( decoder && decoder->current_subfont );
599 *count = decoder->current_subfont->private_dict.num_family_blues;
601 &decoder->current_subfont->private_dict.family_blues;
606 cf2_getFamilyOtherBlues( PS_Decoder* decoder,
610 FT_ASSERT( decoder && decoder->current_subfont );
612 *count = decoder->current_subfont->private_dict.num_family_other_blues;
614 &decoder->current_subfont->private_dict.family_other_blues;
618 FT_LOCAL_DEF( CF2_Int )
619 cf2_getLanguageGroup( PS_Decoder* decoder )
621 FT_ASSERT( decoder && decoder->current_subfont );
623 return decoder->current_subfont->private_dict.language_group;
629 FT_LOCAL_DEF( CF2_Int )
630 cf2_initGlobalRegionBuffer( PS_Decoder* decoder,
637 FT_ASSERT( decoder );
641 idx = (CF2_UInt)( subrNum + decoder->globals_bias );
642 if ( idx >= decoder->num_globals )
645 FT_ASSERT( decoder->globals );
648 buf->ptr = decoder->globals[idx];
649 buf->end = decoder->globals[idx + 1];
657 FT_LOCAL_DEF( FT_Error )
658 cf2_getSeacComponent( PS_Decoder* decoder,
668 FT_ASSERT( decoder );
669 FT_ASSERT( !decoder->builder.is_t1 );
673#ifdef FT_CONFIG_OPTION_INCREMENTAL
676 if ( decoder->builder.face->internal->incremental_interface )
681 gid = cff_lookup_glyph_by_stdcharcode( decoder->cff,
code );
683 return FT_THROW( Invalid_Glyph_Format );
686 error = decoder->get_glyph_callback( (TT_Face)decoder->builder.face,
695 FT_ASSERT( charstring + len >= charstring );
697 buf->start = charstring;
698 buf->end = FT_OFFSET( charstring, len );
699 buf->ptr = buf->start;
706 cf2_freeSeacComponent( PS_Decoder* decoder,
709 FT_ASSERT( decoder );
710 FT_ASSERT( !decoder->builder.is_t1 );
712 decoder->free_glyph_callback( (TT_Face)decoder->builder.face,
713 (FT_Byte**)&buf->start,
714 (FT_ULong)( buf->end - buf->start ) );
718 FT_LOCAL_DEF( FT_Error )
719 cf2_getT1SeacComponent( PS_Decoder* decoder,
724 FT_Error error = FT_Err_Ok;
725 T1_Face face = (T1_Face)decoder->builder.face;
726 T1_Font type1 = &face->type1;
728#ifdef FT_CONFIG_OPTION_INCREMENTAL
729 FT_Incremental_InterfaceRec *inc =
730 face->root.internal->incremental_interface;
736 error = inc->funcs->get_glyph_data( inc->object,
737 glyph_index, &glyph_data );
742 glyph_data.pointer = type1->charstrings[glyph_index];
743 glyph_data.length = type1->charstrings_len[glyph_index];
748 FT_Byte* charstring_base = (FT_Byte*)glyph_data.pointer;
749 FT_ULong charstring_len = glyph_data.length;
752 FT_ASSERT( charstring_base + charstring_len >= charstring_base );
756 buf->ptr = charstring_base;
757 buf->end = charstring_base + charstring_len;
765 cf2_freeT1SeacComponent( PS_Decoder* decoder,
768#ifdef FT_CONFIG_OPTION_INCREMENTAL
774 FT_ASSERT( decoder );
776 face = (T1_Face)decoder->builder.face;
778 data.pointer = buf->start;
779 data.length = (FT_UInt)( buf->end - buf->start );
781 if ( face->root.internal->incremental_interface )
782 face->root.internal->incremental_interface->funcs->free_glyph_data(
783 face->root.internal->incremental_interface->object,
788 FT_UNUSED( decoder );
795 FT_LOCAL_DEF( CF2_Int )
796 cf2_initLocalRegionBuffer( PS_Decoder* decoder,
803 FT_ASSERT( decoder );
807 idx = (CF2_UInt)( subrNum + decoder->locals_bias );
808 if ( idx >= decoder->num_locals )
811 FT_ASSERT( decoder->locals );
813 buf->start = decoder->locals[idx];
815 if ( decoder->builder.is_t1 )
820 if ( decoder->locals_len )
821 buf->end = FT_OFFSET( buf->start, decoder->locals_len[idx] );
826 buf->start += ( decoder->lenIV >= 0 ? decoder->lenIV : 0 );
827 buf->end = decoder->locals[idx + 1];
832 FT_ERROR((
"cf2_initLocalRegionBuffer (Type 1 mode):"
833 " invoking empty subrs\n" ));
838 buf->end = decoder->locals[idx + 1];
841 buf->ptr = buf->start;
847 FT_LOCAL_DEF( CF2_Fixed )
848 cf2_getDefaultWidthX( PS_Decoder* decoder )
850 FT_ASSERT( decoder && decoder->current_subfont );
852 return cf2_intToFixed(
853 decoder->current_subfont->private_dict.default_width );
857 FT_LOCAL_DEF( CF2_Fixed )
858 cf2_getNominalWidthX( PS_Decoder* decoder )
860 FT_ASSERT( decoder && decoder->current_subfont );
862 return cf2_intToFixed(
863 decoder->current_subfont->private_dict.nominal_width );
868 cf2_outline_reset( CF2_Outline outline )
870 PS_Decoder* decoder = outline->decoder;
873 FT_ASSERT( decoder );
875 outline->root.windingMomentum = 0;
877 FT_GlyphLoader_Rewind( decoder->builder.loader );
882 cf2_outline_close( CF2_Outline outline )
884 PS_Decoder* decoder = outline->decoder;
887 FT_ASSERT( decoder );
889 ps_builder_close_contour( &decoder->builder );
891 FT_GlyphLoader_Add( decoder->builder.loader );