gdi32/tests: tmLastChar is solely governed by the last entry before 0xffff in the cmap.

This commit is contained in:
Huw Davies 2014-05-23 11:33:54 +01:00 committed by Alexandre Julliard
parent 6262492252
commit 0987e77089
3 changed files with 31 additions and 48 deletions

View file

@ -3255,42 +3255,20 @@ static BOOL get_first_last_from_cmap4(void *ptr, DWORD *first, DWORD *last, DWOR
int i;
cmap_format_4 *cmap = (cmap_format_4*)ptr;
USHORT seg_count = GET_BE_WORD(cmap->seg_countx2) / 2;
USHORT const *glyph_ids = cmap->end_count + 4 * seg_count + 1;
*first = 0x10000;
for(i = 0; i < seg_count; i++)
{
DWORD code, index;
cmap_format_4_seg seg;
get_seg4(cmap, i, &seg);
for(code = seg.start_count; code <= seg.end_count; code++)
{
if(seg.id_range_offset == 0)
index = (seg.id_delta + code) & 0xffff;
else
{
index = seg.id_range_offset / 2
+ code - seg.start_count
+ i - seg_count;
/* some fonts have broken last segment */
if ((char *)(glyph_ids + index + 1) < (char *)ptr + limit)
index = GET_BE_WORD(glyph_ids[index]);
else
{
trace("segment %04x/%04x index %04x points to nowhere\n",
seg.start_count, seg.end_count, index);
index = 0;
}
if(index) index += seg.id_delta;
}
if(*first == 0x10000)
*last = *first = code;
else if(index)
*last = code;
}
if(seg.start_count > 0xfffe) break;
if(*first == 0x10000) *first = seg.start_count;
*last = min(seg.end_count, 0xfffe);
}
if(*first == 0x10000) return FALSE;
@ -3560,7 +3538,7 @@ static void test_text_metrics(const LOGFONTA *lf, const NEWTEXTMETRICA *ntm)
else
{
expect_first_W = cmap_first;
expect_last_W = min(cmap_last, os2_last_char);
expect_last_W = cmap_last;
if(os2_first_char <= 1)
expect_break_W = os2_first_char + 2;
else if(os2_first_char > 0xff)
@ -5064,6 +5042,7 @@ static void test_GetGlyphOutline_metric_clipping(void)
HFONT hfont, hfont_prev;
GLYPHMETRICS gm;
TEXTMETRICA tm;
TEXTMETRICW tmW;
DWORD ret;
memset(&lf, 0, sizeof(lf));
@ -5092,6 +5071,11 @@ static void test_GetGlyphOutline_metric_clipping(void)
"Glyph bottom(%d) exceeds descent(%d)\n",
gm.gmptGlyphOrigin.y - gm.gmBlackBoxY, -tm.tmDescent);
/* Test tmLastChar - wine_test has code points fffb-fffe mapped to glyph 0 */
GetTextMetricsW(hdc, &tmW);
todo_wine
ok( tmW.tmLastChar == 0xfffe, "got %04x\n", tmW.tmLastChar);
SelectObject(hdc, hfont_prev);
DeleteObject(hfont);
ReleaseDC(NULL, hdc);

View file

@ -12,15 +12,13 @@ Ascent: 1638
Descent: 410
sfntRevision: 0x00010000
LayerCount: 2
Layer: 0 1 "Back" 1
Layer: 1 1 "Fore" 0
Layer: 0 1 "Back" 1
Layer: 1 1 "Fore" 0
XUID: [1021 905 592216984 1247726]
FSType: 0
OS2Version: 2
OS2_WeightWidthSlopeOnly: 0
OS2_UseTypoMetrics: 1
CreationTime: 1288336343
ModificationTime: 1366465321
PfmFamily: 17
TTFWeight: 500
TTFWidth: 5
@ -92,6 +90,7 @@ BeginChars: 65539 7
StartChar: .notdef
Encoding: 65536 -1 0
AltUni2: 00fffe.ffffffff.0 00fffd.ffffffff.0 00fffc.ffffffff.0 00fffb.ffffffff.0
Width: 748
Flags: W
TtInstrs:
@ -212,14 +211,14 @@ Flags: WO
LayerCount: 2
Fore
SplineSet
459 1258 m 29,0,-1
462 1639 l 5,1,-1
389 1638 l 5,2,-1
492 1815 l 5,3,-1
609 1638.5 l 5,4,-1
531 1637.5 l 5,5,-1
523 1258 l 5,6,-1
459 1258 l 29,0,-1
459 1258 m 25,0,-1
462 1639 l 1,1,-1
389 1638 l 1,2,-1
492 1815 l 1,3,-1
609 1638.5 l 1,4,-1
531 1637.5 l 1,5,-1
523 1258 l 1,6,-1
459 1258 l 25,0,-1
EndSplineSet
EndChar
@ -231,14 +230,14 @@ Flags: WO
LayerCount: 2
Fore
SplineSet
461 -30.7998 m 29,0,-1
464 -411.8 l 5,1,-1
391 -410.8 l 5,2,-1
494 -587.8 l 5,3,-1
611 -411.3 l 5,4,-1
533 -410.3 l 5,5,-1
525 -30.7998 l 5,6,-1
461 -30.7998 l 29,0,-1
461 -30.7998 m 25,0,-1
464 -411.8 l 1,1,-1
391 -410.8 l 1,2,-1
494 -587.8 l 1,3,-1
611 -411.3 l 1,4,-1
533 -410.3 l 1,5,-1
525 -30.7998 l 1,6,-1
461 -30.7998 l 25,0,-1
EndSplineSet
EndChar
EndChars

Binary file not shown.