summaryrefslogtreecommitdiff
path: root/marquee.c
blob: 730596496a6fe92fb476f82070a69269accd0fe6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/*
 *  $Id: marquee.c,v 1.2 2004/12/21 20:26:25 lordjaxom Exp $
 */

#include "marquee.h"
#include "screen.h"
#include <vdr/tools.h>

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, uint &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, uint &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(uint &UpdateIn)
{
	uint now = time_ms();
	if (mNextTime == 0)
		mNextTime = now + 1500;
	else if (now >= mNextTime) {
		uint nextin = 250;
		if (mDirection > 0) {
			if (mFont->Width(mText.c_str() + mOffset) <= mWidth) {
				--mDirection;
				nextin = 1500;
			}
			else
				++mOffset;
		}
		else {
			if (mOffset <= 0) {
				++mDirection;
				nextin = 1500;
			}
			else
				--mOffset;
		}
		mNextTime = now + nextin;
	}

	if (mScrolling) {
		uint updatein = mNextTime - now;
		if (UpdateIn == 0 || updatein < UpdateIn)
			UpdateIn = updatein;
	}
		
	mScreen->DrawText(mLeft, mTop, mText.c_str() + mOffset, mColorFg, mColorBg, mFont, mWidth, 
					  mHeight);
}