diff options
-rw-r--r-- | win32/PlatWin.cxx | 51 | ||||
-rw-r--r-- | win32/PlatWin.h | 13 | ||||
-rw-r--r-- | win32/ScintillaWin.cxx | 29 |
3 files changed, 51 insertions, 42 deletions
diff --git a/win32/PlatWin.cxx b/win32/PlatWin.cxx index b0fbd2543..a1ae68b82 100644 --- a/win32/PlatWin.cxx +++ b/win32/PlatWin.cxx @@ -197,15 +197,42 @@ void Palette::Allocate(Window &) { } } -static IDWriteFactory *pIDWriteFactory = 0; - -static void EnsureDWriteFactory() { - // Construct - if (!pIDWriteFactory) { - DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, - __uuidof(IDWriteFactory), - reinterpret_cast<IUnknown**>(&pIDWriteFactory)); +IDWriteFactory *pIDWriteFactory = 0; +ID2D1Factory *pD2DFactory = 0; + +bool LoadD2D() { + static bool triedLoadingD2D = false; + static HMODULE hDLLD2D = 0; + static HMODULE hDLLDWrite = 0; + if (!triedLoadingD2D) { + typedef HRESULT (WINAPI *D2D1CFSig)(D2D1_FACTORY_TYPE factoryType, REFIID riid, + CONST D2D1_FACTORY_OPTIONS *pFactoryOptions, IUnknown **factory); + typedef HRESULT (WINAPI *DWriteCFSig)(DWRITE_FACTORY_TYPE factoryType, REFIID iid, + IUnknown **factory); + + hDLLD2D = ::LoadLibrary(TEXT("D2D1.DLL")); + if (hDLLD2D) { + D2D1CFSig fnD2DCF = (D2D1CFSig)::GetProcAddress(hDLLD2D, "D2D1CreateFactory"); + if (fnD2DCF) { + // A single threaded factory as Scintilla always draw on the GUI thread + fnD2DCF(D2D1_FACTORY_TYPE_SINGLE_THREADED, + __uuidof(ID2D1Factory), + 0, + reinterpret_cast<IUnknown**>(&pD2DFactory)); + } + } + hDLLDWrite = ::LoadLibrary(TEXT("DWRITE.DLL")); + if (hDLLDWrite) { + DWriteCFSig fnDWCF = (DWriteCFSig)::GetProcAddress(hDLLDWrite, "DWriteCreateFactory"); + if (fnDWCF) { + fnDWCF(DWRITE_FACTORY_TYPE_SHARED, + __uuidof(IDWriteFactory), + reinterpret_cast<IUnknown**>(&pIDWriteFactory)); + } + } } + triedLoadingD2D = true; + return pIDWriteFactory && pD2DFactory; } struct FormatAndBaseline { @@ -292,7 +319,6 @@ FontCached::FontCached(const char *faceName_, int characterSet_, float size_, in SetLogFont(lf, faceName_, characterSet_, size_, weight_, italic_, extraFontFlag_); hash = HashFont(faceName_, characterSet_, size_, weight_, italic_, extraFontFlag_); fid = 0; - EnsureDWriteFactory(); if (pIDWriteFactory) { #ifdef OLD_CODE HFONT fontSave = static_cast<HFONT>(::SelectObject(hdc, font_.GetID())); @@ -508,9 +534,6 @@ public: } //namespace Scintilla #endif -#pragma comment(lib, "d2d1.lib") -#pragma comment(lib, "dwrite.lib") - SurfaceImpl::SurfaceImpl() : unicodeMode(false), hdc(0), hdcOwned(false), @@ -563,11 +586,7 @@ void SurfaceImpl::Release() { } } -// Ensures have pIDWriteFactory, and pRenderTarget -// If any fail, pRenderTarget will be NULL void SurfaceImpl::SetDWrite(HDC hdc) { - // Construct - EnsureDWriteFactory(); dpiScaleX = GetDeviceCaps(hdc, LOGPIXELSX) / 96.0f; dpiScaleY = GetDeviceCaps(hdc, LOGPIXELSY) / 96.0f; } diff --git a/win32/PlatWin.h b/win32/PlatWin.h new file mode 100644 index 000000000..dc3f8e432 --- /dev/null +++ b/win32/PlatWin.h @@ -0,0 +1,13 @@ +// Scintilla source code edit control +/** @file PlatWin.h + ** Implementation of platform facilities on Windows. + **/ +// Copyright 1998-2011 by Neil Hodgson <neilh@scintilla.org> +// The License.txt file describes the conditions under which this software may be distributed. + +extern bool IsNT(); +extern void Platform_Initialise(void *hInstance); +extern void Platform_Finalise(); +extern bool LoadD2D(); +extern ID2D1Factory *pD2DFactory; +extern IDWriteFactory *pIDWriteFactory; diff --git a/win32/ScintillaWin.cxx b/win32/ScintillaWin.cxx index 6bc770eed..f49b2bace 100644 --- a/win32/ScintillaWin.cxx +++ b/win32/ScintillaWin.cxx @@ -57,6 +57,7 @@ #include "Editor.h" #include "ScintillaBase.h" #include "UniConversion.h" +#include "PlatWin.h" #ifdef SCI_LEXER #include "ExternalLexer.h" @@ -90,11 +91,6 @@ #define SC_WIN_IDLE 5001 -// Functions imported from PlatWin -extern bool IsNT(); -extern void Platform_Initialise(void *hInstance); -extern void Platform_Finalise(); - typedef BOOL (WINAPI *TrackMouseEventSig)(LPTRACKMOUSEEVENT); // GCC has trouble with the standard COM ABI so do it the old C way with explicit vtables. @@ -200,8 +196,6 @@ class ScintillaWin : static HINSTANCE hInstance; - IDWriteFactory *pIDWriteFactory; - ID2D1Factory *pD2DFactory; ID2D1HwndRenderTarget *pRenderTarget; ScintillaWin(HWND hwnd); @@ -359,8 +353,6 @@ ScintillaWin::ScintillaWin(HWND hwnd) { sysCaretWidth = 0; sysCaretHeight = 0; - pIDWriteFactory = 0; - pD2DFactory = 0; pRenderTarget = 0; keysAlwaysUnicode = false; @@ -392,14 +384,7 @@ void ScintillaWin::Initialise() { } } - if (!pIDWriteFactory) { - DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, - __uuidof(IDWriteFactory), - reinterpret_cast<IUnknown**>(&pIDWriteFactory)); - } - if (!pD2DFactory) { - D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &pD2DFactory); - } + LoadD2D(); } void ScintillaWin::Finalise() { @@ -407,14 +392,6 @@ void ScintillaWin::Finalise() { SetTicking(false); SetIdle(false); DropRenderTarget(); - if (pIDWriteFactory) { - pIDWriteFactory->Release(); - pIDWriteFactory = 0; - } - if (pD2DFactory) { - pD2DFactory->Release(); - pD2DFactory = 0; - } ::RevokeDragDrop(MainHWND()); if (SUCCEEDED(hrOle)) { ::OleUninitialize(); @@ -2780,7 +2757,7 @@ sptr_t PASCAL ScintillaWin::CTWndProc( RECT rc; GetClientRect(hWnd, &rc); // Create a Direct2D render target. - sciThis->pD2DFactory->CreateHwndRenderTarget( + pD2DFactory->CreateHwndRenderTarget( D2D1::RenderTargetProperties(), D2D1::HwndRenderTargetProperties(hWnd, D2D1::SizeU(rc.right - rc.left, rc.bottom - rc.top)), &pCTRenderTarget); |