3535namespace juce
3636{
3737
38+ class LowLevelGraphicsSoftwareRenderer ::Impl : public RenderingHelpers::StackBasedLowLevelGraphicsContext<RenderingHelpers::SoftwareRendererSavedState>
39+ {
40+ public:
41+ using SavedStateType = RenderingHelpers::SoftwareRendererSavedState;
42+
43+ using StackBasedLowLevelGraphicsContext::StackBasedLowLevelGraphicsContext;
44+
45+ std::unique_ptr<ImageType> getPreferredImageTypeForTemporaryImages () const override
46+ {
47+ jassertfalse;
48+ return {};
49+ }
50+ };
51+
3852LowLevelGraphicsSoftwareRenderer::LowLevelGraphicsSoftwareRenderer (const Image& image)
39- : RenderingHelpers::StackBasedLowLevelGraphicsContext<RenderingHelpers::SoftwareRendererSavedState>
40- (new RenderingHelpers::SoftwareRendererSavedState (image, image.getBounds()))
53+ : impl (std::make_unique<Impl> (std::make_unique<Impl::SavedStateType> (image, image.getBounds())))
4154{
4255 JUCE_TRACE_LOG_PAINT_CALL (etw::startGDIImage, getFrameId ());
4356}
4457
4558LowLevelGraphicsSoftwareRenderer::LowLevelGraphicsSoftwareRenderer (const Image& image, Point<int > origin,
4659 const RectangleList<int >& initialClip)
47- : RenderingHelpers::StackBasedLowLevelGraphicsContext<RenderingHelpers::SoftwareRendererSavedState>
48- (new RenderingHelpers::SoftwareRendererSavedState (image, initialClip, origin))
60+ : impl (std::make_unique<Impl> (std::make_unique<Impl::SavedStateType> (image, initialClip, origin)))
4961{
50-
5162 JUCE_TRACE_EVENT_INT_RECT_LIST (etw::startGDIFrame, etw::softwareRendererKeyword, getFrameId (), initialClip);
5263}
5364
@@ -56,4 +67,152 @@ LowLevelGraphicsSoftwareRenderer::~LowLevelGraphicsSoftwareRenderer()
5667 JUCE_TRACE_LOG_PAINT_CALL (etw::endGDIFrame, getFrameId ());
5768}
5869
70+ bool LowLevelGraphicsSoftwareRenderer::isVectorDevice () const
71+ {
72+ return impl->isVectorDevice ();
73+ }
74+
75+ Rectangle<int > LowLevelGraphicsSoftwareRenderer::getClipBounds () const
76+ {
77+ return impl->getClipBounds ();
78+ }
79+
80+ bool LowLevelGraphicsSoftwareRenderer::isClipEmpty () const
81+ {
82+ return impl->isClipEmpty ();
83+ }
84+
85+ void LowLevelGraphicsSoftwareRenderer::setOrigin (Point<int > o)
86+ {
87+ impl->setOrigin (o);
88+ }
89+
90+ void LowLevelGraphicsSoftwareRenderer::addTransform (const AffineTransform& t)
91+ {
92+ impl->addTransform (t);
93+ }
94+
95+ float LowLevelGraphicsSoftwareRenderer::getPhysicalPixelScaleFactor () const
96+ {
97+ return impl->getPhysicalPixelScaleFactor ();
98+ }
99+
100+ bool LowLevelGraphicsSoftwareRenderer::clipRegionIntersects (const Rectangle<int >& r)
101+ {
102+ return impl->clipRegionIntersects (r);
103+ }
104+
105+ bool LowLevelGraphicsSoftwareRenderer::clipToRectangle (const Rectangle<int >& r)
106+ {
107+ return impl->clipToRectangle (r);
108+ }
109+
110+ bool LowLevelGraphicsSoftwareRenderer::clipToRectangleList (const RectangleList<int >& r)
111+ {
112+ return impl->clipToRectangleList (r);
113+ }
114+
115+ void LowLevelGraphicsSoftwareRenderer::excludeClipRectangle (const Rectangle<int >& r)
116+ {
117+ impl->excludeClipRectangle (r);
118+ }
119+
120+ void LowLevelGraphicsSoftwareRenderer::clipToPath (const Path& path, const AffineTransform& t)
121+ {
122+ impl->clipToPath (path, t);
123+ }
124+
125+ void LowLevelGraphicsSoftwareRenderer::clipToImageAlpha (const Image& im, const AffineTransform& t)
126+ {
127+ impl->clipToImageAlpha (im, t);
128+ }
129+
130+ void LowLevelGraphicsSoftwareRenderer::saveState ()
131+ {
132+ impl->saveState ();
133+ }
134+
135+ void LowLevelGraphicsSoftwareRenderer::restoreState ()
136+ {
137+ impl->restoreState ();
138+ }
139+
140+ void LowLevelGraphicsSoftwareRenderer::beginTransparencyLayer (float opacity)
141+ {
142+ impl->beginTransparencyLayer (opacity);
143+ }
144+
145+ void LowLevelGraphicsSoftwareRenderer::endTransparencyLayer ()
146+ {
147+ impl->endTransparencyLayer ();
148+ }
149+
150+ void LowLevelGraphicsSoftwareRenderer::setFill (const FillType& fillType)
151+ {
152+ impl->setFill (fillType);
153+ }
154+
155+ void LowLevelGraphicsSoftwareRenderer::setOpacity (float newOpacity)
156+ {
157+ impl->setOpacity (newOpacity);
158+ }
159+
160+ void LowLevelGraphicsSoftwareRenderer::setInterpolationQuality (Graphics::ResamplingQuality quality)
161+ {
162+ impl->setInterpolationQuality (quality);
163+ }
164+
165+ void LowLevelGraphicsSoftwareRenderer::fillRect (const Rectangle<int >& r, bool replace)
166+ {
167+ impl->fillRect (r, replace);
168+ }
169+
170+ void LowLevelGraphicsSoftwareRenderer::fillRect (const Rectangle<float >& r)
171+ {
172+ impl->fillRect (r);
173+ }
174+
175+ void LowLevelGraphicsSoftwareRenderer::fillRectList (const RectangleList<float >& list)
176+ {
177+ impl->fillRectList (list);
178+ }
179+
180+ void LowLevelGraphicsSoftwareRenderer::fillPath (const Path& path, const AffineTransform& t)
181+ {
182+ impl->fillPath (path, t);
183+ }
184+
185+ void LowLevelGraphicsSoftwareRenderer::drawImage (const Image& im, const AffineTransform& t)
186+ {
187+ impl->drawImage (im, t);
188+ }
189+
190+ void LowLevelGraphicsSoftwareRenderer::drawLine (const Line<float >& line)
191+ {
192+ impl->drawLine (line);
193+ }
194+
195+ void LowLevelGraphicsSoftwareRenderer::setFont (const Font& newFont)
196+ {
197+ impl->setFont (newFont);
198+ }
199+
200+ const Font& LowLevelGraphicsSoftwareRenderer::getFont ()
201+ {
202+ return impl->getFont ();
203+ }
204+
205+ uint64_t LowLevelGraphicsSoftwareRenderer::getFrameId () const
206+ {
207+ return impl->getFrameId ();
208+ }
209+
210+
211+ void LowLevelGraphicsSoftwareRenderer::drawGlyphs (Span<const uint16_t > glyphs,
212+ Span<const Point<float >> positions,
213+ const AffineTransform& t)
214+ {
215+ return impl->drawGlyphs (glyphs, positions, t);
216+ }
217+
59218} // namespace juce
0 commit comments