diff options
Diffstat (limited to 'win32')
-rw-r--r-- | win32/ScintillaWin.cxx | 59 |
1 files changed, 46 insertions, 13 deletions
diff --git a/win32/ScintillaWin.cxx b/win32/ScintillaWin.cxx index 237f8e17a..bd205e370 100644 --- a/win32/ScintillaWin.cxx +++ b/win32/ScintillaWin.cxx @@ -210,7 +210,7 @@ class ScintillaWin : static ATOM callClassAtom; #if defined(USE_D2D) - ID2D1HwndRenderTarget *pRenderTarget; + ID2D1RenderTarget *pRenderTarget; bool renderTargetValid; #endif @@ -222,7 +222,7 @@ class ScintillaWin : virtual void Initialise(); virtual void Finalise(); #if defined(USE_D2D) - void EnsureRenderTarget(); + void EnsureRenderTarget(HDC hdc); void DropRenderTarget(); #endif HWND MainHWND(); @@ -441,7 +441,7 @@ void ScintillaWin::Finalise() { #if defined(USE_D2D) -void ScintillaWin::EnsureRenderTarget() { +void ScintillaWin::EnsureRenderTarget(HDC hdc) { if (!renderTargetValid) { DropRenderTarget(); renderTargetValid = true; @@ -455,12 +455,6 @@ void ScintillaWin::EnsureRenderTarget() { // Create a Direct2D render target. #if 1 - D2D1_HWND_RENDER_TARGET_PROPERTIES dhrtp; - dhrtp.hwnd = hw; - dhrtp.pixelSize = size; - dhrtp.presentOptions = (technology == SC_TECHNOLOGY_DIRECTWRITERETAIN) ? - D2D1_PRESENT_OPTIONS_RETAIN_CONTENTS : D2D1_PRESENT_OPTIONS_NONE; - D2D1_RENDER_TARGET_PROPERTIES drtp; drtp.type = D2D1_RENDER_TARGET_TYPE_DEFAULT; drtp.pixelFormat.format = DXGI_FORMAT_UNKNOWN; @@ -470,7 +464,32 @@ void ScintillaWin::EnsureRenderTarget() { drtp.usage = D2D1_RENDER_TARGET_USAGE_NONE; drtp.minLevel = D2D1_FEATURE_LEVEL_DEFAULT; - pD2DFactory->CreateHwndRenderTarget(drtp, dhrtp, &pRenderTarget); + if (technology == SC_TECHNOLOGY_DIRECTWRITEDC) { + // Explicit pixel format needed. + drtp.pixelFormat = D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, + D2D1_ALPHA_MODE_IGNORE); + + ID2D1DCRenderTarget *pDCRT = NULL; + HRESULT hr = pD2DFactory->CreateDCRenderTarget(&drtp, &pDCRT); + if (FAILED(hr)) { + Platform::DebugPrintf("Failed CreateDCRenderTarget 0x%x\n", hr); + } + pRenderTarget = pDCRT; + + } else { + D2D1_HWND_RENDER_TARGET_PROPERTIES dhrtp; + dhrtp.hwnd = hw; + dhrtp.pixelSize = size; + dhrtp.presentOptions = (technology == SC_TECHNOLOGY_DIRECTWRITERETAIN) ? + D2D1_PRESENT_OPTIONS_RETAIN_CONTENTS : D2D1_PRESENT_OPTIONS_NONE; + + ID2D1HwndRenderTarget *pHwndRenderTarget = NULL; + HRESULT hr = pD2DFactory->CreateHwndRenderTarget(drtp, dhrtp, &pHwndRenderTarget); + if (FAILED(hr)) { + Platform::DebugPrintf("Failed CreateHwndRenderTarget 0x%x\n", hr); + } + pRenderTarget = pHwndRenderTarget; + } #else pD2DFactory->CreateHwndRenderTarget( D2D1::RenderTargetProperties( @@ -484,6 +503,16 @@ void ScintillaWin::EnsureRenderTarget() { // need to be recreated. DropGraphics(false); } + + if (technology == SC_TECHNOLOGY_DIRECTWRITEDC) { + RECT rcWindow; + GetClientRect(MainHWND(), &rcWindow); + HRESULT hr = static_cast<ID2D1DCRenderTarget*>(pRenderTarget)->BindDC(hdc, &rcWindow); + if (FAILED(hr)) { + Platform::DebugPrintf("BindDC failed 0x%x\n", hr); + DropRenderTarget(); + } + } } void ScintillaWin::DropRenderTarget() { @@ -638,7 +667,7 @@ LRESULT ScintillaWin::WndPaint(uptr_t wParam) { } } else { #if defined(USE_D2D) - EnsureRenderTarget(); + EnsureRenderTarget(pps->hdc); AutoSurface surfaceWindow(pRenderTarget, this); if (surfaceWindow) { pRenderTarget->BeginDraw(); @@ -1413,6 +1442,7 @@ sptr_t ScintillaWin::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam case SCI_SETTECHNOLOGY: if ((wParam == SC_TECHNOLOGY_DEFAULT) || (wParam == SC_TECHNOLOGY_DIRECTWRITERETAIN) || + (wParam == SC_TECHNOLOGY_DIRECTWRITEDC) || (wParam == SC_TECHNOLOGY_DIRECTWRITE)) { if (technology != static_cast<int>(wParam)) { if (static_cast<int>(wParam) > SC_TECHNOLOGY_DEFAULT) { @@ -1424,6 +1454,9 @@ sptr_t ScintillaWin::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam return 0; #endif } +#if defined(USE_D2D) + DropRenderTarget(); +#endif technology = static_cast<int>(wParam); // Invalidate all cached information including layout. DropGraphics(true); @@ -2549,7 +2582,7 @@ void ScintillaWin::HorizontalScrollMessage(WPARAM wParam) { * This paint will not be abandoned. */ void ScintillaWin::FullPaint() { - if (technology == SC_TECHNOLOGY_DEFAULT) { + if ((technology == SC_TECHNOLOGY_DEFAULT) || (technology == SC_TECHNOLOGY_DIRECTWRITEDC)) { HDC hdc = ::GetDC(MainHWND()); FullPaintDC(hdc); ::ReleaseDC(MainHWND(), hdc); @@ -2574,7 +2607,7 @@ void ScintillaWin::FullPaintDC(HDC hdc) { } } else { #if defined(USE_D2D) - EnsureRenderTarget(); + EnsureRenderTarget(hdc); AutoSurface surfaceWindow(pRenderTarget, this); if (surfaceWindow) { pRenderTarget->BeginDraw(); |