summaryrefslogtreecommitdiffstats
path: root/libvo/sub.c
diff options
context:
space:
mode:
authorarpi_esp <arpi_esp@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-05-14 22:08:12 +0000
committerarpi_esp <arpi_esp@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-05-14 22:08:12 +0000
commit3d5aea95552d007e9c59c0bb39d9f9959b2d34d5 (patch)
treedd1217c65b0d76acd47a469589f7807b25f604d3 /libvo/sub.c
parentf9a470357cc629fc5809c3b412c97e0ea3895f37 (diff)
downloadmpv-3d5aea95552d007e9c59c0bb39d9f9959b2d34d5.tar.bz2
mpv-3d5aea95552d007e9c59c0bb39d9f9959b2d34d5.tar.xz
sub splitting patch applied by Vlada V.Dubsky@sh.cvut.cz
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@804 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libvo/sub.c')
-rw-r--r--libvo/sub.c108
1 files changed, 79 insertions, 29 deletions
diff --git a/libvo/sub.c b/libvo/sub.c
index 8610e27bde..274232d5da 100644
--- a/libvo/sub.c
+++ b/libvo/sub.c
@@ -5,6 +5,7 @@
font_desc_t* vo_font=NULL;
unsigned char* vo_osd_text="00:00:00";
+int sub_unicode=0;
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)){
int len=strlen(vo_osd_text);
@@ -82,57 +83,105 @@ void vo_draw_text_progbar(int dxs,int dys,void (*draw_alpha)(int x0,int y0, int
vo_font->pic_a[font]->bmp+vo_font->start[c],
vo_font->pic_a[font]->w);
// x+=vo_font->width[c];
-
+
// vo_osd_progbar_value=(vo_osd_progbar_value+1)&0xFF;
}
subtitle* vo_sub=NULL;
-int sub_unicode=0;
void 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)){
int i;
int y;
+ y=dys-(1+vo_sub->lines-1)*vo_font->height-10;
- y=dys-(1+vo_sub->lines)*vo_font->height;
-
+ // too long lines divide into smaller ones
for(i=0;i<vo_sub->lines;i++){
- unsigned char* text=vo_sub->text[i];// "Hello World! HÛDEJÓ!";
+ unsigned char* text=vo_sub->text[i];
int len=strlen(text);
- int j;
+ int j,k;
int xsize=-vo_font->charspace;
int x=0;
- for(j=0;j<len;j++){
+ int lastStripPosition=-1;
+ int previousStrip=0;
+ int lastxsize=0;
+
+ for(j=0;j<len;j++){
int c=text[j];
- int w = vo_font->width[sub_unicode?((c<0x80)?c:(c<<8)+text[++j]):c];
- if(w>100) printf("gazvan: %d (%d=%c)\n",w,c,c);
+ int w;
+ if (sub_unicode && (c>=0x80)) c=(c<<8)+text[++j];
+ w = vo_font->width[c];
+ if (text[j]==' ' && dxs>xsize)
+ {
+ lastStripPosition=j;
+ lastxsize=xsize;
+ }
xsize+=w+vo_font->charspace;
+ if (dxs<xsize & lastStripPosition>0)
+ {
+ xsize=lastxsize;
+ j=lastStripPosition;
+ y-=vo_font->height;
+ previousStrip=lastStripPosition;
+ xsize=-vo_font->charspace;
+ }
}
- //printf("text width = %d\n",xsize);
-
- //if(xsize>dxs) printf("Warning! SUB too wide!!! (%d>%d)\n",xsize,dxs);
-
- x=dxs/2-xsize/2;
-
- for(j=0;j<len;j++){
+ }
+
+
+ for(i=0;i<vo_sub->lines;i++){
+ unsigned char* text=vo_sub->text[i];// "Hello World! HÛDEJÓ!";
+ int len=strlen(text);
+ int j,k;
+ int xsize=-vo_font->charspace;
+ int x=0;
+
+ int lastStripPosition=-1;
+ int previousStrip=0;
+ int lastxsize=xsize;
+
+ for(j=0;j<len;j++){
int c=text[j];
- int font;
+ int w;
if (sub_unicode && (c>=0x80)) c=(c<<8)+text[++j];
- font = vo_font->font[c];
- if(x>=0 && x+vo_font->width[c]<dxs)
- if(font>=0)
- draw_alpha(x,y,
- vo_font->width[c],
- vo_font->pic_a[font]->h,
- vo_font->pic_b[font]->bmp+vo_font->start[c],
- vo_font->pic_a[font]->bmp+vo_font->start[c],
- vo_font->pic_a[font]->w);
- x+=vo_font->width[c]+vo_font->charspace;
+ w = vo_font->width[c];
+ if (c==' ' && dxs>xsize)
+ {
+ lastStripPosition=j;
+ lastxsize=xsize;
+ }
+ xsize+=w+vo_font->charspace;
+ if ((dxs<xsize & lastStripPosition>0)| j==len-1)
+ {
+ if (j==len-1) lastStripPosition=len;
+ else xsize=lastxsize;
+ j=lastStripPosition;
+
+ x=dxs/2-xsize/2;
+
+ for(k=previousStrip;k<lastStripPosition;k++){
+ int c=text[k];
+ int font;
+ if (sub_unicode && (c>=0x80)) c=(c<<8)+text[++j];
+ font=vo_font->font[c];
+ if(x>=0 && x+vo_font->width[c]<dxs)
+ if(font>=0)
+ draw_alpha(x,y,
+ vo_font->width[c],
+ vo_font->pic_a[font]->h,
+ vo_font->pic_b[font]->bmp+vo_font->start[c],
+ vo_font->pic_a[font]->bmp+vo_font->start[c],
+ vo_font->pic_a[font]->w);
+ x+=vo_font->width[c]+vo_font->charspace;
+ }
+ x=0;
+ y+=vo_font->height;
+ previousStrip=lastStripPosition;
+ xsize=lastxsize=-vo_font->charspace;
+ }
}
-
- y+=vo_font->height;
}
}
@@ -156,3 +205,4 @@ void vo_draw_text(int dxs,int dys,void (*draw_alpha)(int x0,int y0, int w,int h,
}
+