diff options
| author | Klaus Schmidinger <vdr@tvdr.de> | 2013-02-08 10:29:32 +0100 | 
|---|---|---|
| committer | Klaus Schmidinger <vdr@tvdr.de> | 2013-02-08 10:29:32 +0100 | 
| commit | 245ae52d36043db99206d912ba38aac3a3a783bc (patch) | |
| tree | 06b4177df2163fb370ba35703f7244c6ff3f79fa | |
| parent | 7f66e1573e056b26598cb8d37b5f65fe7276eb25 (diff) | |
| download | vdr-245ae52d36043db99206d912ba38aac3a3a783bc.tar.gz vdr-245ae52d36043db99206d912ba38aac3a3a783bc.tar.bz2 | |
There is no more fixed limit to the maximum number of cPixmap objects an OSD can create
| -rw-r--r-- | HISTORY | 4 | ||||
| -rw-r--r-- | osd.c | 44 | ||||
| -rw-r--r-- | osd.h | 17 | 
3 files changed, 31 insertions, 34 deletions
| @@ -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. @@ -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 @@ -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<cPixmap *> 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 | 
