1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
|
#ifndef __OSD_H__
#define __OSD_H__
#ifdef __OSD_C__
typedef struct osd_object_s osd_object_t;
typedef struct osd_renderer_s osd_renderer_t;
typedef struct osd_fontchar_s osd_fontchar_t;
typedef struct osd_font_s osd_font_t;
struct osd_object_s {
osd_object_t *next;
osd_renderer_t *renderer;
int width, height; /* work area dimentions */
uint8_t *area; /* work area */
int display_x,display_y; /* where to display it in screen */
/* clipping box inside work area */
int x1, y1;
int x2, y2;
uint32_t color[16]; /* color lookup table */
uint8_t trans[16]; /* mixer key table */
int32_t handle;
osd_font_t *font;
};
struct osd_renderer_s {
pthread_mutex_t osd_mutex;
video_overlay_instance_t *video_overlay;
video_overlay_event_t event;
osd_object_t *osds;
osd_font_t *fonts;
};
struct osd_fontchar_s {
uint16_t code;
uint16_t width;
uint16_t height;
uint8_t *bmp;
};
struct osd_font_s {
char name[40];
uint16_t version;
uint16_t num_fontchars;
osd_fontchar_t *fontchar;
osd_font_t *next;
};
#else
typedef void osd_object_t;
typedef void osd_renderer_t;
#endif
/*
initialize the osd rendering engine
*/
osd_renderer_t *osd_renderer_init( video_overlay_instance_t *video_overlay );
/* close osd rendering engine
loaded fonts are unloaded
osd objects are closed
*/
void osd_renderer_exit( osd_renderer_t *this );
/*
open a new osd object. this will allocated an empty (all zero) drawing
area where graphic primitives may be used.
It is ok to specify big width and height values. The render will keep
track of the smallest changed area to not generate too big overlays.
A default palette is initialized (i sugest keeping color 0 as transparent
for the sake of simplicity)
*/
osd_object_t *osd_open(osd_renderer_t *this, int width, int height);
/*
free osd object
*/
void osd_close(osd_object_t *osd_to_close);
/*
send the osd to be displayed at given pts (0=now)
the object is not changed. there may be subsequent drawing on it.
*/
int osd_show(osd_object_t *osd, uint32_t vpts );
/*
send event to hide osd at given pts (0=now)
the object is not changed. there may be subsequent drawing on it.
*/
int osd_hide(osd_object_t *osd, uint32_t vpts );
/*
Bresenham line implementation on osd object
*/
void osd_line(osd_object_t *osd,
int x1, int y1, int x2, int y2, int color );
/*
filled retangle
*/
void osd_filled_rect(osd_object_t *osd,
int x1, int y1, int x2, int y2, int color );
/*
set palette (color and transparency)
*/
void osd_set_palette(osd_object_t *osd, uint32_t *color, uint8_t *trans );
/*
get palette (color and transparency)
*/
void osd_get_palette(osd_object_t *osd, uint32_t *color, uint8_t *trans );
/*
set position were overlay will be blended
*/
void osd_set_position(osd_object_t *osd, int x, int y );
/*
load bitmap font into osd engine
*/
char * osd_renderer_load_font(osd_renderer_t *this, char *name);
/*
unload font
*/
int osd_renderer_unload_font(osd_renderer_t *this, char *name );
/*
set the font of osd object
*/
int osd_set_font( osd_object_t *osd, char *fontname );
/*
render text on x,y position (8 bits version)
no \n yet
*/
int osd_render_text( osd_object_t *osd, int x1, int y1, char *text );
/*
get width and height of how text will be renderized
*/
int osd_get_text_size( osd_object_t *osd, char *text, int *width, int *height );
#endif
|