diff options
author | Neil <nyamatongwe@gmail.com> | 2020-07-15 08:57:35 +1000 |
---|---|---|
committer | Neil <nyamatongwe@gmail.com> | 2020-07-15 08:57:35 +1000 |
commit | 33b62f1dba553b5c5c528fe9088d96a5c2341cdd (patch) | |
tree | 7edc8686df8babf0121b8fccf356195a04a3467b | |
parent | dc5f8223b0fc64da874996fa22f69aca8b2106ae (diff) | |
download | scintilla-mirror-33b62f1dba553b5c5c528fe9088d96a5c2341cdd.tar.gz |
Backport: Add extra checking and assertions for NULLs.
Use ReleaseUnknown which is noexcept making it easier to reason about exceptions.
Add constexpr where possible.
Backport of changeset 8403:0c52875b4c8c.
-rw-r--r-- | win32/PlatWin.cxx | 64 |
1 files changed, 34 insertions, 30 deletions
diff --git a/win32/PlatWin.cxx b/win32/PlatWin.cxx index 13e48b834..a292b6728 100644 --- a/win32/PlatWin.cxx +++ b/win32/PlatWin.cxx @@ -367,7 +367,7 @@ FontID CreateFontFromParameters(const FontParameters &fp) { IDWriteTextLayout *pTextLayout = nullptr; hr = pIDWriteFactory->CreateTextLayout(L"X", 1, pTextFormat, 100.0f, 100.0f, &pTextLayout); - if (SUCCEEDED(hr)) { + if (SUCCEEDED(hr) && pTextLayout) { constexpr int maxLines = 2; DWRITE_LINE_METRICS lineMetrics[maxLines]{}; UINT32 lineCount = 0; @@ -382,7 +382,7 @@ FontID CreateFontFromParameters(const FontParameters &fp) { yInternalLeading = lineMetrics[0].height - emHeight; } } - pTextLayout->Release(); + ReleaseUnknown(pTextLayout); pTextFormat->SetLineSpacing(DWRITE_LINE_SPACING_METHOD_UNIFORM, lineMetrics[0].height, lineMetrics[0].baseline); } fid = new FormatAndMetrics(pTextFormat, fp.extraFontFlag, fp.characterSet, yAscent, yDescent, yInternalLeading); @@ -743,7 +743,7 @@ constexpr byte AlphaScaled(unsigned char component, unsigned int alpha) noexcept return static_cast<byte>(component * alpha / 255); } -DWORD dwordMultiplied(ColourDesired colour, unsigned int alpha) noexcept { +constexpr DWORD dwordMultiplied(ColourDesired colour, unsigned int alpha) noexcept { return dwordFromBGRA( AlphaScaled(colour.GetBlue(), alpha), AlphaScaled(colour.GetGreen(), alpha), @@ -1415,30 +1415,33 @@ void SurfaceD2D::LineTo(int x_, int y_) { } void SurfaceD2D::Polygon(Point *pts, size_t npts, ColourDesired fore, ColourDesired back) { + PLATFORM_ASSERT(pRenderTarget && (npts > 2)); if (pRenderTarget) { ID2D1Factory *pFactory = nullptr; pRenderTarget->GetFactory(&pFactory); - ID2D1PathGeometry *geometry=nullptr; + PLATFORM_ASSERT(pFactory); + ID2D1PathGeometry *geometry = nullptr; HRESULT hr = pFactory->CreatePathGeometry(&geometry); - if (SUCCEEDED(hr)) { + PLATFORM_ASSERT(geometry); + if (SUCCEEDED(hr) && geometry) { ID2D1GeometrySink *sink = nullptr; hr = geometry->Open(&sink); - if (SUCCEEDED(hr)) { + PLATFORM_ASSERT(sink); + if (SUCCEEDED(hr) && sink) { sink->BeginFigure(D2D1::Point2F(pts[0].x + 0.5f, pts[0].y + 0.5f), D2D1_FIGURE_BEGIN_FILLED); for (size_t i=1; i<npts; i++) { sink->AddLine(D2D1::Point2F(pts[i].x + 0.5f, pts[i].y + 0.5f)); } sink->EndFigure(D2D1_FIGURE_END_CLOSED); sink->Close(); - sink->Release(); + ReleaseUnknown(sink); D2DPenColour(back); pRenderTarget->FillGeometry(geometry,pBrush); D2DPenColour(fore); pRenderTarget->DrawGeometry(geometry,pBrush); } - - geometry->Release(); + ReleaseUnknown(geometry); } } } @@ -1456,8 +1459,8 @@ void SurfaceD2D::RectangleDraw(PRectangle rc, ColourDesired fore, ColourDesired void SurfaceD2D::FillRectangle(PRectangle rc, ColourDesired back) { if (pRenderTarget) { D2DPenColour(back); - const D2D1_RECT_F rectangle1 = D2D1::RectF(std::round(rc.left), rc.top, std::round(rc.right), rc.bottom); - pRenderTarget->FillRectangle(&rectangle1, pBrush); + const D2D1_RECT_F rectangle1 = D2D1::RectF(std::round(rc.left), rc.top, std::round(rc.right), rc.bottom); + pRenderTarget->FillRectangle(&rectangle1, pBrush); } } @@ -1467,19 +1470,19 @@ void SurfaceD2D::FillRectangle(PRectangle rc, Surface &surfacePattern) { psurfOther->FlushDrawing(); ID2D1Bitmap *pBitmap = nullptr; HRESULT hr = psurfOther->pBitmapRenderTarget->GetBitmap(&pBitmap); - if (SUCCEEDED(hr)) { + if (SUCCEEDED(hr) && pBitmap) { ID2D1BitmapBrush *pBitmapBrush = nullptr; const D2D1_BITMAP_BRUSH_PROPERTIES brushProperties = D2D1::BitmapBrushProperties(D2D1_EXTEND_MODE_WRAP, D2D1_EXTEND_MODE_WRAP, D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR); // Create the bitmap brush. hr = pRenderTarget->CreateBitmapBrush(pBitmap, brushProperties, &pBitmapBrush); - pBitmap->Release(); - if (SUCCEEDED(hr)) { + ReleaseUnknown(pBitmap); + if (SUCCEEDED(hr) && pBitmapBrush) { pRenderTarget->FillRectangle( D2D1::RectF(rc.left, rc.top, rc.right, rc.bottom), pBitmapBrush); - pBitmapBrush->Release(); + ReleaseUnknown(pBitmapBrush); } } } @@ -1563,18 +1566,18 @@ void SurfaceD2D::GradientRectangle(PRectangle rc, const std::vector<ColourStop> ID2D1GradientStopCollection *pGradientStops = nullptr; HRESULT hr = pRenderTarget->CreateGradientStopCollection( gradientStops.data(), static_cast<UINT32>(gradientStops.size()), &pGradientStops); - if (FAILED(hr)) { + if (FAILED(hr) || !pGradientStops) { return; } ID2D1LinearGradientBrush *pBrushLinear = nullptr; hr = pRenderTarget->CreateLinearGradientBrush( lgbp, pGradientStops, &pBrushLinear); - if (SUCCEEDED(hr)) { + if (SUCCEEDED(hr) && pBrushLinear) { const D2D1_RECT_F rectangle = D2D1::RectF(std::round(rc.left), rc.top, std::round(rc.right), rc.bottom); pRenderTarget->FillRectangle(&rectangle, pBrushLinear); - pBrushLinear->Release(); + ReleaseUnknown(pBrushLinear); } - pGradientStops->Release(); + ReleaseUnknown(pGradientStops); } } @@ -1599,7 +1602,7 @@ void SurfaceD2D::DrawRGBAImage(PRectangle rc, int width, int height, const unsig if (SUCCEEDED(hr)) { D2D1_RECT_F rcDestination = {rc.left, rc.top, rc.right, rc.bottom}; pRenderTarget->DrawBitmap(bitmap, rcDestination); - bitmap->Release(); + ReleaseUnknown(bitmap); } } } @@ -1623,6 +1626,7 @@ void SurfaceD2D::Copy(PRectangle rc, Point from, Surface &surfaceSource) { surfOther.FlushDrawing(); ID2D1BitmapRenderTarget *pCompatibleRenderTarget = reinterpret_cast<ID2D1BitmapRenderTarget *>( surfOther.pRenderTarget); + PLATFORM_ASSERT(pCompatibleRenderTarget); ID2D1Bitmap *pBitmap = nullptr; HRESULT hr = pCompatibleRenderTarget->GetBitmap(&pBitmap); if (SUCCEEDED(hr)) { @@ -1634,7 +1638,7 @@ void SurfaceD2D::Copy(PRectangle rc, Point from, Surface &surfaceSource) { if (FAILED(hr)) { Platform::DebugPrintf("Failed Flush 0x%lx\n", hr); } - pBitmap->Release(); + ReleaseUnknown(pBitmap); } } @@ -1656,7 +1660,7 @@ void SurfaceD2D::DrawTextCommon(PRectangle rc, const Font &font_, XYPOSITION yba if (SUCCEEDED(hr)) { D2D1_POINT_2F origin = {rc.left, ybase-yAscent}; pRenderTarget->DrawTextLayout(origin, pTextLayout, pBrush, d2dDrawTextOptions); - pTextLayout->Release(); + ReleaseUnknown(pTextLayout); } if (fuOptions & ETO_CLIPPED) { @@ -1705,11 +1709,11 @@ XYPOSITION SurfaceD2D::WidthText(Font &font_, const char *s, int len) { // Create a layout IDWriteTextLayout *pTextLayout = nullptr; const HRESULT hr = pIDWriteFactory->CreateTextLayout(tbuf.buffer, tbuf.tlen, pTextFormat, 1000.0, 1000.0, &pTextLayout); - if (SUCCEEDED(hr)) { + if (SUCCEEDED(hr) && pTextLayout) { DWRITE_TEXT_METRICS textMetrics; if (SUCCEEDED(pTextLayout->GetMetrics(&textMetrics))) width = textMetrics.widthIncludingTrailingWhitespace; - pTextLayout->Release(); + ReleaseUnknown(pTextLayout); } } return width; @@ -1728,14 +1732,14 @@ void SurfaceD2D::MeasureWidths(Font &font_, const char *s, int len, XYPOSITION * // Create a layout IDWriteTextLayout *pTextLayout = nullptr; const HRESULT hrCreate = pIDWriteFactory->CreateTextLayout(tbuf.buffer, tbuf.tlen, pTextFormat, 10000.0, 1000.0, &pTextLayout); - if (!SUCCEEDED(hrCreate)) { + if (!SUCCEEDED(hrCreate) || !pTextLayout) { return; } constexpr int clusters = stackBufferLength; DWRITE_CLUSTER_METRICS clusterMetrics[clusters]; UINT32 count = 0; const HRESULT hrGetCluster = pTextLayout->GetClusterMetrics(clusterMetrics, clusters, &count); - pTextLayout->Release(); + ReleaseUnknown(pTextLayout); if (!SUCCEEDED(hrGetCluster)) { return; } @@ -1825,11 +1829,11 @@ XYPOSITION SurfaceD2D::AverageCharWidth(Font &font_) { const size_t lenAllAlpha = wcslen(wszAllAlpha); const HRESULT hr = pIDWriteFactory->CreateTextLayout(wszAllAlpha, static_cast<UINT32>(lenAllAlpha), pTextFormat, 1000.0, 1000.0, &pTextLayout); - if (SUCCEEDED(hr)) { + if (SUCCEEDED(hr) && pTextLayout) { DWRITE_TEXT_METRICS textMetrics; if (SUCCEEDED(pTextLayout->GetMetrics(&textMetrics))) width = textMetrics.width / lenAllAlpha; - pTextLayout->Release(); + ReleaseUnknown(pTextLayout); } } return width; @@ -2420,7 +2424,7 @@ void ListBoxX::Draw(DRAWITEMSTRUCT *pDrawItem) { ); ID2D1DCRenderTarget *pDCRT = nullptr; HRESULT hr = pD2DFactory->CreateDCRenderTarget(&props, &pDCRT); - if (SUCCEEDED(hr)) { + if (SUCCEEDED(hr) && pDCRT) { RECT rcWindow; GetClientRect(pDrawItem->hwndItem, &rcWindow); hr = pDCRT->BindDC(pDrawItem->hDC, &rcWindow); @@ -2433,7 +2437,7 @@ void ListBoxX::Draw(DRAWITEMSTRUCT *pDrawItem) { surfaceItem->DrawRGBAImage(rcImage, pimage->GetWidth(), pimage->GetHeight(), pimage->Pixels()); pDCRT->EndDraw(); - pDCRT->Release(); + ReleaseUnknown(pDCRT); } } #endif |