]> git.vomp.tv Git - vompclient.git/blob - osdvector.h
Remove some dead code, rename some things
[vompclient.git] / osdvector.h
1 /*
2     Copyright 2004-2005 Chris Tallon, 2006,2011-2012 Marten Richter
3
4     This file is part of VOMP.
5
6     VOMP is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     VOMP is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with VOMP.  If not, see <https://www.gnu.org/licenses/>.
18 */
19
20
21 #ifndef OSDVECTOR_H
22 #define OSDVECTOR_H
23 #include <set>
24 #include <list>
25 #include <vector>
26 #include <map>
27 #include <queue>
28 #include <string>
29 #include <mutex>
30
31 #include "defines.h"
32 #include "threadsystem.h"
33 #include "osd.h"
34 #include "colour.h"
35 #include "tvmedia.h"
36 #include "vdr.h"
37
38 #include "teletextdecodervbiebu.h"
39
40 enum SVGCommandInstr
41 {
42   DrawNoop,
43   DrawPath,
44   DrawGlyph,
45   DrawImage,
46   DrawTTchar,
47   DrawClipping,
48   DrawImageLoading
49 };
50 enum PathIndex
51 {
52   PIHorzLine,
53   PIVertLine,
54   PIRectangle,
55   PIPoint
56 };
57
58 enum Corner
59 {
60   TopLeft,
61   TopRight,
62   BottomLeft,
63   BottomRight,
64   TopMiddle,
65   BottomMiddle,
66   TopLeftLimited
67 };
68
69 typedef  VectorHandle ImageIndex;
70 typedef unsigned long long LoadIndex;
71
72 class SVGCommand
73 {
74   public:
75     SVGCommand()
76     {
77       instr = DrawNoop;
78       x = y = w = h = 0;
79       reference = VECTOR_HANDLE_INIT;
80     };
81
82     inline static SVGCommand PaintPath(float ix, float iy, float iw, float ih, PathIndex path, VectorHandle ref)
83     {
84       SVGCommand nc;
85       nc.instr = DrawPath;
86       nc.x = ix;
87       nc.y = iy;
88       nc.w = iw;
89       nc.h = ih;
90       nc.target.path_index = path;
91       nc.reference = ref;
92       return nc;
93     };
94
95     inline static SVGCommand PaintImageLoading(LoadIndex load_in, float ix, float iy, float iw, float ih, VectorHandle ref, Corner corner = TopLeft)
96     {
97       SVGCommand nc;
98       nc.instr = DrawImageLoading;
99       nc.x = ix;
100       nc.y = iy;
101       nc.w = iw;
102       nc.h = ih;
103       nc.target.loadindex = load_in;
104       nc.reference = ref;
105       nc.corner = corner;
106       return nc;
107     };
108
109     inline static SVGCommand PaintImage(float ix, float iy, float iw, float ih, ImageIndex image_in, VectorHandle ref, Corner corner = TopLeft)
110     {
111       SVGCommand nc;
112       nc.instr = DrawImage;
113       nc.x = ix;
114       nc.y = iy;
115       nc.w = iw;
116       nc.h = ih;
117       nc.target.image = image_in;
118       nc.reference = ref;
119       nc.corner = corner;
120       return nc;
121     };
122
123
124
125     inline static SVGCommand PaintTTchar(float ix, float iy, float iw, float ih, unsigned int ttchar_in)
126     {
127       SVGCommand nc;
128       nc.instr = DrawTTchar;
129       nc.x = ix;
130       nc.y = iy;
131       nc.w = iw;
132       nc.h = ih;
133       nc.reference = 0;
134       nc.target.ttchar = ttchar_in;
135       nc.corner = TopLeft;
136       return nc;
137     };
138     inline static SVGCommand PaintClipping(float ix, float iy, float iw, float ih)
139     {
140       SVGCommand nc;
141       nc.instr = DrawClipping;
142       nc.x = ix;
143       nc.y = iy;
144       nc.w = iw;
145       nc.h = ih;
146       nc.reference = 0;
147       nc.target.ttchar = 0;
148       return nc;
149     };
150
151
152     inline static void PaintGlyph(SVGCommand& nc, float ix, float iy, wchar_t char_in, VectorHandle ref)
153     {
154       nc.instr = DrawGlyph;
155       nc.x = ix;
156       nc.y = iy;
157       nc.w = 0;
158       nc.h = 0;
159       nc.reference = ref;
160       nc.target.textchar = char_in;
161     };
162
163     bool Test(float tx, float ty, float tw, float th)
164     {
165       return (x >= tx) && (y >= ty) && ((x + w) <= (tx + tw)) && ((y + h) <= (ty + th));
166     }
167     bool TTTest(float tox, float toy, float tx, float ty)
168     {
169       return (x == tox) && (toy == y) && (w == tx) && (h == ty);
170     }
171     bool Outside(float tx, float ty, float tw, float th)
172     {
173       return ((x + w) < tx) || ((y + h) < ty) || ((tx + tw) < x) || ((ty + th) < y);
174     }
175
176     VectorHandle getRef() { return reference; };
177     ImageIndex getImageIndex()
178     {
179       if (instr != DrawImage) return 0;
180       else return target.image;
181     };
182     LoadIndex getLoadIndex()
183     {
184       if (instr != DrawImageLoading) return 0;
185       else return target.loadindex;
186     };
187
188     SVGCommandInstr instr;
189     Corner corner;
190     float x, y, w, h;
191     VectorHandle reference;
192     union
193     {
194       PathIndex path_index; //path_index
195       wchar_t textchar;
196       ImageIndex image;
197       unsigned int ttchar;
198       LoadIndex loadindex;
199     } target;
200
201
202 };
203
204 class SurfaceVector;
205 class VDR_ResponsePacket;
206
207 struct SurfaceInfo
208 {
209   const SurfaceVector* surf;
210   std::vector<SVGCommand> commands;
211   float x, y, w, h;
212 };
213
214
215 class OsdVector : public Osd
216 {
217   public:
218     OsdVector();
219
220     int restore();
221
222     void screenShot(const char* fileName);
223     virtual bool screenShot(void* buffer, int width, int height, bool osd /*include osd*/) = 0;
224
225     Surface* createNewSurface();
226
227     void Blank();
228     virtual void updateBackgroundColor(DrawStyle /* bg */) {};
229
230     void updateOrAddSurface(const SurfaceVector* surf, float x, float y, float height, float width,
231                             std::vector<SVGCommand>& commands);
232     void removeSurface(const SurfaceVector* surf);
233
234     virtual float getFontHeight() = 0;
235     virtual float getCharWidth(wchar_t c) = 0;
236     float* getCharWidthArray() {return byte_char_width;};
237
238     //virtual ImageIndex getJpegRef(const char* fileName, int *width,int *height);
239     virtual LoadIndex getTVMediaRef(TVMediaInfo& tvmedia, ImageIndex& image);
240     virtual ImageIndex getMonoBitmapRef(void* base, int width, int height);
241     virtual ImageIndex getImagePalette(int width, int height, const unsigned char* image_data, const unsigned int* palette_data);
242
243
244     virtual bool getStaticImageData(unsigned int static_id, UCHAR** userdata, ULONG* length) = 0;
245
246     void removeImageRef(const ImageIndex ref);
247     void removeLoadIndexRef(const LoadIndex ref);
248     VectorHandle getStyleRef(const DrawStyle& c);
249     virtual void removeStyleRef(VectorHandle ref);
250     virtual void getScreenSize(int& width, int& height) = 0;
251     virtual void getRealScreenSize(int& width, int& height) = 0;
252
253     // should be only called from control thread
254     void informPicture(LoadIndex index, ImageIndex i_index);
255
256
257
258
259     int charSet() {return 2;}; //UTF-8
260
261
262     class PictureDecoder;
263     struct PictureInfo
264     {
265       enum PictType
266       {
267         RGBAMemBlock,
268         EGLImage,
269         D2DBitmap
270       };
271       PictType type;
272       ULONG width;
273       ULONG height;
274       LoadIndex lindex;
275       union
276       {
277         const void* image;
278         unsigned int handle;
279       };
280       void* reference;
281       PictureDecoder* decoder;
282     };
283
284
285     class PictureReader;
286
287     class PictureDecoder
288     {
289       public:
290         PictureDecoder(PictureReader* treader) {reader = treader;};
291         virtual ~PictureDecoder() {};
292
293         // its is always guaranted, that after getDecodedPicture a call to decodePicture follows, if the return value was true;
294         virtual unsigned char* decodePicture(LoadIndex index, unsigned char* buffer, unsigned int length, bool freemem = true) = 0;
295
296         virtual bool getDecodedPicture(struct PictureInfo& pict_inf) = 0;
297         virtual void freeReference(void* ref) = 0;
298
299         virtual void init() {};
300         virtual void shutdown() {};
301
302       protected:
303         PictureReader* reader;
304     };
305
306     class PictureReader: public Thread_TYPE
307     {
308       public:
309
310         ~PictureReader();
311
312         void init();
313         void addDecoder(PictureDecoder*);
314         void removeDecoder(PictureDecoder*);
315
316         void shutdown();
317
318
319         bool processReceivedPictures();
320
321         // should be called from control thread
322         void receivePicture(VDR_ResponsePacket* vresp);
323
324         void addStaticImage(unsigned int id);
325
326         void invalidateLoadIndex(LoadIndex index);
327
328         void informFallback(LoadIndex index, int fallback);
329
330
331
332
333       protected:
334
335         void threadMethod();
336
337         std::mutex pict_lock_incoming; //locks
338         std::mutex decoders_lock;
339         std::queue<VDR_ResponsePacket*> pict_incoming;
340         std::queue<unsigned int> pict_incoming_static;
341         std::list<PictureDecoder*> decoders;
342         std::map<LoadIndex, int> inform_fallback;
343         std::set<LoadIndex> invalid_loadindex;
344
345         bool picture_update;
346
347     };
348
349     PictureReader* getPictReader() { return &reader;};
350
351
352
353   protected:
354
355     PictureReader reader;
356
357     void incImageRef(ImageIndex index);
358     int getImageRef(ImageIndex index);
359     virtual void destroyImageRef(ImageIndex index) = 0;
360     void incLoadIndexRef(LoadIndex index);
361     int getLoadIndexRef(LoadIndex index);
362
363
364     //virtual ImageIndex createJpeg(const char* fileName, int *width,int *height)=0;
365     virtual ImageIndex createMonoBitmap(void* base, int width, int height) = 0;
366     virtual ImageIndex createImagePalette(int width, int height, const unsigned char* image_data, const unsigned int* palette_data) = 0;
367     virtual void createPicture(struct PictureInfo& pict_inf) = 0;
368
369     virtual LoadIndex loadTVMedia(TVMediaInfo& tvmedia);
370
371
372
373     std::map<ImageIndex, int> images_ref;
374     std::map<void*, ImageIndex> monobitmaps;
375     //map<string,ImageIndex> jpegs;
376     std::map<TVMediaInfo, ImageIndex> tvmedias;
377     std::list<ImageIndex> palettepics;
378
379
380
381     std::map<LoadIndex, int> loadindex_ref;
382     std::map<TVMediaInfo, LoadIndex> tvmedias_load;
383     std::map<LoadIndex, TVMediaInfo> tvmedias_load_inv;
384     std::map<LoadIndex, ImageIndex> tvmedias_loaded;
385
386
387
388     void incStyleRef(VectorHandle index);
389     virtual void destroyStyleRef(VectorHandle index) = 0;
390
391
392     std::map<DrawStyle, VectorHandle> styles;
393     std::map<VectorHandle, int> styles_ref;
394     std::map<DrawStyle, VectorHandle>::iterator styles_lastit;
395     bool styles_lastit_valid;
396     std::map<VectorHandle, int>::iterator styles_ref_lastit;
397     bool styles_ref_lastit_valid;
398
399     virtual VectorHandle createStyleRef(const DrawStyle& c) = 0;
400
401     void decrementAllRefCounts(std::vector<SVGCommand>& commands );
402     void incrementAllRefCounts(std::vector<SVGCommand>& commands );
403     void cleanupOrphanedRefs();
404
405
406
407     virtual void drawSetTrans(SurfaceInfo& sc) = 0;
408     virtual void executeDrawCommand(SVGCommand& command) = 0;
409
410
411     std::list<SurfaceInfo> surfaces;
412
413     std::mutex surfaces_mutex;
414
415     float byte_char_width[256];
416
417     void drawSurfaces();
418 };
419
420 #endif