From 1ca48defdb056600e9e2121f717c2be29c5220ab Mon Sep 17 00:00:00 2001 From: Arne Scheffler Date: Sun, 14 Apr 2024 15:01:10 +0200 Subject: [PATCH] extract some functions --- vstgui/lib/platform/win32/direct2d/d2d.h | 19 +++++ .../win32/direct2d/d2dgraphicscontext.cpp | 83 +++++++++---------- 2 files changed, 60 insertions(+), 42 deletions(-) diff --git a/vstgui/lib/platform/win32/direct2d/d2d.h b/vstgui/lib/platform/win32/direct2d/d2d.h index b8514340a..7ca4a0005 100644 --- a/vstgui/lib/platform/win32/direct2d/d2d.h +++ b/vstgui/lib/platform/win32/direct2d/d2d.h @@ -73,6 +73,25 @@ inline TransformMatrix convert (const D2D1_MATRIX_3X2_F& t) return matrix; } +//------------------------------------------------------------------------ +inline D2D1_BITMAP_INTERPOLATION_MODE convert (BitmapInterpolationQuality quality) +{ + D2D1_BITMAP_INTERPOLATION_MODE mode; + switch (quality) + { + case BitmapInterpolationQuality::kLow: + mode = D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR; + break; + + case BitmapInterpolationQuality::kMedium: + case BitmapInterpolationQuality::kHigh: + default: + mode = D2D1_BITMAP_INTERPOLATION_MODE_LINEAR; + break; + } + return mode; +} + //------------------------------------------------------------------------ } // anonymous namespace diff --git a/vstgui/lib/platform/win32/direct2d/d2dgraphicscontext.cpp b/vstgui/lib/platform/win32/direct2d/d2dgraphicscontext.cpp index 67e0093d1..8bef7367a 100644 --- a/vstgui/lib/platform/win32/direct2d/d2dgraphicscontext.cpp +++ b/vstgui/lib/platform/win32/direct2d/d2dgraphicscontext.cpp @@ -125,6 +125,42 @@ struct D2DBitmapDeviceContext : D2DGraphicsDeviceContext SharedPointer bitmap; }; +//------------------------------------------------------------------------ +COM::Ptr createBrushFromBitmap (ID2D1DeviceContext* deviceContext, + ID2D1Bitmap* d2d1Bitmap, const CRect& srcRect, + const CRect& dstRect, + BitmapInterpolationQuality quality) +{ + D2D1_IMAGE_BRUSH_PROPERTIES imageBrushProp = {}; + imageBrushProp.sourceRectangle = convert (srcRect); + imageBrushProp.extendModeX = imageBrushProp.extendModeY = D2D1_EXTEND_MODE_WRAP; + switch (quality) + { + case BitmapInterpolationQuality::kLow: + imageBrushProp.interpolationMode = D2D1_INTERPOLATION_MODE_NEAREST_NEIGHBOR; + break; + + case BitmapInterpolationQuality::kMedium: + case BitmapInterpolationQuality::kHigh: + default: + imageBrushProp.interpolationMode = D2D1_INTERPOLATION_MODE_LINEAR; + break; + } + CGraphicsTransform brushTransform; + brushTransform.translate (dstRect.getTopLeft ()); + + D2D1_BRUSH_PROPERTIES brushProp = {}; + brushProp.opacity = 1.f; + brushProp.transform = convert (brushTransform); + + COM::Ptr brush; + auto hr = + deviceContext->CreateImageBrush (d2d1Bitmap, imageBrushProp, brushProp, brush.adoptPtr ()); + if (FAILED (hr)) + return {}; + return brush; +} + //------------------------------------------------------------------------ } // anonymous namespace @@ -643,24 +679,10 @@ bool D2DGraphicsDeviceContext::drawBitmap (IPlatformBitmap& bitmap, CRect dest, source.setWidth (d2d1Bitmap->GetSize ().width); source.setHeight (d2d1Bitmap->GetSize ().height); - D2D1_BITMAP_INTERPOLATION_MODE mode; - switch (quality) - { - case BitmapInterpolationQuality::kLow: - mode = D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR; - break; - - case BitmapInterpolationQuality::kMedium: - case BitmapInterpolationQuality::kHigh: - default: - mode = D2D1_BITMAP_INTERPOLATION_MODE_LINEAR; - break; - } - D2D1_RECT_F sourceRect = convert (source); deviceContext->DrawBitmap (d2d1Bitmap, convert (d), - static_cast (alpha * impl->state.globalAlpha), mode, - &sourceRect); + static_cast (alpha * impl->state.globalAlpha), + convert (quality), &sourceRect); }); setTransformMatrix (originalTransformMatrix); impl->state.clip = originalClip; @@ -932,32 +954,9 @@ bool D2DGraphicsDeviceContext::fillRectWithBitmap (IPlatformBitmap& bitmap, CRec invBitmapTransform.transform (dstRect); invBitmapTransform.transform (srcRect); - D2D1_IMAGE_BRUSH_PROPERTIES imageBrushProp = {}; - imageBrushProp.sourceRectangle = convert (srcRect); - imageBrushProp.extendModeX = imageBrushProp.extendModeY = D2D1_EXTEND_MODE_WRAP; - switch (quality) - { - case BitmapInterpolationQuality::kLow: - imageBrushProp.interpolationMode = D2D1_INTERPOLATION_MODE_NEAREST_NEIGHBOR; - break; - - case BitmapInterpolationQuality::kMedium: - case BitmapInterpolationQuality::kHigh: - default: - imageBrushProp.interpolationMode = D2D1_INTERPOLATION_MODE_LINEAR; - break; - } - CGraphicsTransform brushTransform; - brushTransform.translate (dstRect.getTopLeft ()); - - D2D1_BRUSH_PROPERTIES brushProp = {}; - brushProp.opacity = 1.f; - brushProp.transform = convert (brushTransform); - - COM::Ptr brush; - auto hr = impl->deviceContext->CreateImageBrush (d2d1Bitmap, imageBrushProp, brushProp, - brush.adoptPtr ()); - if (FAILED (hr)) + auto brush = + createBrushFromBitmap (impl->deviceContext.get (), d2d1Bitmap, srcRect, dstRect, quality); + if (!brush) return false; impl->state.clip = cr;