changeset 2204:28901a4122c8

optimizations and corrections
author atlka
date Mon, 15 Oct 2001 06:14:55 +0000
parents f90b6e259dc8
children b6cd2fea7385
files libvo/sub.c
diffstat 1 files changed, 20 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/libvo/sub.c	Mon Oct 15 03:01:08 2001 +0000
+++ b/libvo/sub.c	Mon Oct 15 06:14:55 2001 +0000
@@ -94,10 +94,10 @@
 	   s=vo_font->pic_b[font]->bmp+vo_font->start[c];
 	   sa=vo_font->pic_a[font]->bmp+vo_font->start[c];
 	   st=vo_font->pic_a[font]->w;
-     	   for (i=mark;i--;){
+	   if ((i=mark)) do {
 	       draw_alpha(x,y,w,h,s,sa,st);
 	       x+=charw;
-	   }
+	   } while(--i);
 	}
 
    	c=OSD_PB_1;
@@ -107,10 +107,10 @@
 	   s =vo_font->pic_b[font]->bmp+vo_font->start[c];
 	   sa=vo_font->pic_a[font]->bmp+vo_font->start[c];
 	   st=vo_font->pic_a[font]->w;
-     	   for (i=elems-mark;i--;){
+	   if ((i=elems-mark)) do {
 	       draw_alpha(x,y,w,h,s,sa,st);
 	       x+=charw;
-	   }
+	   } while(--i);
 	}
 
         c=OSD_PB_END;
@@ -164,7 +164,8 @@
       lastStripPosition=-1;
       l=vo_sub->lines;
 
-      while (l--){
+      while (l) {
+	  l--;
 	  t=vo_sub->text[i++];	  
 	  len=strlen(t)-1;
 	  
@@ -183,19 +184,19 @@
 		       c = (c<<8) + t[++j]; 
 	      }
 	      if (k==MAX_UCS){
-		 l=0 ; len=j; // cut here
+		 len=j; // end here
 	      }
-	      utbl[k++]=c;
+	      if (!c) c++; // avoid UCS 0
 	      if (c==' '){
 		 lastk=k;
 		 lastStripPosition=j;
 		 lastxsize=xsize;
-	      }
-	      else if ((font=vo_font->font[c])>=0){
+	      } else if ((font=vo_font->font[c])>=0){
 		  if (vo_font->pic_a[font]->h > h){
 		     h=vo_font->pic_a[font]->h;
 		  }
 	      }
+	      utbl[k++]=c;
 	      xsize+=vo_font->width[c]+vo_font->charspace;
 	      if (dxs<xsize){
 		 if (lastStripPosition>0){
@@ -210,13 +211,14 @@
 	      } else if (j<len)
 		   continue;
 	      if (h>memy){ // out of the screen so end parsing
-		 memy -=lasth - vo_font->height; // correct the y position
-		 l=0; break;
+		 h -=lasth - vo_font->height; // correct the y position
+		 l=0;
+		 break;
 	      }
 	      utbl[k++]=0;
 	      xtbl[lines++]=(dxs-xsize)/2;
 	      if (lines==MAX_UCSLINES||k>MAX_UCS){
-		 l=0; j=len; // end parsing
+		 l=0; len=j; // end parsing
 	      } else if(l || j<len){ // not the last line or not the last char
 		 lastStripPosition=-1;
 		 xsize=-vo_font->charspace;
@@ -233,9 +235,9 @@
    
 //   printf("lines=%d  y=%d\n",lines,y);
 
-   i=j=0; l=lines;
-   while (i<lines){
-	 x= xtbl[i++]; 
+   i=j=0;
+   if ((l=lines)) for (;;) {
+ 	 x=xtbl[i++]; 
 	 while ((c=utbl[j++])){
 	       if ((font=vo_font->font[c])>=0)
 		  draw_alpha(x,y,
@@ -244,8 +246,10 @@
 			     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+=vo_font->width[c]+vo_font->charspace;
 	 }
+         if (!--l) 
+	    return;
          y+=vo_font->height;
    }
 }