dwrite: Add a helper specifically for TryGetFontTable().
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
8d1b119b2e
commit
107599531a
|
@ -310,7 +310,8 @@ extern const void* get_fontface_table(IDWriteFontFace5 *fontface, UINT32 tag,
|
||||||
struct dwrite_fonttable *table) DECLSPEC_HIDDEN;
|
struct dwrite_fonttable *table) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
extern HRESULT opentype_analyze_font(IDWriteFontFileStream*,BOOL*,DWRITE_FONT_FILE_TYPE*,DWRITE_FONT_FACE_TYPE*,UINT32*) DECLSPEC_HIDDEN;
|
extern HRESULT opentype_analyze_font(IDWriteFontFileStream*,BOOL*,DWRITE_FONT_FILE_TYPE*,DWRITE_FONT_FACE_TYPE*,UINT32*) DECLSPEC_HIDDEN;
|
||||||
extern HRESULT opentype_get_font_table(struct file_stream_desc*,UINT32,const void**,void**,UINT32*,BOOL*) DECLSPEC_HIDDEN;
|
extern HRESULT opentype_try_get_font_table(struct file_stream_desc *stream_desc, UINT32 tag, const void **data,
|
||||||
|
void **context, UINT32 *size, BOOL *exists) DECLSPEC_HIDDEN;
|
||||||
extern HRESULT opentype_cmap_get_unicode_ranges(const struct dwrite_fonttable *table, unsigned int max_count,
|
extern HRESULT opentype_cmap_get_unicode_ranges(const struct dwrite_fonttable *table, unsigned int max_count,
|
||||||
DWRITE_UNICODE_RANGE *ranges, unsigned int *count) DECLSPEC_HIDDEN;
|
DWRITE_UNICODE_RANGE *ranges, unsigned int *count) DECLSPEC_HIDDEN;
|
||||||
extern void opentype_get_font_properties(struct file_stream_desc*,struct dwrite_font_props*) DECLSPEC_HIDDEN;
|
extern void opentype_get_font_properties(struct file_stream_desc*,struct dwrite_font_props*) DECLSPEC_HIDDEN;
|
||||||
|
|
|
@ -707,7 +707,7 @@ static HRESULT WINAPI dwritefontface_TryGetFontTable(IDWriteFontFace5 *iface, UI
|
||||||
stream_desc.stream = fontface->stream;
|
stream_desc.stream = fontface->stream;
|
||||||
stream_desc.face_type = fontface->type;
|
stream_desc.face_type = fontface->type;
|
||||||
stream_desc.face_index = fontface->index;
|
stream_desc.face_index = fontface->index;
|
||||||
return opentype_get_font_table(&stream_desc, table_tag, table_data, context, table_size, exists);
|
return opentype_try_get_font_table(&stream_desc, table_tag, table_data, context, table_size, exists);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void WINAPI dwritefontface_ReleaseFontTable(IDWriteFontFace5 *iface, void *table_context)
|
static void WINAPI dwritefontface_ReleaseFontTable(IDWriteFontFace5 *iface, void *table_context)
|
||||||
|
|
|
@ -1366,7 +1366,7 @@ HRESULT opentype_analyze_font(IDWriteFontFileStream *stream, BOOL *supported, DW
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT opentype_get_font_table(struct file_stream_desc *stream_desc, UINT32 tag, const void **table_data,
|
HRESULT opentype_try_get_font_table(struct file_stream_desc *stream_desc, UINT32 tag, const void **table_data,
|
||||||
void **table_context, UINT32 *table_size, BOOL *found)
|
void **table_context, UINT32 *table_size, BOOL *found)
|
||||||
{
|
{
|
||||||
void *table_directory_context, *sfnt_context;
|
void *table_directory_context, *sfnt_context;
|
||||||
|
@ -1434,6 +1434,12 @@ HRESULT opentype_get_font_table(struct file_stream_desc *stream_desc, UINT32 tag
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static HRESULT opentype_get_font_table(struct file_stream_desc *stream_desc, UINT32 tag,
|
||||||
|
struct dwrite_fonttable *table)
|
||||||
|
{
|
||||||
|
return opentype_try_get_font_table(stream_desc, tag, (const void **)&table->data, &table->context, &table->size, &table->exists);
|
||||||
|
}
|
||||||
|
|
||||||
/**********
|
/**********
|
||||||
* CMAP
|
* CMAP
|
||||||
**********/
|
**********/
|
||||||
|
@ -1555,15 +1561,15 @@ HRESULT opentype_cmap_get_unicode_ranges(const struct dwrite_fonttable *cmap, un
|
||||||
|
|
||||||
void opentype_get_font_typo_metrics(struct file_stream_desc *stream_desc, unsigned int *ascent, unsigned int *descent)
|
void opentype_get_font_typo_metrics(struct file_stream_desc *stream_desc, unsigned int *ascent, unsigned int *descent)
|
||||||
{
|
{
|
||||||
|
struct dwrite_fonttable os2;
|
||||||
const TT_OS2_V2 *data;
|
const TT_OS2_V2 *data;
|
||||||
unsigned int size;
|
|
||||||
void *context;
|
|
||||||
|
|
||||||
opentype_get_font_table(stream_desc, MS_OS2_TAG, (const void **)&data, &context, &size, NULL);
|
opentype_get_font_table(stream_desc, MS_OS2_TAG, &os2);
|
||||||
|
data = (const TT_OS2_V2 *)os2.data;
|
||||||
|
|
||||||
*ascent = *descent = 0;
|
*ascent = *descent = 0;
|
||||||
|
|
||||||
if (size >= FIELD_OFFSET(TT_OS2_V2, sTypoLineGap))
|
if (os2.size >= FIELD_OFFSET(TT_OS2_V2, sTypoLineGap))
|
||||||
{
|
{
|
||||||
SHORT value = GET_BE_WORD(data->sTypoDescender);
|
SHORT value = GET_BE_WORD(data->sTypoDescender);
|
||||||
*ascent = GET_BE_WORD(data->sTypoAscender);
|
*ascent = GET_BE_WORD(data->sTypoAscender);
|
||||||
|
@ -1571,12 +1577,12 @@ void opentype_get_font_typo_metrics(struct file_stream_desc *stream_desc, unsign
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data)
|
if (data)
|
||||||
IDWriteFontFileStream_ReleaseFileFragment(stream_desc->stream, context);
|
IDWriteFontFileStream_ReleaseFileFragment(stream_desc->stream, os2.context);
|
||||||
}
|
}
|
||||||
|
|
||||||
void opentype_get_font_metrics(struct file_stream_desc *stream_desc, DWRITE_FONT_METRICS1 *metrics, DWRITE_CARET_METRICS *caret)
|
void opentype_get_font_metrics(struct file_stream_desc *stream_desc, DWRITE_FONT_METRICS1 *metrics, DWRITE_CARET_METRICS *caret)
|
||||||
{
|
{
|
||||||
void *os2_context, *head_context, *post_context, *hhea_context;
|
struct dwrite_fonttable os2, head, post, hhea;
|
||||||
const TT_OS2_V2 *tt_os2;
|
const TT_OS2_V2 *tt_os2;
|
||||||
const TT_HEAD *tt_head;
|
const TT_HEAD *tt_head;
|
||||||
const TT_POST *tt_post;
|
const TT_POST *tt_post;
|
||||||
|
@ -1584,10 +1590,15 @@ void opentype_get_font_metrics(struct file_stream_desc *stream_desc, DWRITE_FONT
|
||||||
|
|
||||||
memset(metrics, 0, sizeof(*metrics));
|
memset(metrics, 0, sizeof(*metrics));
|
||||||
|
|
||||||
opentype_get_font_table(stream_desc, MS_OS2_TAG, (const void**)&tt_os2, &os2_context, NULL, NULL);
|
opentype_get_font_table(stream_desc, MS_OS2_TAG, &os2);
|
||||||
opentype_get_font_table(stream_desc, MS_HEAD_TAG, (const void**)&tt_head, &head_context, NULL, NULL);
|
opentype_get_font_table(stream_desc, MS_HEAD_TAG, &head);
|
||||||
opentype_get_font_table(stream_desc, MS_POST_TAG, (const void**)&tt_post, &post_context, NULL, NULL);
|
opentype_get_font_table(stream_desc, MS_POST_TAG, &post);
|
||||||
opentype_get_font_table(stream_desc, MS_HHEA_TAG, (const void**)&tt_hhea, &hhea_context, NULL, NULL);
|
opentype_get_font_table(stream_desc, MS_HHEA_TAG, &hhea);
|
||||||
|
|
||||||
|
tt_head = (const TT_HEAD *)head.data;
|
||||||
|
tt_os2 = (const TT_OS2_V2 *)os2.data;
|
||||||
|
tt_post = (const TT_POST *)post.data;
|
||||||
|
tt_hhea = (const TT_HHEA *)hhea.data;
|
||||||
|
|
||||||
if (tt_head) {
|
if (tt_head) {
|
||||||
metrics->designUnitsPerEm = GET_BE_WORD(tt_head->unitsPerEm);
|
metrics->designUnitsPerEm = GET_BE_WORD(tt_head->unitsPerEm);
|
||||||
|
@ -1597,7 +1608,8 @@ void opentype_get_font_metrics(struct file_stream_desc *stream_desc, DWRITE_FONT
|
||||||
metrics->glyphBoxBottom = GET_BE_WORD(tt_head->yMin);
|
metrics->glyphBoxBottom = GET_BE_WORD(tt_head->yMin);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (caret) {
|
if (caret)
|
||||||
|
{
|
||||||
if (tt_hhea) {
|
if (tt_hhea) {
|
||||||
caret->slopeRise = GET_BE_WORD(tt_hhea->caretSlopeRise);
|
caret->slopeRise = GET_BE_WORD(tt_hhea->caretSlopeRise);
|
||||||
caret->slopeRun = GET_BE_WORD(tt_hhea->caretSlopeRun);
|
caret->slopeRun = GET_BE_WORD(tt_hhea->caretSlopeRun);
|
||||||
|
@ -1679,23 +1691,26 @@ void opentype_get_font_metrics(struct file_stream_desc *stream_desc, DWRITE_FONT
|
||||||
metrics->capHeight = metrics->designUnitsPerEm * 7 / 10;
|
metrics->capHeight = metrics->designUnitsPerEm * 7 / 10;
|
||||||
|
|
||||||
if (tt_os2)
|
if (tt_os2)
|
||||||
IDWriteFontFileStream_ReleaseFileFragment(stream_desc->stream, os2_context);
|
IDWriteFontFileStream_ReleaseFileFragment(stream_desc->stream, os2.context);
|
||||||
if (tt_head)
|
if (tt_head)
|
||||||
IDWriteFontFileStream_ReleaseFileFragment(stream_desc->stream, head_context);
|
IDWriteFontFileStream_ReleaseFileFragment(stream_desc->stream, head.context);
|
||||||
if (tt_post)
|
if (tt_post)
|
||||||
IDWriteFontFileStream_ReleaseFileFragment(stream_desc->stream, post_context);
|
IDWriteFontFileStream_ReleaseFileFragment(stream_desc->stream, post.context);
|
||||||
if (tt_hhea)
|
if (tt_hhea)
|
||||||
IDWriteFontFileStream_ReleaseFileFragment(stream_desc->stream, hhea_context);
|
IDWriteFontFileStream_ReleaseFileFragment(stream_desc->stream, hhea.context);
|
||||||
}
|
}
|
||||||
|
|
||||||
void opentype_get_font_properties(struct file_stream_desc *stream_desc, struct dwrite_font_props *props)
|
void opentype_get_font_properties(struct file_stream_desc *stream_desc, struct dwrite_font_props *props)
|
||||||
{
|
{
|
||||||
void *os2_context, *head_context;
|
struct dwrite_fonttable os2, head;
|
||||||
const TT_OS2_V2 *tt_os2;
|
const TT_OS2_V2 *tt_os2;
|
||||||
const TT_HEAD *tt_head;
|
const TT_HEAD *tt_head;
|
||||||
|
|
||||||
opentype_get_font_table(stream_desc, MS_OS2_TAG, (const void**)&tt_os2, &os2_context, NULL, NULL);
|
opentype_get_font_table(stream_desc, MS_OS2_TAG, &os2);
|
||||||
opentype_get_font_table(stream_desc, MS_HEAD_TAG, (const void**)&tt_head, &head_context, NULL, NULL);
|
opentype_get_font_table(stream_desc, MS_HEAD_TAG, &head);
|
||||||
|
|
||||||
|
tt_os2 = (const TT_OS2_V2 *)os2.data;
|
||||||
|
tt_head = (const TT_HEAD *)head.data;
|
||||||
|
|
||||||
/* default stretch, weight and style to normal */
|
/* default stretch, weight and style to normal */
|
||||||
props->stretch = DWRITE_FONT_STRETCH_NORMAL;
|
props->stretch = DWRITE_FONT_STRETCH_NORMAL;
|
||||||
|
@ -1767,10 +1782,10 @@ void opentype_get_font_properties(struct file_stream_desc *stream_desc, struct d
|
||||||
|
|
||||||
TRACE("stretch=%d, weight=%d, style %d\n", props->stretch, props->weight, props->style);
|
TRACE("stretch=%d, weight=%d, style %d\n", props->stretch, props->weight, props->style);
|
||||||
|
|
||||||
if (tt_os2)
|
if (os2.data)
|
||||||
IDWriteFontFileStream_ReleaseFileFragment(stream_desc->stream, os2_context);
|
IDWriteFontFileStream_ReleaseFileFragment(stream_desc->stream, os2.context);
|
||||||
if (tt_head)
|
if (head.data)
|
||||||
IDWriteFontFileStream_ReleaseFileFragment(stream_desc->stream, head_context);
|
IDWriteFontFileStream_ReleaseFileFragment(stream_desc->stream, head.context);
|
||||||
}
|
}
|
||||||
|
|
||||||
static UINT get_name_record_codepage(enum OPENTYPE_PLATFORM_ID platform, USHORT encoding)
|
static UINT get_name_record_codepage(enum OPENTYPE_PLATFORM_ID platform, USHORT encoding)
|
||||||
|
@ -2026,13 +2041,16 @@ HRESULT opentype_get_font_info_strings(const void *table_data, DWRITE_INFORMATIO
|
||||||
have 'Preferred Family Name' in WWS format, then WWS name is not used. */
|
have 'Preferred Family Name' in WWS format, then WWS name is not used. */
|
||||||
HRESULT opentype_get_font_familyname(struct file_stream_desc *stream_desc, IDWriteLocalizedStrings **names)
|
HRESULT opentype_get_font_familyname(struct file_stream_desc *stream_desc, IDWriteLocalizedStrings **names)
|
||||||
{
|
{
|
||||||
|
struct dwrite_fonttable os2, name;
|
||||||
const TT_OS2_V2 *tt_os2;
|
const TT_OS2_V2 *tt_os2;
|
||||||
void *os2_context, *name_context;
|
|
||||||
const void *name_table;
|
const void *name_table;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
opentype_get_font_table(stream_desc, MS_OS2_TAG, (const void**)&tt_os2, &os2_context, NULL, NULL);
|
opentype_get_font_table(stream_desc, MS_OS2_TAG, &os2);
|
||||||
opentype_get_font_table(stream_desc, MS_NAME_TAG, &name_table, &name_context, NULL, NULL);
|
opentype_get_font_table(stream_desc, MS_NAME_TAG, &name);
|
||||||
|
|
||||||
|
tt_os2 = (const TT_OS2_V2 *)os2.data;
|
||||||
|
name_table = (const void *)name.data;
|
||||||
|
|
||||||
*names = NULL;
|
*names = NULL;
|
||||||
|
|
||||||
|
@ -2047,10 +2065,10 @@ HRESULT opentype_get_font_familyname(struct file_stream_desc *stream_desc, IDWri
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
hr = opentype_get_font_strings_from_id(name_table, OPENTYPE_STRING_FAMILY_NAME, names);
|
hr = opentype_get_font_strings_from_id(name_table, OPENTYPE_STRING_FAMILY_NAME, names);
|
||||||
|
|
||||||
if (tt_os2)
|
if (os2.context)
|
||||||
IDWriteFontFileStream_ReleaseFileFragment(stream_desc->stream, os2_context);
|
IDWriteFontFileStream_ReleaseFileFragment(stream_desc->stream, os2.context);
|
||||||
if (name_context)
|
if (name.context)
|
||||||
IDWriteFontFileStream_ReleaseFileFragment(stream_desc->stream, name_context);
|
IDWriteFontFileStream_ReleaseFileFragment(stream_desc->stream, name.context);
|
||||||
|
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
@ -2059,14 +2077,17 @@ HRESULT opentype_get_font_familyname(struct file_stream_desc *stream_desc, IDWri
|
||||||
have 'Preferred Face Name' in WWS format, then WWS name is not used. */
|
have 'Preferred Face Name' in WWS format, then WWS name is not used. */
|
||||||
HRESULT opentype_get_font_facename(struct file_stream_desc *stream_desc, WCHAR *lfname, IDWriteLocalizedStrings **names)
|
HRESULT opentype_get_font_facename(struct file_stream_desc *stream_desc, WCHAR *lfname, IDWriteLocalizedStrings **names)
|
||||||
{
|
{
|
||||||
|
struct dwrite_fonttable os2, name;
|
||||||
IDWriteLocalizedStrings *lfnames;
|
IDWriteLocalizedStrings *lfnames;
|
||||||
void *os2_context, *name_context;
|
|
||||||
const TT_OS2_V2 *tt_os2;
|
const TT_OS2_V2 *tt_os2;
|
||||||
const void *name_table;
|
const void *name_table;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
opentype_get_font_table(stream_desc, MS_OS2_TAG, (const void**)&tt_os2, &os2_context, NULL, NULL);
|
opentype_get_font_table(stream_desc, MS_OS2_TAG, &os2);
|
||||||
opentype_get_font_table(stream_desc, MS_NAME_TAG, &name_table, &name_context, NULL, NULL);
|
opentype_get_font_table(stream_desc, MS_NAME_TAG, &name);
|
||||||
|
|
||||||
|
tt_os2 = (const TT_OS2_V2 *)os2.data;
|
||||||
|
name_table = name.data;
|
||||||
|
|
||||||
*names = NULL;
|
*names = NULL;
|
||||||
|
|
||||||
|
@ -2113,10 +2134,10 @@ HRESULT opentype_get_font_facename(struct file_stream_desc *stream_desc, WCHAR *
|
||||||
IDWriteLocalizedStrings_Release(lfnames);
|
IDWriteLocalizedStrings_Release(lfnames);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tt_os2)
|
if (os2.context)
|
||||||
IDWriteFontFileStream_ReleaseFileFragment(stream_desc->stream, os2_context);
|
IDWriteFontFileStream_ReleaseFileFragment(stream_desc->stream, os2.context);
|
||||||
if (name_context)
|
if (name.context)
|
||||||
IDWriteFontFileStream_ReleaseFileFragment(stream_desc->stream, name_context);
|
IDWriteFontFileStream_ReleaseFileFragment(stream_desc->stream, name.context);
|
||||||
|
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue