add support for new postscript hinter
This commit is contained in:
parent
573a98d048
commit
5893c1bb2a
|
@ -4,9 +4,11 @@ FT_USE_MODULE(t1cid_driver_class)
|
||||||
FT_USE_MODULE(pcf_driver_class)
|
FT_USE_MODULE(pcf_driver_class)
|
||||||
FT_USE_MODULE(psaux_module_class)
|
FT_USE_MODULE(psaux_module_class)
|
||||||
FT_USE_MODULE(psnames_module_class)
|
FT_USE_MODULE(psnames_module_class)
|
||||||
|
FT_USE_MODULE(pshinter_module_class)
|
||||||
FT_USE_MODULE(ft_raster1_renderer_class)
|
FT_USE_MODULE(ft_raster1_renderer_class)
|
||||||
FT_USE_MODULE(sfnt_module_class)
|
FT_USE_MODULE(sfnt_module_class)
|
||||||
FT_USE_MODULE(ft_smooth_renderer_class)
|
FT_USE_MODULE(ft_smooth_renderer_class)
|
||||||
FT_USE_MODULE(tt_driver_class)
|
FT_USE_MODULE(tt_driver_class)
|
||||||
FT_USE_MODULE(t1_driver_class)
|
FT_USE_MODULE(t1_driver_class)
|
||||||
FT_USE_MODULE(winfnt_driver_class)
|
FT_USE_MODULE(winfnt_driver_class)
|
||||||
|
|
||||||
|
|
|
@ -171,13 +171,16 @@ FT_BEGIN_HEADER
|
||||||
/* glyph_delta :: The 2d translation vector corresponding to */
|
/* glyph_delta :: The 2d translation vector corresponding to */
|
||||||
/* the glyph transformation, if necessary. */
|
/* the glyph transformation, if necessary. */
|
||||||
/* */
|
/* */
|
||||||
|
/* glyph_hints :: format-specific glyph hints management */
|
||||||
|
/* */
|
||||||
typedef struct FT_Slot_InternalRec_
|
typedef struct FT_Slot_InternalRec_
|
||||||
{
|
{
|
||||||
FT_GlyphLoader* loader;
|
FT_GlyphLoader* loader;
|
||||||
FT_Bool glyph_transformed;
|
FT_Bool glyph_transformed;
|
||||||
FT_Matrix glyph_matrix;
|
FT_Matrix glyph_matrix;
|
||||||
FT_Vector glyph_delta;
|
FT_Vector glyph_delta;
|
||||||
|
void* glyph_hints;
|
||||||
|
|
||||||
} FT_GlyphSlot_InternalRec;
|
} FT_GlyphSlot_InternalRec;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -40,8 +40,10 @@
|
||||||
#define FT_INTERNAL_CFF_TYPES_H <freetype/internal/cfftypes.h>
|
#define FT_INTERNAL_CFF_TYPES_H <freetype/internal/cfftypes.h>
|
||||||
#define FT_INTERNAL_FNT_TYPES_H <freetype/internal/fnttypes.h>
|
#define FT_INTERNAL_FNT_TYPES_H <freetype/internal/fnttypes.h>
|
||||||
|
|
||||||
#define FT_INTERNAL_POSTSCRIPT_NAMES_H <freetype/internal/psnames.h>
|
#define FT_INTERNAL_POSTSCRIPT_NAMES_H <freetype/internal/psnames.h>
|
||||||
#define FT_INTERNAL_POSTSCRIPT_AUX_H <freetype/internal/psaux.h>
|
#define FT_INTERNAL_POSTSCRIPT_AUX_H <freetype/internal/psaux.h>
|
||||||
|
#define FT_INTERNAL_POSTSCRIPT_HINTS_H <freetype/internal/pshints.h>
|
||||||
|
#define FT_INTERNAL_POSTSCRIPT_GLOBALS_H <freetype/internal/psglobal.h>
|
||||||
|
|
||||||
#define FT_INTERNAL_AUTOHINT_H <freetype/internal/autohint.h>
|
#define FT_INTERNAL_AUTOHINT_H <freetype/internal/autohint.h>
|
||||||
|
|
||||||
|
|
|
@ -426,19 +426,11 @@ FT_BEGIN_HEADER
|
||||||
|
|
||||||
typedef struct T1_Builder_Funcs_
|
typedef struct T1_Builder_Funcs_
|
||||||
{
|
{
|
||||||
<<<<<<< psaux.h
|
|
||||||
void
|
|
||||||
(*init)( T1_Builder* builder,
|
|
||||||
FT_Face face,
|
|
||||||
FT_Size size,
|
|
||||||
FT_GlyphSlot slot );
|
|
||||||
=======
|
|
||||||
void (*init)( T1_Builder* builder,
|
void (*init)( T1_Builder* builder,
|
||||||
FT_Face face,
|
FT_Face face,
|
||||||
FT_Size size,
|
FT_Size size,
|
||||||
FT_GlyphSlot slot,
|
FT_GlyphSlot slot,
|
||||||
FT_Bool hinting );
|
FT_Bool hinting );
|
||||||
>>>>>>> 1.14.2.2
|
|
||||||
|
|
||||||
void
|
void
|
||||||
(*done)( T1_Builder* builder );
|
(*done)( T1_Builder* builder );
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
#include<ft2build.h>
|
#include<ft2build.h>
|
||||||
#include FT_TYPE1_TABLES_H
|
#include FT_TYPE1_TABLES_H
|
||||||
#include FT_INTERNAL_POSTSCRIPT_NAMES_H
|
#include FT_INTERNAL_POSTSCRIPT_NAMES_H
|
||||||
|
#include FT_INTERNAL_POSTSCRIPT_HINTS_H
|
||||||
|
|
||||||
FT_BEGIN_HEADER
|
FT_BEGIN_HEADER
|
||||||
|
|
||||||
|
@ -172,6 +172,9 @@ FT_BEGIN_HEADER
|
||||||
|
|
||||||
/* support for Multiple Masters fonts */
|
/* support for Multiple Masters fonts */
|
||||||
T1_Blend* blend;
|
T1_Blend* blend;
|
||||||
|
|
||||||
|
/* since FT 2.1 - interface to Postscript hinter */
|
||||||
|
void* pshinter;
|
||||||
|
|
||||||
} T1_FaceRec;
|
} T1_FaceRec;
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@ SubDirHdrs [ FT2_SubDir src ] ;
|
||||||
#
|
#
|
||||||
HDRMACRO [ FT2_SubDir include internal internal.h ] ;
|
HDRMACRO [ FT2_SubDir include internal internal.h ] ;
|
||||||
|
|
||||||
|
SubInclude FT2_TOP src pshinter ;
|
||||||
SubInclude FT2_TOP src autohint ;
|
SubInclude FT2_TOP src autohint ;
|
||||||
SubInclude FT2_TOP src base ;
|
SubInclude FT2_TOP src base ;
|
||||||
SubInclude FT2_TOP src cache ;
|
SubInclude FT2_TOP src cache ;
|
||||||
|
|
|
@ -101,7 +101,7 @@
|
||||||
|
|
||||||
static FT_Error
|
static FT_Error
|
||||||
reallocate_t1_table( PS_Table* table,
|
reallocate_t1_table( PS_Table* table,
|
||||||
FT_Long new_size )
|
FT_Int new_size )
|
||||||
{
|
{
|
||||||
FT_Memory memory = table->memory;
|
FT_Memory memory = table->memory;
|
||||||
FT_Byte* old_base = table->block;
|
FT_Byte* old_base = table->block;
|
||||||
|
@ -1071,7 +1071,8 @@
|
||||||
T1_Builder_Init( T1_Builder* builder,
|
T1_Builder_Init( T1_Builder* builder,
|
||||||
FT_Face face,
|
FT_Face face,
|
||||||
FT_Size size,
|
FT_Size size,
|
||||||
FT_GlyphSlot glyph )
|
FT_GlyphSlot glyph,
|
||||||
|
FT_Bool hinting )
|
||||||
{
|
{
|
||||||
builder->path_begun = 0;
|
builder->path_begun = 0;
|
||||||
builder->load_points = 1;
|
builder->load_points = 1;
|
||||||
|
@ -1085,10 +1086,16 @@
|
||||||
FT_GlyphLoader* loader = glyph->internal->loader;
|
FT_GlyphLoader* loader = glyph->internal->loader;
|
||||||
|
|
||||||
|
|
||||||
builder->loader = loader;
|
builder->loader = loader;
|
||||||
builder->base = &loader->base.outline;
|
builder->base = &loader->base.outline;
|
||||||
builder->current = &loader->current.outline;
|
builder->current = &loader->current.outline;
|
||||||
FT_GlyphLoader_Rewind( loader );
|
FT_GlyphLoader_Rewind( loader );
|
||||||
|
|
||||||
|
builder->hints_globals = size->internal;
|
||||||
|
builder->hints_funcs = 0;
|
||||||
|
|
||||||
|
if (hinting)
|
||||||
|
builder->hints_funcs = glyph->internal->glyph_hints;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( size )
|
if ( size )
|
||||||
|
|
|
@ -147,7 +147,8 @@ FT_BEGIN_HEADER
|
||||||
T1_Builder_Init( T1_Builder* builder,
|
T1_Builder_Init( T1_Builder* builder,
|
||||||
FT_Face face,
|
FT_Face face,
|
||||||
FT_Size size,
|
FT_Size size,
|
||||||
FT_GlyphSlot glyph );
|
FT_GlyphSlot glyph,
|
||||||
|
FT_Bool hinting );
|
||||||
|
|
||||||
FT_LOCAL void
|
FT_LOCAL void
|
||||||
T1_Builder_Done( T1_Builder* builder );
|
T1_Builder_Done( T1_Builder* builder );
|
||||||
|
@ -176,7 +177,6 @@ FT_BEGIN_HEADER
|
||||||
FT_Pos x,
|
FT_Pos x,
|
||||||
FT_Pos y );
|
FT_Pos y );
|
||||||
|
|
||||||
|
|
||||||
FT_LOCAL void
|
FT_LOCAL void
|
||||||
T1_Builder_Close_Contour( T1_Builder* builder );
|
T1_Builder_Close_Contour( T1_Builder* builder );
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
|
|
||||||
#include <ft2build.h>
|
#include <ft2build.h>
|
||||||
#include FT_INTERNAL_DEBUG_H
|
#include FT_INTERNAL_DEBUG_H
|
||||||
|
#include FT_INTERNAL_POSTSCRIPT_HINTS_H
|
||||||
#include FT_OUTLINE_H
|
#include FT_OUTLINE_H
|
||||||
|
|
||||||
#include "t1decode.h"
|
#include "t1decode.h"
|
||||||
|
@ -140,7 +141,7 @@
|
||||||
FT_String* name = (FT_String*)decoder->glyph_names[n];
|
FT_String* name = (FT_String*)decoder->glyph_names[n];
|
||||||
|
|
||||||
|
|
||||||
if ( name && strcmp( name,glyph_name ) == 0 )
|
if ( name && name[0] == glyph_name[0] && strcmp( name,glyph_name ) == 0 )
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -244,6 +245,7 @@
|
||||||
glyph->format = ft_glyph_format_composite;
|
glyph->format = ft_glyph_format_composite;
|
||||||
|
|
||||||
loader->current.num_subglyphs = 2;
|
loader->current.num_subglyphs = 2;
|
||||||
|
goto Exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* First load `bchar' in builder */
|
/* First load `bchar' in builder */
|
||||||
|
@ -266,6 +268,9 @@
|
||||||
decoder->builder.left_bearing.x = 0;
|
decoder->builder.left_bearing.x = 0;
|
||||||
decoder->builder.left_bearing.y = 0;
|
decoder->builder.left_bearing.y = 0;
|
||||||
|
|
||||||
|
decoder->builder.pos_x = adx - asb;
|
||||||
|
decoder->builder.pos_y = ady;
|
||||||
|
|
||||||
/* Now load `achar' on top of */
|
/* Now load `achar' on top of */
|
||||||
/* the base outline */
|
/* the base outline */
|
||||||
error = T1_Decoder_Parse_Glyph( decoder, achar_index );
|
error = T1_Decoder_Parse_Glyph( decoder, achar_index );
|
||||||
|
@ -278,17 +283,22 @@
|
||||||
decoder->builder.left_bearing = left_bearing;
|
decoder->builder.left_bearing = left_bearing;
|
||||||
decoder->builder.advance = advance;
|
decoder->builder.advance = advance;
|
||||||
|
|
||||||
|
/* XXX: old code doesn't work with postscript hinter */
|
||||||
|
#if 0
|
||||||
/* Finally, move the accent */
|
/* Finally, move the accent */
|
||||||
if ( decoder->builder.load_points )
|
if ( decoder->builder.load_points )
|
||||||
{
|
{
|
||||||
FT_Outline dummy;
|
FT_Outline dummy;
|
||||||
|
|
||||||
|
|
||||||
dummy.n_points = (short)( base->n_points - n_base_points );
|
dummy.n_points = (short)( base->n_points - n_base_points );
|
||||||
dummy.points = base->points + n_base_points;
|
dummy.points = base->points + n_base_points;
|
||||||
|
|
||||||
FT_Outline_Translate( &dummy, adx - asb, ady );
|
FT_Outline_Translate( &dummy, adx - asb, ady );
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
decoder->builder.pos_x = 0;
|
||||||
|
decoder->builder.pos_y = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
Exit:
|
Exit:
|
||||||
return error;
|
return error;
|
||||||
|
@ -323,8 +333,9 @@
|
||||||
FT_Byte* ip;
|
FT_Byte* ip;
|
||||||
FT_Byte* limit;
|
FT_Byte* limit;
|
||||||
T1_Builder* builder = &decoder->builder;
|
T1_Builder* builder = &decoder->builder;
|
||||||
FT_Pos x, y;
|
FT_Pos x, y, orig_x, orig_y;
|
||||||
|
|
||||||
|
T1_Hints_Funcs hinter;
|
||||||
|
|
||||||
/* we don't want to touch the source code -- use macro trick */
|
/* we don't want to touch the source code -- use macro trick */
|
||||||
#define start_point T1_Builder_Start_Point
|
#define start_point T1_Builder_Start_Point
|
||||||
|
@ -341,14 +352,20 @@
|
||||||
|
|
||||||
builder->path_begun = 0;
|
builder->path_begun = 0;
|
||||||
|
|
||||||
|
hinter = (T1_Hints_Funcs) builder->hints_funcs;
|
||||||
|
|
||||||
zone->base = charstring_base;
|
zone->base = charstring_base;
|
||||||
limit = zone->limit = charstring_base + charstring_len;
|
limit = zone->limit = charstring_base + charstring_len;
|
||||||
ip = zone->cursor = zone->base;
|
ip = zone->cursor = zone->base;
|
||||||
|
|
||||||
error = PSaux_Err_Ok;
|
error = PSaux_Err_Ok;
|
||||||
|
|
||||||
x = builder->pos_x;
|
x = orig_x = builder->pos_x;
|
||||||
y = builder->pos_y;
|
y = orig_y = builder->pos_y;
|
||||||
|
|
||||||
|
/* begin hints recording session, if any */
|
||||||
|
if ( hinter )
|
||||||
|
hinter->open( hinter->hints );
|
||||||
|
|
||||||
/* now, execute loop */
|
/* now, execute loop */
|
||||||
while ( ip < limit )
|
while ( ip < limit )
|
||||||
|
@ -613,6 +630,10 @@
|
||||||
goto Syntax_Error;
|
goto Syntax_Error;
|
||||||
}
|
}
|
||||||
ip += 2;
|
ip += 2;
|
||||||
|
|
||||||
|
if ( hinter )
|
||||||
|
hinter->reset( hinter->hints, builder->current->n_points );
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 12:
|
case 12:
|
||||||
|
@ -707,7 +728,19 @@
|
||||||
FT_TRACE4(( " endchar" ));
|
FT_TRACE4(( " endchar" ));
|
||||||
|
|
||||||
close_contour( builder );
|
close_contour( builder );
|
||||||
|
|
||||||
|
/* close hints recording session */
|
||||||
|
if ( hinter )
|
||||||
|
{
|
||||||
|
if (hinter->close( hinter->hints, builder->current->n_points ))
|
||||||
|
goto Syntax_Error;
|
||||||
|
|
||||||
|
/* apply hints to the loaded glyph outline now */
|
||||||
|
hinter->apply( hinter->hints,
|
||||||
|
builder->current,
|
||||||
|
(PSH_Globals) builder->hints_globals );
|
||||||
|
}
|
||||||
|
|
||||||
/* add current outline to the glyph slot */
|
/* add current outline to the glyph slot */
|
||||||
FT_GlyphLoader_Add( builder->loader );
|
FT_GlyphLoader_Add( builder->loader );
|
||||||
|
|
||||||
|
@ -722,8 +755,8 @@
|
||||||
builder->advance.x = top[1];
|
builder->advance.x = top[1];
|
||||||
builder->advance.y = 0;
|
builder->advance.y = 0;
|
||||||
|
|
||||||
builder->last.x = x = top[0];
|
orig_x = builder->last.x = x = builder->pos_x + top[0];
|
||||||
builder->last.y = y = 0;
|
orig_y = builder->last.y = y = builder->pos_y;
|
||||||
|
|
||||||
/* the `metrics_only' indicates that we only want to compute */
|
/* the `metrics_only' indicates that we only want to compute */
|
||||||
/* the glyph's metrics (lsb + advance width), not load the */
|
/* the glyph's metrics (lsb + advance width), not load the */
|
||||||
|
@ -746,8 +779,8 @@
|
||||||
builder->advance.x = top[2];
|
builder->advance.x = top[2];
|
||||||
builder->advance.y = top[3];
|
builder->advance.y = top[3];
|
||||||
|
|
||||||
builder->last.x = x = top[0];
|
builder->last.x = x = builder->pos_x + top[0];
|
||||||
builder->last.y = y = top[1];
|
builder->last.y = y = builder->pos_y + top[1];
|
||||||
|
|
||||||
/* the `metrics_only' indicates that we only want to compute */
|
/* the `metrics_only' indicates that we only want to compute */
|
||||||
/* the glyph's metrics (lsb + advance width), not load the */
|
/* the glyph's metrics (lsb + advance width), not load the */
|
||||||
|
@ -973,22 +1006,50 @@
|
||||||
|
|
||||||
case op_hstem:
|
case op_hstem:
|
||||||
FT_TRACE4(( " hstem" ));
|
FT_TRACE4(( " hstem" ));
|
||||||
|
|
||||||
|
/* record horizontal hint */
|
||||||
|
if ( hinter )
|
||||||
|
{
|
||||||
|
/* top[0] += builder->left_bearing.y; */
|
||||||
|
hinter->stem( hinter->hints, 0, top );
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case op_hstem3:
|
case op_hstem3:
|
||||||
FT_TRACE4(( " hstem3" ));
|
FT_TRACE4(( " hstem3" ));
|
||||||
|
|
||||||
|
/* record horizontal counter-controlled hints */
|
||||||
|
if ( hinter )
|
||||||
|
hinter->stem3( hinter->hints, 0, top );
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case op_vstem:
|
case op_vstem:
|
||||||
FT_TRACE4(( " vstem" ));
|
FT_TRACE4(( " vstem" ));
|
||||||
|
|
||||||
|
/* record vertical hint */
|
||||||
|
if ( hinter )
|
||||||
|
{
|
||||||
|
top[0] += orig_x;
|
||||||
|
hinter->stem( hinter->hints, 1, top );
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case op_vstem3:
|
case op_vstem3:
|
||||||
FT_TRACE4(( " vstem3" ));
|
FT_TRACE4(( " vstem3" ));
|
||||||
|
|
||||||
|
/* record vertical counter-controlled hints */
|
||||||
|
if ( hinter )
|
||||||
|
{
|
||||||
|
FT_Pos dx = orig_x;
|
||||||
|
|
||||||
|
top[0] += dx;
|
||||||
|
top[2] += dx;
|
||||||
|
top[4] += dx;
|
||||||
|
hinter->stem3( hinter->hints, 1, top );
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case op_setcurrentpoint:
|
case op_setcurrentpoint:
|
||||||
|
@ -1011,6 +1072,7 @@
|
||||||
} /* while ip < limit */
|
} /* while ip < limit */
|
||||||
|
|
||||||
FT_TRACE4(( "..end..\n\n" ));
|
FT_TRACE4(( "..end..\n\n" ));
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
Syntax_Error:
|
Syntax_Error:
|
||||||
|
@ -1024,6 +1086,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* parse a single Type 1 glyph */
|
||||||
FT_LOCAL_DEF FT_Error
|
FT_LOCAL_DEF FT_Error
|
||||||
T1_Decoder_Parse_Glyph( T1_Decoder* decoder,
|
T1_Decoder_Parse_Glyph( T1_Decoder* decoder,
|
||||||
FT_UInt glyph )
|
FT_UInt glyph )
|
||||||
|
@ -1032,6 +1095,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* initialise T1 decoder */
|
||||||
FT_LOCAL_DEF FT_Error
|
FT_LOCAL_DEF FT_Error
|
||||||
T1_Decoder_Init( T1_Decoder* decoder,
|
T1_Decoder_Init( T1_Decoder* decoder,
|
||||||
FT_Face face,
|
FT_Face face,
|
||||||
|
@ -1039,6 +1103,7 @@
|
||||||
FT_GlyphSlot slot,
|
FT_GlyphSlot slot,
|
||||||
FT_Byte** glyph_names,
|
FT_Byte** glyph_names,
|
||||||
T1_Blend* blend,
|
T1_Blend* blend,
|
||||||
|
FT_Bool hinting,
|
||||||
T1_Decoder_Callback parse_callback )
|
T1_Decoder_Callback parse_callback )
|
||||||
{
|
{
|
||||||
MEM_Set( decoder, 0, sizeof ( *decoder ) );
|
MEM_Set( decoder, 0, sizeof ( *decoder ) );
|
||||||
|
@ -1059,7 +1124,7 @@
|
||||||
|
|
||||||
decoder->psnames = psnames;
|
decoder->psnames = psnames;
|
||||||
}
|
}
|
||||||
T1_Builder_Init( &decoder->builder, face, size, slot );
|
T1_Builder_Init( &decoder->builder, face, size, slot, hinting );
|
||||||
|
|
||||||
decoder->num_glyphs = face->num_glyphs;
|
decoder->num_glyphs = face->num_glyphs;
|
||||||
decoder->glyph_names = glyph_names;
|
decoder->glyph_names = glyph_names;
|
||||||
|
@ -1072,6 +1137,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* finalize T1 decoder */
|
||||||
FT_LOCAL_DEF void
|
FT_LOCAL_DEF void
|
||||||
T1_Decoder_Done( T1_Decoder* decoder )
|
T1_Decoder_Done( T1_Decoder* decoder )
|
||||||
{
|
{
|
||||||
|
|
|
@ -49,6 +49,7 @@ FT_BEGIN_HEADER
|
||||||
FT_GlyphSlot slot,
|
FT_GlyphSlot slot,
|
||||||
FT_Byte** glyph_names,
|
FT_Byte** glyph_names,
|
||||||
T1_Blend* blend,
|
T1_Blend* blend,
|
||||||
|
FT_Bool hinting,
|
||||||
T1_Decoder_Callback parse_glyph );
|
T1_Decoder_Callback parse_glyph );
|
||||||
|
|
||||||
FT_LOCAL void
|
FT_LOCAL void
|
||||||
|
|
|
@ -331,7 +331,10 @@
|
||||||
const FT_Driver_Class t1_driver_class =
|
const FT_Driver_Class t1_driver_class =
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
ft_module_font_driver | ft_module_driver_scalable,
|
ft_module_font_driver |
|
||||||
|
ft_module_driver_scalable |
|
||||||
|
ft_module_driver_has_hinter,
|
||||||
|
|
||||||
sizeof( FT_DriverRec ),
|
sizeof( FT_DriverRec ),
|
||||||
|
|
||||||
"type1",
|
"type1",
|
||||||
|
@ -340,8 +343,8 @@
|
||||||
|
|
||||||
0, /* format interface */
|
0, /* format interface */
|
||||||
|
|
||||||
(FT_Module_Constructor)T1_Init_Driver,
|
(FT_Module_Constructor)T1_Driver_Init,
|
||||||
(FT_Module_Destructor) T1_Done_Driver,
|
(FT_Module_Destructor) T1_Driver_Done,
|
||||||
(FT_Module_Requester) Get_Interface,
|
(FT_Module_Requester) Get_Interface,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -349,15 +352,15 @@
|
||||||
sizeof( T1_SizeRec ),
|
sizeof( T1_SizeRec ),
|
||||||
sizeof( T1_GlyphSlotRec ),
|
sizeof( T1_GlyphSlotRec ),
|
||||||
|
|
||||||
(FTDriver_initFace) T1_Init_Face,
|
(FTDriver_initFace) T1_Face_Init,
|
||||||
(FTDriver_doneFace) T1_Done_Face,
|
(FTDriver_doneFace) T1_Face_Done,
|
||||||
(FTDriver_initSize) 0,
|
(FTDriver_initSize) T1_Size_Init,
|
||||||
(FTDriver_doneSize) 0,
|
(FTDriver_doneSize) T1_Size_Done,
|
||||||
(FTDriver_initGlyphSlot)0,
|
(FTDriver_initGlyphSlot)T1_GlyphSlot_Init,
|
||||||
(FTDriver_doneGlyphSlot)0,
|
(FTDriver_doneGlyphSlot)T1_GlyphSlot_Done,
|
||||||
|
|
||||||
(FTDriver_setCharSizes) 0,
|
(FTDriver_setCharSizes) T1_Size_Reset,
|
||||||
(FTDriver_setPixelSizes)0,
|
(FTDriver_setPixelSizes)T1_Size_Reset,
|
||||||
(FTDriver_loadGlyph) T1_Load_Glyph,
|
(FTDriver_loadGlyph) T1_Load_Glyph,
|
||||||
(FTDriver_getCharIndex) Get_Char_Index,
|
(FTDriver_getCharIndex) Get_Char_Index,
|
||||||
|
|
||||||
|
|
|
@ -93,6 +93,7 @@
|
||||||
0, /* glyph slot */
|
0, /* glyph slot */
|
||||||
(FT_Byte**)type1->glyph_names,
|
(FT_Byte**)type1->glyph_names,
|
||||||
face->blend,
|
face->blend,
|
||||||
|
0,
|
||||||
T1_Parse_Glyph );
|
T1_Parse_Glyph );
|
||||||
if ( error )
|
if ( error )
|
||||||
return error;
|
return error;
|
||||||
|
@ -172,6 +173,7 @@
|
||||||
(FT_GlyphSlot)glyph,
|
(FT_GlyphSlot)glyph,
|
||||||
(FT_Byte**)type1->glyph_names,
|
(FT_Byte**)type1->glyph_names,
|
||||||
face->blend,
|
face->blend,
|
||||||
|
FT_BOOL(hinting),
|
||||||
T1_Parse_Glyph );
|
T1_Parse_Glyph );
|
||||||
if ( error )
|
if ( error )
|
||||||
goto Exit;
|
goto Exit;
|
||||||
|
@ -239,20 +241,15 @@
|
||||||
if ( size && size->root.metrics.y_ppem < 24 )
|
if ( size && size->root.metrics.y_ppem < 24 )
|
||||||
glyph->root.outline.flags |= ft_outline_high_precision;
|
glyph->root.outline.flags |= ft_outline_high_precision;
|
||||||
|
|
||||||
/* apply the font matrix */
|
/* XXXX: the following needs serious work to work properly with hinting !! */
|
||||||
|
#if 0
|
||||||
|
/* apply the font matrix, if any.. */
|
||||||
FT_Outline_Transform( &glyph->root.outline, &font_matrix );
|
FT_Outline_Transform( &glyph->root.outline, &font_matrix );
|
||||||
|
|
||||||
FT_Outline_Translate( &glyph->root.outline,
|
FT_Outline_Translate( &glyph->root.outline,
|
||||||
font_offset.x,
|
font_offset.x,
|
||||||
font_offset.y );
|
font_offset.y );
|
||||||
|
#endif
|
||||||
#if 0
|
|
||||||
|
|
||||||
glyph->root.outline.second_pass = TRUE;
|
|
||||||
glyph->root.outline.high_precision = size->root.metrics.y_ppem < 24;
|
|
||||||
glyph->root.outline.dropout_mode = 2;
|
|
||||||
|
|
||||||
#endif /* 0 */
|
|
||||||
|
|
||||||
if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 )
|
if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 )
|
||||||
{
|
{
|
||||||
|
@ -264,12 +261,13 @@
|
||||||
FT_Fixed y_scale = glyph->y_scale;
|
FT_Fixed y_scale = glyph->y_scale;
|
||||||
|
|
||||||
|
|
||||||
/* First of all, scale the points */
|
/* First of all, scale the points, fi we're not hinting */
|
||||||
for ( n = cur->n_points; n > 0; n--, vec++ )
|
if ( !hinting )
|
||||||
{
|
for ( n = cur->n_points; n > 0; n--, vec++ )
|
||||||
vec->x = FT_MulFix( vec->x, x_scale );
|
{
|
||||||
vec->y = FT_MulFix( vec->y, y_scale );
|
vec->x = FT_MulFix( vec->x, x_scale );
|
||||||
}
|
vec->y = FT_MulFix( vec->y, y_scale );
|
||||||
|
}
|
||||||
|
|
||||||
FT_Outline_Get_CBox( &glyph->root.outline, &cbox );
|
FT_Outline_Get_CBox( &glyph->root.outline, &cbox );
|
||||||
|
|
||||||
|
|
|
@ -45,6 +45,121 @@
|
||||||
#define FT_COMPONENT trace_t1objs
|
#define FT_COMPONENT trace_t1objs
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************/
|
||||||
|
/* */
|
||||||
|
/* SIZE FUNCTIONS */
|
||||||
|
/* */
|
||||||
|
/* note that we store the global hints in the size's "internal" root */
|
||||||
|
/* field.. */
|
||||||
|
/* */
|
||||||
|
/*************************************************************************/
|
||||||
|
|
||||||
|
static PSH_Globals_Funcs
|
||||||
|
T1_Size_Get_Globals_Funcs( T1_Size size )
|
||||||
|
{
|
||||||
|
T1_Face face = (T1_Face) size->root.face;
|
||||||
|
PSHinter_Interface* pshinter = face->pshinter;
|
||||||
|
FT_Module module;
|
||||||
|
|
||||||
|
module = FT_Get_Module( size->root.face->driver->root.library, "pshinter" );
|
||||||
|
return ( module && pshinter && pshinter->get_globals_funcs )
|
||||||
|
? pshinter->get_globals_funcs( module )
|
||||||
|
: 0 ;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FT_LOCAL_DEF
|
||||||
|
void T1_Size_Done( T1_Size size )
|
||||||
|
{
|
||||||
|
if ( size->root.internal )
|
||||||
|
{
|
||||||
|
PSH_Globals_Funcs funcs;
|
||||||
|
|
||||||
|
funcs = T1_Size_Get_Globals_Funcs(size);
|
||||||
|
if (funcs)
|
||||||
|
funcs->destroy( (PSH_Globals) size->root.internal );
|
||||||
|
|
||||||
|
size->root.internal = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
FT_LOCAL_DEF
|
||||||
|
FT_Error T1_Size_Init( T1_Size size )
|
||||||
|
{
|
||||||
|
FT_Error error = 0;
|
||||||
|
PSH_Globals_Funcs funcs = T1_Size_Get_Globals_Funcs( size );
|
||||||
|
|
||||||
|
if ( funcs )
|
||||||
|
{
|
||||||
|
PSH_Globals globals;
|
||||||
|
T1_Face face = (T1_Face) size->root.face;
|
||||||
|
|
||||||
|
error = funcs->create( size->root.face->memory,
|
||||||
|
&face->type1.private_dict, &globals );
|
||||||
|
if (!error)
|
||||||
|
size->root.internal = (FT_Size_Internal)(void*) globals;
|
||||||
|
}
|
||||||
|
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
FT_LOCAL_DEF
|
||||||
|
FT_Error T1_Size_Reset( T1_Size size )
|
||||||
|
{
|
||||||
|
PSH_Globals_Funcs funcs = T1_Size_Get_Globals_Funcs(size);
|
||||||
|
FT_Error error = 0;
|
||||||
|
|
||||||
|
if (funcs)
|
||||||
|
error = funcs->set_scale( (PSH_Globals) size->root.internal,
|
||||||
|
size->root.metrics.x_scale,
|
||||||
|
size->root.metrics.y_scale,
|
||||||
|
0, 0 );
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************/
|
||||||
|
/* */
|
||||||
|
/* SLOT FUNCTIONS */
|
||||||
|
/* */
|
||||||
|
/*************************************************************************/
|
||||||
|
|
||||||
|
FT_LOCAL_DEF void
|
||||||
|
T1_GlyphSlot_Done( T1_GlyphSlot slot )
|
||||||
|
{
|
||||||
|
slot->root.internal->glyph_hints = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FT_LOCAL_DEF FT_Error
|
||||||
|
T1_GlyphSlot_Init( T1_GlyphSlot slot )
|
||||||
|
{
|
||||||
|
T1_Face face;
|
||||||
|
PSHinter_Interface* pshinter;
|
||||||
|
|
||||||
|
face = (T1_Face) slot->root.face;
|
||||||
|
pshinter = face->pshinter;
|
||||||
|
if (pshinter)
|
||||||
|
{
|
||||||
|
FT_Module module;
|
||||||
|
|
||||||
|
module = FT_Get_Module( slot->root.face->driver->root.library, "pshinter" );
|
||||||
|
if (module)
|
||||||
|
{
|
||||||
|
T1_Hints_Funcs funcs;
|
||||||
|
|
||||||
|
funcs = pshinter->get_t1_funcs( module );
|
||||||
|
slot->root.internal->glyph_hints = (void*)funcs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
/* */
|
/* */
|
||||||
/* FACE FUNCTIONS */
|
/* FACE FUNCTIONS */
|
||||||
|
@ -55,7 +170,7 @@
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
/* */
|
/* */
|
||||||
/* <Function> */
|
/* <Function> */
|
||||||
/* T1_Done_Face */
|
/* T1_Face_Done */
|
||||||
/* */
|
/* */
|
||||||
/* <Description> */
|
/* <Description> */
|
||||||
/* The face object destructor. */
|
/* The face object destructor. */
|
||||||
|
@ -63,8 +178,8 @@
|
||||||
/* <Input> */
|
/* <Input> */
|
||||||
/* face :: A typeless pointer to the face object to destroy. */
|
/* face :: A typeless pointer to the face object to destroy. */
|
||||||
/* */
|
/* */
|
||||||
FT_LOCAL_DEF void
|
FT_LOCAL_DEF
|
||||||
T1_Done_Face( T1_Face face )
|
void T1_Face_Done( T1_Face face )
|
||||||
{
|
{
|
||||||
FT_Memory memory;
|
FT_Memory memory;
|
||||||
T1_Font* type1 = &face->type1;
|
T1_Font* type1 = &face->type1;
|
||||||
|
@ -124,10 +239,11 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
/* */
|
/* */
|
||||||
/* <Function> */
|
/* <Function> */
|
||||||
/* T1_Init_Face */
|
/* T1_Face_Init */
|
||||||
/* */
|
/* */
|
||||||
/* <Description> */
|
/* <Description> */
|
||||||
/* The face object constructor. */
|
/* The face object constructor. */
|
||||||
|
@ -148,15 +264,16 @@
|
||||||
/* FreeType error code. 0 means success. */
|
/* FreeType error code. 0 means success. */
|
||||||
/* */
|
/* */
|
||||||
FT_LOCAL_DEF FT_Error
|
FT_LOCAL_DEF FT_Error
|
||||||
T1_Init_Face( FT_Stream stream,
|
T1_Face_Init( FT_Stream stream,
|
||||||
T1_Face face,
|
T1_Face face,
|
||||||
FT_Int face_index,
|
FT_Int face_index,
|
||||||
FT_Int num_params,
|
FT_Int num_params,
|
||||||
FT_Parameter* params )
|
FT_Parameter* params )
|
||||||
{
|
{
|
||||||
FT_Error error;
|
FT_Error error;
|
||||||
PSNames_Interface* psnames;
|
PSNames_Interface* psnames;
|
||||||
PSAux_Interface* psaux;
|
PSAux_Interface* psaux;
|
||||||
|
PSHinter_Interface* pshinter;
|
||||||
|
|
||||||
FT_UNUSED( num_params );
|
FT_UNUSED( num_params );
|
||||||
FT_UNUSED( params );
|
FT_UNUSED( params );
|
||||||
|
@ -183,6 +300,15 @@
|
||||||
|
|
||||||
face->psaux = psaux;
|
face->psaux = psaux;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pshinter = (PSHinter_Interface*)face->pshinter;
|
||||||
|
if ( !pshinter )
|
||||||
|
{
|
||||||
|
pshinter = (PSHinter_Interface*)
|
||||||
|
FT_Get_Module_Interface( FT_FACE_LIBRARY( face ), "pshinter" );
|
||||||
|
|
||||||
|
face->pshinter = pshinter;
|
||||||
|
}
|
||||||
|
|
||||||
/* open the tokenizer, this will also check the font format */
|
/* open the tokenizer, this will also check the font format */
|
||||||
error = T1_Open_Face( face );
|
error = T1_Open_Face( face );
|
||||||
|
@ -196,7 +322,7 @@
|
||||||
/* check the face index */
|
/* check the face index */
|
||||||
if ( face_index != 0 )
|
if ( face_index != 0 )
|
||||||
{
|
{
|
||||||
FT_ERROR(( "T1_Init_Face: invalid face index\n" ));
|
FT_ERROR(( "T1_Face_Init: invalid face index\n" ));
|
||||||
error = T1_Err_Invalid_Argument;
|
error = T1_Err_Invalid_Argument;
|
||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
|
@ -375,7 +501,7 @@
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
/* */
|
/* */
|
||||||
/* <Function> */
|
/* <Function> */
|
||||||
/* T1_Init_Driver */
|
/* T1_Driver_Init */
|
||||||
/* */
|
/* */
|
||||||
/* <Description> */
|
/* <Description> */
|
||||||
/* Initializes a given Type 1 driver object. */
|
/* Initializes a given Type 1 driver object. */
|
||||||
|
@ -387,7 +513,7 @@
|
||||||
/* FreeType error code. 0 means success. */
|
/* FreeType error code. 0 means success. */
|
||||||
/* */
|
/* */
|
||||||
FT_LOCAL_DEF FT_Error
|
FT_LOCAL_DEF FT_Error
|
||||||
T1_Init_Driver( T1_Driver driver )
|
T1_Driver_Init( T1_Driver driver )
|
||||||
{
|
{
|
||||||
FT_UNUSED( driver );
|
FT_UNUSED( driver );
|
||||||
|
|
||||||
|
@ -398,7 +524,7 @@
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
/* */
|
/* */
|
||||||
/* <Function> */
|
/* <Function> */
|
||||||
/* T1_Done_Driver */
|
/* T1_Driver_Done */
|
||||||
/* */
|
/* */
|
||||||
/* <Description> */
|
/* <Description> */
|
||||||
/* Finalizes a given Type 1 driver. */
|
/* Finalizes a given Type 1 driver. */
|
||||||
|
@ -407,7 +533,7 @@
|
||||||
/* driver :: A handle to the target Type 1 driver. */
|
/* driver :: A handle to the target Type 1 driver. */
|
||||||
/* */
|
/* */
|
||||||
FT_LOCAL_DEF void
|
FT_LOCAL_DEF void
|
||||||
T1_Done_Driver( T1_Driver driver )
|
T1_Driver_Done( T1_Driver driver )
|
||||||
{
|
{
|
||||||
FT_UNUSED( driver );
|
FT_UNUSED( driver );
|
||||||
}
|
}
|
||||||
|
|
|
@ -100,15 +100,20 @@ FT_BEGIN_HEADER
|
||||||
/* */
|
/* */
|
||||||
typedef struct T1_SizeRec_
|
typedef struct T1_SizeRec_
|
||||||
{
|
{
|
||||||
FT_SizeRec root;
|
FT_SizeRec root;
|
||||||
FT_Bool valid;
|
|
||||||
T1_Size_Hints* hints; /* defined in the hinter. This allows */
|
|
||||||
/* us to experiment with different */
|
|
||||||
/* hinting schemes without having to */
|
|
||||||
/* change `t1objs' each time. */
|
|
||||||
} T1_SizeRec;
|
} T1_SizeRec;
|
||||||
|
|
||||||
|
|
||||||
|
FT_LOCAL
|
||||||
|
void T1_Size_Done( T1_Size size );
|
||||||
|
|
||||||
|
FT_LOCAL
|
||||||
|
FT_Error T1_Size_Reset( T1_Size size );
|
||||||
|
|
||||||
|
FT_LOCAL
|
||||||
|
FT_Error T1_Size_Init( T1_Size size );
|
||||||
|
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
/* */
|
/* */
|
||||||
/* <Type> */
|
/* <Type> */
|
||||||
|
@ -130,26 +135,36 @@ FT_BEGIN_HEADER
|
||||||
FT_Fixed x_scale;
|
FT_Fixed x_scale;
|
||||||
FT_Fixed y_scale;
|
FT_Fixed y_scale;
|
||||||
|
|
||||||
T1_Glyph_Hints* hints; /* defined in the hinter */
|
|
||||||
|
|
||||||
} T1_GlyphSlotRec;
|
} T1_GlyphSlotRec;
|
||||||
|
|
||||||
|
|
||||||
FT_LOCAL FT_Error
|
FT_LOCAL FT_Error
|
||||||
T1_Init_Face( FT_Stream stream,
|
T1_Face_Init( FT_Stream stream,
|
||||||
T1_Face face,
|
T1_Face face,
|
||||||
FT_Int face_index,
|
FT_Int face_index,
|
||||||
FT_Int num_params,
|
FT_Int num_params,
|
||||||
FT_Parameter* params );
|
FT_Parameter* params );
|
||||||
|
|
||||||
FT_LOCAL void
|
FT_LOCAL void
|
||||||
T1_Done_Face( T1_Face face );
|
T1_Face_Done( T1_Face face );
|
||||||
|
|
||||||
FT_LOCAL FT_Error
|
FT_LOCAL FT_Error
|
||||||
T1_Init_Driver( T1_Driver driver );
|
T1_Size_Init( T1_Size size );
|
||||||
|
|
||||||
|
FT_LOCAL void
|
||||||
|
T1_Size_Done( T1_Size size );
|
||||||
|
|
||||||
|
FT_LOCAL FT_Error
|
||||||
|
T1_GlyphSlot_Init( T1_GlyphSlot slot );
|
||||||
|
|
||||||
|
FT_LOCAL void
|
||||||
|
T1_GlyphSlot_Done( T1_GlyphSlot slot );
|
||||||
|
|
||||||
|
FT_LOCAL FT_Error
|
||||||
|
T1_Driver_Init( T1_Driver driver );
|
||||||
|
|
||||||
FT_LOCAL void
|
FT_LOCAL void
|
||||||
T1_Done_Driver( T1_Driver driver );
|
T1_Driver_Done( T1_Driver driver );
|
||||||
|
|
||||||
|
|
||||||
FT_END_HEADER
|
FT_END_HEADER
|
||||||
|
|
Loading…
Reference in New Issue