FLTK logo

[master] 70da3a3 - Fix PostScript driver for fl_draw_image(buf,X,Y,W,H,D,L) with negative D or L

FLTK matrix user chat room
(using Element browser app)   FLTK gitter user chat room   GitHub FLTK Project   FLTK News RSS Feed  
  FLTK Apps      FLTK Library      Forums      Links     Login 
 All Forums  |  Back to fltk.commit  ]
 
Previous Message ]Next Message ]

[master] 70da3a3 - Fix PostScript driver for fl_draw_image(buf,X,Y,W,H,D,L) with negative D or L "ManoloFLTK" Oct 29, 2020  
 
commit 70da3a34b0b52aa4e80120064f46b52aff987fd6
Author:     ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>
AuthorDate: Thu Oct 29 15:37:09 2020 +0100
Commit:     ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>
CommitDate: Thu Oct 29 15:37:20 2020 +0100

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

 src/drivers/PostScript/Fl_PostScript_image.cxx | 29 +++++++++++++++-----------
 1 file changed, 17 insertions(+), 12 deletions(-)

diff --git src/drivers/PostScript/Fl_PostScript_image.cxx src/drivers/PostScript/Fl_PostScript_image.cxx
index 6cee421..a9fcdb6 100644
--- src/drivers/PostScript/Fl_PostScript_image.cxx
+++ 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;
 
   cb_data = (struct callback_data*)data;
+  int last = x+w;
   curdata = cb_data->data + x*cb_data->D + y*cb_data->LD;
-
-  memcpy(buf, curdata, w*cb_data->D);
+  for (; x<last; x++) {
+    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) {
-  if (D<3){ //mono
+  if (abs(D)<3){ //mono
     draw_image_mono(data, ix, iy, iw, ih, D, LD);
     return;
   }
 
   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.D = D;
   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
@@ -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);
   }
 
-  int LD=iw*D;
+  int LD=iw*abs(D);
   uchar *rgbdata=new uchar[LD];
   uchar *curmask=mask;
   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 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 a = 255-a2;
           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);
 
 
-  if (!LD) LD = iw*D;
+  if (!LD) LD = iw*abs(D);
 
 
   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;
     for (i=0 ; i<iw ; i++) {
       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 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)
 {
   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.D = D;
   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)
Direct Link to Message ]
 
     
Previous Message ]Next Message ]
 
 

Comments are owned by the poster. All other content is copyright 1998-2024 by Bill Spitzak and others. This project is hosted by The FLTK Team. Please report site problems to 'erco@seriss.com'.