Browse Source

Fix PostScript driver for fl_draw_image(buf,X,Y,W,H,D,L) with negative D or L

pull/150/head
ManoloFLTK 5 years ago
parent
commit
70da3a34b0
  1. 29
      src/drivers/PostScript/Fl_PostScript_image.cxx

29
src/drivers/PostScript/Fl_PostScript_image.cxx

@ -41,26 +41,30 @@ static void draw_image_cb(void *data, int x, int y, int w, uchar *buf) {
const uchar *curdata; const uchar *curdata;
cb_data = (struct callback_data*)data; cb_data = (struct callback_data*)data;
int last = x+w;
curdata = cb_data->data + x*cb_data->D + y*cb_data->LD; curdata = cb_data->data + x*cb_data->D + y*cb_data->LD;
for (; x<last; x++) {
memcpy(buf, curdata, w*cb_data->D); memcpy(buf, curdata, abs(cb_data->D));
buf += abs(cb_data->D);
curdata += cb_data->D;
}
} }
void Fl_PostScript_Graphics_Driver::draw_image(const uchar *data, int ix, int iy, int iw, int ih, int D, int LD) { 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 if (abs(D)<3){ //mono
draw_image_mono(data, ix, iy, iw, ih, D, LD); draw_image_mono(data, ix, iy, iw, ih, D, LD);
return; return;
} }
struct callback_data cb_data; struct callback_data cb_data;
if (!LD) LD = iw*D; if (!LD) LD = iw*abs(D);
if (D<0) data += iw*abs(D);
cb_data.data = data; cb_data.data = data;
cb_data.D = D; cb_data.D = D;
cb_data.LD = LD; cb_data.LD = LD;
draw_image(draw_image_cb, &cb_data, ix, iy, iw, ih, D); draw_image(draw_image_cb, &cb_data, ix, iy, iw, ih, abs(D));
} }
#if ! USE_PANGO #if ! USE_PANGO
@ -407,7 +411,7 @@ void Fl_PostScript_Graphics_Driver::draw_image(Fl_Draw_Image_Cb call, void *data
fprintf(output , "%g %g %g %g %i %i CI", x , y+h , w , -h , iw , ih); fprintf(output , "%g %g %g %g %i %i CI", x , y+h , w , -h , iw , ih);
} }
int LD=iw*D; int LD=iw*abs(D);
uchar *rgbdata=new uchar[LD]; uchar *rgbdata=new uchar[LD];
uchar *curmask=mask; uchar *curmask=mask;
void *big = prepare_rle85(); void *big = prepare_rle85();
@ -450,7 +454,7 @@ void Fl_PostScript_Graphics_Driver::draw_image(Fl_Draw_Image_Cb call, void *data
uchar g = curdata[1]; uchar g = curdata[1];
uchar b = curdata[2]; uchar b = curdata[2];
if (lang_level_<3 && D>3) { //can do mixing using bg_* colors) if (lang_level_<3 && abs(D)>3) { //can do mixing using bg_* colors)
unsigned int a2 = curdata[3]; //must be int unsigned int a2 = curdata[3]; //must be int
unsigned int a = 255-a2; unsigned int a = 255-a2;
r = (a2 * r + bg_r * a)/255; r = (a2 * r + bg_r * a)/255;
@ -490,7 +494,7 @@ void Fl_PostScript_Graphics_Driver::draw_image_mono(const uchar *data, int ix, i
fprintf(output , "%g %g %g %g %i %i GI", x , y+h , w , -h , iw , ih); fprintf(output , "%g %g %g %g %i %i GI", x , y+h , w , -h , iw , ih);
if (!LD) LD = iw*D; if (!LD) LD = iw*abs(D);
int bg = (bg_r + bg_g + bg_b)/3; int bg = (bg_r + bg_g + bg_b)/3;
@ -509,7 +513,7 @@ void Fl_PostScript_Graphics_Driver::draw_image_mono(const uchar *data, int ix, i
const uchar *curdata=data+j*LD; const uchar *curdata=data+j*LD;
for (i=0 ; i<iw ; i++) { for (i=0 ; i<iw ; i++) {
uchar r = curdata[0]; uchar r = curdata[0];
if (lang_level_<3 && D>1) { //can do mixing if (lang_level_<3 && abs(D)>1) { //can do mixing
unsigned int a2 = curdata[1]; //must be int unsigned int a2 = curdata[1]; //must be int
unsigned int a = 255-a2; unsigned int a = 255-a2;
@ -651,11 +655,12 @@ void Fl_PostScript_Graphics_Driver::draw_image(Fl_Draw_Image_Cb call, void *data
void Fl_PostScript_Graphics_Driver::draw_image_mono(const uchar *data, int ix, int iy, int iw, int ih, int D, int LD) void Fl_PostScript_Graphics_Driver::draw_image_mono(const uchar *data, int ix, int iy, int iw, int ih, int D, int LD)
{ {
struct callback_data cb_data; struct callback_data cb_data;
if (!LD) LD = iw*D; if (!LD) LD = iw*abs(D);
if (D<0) data += iw*abs(D);
cb_data.data = data; cb_data.data = data;
cb_data.D = D; cb_data.D = D;
cb_data.LD = LD; cb_data.LD = LD;
draw_image(draw_image_cb, &cb_data, ix, iy, iw, ih, D); draw_image(draw_image_cb, &cb_data, ix, iy, iw, ih, abs(D));
} }
void Fl_PostScript_Graphics_Driver::draw_image_mono(Fl_Draw_Image_Cb call, void *data, int ix, int iy, int iw, int ih, int D) void Fl_PostScript_Graphics_Driver::draw_image_mono(Fl_Draw_Image_Cb call, void *data, int ix, int iy, int iw, int ih, int D)

Loading…
Cancel
Save