Mercurial > mplayer.hg
changeset 202:6ad0715dfac8
grey+alpha rendering support (for .sub)
author | arpi_esp |
---|---|
date | Sat, 24 Mar 2001 04:36:17 +0000 |
parents | 4678d8212524 |
children | b29c1eed9428 |
files | libvo/mga_common.c libvo/sub.c libvo/video_out.c libvo/vo_mga.c libvo/vo_x11.c libvo/vo_xmga.c |
diffstat | 6 files changed, 127 insertions(+), 61 deletions(-) [+] |
line wrap: on
line diff
--- a/libvo/mga_common.c Fri Mar 23 18:30:19 2001 +0000 +++ b/libvo/mga_common.c Sat Mar 24 04:36:17 2001 +0000 @@ -7,64 +7,40 @@ static uint8_t *vid_data, *frames[4]; static int f; +static void draw_alpha(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride){ + int x,y; + uint32_t bespitch = (mga_vid_config.src_width + 31) & ~31; -static void -write_frame_g200(uint8_t *y,uint8_t *cr, uint8_t *cb) -{ - uint8_t *dest; - uint32_t bespitch,h,w; - - dest = vid_data; - bespitch = (mga_vid_config.src_width + 31) & ~31; + if (mga_vid_config.format==MGA_VID_FORMAT_YV12){ - for(h=0; h < mga_vid_config.src_height; h++) - { - memcpy(dest, y, mga_vid_config.src_width); - y += mga_vid_config.src_width; - dest += bespitch; - } + for(y=0;y<h;y++){ + uint8_t *dst = vid_data + bespitch * (y0+y) + x0; + for(x=0;x<w;x++){ +// dst[x]=(dst[x]*srca[x]+src[x]*(srca[x]^255))>>8; + if(srca[x]) + dst[x]=(dst[x]*(srca[x]^255)+src[x]*(srca[x]))>>8; + } + src+=stride; + srca+=stride; + } + + } else { - for(h=0; h < mga_vid_config.src_height/2; h++) - { - for(w=0; w < mga_vid_config.src_width/2; w++) - { - *dest++ = *cb++; - *dest++ = *cr++; - } - dest += bespitch - mga_vid_config.src_width; - } + for(y=0;y<h;y++){ + uint8_t *dst = vid_data + 2*(bespitch * (y0+y) + x0); + for(x=0;x<w;x++){ +// dst[x]=(dst[x]*srca[x]+src[x]*(srca[x]^255))>>8; + if(srca[x]) + dst[2*x]=(dst[2*x]*(srca[x]^255)+src[x]*(srca[x]))>>8; + } + src+=stride; + srca+=stride; + } + + } + } -static void -write_frame_g400(uint8_t *y,uint8_t *cr, uint8_t *cb) -{ - uint8_t *dest; - uint32_t bespitch,h; - - dest = vid_data; - bespitch = (mga_vid_config.src_width + 31) & ~31; - - for(h=0; h < mga_vid_config.src_height; h++) - { - memcpy(dest, y, mga_vid_config.src_width); - y += mga_vid_config.src_width; - dest += bespitch; - } - - for(h=0; h < mga_vid_config.src_height/2; h++) - { - memcpy(dest, cb, mga_vid_config.src_width/2); - cb += mga_vid_config.src_width/2; - dest += bespitch/2; - } - - for(h=0; h < mga_vid_config.src_height/2; h++) - { - memcpy(dest, cr, mga_vid_config.src_width/2); - cr += mga_vid_config.src_width/2; - dest += bespitch/2; - } -} //static void //write_slice_g200(uint8_t *y,uint8_t *cr, uint8_t *cb,uint32_t slice_num) @@ -200,13 +176,6 @@ { if (mga_vid_config.format==MGA_VID_FORMAT_YUY2) write_frame_yuy2(src[0]); - else - if (mga_vid_config.card_type == MGA_G200) - write_frame_g200(src[0], src[2], src[1]); - else - write_frame_g400(src[0], src[2], src[1]); - - //flip_page(); return 0; }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libvo/sub.c Sat Mar 24 04:36:17 2001 +0000 @@ -0,0 +1,71 @@ + +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; +} + +int vo_sub_lines=2; +char* vo_sub_text[8]; + + +void vo_draw_text(void (*draw_alpha)(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride)){ + int i; + int y=100; + + 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"); + + 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; + } + +} +
--- a/libvo/video_out.c Fri Mar 23 18:30:19 2001 +0000 +++ b/libvo/video_out.c Sat Mar 24 04:36:17 2001 +0000 @@ -87,4 +87,4 @@ NULL }; - +#include "sub.c"
--- a/libvo/vo_mga.c Fri Mar 23 18:30:19 2001 +0000 +++ b/libvo/vo_mga.c Sat Mar 24 04:36:17 2001 +0000 @@ -105,6 +105,7 @@ static void flip_page(void) { + vo_draw_text(draw_alpha); vo_mga_flip_page(); }
--- a/libvo/vo_x11.c Fri Mar 23 18:30:19 2001 +0000 +++ b/libvo/vo_x11.c Sat Mar 24 04:36:17 2001 +0000 @@ -328,7 +328,30 @@ #endif } +static void draw_alpha(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride){ + int dbpp=( bpp+7 )/8; + int x,y; + + for(y=0;y<h;y++){ + uint8_t *dst = ImageData+ dbpp*((y+y0)*image_width+x0); + for(x=0;x<w;x++){ +// dst[x]=(dst[x]*srca[x]+src[x]*(srca[x]^255))>>8; + if(srca[x]){ + dst[0]=(dst[0]*(srca[x]^255)+src[x]*(srca[x]))>>8; + dst[1]=(dst[1]*(srca[x]^255)+src[x]*(srca[x]))>>8; + dst[2]=(dst[2]*(srca[x]^255)+src[x]*(srca[x]))>>8; + } + dst+=dbpp; + } + src+=stride; + srca+=stride; + } + +} + + static void flip_page( void ){ + vo_draw_text(draw_alpha); check_events(); Display_Image( myximage,ImageData ); }