summaryrefslogtreecommitdiffstats
path: root/libvo/sub.c
diff options
context:
space:
mode:
authorarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-04-15 20:51:34 +0000
committerarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-04-15 20:51:34 +0000
commit7fd48f48333612ba7ad5b0c56e1ad27b0d3f6655 (patch)
tree6487b70ae4bf4f499efbfe8a706d05c2a241ff54 /libvo/sub.c
parent2208f20ba3eaef8d243d4b1fcd62126bc6a4167f (diff)
downloadmpv-7fd48f48333612ba7ad5b0c56e1ad27b0d3f6655.tar.bz2
mpv-7fd48f48333612ba7ad5b0c56e1ad27b0d3f6655.tar.xz
osd: calculating bbox
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@5641 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libvo/sub.c')
-rw-r--r--libvo/sub.c74
1 files changed, 55 insertions, 19 deletions
diff --git a/libvo/sub.c b/libvo/sub.c
index bd6bda8ffa..c8a407f60a 100644
--- a/libvo/sub.c
+++ b/libvo/sub.c
@@ -32,17 +32,33 @@ int sub_unicode=0;
int sub_utf8=0;
int sub_pos=100;
-inline static void vo_draw_text_osd(int dxs,int dys,void (*draw_alpha)(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride)){
+inline static void vo_update_text_osd(mp_osd_obj_t* obj,int dxs,int dys){
+ unsigned char *cp=vo_osd_text;
+ int x=20;
+
+ obj->bbox.x1=obj->x=x;
+ obj->bbox.y1=obj->y=10;
+
+ while (*cp){
+ int c=*cp++;
+ x+=vo_font->width[c]+vo_font->charspace;
+ }
+
+ obj->bbox.x2=x;
+ obj->bbox.y2=obj->bbox.y1+vo_font->height;
+ obj->flags|=OSDFLAG_BBOX;
+
+}
+
+inline static void vo_draw_text_osd(mp_osd_obj_t* obj,void (*draw_alpha)(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride)){
unsigned char *cp=vo_osd_text;
- int c;
int font;
- int y=10;
- int x=20;
+ int x=obj->x;
while (*cp){
- c=*cp++;
+ int c=*cp++;
if ((font=vo_font->font[c])>=0)
- draw_alpha(x,y,
+ draw_alpha(x,obj->y,
vo_font->width[c],
vo_font->pic_a[font]->h,
vo_font->pic_b[font]->bmp+vo_font->start[c],
@@ -50,7 +66,6 @@ inline static void vo_draw_text_osd(int dxs,int dys,void (*draw_alpha)(int x0,in
vo_font->pic_a[font]->w);
x+=vo_font->width[c]+vo_font->charspace;
}
-
}
int vo_osd_progbar_type=-1;
@@ -86,6 +101,7 @@ inline static void vo_update_text_progbar(mp_osd_obj_t* obj,int dxs,int dys){
obj->bbox.y1=obj->y=y;
obj->bbox.x2=x+width+delimw;
obj->bbox.y2=y+vo_font->height;
+ obj->flags|=OSDFLAG_BBOX;
obj->params.progbar.elems=elems;
}
@@ -186,6 +202,7 @@ inline static void vo_update_text_sub(mp_osd_obj_t* obj,int dxs,int dys){
int k,lastk;
int lastStripPosition;
int xsize,lastxsize;
+ int xmin=dxs,xmax=0;
int h,lasth;
obj->flags|=OSDFLAG_CHANGED|OSDFLAG_VISIBLE;
@@ -259,6 +276,8 @@ inline static void vo_update_text_sub(mp_osd_obj_t* obj,int dxs,int dys){
}
obj->params.subtitle.utbl[k++]=0;
obj->params.subtitle.xtbl[obj->params.subtitle.lines++]=(dxs-xsize)/2;
+ if(xmin>(dxs-xsize)/2) xmin=(dxs-xsize)/2;
+ if(xmax<(dxs+xsize)/2) xmax=(dxs+xsize)/2;
if (obj->params.subtitle.lines==MAX_UCSLINES||k>MAX_UCS){
l=0; len=j; // end parsing
} else if(l || j<len){ // not the last line or not the last char
@@ -271,18 +290,21 @@ inline static void vo_update_text_sub(mp_osd_obj_t* obj,int dxs,int dys){
obj->y -=h; // according to max of vo_font->pic_a[font]->h
}
}
+
+ if (obj->y >= (dys * sub_pos / 100)) obj->y = dys * sub_pos /100;
- // TODO: calculate bbox
-
+ // calculate bbox:
+ obj->bbox.x1=xmin;
+ obj->bbox.x2=xmax;
+ obj->bbox.y1=obj->y;
+ obj->bbox.y2=obj->y+obj->params.subtitle.lines*vo_font->height;
+ obj->flags|=OSDFLAG_BBOX;
+
}
inline static void vo_draw_text_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)){
- int y,i,j,c,x,l,font;
-
- // FIXME (bbox):
- if (obj->y < (obj->dys * sub_pos / 100)) { y = obj->y; } else { y = obj->dys * sub_pos /100;};
-
-// printf("lines=%d y=%d\n",lines,y);
+ int i,j,c,x,l,font;
+ int y=obj->y;
i=j=0;
if ((l=obj->params.subtitle.lines)) for (;;) {
@@ -336,6 +358,7 @@ int vo_update_osd(int dxs,int dys){
while(obj){
if(dxs!=obj->dxs || dys!=obj->dys || obj->flags&OSDFLAG_FORCE_UPDATE){
int vis=obj->flags&OSDFLAG_VISIBLE;
+ obj->flags&=~OSDFLAG_BBOX;
switch(obj->type){
case OSDTYPE_SUBTITLE:
vo_update_text_sub(obj,dxs,dys);
@@ -356,15 +379,28 @@ int vo_update_osd(int dxs,int dys){
obj->flags&=~OSDFLAG_VISIBLE;
break;
case OSDTYPE_OSD:
- if(vo_font && vo_osd_text && vo_osd_text[0])
+ if(vo_font && vo_osd_text && vo_osd_text[0]){
+ vo_update_text_osd(obj,dxs,dys); // update bbox
obj->flags|=OSDFLAG_VISIBLE|OSDFLAG_CHANGED;
- else
+ } else
obj->flags&=~OSDFLAG_VISIBLE;
break;
}
+ // check bbox:
+ if(!(obj->flags&OSDFLAG_BBOX)){
+ // we don't know, so assume the whole screen changed :(
+ obj->bbox.x1=obj->bbox.y1=0;
+ obj->bbox.x2=dxs;
+ obj->bbox.y2=dys;
+ obj->flags|=OSDFLAG_BBOX;
+ } else if(obj->flags&OSDFLAG_VISIBLE){
+ mp_msg(MSGT_OSD,MSGL_V,"OSD update: %d;%d %dx%d \n",
+ obj->bbox.x1,obj->bbox.y1,obj->bbox.x2-obj->bbox.x1,
+ obj->bbox.y2-obj->bbox.y1);
+ }
// check if visibility changed:
if(vis != (obj->flags&OSDFLAG_VISIBLE) ) obj->flags|=OSDFLAG_CHANGED;
- // remove the cause of updating:
+ // remove the cause of automatic update:
obj->dxs=dxs; obj->dys=dys;
obj->flags&=~OSDFLAG_FORCE_UPDATE;
}
@@ -406,7 +442,7 @@ void vo_draw_text(int dxs,int dys,void (*draw_alpha)(int x0,int y0, int w,int h,
vobsub_draw(vo_vobsub, dxs, dys, draw_alpha); // FIXME
break;
case OSDTYPE_OSD:
- vo_draw_text_osd(dxs,dys,draw_alpha);
+ vo_draw_text_osd(obj,draw_alpha);
break;
case OSDTYPE_SUBTITLE:
vo_draw_text_sub(obj,draw_alpha);