From 3cd87d3c47640bf18b6bee3f58a327f601b0f80e Mon Sep 17 00:00:00 2001 From: Klaus Schmidinger Date: Sun, 26 Feb 2006 14:43:00 +0100 Subject: [PATCH] The DrawBitmap() function now has a new parameter 'Overlay' that allows a bitmap to be drawn with a transparent background --- CONTRIBUTORS | 2 ++ HISTORY | 2 ++ osd.c | 20 ++++++++++++-------- osd.h | 10 +++++++--- 4 files changed, 23 insertions(+), 11 deletions(-) diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 9dc97598..f2ab0839 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -1748,6 +1748,8 @@ Jaroslaw Swierczynski Alexander Hans for reporting a crash when pressing '0' in the "Schedule" menu on a channel that doesn't have any EPG data + for giving the DrawBitmap() function a new parameter 'Overlay' that allows a bitmap + to be drawn with a transparent background Daniel Karsubka for suggesting to write the epg.data file when VDR exits diff --git a/HISTORY b/HISTORY index 75bef2ca..c8f09224 100644 --- a/HISTORY +++ b/HISTORY @@ -4410,3 +4410,5 @@ Video Disk Recorder Revision History - The 'event id' in EPG data has been extended to 32 bit, so that external tools can generate ids that don't collide with those from the DVB data stream (suggested by Matthias Schniedermeyer). +- The DrawBitmap() function now has a new parameter 'Overlay' that allows a bitmap + to be drawn with a transparent background (thanks to Alexander Hans). diff --git a/osd.c b/osd.c index e7dd9afc..cf16fe63 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 1.66 2006/02/05 13:46:37 kls Exp $ + * $Id: osd.c 1.67 2006/02/26 14:31:31 kls Exp $ */ #include "osd.h" @@ -344,7 +344,7 @@ void cBitmap::DrawPixel(int x, int y, tColor Color) SetIndex(x, y, Index(Color)); } -void cBitmap::DrawBitmap(int x, int y, const cBitmap &Bitmap, tColor ColorFg, tColor ColorBg, bool ReplacePalette) +void cBitmap::DrawBitmap(int x, int y, const cBitmap &Bitmap, tColor ColorFg, tColor ColorBg, bool ReplacePalette, bool Overlay) { if (bitmap && Bitmap.bitmap && Intersects(x, y, x + Bitmap.Width() - 1, y + Bitmap.Height() - 1)) { if (Covers(x, y, x + Bitmap.Width() - 1, y + Bitmap.Height() - 1)) @@ -354,16 +354,20 @@ void cBitmap::DrawBitmap(int x, int y, const cBitmap &Bitmap, tColor ColorFg, tC if (ReplacePalette && Covers(x + x0, y + y0, x + x0 + Bitmap.Width() - 1, y + y0 + Bitmap.Height() - 1)) { Replace(Bitmap); for (int ix = 0; ix < Bitmap.width; ix++) { - for (int iy = 0; iy < Bitmap.height; iy++) - SetIndex(x + ix, y + iy, Bitmap.bitmap[Bitmap.width * iy + ix]); + for (int iy = 0; iy < Bitmap.height; iy++) { + if (!Overlay || Bitmap.bitmap[Bitmap.width * iy + ix] != 0) + SetIndex(x + ix, y + iy, Bitmap.bitmap[Bitmap.width * iy + ix]); + } } } else { tIndexes Indexes; Take(Bitmap, &Indexes, ColorFg, ColorBg); for (int ix = 0; ix < Bitmap.width; ix++) { - for (int iy = 0; iy < Bitmap.height; iy++) - SetIndex(x + ix, y + iy, Indexes[int(Bitmap.bitmap[Bitmap.width * iy + ix])]); + for (int iy = 0; iy < Bitmap.height; iy++) { + if (!Overlay || Bitmap.bitmap[Bitmap.width * iy + ix] != 0) + SetIndex(x + ix, y + iy, Indexes[int(Bitmap.bitmap[Bitmap.width * iy + ix])]); + } } } } @@ -683,10 +687,10 @@ void cOsd::DrawPixel(int x, int y, tColor Color) bitmaps[i]->DrawPixel(x, y, Color); } -void cOsd::DrawBitmap(int x, int y, const cBitmap &Bitmap, tColor ColorFg, tColor ColorBg, bool ReplacePalette) +void cOsd::DrawBitmap(int x, int y, const cBitmap &Bitmap, tColor ColorFg, tColor ColorBg, bool ReplacePalette, bool Overlay) { for (int i = 0; i < numBitmaps; i++) - bitmaps[i]->DrawBitmap(x, y, Bitmap, ColorFg, ColorBg, ReplacePalette); + bitmaps[i]->DrawBitmap(x, y, Bitmap, ColorFg, ColorBg, ReplacePalette, Overlay); } void cOsd::DrawText(int x, int y, const char *s, tColor ColorFg, tColor ColorBg, const cFont *Font, int Width, int Height, int Alignment) diff --git a/osd.h b/osd.h index d716df84..122a3f9a 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 1.51 2006/02/05 13:46:37 kls Exp $ + * $Id: osd.h 1.52 2006/02/26 14:35:19 kls Exp $ */ #ifndef __OSD_H @@ -157,13 +157,15 @@ public: ///< Sets the pixel at the given coordinates to the given Color, which is ///< a full 32 bit ARGB value. ///< If the coordinates are outside the bitmap area, no pixel will be set. - void DrawBitmap(int x, int y, const cBitmap &Bitmap, tColor ColorFg = 0, tColor ColorBg = 0, bool ReplacePalette = false); + void DrawBitmap(int x, int y, const cBitmap &Bitmap, tColor ColorFg = 0, tColor ColorBg = 0, bool ReplacePalette = false, bool Overlay = false); ///< Sets the pixels in this bitmap with the data from the given ///< Bitmap, putting the upper left corner of the Bitmap at (x, y). ///< If ColorFg or ColorBg is given, the first palette entry of the Bitmap ///< will be mapped to ColorBg and the second palette entry will be mapped to ///< ColorFg (palette indexes are defined so that 0 is the background and ///< 1 is the foreground color). + ///< If Overlay is true, any pixel in Bitmap that has color index 0 will + ///< not overwrite the corresponding pixel in the target area. void DrawText(int x, int y, const char *s, tColor ColorFg, tColor ColorBg, const cFont *Font, int Width = 0, int Height = 0, int Alignment = taDefault); ///< Draws the given string at coordinates (x, y) with the given foreground ///< and background color and font. If Width and Height are given, the text @@ -278,13 +280,15 @@ public: ///< If the OSD area has been divided into separate sub-areas, and the ///< given coordinates don't fall into any of these sub-areas, no pixel will ///< be set. - virtual void DrawBitmap(int x, int y, const cBitmap &Bitmap, tColor ColorFg = 0, tColor ColorBg = 0, bool ReplacePalette = false); + virtual void DrawBitmap(int x, int y, const cBitmap &Bitmap, tColor ColorFg = 0, tColor ColorBg = 0, bool ReplacePalette = false, bool Overlay = false); ///< Sets the pixels in the OSD with the data from the given ///< Bitmap, putting the upper left corner of the Bitmap at (x, y). ///< If ColorFg or ColorBg is given, the first palette entry of the Bitmap ///< will be mapped to ColorBg and the second palette entry will be mapped to ///< ColorFg (palette indexes are defined so that 0 is the background and ///< 1 is the foreground color). + ///< If Overlay is true, any pixel in Bitmap that has color index 0 will + ///< not overwrite the corresponding pixel in the target area. virtual void DrawText(int x, int y, const char *s, tColor ColorFg, tColor ColorBg, const cFont *Font, int Width = 0, int Height = 0, int Alignment = taDefault); ///< Draws the given string at coordinates (x, y) with the given foreground ///< and background color and font. If Width and Height are given, the text