diff options
Diffstat (limited to 'libvo')
-rw-r--r-- | libvo/font_load.c | 10 | ||||
-rw-r--r-- | libvo/osd.c | 60 | ||||
-rw-r--r-- | libvo/osd.h | 2 | ||||
-rw-r--r-- | libvo/osd_template.c | 60 | ||||
-rw-r--r-- | libvo/sub.c | 6 |
5 files changed, 136 insertions, 2 deletions
diff --git a/libvo/font_load.c b/libvo/font_load.c index 0fc1ed5bea..466882ec71 100644 --- a/libvo/font_load.c +++ b/libvo/font_load.c @@ -3,6 +3,7 @@ #include <stdlib.h> #include <string.h> +#include "config.h" #include "font_load.h" char *get_path ( char * ); @@ -210,8 +211,12 @@ for(i=0;i<=fontdb;i++){ int j; if(verbose) printf("font: resampling alpha by factor %5.3f (%d) ",factor,f);fflush(stdout); for(j=0;j<size;j++){ - int x=desc->pic_a[i]->bmp[j]; - int y=desc->pic_b[i]->bmp[j]; + int x=desc->pic_a[i]->bmp[j]; // alpha + int y=desc->pic_b[i]->bmp[j]; // bitmap + +#ifdef FAST_OSD + x=(x<(255-f))?0:1; +#else x=255-((x*f)>>8); // scale //if(x<0) x=0; else if(x>255) x=255; @@ -226,6 +231,7 @@ for(i=0;i<=fontdb;i++){ if(x<1) x=1; else if(x>=252) x=0; +#endif desc->pic_a[i]->bmp[j]=x; // desc->pic_b[i]->bmp[j]=0; // hack diff --git a/libvo/osd.c b/libvo/osd.c index 4b0d60171b..a870733edc 100644 --- a/libvo/osd.c +++ b/libvo/osd.c @@ -1,14 +1,26 @@ // Generic alpha renderers for all YUV modes and RGB depths. // These are "reference implementations", should be optimized later (MMX, etc) +//#define FAST_OSD +//#define FAST_OSD_TABLE + +#include "config.h" #include "osd.h" void vo_draw_alpha_yv12(int w,int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride){ int y; +#ifdef FAST_OSD + w=w>>1; +#endif for(y=0;y<h;y++){ register int x; for(x=0;x<w;x++){ +#ifdef FAST_OSD + if(srca[2*x+0]) dstbase[2*x+0]=src[2*x+0]; + if(srca[2*x+1]) dstbase[2*x+1]=src[2*x+1]; +#else if(srca[x]) dstbase[x]=((dstbase[x]*srca[x])>>8)+src[x]; +#endif } src+=srcstride; srca+=srcstride; @@ -19,10 +31,18 @@ void vo_draw_alpha_yv12(int w,int h, unsigned char* src, unsigned char *srca, in void vo_draw_alpha_yuy2(int w,int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride){ int y; +#ifdef FAST_OSD + w=w>>1; +#endif for(y=0;y<h;y++){ register int x; for(x=0;x<w;x++){ +#ifdef FAST_OSD + if(srca[2*x+0]) dstbase[4*x+0]=src[2*x+0]; + if(srca[2*x+1]) dstbase[4*x+2]=src[2*x+1]; +#else if(srca[x]) dstbase[2*x]=((dstbase[2*x]*srca[x])>>8)+src[x]; +#endif } src+=srcstride; srca+=srcstride; @@ -38,9 +58,13 @@ void vo_draw_alpha_rgb24(int w,int h, unsigned char* src, unsigned char *srca, i register int x; for(x=0;x<w;x++){ if(srca[x]){ +#ifdef FAST_OSD + dst[0]=dst[1]=dst[2]=src[x]; +#else dst[0]=((dst[0]*srca[x])>>8)+src[x]; dst[1]=((dst[1]*srca[x])>>8)+src[x]; dst[2]=((dst[2]*srca[x])>>8)+src[x]; +#endif } dst+=3; // 24bpp } @@ -57,9 +81,13 @@ void vo_draw_alpha_rgb32(int w,int h, unsigned char* src, unsigned char *srca, i register int x; for(x=0;x<w;x++){ if(srca[x]){ +#ifdef FAST_OSD + dstbase[4*x+0]=dstbase[4*x+1]=dstbase[4*x+2]=src[x]; +#else dstbase[4*x+0]=((dstbase[4*x+0]*srca[x])>>8)+src[x]; dstbase[4*x+1]=((dstbase[4*x+1]*srca[x])>>8)+src[x]; dstbase[4*x+2]=((dstbase[4*x+2]*srca[x])>>8)+src[x]; +#endif } } src+=srcstride; @@ -69,6 +97,21 @@ void vo_draw_alpha_rgb32(int w,int h, unsigned char* src, unsigned char *srca, i return; } +#ifdef FAST_OSD_TABLE +static unsigned short fast_osd_15bpp_table[256]; +static unsigned short fast_osd_16bpp_table[256]; +#endif + +void vo_draw_alpha_init(){ +#ifdef FAST_OSD_TABLE + int i; + for(i=0;i<256;i++){ + fast_osd_15bpp_table[i]=((i>>3)<<10)|((i>>3)<<5)|(i>>3); + fast_osd_16bpp_table[i]=((i>>3)<<11)|((i>>2)<<5)|(i>>3); + } +#endif +} + void vo_draw_alpha_rgb15(int w,int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride){ int y; for(y=0;y<h;y++){ @@ -76,6 +119,14 @@ void vo_draw_alpha_rgb15(int w,int h, unsigned char* src, unsigned char *srca, i register int x; for(x=0;x<w;x++){ if(srca[x]){ +#ifdef FAST_OSD +#ifdef FAST_OSD_TABLE + dst[x]=fast_osd_15bpp_table[src[x]]; +#else + register unsigned int a=src[x]>>3; + dst[x]=(a<<10)|(a<<5)|a; +#endif +#else unsigned char r=dst[x]&0x1F; unsigned char g=(dst[x]>>5)&0x1F; unsigned char b=(dst[x]>>10)&0x1F; @@ -83,6 +134,7 @@ void vo_draw_alpha_rgb15(int w,int h, unsigned char* src, unsigned char *srca, i g=(((g*srca[x])>>5)+src[x])>>3; b=(((b*srca[x])>>5)+src[x])>>3; dst[x]=(b<<10)|(g<<5)|r; +#endif } } src+=srcstride; @@ -99,6 +151,13 @@ void vo_draw_alpha_rgb16(int w,int h, unsigned char* src, unsigned char *srca, i register int x; for(x=0;x<w;x++){ if(srca[x]){ +#ifdef FAST_OSD +#ifdef FAST_OSD_TABLE + dst[x]=fast_osd_16bpp_table[src[x]]; +#else + dst[x]=((src[x]>>3)<<11)|((src[x]>>2)<<5)|(src[x]>>3); +#endif +#else unsigned char r=dst[x]&0x1F; unsigned char g=(dst[x]>>5)&0x3F; unsigned char b=(dst[x]>>11)&0x1F; @@ -106,6 +165,7 @@ void vo_draw_alpha_rgb16(int w,int h, unsigned char* src, unsigned char *srca, i g=(((g*srca[x])>>6)+src[x])>>2; b=(((b*srca[x])>>5)+src[x])>>3; dst[x]=(b<<11)|(g<<5)|r; +#endif } } src+=srcstride; diff --git a/libvo/osd.h b/libvo/osd.h index 38ca8c5871..b815f1f09c 100644 --- a/libvo/osd.h +++ b/libvo/osd.h @@ -5,6 +5,8 @@ // Generic alpha renderers for all YUV modes and RGB depths. // These are "reference implementations", should be optimized later (MMX, etc) +extern void vo_draw_alpha_init(); // build tables + extern void vo_draw_alpha_yv12(int w,int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride); extern void vo_draw_alpha_yuy2(int w,int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride); extern void vo_draw_alpha_rgb24(int w,int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride); diff --git a/libvo/osd_template.c b/libvo/osd_template.c index 4b0d60171b..a870733edc 100644 --- a/libvo/osd_template.c +++ b/libvo/osd_template.c @@ -1,14 +1,26 @@ // Generic alpha renderers for all YUV modes and RGB depths. // These are "reference implementations", should be optimized later (MMX, etc) +//#define FAST_OSD +//#define FAST_OSD_TABLE + +#include "config.h" #include "osd.h" void vo_draw_alpha_yv12(int w,int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride){ int y; +#ifdef FAST_OSD + w=w>>1; +#endif for(y=0;y<h;y++){ register int x; for(x=0;x<w;x++){ +#ifdef FAST_OSD + if(srca[2*x+0]) dstbase[2*x+0]=src[2*x+0]; + if(srca[2*x+1]) dstbase[2*x+1]=src[2*x+1]; +#else if(srca[x]) dstbase[x]=((dstbase[x]*srca[x])>>8)+src[x]; +#endif } src+=srcstride; srca+=srcstride; @@ -19,10 +31,18 @@ void vo_draw_alpha_yv12(int w,int h, unsigned char* src, unsigned char *srca, in void vo_draw_alpha_yuy2(int w,int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride){ int y; +#ifdef FAST_OSD + w=w>>1; +#endif for(y=0;y<h;y++){ register int x; for(x=0;x<w;x++){ +#ifdef FAST_OSD + if(srca[2*x+0]) dstbase[4*x+0]=src[2*x+0]; + if(srca[2*x+1]) dstbase[4*x+2]=src[2*x+1]; +#else if(srca[x]) dstbase[2*x]=((dstbase[2*x]*srca[x])>>8)+src[x]; +#endif } src+=srcstride; srca+=srcstride; @@ -38,9 +58,13 @@ void vo_draw_alpha_rgb24(int w,int h, unsigned char* src, unsigned char *srca, i register int x; for(x=0;x<w;x++){ if(srca[x]){ +#ifdef FAST_OSD + dst[0]=dst[1]=dst[2]=src[x]; +#else dst[0]=((dst[0]*srca[x])>>8)+src[x]; dst[1]=((dst[1]*srca[x])>>8)+src[x]; dst[2]=((dst[2]*srca[x])>>8)+src[x]; +#endif } dst+=3; // 24bpp } @@ -57,9 +81,13 @@ void vo_draw_alpha_rgb32(int w,int h, unsigned char* src, unsigned char *srca, i register int x; for(x=0;x<w;x++){ if(srca[x]){ +#ifdef FAST_OSD + dstbase[4*x+0]=dstbase[4*x+1]=dstbase[4*x+2]=src[x]; +#else dstbase[4*x+0]=((dstbase[4*x+0]*srca[x])>>8)+src[x]; dstbase[4*x+1]=((dstbase[4*x+1]*srca[x])>>8)+src[x]; dstbase[4*x+2]=((dstbase[4*x+2]*srca[x])>>8)+src[x]; +#endif } } src+=srcstride; @@ -69,6 +97,21 @@ void vo_draw_alpha_rgb32(int w,int h, unsigned char* src, unsigned char *srca, i return; } +#ifdef FAST_OSD_TABLE +static unsigned short fast_osd_15bpp_table[256]; +static unsigned short fast_osd_16bpp_table[256]; +#endif + +void vo_draw_alpha_init(){ +#ifdef FAST_OSD_TABLE + int i; + for(i=0;i<256;i++){ + fast_osd_15bpp_table[i]=((i>>3)<<10)|((i>>3)<<5)|(i>>3); + fast_osd_16bpp_table[i]=((i>>3)<<11)|((i>>2)<<5)|(i>>3); + } +#endif +} + void vo_draw_alpha_rgb15(int w,int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride){ int y; for(y=0;y<h;y++){ @@ -76,6 +119,14 @@ void vo_draw_alpha_rgb15(int w,int h, unsigned char* src, unsigned char *srca, i register int x; for(x=0;x<w;x++){ if(srca[x]){ +#ifdef FAST_OSD +#ifdef FAST_OSD_TABLE + dst[x]=fast_osd_15bpp_table[src[x]]; +#else + register unsigned int a=src[x]>>3; + dst[x]=(a<<10)|(a<<5)|a; +#endif +#else unsigned char r=dst[x]&0x1F; unsigned char g=(dst[x]>>5)&0x1F; unsigned char b=(dst[x]>>10)&0x1F; @@ -83,6 +134,7 @@ void vo_draw_alpha_rgb15(int w,int h, unsigned char* src, unsigned char *srca, i g=(((g*srca[x])>>5)+src[x])>>3; b=(((b*srca[x])>>5)+src[x])>>3; dst[x]=(b<<10)|(g<<5)|r; +#endif } } src+=srcstride; @@ -99,6 +151,13 @@ void vo_draw_alpha_rgb16(int w,int h, unsigned char* src, unsigned char *srca, i register int x; for(x=0;x<w;x++){ if(srca[x]){ +#ifdef FAST_OSD +#ifdef FAST_OSD_TABLE + dst[x]=fast_osd_16bpp_table[src[x]]; +#else + dst[x]=((src[x]>>3)<<11)|((src[x]>>2)<<5)|(src[x]>>3); +#endif +#else unsigned char r=dst[x]&0x1F; unsigned char g=(dst[x]>>5)&0x3F; unsigned char b=(dst[x]>>11)&0x1F; @@ -106,6 +165,7 @@ void vo_draw_alpha_rgb16(int w,int h, unsigned char* src, unsigned char *srca, i g=(((g*srca[x])>>6)+src[x])>>2; b=(((b*srca[x])>>5)+src[x])>>3; dst[x]=(b<<11)|(g<<5)|r; +#endif } } src+=srcstride; diff --git a/libvo/sub.c b/libvo/sub.c index 07b3c4b5d4..f410f8ad27 100644 --- a/libvo/sub.c +++ b/libvo/sub.c @@ -186,11 +186,17 @@ static void vo_draw_text_sub(int dxs,int dys,void (*draw_alpha)(int x0,int y0, i } +static int draw_alpha_init_flag=0; 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)){ if(!vo_font) return; // no font + if(!draw_alpha_init_flag){ + draw_alpha_init_flag=1; + vo_draw_alpha_init(); + } + if(vo_osd_text){ vo_draw_text_osd(dxs,dys,draw_alpha); } |