summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlouis <louis.braun@gmx.de>2016-03-28 16:10:19 +0200
committerlouis <louis.braun@gmx.de>2016-03-28 16:10:19 +0200
commit858b489cfbee7c7e12c905d3e55623f53906c070 (patch)
tree215323ddd05f9682c8005c0ac9556ad07c419755
parent11f5697032806d768e8ee56afa75b17187bf3eec (diff)
downloadvdr-plugin-skindesigner-858b489cfbee7c7e12c905d3e55623f53906c070.tar.gz
vdr-plugin-skindesigner-858b489cfbee7c7e12c905d3e55623f53906c070.tar.bz2
optimized shifting
-rw-r--r--coreengine/animation.c13
-rw-r--r--coreengine/animation.h5
-rw-r--r--coreengine/view.c7
-rw-r--r--coreengine/view.h3
-rw-r--r--coreengine/viewdisplaychannel.c32
-rw-r--r--coreengine/viewelement.c4
-rw-r--r--coreengine/viewelement.h4
-rw-r--r--coreengine/viewelementscommon.c2
8 files changed, 50 insertions, 20 deletions
diff --git a/coreengine/animation.c b/coreengine/animation.c
index 735d309..90756b4 100644
--- a/coreengine/animation.c
+++ b/coreengine/animation.c
@@ -14,6 +14,7 @@ cAnimation::cAnimation(cScrollable *scrollable) : cThread("scroller") {
keepSleeping = false;
doAnimation = true;
modeIn = false;
+ doFlush = true;
blinkFunc = -1;
}
@@ -27,6 +28,7 @@ cAnimation::cAnimation(cDetachable *detachable, bool wait, bool animation) : cTh
keepSleeping = false;
doAnimation = animation;
modeIn = false;
+ doFlush = true;
blinkFunc = -1;
}
@@ -40,10 +42,11 @@ cAnimation::cAnimation(cFadable *fadable, bool fadein) : cThread("fadable") {
keepSleeping = false;
doAnimation = true;
modeIn = fadein;
+ doFlush = true;
blinkFunc = -1;
}
-cAnimation::cAnimation(cShiftable *shiftable, cPoint &start, cPoint &end, bool shiftin) : cThread("shiftable") {
+cAnimation::cAnimation(cShiftable *shiftable, cPoint &start, cPoint &end, bool shiftin, bool doFlush) : cThread("shiftable") {
this->scrollable = NULL;
this->detachable = NULL;
this->fadable = NULL;
@@ -55,6 +58,7 @@ cAnimation::cAnimation(cShiftable *shiftable, cPoint &start, cPoint &end, bool s
modeIn = shiftin;
shiftstart = start;
shiftend = end;
+ this->doFlush = doFlush;
blinkFunc = -1;
}
@@ -68,6 +72,7 @@ cAnimation::cAnimation(cBlinkable *blinkable, int func) : cThread("blinking") {
keepSleeping = false;
doAnimation = true;
modeIn = false;
+ doFlush = true;
blinkFunc = func;
}
@@ -317,12 +322,14 @@ void cAnimation::Shift(void) {
if (delay > 0)
Sleep(delay);
}
+
+ shiftable->SetStartShifting();
uint64_t start = cTimeMs::Now();
while (Running() || !modeIn) {
uint64_t now = cTimeMs::Now();
if (Running() || !modeIn)
shiftable->SetPosition(pos, shiftend);
- if (Running() || !modeIn)
+ if ((Running() || !modeIn) && doFlush)
shiftable->Flush();
int delta = cTimeMs::Now() - now;
if ((Running() || !modeIn) && (delta < frametime)) {
@@ -347,7 +354,7 @@ void cAnimation::Shift(void) {
pos.Set(pos.X() - stepX, pos.Y() - stepY);
}
}
-
+ shiftable->SetEndShifting();
}
void cAnimation::Blink(void) {
diff --git a/coreengine/animation.h b/coreengine/animation.h
index 6a4b733..2147e8a 100644
--- a/coreengine/animation.h
+++ b/coreengine/animation.h
@@ -70,6 +70,8 @@ public:
virtual int ShiftTime(void) = 0;
virtual int ShiftMode(void) = 0;
virtual void SetPosition(cPoint &position, cPoint &reference, bool force = false) = 0;
+ virtual void SetStartShifting(void) = 0;
+ virtual void SetEndShifting(void) = 0;
virtual void Flush(void) = 0;
};
@@ -104,6 +106,7 @@ private:
int blinkFunc;
cPoint shiftstart;
cPoint shiftend;
+ bool doFlush;
void Sleep(int duration);
void Wait(void);
void Scroll(void);
@@ -115,7 +118,7 @@ public:
cAnimation(cScrollable *scrollable);
cAnimation(cDetachable *detachable, bool wait, bool animation);
cAnimation(cFadable *fadable, bool fadein);
- cAnimation(cShiftable *shiftable, cPoint &start, cPoint &end, bool shiftin);
+ cAnimation(cShiftable *shiftable, cPoint &start, cPoint &end, bool shiftin, bool doFlush = true);
cAnimation(cBlinkable *blinkable, int func);
~cAnimation(void);
void WakeUp(void);
diff --git a/coreengine/view.c b/coreengine/view.c
index fbaac4f..48cded7 100644
--- a/coreengine/view.c
+++ b/coreengine/view.c
@@ -12,6 +12,7 @@ cView::cView(void) {
viewElementsHorizontal = NULL;
fader = NULL;
shifter = NULL;
+ shifting = false;
currentTvFrame = NULL;
newTvFrame = NULL;
menuInit = false;
@@ -30,6 +31,7 @@ cView::~cView() {
free(viewName);
delete fader;
delete shifter;
+ shifting = false;
sdOsd.DeleteOsd();
}
@@ -158,6 +160,8 @@ void cView::PreCache(void) {
for (int i=0; i < numViewElements; i++) {
if (!viewElements[i])
continue;
+ if (FadeTime() > 0 || ShiftTime() > 0)
+ viewElements[i]->SetAnimatedView();
viewElements[i]->SetContainer(contX, contY, attribs->Width(), attribs->Height());
viewElements[i]->Cache();
}
@@ -165,6 +169,8 @@ void cView::PreCache(void) {
for (int i=0; i < numViewElements; i++) {
if (!viewElementsHorizontal[i])
continue;
+ if (FadeTime() > 0 || ShiftTime() > 0)
+ viewElementsHorizontal[i]->SetAnimatedView();
viewElementsHorizontal[i]->SetContainer(contX, contY, attribs->Width(), attribs->Height());
viewElementsHorizontal[i]->Cache();
}
@@ -240,6 +246,7 @@ void cView::Close(void) {
continue;
viewElements[i]->Close();
}
+ sdOsd.Flush();
sdOsd.DeleteOsd();
}
diff --git a/coreengine/view.h b/coreengine/view.h
index 239c429..623dd08 100644
--- a/coreengine/view.h
+++ b/coreengine/view.h
@@ -41,6 +41,7 @@ protected:
map<string,int> viewElementNames;
cAnimation *fader;
cAnimation *shifter;
+ bool shifting;
cRect tvFrame;
cRect *currentTvFrame;
cRect *newTvFrame;
@@ -88,6 +89,8 @@ public:
int ShiftTime(void);
int ShiftMode(void);
virtual void SetPosition(cPoint &position, cPoint &reference, bool force = false);
+ void SetStartShifting(void) { shifting = true; };
+ void SetEndShifting(void) { shifting = false; };
};
#endif //__VIEW_H
diff --git a/coreengine/viewdisplaychannel.c b/coreengine/viewdisplaychannel.c
index a6ae3d5..97e6c76 100644
--- a/coreengine/viewdisplaychannel.c
+++ b/coreengine/viewdisplaychannel.c
@@ -174,24 +174,28 @@ void cViewChannel::Flush(void) {
if (!displayChannelGroups) {
//normal display
- Render((int)eVeDisplayChannel::channelinfo);
- Render((int)eVeDisplayChannel::epginfo);
- Render((int)eVeDisplayChannel::statusinfo);
- Render((int)eVeDisplayChannel::scrapercontent);
- Render((int)eVeDisplayChannel::progressbar, channelChange);
- Render((int)eVeDisplayChannel::screenresolution);
- Render((int)eVeDisplayChannel::signalquality);
- Render((int)eVeDisplayChannel::audioinfo);
- Render((int)eVeDisplayChannel::ecminfo);
- Render((int)eVeDisplayChannel::devices);
- Render((int)eVeDisplayChannel::customtokens);
- Render((int)eVeDisplayChannel::message);
+ if (!shifting) {
+ Render((int)eVeDisplayChannel::channelinfo);
+ Render((int)eVeDisplayChannel::epginfo);
+ Render((int)eVeDisplayChannel::statusinfo);
+ Render((int)eVeDisplayChannel::scrapercontent);
+ Render((int)eVeDisplayChannel::progressbar, channelChange);
+ Render((int)eVeDisplayChannel::screenresolution);
+ Render((int)eVeDisplayChannel::signalquality);
+ Render((int)eVeDisplayChannel::audioinfo);
+ Render((int)eVeDisplayChannel::ecminfo);
+ Render((int)eVeDisplayChannel::devices);
+ Render((int)eVeDisplayChannel::customtokens);
+ Render((int)eVeDisplayChannel::message);
+ }
} else {
//channelgroup display
Render((int)eVeDisplayChannel::channelgroup);
}
- Render((int)eVeDisplayChannel::datetime);
- Render((int)eVeDisplayChannel::time);
+ if (!shifting) {
+ Render((int)eVeDisplayChannel::datetime);
+ Render((int)eVeDisplayChannel::time);
+ }
channelChange = false;
cView::Flush();
}
diff --git a/coreengine/viewelement.c b/coreengine/viewelement.c
index 44c4393..542acdd 100644
--- a/coreengine/viewelement.c
+++ b/coreengine/viewelement.c
@@ -15,6 +15,7 @@ cViewElement::cViewElement(void) {
detached = false;
waitOnWakeup = true;
startAnimation = true;
+ viewAnimated = false;
globals = NULL;
tokenContainer = NULL;
attribs = new cViewElementAttribs((int)eViewElementAttribs::count);
@@ -34,6 +35,7 @@ cViewElement::cViewElement(const cViewElement &other) {
detached = false;
waitOnWakeup = true;
startAnimation = true;
+ viewAnimated = false;
globals = other.globals;
container.Set(other.container.X(), other.container.Y(), other.container.Width(), other.container.Height());
tokenContainer = NULL;
@@ -424,7 +426,7 @@ void cViewElement::StartAnimation(void) {
SetPosition(start, ref);
sdOsd->Flush();
delete shifter;
- shifter = new cAnimation((cShiftable*)this, start, ref, true);
+ shifter = new cAnimation((cShiftable*)this, start, ref, true, !viewAnimated);
shifter->Start();
} else if (FadeTime() > 0) {
SetTransparency(100);
diff --git a/coreengine/viewelement.h b/coreengine/viewelement.h
index 99950b3..90cb544 100644
--- a/coreengine/viewelement.h
+++ b/coreengine/viewelement.h
@@ -27,6 +27,7 @@ protected:
bool waitOnWakeup;
bool scrollingStarted;
bool startAnimation;
+ bool viewAnimated;
cGlobals *globals;
cRect container;
cViewElementAttribs *attribs;
@@ -54,6 +55,7 @@ public:
bool Detached(void);
void SetContainer(int x, int y, int width, int height);
void SetAttributes(vector<stringpair> &attributes);
+ void SetAnimatedView(void) { viewAnimated = true; };
void AddArea(cAreaNode *area);
void SetAreaX(int x);
void SetAreaY(int y);
@@ -84,6 +86,8 @@ public:
void StartAnimation(void);
virtual void SetTransparency(int transparency, bool force = false);
virtual void SetPosition(cPoint &position, cPoint &reference, bool force = false);
+ void SetStartShifting(void) { };
+ void SetEndShifting(void) { };
cRect CoveredArea(void);
void Flush(void);
virtual bool Parse(bool forced = false);
diff --git a/coreengine/viewelementscommon.c b/coreengine/viewelementscommon.c
index 2226b77..411a1d8 100644
--- a/coreengine/viewelementscommon.c
+++ b/coreengine/viewelementscommon.c
@@ -250,7 +250,7 @@ bool cVeDevices::Parse(bool forced) {
if (light)
return false;
//check if drawing is necessary
- if (lastRefresh - cTimeMs::Now() < 500)
+ if (cTimeMs::Now() - lastRefresh < 500)
return false;
bool changed = false;
for (int i = 0; i < numDevices; i++) {