summaryrefslogtreecommitdiff
path: root/render.c
diff options
context:
space:
mode:
authorChristian Tusche <chr13@gmx.net>2007-05-06 17:26:51 +0200
committerThomas Günther <tom@toms-cafe.de>2009-06-04 00:56:47 +0200
commitf6f140b2ea0bb1de9e055e920ef9c0c43c6e2add (patch)
treea5c927131e9c94b114bc659dd5d048a23926c95e /render.c
parentb32f1eaf9ae246f656ebd27c2fbb5d29d2bec34c (diff)
downloadvdr-plugin-text2skin-f6f140b2ea0bb1de9e055e920ef9c0c43c6e2add.tar.gz
vdr-plugin-text2skin-f6f140b2ea0bb1de9e055e920ef9c0c43c6e2add.tar.bz2
2007-05-06: Version 1.1-cvs_ext-0.10c (text2skin-1.1-cvs_ext-0.10c.diff)
- selective update of changed objects refresh can be controlled for individual objects by the attributes "refresh" and "changed" default behaviour is to redraw everything (compatible with old skins)
Diffstat (limited to 'render.c')
-rw-r--r--render.c68
1 files changed, 53 insertions, 15 deletions
diff --git a/render.c b/render.c
index b068729..2537a61 100644
--- a/render.c
+++ b/render.c
@@ -29,7 +29,7 @@ cText2SkinRender::cText2SkinRender(cText2SkinLoader *Loader, cxDisplay::eType Di
mScreen(NULL),
mScroller(NULL),
mBasePath(BasePath),
- mDirty(true),
+ mDirty(cxRefresh::all),
mFallback(NULL),
mActive(false),
mDoUpdate(),
@@ -37,6 +37,7 @@ cText2SkinRender::cText2SkinRender(cText2SkinLoader *Loader, cxDisplay::eType Di
mStarted(),
mUpdateIn(0),
mNow(0),
+ mFirst(true),
mBaseSize(),
mTabScale(1.0),
mTabScaleSet(false)
@@ -129,12 +130,16 @@ cText2SkinRender::~cText2SkinRender()
void cText2SkinRender::Action(void)
{
+ bool to = true;
mActive = true;
UpdateLock();
mStarted.Broadcast();
while (mActive) {
- if (mUpdateIn) mDoUpdate.TimedWait(mDoUpdateMutex, mUpdateIn);
- else mDoUpdate.Wait(mDoUpdateMutex);
+ to = true;
+ if (mUpdateIn) to=mDoUpdate.TimedWait(mDoUpdateMutex, mUpdateIn);
+ else mDoUpdate.Wait(mDoUpdateMutex);
+
+ if(!to) SetDirty(cxRefresh::timeout);
if (!mActive) break; // fall out if thread to be stopped
@@ -150,10 +155,24 @@ void cText2SkinRender::Update(void)
//DStartBench(malen);
//DStartBench(ges);
Dbench(update);
+#ifdef BENCH
+ fprintf( stderr, "mDirty = 0x%04x\n", mDirty );
+#endif
+ if( mFirst ) {
+ mDirty = (1<<cxRefresh::all);
+ mFirst = false;
+ } else if( mDirty & (1<<cxRefresh::all) ) {
+ // we need a complete redraw anyway, that is enough
+ mDirty = 1 << cxRefresh::all;
+ }
for (uint i = 0; i < mDisplay->Objects(); ++i)
DrawObject(mDisplay->GetObject(i));
+ mDirty = 0;
+ while( mDirtyItems.size() > 0 )
+ mDirtyItems.pop_back();
+
//DShowBench("---\t", malen);
//DStartBench(flushen);
Dbench(flush);
@@ -168,9 +187,11 @@ void cText2SkinRender::Update(void)
void cText2SkinRender::DrawObject( cxObject *Object,
const txPoint &BaseOffset /*=txPoint(-1,-1)*/,
const txSize &BaseSize /*=txPoint(-1,-1)*/,
- int ListItem /*=-1*/ )
+ int ListItem /*=-1*/,
+ bool ForceUpdate /*=false*/)
{
- if (Object->Condition() != NULL && !Object->Condition()->Evaluate())
+ if( !Object->mRefresh.Dirty(mDirty, ForceUpdate) ||
+ (Object->Condition()!=NULL && !Object->Condition()->Evaluate()))
return;
txPoint pos;
@@ -178,13 +199,13 @@ void cText2SkinRender::DrawObject( cxObject *Object,
pos = Object->Pos(BaseOffset, BaseSize);
- if( ListItem >= 0 && !mSkin->Version().Require(1,1) ) {
- // Object is part of al list
- // Calculate offset of list item relative to the list offset
- size = Object->Size();
- } else {
- size = Object->Size(BaseOffset, BaseSize);
- }
+ if( ListItem >= 0 && !mSkin->Version().Require(1,1) ) {
+ // Object is part of al list
+ // Calculate offset of list item relative to the list offset
+ size = Object->Size();
+ } else {
+ size = Object->Size(BaseOffset, BaseSize);
+ }
switch (Object->Type()) {
@@ -246,7 +267,8 @@ void cText2SkinRender::DrawObject( cxObject *Object,
case cxObject::block:
for (uint i = 0; i < Object->Objects(); ++i)
- DrawObject(Object->GetObject(i), pos, size, ListItem );
+ DrawObject(Object->GetObject(i), pos, size, ListItem,
+ ListItem >= 0 ? true : Object->mRefresh.Full());
break;
case cxObject::list:{
@@ -259,6 +281,14 @@ void cText2SkinRender::DrawObject( cxObject *Object,
mMenuScrollbar.maxItems = maxitems;
SetMaxItems(maxitems); //Dprintf("setmaxitems %d\n", maxitems);
uint index = 0;
+ bool partial = false;
+
+ // is only a partial update needed?
+ if( !Object->mRefresh.Full() &&
+ !(Object->mRefresh.Type() & mDirty & ~(1<<cxRefresh::list)) ) {
+ maxitems = mDirtyItems.size();
+ partial = true;
+ }
// draw list items
for (uint i = 0; i < maxitems; ++i) {
@@ -266,13 +296,21 @@ void cText2SkinRender::DrawObject( cxObject *Object,
continue;
Dbench(item);
- index = i;
+ if( partial )
+ index = mDirtyItems[i];
+ else
+ index = i;
itempos.y = pos.y + index * itemsize.h;
for (uint j = 1; j < Object->Objects(); ++j) {
item = Object->GetObject(j);
+ // exclude items with only "list" update set from
+ // complete redraw
+ if( !partial && !(item->mRefresh.Type() &
+ ~(1<<cxRefresh::list)) )
+ continue;
item->SetListIndex( index, -1 );
- DrawObject( item, itempos, itemsize, index );
+ DrawObject( item, itempos, itemsize, index, true);
}
Ddiff( "draw item", item );
}