ref: c8087481dffcffc4a09e28d106aa16190f7cee90
parent: 85eb6695465ab93ead94abb2a6efa2a561c80752
author: David Turner <[email protected]>
date: Thu Dec 20 08:14:18 EST 2001
* docs/TODO: added "stem3 and counter hints support" to the TODO list for the Postscript hinter * docs/BUGS: closed the AUTOHINT-NO-SBITS bug. * src/pshinter/pshrec.c (t2_hint_stems), src/cff/cffobjs.h, src/cff/cffobjs.c, src/cff/cffload.c, src/cff/cffload.h, src/cff/cffgload.c, src/cff/cffgload.h, src/cff/cffdriver.c, include/freetype/internal/cfftypes.h: added Postscript hinter support to the CFF driver * src/base/ftobjs.c (FT_Done_Library): fixed a stupid bug that crashed the library on exit
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,19 @@
2001-12-20 David Turner <[email protected]>
+ * docs/TODO: added "stem3 and counter hints support" to the TODO list
+ for the Postscript hinter
+
+ * docs/BUGS: closed the AUTOHINT-NO-SBITS bug.
+
+ * src/pshinter/pshrec.c (t2_hint_stems), src/cff/cffobjs.h,
+ src/cff/cffobjs.c, src/cff/cffload.c, src/cff/cffload.h,
+ src/cff/cffgload.c, src/cff/cffgload.h, src/cff/cffdriver.c,
+ include/freetype/internal/cfftypes.h: added Postscript hinter support
+ to the CFF driver
+
+ * src/base/ftobjs.c (FT_Done_Library): fixed a stupid bug that crashed
+ the library on exit
+
* src/type1/t1gload.c (T1_Load_Glyph): enable font matrix transform
on hinted glyphs..
--- a/docs/BUGS
+++ b/docs/BUGS
@@ -27,7 +27,6 @@
Identifier Date Opened by Reproduceable
------------------------------------------------------------------------------
NO-CID-CMAPS 13-09-2001 David always
-AUTOHINT-NO-SBITS 13-09-2001 David always
BAD-TT-RENDERING 12-09-2001 Paul Pedriana ?
BAD-THIN-LINES 13-09-2001 David ?
NOT-WINDOWS-METRICS 07-10-2001 David always
@@ -47,6 +46,7 @@
BAD-T1-CHARMAP 15-06-2001 David 2.0.5
BAD-UNIXXX-NAMES 30-07-2001 David 2.0.5
GLYPH_TO_BITMAP-BUG 05-12-2001 David 05-12-2001
+AUTOHINT-NO-SBITS 13-09-2001 David 2.0.6
--------------------END-OF-CLOSED-BUGS-TABLE----------------------------------
@@ -98,7 +98,11 @@
efficiently without making a few important internal changes to the
library's design (more importantly, to the font driver interface).
+ This has been corrected with a hack in FT_Load_Glyph. More important
+ internal changes should help get rid of it with a clean solution in
+ a further release like FreeType 2.1
+
BAD-TT-RENDERING
According to Paul Pedriana <[email protected]>, there is a rather
@@ -108,7 +112,12 @@
Tests and comparisons show a _major_ discrepancy of monochrome truetype
bytecode-hinted glyphs! Something seems to be really broken here!
+ Some of this has been fixed in 2.0.6, there was a bug in the TrueType
+ loader that prevented it from loading composites correctly. However, there
+ are still _subtle_ differences between FT1 and FT2 when it comes to
+ monochrome TrueType-hinted glyphs..
+
BAD-THIN-LINES
It seems that the anti-aliased renderer in FreeType has problems rendering
@@ -195,6 +204,8 @@
This was only noticeable with certain glyphs or certain fonts; it crept in
a long time ago.
-
+
+ same bug in src/raster/ftrender1.c by the way..
+
=== end of file ===
--- a/docs/TODO
+++ b/docs/TODO
@@ -5,3 +5,5 @@
not exactly bugs, but should be considered though:
* Add synthesized Unicode charmap processing to the CFF driver.
+
+* Implement stem3/counter hints properly in the Postscript hinter
--- a/include/freetype/internal/cfftypes.h
+++ b/include/freetype/internal/cfftypes.h
@@ -238,6 +238,9 @@
CFF_FD_Select fd_select;
+ /* interface to PostScript hinter */
+ void* pshinter;
+
} CFF_Font;
--- a/include/freetype/internal/tttypes.h
+++ b/include/freetype/internal/tttypes.h
@@ -1640,7 +1640,6 @@
/* for possible extensibility in other formats */
void* other;
-
};
--- a/src/base/ftobjs.c
+++ b/src/base/ftobjs.c
@@ -2646,6 +2646,10 @@
library->generic.finalizer( library );
/* Close all modules in the library */
+#if 1
+ while ( library->num_modules > 0 )
+ FT_Remove_Module( library, library->modules[0] );
+#else
for ( n = 0; n < library->num_modules; n++ )
{
FT_Module module = library->modules[n];
@@ -2657,6 +2661,7 @@
library->modules[n] = 0;
}
}
+#endif
/* Destroy raster objects */
FREE( library->raster_pool );
--- a/src/cff/cffdrivr.c
+++ b/src/cff/cffdrivr.c
@@ -411,7 +411,10 @@
{
/* begin with the FT_Module_Class fields */
{
- ft_module_font_driver | ft_module_driver_scalable,
+ ft_module_font_driver |
+ ft_module_driver_scalable |
+ ft_module_driver_has_hinter,
+
sizeof( CFF_DriverRec ),
"cff",
0x10000L,
@@ -419,8 +422,8 @@
0, /* module-specific interface */
- (FT_Module_Constructor)CFF_Init_Driver,
- (FT_Module_Destructor) CFF_Done_Driver,
+ (FT_Module_Constructor)CFF_Driver_Init,
+ (FT_Module_Destructor) CFF_Driver_Done,
(FT_Module_Requester) cff_get_interface,
},
@@ -429,15 +432,15 @@
sizeof( FT_SizeRec ),
sizeof( CFF_GlyphSlotRec ),
- (FTDriver_initFace) CFF_Init_Face,
- (FTDriver_doneFace) CFF_Done_Face,
- (FTDriver_initSize) 0,
- (FTDriver_doneSize) 0,
- (FTDriver_initGlyphSlot)0,
- (FTDriver_doneGlyphSlot)0,
+ (FTDriver_initFace) CFF_Face_Init,
+ (FTDriver_doneFace) CFF_Face_Done,
+ (FTDriver_initSize) CFF_Size_Init,
+ (FTDriver_doneSize) CFF_Size_Done,
+ (FTDriver_initGlyphSlot)CFF_GlyphSlot_Init,
+ (FTDriver_doneGlyphSlot)CFF_GlyphSlot_Done,
- (FTDriver_setCharSizes) 0,
- (FTDriver_setPixelSizes)0,
+ (FTDriver_setCharSizes) CFF_Size_Reset,
+ (FTDriver_setPixelSizes)CFF_Size_Reset,
(FTDriver_loadGlyph) Load_Glyph,
(FTDriver_getCharIndex) cff_get_char_index,
--- a/src/cff/cffgload.c
+++ b/src/cff/cffgload.c
@@ -25,6 +25,7 @@
#include FT_TRUETYPE_TAGS_H
#include FT_INTERNAL_POSTSCRIPT_HINTS_H
+#include "cffobjs.h"
#include "cffload.h"
#include "cffgload.h"
@@ -152,8 +153,8 @@
2 | CFF_COUNT_CHECK_WIDTH,
2 | CFF_COUNT_CHECK_WIDTH,
- 0, /* hintmask */
- 0, /* cntrmask */
+ 0 | CFF_COUNT_CHECK_WIDTH, /* hintmask */
+ 0 | CFF_COUNT_CHECK_WIDTH, /* cntrmask */
0, /* dotsection */
1, /* abs */
@@ -206,7 +207,7 @@
/*************************************************************************/
/* */
/* <Function> */
- /* CFF_Init_Builder */
+ /* CFF_Builder_Init */
/* */
/* <Description> */
/* Initializes a given glyph builder. */
@@ -222,10 +223,11 @@
/* glyph :: The current glyph object. */
/* */
static void
- CFF_Init_Builder( CFF_Builder* builder,
+ CFF_Builder_Init( CFF_Builder* builder,
TT_Face face,
CFF_Size size,
- CFF_GlyphSlot glyph )
+ CFF_GlyphSlot glyph,
+ FT_Bool hinting )
{
builder->path_begun = 0;
builder->load_points = 1;
@@ -243,6 +245,15 @@
builder->base = &loader->base.outline;
builder->current = &loader->current.outline;
FT_GlyphLoader_Rewind( loader );
+
+ builder->hints_globals = 0;
+ builder->hints_funcs = 0;
+
+ if ( hinting && size )
+ {
+ builder->hints_globals = size->internal;
+ builder->hints_funcs = glyph->root.internal->glyph_hints;
+ }
}
if ( size )
@@ -264,7 +275,7 @@
/*************************************************************************/
/* */
/* <Function> */
- /* CFF_Done_Builder */
+ /* CFF_Builder_Done */
/* */
/* <Description> */
/* Finalizes a given glyph builder. Its contents can still be used */
@@ -275,7 +286,7 @@
/* builder :: A pointer to the glyph builder to finalize. */
/* */
static void
- CFF_Done_Builder( CFF_Builder* builder )
+ CFF_Builder_Done( CFF_Builder* builder )
{
CFF_GlyphSlot glyph = builder->glyph;
@@ -338,7 +349,8 @@
CFF_Init_Decoder( CFF_Decoder* decoder,
TT_Face face,
CFF_Size size,
- CFF_GlyphSlot slot )
+ CFF_GlyphSlot slot,
+ FT_Bool hinting )
{
CFF_Font* cff = (CFF_Font*)face->extra.data;
@@ -347,7 +359,7 @@
MEM_Set( decoder, 0, sizeof ( *decoder ) );
/* initialize builder */
- CFF_Init_Builder( &decoder->builder, face, size, slot );
+ CFF_Builder_Init( &decoder->builder, face, size, slot, hinting );
/* initialize Type2 decoder */
decoder->num_globals = cff->num_global_subrs;
@@ -533,7 +545,7 @@
/* Get code to SID mapping from `cff_standard_encoding'. */
- glyph_sid = cff_standard_encoding[charcode];
+ glyph_sid = CFF_Get_Standard_Encoding( (FT_UInt)charcode );
for ( n = 0; n < cff->num_glyphs; n++ )
{
@@ -1080,19 +1092,29 @@
case cff_op_hintmask:
case cff_op_cntrmask:
FT_TRACE4(( op == cff_op_hintmask ? " hintmask" : " cntrmask" ));
+
+ /* implement vstem when needed */
+ if ( num_args > 0 )
+ {
+ if ( hinter )
+ hinter->stems( hinter->hints,
+ 1,
+ num_args / 2,
+ args );
+
+ decoder->num_hints += num_args / 2;
+ }
- decoder->num_hints += num_args / 2;
-
if ( hinter )
{
if ( op == cff_op_hintmask )
hinter->hintmask( hinter->hints,
builder->current->n_points,
- ( decoder->num_hints + 7 ) >> 3,
+ decoder->num_hints,
ip );
else
hinter->counter( hinter->hints,
- ( decoder->num_hints + 7 ) >> 3,
+ decoder->num_hints,
ip );
}
@@ -2097,7 +2119,7 @@
*max_advance = 0;
/* Initialize load decoder */
- CFF_Init_Decoder( &decoder, face, 0, 0 );
+ CFF_Init_Decoder( &decoder, face, 0, 0, 0 );
decoder.builder.metrics_only = 1;
decoder.builder.load_points = 0;
@@ -2191,7 +2213,7 @@
FT_ULong charstring_len;
- CFF_Init_Decoder( &decoder, face, size, glyph );
+ CFF_Init_Decoder( &decoder, face, size, glyph, hinting );
decoder.builder.no_recurse =
(FT_Bool)( ( load_flags & FT_LOAD_NO_RECURSE ) != 0 );
@@ -2219,7 +2241,7 @@
}
/* save new glyph tables */
- CFF_Done_Builder( &decoder.builder );
+ CFF_Builder_Done( &decoder.builder );
}
font_matrix = cff->top_font.font_dict.font_matrix;
@@ -2287,11 +2309,12 @@
/* First of all, scale the points */
- 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 );
- }
+ 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 );
+ }
FT_Outline_Get_CBox( &glyph->root.outline, &cbox );
--- a/src/cff/cffgload.h
+++ b/src/cff/cffgload.h
@@ -171,7 +171,8 @@
CFF_Init_Decoder( CFF_Decoder* decoder,
TT_Face face,
CFF_Size size,
- CFF_GlyphSlot slot );
+ CFF_GlyphSlot slot,
+ FT_Bool hinting );
FT_LOCAL void
CFF_Prepare_Decoder( CFF_Decoder* decoder,
--- a/src/cff/cffload.c
+++ b/src/cff/cffload.c
@@ -29,6 +29,1030 @@
#include "cfferrs.h"
+#if 1
+ static const FT_UShort cff_isoadobe_charset[229] =
+ {
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228
+ };
+
+ static const FT_UShort cff_expert_charset[166] =
+ {
+ 0,
+ 1,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 13,
+ 14,
+ 15,
+ 99,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 27,
+ 28,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254,
+ 255,
+ 256,
+ 257,
+ 258,
+ 259,
+ 260,
+ 261,
+ 262,
+ 263,
+ 264,
+ 265,
+ 266,
+ 109,
+ 110,
+ 267,
+ 268,
+ 269,
+ 270,
+ 271,
+ 272,
+ 273,
+ 274,
+ 275,
+ 276,
+ 277,
+ 278,
+ 279,
+ 280,
+ 281,
+ 282,
+ 283,
+ 284,
+ 285,
+ 286,
+ 287,
+ 288,
+ 289,
+ 290,
+ 291,
+ 292,
+ 293,
+ 294,
+ 295,
+ 296,
+ 297,
+ 298,
+ 299,
+ 300,
+ 301,
+ 302,
+ 303,
+ 304,
+ 305,
+ 306,
+ 307,
+ 308,
+ 309,
+ 310,
+ 311,
+ 312,
+ 313,
+ 314,
+ 315,
+ 316,
+ 317,
+ 318,
+ 158,
+ 155,
+ 163,
+ 319,
+ 320,
+ 321,
+ 322,
+ 323,
+ 324,
+ 325,
+ 326,
+ 150,
+ 164,
+ 169,
+ 327,
+ 328,
+ 329,
+ 330,
+ 331,
+ 332,
+ 333,
+ 334,
+ 335,
+ 336,
+ 337,
+ 338,
+ 339,
+ 340,
+ 341,
+ 342,
+ 343,
+ 344,
+ 345,
+ 346,
+ 347,
+ 348,
+ 349,
+ 350,
+ 351,
+ 352,
+ 353,
+ 354,
+ 355,
+ 356,
+ 357,
+ 358,
+ 359,
+ 360,
+ 361,
+ 362,
+ 363,
+ 364,
+ 365,
+ 366,
+ 367,
+ 368,
+ 369,
+ 370,
+ 371,
+ 372,
+ 373,
+ 374,
+ 375,
+ 376,
+ 377,
+ 378
+ };
+
+ static const FT_UShort cff_expertsubset_charset[87] =
+ {
+ 0,
+ 1,
+ 231,
+ 232,
+ 235,
+ 236,
+ 237,
+ 238,
+ 13,
+ 14,
+ 15,
+ 99,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 27,
+ 28,
+ 249,
+ 250,
+ 251,
+ 253,
+ 254,
+ 255,
+ 256,
+ 257,
+ 258,
+ 259,
+ 260,
+ 261,
+ 262,
+ 263,
+ 264,
+ 265,
+ 266,
+ 109,
+ 110,
+ 267,
+ 268,
+ 269,
+ 270,
+ 272,
+ 300,
+ 301,
+ 302,
+ 305,
+ 314,
+ 315,
+ 158,
+ 155,
+ 163,
+ 320,
+ 321,
+ 322,
+ 323,
+ 324,
+ 325,
+ 326,
+ 150,
+ 164,
+ 169,
+ 327,
+ 328,
+ 329,
+ 330,
+ 331,
+ 332,
+ 333,
+ 334,
+ 335,
+ 336,
+ 337,
+ 338,
+ 339,
+ 340,
+ 341,
+ 342,
+ 343,
+ 344,
+ 345,
+ 346
+ };
+
+ static const FT_UShort cff_standard_encoding[256] =
+ {
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 0,
+ 111,
+ 112,
+ 113,
+ 114,
+ 0,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 0,
+ 123,
+ 0,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 0,
+ 132,
+ 133,
+ 0,
+ 134,
+ 135,
+ 136,
+ 137,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 138,
+ 0,
+ 139,
+ 0,
+ 0,
+ 0,
+ 0,
+ 140,
+ 141,
+ 142,
+ 143,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 144,
+ 0,
+ 0,
+ 0,
+ 145,
+ 0,
+ 0,
+ 146,
+ 147,
+ 148,
+ 149,
+ 0,
+ 0,
+ 0,
+ 0
+ };
+
+ static const FT_UShort cff_expert_encoding[256] =
+ {
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 229,
+ 230,
+ 0,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 13,
+ 14,
+ 15,
+ 99,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 27,
+ 28,
+ 249,
+ 250,
+ 251,
+ 252,
+ 0,
+ 253,
+ 254,
+ 255,
+ 256,
+ 257,
+ 0,
+ 0,
+ 0,
+ 258,
+ 0,
+ 0,
+ 259,
+ 260,
+ 261,
+ 262,
+ 0,
+ 0,
+ 263,
+ 264,
+ 265,
+ 0,
+ 266,
+ 109,
+ 110,
+ 267,
+ 268,
+ 269,
+ 0,
+ 270,
+ 271,
+ 272,
+ 273,
+ 274,
+ 275,
+ 276,
+ 277,
+ 278,
+ 279,
+ 280,
+ 281,
+ 282,
+ 283,
+ 284,
+ 285,
+ 286,
+ 287,
+ 288,
+ 289,
+ 290,
+ 291,
+ 292,
+ 293,
+ 294,
+ 295,
+ 296,
+ 297,
+ 298,
+ 299,
+ 300,
+ 301,
+ 302,
+ 303,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 304,
+ 305,
+ 306,
+ 0,
+ 0,
+ 307,
+ 308,
+ 309,
+ 310,
+ 311,
+ 0,
+ 312,
+ 0,
+ 0,
+ 312,
+ 0,
+ 0,
+ 314,
+ 315,
+ 0,
+ 0,
+ 316,
+ 317,
+ 318,
+ 0,
+ 0,
+ 0,
+ 158,
+ 155,
+ 163,
+ 319,
+ 320,
+ 321,
+ 322,
+ 323,
+ 324,
+ 325,
+ 0,
+ 0,
+ 326,
+ 150,
+ 164,
+ 169,
+ 327,
+ 328,
+ 329,
+ 330,
+ 331,
+ 332,
+ 333,
+ 334,
+ 335,
+ 336,
+ 337,
+ 338,
+ 339,
+ 340,
+ 341,
+ 342,
+ 343,
+ 344,
+ 345,
+ 346,
+ 347,
+ 348,
+ 349,
+ 350,
+ 351,
+ 352,
+ 353,
+ 354,
+ 355,
+ 356,
+ 357,
+ 358,
+ 359,
+ 360,
+ 361,
+ 362,
+ 363,
+ 364,
+ 365,
+ 366,
+ 367,
+ 368,
+ 369,
+ 370,
+ 371,
+ 372,
+ 373,
+ 374,
+ 375,
+ 376,
+ 377,
+ 378
+ };
+#endif
+
+
+ FT_LOCAL_DEF FT_UShort
+ CFF_Get_Standard_Encoding( FT_UInt charcode )
+ {
+ return (charcode < 256 ? cff_standard_encoding[charcode] : 0);
+ }
+
+
/*************************************************************************/
/* */
/* The macro FT_COMPONENT is used in trace mode. It is an implicit */
--- a/src/cff/cffload.h
+++ b/src/cff/cffload.h
@@ -28,6 +28,7 @@
FT_BEGIN_HEADER
+#if 0
const FT_UShort cff_isoadobe_charset[229] =
{
0,
@@ -1041,6 +1042,10 @@
377,
378
};
+#endif
+
+ FT_LOCAL FT_UShort
+ CFF_Get_Standard_Encoding( FT_UInt charcode );
FT_LOCAL FT_String*
--- a/src/cff/cffobjs.c
+++ b/src/cff/cffobjs.c
@@ -25,6 +25,7 @@
#include FT_TRUETYPE_TAGS_H
#include FT_INTERNAL_SFNT_H
#include FT_INTERNAL_POSTSCRIPT_NAMES_H
+#include FT_INTERNAL_POSTSCRIPT_HINTS_H
#include "cffobjs.h"
#include "cffload.h"
@@ -43,8 +44,180 @@
#define FT_COMPONENT trace_cffobjs
+
+
/*************************************************************************/
/* */
+ /* SIZE FUNCTIONS */
+ /* */
+ /* note that we store the global hints in the size's "internal" root */
+ /* field */
+ /* */
+ /*************************************************************************/
+
+
+ static PSH_Globals_Funcs
+ CFF_Size_Get_Globals_Funcs( CFF_Size size )
+ {
+ CFF_Face face = (CFF_Face) size->face;
+ CFF_Font* font = face->extra.data;
+ PSHinter_Interface* pshinter = font->pshinter;
+ FT_Module module;
+
+
+ module = FT_Get_Module( size->face->driver->root.library,
+ "pshinter" );
+ return ( module && pshinter && pshinter->get_globals_funcs )
+ ? pshinter->get_globals_funcs( module )
+ : 0 ;
+ }
+
+
+ FT_LOCAL_DEF void
+ CFF_Size_Done( CFF_Size size )
+ {
+ if ( size->internal )
+ {
+ PSH_Globals_Funcs funcs;
+
+
+ funcs = CFF_Size_Get_Globals_Funcs( size );
+ if ( funcs )
+ funcs->destroy( (PSH_Globals)size->internal );
+
+ size->internal = 0;
+ }
+ }
+
+
+ FT_LOCAL_DEF FT_Error
+ CFF_Size_Init( CFF_Size size )
+ {
+ FT_Error error = 0;
+ PSH_Globals_Funcs funcs = CFF_Size_Get_Globals_Funcs( size );
+
+
+ if ( funcs )
+ {
+ PSH_Globals globals;
+ CFF_Face face = (CFF_Face)size->face;
+ CFF_Font* font = face->extra.data;
+ CFF_SubFont* subfont = &font->top_font;
+
+ CFF_Private* cpriv = &subfont->private_dict;
+ T1_Private priv;
+
+ /* IMPORTANT: the CFF and Type1 private dictionaries have */
+ /* slightly different structures, we need to */
+ /* synthetize a type1 dictionary on the fly here !! */
+
+ {
+ FT_UInt n, count;
+
+ MEM_Set( &priv, 0, sizeof(priv) );
+
+ count = priv.num_blue_values = cpriv->num_blue_values;
+ for ( n = 0; n < count; n++ )
+ priv.blue_values[n] = cpriv->blue_values[n];
+
+ count = priv.num_other_blues = cpriv->num_other_blues;
+ for ( n = 0; n < count; n++ )
+ priv.other_blues[n] = cpriv->other_blues[n];
+
+ count = priv.num_family_blues = cpriv->num_family_blues;
+ for ( n = 0; n < count; n++ )
+ priv.family_blues[n] = cpriv->family_blues[n];
+
+ count = priv.num_family_other_blues = cpriv->num_family_other_blues;
+ for ( n = 0; n < count; n++ )
+ priv.family_other_blues[n] = cpriv->family_other_blues[n];
+
+ priv.blue_scale = cpriv->blue_scale;
+ priv.blue_shift = cpriv->blue_shift;
+ priv.blue_fuzz = cpriv->blue_fuzz;
+
+ priv.standard_width[0] = (FT_UShort) cpriv->standard_width;
+ priv.standard_height[0] = (FT_UShort) cpriv->standard_height;
+
+ count = priv.num_snap_widths = cpriv->num_snap_widths;
+ for ( n = 0; n < count; n++ )
+ priv.snap_widths[n] = cpriv->snap_widths[n];
+
+ count = priv.num_snap_heights = cpriv->num_snap_heights;
+ for ( n = 0; n < count; n++ )
+ priv.snap_heights[n] = cpriv->snap_heights[n];
+
+ priv.force_bold = cpriv->force_bold;
+ priv.language_group = cpriv->language_group;
+ priv.lenIV = cpriv->lenIV;
+ }
+
+ error = funcs->create( size->face->memory, &priv, &globals );
+ if ( !error )
+ size->internal = (FT_Size_Internal)(void*)globals;
+ }
+
+ return error;
+ }
+
+
+ FT_LOCAL_DEF FT_Error
+ CFF_Size_Reset( CFF_Size size )
+ {
+ PSH_Globals_Funcs funcs = CFF_Size_Get_Globals_Funcs( size );
+ FT_Error error = 0;
+
+
+ if ( funcs )
+ error = funcs->set_scale( (PSH_Globals)size->internal,
+ size->metrics.x_scale,
+ size->metrics.y_scale,
+ 0, 0 );
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SLOT FUNCTIONS */
+ /* */
+ /*************************************************************************/
+
+ FT_LOCAL_DEF void
+ CFF_GlyphSlot_Done( CFF_GlyphSlot slot )
+ {
+ slot->root.internal->glyph_hints = 0;
+ }
+
+
+ FT_LOCAL_DEF FT_Error
+ CFF_GlyphSlot_Init( CFF_GlyphSlot slot )
+ {
+ CFF_Face face = (CFF_Face) slot->root.face;
+ CFF_Font* font = face->extra.data;
+ PSHinter_Interface* pshinter = font->pshinter;
+
+ if (pshinter)
+ {
+ FT_Module module;
+
+ module = FT_Get_Module( slot->root.face->driver->root.library, "pshinter" );
+ if (module)
+ {
+ T2_Hints_Funcs funcs;
+
+ funcs = pshinter->get_t2_funcs( module );
+ slot->root.internal->glyph_hints = (void*)funcs;
+ }
+ }
+ return 0;
+ }
+
+
+
+
+ /*************************************************************************/
+ /* */
/* FACE FUNCTIONS */
/* */
/*************************************************************************/
@@ -240,7 +413,7 @@
/*************************************************************************/
/* */
/* <Function> */
- /* CFF_Init_Face */
+ /* CFF_Face_Init */
/* */
/* <Description> */
/* Initializes a given OpenType face object. */
@@ -261,7 +434,7 @@
/* FreeType error code. 0 means success. */
/* */
FT_LOCAL_DEF FT_Error
- CFF_Init_Face( FT_Stream stream,
+ CFF_Face_Init( FT_Stream stream,
CFF_Face face,
FT_Int face_index,
FT_Int num_params,
@@ -270,6 +443,7 @@
FT_Error error;
SFNT_Interface* sfnt;
PSNames_Interface* psnames;
+ PSHinter_Interface* pshinter;
FT_Bool pure_cff = 1;
FT_Bool sfnt_format = 0;
@@ -282,6 +456,9 @@
psnames = (PSNames_Interface*)FT_Get_Module_Interface(
face->root.driver->root.library, "psnames" );
+ pshinter = (PSHinter_Interface*)FT_Get_Module_Interface(
+ face->root.driver->root.library, "pshinter" );
+
/* create input stream from resource */
if ( FILE_Seek( 0 ) )
goto Exit;
@@ -356,10 +533,14 @@
if ( error )
goto Exit;
+ cff->pshinter = pshinter;
+
/* Complement the root flags with some interesting information. */
/* Note that this is only necessary for pure CFF and CEF fonts. */
root = &face->root;
+
+ root->num_glyphs = cff->num_glyphs;
if ( pure_cff )
{
CFF_Font_Dict* dict = &cff->top_font.font_dict;
@@ -368,7 +549,7 @@
/* we need the `PSNames' module for pure-CFF and CEF formats */
if ( !psnames )
{
- FT_ERROR(( "CFF_Init_Face:" ));
+ FT_ERROR(( "CFF_Face_Init:" ));
FT_ERROR(( " cannot open CFF & CEF fonts\n" ));
FT_ERROR(( " " ));
FT_ERROR(( " without the `PSNames' module\n" ));
@@ -503,7 +684,7 @@
/*************************************************************************/
/* */
/* <Function> */
- /* CFF_Done_Face */
+ /* CFF_Face_Done */
/* */
/* <Description> */
/* Finalizes a given face object. */
@@ -512,7 +693,7 @@
/* face :: A pointer to the face object to destroy. */
/* */
FT_LOCAL_DEF void
- CFF_Done_Face( CFF_Face face )
+ CFF_Face_Done( CFF_Face face )
{
FT_Memory memory = face->root.memory;
SFNT_Interface* sfnt = (SFNT_Interface*)face->sfnt;
@@ -537,7 +718,7 @@
/*************************************************************************/
/* */
/* <Function> */
- /* CFF_Init_Driver */
+ /* CFF_Driver_Init */
/* */
/* <Description> */
/* Initializes a given OpenType driver object. */
@@ -549,7 +730,7 @@
/* FreeType error code. 0 means success. */
/* */
FT_LOCAL_DEF FT_Error
- CFF_Init_Driver( CFF_Driver driver )
+ CFF_Driver_Init( CFF_Driver driver )
{
/* init extension registry if needed */
@@ -570,7 +751,7 @@
/*************************************************************************/
/* */
/* <Function> */
- /* CFF_Done_Driver */
+ /* CFF_Driver_Done */
/* */
/* <Description> */
/* Finalizes a given OpenType driver. */
@@ -579,7 +760,7 @@
/* driver :: A handle to the target OpenType driver. */
/* */
FT_LOCAL_DEF void
- CFF_Done_Driver( CFF_Driver driver )
+ CFF_Driver_Done( CFF_Driver driver )
{
/* destroy extensions registry if needed */
--- a/src/cff/cffobjs.h
+++ b/src/cff/cffobjs.h
@@ -109,12 +109,27 @@
} CFF_DriverRec;
+ FT_LOCAL FT_Error
+ CFF_Size_Init( CFF_Size size );
+
+ FT_LOCAL void
+ CFF_Size_Done( CFF_Size size );
+
+ FT_LOCAL FT_Error
+ CFF_Size_Reset( CFF_Size size );
+
+ FT_LOCAL void
+ CFF_GlyphSlot_Done( CFF_GlyphSlot slot );
+
+ FT_LOCAL FT_Error
+ CFF_GlyphSlot_Init( CFF_GlyphSlot slot );
+
/*************************************************************************/
/* */
/* Face functions */
/* */
FT_LOCAL FT_Error
- CFF_Init_Face( FT_Stream stream,
+ CFF_Face_Init( FT_Stream stream,
CFF_Face face,
FT_Int face_index,
FT_Int num_params,
@@ -121,7 +136,7 @@
FT_Parameter* params );
FT_LOCAL void
- CFF_Done_Face( CFF_Face face );
+ CFF_Face_Done( CFF_Face face );
/*************************************************************************/
@@ -129,10 +144,10 @@
/* Driver functions */
/* */
FT_LOCAL FT_Error
- CFF_Init_Driver( CFF_Driver driver );
+ CFF_Driver_Init( CFF_Driver driver );
FT_LOCAL void
- CFF_Done_Driver( CFF_Driver driver );
+ CFF_Driver_Done( CFF_Driver driver );
FT_END_HEADER
--- a/src/pshinter/pshrec.c
+++ b/src/pshinter/pshrec.c
@@ -1158,24 +1158,32 @@
FT_Int count,
FT_Fixed* coords )
{
- FT_Long stems[32], n, total = count;
+ FT_Pos stems[32], y, n, total = count;
+ y = 0;
while ( total > 0 )
{
/* determine number of stems to write */
count = total;
- if ( count > 32 )
- count = 32;
+ if ( count > 16 )
+ count = 16;
- /* compute integer stem position in font units */
+ /* compute integer stem positions in font units */
for ( n = 0; n < count * 2; n++ )
- stems[n] = ( coords[n] + 0x8000 ) >> 16;
+ {
+ y += coords[n];
+ stems[n] = ( y + 0x8000 ) >> 16;
+ }
+ /* compute lengths */
+ for ( n = 0; n < count*2; n += 2 )
+ stems[n+1] = stems[n+1] - stems[n];
+
/* add them to the current dimension */
ps_hints_stem( (PS_Hints)hints, dimension, count, stems );
- total -= count >> 1;
+ total -= count;
}
}