This one pushes ownership a lot wider.
Some checks failed
CI / ubuntu-latest-html-tests (push) Has been cancelled
CI / ubuntu-latest-no-tls (push) Has been cancelled
CI / ubuntu-latest-mbedtls2 (push) Has been cancelled
CI / ubuntu-latest-openssl-3 (push) Has been cancelled
CI / ubuntu-latest-with-old-std (push) Has been cancelled
CI / ubuntu-20-04-openssl-1-1 (push) Has been cancelled
CI / alpine-mbedtls-3_6_0 (push) Has been cancelled
CI / macOS-13-openssl-1-1 (push) Has been cancelled
CI / macOS-13-openssl-3 (push) Has been cancelled
CI / freebsd-14-openssl-3 (push) Has been cancelled
CI / windows-mbedtls (push) Has been cancelled

This commit is contained in:
2025-08-09 12:29:05 -04:00
parent e9baf4e167
commit 9dbf5ee536
7 changed files with 35 additions and 40 deletions

View File

@ -27,38 +27,34 @@ using namespace lout::object;
void ImgRendererDist::setBuffer (core::Imgbuf *buffer, bool resize) void ImgRendererDist::setBuffer (core::Imgbuf *buffer, bool resize)
{ {
for (typed::Iterator <TypedPointer <ImgRenderer> > it = for( auto &tp: children )
children->iterator (); it.hasNext (); ) { {
TypedPointer <ImgRenderer> *tp = it.getNext (); tp->setBuffer (buffer, resize);
tp->getTypedValue()->setBuffer (buffer, resize);
} }
} }
void ImgRendererDist::drawRow (int row) void ImgRendererDist::drawRow (int row)
{ {
for (typed::Iterator <TypedPointer <ImgRenderer> > it = for( auto &tp: children )
children->iterator (); it.hasNext (); ) { {
TypedPointer <ImgRenderer> *tp = it.getNext (); tp->drawRow (row);
tp->getTypedValue()->drawRow (row);
} }
} }
void ImgRendererDist::finish () void ImgRendererDist::finish ()
{ {
for (typed::Iterator <TypedPointer <ImgRenderer> > it = for( auto &tp: children )
children->iterator (); it.hasNext (); ) { {
TypedPointer <ImgRenderer> *tp = it.getNext (); tp->finish ();
tp->getTypedValue()->finish ();
} }
} }
void ImgRendererDist::fatal () void ImgRendererDist::fatal ()
{ {
for (typed::Iterator <TypedPointer <ImgRenderer> > it = for( auto &tp: children )
children->iterator (); it.hasNext (); ) { {
TypedPointer <ImgRenderer> *tp = it.getNext (); tp->fatal ();
tp->getTypedValue()->fatal ();
} }
} }

View File

@ -1,6 +1,8 @@
#ifndef __DW_IMGRENDERER_HH__ #ifndef __DW_IMGRENDERER_HH__
#define __DW_IMGRENDERER_HH__ #define __DW_IMGRENDERER_HH__
#include <set>
#ifndef __INCLUDED_FROM_DW_CORE_HH__ #ifndef __INCLUDED_FROM_DW_CORE_HH__
# error Do not include this file directly, use "core.hh" instead. # error Do not include this file directly, use "core.hh" instead.
#endif #endif
@ -58,25 +60,22 @@ public:
*/ */
class ImgRendererDist: public ImgRenderer class ImgRendererDist: public ImgRenderer
{ {
lout::container::typed::HashSet <lout::object::TypedPointer <ImgRenderer> > std::set< std::unique_ptr< ImgRenderer > > children;
*children;
public: public:
inline ImgRendererDist ()
{ children = new lout::container::typed::HashSet
<lout::object::TypedPointer <ImgRenderer> > (true); }
~ImgRendererDist () { delete children; }
void setBuffer (core::Imgbuf *buffer, bool resize); void setBuffer (core::Imgbuf *buffer, bool resize);
void drawRow (int row); void drawRow (int row);
void finish (); void finish ();
void fatal (); void fatal ();
void put (ImgRenderer *child) void put (std::unique_ptr< ImgRenderer > child)
{ children->put (new lout::object::TypedPointer <ImgRenderer> (child)); } { children.insert( std::move( child ) ); }
void remove (ImgRenderer *child) void
{ lout::object::TypedPointer <ImgRenderer> tp (child); remove( ImgRenderer * child)
children->remove (&tp); } {
children.erase( std::find_if( begin( children ), end( children ),
[&]( const auto &elem ) { return child == elem.get(); } ) );
}
}; };
} // namespace core } // namespace core

View File

@ -846,8 +846,8 @@ void Layout::setBgImage (style::StyleImage *bgImage,
// layout is deleted, "layoutImgRenderer" will be kept, since it // layout is deleted, "layoutImgRenderer" will be kept, since it
// is not specific to the style, but only to this layout. // is not specific to the style, but only to this layout.
if (layoutImgRenderer == NULL) if (layoutImgRenderer == NULL)
layoutImgRenderer = new LayoutImgRenderer (this); layoutImgRenderer = std::make_unique< LayoutImgRenderer >( this ).release();
bgImage->putExternalImgRenderer (layoutImgRenderer); bgImage->putExternalImgRenderer( std::unique_ptr< LayoutImgRenderer >{ layoutImgRenderer } );
} }
} }

View File

@ -625,8 +625,8 @@ StyleImage::StyleImage ()
imgbufTiled = NULL; imgbufTiled = NULL;
imgRendererDist = new ImgRendererDist (); imgRendererDist = new ImgRendererDist ();
styleImgRenderer = new StyleImgRenderer (this); styleImgRenderer= std::make_unique< StyleImgRenderer >( this ).release();
imgRendererDist->put (styleImgRenderer); imgRendererDist->put( std::unique_ptr< StyleImgRenderer >{ styleImgRenderer } );
} }
StyleImage::~StyleImage () StyleImage::~StyleImage ()

View File

@ -889,8 +889,8 @@ public:
* \brief Add an additional ImgRenderer, especially used for * \brief Add an additional ImgRenderer, especially used for
* drawing. * drawing.
*/ */
inline void putExternalImgRenderer (ImgRenderer *ir) inline void putExternalImgRenderer (std::unique_ptr< ImgRenderer > ir)
{ imgRendererDist->put (ir); } { imgRendererDist->put( std::move( ir ) ); }
/** /**
* \brief Remove a previously added additional ImgRenderer. * \brief Remove a previously added additional ImgRenderer.

View File

@ -1838,9 +1838,9 @@ void Textblock::setWordImgRenderer (int wordNo)
Word *word = words->getRef (wordNo); Word *word = words->getRef (wordNo);
if (word->style->backgroundImage) { if (word->style->backgroundImage) {
word->wordImgRenderer = new WordImgRenderer (this, wordNo); word->wordImgRenderer= std::make_unique< WordImgRenderer >( this, wordNo ).release();
word->style->backgroundImage->putExternalImgRenderer word->style->backgroundImage->putExternalImgRenderer
(word->wordImgRenderer); ( std::unique_ptr< WordImgRenderer >{ word->wordImgRenderer } );
} else } else
word->wordImgRenderer = NULL; word->wordImgRenderer = NULL;
} }
@ -1862,9 +1862,9 @@ void Textblock::setSpaceImgRenderer (int wordNo)
Word *word = words->getRef (wordNo); Word *word = words->getRef (wordNo);
if (word->spaceStyle->backgroundImage) { if (word->spaceStyle->backgroundImage) {
word->spaceImgRenderer = new SpaceImgRenderer (this, wordNo); word->spaceImgRenderer= std::make_unique< SpaceImgRenderer >( this, wordNo ).release();
word->spaceStyle->backgroundImage->putExternalImgRenderer word->spaceStyle->backgroundImage->putExternalImgRenderer
(word->spaceImgRenderer); ( std::unique_ptr< SpaceImgRenderer>{ word->spaceImgRenderer } );
} else } else
word->spaceImgRenderer = NULL; word->spaceImgRenderer = NULL;
} }

View File

@ -1337,8 +1337,8 @@ void Widget::setStyle (style::Style *style)
// widget is deleted, "widgetImgRenderer" will be kept, since it // widget is deleted, "widgetImgRenderer" will be kept, since it
// is not specific to the style, but only to this widget. // is not specific to the style, but only to this widget.
if (widgetImgRenderer == NULL) if (widgetImgRenderer == NULL)
widgetImgRenderer = new WidgetImgRenderer (this); widgetImgRenderer = std::make_unique< WidgetImgRenderer >( this ).release();
style->backgroundImage->putExternalImgRenderer (widgetImgRenderer); style->backgroundImage->putExternalImgRenderer( std::unique_ptr< WidgetImgRenderer >{ widgetImgRenderer } );
} }
if (layout != NULL) { if (layout != NULL) {