diff --git a/modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h b/modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h index c685fcfbc7..39f26bf6df 100644 --- a/modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h +++ b/modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h @@ -137,6 +137,16 @@ public: Span>, const AffineTransform&) = 0; + /** Returns the optimal ImageType for creating temporary images in this GraphicsContext. + + While this typically matches the GraphicsContext's native ImageType, certain scenarios + may benefit from using a different format for temporary operations (e.g., for + performance, memory efficiency, or specific rendering requirements). + + @return A unique_ptr to the recommended ImageType instance for temporary images + */ + virtual std::unique_ptr getPreferredImageTypeForTemporaryImages() const = 0; + virtual void drawRoundedRectangle (const Rectangle& r, float cornerSize, float lineThickness) { Path p; diff --git a/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h b/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h index 1ee34d92fe..ea1385ef5a 100644 --- a/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h +++ b/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h @@ -59,6 +59,11 @@ public: /** Destructor. */ ~LowLevelGraphicsSoftwareRenderer() override; + std::unique_ptr getPreferredImageTypeForTemporaryImages() const override + { + return std::make_unique(); + } + private: JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (LowLevelGraphicsSoftwareRenderer) }; diff --git a/modules/juce_graphics/native/juce_CoreGraphicsContext_mac.h b/modules/juce_graphics/native/juce_CoreGraphicsContext_mac.h index abb29dd6bb..7e232803ee 100644 --- a/modules/juce_graphics/native/juce_CoreGraphicsContext_mac.h +++ b/modules/juce_graphics/native/juce_CoreGraphicsContext_mac.h @@ -99,6 +99,11 @@ public: uint64_t getFrameId() const override { return 0; } + std::unique_ptr getPreferredImageTypeForTemporaryImages() const override + { + return std::make_unique(); + } + void drawEllipse (const Rectangle& area, float lineThickness) override; void fillEllipse (const Rectangle& area) override; diff --git a/modules/juce_graphics/native/juce_Direct2DGraphicsContext_windows.h b/modules/juce_graphics/native/juce_Direct2DGraphicsContext_windows.h index 293e96753d..56d0186c54 100644 --- a/modules/juce_graphics/native/juce_Direct2DGraphicsContext_windows.h +++ b/modules/juce_graphics/native/juce_Direct2DGraphicsContext_windows.h @@ -106,6 +106,11 @@ public: uint64_t getFrameId() const override { return frame; } + std::unique_ptr getPreferredImageTypeForTemporaryImages() const override + { + return std::make_unique(); + } + Direct2DMetrics::Ptr metrics; protected: diff --git a/modules/juce_graphics/native/juce_Direct2DImage_windows.cpp b/modules/juce_graphics/native/juce_Direct2DImage_windows.cpp index 2ff5ffa5c6..b8d446e237 100644 --- a/modules/juce_graphics/native/juce_Direct2DImage_windows.cpp +++ b/modules/juce_graphics/native/juce_Direct2DImage_windows.cpp @@ -729,6 +729,10 @@ std::unique_ptr Direct2DPixelData::createLowLevelContex void drawGlyphs (Span, Span>, const AffineTransform&) override {} uint64_t getFrameId() const override { return 0; } Font font { FontOptions{} }; + std::unique_ptr getPreferredImageTypeForTemporaryImages() const override + { + return std::make_unique(); + } }; return std::make_unique(); diff --git a/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp b/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp index e767a2d991..8cb49b1c3e 100644 --- a/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp +++ b/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp @@ -1839,6 +1839,11 @@ struct ShaderContext final : public RenderingHelpers::StackBasedLowLevelGraphics static_cast (*stack).fillRectWithCustomShader (shader, area); } + std::unique_ptr getPreferredImageTypeForTemporaryImages() const override + { + return std::make_unique(); + } + GLState glState; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ShaderContext) @@ -1850,7 +1855,7 @@ struct NonShaderContext final : public LowLevelGraphicsSoftwareRenderer : LowLevelGraphicsSoftwareRenderer (im), target (t), image (im) {} - ~NonShaderContext() + ~NonShaderContext() override { JUCE_CHECK_OPENGL_ERROR auto previousFrameBufferTarget = OpenGLFrameBuffer::getCurrentFrameBufferTarget(); @@ -1883,6 +1888,11 @@ struct NonShaderContext final : public LowLevelGraphicsSoftwareRenderer JUCE_CHECK_OPENGL_ERROR } + std::unique_ptr getPreferredImageTypeForTemporaryImages() const noexcept override + { + return std::make_unique(); + } + private: Target target; Image image;