summaryrefslogtreecommitdiff
path: root/dvbspu.c
diff options
context:
space:
mode:
authorKlaus Schmidinger <vdr@tvdr.de>2009-05-09 16:41:59 +0200
committerKlaus Schmidinger <vdr@tvdr.de>2009-05-09 16:41:59 +0200
commit74646c048722be45ba4c5becec8765540fe940e8 (patch)
tree709b6807860b3d6fb32f9f2b220a055f573f19ab /dvbspu.c
parentbf543736b630a67123aad71998ca354de3a7cfeb (diff)
downloadvdr-74646c048722be45ba4c5becec8765540fe940e8.tar.gz
vdr-74646c048722be45ba4c5becec8765540fe940e8.tar.bz2
Removed limitation to PAL resolution from SPU handling
Diffstat (limited to 'dvbspu.c')
-rw-r--r--dvbspu.c31
1 files changed, 15 insertions, 16 deletions
diff --git a/dvbspu.c b/dvbspu.c
index 1ca5435f..aaf608d0 100644
--- a/dvbspu.c
+++ b/dvbspu.c
@@ -8,7 +8,7 @@
*
* parts of this file are derived from the OMS program.
*
- * $Id: dvbspu.c 1.22 2007/02/03 10:13:18 kls Exp $
+ * $Id: dvbspu.c 2.1 2009/05/09 16:25:59 kls Exp $
*/
#include "dvbspu.h"
@@ -55,18 +55,16 @@ void cDvbSpuPalette::setPalette(const uint32_t * pal)
#define setMin(a, b) if (a > b) a = b
#define setMax(a, b) if (a < b) a = b
-#define spuXres 720
-#define spuYres 576
-
#define revRect(r1, r2) { r1.x1 = r2.x2; r1.y1 = r2.y2; r1.x2 = r2.x1; r1.y2 = r2.y1; }
cDvbSpuBitmap::cDvbSpuBitmap(sDvbSpuRect size,
uint8_t * fodd, uint8_t * eodd,
uint8_t * feven, uint8_t * eeven)
{
- if (size.x1 < 0 || size.y1 < 0 || size.x2 >= spuXres
- || size.y2 >= spuYres)
- throw;
+ size.x1 = max(size.x1, 0);
+ size.y1 = max(size.y1, 0);
+ size.x2 = min(size.x2, Setup.OSDWidth);
+ size.y2 = min(size.y2, Setup.OSDHeight);
bmpsize = size;
revRect(minsize[0], size);
@@ -74,10 +72,11 @@ cDvbSpuBitmap::cDvbSpuBitmap(sDvbSpuRect size,
revRect(minsize[2], size);
revRect(minsize[3], size);
- if (!(bmp = new uint8_t[spuXres * spuYres * sizeof(uint8_t)]))
- throw;
+ int MemSize = bmpsize.width() * bmpsize.height() * sizeof(uint8_t);
+ bmp = new uint8_t[MemSize];
- memset(bmp, 0, spuXres * spuYres * sizeof(uint8_t));
+ if (bmp)
+ memset(bmp, 0, MemSize);
putFieldData(0, fodd, eodd);
putFieldData(1, feven, eeven);
}
@@ -94,10 +93,10 @@ cBitmap *cDvbSpuBitmap::getBitmap(const aDvbSpuPalDescr paldescr,
int h = size.height();
int w = size.width();
- if (size.y1 + h >= spuYres)
- h = spuYres - size.y1 - 1;
- if (size.x1 + w >= spuXres)
- w = spuXres - size.x1 - 1;
+ if (size.y1 + h >= bmpsize.height())
+ h = bmpsize.height() - size.y1 - 1;
+ if (size.x1 + w >= bmpsize.width())
+ w = bmpsize.width() - size.x1 - 1;
if (w & 0x03)
w += 4 - (w & 0x03);
@@ -114,7 +113,7 @@ cBitmap *cDvbSpuBitmap::getBitmap(const aDvbSpuPalDescr paldescr,
// set the content
for (int yp = 0; yp < h; yp++) {
for (int xp = 0; xp < w; xp++) {
- uint8_t idx = bmp[(size.y1 + yp) * spuXres + size.x1 + xp];
+ uint8_t idx = bmp[(size.y1 + yp) * bmpsize.width() + size.x1 + xp];
ret->SetIndex(xp, yp, idx);
}
}
@@ -150,7 +149,7 @@ bool cDvbSpuBitmap::getMinSize(const aDvbSpuPalDescr paldescr,
void cDvbSpuBitmap::putPixel(int xp, int yp, int len, uint8_t colorid)
{
- memset(bmp + spuXres * yp + xp, colorid, len);
+ memset(bmp + bmpsize.width() * yp + xp, colorid, len);
setMin(minsize[colorid].x1, xp);
setMin(minsize[colorid].y1, yp);
setMax(minsize[colorid].x2, xp + len - 1);