2 Copyright 2004-2005 Chris Tallon, 2006,2011-2012 Marten Richter
4 This file is part of VOMP.
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.
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.
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/>.
32 #include "threadsystem.h"
38 #include "teletextdecodervbiebu.h"
69 typedef VectorHandle ImageIndex;
70 typedef unsigned long long LoadIndex;
79 reference = VECTOR_HANDLE_INIT;
82 inline static SVGCommand PaintPath(float ix, float iy, float iw, float ih, PathIndex path, VectorHandle ref)
90 nc.target.path_index = path;
95 inline static SVGCommand PaintImageLoading(LoadIndex load_in, float ix, float iy, float iw, float ih, VectorHandle ref, Corner corner = TopLeft)
98 nc.instr = DrawImageLoading;
103 nc.target.loadindex = load_in;
109 inline static SVGCommand PaintImage(float ix, float iy, float iw, float ih, ImageIndex image_in, VectorHandle ref, Corner corner = TopLeft)
112 nc.instr = DrawImage;
117 nc.target.image = image_in;
125 inline static SVGCommand PaintTTchar(float ix, float iy, float iw, float ih, unsigned int ttchar_in)
128 nc.instr = DrawTTchar;
134 nc.target.ttchar = ttchar_in;
138 inline static SVGCommand PaintClipping(float ix, float iy, float iw, float ih)
141 nc.instr = DrawClipping;
147 nc.target.ttchar = 0;
152 inline static void PaintGlyph(SVGCommand& nc, float ix, float iy, wchar_t char_in, VectorHandle ref)
154 nc.instr = DrawGlyph;
160 nc.target.textchar = char_in;
163 bool Test(float tx, float ty, float tw, float th)
165 return (x >= tx) && (y >= ty) && ((x + w) <= (tx + tw)) && ((y + h) <= (ty + th));
167 bool TTTest(float tox, float toy, float tx, float ty)
169 return (x == tox) && (toy == y) && (w == tx) && (h == ty);
171 bool Outside(float tx, float ty, float tw, float th)
173 return ((x + w) < tx) || ((y + h) < ty) || ((tx + tw) < x) || ((ty + th) < y);
176 VectorHandle getRef() { return reference; };
177 ImageIndex getImageIndex()
179 if (instr != DrawImage) return 0;
180 else return target.image;
182 LoadIndex getLoadIndex()
184 if (instr != DrawImageLoading) return 0;
185 else return target.loadindex;
188 SVGCommandInstr instr;
191 VectorHandle reference;
194 PathIndex path_index; //path_index
205 class VDR_ResponsePacket;
207 struct SurfaceCommands
209 const SurfaceVector* surf;
210 std::vector<SVGCommand> commands;
215 class OsdVector : public Osd
219 virtual ~OsdVector();
226 void screenShot(const char* fileName);
227 virtual bool screenShot(void* buffer, int width, int height, bool osd /*include osd*/) = 0;
229 Surface* createNewSurface();
232 virtual void updateBackgroundColor(DrawStyle /* bg */) {};
234 void updateOrAddSurface(const SurfaceVector* surf, float x, float y, float height, float width,
235 std::vector<SVGCommand>& commands);
236 void removeSurface(const SurfaceVector* surf);
238 virtual float getFontHeight() = 0;
239 virtual float getCharWidth(wchar_t c) = 0;
240 float* getCharWidthArray() {return byte_char_width;};
242 //virtual ImageIndex getJpegRef(const char* fileName, int *width,int *height);
243 virtual LoadIndex getTVMediaRef(TVMediaInfo& tvmedia, ImageIndex& image);
244 virtual ImageIndex getMonoBitmapRef(void* base, int width, int height);
245 virtual ImageIndex getImagePalette(int width, int height, const unsigned char* image_data, const unsigned int* palette_data);
248 virtual bool getStaticImageData(unsigned int static_id, UCHAR** userdata, ULONG* length) = 0;
250 void removeImageRef(const ImageIndex ref);
251 void removeLoadIndexRef(const LoadIndex ref);
252 VectorHandle getStyleRef(const DrawStyle& c);
253 virtual void removeStyleRef(VectorHandle ref);
254 virtual void getScreenSize(int& width, int& height) = 0;
255 virtual void getRealScreenSize(int& width, int& height) = 0;
257 // should be only called from control thread
258 void informPicture(LoadIndex index, ImageIndex i_index);
263 int charSet() {return 2;}; //UTF-8
266 class PictureDecoder;
285 PictureDecoder* decoder;
294 PictureDecoder(PictureReader* treader) {reader = treader;};
295 virtual ~PictureDecoder() {};
297 // its is always guaranted, that after getDecodedPicture a call to decodePicture follows, if the return value was true;
298 virtual unsigned char* decodePicture(LoadIndex index, unsigned char* buffer, unsigned int length, bool freemem = true) = 0;
300 virtual bool getDecodedPicture(struct PictureInfo& pict_inf) = 0;
301 virtual void freeReference(void* ref) = 0;
303 virtual void init() {};
304 virtual void shutdown() {};
307 PictureReader* reader;
310 class PictureReader: public Thread_TYPE
317 void addDecoder(PictureDecoder*);
318 void removeDecoder(PictureDecoder*);
323 bool processReceivedPictures();
325 // should be called from control thread
326 void receivePicture(VDR_ResponsePacket* vresp);
328 void addStaticImage(unsigned int id);
330 void invalidateLoadIndex(LoadIndex index);
332 void informFallback(LoadIndex index, int fallback);
341 std::mutex pict_lock_incoming; //locks
342 std::mutex decoders_lock;
343 std::queue<VDR_ResponsePacket*> pict_incoming;
344 std::queue<unsigned int> pict_incoming_static;
345 std::list<PictureDecoder*> decoders;
346 std::map<LoadIndex, int> inform_fallback;
347 std::set<LoadIndex> invalid_loadindex;
353 PictureReader* getPictReader() { return &reader;};
359 PictureReader reader;
361 void incImageRef(ImageIndex index);
362 int getImageRef(ImageIndex index);
363 virtual void destroyImageRef(ImageIndex index) = 0;
364 void incLoadIndexRef(LoadIndex index);
365 int getLoadIndexRef(LoadIndex index);
368 //virtual ImageIndex createJpeg(const char* fileName, int *width,int *height)=0;
369 virtual ImageIndex createMonoBitmap(void* base, int width, int height) = 0;
370 virtual ImageIndex createImagePalette(int width, int height, const unsigned char* image_data, const unsigned int* palette_data) = 0;
371 virtual void createPicture(struct PictureInfo& pict_inf) = 0;
373 virtual LoadIndex loadTVMedia(TVMediaInfo& tvmedia);
377 std::map<ImageIndex, int> images_ref;
378 std::map<void*, ImageIndex> monobitmaps;
379 //map<string,ImageIndex> jpegs;
380 std::map<TVMediaInfo, ImageIndex> tvmedias;
381 std::list<ImageIndex> palettepics;
385 std::map<LoadIndex, int> loadindex_ref;
386 std::map<TVMediaInfo, LoadIndex> tvmedias_load;
387 std::map<LoadIndex, TVMediaInfo> tvmedias_load_inv;
388 std::map<LoadIndex, ImageIndex> tvmedias_loaded;
392 void incStyleRef(VectorHandle index);
393 int getStyleRef(VectorHandle index);
394 virtual void destroyStyleRef(VectorHandle index) = 0;
397 std::map<DrawStyle, VectorHandle> styles;
398 std::map<VectorHandle, int> styles_ref;
399 std::map<DrawStyle, VectorHandle>::iterator styles_lastit;
400 bool styles_lastit_valid;
401 std::map<VectorHandle, int>::iterator styles_ref_lastit;
402 bool styles_ref_lastit_valid;
404 virtual VectorHandle createStyleRef(const DrawStyle& c) = 0;
406 void dereferenceSVGCommand(std::vector<SVGCommand>& commands );
407 void referenceSVGCommand(std::vector<SVGCommand>& commands );
408 void cleanupOrphanedRefs();
412 virtual void drawSetTrans(SurfaceCommands& sc) = 0;
413 virtual void executeDrawCommand(SVGCommand& command) = 0;
416 std::list<SurfaceCommands> scommands;
418 std::mutex surfaces_mutex;
420 float byte_char_width[256];