]> git.pld-linux.org Git - packages/ghostscript.git/commitdiff
- updated gdevcd8-fixes patch is back (driver exists, just has been moved to contrib)
authorJakub Bogusz <qboosh@pld-linux.org>
Thu, 16 Sep 2010 19:48:25 +0000 (19:48 +0000)
committercvs2git <feedback@pld-linux.org>
Sun, 24 Jun 2012 12:13:13 +0000 (12:13 +0000)
Changed files:
    ghostscript-gdevcd8-fixes.patch -> 1.3
    ghostscript.spec -> 1.195

ghostscript-gdevcd8-fixes.patch [new file with mode: 0644]
ghostscript.spec

diff --git a/ghostscript-gdevcd8-fixes.patch b/ghostscript-gdevcd8-fixes.patch
new file mode 100644 (file)
index 0000000..84e5322
--- /dev/null
@@ -0,0 +1,311 @@
+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
+
+Jakub Bogusz <qboosh@pld-linux.org>
+--- ghostscript-8.71/contrib/gdevcd8.c.orig    2009-12-30 18:30:30.000000000 +0100
++++ ghostscript-8.71/contrib/gdevcd8.c 2010-09-16 09:20:18.580564844 +0200
+@@ -609,6 +609,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;             /* use K compound */
+ } gx_device_cdj850;
+ typedef struct {
+@@ -665,7 +666,7 @@
+     blackcorrect,\
+     start_raster_mode,\
+     print_non_blank_line,\
+-    terminate_page\
++    terminate_page, 1\
+ }
+ #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)\
+@@ -684,7 +685,7 @@
+     blackcorrect,\
+     start_raster_mode,\
+     print_non_blank_line,\
+-    terminate_page\
++    terminate_page, 1\
+ }
+ /* HP2200 and DNJ500 is a RGB printer */
+@@ -704,7 +705,7 @@
+     blackcorrect,\
+     start_raster_mode,\
+     print_non_blank_line,\
+-    terminate_page\
++    terminate_page, 1\
+ }
+ #define cmyk_colour_procs(proc_colour_open, proc_get_params, proc_put_params, \
+@@ -1066,6 +1067,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)) <
+@@ -1089,6 +1091,7 @@
+ {
+     int quality = cdj850->quality;
+     int papertype = cdj850->papertype;
++    int useblack = cdj850->useblack;
+     float mastergamma = cdj850->mastergamma;
+     float gammavalc = cdj850->gammavalc;
+     float gammavalm = cdj850->gammavalm;
+@@ -1101,6 +1104,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);
+@@ -1118,6 +1122,7 @@
+     cdj850->quality = quality;
+     cdj850->papertype = papertype;
++    cdj850->useblack = useblack;
+     cdj850->mastergamma = mastergamma;
+     cdj850->gammavalc = gammavalc;
+     cdj850->gammavalm = gammavalm;
+@@ -1171,7 +1176,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);
++
++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);
+@@ -2036,7 +2047,10 @@
+       }
+       /* Skip blank lines if any */
+       if (num_blank_lines > 0) {
++        if(cdj850->ptype == DJ880C)
+           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,
+@@ -2046,7 +2060,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)
+           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) {
+@@ -2072,9 +2089,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);
+     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);
+     }
+ }
+@@ -2134,16 +2153,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) {
+     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 {
++    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]);
++  }
+     /* dithering the black-plane */
+     FSDlinebw(misc_vars->scan, misc_vars->plane_size,
+             error_values, kP, misc_vars->num_comps, ep, dp);
+@@ -2212,15 +2237,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) {
+     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 {
++    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]);
++  }
+     /* dithering the black-plane */
+     FSDlinebw(misc_vars->scan, misc_vars->plane_size,
+@@ -2429,7 +2461,7 @@
+    do real color separation, here we try a real grey component
+    replacement */
+ 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)
+@@ -2467,14 +2499,15 @@
+       
+       is_color = 1;
+-      /* Test whether we 've already computet the value */
++      /* Test whether we've already computed 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 {
++      /* ??? 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);
+@@ -2511,6 +2544,7 @@
+       debug_print_string(output, strlen(output));
+     }
+ #endif /* 0 */
++        /* XXX: how byte could be >255??? --q */
+         if (   *cyan > 255)    *cyan = 255;
+         if (*magenta > 255) *magenta = 255;
+         if ( *yellow > 255)  *yellow = 255;
+@@ -2518,6 +2552,95 @@
+         *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],
++       word * inword)
++{
++  int i, ucr, kadd, is_color = 0;
++  float uca_fac;
++  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 */
++  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++; 
++    cyan = inbyte++;
++    magenta = inbyte++;
++    yellow = inbyte++;
++
++    if (*magenta + *yellow + *cyan > 0) {     /* if any color at all */
++
++#if 0
++      if ((*cyan > 0) && (*magenta > 0) && (*yellow > 0))
++      {
++        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 computed the value */
++      if (*inword == last_color_value) {
++/*    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;
++      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));
++    }
++#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 */
index 64ec2e61b2f1e8d163eddb6d5d5baf22c65cf300..b9c9ead8474ab929138ad6b1224a36ccb84f2f86 100644 (file)
@@ -34,9 +34,7 @@ Patch2:               %{name}-time_h.patch
 Patch3:                %{name}-libpng14.patch
 Patch4:                %{name}-system-zlib.patch
 Patch5:                %{name}-cups-sh.patch
-# no device for cdj850 in non-espgs ghostscript
-# look for patch in old spec for GNU ghostscript
-#Patch4:               %{name}-gdevcd8-fixes.patch
+Patch6:                %{name}-gdevcd8-fixes.patch
 URL:           http://www.ghostscript.com/
 BuildRequires: autoconf >= 2.57
 BuildRequires: automake >= 1.6
@@ -192,6 +190,7 @@ Statyczna wersja biblioteki IJS.
 %patch3 -p1
 %patch4 -p1
 %patch5 -p1
+%patch6 -p1
 
 %build
 %if %{with system_jbig2dec}
This page took 0.114682 seconds and 4 git commands to generate.