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:
parent
8a1bf07f14
commit
d344c2bf71
3 changed files with 47 additions and 38 deletions
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue