summaryrefslogtreecommitdiff
path: root/dxr3osd_subpicture.c
diff options
context:
space:
mode:
authorChristian Gmeiner <christian.gmeiner@gmail.com>2009-01-07 14:15:37 +0100
committerChristian Gmeiner <christian.gmeiner@gmail.com>2009-01-07 14:15:37 +0100
commit48c753433b7e2aab49ba3924ff07e15d04980026 (patch)
tree073b3bbcda2e73bee4b7fa2b0b5847ec27243012 /dxr3osd_subpicture.c
parent688fa4424ae76592448a7fc33476c6bef107a594 (diff)
downloadvdr-plugin-dxr3-48c753433b7e2aab49ba3924ff07e15d04980026.tar.gz
vdr-plugin-dxr3-48c753433b7e2aab49ba3924ff07e15d04980026.tar.bz2
cleanup the osd stuff
There was the idea to support two types of osds - the subpicture based one and the ffmpeg based one. But there is no ffmpeg based one and I think that there will be never on. The current spu code needs to be improved (have patches) and most of the osd 'problems' should be eaten. If there will be an ffmpeg based osd, we can easily 'revert' my changes.
Diffstat (limited to 'dxr3osd_subpicture.c')
-rw-r--r--dxr3osd_subpicture.c281
1 files changed, 0 insertions, 281 deletions
diff --git a/dxr3osd_subpicture.c b/dxr3osd_subpicture.c
deleted file mode 100644
index 9cfdb39..0000000
--- a/dxr3osd_subpicture.c
+++ /dev/null
@@ -1,281 +0,0 @@
-#include "dxr3osd_subpicture.h"
-
-// Enables some time measure debugging code
-// (taken from the osdteletext plugin, thanks folks)
-#ifdef timingdebug
-#include <sys/timeb.h>
-class cTime
-{
- // Debugging: Simple class to measure time
- timeb start;
-public:
- void Start()
- {
- ftime(&start);
- }
- void Stop(char *txt)
- {
- timeb t;
- ftime(&t);
- int s = t.time-start.time;
- int ms = t.millitm - start.millitm;
- if (ms<0)
- {
- s--;
- ms += 1000;
- }
- printf("%s: %i.%03i\n", txt, s, ms);
- }
-};
-#endif
-
-#define MAXNUMWINDOWS 7 // OSD windows are counted 1...7
-
-// ==================================
-//! constructor
-cDxr3SubpictureOsd::cDxr3SubpictureOsd(int Left, int Top, uint Level)
- : cOsd(Left, Top, Level)
-{
- shown = false;
- Palette = new cPalette(4);
- last = new cTimeMs();
- last->Set(-cDxr3ConfigData::Instance().GetOsdFlushRate());
- Spu = &cSPUEncoder::Instance();
-}
-
-// ==================================
-cDxr3SubpictureOsd::~cDxr3SubpictureOsd()
-{
- SetActive(false);
- delete Palette;
- delete last;
-}
-
-// ==================================
-void cDxr3SubpictureOsd::SetActive(bool On)
-{
- if (On != Active())
- {
- // Clears the OSD screen image when it becomes active
- // removes it from screen when it becomes inactive
- cOsd::SetActive(On);
- if (On)
- {
- Spu->Clear();
- }
- else
- {
- Spu->StopSpu();
- }
- }
-}
-
-// ==================================
-eOsdError cDxr3SubpictureOsd::CanHandleAreas(const tArea *Areas, int NumAreas)
-{
-
- eOsdError Result = cOsd::CanHandleAreas(Areas, NumAreas);
- if (Result == oeOk)
- {
- if (NumAreas > MAXNUMWINDOWS)
- {
- return oeTooManyAreas;
- }
-
- for (int i = 0; i < NumAreas; i++)
- {
- if (Areas[i].bpp != 1 &&
- Areas[i].bpp != 2 &&
- Areas[i].bpp != 4 &&
- Areas[i].bpp != 8)
- {
- return oeBppNotSupported;
- }
-
- if ((Areas[i].Width() & (8 / Areas[i].bpp - 1)) != 0)
- {
- return oeWrongAlignment;
- }
- }
- }
- return Result;
-}
-
-eOsdError cDxr3SubpictureOsd::SetAreas(const tArea *Areas, int NumAreas)
-{
- if (shown)
- {
- Spu->Clear();
- shown = false;
- }
- return cOsd::SetAreas(Areas, NumAreas);
-}
-
-// ==================================
-void cDxr3SubpictureOsd::Flush()
-{
- if (!Active())
- return;
- if (last->Elapsed() < cDxr3ConfigData::Instance().GetOsdFlushRate())
- return;
- last->Set();
-
-#ifdef timingdebug
- cTime t;
- t.Start();
-#endif
-
- cBitmap *Bitmap;
- int oldi;
- int newi;
- int i;
- int indexfree[16];
- int firstfree = -1;
- int indexnoassigned[16];
- int firstnoassigned = -1;
- bool colfree[16];
- int NumNewColors;
- int NumOldColors;
-
- //determine the palette used by all bitmaps (without alpha channel)
-
- cPalette *newPalette = new cPalette(4);
- for (i = 0; i < 16; i++)
- colfree[i]=true;
- for (i = 0; (Bitmap = GetBitmap(i)) != NULL; i++)
- {
- int nc;
- const tColor *col = Bitmap->Colors(nc);
- if (col)
- for (int kk = 0; kk < nc; kk++)
- newPalette->Index(col[kk] & 0x00FFFFFF);
- }
- const tColor *newColors = newPalette->Colors(NumNewColors);
- const tColor *oldColors = Palette->Colors(NumOldColors);
- // colors already assigned
- for (newi = 0; newi < NumNewColors; newi++)
- {
- for (oldi = 0; oldi < NumOldColors; oldi++)
- {
- if (newColors[newi] == oldColors[oldi])
- {
- colfree[oldi] = false;
- break;
- }
- }
- if (oldi >= NumOldColors)
- {
- firstnoassigned++;
- indexnoassigned[firstnoassigned] = newi;
- }
- }
- // unused colors
- for (i = 0; i < NumOldColors; i++)
- {
- if (colfree[i]) {
- firstfree++;
- indexfree[firstfree] = i;
- }
- }
- // replace unused colors with unassigned ones
- for (i = 0; i <= firstnoassigned; i++)
- {
- newi = indexnoassigned[i];
- if (firstfree >= 0)
- {
- Palette->SetColor(indexfree[firstfree], newColors[newi]);
- firstfree--;
- } else {
- Palette->Index(newColors[newi]);
- }
- }
- delete newPalette;
-
- // Shove the bitmaps to the OSD global bitmap
- for (int i = 0; (Bitmap = GetBitmap(i)) != NULL; i++)
- {
- int x1 = 0, y1 = 0, x2 = 0, y2 = 0;
- if (Bitmap->Dirty(x1, y1, x2, y2))
- {
- /* TODO workaround:
- apparently the bitmap sent to the driver always has to be a
- multiple of 8 bits wide, and (dx * dy) also has to be a
- multiple of 8. Fix driver (should be able to handle any size
- bitmaps!)
- This isn't actually necessary with this plugin, but since other
- plugins rely on this behaviour to work correctly, I left it
- here. It doesn't hurt too much.
- */
-
-// http://article.gmane.org/gmane.linux.vdr/21572
-//#define optimize_bitmap_transfer
-#ifdef optimize_bitmap_transfer
- while ((x1 > 0 || x2 < Bitmap->Width() - 1) &&
- ((x2 - x1) & 7) != 7)
- {
- if (x2 < Bitmap->Width() - 1)
- {
- x2++;
- }
- else if (x1 > 0)
- {
- x1--;
- }
- }
-
- //TODO "... / 2" <==> Bpp???
- while ((y1 > 0 || y2 < Bitmap->Height() - 1) &&
- (((x2 - x1 + 1) * (y2 - y1 + 1) / 2) & 7) != 0)
- {
- if (y2 < Bitmap->Height() - 1)
- {
- y2++;
- }
- else if (y1 > 0)
- {
- y1--;
- }
- }
-
- while ((x1 > 0 || x2 < Bitmap->Width() - 1) &&
- (((x2 - x1 + 1) * (y2 - y1 + 1) / 2) & 7) != 0)
- {
- if (x2 < Bitmap->Width() - 1)
- {
- x2++;
- }
- else if (x1 > 0)
- {
- x1--;
- }
- }
-#else
- x1 = 0;
- y1 = 0;
- x2 = Bitmap->Width() - 1;
- y2 = Bitmap->Height() - 1;
-#endif
-
- Spu->SetPalette(i + 1, Palette, Bitmap);
- int origx = Left() + Bitmap->X0();
- int origy = Top() + Bitmap->Y0();
- Spu->CopyBlockIntoOSD(i + 1, Bitmap->Width(), origx + x1,
- origy + y1, origx + x2, origy + y2,
- Bitmap->Data(x1, y1));
- Bitmap->Clean();
- }
- }
-
- Spu->Flush(Palette);
- shown = true;
-#ifdef timingdebug
- t.Stop("cDxr3SubpictureOsd::Flush");
-#endif
-}
-
-// Local variables:
-// mode: c++
-// c-file-style: "stroustrup"
-// c-file-offsets: ((inline-open . 0))
-// indent-tabs-mode: t
-// End: