diff options
Diffstat (limited to 'PLUGINS/src/osddemo/osddemo.c')
-rw-r--r-- | PLUGINS/src/osddemo/osddemo.c | 142 |
1 files changed, 126 insertions, 16 deletions
diff --git a/PLUGINS/src/osddemo/osddemo.c b/PLUGINS/src/osddemo/osddemo.c index 2fbbb075..c25d5763 100644 --- a/PLUGINS/src/osddemo/osddemo.c +++ b/PLUGINS/src/osddemo/osddemo.c @@ -3,16 +3,93 @@ * * See the README file for copyright information and how to reach the author. * - * $Id: osddemo.c 2.8 2013/01/12 14:12:23 kls Exp $ + * $Id: osddemo.c 2.9 2013/02/13 13:46:31 kls Exp $ */ #include <vdr/osd.h> #include <vdr/plugin.h> -static const char *VERSION = "0.2.5"; +static const char *VERSION = "0.3.0"; static const char *DESCRIPTION = "Demo of arbitrary OSD setup"; static const char *MAINMENUENTRY = "Osd Demo"; +// --- DrawEllipses ---------------------------------------------------------- + +void DrawEllipse(cOsd *Osd, int x1, int y1, int x2, int y2, int Quadrants) +{ + Osd->DrawRectangle(x1 + 2, y1 + 2, x2 - 2, y2 - 2, clrGreen); + Osd->DrawEllipse(x1 + 3, y1 + 3, x2 - 3, y2 - 3, clrRed, Quadrants); +} + +void DrawEllipses(cOsd *Osd) +{ + int xa = 0; + int ya = 0; + int xb = Osd->Width() - 1; + int yb = Osd->Height() - 1; + int x0 = xa; + int x5 = xb; + int x1 = x0 + (xb - xa) / 5; + int x2 = x0 + (xb - xa) * 2 / 5; + int x3 = x0 + (xb - xa) * 3 / 5; + int x4 = x0 + (xb - xa) * 4 / 5; + int y0 = ya; + int y4 = yb; + int y2 = (y0 + y4) / 2; + int y1 = (y0 + y2) / 2; + int y3 = (y2 + y4) / 2; + Osd->DrawRectangle(xa, ya, xb, yb, clrGray50); + DrawEllipse(Osd, x4, y0, x5, y4, 0); + DrawEllipse(Osd, x2, y1, x3, y2, 1); + DrawEllipse(Osd, x1, y1, x2, y2, 2); + DrawEllipse(Osd, x1, y2, x2, y3, 3); + DrawEllipse(Osd, x2, y2, x3, y3, 4); + DrawEllipse(Osd, x3, y1, x4, y3, 5); + DrawEllipse(Osd, x1, y0, x3, y1, 6); + DrawEllipse(Osd, x0, y1, x1, y3, 7); + DrawEllipse(Osd, x1, y3, x3, y4, 8); + DrawEllipse(Osd, x3, y0, x4, y1, -1); + DrawEllipse(Osd, x0, y0, x1, y1, -2); + DrawEllipse(Osd, x0, y3, x1, y4, -3); + DrawEllipse(Osd, x3, y3, x4, y4, -4); + Osd->Flush(); +} + +// --- DrawSlopes ------------------------------------------------------------ + +void DrawSlope(cOsd *Osd, int x1, int y1, int x2, int y2, int Type) +{ + Osd->DrawRectangle(x1 + 2, y1 + 2, x2 - 2, y2 - 2, clrGreen); + Osd->DrawSlope(x1 + 3, y1 + 3, x2 - 3, y2 - 3, clrRed, Type); +} + +void DrawSlopes(cOsd *Osd) +{ + int xa = 0; + int ya = 0; + int xb = Osd->Width() - 1; + int yb = Osd->Height() - 1; + int x0 = xa; + int x4 = xb; + int x2 = (x0 + x4) / 2; + int x1 = (x0 + x2) / 2; + int x3 = (x2 + x4) / 2; + int y0 = ya; + int y3 = yb; + int y2 = (y0 + y3) / 2; + int y1 = (y0 + y2) / 2; + Osd->DrawRectangle(xa, ya, xb, yb, clrGray50); + DrawSlope(Osd, x0, y0, x2, y1, 0); + DrawSlope(Osd, x2, y0, x4, y1, 1); + DrawSlope(Osd, x0, y1, x2, y2, 2); + DrawSlope(Osd, x2, y1, x4, y2, 3); + DrawSlope(Osd, x0, y2, x1, y3, 4); + DrawSlope(Osd, x1, y2, x2, y3, 5); + DrawSlope(Osd, x2, y2, x3, y3, 6); + DrawSlope(Osd, x3, y2, x4, y3, 7); + Osd->Flush(); +} + // --- cLineGame ------------------------------------------------------------- class cLineGame : public cOsdObject { @@ -31,7 +108,7 @@ public: cLineGame::cLineGame(void) { osd = NULL; - x = y = 50; + x = y = 0; color = clrRed; } @@ -42,12 +119,23 @@ cLineGame::~cLineGame() void cLineGame::Show(void) { - osd = cOsdProvider::NewOsd(100, 50, 50); + osd = cOsdProvider::NewOsd(cOsd::OsdLeft(), cOsd::OsdTop(), 50); if (osd) { - tArea Area = { 0, 0, 99, 199, 4 }; - osd->SetAreas(&Area, 1); - osd->DrawRectangle(0, 0, 99, 199, clrGray50); - osd->Flush(); + int x1 = cOsd::OsdWidth() - 1; + int y1 = cOsd::OsdHeight() - 1; + while (x1 > 0 && y1 > 0) { + tArea Area = { 0, 0, x1, y1, 4 }; + if (osd->CanHandleAreas(&Area, 1) == oeOk) { + osd->SetAreas(&Area, 1); + osd->DrawRectangle(0, 0, osd->Width() - 1, osd->Height() - 1, clrGray50); + osd->Flush(); + x = osd->Width() / 2; + y = osd->Height() / 2; + break; + } + x1 = x1 * 9 / 10; + y1 = y1 * 9 / 10; + } } } @@ -55,19 +143,24 @@ eOSState cLineGame::ProcessKey(eKeys Key) { eOSState state = cOsdObject::ProcessKey(Key); if (state == osUnknown) { + const int d = 4; switch (Key & ~k_Repeat) { - case kUp: if (y > 0) y--; break; - case kDown: if (y < 196) y++; break; - case kLeft: if (x > 0) x--; break; - case kRight: if (x < 96) x++; break; + case kUp: y = max(0, y - d); break; + case kDown: y = min(osd->Height() - d, y + d); break; + case kLeft: x = max(0, x - d); break; + case kRight: x = min(osd->Width() - d, x + d); break; case kRed: color = clrRed; break; case kGreen: color = clrGreen; break; case kYellow: color = clrYellow; break; case kBlue: color = clrBlue; break; + case k1: DrawEllipses(osd); + return osContinue; + case k2: DrawSlopes(osd); + return osContinue; case kOk: return osEnd; default: return state; } - osd->DrawRectangle(x, y, x + 3, y + 3, color); + osd->DrawRectangle(x, y, x + d - 1, y + d - 1, color); osd->Flush(); state = osContinue; } @@ -84,6 +177,7 @@ private: bool clockwise; cPixmap *destroyablePixmap; cPixmap *toggleablePixmap; + bool SetArea(void); virtual void Action(void); cPixmap *CreateTextPixmap(const char *s, int Line, int Layer, tColor ColorFg, tColor ColorBg, const cFont *Font); public: @@ -390,13 +484,21 @@ void cTrueColorDemo::Action(void) delete LrgFont; } +bool cTrueColorDemo::SetArea(void) +{ + if (osd) { + tArea Area = { 0, 0, cOsd::OsdWidth() - 1, cOsd::OsdHeight() - 1, 32 }; + return osd->SetAreas(&Area, 1) == oeOk; + } + return false; +} + void cTrueColorDemo::Show(void) { osd = cOsdProvider::NewOsd(cOsd::OsdLeft(), cOsd::OsdTop(), 50); if (osd) { - tArea Area = { 0, 0, cOsd::OsdWidth() - 1, cOsd::OsdHeight() - 1, 32 }; - if (osd->SetAreas(&Area, 1) == oeOk) { - osd->DrawRectangle(0, 0, osd->Width() -1 , osd->Height() - 1, clrGray50); + if (SetArea()) { + osd->DrawRectangle(0, 0, osd->Width() - 1, osd->Height() - 1, clrGray50); osd->Flush(); Start(); } @@ -423,6 +525,14 @@ eOSState cTrueColorDemo::ProcessKey(eKeys Key) case kGreen: if (toggleablePixmap) toggleablePixmap->SetLayer(-toggleablePixmap->Layer()); break; + case k1: Cancel(3); + SetArea(); + DrawEllipses(osd); + break; + case k2: Cancel(3); + SetArea(); + DrawSlopes(osd); + break; case kOk: return osEnd; default: return state; } |