Dillo v3.1.1-119-g140d9ebd
|
The platform independent interface for image buffers. More...
#include <imgbuf.hh>
Public Types | |
enum | Type { RGB , RGBA , GRAY , INDEXED , INDEXED_ALPHA } |
Public Member Functions | |
Imgbuf () | |
~Imgbuf () | |
virtual void | setCMap (int *colors, int num_colors)=0 |
virtual void | copyRow (int row, const byte *data)=0 |
virtual void | newScan ()=0 |
virtual Imgbuf * | getScaledBuf (int width, int height)=0 |
virtual void | getRowArea (int row, dw::core::Rectangle *area)=0 |
virtual int | getRootWidth ()=0 |
virtual int | getRootHeight ()=0 |
virtual Imgbuf * | createSimilarBuf (int width, int height)=0 |
Creates an image buffer with same parameters (type, gamma etc.) except size. | |
virtual void | copyTo (Imgbuf *dest, int xDestRoot, int yDestRoot, int xSrc, int ySrc, int widthSrc, int heightSrc)=0 |
Copies another image buffer into this image buffer. | |
virtual void | ref ()=0 |
virtual void | unref ()=0 |
virtual bool | lastReference ()=0 |
virtual void | setDeleteOnUnref (bool deleteOnUnref)=0 |
virtual bool | isReferred ()=0 |
Public Member Functions inherited from lout::object::Object | |
virtual | ~Object () |
The destructor is defined as virtual (but not abstract), so that destruction of Object's works properly. | |
virtual bool | equals (Object *other) |
Returns, whether two objects are equal. | |
virtual int | hashValue () |
Return a hash value for the object. | |
virtual Object * | clone () |
Return an exact copy of the object. | |
virtual void | intoStringBuffer (misc::StringBuffer *sb) |
Store a textual representation of the object in a misc::StringBuffer. | |
const char * | toString () |
Use object::Object::intoStringBuffer to return a textual representation of the object. | |
virtual size_t | sizeOf () |
Return the number of bytes, this object totally uses. | |
Public Member Functions inherited from lout::signal::ObservedObject | |
virtual | ~ObservedObject () |
void | connectDeletion (DeletionReceiver *receiver) |
The platform independent interface for image buffers.
Image buffers depend on the platform (see Images and Backgrounds in Dw), but have this general, platform independent interface. The purpose of an image buffer is
The latter must be done independently from the window.
Image buffers are created by calling dw::core::Platform::createImgbuf.
dw::core::Imgbuf supports five image types, which are listed in the table below. The representation defines, how the colors are stored within the data, which is passed to dw::core::Imgbuf::copyRow.
Type (dw::core::Imgbuf::Type) | Bytes per Pixel | Representation |
---|---|---|
dw::core::Imgbuf::RGB | 3 | red, green, blue |
dw::core::Imgbuf::RGBA | 4 | red, green, blue, alpha |
dw::core::Imgbuf::GRAY | 1 | gray value |
dw::core::Imgbuf::INDEXED | 1 | index to colormap |
dw::core::Imgbuf::INDEXED_ALPHA | 1 | index to colormap |
The last two types need a colormap, which is set by dw::core::Imgbuf::setCMap, which must be called before dw::core::Imgbuf::copyRow. This function expects the colors as 32 bit unsigned integers, which have the format 0xrrbbgg (for indexed images), or 0xaarrggbb (for indexed alpha), respectively.
The buffer with the original size, which was created by dw::core::Platform::createImgbuf, is called root buffer. Imgbuf provides the ability to scale buffers. Generally, both root buffers, as well as scaled buffers, may be shared, memory management is done by reference counters.
Via dw::core::Imgbuf::getScaledBuf, you can retrieve a scaled buffer. Generally, something like this must work always, in an efficient way:
oldBuf may both be a root buffer, or a scaled buffer.
The root buffer keeps a list of all children, and all methods operating on the image data (dw::core::Imgbuf::copyRow and dw::core::Imgbuf::setCMap) are delegated to the scaled buffers, when processed, and inherited, when a new scaled buffer is created. This means, that they must only be performed for the root buffer.
A possible implementation could be (dw::fltk::FltkImgbuf does it this way):
If the method is called with an already scaled image buffer, this is delegated to the root buffer.
If the given size is the original size, the root buffer is returned, with an increased reference counter.
Otherwise, if this buffer has already been scaled to the given size, return this scaled buffer, with an increased reference counter.
Special care is to be taken, when the root buffer is not used anymore, i.e. after dw::core::Imgbuf::unref the reference counter is 0, but there are still scaled buffers. Since all methods operating on the image data (dw::core::Imgbuf::copyRow and dw::core::Imgbuf::setCMap) are called for the root buffer, the root buffer is still needed, and so must not be deleted at this point. This is, how dw::fltk::FltkImgbuf solves this problem:
dw::fltk::FltkImgbuf::unref does, for root buffers, check, not only whether dw::fltk::FltkImgbuf::refCount is 0, but also, whether there are children left. When the latter is the case, the buffer is not deleted.
In the following example:
the root buffer is not deleted, when dw::core::Imgbuf::unref is called, since a scaled buffer is left. After calling dw::core::Imgbuf::unref for the scaled buffer, it is deleted, and after it, the root buffer.
dw::core::Imgbuf provides no methods for drawing, instead, this is done by the views (implementation of dw::core::View).
There are two situations, when drawing is necessary:
To react on expose events, the function dw::core::View::drawImage should be used, with the following parameters:
|
inline |
Definition at line 166 of file imgbuf.hh.
References DBG_OBJ_BASECLASS, and DBG_OBJ_CREATE.
|
inline |
Definition at line 172 of file imgbuf.hh.
References DBG_OBJ_DELETE.
|
pure virtual |
Implemented in dw::fltk::FltkImgbuf.
Referenced by imageDrawTimeout(), imageDrawTimeout(), imageDrawTimeout(), and imageDrawTimeout().
|
pure virtual |
Copies another image buffer into this image buffer.
|
pure virtual |
Creates an image buffer with same parameters (type, gamma etc.) except size.
Implemented in dw::fltk::FltkImgbuf.
Referenced by dw::core::style::StyleImage::StyleImgRenderer::setBuffer().
|
pure virtual |
Implemented in dw::fltk::FltkImgbuf.
Referenced by dw::core::style::drawBackgroundImage(), dw::core::style::StyleImage::StyleImgRenderer::setBuffer(), and dw::Image::setBuffer().
|
pure virtual |
|
pure virtual |
Implemented in dw::fltk::FltkImgbuf.
|
pure virtual |
Implemented in dw::fltk::FltkImgbuf.
Referenced by dw::Image::setBuffer(), dw::Image::sizeAllocateImpl(), solution1(), solution2(), and solution3().
|
pure virtual |
|
pure virtual |
|
pure virtual |
Implemented in dw::fltk::FltkImgbuf.
|
pure virtual |
Implemented in dw::fltk::FltkImgbuf.
Referenced by dw::core::style::StyleImage::StyleImgRenderer::setBuffer(), dw::Image::setBuffer(), and solution1().
|
pure virtual |
Implemented in dw::fltk::FltkImgbuf.
|
pure virtual |
|
pure virtual |