diff --git a/modules/juce_graphics/native/juce_Direct2DImageContext_windows.cpp b/modules/juce_graphics/native/juce_Direct2DImageContext_windows.cpp index e6d9ec3dca..e0abce5cf5 100644 --- a/modules/juce_graphics/native/juce_Direct2DImageContext_windows.cpp +++ b/modules/juce_graphics/native/juce_Direct2DImageContext_windows.cpp @@ -40,72 +40,56 @@ struct Direct2DImageContext::ImagePimpl : public Direct2DGraphicsContext::Pimpl public: static constexpr auto opaque = false; - ImagePimpl (Direct2DImageContext& ownerIn, Direct2DPixelData::Ptr targetIn) + ImagePimpl (Direct2DImageContext& ownerIn, + ComSmartPtr contextIn, + ComSmartPtr bitmapIn, + const RectangleList& paintAreasIn) : Pimpl (ownerIn, opaque), - target (targetIn) + context (std::move (contextIn)), + bitmap (std::move (bitmapIn)), + paintAreas (paintAreasIn) { } Rectangle getFrameSize() const override { - const auto targetBitmap = getBitmap(); - - if (targetBitmap == nullptr) + if (bitmap == nullptr) return {}; - const auto size = targetBitmap->GetSize(); + const auto size = bitmap->GetSize(); return { (int) size.width, (int) size.height }; } ComSmartPtr getDeviceContextTarget() const override { - return getBitmap(); - } - - HRESULT finishFrame() override - { - const auto result = Pimpl::finishFrame(); - - if (target != nullptr) - target->flushToSoftwareBackup(); - - return result; - } - -private: - ComSmartPtr getBitmap() const - { - if (target == nullptr) - return {}; - - return target->getAdapterD2D1Bitmap(); + return bitmap; } RectangleList getPaintAreas() const override { - return getFrameSize(); + return paintAreas; } - Direct2DPixelData::Ptr target; +private: + ComSmartPtr context; + ComSmartPtr bitmap; + RectangleList paintAreas; JUCE_DECLARE_WEAK_REFERENCEABLE (ImagePimpl) }; //============================================================================== -Direct2DImageContext::Direct2DImageContext (Direct2DPixelData::Ptr targetIn) - : pimpl (new ImagePimpl { *this, targetIn }) +Direct2DImageContext::Direct2DImageContext (ComSmartPtr context, + ComSmartPtr bitmap, + const RectangleList& paintAreas) + : pimpl (new ImagePimpl { *this, context, bitmap, paintAreas }) { #if JUCE_DIRECT2D_METRICS metrics = Direct2DMetricsHub::getInstance()->imageContextMetrics; #endif - - startFrame (1.0f); } -Direct2DImageContext::~Direct2DImageContext() -{ - endFrame(); -} +Direct2DImageContext::~Direct2DImageContext() = default; Direct2DGraphicsContext::Pimpl* Direct2DImageContext::getPimpl() const noexcept { diff --git a/modules/juce_graphics/native/juce_Direct2DImageContext_windows.h b/modules/juce_graphics/native/juce_Direct2DImageContext_windows.h index abe5027ea4..085aaf0b7e 100644 --- a/modules/juce_graphics/native/juce_Direct2DImageContext_windows.h +++ b/modules/juce_graphics/native/juce_Direct2DImageContext_windows.h @@ -38,7 +38,9 @@ namespace juce class Direct2DImageContext : public Direct2DGraphicsContext { public: - explicit Direct2DImageContext (Direct2DPixelData::Ptr); + Direct2DImageContext (ComSmartPtr, + ComSmartPtr, + const RectangleList&); ~Direct2DImageContext() override; diff --git a/modules/juce_graphics/native/juce_Direct2DImage_windows.cpp b/modules/juce_graphics/native/juce_Direct2DImage_windows.cpp index 862bab1c85..2be630429b 100644 --- a/modules/juce_graphics/native/juce_Direct2DImage_windows.cpp +++ b/modules/juce_graphics/native/juce_Direct2DImage_windows.cpp @@ -101,6 +101,9 @@ public: static void flushImage (Image softwareImage, ComSmartPtr native, D2D1_RECT_U target) { + if (native == nullptr) + return; + if (softwareImage.getFormat() == Image::PixelFormat::RGB) softwareImage = softwareImage.convertedToFormat (Image::PixelFormat::ARGB); @@ -225,7 +228,27 @@ std::unique_ptr Direct2DPixelData::createLowLevelContex { sendDataChangeMessage(); - return std::make_unique (this); + struct FlushingContext : public Direct2DImageContext + { + explicit FlushingContext (Direct2DPixelData::Ptr p) + : Direct2DImageContext (p->context, p->getAdapterD2D1Bitmap(), Rectangle { p->width, p->height }), + ptr (startFrame (1.0f) ? p : nullptr) + { + } + + ~FlushingContext() override + { + if (ptr == nullptr) + return; + + endFrame(); + ptr->flushToSoftwareBackup(); + } + + Direct2DPixelData::Ptr ptr; + }; + + return std::make_unique (this); } void Direct2DPixelData::initialiseBitmapData (Image::BitmapData& bitmap, int x, int y, Image::BitmapData::ReadWriteMode mode)