[PATCH 3/4] dwrite: Implement GetPanose()
Nikolay Sivov
nsivov at codeweavers.com
Mon Jul 6 15:08:37 CDT 2015
---
-------------- next part --------------
From d30ba7aeef50581ef2c3fdc31f0c4611a0af25fa Mon Sep 17 00:00:00 2001
From: Nikolay Sivov <nsivov at codeweavers.com>
Date: Mon, 6 Jul 2015 23:03:18 +0300
Subject: [PATCH 3/4] dwrite: Implement GetPanose()
---
dlls/dwrite/dwrite_private.h | 10 +++++++--
dlls/dwrite/font.c | 12 +++++++++--
dlls/dwrite/gdiinterop.c | 10 ++++-----
dlls/dwrite/opentype.c | 19 ++++++++++-------
dlls/dwrite/tests/font.c | 50 ++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 83 insertions(+), 18 deletions(-)
diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h
index 34f67f0..3619e53 100644
--- a/dlls/dwrite/dwrite_private.h
+++ b/dlls/dwrite/dwrite_private.h
@@ -125,11 +125,17 @@ extern BOOL is_face_type_supported(DWRITE_FONT_FACE_TYPE) DECLSPEC_HIDDEN;
extern HRESULT get_family_names_from_stream(IDWriteFontFileStream*,UINT32,DWRITE_FONT_FACE_TYPE,IDWriteLocalizedStrings**) DECLSPEC_HIDDEN;
/* Opentype font table functions */
+struct dwrite_font_props {
+ DWRITE_FONT_STYLE style;
+ DWRITE_FONT_STRETCH stretch;
+ DWRITE_FONT_WEIGHT weight;
+ DWRITE_PANOSE panose;
+};
+
extern HRESULT opentype_analyze_font(IDWriteFontFileStream*,UINT32*,DWRITE_FONT_FILE_TYPE*,DWRITE_FONT_FACE_TYPE*,BOOL*) DECLSPEC_HIDDEN;
extern HRESULT opentype_get_font_table(IDWriteFontFileStream*,DWRITE_FONT_FACE_TYPE,UINT32,UINT32,const void**,void**,UINT32*,BOOL*) DECLSPEC_HIDDEN;
extern HRESULT opentype_cmap_get_unicode_ranges(void*,UINT32,DWRITE_UNICODE_RANGE*,UINT32*) DECLSPEC_HIDDEN;
-extern void opentype_get_font_properties(IDWriteFontFileStream*,DWRITE_FONT_FACE_TYPE,UINT32,DWRITE_FONT_STRETCH*,
- DWRITE_FONT_WEIGHT*,DWRITE_FONT_STYLE*) DECLSPEC_HIDDEN;
+extern void opentype_get_font_properties(IDWriteFontFileStream*,DWRITE_FONT_FACE_TYPE,UINT32,struct dwrite_font_props*) DECLSPEC_HIDDEN;
extern void opentype_get_font_metrics(IDWriteFontFileStream*,DWRITE_FONT_FACE_TYPE,UINT32,DWRITE_FONT_METRICS1*,DWRITE_CARET_METRICS*) DECLSPEC_HIDDEN;
extern HRESULT opentype_get_font_strings_from_id(const void*,DWRITE_INFORMATIONAL_STRING_ID,IDWriteLocalizedStrings**) DECLSPEC_HIDDEN;
extern HRESULT opentype_get_typographic_features(IDWriteFontFace*,UINT32,UINT32,UINT32,UINT32*,DWRITE_FONT_FEATURE_TAG*) DECLSPEC_HIDDEN;
diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c
index 2091867..d9b6521 100644
--- a/dlls/dwrite/font.c
+++ b/dlls/dwrite/font.c
@@ -39,6 +39,7 @@ struct dwrite_font_data {
DWRITE_FONT_STYLE style;
DWRITE_FONT_STRETCH stretch;
DWRITE_FONT_WEIGHT weight;
+ DWRITE_PANOSE panose;
DWRITE_FONT_METRICS1 metrics;
IDWriteLocalizedStrings *info_strings[DWRITE_INFORMATIONAL_STRING_POSTSCRIPT_CID_NAME+1];
@@ -1094,7 +1095,8 @@ static void WINAPI dwritefont1_GetMetrics(IDWriteFont2 *iface, DWRITE_FONT_METRI
static void WINAPI dwritefont1_GetPanose(IDWriteFont2 *iface, DWRITE_PANOSE *panose)
{
struct dwrite_font *This = impl_from_IDWriteFont2(iface);
- FIXME("(%p)->(%p): stub\n", This, panose);
+ TRACE("(%p)->(%p)\n", This, panose);
+ *panose = This->data->panose;
}
static HRESULT WINAPI dwritefont1_GetUnicodeRanges(IDWriteFont2 *iface, UINT32 max_count, DWRITE_UNICODE_RANGE *ranges, UINT32 *count)
@@ -1631,6 +1633,7 @@ static HRESULT init_font_data(IDWriteFactory2 *factory, IDWriteFontFile *file, U
{
void *os2_context, *head_context;
const void *tt_os2 = NULL, *tt_head = NULL;
+ struct dwrite_font_props props;
struct dwrite_font_data *data;
HRESULT hr;
@@ -1655,9 +1658,14 @@ static HRESULT init_font_data(IDWriteFactory2 *factory, IDWriteFontFile *file, U
opentype_get_font_table(*stream, face_type, face_index, MS_OS2_TAG, &tt_os2, &os2_context, NULL, NULL);
opentype_get_font_table(*stream, face_type, face_index, MS_HEAD_TAG, &tt_head, &head_context, NULL, NULL);
- opentype_get_font_properties(*stream, face_type, face_index, &data->stretch, &data->weight, &data->style);
+ opentype_get_font_properties(*stream, face_type, face_index, &props);
opentype_get_font_metrics(*stream, face_type, face_index, &data->metrics, NULL);
+ data->style = props.style;
+ data->stretch = props.stretch;
+ data->weight = props.weight;
+ data->panose = props.panose;
+
if (tt_os2)
IDWriteFontFileStream_ReleaseFileFragment(*stream, os2_context);
if (tt_head)
diff --git a/dlls/dwrite/gdiinterop.c b/dlls/dwrite/gdiinterop.c
index 8f91ded..83a245a 100644
--- a/dlls/dwrite/gdiinterop.c
+++ b/dlls/dwrite/gdiinterop.c
@@ -411,10 +411,8 @@ static HRESULT WINAPI gdiinterop_ConvertFontFaceToLOGFONT(IDWriteGdiInterop *ifa
IDWriteLocalizedStrings *familynames;
DWRITE_FONT_SIMULATIONS simulations;
DWRITE_FONT_FACE_TYPE face_type;
+ struct dwrite_font_props props;
IDWriteFontFileStream *stream;
- DWRITE_FONT_STRETCH stretch;
- DWRITE_FONT_STYLE style;
- DWRITE_FONT_WEIGHT weight;
IDWriteFontFile *file = NULL;
UINT32 index;
BOOL exists;
@@ -437,7 +435,7 @@ static HRESULT WINAPI gdiinterop_ConvertFontFaceToLOGFONT(IDWriteGdiInterop *ifa
index = IDWriteFontFace_GetIndex(fontface);
face_type = IDWriteFontFace_GetType(fontface);
- opentype_get_font_properties(stream, face_type, index, &stretch, &weight, &style);
+ opentype_get_font_properties(stream, face_type, index, &props);
hr = get_family_names_from_stream(stream, index, face_type, &familynames);
IDWriteFontFile_Release(file);
IDWriteFontFileStream_Release(stream);
@@ -447,8 +445,8 @@ static HRESULT WINAPI gdiinterop_ConvertFontFaceToLOGFONT(IDWriteGdiInterop *ifa
simulations = IDWriteFontFace_GetSimulations(fontface);
logfont->lfCharSet = DEFAULT_CHARSET;
- logfont->lfWeight = weight;
- logfont->lfItalic = style == DWRITE_FONT_STYLE_ITALIC || (simulations & DWRITE_FONT_SIMULATIONS_OBLIQUE);
+ logfont->lfWeight = props.weight;
+ logfont->lfItalic = props.style == DWRITE_FONT_STYLE_ITALIC || (simulations & DWRITE_FONT_SIMULATIONS_OBLIQUE);
logfont->lfOutPrecision = OUT_OUTLINE_PRECIS;
logfont->lfFaceName[0] = 0;
diff --git a/dlls/dwrite/opentype.c b/dlls/dwrite/opentype.c
index cbc5090..3d51e31 100644
--- a/dlls/dwrite/opentype.c
+++ b/dlls/dwrite/opentype.c
@@ -954,7 +954,7 @@ void opentype_get_font_metrics(IDWriteFontFileStream *stream, DWRITE_FONT_FACE_T
}
void opentype_get_font_properties(IDWriteFontFileStream *stream, DWRITE_FONT_FACE_TYPE type, UINT32 index,
- DWRITE_FONT_STRETCH *stretch, DWRITE_FONT_WEIGHT *weight, DWRITE_FONT_STYLE *style)
+ struct dwrite_font_props *props)
{
void *os2_context, *head_context;
const TT_OS2_V2 *tt_os2;
@@ -964,23 +964,26 @@ void opentype_get_font_properties(IDWriteFontFileStream *stream, DWRITE_FONT_FAC
opentype_get_font_table(stream, type, index, MS_HEAD_TAG, (const void**)&tt_head, &head_context, NULL, NULL);
/* default stretch, weight and style to normal */
- *stretch = DWRITE_FONT_STRETCH_NORMAL;
- *weight = DWRITE_FONT_WEIGHT_NORMAL;
- *style = DWRITE_FONT_STYLE_NORMAL;
+ props->stretch = DWRITE_FONT_STRETCH_NORMAL;
+ props->weight = DWRITE_FONT_WEIGHT_NORMAL;
+ props->style = DWRITE_FONT_STYLE_NORMAL;
+ memset(&props->panose, 0, sizeof(props->panose));
/* DWRITE_FONT_STRETCH enumeration values directly match font data values */
if (tt_os2) {
if (GET_BE_WORD(tt_os2->usWidthClass) <= DWRITE_FONT_STRETCH_ULTRA_EXPANDED)
- *stretch = GET_BE_WORD(tt_os2->usWidthClass);
+ props->stretch = GET_BE_WORD(tt_os2->usWidthClass);
- *weight = GET_BE_WORD(tt_os2->usWeightClass);
- TRACE("stretch=%d, weight=%d\n", *stretch, *weight);
+ props->weight = GET_BE_WORD(tt_os2->usWeightClass);
+ memcpy(&props->panose, &tt_os2->panose, sizeof(props->panose));
+
+ TRACE("stretch=%d, weight=%d\n", props->stretch, props->weight);
}
if (tt_head) {
USHORT macStyle = GET_BE_WORD(tt_head->macStyle);
if (macStyle & 0x0002)
- *style = DWRITE_FONT_STYLE_ITALIC;
+ props->style = DWRITE_FONT_STYLE_ITALIC;
}
if (tt_os2)
diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c
index d3ac83c..ae25b6c 100644
--- a/dlls/dwrite/tests/font.c
+++ b/dlls/dwrite/tests/font.c
@@ -3634,6 +3634,55 @@ static void test_GetGdiCompatibleMetrics(void)
IDWriteFactory_Release(factory);
}
+static void test_GetPanose(void)
+{
+ IDWriteFactory *factory;
+ IDWriteFont1 *font1;
+ IDWriteFont *font;
+ HRESULT hr;
+
+ factory = create_factory();
+ font = get_tahoma_instance(factory, DWRITE_FONT_STYLE_NORMAL);
+
+ hr = IDWriteFont_QueryInterface(font, &IID_IDWriteFont1, (void**)&font1);
+ IDWriteFont_Release(font);
+ if (hr == S_OK) {
+ DWRITE_PANOSE panose;
+
+ if (0) /* crashes on native */
+ IDWriteFont1_GetPanose(font1, NULL);
+
+ memset(&panose, 0, sizeof(panose));
+ IDWriteFont1_GetPanose(font1, &panose);
+ ok(panose.familyKind == DWRITE_PANOSE_FAMILY_TEXT_DISPLAY,
+ "got %u\n", panose.familyKind);
+ ok(panose.text.serifStyle == DWRITE_PANOSE_SERIF_STYLE_NORMAL_SANS,
+ "got %u\n", panose.text.serifStyle);
+ ok(panose.text.weight == DWRITE_PANOSE_WEIGHT_MEDIUM,
+ "got %u\n", panose.text.weight);
+ ok(panose.text.proportion == DWRITE_PANOSE_PROPORTION_EVEN_WIDTH,
+ "got %u\n", panose.text.proportion);
+ ok(panose.text.contrast == DWRITE_PANOSE_CONTRAST_VERY_LOW,
+ "got %u\n", panose.text.contrast);
+ ok(panose.text.strokeVariation == DWRITE_PANOSE_STROKE_VARIATION_GRADUAL_VERTICAL,
+ "got %u\n", panose.text.strokeVariation);
+ ok(panose.text.armStyle == DWRITE_PANOSE_ARM_STYLE_STRAIGHT_ARMS_VERTICAL,
+ "got %u\n", panose.text.armStyle);
+ ok(panose.text.letterform == DWRITE_PANOSE_LETTERFORM_NORMAL_BOXED,
+ "got %u\n", panose.text.letterform);
+ ok(panose.text.midline == DWRITE_PANOSE_MIDLINE_STANDARD_TRIMMED,
+ "got %u\n", panose.text.midline);
+ ok(panose.text.xHeight == DWRITE_PANOSE_XHEIGHT_CONSTANT_LARGE,
+ "got %u\n", panose.text.xHeight);
+
+ IDWriteFont1_Release(font1);
+ }
+ else
+ win_skip("GetPanose() is not supported.\n");
+
+ IDWriteFactory_Release(factory);
+}
+
START_TEST(font)
{
IDWriteFactory *factory;
@@ -3678,6 +3727,7 @@ START_TEST(font)
test_CreateRenderingParams();
test_CreateGlyphRunAnalysis();
test_GetGdiCompatibleMetrics();
+ test_GetPanose();
IDWriteFactory_Release(factory);
}
--
2.1.4
More information about the wine-patches
mailing list