From ebbc6b1479e8c32ab37f6a9926311ecf09b68c35 Mon Sep 17 00:00:00 2001 From: Luca Bacci Date: Tue, 10 Mar 2026 16:37:58 +0100 Subject: [PATCH] DWriteFactory: return raw pointers Lifetimes are tied to the DLL so callers cannot extend it anyway This also helps with performance a tiny bit by removing unneeded atomic increments / decrements which can churn CPU caches in multi- threaded scenarios. --- src/win32/cairo-dwrite-font.cpp | 18 +++++----- src/win32/cairo-dwrite-private.hpp | 58 +++++++++++++++++------------- 2 files changed, 43 insertions(+), 33 deletions(-) diff --git a/src/win32/cairo-dwrite-font.cpp b/src/win32/cairo-dwrite-font.cpp index f9db37bbf..ad1d45868 100644 --- a/src/win32/cairo-dwrite-font.cpp +++ b/src/win32/cairo-dwrite-font.cpp @@ -200,14 +200,14 @@ public: }; cairo_atomic_once_t DWriteFactory::mOnceFactories = CAIRO_ATOMIC_ONCE_INIT; -RefPtr DWriteFactory::mFactoryInstance; -RefPtr DWriteFactory::mFactoryInstance1; -RefPtr DWriteFactory::mFactoryInstance2; -RefPtr DWriteFactory::mFactoryInstance3; -RefPtr DWriteFactory::mFactoryInstance4; -RefPtr DWriteFactory::mFactoryInstance8; +IDWriteFactory *DWriteFactory::mFactoryInstance; +IDWriteFactory1 *DWriteFactory::mFactoryInstance1; +IDWriteFactory2 *DWriteFactory::mFactoryInstance2; +IDWriteFactory3 *DWriteFactory::mFactoryInstance3; +IDWriteFactory4 *DWriteFactory::mFactoryInstance4; +IDWriteFactory8 *DWriteFactory::mFactoryInstance8; cairo_atomic_once_t DWriteFactory::mOnceSystemCollection = CAIRO_ATOMIC_ONCE_INIT; -RefPtr DWriteFactory::mSystemCollection; +IDWriteFontCollection *DWriteFactory::mSystemCollection; static RefPtr _create_rendering_params(IDWriteRenderingParams *params, @@ -1148,7 +1148,7 @@ _cairo_dwrite_scaled_font_init_glyph_color_surface(cairo_dwrite_scaled_font_t *s if (scaled_font->base.options.palette_index < palette_count) palette_index = scaled_font->base.options.palette_index; - if (DWriteFactory::Instance8().get()) { + if (DWriteFactory::Instance8()) { hr = DWriteFactory::Instance8()->TranslateColorGlyphRun( origin, &run, @@ -1161,7 +1161,7 @@ _cairo_dwrite_scaled_font_init_glyph_color_surface(cairo_dwrite_scaled_font_t *s palette_index, &run_enumerator); } - else if (DWriteFactory::Instance4().get()) { + else if (DWriteFactory::Instance4()) { hr = DWriteFactory::Instance4()->TranslateColorGlyphRun( origin, &run, diff --git a/src/win32/cairo-dwrite-private.hpp b/src/win32/cairo-dwrite-private.hpp index 5e1168cd1..c3b6369b5 100644 --- a/src/win32/cairo-dwrite-private.hpp +++ b/src/win32/cairo-dwrite-private.hpp @@ -54,43 +54,50 @@ typedef struct _cairo_dwrite_scaled_font cairo_dwrite_scaled_font_t; class DWriteFactory { public: - static RefPtr Instance() + static IDWriteFactory * + Instance() { InitializeFactories(); return mFactoryInstance; } - static RefPtr Instance1() + static IDWriteFactory1 * + Instance1() { InitializeFactories(); return mFactoryInstance1; } - static RefPtr Instance2() + static IDWriteFactory2 * + Instance2() { InitializeFactories(); return mFactoryInstance2; } - static RefPtr Instance3() + static IDWriteFactory3 * + Instance3() { InitializeFactories(); return mFactoryInstance3; } - static RefPtr Instance4() + static IDWriteFactory4 * + Instance4() { InitializeFactories(); return mFactoryInstance4; } - static RefPtr Instance8() + static IDWriteFactory8 * + Instance8() { InitializeFactories(); return mFactoryInstance8; } - static RefPtr SystemCollection() + static IDWriteFontCollection * + SystemCollection() { /* The system font collection obtained from the shared factory * is a singleton object. This means that we can cache it @@ -106,7 +113,8 @@ public: return mSystemCollection; } - static RefPtr FindSystemFontFamily(const WCHAR *aFamilyName) + static RefPtr + FindSystemFontFamily(const WCHAR *aFamilyName) { UINT32 idx; BOOL found; @@ -121,26 +129,28 @@ public: return family; } - static void Finalize() + static void + Finalize() { /* Loader-lock-safe */ if (_cairo_atomic_init_once_check (&mOnceSystemCollection)) { - cairo_win32_async_com_release (mSystemCollection.forget().drop()); + cairo_win32_async_com_release (mSystemCollection); } if (_cairo_atomic_init_once_check (&mOnceFactories)) { - cairo_win32_async_com_release (mFactoryInstance.forget().drop()); - cairo_win32_async_com_release (mFactoryInstance1.forget().drop()); - cairo_win32_async_com_release (mFactoryInstance2.forget().drop()); - cairo_win32_async_com_release (mFactoryInstance3.forget().drop()); - cairo_win32_async_com_release (mFactoryInstance4.forget().drop()); - cairo_win32_async_com_release (mFactoryInstance8.forget().drop()); + cairo_win32_async_com_release (mFactoryInstance); + cairo_win32_async_com_release (mFactoryInstance1); + cairo_win32_async_com_release (mFactoryInstance2); + cairo_win32_async_com_release (mFactoryInstance3); + cairo_win32_async_com_release (mFactoryInstance4); + cairo_win32_async_com_release (mFactoryInstance8); } } private: - static void InitializeFactories() + static void + InitializeFactories() { /* The shared IDWriteFactory is a singleton object (every call to * DWriteCreateFactory returns the same object) and thus is safe @@ -186,15 +196,15 @@ private: private: static cairo_atomic_once_t mOnceFactories; - static RefPtr mFactoryInstance; - static RefPtr mFactoryInstance1; - static RefPtr mFactoryInstance2; - static RefPtr mFactoryInstance3; - static RefPtr mFactoryInstance4; - static RefPtr mFactoryInstance8; + static IDWriteFactory *mFactoryInstance; + static IDWriteFactory1 *mFactoryInstance1; + static IDWriteFactory2 *mFactoryInstance2; + static IDWriteFactory3 *mFactoryInstance3; + static IDWriteFactory4 *mFactoryInstance4; + static IDWriteFactory8 *mFactoryInstance8; static cairo_atomic_once_t mOnceSystemCollection; - static RefPtr mSystemCollection; + static IDWriteFontCollection *mSystemCollection; }; class AutoDWriteGlyphRun : public DWRITE_GLYPH_RUN