diff options
-rw-r--r-- | win32/PlatWin.cxx | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/win32/PlatWin.cxx b/win32/PlatWin.cxx index 6cab139df..f54e72218 100644 --- a/win32/PlatWin.cxx +++ b/win32/PlatWin.cxx @@ -557,7 +557,9 @@ void SurfaceGDI::Init(SurfaceID sid, WindowID) { void SurfaceGDI::InitPixMap(int width, int height, Surface *surface_, WindowID) { Release(); - SurfaceGDI *psurfOther = static_cast<SurfaceGDI *>(surface_); + SurfaceGDI *psurfOther = dynamic_cast<SurfaceGDI *>(surface_); + // Should only ever be called with a SurfaceGDI, not a SurfaceD2D + PLATFORM_ASSERT(psurfOther); hdc = ::CreateCompatibleDC(psurfOther->hdc); hdcOwned = true; bitmap = ::CreateCompatibleBitmap(psurfOther->hdc, width, height); @@ -645,10 +647,11 @@ void SurfaceGDI::FillRectangle(PRectangle rc, ColourDesired back) { void SurfaceGDI::FillRectangle(PRectangle rc, Surface &surfacePattern) { HBRUSH br; - if (static_cast<SurfaceGDI &>(surfacePattern).bitmap) - br = ::CreatePatternBrush(static_cast<SurfaceGDI &>(surfacePattern).bitmap); - else // Something is wrong so display in red + if (SurfaceGDI *psgdi = dynamic_cast<SurfaceGDI *>(&surfacePattern); psgdi && psgdi->bitmap) { + br = ::CreatePatternBrush(psgdi->bitmap); + } else { // Something is wrong so display in red br = ::CreateSolidBrush(RGB(0xff, 0, 0)); + } const RECT rcw = RectFromPRectangle(rc); ::FillRect(hdc, &rcw, br); ::DeleteObject(br); @@ -987,6 +990,7 @@ class SurfaceD2D : public Surface { int codePageText; ID2D1RenderTarget *pRenderTarget; + ID2D1BitmapRenderTarget *pBitmapRenderTarget; bool ownRenderTarget; int clipsActive; @@ -1071,6 +1075,7 @@ SurfaceD2D::SurfaceD2D() noexcept : codePageText = 0; pRenderTarget = nullptr; + pBitmapRenderTarget = nullptr; ownRenderTarget = false; clipsActive = 0; @@ -1106,6 +1111,7 @@ void SurfaceD2D::Clear() noexcept { } pRenderTarget = nullptr; } + pBitmapRenderTarget = nullptr; } void SurfaceD2D::Release() { @@ -1142,8 +1148,9 @@ void SurfaceD2D::Init(SurfaceID sid, WindowID) { void SurfaceD2D::InitPixMap(int width, int height, Surface *surface_, WindowID) { Release(); SetScale(); - SurfaceD2D *psurfOther = static_cast<SurfaceD2D *>(surface_); - ID2D1BitmapRenderTarget *pCompatibleRenderTarget = nullptr; + SurfaceD2D *psurfOther = dynamic_cast<SurfaceD2D *>(surface_); + // Should only ever be called with a SurfaceD2D, not a SurfaceGDI + PLATFORM_ASSERT(psurfOther); const D2D1_SIZE_F desiredSize = D2D1::SizeF(static_cast<float>(width), static_cast<float>(height)); D2D1_PIXEL_FORMAT desiredFormat; #ifdef __MINGW32__ @@ -1153,9 +1160,9 @@ void SurfaceD2D::InitPixMap(int width, int height, Surface *surface_, WindowID) #endif desiredFormat.alphaMode = D2D1_ALPHA_MODE_IGNORE; const HRESULT hr = psurfOther->pRenderTarget->CreateCompatibleRenderTarget( - &desiredSize, nullptr, &desiredFormat, D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS_NONE, &pCompatibleRenderTarget); + &desiredSize, nullptr, &desiredFormat, D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS_NONE, &pBitmapRenderTarget); if (SUCCEEDED(hr)) { - pRenderTarget = pCompatibleRenderTarget; + pRenderTarget = pBitmapRenderTarget; pRenderTarget->BeginDraw(); ownRenderTarget = true; } @@ -1311,12 +1318,11 @@ void SurfaceD2D::FillRectangle(PRectangle rc, ColourDesired back) { } void SurfaceD2D::FillRectangle(PRectangle rc, Surface &surfacePattern) { - SurfaceD2D &surfOther = static_cast<SurfaceD2D &>(surfacePattern); - surfOther.FlushDrawing(); + SurfaceD2D *psurfOther = dynamic_cast<SurfaceD2D *>(&surfacePattern); + PLATFORM_ASSERT(psurfOther && psurfOther->pBitmapRenderTarget); + psurfOther->FlushDrawing(); ID2D1Bitmap *pBitmap = nullptr; - ID2D1BitmapRenderTarget *pCompatibleRenderTarget = reinterpret_cast<ID2D1BitmapRenderTarget *>( - surfOther.pRenderTarget); - HRESULT hr = pCompatibleRenderTarget->GetBitmap(&pBitmap); + HRESULT hr = psurfOther->pBitmapRenderTarget->GetBitmap(&pBitmap); if (SUCCEEDED(hr)) { ID2D1BitmapBrush *pBitmapBrush = nullptr; const D2D1_BITMAP_BRUSH_PROPERTIES brushProperties = |