diff options
author | arpi_esp <arpi_esp@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2001-03-25 04:28:40 +0000 |
---|---|---|
committer | arpi_esp <arpi_esp@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2001-03-25 04:28:40 +0000 |
commit | 54afa85eef799a463366cc6a9e56ea78298f9c30 (patch) | |
tree | 286c20688b9e8ada162609939265d2cef2c66ec8 /libvo/sub.c | |
parent | 920d0153359f96350666b5e7b92ecc919825368c (diff) | |
download | mpv-54afa85eef799a463366cc6a9e56ea78298f9c30.tar.bz2 mpv-54afa85eef799a463366cc6a9e56ea78298f9c30.tar.xz |
subtitle+OSD font support
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@214 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libvo/sub.c')
-rw-r--r-- | libvo/sub.c | 125 |
1 files changed, 68 insertions, 57 deletions
diff --git a/libvo/sub.c b/libvo/sub.c index 1ab62fcc6f..d64862f899 100644 --- a/libvo/sub.c +++ b/libvo/sub.c @@ -1,71 +1,82 @@ -typedef struct { - unsigned char *bmp; - unsigned char *pal; - int w,h,c; -} raw_file; - -raw_file* load_raw(char *name){ - int bpp; - raw_file* raw=malloc(sizeof(raw_file)); - unsigned char head[32]; - FILE *f=fopen(name,"rb"); - if(!f) return NULL; // can't open - if(fread(head,32,1,f)<1) return NULL; // too small - if(memcmp(head,"mhwanh",6)) return NULL; // not raw file - raw->w=head[8]*256+head[9]; - raw->h=head[10]*256+head[11]; - raw->c=head[12]*256+head[13]; - if(raw->c>256) return NULL; // too many colors!? - printf("RAW: %d x %d, %d colors\n",raw->w,raw->h,raw->c); - if(raw->c){ - raw->pal=malloc(raw->c*3); - fread(raw->pal,3,raw->c,f); - bpp=1; - } else { - raw->pal=NULL; - bpp=3; - } - raw->bmp=malloc(raw->h*raw->w*bpp); - fread(raw->bmp,raw->h*raw->w*bpp,1,f); - fclose(f); - return raw; -} - -static int vo_font_loaded=-1; -static raw_file* vo_font_bmp=NULL; -static raw_file* vo_font_alpha=NULL; - -void vo_load_font(char *bmpname,char *alphaname){ - vo_font_loaded=0; - if(!(vo_font_bmp=load_raw(bmpname))) - printf("vo: Can't load font BMP\n"); else - if(!(vo_font_alpha=load_raw(alphaname))) - printf("vo: Can't load font Alpha\n"); else - vo_font_loaded=1; -} +//static int vo_font_loaded=-1; +font_desc_t* vo_font=NULL; int vo_sub_lines=2; -char* vo_sub_text[8]; +unsigned char* vo_sub_text[8]; +unsigned char* vo_osd_text="00:00:00"; -void vo_draw_text(void (*draw_alpha)(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride)){ +void vo_draw_text(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=100; + int y; + + if(!vo_font) return; // no font + + if(vo_osd_text){ + int len=strlen(vo_osd_text); + int j; + int y=10; + int x=20; + + for(j=0;j<len;j++){ + int c=vo_osd_text[j]; + int font=vo_font->font[c]; + 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; + } + + } + +#if 1 if(vo_sub_lines<=0) return; // no text - - if(vo_font_loaded==-1) vo_load_font("font_b.raw","font_a.raw"); - if(!vo_font_loaded) return; // no font - -// if(!vo_font_bmp) vo_load_font("mplayer_font_lowres_bitmap.raw","mplayer_font_lowres_alpha.raw"); + y=dys-(1+vo_sub_lines)*vo_font->height; for(i=0;i<vo_sub_lines;i++){ - char* text="Hello World!"; //vo_sub_text[i]; - draw_alpha(100,y,50,vo_font_bmp->h,vo_font_bmp->bmp,vo_font_alpha->bmp,vo_font_bmp->w); -// x11_draw_alpha(100,y,50,vo_font_bmp->h,vo_font_bmp->bmp,vo_font_alpha->bmp,vo_font_bmp->w); - y+=50; + unsigned char* text="Hello World! HÛDEJÓ!"; //vo_sub_text[i]; + int len=strlen(text); + int j; + int xsize=-vo_font->charspace; + 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]); + xsize+=w+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++){ + int c=text[j]; + int 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; + } + + y+=vo_font->height; } +#endif + } + + |