aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--win32/PlatWin.cxx32
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 =