ref: a2f17cc1508ddc476c21356a0b7bbee31d009d65
parent: bcc750e511a5f7c6f4284fed6cfbaf458cff8f37
author: Werner Lemberg <[email protected]>
date: Sat May 17 06:01:45 EDT 2008
* docs/CHANGES: Updated. Improve support for WGL4 encoded fonts. * src/psnames/psmodule.c (WGL_EXTRA_LIST_SIZE): New macro. (ft_wgl_extra_unicodes, ft_wgl_extra_glyph_names, ft_wgl_extra_glyph_name_offsets): New arrays. (ps_check_wgl_name, ps_check_wgl_unicode): New functions. (ps_unicodes_init): Use them to add additional Unicode mappings.
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2008-05-16 Werner Lemberg <[email protected]>
+
+ * docs/CHANGES: Updated.
+
+2008-05-16 Sergey Tolstov <[email protected]>
+
+ Improve support for WGL4 encoded fonts.
+
+ * src/psnames/psmodule.c (WGL_EXTRA_LIST_SIZE): New macro.
+ (ft_wgl_extra_unicodes, ft_wgl_extra_glyph_names,
+ ft_wgl_extra_glyph_name_offsets): New arrays.
+ (ps_check_wgl_name, ps_check_wgl_unicode): New functions.
+ (ps_unicodes_init): Use them to add additional Unicode mappings.
+
2008-05-15 Werner Lemberg <[email protected]>
* src/psaux/t1decode.c (t1_decoder_parse_charstrings)
--- a/docs/CHANGES
+++ b/docs/CHANGES
@@ -42,6 +42,8 @@
- Build support for symbian has been contributed.
+ - Better WGL4 glyph name support, contributed by Sergey Tolstov.
+
======================================================================
--- a/src/psnames/psmodule.c
+++ b/src/psnames/psmodule.c
@@ -4,7 +4,7 @@
/* */
/* PSNames module implementation (body). */
/* */
-/* Copyright 1996-2001, 2002, 2003, 2005, 2006, 2007 by */
+/* Copyright 1996-2001, 2002, 2003, 2005, 2006, 2007, 2008 by */
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
/* */
/* This file is part of the FreeType project, and may only be used, */
@@ -180,6 +180,94 @@
}
+ /* support for old WGL4 fonts */
+
+#define WGL_EXTRA_LIST_SIZE 8
+
+ const FT_UInt32 ft_wgl_extra_unicodes[WGL_EXTRA_LIST_SIZE] =
+ {
+ 0x0394,
+ 0x03A9,
+ 0x2215,
+ 0x00AD,
+ 0x02C9,
+ 0x03BC,
+ 0x2219,
+ 0x00A0
+ };
+
+ const char ft_wgl_extra_glyph_names[] =
+ {
+ 'D','e','l','t','a',0,
+ 'O','m','e','g','a',0,
+ 'f','r','a','c','t','i','o','n',0,
+ 'h','y','p','h','e','n',0,
+ 'm','a','c','r','o','n',0,
+ 'm','u',0,
+ 'p','e','r','i','o','d','c','e','n','t','e','r','e','d',0,
+ 's','p','a','c','e',0
+ };
+
+ const FT_Int ft_wgl_extra_glyph_name_offsets[WGL_EXTRA_LIST_SIZE] =
+ {
+ 0,
+ 6,
+ 12,
+ 21,
+ 28,
+ 35,
+ 38,
+ 53
+ };
+
+
+ void
+ ps_check_wgl_name( const char* gname,
+ FT_UInt glyph,
+ FT_UInt* wgl_glyphs,
+ FT_UInt *states )
+ {
+ FT_UInt n;
+
+
+ for ( n = 0; n < WGL_EXTRA_LIST_SIZE; n++ )
+ {
+ if ( ft_strcmp( ft_wgl_extra_glyph_names +
+ ft_wgl_extra_glyph_name_offsets[n], gname ) == 0 )
+ {
+ if ( states[n] == 0 )
+ {
+ /* mark this WGL extra glyph as a candidate for the cmap */
+ states[n] = 1;
+ wgl_glyphs[n] = glyph;
+ }
+
+ return;
+ }
+ }
+ }
+
+
+ void
+ ps_check_wgl_unicode( FT_UInt32 uni_char,
+ FT_UInt *states )
+ {
+ FT_UInt n;
+
+
+ for ( n = 0; n < WGL_EXTRA_LIST_SIZE; n++ )
+ {
+ if ( uni_char == ft_wgl_extra_unicodes[n] )
+ {
+ /* disable this WGL extra glyph from being added to the cmap */
+ states[n] = 2;
+
+ return;
+ }
+ }
+ }
+
+
/* Build a table that maps Unicode values to glyph indices. */
static FT_Error
ps_unicodes_init( FT_Memory memory,
@@ -191,12 +279,15 @@
{
FT_Error error;
+ FT_UInt wgl_list_states[] = { 0, 0, 0, 0, 0, 0, 0, 0 };
+ FT_UInt wgl_glyphs[WGL_EXTRA_LIST_SIZE];
+
/* we first allocate the table */
table->num_maps = 0;
table->maps = 0;
- if ( !FT_NEW_ARRAY( table->maps, num_glyphs ) )
+ if ( !FT_NEW_ARRAY( table->maps, num_glyphs + WGL_EXTRA_LIST_SIZE ) )
{
FT_UInt n;
FT_UInt count;
@@ -213,10 +304,12 @@
if ( gname )
{
+ ps_check_wgl_name( gname, n, wgl_glyphs, wgl_list_states );
uni_char = ps_unicode_value( gname );
if ( BASE_GLYPH( uni_char ) != 0 )
{
+ ps_check_wgl_unicode( uni_char, wgl_list_states );
map->unicode = uni_char;
map->glyph_index = n;
map++;
@@ -224,6 +317,19 @@
if ( free_glyph_name )
free_glyph_name( glyph_data, gname );
+ }
+ }
+
+ for ( n = 0; n < WGL_EXTRA_LIST_SIZE; n++ )
+ {
+ if ( wgl_list_states[n] == 1 )
+ {
+ /* This glyph name has an additional WGL4 representation. */
+ /* Add it to the cmap. */
+
+ map->unicode = ft_wgl_extra_unicodes[n];
+ map->glyph_index = wgl_glyphs[n];
+ map++;
}
}
--- a/src/truetype/ttobjs.c
+++ b/src/truetype/ttobjs.c
@@ -699,8 +699,9 @@
error = tt_size_run_prep( size );
if ( !error )
- size->cvt_ready = 1;
+ size->cvt_ready = 1;
}
+
Exit:
return error;
}