From 5619c0602bc623adeddf3385ada8c742aaea9762 Mon Sep 17 00:00:00 2001 From: Klaus Schmidinger Date: Sun, 13 Mar 2011 12:46:00 +0100 Subject: =?UTF-8?q?Version=201.7.17=20-=20Updated=20the=20Estonian=20OSD?= =?UTF-8?q?=20texts=20(thanks=20to=20Arthur=20Konovalov).=20-=20Fixed=20fo?= =?UTF-8?q?llowing=20symbolic=20links=20in=20RemoveFileOrDir()=20(cont'd)?= =?UTF-8?q?=20(thanks=20to=20=20=20Steffen=20Barszus).=20-=20Changed=20the?= =?UTF-8?q?=20description=20of=20cDevice::GetSTC()=20to=20make=20it=20mand?= =?UTF-8?q?atory=20for=20devices=20=20=20that=20can=20replay.=20-=20Remove?= =?UTF-8?q?d=20the=20check=20for=20positive=20STC=20values=20from=20cDvbSu?= =?UTF-8?q?btitleConverter::Action().=20-=20Added=20cString::operator=3D(c?= =?UTF-8?q?onst=20char=20*String)=20(suggested=20by=20Antti=20Sepp=C3=A4l?= =?UTF-8?q?=C3=A4).=20-=20Some=20spelling=20fixes=20(thanks=20to=20Ville?= =?UTF-8?q?=20Skytt=C3=A4).=20-=20Passing=20package=20name=20and=20version?= =?UTF-8?q?=20to=20xgettext=20(thanks=20to=20Ville=20Skytt=C3=A4).=20-=20M?= =?UTF-8?q?ade=20'dist'=20target=20dependent=20on=20up=20to=20date=20*.po?= =?UTF-8?q?=20(thanks=20to=20Ville=20Skytt=C3=A4).=20-=20Added=20Language?= =?UTF-8?q?=20and=20fixed=20Language-Team=20header=20of=20*.po=20(thanks?= =?UTF-8?q?=20to=20Ville=20Skytt=C3=A4).=20-=20Updated=20the=20Lithuanian?= =?UTF-8?q?=20OSD=20texts=20(thanks=20to=20Valdemaras=20Pipiras).=20-=20Fi?= =?UTF-8?q?xed=20detecting=20frames=20on=20channels=20that=20broadcast=20w?= =?UTF-8?q?ith=2050=20or=2060=20fps.=20=20=20This=20avoids=20artifacts=20d?= =?UTF-8?q?uring=20fast=20forward/rewind=20when=20replaying=20recordings?= =?UTF-8?q?=20from=20such=20=20=20channels.=20To=20fix=20the=20index=20of?= =?UTF-8?q?=20existing=20recordings=20from=20such=20channels,=20just=20del?= =?UTF-8?q?ete=20the=20=20=20'index'=20file=20of=20the=20recording=20and?= =?UTF-8?q?=20VDR=20will=20generate=20a=20new=20one=20the=20next=20time=20?= =?UTF-8?q?you=20play=20it.=20=20=20You=20should=20also=20change=20the=20l?= =?UTF-8?q?ine=20"F=2025"=20to=20"F=2050"=20in=20the=20'info'=20file=20of?= =?UTF-8?q?=20that=20recording.=20-=20Added=20support=20for=20"registratio?= =?UTF-8?q?n=20descriptor"=20to=20'libsi'=20and=20using=20it=20in=20pat.c?= =?UTF-8?q?=20(thanks=20=20=20to=20Rolf=20Ahrenberg).=20-=20Fixed=20unjust?= =?UTF-8?q?ified=20log=20entries=20about=20changed=20channel=20pids=20(rep?= =?UTF-8?q?orted=20by=20Derek=20Kelly).=20-=20Added=20an=20include=20of=20?= =?UTF-8?q?VDR's=20'Make.global'=20to=20libsi's=20Makefile=20(thanks=20to?= =?UTF-8?q?=20Rolf=20=20=20Ahrenberg).=20-=20Removed=20displaying=20the=20?= =?UTF-8?q?"contents"=20information=20from=20the=20"Classic=20VDR"=20and?= =?UTF-8?q?=20=20=20"ST:TNG=20Panels"=20skins,=20because=20it=20is=20often?= =?UTF-8?q?=20wrong=20and=20nothing=20but=20irritating.=20-=20Added=20type?= =?UTF-8?q?casts=20to=20avoid=20gcc=204.5=20warnings=20in=20switch=20state?= =?UTF-8?q?ments=20on=20eKeys=20=20=20variables=20where=20additional=20'k?= =?UTF-8?q?=5F...'=20flags=20are=20used.=20-=20Fixed=20inclusion=20of=20=20(thanks=20to=20Henning=20Heinold).=20-=20Changed=20"?= =?UTF-8?q?frame=20duration"=20to=20"frame=20rate"=20in=20vdr.5=20(reporte?= =?UTF-8?q?d=20by=20Tobias=20Grimm).=20-=20Removing=20a=20cRemote=20from?= =?UTF-8?q?=20the=20Remotes=20list=20in=20case=20its=20initialization=20fa?= =?UTF-8?q?iled=20(thanks=20=20=20to=20Dominik=20Strasser).=20-=20Added=20?= =?UTF-8?q?LDFLAGS=20to=20the=20linker=20calls=20in=20the=20Makefiles=20(t?= =?UTF-8?q?hanks=20to=20Joerg=20Bornkessel=20and=20=20=20Paul=20Menzel).?= =?UTF-8?q?=20-=20Now=20updating=20the=20'frames=20per=20second'=20data=20?= =?UTF-8?q?in=20the=20list=20of=20recordings=20when=20a=20new=20=20=20reco?= =?UTF-8?q?rding=20is=20started=20that=20has=20a=20frame=20rate=20other=20?= =?UTF-8?q?than=20the=20default.=20-=20The=20include=20path=20to=20the=20f?= =?UTF-8?q?reetype2=20header=20files=20is=20now=20retrieved=20via=20a=20ca?= =?UTF-8?q?ll=20to=20=20=20'pkg-config=20--cflags=20freetype2'=20(suggeste?= =?UTF-8?q?d=20by=20Andreas=20Oberritter).=20-=20The=20OSD=20now=20has=20f?= =?UTF-8?q?ull=20TrueColor=20support.=20There=20can=20be=20several=20"pixm?= =?UTF-8?q?aps"=20that=20can=20=20=20be=20overlayed=20with=20alpha=20blend?= =?UTF-8?q?ing.=20All=20existing=20skins=20should=20work=20out=20of=20the?= =?UTF-8?q?=20box=20=20=20with=20the=20TrueColor=20OSD=20-=20the=20only=20?= =?UTF-8?q?exception=20being=20cOsd::GetBitmap().=20Since=20the=20=20=20Tr?= =?UTF-8?q?ueColor=20OSD=20doesn't=20use=20bitmaps,=20this=20function=20wi?= =?UTF-8?q?ll=20return=20a=20dummy=20bitmap,=20which=20=20=20may=20not=20b?= =?UTF-8?q?e=20what=20the=20plugin=20expects.=20As=20long=20as=20this=20bi?= =?UTF-8?q?tmap=20is=20only=20used=20for=20setting=20=20=20the=20palette,?= =?UTF-8?q?=20there=20is=20no=20problem.=20However,=20any=20other=20operat?= =?UTF-8?q?ions=20on=20this=20bitmap=20will=20=20=20have=20no=20effect.=20?= =?UTF-8?q?See=20the=20description=20of=20the=20cPixmap=20functions=20in?= =?UTF-8?q?=20osd.h=20for=20details=20=20=20about=20the=20new=20functional?= =?UTF-8?q?ities.=20=20=20The=20"ST:TNG=20Panels"=20skin=20has=20been=20en?= =?UTF-8?q?hanced=20to=20automatically=20use=20the=20TrueColor=20OSD=20=20?= =?UTF-8?q?=20if=20available.=20=20=20The=20"osddemo"=20plugin=20has=20bee?= =?UTF-8?q?n=20extended=20to=20show=20some=20of=20the=20possibilities=20of?= =?UTF-8?q?=20the=20=20=20TrueColor=20OSD=20if=20it=20is=20run=20on=20a=20?= =?UTF-8?q?system=20that=20actually=20provides=20TrueColor=20support.=20?= =?UTF-8?q?=20=20Thanks=20to=20Reinhard=20Nissl=20for=20some=20valuable=20?= =?UTF-8?q?input,=20help=20with=20debugging,=20and=20an=20=20=20implementa?= =?UTF-8?q?tion=20of=20the=20AlphaBlend()=20function.=20-=20Updated=20the?= =?UTF-8?q?=20Slovakian=20language=20texts=20(thanks=20to=20Milan=20Hrala)?= =?UTF-8?q?.=20-=20Added=20Serbian=20language=20texts=20(thanks=20to=20Mil?= =?UTF-8?q?an=20Cvijanovic).=20-=20Fixed=20reallocating=20memory=20in=20th?= =?UTF-8?q?e=20"pictures"=20plugin=20(reported=20by=20Paul=20Menzel,=20wit?= =?UTF-8?q?h=20=20=20input=20from=20Oliver=20Endriss).=20-=20Fixed=20reall?= =?UTF-8?q?ocating=20memory=20in=20cTsToPes::PutTs()=20(suggested=20by=20O?= =?UTF-8?q?liver=20Endriss).=20-=20Now=20checking=20the=20result=20of=20al?= =?UTF-8?q?l=20realloc()=20calls.=20-=20Fixed=20setting=20up=20the=20'Reco?= =?UTF-8?q?rdings'=20menu=20in=20case=20there=20are=20several=20recordings?= =?UTF-8?q?=20=20=20with=20exactly=20the=20same=20name=20(reported=20by=20?= =?UTF-8?q?Marcus=20Hilbrich).=20-=20Setting=20the=20audio=20type=20of=20l?= =?UTF-8?q?anguage=20descriptors=20to=200x00=20in=20the=20PAT/PMT=20genera?= =?UTF-8?q?tor=20=20=20(thanks=20to=20Anssi=20Hannula).=20-=20Changed=20th?= =?UTF-8?q?e=20compiler=20optimization=20flag=20to=20-O3,=20which=20gives?= =?UTF-8?q?=20quite=20a=20performance=20=20=20boost=20in=20the=20AlphaBlen?= =?UTF-8?q?d()=20function.=20-=20While=20replaying,=20the=20editing=20mark?= =?UTF-8?q?s=20are=20now=20updated=20every=2010=20seconds=20(based=20on=20?= =?UTF-8?q?a=20=20=20patch=20from=20Manuel=20Reimer).=20-=20Now=20reducing?= =?UTF-8?q?=20the=20thread=20and=20I/O=20priority=20cCuttingThread::Action?= =?UTF-8?q?()=20to=20make=20the=20=20=20foreground=20process=20more=20resp?= =?UTF-8?q?onsive=20(suggested=20by=20Frank=20Neumann).=20-=20Removed=20ch?= =?UTF-8?q?ecking=20for=20minimum=20line=20length=20of=2021=20characters?= =?UTF-8?q?=20in=20the=20LIRC=20receiver=20code=20=20=20(reported=20by=20G?= =?UTF-8?q?erald=20Dachs).=20-=20Updated=20the=20Romanian=20OSD=20texts=20?= =?UTF-8?q?(thanks=20to=20Lucian=20Muresan).=20-=20Now=20storing=20the=20o?= =?UTF-8?q?riginal=20display=20size=20when=20handling=20DVB=20subtitles=20?= =?UTF-8?q?(thanks=20to=20=20=20Reinhard=20Nissl).=20-=20The=20original=20?= =?UTF-8?q?display=20size=20of=20subtitles=20is=20now=20used=20to=20scale?= =?UTF-8?q?=20them=20properly=20when=20=20=20displaying=20them=20on=20an?= =?UTF-8?q?=20HD=20OSD.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PLUGINS/src/osddemo/HISTORY | 4 + PLUGINS/src/osddemo/Makefile | 6 +- PLUGINS/src/osddemo/README | 7 + PLUGINS/src/osddemo/osddemo.c | 369 +++++++++++++++++++++++++++++++++++++++++- 4 files changed, 380 insertions(+), 6 deletions(-) (limited to 'PLUGINS/src/osddemo') diff --git a/PLUGINS/src/osddemo/HISTORY b/PLUGINS/src/osddemo/HISTORY index 4217cb1..1270fbf 100644 --- a/PLUGINS/src/osddemo/HISTORY +++ b/PLUGINS/src/osddemo/HISTORY @@ -21,3 +21,7 @@ VDR Plugin 'osddemo' Revision History 2008-04-13: Version 0.1.3 - Fixed setting the OSD level (thanks to Wolfgang Rohdewald). + +2011-02-20: Version 0.2.0 + +- Added support for TrueColor OSD. diff --git a/PLUGINS/src/osddemo/Makefile b/PLUGINS/src/osddemo/Makefile index d9ed4c5..d93d802 100644 --- a/PLUGINS/src/osddemo/Makefile +++ b/PLUGINS/src/osddemo/Makefile @@ -1,7 +1,7 @@ # # Makefile for a Video Disk Recorder plugin # -# $Id: Makefile 2.1 2010/02/06 14:50:03 kls Exp $ +# $Id: Makefile 2.3 2011/02/27 10:05:01 kls Exp $ # The official name of this plugin. # This name will be used in the '-P...' option of VDR to load the plugin. @@ -16,7 +16,7 @@ VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ pri ### The C++ compiler and options: CXX ?= g++ -CXXFLAGS ?= -g -O2 -Wall -Woverloaded-virtual -Wno-parentheses +CXXFLAGS ?= -g -O3 -Wall -Woverloaded-virtual -Wno-parentheses ### The directory environment: @@ -72,7 +72,7 @@ $(DEPFILE): Makefile ### Targets: libvdr-$(PLUGIN).so: $(OBJS) - $(CXX) $(CXXFLAGS) -shared $(OBJS) -o $@ + $(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@ @cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION) dist: clean diff --git a/PLUGINS/src/osddemo/README b/PLUGINS/src/osddemo/README index 50d36d8..90ae295 100644 --- a/PLUGINS/src/osddemo/README +++ b/PLUGINS/src/osddemo/README @@ -19,4 +19,11 @@ Demonstration of how a plugin can have its very own OSD setup. It's a very primitive game that opens a small window in which the user can draw lines with the Up, Down, Left and Right buttons. The color buttons are used to switch color. + +On a VDR system with TrueColor support it displays some of the +possibilities available with the TrueColor OSD. Once the "Animation" +pixmap is displayed, it can be moved around with the Up, Down, Left +and Right buttons. The Red button turns off the "Tiled Pixmaps" +display, and the Green button toggles the color display. + Press Ok to close the window. diff --git a/PLUGINS/src/osddemo/osddemo.c b/PLUGINS/src/osddemo/osddemo.c index 2a9e09a..2e6a33b 100644 --- a/PLUGINS/src/osddemo/osddemo.c +++ b/PLUGINS/src/osddemo/osddemo.c @@ -3,12 +3,13 @@ * * See the README file for copyright information and how to reach the author. * - * $Id: osddemo.c 2.1 2008/04/13 12:59:57 kls Exp $ + * $Id: osddemo.c 2.3 2011/02/26 12:08:13 kls Exp $ */ +#include #include -static const char *VERSION = "0.1.3"; +static const char *VERSION = "0.2.0"; static const char *DESCRIPTION = "Demo of arbitrary OSD setup"; static const char *MAINMENUENTRY = "Osd Demo"; @@ -22,7 +23,7 @@ private: tColor color; public: cLineGame(void); - ~cLineGame(); + virtual ~cLineGame(); virtual void Show(void); virtual eOSState ProcessKey(eKeys Key); }; @@ -73,6 +74,366 @@ eOSState cLineGame::ProcessKey(eKeys Key) return state; } +// --- cTrueColorDemo -------------------------------------------------------- + +class cTrueColorDemo : public cOsdObject, public cThread { +private: + cOsd *osd; + cPoint cursor; + cRect cursorLimits; + bool clockwise; + cPixmap *destroyablePixmap; + cPixmap *toggleablePixmap; + virtual void Action(void); + cPixmap *CreateTextPixmap(const char *s, int Line, int Layer, tColor ColorFg, tColor ColorBg, const cFont *Font = NULL); +public: + cTrueColorDemo(void); + virtual ~cTrueColorDemo(); + virtual void Show(void); + virtual eOSState ProcessKey(eKeys Key); + }; + +cTrueColorDemo::cTrueColorDemo(void) +{ + osd = NULL; + clockwise = true; + destroyablePixmap = NULL; + toggleablePixmap = NULL; +} + +cTrueColorDemo::~cTrueColorDemo() +{ + delete osd; +} + +cPixmap *cTrueColorDemo::CreateTextPixmap(const char *s, int Line, int Layer, tColor ColorFg, tColor ColorBg, const cFont *Font) +{ + if (!Font) + Font = cFont::GetFont(fontOsd); + const int h = Font->Height(s); + int w = Font->Width(s); + cPixmap *Pixmap = osd->CreatePixmap(Layer, cRect((osd->Width() - w) / 2, Line, w, h)); + if (Pixmap) { + Pixmap->Clear(); + Pixmap->SetAlpha(0); + Pixmap->DrawText(cPoint(0, 0), s, ColorFg, ColorBg, Font); + } + return Pixmap; +} + +void cTrueColorDemo::Action(void) +{ + cPixmap *FadeInPixmap = NULL; + cPixmap *FadeOutPixmap = NULL; + cPixmap *MovePixmap = NULL; + cPixmap *NextPixmap = NULL; + cPixmap *TilePixmap = NULL; + cPixmap *ScrollPixmap = NULL; + cPixmap *AnimPixmap = NULL; + int FrameTime = 40; // ms + int FadeTime = 1000; // ms + int MoveTime = 4000; // ms + int TileTime = 6000; // ms + int ScrollWaitTime = 1000; // ms + int ScrollLineTime = 200; // ms + int ScrollTotalTime = 8000; // ms + uint64_t Start = 0; + uint64_t ScrollStartTime = 0; + int ScrollLineNumber = 0; + cPoint MoveStart, MoveEnd; + cPoint TileStart, TileEnd; + cPoint ScrollStart, ScrollEnd; + int Line = osd->Height() / 20; + int StartLine = Line; + cPoint OldCursor; + int State = 0; + while (Running()) { + cPixmap::Lock(); + bool Animated = false; + uint64_t Now = cTimeMs::Now(); + if (FadeInPixmap) { + double t = min(double(Now - Start) / FadeTime, 1.0); + int Alpha = t * ALPHA_OPAQUE; + FadeInPixmap->SetAlpha(Alpha); + if (t >= 1) + FadeInPixmap = NULL; + Animated = true; + } + if (FadeOutPixmap) { + double t = min(double(Now - Start) / FadeTime, 1.0); + int Alpha = ALPHA_OPAQUE - t * ALPHA_OPAQUE; + FadeOutPixmap->SetAlpha(Alpha); + if (t >= 1) + FadeOutPixmap = NULL; + Animated = true; + } + if (MovePixmap) { + double t = min(double(Now - Start) / MoveTime, 1.0); + int x = MoveStart.X() + t * (MoveEnd.X() - MoveStart.X()); + int y = MoveStart.Y() + t * (MoveEnd.Y() - MoveStart.Y()); + cRect r = MovePixmap->ViewPort(); + r.SetPoint(x, y); + MovePixmap->SetViewPort(r); + if (t >= 1) + MovePixmap = NULL; + Animated = true; + } + if (TilePixmap) { + double t = min(double(Now - Start) / TileTime, 1.0); + int x = TileStart.X() + t * (TileEnd.X() - TileStart.X()); + int y = TileStart.Y() + t * (TileEnd.Y() - TileStart.Y()); + TilePixmap->SetDrawPortPoint(cPoint(x, y)); + if (t >= 1) { + destroyablePixmap = TilePixmap; + TilePixmap = NULL; + } + Animated = true; + } + if (ScrollPixmap) { + if (int(Now - Start) > ScrollWaitTime) { + if (ScrollStartTime) { + double t = min(double(Now - ScrollStartTime) / ScrollLineTime, 1.0); + int x = ScrollStart.X() + t * (ScrollEnd.X() - ScrollStart.X()); + int y = ScrollStart.Y() + t * (ScrollEnd.Y() - ScrollStart.Y()); + ScrollPixmap->SetDrawPortPoint(cPoint(x, y)); + if (t >= 1) { + if (int(Now - Start) < ScrollTotalTime) { + cRect r = ScrollPixmap->DrawPort(); + r.SetPoint(-r.X(), -r.Y()); + ScrollPixmap->Pan(cPoint(0, 0), r); + const cFont *Font = cFont::GetFont(fontOsd); + cString s = cString::sprintf("Line %d", ++ScrollLineNumber); + ScrollPixmap->DrawRectangle(cRect(0, ScrollPixmap->ViewPort().Height(), ScrollPixmap->DrawPort().Width(), ScrollPixmap->DrawPort().Height()), clrTransparent); + ScrollPixmap->DrawText(cPoint(0, ScrollPixmap->ViewPort().Height()), s, clrYellow, clrTransparent, Font); + ScrollStartTime = Now; + } + else { + FadeOutPixmap = ScrollPixmap; + ScrollPixmap = NULL; + Start = cTimeMs::Now(); + } + } + } + else + ScrollStartTime = Now; + } + Animated = true; + } + if (AnimPixmap) { + int d = AnimPixmap->ViewPort().Height(); + if (clockwise) + d = -d; + cPoint p = AnimPixmap->DrawPort().Point().Shifted(0, d); + if (clockwise && p.Y() <= -AnimPixmap->DrawPort().Height()) + p.SetY(0); + else if (!clockwise && p.Y() > 0) + p.SetY(-(AnimPixmap->DrawPort().Height() - AnimPixmap->ViewPort().Height())); + AnimPixmap->SetDrawPortPoint(p); + } + if (!Animated) { + switch (State) { + case 0: { + if (cFont *Font = cFont::CreateFont(DefaultFontOsd, osd->Height() / 10)) { + FadeInPixmap = CreateTextPixmap("VDR", Line, 1, clrYellow, clrTransparent, Font); + if (FadeInPixmap) + Line += FadeInPixmap->DrawPort().Height(); + delete Font; + Start = cTimeMs::Now(); + } + State++; + } + break; + case 1: { + FadeInPixmap = CreateTextPixmap("Video Disk Recorder", Line, 3, clrYellow, clrTransparent); + if (FadeInPixmap) + Line += FadeInPixmap->DrawPort().Height(); + Start = cTimeMs::Now(); + State++; + } + break; + case 2: { + FadeInPixmap = CreateTextPixmap("True Color OSD Demo", Line, 1, clrYellow, clrTransparent); + if (FadeInPixmap) + Line += FadeInPixmap->DrawPort().Height(); + Start = cTimeMs::Now(); + State++; + } + break; + case 3: { + if (cFont *Font = cFont::CreateFont(DefaultFontOsd, osd->Height() / 10)) { + NextPixmap = CreateTextPixmap("Millions of colors", Line, 1, clrYellow, clrTransparent, Font); + if (NextPixmap) { + FadeInPixmap = NextPixmap; + } + Start = cTimeMs::Now(); + StartLine = Line; + Line += NextPixmap->DrawPort().Height(); + } + State++; + } + break; + case 4: { + Line += osd->Height() / 10; + int w = osd->Width() / 2; + int h = osd->Height() - Line - osd->Height() / 10; + cImage Image(cSize(w, h)); + for (int y = 0; y < h; y++) { + for (int x = 0; x < w; x++) + Image.SetPixel(cPoint(x, y), HsvToColor(360 * double(x) / w, 1 - double(y) / h, 1) | 0xDF000000); + } + if (cPixmap *Pixmap = osd->CreatePixmap(2, cRect((osd->Width() - w) / 2, Line, w, h))) { + Pixmap->DrawImage(cPoint(0, 0), Image); + toggleablePixmap = Pixmap; + } + State++; + } + break; + case 5: { + if (NextPixmap) { + MovePixmap = NextPixmap; + MoveStart = MovePixmap->ViewPort().Point(); + MoveEnd.Set(osd->Width() - MovePixmap->ViewPort().Width(), osd->Height() - MovePixmap->ViewPort().Height()); + Start = cTimeMs::Now(); + } + State++; + } + break; + case 6: { + TilePixmap = CreateTextPixmap("Tiled Pixmaps", StartLine, 1, clrRed, clrWhite); + if (TilePixmap) { + TilePixmap->SetViewPort(TilePixmap->ViewPort().Grown(TilePixmap->DrawPort().Width(), TilePixmap->DrawPort().Height())); + TilePixmap->SetAlpha(200); + TilePixmap->SetTile(true); + TileStart = TilePixmap->DrawPort().Point(); + TileEnd = TileStart.Shifted(TilePixmap->ViewPort().Width(), TilePixmap->ViewPort().Height()); + MovePixmap = TilePixmap; + MoveStart = MovePixmap->ViewPort().Point(); + MoveEnd.Set(10, osd->Height() - MovePixmap->ViewPort().Height() - 10); + Start = cTimeMs::Now(); + } + State++; + } + break; + case 7: { + const cFont *Font = cFont::GetFont(fontOsd); + const char *Text = "Scrolling Pixmaps"; + int w = Font->Width(Text); + int h = Font->Height(); + if (cPixmap *Pixmap = osd->CreatePixmap(2, cRect((osd->Width() - w) / 2, StartLine, w, 2 * h), cRect(0, 0, w, 3 * h))) { + Pixmap->Clear(); + Pixmap->DrawText(cPoint(0, 0), Text, clrYellow, clrTransparent, Font); + cString s = cString::sprintf("Line %d", ++ScrollLineNumber); + Pixmap->DrawText(cPoint(0, Pixmap->ViewPort().Height()), s, clrYellow, clrTransparent, Font); + ScrollPixmap = Pixmap; + ScrollStart.Set(0, 0); + ScrollEnd.Set(0, -h); + Start = cTimeMs::Now(); + } + State++; + } + break; + case 8: { + const cFont *Font = cFont::GetFont(fontSml); + const char *Text = "Animation"; + const int Size = Font->Width(Text) + 10; + const int NumDots = 12; + const int AnimFrames = NumDots; + // Temporarily using pixmap layer 0 to have the text alpha blended: + AnimPixmap = osd->CreatePixmap(0, cRect((osd->Width() - Size) / 2, StartLine, Size, Size), cRect(0, 0, Size, Size * AnimFrames)); + if (AnimPixmap) { + AnimPixmap->SetAlpha(0); + AnimPixmap->Clear(); + const int Diameter = Size / 5; + int xc = Size / 2 - Diameter / 2; + for (int Frame = 0; Frame < AnimFrames; Frame++) { + AnimPixmap->DrawEllipse(cRect(0, Frame * Size, Size, Size), 0xDDFFFFFF); + int yc = Frame * Size + Size / 2 - Diameter / 2; + int Color = 0xFF; + int Delta = Color / NumDots / 3; + for (int a = 0; a < NumDots; a++) { + double t = 2 * M_PI * (Frame + a) / NumDots; + int x = xc + ((Size - Diameter) / 2 - 5) * cos(t); + int y = yc + ((Size - Diameter) / 2 - 5) * sin(t); + AnimPixmap->DrawEllipse(cRect(x, y, Diameter, Diameter), ArgbToColor(0xFF, Color, Color, Color)); + Color -= Delta; + } + AnimPixmap->DrawText(cPoint(0, Frame * Size), Text, clrBlack, clrTransparent, cFont::GetFont(fontSml), Size, Size, taCenter); + } + AnimPixmap->SetLayer(3); // now setting the actual pixmap layer + FadeInPixmap = AnimPixmap; + LOCK_THREAD; + OldCursor = cursor = AnimPixmap->ViewPort().Point(); + cursorLimits.Set(0, 0, osd->Width(), osd->Height()); + cursorLimits.SetRight(cursorLimits.Right() - Size); + cursorLimits.SetBottom(cursorLimits.Bottom() - Size); + cursorLimits.Grow(-10, -10); + Start = cTimeMs::Now(); + } + State++; + } + break; + case 9: { + LOCK_THREAD; + if (cursor != OldCursor) { + MovePixmap = AnimPixmap; + MoveStart = MovePixmap->ViewPort().Point(); + MoveEnd = OldCursor = cursor; + MoveTime = 500; + Start = cTimeMs::Now(); + } + } + break; + } + } + osd->Flush(); + cPixmap::Unlock(); + int Delta = cTimeMs::Now() - Now; + if (Delta < FrameTime) + cCondWait::SleepMs(FrameTime - Delta); + } +} + +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); + osd->Flush(); + Start(); + } + } +} + +eOSState cTrueColorDemo::ProcessKey(eKeys Key) +{ + eOSState state = cOsdObject::ProcessKey(Key); + if (state == osUnknown) { + LOCK_PIXMAPS; + LOCK_THREAD; + const int d = 80; + switch (Key & ~k_Repeat) { + case kUp: cursor.SetY(max(cursorLimits.Top(), cursor.Y() - d)); clockwise = false; break; + case kDown: cursor.SetY(min(cursorLimits.Bottom(), cursor.Y() + d)); clockwise = true; break; + case kLeft: cursor.SetX(max(cursorLimits.Left(), cursor.X() - d)); clockwise = false; break; + case kRight: cursor.SetX(min(cursorLimits.Right(), cursor.X() + d)); clockwise = true; break; + case kRed: if (destroyablePixmap) { + osd->DestroyPixmap(destroyablePixmap); + destroyablePixmap = NULL; + } + break; + case kGreen: if (toggleablePixmap) + toggleablePixmap->SetLayer(-toggleablePixmap->Layer()); + break; + case kOk: return osEnd; + default: return state; + } + state = osContinue; + } + return state; +} + // --- cPluginOsddemo -------------------------------------------------------- class cPluginOsddemo : public cPlugin { @@ -131,6 +492,8 @@ void cPluginOsddemo::Housekeeping(void) cOsdObject *cPluginOsddemo::MainMenuAction(void) { // Perform the action when selected from the main VDR menu. + if (cOsdProvider::SupportsTrueColor()) + return new cTrueColorDemo; return new cLineGame; } -- cgit v1.2.3