diff options
author | arpi_esp <arpi_esp@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2001-05-06 02:26:17 +0000 |
---|---|---|
committer | arpi_esp <arpi_esp@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2001-05-06 02:26:17 +0000 |
commit | e3d4468a24a4e7371ebb6d026ca3c02e394d1cf8 (patch) | |
tree | 1ee58f8671ddfce63f1839a124f935bdb9333c71 | |
parent | d087b3eb2a0ea680b2ab821ed27883df76bb34a6 (diff) | |
download | mpv-e3d4468a24a4e7371ebb6d026ca3c02e394d1cf8.tar.bz2 mpv-e3d4468a24a4e7371ebb6d026ca3c02e394d1cf8.tar.xz |
better .smi support and display two-byte characters- patch by Sunjin Yang
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@707 b3059339-0415-0410-9bf9-f77b7e298cf2
-rw-r--r-- | libvo/font_load.c | 3 | ||||
-rw-r--r-- | libvo/font_load.h | 6 | ||||
-rw-r--r-- | libvo/sub.c | 11 | ||||
-rw-r--r-- | subreader.c | 108 |
4 files changed, 83 insertions, 45 deletions
diff --git a/libvo/font_load.c b/libvo/font_load.c index c6f009ce37..02e9a918a1 100644 --- a/libvo/font_load.c +++ b/libvo/font_load.c @@ -174,7 +174,8 @@ while(fgets(sor,1020,f)){ int chr=p[0][0]; int start=atoi(p[1]); int end=atoi(p[2]); - if(strlen(p[0])!=1) chr=strtol(p[0],NULL,0); + if(chr>=0x80) chr=(chr<<8)+p[0][1]; + else if(strlen(p[0])!=1) chr=strtol(p[0],NULL,0); if(end<start) { printf("error in font desc: end<start for char '%c'\n",chr); } else { diff --git a/libvo/font_load.h b/libvo/font_load.h index e4d8c56383..1b425ffc1e 100644 --- a/libvo/font_load.h +++ b/libvo/font_load.h @@ -14,9 +14,9 @@ typedef struct { // char *fname_b; raw_file* pic_a[16]; raw_file* pic_b[16]; - short font[512]; - short start[512]; - short width[512]; + short font[65536]; + short start[65536]; + short width[65536]; } font_desc_t; raw_file* load_raw(char *name,int verbose); diff --git a/libvo/sub.c b/libvo/sub.c index 29eb488cc4..d983324eb5 100644 --- a/libvo/sub.c +++ b/libvo/sub.c @@ -104,19 +104,22 @@ void vo_draw_text_sub(int dxs,int dys,void (*draw_alpha)(int x0,int y0, int w,in int x=0; for(j=0;j<len;j++){ - int w=vo_font->width[text[j]]; - if(w>100) printf("gazvan: %d (%d=%c)\n",w,text[j],text[j]); + int c=text[j]; + int w = vo_font->width[(c<0x80)?c:(c<<8)+text[++j]]; + if(w>100) printf("gazvan: %d (%d=%c)\n",w,c,c); xsize+=w+vo_font->charspace; } //printf("text width = %d\n",xsize); - if(xsize>dxs) printf("Warning! SUB too wide!!! (%d>%d)\n",xsize,dxs); + //if(xsize>dxs) printf("Warning! SUB too wide!!! (%d>%d)\n",xsize,dxs); x=dxs/2-xsize/2; for(j=0;j<len;j++){ int c=text[j]; - int font=vo_font->font[c]; + int font; + if (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, diff --git a/subreader.c b/subreader.c index 2a5120aab8..6e20dc22a1 100644 --- a/subreader.c +++ b/subreader.c @@ -9,6 +9,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <ctype.h> #include "subreader.h" @@ -27,47 +28,78 @@ int eol(char p) { return (p=='\r' || p=='\n' || p=='\0'); } +static inline void trail_space(char *s) { + int i; + while (isspace(*s)) strcpy(s, s + 1); + i = strlen(s) - 1; + while (i > 0 && isspace(s[i])) s[i--] = '\0'; +} subtitle *sub_read_line_sami(FILE *fd, subtitle *current) { - char line[1001]; - int i; - char *s, *p; + static char line[1001]; + static char *s = NULL; + char text[1000], *p, *q; + int state; - current->start=0; - do { - if (! (fgets (line, 1000, fd))) return 0; - s= strstr(line, "Start="); - if (s) { - sscanf (s, "Start=%d", ¤t->start); - if (strstr (s, "<P><br>")) current->start=0; - } - } while ( !current->start ); - - if (! (fgets (line, 1000, fd))) return 0; - s=strstr (line, "<P>")+3; + current->lines = current->start = current->end = 0; + state = 0; + + /* read the first line */ + if (!s) + if (!(s = fgets(line, 1000, fd))) return 0; - i=0; do { - for (p=s; !eol(*p) && strncmp(p,"<br>",4); p++); - if (p==s) { - s+=4; + switch (state) { + + case 0: /* find "START=" */ + s = strstr (s, "Start="); + if (s) { + current->start = strtol (s + 6, &s, 0) / 10; + state = 1; continue; + } + break; + + case 1: /* find "<P" */ + if ((s = strstr (s, "<P"))) { s += 2; state = 2; continue; } + break; + + case 2: /* find ">" */ + if ((s = strchr (s, '>'))) { s++; state = 3; p = text; continue; } + break; + + case 3: /* get all text until '<' appears */ + if (*s == '\0') { break; } + else if (*s == '<') { state = 4; } + else if (!strncasecmp (s, " ", 6)) { *p++ = ' '; s += 6; } + else if (*s == '\r') { s++; } + else if (!strncasecmp (s, "<br>", 4) || *s == '\n') { + *p = '\0'; p = text; trail_space (text); + if (text[0] != '\0') + current->text[current->lines++] = strdup (text); + if (*s == '\n') s++; else s += 4; + } + else *p++ = *s++; continue; + + case 4: /* get current->end or skip <TAG> */ + q = strstr (s, "Start="); + if (q) { + current->end = strtol (q + 6, &q, 0) / 10 - 1; + *p = '\0'; trail_space (text); + if (text[0] != '\0') + current->text[current->lines++] = strdup (text); + if (current->lines > 0) { state = 99; break; } + state = 0; continue; + } + s = strchr (s, '>'); + if (s) { s++; state = 3; continue; } + break; } - current->text[i]=(char *)malloc(p-s+1); - strncpy (current->text[i], s, p-s); - current->text[i++][p-s]='\0'; - if (!strncmp(p,"<br>",4)) s=p+4; - else s=p; - } while (!eol (*p)); - - current->lines=i; - if (! (fgets (line, 1000, fd))) return 0; - s= strstr(line, "Start="); - if (s) { - sscanf (s, "Start=%d", ¤t->end); - if (!strstr (s, "<P><br>")) return ERR; - } else return ERR; + /* read next line */ + if (state != 99 && !(s = fgets (line, 1000, fd))) return 0; + + } while (state != 99); return current; } @@ -200,7 +232,7 @@ int sub_autodetect (FILE *fd) { if (sscanf (line, "%d:%d:%d,%d --> %d:%d:%d,%d", &i, &i, &i, &i, &i, &i, &i, &i)==8) {sub_uses_time=1;return 2;} if (strstr (line, "<SAMI>")) - {sub_uses_time=0; return 3;} + {sub_uses_time=1; return 3;} } return -1; // too many bad lines @@ -268,12 +300,14 @@ char * sub_filename( char * fname ) char * sub_name = NULL; char * sub_tmp = NULL; int i; -#define SUB_EXTS 4 +#define SUB_EXTS 6 char * sub_exts[SUB_EXTS] = { ".sub", ".SUB", ".srt", - ".SRT" }; + ".SRT", + ".smi", + ".SMI"}; if ( fname == NULL ) return NULL; for( i=strlen( fname );i>0;i-- ) @@ -335,4 +369,4 @@ int main(int argc, char **argv) { // for testing printf ("Read %i subtitles, %i errors.\n", sub_num, sub_errs); return 0; } -#endif
\ No newline at end of file +#endif |