mirror of
https://github.com/vdr-projects/vdr.git
synced 2025-03-01 10:50:46 +00:00
Fixed reusing OSD in cDvbSpuDecoder
This commit is contained in:
28
dvbspu.c
28
dvbspu.c
@@ -8,7 +8,7 @@
|
||||
*
|
||||
* parts of this file are derived from the OMS program.
|
||||
*
|
||||
* $Id: dvbspu.c 1.8 2004/11/06 11:50:13 kls Exp $
|
||||
* $Id: dvbspu.c 1.9 2005/01/02 15:27:07 kls Exp $
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
@@ -349,6 +349,20 @@ sDvbSpuRect cDvbSpuDecoder::CalcAreaSize(sDvbSpuRect fgsize, cBitmap *fgbmp, sDv
|
||||
return size;
|
||||
}
|
||||
|
||||
static bool OsdMatchesArea(cOsd *osd, tArea &area)
|
||||
{
|
||||
cBitmap *bmp = osd->GetBitmap(0);
|
||||
if (!bmp)
|
||||
return false;
|
||||
if (bmp->Bpp() != area.bpp)
|
||||
return false;
|
||||
if (bmp->X0() != area.x1 || bmp->Y0() != area.y1)
|
||||
return false;
|
||||
if (bmp->Width() != area.Width() || bmp->Height() != area.Height())
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
void cDvbSpuDecoder::Draw(void)
|
||||
{
|
||||
if (!spubmp) {
|
||||
@@ -386,12 +400,16 @@ void cDvbSpuDecoder::Draw(void)
|
||||
}
|
||||
|
||||
if (bg || fg) {
|
||||
int x2 = areaSize.x2;
|
||||
while ((x2 - areaSize.x1 + 1) & 0x03)
|
||||
x2++;
|
||||
tArea Area = { areaSize.x1, areaSize.y1, x2, areaSize.y2, (fg && bg) ? 4 : 2 };
|
||||
if (osd && !OsdMatchesArea(osd, Area)) {
|
||||
delete osd;
|
||||
osd = NULL;
|
||||
}
|
||||
if (osd == NULL) {
|
||||
osd = cOsdProvider::NewOsd(0, 0);
|
||||
int x2 = areaSize.x2;
|
||||
while ((x2 - areaSize.x1 + 1) & 0x03)
|
||||
x2++;
|
||||
tArea Area = { areaSize.x1, areaSize.y1, x2, areaSize.y2, (fg && bg) ? 4 : 2 };
|
||||
osd->SetAreas(&Area, 1);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user