1 /*
2  * Copyright (C) 2000-2020 the xine project
3  *
4  * This file is part of xine, a free video player.
5  *
6  * xine 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  * xine 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 this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19  *
20  * OSD stuff (text and graphic primitives)
21  */
22 
23 #ifndef HAVE_OSD_H
24 #define HAVE_OSD_H
25 
26 #ifdef HAVE_ICONV
27 #  include <iconv.h>
28 #endif
29 
30 #include <xine/video_overlay.h>
31 
32 typedef struct osd_object_s osd_object_t;
33 typedef struct osd_renderer_s osd_renderer_t;
34 typedef struct osd_font_s osd_font_t;
35 typedef struct osd_ft2context_s osd_ft2context_t;
36 
37 struct osd_object_s {
38   osd_object_t *next;
39   osd_renderer_t *renderer;
40 
41   int width, height;    /* work area dimentions */
42   uint8_t *area;        /* work area */
43   int area_touched;     /* work area was used for painting */
44   int display_x,display_y;  /* where to display it in screen */
45 
46   /* video output area within osd extent */
47   int video_window_x, video_window_y;
48   int video_window_width, video_window_height;
49 
50   /* extent of reference coordinate system */
51   int extent_width, extent_height;
52 
53   /* clipping box inside work area */
54   int x1, y1;
55   int x2, y2;
56 
57   uint32_t color[OVL_PALETTE_SIZE];	/* color lookup table  */
58   uint8_t trans[OVL_PALETTE_SIZE];	/* mixer key table */
59 
60 #ifdef HAVE_ICONV
61   iconv_t cd;                           /* iconv handle of encoding */
62   char *encoding;                       /* name of encoding */
63 #endif
64 
65   osd_font_t *font;
66   osd_ft2context_t *ft2;
67 
68 
69   /* this holds an optional ARGB overlay, which
70    * is only be used by supported video_out modules.
71    * right now this is only vdpau */
72   argb_layer_t *argb_layer;
73 
74   int32_t handle;
75 };
76 
77 /* this one is public */
78 struct xine_osd_s {
79   osd_object_t osd;
80 };
81 
82 struct osd_renderer_s {
83 
84   xine_stream_t              *stream;
85 
86   /*
87    * open a new osd object. this will allocated an empty (all zero) drawing
88    * area where graphic primitives may be used.
89    * It is ok to specify big width and height values. The render will keep
90    * track of the smallest changed area to not generate too big overlays.
91    * A default palette is initialized (i sugest keeping color 0 as transparent
92    * for the sake of simplicity)
93    */
94   osd_object_t* (*new_object) (osd_renderer_t *this_gen, int width, int height);
95 
96   /*
97    * free osd object
98    */
99   void (*free_object) (osd_object_t *osd_to_close);
100 
101 
102   /*
103    * send the osd to be displayed at given pts (0=now)
104    * the object is not changed. there may be subsequent drawing  on it.
105    */
106   int (*show) (osd_object_t *osd, int64_t vpts );
107 
108   /*
109    * send event to hide osd at given pts (0=now)
110    * the object is not changed. there may be subsequent drawing  on it.
111    */
112   int (*hide) (osd_object_t *osd, int64_t vpts );
113 
114   /*
115    * draw point.
116    */
117   void (*point) (osd_object_t *osd, int x, int y, int color);
118 
119        /*
120    * Bresenham line implementation on osd object
121    */
122   void (*line) (osd_object_t *osd,
123 		int x1, int y1, int x2, int y2, int color );
124 
125   /*
126    * filled rectangle
127    */
128   void (*filled_rect) (osd_object_t *osd,
129 		       int x1, int y1, int x2, int y2, int color );
130 
131   /*
132    * set palette (color and transparency)
133    *
134    * NOTE: both color and trans arrays must hold OVL_PALETTE_SIZE entries !
135    */
136   void (*set_palette) (osd_object_t *osd, const uint32_t *color, const uint8_t *trans );
137 
138   /*
139    * set on existing text palette
140    * (-1 to set used specified palette)
141    *
142    * color_base specifies the first color index to use for this text
143    * palette. The OSD palette is then modified starting at this
144    * color index, up to the size of the text palette.
145    *
146    * Use OSD_TEXT1, OSD_TEXT2, ... for some preasssigned color indices.
147    */
148   void (*set_text_palette) (osd_object_t *osd, int palette_number,
149 			    int color_base );
150 
151   /*
152    * get palette (color and transparency)
153    */
154   void (*get_palette) (osd_object_t *osd, uint32_t *color,
155 		       uint8_t *trans);
156 
157   /*
158    * set position were overlay will be blended
159    */
160   void (*set_position) (osd_object_t *osd, int x, int y);
161 
162   /*
163    * set the font of osd object
164    */
165 
166   int (*set_font) (osd_object_t *osd, const char *fontname, int size);
167 
168   /*
169    * set encoding of text
170    *
171    * NULL ... no conversion (iso-8859-1)
172    * ""   ... locale encoding
173    */
174   int (*set_encoding) (osd_object_t *osd, const char *encoding);
175 
176   /*
177    * render text in current encoding on x,y position
178    * no \n yet
179    *
180    * The text is assigned the colors starting at the index specified by
181    * color_base up to the size of the text palette.
182    *
183    * Use OSD_TEXT1, OSD_TEXT2, ... for some preasssigned color indices.
184    */
185   int (*render_text) (osd_object_t *osd, int x1, int y1,
186 		      const char *text, int color_base);
187 
188   /*
189    * get width and height of how text will be renderized
190    */
191   int (*get_text_size) (osd_object_t *osd, const char *text,
192 			int *width, int *height);
193 
194   /*
195    * close osd rendering engine
196    * loaded fonts are unloaded
197    * osd objects are closed
198    */
199   void (*close) (osd_renderer_t *this_gen);
200 
201   /*
202    * clear an osd object (empty drawing area)
203    */
204   void (*clear) (osd_object_t *osd );
205 
206   /*
207    * paste a bitmap with optional palette mapping
208    */
209   void (*draw_bitmap) (osd_object_t *osd, const uint8_t *bitmap,
210 		       int x1, int y1, int width, int height,
211                        const uint8_t *palette_map);
212 
213   /*
214    * send the osd to be displayed (unscaled) at given pts (0=now)
215    * the object is not changed. there may be subsequent drawing  on it.
216    * overlay is blended at output (screen) resolution.
217    */
218   int (*show_unscaled) (osd_object_t *osd, int64_t vpts );
219 
220   /*
221    * see xine.h for defined XINE_OSD_CAP_ values.
222    */
223   uint32_t (*get_capabilities) (osd_object_t *osd);
224 
225   /*
226    * define extent of reference coordinate system for video
227    * resolution independent osds. both sizes must be > 0 to
228    * take effect. otherwise, video resolution will be used.
229    */
230   void (*set_extent) (osd_object_t *osd, int extent_width, int extent_height);
231 
232   /*
233    * set an argb buffer to be blended into video
234    * the buffer must exactly match the osd dimensions
235    * and stay valid while the osd is on screen. pass
236    * a NULL pointer to safely remove the buffer from
237    * the osd layer. only the dirty area  will be
238    * updated on screen. for convinience the whole
239    * osd object will be considered dirty when setting
240    * a different buffer pointer.
241    * see also XINE_OSD_CAP_ARGB_LAYER
242    */
243   void (*set_argb_buffer) (osd_object_t *osd, uint32_t *argb_buffer,
244                            int dirty_x, int dirty_y, int dirty_width, int dirty_height);
245 
246   /*
247    * osd video window defines an area withing osd extent where the
248    * video shall be scaled to while an osd is displayed on screen.
249    * both width and height must be > 0 to take effect.
250    */
251   void (*set_video_window) (osd_object_t *osd,
252                             int window_x, int window_y, int window_width, int window_height);
253 
254   /* private stuff */
255 
256   pthread_mutex_t             osd_mutex;
257   video_overlay_event_t       event;
258   osd_object_t               *osds;          /* instances of osd */
259   osd_font_t                 *fonts;         /* loaded fonts */
260   int                        textpalette;    /* default textpalette */
261 
262 };
263 
264 /*
265  *   initialize the osd rendering engine
266  */
267 osd_renderer_t *_x_osd_renderer_init( xine_stream_t *stream );
268 
269 
270 /*
271  * The size of a text palette
272  */
273 
274 #define TEXT_PALETTE_SIZE 11
275 
276 /*
277  * Preassigned color indices for rendering text
278  * (more can be added, not exceeding OVL_PALETTE_SIZE)
279  */
280 
281 #define OSD_TEXT1 (0 * TEXT_PALETTE_SIZE)
282 #define OSD_TEXT2 (1 * TEXT_PALETTE_SIZE)
283 #define OSD_TEXT3 (2 * TEXT_PALETTE_SIZE)
284 #define OSD_TEXT4 (3 * TEXT_PALETTE_SIZE)
285 #define OSD_TEXT5 (4 * TEXT_PALETTE_SIZE)
286 #define OSD_TEXT6 (5 * TEXT_PALETTE_SIZE)
287 #define OSD_TEXT7 (6 * TEXT_PALETTE_SIZE)
288 #define OSD_TEXT8 (7 * TEXT_PALETTE_SIZE)
289 #define OSD_TEXT9 (8 * TEXT_PALETTE_SIZE)
290 #define OSD_TEXT10 (9 * TEXT_PALETTE_SIZE)
291 
292 /*
293  * Defined palettes for rendering osd text
294  * (more can be added later)
295  */
296 
297 #define NUMBER_OF_TEXT_PALETTES 4
298 #define TEXTPALETTE_WHITE_BLACK_TRANSPARENT    0
299 #define TEXTPALETTE_WHITE_NONE_TRANSPARENT     1
300 #define TEXTPALETTE_WHITE_NONE_TRANSLUCID      2
301 #define TEXTPALETTE_YELLOW_BLACK_TRANSPARENT   3
302 
303 #endif
304 
305