summaryrefslogtreecommitdiff
path: root/xml
diff options
context:
space:
mode:
authorChristian Tusche <chr13@gmx.net>2007-07-29 19:01:17 +0200
committerThomas Günther <tom@toms-cafe.de>2009-06-04 01:30:20 +0200
commit3ab2393b6932b34e7f0e69af7f843d1303104d79 (patch)
treec1a4f7e6e61f6a09bad4420614be52420506a362 /xml
parentf6f140b2ea0bb1de9e055e920ef9c0c43c6e2add (diff)
downloadvdr-plugin-text2skin-chr13-optimizations.tar.gz
vdr-plugin-text2skin-chr13-optimizations.tar.bz2
2007-07-29: Version 1.1-cvs_ext-0.11 (text2skin-1.1-cvs_ext-0.11.diff)chr13-optimizations
- moved state tracking of marquee, blink, scroll from cText2SkinRender to cxObject - fixed compatibility with gcc-4 and vdr-1.5.x - fixed use of Update.Lock() in render.h - new: dynamic width/height of objects - new: Option "bgColor" used for items "Text", "Marquee", and "Blink". - remember period to next timeout when doing a non-timeout refresh prevent occasional start/stop of marquee-text
Diffstat (limited to 'xml')
-rw-r--r--xml/object.c111
-rw-r--r--xml/object.h49
-rw-r--r--xml/parser.c6
-rw-r--r--xml/skin.h10
4 files changed, 140 insertions, 36 deletions
diff --git a/xml/object.c b/xml/object.c
index 587eab5..eae47e5 100644
--- a/xml/object.c
+++ b/xml/object.c
@@ -16,6 +16,7 @@ cxObject::cxObject(cxDisplay *Parent):
mType((eType)__COUNT_OBJECT__),
mPos1(0, 0),
mPos2(-1, -1),
+ mVirtSize(-1,-1),
mAlpha(255),
mColors(0),
mArc(0),
@@ -31,7 +32,8 @@ cxObject::cxObject(cxDisplay *Parent):
mDelay(150),
mIndex(0),
mRefresh(this),
- mObjects(NULL)
+ mObjects(NULL),
+ mListIndex(0)
{
}
@@ -41,11 +43,13 @@ cxObject::cxObject(const cxObject &Src):
mType(Src.mType),
mPos1(Src.mPos1),
mPos2(Src.mPos2),
+ mVirtSize(Src.mVirtSize),
mAlpha(Src.mAlpha),
mColors(Src.mColors),
mArc(Src.mArc),
mFg(Src.mFg),
mBg(Src.mBg),
+ mBl(Src.mBl),
mMask(Src.mMask),
mMark(Src.mMark),
mActive(Src.mActive),
@@ -61,7 +65,8 @@ cxObject::cxObject(const cxObject &Src):
mFontWidth(Src.mFontWidth),
mDelay(Src.mDelay),
mRefresh(Src.mRefresh),
- mObjects(NULL)
+ mObjects(NULL),
+ mListIndex(Src.mListIndex)
{
if (Src.mCondition)
mCondition = new cxFunction(*Src.mCondition);
@@ -130,7 +135,8 @@ bool cxObject::ParseFontFace(const std::string &Text)
void cxObject::SetListIndex(uint Index, int Tab)
{
- mIndex = mDisplay->Objects() + (Index * cSkinDisplayMenu::MaxTabs + Tab);
+ Tab = Tab>=0 ? Tab : -1;
+ mListIndex = 1 + Index * cSkinDisplayMenu::MaxTabs + Tab;
mText.SetListIndex(Index, Tab);
mPath.SetListIndex(Index, Tab);
if (mCondition != NULL)
@@ -157,24 +163,38 @@ const cFont *cxObject::Font(void) const
return cFont::GetFont(fontOsd);
}
-txPoint cxObject::Pos(const txPoint &BaseOffset, const txSize &BaseSize) const
+txPoint cxObject::Pos(const txPoint &BaseOffset, const txSize &BaseSize, const txSize &VirtSize) const
{
txPoint bOffset = BaseOffset.x < 0 ? mSkin->BaseOffset() : BaseOffset;
txSize bSize = BaseSize.w < 0 ? mSkin->BaseSize() : BaseSize;
- return txPoint(bOffset.x + (mPos1.x < 0 ? bSize.w + mPos1.x : mPos1.x),
- bOffset.y + (mPos1.y < 0 ? bSize.h + mPos1.y : mPos1.y));
+ double scale_x = VirtSize.w>0 ? (double)BaseSize.w / VirtSize.w : 1.0,
+ scale_y = VirtSize.h>0 ? (double)BaseSize.h / VirtSize.h : 1.0;
+
+ int x1 = mPos1.x < 0 ? (int)((mPos1.x + 1) * scale_x - 1) : (int)(mPos1.x * scale_x);
+ int y1 = mPos1.y < 0 ? (int)((mPos1.y + 1) * scale_x - 1) : (int)(mPos1.y * scale_y);
+
+ return txPoint(bOffset.x + (x1 < 0 ? bSize.w + x1 : x1),
+ bOffset.y + (y1 < 0 ? bSize.h + y1 : y1));
}
-txSize cxObject::Size(const txPoint &BaseOffset, const txSize &BaseSize) const
+txSize cxObject::Size(const txPoint &BaseOffset, const txSize &BaseSize, const txSize &VirtSize) const
{
- txPoint bOffset = BaseOffset.x < 0 ? mSkin->BaseOffset() : BaseOffset;
+ //txPoint bOffset = BaseOffset.x < 0 ? mSkin->BaseOffset() : BaseOffset;
txSize bSize = BaseSize.w < 0 ? mSkin->BaseSize() : BaseSize;
- txPoint p1(bOffset.x + (mPos1.x < 0 ? bSize.w + mPos1.x : mPos1.x),
- bOffset.y + (mPos1.y < 0 ? bSize.h + mPos1.y : mPos1.y));
- txPoint p2(bOffset.x + (mPos2.x < 0 ? bSize.w + mPos2.x : mPos2.x),
- bOffset.y + (mPos2.y < 0 ? bSize.h + mPos2.y : mPos2.y));
+ double scale_x = VirtSize.w>0 ? (double)BaseSize.w / VirtSize.w : 1.0,
+ scale_y = VirtSize.h>0 ? (double)BaseSize.h / VirtSize.h : 1.0;
+
+ int x1 = mPos1.x < 0 ? (int)((mPos1.x + 1) * scale_x - 1) : (int)(mPos1.x * scale_x);
+ int y1 = mPos1.y < 0 ? (int)((mPos1.y + 1) * scale_x - 1) : (int)(mPos1.y * scale_y);
+ int x2 = mPos2.x < 0 ? (int)((mPos2.x + 1) * scale_x - 1) : (int)(mPos2.x * scale_x);
+ int y2 = mPos2.y < 0 ? (int)((mPos2.y + 1) * scale_x - 1) : (int)(mPos2.y * scale_y);
+
+ txPoint p1(x1 < 0 ? bSize.w + x1 : x1,
+ y1 < 0 ? bSize.h + y1 : y1);
+ txPoint p2(x2 < 0 ? bSize.w + x2 : x2,
+ y2 < 0 ? bSize.h + y2 : y2);
return txSize(p2.x - p1.x + 1, p2.y - p1.y + 1);
}
@@ -191,6 +211,12 @@ const tColor *cxObject::Bg(void) const
return cText2SkinRender::ItemColor(mBg, Bg) ? &Bg : NULL;
}
+const tColor *cxObject::Bl(void) const
+{
+ static tColor Bl;
+ return cText2SkinRender::ItemColor(mBl, Bl) ? &Bl : NULL;
+}
+
const tColor *cxObject::Mask(void) const
{
static tColor Mask;
@@ -230,6 +256,11 @@ cxObjects::~cxObjects()
+
+
+///////////////////////////////////////////////////////////////////////////////
+// ---------- class cxRefresh ---------------------------------------------- //
+
cxRefresh::cxRefresh( cxObject *Object ):
mRefreshType(0xFF),
mText(NULL),
@@ -245,27 +276,55 @@ cxRefresh::~cxRefresh()
delete mText;
}
-bool cxRefresh::Dirty(uint dirty, bool force)
+bool cxRefresh::Dirty(uint dirty, uint &updatein, bool force, uint now)
{
- bool need_changed = !mForce && !force && !(mRefreshType & dirty & ~(1<<update));
+ // check if the timeout of the object has expired
+ uint nexttime = mObject->State().nexttime;
+
+ bool to = force || mForce ||
+ mObject->Type() == cxObject::block || mObject->Type() == cxObject::list;
+ bool changed = force || mForce;
+
+ if( now>0 && nexttime>0 ) {
+ // timeout was set
+ if( now >= nexttime ) {
+ // timeout has expired
+ to = true;
+ } else {
+ // time left -> set new update interval
+ uint nextin = nexttime - now;
+ if (updatein == 0 || nextin < updatein)
+ updatein = nextin;
+ }
+ }
- if( !(mRefreshType & dirty) )
- return false;
+ // Objaect has changed since last redraw
+ if( mChanged != NULL ) {
+ mEval = mChanged->Evaluate();
+ if( mEval != mLastEval ) {
+ changed = true;
+ }
+ }
- if( mChanged == NULL && need_changed )
- return false;
- else if( mChanged == NULL )
+ // refresh
+ if( (mRefreshType & dirty & ~(1<<timeout) & ~(1<<update)) ) {
+ if( changed ) mLastEval = mEval;
return true;
+ }
- mEval = mChanged->Evaluate();
-
- if( mEval == mLastEval && need_changed ) {
- return false;
- } else {
- mLastEval = mEval;
+ // timeout
+ if( (mRefreshType & dirty & (1<<timeout)) && to ) {
+ if( changed ) mLastEval = mEval;
+ return true;
}
- return true;
+ // update
+ if( (mRefreshType & dirty & (1<<update)) && changed ) {
+ mLastEval = mEval;
+ return true;
+ }
+
+ return false;
}
diff --git a/xml/object.h b/xml/object.h
index 7a37b5c..aad82a5 100644
--- a/xml/object.h
+++ b/xml/object.h
@@ -33,6 +33,29 @@ struct txWindow {
pos1(_x1, _y2), pos2(_x2, _y2), bpp(_bpp) {}
};
+
+
+
+
+
+// state information for marquee, blink, scroll
+struct txState {
+ bool scrolling;
+ int offset;
+ int direction;
+ uint nexttime;
+ std::string text;
+ txState(void): scrolling(false), offset(0), direction(1), nexttime(0) {}
+};
+
+
+
+
+
+
+
+
+
class cxObject;
class cxRefresh {
@@ -50,12 +73,12 @@ public:
cxRefresh(cxObject *Object);
~cxRefresh();
- bool Dirty(uint dirty, bool force=false);
+ bool Dirty(uint dirty, uint &updatein, bool force=false, uint now=0 );
bool Full(void) const { return mFull; }
uint Type(void) const { return mRefreshType; }
bool Parse(const std::string &Text);
bool ParseChanged(const std::string &Text);
- cxRefresh &cxRefresh::operator=(const cxRefresh &b);
+ cxRefresh &operator=(const cxRefresh &b);
private:
uint mRefreshType;
@@ -67,6 +90,12 @@ private:
bool mForce, mFull;
};
+
+
+
+
+
+
class cxObjects;
class cxObject {
@@ -102,11 +131,13 @@ private:
eType mType;
txPoint mPos1;
txPoint mPos2;
+ txSize mVirtSize;
int mAlpha;
int mColors;
int mArc;
std::string mFg;
std::string mBg;
+ std::string mBl;
std::string mMask;
std::string mMark;
std::string mActive;
@@ -125,6 +156,12 @@ private:
cxRefresh mRefresh;
cxObjects *mObjects; // used for block objects such as <list>
+ // state information for marquee, blink, scroll
+ uint mListIndex;
+ typedef std::map<uint,txState> tStates;
+ tStates mStates;
+
+
public:
cxObject(cxDisplay *parent);
cxObject(const cxObject &Src);
@@ -151,13 +188,17 @@ public:
uint Index(void) const { return mIndex; }
cxDisplay *Display(void) const { return mDisplay; }
cxSkin *Skin(void) const { return mSkin; }
+ txState &State(void) { return mStates[mListIndex]; }
const std::string &TypeName(void) const;
- txPoint Pos(const txPoint &BaseOffset=txPoint(-1,-1), const txSize &BaseSize=txSize(-1,-1)) const;
- txSize Size(const txPoint &BaseOffset=txPoint(-1,-1), const txSize &BaseSize=txSize(-1,-1)) const;
+ txPoint Pos(const txPoint &BaseOffset=txPoint(-1,-1), const txSize &BaseSize=txSize(-1,-1),
+ const txSize &VirtSize=txSize(-1,-1) ) const;
+ txSize Size(const txPoint &BaseOffset=txPoint(-1,-1), const txSize &BaseSize=txSize(-1,-1),
+ const txSize &VirtSize=txSize(-1,-1)) const;
const cFont *Font(void) const;
const tColor *Fg(void) const;
const tColor *Bg(void) const;
+ const tColor *Bl(void) const;
const tColor *Mask(void) const;
const tColor *Mark(void) const;
const tColor *Active(void) const;
diff --git a/xml/parser.c b/xml/parser.c
index 1e3ed73..158724a 100644
--- a/xml/parser.c
+++ b/xml/parser.c
@@ -159,11 +159,12 @@ bool xStartElem(const std::string &name, std::map<std::string,std::string> &attr
|| name == "blink"
|| name == "scrolltext") {
ATTRIB_OPT_STRING("color", object->mFg);
+ ATTRIB_OPT_STRING("bgColor", object->mBg);
ATTRIB_OPT_FUNC ("align", object->ParseAlignment);
ATTRIB_OPT_FUNC ("font", object->ParseFontFace);
if (name == "blink") {
- ATTRIB_OPT_STRING("blinkColor", object->mBg);
+ ATTRIB_OPT_STRING("blinkColor", object->mBl);
ATTRIB_OPT_NUMBER("delay", object->mDelay);
if (object->mDelay == 0)
@@ -196,6 +197,9 @@ bool xStartElem(const std::string &name, std::map<std::string,std::string> &attr
else if (name == "item") {
ATTRIB_MAN_NUMBER("height", object->mPos2.y);
--object->mPos2.y;
+ } else if (name == "block" || name == "list") {
+ ATTRIB_OPT_NUMBER("w", object->mVirtSize.w);
+ ATTRIB_OPT_NUMBER("h", object->mVirtSize.h);
}
} else
TAG_ERR_REMAIN(context[context.size() - 1].c_str());
diff --git a/xml/skin.h b/xml/skin.h
index 4613199..69d96e6 100644
--- a/xml/skin.h
+++ b/xml/skin.h
@@ -28,21 +28,21 @@ public:
bool Limit( int ma, int min ) const {
return mMajor < ma ? true : (mMajor == ma ? mMinor <= min : false);
}
- bool cxVersion::operator==( const cxVersion &v ) const {
+ bool operator==( const cxVersion &v ) const {
return mMajor == v.mMajor && mMinor == v.mMinor;
}
- bool cxVersion::operator>=( const cxVersion &v ) const {
+ bool operator>=( const cxVersion &v ) const {
return Require( v.mMajor , v.mMinor);
}
- bool cxVersion::operator>=( const char *c ) const {
+ bool operator>=( const char *c ) const {
cxVersion v;
if( !v.Parse(c) ) return false;
return Require( v.mMajor , v.mMinor);
}
- bool cxVersion::operator<=( const cxVersion &v ) const {
+ bool operator<=( const cxVersion &v ) const {
return Limit( v.mMajor , v.mMinor );
}
- bool cxVersion::operator<=( const char *c ) const {
+ bool operator<=( const char *c ) const {
cxVersion v;
if( !v.Parse(c) ) return false;
return Limit( v.mMajor , v.mMinor);