Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
7d3cb53c
Commit
7d3cb53c
authored
May 18, 2010
by
Dmitry Timoshkov
Committed by
Alexandre Julliard
May 18, 2010
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
gdi32: Do not use VDMX for mapping of negative font heights, based on a test case.
parent
cc870dc4
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
79 additions
and
25 deletions
+79
-25
freetype.c
dlls/gdi32/freetype.c
+0
-19
font.c
dlls/gdi32/tests/font.c
+79
-6
No files found.
dlls/gdi32/freetype.c
View file @
7d3cb53c
...
@@ -3237,25 +3237,6 @@ static LONG load_VDMX(GdiFont *font, LONG height)
...
@@ -3237,25 +3237,6 @@ static LONG load_VDMX(GdiFont *font, LONG height)
ppem
=
0
;
ppem
=
0
;
TRACE
(
"ppem not found for height %d
\n
"
,
height
);
TRACE
(
"ppem not found for height %d
\n
"
,
height
);
}
}
}
else
{
ppem
=
-
height
;
if
(
ppem
<
startsz
||
ppem
>
endsz
)
goto
end
;
for
(
i
=
0
;
i
<
recs
;
i
++
)
{
USHORT
yPelHeight
;
yPelHeight
=
GET_BE_WORD
(
vTable
[
i
*
3
]);
if
(
yPelHeight
>
ppem
)
break
;
/* failed */
if
(
yPelHeight
==
ppem
)
{
font
->
yMax
=
GET_BE_WORD
(
vTable
[(
i
*
3
)
+
1
]);
font
->
yMin
=
GET_BE_WORD
(
vTable
[(
i
*
3
)
+
2
]);
TRACE
(
"ppem %d found; yMax=%d yMin=%d
\n
"
,
ppem
,
font
->
yMax
,
font
->
yMin
);
break
;
}
}
}
}
end:
end:
HeapFree
(
GetProcessHeap
(),
0
,
vTable
);
HeapFree
(
GetProcessHeap
(),
0
,
vTable
);
...
...
dlls/gdi32/tests/font.c
View file @
7d3cb53c
...
@@ -30,6 +30,9 @@
...
@@ -30,6 +30,9 @@
#include "wine/test.h"
#include "wine/test.h"
/* Do not allow more than 1 deviation here */
#define match_off_by_1(a, b) (abs((a) - (b)) <= 1)
#define near_match(a, b) (abs((a) - (b)) <= 6)
#define near_match(a, b) (abs((a) - (b)) <= 6)
#define expect(expected, got) ok(got == expected, "Expected %.8x, got %.8x\n", expected, got)
#define expect(expected, got) ok(got == expected, "Expected %.8x, got %.8x\n", expected, got)
...
@@ -1166,9 +1169,9 @@ static void test_GetKerningPairs(void)
...
@@ -1166,9 +1169,9 @@ static void test_GetKerningPairs(void)
otm
.
otmSize
=
sizeof
(
otm
);
/* just in case for Win9x compatibility */
otm
.
otmSize
=
sizeof
(
otm
);
/* just in case for Win9x compatibility */
ok
(
GetOutlineTextMetricsW
(
hdc
,
sizeof
(
otm
),
&
otm
)
==
sizeof
(
otm
),
"GetOutlineTextMetricsW error %d
\n
"
,
GetLastError
());
ok
(
GetOutlineTextMetricsW
(
hdc
,
sizeof
(
otm
),
&
otm
)
==
sizeof
(
otm
),
"GetOutlineTextMetricsW error %d
\n
"
,
GetLastError
());
ok
(
kd
[
i
].
tmHeight
==
otm
.
otmTextMetrics
.
tmHeight
,
"expected %d, got %d
\n
"
,
ok
(
match_off_by_1
(
kd
[
i
].
tmHeight
,
otm
.
otmTextMetrics
.
tmHeight
)
,
"expected %d, got %d
\n
"
,
kd
[
i
].
tmHeight
,
otm
.
otmTextMetrics
.
tmHeight
);
kd
[
i
].
tmHeight
,
otm
.
otmTextMetrics
.
tmHeight
);
ok
(
kd
[
i
].
tmAscent
==
otm
.
otmTextMetrics
.
tmAscent
,
"expected %d, got %d
\n
"
,
ok
(
match_off_by_1
(
kd
[
i
].
tmAscent
,
otm
.
otmTextMetrics
.
tmAscent
)
,
"expected %d, got %d
\n
"
,
kd
[
i
].
tmAscent
,
otm
.
otmTextMetrics
.
tmAscent
);
kd
[
i
].
tmAscent
,
otm
.
otmTextMetrics
.
tmAscent
);
ok
(
kd
[
i
].
tmDescent
==
otm
.
otmTextMetrics
.
tmDescent
,
"expected %d, got %d
\n
"
,
ok
(
kd
[
i
].
tmDescent
==
otm
.
otmTextMetrics
.
tmDescent
,
"expected %d, got %d
\n
"
,
kd
[
i
].
tmDescent
,
otm
.
otmTextMetrics
.
tmDescent
);
kd
[
i
].
tmDescent
,
otm
.
otmTextMetrics
.
tmDescent
);
...
@@ -1183,13 +1186,13 @@ static void test_GetKerningPairs(void)
...
@@ -1183,13 +1186,13 @@ static void test_GetKerningPairs(void)
kd
[
i
].
otmLineGap
,
otm
.
otmLineGap
);
kd
[
i
].
otmLineGap
,
otm
.
otmLineGap
);
ok
(
near_match
(
kd
[
i
].
otmMacDescent
,
otm
.
otmMacDescent
),
"expected %d, got %d
\n
"
,
ok
(
near_match
(
kd
[
i
].
otmMacDescent
,
otm
.
otmMacDescent
),
"expected %d, got %d
\n
"
,
kd
[
i
].
otmMacDescent
,
otm
.
otmMacDescent
);
kd
[
i
].
otmMacDescent
,
otm
.
otmMacDescent
);
ok
(
near_match
(
kd
[
i
].
otmMacAscent
,
otm
.
otmMacAscent
),
"expected %d, got %d
\n
"
,
kd
[
i
].
otmMacAscent
,
otm
.
otmMacAscent
);
todo_wine
{
todo_wine
{
ok
(
kd
[
i
].
otmsCapEmHeight
==
otm
.
otmsCapEmHeight
,
"expected %u, got %u
\n
"
,
ok
(
kd
[
i
].
otmsCapEmHeight
==
otm
.
otmsCapEmHeight
,
"expected %u, got %u
\n
"
,
kd
[
i
].
otmsCapEmHeight
,
otm
.
otmsCapEmHeight
);
kd
[
i
].
otmsCapEmHeight
,
otm
.
otmsCapEmHeight
);
ok
(
kd
[
i
].
otmsXHeight
==
otm
.
otmsXHeight
,
"expected %u, got %u
\n
"
,
ok
(
kd
[
i
].
otmsXHeight
==
otm
.
otmsXHeight
,
"expected %u, got %u
\n
"
,
kd
[
i
].
otmsXHeight
,
otm
.
otmsXHeight
);
kd
[
i
].
otmsXHeight
,
otm
.
otmsXHeight
);
ok
(
kd
[
i
].
otmMacAscent
==
otm
.
otmMacAscent
,
"expected %d, got %d
\n
"
,
kd
[
i
].
otmMacAscent
,
otm
.
otmMacAscent
);
/* FIXME: this one sometimes succeeds due to expected 0, enable it when removing todo */
/* FIXME: this one sometimes succeeds due to expected 0, enable it when removing todo */
if
(
0
)
ok
(
kd
[
i
].
otmMacLineGap
==
otm
.
otmMacLineGap
,
"expected %u, got %u
\n
"
,
if
(
0
)
ok
(
kd
[
i
].
otmMacLineGap
==
otm
.
otmMacLineGap
,
"expected %u, got %u
\n
"
,
kd
[
i
].
otmMacLineGap
,
otm
.
otmMacLineGap
);
kd
[
i
].
otmMacLineGap
,
otm
.
otmMacLineGap
);
...
@@ -1254,6 +1257,74 @@ todo_wine {
...
@@ -1254,6 +1257,74 @@ todo_wine {
ReleaseDC
(
0
,
hdc
);
ReleaseDC
(
0
,
hdc
);
}
}
static
void
test_height_selection
(
void
)
{
static
const
struct
font_data
{
const
char
face_name
[
LF_FACESIZE
];
int
requested_height
;
int
weight
,
height
,
ascent
,
descent
,
int_leading
,
ext_leading
,
dpi
;
}
fd
[]
=
{
{
"Tahoma"
,
-
12
,
FW_NORMAL
,
14
,
12
,
2
,
2
,
0
,
96
},
{
"Tahoma"
,
-
24
,
FW_NORMAL
,
29
,
24
,
5
,
5
,
0
,
96
},
{
"Tahoma"
,
-
48
,
FW_NORMAL
,
58
,
48
,
10
,
10
,
0
,
96
},
{
"Tahoma"
,
-
96
,
FW_NORMAL
,
116
,
96
,
20
,
20
,
0
,
96
},
{
"Tahoma"
,
-
192
,
FW_NORMAL
,
232
,
192
,
40
,
40
,
0
,
96
},
{
"Tahoma"
,
12
,
FW_NORMAL
,
12
,
10
,
2
,
2
,
0
,
96
},
{
"Tahoma"
,
24
,
FW_NORMAL
,
24
,
20
,
4
,
4
,
0
,
96
},
{
"Tahoma"
,
48
,
FW_NORMAL
,
48
,
40
,
8
,
8
,
0
,
96
},
{
"Tahoma"
,
96
,
FW_NORMAL
,
96
,
80
,
16
,
17
,
0
,
96
},
{
"Tahoma"
,
192
,
FW_NORMAL
,
192
,
159
,
33
,
33
,
0
,
96
}
};
HDC
hdc
;
LOGFONT
lf
;
HFONT
hfont
,
old_hfont
;
TEXTMETRIC
tm
;
INT
ret
,
i
;
hdc
=
CreateCompatibleDC
(
0
);
assert
(
hdc
);
for
(
i
=
0
;
i
<
sizeof
(
fd
)
/
sizeof
(
fd
[
0
]);
i
++
)
{
if
(
!
is_truetype_font_installed
(
fd
[
i
].
face_name
))
{
skip
(
"%s is not installed
\n
"
,
fd
[
i
].
face_name
);
continue
;
}
memset
(
&
lf
,
0
,
sizeof
(
lf
));
lf
.
lfHeight
=
fd
[
i
].
requested_height
;
lf
.
lfWeight
=
fd
[
i
].
weight
;
strcpy
(
lf
.
lfFaceName
,
fd
[
i
].
face_name
);
hfont
=
CreateFontIndirect
(
&
lf
);
assert
(
hfont
);
old_hfont
=
SelectObject
(
hdc
,
hfont
);
ret
=
GetTextMetrics
(
hdc
,
&
tm
);
ok
(
ret
,
"GetTextMetrics error %d
\n
"
,
GetLastError
());
if
(
fd
[
i
].
dpi
==
tm
.
tmDigitizedAspectX
)
{
trace
(
"found font %s, height %d charset %x dpi %d
\n
"
,
lf
.
lfFaceName
,
lf
.
lfHeight
,
lf
.
lfCharSet
,
fd
[
i
].
dpi
);
ok
(
tm
.
tmWeight
==
fd
[
i
].
weight
,
"%s(%d): tm.tmWeight %d != %d
\n
"
,
fd
[
i
].
face_name
,
fd
[
i
].
requested_height
,
tm
.
tmWeight
,
fd
[
i
].
weight
);
ok
(
match_off_by_1
(
tm
.
tmHeight
,
fd
[
i
].
height
),
"%s(%d): tm.tmHeight %d != %d
\n
"
,
fd
[
i
].
face_name
,
fd
[
i
].
requested_height
,
tm
.
tmHeight
,
fd
[
i
].
height
);
ok
(
match_off_by_1
(
tm
.
tmAscent
,
fd
[
i
].
ascent
),
"%s(%d): tm.tmAscent %d != %d
\n
"
,
fd
[
i
].
face_name
,
fd
[
i
].
requested_height
,
tm
.
tmAscent
,
fd
[
i
].
ascent
);
ok
(
match_off_by_1
(
tm
.
tmDescent
,
fd
[
i
].
descent
),
"%s(%d): tm.tmDescent %d != %d
\n
"
,
fd
[
i
].
face_name
,
fd
[
i
].
requested_height
,
tm
.
tmDescent
,
fd
[
i
].
descent
);
#if 0 /* FIXME: calculation of tmInternalLeading in Wine doesn't match what Windows does */
ok(tm.tmInternalLeading == fd[i].int_leading, "%s(%d): tm.tmInternalLeading %d != %d\n", fd[i].face_name, fd[i].requested_height, tm.tmInternalLeading, fd[i].int_leading);
#endif
ok
(
tm
.
tmExternalLeading
==
fd
[
i
].
ext_leading
,
"%s(%d): tm.tmExternalLeading %d != %d
\n
"
,
fd
[
i
].
face_name
,
fd
[
i
].
requested_height
,
tm
.
tmExternalLeading
,
fd
[
i
].
ext_leading
);
}
SelectObject
(
hdc
,
old_hfont
);
DeleteObject
(
hfont
);
}
DeleteDC
(
hdc
);
}
static
void
test_GetOutlineTextMetrics
(
void
)
static
void
test_GetOutlineTextMetrics
(
void
)
{
{
OUTLINETEXTMETRIC
*
otm
;
OUTLINETEXTMETRIC
*
otm
;
...
@@ -2965,7 +3036,7 @@ static void test_GetTextMetrics2(const char *fontname, int font_height)
...
@@ -2965,7 +3036,7 @@ static void test_GetTextMetrics2(const char *fontname, int font_height)
DEFAULT_CHARSET
,
OUT_TT_PRECIS
,
CLIP_LH_ANGLES
,
DEFAULT_CHARSET
,
OUT_TT_PRECIS
,
CLIP_LH_ANGLES
,
DEFAULT_QUALITY
,
VARIABLE_PITCH
,
DEFAULT_QUALITY
,
VARIABLE_PITCH
,
fontname
);
fontname
);
ok
(
hf
!=
NULL
,
"CreateFontA
failed
\n
"
);
ok
(
hf
!=
NULL
,
"CreateFontA
(%s, %d) failed
\n
"
,
fontname
,
font_height
);
of
=
SelectObject
(
hdc
,
hf
);
of
=
SelectObject
(
hdc
,
hf
);
ret
=
GetTextMetricsA
(
hdc
,
&
tm
);
ret
=
GetTextMetricsA
(
hdc
,
&
tm
);
ok
(
ret
,
"GetTextMetricsA error %u
\n
"
,
GetLastError
());
ok
(
ret
,
"GetTextMetricsA error %u
\n
"
,
GetLastError
());
...
@@ -2988,7 +3059,7 @@ static void test_GetTextMetrics2(const char *fontname, int font_height)
...
@@ -2988,7 +3059,7 @@ static void test_GetTextMetrics2(const char *fontname, int font_height)
SelectObject
(
hdc
,
of
);
SelectObject
(
hdc
,
of
);
DeleteObject
(
hf
);
DeleteObject
(
hf
);
if
(
tm
.
tmAveCharWidth
==
ave_width
||
width
/
height
>
200
)
if
(
match_off_by_1
(
tm
.
tmAveCharWidth
,
ave_width
)
||
width
/
height
>
200
)
break
;
break
;
}
}
...
@@ -3039,6 +3110,7 @@ static void test_CreateFontIndirect(void)
...
@@ -3039,6 +3110,7 @@ static void test_CreateFontIndirect(void)
START_TEST
(
font
)
START_TEST
(
font
)
{
{
init
();
init
();
test_logfont
();
test_logfont
();
test_bitmap_font
();
test_bitmap_font
();
test_outline_font
();
test_outline_font
();
...
@@ -3054,6 +3126,7 @@ START_TEST(font)
...
@@ -3054,6 +3126,7 @@ START_TEST(font)
test_GetFontUnicodeRanges
();
test_GetFontUnicodeRanges
();
test_nonexistent_font
();
test_nonexistent_font
();
test_orientation
();
test_orientation
();
test_height_selection
();
/* On Windows Arial has a lot of default charset aliases such as Arial Cyr,
/* On Windows Arial has a lot of default charset aliases such as Arial Cyr,
* I'd like to avoid them in this test.
* I'd like to avoid them in this test.
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment