Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
wine
Manage
Activity
Members
Labels
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Package registry
Container Registry
Model registry
Operate
Terraform modules
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Alexey Alyaev
wine
Commits
d14b2f0f
Commit
d14b2f0f
authored
22 years ago
by
Huw D. M. Davies
Committed by
Alexandre Julliard
22 years ago
Browse files
Options
Downloads
Patches
Plain Diff
Load libfreetype.so on the fly with dlopen and friends.
parent
7ed8cee8
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
dlls/gdi/Makefile.in
+0
-1
0 additions, 1 deletion
dlls/gdi/Makefile.in
dlls/gdi/freetype.c
+119
-51
119 additions, 51 deletions
dlls/gdi/freetype.c
dlls/wineps/Makefile.in
+1
-1
1 addition, 1 deletion
dlls/wineps/Makefile.in
dlls/wineps/truetype.c
+72
-17
72 additions, 17 deletions
dlls/wineps/truetype.c
with
192 additions
and
70 deletions
dlls/gdi/Makefile.in
+
0
−
1
View file @
d14b2f0f
...
...
@@ -6,7 +6,6 @@ VPATH = @srcdir@
MODULE
=
gdi32.dll
ALTNAMES
=
gdi.exe dispdib.dll wing.dll
IMPORTS
=
kernel32.dll ntdll.dll
EXTRALIBS
=
@FREETYPELIBS@
EXTRAINCL
=
@FREETYPEINCL@
C_SRCS
=
\
...
...
This diff is collapsed.
Click to expand it.
dlls/gdi/freetype.c
+
119
−
51
View file @
d14b2f0f
...
...
@@ -29,10 +29,11 @@
#include
"wingdi.h"
#include
"wine/unicode.h"
#include
"wine/port.h"
#include
"wine/debug.h"
#include
"gdi.h"
#include
"font.h"
#include
"wine/debug.h"
#include
<stdlib.h>
#include
<sys/stat.h>
#include
<string.h>
#include
<dirent.h>
...
...
@@ -74,6 +75,26 @@ WINE_DEFAULT_DEBUG_CHANNEL(font);
static
FT_Library
library
=
0
;
static
void
*
ft_handle
=
NULL
;
#define MAKE_FUNCPTR(f) static typeof(f) * p##f = NULL;
MAKE_FUNCPTR
(
FT_Cos
)
MAKE_FUNCPTR
(
FT_Done_Face
)
MAKE_FUNCPTR
(
FT_Get_Char_Index
)
MAKE_FUNCPTR
(
FT_Get_Sfnt_Table
)
MAKE_FUNCPTR
(
FT_Init_FreeType
)
MAKE_FUNCPTR
(
FT_Load_Glyph
)
MAKE_FUNCPTR
(
FT_MulFix
)
MAKE_FUNCPTR
(
FT_New_Face
)
MAKE_FUNCPTR
(
FT_Outline_Get_Bitmap
)
MAKE_FUNCPTR
(
FT_Outline_Transform
)
MAKE_FUNCPTR
(
FT_Outline_Translate
)
MAKE_FUNCPTR
(
FT_Select_Charmap
)
MAKE_FUNCPTR
(
FT_Set_Pixel_Sizes
)
MAKE_FUNCPTR
(
FT_Sin
)
MAKE_FUNCPTR
(
FT_Vector_Rotate
)
#undef MAKE_FUNCPTR
typedef
struct
tagFace
{
WCHAR
*
StyleName
;
char
*
file
;
...
...
@@ -171,13 +192,13 @@ static BOOL AddFontFileToList(char *file)
int
i
;
TRACE
(
"Loading font file %s
\n
"
,
debugstr_a
(
file
));
if
((
err
=
FT_New_Face
(
library
,
file
,
0
,
&
ft_face
))
!=
0
)
{
if
((
err
=
p
FT_New_Face
(
library
,
file
,
0
,
&
ft_face
))
!=
0
)
{
ERR
(
"Unable to load font file %s err = %x
\n
"
,
debugstr_a
(
file
),
err
);
return
FALSE
;
}
if
(
!
FT_IS_SFNT
(
ft_face
))
{
/* for now we'll skip everything but TT/OT */
FT_Done_Face
(
ft_face
);
p
FT_Done_Face
(
ft_face
);
return
FALSE
;
}
...
...
@@ -211,7 +232,7 @@ static BOOL AddFontFileToList(char *file)
ERR
(
"Already loaded font %s %s
\n
"
,
debugstr_w
(
family
->
FamilyName
),
debugstr_w
(
StyleW
));
HeapFree
(
GetProcessHeap
(),
0
,
StyleW
);
FT_Done_Face
(
ft_face
);
p
FT_Done_Face
(
ft_face
);
return
FALSE
;
}
}
...
...
@@ -223,13 +244,14 @@ static BOOL AddFontFileToList(char *file)
(
*
insertface
)
->
Italic
=
(
ft_face
->
style_flags
&
FT_STYLE_FLAG_ITALIC
)
?
1
:
0
;
(
*
insertface
)
->
Bold
=
(
ft_face
->
style_flags
&
FT_STYLE_FLAG_BOLD
)
?
1
:
0
;
pOS2
=
FT_Get_Sfnt_Table
(
ft_face
,
ft_sfnt_os2
);
pOS2
=
p
FT_Get_Sfnt_Table
(
ft_face
,
ft_sfnt_os2
);
if
(
pOS2
)
{
(
*
insertface
)
->
fsCsb
[
0
]
=
pOS2
->
ulCodePageRange1
;
(
*
insertface
)
->
fsCsb
[
1
]
=
pOS2
->
ulCodePageRange2
;
}
else
{
(
*
insertface
)
->
fsCsb
[
0
]
=
(
*
insertface
)
->
fsCsb
[
1
]
=
0
;
}
TRACE
(
"fsCsb = %08lx %08lx
\n
"
,
(
*
insertface
)
->
fsCsb
[
0
],
(
*
insertface
)
->
fsCsb
[
1
]);
if
((
*
insertface
)
->
fsCsb
[
0
]
==
0
)
{
/* let's see if we can find any interesting cmaps */
for
(
i
=
0
;
i
<
ft_face
->
num_charmaps
&&
...
...
@@ -247,7 +269,7 @@ static BOOL AddFontFileToList(char *file)
}
}
FT_Done_Face
(
ft_face
);
p
FT_Done_Face
(
ft_face
);
TRACE
(
"Added font %s %s
\n
"
,
debugstr_w
(
family
->
FamilyName
),
debugstr_w
(
StyleW
));
...
...
@@ -322,8 +344,46 @@ BOOL WineEngInit(void)
TRACE
(
"
\n
"
);
if
(
FT_Init_FreeType
(
&
library
)
!=
0
)
{
ft_handle
=
wine_dlopen
(
"libfreetype.so"
,
RTLD_NOW
,
NULL
,
0
);
if
(
!
ft_handle
)
{
WINE_MESSAGE
(
"Wine cannot find the FreeType font library. To enable Wine to
\n
"
"use TrueType fonts please install a version of FreeType greater than
\n
"
"or equal to 2.0.5.
\n
"
"http://www.freetype.org
\n
"
);
return
FALSE
;
}
#define LOAD_FUNCPTR(f) if((p##f = wine_dlsym(ft_handle, #f, NULL, 0)) == NULL){WARN("Can't find symbol %s\n", #f); goto sym_not_found;}
LOAD_FUNCPTR
(
FT_Cos
)
LOAD_FUNCPTR
(
FT_Done_Face
)
LOAD_FUNCPTR
(
FT_Get_Char_Index
)
LOAD_FUNCPTR
(
FT_Get_Sfnt_Table
)
LOAD_FUNCPTR
(
FT_Init_FreeType
)
LOAD_FUNCPTR
(
FT_Load_Glyph
)
LOAD_FUNCPTR
(
FT_MulFix
)
LOAD_FUNCPTR
(
FT_New_Face
)
LOAD_FUNCPTR
(
FT_Outline_Get_Bitmap
)
LOAD_FUNCPTR
(
FT_Outline_Transform
)
LOAD_FUNCPTR
(
FT_Outline_Translate
)
LOAD_FUNCPTR
(
FT_Select_Charmap
)
LOAD_FUNCPTR
(
FT_Set_Pixel_Sizes
)
LOAD_FUNCPTR
(
FT_Sin
)
LOAD_FUNCPTR
(
FT_Vector_Rotate
)
#undef LOAD_FUNCPTR
if
(
!
wine_dlsym
(
ft_handle
,
"FT_Get_Postscript_Name"
,
NULL
,
0
)
&&
!
wine_dlsym
(
ft_handle
,
"FT_Sqrt64"
,
NULL
,
0
))
{
/* try to avoid 2.0.4: >= 2.0.5 has FT_Get_Postscript_Name and
<= 2.0.3 has FT_Sqrt64 */
goto
sym_not_found
;
}
if
(
pFT_Init_FreeType
(
&
library
)
!=
0
)
{
ERR
(
"Can't init FreeType library
\n
"
);
wine_dlclose
(
ft_handle
,
NULL
,
0
);
return
FALSE
;
}
...
...
@@ -362,6 +422,14 @@ BOOL WineEngInit(void)
DumpFontList
();
return
TRUE
;
sym_not_found:
WINE_MESSAGE
(
"Wine cannot find certain functions that it needs inside the FreeType
\n
"
"font library. To enable Wine to use TrueType fonts please upgrade
\n
"
"FreeType to at least version 2.0.5.
\n
"
"http://www.freetype.org
\n
"
);
wine_dlclose
(
ft_handle
,
NULL
,
0
);
return
FALSE
;
}
...
...
@@ -370,7 +438,7 @@ static LONG calc_ppem_for_height(FT_Face ft_face, LONG height)
TT_OS2
*
pOS2
;
LONG
ppem
;
pOS2
=
FT_Get_Sfnt_Table
(
ft_face
,
ft_sfnt_os2
);
pOS2
=
p
FT_Get_Sfnt_Table
(
ft_face
,
ft_sfnt_os2
);
if
(
height
==
0
)
height
=
16
;
...
...
@@ -405,7 +473,7 @@ static FT_Face OpenFontFile(GdiFont font, char *file, LONG height)
FT_Face
ft_face
;
LONG
ppem
;
err
=
FT_New_Face
(
library
,
file
,
0
,
&
ft_face
);
err
=
p
FT_New_Face
(
library
,
file
,
0
,
&
ft_face
);
if
(
err
)
{
ERR
(
"FT_New_Face rets %d
\n
"
,
err
);
return
0
;
...
...
@@ -419,7 +487,7 @@ static FT_Face OpenFontFile(GdiFont font, char *file, LONG height)
if
(
ppem
==
0
)
ppem
=
calc_ppem_for_height
(
ft_face
,
height
);
FT_Set_Pixel_Sizes
(
ft_face
,
0
,
ppem
);
p
FT_Set_Pixel_Sizes
(
ft_face
,
0
,
ppem
);
return
ft_face
;
}
...
...
@@ -452,7 +520,7 @@ static GdiFont alloc_font(void)
static
void
free_font
(
GdiFont
font
)
{
FT_Done_Face
(
font
->
ft_face
);
if
(
font
->
ft_face
)
p
FT_Done_Face
(
font
->
ft_face
);
HeapFree
(
GetProcessHeap
(),
0
,
font
->
gm
);
HeapFree
(
GetProcessHeap
(),
0
,
font
);
}
...
...
@@ -707,7 +775,7 @@ not_found:
ret
->
ft_face
=
OpenFontFile
(
ret
,
face
->
file
,
plf
->
lfHeight
);
if
(
ret
->
charset
==
SYMBOL_CHARSET
)
FT_Select_Charmap
(
ret
->
ft_face
,
ft_encoding_symbol
);
p
FT_Select_Charmap
(
ret
->
ft_face
,
ft_encoding_symbol
);
ret
->
orientation
=
plf
->
lfOrientation
;
GDI_ReleaseObj
(
hfont
);
...
...
@@ -937,7 +1005,7 @@ static FT_UInt get_glyph_index(GdiFont font, UINT glyph)
{
if
(
font
->
charset
==
SYMBOL_CHARSET
&&
glyph
<
0x100
)
glyph
=
glyph
+
0xf000
;
return
FT_Get_Char_Index
(
font
->
ft_face
,
glyph
);
return
p
FT_Get_Char_Index
(
font
->
ft_face
,
glyph
);
}
/*************************************************************
...
...
@@ -980,7 +1048,7 @@ DWORD WineEngGetGlyphOutline(GdiFont font, UINT glyph, UINT format,
}
}
err
=
FT_Load_Glyph
(
ft_face
,
glyph_index
,
FT_LOAD_DEFAULT
);
err
=
p
FT_Load_Glyph
(
ft_face
,
glyph_index
,
FT_LOAD_DEFAULT
);
if
(
err
)
{
FIXME
(
"FT_Load_Glyph on index %x returns %d
\n
"
,
glyph_index
,
err
);
...
...
@@ -1014,7 +1082,7 @@ DWORD WineEngGetGlyphOutline(GdiFont font, UINT glyph, UINT format,
vec
.
y
=
ft_face
->
glyph
->
metrics
.
horiBearingY
-
yc
*
ft_face
->
glyph
->
metrics
.
height
;
TRACE
(
"Vec %ld,%ld
\n
"
,
vec
.
x
,
vec
.
y
);
FT_Vector_Rotate
(
&
vec
,
angle
);
p
FT_Vector_Rotate
(
&
vec
,
angle
);
if
(
xc
==
0
&&
yc
==
0
)
{
left
=
right
=
vec
.
x
;
top
=
bottom
=
vec
.
y
;
...
...
@@ -1034,7 +1102,7 @@ DWORD WineEngGetGlyphOutline(GdiFont font, UINT glyph, UINT format,
TRACE
(
"transformed box: (%d,%d - %d,%d)
\n
"
,
left
,
top
,
right
,
bottom
);
vec
.
x
=
ft_face
->
glyph
->
metrics
.
horiAdvance
;
vec
.
y
=
0
;
FT_Vector_Rotate
(
&
vec
,
angle
);
p
FT_Vector_Rotate
(
&
vec
,
angle
);
lpgm
->
gmCellIncX
=
(
vec
.
x
+
63
)
>>
6
;
lpgm
->
gmCellIncY
=
-
(
vec
.
y
+
63
)
>>
6
;
}
...
...
@@ -1070,18 +1138,18 @@ DWORD WineEngGetGlyphOutline(GdiFont font, UINT glyph, UINT format,
if
(
font
->
orientation
)
{
FT_Matrix
matrix
;
matrix
.
xx
=
matrix
.
yy
=
FT_Cos
(
angle
);
matrix
.
xy
=
-
FT_Sin
(
angle
);
matrix
.
xx
=
matrix
.
yy
=
p
FT_Cos
(
angle
);
matrix
.
xy
=
-
p
FT_Sin
(
angle
);
matrix
.
yx
=
-
matrix
.
xy
;
FT_Outline_Transform
(
&
ft_face
->
glyph
->
outline
,
&
matrix
);
p
FT_Outline_Transform
(
&
ft_face
->
glyph
->
outline
,
&
matrix
);
}
FT_Outline_Translate
(
&
ft_face
->
glyph
->
outline
,
-
left
,
-
bottom
);
p
FT_Outline_Translate
(
&
ft_face
->
glyph
->
outline
,
-
left
,
-
bottom
);
/* Note: FreeType will only set 'black' bits for us. */
memset
(
buf
,
0
,
needed
);
FT_Outline_Get_Bitmap
(
library
,
&
ft_face
->
glyph
->
outline
,
&
ft_bitmap
);
p
FT_Outline_Get_Bitmap
(
library
,
&
ft_face
->
glyph
->
outline
,
&
ft_bitmap
);
break
;
case
GGO_GRAY2_BITMAP
:
...
...
@@ -1106,15 +1174,15 @@ DWORD WineEngGetGlyphOutline(GdiFont font, UINT glyph, UINT format,
if
(
font
->
orientation
)
{
FT_Matrix
matrix
;
matrix
.
xx
=
matrix
.
yy
=
FT_Cos
(
angle
);
matrix
.
xy
=
-
FT_Sin
(
angle
);
matrix
.
xx
=
matrix
.
yy
=
p
FT_Cos
(
angle
);
matrix
.
xy
=
-
p
FT_Sin
(
angle
);
matrix
.
yx
=
-
matrix
.
xy
;
FT_Outline_Transform
(
&
ft_face
->
glyph
->
outline
,
&
matrix
);
p
FT_Outline_Transform
(
&
ft_face
->
glyph
->
outline
,
&
matrix
);
}
FT_Outline_Translate
(
&
ft_face
->
glyph
->
outline
,
-
left
,
-
bottom
);
p
FT_Outline_Translate
(
&
ft_face
->
glyph
->
outline
,
-
left
,
-
bottom
);
FT_Outline_Get_Bitmap
(
library
,
&
ft_face
->
glyph
->
outline
,
&
ft_bitmap
);
p
FT_Outline_Get_Bitmap
(
library
,
&
ft_face
->
glyph
->
outline
,
&
ft_bitmap
);
if
(
format
==
GGO_GRAY2_BITMAP
)
mult
=
5
;
...
...
@@ -1218,13 +1286,13 @@ BOOL WineEngGetTextMetrics(GdiFont font, LPTEXTMETRICW ptm)
x_scale
=
ft_face
->
size
->
metrics
.
x_scale
;
y_scale
=
ft_face
->
size
->
metrics
.
y_scale
;
pOS2
=
FT_Get_Sfnt_Table
(
ft_face
,
ft_sfnt_os2
);
pOS2
=
p
FT_Get_Sfnt_Table
(
ft_face
,
ft_sfnt_os2
);
if
(
!
pOS2
)
{
FIXME
(
"Can't find OS/2 table - not TT font?
\n
"
);
return
0
;
}
pHori
=
FT_Get_Sfnt_Table
(
ft_face
,
ft_sfnt_hhea
);
pHori
=
p
FT_Get_Sfnt_Table
(
ft_face
,
ft_sfnt_hhea
);
if
(
!
pHori
)
{
FIXME
(
"Can't find HHEA table - not TT font?
\n
"
);
return
0
;
...
...
@@ -1242,9 +1310,9 @@ BOOL WineEngGetTextMetrics(GdiFont font, LPTEXTMETRICW ptm)
ptm
->
tmDescent
=
-
font
->
yMin
;
ptm
->
tmInternalLeading
=
(
ptm
->
tmAscent
+
ptm
->
tmDescent
)
-
ft_face
->
size
->
metrics
.
y_ppem
;
}
else
{
ptm
->
tmAscent
=
(
FT_MulFix
(
pOS2
->
usWinAscent
,
y_scale
)
+
32
)
>>
6
;
ptm
->
tmDescent
=
(
FT_MulFix
(
pOS2
->
usWinDescent
,
y_scale
)
+
32
)
>>
6
;
ptm
->
tmInternalLeading
=
(
FT_MulFix
(
pOS2
->
usWinAscent
+
pOS2
->
usWinDescent
ptm
->
tmAscent
=
(
p
FT_MulFix
(
pOS2
->
usWinAscent
,
y_scale
)
+
32
)
>>
6
;
ptm
->
tmDescent
=
(
p
FT_MulFix
(
pOS2
->
usWinDescent
,
y_scale
)
+
32
)
>>
6
;
ptm
->
tmInternalLeading
=
(
p
FT_MulFix
(
pOS2
->
usWinAscent
+
pOS2
->
usWinDescent
-
ft_face
->
units_per_EM
,
y_scale
)
+
32
)
>>
6
;
}
...
...
@@ -1253,12 +1321,12 @@ BOOL WineEngGetTextMetrics(GdiFont font, LPTEXTMETRICW ptm)
/* MSDN says:
el = MAX(0, LineGap - ((WinAscent + WinDescent) - (Ascender - Descender)))
*/
ptm
->
tmExternalLeading
=
max
(
0
,
(
FT_MulFix
(
pHori
->
Line_Gap
-
ptm
->
tmExternalLeading
=
max
(
0
,
(
p
FT_MulFix
(
pHori
->
Line_Gap
-
((
pOS2
->
usWinAscent
+
pOS2
->
usWinDescent
)
-
(
pHori
->
Ascender
-
pHori
->
Descender
)),
y_scale
)
+
32
)
>>
6
);
ptm
->
tmAveCharWidth
=
(
FT_MulFix
(
pOS2
->
xAvgCharWidth
,
x_scale
)
+
32
)
>>
6
;
ptm
->
tmMaxCharWidth
=
(
FT_MulFix
(
ft_face
->
bbox
.
xMax
-
ft_face
->
bbox
.
xMin
,
x_scale
)
+
32
)
>>
6
;
ptm
->
tmAveCharWidth
=
(
p
FT_MulFix
(
pOS2
->
xAvgCharWidth
,
x_scale
)
+
32
)
>>
6
;
ptm
->
tmMaxCharWidth
=
(
p
FT_MulFix
(
ft_face
->
bbox
.
xMax
-
ft_face
->
bbox
.
xMin
,
x_scale
)
+
32
)
>>
6
;
ptm
->
tmWeight
=
font
->
fake_bold
?
FW_BOLD
:
pOS2
->
usWeightClass
;
ptm
->
tmOverhang
=
0
;
ptm
->
tmDigitizedAspectX
=
300
;
...
...
@@ -1343,14 +1411,14 @@ UINT WineEngGetOutlineTextMetrics(GdiFont font, UINT cbSize,
x_scale
=
ft_face
->
size
->
metrics
.
x_scale
;
y_scale
=
ft_face
->
size
->
metrics
.
y_scale
;
pOS2
=
FT_Get_Sfnt_Table
(
ft_face
,
ft_sfnt_os2
);
pOS2
=
p
FT_Get_Sfnt_Table
(
ft_face
,
ft_sfnt_os2
);
if
(
!
pOS2
)
{
FIXME
(
"Can't find OS/2 table - not TT font?
\n
"
);
ret
=
0
;
goto
end
;
}
pHori
=
FT_Get_Sfnt_Table
(
ft_face
,
ft_sfnt_hhea
);
pHori
=
p
FT_Get_Sfnt_Table
(
ft_face
,
ft_sfnt_hhea
);
if
(
!
pHori
)
{
FIXME
(
"Can't find HHEA table - not TT font?
\n
"
);
ret
=
0
;
...
...
@@ -1369,11 +1437,11 @@ UINT WineEngGetOutlineTextMetrics(GdiFont font, UINT cbSize,
potm
->
otmsCharSlopeRun
=
pHori
->
caret_Slope_Run
;
potm
->
otmItalicAngle
=
0
;
/* POST table */
potm
->
otmEMSquare
=
ft_face
->
units_per_EM
;
potm
->
otmAscent
=
(
FT_MulFix
(
pOS2
->
sTypoAscender
,
y_scale
)
+
32
)
>>
6
;
potm
->
otmDescent
=
(
FT_MulFix
(
pOS2
->
sTypoDescender
,
y_scale
)
+
32
)
>>
6
;
potm
->
otmLineGap
=
(
FT_MulFix
(
pOS2
->
sTypoLineGap
,
y_scale
)
+
32
)
>>
6
;
potm
->
otmsCapEmHeight
=
(
FT_MulFix
(
pOS2
->
sCapHeight
,
y_scale
)
+
32
)
>>
6
;
potm
->
otmsXHeight
=
(
FT_MulFix
(
pOS2
->
sxHeight
,
y_scale
)
+
32
)
>>
6
;
potm
->
otmAscent
=
(
p
FT_MulFix
(
pOS2
->
sTypoAscender
,
y_scale
)
+
32
)
>>
6
;
potm
->
otmDescent
=
(
p
FT_MulFix
(
pOS2
->
sTypoDescender
,
y_scale
)
+
32
)
>>
6
;
potm
->
otmLineGap
=
(
p
FT_MulFix
(
pOS2
->
sTypoLineGap
,
y_scale
)
+
32
)
>>
6
;
potm
->
otmsCapEmHeight
=
(
p
FT_MulFix
(
pOS2
->
sCapHeight
,
y_scale
)
+
32
)
>>
6
;
potm
->
otmsXHeight
=
(
p
FT_MulFix
(
pOS2
->
sxHeight
,
y_scale
)
+
32
)
>>
6
;
potm
->
otmrcFontBox
.
left
=
ft_face
->
bbox
.
xMin
;
potm
->
otmrcFontBox
.
right
=
ft_face
->
bbox
.
xMax
;
potm
->
otmrcFontBox
.
top
=
ft_face
->
bbox
.
yMin
;
...
...
@@ -1382,16 +1450,16 @@ UINT WineEngGetOutlineTextMetrics(GdiFont font, UINT cbSize,
potm
->
otmMacDescent
=
0
;
potm
->
otmMacLineGap
=
0
;
potm
->
otmusMinimumPPEM
=
0
;
/* TT Header */
potm
->
otmptSubscriptSize
.
x
=
(
FT_MulFix
(
pOS2
->
ySubscriptXSize
,
x_scale
)
+
32
)
>>
6
;
potm
->
otmptSubscriptSize
.
y
=
(
FT_MulFix
(
pOS2
->
ySubscriptYSize
,
y_scale
)
+
32
)
>>
6
;
potm
->
otmptSubscriptOffset
.
x
=
(
FT_MulFix
(
pOS2
->
ySubscriptXOffset
,
x_scale
)
+
32
)
>>
6
;
potm
->
otmptSubscriptOffset
.
y
=
(
FT_MulFix
(
pOS2
->
ySubscriptYOffset
,
y_scale
)
+
32
)
>>
6
;
potm
->
otmptSuperscriptSize
.
x
=
(
FT_MulFix
(
pOS2
->
ySuperscriptXSize
,
x_scale
)
+
32
)
>>
6
;
potm
->
otmptSuperscriptSize
.
y
=
(
FT_MulFix
(
pOS2
->
ySuperscriptYSize
,
y_scale
)
+
32
)
>>
6
;
potm
->
otmptSuperscriptOffset
.
x
=
(
FT_MulFix
(
pOS2
->
ySuperscriptXOffset
,
x_scale
)
+
32
)
>>
6
;
potm
->
otmptSuperscriptOffset
.
y
=
(
FT_MulFix
(
pOS2
->
ySuperscriptYOffset
,
y_scale
)
+
32
)
>>
6
;
potm
->
otmsStrikeoutSize
=
(
FT_MulFix
(
pOS2
->
yStrikeoutSize
,
y_scale
)
+
32
)
>>
6
;
potm
->
otmsStrikeoutPosition
=
(
FT_MulFix
(
pOS2
->
yStrikeoutPosition
,
y_scale
)
+
32
)
>>
6
;
potm
->
otmptSubscriptSize
.
x
=
(
p
FT_MulFix
(
pOS2
->
ySubscriptXSize
,
x_scale
)
+
32
)
>>
6
;
potm
->
otmptSubscriptSize
.
y
=
(
p
FT_MulFix
(
pOS2
->
ySubscriptYSize
,
y_scale
)
+
32
)
>>
6
;
potm
->
otmptSubscriptOffset
.
x
=
(
p
FT_MulFix
(
pOS2
->
ySubscriptXOffset
,
x_scale
)
+
32
)
>>
6
;
potm
->
otmptSubscriptOffset
.
y
=
(
p
FT_MulFix
(
pOS2
->
ySubscriptYOffset
,
y_scale
)
+
32
)
>>
6
;
potm
->
otmptSuperscriptSize
.
x
=
(
p
FT_MulFix
(
pOS2
->
ySuperscriptXSize
,
x_scale
)
+
32
)
>>
6
;
potm
->
otmptSuperscriptSize
.
y
=
(
p
FT_MulFix
(
pOS2
->
ySuperscriptYSize
,
y_scale
)
+
32
)
>>
6
;
potm
->
otmptSuperscriptOffset
.
x
=
(
p
FT_MulFix
(
pOS2
->
ySuperscriptXOffset
,
x_scale
)
+
32
)
>>
6
;
potm
->
otmptSuperscriptOffset
.
y
=
(
p
FT_MulFix
(
pOS2
->
ySuperscriptYOffset
,
y_scale
)
+
32
)
>>
6
;
potm
->
otmsStrikeoutSize
=
(
p
FT_MulFix
(
pOS2
->
yStrikeoutSize
,
y_scale
)
+
32
)
>>
6
;
potm
->
otmsStrikeoutPosition
=
(
p
FT_MulFix
(
pOS2
->
yStrikeoutPosition
,
y_scale
)
+
32
)
>>
6
;
potm
->
otmsUnderscoreSize
=
0
;
/* POST Header */
potm
->
otmsUnderscorePosition
=
0
;
/* POST Header */
...
...
This diff is collapsed.
Click to expand it.
dlls/wineps/Makefile.in
+
1
−
1
View file @
d14b2f0f
...
...
@@ -5,7 +5,7 @@ VPATH = @srcdir@
MODULE
=
wineps.dll
ALTNAMES
=
wineps16.dll
IMPORTS
=
user32.dll gdi32.dll winspool.drv kernel32.dll ntdll.dll
EXTRALIBS
=
@CUPSLIBS@
@FREETYPELIBS@
EXTRALIBS
=
@CUPSLIBS@
EXTRAINCL
=
@FREETYPEINCL@
FONTMETRICS
=
\
...
...
This diff is collapsed.
Click to expand it.
dlls/wineps/truetype.c
+
72
−
17
View file @
d14b2f0f
...
...
@@ -26,6 +26,7 @@
*
*/
#include
"config.h"
#include
"wine/port.h"
#ifdef HAVE_FREETYPE
...
...
@@ -76,6 +77,22 @@ WINE_DEFAULT_DEBUG_CHANNEL(psdrv);
#define GLYPH_LOAD_FLAGS ( FT_LOAD_NO_SCALE | \
FT_LOAD_IGNORE_TRANSFORM | \
FT_LOAD_LINEAR_DESIGN )
static
void
*
ft_handle
=
NULL
;
#define MAKE_FUNCPTR(f) static typeof(f) * p##f = NULL;
MAKE_FUNCPTR
(
FT_Done_Face
)
MAKE_FUNCPTR
(
FT_Done_FreeType
)
MAKE_FUNCPTR
(
FT_Get_Char_Index
)
MAKE_FUNCPTR
(
FT_Get_Glyph_Name
)
MAKE_FUNCPTR
(
FT_Get_Sfnt_Name
)
MAKE_FUNCPTR
(
FT_Get_Sfnt_Name_Count
)
MAKE_FUNCPTR
(
FT_Get_Sfnt_Table
)
MAKE_FUNCPTR
(
FT_Init_FreeType
)
MAKE_FUNCPTR
(
FT_Load_Glyph
)
MAKE_FUNCPTR
(
FT_New_Face
)
MAKE_FUNCPTR
(
FT_Set_Charmap
)
#undef MAKE_FUNCPTR
/*******************************************************************************
* FindCharMap
...
...
@@ -129,7 +146,7 @@ static BOOL FindCharMap(FT_Face face, FT_CharMap *p_charmap, LPSTR *p_sz)
return
TRUE
;
}
error
=
FT_Set_Charmap
(
face
,
charmap
);
error
=
p
FT_Set_Charmap
(
face
,
charmap
);
if
(
error
!=
FT_Err_Ok
)
{
ERR
(
"%s returned %i
\n
"
,
"FT_Set_Charmap"
,
error
);
...
...
@@ -217,11 +234,11 @@ static BOOL FindMSTTString(FT_Face face, FT_CharMap charmap, FT_UShort name_id,
FT_SfntName
name
;
FT_Error
error
;
num_strings
=
FT_Get_Sfnt_Name_Count
(
face
);
num_strings
=
p
FT_Get_Sfnt_Name_Count
(
face
);
for
(
string_index
=
0
;
string_index
<
num_strings
;
++
string_index
)
{
error
=
FT_Get_Sfnt_Name
(
face
,
string_index
,
&
name
);
error
=
p
FT_Get_Sfnt_Name
(
face
,
string_index
,
&
name
);
if
(
error
!=
FT_Err_Ok
)
{
ERR
(
"%s returned %i
\n
"
,
"FT_Get_Sfnt_Name"
,
error
);
...
...
@@ -278,10 +295,10 @@ static BOOL StartAFM(FT_Face face, AFM **p_afm)
USHORT
em_size
;
AFM
*
afm
;
head
=
FT_Get_Sfnt_Table
(
face
,
ft_sfnt_head
);
post
=
FT_Get_Sfnt_Table
(
face
,
ft_sfnt_post
);
os2
=
FT_Get_Sfnt_Table
(
face
,
ft_sfnt_os2
);
hhea
=
FT_Get_Sfnt_Table
(
face
,
ft_sfnt_hhea
);
head
=
p
FT_Get_Sfnt_Table
(
face
,
ft_sfnt_head
);
post
=
p
FT_Get_Sfnt_Table
(
face
,
ft_sfnt_post
);
os2
=
p
FT_Get_Sfnt_Table
(
face
,
ft_sfnt_os2
);
hhea
=
p
FT_Get_Sfnt_Table
(
face
,
ft_sfnt_hhea
);
if
(
head
==
NULL
||
post
==
NULL
||
os2
==
NULL
||
hhea
==
NULL
||
os2
->
version
==
0xffff
)
/* old Macintosh font */
...
...
@@ -337,7 +354,7 @@ static BOOL ReadCharMetrics(FT_Face face, AFM *afm, AFMMETRICS **p_metrics)
USHORT
em_size
=
afm
->
WinMetrics
.
usUnitsPerEm
;
for
(
charcode
=
0
,
index
=
0
;
charcode
<
65536
;
++
charcode
)
if
(
FT_Get_Char_Index
(
face
,
charcode
)
!=
0
)
if
(
p
FT_Get_Char_Index
(
face
,
charcode
)
!=
0
)
++
index
;
/* count # of glyphs */
afm
->
NumofMetrics
=
index
;
...
...
@@ -348,21 +365,21 @@ static BOOL ReadCharMetrics(FT_Face face, AFM *afm, AFMMETRICS **p_metrics)
for
(
charcode
=
0
,
index
=
0
;
charcode
<
65536
;
++
charcode
)
{
FT_UInt
glyph_index
=
FT_Get_Char_Index
(
face
,
charcode
);
FT_UInt
glyph_index
=
p
FT_Get_Char_Index
(
face
,
charcode
);
FT_Error
error
;
CHAR
buffer
[
128
];
/* for glyph names */
if
(
glyph_index
==
0
)
continue
;
error
=
FT_Load_Glyph
(
face
,
glyph_index
,
GLYPH_LOAD_FLAGS
);
error
=
p
FT_Load_Glyph
(
face
,
glyph_index
,
GLYPH_LOAD_FLAGS
);
if
(
error
!=
FT_Err_Ok
)
{
ERR
(
"%s returned %i
\n
"
,
"FT_Load_Glyph"
,
error
);
goto
cleanup
;
}
error
=
FT_Get_Glyph_Name
(
face
,
glyph_index
,
buffer
,
sizeof
(
buffer
));
error
=
p
FT_Get_Glyph_Name
(
face
,
glyph_index
,
buffer
,
sizeof
(
buffer
));
if
(
error
!=
FT_Err_Ok
)
{
ERR
(
"%s returned %i
\n
"
,
"FT_Get_Glyph_Name"
,
error
);
...
...
@@ -471,7 +488,7 @@ static BOOL ReadTrueTypeFile(FT_Library library, LPCSTR filename)
TRACE
(
"%s
\n
"
,
filename
);
error
=
FT_New_Face
(
library
,
filename
,
0
,
&
face
);
error
=
p
FT_New_Face
(
library
,
filename
,
0
,
&
face
);
if
(
error
!=
FT_Err_Ok
)
{
WARN
(
"FreeType error %i opening %s
\n
"
,
error
,
filename
);
...
...
@@ -482,7 +499,7 @@ static BOOL ReadTrueTypeFile(FT_Library library, LPCSTR filename)
{
if
(
BuildTrueTypeAFM
(
face
)
==
FALSE
)
{
FT_Done_Face
(
face
);
p
FT_Done_Face
(
face
);
return
FALSE
;
}
}
...
...
@@ -491,7 +508,7 @@ static BOOL ReadTrueTypeFile(FT_Library library, LPCSTR filename)
WARN
(
"Required information missing from %s
\n
"
,
filename
);
}
error
=
FT_Done_Face
(
face
);
error
=
p
FT_Done_Face
(
face
);
if
(
error
!=
FT_Err_Ok
)
{
ERR
(
"%s returned %i
\n
"
,
"FT_Done_Face"
,
error
);
...
...
@@ -572,10 +589,36 @@ BOOL PSDRV_GetTrueTypeMetrics(void)
0
,
KEY_READ
,
&
hkey
)
!=
ERROR_SUCCESS
)
return
TRUE
;
error
=
FT_Init_FreeType
(
&
library
);
ft_handle
=
wine_dlopen
(
"libfreetype.so"
,
RTLD_NOW
,
NULL
,
0
);
if
(
!
ft_handle
)
{
WINE_MESSAGE
(
"Wine cannot find the FreeType font library. To enable Wine to
\n
"
"use TrueType fonts please install a version of FreeType greater than
\n
"
"or equal to 2.0.5.
\n
"
"http://www.freetype.org
\n
"
);
return
TRUE
;
}
#define LOAD_FUNCPTR(f) if((p##f = wine_dlsym(ft_handle, #f, NULL, 0)) == NULL) goto sym_not_found;
LOAD_FUNCPTR
(
FT_Done_Face
)
LOAD_FUNCPTR
(
FT_Done_FreeType
)
LOAD_FUNCPTR
(
FT_Get_Char_Index
)
LOAD_FUNCPTR
(
FT_Get_Glyph_Name
)
LOAD_FUNCPTR
(
FT_Get_Sfnt_Name
)
LOAD_FUNCPTR
(
FT_Get_Sfnt_Name_Count
)
LOAD_FUNCPTR
(
FT_Get_Sfnt_Table
)
LOAD_FUNCPTR
(
FT_Init_FreeType
)
LOAD_FUNCPTR
(
FT_Load_Glyph
)
LOAD_FUNCPTR
(
FT_New_Face
)
LOAD_FUNCPTR
(
FT_Set_Charmap
)
#undef LOAD_FUNCPTR
error
=
pFT_Init_FreeType
(
&
library
);
if
(
error
!=
FT_Err_Ok
)
{
ERR
(
"%s returned %i
\n
"
,
"FT_Init_FreeType"
,
error
);
wine_dlclose
(
ft_handle
,
NULL
,
0
);
RegCloseKey
(
hkey
);
return
FALSE
;
}
...
...
@@ -591,7 +634,7 @@ BOOL PSDRV_GetTrueTypeMetrics(void)
if
(
ReadTrueTypeDir
(
library
,
value_buf
)
==
FALSE
)
{
RegCloseKey
(
hkey
);
FT_Done_FreeType
(
library
);
p
FT_Done_FreeType
(
library
);
return
FALSE
;
}
...
...
@@ -602,7 +645,19 @@ BOOL PSDRV_GetTrueTypeMetrics(void)
}
RegCloseKey
(
hkey
);
FT_Done_FreeType
(
library
);
pFT_Done_FreeType
(
library
);
wine_dlclose
(
ft_handle
,
NULL
,
0
);
ft_handle
=
NULL
;
return
TRUE
;
sym_not_found:
WINE_MESSAGE
(
"Wine cannot find certain functions that it needs inside the FreeType
\n
"
"font library. To enable Wine to use TrueType fonts please upgrade
\n
"
"FreeType to at least version 2.0.5.
\n
"
"http://www.freetype.org
\n
"
);
wine_dlclose
(
ft_handle
,
NULL
,
0
);
ft_handle
=
NULL
;
return
TRUE
;
}
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment