1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-10 23:44:24 +00:00

Direct2D: Use Image NativeExtensions to avoid dynamic casts in graphics context

This commit is contained in:
reuk 2025-01-15 16:42:57 +00:00
parent 9b08c8fd51
commit d3ca5961e7
No known key found for this signature in database
33 changed files with 252 additions and 105 deletions

View file

@ -1983,6 +1983,7 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_graphics/native/juce_Direct2DImageContext_windows.h"
"../../../../../modules/juce_graphics/native/juce_Direct2DMetrics_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_Direct2DMetrics_windows.h"
"../../../../../modules/juce_graphics/native/juce_Direct2DPixelDataPage_windows.h"
"../../../../../modules/juce_graphics/native/juce_Direct2DResources_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_DirectWriteTypeface_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_DirectX_windows.h"
@ -4580,6 +4581,7 @@ set_source_files_properties(
"../../../../../modules/juce_graphics/native/juce_Direct2DImageContext_windows.h"
"../../../../../modules/juce_graphics/native/juce_Direct2DMetrics_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_Direct2DMetrics_windows.h"
"../../../../../modules/juce_graphics/native/juce_Direct2DPixelDataPage_windows.h"
"../../../../../modules/juce_graphics/native/juce_Direct2DResources_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_DirectWriteTypeface_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_DirectX_windows.h"

View file

@ -4372,6 +4372,7 @@
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DImage_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DImageContext_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DMetrics_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DPixelDataPage_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_DirectX_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_EventTracing.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/>

View file

@ -7518,6 +7518,9 @@
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DMetrics_windows.h">
<Filter>JUCE Modules\juce_graphics\native</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DPixelDataPage_windows.h">
<Filter>JUCE Modules\juce_graphics\native</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_DirectX_windows.h">
<Filter>JUCE Modules\juce_graphics\native</Filter>
</ClInclude>

View file

@ -4372,6 +4372,7 @@
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DImage_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DImageContext_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DMetrics_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DPixelDataPage_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_DirectX_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_EventTracing.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/>

View file

@ -7518,6 +7518,9 @@
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DMetrics_windows.h">
<Filter>JUCE Modules\juce_graphics\native</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DPixelDataPage_windows.h">
<Filter>JUCE Modules\juce_graphics\native</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_DirectX_windows.h">
<Filter>JUCE Modules\juce_graphics\native</Filter>
</ClInclude>

View file

@ -1745,6 +1745,7 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_graphics/native/juce_Direct2DImageContext_windows.h"
"../../../../../modules/juce_graphics/native/juce_Direct2DMetrics_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_Direct2DMetrics_windows.h"
"../../../../../modules/juce_graphics/native/juce_Direct2DPixelDataPage_windows.h"
"../../../../../modules/juce_graphics/native/juce_Direct2DResources_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_DirectWriteTypeface_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_DirectX_windows.h"
@ -4002,6 +4003,7 @@ set_source_files_properties(
"../../../../../modules/juce_graphics/native/juce_Direct2DImageContext_windows.h"
"../../../../../modules/juce_graphics/native/juce_Direct2DMetrics_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_Direct2DMetrics_windows.h"
"../../../../../modules/juce_graphics/native/juce_Direct2DPixelDataPage_windows.h"
"../../../../../modules/juce_graphics/native/juce_Direct2DResources_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_DirectWriteTypeface_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_DirectX_windows.h"

View file

@ -3827,6 +3827,7 @@
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DImage_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DImageContext_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DMetrics_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DPixelDataPage_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_DirectX_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_EventTracing.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/>

View file

@ -6528,6 +6528,9 @@
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DMetrics_windows.h">
<Filter>JUCE Modules\juce_graphics\native</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DPixelDataPage_windows.h">
<Filter>JUCE Modules\juce_graphics\native</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_DirectX_windows.h">
<Filter>JUCE Modules\juce_graphics\native</Filter>
</ClInclude>

View file

@ -1875,6 +1875,7 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_graphics/native/juce_Direct2DImageContext_windows.h"
"../../../../../modules/juce_graphics/native/juce_Direct2DMetrics_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_Direct2DMetrics_windows.h"
"../../../../../modules/juce_graphics/native/juce_Direct2DPixelDataPage_windows.h"
"../../../../../modules/juce_graphics/native/juce_Direct2DResources_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_DirectWriteTypeface_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_DirectX_windows.h"
@ -4285,6 +4286,7 @@ set_source_files_properties(
"../../../../../modules/juce_graphics/native/juce_Direct2DImageContext_windows.h"
"../../../../../modules/juce_graphics/native/juce_Direct2DMetrics_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_Direct2DMetrics_windows.h"
"../../../../../modules/juce_graphics/native/juce_Direct2DPixelDataPage_windows.h"
"../../../../../modules/juce_graphics/native/juce_Direct2DResources_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_DirectWriteTypeface_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_DirectX_windows.h"

View file

@ -4060,6 +4060,7 @@
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DImage_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DImageContext_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DMetrics_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DPixelDataPage_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_DirectX_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_EventTracing.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/>

View file

@ -6963,6 +6963,9 @@
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DMetrics_windows.h">
<Filter>JUCE Modules\juce_graphics\native</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DPixelDataPage_windows.h">
<Filter>JUCE Modules\juce_graphics\native</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_DirectX_windows.h">
<Filter>JUCE Modules\juce_graphics\native</Filter>
</ClInclude>

View file

@ -4060,6 +4060,7 @@
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DImage_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DImageContext_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DMetrics_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DPixelDataPage_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_DirectX_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_EventTracing.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/>

View file

@ -6963,6 +6963,9 @@
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DMetrics_windows.h">
<Filter>JUCE Modules\juce_graphics\native</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DPixelDataPage_windows.h">
<Filter>JUCE Modules\juce_graphics\native</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_DirectX_windows.h">
<Filter>JUCE Modules\juce_graphics\native</Filter>
</ClInclude>

View file

@ -1764,6 +1764,7 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_graphics/native/juce_Direct2DImageContext_windows.h"
"../../../../../modules/juce_graphics/native/juce_Direct2DMetrics_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_Direct2DMetrics_windows.h"
"../../../../../modules/juce_graphics/native/juce_Direct2DPixelDataPage_windows.h"
"../../../../../modules/juce_graphics/native/juce_Direct2DResources_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_DirectWriteTypeface_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_DirectX_windows.h"
@ -4101,6 +4102,7 @@ set_source_files_properties(
"../../../../../modules/juce_graphics/native/juce_Direct2DImageContext_windows.h"
"../../../../../modules/juce_graphics/native/juce_Direct2DMetrics_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_Direct2DMetrics_windows.h"
"../../../../../modules/juce_graphics/native/juce_Direct2DPixelDataPage_windows.h"
"../../../../../modules/juce_graphics/native/juce_Direct2DResources_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_DirectWriteTypeface_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_DirectX_windows.h"

View file

@ -3925,6 +3925,7 @@
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DImage_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DImageContext_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DMetrics_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DPixelDataPage_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_DirectX_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_EventTracing.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/>

View file

@ -6690,6 +6690,9 @@
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DMetrics_windows.h">
<Filter>JUCE Modules\juce_graphics\native</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DPixelDataPage_windows.h">
<Filter>JUCE Modules\juce_graphics\native</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_DirectX_windows.h">
<Filter>JUCE Modules\juce_graphics\native</Filter>
</ClInclude>

View file

@ -2625,6 +2625,7 @@
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DImage_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DImageContext_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DMetrics_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DPixelDataPage_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_DirectX_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_EventTracing.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/>

View file

@ -4332,6 +4332,9 @@
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DMetrics_windows.h">
<Filter>JUCE Modules\juce_graphics\native</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DPixelDataPage_windows.h">
<Filter>JUCE Modules\juce_graphics\native</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_DirectX_windows.h">
<Filter>JUCE Modules\juce_graphics\native</Filter>
</ClInclude>

View file

@ -2625,6 +2625,7 @@
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DImage_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DImageContext_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DMetrics_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DPixelDataPage_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_DirectX_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_EventTracing.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/>

View file

@ -4332,6 +4332,9 @@
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DMetrics_windows.h">
<Filter>JUCE Modules\juce_graphics\native</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DPixelDataPage_windows.h">
<Filter>JUCE Modules\juce_graphics\native</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_DirectX_windows.h">
<Filter>JUCE Modules\juce_graphics\native</Filter>
</ClInclude>

View file

@ -4172,6 +4172,7 @@
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DImage_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DImageContext_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DMetrics_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DPixelDataPage_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_DirectX_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_EventTracing.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/>

View file

@ -7122,6 +7122,9 @@
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DMetrics_windows.h">
<Filter>JUCE Modules\juce_graphics\native</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DPixelDataPage_windows.h">
<Filter>JUCE Modules\juce_graphics\native</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_DirectX_windows.h">
<Filter>JUCE Modules\juce_graphics\native</Filter>
</ClInclude>

View file

@ -4172,6 +4172,7 @@
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DImage_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DImageContext_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DMetrics_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DPixelDataPage_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_DirectX_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_EventTracing.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/>

View file

@ -7122,6 +7122,9 @@
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DMetrics_windows.h">
<Filter>JUCE Modules\juce_graphics\native</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DPixelDataPage_windows.h">
<Filter>JUCE Modules\juce_graphics\native</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_DirectX_windows.h">
<Filter>JUCE Modules\juce_graphics\native</Filter>
</ClInclude>

View file

@ -3901,6 +3901,7 @@
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DImage_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DImageContext_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DMetrics_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DPixelDataPage_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_DirectX_windows.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_EventTracing.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/>

View file

@ -6657,6 +6657,9 @@
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DMetrics_windows.h">
<Filter>JUCE Modules\juce_graphics\native</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_Direct2DPixelDataPage_windows.h">
<Filter>JUCE Modules\juce_graphics\native</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_DirectX_windows.h">
<Filter>JUCE Modules\juce_graphics\native</Filter>
</ClInclude>

View file

@ -276,14 +276,22 @@ public:
/* For subsection images, this returns the top-left pixel inside the root image */
Point<int> getTopLeft() const { return impl->getTopLeft(); }
#if JUCE_WINDOWS
Span<const Direct2DPixelDataPage> getPages (ComSmartPtr<ID2D1Device1> x) const { return impl->getPages (x); }
#endif
private:
struct Base
{
virtual ~Base() = default;
virtual Point<int> getTopLeft() const = 0;
};
template <typename Impl>
#if JUCE_WINDOWS
virtual Span<const Direct2DPixelDataPage> getPages (ComSmartPtr<ID2D1Device1>) const = 0;
#endif
};
template <typename Impl>
class Concrete : public Base
{
public:
@ -292,6 +300,10 @@ private:
Point<int> getTopLeft() const override { return impl.getTopLeft(); }
#if JUCE_WINDOWS
Span<const Direct2DPixelDataPage> getPages (ComSmartPtr<ID2D1Device1> x) const override { return impl.getPages (x); }
#endif
private:
Impl impl;
};
@ -377,6 +389,13 @@ public:
explicit Wrapped (Ptr selfIn)
: self (selfIn) {}
#if JUCE_WINDOWS
Span<const Direct2DPixelDataPage> getPages (ComSmartPtr<ID2D1Device1> x) const
{
return self->sourceImage->getNativeExtensions().getPages (x);
}
#endif
Point<int> getTopLeft() const
{
return self->sourceImage->getNativeExtensions().getTopLeft() + self->area.getTopLeft();
@ -465,6 +484,10 @@ auto ImagePixelData::getNativeExtensions() -> NativeExtensions
struct Wrapped
{
Point<int> getTopLeft() const { return {}; }
#if JUCE_WINDOWS
Span<const Direct2DPixelDataPage> getPages (ComSmartPtr<ID2D1Device1>) const { return {}; }
#endif
};
return NativeExtensions { Wrapped{} };

View file

@ -95,6 +95,8 @@
#pragma comment(lib, "dxguid.lib")
#endif
#include "native/juce_Direct2DPixelDataPage_windows.h"
#elif JUCE_IOS
#import <QuartzCore/QuartzCore.h>
#import <CoreText/CoreText.h>

View file

@ -245,6 +245,33 @@ private:
// layer stack accordingly.
};
struct PagesAndArea
{
Image imageHandle;
Span<const Direct2DPixelDataPage> pages;
Rectangle<int> area;
static PagesAndArea make (const Image& image, ComSmartPtr<ID2D1Device1> device)
{
using GetImage = Image (*) (const Image&);
constexpr GetImage converters[] { [] (const Image& i) { return i; },
[] (const Image& i) { return NativeImageType{}.convert (i); } };
for (auto* getImage : converters)
{
const auto converted = getImage (image);
const auto native = converted.getPixelData()->getNativeExtensions();
if (auto pages = native.getPages (device); ! pages.empty())
return PagesAndArea { converted, std::move (pages), converted.getBounds().withPosition (native.getTopLeft()) };
}
// Not sure how this could happen unless the NativeImageType no longer provides Windows native details...
jassertfalse;
return {};
}
};
struct Direct2DGraphicsContext::SavedState
{
public:
@ -338,30 +365,30 @@ public:
if (fillType.image.isNull())
return;
const auto d2d1Bitmap = [&]
{
if (auto direct2DPixelData = dynamic_cast<Direct2DPixelData*> (fillType.image.getPixelData().get()))
if (const auto page = direct2DPixelData->getFirstPageForDevice (D2DUtilities::getDeviceForContext (context)))
if (page->GetPixelFormat().format == DXGI_FORMAT_B8G8R8A8_UNORM)
return page;
const auto device = D2DUtilities::getDeviceForContext (context);
const auto imageFormat = fillType.image.getFormat();
const auto targetFormat = imageFormat == Image::SingleChannel ? Image::ARGB : imageFormat;
const auto pagesAndArea = PagesAndArea::make (fillType.image.convertedToFormat (targetFormat), device);
JUCE_D2DMETRICS_SCOPED_ELAPSED_TIME (Direct2DMetricsHub::getInstance()->imageContextMetrics, createBitmapTime);
if (pagesAndArea.pages.empty())
return;
return Direct2DBitmap::toBitmap (fillType.image, context, Image::ARGB);
}();
const auto bitmap = pagesAndArea.pages.front().bitmap;
if (d2d1Bitmap != nullptr)
{
D2D1_BRUSH_PROPERTIES brushProps { fillType.getOpacity(), D2DUtilities::transformToMatrix (fillType.transform) };
auto bmProps = D2D1::BitmapBrushProperties (D2D1_EXTEND_MODE_WRAP, D2D1_EXTEND_MODE_WRAP);
if (const auto hr = context->CreateBitmapBrush (d2d1Bitmap,
bmProps,
brushProps,
bitmapBrush.resetAndGetPointerAddress()); SUCCEEDED (hr))
{
currentBrush = bitmapBrush;
}
}
if (bitmap == nullptr)
return;
D2D1_BRUSH_PROPERTIES brushProps { fillType.getOpacity(), D2DUtilities::transformToMatrix (fillType.transform) };
auto bmProps = D2D1::BitmapBrushProperties (D2D1_EXTEND_MODE_WRAP, D2D1_EXTEND_MODE_WRAP);
const auto hr = context->CreateBitmapBrush (bitmap,
bmProps,
brushProps,
bitmapBrush.resetAndGetPointerAddress());
if (FAILED (hr))
return;
currentBrush = bitmapBrush;
}
else if (fillType.isGradient())
{
@ -1170,42 +1197,38 @@ void Direct2DGraphicsContext::clipToImageAlpha (const Image& sourceImage, const
return;
}
// Is this a Direct2D image already?
ComSmartPtr<ID2D1Bitmap> d2d1Bitmap;
const auto device = D2DUtilities::getDeviceForContext (deviceContext);
const auto pagesAndArea = PagesAndArea::make (sourceImage, device);
if (auto direct2DPixelData = dynamic_cast<Direct2DPixelData*> (sourceImage.getPixelData().get()))
d2d1Bitmap = direct2DPixelData->getFirstPageForDevice (D2DUtilities::getDeviceForContext (deviceContext));
if (pagesAndArea.pages.empty())
return;
if (! d2d1Bitmap)
{
// Convert sourceImage to single-channel alpha-only maskImage
d2d1Bitmap = Direct2DBitmap::toBitmap (sourceImage, deviceContext, Image::SingleChannel);
}
const auto bitmap = pagesAndArea.pages.front().bitmap;
if (d2d1Bitmap)
{
// Make a transformed bitmap brush using the bitmap
// As usual, apply the current transform first *then* the transform parameter
ComSmartPtr<ID2D1BitmapBrush> brush;
auto matrix = D2DUtilities::transformToMatrix (brushTransform);
D2D1_BRUSH_PROPERTIES brushProps = { 1.0f, matrix };
if (bitmap == nullptr)
return;
auto bitmapBrushProps = D2D1::BitmapBrushProperties (D2D1_EXTEND_MODE_WRAP, D2D1_EXTEND_MODE_WRAP);
auto hr = deviceContext->CreateBitmapBrush (d2d1Bitmap, bitmapBrushProps, brushProps, brush.resetAndGetPointerAddress());
// Make a transformed bitmap brush using the bitmap
// As usual, apply the current transform first *then* the transform parameter
ComSmartPtr<ID2D1BitmapBrush> brush;
auto matrix = D2DUtilities::transformToMatrix (brushTransform);
D2D1_BRUSH_PROPERTIES brushProps = { 1.0f, matrix };
if (SUCCEEDED (hr))
{
// Push the clipping layer onto the layer stack
// Don't set maskTransform in the LayerParameters struct; that only applies to geometry clipping
// Do set the contentBounds member, transformed appropriately
auto layerParams = D2D1::LayerParameters1();
auto transformedBounds = sourceImage.getBounds().toFloat().transformedBy (brushTransform);
layerParams.contentBounds = D2DUtilities::toRECT_F (transformedBounds);
layerParams.opacityBrush = brush;
auto bitmapBrushProps = D2D1::BitmapBrushProperties (D2D1_EXTEND_MODE_WRAP, D2D1_EXTEND_MODE_WRAP);
auto hr = deviceContext->CreateBitmapBrush (bitmap, bitmapBrushProps, brushProps, brush.resetAndGetPointerAddress());
currentState->pushLayer (layerParams);
}
}
if (FAILED (hr))
return;
// Push the clipping layer onto the layer stack
// Don't set maskTransform in the LayerParameters struct; that only applies to geometry clipping
// Do set the contentBounds member, transformed appropriately
auto layerParams = D2D1::LayerParameters1();
auto transformedBounds = sourceImage.getBounds().toFloat().transformedBy (brushTransform);
layerParams.contentBounds = D2DUtilities::toRECT_F (transformedBounds);
layerParams.opacityBrush = brush;
currentState->pushLayer (layerParams);
}
}
@ -1451,53 +1474,36 @@ void Direct2DGraphicsContext::drawImage (const Image& imageIn, const AffineTrans
if (auto deviceContext = getPimpl()->getDeviceContext())
{
auto image = NativeImageType{}.convert (imageIn);
Direct2DPixelData* nativeBitmap = nullptr;
Rectangle<int> imageClipArea;
const auto device = D2DUtilities::getDeviceForContext (deviceContext);
const auto pagesAndArea = PagesAndArea::make (imageIn, device);
const auto imageTransform = currentState->currentTransform.getTransformWith (transform);
if (auto* subsectionPixelData = dynamic_cast<SubsectionPixelData*> (image.getPixelData().get()))
{
if (auto direct2DPixelData = dynamic_cast<Direct2DPixelData*> (subsectionPixelData->getSourcePixelData().get()))
{
nativeBitmap = direct2DPixelData;
imageClipArea = subsectionPixelData->getSubsection();
}
}
else if (auto direct2DPixelData = dynamic_cast<Direct2DPixelData*> (image.getPixelData().get()))
{
nativeBitmap = direct2DPixelData;
imageClipArea = { direct2DPixelData->width, direct2DPixelData->height };
}
else
{
// This shouldn't happen, we converted the image to a native type already
jassertfalse;
}
if (! nativeBitmap)
if (pagesAndArea.pages.empty())
{
jassertfalse;
return;
}
auto drawTiles = [&] (const auto& pixelData, auto&& getRect)
const auto imageTransform = currentState->currentTransform.getTransformWith (transform);
auto drawTiles = [&] (auto&& getRect)
{
for (const auto& page : pixelData->getPagesForDevice (D2DUtilities::getDeviceForContext (deviceContext)))
for (const auto& page : pagesAndArea.pages)
{
if (page.bitmap == nullptr)
continue;
const auto pageBounds = page.getBounds();
const auto intersection = pageBounds.toFloat().getIntersection (imageClipArea.toFloat());
const auto intersection = pageBounds.toFloat().getIntersection (pagesAndArea.area.toFloat());
if (intersection.isEmpty())
continue;
const auto src = intersection - pageBounds.getPosition().toFloat();
const auto dst = getRect (intersection - imageClipArea.getPosition().toFloat());
const auto dst = getRect (intersection - pagesAndArea.area.getPosition().toFloat());
const auto [srcConverted, dstConverted] = std::tuple (D2DUtilities::toRECT_F (src),
D2DUtilities::toRECT_F (dst));
if (nativeBitmap->pixelFormat == Image::SingleChannel)
if (page.bitmap->GetPixelFormat().format == DXGI_FORMAT_A8_UNORM)
{
const auto lastColour = currentState->colourBrush->GetColor();
const auto lastMode = deviceContext->GetAntialiasMode();
@ -1526,7 +1532,7 @@ void Direct2DGraphicsContext::drawImage (const Image& imageIn, const AffineTrans
if (imageTransform.isOnlyTranslation() || D2DHelpers::isTransformAxisAligned (imageTransform))
{
drawTiles (nativeBitmap, [&] (auto intersection)
drawTiles ([&] (auto intersection)
{
return intersection.transformedBy (imageTransform);
});
@ -1536,7 +1542,7 @@ void Direct2DGraphicsContext::drawImage (const Image& imageIn, const AffineTrans
ScopedTransform scopedTransform { *getPimpl(), currentState, transform };
drawTiles (nativeBitmap, [] (auto intersection)
drawTiles ([] (auto intersection)
{
return intersection;
});

View file

@ -35,13 +35,6 @@
namespace juce
{
Rectangle<int> Direct2DPixelDataPage::getBounds() const
{
return bitmap != nullptr ? D2DUtilities::rectFromSize (bitmap->GetPixelSize()).withPosition (topLeft)
: Rectangle<int>{};
}
//==============================================================================
static std::vector<Direct2DPixelDataPage> makePages (ComSmartPtr<ID2D1Device1> device,
ImagePixelData::Ptr backingData,
bool needsClear)
@ -783,6 +776,29 @@ bool Direct2DPixelData::canBackup() const
});
}
auto Direct2DPixelData::getNativeExtensions() -> NativeExtensions
{
struct Wrapped
{
explicit Wrapped (Ptr s)
: self (s) {}
Span<const Direct2DPixelDataPage> getPages (ComSmartPtr<ID2D1Device1> x) const
{
return self->getPagesForDevice (x);
}
Point<int> getTopLeft() const
{
return {};
}
Ptr self;
};
return NativeExtensions { Wrapped { this } };
}
//==============================================================================
ImagePixelData::Ptr NativeImageType::create (Image::PixelFormat format, int width, int height, bool clearImage) const
{

View file

@ -35,19 +35,6 @@
namespace juce
{
/* A single bitmap that represents a subsection of a virtual bitmap. */
struct Direct2DPixelDataPage
{
/* The bounds of the stored bitmap inside the virtual bitmap. */
Rectangle<int> getBounds() const;
/* The stored subsection bitmap. */
ComSmartPtr<ID2D1Bitmap1> bitmap;
/* The top-left position of this virtual bitmap inside the virtual bitmap. */
Point<int> topLeft;
};
/* A set of pages that together represent a full virtual bitmap.
All pages in the set always share the same resource context.
Additionally, stores a reference to a software-backed bitmap, the content of which will
@ -204,6 +191,8 @@ public:
BackupExtensions* getBackupExtensions() override { return this; }
const BackupExtensions* getBackupExtensions() const override { return this; }
ImagePixelDataNativeExtensions getNativeExtensions() override;
private:
enum class State
{

View file

@ -0,0 +1,58 @@
/*
==============================================================================
This file is part of the JUCE framework.
Copyright (c) Raw Material Software Limited
JUCE is an open source framework subject to commercial or open source
licensing.
By downloading, installing, or using the JUCE framework, or combining the
JUCE framework with any other source code, object code, content or any other
copyrightable work, you agree to the terms of the JUCE End User Licence
Agreement, and all incorporated terms including the JUCE Privacy Policy and
the JUCE Website Terms of Service, as applicable, which will bind you. If you
do not agree to the terms of these agreements, we will not license the JUCE
framework to you, and you must discontinue the installation or download
process and cease use of the JUCE framework.
JUCE End User Licence Agreement: https://juce.com/legal/juce-8-licence/
JUCE Privacy Policy: https://juce.com/juce-privacy-policy
JUCE Website Terms of Service: https://juce.com/juce-website-terms-of-service/
Or:
You may also use this code under the terms of the AGPLv3:
https://www.gnu.org/licenses/agpl-3.0.en.html
THE JUCE FRAMEWORK IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL
WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING WARRANTY OF
MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, ARE DISCLAIMED.
==============================================================================
*/
namespace juce
{
/* A single bitmap that represents a subsection of a virtual bitmap. */
struct Direct2DPixelDataPage
{
/* The bounds of the stored bitmap inside the virtual bitmap. */
Rectangle<int> getBounds() const
{
if (bitmap == nullptr)
return {};
const auto size = bitmap->GetPixelSize();
return Rectangle { (int) size.width, (int) size.height }.withPosition (topLeft);
}
/* The stored subsection bitmap. */
ComSmartPtr<ID2D1Bitmap1> bitmap;
/* The top-left position of this virtual bitmap inside the virtual bitmap. */
Point<int> topLeft;
};
} // namespace juce

View file

@ -199,6 +199,7 @@
#include <juce_graphics/native/juce_Direct2DGraphicsContext_windows.h>
#include <juce_graphics/native/juce_Direct2DHwndContext_windows.h>
#include <juce_graphics/native/juce_DirectX_windows.h>
#include <juce_graphics/native/juce_Direct2DPixelDataPage_windows.h>
#include <juce_graphics/native/juce_Direct2DImage_windows.h>
#include <juce_graphics/native/juce_Direct2DImageContext_windows.h>