diff options
author | Christian Tusche <chr13@gmx.net> | 2007-05-06 17:26:51 +0200 |
---|---|---|
committer | Thomas Günther <tom@toms-cafe.de> | 2009-06-04 00:56:47 +0200 |
commit | f6f140b2ea0bb1de9e055e920ef9c0c43c6e2add (patch) | |
tree | a5c927131e9c94b114bc659dd5d048a23926c95e /render.c | |
parent | b32f1eaf9ae246f656ebd27c2fbb5d29d2bec34c (diff) | |
download | vdr-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.c | 68 |
1 files changed, 53 insertions, 15 deletions
@@ -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 ); } |