]> git.pld-linux.org Git - packages/ghostscript.git/blobdiff - ghostscript-gdevcd8-fixes.patch
- unconditional noarch subpackages
[packages/ghostscript.git] / ghostscript-gdevcd8-fixes.patch
index dce69c8d5677fa2cb11463d709f14eb7f9582b48..d109930756bf37150c61dc149c88807a2c882ff4 100644 (file)
@@ -1,23 +1,25 @@
 Fixes:
-       - cdj850 and cdj1600 were broken, because of terminating *b command
-         (by 'Y' or 'V' instead of 'y' or 'v'); now *b is terminated only
-         for cdj880)
-       - do_gcr replaced whole black component by CMY (so everything was
-         printed using colour ink!); do_gcr with NOBLACK looks strange,
-         like somebody didn't know what he's doing... now old, actual
-         DOGCR is used, but NOBLACK can be enabled by -dUseBlack=0 though
+ - cdj850 and cdj1600 were broken, because of terminating *b command
+   (by 'Y' or 'V' instead of 'y' or 'v'); now *b is terminated only
+   for cdj880
+ - do_gcr replaced whole black component by CMY (so everything was
+   printed using colour ink!); do_gcr with NOBLACK looks strange,
+   like somebody didn't know what he's doing... (see the "XXX" comments);
+   now old, actual DOGCR is used, but NOBLACK can be enabled by -dUseBlack=0
+   though
 
---- espgs-7.05.6/src/gdevcd8.c.orig    2003-07-08 21:26:53.000000000 +0200
-+++ espgs-7.05.6/src/gdevcd8.c 2003-07-09 23:07:04.000000000 +0200
-@@ -606,6 +606,7 @@
+Jakub Bogusz <qboosh@pld-linux.org>
+--- ghostscript-9.52/contrib/gdevcd8.c.orig    2020-03-19 09:21:42.000000000 +0100
++++ ghostscript-9.52/contrib/gdevcd8.c 2020-03-25 20:10:39.745178961 +0100
+@@ -604,6 +604,7 @@
      StartRasterMode start_raster_mode;        /* output function to start raster mode */
      PrintNonBlankLines print_non_blank_lines; /* output function to print a non blank line */
      TerminatePage terminate_page;     /* page termination output function */
-+    int useblack;
++    int useblack;             /* use K compound */
  } gx_device_cdj850;
  
  typedef struct {
-@@ -662,7 +663,7 @@
+@@ -659,7 +660,7 @@
      blackcorrect,\
      start_raster_mode,\
      print_non_blank_line,\
@@ -26,7 +28,7 @@ Fixes:
  }
  
  #define cdj_1600_device(procs, dev_name, x_dpi, y_dpi, bpp, print_page, correction, quality, papertype, intensities,ptype,compression,mastergamma,gammavalc,gammavalm,gammavaly,gammavalk,blackcorrect,start_raster_mode,print_non_blank_line,terminate_page)\
-@@ -681,7 +682,7 @@
+@@ -678,7 +679,7 @@
      blackcorrect,\
      start_raster_mode,\
      print_non_blank_line,\
@@ -34,8 +36,8 @@ Fixes:
 +    terminate_page, 1\
  }
  
- /* HP2200 is a RGB printer */
-@@ -701,7 +702,7 @@
+ /* HP2200 and DNJ500 is a RGB printer */
+@@ -698,7 +699,7 @@
      blackcorrect,\
      start_raster_mode,\
      print_non_blank_line,\
@@ -44,15 +46,15 @@ Fixes:
  }
  
  #define cmyk_colour_procs(proc_colour_open, proc_get_params, proc_put_params, \
