From: Andrew R. <ar...@us...> - 2007-01-18 10:34:22
|
Update of /cvsroot/plplot/plplot/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv16850/src Modified Files: plfreetype.c Log Message: Added improved anti-aliasing routines to freetype. To support this I added to new private callbacks to the freetype driver which are "plD_read_pixel_fp" and "plD_set_pixel_fp". What they do (respectively) is read and write pixels from a device directly, bypassing plplot's internal colour maps. They only work with truecolour devices. The net affect of this are two-fold: there are no palette limitations imposed by plplot for smoothing anymore, which means text is a little smoother, and the warnings with x02c have disappeared; and, because it now directly anti-aliases with the driver's background, the "background silhouette" around text has now gone. Currently only wingcc and gd have the enhancements. Any other drivers which use freetype still using the old callbacks will remain unaffected by these changes. Also added support for varying the compression level of the PNGs. Use the command line compression option (e.g. "-compression 9") to set the compression. Index: plfreetype.c =================================================================== RCS file: /cvsroot/plplot/plplot/src/plfreetype.c,v retrieving revision 1.52 retrieving revision 1.53 diff -u -d -r1.52 -r1.53 --- plfreetype.c 29 Aug 2006 18:55:47 -0000 1.52 +++ plfreetype.c 18 Jan 2007 10:34:20 -0000 1.53 @@ -391,6 +391,8 @@ unsigned char bittest; short i,k,j; int n=slot->bitmap.pitch; + int current_pixel_colour; + int R,G,B; if ((slot->bitmap.pixel_mode==ft_pixel_mode_mono)||(pls->icol0==0)) { x+=slot->bitmap_left; @@ -409,26 +411,49 @@ } /* this is the anti-aliased stuff */ -/* At present only one anti-aliased mode is supported, using a - fixed background and palette. That might change eventually */ else { - x+=slot->bitmap_left; - y-=slot->bitmap_top; - - for(i=0;i<slot->bitmap.rows;i++) { - for (k=0;k<slot->bitmap.width;k++) { - FT->shade=(slot->bitmap.buffer[(i*slot->bitmap.width)+k]); - if (FT->shade>0) { - FT->col_idx=FT->ncol0_width-((FT->ncol0_width*FT->shade)/255); - FT->last_icol0=pls->icol0; - plcol0(pls->icol0+(FT->col_idx*(FT->ncol0_org-1))); - FT->pixel(pls,x+k,y+i); - plcol0(FT->last_icol0); - } - } + x+=slot->bitmap_left; + y-=slot->bitmap_top; + + for(i=0;i<slot->bitmap.rows;i++) + { + for (k=0;k<slot->bitmap.width;k++) + { + FT->shade=(slot->bitmap.buffer[(i*slot->bitmap.width)+k]); + if (FT->shade>0) + { + if ((FT->BLENDED_ANTIALIASING==1)&&(FT->read_pixel!=NULL)) + /* The New anti-aliasing technique */ + { + if (FT->shade==255) + { + FT->pixel(pls,x+k,y+i); + } + else + { + current_pixel_colour=FT->read_pixel(pls,x+k,y+i); + G=GetGValue(current_pixel_colour); + R=GetRValue(current_pixel_colour); + B=GetBValue(current_pixel_colour); + R+=(plsc->cmap0[pls->icol0].r*FT->shade)/255; + G+=(plsc->cmap0[pls->icol0].g*FT->shade)/255; + B+=(plsc->cmap0[pls->icol0].b*FT->shade)/255; + FT->set_pixel(pls,x+k,y+i,RGB(R>255 ? 255 : R,G>255 ? 255 : G,B>255 ? 255 : B)); + } + } + else /* The old anti-aliasing technique */ + { + FT->col_idx=FT->ncol0_width-((FT->ncol0_width*FT->shade)/255); + FT->last_icol0=pls->icol0; + plcol0(pls->icol0+(FT->col_idx*(FT->ncol0_org-1))); + FT->pixel(pls,x+k,y+i); + plcol0(FT->last_icol0); + } + } + } + } } - } } /*----------------------------------------------------------------------*\ @@ -917,7 +942,7 @@ extern int FT_Done_Library( FT_Library library ); if (FT) { - if (FT->smooth_text==1) plscmap0n(FT->ncol0_org); + if ((FT->smooth_text==1)&&(FT->BLENDED_ANTIALIASING==0)) plscmap0n(FT->ncol0_org); FT_Done_Library(FT->library); free(pls->FT); |