/* * $Id: marquee.c,v 1.1 2004/12/19 22:03:14 lordjaxom Exp $ */ #include "marquee.h" #include "screen.h" #include cText2SkinMarquee::cText2SkinMarquee(const cText2SkinMarquee &Src): mScreen(Src.mScreen), mFont(Src.mFont), mLeft(Src.mLeft), mTop(Src.mTop), mWidth(Src.mWidth), mHeight(Src.mHeight), mText(Src.mText), mScrolling(Src.mScrolling), mOffset(Src.mOffset), mDirection(Src.mDirection), mColorFg(Src.mColorFg), mColorBg(Src.mColorBg), mNextTime(Src.mNextTime) { } cText2SkinMarquee::cText2SkinMarquee(cText2SkinScreen *Screen, int Left, int Top, int Width, int Height, const std::string &Text, const cFont *Font, tColor ColorFg, tColor ColorBg, int &UpdateIn) { Set(Screen, Left, Top, Width, Height, Text, Font, ColorFg, ColorBg, UpdateIn); } void cText2SkinMarquee::Set(cText2SkinScreen *Screen, int Left, int Top, int Width, int Height, const std::string &Text, const cFont *Font, tColor ColorFg, tColor ColorBg, int &UpdateIn) { mScreen = Screen; mFont = Font; mLeft = Left; mTop = Top; mWidth = Width; mHeight = Height; mText = Text; mColorFg = ColorFg; mColorBg = ColorBg; mOffset = 0; mDirection = 1; mNextTime = 0; mScrolling = mFont->Width(mText.c_str()) > mWidth; DrawText(UpdateIn); } void cText2SkinMarquee::DrawText(int &mUpdateIn) { uint now = time_ms(); if (!mScrolling || (mNextTime > 0 && now < mNextTime)) { mScreen->DrawText(mLeft, mTop, mText.c_str() + mOffset, mColorFg, mColorBg, mFont, mWidth, mHeight); if (mScrolling) { uint updatein = mNextTime - now; if (mUpdateIn == 0 || (uint)mUpdateIn > updatein) mUpdateIn = updatein; } return; } int nextupdate = 250; if (mDirection > 0) { if (mFont->Width(mText.c_str() + mOffset) <= mWidth) { --mDirection; nextupdate = 1500; } else ++mOffset; } else { if (mOffset <= 0) { ++mDirection; nextupdate = 1500; } else --mOffset; } mNextTime = now + nextupdate; mScreen->DrawText(mLeft, mTop, mText.c_str() + mOffset, mColorFg, mColorBg, mFont, mWidth, mHeight); if (mUpdateIn == 0 || mUpdateIn > nextupdate) mUpdateIn = nextupdate; }