diff options
| author | Pierre Ossman <ossman@cendio.se> | 2014-06-12 13:28:04 +0000 |
|---|---|---|
| committer | Pierre Ossman <ossman@cendio.se> | 2014-06-12 13:28:04 +0000 |
| commit | ed7983f5b5aa2e4ccb6aff951e8a14c4015c7980 (patch) | |
| tree | a6fd7ab5c02f03a91a2df1cde7ba4461044c9202 /src/ps_image.cxx | |
| parent | 5e9624286ae76237cb1a73622db999c77b611f2d (diff) | |
Add ability to convert a Fl_Pixmap into a Fl_RGB_Image.
This is very convenient as a lot of other functions only accept
a Fl_RGB_Image. Adding this functionality also required a bit
of spring cleaning in the the drawing routines. STR #2659.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@10192 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src/ps_image.cxx')
| -rw-r--r-- | src/ps_image.cxx | 84 |
1 files changed, 29 insertions, 55 deletions
diff --git a/src/ps_image.cxx b/src/ps_image.cxx index 35d0d0e61..41dc2994f 100644 --- a/src/ps_image.cxx +++ b/src/ps_image.cxx @@ -185,72 +185,38 @@ static inline uchar swap_byte(const uchar b) { extern uchar **fl_mask_bitmap; +struct callback_data { + const uchar *data; + int D, LD; +}; -void Fl_PostScript_Graphics_Driver::draw_image(const uchar *data, int ix, int iy, int iw, int ih, int D, int LD) { - double x = ix, y = iy, w = iw, h = ih; - if (D<3){ //mono - draw_image_mono(data, ix, iy, iw, ih, D, LD); - return; - } +static void draw_image_cb(void *data, int x, int y, int w, uchar *buf) { + struct callback_data *cb_data; + const uchar *curdata; + cb_data = (struct callback_data*)data; + curdata = cb_data->data + x*cb_data->D + y*cb_data->LD; - int i,j, k; + memcpy(buf, curdata, w*cb_data->D); +} - fprintf(output,"save\n"); - const char * interpol; - if (lang_level_>1){ - if (interpolate_) - interpol="true"; - else - interpol="false"; - if (mask && lang_level_>2) - fprintf(output, "%g %g %g %g %i %i %i %i %s CIM\n", x , y+h , w , -h , iw , ih, mx, my, interpol); - else - fprintf(output, "%g %g %g %g %i %i %s CII\n", x , y+h , w , -h , iw , ih, interpol); - } else - fprintf(output , "%g %g %g %g %i %i CI", x , y+h , w , -h , iw , ih); +void Fl_PostScript_Graphics_Driver::draw_image(const uchar *data, int ix, int iy, int iw, int ih, int D, int LD) { + if (D<3){ //mono + draw_image_mono(data, ix, iy, iw, ih, D, LD); + return; + } + struct callback_data cb_data; if (!LD) LD = iw*D; - uchar *curmask=mask; - - for (j=0; j<ih;j++){ - if (mask){ - - for (k=0;k<my/ih;k++){ - for (i=0; i<((mx+7)/8);i++){ - if (!(i%80)) fprintf(output, "\n"); - fprintf(output, "%.2x",swap_byte(*curmask)); - curmask++; - } - fprintf(output,"\n"); - } - } - const uchar *curdata=data+j*LD; - for (i=0 ; i<iw ; i++) { - uchar r = curdata[0]; - uchar g = curdata[1]; - uchar b = curdata[2]; - if (lang_level_<3 && D>3) { //can do mixing using bg_* colors) - unsigned int a2 = curdata[3]; //must be int - unsigned int a = 255-a2; - r = (a2 * r + bg_r * a)/255; - g = (a2 * g + bg_g * a)/255; - b = (a2 * b + bg_b * a)/255; - } - if (!(i%40)) fprintf(output, "\n"); - fprintf(output, "%.2x%.2x%.2x", r, g, b); - curdata +=D; - } - fprintf(output,"\n"); - - } - - fprintf(output," >\nrestore\n" ); + cb_data.data = data; + cb_data.D = D; + cb_data.LD = LD; + draw_image(draw_image_cb, &cb_data, ix, iy, iw, ih, D); } void Fl_PostScript_Graphics_Driver::draw_image(Fl_Draw_Image_Cb call, void *data, int ix, int iy, int iw, int ih, int D) { @@ -325,6 +291,14 @@ void Fl_PostScript_Graphics_Driver::draw_image(Fl_Draw_Image_Cb call, void *data uchar g = curdata[1]; uchar b = curdata[2]; + if (lang_level_<3 && D>3) { //can do mixing using bg_* colors) + unsigned int a2 = curdata[3]; //must be int + unsigned int a = 255-a2; + r = (a2 * r + bg_r * a)/255; + g = (a2 * g + bg_g * a)/255; + b = (a2 * b + bg_b * a)/255; + } + if (!(i%40)) fputs("\n", output); fprintf(output, "%.2x%.2x%.2x", r, g, b); |
