diff options
| author | mitchell <unknown> | 2020-03-27 13:21:15 -0400 |
|---|---|---|
| committer | mitchell <unknown> | 2020-03-27 13:21:15 -0400 |
| commit | b45dbedb37bcd591bf18d8891190acacbbc35bd7 (patch) | |
| tree | 5ff2985ab59c214cdb791c81fb6a81e80d0e71ff | |
| parent | 4217a53245325b0f8d925dc1ae98129133b39157 (diff) | |
| download | scintilla-mirror-b45dbedb37bcd591bf18d8891190acacbbc35bd7.tar.gz | |
Backport: Use dynamic_cast and assertion instead of static_cast to fail earlier if there
is a bug.
Backport of changeset 7984:0f23c38fa1ac.
| -rw-r--r-- | win32/PlatWin.cxx | 33 |
1 files changed, 20 insertions, 13 deletions
diff --git a/win32/PlatWin.cxx b/win32/PlatWin.cxx index 0102fbb01..febc82171 100644 --- a/win32/PlatWin.cxx +++ b/win32/PlatWin.cxx @@ -560,7 +560,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); @@ -648,10 +650,12 @@ 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 + SurfaceGDI *psgdi = dynamic_cast<SurfaceGDI *>(&surfacePattern); + if (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); @@ -980,6 +984,7 @@ class SurfaceD2D : public Surface { int codePageText; ID2D1RenderTarget *pRenderTarget; + ID2D1BitmapRenderTarget *pBitmapRenderTarget; bool ownRenderTarget; int clipsActive; @@ -1061,6 +1066,7 @@ SurfaceD2D::SurfaceD2D() noexcept : codePageText = 0; pRenderTarget = nullptr; + pBitmapRenderTarget = nullptr; ownRenderTarget = false; clipsActive = 0; @@ -1096,6 +1102,7 @@ void SurfaceD2D::Clear() noexcept { } pRenderTarget = nullptr; } + pBitmapRenderTarget = nullptr; } void SurfaceD2D::Release() { @@ -1132,8 +1139,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__ @@ -1143,9 +1151,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; } @@ -1301,12 +1309,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 = |
