[PATCH 9/9] dwrite: Use IDWriteFactory7 for gdiinterop.

Nikolay Sivov nsivov at codeweavers.com
Thu Dec 5 02:56:05 CST 2019


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/dwrite/dwrite_private.h |   4 +-
 dlls/dwrite/gdiinterop.c     | 162 +++++++++++++++++++----------------
 dlls/dwrite/main.c           |   8 +-
 3 files changed, 93 insertions(+), 81 deletions(-)

diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h
index 871f93b60b..c2aef6b77c 100644
--- a/dlls/dwrite/dwrite_private.h
+++ b/dlls/dwrite/dwrite_private.h
@@ -269,14 +269,14 @@ extern HRESULT create_fontfacereference(IDWriteFactory7 *factory, IDWriteFontFil
 extern HRESULT factory_get_cached_fontface(IDWriteFactory7 *factory, IDWriteFontFile * const *files, UINT32 num_files,
         DWRITE_FONT_SIMULATIONS simulations, struct list **cache, REFIID riid, void **obj) DECLSPEC_HIDDEN;
 extern void factory_detach_fontcollection(IDWriteFactory7 *factory, IDWriteFontCollection3 *collection) DECLSPEC_HIDDEN;
-extern void factory_detach_gdiinterop(IDWriteFactory5*,IDWriteGdiInterop1*) DECLSPEC_HIDDEN;
+extern void factory_detach_gdiinterop(IDWriteFactory7 *factory, IDWriteGdiInterop1 *interop) DECLSPEC_HIDDEN;
 extern struct fontfacecached *factory_cache_fontface(IDWriteFactory7 *factory, struct list *fontfaces,
         IDWriteFontFace5 *fontface) DECLSPEC_HIDDEN;
 extern void    get_logfont_from_font(IDWriteFont*,LOGFONTW*) DECLSPEC_HIDDEN;
 extern void    get_logfont_from_fontface(IDWriteFontFace*,LOGFONTW*) DECLSPEC_HIDDEN;
 extern HRESULT get_fontsig_from_font(IDWriteFont*,FONTSIGNATURE*) DECLSPEC_HIDDEN;
 extern HRESULT get_fontsig_from_fontface(IDWriteFontFace*,FONTSIGNATURE*) DECLSPEC_HIDDEN;
-extern HRESULT create_gdiinterop(IDWriteFactory5*,IDWriteGdiInterop1**) DECLSPEC_HIDDEN;
+extern HRESULT create_gdiinterop(IDWriteFactory7 *factory, IDWriteGdiInterop1 **interop) DECLSPEC_HIDDEN;
 extern void fontface_detach_from_cache(IDWriteFontFace5 *fontface) DECLSPEC_HIDDEN;
 extern void factory_lock(IDWriteFactory7 *factory) DECLSPEC_HIDDEN;
 extern void factory_unlock(IDWriteFactory7 *factory) DECLSPEC_HIDDEN;
diff --git a/dlls/dwrite/gdiinterop.c b/dlls/dwrite/gdiinterop.c
index 2e4a949286..7e88f7490c 100644
--- a/dlls/dwrite/gdiinterop.c
+++ b/dlls/dwrite/gdiinterop.c
@@ -38,12 +38,13 @@ struct dib_data {
     int width;
 };
 
-struct rendertarget {
+struct rendertarget
+{
     IDWriteBitmapRenderTarget1 IDWriteBitmapRenderTarget1_iface;
     ID2D1SimplifiedGeometrySink ID2D1SimplifiedGeometrySink_iface;
-    LONG ref;
+    LONG refcount;
 
-    IDWriteFactory5 *factory;
+    IDWriteFactory7 *factory;
     DWRITE_TEXT_ANTIALIAS_MODE antialiasmode;
     FLOAT ppdip;
     DWRITE_MATRIX m;
@@ -52,11 +53,12 @@ struct rendertarget {
     struct dib_data dib;
 };
 
-struct gdiinterop {
+struct gdiinterop
+{
     IDWriteGdiInterop1 IDWriteGdiInterop1_iface;
     IDWriteFontFileLoader IDWriteFontFileLoader_iface;
-    LONG ref;
-    IDWriteFactory5 *factory;
+    LONG refcount;
+    IDWriteFactory7 *factory;
 };
 
 struct memresource_stream {
@@ -249,27 +251,29 @@ static HRESULT WINAPI rendertarget_QueryInterface(IDWriteBitmapRenderTarget1 *if
 
 static ULONG WINAPI rendertarget_AddRef(IDWriteBitmapRenderTarget1 *iface)
 {
-    struct rendertarget *This = impl_from_IDWriteBitmapRenderTarget1(iface);
-    ULONG ref = InterlockedIncrement(&This->ref);
-    TRACE("(%p)->(%d)\n", This, ref);
-    return ref;
+    struct rendertarget *target = impl_from_IDWriteBitmapRenderTarget1(iface);
+    ULONG refcount = InterlockedIncrement(&target->refcount);
+
+    TRACE("%p, refcount %u.\n", iface, refcount);
+
+    return refcount;
 }
 
 static ULONG WINAPI rendertarget_Release(IDWriteBitmapRenderTarget1 *iface)
 {
-    struct rendertarget *This = impl_from_IDWriteBitmapRenderTarget1(iface);
-    ULONG ref = InterlockedDecrement(&This->ref);
+    struct rendertarget *target = impl_from_IDWriteBitmapRenderTarget1(iface);
+    ULONG refcount = InterlockedDecrement(&target->refcount);
 
-    TRACE("(%p)->(%d)\n", This, ref);
+    TRACE("%p, refcount %u.\n", iface, refcount);
 
-    if (!ref)
+    if (!refcount)
     {
-        IDWriteFactory5_Release(This->factory);
-        DeleteDC(This->hdc);
-        heap_free(This);
+        IDWriteFactory7_Release(target->factory);
+        DeleteDC(target->hdc);
+        heap_free(target);
     }
 
-    return ref;
+    return refcount;
 }
 
 static inline DWORD *get_pixel_ptr_32(struct dib_data *dib, int x, int y)
@@ -341,22 +345,22 @@ static HRESULT WINAPI rendertarget_DrawGlyphRun(IDWriteBitmapRenderTarget1 *ifac
     DWRITE_GLYPH_RUN const *run, IDWriteRenderingParams *params, COLORREF color,
     RECT *bbox_ret)
 {
-    struct rendertarget *This = impl_from_IDWriteBitmapRenderTarget1(iface);
+    struct rendertarget *target = impl_from_IDWriteBitmapRenderTarget1(iface);
     IDWriteGlyphRunAnalysis *analysis;
     DWRITE_RENDERING_MODE1 rendermode;
     DWRITE_GRID_FIT_MODE gridfitmode;
     DWRITE_TEXTURE_TYPE texturetype;
     DWRITE_GLYPH_RUN scaled_run;
     IDWriteFontFace3 *fontface;
-    RECT target, bounds;
+    RECT target_rect, bounds;
     HRESULT hr;
 
-    TRACE("(%p)->(%.2f %.2f %d %p %p 0x%08x %p)\n", This, originX, originY,
+    TRACE("%p, %.8e, %.8e, %d, %p, %p, 0x%08x, %p.\n", iface, originX, originY,
         measuring_mode, run, params, color, bbox_ret);
 
     SetRectEmpty(bbox_ret);
 
-    if (!This->dib.ptr)
+    if (!target->dib.ptr)
         return S_OK;
 
     if (!params)
@@ -367,18 +371,19 @@ static HRESULT WINAPI rendertarget_DrawGlyphRun(IDWriteBitmapRenderTarget1 *ifac
         return hr;
     }
 
-    hr = IDWriteFontFace3_GetRecommendedRenderingMode(fontface, run->fontEmSize, This->ppdip * 96.0f,
-            This->ppdip * 96.0f, NULL /* FIXME */, run->isSideways, DWRITE_OUTLINE_THRESHOLD_ALIASED, measuring_mode,
+    hr = IDWriteFontFace3_GetRecommendedRenderingMode(fontface, run->fontEmSize, target->ppdip * 96.0f,
+            target->ppdip * 96.0f, NULL /* FIXME */, run->isSideways, DWRITE_OUTLINE_THRESHOLD_ALIASED, measuring_mode,
             params, &rendermode, &gridfitmode);
     IDWriteFontFace3_Release(fontface);
     if (FAILED(hr))
         return hr;
 
-    SetRect(&target, 0, 0, This->size.cx, This->size.cy);
+    SetRect(&target_rect, 0, 0, target->size.cx, target->size.cy);
 
-    if (rendermode == DWRITE_RENDERING_MODE1_OUTLINE) {
+    if (rendermode == DWRITE_RENDERING_MODE1_OUTLINE)
+    {
         static const XFORM identity = { 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f };
-        const DWRITE_MATRIX *m = &This->m;
+        const DWRITE_MATRIX *m = &target->m;
         XFORM xform;
 
         /* target allows any transform to be set, filter it here */
@@ -397,40 +402,42 @@ static HRESULT WINAPI rendertarget_DrawGlyphRun(IDWriteBitmapRenderTarget1 *ifac
             xform.eDx  = m->m11 * originX + m->m21 * originY + m->dx;
             xform.eDy  = m->m12 * originX + m->m22 * originY + m->dy;
         }
-        SetWorldTransform(This->hdc, &xform);
+        SetWorldTransform(target->hdc, &xform);
 
-        BeginPath(This->hdc);
+        BeginPath(target->hdc);
 
-        hr = IDWriteFontFace_GetGlyphRunOutline(run->fontFace, run->fontEmSize * This->ppdip,
+        hr = IDWriteFontFace_GetGlyphRunOutline(run->fontFace, run->fontEmSize * target->ppdip,
             run->glyphIndices, run->glyphAdvances, run->glyphOffsets, run->glyphCount,
-            run->isSideways, run->bidiLevel & 1, &This->ID2D1SimplifiedGeometrySink_iface);
+            run->isSideways, run->bidiLevel & 1, &target->ID2D1SimplifiedGeometrySink_iface);
 
-        EndPath(This->hdc);
+        EndPath(target->hdc);
 
-        if (hr == S_OK) {
+        if (hr == S_OK)
+        {
             HBRUSH brush = CreateSolidBrush(color);
 
-            SelectObject(This->hdc, brush);
+            SelectObject(target->hdc, brush);
 
-            FillPath(This->hdc);
+            FillPath(target->hdc);
 
             /* FIXME: one way to get affected rectangle bounds is to use region fill */
             if (bbox_ret)
-                *bbox_ret = target;
+                *bbox_ret = target_rect;
 
             DeleteObject(brush);
         }
 
-        SetWorldTransform(This->hdc, &identity);
+        SetWorldTransform(target->hdc, &identity);
 
         return hr;
     }
 
     scaled_run = *run;
-    scaled_run.fontEmSize *= This->ppdip;
-    hr = IDWriteFactory5_CreateGlyphRunAnalysis(This->factory, &scaled_run, &This->m, rendermode, measuring_mode,
-            gridfitmode, This->antialiasmode, originX, originY, &analysis);
-    if (FAILED(hr)) {
+    scaled_run.fontEmSize *= target->ppdip;
+    hr = IDWriteFactory7_CreateGlyphRunAnalysis(target->factory, &scaled_run, &target->m, rendermode, measuring_mode,
+            gridfitmode, target->antialiasmode, originX, originY, &analysis);
+    if (FAILED(hr))
+    {
         WARN("failed to create analysis instance, 0x%08x\n", hr);
         return hr;
     }
@@ -448,8 +455,9 @@ static HRESULT WINAPI rendertarget_DrawGlyphRun(IDWriteBitmapRenderTarget1 *ifac
         texturetype = DWRITE_TEXTURE_CLEARTYPE_3x1;
     }
 
-    if (IntersectRect(&target, &target, &bounds)) {
-        UINT32 size = (target.right - target.left) * (target.bottom - target.top);
+    if (IntersectRect(&target_rect, &target_rect, &bounds))
+    {
+        UINT32 size = (target_rect.right - target_rect.left) * (target_rect.bottom - target_rect.top);
         BYTE *bitmap;
 
         color = colorref_to_pixel_888(color);
@@ -461,15 +469,15 @@ static HRESULT WINAPI rendertarget_DrawGlyphRun(IDWriteBitmapRenderTarget1 *ifac
             return E_OUTOFMEMORY;
         }
 
-        hr = IDWriteGlyphRunAnalysis_CreateAlphaTexture(analysis, texturetype, &target, bitmap, size);
+        hr = IDWriteGlyphRunAnalysis_CreateAlphaTexture(analysis, texturetype, &target_rect, bitmap, size);
         if (hr == S_OK) {
             /* blit to target dib */
             if (texturetype == DWRITE_TEXTURE_ALIASED_1x1)
-                blit_8(&This->dib, bitmap, &target, color);
+                blit_8(&target->dib, bitmap, &target_rect, color);
             else
-                blit_subpixel_888(&This->dib, This->size.cx, bitmap, &target, color);
+                blit_subpixel_888(&target->dib, target->size.cx, bitmap, &target_rect, color);
 
-            if (bbox_ret) *bbox_ret = target;
+            if (bbox_ret) *bbox_ret = target_rect;
         }
 
         heap_free(bitmap);
@@ -584,7 +592,7 @@ static const IDWriteBitmapRenderTarget1Vtbl rendertargetvtbl = {
     rendertarget_SetTextAntialiasMode
 };
 
-static HRESULT create_rendertarget(IDWriteFactory5 *factory, HDC hdc, UINT32 width, UINT32 height, IDWriteBitmapRenderTarget **ret)
+static HRESULT create_rendertarget(IDWriteFactory7 *factory, HDC hdc, UINT32 width, UINT32 height, IDWriteBitmapRenderTarget **ret)
 {
     struct rendertarget *target;
     HRESULT hr;
@@ -596,7 +604,7 @@ static HRESULT create_rendertarget(IDWriteFactory5 *factory, HDC hdc, UINT32 wid
 
     target->IDWriteBitmapRenderTarget1_iface.lpVtbl = &rendertargetvtbl;
     target->ID2D1SimplifiedGeometrySink_iface.lpVtbl = &rendertargetsinkvtbl;
-    target->ref = 1;
+    target->refcount = 1;
 
     target->hdc = CreateCompatibleDC(hdc);
     SetGraphicsMode(target->hdc, GM_ADVANCED);
@@ -610,7 +618,7 @@ static HRESULT create_rendertarget(IDWriteFactory5 *factory, HDC hdc, UINT32 wid
     target->ppdip = GetDeviceCaps(target->hdc, LOGPIXELSX) / 96.0f;
     target->antialiasmode = DWRITE_TEXT_ANTIALIAS_MODE_CLEARTYPE;
     target->factory = factory;
-    IDWriteFactory5_AddRef(factory);
+    IDWriteFactory7_AddRef(factory);
 
     *ret = (IDWriteBitmapRenderTarget*)&target->IDWriteBitmapRenderTarget1_iface;
 
@@ -640,26 +648,29 @@ static HRESULT WINAPI gdiinterop_QueryInterface(IDWriteGdiInterop1 *iface, REFII
 
 static ULONG WINAPI gdiinterop_AddRef(IDWriteGdiInterop1 *iface)
 {
-    struct gdiinterop *This = impl_from_IDWriteGdiInterop1(iface);
-    LONG ref = InterlockedIncrement(&This->ref);
-    TRACE("(%p)->(%d)\n", This, ref);
-    return ref;
+    struct gdiinterop *interop = impl_from_IDWriteGdiInterop1(iface);
+    LONG refcount = InterlockedIncrement(&interop->refcount);
+
+    TRACE("%p, refcount %u.\n", iface, refcount);
+
+    return refcount;
 }
 
 static ULONG WINAPI gdiinterop_Release(IDWriteGdiInterop1 *iface)
 {
-    struct gdiinterop *This = impl_from_IDWriteGdiInterop1(iface);
-    LONG ref = InterlockedDecrement(&This->ref);
+    struct gdiinterop *interop = impl_from_IDWriteGdiInterop1(iface);
+    LONG refcount = InterlockedDecrement(&interop->refcount);
 
-    TRACE("(%p)->(%d)\n", This, ref);
+    TRACE("%p, refcount %u.\n", iface, refcount);
 
-    if (!ref) {
-        IDWriteFactory5_UnregisterFontFileLoader(This->factory, &This->IDWriteFontFileLoader_iface);
-        factory_detach_gdiinterop(This->factory, iface);
-        heap_free(This);
+    if (!refcount)
+    {
+        IDWriteFactory7_UnregisterFontFileLoader(interop->factory, &interop->IDWriteFontFileLoader_iface);
+        factory_detach_gdiinterop(interop->factory, iface);
+        heap_free(interop);
     }
 
-    return ref;
+    return refcount;
 }
 
 static HRESULT WINAPI gdiinterop_CreateFontFromLOGFONT(IDWriteGdiInterop1 *iface,
@@ -751,7 +762,7 @@ extern BOOL WINAPI GetFontFileData(DWORD instance_id, DWORD unknown, UINT64 offs
 static HRESULT WINAPI gdiinterop_CreateFontFaceFromHdc(IDWriteGdiInterop1 *iface,
     HDC hdc, IDWriteFontFace **fontface)
 {
-    struct gdiinterop *This = impl_from_IDWriteGdiInterop1(iface);
+    struct gdiinterop *interop = impl_from_IDWriteGdiInterop1(iface);
     struct font_realization_info info;
     struct font_fileinfo *fileinfo;
     DWRITE_FONT_FILE_TYPE filetype;
@@ -762,7 +773,7 @@ static HRESULT WINAPI gdiinterop_CreateFontFaceFromHdc(IDWriteGdiInterop1 *iface
     SIZE_T needed;
     HRESULT hr;
 
-    TRACE("(%p)->(%p %p)\n", This, hdc, fontface);
+    TRACE("%p, %p, %p.\n", iface, hdc, fontface);
 
     *fontface = NULL;
 
@@ -793,10 +804,10 @@ static HRESULT WINAPI gdiinterop_CreateFontFaceFromHdc(IDWriteGdiInterop1 *iface
     }
 
     if (*fileinfo->path)
-        hr = IDWriteFactory5_CreateFontFileReference(This->factory, fileinfo->path, &fileinfo->writetime, &file);
+        hr = IDWriteFactory7_CreateFontFileReference(interop->factory, fileinfo->path, &fileinfo->writetime, &file);
     else
-        hr = IDWriteFactory5_CreateCustomFontFileReference(This->factory, &info.instance_id, sizeof(info.instance_id),
-            &This->IDWriteFontFileLoader_iface, &file);
+        hr = IDWriteFactory7_CreateCustomFontFileReference(interop->factory, &info.instance_id,
+                sizeof(info.instance_id), &interop->IDWriteFontFileLoader_iface, &file);
 
     heap_free(fileinfo);
     if (FAILED(hr))
@@ -807,7 +818,7 @@ static HRESULT WINAPI gdiinterop_CreateFontFaceFromHdc(IDWriteGdiInterop1 *iface
     if (SUCCEEDED(hr)) {
         if (is_supported)
             /* Simulations flags values match DWRITE_FONT_SIMULATIONS */
-            hr = IDWriteFactory5_CreateFontFace(This->factory, facetype, 1, &file, info.face_index,
+            hr = IDWriteFactory7_CreateFontFace(interop->factory, facetype, 1, &file, info.face_index,
                     info.simulations, fontface);
         else
             hr = DWRITE_E_FILEFORMAT;
@@ -828,14 +839,14 @@ static HRESULT WINAPI gdiinterop_CreateBitmapRenderTarget(IDWriteGdiInterop1 *if
 static HRESULT WINAPI gdiinterop1_CreateFontFromLOGFONT(IDWriteGdiInterop1 *iface,
     LOGFONTW const *logfont, IDWriteFontCollection *collection, IDWriteFont **font)
 {
-    struct gdiinterop *This = impl_from_IDWriteGdiInterop1(iface);
+    struct gdiinterop *interop = impl_from_IDWriteGdiInterop1(iface);
     IDWriteFontFamily *family;
     DWRITE_FONT_STYLE style;
     BOOL exists = FALSE;
     UINT32 index;
     HRESULT hr;
 
-    TRACE("(%p)->(%p %p %p)\n", This, logfont, collection, font);
+    TRACE("%p, %p, %p, %p.\n", iface, logfont, collection, font);
 
     *font = NULL;
 
@@ -844,7 +855,7 @@ static HRESULT WINAPI gdiinterop1_CreateFontFromLOGFONT(IDWriteGdiInterop1 *ifac
     if (collection)
         IDWriteFontCollection_AddRef(collection);
     else {
-        hr = IDWriteFactory5_GetSystemFontCollection(This->factory, FALSE, (IDWriteFontCollection1**)&collection, FALSE);
+        hr = IDWriteFactory5_GetSystemFontCollection((IDWriteFactory5 *)interop->factory, FALSE, (IDWriteFontCollection1 **)&collection, FALSE);
         if (FAILED(hr)) {
             ERR("failed to get system font collection: 0x%08x.\n", hr);
             return hr;
@@ -1089,7 +1100,7 @@ static const struct IDWriteFontFileLoaderVtbl memresourceloadervtbl = {
     memresourceloader_CreateStreamFromKey,
 };
 
-HRESULT create_gdiinterop(IDWriteFactory5 *factory, IDWriteGdiInterop1 **ret)
+HRESULT create_gdiinterop(IDWriteFactory7 *factory, IDWriteGdiInterop1 **ret)
 {
     struct gdiinterop *interop;
 
@@ -1100,9 +1111,10 @@ HRESULT create_gdiinterop(IDWriteFactory5 *factory, IDWriteGdiInterop1 **ret)
 
     interop->IDWriteGdiInterop1_iface.lpVtbl = &gdiinteropvtbl;
     interop->IDWriteFontFileLoader_iface.lpVtbl = &memresourceloadervtbl;
-    interop->ref = 1;
-    IDWriteFactory5_AddRef(interop->factory = factory);
-    IDWriteFactory5_RegisterFontFileLoader(factory, &interop->IDWriteFontFileLoader_iface);
+    interop->refcount = 1;
+    interop->factory = factory;
+    IDWriteFactory7_AddRef(interop->factory);
+    IDWriteFactory7_RegisterFontFileLoader(factory, &interop->IDWriteFontFileLoader_iface);
 
     *ret = &interop->IDWriteGdiInterop1_iface;
     return S_OK;
diff --git a/dlls/dwrite/main.c b/dlls/dwrite/main.c
index 73dafffd67..9c88ab6871 100644
--- a/dlls/dwrite/main.c
+++ b/dlls/dwrite/main.c
@@ -1157,7 +1157,7 @@ static HRESULT WINAPI dwritefactory_GetGdiInterop(IDWriteFactory7 *iface, IDWrit
     if (factory->gdiinterop)
         IDWriteGdiInterop1_AddRef(factory->gdiinterop);
     else
-        hr = create_gdiinterop((IDWriteFactory5 *)iface, &factory->gdiinterop);
+        hr = create_gdiinterop(iface, &factory->gdiinterop);
 
     *gdi_interop = (IDWriteGdiInterop *)factory->gdiinterop;
 
@@ -1893,11 +1893,11 @@ void factory_detach_fontcollection(IDWriteFactory7 *iface, IDWriteFontCollection
     IDWriteFactory7_Release(iface);
 }
 
-void factory_detach_gdiinterop(IDWriteFactory5 *iface, IDWriteGdiInterop1 *interop)
+void factory_detach_gdiinterop(IDWriteFactory7 *iface, IDWriteGdiInterop1 *interop)
 {
-    struct dwritefactory *factory = impl_from_IDWriteFactory7((IDWriteFactory7 *)iface);
+    struct dwritefactory *factory = impl_from_IDWriteFactory7(iface);
     factory->gdiinterop = NULL;
-    IDWriteFactory5_Release(iface);
+    IDWriteFactory7_Release(iface);
 }
 
 HRESULT WINAPI DWriteCreateFactory(DWRITE_FACTORY_TYPE type, REFIID riid, IUnknown **ret)
-- 
2.24.0




More information about the wine-devel mailing list