From 56d71b04b7c3f40f152acb43e68f69141d5a16d6 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Mon, 13 Aug 2012 07:44:19 +0400 Subject: [PATCH] dwrite: Added IDWriteFont stub. --- dlls/dwrite/Makefile.in | 1 + dlls/dwrite/dwrite_private.h | 11 +++ dlls/dwrite/font.c | 184 +++++++++++++++++++++++++++++++++++ dlls/dwrite/gdiinterop.c | 3 +- dlls/dwrite/tests/font.c | 5 +- 5 files changed, 199 insertions(+), 5 deletions(-) create mode 100644 dlls/dwrite/font.c diff --git a/dlls/dwrite/Makefile.in b/dlls/dwrite/Makefile.in index 03220d12947..f4ee7ae6314 100644 --- a/dlls/dwrite/Makefile.in +++ b/dlls/dwrite/Makefile.in @@ -2,6 +2,7 @@ MODULE = dwrite.dll IMPORTLIB = dwrite C_SRCS = \ + font.c \ gdiinterop.c \ main.c diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h index 59ca09e2540..c52b93a47cb 100644 --- a/dlls/dwrite/dwrite_private.h +++ b/dlls/dwrite/dwrite_private.h @@ -16,4 +16,15 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +static inline void *heap_alloc(size_t len) +{ + return HeapAlloc(GetProcessHeap(), 0, len); +} + +static inline BOOL heap_free(void *mem) +{ + return HeapFree(GetProcessHeap(), 0, mem); +} + extern HRESULT create_gdiinterop(IDWriteGdiInterop**) DECLSPEC_HIDDEN; +extern HRESULT create_font(IDWriteFont**) DECLSPEC_HIDDEN; diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c new file mode 100644 index 00000000000..29dd63c3bf0 --- /dev/null +++ b/dlls/dwrite/font.c @@ -0,0 +1,184 @@ +/* + * Font and collections + * + * Copyright 2012 Nikolay Sivov for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#define COBJMACROS + +#include "dwrite.h" +#include "dwrite_private.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(dwrite); + +struct dwrite_font { + IDWriteFont IDWriteFont_iface; + LONG ref; +}; + +static inline struct dwrite_font *impl_from_IDWriteFont(IDWriteFont *iface) +{ + return CONTAINING_RECORD(iface, struct dwrite_font, IDWriteFont_iface); +} + +static HRESULT WINAPI dwritefont_QueryInterface(IDWriteFont *iface, REFIID riid, void **obj) +{ + struct dwrite_font *This = impl_from_IDWriteFont(iface); + + TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), obj); + + if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IDWriteFont)) + { + *obj = iface; + IDWriteFont_AddRef(iface); + return S_OK; + } + + *obj = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI dwritefont_AddRef(IDWriteFont *iface) +{ + struct dwrite_font *This = impl_from_IDWriteFont(iface); + ULONG ref = InterlockedIncrement(&This->ref); + TRACE("(%p)->(%d)\n", This, ref); + return ref; +} + +static ULONG WINAPI dwritefont_Release(IDWriteFont *iface) +{ + struct dwrite_font *This = impl_from_IDWriteFont(iface); + ULONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p)->(%d)\n", This, ref); + + if (!ref) + heap_free(This); + + return S_OK; +} + +static HRESULT WINAPI dwritefont_GetFontFamily(IDWriteFont *iface, IDWriteFontFamily **family) +{ + struct dwrite_font *This = impl_from_IDWriteFont(iface); + FIXME("(%p)->(%p): stub\n", This, family); + return E_NOTIMPL; +} + +static DWRITE_FONT_WEIGHT WINAPI dwritefont_GetWeight(IDWriteFont *iface) +{ + struct dwrite_font *This = impl_from_IDWriteFont(iface); + FIXME("(%p): stub\n", This); + return DWRITE_FONT_WEIGHT_NORMAL; +} + +static DWRITE_FONT_STRETCH WINAPI dwritefont_GetStretch(IDWriteFont *iface) +{ + struct dwrite_font *This = impl_from_IDWriteFont(iface); + FIXME("(%p): stub\n", This); + return DWRITE_FONT_STRETCH_UNDEFINED; +} + +static DWRITE_FONT_STYLE WINAPI dwritefont_GetStyle(IDWriteFont *iface) +{ + struct dwrite_font *This = impl_from_IDWriteFont(iface); + FIXME("(%p): stub\n", This); + return DWRITE_FONT_STYLE_NORMAL; +} + +static BOOL WINAPI dwritefont_IsSymbolFont(IDWriteFont *iface) +{ + struct dwrite_font *This = impl_from_IDWriteFont(iface); + FIXME("(%p): stub\n", This); + return FALSE; +} + +static HRESULT WINAPI dwritefont_GetFaceNames(IDWriteFont *iface, IDWriteLocalizedStrings **names) +{ + struct dwrite_font *This = impl_from_IDWriteFont(iface); + FIXME("(%p)->(%p): stub\n", This, names); + return E_NOTIMPL; +} + +static HRESULT WINAPI dwritefont_GetInformationalStrings(IDWriteFont *iface, + DWRITE_INFORMATIONAL_STRING_ID stringid, IDWriteLocalizedStrings **strings, BOOL *exists) +{ + struct dwrite_font *This = impl_from_IDWriteFont(iface); + FIXME("(%p)->(%d %p %p): stub\n", This, stringid, strings, exists); + return E_NOTIMPL; +} + +static DWRITE_FONT_SIMULATIONS WINAPI dwritefont_GetSimulations(IDWriteFont *iface) +{ + struct dwrite_font *This = impl_from_IDWriteFont(iface); + FIXME("(%p): stub\n", This); + return DWRITE_FONT_SIMULATIONS_NONE; +} + +static void WINAPI dwritefont_GetMetrics(IDWriteFont *iface, DWRITE_FONT_METRICS *metrics) +{ + struct dwrite_font *This = impl_from_IDWriteFont(iface); + FIXME("(%p)->(%p): stub\n", This, metrics); +} + +static HRESULT WINAPI dwritefont_HasCharacter(IDWriteFont *iface, UINT32 value, BOOL *exists) +{ + struct dwrite_font *This = impl_from_IDWriteFont(iface); + FIXME("(%p)->(0x%08x %p): stub\n", This, value, exists); + return E_NOTIMPL; +} + +static HRESULT WINAPI dwritefont_CreateFontFace(IDWriteFont *iface, IDWriteFontFace **face) +{ + struct dwrite_font *This = impl_from_IDWriteFont(iface); + FIXME("(%p)->(%p): stub\n", This, face); + return E_NOTIMPL; +} + +static const IDWriteFontVtbl dwritefontvtbl = { + dwritefont_QueryInterface, + dwritefont_AddRef, + dwritefont_Release, + dwritefont_GetFontFamily, + dwritefont_GetWeight, + dwritefont_GetStretch, + dwritefont_GetStyle, + dwritefont_IsSymbolFont, + dwritefont_GetFaceNames, + dwritefont_GetInformationalStrings, + dwritefont_GetSimulations, + dwritefont_GetMetrics, + dwritefont_HasCharacter, + dwritefont_CreateFontFace +}; + +HRESULT create_font(IDWriteFont **font) +{ + struct dwrite_font *This; + + This = heap_alloc(sizeof(struct dwrite_font)); + if (!This) return E_OUTOFMEMORY; + + This->IDWriteFont_iface.lpVtbl = &dwritefontvtbl; + This->ref = 1; + *font = &This->IDWriteFont_iface; + + return S_OK; +} diff --git a/dlls/dwrite/gdiinterop.c b/dlls/dwrite/gdiinterop.c index 8215185b735..d3747242158 100644 --- a/dlls/dwrite/gdiinterop.c +++ b/dlls/dwrite/gdiinterop.c @@ -23,6 +23,7 @@ #include "windef.h" #include "winbase.h" #include "dwrite.h" +#include "dwrite_private.h" #include "wine/debug.h" @@ -60,7 +61,7 @@ static HRESULT WINAPI gdiinterop_CreateFontFromLOGFONT(IDWriteGdiInterop *iface, if (!logfont) return E_INVALIDARG; - return E_NOTIMPL; + return create_font(font); } static HRESULT WINAPI gdiinterop_ConvertFontToLOGFONT(IDWriteGdiInterop *iface, diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c index fa345e3b3e3..520fc1bb1a1 100644 --- a/dlls/dwrite/tests/font.c +++ b/dlls/dwrite/tests/font.c @@ -61,23 +61,20 @@ if (0) lstrcpyW(logfont.lfFaceName, arialW); hr = IDWriteGdiInterop_CreateFontFromLOGFONT(interop, &logfont, &font); -todo_wine EXPECT_HR(hr, S_OK); -if (hr == S_OK) -{ /* now check properties */ weight = IDWriteFont_GetWeight(font); ok(weight == DWRITE_FONT_WEIGHT_NORMAL, "got %d\n", weight); style = IDWriteFont_GetStyle(font); +todo_wine ok(style == DWRITE_FONT_STYLE_ITALIC, "got %d\n", style); ret = IDWriteFont_IsSymbolFont(font); ok(!ret, "got %d\n", ret); IDWriteFont_Release(font); -} IDWriteGdiInterop_Release(interop); }