diff --git a/HISTORY b/HISTORY index 3bf23d1e..a74342d8 100644 --- a/HISTORY +++ b/HISTORY @@ -7578,3 +7578,7 @@ Video Disk Recorder Revision History available and has the same effect as --dirnames=250,40,1. - The macro MaxFileName is now obsolete and may be removed in future versions. Use NAME_MAX directly instead. +- There is no more fixed limit to the maximum number of cPixmap objects an OSD can + create. However, a particular device may still be unable to create an arbitrary + number of pixmaps, due to limited resources. So it's always a good idea to use + as few pixmaps as possible. diff --git a/osd.c b/osd.c index 41997606..b9fdefd9 100644 --- a/osd.c +++ b/osd.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: osd.c 2.34 2013/01/24 11:37:58 kls Exp $ + * $Id: osd.c 2.35 2013/02/08 10:16:47 kls Exp $ */ #include "osd.h" @@ -1631,7 +1631,6 @@ cOsd::cOsd(int Left, int Top, uint Level) savedBitmap = NULL; numBitmaps = 0; savedPixmap = NULL; - numPixmaps = 0; left = Left; top = Top; width = height = 0; @@ -1653,7 +1652,7 @@ cOsd::~cOsd() delete bitmaps[i]; delete savedBitmap; delete savedPixmap; - for (int i = 0; i < numPixmaps; i++) + for (int i = 0; i < pixmaps.Size(); i++) delete pixmaps[i]; for (int i = 0; i < Osds.Size(); i++) { if (Osds[i] == this) { @@ -1702,15 +1701,11 @@ void cOsd::DestroyPixmap(cPixmap *Pixmap) { if (isTrueColor) { LOCK_PIXMAPS; - for (int i = 1; i < numPixmaps; i++) { // begin at 1 - don't let the background pixmap be destroyed! + for (int i = 1; i < pixmaps.Size(); i++) { // begin at 1 - don't let the background pixmap be destroyed! if (pixmaps[i] == Pixmap) { pixmaps[0]->MarkViewPortDirty(Pixmap->ViewPort()); delete Pixmap; - while (i < numPixmaps - 1) { - pixmaps[i] = pixmaps[i + 1]; - i++; - } - numPixmaps--; + pixmaps[i] = NULL; return; } } @@ -1722,12 +1717,13 @@ cPixmap *cOsd::AddPixmap(cPixmap *Pixmap) { if (Pixmap) { LOCK_PIXMAPS; - if (numPixmaps < MAXOSDPIXMAPS) - return pixmaps[numPixmaps++] = Pixmap; - else - esyslog("ERROR: too many OSD pixmaps requested (maximum is %d)", MAXOSDPIXMAPS); + for (int i = 0; i < pixmaps.Size(); i++) { + if (!pixmaps[i]) + return pixmaps[i] = Pixmap; + } + pixmaps.Append(Pixmap); } - return NULL; + return Pixmap; } cPixmapMemory *cOsd::RenderPixmaps(void) @@ -1737,12 +1733,13 @@ cPixmapMemory *cOsd::RenderPixmaps(void) LOCK_PIXMAPS; // Collect overlapping dirty rectangles: cRect d; - for (int i = 0; i < numPixmaps; i++) { - cPixmap *pm = pixmaps[i]; - if (!pm->DirtyViewPort().IsEmpty()) { - if (d.IsEmpty() || d.Intersects(pm->DirtyViewPort())) { - d.Combine(pm->DirtyViewPort()); - pm->SetClean(); + for (int i = 0; i < pixmaps.Size(); i++) { + if (cPixmap *pm = pixmaps[i]) { + if (!pm->DirtyViewPort().IsEmpty()) { + if (d.IsEmpty() || d.Intersects(pm->DirtyViewPort())) { + d.Combine(pm->DirtyViewPort()); + pm->SetClean(); + } } } } @@ -1758,10 +1755,11 @@ cPixmapMemory *cOsd::RenderPixmaps(void) Pixmap->Clear(); // Render the individual pixmaps into the resulting pixmap: for (int Layer = 0; Layer < MAXPIXMAPLAYERS; Layer++) { - for (int i = 0; i < numPixmaps; i++) { - cPixmap *pm = pixmaps[i]; - if (pm->Layer() == Layer) + for (int i = 0; i < pixmaps.Size(); i++) { + if (cPixmap *pm = pixmaps[i]) { + if (pm->Layer() == Layer) Pixmap->DrawPixmap(pm, d); + } } } #ifdef DebugDirty diff --git a/osd.h b/osd.h index 0084caa6..7eb8db62 100644 --- a/osd.h +++ b/osd.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: osd.h 2.18 2012/12/03 13:49:02 kls Exp $ + * $Id: osd.h 2.19 2013/02/08 09:47:56 kls Exp $ */ #ifndef __OSD_H @@ -701,7 +701,6 @@ public: }; #define MAXOSDAREAS 16 -#define MAXOSDPIXMAPS 64 /// The cOsd class is the interface to the "On Screen Display". /// An actual output device needs to derive from this class and implement @@ -725,8 +724,7 @@ private: cBitmap *bitmaps[MAXOSDAREAS]; int numBitmaps; cPixmapMemory *savedPixmap; - cPixmap *pixmaps[MAXOSDPIXMAPS]; - int numPixmaps; + cVector pixmaps; int left, top, width, height; uint level; bool active; @@ -755,14 +753,10 @@ protected: virtual void SetActive(bool On) { active = On; } ///< Sets this OSD to be the active one. ///< A derived class must call cOsd::SetActive(On). - const cPixmap * const *Pixmaps(void) { return pixmaps; } - ///< Returns the list of currently active pixmaps in this OSD. - int NumPixmaps(void) { return numPixmaps; } - ///< Returns the number of currently active pixmaps in this OSD. cPixmap *AddPixmap(cPixmap *Pixmap); ///< Adds the given Pixmap to the list of currently active pixmaps in this OSD. - ///< Returns Pixmap if the operation was successful, or NULL if the maximum - ///< number of pixmaps has been exceeded. + ///< Returns Pixmap if the operation was successful, or NULL if for some reason + ///< the pixmap could not be added to the list. ///< A derived class that implements its own cPixmap class must call AddPixmap() ///< in order to add a newly created pixmap to the OSD's list of pixmaps. cPixmapMemory *RenderPixmaps(void); @@ -824,7 +818,8 @@ public: ///< The caller must not delete the returned object, it will be deleted when ///< the OSD is deleted. DestroyPixmap() can be called if a pixmap shall be ///< destroyed before the OSD is deleted. - ///< If this is not a true color OSD, this function returns NULL. + ///< If this is not a true color OSD, or if the pixmap could not be created + ///< due to limited resources, this function returns NULL. virtual void DestroyPixmap(cPixmap *Pixmap); ///< Destroys the given Pixmap, which has previously been created by a call to ///< CreatePixmap(). When the OSD is deleted, all pixmaps are destroyed