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.
This commit is contained in:
Werner Lemberg 2008-05-17 10:01:45 +00:00
Родитель bcc750e511
Коммит a2f17cc150
4 изменённых файлов: 126 добавлений и 3 удалений

Просмотреть файл

@ -1,3 +1,17 @@
2008-05-16 Werner Lemberg <wl@gnu.org>
* docs/CHANGES: Updated.
2008-05-16 Sergey Tolstov <stolstov@esri.com>
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 <wl@gnu.org>
* src/psaux/t1decode.c (t1_decoder_parse_charstrings)

Просмотреть файл

@ -42,6 +42,8 @@ CHANGES BETWEEN 2.3.6 and 2.3.5
- Build support for symbian has been contributed.
- Better WGL4 glyph name support, contributed by Sergey Tolstov.
======================================================================

Просмотреть файл

@ -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++;
@ -227,6 +320,19 @@
}
}
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++;
}
}
/* now compress the table a bit */
count = (FT_UInt)( map - table->maps );

Просмотреть файл

@ -699,8 +699,9 @@
error = tt_size_run_prep( size );
if ( !error )
size->cvt_ready = 1;
size->cvt_ready = 1;
}
Exit:
return error;
}