MythTV master
mythpainter.h
Go to the documentation of this file.
1#ifndef MYTHPAINTER_H_
2#define MYTHPAINTER_H_
3
4#include <QMap>
5#include <QString>
6#include <QTextLayout>
7#include <QWidget>
8#include <QPaintDevice>
9#include <QMutex>
10#include <QSet>
11
12class QRect;
13class QRegion;
14class QPoint;
15class QColor;
16
17#include "mythuiexp.h"
18
19#include <list>
20#include <memory>
21
22#ifdef _MSC_VER
23# include <cstdint> // int64_t
24#endif
25
27class MythImage;
28class UIEffects;
29
30using LayoutVector = QVector<QTextLayout *>;
31using FormatVector = QVector<QTextLayout::FormatRange>;
32using ProcSource = std::shared_ptr<QByteArray>;
33
34class MUI_PUBLIC MythPainter : public QObject
35{
36 Q_OBJECT
37
38 public:
47 ~MythPainter() override = default;
48
49 virtual QString GetName(void) = 0;
50 virtual bool SupportsAnimation(void) = 0;
51 virtual bool SupportsAlpha(void) = 0;
52 virtual bool SupportsClipping(void) = 0;
53 virtual void FreeResources(void) { }
54 virtual void Begin(QPaintDevice* /*Parent*/) { }
55 virtual void End() { }
56
57 virtual void SetClipRect(QRect clipRect);
58 virtual void SetClipRegion(const QRegion &clipRegion);
59 virtual void Clear(QPaintDevice *device, const QRegion &region);
60
61 virtual void DrawImage(QRect dest, MythImage *im, QRect src, int alpha) = 0;
62
63 void DrawImage(int x, int y, MythImage *im, int alpha);
64 void DrawImage(QPoint topLeft, MythImage *im, int alph);
65 virtual void DrawProcedural(QRect /*Area*/, int /*Alpha*/,
66 const ProcSource& /*VertexSource*/,
67 const ProcSource& /*FragmentSource*/,
68 const QString& /*SourceHash*/) { }
69
70 virtual void DrawText(QRect r, const QString &msg, int flags,
71 const MythFontProperties &font, int alpha,
72 QRect boundRect);
73 virtual void DrawTextLayout(QRect canvasRect,
74 const LayoutVector & layouts,
75 const FormatVector & formats,
76 const MythFontProperties &font, int alpha,
77 QRect destRect);
78 virtual void DrawRect(QRect area, const QBrush &fillBrush,
79 const QPen &linePen, int alpha);
80 virtual void DrawRoundRect(QRect area, int cornerRadius,
81 const QBrush &fillBrush, const QPen &linePen,
82 int alpha);
83 virtual void DrawEllipse(QRect area, const QBrush &fillBrush,
84 const QPen &linePen, int alpha);
85
86 virtual void PushTransformation([[maybe_unused]] const UIEffects &zoom,
87 [[maybe_unused]] QPointF center = QPointF()) {};
88 virtual void PopTransformation(void) { }
89
93 MythImage *GetFormatImage();
94 void DeleteFormatImage(MythImage *im);
95
96 void SetDebugMode(bool showBorders, bool showNames)
97 {
98 m_showBorders = showBorders;
99 m_showNames = showNames;
100 }
101
102 bool ShowBorders(void) const { return m_showBorders; }
103 bool ShowTypeNames(void) const { return m_showNames; }
104
105 void SetMaximumCacheSizes(int hardware, int software);
106
107 protected:
108 static void DrawTextPriv(MythImage *im, const QString &msg, int flags,
109 QRect r, const MythFontProperties &font);
110 static void DrawRectPriv(MythImage *im, QRect area, int radius, int ellipse,
111 const QBrush &fillBrush, const QPen &linePen);
112
113 MythImage *GetImageFromString(const QString &msg, int flags, QRect r,
114 const MythFontProperties &font);
115 MythImage *GetImageFromTextLayout(const LayoutVector & layouts,
116 const FormatVector & formats,
117 const MythFontProperties &font,
118 QRect &canvas, QRect &dest);
119 MythImage *GetImageFromRect(QRect area, int radius, int ellipse,
120 const QBrush &fillBrush,
121 const QPen &linePen);
122
124 virtual MythImage* GetFormatImagePriv(void) = 0;
125 virtual void DeleteFormatImagePriv(MythImage *im) = 0;
126 void ExpireImages(int64_t max = 0);
127
128 // This needs to be called by classes inheriting from MythPainter
129 // in the destructor.
130 virtual void Teardown(void);
131
132 void CheckFormatImage(MythImage *im);
133
134 float m_frameTime { 0 };
135
136 int m_hardwareCacheSize { 0 };
137 int m_maxHardwareCacheSize { 0 };
138
139 private:
140 int64_t m_softwareCacheSize {0};
141 int64_t m_maxSoftwareCacheSize {48LL * 1024 * 1024};
142
144 QSet<MythImage*> m_allocatedImages;
145
146 QMap<QString, MythImage *> m_stringToImageMap;
147 std::list<QString> m_stringExpireList;
148
149 bool m_showBorders {false};
150 bool m_showNames {false};
151};
152
153#endif
#define Clear(a)
~MythPainter() override=default
MythPainter destructor.
virtual void PushTransformation(const UIEffects &zoom, QPointF center=QPointF())
Definition: mythpainter.h:86
virtual void DrawProcedural(QRect, int, const ProcSource &, const ProcSource &, const QString &)
Definition: mythpainter.h:65
virtual bool SupportsClipping(void)=0
virtual void DeleteFormatImagePriv(MythImage *im)=0
virtual MythImage * GetFormatImagePriv(void)=0
Creates a reference counted image, call DecrRef() to delete.
QMap< QString, MythImage * > m_stringToImageMap
Definition: mythpainter.h:146
void SetDebugMode(bool showBorders, bool showNames)
Definition: mythpainter.h:96
virtual void DrawImage(QRect dest, MythImage *im, QRect src, int alpha)=0
bool ShowBorders(void) const
Definition: mythpainter.h:102
QSet< MythImage * > m_allocatedImages
Definition: mythpainter.h:144
virtual QString GetName(void)=0
QMutex m_allocationLock
Definition: mythpainter.h:143
bool ShowTypeNames(void) const
Definition: mythpainter.h:103
std::list< QString > m_stringExpireList
Definition: mythpainter.h:147
virtual void Begin(QPaintDevice *)
Definition: mythpainter.h:54
virtual bool SupportsAlpha(void)=0
virtual void PopTransformation(void)
Definition: mythpainter.h:88
virtual void End()
Definition: mythpainter.h:55
virtual void FreeResources(void)
Definition: mythpainter.h:53
virtual bool SupportsAnimation(void)=0
QVector< QTextLayout::FormatRange > FormatVector
Definition: mythpainter.h:31
std::shared_ptr< QByteArray > ProcSource
Definition: mythpainter.h:32
QVector< QTextLayout * > LayoutVector
Definition: mythpainter.h:30
#define MUI_PUBLIC
Definition: mythuiexp.h:9
const std::array< const std::string, 8 > formats
Definition: vbilut.cpp:189