Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
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-cw
Commits
a767467d
Commit
a767467d
authored
Jun 09, 2020
by
Nikolay Sivov
Committed by
Alexandre Julliard
Jun 09, 2020
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
dwrite: Get rid of cmap cache.
Signed-off-by:
Nikolay Sivov
<
nsivov@codeweavers.com
>
Signed-off-by:
Alexandre Julliard
<
julliard@winehq.org
>
parent
1cfa1c69
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
22 additions
and
87 deletions
+22
-87
dwrite_private.h
dlls/dwrite/dwrite_private.h
+2
-6
font.c
dlls/dwrite/font.c
+17
-20
freetype.c
dlls/dwrite/freetype.c
+0
-60
opentype.c
dlls/dwrite/opentype.c
+3
-1
No files found.
dlls/dwrite/dwrite_private.h
View file @
a767467d
...
...
@@ -259,9 +259,10 @@ struct dwrite_fontface
unsigned
int
ascent
;
unsigned
int
descent
;
}
typo_metrics
;
INT
charmap
;
UINT32
flags
;
struct
dwrite_cmap
cmap
;
struct
dwrite_fonttable
vdmx
;
struct
dwrite_fonttable
gasp
;
struct
dwrite_fonttable
cpal
;
...
...
@@ -340,8 +341,6 @@ extern void factory_unlock(IDWriteFactory7 *factory) DECLSPEC_HIDDEN;
extern
HRESULT
create_inmemory_fileloader
(
IDWriteFontFileLoader
**
)
DECLSPEC_HIDDEN
;
extern
HRESULT
create_font_resource
(
IDWriteFactory7
*
factory
,
IDWriteFontFile
*
file
,
UINT32
face_index
,
IDWriteFontResource
**
resource
)
DECLSPEC_HIDDEN
;
extern
HRESULT
fontface_get_glyphs
(
struct
dwrite_fontface
*
fontface
,
UINT32
const
*
codepoints
,
UINT32
count
,
UINT16
*
glyphs
);
struct
dwrite_fontface
;
...
...
@@ -462,13 +461,10 @@ extern HRESULT freetype_get_glyphrun_outline(IDWriteFontFace5 *fontface, float e
float
const
*
advances
,
DWRITE_GLYPH_OFFSET
const
*
offsets
,
unsigned
int
count
,
BOOL
is_rtl
,
IDWriteGeometrySink
*
sink
)
DECLSPEC_HIDDEN
;
extern
UINT16
freetype_get_glyphcount
(
IDWriteFontFace5
*
fontface
)
DECLSPEC_HIDDEN
;
extern
void
freetype_get_glyphs
(
IDWriteFontFace5
*
fontface
,
INT
charmap
,
UINT32
const
*
codepoints
,
UINT32
count
,
UINT16
*
glyphs
)
DECLSPEC_HIDDEN
;
extern
BOOL
freetype_has_kerning_pairs
(
IDWriteFontFace5
*
fontface
)
DECLSPEC_HIDDEN
;
extern
INT32
freetype_get_kerning_pair_adjustment
(
IDWriteFontFace5
*
fontface
,
UINT16
left
,
UINT16
right
)
DECLSPEC_HIDDEN
;
extern
void
freetype_get_glyph_bbox
(
struct
dwrite_glyphbitmap
*
bitmap_desc
)
DECLSPEC_HIDDEN
;
extern
BOOL
freetype_get_glyph_bitmap
(
struct
dwrite_glyphbitmap
*
)
DECLSPEC_HIDDEN
;
extern
INT
freetype_get_charmap_index
(
IDWriteFontFace5
*
fontface
)
DECLSPEC_HIDDEN
;
extern
INT32
freetype_get_glyph_advance
(
IDWriteFontFace5
*
fontface
,
FLOAT
emsize
,
UINT16
index
,
DWRITE_MEASURING_MODE
measuring_mode
,
BOOL
*
has_contours
)
DECLSPEC_HIDDEN
;
extern
void
freetype_get_design_glyph_bbox
(
IDWriteFontFace4
*
,
UINT16
,
UINT16
,
RECT
*
)
DECLSPEC_HIDDEN
;
...
...
dlls/dwrite/font.c
View file @
a767467d
...
...
@@ -273,20 +273,22 @@ static UINT16 dwrite_get_font_upem(void *context)
return
fontface
->
metrics
.
designUnitsPerEm
;
}
static
UINT16
dwritefontface_get_glyph
(
struct
dwrite_fontface
*
fontface
,
unsigned
int
ch
)
{
dwrite_cmap_init
(
&
fontface
->
cmap
,
NULL
,
fontface
->
index
,
fontface
->
type
);
return
opentype_cmap_get_glyph
(
&
fontface
->
cmap
,
ch
);
}
static
BOOL
dwrite_has_glyph
(
void
*
context
,
unsigned
int
codepoint
)
{
struct
dwrite_fontface
*
fontface
=
context
;
UINT16
index
=
0
;
fontface_get_glyphs
(
fontface
,
&
codepoint
,
1
,
&
index
);
return
!!
index
;
return
!!
dwritefontface_get_glyph
(
fontface
,
codepoint
);
}
static
UINT16
dwrite_get_glyph
(
void
*
context
,
unsigned
int
codepoint
)
{
struct
dwrite_fontface
*
fontface
=
context
;
UINT16
index
=
0
;
fontface_get_glyphs
(
fontface
,
&
codepoint
,
1
,
&
index
);
return
index
;
return
dwritefontface_get_glyph
(
fontface
,
codepoint
);
}
static
const
struct
shaping_font_ops
dwrite_font_ops
=
...
...
@@ -616,6 +618,7 @@ static ULONG WINAPI dwritefontface_Release(IDWriteFontFace5 *iface)
freetype_notify_cacheremove
(
iface
);
dwrite_cmap_release
(
&
fontface
->
cmap
);
IDWriteFactory7_Release
(
fontface
->
factory
);
heap_free
(
fontface
);
}
...
...
@@ -732,17 +735,11 @@ static HRESULT WINAPI dwritefontface_GetDesignGlyphMetrics(IDWriteFontFace5 *ifa
return
S_OK
;
}
HRESULT
fontface_get_glyphs
(
struct
dwrite_fontface
*
fontface
,
UINT32
const
*
codepoints
,
UINT32
count
,
UINT16
*
glyphs
)
{
freetype_get_glyphs
(
&
fontface
->
IDWriteFontFace5_iface
,
fontface
->
charmap
,
codepoints
,
count
,
glyphs
);
return
S_OK
;
}
static
HRESULT
WINAPI
dwritefontface_GetGlyphIndices
(
IDWriteFontFace5
*
iface
,
UINT32
const
*
codepoints
,
UINT32
count
,
UINT16
*
glyphs
)
{
struct
dwrite_fontface
*
fontface
=
impl_from_IDWriteFontFace5
(
iface
);
unsigned
int
i
;
TRACE
(
"%p, %p, %u, %p.
\n
"
,
iface
,
codepoints
,
count
,
glyphs
);
...
...
@@ -755,7 +752,10 @@ static HRESULT WINAPI dwritefontface_GetGlyphIndices(IDWriteFontFace5 *iface, UI
return
E_INVALIDARG
;
}
return
fontface_get_glyphs
(
fontface
,
codepoints
,
count
,
glyphs
);
for
(
i
=
0
;
i
<
count
;
++
i
)
glyphs
[
i
]
=
dwritefontface_get_glyph
(
fontface
,
codepoints
[
i
]);
return
S_OK
;
}
static
HRESULT
WINAPI
dwritefontface_TryGetFontTable
(
IDWriteFontFace5
*
iface
,
UINT32
table_tag
,
...
...
@@ -1404,14 +1404,10 @@ static HRESULT WINAPI dwritefontface3_GetInformationalStrings(IDWriteFontFace5 *
static
BOOL
WINAPI
dwritefontface3_HasCharacter
(
IDWriteFontFace5
*
iface
,
UINT32
ch
)
{
struct
dwrite_fontface
*
fontface
=
impl_from_IDWriteFontFace5
(
iface
);
UINT16
index
;
TRACE
(
"%p, %#x.
\n
"
,
iface
,
ch
);
index
=
0
;
fontface_get_glyphs
(
fontface
,
&
ch
,
1
,
&
index
);
return
index
!=
0
;
return
!!
dwritefontface_get_glyph
(
fontface
,
ch
);
}
static
HRESULT
WINAPI
dwritefontface3_GetRecommendedRenderingMode
(
IDWriteFontFace5
*
iface
,
FLOAT
emSize
,
FLOAT
dpiX
,
FLOAT
dpiY
,
...
...
@@ -4933,7 +4929,6 @@ HRESULT create_fontface(const struct fontface_desc *desc, struct list *cached_li
}
}
fontface
->
charmap
=
freetype_get_charmap_index
(
&
fontface
->
IDWriteFontFace5_iface
);
if
(
freetype_has_kerning_pairs
(
&
fontface
->
IDWriteFontFace5_iface
))
fontface
->
flags
|=
FONTFACE_HAS_KERNING_PAIRS
;
if
(
opentype_has_vertical_variants
(
&
fontface
->
IDWriteFontFace5_iface
))
...
...
@@ -4979,6 +4974,8 @@ HRESULT create_fontface(const struct fontface_desc *desc, struct list *cached_li
if
(
fontface
->
info_strings
[
i
])
IDWriteLocalizedStrings_AddRef
(
fontface
->
info_strings
[
i
]);
}
fontface
->
cmap
.
stream
=
fontface
->
stream
;
IDWriteFontFileStream_AddRef
(
fontface
->
cmap
.
stream
);
release_font_data
(
font_data
);
fontface
->
cached
=
factory_cache_fontface
(
fontface
->
factory
,
cached_list
,
&
fontface
->
IDWriteFontFace5_iface
);
...
...
dlls/dwrite/freetype.c
View file @
a767467d
...
...
@@ -52,7 +52,6 @@ static CRITICAL_SECTION freetype_cs = { &critsect_debug, -1, 0, 0, 0, 0 };
static
void
*
ft_handle
=
NULL
;
static
FT_Library
library
=
0
;
static
FTC_Manager
cache_manager
=
0
;
static
FTC_CMapCache
cmap_cache
=
0
;
static
FTC_ImageCache
image_cache
=
0
;
typedef
struct
{
...
...
@@ -83,8 +82,6 @@ MAKE_FUNCPTR(FT_Outline_Get_Bitmap);
MAKE_FUNCPTR
(
FT_Outline_New
);
MAKE_FUNCPTR
(
FT_Outline_Transform
);
MAKE_FUNCPTR
(
FT_Outline_Translate
);
MAKE_FUNCPTR
(
FTC_CMapCache_Lookup
);
MAKE_FUNCPTR
(
FTC_CMapCache_New
);
MAKE_FUNCPTR
(
FTC_ImageCache_Lookup
);
MAKE_FUNCPTR
(
FTC_ImageCache_New
);
MAKE_FUNCPTR
(
FTC_Manager_New
);
...
...
@@ -206,8 +203,6 @@ BOOL init_freetype(void)
LOAD_FUNCPTR
(
FT_Outline_New
)
LOAD_FUNCPTR
(
FT_Outline_Transform
)
LOAD_FUNCPTR
(
FT_Outline_Translate
)
LOAD_FUNCPTR
(
FTC_CMapCache_Lookup
)
LOAD_FUNCPTR
(
FTC_CMapCache_New
)
LOAD_FUNCPTR
(
FTC_ImageCache_Lookup
)
LOAD_FUNCPTR
(
FTC_ImageCache_New
)
LOAD_FUNCPTR
(
FTC_Manager_New
)
...
...
@@ -228,7 +223,6 @@ BOOL init_freetype(void)
/* init cache manager */
if
(
pFTC_Manager_New
(
library
,
0
,
0
,
0
,
&
face_requester
,
NULL
,
&
cache_manager
)
!=
0
||
pFTC_CMapCache_New
(
cache_manager
,
&
cmap_cache
)
!=
0
||
pFTC_ImageCache_New
(
cache_manager
,
&
image_cache
)
!=
0
)
{
ERR
(
"Failed to init FreeType cache
\n
"
);
...
...
@@ -562,27 +556,6 @@ UINT16 freetype_get_glyphcount(IDWriteFontFace5 *fontface)
return
count
;
}
void
freetype_get_glyphs
(
IDWriteFontFace5
*
fontface
,
INT
charmap
,
UINT32
const
*
codepoints
,
UINT32
count
,
UINT16
*
glyphs
)
{
UINT32
i
;
EnterCriticalSection
(
&
freetype_cs
);
for
(
i
=
0
;
i
<
count
;
i
++
)
{
if
(
charmap
==
-
1
)
glyphs
[
i
]
=
pFTC_CMapCache_Lookup
(
cmap_cache
,
fontface
,
charmap
,
codepoints
[
i
]);
else
{
UINT32
codepoint
=
codepoints
[
i
];
/* special handling for symbol fonts */
if
(
codepoint
<
0x100
)
codepoint
+=
0xf000
;
glyphs
[
i
]
=
pFTC_CMapCache_Lookup
(
cmap_cache
,
fontface
,
charmap
,
codepoint
);
if
(
!
glyphs
[
i
])
glyphs
[
i
]
=
pFTC_CMapCache_Lookup
(
cmap_cache
,
fontface
,
charmap
,
codepoint
-
0xf000
);
}
}
LeaveCriticalSection
(
&
freetype_cs
);
}
BOOL
freetype_has_kerning_pairs
(
IDWriteFontFace5
*
fontface
)
{
BOOL
has_kerning_pairs
=
FALSE
;
...
...
@@ -841,28 +814,6 @@ BOOL freetype_get_glyph_bitmap(struct dwrite_glyphbitmap *bitmap)
return
ret
;
}
INT
freetype_get_charmap_index
(
IDWriteFontFace5
*
fontface
)
{
INT
charmap_index
=
-
1
;
FT_Face
face
;
EnterCriticalSection
(
&
freetype_cs
);
if
(
pFTC_Manager_LookupFace
(
cache_manager
,
fontface
,
&
face
)
==
0
)
{
FT_Int
i
;
for
(
i
=
0
;
i
<
face
->
num_charmaps
;
i
++
)
if
(
face
->
charmaps
[
i
]
->
encoding
==
FT_ENCODING_MS_SYMBOL
)
{
charmap_index
=
i
;
break
;
}
}
LeaveCriticalSection
(
&
freetype_cs
);
return
charmap_index
;
}
INT32
freetype_get_glyph_advance
(
IDWriteFontFace5
*
fontface
,
FLOAT
emSize
,
UINT16
index
,
DWRITE_MEASURING_MODE
mode
,
BOOL
*
has_contours
)
{
...
...
@@ -923,12 +874,6 @@ UINT16 freetype_get_glyphcount(IDWriteFontFace5 *fontface)
return
0
;
}
void
freetype_get_glyphs
(
IDWriteFontFace5
*
fontface
,
INT
charmap
,
UINT32
const
*
codepoints
,
UINT32
count
,
UINT16
*
glyphs
)
{
memset
(
glyphs
,
0
,
count
*
sizeof
(
*
glyphs
));
}
BOOL
freetype_has_kerning_pairs
(
IDWriteFontFace5
*
fontface
)
{
return
FALSE
;
...
...
@@ -949,11 +894,6 @@ BOOL freetype_get_glyph_bitmap(struct dwrite_glyphbitmap *bitmap)
return
FALSE
;
}
INT
freetype_get_charmap_index
(
IDWriteFontFace5
*
fontface
)
{
return
-
1
;
}
INT32
freetype_get_glyph_advance
(
IDWriteFontFace5
*
fontface
,
FLOAT
emSize
,
UINT16
index
,
DWRITE_MEASURING_MODE
mode
,
BOOL
*
has_contours
)
{
...
...
dlls/dwrite/opentype.c
View file @
a767467d
...
...
@@ -1728,12 +1728,14 @@ void dwrite_cmap_init(struct dwrite_cmap *cmap, IDWriteFontFile *file, unsigned
if
(
cmap
->
data
)
return
;
if
(
FAILED
(
hr
=
get_filestream_from_file
(
file
,
&
stream_desc
.
stream
)))
/* For fontface stream is already available and preset. */
if
(
!
cmap
->
stream
&&
FAILED
(
hr
=
get_filestream_from_file
(
file
,
&
cmap
->
stream
)))
{
WARN
(
"Failed to get file stream, hr %#x.
\n
"
,
hr
);
goto
failed
;
}
stream_desc
.
stream
=
cmap
->
stream
;
stream_desc
.
face_type
=
face_type
;
stream_desc
.
face_index
=
face_index
;
...
...
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