dwrite: Get rid of cmap cache.
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
1cfa1c6930
commit
a767467d2e
|
@ -259,9 +259,10 @@ struct dwrite_fontface
|
||||||
unsigned int ascent;
|
unsigned int ascent;
|
||||||
unsigned int descent;
|
unsigned int descent;
|
||||||
} typo_metrics;
|
} typo_metrics;
|
||||||
INT charmap;
|
|
||||||
UINT32 flags;
|
UINT32 flags;
|
||||||
|
|
||||||
|
struct dwrite_cmap cmap;
|
||||||
|
|
||||||
struct dwrite_fonttable vdmx;
|
struct dwrite_fonttable vdmx;
|
||||||
struct dwrite_fonttable gasp;
|
struct dwrite_fonttable gasp;
|
||||||
struct dwrite_fonttable cpal;
|
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_inmemory_fileloader(IDWriteFontFileLoader**) DECLSPEC_HIDDEN;
|
||||||
extern HRESULT create_font_resource(IDWriteFactory7 *factory, IDWriteFontFile *file, UINT32 face_index,
|
extern HRESULT create_font_resource(IDWriteFactory7 *factory, IDWriteFontFile *file, UINT32 face_index,
|
||||||
IDWriteFontResource **resource) DECLSPEC_HIDDEN;
|
IDWriteFontResource **resource) DECLSPEC_HIDDEN;
|
||||||
extern HRESULT fontface_get_glyphs(struct dwrite_fontface *fontface, UINT32 const *codepoints,
|
|
||||||
UINT32 count, UINT16 *glyphs);
|
|
||||||
|
|
||||||
struct dwrite_fontface;
|
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,
|
float const *advances, DWRITE_GLYPH_OFFSET const *offsets, unsigned int count, BOOL is_rtl,
|
||||||
IDWriteGeometrySink *sink) DECLSPEC_HIDDEN;
|
IDWriteGeometrySink *sink) DECLSPEC_HIDDEN;
|
||||||
extern UINT16 freetype_get_glyphcount(IDWriteFontFace5 *fontface) 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 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 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 void freetype_get_glyph_bbox(struct dwrite_glyphbitmap *bitmap_desc) DECLSPEC_HIDDEN;
|
||||||
extern BOOL freetype_get_glyph_bitmap(struct dwrite_glyphbitmap*) 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,
|
extern INT32 freetype_get_glyph_advance(IDWriteFontFace5 *fontface, FLOAT emsize, UINT16 index,
|
||||||
DWRITE_MEASURING_MODE measuring_mode, BOOL *has_contours) DECLSPEC_HIDDEN;
|
DWRITE_MEASURING_MODE measuring_mode, BOOL *has_contours) DECLSPEC_HIDDEN;
|
||||||
extern void freetype_get_design_glyph_bbox(IDWriteFontFace4*,UINT16,UINT16,RECT*) DECLSPEC_HIDDEN;
|
extern void freetype_get_design_glyph_bbox(IDWriteFontFace4*,UINT16,UINT16,RECT*) DECLSPEC_HIDDEN;
|
||||||
|
|
|
@ -273,20 +273,22 @@ static UINT16 dwrite_get_font_upem(void *context)
|
||||||
return fontface->metrics.designUnitsPerEm;
|
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)
|
static BOOL dwrite_has_glyph(void *context, unsigned int codepoint)
|
||||||
{
|
{
|
||||||
struct dwrite_fontface *fontface = context;
|
struct dwrite_fontface *fontface = context;
|
||||||
UINT16 index = 0;
|
return !!dwritefontface_get_glyph(fontface, codepoint);
|
||||||
fontface_get_glyphs(fontface, &codepoint, 1, &index);
|
|
||||||
return !!index;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static UINT16 dwrite_get_glyph(void *context, unsigned int codepoint)
|
static UINT16 dwrite_get_glyph(void *context, unsigned int codepoint)
|
||||||
{
|
{
|
||||||
struct dwrite_fontface *fontface = context;
|
struct dwrite_fontface *fontface = context;
|
||||||
UINT16 index = 0;
|
return dwritefontface_get_glyph(fontface, codepoint);
|
||||||
fontface_get_glyphs(fontface, &codepoint, 1, &index);
|
|
||||||
return index;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct shaping_font_ops dwrite_font_ops =
|
static const struct shaping_font_ops dwrite_font_ops =
|
||||||
|
@ -616,6 +618,7 @@ static ULONG WINAPI dwritefontface_Release(IDWriteFontFace5 *iface)
|
||||||
|
|
||||||
freetype_notify_cacheremove(iface);
|
freetype_notify_cacheremove(iface);
|
||||||
|
|
||||||
|
dwrite_cmap_release(&fontface->cmap);
|
||||||
IDWriteFactory7_Release(fontface->factory);
|
IDWriteFactory7_Release(fontface->factory);
|
||||||
heap_free(fontface);
|
heap_free(fontface);
|
||||||
}
|
}
|
||||||
|
@ -732,17 +735,11 @@ static HRESULT WINAPI dwritefontface_GetDesignGlyphMetrics(IDWriteFontFace5 *ifa
|
||||||
return S_OK;
|
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,
|
static HRESULT WINAPI dwritefontface_GetGlyphIndices(IDWriteFontFace5 *iface, UINT32 const *codepoints,
|
||||||
UINT32 count, UINT16 *glyphs)
|
UINT32 count, UINT16 *glyphs)
|
||||||
{
|
{
|
||||||
struct dwrite_fontface *fontface = impl_from_IDWriteFontFace5(iface);
|
struct dwrite_fontface *fontface = impl_from_IDWriteFontFace5(iface);
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
TRACE("%p, %p, %u, %p.\n", iface, codepoints, count, glyphs);
|
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 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,
|
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)
|
static BOOL WINAPI dwritefontface3_HasCharacter(IDWriteFontFace5 *iface, UINT32 ch)
|
||||||
{
|
{
|
||||||
struct dwrite_fontface *fontface = impl_from_IDWriteFontFace5(iface);
|
struct dwrite_fontface *fontface = impl_from_IDWriteFontFace5(iface);
|
||||||
UINT16 index;
|
|
||||||
|
|
||||||
TRACE("%p, %#x.\n", iface, ch);
|
TRACE("%p, %#x.\n", iface, ch);
|
||||||
|
|
||||||
index = 0;
|
return !!dwritefontface_get_glyph(fontface, ch);
|
||||||
fontface_get_glyphs(fontface, &ch, 1, &index);
|
|
||||||
|
|
||||||
return index != 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI dwritefontface3_GetRecommendedRenderingMode(IDWriteFontFace5 *iface, FLOAT emSize, FLOAT dpiX, FLOAT dpiY,
|
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))
|
if (freetype_has_kerning_pairs(&fontface->IDWriteFontFace5_iface))
|
||||||
fontface->flags |= FONTFACE_HAS_KERNING_PAIRS;
|
fontface->flags |= FONTFACE_HAS_KERNING_PAIRS;
|
||||||
if (opentype_has_vertical_variants(&fontface->IDWriteFontFace5_iface))
|
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])
|
if (fontface->info_strings[i])
|
||||||
IDWriteLocalizedStrings_AddRef(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);
|
release_font_data(font_data);
|
||||||
|
|
||||||
fontface->cached = factory_cache_fontface(fontface->factory, cached_list, &fontface->IDWriteFontFace5_iface);
|
fontface->cached = factory_cache_fontface(fontface->factory, cached_list, &fontface->IDWriteFontFace5_iface);
|
||||||
|
|
|
@ -52,7 +52,6 @@ static CRITICAL_SECTION freetype_cs = { &critsect_debug, -1, 0, 0, 0, 0 };
|
||||||
static void *ft_handle = NULL;
|
static void *ft_handle = NULL;
|
||||||
static FT_Library library = 0;
|
static FT_Library library = 0;
|
||||||
static FTC_Manager cache_manager = 0;
|
static FTC_Manager cache_manager = 0;
|
||||||
static FTC_CMapCache cmap_cache = 0;
|
|
||||||
static FTC_ImageCache image_cache = 0;
|
static FTC_ImageCache image_cache = 0;
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
@ -83,8 +82,6 @@ MAKE_FUNCPTR(FT_Outline_Get_Bitmap);
|
||||||
MAKE_FUNCPTR(FT_Outline_New);
|
MAKE_FUNCPTR(FT_Outline_New);
|
||||||
MAKE_FUNCPTR(FT_Outline_Transform);
|
MAKE_FUNCPTR(FT_Outline_Transform);
|
||||||
MAKE_FUNCPTR(FT_Outline_Translate);
|
MAKE_FUNCPTR(FT_Outline_Translate);
|
||||||
MAKE_FUNCPTR(FTC_CMapCache_Lookup);
|
|
||||||
MAKE_FUNCPTR(FTC_CMapCache_New);
|
|
||||||
MAKE_FUNCPTR(FTC_ImageCache_Lookup);
|
MAKE_FUNCPTR(FTC_ImageCache_Lookup);
|
||||||
MAKE_FUNCPTR(FTC_ImageCache_New);
|
MAKE_FUNCPTR(FTC_ImageCache_New);
|
||||||
MAKE_FUNCPTR(FTC_Manager_New);
|
MAKE_FUNCPTR(FTC_Manager_New);
|
||||||
|
@ -206,8 +203,6 @@ BOOL init_freetype(void)
|
||||||
LOAD_FUNCPTR(FT_Outline_New)
|
LOAD_FUNCPTR(FT_Outline_New)
|
||||||
LOAD_FUNCPTR(FT_Outline_Transform)
|
LOAD_FUNCPTR(FT_Outline_Transform)
|
||||||
LOAD_FUNCPTR(FT_Outline_Translate)
|
LOAD_FUNCPTR(FT_Outline_Translate)
|
||||||
LOAD_FUNCPTR(FTC_CMapCache_Lookup)
|
|
||||||
LOAD_FUNCPTR(FTC_CMapCache_New)
|
|
||||||
LOAD_FUNCPTR(FTC_ImageCache_Lookup)
|
LOAD_FUNCPTR(FTC_ImageCache_Lookup)
|
||||||
LOAD_FUNCPTR(FTC_ImageCache_New)
|
LOAD_FUNCPTR(FTC_ImageCache_New)
|
||||||
LOAD_FUNCPTR(FTC_Manager_New)
|
LOAD_FUNCPTR(FTC_Manager_New)
|
||||||
|
@ -228,7 +223,6 @@ BOOL init_freetype(void)
|
||||||
|
|
||||||
/* init cache manager */
|
/* init cache manager */
|
||||||
if (pFTC_Manager_New(library, 0, 0, 0, &face_requester, NULL, &cache_manager) != 0 ||
|
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) {
|
pFTC_ImageCache_New(cache_manager, &image_cache) != 0) {
|
||||||
|
|
||||||
ERR("Failed to init FreeType cache\n");
|
ERR("Failed to init FreeType cache\n");
|
||||||
|
@ -562,27 +556,6 @@ UINT16 freetype_get_glyphcount(IDWriteFontFace5 *fontface)
|
||||||
return count;
|
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 freetype_has_kerning_pairs(IDWriteFontFace5 *fontface)
|
||||||
{
|
{
|
||||||
BOOL has_kerning_pairs = FALSE;
|
BOOL has_kerning_pairs = FALSE;
|
||||||
|
@ -841,28 +814,6 @@ BOOL freetype_get_glyph_bitmap(struct dwrite_glyphbitmap *bitmap)
|
||||||
return ret;
|
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,
|
INT32 freetype_get_glyph_advance(IDWriteFontFace5 *fontface, FLOAT emSize, UINT16 index, DWRITE_MEASURING_MODE mode,
|
||||||
BOOL *has_contours)
|
BOOL *has_contours)
|
||||||
{
|
{
|
||||||
|
@ -923,12 +874,6 @@ UINT16 freetype_get_glyphcount(IDWriteFontFace5 *fontface)
|
||||||
return 0;
|
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)
|
BOOL freetype_has_kerning_pairs(IDWriteFontFace5 *fontface)
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -949,11 +894,6 @@ BOOL freetype_get_glyph_bitmap(struct dwrite_glyphbitmap *bitmap)
|
||||||
return FALSE;
|
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,
|
INT32 freetype_get_glyph_advance(IDWriteFontFace5 *fontface, FLOAT emSize, UINT16 index, DWRITE_MEASURING_MODE mode,
|
||||||
BOOL *has_contours)
|
BOOL *has_contours)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1728,12 +1728,14 @@ void dwrite_cmap_init(struct dwrite_cmap *cmap, IDWriteFontFile *file, unsigned
|
||||||
|
|
||||||
if (cmap->data) return;
|
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);
|
WARN("Failed to get file stream, hr %#x.\n", hr);
|
||||||
goto failed;
|
goto failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
stream_desc.stream = cmap->stream;
|
||||||
stream_desc.face_type = face_type;
|
stream_desc.face_type = face_type;
|
||||||
stream_desc.face_index = face_index;
|
stream_desc.face_index = face_index;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue