dwrite: Update to IDWriteFont3.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
oldstable
Nikolay Sivov 2016-03-07 17:10:17 +03:00 committed by Alexandre Julliard
parent 27ca16c7c9
commit fa6c255f8d
3 changed files with 130 additions and 49 deletions

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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
{
}