[PATCH] dwrite: Update to IDWriteFont3
Nikolay Sivov
nsivov at codeweavers.com
Mon Mar 7 08:10:17 CST 2016
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/dwrite/font.c | 132 ++++++++++++++++++++++++++++++-----------------
dlls/dwrite/tests/font.c | 38 ++++++++++++--
include/dwrite_3.idl | 9 ++++
3 files changed, 130 insertions(+), 49 deletions(-)
diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c
index 0ebb49c..6ce439d 100644
--- a/dlls/dwrite/font.c
+++ b/dlls/dwrite/font.c
@@ -138,7 +138,7 @@ struct dwrite_fontfamily {
};
struct dwrite_font {
- IDWriteFont2 IDWriteFont2_iface;
+ IDWriteFont3 IDWriteFont3_iface;
LONG ref;
IDWriteFontFamily *family;
@@ -248,9 +248,9 @@ static inline struct dwrite_fontface *impl_from_IDWriteFontFace3(IDWriteFontFace
return CONTAINING_RECORD(iface, struct dwrite_fontface, IDWriteFontFace3_iface);
}
-static inline struct dwrite_font *impl_from_IDWriteFont2(IDWriteFont2 *iface)
+static inline struct dwrite_font *impl_from_IDWriteFont3(IDWriteFont3 *iface)
{
- return CONTAINING_RECORD(iface, struct dwrite_font, IDWriteFont2_iface);
+ return CONTAINING_RECORD(iface, struct dwrite_font, IDWriteFont3_iface);
}
static inline struct dwrite_fontfile *impl_from_IDWriteFontFile(IDWriteFontFile *iface)
@@ -1223,9 +1223,9 @@ static HRESULT get_fontface_from_font(struct dwrite_font *font, IDWriteFontFace3
return hr;
}
-static HRESULT WINAPI dwritefont_QueryInterface(IDWriteFont2 *iface, REFIID riid, void **obj)
+static HRESULT WINAPI dwritefont_QueryInterface(IDWriteFont3 *iface, REFIID riid, void **obj)
{
- struct dwrite_font *This = impl_from_IDWriteFont2(iface);
+ struct dwrite_font *This = impl_from_IDWriteFont3(iface);
TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), obj);
@@ -1235,7 +1235,7 @@ static HRESULT WINAPI dwritefont_QueryInterface(IDWriteFont2 *iface, REFIID riid
IsEqualIID(riid, &IID_IUnknown))
{
*obj = iface;
- IDWriteFont2_AddRef(iface);
+ IDWriteFont3_AddRef(iface);
return S_OK;
}
@@ -1243,17 +1243,17 @@ static HRESULT WINAPI dwritefont_QueryInterface(IDWriteFont2 *iface, REFIID riid
return E_NOINTERFACE;
}
-static ULONG WINAPI dwritefont_AddRef(IDWriteFont2 *iface)
+static ULONG WINAPI dwritefont_AddRef(IDWriteFont3 *iface)
{
- struct dwrite_font *This = impl_from_IDWriteFont2(iface);
+ struct dwrite_font *This = impl_from_IDWriteFont3(iface);
ULONG ref = InterlockedIncrement(&This->ref);
TRACE("(%p)->(%d)\n", This, ref);
return ref;
}
-static ULONG WINAPI dwritefont_Release(IDWriteFont2 *iface)
+static ULONG WINAPI dwritefont_Release(IDWriteFont3 *iface)
{
- struct dwrite_font *This = impl_from_IDWriteFont2(iface);
+ struct dwrite_font *This = impl_from_IDWriteFont3(iface);
ULONG ref = InterlockedDecrement(&This->ref);
TRACE("(%p)->(%d)\n", This, ref);
@@ -1267,9 +1267,9 @@ static ULONG WINAPI dwritefont_Release(IDWriteFont2 *iface)
return ref;
}
-static HRESULT WINAPI dwritefont_GetFontFamily(IDWriteFont2 *iface, IDWriteFontFamily **family)
+static HRESULT WINAPI dwritefont_GetFontFamily(IDWriteFont3 *iface, IDWriteFontFamily **family)
{
- struct dwrite_font *This = impl_from_IDWriteFont2(iface);
+ struct dwrite_font *This = impl_from_IDWriteFont3(iface);
TRACE("(%p)->(%p)\n", This, family);
*family = This->family;
@@ -1277,30 +1277,30 @@ static HRESULT WINAPI dwritefont_GetFontFamily(IDWriteFont2 *iface, IDWriteFontF
return S_OK;
}
-static DWRITE_FONT_WEIGHT WINAPI dwritefont_GetWeight(IDWriteFont2 *iface)
+static DWRITE_FONT_WEIGHT WINAPI dwritefont_GetWeight(IDWriteFont3 *iface)
{
- struct dwrite_font *This = impl_from_IDWriteFont2(iface);
+ struct dwrite_font *This = impl_from_IDWriteFont3(iface);
TRACE("(%p)\n", This);
return This->data->weight;
}
-static DWRITE_FONT_STRETCH WINAPI dwritefont_GetStretch(IDWriteFont2 *iface)
+static DWRITE_FONT_STRETCH WINAPI dwritefont_GetStretch(IDWriteFont3 *iface)
{
- struct dwrite_font *This = impl_from_IDWriteFont2(iface);
+ struct dwrite_font *This = impl_from_IDWriteFont3(iface);
TRACE("(%p)\n", This);
return This->data->stretch;
}
-static DWRITE_FONT_STYLE WINAPI dwritefont_GetStyle(IDWriteFont2 *iface)
+static DWRITE_FONT_STYLE WINAPI dwritefont_GetStyle(IDWriteFont3 *iface)
{
- struct dwrite_font *This = impl_from_IDWriteFont2(iface);
+ struct dwrite_font *This = impl_from_IDWriteFont3(iface);
TRACE("(%p)\n", This);
return This->style;
}
-static BOOL WINAPI dwritefont_IsSymbolFont(IDWriteFont2 *iface)
+static BOOL WINAPI dwritefont_IsSymbolFont(IDWriteFont3 *iface)
{
- struct dwrite_font *This = impl_from_IDWriteFont2(iface);
+ struct dwrite_font *This = impl_from_IDWriteFont3(iface);
IDWriteFontFace3 *fontface;
HRESULT hr;
@@ -1313,17 +1313,17 @@ static BOOL WINAPI dwritefont_IsSymbolFont(IDWriteFont2 *iface)
return IDWriteFontFace3_IsSymbolFont(fontface);
}
-static HRESULT WINAPI dwritefont_GetFaceNames(IDWriteFont2 *iface, IDWriteLocalizedStrings **names)
+static HRESULT WINAPI dwritefont_GetFaceNames(IDWriteFont3 *iface, IDWriteLocalizedStrings **names)
{
- struct dwrite_font *This = impl_from_IDWriteFont2(iface);
+ struct dwrite_font *This = impl_from_IDWriteFont3(iface);
TRACE("(%p)->(%p)\n", This, names);
return clone_localizedstring(This->data->names, names);
}
-static HRESULT WINAPI dwritefont_GetInformationalStrings(IDWriteFont2 *iface,
+static HRESULT WINAPI dwritefont_GetInformationalStrings(IDWriteFont3 *iface,
DWRITE_INFORMATIONAL_STRING_ID stringid, IDWriteLocalizedStrings **strings, BOOL *exists)
{
- struct dwrite_font *This = impl_from_IDWriteFont2(iface);
+ struct dwrite_font *This = impl_from_IDWriteFont3(iface);
struct dwrite_font_data *data = This->data;
HRESULT hr;
@@ -1367,24 +1367,24 @@ static HRESULT WINAPI dwritefont_GetInformationalStrings(IDWriteFont2 *iface,
return S_OK;
}
-static DWRITE_FONT_SIMULATIONS WINAPI dwritefont_GetSimulations(IDWriteFont2 *iface)
+static DWRITE_FONT_SIMULATIONS WINAPI dwritefont_GetSimulations(IDWriteFont3 *iface)
{
- struct dwrite_font *This = impl_from_IDWriteFont2(iface);
+ struct dwrite_font *This = impl_from_IDWriteFont3(iface);
TRACE("(%p)\n", This);
return This->data->simulations;
}
-static void WINAPI dwritefont_GetMetrics(IDWriteFont2 *iface, DWRITE_FONT_METRICS *metrics)
+static void WINAPI dwritefont_GetMetrics(IDWriteFont3 *iface, DWRITE_FONT_METRICS *metrics)
{
- struct dwrite_font *This = impl_from_IDWriteFont2(iface);
+ struct dwrite_font *This = impl_from_IDWriteFont3(iface);
TRACE("(%p)->(%p)\n", This, metrics);
memcpy(metrics, &This->data->metrics, sizeof(*metrics));
}
-static HRESULT WINAPI dwritefont_HasCharacter(IDWriteFont2 *iface, UINT32 value, BOOL *exists)
+static HRESULT WINAPI dwritefont_HasCharacter(IDWriteFont3 *iface, UINT32 value, BOOL *exists)
{
- struct dwrite_font *This = impl_from_IDWriteFont2(iface);
+ struct dwrite_font *This = impl_from_IDWriteFont3(iface);
IDWriteFontFace3 *fontface;
UINT16 index;
HRESULT hr;
@@ -1406,9 +1406,9 @@ static HRESULT WINAPI dwritefont_HasCharacter(IDWriteFont2 *iface, UINT32 value,
return S_OK;
}
-static HRESULT WINAPI dwritefont_CreateFontFace(IDWriteFont2 *iface, IDWriteFontFace **face)
+static HRESULT WINAPI dwritefont_CreateFontFace(IDWriteFont3 *iface, IDWriteFontFace **face)
{
- struct dwrite_font *This = impl_from_IDWriteFont2(iface);
+ struct dwrite_font *This = impl_from_IDWriteFont3(iface);
HRESULT hr;
TRACE("(%p)->(%p)\n", This, face);
@@ -1420,23 +1420,23 @@ static HRESULT WINAPI dwritefont_CreateFontFace(IDWriteFont2 *iface, IDWriteFont
return hr;
}
-static void WINAPI dwritefont1_GetMetrics(IDWriteFont2 *iface, DWRITE_FONT_METRICS1 *metrics)
+static void WINAPI dwritefont1_GetMetrics(IDWriteFont3 *iface, DWRITE_FONT_METRICS1 *metrics)
{
- struct dwrite_font *This = impl_from_IDWriteFont2(iface);
+ struct dwrite_font *This = impl_from_IDWriteFont3(iface);
TRACE("(%p)->(%p)\n", This, metrics);
*metrics = This->data->metrics;
}
-static void WINAPI dwritefont1_GetPanose(IDWriteFont2 *iface, DWRITE_PANOSE *panose)
+static void WINAPI dwritefont1_GetPanose(IDWriteFont3 *iface, DWRITE_PANOSE *panose)
{
- struct dwrite_font *This = impl_from_IDWriteFont2(iface);
+ struct dwrite_font *This = impl_from_IDWriteFont3(iface);
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)
+static HRESULT WINAPI dwritefont1_GetUnicodeRanges(IDWriteFont3 *iface, UINT32 max_count, DWRITE_UNICODE_RANGE *ranges, UINT32 *count)
{
- struct dwrite_font *This = impl_from_IDWriteFont2(iface);
+ struct dwrite_font *This = impl_from_IDWriteFont3(iface);
IDWriteFontFace3 *fontface;
HRESULT hr;
@@ -1449,9 +1449,9 @@ static HRESULT WINAPI dwritefont1_GetUnicodeRanges(IDWriteFont2 *iface, UINT32 m
return IDWriteFontFace3_GetUnicodeRanges(fontface, max_count, ranges, count);
}
-static BOOL WINAPI dwritefont1_IsMonospacedFont(IDWriteFont2 *iface)
+static BOOL WINAPI dwritefont1_IsMonospacedFont(IDWriteFont3 *iface)
{
- struct dwrite_font *This = impl_from_IDWriteFont2(iface);
+ struct dwrite_font *This = impl_from_IDWriteFont3(iface);
IDWriteFontFace3 *fontface;
HRESULT hr;
@@ -1464,9 +1464,9 @@ static BOOL WINAPI dwritefont1_IsMonospacedFont(IDWriteFont2 *iface)
return IDWriteFontFace3_IsMonospacedFont(fontface);
}
-static BOOL WINAPI dwritefont2_IsColorFont(IDWriteFont2 *iface)
+static BOOL WINAPI dwritefont2_IsColorFont(IDWriteFont3 *iface)
{
- struct dwrite_font *This = impl_from_IDWriteFont2(iface);
+ struct dwrite_font *This = impl_from_IDWriteFont3(iface);
IDWriteFontFace3 *fontface;
HRESULT hr;
@@ -1479,7 +1479,42 @@ static BOOL WINAPI dwritefont2_IsColorFont(IDWriteFont2 *iface)
return IDWriteFontFace3_IsColorFont(fontface);
}
-static const IDWriteFont2Vtbl dwritefontvtbl = {
+static HRESULT WINAPI dwritefont3_CreateFontFace(IDWriteFont3 *iface, IDWriteFontFace3 **fontface)
+{
+ struct dwrite_font *This = impl_from_IDWriteFont3(iface);
+ FIXME("(%p)->(%p): stub\n", This, fontface);
+ return E_NOTIMPL;
+}
+
+static BOOL WINAPI dwritefont3_Equals(IDWriteFont3 *iface, IDWriteFont *font)
+{
+ struct dwrite_font *This = impl_from_IDWriteFont3(iface);
+ FIXME("(%p)->(%p): stub\n", This, font);
+ return FALSE;
+}
+
+static HRESULT WINAPI dwritefont3_GetFontFaceReference(IDWriteFont3 *iface, IDWriteFontFaceReference **reference)
+{
+ struct dwrite_font *This = impl_from_IDWriteFont3(iface);
+ FIXME("(%p)->(%p): stub\n", This, reference);
+ return E_NOTIMPL;
+}
+
+static BOOL WINAPI dwritefont3_HasCharacter(IDWriteFont3 *iface, UINT32 ch)
+{
+ struct dwrite_font *This = impl_from_IDWriteFont3(iface);
+ FIXME("(%p)->(0x%x): stub\n", This, ch);
+ return FALSE;
+}
+
+static DWRITE_LOCALITY WINAPI dwritefont3_GetLocality(IDWriteFont3 *iface)
+{
+ struct dwrite_font *This = impl_from_IDWriteFont3(iface);
+ FIXME("(%p): stub\n", This);
+ return DWRITE_LOCALITY_LOCAL;
+}
+
+static const IDWriteFont3Vtbl dwritefontvtbl = {
dwritefont_QueryInterface,
dwritefont_AddRef,
dwritefont_Release,
@@ -1498,7 +1533,12 @@ static const IDWriteFont2Vtbl dwritefontvtbl = {
dwritefont1_GetPanose,
dwritefont1_GetUnicodeRanges,
dwritefont1_IsMonospacedFont,
- dwritefont2_IsColorFont
+ dwritefont2_IsColorFont,
+ dwritefont3_CreateFontFace,
+ dwritefont3_Equals,
+ dwritefont3_GetFontFaceReference,
+ dwritefont3_HasCharacter,
+ dwritefont3_GetLocality
};
static HRESULT create_font(struct dwrite_font_data *data, IDWriteFontFamily *family, IDWriteFont **font)
@@ -1509,7 +1549,7 @@ static HRESULT create_font(struct dwrite_font_data *data, IDWriteFontFamily *fam
This = heap_alloc(sizeof(struct dwrite_font));
if (!This) return E_OUTOFMEMORY;
- This->IDWriteFont2_iface.lpVtbl = &dwritefontvtbl;
+ This->IDWriteFont3_iface.lpVtbl = &dwritefontvtbl;
This->ref = 1;
This->family = family;
IDWriteFontFamily_AddRef(family);
@@ -1517,7 +1557,7 @@ static HRESULT create_font(struct dwrite_font_data *data, IDWriteFontFamily *fam
This->data = data;
InterlockedIncrement(&This->data->ref);
- *font = (IDWriteFont*)&This->IDWriteFont2_iface;
+ *font = (IDWriteFont*)&This->IDWriteFont3_iface;
return S_OK;
}
diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c
index cd63ce7..0e3f6ee 100644
--- a/dlls/dwrite/tests/font.c
+++ b/dlls/dwrite/tests/font.c
@@ -26,7 +26,7 @@
#include "windows.h"
#include "winternl.h"
-#include "dwrite_2.h"
+#include "dwrite_3.h"
#include "initguid.h"
#include "d2d1.h"
@@ -2415,8 +2415,6 @@ static void test_GetFontFromFontFace(void)
DELETE_FONTFILE(path);
}
-
-
static void test_GetFirstMatchingFont(void)
{
DWRITE_FONT_SIMULATIONS simulations;
@@ -5268,6 +5266,39 @@ static void test_TranslateColorGlyphRun(void)
IDWriteFactory2_Release(factory2);
}
+static void test_HasCharacter(void)
+{
+ IDWriteFactory3 *factory3;
+ IDWriteFactory *factory;
+ IDWriteFont3 *font3;
+ IDWriteFont *font;
+ HRESULT hr;
+ BOOL ret;
+
+ factory = create_factory();
+
+ font = get_tahoma_instance(factory, DWRITE_FONT_STYLE_NORMAL);
+ ok(font != NULL, "failed to create font\n");
+
+ /* Win8 is broken, QI claims to support IDWriteFont3, but in fact it does not */
+ hr = IDWriteFactory_QueryInterface(factory, &IID_IDWriteFactory3, (void**)&factory3);
+ if (hr == S_OK) {
+ hr = IDWriteFont_QueryInterface(font, &IID_IDWriteFont3, (void**)&font3);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+
+ ret = IDWriteFont3_HasCharacter(font3, 'A');
+ ok(ret, "got %d\n", ret);
+
+ IDWriteFont3_Release(font3);
+ IDWriteFactory3_Release(factory3);
+ }
+ else
+ skip("IDWriteFont3 is not supported.\n");
+
+ IDWriteFont_Release(font);
+ IDWriteFactory_Release(factory);
+}
+
START_TEST(font)
{
IDWriteFactory *factory;
@@ -5320,6 +5351,7 @@ START_TEST(font)
test_IsSymbolFont();
test_GetPaletteEntries();
test_TranslateColorGlyphRun();
+ test_HasCharacter();
IDWriteFactory_Release(factory);
}
diff --git a/include/dwrite_3.idl b/include/dwrite_3.idl
index dc19cf9..967cd95 100644
--- a/include/dwrite_3.idl
+++ b/include/dwrite_3.idl
@@ -252,3 +252,12 @@ interface IDWriteTextLayout3 : IDWriteTextLayout2
HRESULT GetLineSpacing(DWRITE_LINE_SPACING *spacing);
HRESULT GetLineMetrics(DWRITE_LINE_METRICS1 *metrics, UINT32 max_count, UINT32 *count);
}
+
+[
+ local,
+ object,
+ uuid(9a1b41c3-d3bb-466a-87fc-fe67556a3b65)
+]
+interface IDWriteFactory3 : IDWriteFactory2
+{
+}
--
2.7.0
More information about the wine-patches
mailing list