From dfb21da57266834955290ad5e875fae161417d22 Mon Sep 17 00:00:00 2001 From: Matt Gonzalez Date: Fri, 10 May 2024 20:32:45 -0700 Subject: [PATCH] Direct2D: Use axis-aligned clip layer when possible in clipToImageAlpha --- .../juce_Direct2DGraphicsContext_windows.cpp | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/modules/juce_graphics/native/juce_Direct2DGraphicsContext_windows.cpp b/modules/juce_graphics/native/juce_Direct2DGraphicsContext_windows.cpp index 96adea4cc9..1dbaf202e3 100644 --- a/modules/juce_graphics/native/juce_Direct2DGraphicsContext_windows.cpp +++ b/modules/juce_graphics/native/juce_Direct2DGraphicsContext_windows.cpp @@ -1078,12 +1078,21 @@ void Direct2DGraphicsContext::clipToImageAlpha (const Image& sourceImage, const // to the sourceImage bounds auto brushTransform = currentState->currentTransform.getTransformWith (transform); { - D2D1_RECT_F sourceImageRectF = D2DUtilities::toRECT_F (sourceImage.getBounds()); - ComSmartPtr geometry; - getPimpl()->getDirect2DFactory()->CreateRectangleGeometry (sourceImageRectF, geometry.resetAndGetPointerAddress()); + if (D2DHelpers::isTransformAxisAligned (brushTransform)) + { + currentState->pushAliasedAxisAlignedClipLayer (sourceImage.getBounds().toFloat().transformedBy (brushTransform)); + } + else + { + const auto sourceImageRectF = D2DUtilities::toRECT_F (sourceImage.getBounds()); + ComSmartPtr geometry; - if (geometry) - currentState->pushTransformedRectangleGeometryClipLayer (geometry, brushTransform); + if (const auto hr = getPimpl()->getDirect2DFactory()->CreateRectangleGeometry (sourceImageRectF, geometry.resetAndGetPointerAddress()); + SUCCEEDED (hr) && geometry != nullptr) + { + currentState->pushTransformedRectangleGeometryClipLayer (geometry, brushTransform); + } + } } // Set the clip list to the full size of the frame to match