annotate libvo/sub.c @ 25317:7f3cb5408f28

Fixed VIDIX color bug that was introduced when Radeon VIDIX driver was synchronized with vidix.sf.net. The red color was saturating. Corrected value fixes the issue and restore the color to the level it used to have before synchronization. Meaning of the value remains unknow but was retrieved from register's value of a Radeon 9000 card, so it may need further testing. Patch by Guillaume Lecerf (foxcore at gmail dot com)
author ben
date Mon, 10 Dec 2007 19:27:46 +0000
parents 85f669a84e7a
children 9ebd00825df2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5503
a531a579f005 #include cleanup
arpi
parents: 5294
diff changeset
1
a531a579f005 #include cleanup
arpi
parents: 5294
diff changeset
2 #include <stdio.h>
a531a579f005 #include cleanup
arpi
parents: 5294
diff changeset
3 #include <stdlib.h>
7003
60a473935d7d warning fixes by Sylvain Petreolle <spetreolle@yahoo.fr>
arpi
parents: 6190
diff changeset
4 #include <string.h>
218
fbfc2077ba72 sub/osd interface changes
arpi_esp
parents: 213
diff changeset
5
4088
4435dc3b8bef Add DVD subtitles to menoder
kmkaplan
parents: 4087
diff changeset
6 #include "config.h"
8123
9fc45fe0d444 *HUGE* set of compiler warning fixes, unused variables removal
arpi
parents: 7628
diff changeset
7 #ifdef HAVE_MALLOC_H
9fc45fe0d444 *HUGE* set of compiler warning fixes, unused variables removal
arpi
parents: 7628
diff changeset
8 #include <malloc.h>
9fc45fe0d444 *HUGE* set of compiler warning fixes, unused variables removal
arpi
parents: 7628
diff changeset
9 #endif
9fc45fe0d444 *HUGE* set of compiler warning fixes, unused variables removal
arpi
parents: 7628
diff changeset
10
21193
a067e7e18b50 support for dvdnav menu buttons overlay as simple alpha boxes (rework from Otvos Attila's series of patches)
ben
parents: 19366
diff changeset
11 #ifdef USE_DVDNAV
21200
c7b5dd2b2291 better nav highlight handling
ben
parents: 21193
diff changeset
12 #include "stream/stream.h"
c7b5dd2b2291 better nav highlight handling
ben
parents: 21193
diff changeset
13 #include "stream/stream_dvdnav.h"
21193
a067e7e18b50 support for dvdnav menu buttons overlay as simple alpha boxes (rework from Otvos Attila's series of patches)
ben
parents: 19366
diff changeset
14 #define OSD_NAV_BOX_ALPHA 0x7f
a067e7e18b50 support for dvdnav menu buttons overlay as simple alpha boxes (rework from Otvos Attila's series of patches)
ben
parents: 19366
diff changeset
15 #endif
a067e7e18b50 support for dvdnav menu buttons overlay as simple alpha boxes (rework from Otvos Attila's series of patches)
ben
parents: 19366
diff changeset
16
23903
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
17 #ifdef HAVE_TV_TELETEXT
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
18 #include "stream/tv.h"
24378
9cea788cf2b3 warning fix:
diego
parents: 24344
diff changeset
19 #include "osdep/timer.h"
23903
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
20 #endif
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
21
23338
2a66d95355f0 add new -subfont option, that allows having a different font for OSD (controls and menu) and subtitles
ben
parents: 21582
diff changeset
22 #include "mplayer.h"
5638
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
23 #include "mp_msg.h"
16923
a6a03ff1ddef Added translatable messages for OSD localization to help/help_mp-en.h
ptt
parents: 16839
diff changeset
24 #include "help_mp.h"
4088
4435dc3b8bef Add DVD subtitles to menoder
kmkaplan
parents: 4087
diff changeset
25 #include "video_out.h"
5294
4e64fca268e9 moved font_laod.h
arpi
parents: 4807
diff changeset
26 #include "font_load.h"
218
fbfc2077ba72 sub/osd interface changes
arpi_esp
parents: 213
diff changeset
27 #include "sub.h"
13787
e047e70a9767 Handle "xxx.h" vs "../xxx.h" include paths in a consistent way.
diego
parents: 13343
diff changeset
28 #include "spudec.h"
19366
614f445786af Reuse UTF-8 reading code in libavutil
reimar
parents: 18950
diff changeset
29 #include "libavutil/common.h"
202
6ad0715dfac8 grey+alpha rendering support (for .sub)
arpi_esp
parents:
diff changeset
30
10916
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
31 #define NEW_SPLITTING
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
32
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
33
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
34 // Structures needed for the new splitting algorithm.
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
35 // osd_text_t contains the single subtitle word.
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
36 // osd_text_p is used to mark the lines of subtitles
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
37 struct osd_text_t {
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
38 int osd_kerning, //kerning with the previous word
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
39 osd_length, //orizontal length inside the bbox
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
40 text_length, //number of characters
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
41 *text; //characters
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
42 struct osd_text_t *prev,
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
43 *next;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
44 };
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
45
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
46 struct osd_text_p {
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
47 int value;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
48 struct osd_text_t *ott;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
49 struct osd_text_p *prev,
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
50 *next;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
51 };
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
52 //^
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
53
24046
7e2808fb1807 Identifiers should not start with two underscores.
diego
parents: 23903
diff changeset
54 char * sub_osd_names[]={
16923
a6a03ff1ddef Added translatable messages for OSD localization to help/help_mp-en.h
ptt
parents: 16839
diff changeset
55 MSGTR_VO_SUB_Seekbar,
a6a03ff1ddef Added translatable messages for OSD localization to help/help_mp-en.h
ptt
parents: 16839
diff changeset
56 MSGTR_VO_SUB_Play,
a6a03ff1ddef Added translatable messages for OSD localization to help/help_mp-en.h
ptt
parents: 16839
diff changeset
57 MSGTR_VO_SUB_Pause,
a6a03ff1ddef Added translatable messages for OSD localization to help/help_mp-en.h
ptt
parents: 16839
diff changeset
58 MSGTR_VO_SUB_Stop,
a6a03ff1ddef Added translatable messages for OSD localization to help/help_mp-en.h
ptt
parents: 16839
diff changeset
59 MSGTR_VO_SUB_Rewind,
a6a03ff1ddef Added translatable messages for OSD localization to help/help_mp-en.h
ptt
parents: 16839
diff changeset
60 MSGTR_VO_SUB_Forward,
a6a03ff1ddef Added translatable messages for OSD localization to help/help_mp-en.h
ptt
parents: 16839
diff changeset
61 MSGTR_VO_SUB_Clock,
a6a03ff1ddef Added translatable messages for OSD localization to help/help_mp-en.h
ptt
parents: 16839
diff changeset
62 MSGTR_VO_SUB_Contrast,
a6a03ff1ddef Added translatable messages for OSD localization to help/help_mp-en.h
ptt
parents: 16839
diff changeset
63 MSGTR_VO_SUB_Saturation,
a6a03ff1ddef Added translatable messages for OSD localization to help/help_mp-en.h
ptt
parents: 16839
diff changeset
64 MSGTR_VO_SUB_Volume,
a6a03ff1ddef Added translatable messages for OSD localization to help/help_mp-en.h
ptt
parents: 16839
diff changeset
65 MSGTR_VO_SUB_Brightness,
23568
519e42b716aa The audio balance feature implemented with af_pan.
zuxy
parents: 23510
diff changeset
66 MSGTR_VO_SUB_Hue,
519e42b716aa The audio balance feature implemented with af_pan.
zuxy
parents: 23510
diff changeset
67 MSGTR_VO_SUB_Balance
2498
38bb41c48d1f never declare variables in *.h files, pls
nick
parents: 2205
diff changeset
68 };
24046
7e2808fb1807 Identifiers should not start with two underscores.
diego
parents: 23903
diff changeset
69 char * sub_osd_names_short[] ={ "", "|>", "||", "[]", "<<" , ">>", "", "", "", "", "", "", "" };
2498
38bb41c48d1f never declare variables in *.h files, pls
nick
parents: 2205
diff changeset
70
213
6ec8f6ab6cb1 subtitle+OSD font support
arpi_esp
parents: 202
diff changeset
71 //static int vo_font_loaded=-1;
6ec8f6ab6cb1 subtitle+OSD font support
arpi_esp
parents: 202
diff changeset
72 font_desc_t* vo_font=NULL;
23338
2a66d95355f0 add new -subfont option, that allows having a different font for OSD (controls and menu) and subtitles
ben
parents: 21582
diff changeset
73 font_desc_t* sub_font=NULL;
202
6ad0715dfac8 grey+alpha rendering support (for .sub)
arpi_esp
parents:
diff changeset
74
1991
dee4b2ea5e5b add gui support to config scripts, and fixed some warning.
pontscho
parents: 1878
diff changeset
75 unsigned char* vo_osd_text=NULL;
23903
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
76 #ifdef HAVE_TV_TELETEXT
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
77 void* vo_osd_teletext_page=NULL;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
78 int vo_osd_teletext_half = 0;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
79 int vo_osd_teletext_mode=0;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
80 int vo_osd_teletext_format=0;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
81 int vo_osd_teletext_scale=0;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
82 #endif
803
b25a887b6054 sub splitting patch applied by Vlada V.Dubsky@sh.cvut.cz
arpi_esp
parents: 726
diff changeset
83 int sub_unicode=0;
1501
d40f2b686846 changes according to -utf8 option, draw_osd() function added
atlka
parents: 1109
diff changeset
84 int sub_utf8=0;
4773
976bf6a9ded5 subtitle positioning patch by Jiri Svoboda
atmos4
parents: 4088
diff changeset
85 int sub_pos=100;
8583
4c18c4e7f34e -subwidth
arpi
parents: 8578
diff changeset
86 int sub_width_p=100;
16839
1b1b59b160ab make bottom alignment the default since it's the only sane mode when sub_pos is near bottom (default)
rfelker
parents: 16838
diff changeset
87 int sub_alignment=2; /* 0=top, 1=center, 2=bottom */
7628
d6608342591d This patch adds the functionality to disable/enable subtitles while playing
arpi
parents: 7121
diff changeset
88 int sub_visibility=1;
8617
6ffbe7608013 Me: -sub-bg-* would be nicer. "Background" is usually shortened as "bg", not "bkg".
rathann
parents: 8601
diff changeset
89 int sub_bg_color=0; /* subtitles background color */
6ffbe7608013 Me: -sub-bg-* would be nicer. "Background" is usually shortened as "bg", not "bkg".
rathann
parents: 8601
diff changeset
90 int sub_bg_alpha=0;
10263
0df8816f4665 TiVo demuxer and sub-cc/osd decoder
arpi
parents: 9036
diff changeset
91 int sub_justify=0;
21219
8258747951d7 keep nav highlight event in dvdnav priv structure
ben
parents: 21200
diff changeset
92 #ifdef USE_DVDNAV
8258747951d7 keep nav highlight event in dvdnav priv structure
ben
parents: 21200
diff changeset
93 static nav_highlight_t nav_hl;
8258747951d7 keep nav highlight event in dvdnav priv structure
ben
parents: 21200
diff changeset
94 #endif
213
6ec8f6ab6cb1 subtitle+OSD font support
arpi_esp
parents: 202
diff changeset
95
5664
ee6c9530729f bbox calculation fixed (font->height < real height)
arpi
parents: 5645
diff changeset
96 // return the real height of a char:
ee6c9530729f bbox calculation fixed (font->height < real height)
arpi
parents: 5645
diff changeset
97 static inline int get_height(int c,int h){
ee6c9530729f bbox calculation fixed (font->height < real height)
arpi
parents: 5645
diff changeset
98 int font;
ee6c9530729f bbox calculation fixed (font->height < real height)
arpi
parents: 5645
diff changeset
99 if ((font=vo_font->font[c])>=0)
ee6c9530729f bbox calculation fixed (font->height < real height)
arpi
parents: 5645
diff changeset
100 if(h<vo_font->pic_a[font]->h) h=vo_font->pic_a[font]->h;
ee6c9530729f bbox calculation fixed (font->height < real height)
arpi
parents: 5645
diff changeset
101 return h;
ee6c9530729f bbox calculation fixed (font->height < real height)
arpi
parents: 5645
diff changeset
102 }
ee6c9530729f bbox calculation fixed (font->height < real height)
arpi
parents: 5645
diff changeset
103
7121
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
104 // renders char to a big per-object buffer where alpha and bitmap are separated
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
105 static void draw_alpha_buf(mp_osd_obj_t* obj, int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride)
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
106 {
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
107 int dststride = obj->stride;
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
108 int dstskip = obj->stride-w;
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
109 int srcskip = stride-w;
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
110 int i, j;
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
111 unsigned char *b = obj->bitmap_buffer + (y0-obj->bbox.y1)*dststride + (x0-obj->bbox.x1);
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
112 unsigned char *a = obj->alpha_buffer + (y0-obj->bbox.y1)*dststride + (x0-obj->bbox.x1);
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
113 unsigned char *bs = src;
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
114 unsigned char *as = srca;
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
115
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
116 if (x0 < obj->bbox.x1 || x0+w > obj->bbox.x2 || y0 < obj->bbox.y1 || y0+h > obj->bbox.y2) {
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
117 fprintf(stderr, "osd text out of range: bbox [%d %d %d %d], txt [%d %d %d %d]\n",
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
118 obj->bbox.x1, obj->bbox.x2, obj->bbox.y1, obj->bbox.y2,
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
119 x0, x0+w, y0, y0+h);
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
120 return;
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
121 }
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
122
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
123 for (i = 0; i < h; i++) {
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
124 for (j = 0; j < w; j++, b++, a++, bs++, as++) {
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
125 if (*b < *bs) *b = *bs;
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
126 if (*as) {
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
127 if (*a == 0 || *a > *as) *a = *as;
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
128 }
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
129 }
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
130 b+= dstskip;
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
131 a+= dstskip;
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
132 bs+= srcskip;
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
133 as+= srcskip;
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
134 }
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
135 }
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
136
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
137 // allocates/enlarges the alpha/bitmap buffer
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
138 static void alloc_buf(mp_osd_obj_t* obj)
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
139 {
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
140 int len;
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
141 if (obj->bbox.x2 < obj->bbox.x1) obj->bbox.x2 = obj->bbox.x1;
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
142 if (obj->bbox.y2 < obj->bbox.y1) obj->bbox.y2 = obj->bbox.y1;
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
143 obj->stride = ((obj->bbox.x2-obj->bbox.x1)+7)&(~7);
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
144 len = obj->stride*(obj->bbox.y2-obj->bbox.y1);
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
145 if (obj->allocated<len) {
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
146 obj->allocated = len;
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
147 free(obj->bitmap_buffer);
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
148 free(obj->alpha_buffer);
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
149 obj->bitmap_buffer = (unsigned char *)memalign(16, len);
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
150 obj->alpha_buffer = (unsigned char *)memalign(16, len);
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
151 }
8617
6ffbe7608013 Me: -sub-bg-* would be nicer. "Background" is usually shortened as "bg", not "bkg".
rathann
parents: 8601
diff changeset
152 memset(obj->bitmap_buffer, sub_bg_color, len);
6ffbe7608013 Me: -sub-bg-* would be nicer. "Background" is usually shortened as "bg", not "bkg".
rathann
parents: 8601
diff changeset
153 memset(obj->alpha_buffer, sub_bg_alpha, len);
7121
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
154 }
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
155
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
156 // renders the buffer
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
157 inline static void vo_draw_text_from_buffer(mp_osd_obj_t* obj,void (*draw_alpha)(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride)){
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
158 if (obj->allocated > 0) {
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
159 draw_alpha(obj->bbox.x1,obj->bbox.y1,
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
160 obj->bbox.x2-obj->bbox.x1,
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
161 obj->bbox.y2-obj->bbox.y1,
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
162 obj->bitmap_buffer,
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
163 obj->alpha_buffer,
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
164 obj->stride);
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
165 }
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
166 }
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
167
21582
239f2c145b2f Mark utf8_get_char parameter as const and fix a compiler warning
reimar
parents: 21581
diff changeset
168 unsigned utf8_get_char(const char **str) {
239f2c145b2f Mark utf8_get_char parameter as const and fix a compiler warning
reimar
parents: 21581
diff changeset
169 const uint8_t *strp = (const uint8_t *)*str;
19366
614f445786af Reuse UTF-8 reading code in libavutil
reimar
parents: 18950
diff changeset
170 unsigned c;
614f445786af Reuse UTF-8 reading code in libavutil
reimar
parents: 18950
diff changeset
171 GET_UTF8(c, *strp++, goto no_utf8;);
21582
239f2c145b2f Mark utf8_get_char parameter as const and fix a compiler warning
reimar
parents: 21581
diff changeset
172 *str = (const char *)strp;
18717
0f99a5fe9c7f Support UTF8 in OSD text
reimar
parents: 18716
diff changeset
173 return c;
0f99a5fe9c7f Support UTF8 in OSD text
reimar
parents: 18716
diff changeset
174
0f99a5fe9c7f Support UTF8 in OSD text
reimar
parents: 18716
diff changeset
175 no_utf8:
21582
239f2c145b2f Mark utf8_get_char parameter as const and fix a compiler warning
reimar
parents: 21581
diff changeset
176 strp = (const uint8_t *)*str;
18717
0f99a5fe9c7f Support UTF8 in OSD text
reimar
parents: 18716
diff changeset
177 c = *strp++;
21582
239f2c145b2f Mark utf8_get_char parameter as const and fix a compiler warning
reimar
parents: 21581
diff changeset
178 *str = (const char *)strp;
18717
0f99a5fe9c7f Support UTF8 in OSD text
reimar
parents: 18716
diff changeset
179 return c;
0f99a5fe9c7f Support UTF8 in OSD text
reimar
parents: 18716
diff changeset
180 }
0f99a5fe9c7f Support UTF8 in OSD text
reimar
parents: 18716
diff changeset
181
5640
a0cee3bb7f78 osd: calculating bbox
arpi
parents: 5638
diff changeset
182 inline static void vo_update_text_osd(mp_osd_obj_t* obj,int dxs,int dys){
21582
239f2c145b2f Mark utf8_get_char parameter as const and fix a compiler warning
reimar
parents: 21581
diff changeset
183 const char *cp=vo_osd_text;
5640
a0cee3bb7f78 osd: calculating bbox
arpi
parents: 5638
diff changeset
184 int x=20;
5664
ee6c9530729f bbox calculation fixed (font->height < real height)
arpi
parents: 5645
diff changeset
185 int h=0;
7121
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
186 int font;
5640
a0cee3bb7f78 osd: calculating bbox
arpi
parents: 5638
diff changeset
187
a0cee3bb7f78 osd: calculating bbox
arpi
parents: 5638
diff changeset
188 obj->bbox.x1=obj->x=x;
a0cee3bb7f78 osd: calculating bbox
arpi
parents: 5638
diff changeset
189 obj->bbox.y1=obj->y=10;
202
6ad0715dfac8 grey+alpha rendering support (for .sub)
arpi_esp
parents:
diff changeset
190
1501
d40f2b686846 changes according to -utf8 option, draw_osd() function added
atlka
parents: 1109
diff changeset
191 while (*cp){
18717
0f99a5fe9c7f Support UTF8 in OSD text
reimar
parents: 18716
diff changeset
192 uint16_t c=utf8_get_char(&cp);
7121
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
193 render_one_glyph(vo_font, c);
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
194 x+=vo_font->width[c]+vo_font->charspace;
5664
ee6c9530729f bbox calculation fixed (font->height < real height)
arpi
parents: 5645
diff changeset
195 h=get_height(c,h);
5640
a0cee3bb7f78 osd: calculating bbox
arpi
parents: 5638
diff changeset
196 }
a0cee3bb7f78 osd: calculating bbox
arpi
parents: 5638
diff changeset
197
5664
ee6c9530729f bbox calculation fixed (font->height < real height)
arpi
parents: 5645
diff changeset
198 obj->bbox.x2=x-vo_font->charspace;
ee6c9530729f bbox calculation fixed (font->height < real height)
arpi
parents: 5645
diff changeset
199 obj->bbox.y2=obj->bbox.y1+h;
5640
a0cee3bb7f78 osd: calculating bbox
arpi
parents: 5638
diff changeset
200 obj->flags|=OSDFLAG_BBOX;
a0cee3bb7f78 osd: calculating bbox
arpi
parents: 5638
diff changeset
201
7121
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
202 alloc_buf(obj);
5640
a0cee3bb7f78 osd: calculating bbox
arpi
parents: 5638
diff changeset
203
7121
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
204 cp=vo_osd_text;
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
205 x = obj->x;
5640
a0cee3bb7f78 osd: calculating bbox
arpi
parents: 5638
diff changeset
206 while (*cp){
18717
0f99a5fe9c7f Support UTF8 in OSD text
reimar
parents: 18716
diff changeset
207 uint16_t c=utf8_get_char(&cp);
1501
d40f2b686846 changes according to -utf8 option, draw_osd() function added
atlka
parents: 1109
diff changeset
208 if ((font=vo_font->font[c])>=0)
7121
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
209 draw_alpha_buf(obj,x,obj->y,
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
210 vo_font->width[c],
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
211 vo_font->pic_a[font]->h,
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
212 vo_font->pic_b[font]->bmp+vo_font->start[c],
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
213 vo_font->pic_a[font]->bmp+vo_font->start[c],
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
214 vo_font->pic_a[font]->w);
213
6ec8f6ab6cb1 subtitle+OSD font support
arpi_esp
parents: 202
diff changeset
215 x+=vo_font->width[c]+vo_font->charspace;
6ec8f6ab6cb1 subtitle+OSD font support
arpi_esp
parents: 202
diff changeset
216 }
218
fbfc2077ba72 sub/osd interface changes
arpi_esp
parents: 213
diff changeset
217 }
fbfc2077ba72 sub/osd interface changes
arpi_esp
parents: 213
diff changeset
218
21193
a067e7e18b50 support for dvdnav menu buttons overlay as simple alpha boxes (rework from Otvos Attila's series of patches)
ben
parents: 19366
diff changeset
219 #ifdef USE_DVDNAV
21219
8258747951d7 keep nav highlight event in dvdnav priv structure
ben
parents: 21200
diff changeset
220 void osd_set_nav_box (uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey) {
8258747951d7 keep nav highlight event in dvdnav priv structure
ben
parents: 21200
diff changeset
221 nav_hl.sx = sx;
8258747951d7 keep nav highlight event in dvdnav priv structure
ben
parents: 21200
diff changeset
222 nav_hl.sy = sy;
8258747951d7 keep nav highlight event in dvdnav priv structure
ben
parents: 21200
diff changeset
223 nav_hl.ex = ex;
8258747951d7 keep nav highlight event in dvdnav priv structure
ben
parents: 21200
diff changeset
224 nav_hl.ey = ey;
8258747951d7 keep nav highlight event in dvdnav priv structure
ben
parents: 21200
diff changeset
225 }
8258747951d7 keep nav highlight event in dvdnav priv structure
ben
parents: 21200
diff changeset
226
21193
a067e7e18b50 support for dvdnav menu buttons overlay as simple alpha boxes (rework from Otvos Attila's series of patches)
ben
parents: 19366
diff changeset
227 inline static void vo_update_nav (mp_osd_obj_t *obj, int dxs, int dys) {
a067e7e18b50 support for dvdnav menu buttons overlay as simple alpha boxes (rework from Otvos Attila's series of patches)
ben
parents: 19366
diff changeset
228 int len;
a067e7e18b50 support for dvdnav menu buttons overlay as simple alpha boxes (rework from Otvos Attila's series of patches)
ben
parents: 19366
diff changeset
229
21219
8258747951d7 keep nav highlight event in dvdnav priv structure
ben
parents: 21200
diff changeset
230 obj->bbox.x1 = obj->x = nav_hl.sx;
8258747951d7 keep nav highlight event in dvdnav priv structure
ben
parents: 21200
diff changeset
231 obj->bbox.y1 = obj->y = nav_hl.sy;
8258747951d7 keep nav highlight event in dvdnav priv structure
ben
parents: 21200
diff changeset
232 obj->bbox.x2 = nav_hl.ex;
8258747951d7 keep nav highlight event in dvdnav priv structure
ben
parents: 21200
diff changeset
233 obj->bbox.y2 = nav_hl.ey;
21193
a067e7e18b50 support for dvdnav menu buttons overlay as simple alpha boxes (rework from Otvos Attila's series of patches)
ben
parents: 19366
diff changeset
234
a067e7e18b50 support for dvdnav menu buttons overlay as simple alpha boxes (rework from Otvos Attila's series of patches)
ben
parents: 19366
diff changeset
235 alloc_buf (obj);
a067e7e18b50 support for dvdnav menu buttons overlay as simple alpha boxes (rework from Otvos Attila's series of patches)
ben
parents: 19366
diff changeset
236 len = obj->stride * (obj->bbox.y2 - obj->bbox.y1);
a067e7e18b50 support for dvdnav menu buttons overlay as simple alpha boxes (rework from Otvos Attila's series of patches)
ben
parents: 19366
diff changeset
237 memset (obj->bitmap_buffer, OSD_NAV_BOX_ALPHA, len);
a067e7e18b50 support for dvdnav menu buttons overlay as simple alpha boxes (rework from Otvos Attila's series of patches)
ben
parents: 19366
diff changeset
238 memset (obj->alpha_buffer, OSD_NAV_BOX_ALPHA, len);
21364
d81ffbf9615f EMISSINGBRAIN: No, OSD objects of size 0 sure are _not_ visible.
reimar
parents: 21219
diff changeset
239 obj->flags |= OSDFLAG_BBOX | OSDFLAG_CHANGED;
d81ffbf9615f EMISSINGBRAIN: No, OSD objects of size 0 sure are _not_ visible.
reimar
parents: 21219
diff changeset
240 if (obj->bbox.y2 > obj->bbox.y1 && obj->bbox.x2 > obj->bbox.x1)
d81ffbf9615f EMISSINGBRAIN: No, OSD objects of size 0 sure are _not_ visible.
reimar
parents: 21219
diff changeset
241 obj->flags |= OSDFLAG_VISIBLE;
21193
a067e7e18b50 support for dvdnav menu buttons overlay as simple alpha boxes (rework from Otvos Attila's series of patches)
ben
parents: 19366
diff changeset
242 }
a067e7e18b50 support for dvdnav menu buttons overlay as simple alpha boxes (rework from Otvos Attila's series of patches)
ben
parents: 19366
diff changeset
243 #endif
a067e7e18b50 support for dvdnav menu buttons overlay as simple alpha boxes (rework from Otvos Attila's series of patches)
ben
parents: 19366
diff changeset
244
23903
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
245 #ifdef HAVE_TV_TELETEXT
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
246 // renders char to a big per-object buffer where alpha and bitmap are separated
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
247 static void tt_draw_alpha_buf(mp_osd_obj_t* obj, int x0,int y0, int w,int h, unsigned char* src, int stride,int fg,int bg,int alpha)
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
248 {
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
249 int dststride = obj->stride;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
250 int dstskip = obj->stride-w;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
251 int srcskip = stride-w;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
252 int i, j;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
253 unsigned char *b = obj->bitmap_buffer + (y0-obj->bbox.y1)*dststride + (x0-obj->bbox.x1);
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
254 unsigned char *a = obj->alpha_buffer + (y0-obj->bbox.y1)*dststride + (x0-obj->bbox.x1);
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
255 unsigned char *bs = src;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
256 if (x0 < obj->bbox.x1 || x0+w > obj->bbox.x2 || y0 < obj->bbox.y1 || y0+h > obj->bbox.y2) {
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
257 mp_msg(MSGT_OSD,MSGL_ERR,"tt osd text out of range: bbox [%d %d %d %d], txt [%d %d %d %d]\n",
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
258 obj->bbox.x1, obj->bbox.x2, obj->bbox.y1, obj->bbox.y2,
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
259 x0, x0+w, y0, y0+h);
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
260 return;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
261 }
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
262 for (i = 0; i < h; i++) {
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
263 for (j = 0; j < w; j++, b++, a++, bs++) {
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
264 *b=(fg-bg)*(*bs)/255+bg;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
265 *a=alpha;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
266 }
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
267 b+= dstskip;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
268 a+= dstskip;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
269 bs+= srcskip;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
270 }
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
271 }
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
272 inline static void vo_update_text_teletext(mp_osd_obj_t *obj, int dxs, int dys)
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
273 {
24292
ca146808e926 Proper support for flashing chars in teletext pages.
voroshil
parents: 24046
diff changeset
274 int h=0,w=0,i,j,font,flashon;
23903
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
275 int wm,hm;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
276 int color;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
277 int x,y,x0,y0;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
278 int cols,rows;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
279 int wm12;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
280 int hm13;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
281 int hm23;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
282 int start_row,max_rows;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
283 int b,ax[6],ay[6],aw[6],ah[6];
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
284 tt_char tc;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
285 tt_char* tdp=vo_osd_teletext_page;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
286 unsigned char colors[8]={1,85,150,226,70,105,179,254};
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
287 unsigned char* buf[9];
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
288
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
289 obj->flags|=OSDFLAG_CHANGED|OSDFLAG_VISIBLE;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
290 if (!tdp || !vo_osd_teletext_mode) {
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
291 obj->flags&=~OSDFLAG_VISIBLE;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
292 return;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
293 }
24292
ca146808e926 Proper support for flashing chars in teletext pages.
voroshil
parents: 24046
diff changeset
294 flashon=(GetTimer()/1000000)%2;
23903
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
295 switch(vo_osd_teletext_half){
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
296 case TT_ZOOM_TOP_HALF:
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
297 start_row=0;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
298 max_rows=VBI_ROWS/2;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
299 break;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
300 case TT_ZOOM_BOTTOM_HALF:
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
301 start_row=VBI_ROWS/2;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
302 max_rows=VBI_ROWS/2;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
303 break;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
304 default:
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
305 start_row=0;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
306 max_rows=VBI_ROWS;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
307 break;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
308 }
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
309 wm=0;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
310 for(i=start_row;i<max_rows;i++){
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
311 for(j=0;j<VBI_COLUMNS;j++){
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
312 tc=tdp[i*VBI_COLUMNS+j];
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
313 if(!tc.ctl && !tc.gfx)
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
314 {
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
315 render_one_glyph(vo_font, tc.unicode);
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
316 if (wm<vo_font->width[tc.unicode])
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
317 wm=vo_font->width[tc.unicode];
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
318 }
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
319 }
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
320 }
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
321
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
322 hm=vo_font->height+1;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
323 wm=dxs*hm*max_rows/(dys*VBI_COLUMNS);
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
324
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
325 //very simple teletext font auto scaling
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
326 if(!vo_osd_teletext_scale && hm*(max_rows+1)>dys){
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
327 text_font_scale_factor*=1.0*(dys)/((max_rows+1)*hm);
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
328 force_load_font=1;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
329 vo_osd_teletext_scale=text_font_scale_factor;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
330 obj->flags&=~OSDFLAG_VISIBLE;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
331 return;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
332 }
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
333
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
334 cols=dxs/wm;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
335 rows=dys/hm;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
336
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
337 if(cols>VBI_COLUMNS)
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
338 cols=VBI_COLUMNS;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
339 if(rows>max_rows)
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
340 rows=max_rows;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
341 w=cols*wm-vo_font->charspace;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
342 h=rows*hm-vo_font->charspace;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
343
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
344 if(w<dxs)
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
345 x0=(dxs-w)/2;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
346 else
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
347 x0=0;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
348 if(h<dys)
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
349 y0=(dys-h)/2;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
350 else
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
351 y0=0;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
352
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
353 wm12=wm>>1;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
354 hm13=(hm+1)/3;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
355 hm23=hm13<<1;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
356
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
357 for(i=0;i<6;i+=2){
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
358 ax[i+0]=0;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
359 aw[i+0]=wm12;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
360
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
361 ax[i+1]=wm12;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
362 aw[i+1]=wm-wm12;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
363 }
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
364
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
365 for(i=0;i<2;i++){
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
366 ay[i+0]=0;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
367 ah[i+0]=hm13;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
368
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
369 ay[i+2]=hm13;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
370 ah[i+2]=hm-hm23;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
371
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
372 ay[i+4]=hm-hm13;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
373 ah[i+4]=hm13;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
374 }
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
375
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
376 obj->x = 0;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
377 obj->y = 0;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
378 obj->bbox.x1 = x0;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
379 obj->bbox.y1 = y0;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
380 obj->bbox.x2 = x0+w;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
381 obj->bbox.y2 = y0+h;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
382 obj->flags |= OSDFLAG_BBOX;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
383 alloc_buf(obj);
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
384
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
385 for(i=0;i<9;i++)
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
386 buf[i]=malloc(wm*hm);
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
387
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
388 //alpha
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
389 if(vo_osd_teletext_format==TT_FORMAT_OPAQUE ||vo_osd_teletext_format==TT_FORMAT_OPAQUE_INV)
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
390 color=1;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
391 else
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
392 color=200;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
393 memset(buf[8],color,wm*hm);
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
394 //colors
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
395 if(vo_osd_teletext_format==TT_FORMAT_OPAQUE ||vo_osd_teletext_format==TT_FORMAT_TRANSPARENT){
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
396 for(i=0;i<8;i++){
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
397 memset(buf[i],(unsigned char)(1.0*(255-color)*colors[i]/255),wm*hm);
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
398 }
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
399 }else{
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
400 for(i=0;i<8;i++)
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
401 memset(buf[i],(unsigned char)(1.0*(255-color)*colors[7-i]/255),wm*hm);
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
402 }
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
403
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
404 y=y0;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
405 for(i=0;i<rows;i++){
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
406 x=x0;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
407 for(j=0;j<cols;j++){
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
408 tc=tdp[(i+start_row)*VBI_COLUMNS+j];
24344
09d402672398 Implement boxes for subtitle teletext pages.
voroshil
parents: 24292
diff changeset
409 if (tc.hidden) { x+=wm; continue;}
24292
ca146808e926 Proper support for flashing chars in teletext pages.
voroshil
parents: 24046
diff changeset
410 if(!tc.gfx || (tc.flh && !flashon)){
23903
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
411 /* Rendering one text character */
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
412 draw_alpha_buf(obj,x,y,wm,hm,buf[tc.bg],buf[8],wm);
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
413 if(tc.unicode!=0x20 && tc.unicode!=0x00 && !tc.ctl &&
24292
ca146808e926 Proper support for flashing chars in teletext pages.
voroshil
parents: 24046
diff changeset
414 (!tc.flh || flashon) &&
23903
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
415 (font=vo_font->font[tc.unicode])>=0 && y+hm<dys){
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
416 tt_draw_alpha_buf(obj,x,y,vo_font->width[tc.unicode],vo_font->height,
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
417 vo_font->pic_b[font]->bmp+vo_font->start[tc.unicode]-vo_font->charspace*vo_font->pic_a[font]->w,
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
418 vo_font->pic_b[font]->w,
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
419 buf[tc.fg][0],buf[tc.bg][0],buf[8][0]);
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
420 }
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
421 }else{
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
422 /*
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
423 Rendering one graphics character
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
424 TODO: support for separated graphics symbols (where six rectangles does not touch each other)
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
425
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
426 +--+ +--+ 87654321
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
427 |01| |12| --------
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
428 |10| <= |34| <= 00100110 <= 0x26
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
429 |01| |56|
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
430 +--+ +--+
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
431
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
432 (0:wm/2) (wm/2:wm-wm/2)
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
433
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
434 ********** *********** (0:hm/3)
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
435 *** **** **** ****
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
436 *** 1 **** **** 2 ****
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
437 *** **** **** ****
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
438 ********** ***********
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
439 ********** ***********
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
440
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
441 ********** *********** (hm/3:hm-2*hm/3)
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
442 ********** ***********
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
443 *** **** **** ****
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
444 *** 3 **** **** 4 ****
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
445 *** **** **** ****
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
446 ********** ***********
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
447 ********** ***********
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
448 ********** ***********
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
449
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
450 ********** *********** (hm-hm/3:hm/3)
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
451 *** **** **** ****
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
452 *** 5 **** **** 6 ****
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
453 *** **** **** ****
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
454 ********** ***********
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
455 ********** ***********
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
456
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
457 */
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
458 if(tc.gfx>1){ //separated gfx
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
459 for(b=0;b<6;b++){
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
460 color=(tc.unicode>>b)&1?tc.fg:tc.bg;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
461 draw_alpha_buf(obj,x+ax[b]+1,y+ay[b]+1,aw[b]-2,ah[b]-2,buf[color],buf[8],wm);
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
462 }
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
463 //separated gfx (background borders)
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
464 //vertical
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
465 draw_alpha_buf(obj,x ,y,1,hm,buf[tc.bg],buf[8],wm);
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
466 draw_alpha_buf(obj,x+ax[1]-1,y,2,hm,buf[tc.bg],buf[8],wm);
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
467 draw_alpha_buf(obj,x+ax[1]+aw[1]-1,y,wm-ax[1]-aw[1]+1,hm,buf[tc.bg],buf[8],wm);
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
468 //horizontal
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
469 draw_alpha_buf(obj,x,y ,wm,1,buf[tc.bg],buf[8],wm);
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
470 draw_alpha_buf(obj,x,y+ay[0]+ah[0]-1,wm,2,buf[tc.bg],buf[8],wm);
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
471 draw_alpha_buf(obj,x,y+ay[2]+ah[2]-1,wm,2,buf[tc.bg],buf[8],wm);
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
472 draw_alpha_buf(obj,x,y+ay[4]+ah[4]-1,wm,hm-ay[4]-ah[4]+1,buf[tc.bg],buf[8],wm);
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
473 }else{
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
474 for(b=0;b<6;b++){
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
475 color=(tc.unicode>>b)&1?tc.fg:tc.bg;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
476 draw_alpha_buf(obj,x+ax[b],y+ay[b],aw[b],ah[b],buf[color],buf[8],wm);
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
477 }
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
478 }
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
479 }
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
480 x+=wm;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
481 }
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
482 y+=hm;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
483 }
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
484 for(i=0;i<9;i++)
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
485 free(buf[i]);
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
486 }
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
487 #endif
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
488
218
fbfc2077ba72 sub/osd interface changes
arpi_esp
parents: 213
diff changeset
489 int vo_osd_progbar_type=-1;
1726
38871427a131 corrections to OSD progbar position calculations
atlka
parents: 1602
diff changeset
490 int vo_osd_progbar_value=100; // 0..256
38871427a131 corrections to OSD progbar position calculations
atlka
parents: 1602
diff changeset
491
38871427a131 corrections to OSD progbar position calculations
atlka
parents: 1602
diff changeset
492 // if we have n=256 bars then OSD progbar looks like below
38871427a131 corrections to OSD progbar position calculations
atlka
parents: 1602
diff changeset
493 //
1878
96ae64356ea0 corrections to OSD mark position
atlka
parents: 1852
diff changeset
494 // 0 1 2 3 ... 256 <= vo_osd_progbar_value
96ae64356ea0 corrections to OSD mark position
atlka
parents: 1852
diff changeset
495 // | | | | |
1726
38871427a131 corrections to OSD progbar position calculations
atlka
parents: 1602
diff changeset
496 // [ === === === ... === ]
38871427a131 corrections to OSD progbar position calculations
atlka
parents: 1602
diff changeset
497 //
38871427a131 corrections to OSD progbar position calculations
atlka
parents: 1602
diff changeset
498 // the above schema is rescalled to n=elems bars
218
fbfc2077ba72 sub/osd interface changes
arpi_esp
parents: 213
diff changeset
499
5638
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
500 inline static void vo_update_text_progbar(mp_osd_obj_t* obj,int dxs,int dys){
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
501
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
502 obj->flags|=OSDFLAG_CHANGED|OSDFLAG_VISIBLE;
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
503
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
504 if(vo_osd_progbar_type<0 || !vo_font){
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
505 obj->flags&=~OSDFLAG_VISIBLE;
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
506 return;
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
507 }
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
508
7121
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
509 render_one_glyph(vo_font, OSD_PB_START);
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
510 render_one_glyph(vo_font, OSD_PB_END);
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
511 render_one_glyph(vo_font, OSD_PB_0);
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
512 render_one_glyph(vo_font, OSD_PB_1);
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
513 render_one_glyph(vo_font, vo_osd_progbar_type);
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
514
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
515 // calculate bbox corners:
5664
ee6c9530729f bbox calculation fixed (font->height < real height)
arpi
parents: 5645
diff changeset
516 { int h=0;
1501
d40f2b686846 changes according to -utf8 option, draw_osd() function added
atlka
parents: 1109
diff changeset
517 int y=(dys-vo_font->height)/2;
1548
eee7951a23af changes according to proper subfont bar positioning and char spaceing - sub.c
atlka
parents: 1524
diff changeset
518 int delimw=vo_font->width[OSD_PB_START]
1549
787c053b314c minor changes in sub.c
atlka
parents: 1548
diff changeset
519 +vo_font->width[OSD_PB_END]
787c053b314c minor changes in sub.c
atlka
parents: 1548
diff changeset
520 +vo_font->charspace;
1548
eee7951a23af changes according to proper subfont bar positioning and char spaceing - sub.c
atlka
parents: 1524
diff changeset
521 int width=(2*dxs-3*delimw)/3;
1549
787c053b314c minor changes in sub.c
atlka
parents: 1548
diff changeset
522 int charw=vo_font->width[OSD_PB_0]+vo_font->charspace;
1548
eee7951a23af changes according to proper subfont bar positioning and char spaceing - sub.c
atlka
parents: 1524
diff changeset
523 int elems=width/charw;
1549
787c053b314c minor changes in sub.c
atlka
parents: 1548
diff changeset
524 int x=(dxs-elems*charw-delimw)/2;
7121
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
525 int delta = 0;
5664
ee6c9530729f bbox calculation fixed (font->height < real height)
arpi
parents: 5645
diff changeset
526 h=get_height(OSD_PB_START,h);
ee6c9530729f bbox calculation fixed (font->height < real height)
arpi
parents: 5645
diff changeset
527 h=get_height(OSD_PB_END,h);
ee6c9530729f bbox calculation fixed (font->height < real height)
arpi
parents: 5645
diff changeset
528 h=get_height(OSD_PB_0,h);
ee6c9530729f bbox calculation fixed (font->height < real height)
arpi
parents: 5645
diff changeset
529 h=get_height(OSD_PB_1,h);
8422
1f1cc58e8e65 progbar osd buffer height adjustment fix
henry
parents: 8361
diff changeset
530 if (vo_osd_progbar_type>0 && vo_font->font[vo_osd_progbar_type]>=0){
1f1cc58e8e65 progbar osd buffer height adjustment fix
henry
parents: 8361
diff changeset
531 delta = vo_font->width[vo_osd_progbar_type]+vo_font->spacewidth;
1f1cc58e8e65 progbar osd buffer height adjustment fix
henry
parents: 8361
diff changeset
532 delta = (x-delta > 0) ? delta : x;
1f1cc58e8e65 progbar osd buffer height adjustment fix
henry
parents: 8361
diff changeset
533 h=get_height(vo_osd_progbar_type,h);
1f1cc58e8e65 progbar osd buffer height adjustment fix
henry
parents: 8361
diff changeset
534 }
5638
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
535 obj->bbox.x1=obj->x=x;
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
536 obj->bbox.y1=obj->y=y;
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
537 obj->bbox.x2=x+width+delimw;
5664
ee6c9530729f bbox calculation fixed (font->height < real height)
arpi
parents: 5645
diff changeset
538 obj->bbox.y2=y+h; //vo_font->height;
5640
a0cee3bb7f78 osd: calculating bbox
arpi
parents: 5638
diff changeset
539 obj->flags|=OSDFLAG_BBOX;
5638
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
540 obj->params.progbar.elems=elems;
7121
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
541 obj->bbox.x1-=delta; // space for an icon
5638
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
542 }
7121
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
543
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
544 alloc_buf(obj);
8794
056fc0a8b3d2 sanity check
henry
parents: 8635
diff changeset
545
056fc0a8b3d2 sanity check
henry
parents: 8635
diff changeset
546 {
056fc0a8b3d2 sanity check
henry
parents: 8635
diff changeset
547 int minw = vo_font->width[OSD_PB_START]+vo_font->width[OSD_PB_END]+vo_font->width[OSD_PB_0];
056fc0a8b3d2 sanity check
henry
parents: 8635
diff changeset
548 if (vo_osd_progbar_type>0 && vo_font->font[vo_osd_progbar_type]>=0){
056fc0a8b3d2 sanity check
henry
parents: 8635
diff changeset
549 minw += vo_font->width[vo_osd_progbar_type]+vo_font->charspace+vo_font->spacewidth;
056fc0a8b3d2 sanity check
henry
parents: 8635
diff changeset
550 }
056fc0a8b3d2 sanity check
henry
parents: 8635
diff changeset
551 if (obj->bbox.x2 - obj->bbox.x1 < minw) return; // space too small, don't render anything
056fc0a8b3d2 sanity check
henry
parents: 8635
diff changeset
552 }
056fc0a8b3d2 sanity check
henry
parents: 8635
diff changeset
553
7121
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
554 // render it:
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
555 { unsigned char *s;
5638
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
556 unsigned char *sa;
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
557 int i,w,h,st,mark;
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
558 int x=obj->x;
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
559 int y=obj->y;
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
560 int c,font;
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
561 int charw=vo_font->width[OSD_PB_0]+vo_font->charspace;
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
562 int elems=obj->params.progbar.elems;
1548
eee7951a23af changes according to proper subfont bar positioning and char spaceing - sub.c
atlka
parents: 1524
diff changeset
563
1726
38871427a131 corrections to OSD progbar position calculations
atlka
parents: 1602
diff changeset
564 if (vo_osd_progbar_value<=0)
38871427a131 corrections to OSD progbar position calculations
atlka
parents: 1602
diff changeset
565 mark=0;
1878
96ae64356ea0 corrections to OSD mark position
atlka
parents: 1852
diff changeset
566 else {
96ae64356ea0 corrections to OSD mark position
atlka
parents: 1852
diff changeset
567 int ev=vo_osd_progbar_value*elems;
96ae64356ea0 corrections to OSD mark position
atlka
parents: 1852
diff changeset
568 mark=ev>>8;
96ae64356ea0 corrections to OSD mark position
atlka
parents: 1852
diff changeset
569 if (ev & 0xFF) mark++;
96ae64356ea0 corrections to OSD mark position
atlka
parents: 1852
diff changeset
570 if (mark>elems) mark=elems;
96ae64356ea0 corrections to OSD mark position
atlka
parents: 1852
diff changeset
571 }
96ae64356ea0 corrections to OSD mark position
atlka
parents: 1852
diff changeset
572
1727
9da2b587b029 changes according to OSD calculations
atlka
parents: 1726
diff changeset
573
218
fbfc2077ba72 sub/osd interface changes
arpi_esp
parents: 213
diff changeset
574 // printf("osd.progbar width=%d xpos=%d\n",width,x);
fbfc2077ba72 sub/osd interface changes
arpi_esp
parents: 213
diff changeset
575
1501
d40f2b686846 changes according to -utf8 option, draw_osd() function added
atlka
parents: 1109
diff changeset
576 c=vo_osd_progbar_type;
1569
fcbfc99cf8e6 skip lines with negative y position if there is too many lines to display
atlka
parents: 1549
diff changeset
577 if(vo_osd_progbar_type>0 && (font=vo_font->font[c])>=0) {
fcbfc99cf8e6 skip lines with negative y position if there is too many lines to display
atlka
parents: 1549
diff changeset
578 int xp=x-vo_font->width[c]-vo_font->spacewidth;
7121
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
579 draw_alpha_buf(obj,(xp<0?0:xp),y,
218
fbfc2077ba72 sub/osd interface changes
arpi_esp
parents: 213
diff changeset
580 vo_font->width[c],
fbfc2077ba72 sub/osd interface changes
arpi_esp
parents: 213
diff changeset
581 vo_font->pic_a[font]->h,
fbfc2077ba72 sub/osd interface changes
arpi_esp
parents: 213
diff changeset
582 vo_font->pic_b[font]->bmp+vo_font->start[c],
fbfc2077ba72 sub/osd interface changes
arpi_esp
parents: 213
diff changeset
583 vo_font->pic_a[font]->bmp+vo_font->start[c],
fbfc2077ba72 sub/osd interface changes
arpi_esp
parents: 213
diff changeset
584 vo_font->pic_a[font]->w);
1569
fcbfc99cf8e6 skip lines with negative y position if there is too many lines to display
atlka
parents: 1549
diff changeset
585 }
fcbfc99cf8e6 skip lines with negative y position if there is too many lines to display
atlka
parents: 1549
diff changeset
586
1501
d40f2b686846 changes according to -utf8 option, draw_osd() function added
atlka
parents: 1109
diff changeset
587 c=OSD_PB_START;
d40f2b686846 changes according to -utf8 option, draw_osd() function added
atlka
parents: 1109
diff changeset
588 if ((font=vo_font->font[c])>=0)
7121
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
589 draw_alpha_buf(obj,x,y,
218
fbfc2077ba72 sub/osd interface changes
arpi_esp
parents: 213
diff changeset
590 vo_font->width[c],
fbfc2077ba72 sub/osd interface changes
arpi_esp
parents: 213
diff changeset
591 vo_font->pic_a[font]->h,
fbfc2077ba72 sub/osd interface changes
arpi_esp
parents: 213
diff changeset
592 vo_font->pic_b[font]->bmp+vo_font->start[c],
fbfc2077ba72 sub/osd interface changes
arpi_esp
parents: 213
diff changeset
593 vo_font->pic_a[font]->bmp+vo_font->start[c],
fbfc2077ba72 sub/osd interface changes
arpi_esp
parents: 213
diff changeset
594 vo_font->pic_a[font]->w);
1548
eee7951a23af changes according to proper subfont bar positioning and char spaceing - sub.c
atlka
parents: 1524
diff changeset
595 x+=vo_font->width[c]+vo_font->charspace;
218
fbfc2077ba72 sub/osd interface changes
arpi_esp
parents: 213
diff changeset
596
1501
d40f2b686846 changes according to -utf8 option, draw_osd() function added
atlka
parents: 1109
diff changeset
597 c=OSD_PB_0;
1602
48f589cf639b minor changes according to OSD
atlka
parents: 1591
diff changeset
598 if ((font=vo_font->font[c])>=0){
48f589cf639b minor changes according to OSD
atlka
parents: 1591
diff changeset
599 w=vo_font->width[c];
48f589cf639b minor changes according to OSD
atlka
parents: 1591
diff changeset
600 h=vo_font->pic_a[font]->h;
48f589cf639b minor changes according to OSD
atlka
parents: 1591
diff changeset
601 s=vo_font->pic_b[font]->bmp+vo_font->start[c];
48f589cf639b minor changes according to OSD
atlka
parents: 1591
diff changeset
602 sa=vo_font->pic_a[font]->bmp+vo_font->start[c];
48f589cf639b minor changes according to OSD
atlka
parents: 1591
diff changeset
603 st=vo_font->pic_a[font]->w;
2204
28901a4122c8 optimizations and corrections
atlka
parents: 2176
diff changeset
604 if ((i=mark)) do {
7121
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
605 draw_alpha_buf(obj,x,y,w,h,s,sa,st);
1548
eee7951a23af changes according to proper subfont bar positioning and char spaceing - sub.c
atlka
parents: 1524
diff changeset
606 x+=charw;
2204
28901a4122c8 optimizations and corrections
atlka
parents: 2176
diff changeset
607 } while(--i);
1602
48f589cf639b minor changes according to OSD
atlka
parents: 1591
diff changeset
608 }
202
6ad0715dfac8 grey+alpha rendering support (for .sub)
arpi_esp
parents:
diff changeset
609
1501
d40f2b686846 changes according to -utf8 option, draw_osd() function added
atlka
parents: 1109
diff changeset
610 c=OSD_PB_1;
1602
48f589cf639b minor changes according to OSD
atlka
parents: 1591
diff changeset
611 if ((font=vo_font->font[c])>=0){
48f589cf639b minor changes according to OSD
atlka
parents: 1591
diff changeset
612 w=vo_font->width[c];
48f589cf639b minor changes according to OSD
atlka
parents: 1591
diff changeset
613 h=vo_font->pic_a[font]->h;
48f589cf639b minor changes according to OSD
atlka
parents: 1591
diff changeset
614 s =vo_font->pic_b[font]->bmp+vo_font->start[c];
48f589cf639b minor changes according to OSD
atlka
parents: 1591
diff changeset
615 sa=vo_font->pic_a[font]->bmp+vo_font->start[c];
48f589cf639b minor changes according to OSD
atlka
parents: 1591
diff changeset
616 st=vo_font->pic_a[font]->w;
2204
28901a4122c8 optimizations and corrections
atlka
parents: 2176
diff changeset
617 if ((i=elems-mark)) do {
7121
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
618 draw_alpha_buf(obj,x,y,w,h,s,sa,st);
1548
eee7951a23af changes according to proper subfont bar positioning and char spaceing - sub.c
atlka
parents: 1524
diff changeset
619 x+=charw;
2204
28901a4122c8 optimizations and corrections
atlka
parents: 2176
diff changeset
620 } while(--i);
1602
48f589cf639b minor changes according to OSD
atlka
parents: 1591
diff changeset
621 }
1501
d40f2b686846 changes according to -utf8 option, draw_osd() function added
atlka
parents: 1109
diff changeset
622
d40f2b686846 changes according to -utf8 option, draw_osd() function added
atlka
parents: 1109
diff changeset
623 c=OSD_PB_END;
d40f2b686846 changes according to -utf8 option, draw_osd() function added
atlka
parents: 1109
diff changeset
624 if ((font=vo_font->font[c])>=0)
7121
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
625 draw_alpha_buf(obj,x,y,
218
fbfc2077ba72 sub/osd interface changes
arpi_esp
parents: 213
diff changeset
626 vo_font->width[c],
fbfc2077ba72 sub/osd interface changes
arpi_esp
parents: 213
diff changeset
627 vo_font->pic_a[font]->h,
fbfc2077ba72 sub/osd interface changes
arpi_esp
parents: 213
diff changeset
628 vo_font->pic_b[font]->bmp+vo_font->start[c],
fbfc2077ba72 sub/osd interface changes
arpi_esp
parents: 213
diff changeset
629 vo_font->pic_a[font]->bmp+vo_font->start[c],
fbfc2077ba72 sub/osd interface changes
arpi_esp
parents: 213
diff changeset
630 vo_font->pic_a[font]->w);
1548
eee7951a23af changes according to proper subfont bar positioning and char spaceing - sub.c
atlka
parents: 1524
diff changeset
631 // x+=vo_font->width[c]+vo_font->charspace;
803
b25a887b6054 sub splitting patch applied by Vlada V.Dubsky@sh.cvut.cz
arpi_esp
parents: 726
diff changeset
632
7121
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
633 }
218
fbfc2077ba72 sub/osd interface changes
arpi_esp
parents: 213
diff changeset
634 // vo_osd_progbar_value=(vo_osd_progbar_value+1)&0xFF;
fbfc2077ba72 sub/osd interface changes
arpi_esp
parents: 213
diff changeset
635
fbfc2077ba72 sub/osd interface changes
arpi_esp
parents: 213
diff changeset
636 }
fbfc2077ba72 sub/osd interface changes
arpi_esp
parents: 213
diff changeset
637
254
57f0156416e3 use subreader's sub struct
arpi_esp
parents: 218
diff changeset
638 subtitle* vo_sub=NULL;
218
fbfc2077ba72 sub/osd interface changes
arpi_esp
parents: 213
diff changeset
639
5638
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
640 // vo_draw_text_sub(int dxs,int dys,void (*draw_alpha)(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride))
1591
86a192179276 draw speedups, cut text if too many lines
atlka
parents: 1574
diff changeset
641
5638
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
642 inline static void vo_update_text_sub(mp_osd_obj_t* obj,int dxs,int dys){
1501
d40f2b686846 changes according to -utf8 option, draw_osd() function added
atlka
parents: 1109
diff changeset
643 unsigned char *t;
10916
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
644 int c,i,j,l,x,y,font,prevc,counter;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
645 int k;
1501
d40f2b686846 changes according to -utf8 option, draw_osd() function added
atlka
parents: 1109
diff changeset
646 int lastStripPosition;
10916
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
647 int xsize;
5640
a0cee3bb7f78 osd: calculating bbox
arpi
parents: 5638
diff changeset
648 int xmin=dxs,xmax=0;
1591
86a192179276 draw speedups, cut text if too many lines
atlka
parents: 1574
diff changeset
649 int h,lasth;
10916
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
650 int xtblc, utblc;
1501
d40f2b686846 changes according to -utf8 option, draw_osd() function added
atlka
parents: 1109
diff changeset
651
5638
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
652 obj->flags|=OSDFLAG_CHANGED|OSDFLAG_VISIBLE;
7628
d6608342591d This patch adds the functionality to disable/enable subtitles while playing
arpi
parents: 7121
diff changeset
653
23338
2a66d95355f0 add new -subfont option, that allows having a different font for OSD (controls and menu) and subtitles
ben
parents: 21582
diff changeset
654 if(!vo_sub || !sub_font || !sub_visibility || (sub_font->font[40]<0)){
5638
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
655 obj->flags&=~OSDFLAG_VISIBLE;
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
656 return;
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
657 }
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
658
5664
ee6c9530729f bbox calculation fixed (font->height < real height)
arpi
parents: 5645
diff changeset
659 obj->bbox.y2=obj->y=dys;
5638
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
660 obj->params.subtitle.lines=0;
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
661
1602
48f589cf639b minor changes according to OSD
atlka
parents: 1591
diff changeset
662 // too long lines divide into a smaller ones
5638
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
663 i=k=lasth=0;
23338
2a66d95355f0 add new -subfont option, that allows having a different font for OSD (controls and menu) and subtitles
ben
parents: 21582
diff changeset
664 h=sub_font->height;
1591
86a192179276 draw speedups, cut text if too many lines
atlka
parents: 1574
diff changeset
665 lastStripPosition=-1;
86a192179276 draw speedups, cut text if too many lines
atlka
parents: 1574
diff changeset
666 l=vo_sub->lines;
86a192179276 draw speedups, cut text if too many lines
atlka
parents: 1574
diff changeset
667
10916
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
668 {
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
669 struct osd_text_t *osl, *cp_ott, *tmp_ott, *tmp;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
670 struct osd_text_p *otp_sub = NULL, *otp_sub_tmp, // these are used to store the whole sub text osd
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
671 *otp, *tmp_otp, *pmt; // these are used to manage sub text osd coming from a single sub line
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
672 int *char_seq, char_position, xlimit = dxs * sub_width_p / 100, counter;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
673
2204
28901a4122c8 optimizations and corrections
atlka
parents: 2176
diff changeset
674 while (l) {
23338
2a66d95355f0 add new -subfont option, that allows having a different font for OSD (controls and menu) and subtitles
ben
parents: 21582
diff changeset
675 xsize = -sub_font->charspace;
2204
28901a4122c8 optimizations and corrections
atlka
parents: 2176
diff changeset
676 l--;
1501
d40f2b686846 changes according to -utf8 option, draw_osd() function added
atlka
parents: 1109
diff changeset
677 t=vo_sub->text[i++];
10916
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
678 char_position = 0;
21581
37c795807a1d Another simplification
reimar
parents: 21580
diff changeset
679 char_seq = calloc(strlen(t), sizeof(int));
7121
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
680
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
681 prevc = -1;
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
682
10916
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
683 otp = NULL;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
684 osl = NULL;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
685 x = 1;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
686
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
687 // reading the subtitle words from vo_sub->text[]
21580
8a710a7b68ea Reuse utf8_get_char in subtitle rendering code.
reimar
parents: 21443
diff changeset
688 while (*t) {
8a710a7b68ea Reuse utf8_get_char in subtitle rendering code.
reimar
parents: 21443
diff changeset
689 if (sub_utf8)
8a710a7b68ea Reuse utf8_get_char in subtitle rendering code.
reimar
parents: 21443
diff changeset
690 c = utf8_get_char(&t);
8a710a7b68ea Reuse utf8_get_char in subtitle rendering code.
reimar
parents: 21443
diff changeset
691 else if ((c = *t++) >= 0x80 && sub_unicode)
8a710a7b68ea Reuse utf8_get_char in subtitle rendering code.
reimar
parents: 21443
diff changeset
692 c = (c<<8) + *t++;
1501
d40f2b686846 changes according to -utf8 option, draw_osd() function added
atlka
parents: 1109
diff changeset
693 if (k==MAX_UCS){
21580
8a710a7b68ea Reuse utf8_get_char in subtitle rendering code.
reimar
parents: 21443
diff changeset
694 t += strlen(t); // end here
5638
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
695 mp_msg(MSGT_OSD,MSGL_WARN,"\nMAX_UCS exceeded!\n");
1591
86a192179276 draw speedups, cut text if too many lines
atlka
parents: 1574
diff changeset
696 }
2204
28901a4122c8 optimizations and corrections
atlka
parents: 2176
diff changeset
697 if (!c) c++; // avoid UCS 0
23338
2a66d95355f0 add new -subfont option, that allows having a different font for OSD (controls and menu) and subtitles
ben
parents: 21582
diff changeset
698 render_one_glyph(sub_font, c);
10916
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
699
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
700 if (c == ' ') {
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
701 struct osd_text_t *tmp_ott = (struct osd_text_t *) calloc(1, sizeof(struct osd_text_t));
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
702
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
703 if (osl == NULL) {
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
704 osl = cp_ott = tmp_ott;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
705 } else {
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
706 tmp_ott->prev = cp_ott;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
707 cp_ott->next = tmp_ott;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
708 tmp_ott->osd_kerning =
23338
2a66d95355f0 add new -subfont option, that allows having a different font for OSD (controls and menu) and subtitles
ben
parents: 21582
diff changeset
709 sub_font->charspace + sub_font->width[' '];
10916
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
710 cp_ott = tmp_ott;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
711 }
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
712 tmp_ott->osd_length = xsize;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
713 tmp_ott->text_length = char_position;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
714 tmp_ott->text = (int *) malloc(char_position * sizeof(int));
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
715 for (counter = 0; counter < char_position; ++counter)
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
716 tmp_ott->text[counter] = char_seq[counter];
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
717 char_position = 0;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
718 xsize = 0;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
719 prevc = c;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
720 } else {
23338
2a66d95355f0 add new -subfont option, that allows having a different font for OSD (controls and menu) and subtitles
ben
parents: 21582
diff changeset
721 int delta_xsize = sub_font->width[c] + sub_font->charspace + kerning(sub_font, prevc, c);
10916
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
722
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
723 if (xsize + delta_xsize <= dxs) {
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
724 if (!x) x = 1;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
725 prevc = c;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
726 char_seq[char_position++] = c;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
727 xsize += delta_xsize;
23338
2a66d95355f0 add new -subfont option, that allows having a different font for OSD (controls and menu) and subtitles
ben
parents: 21582
diff changeset
728 if ((!suboverlap_enabled) && ((font = sub_font->font[c]) >= 0)) {
2a66d95355f0 add new -subfont option, that allows having a different font for OSD (controls and menu) and subtitles
ben
parents: 21582
diff changeset
729 if (sub_font->pic_a[font]->h > h) {
2a66d95355f0 add new -subfont option, that allows having a different font for OSD (controls and menu) and subtitles
ben
parents: 21582
diff changeset
730 h = sub_font->pic_a[font]->h;
10916
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
731 }
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
732 }
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
733 } else {
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
734 if (x) {
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
735 mp_msg(MSGT_OSD, MSGL_WARN, "\nSubtitle word '%s' too long!\n", t);
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
736 x = 0;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
737 }
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
738 }
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
739 }
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
740 }// for len (all words from subtitle line read)
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
741
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
742 // osl holds an ordered (as they appear in the lines) chain of the subtitle words
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
743 {
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
744 struct osd_text_t *tmp_ott = (struct osd_text_t *) calloc(1, sizeof(struct osd_text_t));
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
745
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
746 if (osl == NULL) {
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
747 osl = cp_ott = tmp_ott;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
748 } else {
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
749 tmp_ott->prev = cp_ott;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
750 cp_ott->next = tmp_ott;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
751 tmp_ott->osd_kerning =
23338
2a66d95355f0 add new -subfont option, that allows having a different font for OSD (controls and menu) and subtitles
ben
parents: 21582
diff changeset
752 sub_font->charspace + sub_font->width[' '];
10916
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
753 cp_ott = tmp_ott;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
754 }
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
755 tmp_ott->osd_length = xsize;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
756 tmp_ott->text_length = char_position;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
757 tmp_ott->text = (int *) malloc(char_position * sizeof(int));
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
758 for (counter = 0; counter < char_position; ++counter)
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
759 tmp_ott->text[counter] = char_seq[counter];
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
760 char_position = 0;
23338
2a66d95355f0 add new -subfont option, that allows having a different font for OSD (controls and menu) and subtitles
ben
parents: 21582
diff changeset
761 xsize = -sub_font->charspace;
10916
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
762 }
18716
e75ab7767078 Missing free for malloced char_seq in OSD code
reimar
parents: 17566
diff changeset
763 free(char_seq);
10916
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
764
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
765 if (osl != NULL) {
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
766 int value = 0, exit = 0, minimum = 0;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
767
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
768 // otp will contain the chain of the osd subtitle lines coming from the single vo_sub line.
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
769 otp = tmp_otp = (struct osd_text_p *) calloc(1, sizeof(struct osd_text_p));
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
770 tmp_otp->ott = osl;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
771 for (tmp_ott = tmp_otp->ott; exit == 0; ) {
11297
b4c7de4cfbf2 prevent lockups on words which do not fit on the screen - temporary fix
henry
parents: 11201
diff changeset
772 do {
10916
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
773 value += tmp_ott->osd_kerning + tmp_ott->osd_length;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
774 tmp_ott = tmp_ott->next;
11297
b4c7de4cfbf2 prevent lockups on words which do not fit on the screen - temporary fix
henry
parents: 11201
diff changeset
775 } while ((tmp_ott != NULL) && (value + tmp_ott->osd_kerning + tmp_ott->osd_length <= xlimit));
10916
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
776 if (tmp_ott != NULL) {
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
777 struct osd_text_p *tmp = (struct osd_text_p *) calloc(1, sizeof(struct osd_text_p));
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
778
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
779 tmp_otp->value = value;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
780 tmp_otp->next = tmp;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
781 tmp->prev = tmp_otp;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
782 tmp_otp = tmp;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
783 tmp_otp->ott = tmp_ott;
23338
2a66d95355f0 add new -subfont option, that allows having a different font for OSD (controls and menu) and subtitles
ben
parents: 21582
diff changeset
784 value = -2 * sub_font->charspace - sub_font->width[' '];
10916
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
785 } else {
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
786 tmp_otp->value = value;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
787 exit = 1;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
788 }
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
789 }
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
790
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
791
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
792 #ifdef NEW_SPLITTING
24595
85f669a84e7a cosmetics: misc typo fixes
diego
parents: 24582
diff changeset
793 // minimum holds the 'sum of the differences in length among the lines',
85f669a84e7a cosmetics: misc typo fixes
diego
parents: 24582
diff changeset
794 // a measure of the evenness of the lengths of the lines
10916
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
795 for (tmp_otp = otp; tmp_otp->next != NULL; tmp_otp = tmp_otp->next) {
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
796 pmt = tmp_otp->next;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
797 while (pmt != NULL) {
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
798 minimum += abs(tmp_otp->value - pmt->value);
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
799 pmt = pmt->next;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
800 }
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
801 }
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
802
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
803 if (otp->next != NULL) {
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
804 int mem1, mem2;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
805 struct osd_text_p *mem, *hold;
5640
a0cee3bb7f78 osd: calculating bbox
arpi
parents: 5638
diff changeset
806
10916
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
807 exit = 0;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
808 // until the last word of a line can be moved to the beginning of following line
24595
85f669a84e7a cosmetics: misc typo fixes
diego
parents: 24582
diff changeset
809 // reducing the 'sum of the differences in length among the lines', it is done
10916
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
810 while (exit == 0) {
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
811 hold = NULL;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
812 exit = 1;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
813 for (tmp_otp = otp; tmp_otp->next != NULL; tmp_otp = tmp_otp->next) {
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
814 pmt = tmp_otp->next;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
815 for (tmp = tmp_otp->ott; tmp->next != pmt->ott; tmp = tmp->next);
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
816 if (pmt->value + tmp->osd_length + pmt->ott->osd_kerning <= xlimit) {
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
817 mem1 = tmp_otp->value;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
818 mem2 = pmt->value;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
819 tmp_otp->value = mem1 - tmp->osd_length - tmp->osd_kerning;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
820 pmt->value = mem2 + tmp->osd_length + pmt->ott->osd_kerning;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
821
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
822 value = 0;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
823 for (mem = otp; mem->next != NULL; mem = mem->next) {
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
824 pmt = mem->next;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
825 while (pmt != NULL) {
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
826 value += abs(mem->value - pmt->value);
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
827 pmt = pmt->next;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
828 }
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
829 }
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
830 if (value < minimum) {
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
831 minimum = value;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
832 hold = tmp_otp;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
833 exit = 0;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
834 }
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
835 tmp_otp->value = mem1;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
836 tmp_otp->next->value = mem2;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
837 }
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
838 }
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
839 // merging
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
840 if (exit == 0) {
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
841 tmp_otp = hold;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
842 pmt = tmp_otp->next;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
843 for (tmp = tmp_otp->ott; tmp->next != pmt->ott; tmp = tmp->next);
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
844 mem1 = tmp_otp->value;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
845 mem2 = pmt->value;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
846 tmp_otp->value = mem1 - tmp->osd_length - tmp->osd_kerning;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
847 pmt->value = mem2 + tmp->osd_length + pmt->ott->osd_kerning;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
848 pmt->ott = tmp;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
849 }//~merging
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
850 }//~while(exit == 0)
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
851 }//~if(otp->next!=NULL)
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
852 #endif
8534
922ce27eb683 This patch adds support for vertical subtitle alignment
arpi
parents: 8451
diff changeset
853
10916
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
854 // adding otp (containing splitted lines) to otp chain
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
855 if (otp_sub == NULL) {
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
856 otp_sub = otp;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
857 for (otp_sub_tmp = otp_sub; otp_sub_tmp->next != NULL; otp_sub_tmp = otp_sub_tmp->next);
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
858 } else {
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
859 //updating ott chain
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
860 tmp = otp_sub->ott;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
861 while (tmp->next != NULL) tmp = tmp->next;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
862 tmp->next = otp->ott;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
863 otp->ott->prev = tmp;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
864 //attaching new subtitle line at the end
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
865 otp_sub_tmp->next = otp;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
866 otp->prev = otp_sub_tmp;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
867 do
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
868 otp_sub_tmp = otp_sub_tmp->next;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
869 while (otp_sub_tmp->next != NULL);
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
870 }
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
871 }//~ if(osl != NULL)
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
872 } // while
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
873
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
874 // write lines into utbl
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
875 xtblc = 0;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
876 utblc = 0;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
877 obj->y = dys;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
878 obj->params.subtitle.lines = 0;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
879 for (tmp_otp = otp_sub; tmp_otp != NULL; tmp_otp = tmp_otp->next) {
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
880
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
881 if ((obj->params.subtitle.lines++) >= MAX_UCSLINES)
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
882 break;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
883
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
884 if (h > obj->y) { // out of the screen so end parsing
23338
2a66d95355f0 add new -subfont option, that allows having a different font for OSD (controls and menu) and subtitles
ben
parents: 21582
diff changeset
885 obj->y -= lasth - sub_font->height; // correct the y position
10916
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
886 break;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
887 }
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
888 xsize = tmp_otp->value;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
889 obj->params.subtitle.xtbl[xtblc++] = (dxs - xsize) / 2;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
890 if (xmin > (dxs - xsize) / 2)
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
891 xmin = (dxs - xsize) / 2;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
892 if (xmax < (dxs + xsize) / 2)
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
893 xmax = (dxs + xsize) / 2;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
894
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
895 tmp = (tmp_otp->next == NULL) ? NULL : tmp_otp->next->ott;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
896 for (tmp_ott = tmp_otp->ott; tmp_ott != tmp; tmp_ott = tmp_ott->next) {
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
897 for (counter = 0; counter < tmp_ott->text_length; ++counter) {
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
898 if (utblc > MAX_UCS) {
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
899 break;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
900 }
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
901 c = tmp_ott->text[counter];
23338
2a66d95355f0 add new -subfont option, that allows having a different font for OSD (controls and menu) and subtitles
ben
parents: 21582
diff changeset
902 render_one_glyph(sub_font, c);
10916
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
903 obj->params.subtitle.utbl[utblc++] = c;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
904 k++;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
905 }
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
906 obj->params.subtitle.utbl[utblc++] = ' ';
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
907 }
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
908 obj->params.subtitle.utbl[utblc - 1] = 0;
23338
2a66d95355f0 add new -subfont option, that allows having a different font for OSD (controls and menu) and subtitles
ben
parents: 21582
diff changeset
909 obj->y -= sub_font->height;
10916
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
910 }
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
911 if(obj->params.subtitle.lines)
23338
2a66d95355f0 add new -subfont option, that allows having a different font for OSD (controls and menu) and subtitles
ben
parents: 21582
diff changeset
912 obj->y = dys - ((obj->params.subtitle.lines - 1) * sub_font->height + sub_font->pic_a[sub_font->font[40]]->h);
10916
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
913
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
914 // free memory
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
915 if (otp_sub != NULL) {
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
916 for (tmp = otp_sub->ott; tmp->next != NULL; free(tmp->prev)) {
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
917 free(tmp->text);
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
918 tmp = tmp->next;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
919 }
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
920 free(tmp->text);
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
921 free(tmp);
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
922
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
923 for(pmt = otp_sub; pmt->next != NULL; free(pmt->prev)) {
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
924 pmt = pmt->next;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
925 }
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
926 free(pmt);
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
927 }
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
928
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
929 }
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
930 /// vertical alignment
8534
922ce27eb683 This patch adds support for vertical subtitle alignment
arpi
parents: 8451
diff changeset
931 h = dys - obj->y;
16838
fb79161e09f4 reverse incorrect sub alignment change, ok'd by diego
rfelker
parents: 16834
diff changeset
932 if (sub_alignment == 2)
8534
922ce27eb683 This patch adds support for vertical subtitle alignment
arpi
parents: 8451
diff changeset
933 obj->y = dys * sub_pos / 100 - h;
922ce27eb683 This patch adds support for vertical subtitle alignment
arpi
parents: 8451
diff changeset
934 else if (sub_alignment == 1)
922ce27eb683 This patch adds support for vertical subtitle alignment
arpi
parents: 8451
diff changeset
935 obj->y = dys * sub_pos / 100 - h / 2;
922ce27eb683 This patch adds support for vertical subtitle alignment
arpi
parents: 8451
diff changeset
936 else
922ce27eb683 This patch adds support for vertical subtitle alignment
arpi
parents: 8451
diff changeset
937 obj->y = dys * sub_pos / 100;
922ce27eb683 This patch adds support for vertical subtitle alignment
arpi
parents: 8451
diff changeset
938
922ce27eb683 This patch adds support for vertical subtitle alignment
arpi
parents: 8451
diff changeset
939 if (obj->y < 0)
922ce27eb683 This patch adds support for vertical subtitle alignment
arpi
parents: 8451
diff changeset
940 obj->y = 0;
922ce27eb683 This patch adds support for vertical subtitle alignment
arpi
parents: 8451
diff changeset
941 if (obj->y > dys - h)
922ce27eb683 This patch adds support for vertical subtitle alignment
arpi
parents: 8451
diff changeset
942 obj->y = dys - h;
922ce27eb683 This patch adds support for vertical subtitle alignment
arpi
parents: 8451
diff changeset
943
922ce27eb683 This patch adds support for vertical subtitle alignment
arpi
parents: 8451
diff changeset
944 obj->bbox.y2 = obj->y + h;
922ce27eb683 This patch adds support for vertical subtitle alignment
arpi
parents: 8451
diff changeset
945
5640
a0cee3bb7f78 osd: calculating bbox
arpi
parents: 5638
diff changeset
946 // calculate bbox:
10263
0df8816f4665 TiVo demuxer and sub-cc/osd decoder
arpi
parents: 9036
diff changeset
947 if (sub_justify) xmin = 10;
5640
a0cee3bb7f78 osd: calculating bbox
arpi
parents: 5638
diff changeset
948 obj->bbox.x1=xmin;
a0cee3bb7f78 osd: calculating bbox
arpi
parents: 5638
diff changeset
949 obj->bbox.x2=xmax;
a0cee3bb7f78 osd: calculating bbox
arpi
parents: 5638
diff changeset
950 obj->bbox.y1=obj->y;
23338
2a66d95355f0 add new -subfont option, that allows having a different font for OSD (controls and menu) and subtitles
ben
parents: 21582
diff changeset
951 // obj->bbox.y2=obj->y+obj->params.subtitle.lines*sub_font->height;
5640
a0cee3bb7f78 osd: calculating bbox
arpi
parents: 5638
diff changeset
952 obj->flags|=OSDFLAG_BBOX;
7121
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
953
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
954 alloc_buf(obj);
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
955
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
956 y = obj->y;
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
957
13343
1a4b6e575484 This time is a patch to improve subtitle alignment management. It
faust3
parents: 12794
diff changeset
958 obj->alignment = 0;
10916
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
959 switch(vo_sub->alignment) {
13343
1a4b6e575484 This time is a patch to improve subtitle alignment management. It
faust3
parents: 12794
diff changeset
960 case SUB_ALIGNMENT_BOTTOMLEFT:
1a4b6e575484 This time is a patch to improve subtitle alignment management. It
faust3
parents: 12794
diff changeset
961 case SUB_ALIGNMENT_MIDDLELEFT:
1a4b6e575484 This time is a patch to improve subtitle alignment management. It
faust3
parents: 12794
diff changeset
962 case SUB_ALIGNMENT_TOPLEFT:
10916
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
963 obj->alignment |= 0x1;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
964 break;
13343
1a4b6e575484 This time is a patch to improve subtitle alignment management. It
faust3
parents: 12794
diff changeset
965 case SUB_ALIGNMENT_BOTTOMRIGHT:
1a4b6e575484 This time is a patch to improve subtitle alignment management. It
faust3
parents: 12794
diff changeset
966 case SUB_ALIGNMENT_MIDDLERIGHT:
1a4b6e575484 This time is a patch to improve subtitle alignment management. It
faust3
parents: 12794
diff changeset
967 case SUB_ALIGNMENT_TOPRIGHT:
1a4b6e575484 This time is a patch to improve subtitle alignment management. It
faust3
parents: 12794
diff changeset
968 obj->alignment |= 0x2;
10916
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
969 break;
13343
1a4b6e575484 This time is a patch to improve subtitle alignment management. It
faust3
parents: 12794
diff changeset
970 case SUB_ALIGNMENT_BOTTOMCENTER:
1a4b6e575484 This time is a patch to improve subtitle alignment management. It
faust3
parents: 12794
diff changeset
971 case SUB_ALIGNMENT_MIDDLECENTER:
1a4b6e575484 This time is a patch to improve subtitle alignment management. It
faust3
parents: 12794
diff changeset
972 case SUB_ALIGNMENT_TOPCENTER:
10916
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
973 default:
13343
1a4b6e575484 This time is a patch to improve subtitle alignment management. It
faust3
parents: 12794
diff changeset
974 obj->alignment |= 0x0;
10916
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
975 }
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
976
7121
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
977 i=j=0;
10916
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
978 if ((l = obj->params.subtitle.lines)) {
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
979 for(counter = dxs; i < l; ++i)
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
980 if (obj->params.subtitle.xtbl[i] < counter) counter = obj->params.subtitle.xtbl[i];
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
981 for (i = 0; i < l; ++i) {
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
982 switch (obj->alignment&0x3) {
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
983 case 1:
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
984 // left
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
985 x = counter;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
986 break;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
987 case 2:
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
988 // right
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
989 x = 2 * obj->params.subtitle.xtbl[i] - counter - ((obj->params.subtitle.xtbl[i] == counter) ? 0 : 1);
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
990 break;
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
991 default:
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
992 //center
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
993 x = obj->params.subtitle.xtbl[i];
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
994 }
7121
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
995 prevc = -1;
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
996 while ((c=obj->params.subtitle.utbl[j++])){
23338
2a66d95355f0 add new -subfont option, that allows having a different font for OSD (controls and menu) and subtitles
ben
parents: 21582
diff changeset
997 x += kerning(sub_font,prevc,c);
2a66d95355f0 add new -subfont option, that allows having a different font for OSD (controls and menu) and subtitles
ben
parents: 21582
diff changeset
998 if ((font=sub_font->font[c])>=0)
7121
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
999 draw_alpha_buf(obj,x,y,
23338
2a66d95355f0 add new -subfont option, that allows having a different font for OSD (controls and menu) and subtitles
ben
parents: 21582
diff changeset
1000 sub_font->width[c],
2a66d95355f0 add new -subfont option, that allows having a different font for OSD (controls and menu) and subtitles
ben
parents: 21582
diff changeset
1001 sub_font->pic_a[font]->h+y<obj->dys ? sub_font->pic_a[font]->h : obj->dys-y,
2a66d95355f0 add new -subfont option, that allows having a different font for OSD (controls and menu) and subtitles
ben
parents: 21582
diff changeset
1002 sub_font->pic_b[font]->bmp+sub_font->start[c],
2a66d95355f0 add new -subfont option, that allows having a different font for OSD (controls and menu) and subtitles
ben
parents: 21582
diff changeset
1003 sub_font->pic_a[font]->bmp+sub_font->start[c],
2a66d95355f0 add new -subfont option, that allows having a different font for OSD (controls and menu) and subtitles
ben
parents: 21582
diff changeset
1004 sub_font->pic_a[font]->w);
2a66d95355f0 add new -subfont option, that allows having a different font for OSD (controls and menu) and subtitles
ben
parents: 21582
diff changeset
1005 x+=sub_font->width[c]+sub_font->charspace;
7121
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
1006 prevc = c;
10916
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
1007 }
23338
2a66d95355f0 add new -subfont option, that allows having a different font for OSD (controls and menu) and subtitles
ben
parents: 21582
diff changeset
1008 y+=sub_font->height;
10916
c36db88bfbc4 Subtitle alignment & smart splitting by Salvatore Falco
henry
parents: 10263
diff changeset
1009 }
7121
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
1010 }
5640
a0cee3bb7f78 osd: calculating bbox
arpi
parents: 5638
diff changeset
1011
5638
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1012 }
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1013
6190
bd6748605681 Bounding box and partial update patch for vob/dvdsub by Hephooey.
atmos4
parents: 6110
diff changeset
1014 inline static void vo_update_spudec_sub(mp_osd_obj_t* obj, int dxs, int dys)
bd6748605681 Bounding box and partial update patch for vob/dvdsub by Hephooey.
atmos4
parents: 6110
diff changeset
1015 {
bd6748605681 Bounding box and partial update patch for vob/dvdsub by Hephooey.
atmos4
parents: 6110
diff changeset
1016 unsigned int bbox[4];
bd6748605681 Bounding box and partial update patch for vob/dvdsub by Hephooey.
atmos4
parents: 6110
diff changeset
1017 spudec_calc_bbox(vo_spudec, dxs, dys, bbox);
bd6748605681 Bounding box and partial update patch for vob/dvdsub by Hephooey.
atmos4
parents: 6110
diff changeset
1018 obj->bbox.x1 = bbox[0];
bd6748605681 Bounding box and partial update patch for vob/dvdsub by Hephooey.
atmos4
parents: 6110
diff changeset
1019 obj->bbox.x2 = bbox[1];
bd6748605681 Bounding box and partial update patch for vob/dvdsub by Hephooey.
atmos4
parents: 6110
diff changeset
1020 obj->bbox.y1 = bbox[2];
bd6748605681 Bounding box and partial update patch for vob/dvdsub by Hephooey.
atmos4
parents: 6110
diff changeset
1021 obj->bbox.y2 = bbox[3];
bd6748605681 Bounding box and partial update patch for vob/dvdsub by Hephooey.
atmos4
parents: 6110
diff changeset
1022 obj->flags |= OSDFLAG_BBOX;
bd6748605681 Bounding box and partial update patch for vob/dvdsub by Hephooey.
atmos4
parents: 6110
diff changeset
1023 }
bd6748605681 Bounding box and partial update patch for vob/dvdsub by Hephooey.
atmos4
parents: 6110
diff changeset
1024
bd6748605681 Bounding box and partial update patch for vob/dvdsub by Hephooey.
atmos4
parents: 6110
diff changeset
1025 inline static void vo_draw_spudec_sub(mp_osd_obj_t* obj, void (*draw_alpha)(int x0, int y0, int w, int h, unsigned char* src, unsigned char* srca, int stride))
bd6748605681 Bounding box and partial update patch for vob/dvdsub by Hephooey.
atmos4
parents: 6110
diff changeset
1026 {
bd6748605681 Bounding box and partial update patch for vob/dvdsub by Hephooey.
atmos4
parents: 6110
diff changeset
1027 spudec_draw_scaled(vo_spudec, obj->dxs, obj->dys, draw_alpha);
bd6748605681 Bounding box and partial update patch for vob/dvdsub by Hephooey.
atmos4
parents: 6110
diff changeset
1028 }
218
fbfc2077ba72 sub/osd interface changes
arpi_esp
parents: 213
diff changeset
1029
3034
24d3dca4e813 DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents: 2498
diff changeset
1030 void *vo_spudec=NULL;
4081
9e581ab5e54b Add vobsub support, suppress conditionnal on USE_DVDREAD.
kmkaplan
parents: 3180
diff changeset
1031 void *vo_vobsub=NULL;
3034
24d3dca4e813 DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents: 2498
diff changeset
1032
947
76fd9463b9d3 FAST_OSD option to disable font outline antialiasing
arpi_esp
parents: 865
diff changeset
1033 static int draw_alpha_init_flag=0;
218
fbfc2077ba72 sub/osd interface changes
arpi_esp
parents: 213
diff changeset
1034
17566
f580a7755ac5 Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents: 16923
diff changeset
1035 extern void vo_draw_alpha_init(void);
1109
a013b2124f05 -Wall like fixes
al3x
parents: 947
diff changeset
1036
7067
b395b1240954 fix dxr3 subtitle handling and add some optimizations
pontscho
parents: 7003
diff changeset
1037 mp_osd_obj_t* vo_osd_list=NULL;
218
fbfc2077ba72 sub/osd interface changes
arpi_esp
parents: 213
diff changeset
1038
18950
a943bc3f26c8 Make some functions static.
uau
parents: 18935
diff changeset
1039 static mp_osd_obj_t* new_osd_obj(int type){
5638
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1040 mp_osd_obj_t* osd=malloc(sizeof(mp_osd_obj_t));
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1041 memset(osd,0,sizeof(mp_osd_obj_t));
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1042 osd->next=vo_osd_list;
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1043 vo_osd_list=osd;
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1044 osd->type=type;
7121
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
1045 osd->alpha_buffer = NULL;
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
1046 osd->bitmap_buffer = NULL;
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
1047 osd->allocated = -1;
5638
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1048 return osd;
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1049 }
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1050
17566
f580a7755ac5 Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents: 16923
diff changeset
1051 void free_osd_list(void){
5638
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1052 mp_osd_obj_t* obj=vo_osd_list;
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1053 while(obj){
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1054 mp_osd_obj_t* next=obj->next;
7121
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
1055 if (obj->alpha_buffer) free(obj->alpha_buffer);
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
1056 if (obj->bitmap_buffer) free(obj->bitmap_buffer);
5638
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1057 free(obj);
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1058 obj=next;
4081
9e581ab5e54b Add vobsub support, suppress conditionnal on USE_DVDREAD.
kmkaplan
parents: 3180
diff changeset
1059 }
5638
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1060 vo_osd_list=NULL;
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1061 }
4081
9e581ab5e54b Add vobsub support, suppress conditionnal on USE_DVDREAD.
kmkaplan
parents: 3180
diff changeset
1062
15085
1f8a1de5585c defer loading of the font after display size change to avoid useless
henry
parents: 15078
diff changeset
1063 #define FONT_LOAD_DEFER 6
1f8a1de5585c defer loading of the font after display size change to avoid useless
henry
parents: 15078
diff changeset
1064
5638
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1065 int vo_update_osd(int dxs,int dys){
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1066 mp_osd_obj_t* obj=vo_osd_list;
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1067 int chg=0;
15085
1f8a1de5585c defer loading of the font after display size change to avoid useless
henry
parents: 15078
diff changeset
1068 #ifdef HAVE_FREETYPE
1f8a1de5585c defer loading of the font after display size change to avoid useless
henry
parents: 15078
diff changeset
1069 static int defer_counter = 0, prev_dxs = 0, prev_dys = 0;
1f8a1de5585c defer loading of the font after display size change to avoid useless
henry
parents: 15078
diff changeset
1070 #endif
7121
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
1071
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
1072 #ifdef HAVE_FREETYPE
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
1073 // here is the right place to get screen dimensions
15085
1f8a1de5585c defer loading of the font after display size change to avoid useless
henry
parents: 15078
diff changeset
1074 if (((dxs != vo_image_width)
1f8a1de5585c defer loading of the font after display size change to avoid useless
henry
parents: 15078
diff changeset
1075 && (subtitle_autoscale == 2 || subtitle_autoscale == 3))
1f8a1de5585c defer loading of the font after display size change to avoid useless
henry
parents: 15078
diff changeset
1076 || ((dys != vo_image_height)
1f8a1de5585c defer loading of the font after display size change to avoid useless
henry
parents: 15078
diff changeset
1077 && (subtitle_autoscale == 1 || subtitle_autoscale == 3)))
1f8a1de5585c defer loading of the font after display size change to avoid useless
henry
parents: 15078
diff changeset
1078 {
1f8a1de5585c defer loading of the font after display size change to avoid useless
henry
parents: 15078
diff changeset
1079 // screen dimensions changed
1f8a1de5585c defer loading of the font after display size change to avoid useless
henry
parents: 15078
diff changeset
1080 // wait a while to avoid useless reloading of the font
1f8a1de5585c defer loading of the font after display size change to avoid useless
henry
parents: 15078
diff changeset
1081 if (dxs == prev_dxs || dys == prev_dys) {
1f8a1de5585c defer loading of the font after display size change to avoid useless
henry
parents: 15078
diff changeset
1082 defer_counter++;
1f8a1de5585c defer loading of the font after display size change to avoid useless
henry
parents: 15078
diff changeset
1083 } else {
1f8a1de5585c defer loading of the font after display size change to avoid useless
henry
parents: 15078
diff changeset
1084 prev_dxs = dxs;
1f8a1de5585c defer loading of the font after display size change to avoid useless
henry
parents: 15078
diff changeset
1085 prev_dys = dys;
1f8a1de5585c defer loading of the font after display size change to avoid useless
henry
parents: 15078
diff changeset
1086 defer_counter = 0;
1f8a1de5585c defer loading of the font after display size change to avoid useless
henry
parents: 15078
diff changeset
1087 }
1f8a1de5585c defer loading of the font after display size change to avoid useless
henry
parents: 15078
diff changeset
1088 if (defer_counter >= FONT_LOAD_DEFER) force_load_font = 1;
1f8a1de5585c defer loading of the font after display size change to avoid useless
henry
parents: 15078
diff changeset
1089 }
1f8a1de5585c defer loading of the font after display size change to avoid useless
henry
parents: 15078
diff changeset
1090
23338
2a66d95355f0 add new -subfont option, that allows having a different font for OSD (controls and menu) and subtitles
ben
parents: 21582
diff changeset
1091 if (force_load_font) {
7121
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
1092 force_load_font = 0;
23338
2a66d95355f0 add new -subfont option, that allows having a different font for OSD (controls and menu) and subtitles
ben
parents: 21582
diff changeset
1093 load_font_ft(dxs, dys, &vo_font, font_name);
23742
93c871be0258 Use -font for subtitles when -subfont is not given, patch by kiriuja
zuxy
parents: 23573
diff changeset
1094 if (sub_font_name)
93c871be0258 Use -font for subtitles when -subfont is not given, patch by kiriuja
zuxy
parents: 23573
diff changeset
1095 load_font_ft(dxs, dys, &sub_font, sub_font_name);
93c871be0258 Use -font for subtitles when -subfont is not given, patch by kiriuja
zuxy
parents: 23573
diff changeset
1096 else
93c871be0258 Use -font for subtitles when -subfont is not given, patch by kiriuja
zuxy
parents: 23573
diff changeset
1097 sub_font = vo_font;
15085
1f8a1de5585c defer loading of the font after display size change to avoid useless
henry
parents: 15078
diff changeset
1098 prev_dxs = dxs;
1f8a1de5585c defer loading of the font after display size change to avoid useless
henry
parents: 15078
diff changeset
1099 prev_dys = dys;
1f8a1de5585c defer loading of the font after display size change to avoid useless
henry
parents: 15078
diff changeset
1100 defer_counter = 0;
23338
2a66d95355f0 add new -subfont option, that allows having a different font for OSD (controls and menu) and subtitles
ben
parents: 21582
diff changeset
1101 } else {
2a66d95355f0 add new -subfont option, that allows having a different font for OSD (controls and menu) and subtitles
ben
parents: 21582
diff changeset
1102 if (!vo_font)
2a66d95355f0 add new -subfont option, that allows having a different font for OSD (controls and menu) and subtitles
ben
parents: 21582
diff changeset
1103 load_font_ft(dxs, dys, &vo_font, font_name);
24582
6d5999a6b4e2 warning fix:
diego
parents: 24378
diff changeset
1104 if (!sub_font) {
23742
93c871be0258 Use -font for subtitles when -subfont is not given, patch by kiriuja
zuxy
parents: 23573
diff changeset
1105 if (sub_font_name)
93c871be0258 Use -font for subtitles when -subfont is not given, patch by kiriuja
zuxy
parents: 23573
diff changeset
1106 load_font_ft(dxs, dys, &sub_font, sub_font_name);
93c871be0258 Use -font for subtitles when -subfont is not given, patch by kiriuja
zuxy
parents: 23573
diff changeset
1107 else
93c871be0258 Use -font for subtitles when -subfont is not given, patch by kiriuja
zuxy
parents: 23573
diff changeset
1108 sub_font = vo_font;
24582
6d5999a6b4e2 warning fix:
diego
parents: 24378
diff changeset
1109 }
7121
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
1110 }
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
1111 #endif
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
1112
5638
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1113 while(obj){
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1114 if(dxs!=obj->dxs || dys!=obj->dys || obj->flags&OSDFLAG_FORCE_UPDATE){
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1115 int vis=obj->flags&OSDFLAG_VISIBLE;
5640
a0cee3bb7f78 osd: calculating bbox
arpi
parents: 5638
diff changeset
1116 obj->flags&=~OSDFLAG_BBOX;
5638
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1117 switch(obj->type){
21193
a067e7e18b50 support for dvdnav menu buttons overlay as simple alpha boxes (rework from Otvos Attila's series of patches)
ben
parents: 19366
diff changeset
1118 #ifdef USE_DVDNAV
a067e7e18b50 support for dvdnav menu buttons overlay as simple alpha boxes (rework from Otvos Attila's series of patches)
ben
parents: 19366
diff changeset
1119 case OSDTYPE_DVDNAV:
a067e7e18b50 support for dvdnav menu buttons overlay as simple alpha boxes (rework from Otvos Attila's series of patches)
ben
parents: 19366
diff changeset
1120 vo_update_nav(obj,dxs,dys);
a067e7e18b50 support for dvdnav menu buttons overlay as simple alpha boxes (rework from Otvos Attila's series of patches)
ben
parents: 19366
diff changeset
1121 break;
a067e7e18b50 support for dvdnav menu buttons overlay as simple alpha boxes (rework from Otvos Attila's series of patches)
ben
parents: 19366
diff changeset
1122 #endif
5638
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1123 case OSDTYPE_SUBTITLE:
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1124 vo_update_text_sub(obj,dxs,dys);
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1125 break;
23903
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
1126 #ifdef HAVE_TV_TELETEXT
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
1127 case OSDTYPE_TELETEXT:
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
1128 vo_update_text_teletext(obj,dxs,dys);
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
1129 break;
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
1130 #endif
5638
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1131 case OSDTYPE_PROGBAR:
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1132 vo_update_text_progbar(obj,dxs,dys);
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1133 break;
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1134 case OSDTYPE_SPU:
7628
d6608342591d This patch adds the functionality to disable/enable subtitles while playing
arpi
parents: 7121
diff changeset
1135 if(sub_visibility && vo_spudec && spudec_visible(vo_spudec)){
6190
bd6748605681 Bounding box and partial update patch for vob/dvdsub by Hephooey.
atmos4
parents: 6110
diff changeset
1136 vo_update_spudec_sub(obj, dxs, dys);
5638
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1137 obj->flags|=OSDFLAG_VISIBLE|OSDFLAG_CHANGED;
6190
bd6748605681 Bounding box and partial update patch for vob/dvdsub by Hephooey.
atmos4
parents: 6110
diff changeset
1138 }
5638
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1139 else
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1140 obj->flags&=~OSDFLAG_VISIBLE;
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1141 break;
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1142 case OSDTYPE_OSD:
5640
a0cee3bb7f78 osd: calculating bbox
arpi
parents: 5638
diff changeset
1143 if(vo_font && vo_osd_text && vo_osd_text[0]){
a0cee3bb7f78 osd: calculating bbox
arpi
parents: 5638
diff changeset
1144 vo_update_text_osd(obj,dxs,dys); // update bbox
5638
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1145 obj->flags|=OSDFLAG_VISIBLE|OSDFLAG_CHANGED;
5640
a0cee3bb7f78 osd: calculating bbox
arpi
parents: 5638
diff changeset
1146 } else
5638
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1147 obj->flags&=~OSDFLAG_VISIBLE;
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1148 break;
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1149 }
5640
a0cee3bb7f78 osd: calculating bbox
arpi
parents: 5638
diff changeset
1150 // check bbox:
a0cee3bb7f78 osd: calculating bbox
arpi
parents: 5638
diff changeset
1151 if(!(obj->flags&OSDFLAG_BBOX)){
a0cee3bb7f78 osd: calculating bbox
arpi
parents: 5638
diff changeset
1152 // we don't know, so assume the whole screen changed :(
a0cee3bb7f78 osd: calculating bbox
arpi
parents: 5638
diff changeset
1153 obj->bbox.x1=obj->bbox.y1=0;
a0cee3bb7f78 osd: calculating bbox
arpi
parents: 5638
diff changeset
1154 obj->bbox.x2=dxs;
a0cee3bb7f78 osd: calculating bbox
arpi
parents: 5638
diff changeset
1155 obj->bbox.y2=dys;
a0cee3bb7f78 osd: calculating bbox
arpi
parents: 5638
diff changeset
1156 obj->flags|=OSDFLAG_BBOX;
5664
ee6c9530729f bbox calculation fixed (font->height < real height)
arpi
parents: 5645
diff changeset
1157 } else {
ee6c9530729f bbox calculation fixed (font->height < real height)
arpi
parents: 5645
diff changeset
1158 // check bbox, reduce it if it's out of bounds (corners):
ee6c9530729f bbox calculation fixed (font->height < real height)
arpi
parents: 5645
diff changeset
1159 if(obj->bbox.x1<0) obj->bbox.x1=0;
ee6c9530729f bbox calculation fixed (font->height < real height)
arpi
parents: 5645
diff changeset
1160 if(obj->bbox.y1<0) obj->bbox.y1=0;
ee6c9530729f bbox calculation fixed (font->height < real height)
arpi
parents: 5645
diff changeset
1161 if(obj->bbox.x2>dxs) obj->bbox.x2=dxs;
ee6c9530729f bbox calculation fixed (font->height < real height)
arpi
parents: 5645
diff changeset
1162 if(obj->bbox.y2>dys) obj->bbox.y2=dys;
ee6c9530729f bbox calculation fixed (font->height < real height)
arpi
parents: 5645
diff changeset
1163 if(obj->flags&OSDFLAG_VISIBLE)
ee6c9530729f bbox calculation fixed (font->height < real height)
arpi
parents: 5645
diff changeset
1164 // debug:
ee6c9530729f bbox calculation fixed (font->height < real height)
arpi
parents: 5645
diff changeset
1165 mp_msg(MSGT_OSD,MSGL_DBG2,"OSD update: %d;%d %dx%d \n",
5640
a0cee3bb7f78 osd: calculating bbox
arpi
parents: 5638
diff changeset
1166 obj->bbox.x1,obj->bbox.y1,obj->bbox.x2-obj->bbox.x1,
a0cee3bb7f78 osd: calculating bbox
arpi
parents: 5638
diff changeset
1167 obj->bbox.y2-obj->bbox.y1);
a0cee3bb7f78 osd: calculating bbox
arpi
parents: 5638
diff changeset
1168 }
5638
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1169 // check if visibility changed:
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1170 if(vis != (obj->flags&OSDFLAG_VISIBLE) ) obj->flags|=OSDFLAG_CHANGED;
5640
a0cee3bb7f78 osd: calculating bbox
arpi
parents: 5638
diff changeset
1171 // remove the cause of automatic update:
5638
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1172 obj->dxs=dxs; obj->dys=dys;
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1173 obj->flags&=~OSDFLAG_FORCE_UPDATE;
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1174 }
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1175 if(obj->flags&OSDFLAG_CHANGED){
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1176 chg|=1<<obj->type;
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1177 mp_msg(MSGT_OSD,MSGL_DBG2,"OSD chg: %d V: %s pb:%d \n",obj->type,(obj->flags&OSDFLAG_VISIBLE)?"yes":"no",vo_osd_progbar_type);
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1178 }
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1179 obj=obj->next;
4081
9e581ab5e54b Add vobsub support, suppress conditionnal on USE_DVDREAD.
kmkaplan
parents: 3180
diff changeset
1180 }
5638
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1181 return chg;
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1182 }
4081
9e581ab5e54b Add vobsub support, suppress conditionnal on USE_DVDREAD.
kmkaplan
parents: 3180
diff changeset
1183
17566
f580a7755ac5 Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents: 16923
diff changeset
1184 void vo_init_osd(void){
947
76fd9463b9d3 FAST_OSD option to disable font outline antialiasing
arpi_esp
parents: 865
diff changeset
1185 if(!draw_alpha_init_flag){
76fd9463b9d3 FAST_OSD option to disable font outline antialiasing
arpi_esp
parents: 865
diff changeset
1186 draw_alpha_init_flag=1;
76fd9463b9d3 FAST_OSD option to disable font outline antialiasing
arpi_esp
parents: 865
diff changeset
1187 vo_draw_alpha_init();
76fd9463b9d3 FAST_OSD option to disable font outline antialiasing
arpi_esp
parents: 865
diff changeset
1188 }
6110
7bea806b9c5f Improvment for spu subtitles.
albeu
parents: 5664
diff changeset
1189 if(vo_osd_list) free_osd_list();
5638
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1190 // temp hack, should be moved to mplayer/mencoder later
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1191 new_osd_obj(OSDTYPE_OSD);
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1192 new_osd_obj(OSDTYPE_SUBTITLE);
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1193 new_osd_obj(OSDTYPE_PROGBAR);
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1194 new_osd_obj(OSDTYPE_SPU);
21193
a067e7e18b50 support for dvdnav menu buttons overlay as simple alpha boxes (rework from Otvos Attila's series of patches)
ben
parents: 19366
diff changeset
1195 #ifdef USE_DVDNAV
a067e7e18b50 support for dvdnav menu buttons overlay as simple alpha boxes (rework from Otvos Attila's series of patches)
ben
parents: 19366
diff changeset
1196 new_osd_obj(OSDTYPE_DVDNAV);
a067e7e18b50 support for dvdnav menu buttons overlay as simple alpha boxes (rework from Otvos Attila's series of patches)
ben
parents: 19366
diff changeset
1197 #endif
23903
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
1198 #if HAVE_TV_TELETEXT
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
1199 new_osd_obj(OSDTYPE_TELETEXT);
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
1200 #endif
7121
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
1201 #ifdef HAVE_FREETYPE
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
1202 force_load_font = 1;
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
1203 #endif
5638
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1204 }
947
76fd9463b9d3 FAST_OSD option to disable font outline antialiasing
arpi_esp
parents: 865
diff changeset
1205
5642
eb0cb6185e6c osd: ok, now it's possible to do partial draw/clear of the buffer only if changed
arpi
parents: 5640
diff changeset
1206 int vo_osd_changed_flag=0;
eb0cb6185e6c osd: ok, now it's possible to do partial draw/clear of the buffer only if changed
arpi
parents: 5640
diff changeset
1207
eb0cb6185e6c osd: ok, now it's possible to do partial draw/clear of the buffer only if changed
arpi
parents: 5640
diff changeset
1208 void vo_remove_text(int dxs,int dys,void (*remove)(int x0,int y0, int w,int h)){
eb0cb6185e6c osd: ok, now it's possible to do partial draw/clear of the buffer only if changed
arpi
parents: 5640
diff changeset
1209 mp_osd_obj_t* obj=vo_osd_list;
eb0cb6185e6c osd: ok, now it's possible to do partial draw/clear of the buffer only if changed
arpi
parents: 5640
diff changeset
1210 vo_update_osd(dxs,dys);
eb0cb6185e6c osd: ok, now it's possible to do partial draw/clear of the buffer only if changed
arpi
parents: 5640
diff changeset
1211 while(obj){
eb0cb6185e6c osd: ok, now it's possible to do partial draw/clear of the buffer only if changed
arpi
parents: 5640
diff changeset
1212 if(((obj->flags&OSDFLAG_CHANGED) || (obj->flags&OSDFLAG_VISIBLE)) &&
eb0cb6185e6c osd: ok, now it's possible to do partial draw/clear of the buffer only if changed
arpi
parents: 5640
diff changeset
1213 (obj->flags&OSDFLAG_OLD_BBOX)){
eb0cb6185e6c osd: ok, now it's possible to do partial draw/clear of the buffer only if changed
arpi
parents: 5640
diff changeset
1214 int w=obj->old_bbox.x2-obj->old_bbox.x1;
eb0cb6185e6c osd: ok, now it's possible to do partial draw/clear of the buffer only if changed
arpi
parents: 5640
diff changeset
1215 int h=obj->old_bbox.y2-obj->old_bbox.y1;
eb0cb6185e6c osd: ok, now it's possible to do partial draw/clear of the buffer only if changed
arpi
parents: 5640
diff changeset
1216 if(w>0 && h>0){
eb0cb6185e6c osd: ok, now it's possible to do partial draw/clear of the buffer only if changed
arpi
parents: 5640
diff changeset
1217 vo_osd_changed_flag=obj->flags&OSDFLAG_CHANGED; // temp hack
eb0cb6185e6c osd: ok, now it's possible to do partial draw/clear of the buffer only if changed
arpi
parents: 5640
diff changeset
1218 remove(obj->old_bbox.x1,obj->old_bbox.y1,w,h);
eb0cb6185e6c osd: ok, now it's possible to do partial draw/clear of the buffer only if changed
arpi
parents: 5640
diff changeset
1219 }
eb0cb6185e6c osd: ok, now it's possible to do partial draw/clear of the buffer only if changed
arpi
parents: 5640
diff changeset
1220 // obj->flags&=~OSDFLAG_OLD_BBOX;
eb0cb6185e6c osd: ok, now it's possible to do partial draw/clear of the buffer only if changed
arpi
parents: 5640
diff changeset
1221 }
5645
bd5c0d8346f0 vo_osd_check_range_update() added + 10l fix
arpi
parents: 5642
diff changeset
1222 obj=obj->next;
5642
eb0cb6185e6c osd: ok, now it's possible to do partial draw/clear of the buffer only if changed
arpi
parents: 5640
diff changeset
1223 }
eb0cb6185e6c osd: ok, now it's possible to do partial draw/clear of the buffer only if changed
arpi
parents: 5640
diff changeset
1224 }
eb0cb6185e6c osd: ok, now it's possible to do partial draw/clear of the buffer only if changed
arpi
parents: 5640
diff changeset
1225
5638
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1226 void vo_draw_text(int dxs,int dys,void (*draw_alpha)(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride)){
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1227 mp_osd_obj_t* obj=vo_osd_list;
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1228 vo_update_osd(dxs,dys);
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1229 while(obj){
5642
eb0cb6185e6c osd: ok, now it's possible to do partial draw/clear of the buffer only if changed
arpi
parents: 5640
diff changeset
1230 if(obj->flags&OSDFLAG_VISIBLE){
eb0cb6185e6c osd: ok, now it's possible to do partial draw/clear of the buffer only if changed
arpi
parents: 5640
diff changeset
1231 vo_osd_changed_flag=obj->flags&OSDFLAG_CHANGED; // temp hack
5638
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1232 switch(obj->type){
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1233 case OSDTYPE_SPU:
6190
bd6748605681 Bounding box and partial update patch for vob/dvdsub by Hephooey.
atmos4
parents: 6110
diff changeset
1234 vo_draw_spudec_sub(obj, draw_alpha); // FIXME
5638
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1235 break;
21193
a067e7e18b50 support for dvdnav menu buttons overlay as simple alpha boxes (rework from Otvos Attila's series of patches)
ben
parents: 19366
diff changeset
1236 #ifdef USE_DVDNAV
a067e7e18b50 support for dvdnav menu buttons overlay as simple alpha boxes (rework from Otvos Attila's series of patches)
ben
parents: 19366
diff changeset
1237 case OSDTYPE_DVDNAV:
a067e7e18b50 support for dvdnav menu buttons overlay as simple alpha boxes (rework from Otvos Attila's series of patches)
ben
parents: 19366
diff changeset
1238 #endif
23903
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
1239 #ifdef HAVE_TV_TELETEXT
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
1240 case OSDTYPE_TELETEXT:
037737866f6a Teletext support
voroshil
parents: 23742
diff changeset
1241 #endif
5638
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1242 case OSDTYPE_OSD:
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1243 case OSDTYPE_SUBTITLE:
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1244 case OSDTYPE_PROGBAR:
7121
6abc330b5b32 subtitle/osd cache - pre-render text to a buffer with alpha and bitmap separated
arpi
parents: 7067
diff changeset
1245 vo_draw_text_from_buffer(obj,draw_alpha);
5638
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1246 break;
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1247 }
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1248 obj->old_bbox=obj->bbox;
5642
eb0cb6185e6c osd: ok, now it's possible to do partial draw/clear of the buffer only if changed
arpi
parents: 5640
diff changeset
1249 obj->flags|=OSDFLAG_OLD_BBOX;
eb0cb6185e6c osd: ok, now it's possible to do partial draw/clear of the buffer only if changed
arpi
parents: 5640
diff changeset
1250 }
eb0cb6185e6c osd: ok, now it's possible to do partial draw/clear of the buffer only if changed
arpi
parents: 5640
diff changeset
1251 obj->flags&=~OSDFLAG_CHANGED;
eb0cb6185e6c osd: ok, now it's possible to do partial draw/clear of the buffer only if changed
arpi
parents: 5640
diff changeset
1252 obj=obj->next;
218
fbfc2077ba72 sub/osd interface changes
arpi_esp
parents: 213
diff changeset
1253 }
5638
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1254 }
3034
24d3dca4e813 DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents: 2498
diff changeset
1255
4807
156482788caf osd outside movie support for vo_sdl, patch by Fredrik Kuivinen
atmos4
parents: 4773
diff changeset
1256 static int vo_osd_changed_status = 0;
156482788caf osd outside movie support for vo_sdl, patch by Fredrik Kuivinen
atmos4
parents: 4773
diff changeset
1257
156482788caf osd outside movie support for vo_sdl, patch by Fredrik Kuivinen
atmos4
parents: 4773
diff changeset
1258 int vo_osd_changed(int new_value)
156482788caf osd outside movie support for vo_sdl, patch by Fredrik Kuivinen
atmos4
parents: 4773
diff changeset
1259 {
5638
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1260 mp_osd_obj_t* obj=vo_osd_list;
4807
156482788caf osd outside movie support for vo_sdl, patch by Fredrik Kuivinen
atmos4
parents: 4773
diff changeset
1261 int ret = vo_osd_changed_status;
156482788caf osd outside movie support for vo_sdl, patch by Fredrik Kuivinen
atmos4
parents: 4773
diff changeset
1262 vo_osd_changed_status = new_value;
5638
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1263
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1264 while(obj){
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1265 if(obj->type==new_value) obj->flags|=OSDFLAG_FORCE_UPDATE;
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1266 obj=obj->next;
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1267 }
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1268
4807
156482788caf osd outside movie support for vo_sdl, patch by Fredrik Kuivinen
atmos4
parents: 4773
diff changeset
1269 return ret;
156482788caf osd outside movie support for vo_sdl, patch by Fredrik Kuivinen
atmos4
parents: 4773
diff changeset
1270 }
5638
86663f1b9b00 new osd code, use osd objs to follow changes and do minimal updates
arpi
parents: 5503
diff changeset
1271
5645
bd5c0d8346f0 vo_osd_check_range_update() added + 10l fix
arpi
parents: 5642
diff changeset
1272 // BBBBBBBBBBBB AAAAAAAAAAAAA BBBBBBBBBBB
bd5c0d8346f0 vo_osd_check_range_update() added + 10l fix
arpi
parents: 5642
diff changeset
1273 // BBBBBBBBBBBB BBBBBBBBBBBBB
bd5c0d8346f0 vo_osd_check_range_update() added + 10l fix
arpi
parents: 5642
diff changeset
1274 // BBBBBBB
bd5c0d8346f0 vo_osd_check_range_update() added + 10l fix
arpi
parents: 5642
diff changeset
1275
bd5c0d8346f0 vo_osd_check_range_update() added + 10l fix
arpi
parents: 5642
diff changeset
1276 // return TRUE if we have osd in the specified rectangular area:
bd5c0d8346f0 vo_osd_check_range_update() added + 10l fix
arpi
parents: 5642
diff changeset
1277 int vo_osd_check_range_update(int x1,int y1,int x2,int y2){
bd5c0d8346f0 vo_osd_check_range_update() added + 10l fix
arpi
parents: 5642
diff changeset
1278 mp_osd_obj_t* obj=vo_osd_list;
bd5c0d8346f0 vo_osd_check_range_update() added + 10l fix
arpi
parents: 5642
diff changeset
1279 while(obj){
bd5c0d8346f0 vo_osd_check_range_update() added + 10l fix
arpi
parents: 5642
diff changeset
1280 if(obj->flags&OSDFLAG_VISIBLE){
bd5c0d8346f0 vo_osd_check_range_update() added + 10l fix
arpi
parents: 5642
diff changeset
1281 if( (obj->bbox.x1<=x2 && obj->bbox.x2>=x1) &&
21364
d81ffbf9615f EMISSINGBRAIN: No, OSD objects of size 0 sure are _not_ visible.
reimar
parents: 21219
diff changeset
1282 (obj->bbox.y1<=y2 && obj->bbox.y2>=y1) &&
21443
862b3942429c 100l typo in 21380 disabled OSD with at least xvmc.
reimar
parents: 21364
diff changeset
1283 obj->bbox.y2 > obj->bbox.y1 && obj->bbox.x2 > obj->bbox.x1
21364
d81ffbf9615f EMISSINGBRAIN: No, OSD objects of size 0 sure are _not_ visible.
reimar
parents: 21219
diff changeset
1284 ) return 1;
5645
bd5c0d8346f0 vo_osd_check_range_update() added + 10l fix
arpi
parents: 5642
diff changeset
1285 }
bd5c0d8346f0 vo_osd_check_range_update() added + 10l fix
arpi
parents: 5642
diff changeset
1286 obj=obj->next;
bd5c0d8346f0 vo_osd_check_range_update() added + 10l fix
arpi
parents: 5642
diff changeset
1287 }
bd5c0d8346f0 vo_osd_check_range_update() added + 10l fix
arpi
parents: 5642
diff changeset
1288 return 0;
bd5c0d8346f0 vo_osd_check_range_update() added + 10l fix
arpi
parents: 5642
diff changeset
1289 }