00001 #include "DisplayResScreen.h"
00002 #include "mythcontext.h"
00003
00004 DisplayResScreen::DisplayResScreen(int w, int h, int mw, int mh,
00005 double aspectRatio, short refreshRate)
00006 : width(w), height(h), width_mm(mw), height_mm(mh)
00007 {
00008 SetAspectRatio(aspectRatio);
00009 if (refreshRate > 0)
00010 refreshRates.push_back(refreshRate);
00011 }
00012
00013 DisplayResScreen::DisplayResScreen(int w, int h, int mw, int mh,
00014 const vector<short>& rr)
00015 : width(w), height(h), width_mm(mw), height_mm(mh), refreshRates(rr)
00016 {
00017 SetAspectRatio(-1.0);
00018 }
00019
00020 DisplayResScreen::DisplayResScreen(int w, int h, int mw, int mh,
00021 const short* rr, uint rr_length)
00022 : width(w), height(h), width_mm(mw), height_mm(mh)
00023 {
00024 SetAspectRatio(-1.0);
00025 for (uint i = 0; i < rr_length; ++i)
00026 refreshRates.push_back(rr[i]);
00027
00028 sort(refreshRates.begin(), refreshRates.end());
00029 }
00030
00031 DisplayResScreen::DisplayResScreen(const QString &str)
00032 : width(0), height(0), width_mm(0), height_mm(0), aspect(-1.0)
00033 {
00034 refreshRates.clear();
00035 QStringList slist = QStringList::split(":", str);
00036 if (slist.size()<4)
00037 slist = QStringList::split(",", str);
00038 if (slist.size() >= 4)
00039 {
00040 width = slist[0].toInt();
00041 height = slist[1].toInt();
00042 width_mm = slist[2].toInt();
00043 height_mm = slist[3].toInt();
00044 aspect = slist[4].toDouble();
00045 for (uint i = 5; i<slist.size(); ++i)
00046 refreshRates.push_back(slist[i].toShort());
00047 }
00048 }
00049
00050 void DisplayResScreen::SetAspectRatio(double a)
00051 {
00052 if (a>0.0)
00053 aspect = a;
00054 else if (Height_mm())
00055 aspect = ((double)(Width_mm())) / ((double)(Height_mm()));
00056 }
00057
00058 QString DisplayResScreen::toString() const
00059 {
00060 QString str = QString("%1:%2:%3:%4:%5")
00061 .arg(width).arg(height).arg(width_mm).arg(height_mm).arg(aspect);
00062 for (uint i=0; i<refreshRates.size(); ++i)
00063 str.append(QString(":%1").arg(refreshRates[i]));
00064 return str;
00065 }
00066
00067 QStringList DisplayResScreen::Convert(const vector<DisplayResScreen>& dsr)
00068 {
00069 QStringList slist;
00070 for (uint i=0; i<dsr.size(); ++i)
00071 slist += dsr[i].toString();
00072 return slist;
00073 }
00074
00075 DisplayResVector DisplayResScreen::Convert(const QStringList& slist)
00076 {
00077 vector<DisplayResScreen> dsr;
00078 for (uint i=0; i<slist.size(); ++i)
00079 dsr.push_back(DisplayResScreen(slist[i]));
00080 return dsr;
00081 }
00082
00083 int DisplayResScreen::FindBestMatch(const vector<DisplayResScreen>& dsr,
00084 const DisplayResScreen& d,
00085 short& target_rate)
00086 {
00087 for (uint i=0; i<dsr.size(); ++i)
00088 {
00089 if (dsr[i].Width()==d.Width() && dsr[i].Height()==d.Height())
00090 {
00091 const vector<short>& rates = dsr[i].RefreshRates();
00092 if (rates.size())
00093 {
00094 vector<short>::const_iterator it =
00095 find(rates.begin(), rates.end(), d.RefreshRate());
00096 target_rate = (it == rates.end()) ? *(--rates.end()) : *it;
00097 return i;
00098 }
00099 }
00100 }
00101 return -1;
00102 }