diff options
author | 2001-05-14 22:08:12 +0000 | |
---|---|---|
committer | 2001-05-14 22:08:12 +0000 | |
commit | 3d5aea95552d007e9c59c0bb39d9f9959b2d34d5 (patch) | |
tree | dd1217c65b0d76acd47a469589f7807b25f604d3 /libvo | |
parent | f9a470357cc629fc5809c3b412c97e0ea3895f37 (diff) |
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')
-rw-r--r-- | libvo/sub.c | 108 |
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, } + |