-@@ -1028,6 +1029,7 @@
+@@ -1057,6 +1058,7 @@
      if (code < 0 ||
-       (code = param_write_int(plist, "Quality", &cdj850->quality)) < 0 ||
-       (code = param_write_int(plist, "Papertype", &cdj850->papertype)) < 0 ||
-+      (code = param_write_int(plist, "UseBlack", &cdj850->useblack)) < 0 ||
-       (code = param_write_float(plist, "MasterGamma", &cdj850->gammavalc))
-       < 0 ||
-       (code = param_write_float(plist, "GammaValC", &cdj850->gammavalc)) <
-@@ -1051,6 +1053,7 @@
+         (code = param_write_int(plist, "Quality", &cdj850->quality)) < 0 ||
+         (code = param_write_int(plist, "Papertype", &cdj850->papertype)) < 0 ||
++        (code = param_write_int(plist, "UseBlack", &cdj850->useblack)) < 0 ||
+         (code = param_write_float(plist, "MasterGamma", &cdj850->gammavalc))
+         < 0 ||
+         (code = param_write_float(plist, "GammaValC", &cdj850->gammavalc)) <
+@@ -1080,6 +1082,7 @@
  {
      int quality = cdj850->quality;
      int papertype = cdj850->papertype;
@@ -60,15 +62,15 @@ Fixes:
      float mastergamma = cdj850->mastergamma;
      float gammavalc = cdj850->gammavalc;
      float gammavalm = cdj850->gammavalm;
-@@ -1063,6 +1066,7 @@
+@@ -1092,6 +1095,7 @@
      code = cdj_put_param_int(plist, "BitsPerPixel", &bpp, 1, 32, code);
      code = cdj_put_param_int(plist, "Quality", &quality, 0, 2, code);
      code = cdj_put_param_int(plist, "Papertype", &papertype, 0, 4, code);
 +    code = cdj_put_param_int(plist, "UseBlack", &useblack, 0, 1, code);
-     code = cdj_put_param_float(plist, "MasterGamma", &mastergamma, 0.1, 9.0, code);
-     code = cdj_put_param_float(plist, "GammaValC", &gammavalc, 0.0, 9.0, code);
-     code = cdj_put_param_float(plist, "GammaValM", &gammavalm, 0.0, 9.0, code);
-@@ -1084,6 +1084,7 @@
+     code = cdj_put_param_float(plist, "MasterGamma", &mastergamma, 0.1f, 9.0f, code);
+     code = cdj_put_param_float(plist, "GammaValC", &gammavalc, 0.0f, 9.0f, code);
+     code = cdj_put_param_float(plist, "GammaValM", &gammavalm, 0.0f, 9.0f, code);
+@@ -1108,6 +1112,7 @@
  
      cdj850->quality = quality;
      cdj850->papertype = papertype;
@@ -76,59 +78,57 @@ Fixes:
      cdj850->mastergamma = mastergamma;
      cdj850->gammavalc = gammavalc;
      cdj850->gammavalm = gammavalm;
-@@ -1137,7 +1137,13 @@
-                          gx_device_printer * pdev,
-                          struct error_val_field *error_values));
private int
--    do_gcr(P8(int bytecount, byte * inbyte, const byte * kvalues,
-+    do_gcr_noblack(P8(int bytecount, byte * inbyte, const byte * kvalues,
-+            const byte * cvalues, const byte * mvalues,
-+            const byte * yvalues, const int *kcorrect,
-+            word * inword));
+@@ -1160,7 +1165,13 @@
+                         gx_device_printer * pdev,
+                         struct error_val_field *error_values);
static int
+-    do_gcr(int bytecount, byte * inbyte, const byte * kvalues,
++    do_gcr_noblack(int bytecount, byte * inbyte, const byte * kvalues,
++           const byte * cvalues, const byte * mvalues,
++           const byte * yvalues, const int *kcorrect,
++           word * inword);
 +
-+private int
-+    do_gcr_gcr(P8(int bytecount, byte * inbyte, const byte * kvalues,
-             const byte * cvalues, const byte * mvalues,
-             const byte * yvalues, const int *kcorrect,
-             word * inword));
-@@ -1847,7 +1851,10 @@
-       }
-       /* Skip blank lines if any */
-       if (num_blank_lines > 0) {
--          fprintf(prn_stream, "\033*b%dY", num_blank_lines / (cdj850->yscal + 1));
-+          if (cdj850->ptype == DJ880C)
-+              fprintf(prn_stream, "\033*b%dY", num_blank_lines / (cdj850->yscal + 1));
-+          else        /* still in *b if !dj880 */
-+              fprintf(prn_stream, "%dy", num_blank_lines / (cdj850->yscal + 1));
-           memset(data_ptrs->plane_data[0][0], 0,
-                  (misc_vars->plane_size * 2 * misc_vars->num_comps));
-           memset(data_ptrs->plane_data_c[0][0], 0,
-@@ -1857,7 +1864,10 @@
-       /* all blank lines printed, now for the non-blank lines */
-       if (cdj850->yscal && odd(lnum)) {
-           /* output a blank black plane for odd lines */
--          fprintf(prn_stream, "\033*b0V");
-+          if (cdj850->ptype == DJ880C)
-+              fprintf(prn_stream, "\033*b0V");
-+          else        /* still in *b if !dj880 */
-+              putc('v', prn_stream);
-       }
-       /* now output all non blank lines */
-       while (lnum < lend && llen != 0) {
-@@ -1883,9 +1893,11 @@
++static int
++    do_gcr_gcr(int bytecount, byte * inbyte, const byte * kvalues,
+            const byte * cvalues, const byte * mvalues,
+            const byte * yvalues, const int *kcorrect,
+            word * inword);
+@@ -2025,7 +2036,10 @@
+         }
+         /* Skip blank lines if any */
+         if (num_blank_lines > 0) {
++            if(cdj850->ptype == DJ880C)
+             gp_fprintf(prn_stream, "\033*b%dY", num_blank_lines / (cdj850->yscal + 1));
++            else /* still in *b if not dj880 */
++                fprintf(prn_stream, "%dy", num_blank_lines / (cdj850->yscal + 1));
+             memset(data_ptrs->plane_data[0][0], 0,
+                    (misc_vars->plane_size * 2 * misc_vars->num_comps));
+             memset(data_ptrs->plane_data_c[0][0], 0,
+@@ -2035,7 +2049,10 @@
+         /* all blank lines printed, now for the non-blank lines */
+         if (cdj850->yscal && odd(lnum)) {
+             /* output a blank black plane for odd lines */
++            if(cdj850->ptype == DJ880C)
+             gp_fprintf(prn_stream, "\033*b0V");
++            else /* still in *b if not dj880 */
++                putc('v', prn_stream);
+         }
+         /* now output all non blank lines */
+         while (lnum < lend && llen != 0) {
+@@ -2061,9 +2078,11 @@
      int out_count = gdev_pcl_mode9compress(plane_size, curr, prev, out_data);
  
      /* and output the data */
--      fprintf(prn_stream, "%d%c", out_count, plane_code);
+-        gp_fprintf(prn_stream, "%d%c", out_count, plane_code);
      if (out_count > 0) {
-+      fprintf(prn_stream, "%d%c", out_count, plane_code);
-       fwrite(out_data, sizeof(byte), out_count, prn_stream);
-+    } else {  /* single plane_code is sufficient for cdj850 */
-+      putc(plane_code, prn_stream);
++        gp_fprintf(prn_stream, "%d%c", out_count, plane_code);
+         gp_fwrite(out_data, sizeof(byte), out_count, prn_stream);
++    } else { /* single plane_code is sufficient for cdj850 */
++        putc(plane_code, prn_stream);
      }
  }
  
-@@ -1945,15 +1957,22 @@
+@@ -2122,15 +2141,22 @@
      byte *dp = data_ptrs->data[misc_vars->scan + 2];
      int *ep = data_ptrs->errors[misc_vars->scan];
  
@@ -138,87 +138,100 @@ Fixes:
         be done on all pixel-rows, since even unused color-bytes
         might generate black */
  
-+    if(cdj850->useblack) {
++  if(cdj850->useblack) {
      misc_vars->is_color_data =
--      do_gcr(misc_vars->databuff_size, data_ptrs->data[misc_vars->scan],
-+      do_gcr_gcr(misc_vars->databuff_size, data_ptrs->data[misc_vars->scan],
-              gamma->k, gamma->c, gamma->m, gamma->y, gamma->correct,
-              (word *) data_ptrs->data[misc_vars->scan]);
-+    } else {
+-        do_gcr(misc_vars->databuff_size, data_ptrs->data[misc_vars->scan],
++        do_gcr_gcr(misc_vars->databuff_size, data_ptrs->data[misc_vars->scan],
+                gamma->k, gamma->c, gamma->m, gamma->y, gamma->correct,
+                (word *) data_ptrs->data[misc_vars->scan]);
++  } else {
 +    misc_vars->is_color_data =
-+      do_gcr_noblack(misc_vars->databuff_size, data_ptrs->data[misc_vars->scan],
-+             gamma->k, gamma->c, gamma->m, gamma->y, gamma->correct,
-+             (word *) data_ptrs->data[misc_vars->scan]);
-+    }
++       do_gcr_noblack(misc_vars->databuff_size, data_ptrs->data[misc_vars->scan],
++              gamma->k, gamma->c, gamma->m, gamma->y, gamma->correct,
++              (word *) data_ptrs->data[misc_vars->scan]);
++  }
  
      /* dithering the black-plane */
      FSDlinebw(misc_vars->scan, misc_vars->plane_size,
-@@ -2028,10 +2047,17 @@
+@@ -2200,15 +2226,22 @@
+     byte *dp = data_ptrs->data[misc_vars->scan + 2];
+     int *ep = data_ptrs->errors[misc_vars->scan];
+-    /* we need cmyk color separation befor all the rest, since
++    /* we need cmyk color separation before all the rest, since
+        black may be contained in the color fields. This needs to
         be done on all pixel-rows, since even unused color-bytes
         might generate black */
  
-+    if(cdj850->useblack) {
++  if(cdj850->useblack) {
 +    misc_vars->is_color_data =
-+      do_gcr_gcr(misc_vars->databuff_size, data_ptrs->data[misc_vars->scan],
-+             gamma->k, gamma->c, gamma->m, gamma->y, gamma->correct,
-+             (word *) data_ptrs->data[misc_vars->scan]);
-+    } else {
++        do_gcr_gcr(misc_vars->databuff_size, data_ptrs->data[misc_vars->scan],
++               gamma->k, gamma->c, gamma->m, gamma->y, gamma->correct,
++               (word *) data_ptrs->data[misc_vars->scan]);
++  } else {
      misc_vars->is_color_data =
--      do_gcr(misc_vars->databuff_size, data_ptrs->data[misc_vars->scan],
-+      do_gcr_noblack(misc_vars->databuff_size, data_ptrs->data[misc_vars->scan],
-              gamma->k, gamma->c, gamma->m, gamma->y, gamma->correct,
-              (word *) data_ptrs->data[misc_vars->scan]);
-+    }
+-        do_gcr(misc_vars->databuff_size, data_ptrs->data[misc_vars->scan],
++        do_gcr_noblack(misc_vars->databuff_size, data_ptrs->data[misc_vars->scan],
+                gamma->k, gamma->c, gamma->m, gamma->y, gamma->correct,
+                (word *) data_ptrs->data[misc_vars->scan]);
++  }
  
      /* dithering the black-plane */
      FSDlinebw(misc_vars->scan, misc_vars->plane_size,
-@@ -2171,8 +2197,6 @@
-     int i;
-     for (i = 0; i < 256; i++) {
--      kcorrect[i] = 0;
--#if 0
-       kcorrect[i] = (int)
-           (100.0 * kvalue * (
-                                 pow(10.0,
-@@ -2181,7 +2205,6 @@
-                                 - 1.0
-            )
-           );
--#endif /* 0 */
-     }
-     return;
-@@ -2240,7 +2263,7 @@
+@@ -2411,7 +2444,7 @@
     do real color separation, here we try a real grey component
     replacement */
private int
static int
 -do_gcr(int bytecount, byte * inbyte, const byte kvalues[256],
 +do_gcr_noblack(int bytecount, byte * inbyte, const byte kvalues[256],
         const byte cvalues[256], const byte mvalues[256],
         const byte yvalues[256], const int kcorrect[256],
         word * inword)
-@@ -2288,6 +2311,7 @@
+@@ -2421,7 +2454,7 @@
+   word last_color_value = 0;
+   word *last_color;
+-  /* initialise *last_color with a dummmy value */
++  /* initialise *last_color with a dummy value */
+   last_color = &last_color_value;
+   /* Grey component replacement */
+   for (i = 0; i < bytecount; i += 4) {
+@@ -2451,11 +2484,12 @@
+       /* Test whether we 've already computet the value */
+       if (*inword == last_color_value) {
+         /* save a copy of the current color before it will be modified */
+-        last_color_value = *inword;
++        last_color_value = *inword; /* NOP --q */
+ /*    debug_print_string("\n", 1);*/
+         /* copy the result of the old value onto the new position */
+         *inword = *last_color;
        } else {
-       /* save a copy of the current color before it will be modified */
-       last_color_value = *inword;
-+      /* ??? these NOBLACK will be NOP after one previous NOBLACK ??? it's sick! */
++        /* ??? ALL these NOBLACKs will be NOPs after the first NOBLACK! what are they for??? --q */
+         /* save a copy of the current color before it will be modified */
+         last_color_value = *inword;
    NOBLACK(cyan, magenta, yellow, black);
-       if ((*cyan >= *magenta)
-           && (*magenta >= *yellow)
-@@ -2322,6 +2346,7 @@
-       debug_print_string(output, strlen(output));
-     }
+@@ -2493,6 +2527,7 @@
+           debug_print_string(output, strlen(output));
+         }
  #endif /* 0 */
-+        /* how BYTE can be > 255 ??? */
-         if (   *cyan > 255)    *cyan = 255;
-         if (*magenta > 255) *magenta = 255;
-         if ( *yellow > 255)  *yellow = 255;
-@@ -2338,6 +2363,97 @@
-   return is_color;
- }
-+private int
++        /* XXX: how byte could be >255??? --q */
+         if (   *cyan > 255)    *cyan = 255;
+         if (*magenta > 255) *magenta = 255;
+         if ( *yellow > 255)  *yellow = 255;
+@@ -2500,6 +2535,96 @@
+         *cyan = *(cvalues + *cyan);
+         *magenta = *(mvalues + *magenta);
+         *yellow = *(yvalues + *yellow);
++        last_color =  inword; /* save pointer */
++      }/* end current_color */
++    }                 /* end of if c+m+y > 0 */
++    *black = *(kvalues + *black);
++    inword = inword + 1;
++  } /* end of for bytecount */
++  return is_color;
++}
++
++static int
 +do_gcr_gcr(int bytecount, byte * inbyte, const byte kvalues[256],
 +       const byte cvalues[256], const byte mvalues[256],
 +       const byte yvalues[256], const int kcorrect[256],
@@ -229,15 +242,14 @@ Fixes:
 +  byte *black, *cyan, *magenta, *yellow;
 +  word last_color_value = 0;
 +  word *last_color;
-+  char output[255], out2[128];
 +
-+  /* initialise *last_color with a dummmy value */
++  /* initialise *last_color with a dummy value */
 +  last_color = &last_color_value;
 +  /* Grey component replacement */
 +  for (i = 0; i < bytecount; i += 4) {
-+    
++
 +    /* Assign to black the current address of  inbyte */
-+    black = inbyte++; 
++    black = inbyte++;
 +    cyan = inbyte++;
 +    magenta = inbyte++;
 +    yellow = inbyte++;
@@ -247,68 +259,59 @@ Fixes:
 +#if 0
 +      if ((*cyan > 0) && (*magenta > 0) && (*yellow > 0))
 +      {
-+        sprintf(output, "%3d %3d %3d %3d - ", *cyan, *magenta, *yellow, *black);
++        char output[255];
++        gs_sprintf(output, "%3d %3d %3d %3d - ", *cyan, *magenta, *yellow, *black);
 +        debug_print_string(output, strlen(output));
 +      }
 +#endif /* 0 */
-+      
++
 +      is_color = 1;
 +
 +      /* Test whether we 've already computet the value */
 +      if (*inword == last_color_value) {
-+      /* save a copy of the current color before it will be modified */
-+      last_color_value = *inword;
 +/*    debug_print_string("\n", 1);*/
-+      /* copy the result of the old value onto the new position */
-+      *inword = *last_color;
++        /* copy the result of the old value onto the new position */
++        *inword = *last_color;
 +      } else {
-+      /* save a copy of the current color before it will be modified */
-+      last_color_value = *inword;
-+      if ((*cyan >= *magenta)
-+          && (*magenta >= *yellow)
-+          && (*yellow > 0)) { /* if any grey component */
-+        DOGCR(cyan, magenta, yellow, black);
-+      } else if ((*cyan >= *yellow)
-+                 && (*yellow >= *magenta)
-+                 && (*magenta > 0)) {
-+        DOGCR(cyan, yellow, magenta, black);
-+      } else if ((*yellow >= *magenta)
-+                 && (*magenta >= *cyan)
-+                 && (*cyan > 0)) {
-+        DOGCR(yellow, magenta, cyan, black);
-+      } else if ((*yellow >= *cyan)
-+                 && (*cyan >= *magenta)
-+                 && (*magenta > 0)) {
-+        DOGCR(yellow, cyan, magenta, black);
-+      } else if ((*magenta >= *yellow)
-+                 && (*yellow >= *cyan)
-+                 && (*cyan > 0)) {
-+        DOGCR(magenta, yellow, cyan, black);
-+      } else if ((*magenta >= *cyan)
-+                 && (*cyan >= *yellow)
-+                 && (*yellow > 0)) {
-+        DOGCR(magenta, cyan, yellow, black);
-+      } else {                /* do gamma only if no black */
-+      }
++        /* save a copy of the current color before it will be modified */
++        last_color_value = *inword;
++        if ((*cyan >= *magenta)
++            && (*magenta >= *yellow)
++            && (*yellow > 0)) {       /* if any grey component */
++          DOGCR(cyan, magenta, yellow, black);
++        } else if ((*cyan >= *yellow)
++                   && (*yellow >= *magenta)
++                   && (*magenta > 0)) {
++          DOGCR(cyan, yellow, magenta, black);
++        } else if ((*yellow >= *magenta)
++                   && (*magenta >= *cyan)
++                   && (*cyan > 0)) {
++          DOGCR(yellow, magenta, cyan, black);
++        } else if ((*yellow >= *cyan)
++                   && (*cyan >= *magenta)
++                   && (*magenta > 0)) {
++          DOGCR(yellow, cyan, magenta, black);
++        } else if ((*magenta >= *yellow)
++                   && (*yellow >= *cyan)
++                   && (*cyan > 0)) {
++          DOGCR(magenta, yellow, cyan, black);
++        } else if ((*magenta >= *cyan)
++                   && (*cyan >= *yellow)
++                   && (*yellow > 0)) {
++          DOGCR(magenta, cyan, yellow, black);
++        } else {              /* do gamma only if no black */
++        }
 +#if 0
-+        if (ucr > 0)
-+        {
-+      sprintf(output, "%3d %3d %3d %3d - %5d\n", *cyan, *magenta, *yellow, *black, ucr);
-+      debug_print_string(output, strlen(output));
-+    }
++        if (ucr > 0)
++        {
++          char output[255];
++          gs_sprintf(output, "%3d %3d %3d %3d - %5d\n", *cyan, *magenta, *yellow, *black, ucr);
++          debug_print_string(output, strlen(output));
++        }
 +#endif /* 0 */
-+        *cyan = *(cvalues + *cyan);
-+        *magenta = *(mvalues + *magenta);
-+        *yellow = *(yvalues + *yellow);
-+        last_color =  inword; /* save pointer */
-+      }/* end current_color */
-+    }                 /* end of if c+m+y > 0 */
-+    *black = *(kvalues + *black);
-+    inword = inword + 1;
-+  } /* end of for bytecount */
-+  return is_color;
-+}
-+
- /* Since resolution can be different on different planes, we need to
-    rescale the data byte by byte */
- private int
++        *cyan = *(cvalues + *cyan);
++        *magenta = *(mvalues + *magenta);
++        *yellow = *(yvalues + *yellow);
+         last_color =  inword; /* save pointer */
+       }/* end current_color */
+     }                 /* end of if c+m+y > 0 */
This page took 0.101844 seconds and 4 git commands to generate.