[Mplayer-dev-eng] Subtitles dividing

Vladimír Dubský V.Dubsky at sh.cvut.cz
Mon May 14 13:24:42 CEST 2001


Hi,

this email containes the promised sub.c patch for breaking too long
subtitle lines.

Vlada
-------------- next part --------------
diff -Naur cvs/main/libvo/sub.c mine/main/libvo/sub.c
--- cvs/main/libvo/sub.c	Tue May  8 21:40:10 2001
+++ mine/main/libvo/sub.c	Mon May 14 13:17:19 2001
@@ -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 @@
               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;
     }
 
 }
@@ -155,4 +204,5 @@
     }
 
 }
+
 


More information about the MPlayer-dev-eng mailing list