* src/sfnt/ttcmap.c, src/sfnt/ttcmap.h:

s/TT_CMAP_FLAG_OVERLAPPED/TT_CMAP_FLAG_OVERLAPPING/.
This commit is contained in:
Werner Lemberg 2005-11-30 18:47:49 +00:00
parent b5d88e8e0c
commit 44e47d5fd6
3 changed files with 89 additions and 86 deletions

View File

@ -3,6 +3,9 @@
* docs/CHANGES: Document ftdump's `-v' option.
Document latest charmap code changes.
* src/sfnt/ttcmap.c, src/sfnt/ttcmap.h:
s/TT_CMAP_FLAG_OVERLAPPED/TT_CMAP_FLAG_OVERLAPPING/.
2005-11-30 Chia-I Wu <b90201047@ntu.edu.tw>
* src/sfnt/ttcmap.c (tt_cmap4_char_map_binary,
@ -10,28 +13,27 @@
2005-11-29 Chia-I Wu <b90201047@ntu.edu.tw>
Major update to distinguish between unsorted and overlapped segments
for cmap format 4. For overlapped but sorted segments, which is
previously considered unsorted, we still use binary search.
Major update to distinguish between unsorted and overlapping
segments for cmap format 4. For overlapping but sorted segments,
which is previously considered unsorted, we still use binary search.
* src/sfnt/ttcmap.h (struct TT_CMapRec_): Replace `unsorted' by
`flags'.
* src/sfnt/ttcmap.h (TT_CMapRec_): Replace `unsorted' by `flags'.
(TT_CMAP_FLAG_UNSORTED, TT_CMAP_FLAG_OVERLAPPED): New macros.
* src/sfnt/ttcmap.c (OPT_CMAP4): Removed as it is always defined.
(struct TT_CMap4Rec_): Remove `old_charcode' and `table_length'.
(TT_CMap4Rec_): Remove `old_charcode' and `table_length'.
(tt_cmap4_reset): Removed.
(tt_cmap4_init): Updated accordingly.
(tt_cmap4_next): Updated accordingly.
Take care of overlapped segments.
Take care of overlapping segments.
(tt_cmap4_validate): Make sure the subtable is large enough.
Do not check glyph_ids because some fonts set the length wrongly.
Also, when all segments have offset 0, glyph_ids is always invalid. It
does not cause any problem so far only because the check misses
Also, when all segments have offset 0, glyph_ids is always invalid.
It does not cause any problem so far only because the check misses
equality.
Distinguish between unsorted and overlapped segments.
(tt_cmap4_char_map_linear, tt_cmap4_char_map_binary): New functions to
do "charcode => glyph index" by linear/binary search.
Distinguish between unsorted and overlapping segments.
(tt_cmap4_char_map_linear, tt_cmap4_char_map_binary): New functions
to do `charcode => glyph index' by linear/binary search.
(tt_cmap4_char_index, tt_cmap4_char_next): Use
tt_cmap4_char_map_linear and tt_cmap4_char_map_binary.
(tt_face_build_cmaps): Treat the return value of validator as flags
@ -39,10 +41,10 @@
2005-11-29 Chia-I Wu <b90201047@ntu.edu.tw>
* src/sfnt/ttcmap.c (struct TT_CMap12Rec_, tt_cmap12_init,
tt_cmap12_next): New struct/function for fast "next char".
(tt_cmap12_char_map_binary): New function to do "charcode => glyph
index" by binary search.
* src/sfnt/ttcmap.c (TT_CMap12Rec_, tt_cmap12_init, tt_cmap12_next):
New structures and functions for fast `next char'.
(tt_cmap12_char_map_binary): New function to do `charcode => glyph
index' by binary search.
(tt_cmap12_char_index, tt_cmap12_char_next): Use
tt_cmap12_char_map_binary.
(tt_face_build_cmaps): Check table and offset correctly (equality is

View File

@ -700,10 +700,10 @@
}
/* find the index of the charcode next to cmap->cur_charcode; */
/* caller should call tt_cmap4_set_range with proper range */
/* before calling this function */
/* */
/* search the index of the charcode next to cmap->cur_charcode; */
/* caller should call tt_cmap4_set_range with proper range */
/* before calling this function */
/* */
static void
tt_cmap4_next( TT_CMap4 cmap )
{
@ -894,7 +894,7 @@
if ( last_start > start || last_end > end )
error |= TT_CMAP_FLAG_UNSORTED;
else
error |= TT_CMAP_FLAG_OVERLAPPED;
error |= TT_CMAP_FLAG_OVERLAPPING;
}
}
@ -947,7 +947,7 @@
}
last_start = start;
last_end = end;
last_end = end;
}
}
@ -964,7 +964,7 @@
FT_Int delta;
FT_UInt i, num_segs;
FT_UInt32 charcode = *pcharcode;
FT_UInt gindex = 0;
FT_UInt gindex = 0;
FT_Byte* p;
@ -1029,15 +1029,15 @@
static FT_UInt
tt_cmap4_char_map_binary( TT_CMap cmap,
FT_UInt* pcharcode,
FT_Bool next )
tt_cmap4_char_map_binary( TT_CMap cmap,
FT_UInt* pcharcode,
FT_Bool next )
{
FT_UInt num_segs2, start, end, offset;
FT_Int delta;
FT_UInt max, min, mid, num_segs;
FT_UInt charcode = *pcharcode;
FT_UInt gindex = 0;
FT_UInt gindex = 0;
FT_Byte* p;
@ -1074,13 +1074,13 @@
min = mid + 1;
else
{
p += num_segs2;
delta = TT_PEEK_SHORT( p );
p += num_segs2;
offset = TT_PEEK_USHORT( p );
p += num_segs2;
delta = TT_PEEK_SHORT( p );
p += num_segs2;
offset = TT_PEEK_USHORT( p );
/* find the first segment containing `charcode' */
if ( cmap->flags & TT_CMAP_FLAG_OVERLAPPED )
/* search the first segment containing `charcode' */
if ( cmap->flags & TT_CMAP_FLAG_OVERLAPPING )
{
FT_UInt i;
@ -1091,7 +1091,7 @@
if ( offset == 0xFFFFU )
mid = max + 1;
/* find in segments before the current segment */
/* search in segments before the current segment */
for ( i = max ; i > 0; i-- )
{
FT_UInt prev_end;
@ -1103,13 +1103,13 @@
if ( charcode > prev_end )
break;
end = prev_end;
p += 2 + num_segs2;
start = TT_PEEK_USHORT( p );
p += num_segs2;
delta = TT_PEEK_SHORT( p );
p += num_segs2;
offset = TT_PEEK_USHORT( p );
end = prev_end;
p += 2 + num_segs2;
start = TT_PEEK_USHORT( p );
p += num_segs2;
delta = TT_PEEK_SHORT( p );
p += num_segs2;
offset = TT_PEEK_USHORT( p );
if ( offset != 0xFFFFU )
mid = i - 1;
@ -1120,38 +1120,38 @@
{
if ( i != max )
{
p = cmap->data + 14 + max * 2;
end = TT_PEEK_USHORT( p );
p += 2 + num_segs2;
start = TT_PEEK_USHORT( p );
p += num_segs2;
delta = TT_PEEK_SHORT( p );
p += num_segs2;
offset = TT_PEEK_USHORT( p );
p = cmap->data + 14 + max * 2;
end = TT_PEEK_USHORT( p );
p += 2 + num_segs2;
start = TT_PEEK_USHORT( p );
p += num_segs2;
delta = TT_PEEK_SHORT( p );
p += num_segs2;
offset = TT_PEEK_USHORT( p );
}
mid = max;
/* find in segments after the current segment */
/* search in segments after the current segment */
for ( i = max + 1; i < num_segs; i++ )
{
FT_UInt next_end, next_start;
p = cmap->data + 14 + i * 2;
next_end = TT_PEEK_USHORT( p );
p += 2 + num_segs2;
next_start = TT_PEEK_USHORT( p );
p = cmap->data + 14 + i * 2;
next_end = TT_PEEK_USHORT( p );
p += 2 + num_segs2;
next_start = TT_PEEK_USHORT( p );
if ( charcode < next_start )
break;
end = next_end;
start = next_start;
p += num_segs2;
delta = TT_PEEK_SHORT( p );
p += num_segs2;
offset = TT_PEEK_USHORT( p );
end = next_end;
start = next_start;
p += num_segs2;
delta = TT_PEEK_SHORT( p );
p += num_segs2;
offset = TT_PEEK_USHORT( p );
if ( offset != 0xFFFFU )
mid = i;
@ -1167,17 +1167,17 @@
}
}
/* end, start, delta and offset are for the i'th segment */
/* end, start, delta, and offset are for the i'th segment */
if ( mid != i )
{
p = cmap->data + 14 + mid * 2;
end = TT_PEEK_USHORT( p );
p += 2 + num_segs2;
start = TT_PEEK_USHORT( p );
p += num_segs2;
delta = TT_PEEK_SHORT( p );
p += num_segs2;
offset = TT_PEEK_USHORT( p );
p = cmap->data + 14 + mid * 2;
end = TT_PEEK_USHORT( p );
p += 2 + num_segs2;
start = TT_PEEK_USHORT( p );
p += num_segs2;
delta = TT_PEEK_SHORT( p );
p += num_segs2;
offset = TT_PEEK_USHORT( p );
}
}
else
@ -1247,7 +1247,7 @@
tt_cmap4_char_index( TT_CMap cmap,
FT_UInt32 char_code )
{
if ( char_code >= 0x10000U )
if ( char_code >= 0x10000UL )
return 0;
if ( cmap->flags & TT_CMAP_FLAG_UNSORTED )
@ -1927,14 +1927,14 @@
FT_CALLBACK_DEF( FT_Error )
tt_cmap12_init( TT_CMap12 cmap,
FT_Byte* table )
FT_Byte* table )
{
cmap->cmap.data = table;
cmap->cmap.data = table;
table += 12;
cmap->num_groups = FT_PEEK_ULONG( table );
table += 12;
cmap->num_groups = FT_PEEK_ULONG( table );
cmap->valid = 0;
cmap->valid = 0;
return SFNT_Err_Ok;
}
@ -1992,9 +1992,9 @@
}
/* find the index of the charcode next to cmap->cur_charcode */
/* cmap->cur_group should be set up properly by caller */
/* */
/* search the index of the charcode next to cmap->cur_charcode */
/* cmap->cur_group should be set up properly by caller */
/* */
static void
tt_cmap12_next( TT_CMap12 cmap )
{
@ -2071,10 +2071,10 @@
while ( min < max )
{
mid = ( min + max ) >> 1;
p = cmap->data + 16 + 12 * mid;
p = cmap->data + 16 + 12 * mid;
start = TT_NEXT_ULONG( p );
end = TT_NEXT_ULONG( p );
start = TT_NEXT_ULONG( p );
end = TT_NEXT_ULONG( p );
if ( char_code < start )
max = mid;
@ -2105,9 +2105,9 @@
return 0;
}
cmap12->valid = 1;
cmap12->valid = 1;
cmap12->cur_charcode = char_code;
cmap12->cur_group = mid;
cmap12->cur_group = mid;
if ( !gindex )
{
@ -2304,7 +2304,8 @@
FT_CMap ttcmap;
if ( !FT_CMap_New( (FT_CMap_Class)clazz, cmap, &charmap, &ttcmap ) )
if ( !FT_CMap_New( (FT_CMap_Class)clazz,
cmap, &charmap, &ttcmap ) )
{
/* it is simpler to directly set `flags' than adding */
/* a parameter to FT_CMap_New */

View File

@ -28,8 +28,8 @@
FT_BEGIN_HEADER
#define TT_CMAP_FLAG_UNSORTED 1
#define TT_CMAP_FLAG_OVERLAPPED 2
#define TT_CMAP_FLAG_UNSORTED 1
#define TT_CMAP_FLAG_OVERLAPPING 2
typedef struct TT_CMapRec_
{