00001 #include <iostream>
00002 #include <cstdlib>
00003 using namespace std;
00004
00005 #include "mythuiimage.h"
00006 #include "mythpainter.h"
00007 #include "mythmainwindow.h"
00008
00009 #include "mythcontext.h"
00010 #include "mythscreentype.h"
00011
00012 MythUIImage::MythUIImage(const QString &filepattern,
00013 int low, int high, int delayms,
00014 MythUIType *parent, const char *name)
00015 : MythUIType(parent, name)
00016 {
00017 m_Filename = filepattern;
00018 m_LowNum = low;
00019 m_HighNum = high;
00020
00021 m_Delay = delayms;
00022
00023 Init();
00024 }
00025
00026 MythUIImage::MythUIImage(const QString &filename, MythUIType *parent,
00027 const char *name)
00028 : MythUIType(parent, name)
00029 {
00030 m_Filename = filename;
00031 m_OrigFilename = filename;
00032
00033 m_LowNum = 0;
00034 m_HighNum = 0;
00035 m_Delay = -1;
00036
00037 Init();
00038 }
00039
00040 MythUIImage::MythUIImage(MythUIType *parent, const char *name)
00041 : MythUIType(parent, name)
00042 {
00043 m_LowNum = 0;
00044 m_HighNum = 0;
00045 m_Delay = -1;
00046
00047 Init();
00048 }
00049
00050 MythUIImage::~MythUIImage()
00051 {
00052 Clear();
00053 }
00054
00055 void MythUIImage::Clear(void)
00056 {
00057 while (!m_Images.isEmpty())
00058 {
00059 m_Images.back()->DownRef();
00060 m_Images.pop_back();
00061 }
00062 }
00063
00064 void MythUIImage::Init(void)
00065 {
00066 m_Skip = QPoint(0, 0);
00067 m_ForceSize = QSize(-1, -1);
00068
00069 m_CurPos = 0;
00070 m_LastDisplay = QTime::currentTime();
00071 }
00072
00073 void MythUIImage::SetFilename(const QString &filename)
00074 {
00075 m_Filename = filename;
00076 }
00077
00078 void MythUIImage::SetFilepattern(const QString &filepattern, int low,
00079 int high)
00080 {
00081 m_Filename = filepattern;
00082 m_LowNum = low;
00083 m_HighNum = high;
00084 }
00085
00086 void MythUIImage::SetDelay(int delayms)
00087 {
00088 m_Delay = delayms;
00089 m_LastDisplay = QTime::currentTime();
00090 m_CurPos = 0;
00091 }
00092
00093 void MythUIImage::ResetFilename(void)
00094 {
00095 m_Filename = m_OrigFilename;
00096 Load();
00097 }
00098
00099 void MythUIImage::SetImage(MythImage *img)
00100 {
00101 Clear();
00102 m_Delay = -1;
00103
00104 img->UpRef();
00105 m_Images.push_back(img);
00106 m_Area.setSize(img->size());
00107 m_CurPos = 0;
00108 }
00109
00110 void MythUIImage::SetImages(QValueVector<MythImage *> &images)
00111 {
00112 Clear();
00113
00114 QValueVector<MythImage *>::iterator it;
00115 for (it = images.begin(); it != images.end(); ++it)
00116 {
00117 MythImage *im = (*it);
00118 im->UpRef();
00119 m_Images.push_back(im);
00120
00121 QSize aSize = m_Area.size();
00122 aSize = aSize.expandedTo(im->size());
00123 m_Area.setSize(aSize);
00124 }
00125
00126 m_CurPos = 0;
00127 }
00128
00129 void MythUIImage::SetSize(int width, int height)
00130 {
00131 m_ForceSize = QSize(width, height);
00132 }
00133
00134 void MythUIImage::SetSkip(int x, int y)
00135 {
00136 m_Skip = QPoint(x, y);
00137 }
00138
00139 void MythUIImage::Load(void)
00140 {
00141 Clear();
00142
00143 for (int i = m_LowNum; i <= m_HighNum; i++)
00144 {
00145 MythImage *image = GetMythPainter()->GetFormatImage();
00146 QString filename = m_Filename;
00147 if (m_HighNum >= 1)
00148 filename = QString(m_Filename).arg(i);
00149
00150 image->Load(filename);
00151
00152 if (!m_ForceSize.isNull())
00153 {
00154 int w = (m_ForceSize.width() != -1) ? m_ForceSize.width() : image->width();
00155 int h = (m_ForceSize.height() != -1) ? m_ForceSize.height() : image->height();
00156
00157 image->Assign(image->smoothScale(w, h));
00158 }
00159
00160 QSize aSize = m_Area.size();
00161 aSize = aSize.expandedTo(image->size());
00162 m_Area.setSize(aSize);
00163
00164 image->SetChanged();
00165
00166 if (image->isNull())
00167 image->DownRef();
00168 else
00169 m_Images.push_back(image);
00170 }
00171
00172 m_LastDisplay = QTime::currentTime();
00173 SetRedraw();
00174 }
00175
00176 void MythUIImage::Reset(void)
00177 {
00178 Clear();
00179 }
00180
00181 void MythUIImage::Pulse(void)
00182 {
00183 if (m_Delay > 0 &&
00184 abs(m_LastDisplay.msecsTo(QTime::currentTime())) > m_Delay)
00185 {
00186 m_CurPos++;
00187 if (m_CurPos >= m_Images.size())
00188 m_CurPos = 0;
00189
00190 SetRedraw();
00191 m_LastDisplay = QTime::currentTime();
00192 }
00193
00194 MythUIType::Pulse();
00195 }
00196
00197 void MythUIImage::DrawSelf(MythPainter *p, int xoffset, int yoffset,
00198 int alphaMod, QRect clipRect)
00199 {
00200 if (m_Images.size() > 0)
00201 {
00202 if (m_CurPos > m_Images.size())
00203 m_CurPos = 0;
00204
00205 QRect area = m_Area;
00206 area.moveBy(xoffset, yoffset);
00207
00208 int alpha = CalcAlpha(alphaMod);
00209
00210 QRect srcRect = m_Images[m_CurPos]->rect();
00211 srcRect.setTopLeft(m_Skip);
00212
00213 p->DrawImage(area, m_Images[m_CurPos], srcRect, alpha);
00214 }
00215 }
00216
00217 bool MythUIImage::ParseElement(QDomElement &element)
00218 {
00219 if (element.tagName() == "filename")
00220 m_OrigFilename = m_Filename = getFirstText(element);
00221 else if (element.tagName() == "filepattern")
00222 {
00223 m_OrigFilename = m_Filename = getFirstText(element);
00224 QString tmp = element.attribute("low");
00225 if (!tmp.isEmpty())
00226 m_LowNum = tmp.toInt();
00227 tmp = element.attribute("high");
00228 if (!tmp.isEmpty())
00229 m_HighNum = tmp.toInt();
00230 }
00231 else if (element.tagName() == "staticsize")
00232 m_ForceSize = parseSize(element);
00233 else if (element.tagName() == "skipin")
00234 m_Skip = parsePoint(element);
00235 else if (element.tagName() == "delay")
00236 m_Delay = getFirstText(element).toInt();
00237 else
00238 return MythUIType::ParseElement(element);
00239
00240 m_NeedLoad = true;
00241 return true;
00242 }
00243
00244 void MythUIImage::CopyFrom(MythUIType *base)
00245 {
00246 MythUIImage *im = dynamic_cast<MythUIImage *>(base);
00247 if (!im)
00248 {
00249 VERBOSE(VB_IMPORTANT, "ERROR, bad parsing");
00250 return;
00251 }
00252
00253 m_Filename = im->m_Filename;
00254 m_OrigFilename = im->m_OrigFilename;
00255
00256 m_Skip = im->m_Skip;
00257 m_ForceSize = im->m_ForceSize;
00258
00259 m_Delay = im->m_Delay;
00260 m_LowNum = im->m_LowNum;
00261 m_HighNum = im->m_HighNum;
00262
00263 m_LastDisplay = QTime::currentTime();
00264 m_CurPos = 0;
00265
00266 SetImages(im->m_Images);
00267
00268 MythUIType::CopyFrom(base);
00269 }
00270
00271 void MythUIImage::CreateCopy(MythUIType *parent)
00272 {
00273 MythUIImage *im = new MythUIImage(parent, name());
00274 im->CopyFrom(this);
00275 }
00276
00277 void MythUIImage::Finalize(void)
00278 {
00279 if (m_NeedLoad)
00280 Load();
00281
00282 MythUIType::Finalize();
00283 }
00284