diff options
| author | Neil <nyamatongwe@gmail.com> | 2020-02-14 07:50:32 +1100 | 
|---|---|---|
| committer | Neil <nyamatongwe@gmail.com> | 2020-02-14 07:50:32 +1100 | 
| commit | 2761a6e256af7bc378bfab677b0cd8aeafc999b4 (patch) | |
| tree | 7170622fa83a914ff227cc1f0d4f7582197dbab6 | |
| parent | 53f37680ed1d27a56d3945344478624aad36490e (diff) | |
| download | scintilla-mirror-2761a6e256af7bc378bfab677b0cd8aeafc999b4.tar.gz | |
Use dynamic_cast and assertion instead of static_cast to fail earlier if there
is a bug.
| -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 = | 
