diff options
author | Ole Loots <ole@monochrom.net> | 2012-01-02 00:08:14 +0000 |
---|---|---|
committer | Ole Loots <ole@monochrom.net> | 2012-01-02 00:08:14 +0000 |
commit | eef6b2da4fbc369dc1b51dd1af84e4750f4274d0 (patch) | |
tree | 148beb5bd3a5ceaf77fe14aa3ff5809763e0b509 /atari/plot/plotter_vdi.c | |
parent | aec502af1a5c0bdb487b97974be3616d4eee1986 (diff) | |
download | netsurf-eef6b2da4fbc369dc1b51dd1af84e4750f4274d0.tar.gz netsurf-eef6b2da4fbc369dc1b51dd1af84e4750f4274d0.tar.bz2 |
256 color plotting: Use vdi to rgb lookup table, made transparency a bit better ( the snapshot problem was related to fvdi, no error in code )
svn path=/trunk/netsurf/; revision=13362
Diffstat (limited to 'atari/plot/plotter_vdi.c')
-rwxr-xr-x | atari/plot/plotter_vdi.c | 81 |
1 files changed, 43 insertions, 38 deletions
diff --git a/atari/plot/plotter_vdi.c b/atari/plot/plotter_vdi.c index 5a6ad0ee2..8c4af0f6d 100755 --- a/atari/plot/plotter_vdi.c +++ b/atari/plot/plotter_vdi.c @@ -75,6 +75,7 @@ static int text(GEM_PLOTTER self, int x, int y, const char *text,size_t length, #ifdef WITH_8BPP_SUPPORT static unsigned short sys_pal[256][3]; /*RGB*/ static unsigned short pal[256][3]; /*RGB*/ +static char rgb_lookup[256][4]; extern unsigned short vdi_web_pal[126][3]; #endif
extern struct s_vdi_sysinfo vdi_sysinfo;
@@ -206,13 +207,14 @@ int ctor_plotter_vdi(GEM_PLOTTER self ) /* here we define 20 additional gray colors... */ rgbcol[1] = rgbcol[2] = rgbcol[3] = ((graytone&0x0F) << 4); rgb_to_vdi1000( &rgbcol[0], &pal[i][0] ); - printf("graytone: %d (%x), index: %d\n",rgbcol[1], rgbcol[1],i ); vs_color( self->vdi_handle, i, &pal[i][0] ); graytone++; } } + vdi1000_to_rgb( &pal[i], &rgb_lookup[i][0] ); } + } else { /* no need to change the palette - its application specific */ } @@ -256,6 +258,10 @@ static int dtor( GEM_PLOTTER self ) free( self->fbuf[i].mem ); } + for( i=OFFSET_WEB_PAL; i<OFFSET_CUST_PAL+16; i++){ + vs_color( self->vdi_handle, i, &sys_pal[i][0] ); + } + /* close Hermes stuff: */ Hermes_ConverterReturn( hermes_cnv_h ); @@ -803,23 +809,6 @@ static MFDB * snapshot_create_native_mfdb( GEM_PLOTTER self, int x, int y, int w self->vdi_handle, S_ONLY, (short*)&pxy, &scr, &DUMMY_PRIV(self)->buf_scr ); - dbg_pxy("ntv snap", pxy ); - -/* -Debug: output copy to screen: - pxy[0] = 0; - pxy[1] = 0; - pxy[2] = pxy[0] + w-1; - pxy[3] = pxy[1] + h-1; - pxy[4] = x+20; - pxy[5] = y; - pxy[6] = w-1; - pxy[7] = h-1; - vro_cpyfm( - self->vdi_handle, S_ONLY, (short*)&pxy, - &DUMMY_PRIV(self)->buf_scr,&scr - ); -*/ return( &DUMMY_PRIV(self)->buf_scr ); } @@ -959,7 +948,7 @@ static void snapshot_destroy( GEM_PLOTTER self ) } -void set_stdpx( MFDB * dst, int x, int y, unsigned char val )
+inline void set_stdpx( MFDB * dst, int x, int y, unsigned char val )
{
int p;
short * buf;
@@ -974,7 +963,7 @@ void set_stdpx( MFDB * dst, int x, int y, unsigned char val ) }
} -unsigned char get_stdpx(MFDB * dst, int x, int y ) +inline unsigned char get_stdpx(MFDB * dst, int x, int y ) { unsigned char ret=0; int p;
@@ -1074,41 +1063,57 @@ static int bitmap_convert_8( GEM_PLOTTER self, stdform.fd_stand = 1; stdform.fd_nplanes = (short)self->bpp_virt; stdform.fd_r1 = stdform.fd_r2 = stdform.fd_r3 = 0; - /*printf("bpp virt: %d, bytestr: %d, planesize %d\n", - self->bpp_virt, ((dststride >> 3) * self->bpp_virt), stdform.fd_wdwidth*stdform.fd_h ); - */ - // convert pixels to std. format + int wdplanesz = stdform.fd_wdwidth*stdform.fd_h; int bytestride = (dststride >> 3) * self->bpp_virt; unsigned long max = ((char*)stdform.fd_addr)+dstsize; int img_stride = bitmap_get_rowstride(bm); - - // first, get snapshot in planar buffer, - // then apply transparency. + unsigned char rgb[4]; + uint32_t prev_pixel = 0x12345678; + unsigned char prev_col = 1; + unsigned char col = 0; + unsigned long bgcol = 0; + unsigned char val = 0; + + // apply transparency. for( y=0; y<clip->g_h; y++ ){ uint32_t * imgpixel; imgpixel = (uint32_t *)(bm->pixdata + (img_stride * (y+clip->g_y))); for( x=0; x<clip->g_w; x++ ){ + uint32_t pixel = imgpixel[x+clip->g_x]; - unsigned long col = ABGR_TO_RGB( (pixel&0xFFFFFF00)>>8 ); - unsigned char val = RGB_TO_VDI( col>>8 ); + if( (pixel&0xFF) == 0 ){ - set_stdpx( &stdform, x,y, get_stdpx( &stdform,x,y ) ); continue; } - if( (pixel&0xFF) >=128 ){ + if( (pixel&0xFF) < 0xF0 ){ + col = get_stdpx( &stdform,x,y ); + if( col != prev_col ) + bgcol = (((rgb_lookup[col][2] << 16) | (rgb_lookup[col][1] << 8) | (rgb_lookup[col][0]))<<8); + if( prev_col != col || prev_pixel != pixel ){ + prev_col = col; + pixel = ablend( pixel, bgcol ); + pixel = pixel >> 8; + /* convert pixel value to vdi color index: */ + col = ( ((pixel&0xFF)<<16) + | (pixel&0xFF00) + | ((pixel&0xFF0000)>>16) ); + val = RGB_TO_VDI( col ); + } set_stdpx( &stdform, x,y, val ); } else { - char rgb[4]; - col = get_stdpx( &stdform,x,y ); - // TBD: use lookup table! - vdi1000_to_rgb( &pal[col], &rgb[0] ); - pixel = ablend( pixel, ((rgb[2] << 16) | (rgb[1] << 8) | (rgb[0]))<<8 ); - col = ABGR_TO_RGB( (pixel&0xFFFFFF00)>>8 ); - val = RGB_TO_VDI( col>>8 ); + if( pixel != prev_pixel ){ + /* convert pixel value to vdi color index: */ + pixel = pixel >> 8; + col = ( ((pixel&0xFF)<<16) + | (pixel&0xFF00) + | ((pixel&0xFF0000)>>16) ); + val = RGB_TO_VDI( col ); + } set_stdpx( &stdform, x,y, val ); } + prev_pixel = pixel; } } |