00001
00002
00003
00004
00005
00006
00007 #ifndef __mainvisual_h
00008 #define __mainvisual_h
00009
00010 #include <mythtv/visual.h>
00011 #include "polygon.h"
00012 #include "constants.h"
00013
00014 #include <qwidget.h>
00015 #include <qdialog.h>
00016 #include <qmemarray.h>
00017 #include <qpixmap.h>
00018 #include <qimage.h>
00019 #include <qptrlist.h>
00020 #include <qstringlist.h>
00021 #include <qtimer.h>
00022
00023 class Buffer;
00024 class Output;
00025 class VisualNode;
00026 class LogScale;
00027 class QTimer;
00028 class InfoWidget;
00029 class Metadata;
00030 class MainVisual;
00031
00032 class VisualNode
00033 {
00034 public:
00035 VisualNode(short *l, short *r, unsigned long n, unsigned long o)
00036 : left(l), right(r), length(n), offset(o)
00037 {
00038
00039
00040 }
00041
00042 ~VisualNode()
00043 {
00044 delete [] left;
00045 delete [] right;
00046 }
00047
00048 short *left, *right;
00049 long length, offset;
00050
00051 };
00052
00053 class VisualBase
00054 {
00055 public:
00056 VisualBase(bool screensaverenable = false);
00057 virtual ~VisualBase(void);
00058
00059
00060 virtual bool process( VisualNode *node ) = 0;
00061 virtual bool draw( QPainter *, const QColor & ) = 0;
00062 virtual void resize( const QSize &size ) = 0;
00063 virtual void handleKeyPress(const QString &action) = 0;
00064 virtual int getDesiredFPS(void) { return fps; }
00065 void drawWarning(QPainter *, const QColor &, const QSize &, QString);
00066
00067 protected:
00068 int fps;
00069 bool xscreensaverenable;
00070 };
00071
00072 class VisFactory
00073 {
00074 public:
00075 VisFactory() {m_pNextVisFactory = g_pVisFactories; g_pVisFactories = this;}
00076 virtual ~VisFactory() {}
00077 const VisFactory* next() const {return m_pNextVisFactory;}
00078 virtual const QString &name(void) const = 0;
00079 virtual VisualBase* create(MainVisual *parent, long int winid,
00080 const QString &pluginName) const = 0;
00081 virtual uint plugins(QStringList *list) const = 0;
00082 static const VisFactory* VisFactories() {return g_pVisFactories;}
00083 protected:
00084 static VisFactory* g_pVisFactories;
00085 VisFactory* m_pNextVisFactory;
00086 };
00087
00088
00089 class MainVisual : public QWidget, public MythTV::Visual
00090 {
00091 Q_OBJECT
00092
00093 public:
00094 MainVisual(QWidget *parent = 0, const char * = 0);
00095 virtual ~MainVisual();
00096
00097 VisualBase *visual() const { return vis; }
00098 void setVisual(const QString &name);
00099
00100 void add(uchar *, unsigned long, unsigned long, int, int);
00101 void prepare();
00102
00103 QSize minimumSizeHint() const { return sizeHint(); }
00104 QSize sizeHint() const { return QSize(4*4*4*2, 3*3*3*2); }
00105
00106 void paintEvent( QPaintEvent * );
00107 void resizeEvent( QResizeEvent * );
00108 void customEvent( QCustomEvent * );
00109 void hideEvent( QHideEvent * );
00110
00111 void setFrameRate( int newfps );
00112 int frameRate() const { return fps; }
00113
00114 void showBanner(const QString &text, int showTime = 8000);
00115 void showBanner(Metadata *meta, bool fullScreen, int visMode, int showTime = 8000);
00116 void hideBanner();
00117 bool bannerIsShowing(void) {return bannerTimer->isActive(); }
00118
00119 static QStringList Visualizations();
00120
00121 Metadata *metadata() const { return meta; }
00122 void setMetadata(Metadata *&m) { meta = m; }
00123 void deleteMetadata() { meta=NULL; };
00124
00125 public slots:
00126 void timeout();
00127 void bannerTimeout();
00128
00129 signals:
00130 void hidingVisualization();
00131
00132 private:
00133 VisualBase *vis;
00134 Metadata *meta;
00135 QPixmap pixmap;
00136 QPtrList<VisualNode> nodes;
00137 bool playing;
00138 int fps;
00139 QTimer *timer;
00140 QTimer *bannerTimer;
00141 InfoWidget* info_widget;
00142
00143 QString current_visual_name;
00144 };
00145
00146 class InfoWidget : public QWidget
00147 {
00148 Q_OBJECT
00149
00150 public:
00151 InfoWidget(QWidget *parent = 0);
00152 void showInformation(const QString &text);
00153 void showMetadata(Metadata *meta, bool fullScreen, int visMode);
00154 void paintEvent(QPaintEvent *);
00155 void setDisplayRect(QRect rect) { displayRect = rect; }
00156
00157 private:
00158 QString info;
00159 QPixmap info_pixmap;
00160 QRect displayRect;
00161 };
00162
00163 class StereoScope : public VisualBase
00164 {
00165 public:
00166 StereoScope();
00167 virtual ~StereoScope();
00168
00169 void resize( const QSize &size );
00170 bool process( VisualNode *node );
00171 bool draw( QPainter *p, const QColor &back );
00172 void handleKeyPress(const QString &action) {(void) action;}
00173
00174 protected:
00175 QColor startColor, targetColor;
00176 QMemArray<double> magnitudes;
00177 QSize size;
00178 bool rubberband;
00179 double falloff;
00180 };
00181
00182 class MonoScope : public StereoScope
00183 {
00184 public:
00185 MonoScope();
00186 virtual ~MonoScope();
00187
00188 bool process( VisualNode *node );
00189 bool draw( QPainter *p, const QColor &back );
00190 };
00191
00192 class LogScale
00193 {
00194 public:
00195 LogScale(int = 0, int = 0);
00196 ~LogScale();
00197
00198 int scale() const { return s; }
00199 int range() const { return r; }
00200
00201 void setMax(int, int);
00202
00203 int operator[](int);
00204
00205
00206 private:
00207 int *indices;
00208 int s, r;
00209 };
00210
00211 #endif // __mainvisual_h
00212