1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-02-05 03:50:07 +00:00

Direct2D: Allow drawing to arbitrary bitmaps using Direct2DImageContext

This change also moves the startFrame and endFrame calls out of the
plain Direct2DImageContext and into a special-purpose "flushing" context
that is private to Direct2DPixelData.
This commit is contained in:
reuk 2024-08-13 17:59:25 +01:00
parent 8a1bf07f14
commit d344c2bf71
No known key found for this signature in database
GPG key ID: FCB43929F012EE5C
3 changed files with 47 additions and 38 deletions

View file

@ -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<ID2D1DeviceContext1> contextIn,
ComSmartPtr<ID2D1Bitmap1> bitmapIn,
const RectangleList<int>& paintAreasIn)
: Pimpl (ownerIn, opaque),
target (targetIn)
context (std::move (contextIn)),
bitmap (std::move (bitmapIn)),
paintAreas (paintAreasIn)
{
}
Rectangle<int> 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<ID2D1Image> getDeviceContextTarget() const override
{
return getBitmap();
}
HRESULT finishFrame() override
{
const auto result = Pimpl::finishFrame();
if (target != nullptr)
target->flushToSoftwareBackup();
return result;
}
private:
ComSmartPtr<ID2D1Bitmap1> getBitmap() const
{
if (target == nullptr)
return {};
return target->getAdapterD2D1Bitmap();
return bitmap;
}
RectangleList<int> getPaintAreas() const override
{
return getFrameSize();
return paintAreas;
}
Direct2DPixelData::Ptr target;
private:
ComSmartPtr<ID2D1DeviceContext1> context;
ComSmartPtr<ID2D1Bitmap1> bitmap;
RectangleList<int> paintAreas;
JUCE_DECLARE_WEAK_REFERENCEABLE (ImagePimpl)
};
//==============================================================================
Direct2DImageContext::Direct2DImageContext (Direct2DPixelData::Ptr targetIn)
: pimpl (new ImagePimpl { *this, targetIn })
Direct2DImageContext::Direct2DImageContext (ComSmartPtr<ID2D1DeviceContext1> context,
ComSmartPtr<ID2D1Bitmap1> bitmap,
const RectangleList<int>& 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
{

View file

@ -38,7 +38,9 @@ namespace juce
class Direct2DImageContext : public Direct2DGraphicsContext
{
public:
explicit Direct2DImageContext (Direct2DPixelData::Ptr);
Direct2DImageContext (ComSmartPtr<ID2D1DeviceContext1>,
ComSmartPtr<ID2D1Bitmap1>,
const RectangleList<int>&);
~Direct2DImageContext() override;

View file

@ -101,6 +101,9 @@ public:
static void flushImage (Image softwareImage, ComSmartPtr<ID2D1Bitmap1> 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<LowLevelGraphicsContext> Direct2DPixelData::createLowLevelContex
{
sendDataChangeMessage();
return std::make_unique<Direct2DImageContext> (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<FlushingContext> (this);
}
void Direct2DPixelData::initialiseBitmapData (Image::BitmapData& bitmap, int x, int y, Image::BitmapData::ReadWriteMode mode)