diff -rc print/README /tmp/print/README
*** print/README        Thu Dec 16 14:44:01 1999
--- /tmp/print/README   Thu Jan 13 18:41:34 2000
***************
*** 1,4 ****
! Print plugin for the Gimp.  Version 3.0 by Robert Krawitz
  <[EMAIL PROTECTED]> based on version 2.0 by Michael Sweet
  <[EMAIL PROTECTED]>.
  
--- 1,4 ----
! Print plugin for the Gimp.  Version 3.0.5 by Robert Krawitz
  <[EMAIL PROTECTED]> based on version 2.0 by Michael Sweet
  <[EMAIL PROTECTED]>.
  
***************
*** 69,81 ****
  
  * One group of settings you might want to start with is:
  
!   Brightness 110
!   Gamma 1.3
!   Contrast 80
!   Green 94
!   Blue 89
!   Saturation 1.15
!   Density 1.6
  
  
  Makefile.standalone enables you to build this plugin as a standalone
--- 69,79 ----
  
  * One group of settings you might want to start with is:
  
!   Brightness 45
!   Gamma 1.5
!   Contrast 105
!   Saturation 1.4
!   Density 0.8
  
  
  Makefile.standalone enables you to build this plugin as a standalone
***************
*** 84,87 ****
  
  Enjoy!
  
! -Robert Krawitz, November 14, 1999
--- 82,85 ----
  
  Enjoy!
  
! -Robert Krawitz, January 13, 2000
diff -rc print/print-escp2.c /tmp/print/print-escp2.c
*** print/print-escp2.c Thu Dec 16 14:44:01 1999
--- /tmp/print/print-escp2.c    Wed Jan 12 22:32:34 2000
***************
*** 1,9 ****
  /*
!  * "$Id: print-escp2.c,v 1.12 1999/12/16 19:44:01 olofk Exp $"
   *
   *   Print plug-in EPSON ESC/P2 driver for the GIMP.
   *
!  *   Copyright 1997-1999 Michael Sweet ([EMAIL PROTECTED]) and
   *    Robert Krawitz ([EMAIL PROTECTED])
   *
   *   This program is free software; you can redistribute it and/or modify it
--- 1,9 ----
  /*
!  * "$Id: print-escp2.c,v 1.39.2.1 2000/01/13 03:32:34 rlk Exp $"
   *
   *   Print plug-in EPSON ESC/P2 driver for the GIMP.
   *
!  *   Copyright 1997-2000 Michael Sweet ([EMAIL PROTECTED]) and
   *    Robert Krawitz ([EMAIL PROTECTED])
   *
   *   This program is free software; you can redistribute it and/or modify it
***************
*** 31,76 ****
   * Revision History:
   *
   *   $Log: print-escp2.c,v $
!  *   Revision 1.12  1999/12/16 19:44:01  olofk
!  *   Thu Dec 16 20:15:25 CET 1999  Olof S Kylande <[EMAIL PROTECTED]>
   *
!  *           Fix of KDE/Kwm  selection add/sub/inter problem
!  *           NOTE: This is a workaround, not a real fix.
!  *           Many Thanks to Matthias Ettrich
!  *
!  *           * app/disp_callbacks.c
!  *
!  *           Updated unsharp-mask to version 0.10
!  *
!  *           * plug-ins/unsharp/dialog_f.c
!  *           * plug-ins/unsharp/dialog_f.h
!  *           * plug-ins/unsharp/dialog_i.c
!  *           * plug-ins/unsharp/dialog_i.h
!  *           * plug-ins/unsharp/unsharp.c
!  *
!  *           Updated print plug-in to version 3.0.1
!  *
!  *           * plug-ins/print/README (new file)
!  *           * plug-ins/print/print-escp2.c
!  *           * plug-ins/print/print-pcl.c
!  *           * plug-ins/print/print-ps.c
!  *           * plug-ins/print/print-util.c
!  *           * plug-ins/print/print.c
!  *           * plug-ins/print/print.h
!  *
!  *           Updated all files in the help/C/dialogs dir. This is
!  *           a first alpha glimpse of the help system. Please give
!  *           me feedback of the content. However since it's in alpha
!  *           stage it means that there is spell, grammatical, etc errors.
!  *           There is may also be pure errors which I hope "you" will
!  *           report to either [EMAIL PROTECTED] or [EMAIL PROTECTED] Please
!  *           don't report spell, grammatical, etc error at this stage in dev.
   *
!  *           If you have any plans to commit to the help system please write
!  *           to [EMAIL PROTECTED] (This is mandatory not a please ;-).
   *
!  *           * help/C/welcome.html
!  *           * help/C/dialogs/about.html ..............
   *
   *   Revision 1.31  1999/12/05 22:10:53  rlk
   *   minor, prep for release
--- 31,62 ----
   * Revision History:
   *
   *   $Log: print-escp2.c,v $
!  *   Revision 1.39.2.1  2000/01/13 03:32:34  rlk
!  *   silliness
   *
!  *   Revision 1.39  2000/01/13 03:25:31  rlk
!  *   bug fix from mainline
   *
!  *   Revision 1.38  2000/01/08 23:27:54  rlk
!  *   Rearrange setup code; more printers to support softweave
   *
!  *   Revision 1.37  1999/12/19 14:36:18  rlk
!  *   Make 'em big enough
!  *
!  *   Revision 1.36  1999/12/18 23:08:28  rlk
!  *   comments, mostly
!  *
!  *   Revision 1.35  1999/12/11 15:26:27  rlk
!  *   hopefully get borders right
!  *
!  *   Revision 1.34  1999/12/11 04:52:35  rlk
!  *   bug fixes
!  *
!  *   Revision 1.33  1999/12/11 04:25:23  rlk
!  *   various other print modes
!  *
!  *   Revision 1.32  1999/12/11 01:46:13  rlk
!  *   Better weaving code -- not absolutely complete yet
   *
   *   Revision 1.31  1999/12/05 22:10:53  rlk
   *   minor, prep for release
***************
*** 330,336 ****
  
  static void escp2_write(FILE *, unsigned char *, int, int, int, int, int,
                        int, int);
! static void initialize_weave(int jets, int separation, int horizontal);
  static void escp2_flush(int model, int width, int hoffset, int ydpi,
                        int xdpi, FILE *prn);
  static void
--- 316,323 ----
  
  static void escp2_write(FILE *, unsigned char *, int, int, int, int, int,
                        int, int);
! static void initialize_weave(int jets, int separation,
!                            int oversample, int horizontal);
  static void escp2_flush(int model, int width, int hoffset, int ydpi,
                        int xdpi, FILE *prn);
  static void
***************
*** 349,391 ****
   * Various classes of printer capabilities are represented by bitmasks.
   */
  
! typedef unsigned int model_cap_t;
  typedef model_cap_t model_featureset_t;
  typedef model_cap_t model_class_t;
  
! #define MODEL_PAPER_SIZE_MASK 0x3
! #define MODEL_PAPER_SMALL     0x0
! #define MODEL_PAPER_LARGE     0x1
! #define MODEL_PAPER_1200      0x2
! 
! #define MODEL_IMAGEABLE_MASK  0xc
! #define MODEL_IMAGEABLE_DEFAULT       0x0
! #define MODEL_IMAGEABLE_PHOTO 0x4
! #define MODEL_IMAGEABLE_600   0x8
! 
! #define MODEL_INIT_MASK               0xf0
! #define MODEL_INIT_COLOR      0x00
! #define MODEL_INIT_PRO                0x10
! #define MODEL_INIT_1500               0x20
! #define MODEL_INIT_600                0x30
! #define MODEL_INIT_PHOTO      0x40
! 
! #define MODEL_HASBLACK_MASK   0x100
! #define MODEL_HASBLACK_YES    0x000
! #define MODEL_HASBLACK_NO     0x100
! 
! #define MODEL_6COLOR_MASK     0x200
! #define MODEL_6COLOR_NO               0x000
! #define MODEL_6COLOR_YES      0x200
! 
! #define MODEL_720DPI_MODE_MASK        0xc00
! #define MODEL_720DPI_DEFAULT  0x000
! #define MODEL_720DPI_600      0x400
! #define MODEL_720DPI_PHOTO    0x400 /* 0x800 for experimental stuff */
! 
! #define MODEL_1440DPI_MASK    0x1000
! #define MODEL_1440DPI_NO      0x0000
! #define MODEL_1440DPI_YES     0x1000
  
  /*
   * SUGGESTED SETTINGS FOR STYLUS PHOTO EX:
--- 336,385 ----
   * Various classes of printer capabilities are represented by bitmasks.
   */
  
! typedef unsigned long long model_cap_t;
  typedef model_cap_t model_featureset_t;
  typedef model_cap_t model_class_t;
  
! #define MODEL_PAPER_SIZE_MASK 0x300
! #define MODEL_PAPER_SMALL     0x000
! #define MODEL_PAPER_LARGE     0x100
! #define MODEL_PAPER_1200      0x200
! 
! #define MODEL_IMAGEABLE_MASK  0xc00
! #define MODEL_IMAGEABLE_DEFAULT       0x000
! #define MODEL_IMAGEABLE_PHOTO 0x400
! #define MODEL_IMAGEABLE_600   0x800
! 
! #define MODEL_INIT_MASK               0xf000
! #define MODEL_INIT_COLOR      0x0000
! #define MODEL_INIT_PRO                0x1000
! #define MODEL_INIT_1500               0x2000
! #define MODEL_INIT_600                0x3000
! #define MODEL_INIT_PHOTO      0x4000
! 
! #define MODEL_HASBLACK_MASK   0x10000
! #define MODEL_HASBLACK_YES    0x00000
! #define MODEL_HASBLACK_NO     0x10000
! 
! #define MODEL_6COLOR_MASK     0x20000
! #define MODEL_6COLOR_NO               0x00000
! #define MODEL_6COLOR_YES      0x20000
! 
! #define MODEL_720DPI_MODE_MASK        0xc0000
! #define MODEL_720DPI_DEFAULT  0x00000
! #define MODEL_720DPI_600      0x40000
! #define MODEL_720DPI_PHOTO    0x40000 /* 0x80000 for experimental stuff */
! 
! #define MODEL_1440DPI_MASK    0x100000
! #define MODEL_1440DPI_NO      0x000000
! #define MODEL_1440DPI_YES     0x100000
! 
! #define MODEL_NOZZLES_MASK    0xff000000
! #define MODEL_MAKE_NOZZLES(x)         ((long long) ((x)) << 24)
! #define MODEL_GET_NOZZLES(x)  (((x) & MODEL_NOZZLES_MASK) >> 24)
! #define MODEL_SEPARATION_MASK 0xf00000000ll
! #define MODEL_MAKE_SEPARATION(x)      (((long long) (x)) << 32)
! #define MODEL_GET_SEPARATION(x)       (((x) & MODEL_SEPARATION_MASK) >> 32)
  
  /*
   * SUGGESTED SETTINGS FOR STYLUS PHOTO EX:
***************
*** 413,456 ****
   * The green and blue will vary somewhat with different inks
   */
  
  model_cap_t model_capabilities[] =
  {
    /* Stylus Color */
    (MODEL_PAPER_SMALL | MODEL_IMAGEABLE_DEFAULT | MODEL_INIT_COLOR
     | MODEL_HASBLACK_YES | MODEL_6COLOR_NO | MODEL_720DPI_DEFAULT
!    | MODEL_1440DPI_NO),
    /* Stylus Color Pro/Pro XL/400/500 */
    (MODEL_PAPER_SMALL | MODEL_IMAGEABLE_DEFAULT | MODEL_INIT_PRO
     | MODEL_HASBLACK_YES | MODEL_6COLOR_NO | MODEL_720DPI_DEFAULT
!    | MODEL_1440DPI_NO),
    /* Stylus Color 1500 */
    (MODEL_PAPER_LARGE | MODEL_IMAGEABLE_DEFAULT | MODEL_INIT_1500
     | MODEL_HASBLACK_NO | MODEL_6COLOR_NO | MODEL_720DPI_DEFAULT
!    | MODEL_1440DPI_NO),
    /* Stylus Color 600 */
    (MODEL_PAPER_SMALL | MODEL_IMAGEABLE_600 | MODEL_INIT_600
     | MODEL_HASBLACK_YES | MODEL_6COLOR_NO | MODEL_720DPI_600
!    | MODEL_1440DPI_NO),
    /* Stylus Color 800 */
    (MODEL_PAPER_SMALL | MODEL_IMAGEABLE_600 | MODEL_INIT_600
     | MODEL_HASBLACK_YES | MODEL_6COLOR_NO | MODEL_720DPI_DEFAULT
!    | MODEL_1440DPI_NO),
    /* Stylus Color 1520/3000 */
    (MODEL_PAPER_LARGE | MODEL_IMAGEABLE_600 | MODEL_INIT_600
     | MODEL_HASBLACK_YES | MODEL_6COLOR_NO | MODEL_720DPI_DEFAULT
!    | MODEL_1440DPI_NO),
    /* Stylus Photo 700 */
    (MODEL_PAPER_SMALL | MODEL_IMAGEABLE_PHOTO | MODEL_INIT_PHOTO
     | MODEL_HASBLACK_YES | MODEL_6COLOR_YES | MODEL_720DPI_PHOTO
!    | MODEL_1440DPI_YES),
    /* Stylus Photo EX */
    (MODEL_PAPER_LARGE | MODEL_IMAGEABLE_PHOTO | MODEL_INIT_PHOTO
     | MODEL_HASBLACK_YES | MODEL_6COLOR_YES | MODEL_720DPI_PHOTO
!    | MODEL_1440DPI_YES),
    /* Stylus Photo */
    (MODEL_PAPER_SMALL | MODEL_IMAGEABLE_PHOTO | MODEL_INIT_PHOTO
     | MODEL_HASBLACK_YES | MODEL_6COLOR_YES | MODEL_720DPI_PHOTO
!    | MODEL_1440DPI_NO),
  };
  
  static int
--- 407,474 ----
   * The green and blue will vary somewhat with different inks
   */
  
+ 
  model_cap_t model_capabilities[] =
  {
    /* Stylus Color */
    (MODEL_PAPER_SMALL | MODEL_IMAGEABLE_DEFAULT | MODEL_INIT_COLOR
     | MODEL_HASBLACK_YES | MODEL_6COLOR_NO | MODEL_720DPI_DEFAULT
!    | MODEL_1440DPI_NO | MODEL_MAKE_NOZZLES(1) | MODEL_MAKE_SEPARATION(1)),
    /* Stylus Color Pro/Pro XL/400/500 */
    (MODEL_PAPER_SMALL | MODEL_IMAGEABLE_DEFAULT | MODEL_INIT_PRO
     | MODEL_HASBLACK_YES | MODEL_6COLOR_NO | MODEL_720DPI_DEFAULT
!    | MODEL_1440DPI_NO | MODEL_MAKE_NOZZLES(1) | MODEL_MAKE_SEPARATION(1)),
    /* Stylus Color 1500 */
    (MODEL_PAPER_LARGE | MODEL_IMAGEABLE_DEFAULT | MODEL_INIT_1500
     | MODEL_HASBLACK_NO | MODEL_6COLOR_NO | MODEL_720DPI_DEFAULT
!    | MODEL_1440DPI_NO | MODEL_MAKE_NOZZLES(1) | MODEL_MAKE_SEPARATION(1)),
    /* Stylus Color 600 */
    (MODEL_PAPER_SMALL | MODEL_IMAGEABLE_600 | MODEL_INIT_600
     | MODEL_HASBLACK_YES | MODEL_6COLOR_NO | MODEL_720DPI_600
!    | MODEL_1440DPI_NO | MODEL_MAKE_NOZZLES(1) | MODEL_MAKE_SEPARATION(1)),
    /* Stylus Color 800 */
    (MODEL_PAPER_SMALL | MODEL_IMAGEABLE_600 | MODEL_INIT_600
     | MODEL_HASBLACK_YES | MODEL_6COLOR_NO | MODEL_720DPI_DEFAULT
!    | MODEL_1440DPI_NO | MODEL_MAKE_NOZZLES(64) | MODEL_MAKE_SEPARATION(8)),
    /* Stylus Color 1520/3000 */
    (MODEL_PAPER_LARGE | MODEL_IMAGEABLE_600 | MODEL_INIT_600
     | MODEL_HASBLACK_YES | MODEL_6COLOR_NO | MODEL_720DPI_DEFAULT
!    | MODEL_1440DPI_NO | MODEL_MAKE_NOZZLES(64) | MODEL_MAKE_SEPARATION(8)),
    /* Stylus Photo 700 */
    (MODEL_PAPER_SMALL | MODEL_IMAGEABLE_PHOTO | MODEL_INIT_PHOTO
     | MODEL_HASBLACK_YES | MODEL_6COLOR_YES | MODEL_720DPI_PHOTO
!    | MODEL_1440DPI_YES | MODEL_MAKE_NOZZLES(32) | MODEL_MAKE_SEPARATION(8)),
    /* Stylus Photo EX */
    (MODEL_PAPER_LARGE | MODEL_IMAGEABLE_PHOTO | MODEL_INIT_PHOTO
     | MODEL_HASBLACK_YES | MODEL_6COLOR_YES | MODEL_720DPI_PHOTO
!    | MODEL_1440DPI_YES | MODEL_MAKE_NOZZLES(32) | MODEL_MAKE_SEPARATION(8)),
    /* Stylus Photo */
    (MODEL_PAPER_SMALL | MODEL_IMAGEABLE_PHOTO | MODEL_INIT_PHOTO
     | MODEL_HASBLACK_YES | MODEL_6COLOR_YES | MODEL_720DPI_PHOTO
!    | MODEL_1440DPI_NO | MODEL_MAKE_NOZZLES(32) | MODEL_MAKE_SEPARATION(8)),
! };
! 
! typedef struct {
!   const char name[65];
!   int hres;
!   int vres;
!   int softweave;
!   int horizontal_passes;
!   int vertical_passes;
! } res_t;
! 
! res_t reslist[] = {
!   { "360 DPI", 360, 360, 0, 1, 1 },
!   { "720 DPI Microweave", 720, 720, 0, 1, 1 },
!   { "720 DPI Softweave", 720, 720, 1, 1, 1 },
!   { "720 DPI High Quality", 720, 720, 1, 1, 2 },
!   { "720 DPI Highest Quality", 720, 720, 1, 1, 4 },
!   { "1440 x 720 DPI Microweave", 1440, 720, 0, 1, 1 },
!   { "1440 x 720 DPI Softweave", 1440, 720, 1, 2, 2 },
!   { "1440 x 720 DPI Highest Quality", 1440, 720, 1, 2, 4 },
!   { "1440 x 720 DPI Two-pass", 2880, 720, 1, 2, 4 },
!   { "1440 x 720 DPI Two-pass Microweave", 2880, 720, 0, 1, 1 },
!   { "", 0, 0, 0, 0, 0 }
  };
  
  static int
***************
*** 465,470 ****
--- 483,500 ----
    return (model_capabilities[model] & featureset);
  }
  
+ static int
+ escp2_nozzles(int model)
+ {
+   return MODEL_GET_NOZZLES(model_capabilities[model]);
+ }
+ 
+ static int
+ escp2_nozzle_separation(int model)
+ {
+   return MODEL_GET_SEPARATION(model_capabilities[model]);
+ }
+ 
  /*
   * 'escp2_parameters()' - Return the parameter values for the given parameter.
   */
***************
*** 476,483 ****
                   int  *count)         /* O - Number of values */
  {
    int         i;
!   char                **p,
!               **valptrs;
    static char *media_sizes[] =
                {
                  ("Letter"),
--- 506,512 ----
                   int  *count)         /* O - Number of values */
  {
    int         i;
!   char                **valptrs;
    static char *media_sizes[] =
                {
                  ("Letter"),
***************
*** 487,503 ****
                  ("A3"),
                  ("12x18")
                };
-   static char *resolutions[] =
-               {
-                 ("360 DPI"),
-                 ("720 DPI Microweave"),
-                 ("720 DPI Softweave"),
-                 ("1440 x 720 DPI"),
-                 ("1440 x 720 DPI Microweave"),
-                 ("1440 x 720 DPI Two-pass"),
-                 ("1440 x 720 DPI Two-pass Microweave")
-               };
- 
  
    if (count == NULL)
      return (NULL);
--- 516,521 ----
***************
*** 514,541 ****
      else
        *count = 3;
  
!     p = media_sizes;
    }
    else if (strcmp(name, "Resolution") == 0)
    {
!     if (escp2_has_cap(model, MODEL_1440DPI_MASK, MODEL_1440DPI_YES))
!       *count = 7;
!     else
!       *count = 3;
!     p = resolutions;
    }
    else
      return (NULL);
  
-   valptrs = malloc(*count * sizeof(char *));
-   for (i = 0; i < *count; i ++)
-     {
-       /* strdup doesn't appear to be POSIX... */
-       valptrs[i] = malloc(strlen(p[i]) + 1);
-       strcpy(valptrs[i], p[i]);
-     }
- 
-   return (valptrs);
  }
  
  
--- 532,574 ----
      else
        *count = 3;
  
!     valptrs = malloc(*count * sizeof(char *));
!     for (i = 0; i < *count; i ++)
!       {
!       /* strdup doesn't appear to be POSIX... */
!       valptrs[i] = malloc(strlen(media_sizes[i]) + 1);
!       strcpy(valptrs[i], media_sizes[i]);
!       }
!     return (valptrs);
    }
    else if (strcmp(name, "Resolution") == 0)
    {
!     res_t *res = &(reslist[0]);
!     valptrs = malloc(sizeof(char *) * sizeof(reslist) / sizeof(res_t));
!     *count = 0;
!     while(res->hres)
!       {
!       if (escp2_has_cap(model, MODEL_1440DPI_MASK, MODEL_1440DPI_YES) ||
!           (res->hres <= 720 && res->vres <= 720))
!         {
!           int nozzles = escp2_nozzles(model);
!           int separation = escp2_nozzle_separation(model);
!           int max_weave = nozzles / separation;
!           if (! res->softweave ||
!               (nozzles > 1 && res->vertical_passes <= max_weave))
!             {
!               valptrs[*count] = malloc(strlen(res->name) + 1);
!               strcpy(valptrs[*count], res->name);
!               (*count)++;
!             }
!         }
!       res++;
!       }
!     return (valptrs);
    }
    else
      return (NULL);
  
  }
  
  
***************
*** 563,569 ****
          *left   = 9;
          *right  = width - 9;
          *top    = length;
!         *bottom = 49;
          break;
  
    case MODEL_IMAGEABLE_600:
--- 596,602 ----
          *left   = 9;
          *right  = width - 9;
          *top    = length;
!         *bottom = 80;
          break;
  
    case MODEL_IMAGEABLE_600:
***************
*** 642,647 ****
--- 675,682 ----
    int         nozzles = 1;
    int         nozzle_separation = 1;
    int         horizontal_passes = 1;
+   int         vertical_passes = 1;
+   res_t       *res;
  
   /*
    * Setup a read-only pixel region for the entire image...
***************
*** 683,743 ****
   /*
    * Figure out the output resolution...
    */
! 
!   xdpi = ydpi = atoi(resolution);
!   if (escp2_has_cap(model, MODEL_1440DPI_MASK, MODEL_1440DPI_YES))
      {
!       if (xdpi == 1440)
        {
!         use_softweave = 1;
!         ydpi = 720;
!         if (!strcmp(resolution, "1440 x 720 DPI Two-pass") ||
!             !strcmp(resolution, "1440 x 720 DPI Two-pass Microweave"))
!           {
!             xdpi = 2880;
!             horizontal_passes = 4;
!             if (!strcmp(resolution, "1440 x 720 DPI Two-pass"))
!               {
!                 nozzles = 32;
!                 nozzle_separation = 8;
!               }
!             else
!               {
!                 nozzles = 1;
!                 nozzle_separation = 1;
!               }
!           }
!         else
!           {
!             horizontal_passes = 2;
!             if (!strcmp(resolution, "1440 x 720 DPI"))
!               {
!                 nozzles = 32;
!                 nozzle_separation = 8;
!               }
!             else
!               {
!                 nozzles = 1;
!                 nozzle_separation = 1;
!               }
!           }
        }
!     }
!   else if (ydpi == 1440)
!     {
!       ydpi = 720;
!       xdpi = 720;
!     }
!   if (escp2_has_cap(model, MODEL_6COLOR_MASK, MODEL_6COLOR_YES))
!     {
!       if (!strcmp(resolution, "720 DPI Softweave") || xdpi > 720)
        {
!         if (!strcmp(resolution, "720 DPI Softweave"))
!           {
!             nozzles = 32;
!             nozzle_separation = 8;
!           }
!         use_softweave = 1;
        }
      }
  
--- 718,739 ----
   /*
    * Figure out the output resolution...
    */
!   for (res = &reslist[0];;res++)
      {
!       if (!strcmp(resolution, res->name))
        {
!         use_softweave = res->softweave;
!         horizontal_passes = res->horizontal_passes;
!         vertical_passes = res->vertical_passes;
!         xdpi = res->hres;
!         ydpi = res->vres;
!         nozzles = escp2_nozzles(model);
!         nozzle_separation = escp2_nozzle_separation(model);
!         break;
        }
!       else if (!strcmp(resolution, ""))
        {
!         return;         
        }
      }
  
***************
*** 897,920 ****
          break;
    }
  
    switch (escp2_cap(model, MODEL_INIT_MASK)) /* Printer specific initialization */
    {
      case MODEL_INIT_COLOR : /* ESC */
!         if (output_type == OUTPUT_COLOR && ydpi > 360)
                  fwrite("\033(i\001\000\001", 6, 1, prn);      /* Microweave mode on 
*/
          break;
  
      case MODEL_INIT_PRO : /* ESC Pro, Pro XL, 400, 500 */
          fwrite("\033(e\002\000\000\001", 7, 1, prn);  /* Small dots */
  
!         if (ydpi > 360)
                  fwrite("\033(i\001\000\001", 6, 1, prn);      /* Microweave mode on 
*/
          break;
  
      case MODEL_INIT_1500 : /* ESC 1500 */
          fwrite("\033(e\002\000\000\001", 7, 1, prn);  /* Small dots */
  
!         if (ydpi > 360)
                  fwrite("\033(i\001\000\001", 6, 1, prn);      /* Microweave mode on 
*/
          break;
  
--- 893,919 ----
          break;
    }
  
+   if (use_softweave)
+     initialize_weave(nozzles, nozzle_separation, horizontal_passes,
+                    vertical_passes);
    switch (escp2_cap(model, MODEL_INIT_MASK)) /* Printer specific initialization */
    {
      case MODEL_INIT_COLOR : /* ESC */
!         if (output_type == OUTPUT_COLOR && ydpi > 360 && !use_softweave)
                  fwrite("\033(i\001\000\001", 6, 1, prn);      /* Microweave mode on 
*/
          break;
  
      case MODEL_INIT_PRO : /* ESC Pro, Pro XL, 400, 500 */
          fwrite("\033(e\002\000\000\001", 7, 1, prn);  /* Small dots */
  
!         if (ydpi > 360 && !use_softweave)
                  fwrite("\033(i\001\000\001", 6, 1, prn);      /* Microweave mode on 
*/
          break;
  
      case MODEL_INIT_1500 : /* ESC 1500 */
          fwrite("\033(e\002\000\000\001", 7, 1, prn);  /* Small dots */
  
!         if (ydpi > 360 && !use_softweave)
                  fwrite("\033(i\001\000\001", 6, 1, prn);      /* Microweave mode on 
*/
          break;
  
***************
*** 926,968 ****
  
          fwrite("\033(e\002\000\000\002", 7, 1, prn);  /* Small dots */
  
!         if (ydpi > 360)
                  fwrite("\033(i\001\000\001", 6, 1, prn);      /* Microweave mode on 
*/
          break;
  
      case MODEL_INIT_PHOTO:
          if (ydpi > 360)
          {
!           if (use_softweave)
!             {
!               if (horizontal_passes > 1)
!                 fwrite("\033U\000", 3, 1, prn); /* Unidirectional */
!               else
!                 fwrite("\033U\000", 3, 1, prn); /* Unidirectional */
!               fwrite("\033(i\001\000\000", 6, 1, prn); /* Microweave off! */
!               initialize_weave(nozzles, nozzle_separation, horizontal_passes);
!               fwrite("\033(e\002\000\000\004", 7, 1, prn);    /* Microdots */
!             }
!           else
!             {
!               fwrite("\033U\000", 3, 1, prn); /* Unidirectional */
!               fwrite("\033(i\001\000\001", 6, 1, prn); /* Microweave on */
!               fwrite("\033(e\002\000\000\004", 7, 1, prn);    /* Microdots */
!             }
! #if 0
!           fwrite("\033\0311", 3, 1, prn); /* ??? */
! #endif
          }
        else
          fwrite("\033(e\002\000\000\003", 7, 1, prn);  /* Whatever dots */
          break;
- 
- #if 0
-       if (output_type == OUTPUT_GRAY)
-         fwrite("\033(K\002\000\000\001", 7, 1, prn);  /* Fast black printing */
-       else
-         fwrite("\033(K\002\000\000\002", 7, 1, prn);  /* Color printing */
- #endif
    }
  
    fwrite("\033(C\002\000", 5, 1, prn);                /* Page length */
--- 925,949 ----
  
          fwrite("\033(e\002\000\000\002", 7, 1, prn);  /* Small dots */
  
!         if (ydpi > 360 && !use_softweave)
                  fwrite("\033(i\001\000\001", 6, 1, prn);      /* Microweave mode on 
*/
          break;
  
      case MODEL_INIT_PHOTO:
+       if (output_type == OUTPUT_GRAY)
+         fwrite("\033(K\002\000\000\001", 7, 1, prn);  /* Fast black printing */
+       else
+         fwrite("\033(K\002\000\000\002", 7, 1, prn);  /* Color printing */
          if (ydpi > 360)
          {
!           fwrite("\033U\000", 3, 1, prn); /* Unidirectional */
!           if (!use_softweave)
!             fwrite("\033(i\001\000\001", 6, 1, prn); /* Microweave on */
!           fwrite("\033(e\002\000\000\004", 7, 1, prn);        /* Microdots */
          }
        else
          fwrite("\033(e\002\000\000\003", 7, 1, prn);  /* Whatever dots */
          break;
    }
  
    fwrite("\033(C\002\000", 5, 1, prn);                /* Page length */
***************
*** 975,980 ****
--- 956,963 ----
    putc(n & 255, prn);
    putc(n >> 8, prn);
    n = ydpi * (page_length - page_bottom) / 72;
+   if (use_softweave)
+     n += 320 * ydpi / 720;
    putc(n & 255, prn);
    putc(n >> 8, prn);
  
***************
*** 1043,1052 ****
      
      for (x = 0; x < out_height; x ++)
      {
- #if 0
-       printf("escp2_print: x = %d, line = %d, val = %d, mod = %d, height = %d\n",
-              x, errline, errval, errmod, out_height);
- #endif
        if ((x & 255) == 0)
        Image_note_progress(image, x, out_height);
  
--- 1026,1031 ----
***************
*** 1091,1102 ****
        {
          dither_cmyk(out, x, image_height, out_width, cyan, 0, magenta, 0,
                      yellow, 0, black, horizontal_passes);
! 
!         escp2_write(prn, cyan, length, 0, 2, ydpi, model, out_width, left);
!         escp2_write(prn, magenta, length, 0, 1, ydpi, model, out_width, left);
!         escp2_write(prn, yellow, length, 0, 4, ydpi, model, out_width, left);
!         if (black != NULL)
!           escp2_write(prn, black, length, 0, 0, ydpi, model, out_width, left);
        }
  
        if (!use_softweave)
--- 1070,1090 ----
        {
          dither_cmyk(out, x, image_height, out_width, cyan, 0, magenta, 0,
                      yellow, 0, black, horizontal_passes);
!       if (use_softweave)
!         escp2_write_weave(prn, length, ydpi, model, out_width, left, xdpi,
!                           cyan, magenta, yellow, black, NULL, NULL);
!       else
!         {
!           escp2_write(prn, cyan, length, 0, 2, ydpi, model, out_width,
!                       left);
!           escp2_write(prn, magenta, length, 0, 1, ydpi, model, out_width,
!                       left);
!           escp2_write(prn, yellow, length, 0, 4, ydpi, model, out_width,
!                       left);
!           if (black != NULL)
!             escp2_write(prn, black, length, 0, 0, ydpi, model, out_width,
!                         left);
!         }
        }
  
        if (!use_softweave)
***************
*** 1126,1136 ****
      
      for (y = 0; y < out_height; y ++)
      {
- #if 0
-       printf("escp2_print: y = %d, line = %d, val = %d, mod = %d, height = %d, 
length = %d\n",
-              y, errline, errval, errmod, out_height, length);
- #endif
- 
        if ((y & 255) == 0)
        Image_note_progress(image, y, out_height);
  
--- 1114,1119 ----
***************
*** 1174,1185 ****
        {
          dither_cmyk(out, y, image_width, out_width, cyan, 0, magenta, 0,
                      yellow, 0, black, horizontal_passes);
! 
!         escp2_write(prn, cyan, length, 0, 2, ydpi, model, out_width, left);
!         escp2_write(prn, magenta, length, 0, 1, ydpi, model, out_width, left);
!         escp2_write(prn, yellow, length, 0, 4, ydpi, model, out_width, left);
!         if (black != NULL)
!           escp2_write(prn, black, length, 0, 0, ydpi, model, out_width, left);
        }
  
        if (!use_softweave)
--- 1157,1177 ----
        {
          dither_cmyk(out, y, image_width, out_width, cyan, 0, magenta, 0,
                      yellow, 0, black, horizontal_passes);
!       if (use_softweave)
!         escp2_write_weave(prn, length, ydpi, model, out_width, left, xdpi,
!                           cyan, magenta, yellow, black, NULL, NULL);
!       else
!         {
!           escp2_write(prn, cyan, length, 0, 2, ydpi, model, out_width,
!                       left);
!           escp2_write(prn, magenta, length, 0, 1, ydpi, model, out_width,
!                       left);
!           escp2_write(prn, yellow, length, 0, 4, ydpi, model, out_width,
!                       left);
!           if (black != NULL)
!             escp2_write(prn, black, length, 0, 0, ydpi, model, out_width,
!                         left);
!         }
        }
  
        if (!use_softweave)
***************
*** 1324,1330 ****
             int           width,       /* I - Printed width */
             int           offset)      /* I - Offset from left side */
  {
!   unsigned char       comp_buf[1536],         /* Compression buffer */
      *comp_ptr;
    static int    last_density = 0;       /* Last density printed */
    static int  last_plane = 0;         /* Last color plane printed */
--- 1316,1322 ----
             int           width,       /* I - Printed width */
             int           offset)      /* I - Offset from left side */
  {
!   unsigned char       comp_buf[3072],         /* Compression buffer */
      *comp_ptr;
    static int    last_density = 0;       /* Last density printed */
    static int  last_plane = 0;         /* Last color plane printed */
***************
*** 1358,1364 ****
        fprintf(prn, "\033r%c", plane);
    }
  
!   if (escp2_has_cap(model, MODEL_6COLOR_MASK, MODEL_6COLOR_YES))
      fprintf(prn, "\033(\\%c%c%c%c%c%c", 4, 0, 160, 5,
            (offset * 1440 / ydpi) & 255, (offset * 1440 / ydpi) >> 8);
    else
--- 1350,1356 ----
        fprintf(prn, "\033r%c", plane);
    }
  
!   if (escp2_has_cap(model, MODEL_1440DPI_MASK, MODEL_1440DPI_YES))
      fprintf(prn, "\033(\\%c%c%c%c%c%c", 4, 0, 160, 5,
            (offset * 1440 / ydpi) & 255, (offset * 1440 / ydpi) >> 8);
    else
***************
*** 1465,1470 ****
--- 1457,1475 ----
   * lets me use all of the nozzles, except near the top and bottom of the
   * page.
   *
+  * This still produces some banding, though.  Even better quality can be
+  * achieved by using multiple nozzles on the same line.  How do we do this?
+  * In 1440x720 mode, we're printing two output lines at the same vertical
+  * position.  However, if we want four passes, we have to effectively print
+  * each line twice.  Actually doing this would increase the density, so
+  * what we do is print half the dots on each pass.  This produces near-perfect
+  * output, and it's far faster than using "MicroWeave".
+  *
+  * The current algorithm is not completely general.  The number of passes
+  * is limited to (nozzles / gap).  On the Photo EX class printers, that limits
+  * it to 4 -- 32 nozzles, an inter-nozzle gap of 8 lines.  Furthermore, there
+  * are a number of routines that are only coded up to 4 passes.
+  *
   * The routine initialize_weave calculates the basic parameters, given
   * the number of jets and separation between jets, in rows.
   *
***************
*** 1555,1560 ****
--- 1560,1569 ----
  static int horizontal_weave;  /* Number of horizontal passes required */
                                /* This is > 1 for some of the ultra-high */
                                /* resolution modes */
+ static int vertical_subpasses;        /* Number of passes per line (for better */
+                               /* quality) */
+ static int vmod;              /* Number of banks of passes */
+ static int oversample;                /* Excess precision per row */
  
  /*
   * Mapping between color and linear index.  The colors are
***************
*** 1580,1586 ****
   * Initialize the weave parameters
   */
  static void
! initialize_weave(int jets, int sep, int horizontal_passes)
  {
    int i;
    int k;
--- 1589,1595 ----
   * Initialize the weave parameters
   */
  static void
! initialize_weave(int jets, int sep, int osample, int v_subpasses)
  {
    int i;
    int k;
***************
*** 1592,1602 ****
    else
      separation = sep;
    njets = jets;
!   if (horizontal_passes <= 0)
!     horizontal_passes = 1;
!   horizontal_weave = horizontal_passes;
  
!   weavefactor = jets / separation;
    jetsused = ((weavefactor) * separation);
    initialoffset = (jetsused - weavefactor - 1) * separation;
    jetsleftover = njets - jetsused + 1;
--- 1601,1615 ----
    else
      separation = sep;
    njets = jets;
!   if (v_subpasses <= 0)
!     v_subpasses = 1;
!   oversample = osample;
!   vertical_subpasses = v_subpasses;
!   njets /= vertical_subpasses;
!   vmod = separation * vertical_subpasses;
!   horizontal_weave = 1;
  
!   weavefactor = njets / separation;
    jetsused = ((weavefactor) * separation);
    initialoffset = (jetsused - weavefactor - 1) * separation;
    jetsleftover = njets - jetsused + 1;
***************
*** 1605,1619 ****
    last_pass_offset = 0;
    last_pass = -1;
  
!   linebufs = malloc(6 * 1536 * separation * jetsused * horizontal_passes);
!   lineoffsets = malloc(separation * sizeof(lineoff_t) * horizontal_passes);
!   linebases = malloc(separation * sizeof(linebufs_t) * horizontal_passes);
!   passes = malloc(separation * sizeof(pass_t));
!   linecounts = malloc(separation * sizeof(int));
  
    bufbase = linebufs;
    
!   for (i = 0; i < separation; i++)
      {
        int j;
        passes[i].pass = -1;
--- 1618,1632 ----
    last_pass_offset = 0;
    last_pass = -1;
  
!   linebufs = malloc(6 * 3072 * vmod * jets * horizontal_weave);
!   lineoffsets = malloc(vmod * sizeof(lineoff_t) * horizontal_weave);
!   linebases = malloc(vmod * sizeof(linebufs_t) * horizontal_weave);
!   passes = malloc(vmod * sizeof(pass_t));
!   linecounts = malloc(vmod * sizeof(int));
  
    bufbase = linebufs;
    
!   for (i = 0; i < vmod; i++)
      {
        int j;
        passes[i].pass = -1;
***************
*** 1621,1691 ****
        {
          for (j = 0; j < 6; j++)
            {
!             linebases[i * horizontal_weave + k].v[j] = bufbase;
!             bufbase += 1536 * jetsused;
            }
        }
      }
  }
  
  static lineoff_t *
! get_lineoffsets(int row)
  {
!   return &(lineoffsets[horizontal_weave * (row % separation)]);
  }
  
  static int *
! get_linecount(int row)
  {
!   return &(linecounts[row % separation]);
  }
  
  static const linebufs_t *
! get_linebases(int row)
  {
!   return &(linebases[horizontal_weave * (row % separation)]);
  }
  
  static pass_t *
! get_pass(int row_or_pass)
  {
!   return &(passes[row_or_pass % separation]);
  }
  
! /*
!  * Compute the weave parameters for the given row.  This computation is
!  * rather complex, and I need to go back and write down very carefully
!  * what's going on here.
!  */
  
! static void
! weave_parameters_by_row(int row, weave_t *w)
  {
!   int passblockstart = (row + initialoffset) / jetsused;
!   int internaljetsused = jetsused;
!   int internallogicalpassstart;
!   w->row = row;
!   w->pass = (passblockstart - (separation - 1)) +
!     (separation + row - passblockstart - 1) % separation;
!   internallogicalpassstart = (w->pass * jetsused) - initialoffset +
!     (w->pass % separation);
!   if (internallogicalpassstart < 0)
!     {
!       internaljetsused -=
!       (((separation - 1) - internallogicalpassstart) / separation);
!       internallogicalpassstart += separation *
!       (((separation - 1) - internallogicalpassstart) / separation);
!     }
!   w->logicalpassstart =  internallogicalpassstart;
!   w->jet = ((row - w->logicalpassstart) / separation);
!   if (internallogicalpassstart >= 0)
!     w->physpassstart = internallogicalpassstart;
!   else
!     w->physpassstart = internallogicalpassstart +
!       (separation * ((separation - internallogicalpassstart) / separation));
!   w->physpassend = (internaljetsused - 1) * separation +
!     internallogicalpassstart;
!   w->missingstartrows = (w->physpassstart - w->logicalpassstart) / separation;
  }
  
  /*
--- 1634,1743 ----
        {
          for (j = 0; j < 6; j++)
            {
!             linebases[k * vmod + i].v[j] = bufbase;
!             bufbase += 3072 * jets;
            }
        }
      }
  }
  
+ /*
+  * Compute the weave parameters for the given row.  This computation is
+  * rather complex, and I need to go back and write down very carefully
+  * what's going on here.
+  */
+ 
+ static void
+ weave_parameters_by_row(int row, int vertical_subpass, weave_t *w)
+ {
+   int passblockstart = (row + initialoffset) / jetsused;
+   int internaljetsused = jetsused * vertical_subpasses;
+   int subpass_adjustment;
+ 
+   w->row = row;
+   w->pass = (passblockstart - (separation - 1)) +
+     (separation + row - passblockstart - 1) % separation;
+   subpass_adjustment = ((w->pass + 1) / separation) % vertical_subpasses;
+   subpass_adjustment = vertical_subpasses - subpass_adjustment - 1;
+   vertical_subpass = (vertical_subpass + subpass_adjustment) % vertical_subpasses;
+   w->pass += separation * vertical_subpass;
+   w->logicalpassstart = (w->pass * jetsused) - initialoffset +
+     (w->pass % separation);
+   w->jet = ((row - w->logicalpassstart) / separation);
+   w->jet += jetsused * (vertical_subpasses - 1);
+   w->logicalpassstart = w->row - (w->jet * separation);
+   if (w->logicalpassstart >= 0)
+     w->physpassstart = w->logicalpassstart;
+   else
+     w->physpassstart = w->logicalpassstart +
+       (separation * ((separation - 1 - w->logicalpassstart) / separation));
+   w->physpassend = (internaljetsused - 1) * separation +
+     w->logicalpassstart;
+   w->missingstartrows = (w->physpassstart - w->logicalpassstart) / separation;
+   if (w->pass < 0)
+     {
+       w->logicalpassstart -= w->pass * separation;
+       w->physpassend -= w->pass * separation;
+       w->jet += w->pass;
+       w->missingstartrows += w->pass;
+     }
+   w->pass++;
+ }
+ 
  static lineoff_t *
! get_lineoffsets(int row, int subpass)
  {
!   weave_t w;
!   weave_parameters_by_row(row, subpass, &w);
!   return &(lineoffsets[w.pass % vmod]);
  }
  
  static int *
! get_linecount(int row, int subpass)
  {
!   weave_t w;
!   weave_parameters_by_row(row, subpass, &w);
!   return &(linecounts[w.pass % vmod]);
  }
  
  static const linebufs_t *
! get_linebases(int row, int subpass)
  {
!   weave_t w;
!   weave_parameters_by_row(row, subpass, &w);
!   return &(linebases[w.pass % vmod]);
  }
  
  static pass_t *
! get_pass_by_row(int row, int subpass)
  {
!   weave_t w;
!   weave_parameters_by_row(row, subpass, &w);
!   return &(passes[w.pass % vmod]);
  }
  
! static lineoff_t *
! get_lineoffsets_by_pass(int pass)
! {
!   return &(lineoffsets[pass % vmod]);
! }
  
! static int *
! get_linecount_by_pass(int pass)
  {
!   return &(linecounts[pass % vmod]);
! }
! 
! static const linebufs_t *
! get_linebases_by_pass(int pass)
! {
!   return &(linebases[pass % vmod]);
! }
! 
! static pass_t *
! get_pass_by_pass(int pass)
! {
!   return &(passes[pass % vmod]);
  }
  
  /*
***************
*** 1699,1712 ****
   */
  
  static void
! fillin_start_rows(int row, int width, int missingstartrows)
  {
!   lineoff_t *offsets = get_lineoffsets(row);
!   const linebufs_t *bufs = get_linebases(row);
    int i = 0;
    int k = 0;
    int j;
    int m;
    for (k = 0; k < missingstartrows; k++)
      {
        int bytes_to_fill = width;
--- 1751,1765 ----
   */
  
  static void
! fillin_start_rows(int row, int subpass, int width, int missingstartrows)
  {
!   lineoff_t *offsets = get_lineoffsets(row, subpass);
!   const linebufs_t *bufs = get_linebases(row, subpass);
    int i = 0;
    int k = 0;
    int j;
    int m;
+   width = (width + (oversample - 1)) / oversample;
    for (k = 0; k < missingstartrows; k++)
      {
        int bytes_to_fill = width;
***************
*** 1761,1784 ****
  initialize_row(int row, int width)
  {
    weave_t w;
!   weave_parameters_by_row(row, &w);
!   if (w.physpassstart == row)
      {
!       lineoff_t *lineoffs = get_lineoffsets(row);
!       int *linecount = get_linecount(row);
!       int j, k;
!       pass_t *pass = get_pass(row);
!       pass->pass = w.pass;
!       pass->missingstartrows = w.missingstartrows;
!       pass->logicalpassstart = w.logicalpassstart;
!       pass->physpassstart = w.physpassstart;
!       pass->physpassend = w.physpassend;
!       for (k = 0; k < horizontal_weave; k++)
!       for (j = 0; j < 6; j++)
!         lineoffs[k].v[j] = 0;
!       *linecount = 0;
!       if (w.missingstartrows > 0)
!       fillin_start_rows(row, width, w.missingstartrows);
      }
  }
  
--- 1814,1841 ----
  initialize_row(int row, int width)
  {
    weave_t w;
!   int i;
!   for (i = 0; i < vertical_subpasses; i++)
      {
!       weave_parameters_by_row(row, i, &w);
!       if (w.physpassstart == row)
!       {
!         lineoff_t *lineoffs = get_lineoffsets(row, i);
!         int *linecount = get_linecount(row, i);
!         int j, k;
!         pass_t *pass = get_pass_by_row(row, i);
!         pass->pass = w.pass;
!         pass->missingstartrows = w.missingstartrows;
!         pass->logicalpassstart = w.logicalpassstart;
!         pass->physpassstart = w.physpassstart;
!         pass->physpassend = w.physpassend;
!         for (k = 0; k < horizontal_weave; k++)
!           for (j = 0; j < 6; j++)
!             lineoffs[k].v[j] = 0;
!         *linecount = 0;
!         if (w.missingstartrows > 0)
!           fillin_start_rows(row, i, width, w.missingstartrows);
!       }
      }
  }
  
***************
*** 1793,1814 ****
  {
    int j;
    int k;
!   lineoff_t *lineoffs = get_lineoffsets(passno);
!   const linebufs_t *bufs = get_linebases(passno);
!   pass_t *pass = get_pass(passno);
!   int *linecount = get_linecount(passno);
!   int lwidth = (width + (horizontal_weave - 1)) / horizontal_weave;
! #if 0
!   fprintf(stderr, "Flushing pass %d start %d last %d\n", passno, 
pass->physpassstart, last_pass_offset);
! #endif
    if (pass->physpassstart > last_pass_offset)
      {
        int advance = pass->logicalpassstart - last_pass_offset;
        int alo = advance % 256;
        int ahi = advance / 256;
- #if 0
-       fprintf(stderr, "  advancing %d lines\n", advance);
- #endif
        fprintf(prn, "\033(v\002%c%c%c", 0, alo, ahi);
        last_pass_offset = pass->logicalpassstart;
      }
--- 1850,1865 ----
  {
    int j;
    int k;
!   lineoff_t *lineoffs = get_lineoffsets_by_pass(passno);
!   const linebufs_t *bufs = get_linebases_by_pass(passno);
!   pass_t *pass = get_pass_by_pass(passno);
!   int *linecount = get_linecount_by_pass(passno);
!   int lwidth = (width + (oversample - 1)) / oversample;
    if (pass->physpassstart > last_pass_offset)
      {
        int advance = pass->logicalpassstart - last_pass_offset;
        int alo = advance % 256;
        int ahi = advance / 256;
        fprintf(prn, "\033(v\002%c%c%c", 0, alo, ahi);
        last_pass_offset = pass->logicalpassstart;
      }
***************
*** 1818,1839 ****
        {
          if (lineoffs[k].v[j] == 0)
            continue;
          if (escp2_has_cap(model, MODEL_1440DPI_MASK, MODEL_1440DPI_YES))
            {
-             fprintf(prn, "\033(r\002%c%c%c", 0, densities[j], colors[j]);
              /* FIXME need a more general way of specifying column */
              /* separation */
              fprintf(prn, "\033(\\%c%c%c%c%c%c", 4, 0, 160, 5,
!                     ((hoffset * 1440 / ydpi) +
!                      (k & (horizontal_weave >> 1))) & 255,
!                     ((hoffset * 1440 / ydpi) +
!                      (k & (horizontal_weave >> 1))) >> 8);
            }
-         else if (densities[j] > 0)
-           continue;
          else
            {
-             fprintf(prn, "\033r%c", colors[j]);
              fprintf(prn, "\033\\%c%c", hoffset & 255, hoffset >> 8);
            }
          switch (ydpi)                         /* Raster graphics header */
--- 1869,1890 ----
        {
          if (lineoffs[k].v[j] == 0)
            continue;
+         if (escp2_has_cap(model, MODEL_6COLOR_MASK, MODEL_6COLOR_YES))
+           fprintf(prn, "\033(r\002%c%c%c", 0, densities[j], colors[j]);
+         else if (densities[j] > 0)
+           continue;
+         else
+           fprintf(prn, "\033r%c", colors[j]);
          if (escp2_has_cap(model, MODEL_1440DPI_MASK, MODEL_1440DPI_YES))
            {
              /* FIXME need a more general way of specifying column */
              /* separation */
              fprintf(prn, "\033(\\%c%c%c%c%c%c", 4, 0, 160, 5,
!                     ((hoffset * 1440 / ydpi) + (k & oversample)) & 255,
!                     ((hoffset * 1440 / ydpi) + (k & oversample)) >> 8);
            }
          else
            {
              fprintf(prn, "\033\\%c%c", hoffset & 255, hoffset >> 8);
            }
          switch (ydpi)                         /* Raster graphics header */
***************
*** 1859,1869 ****
          putc(lwidth & 255, prn);      /* Width of raster line in pixels */
          putc(lwidth >> 8, prn);
          fwrite(bufs[k].v[j], lineoffs[k].v[j], 1, prn);
- #if 0
-         fprintf(stderr, "Sending %d bytes, plane %d, density %d, lines %d, x %d\n",
-                 lineoffs[k].v[j], colors[j], densities[j],
-                 *linecount + pass->missingstartrows, k);
- #endif
          putc('\r', prn);
        }
        fwrite("\033\006", 2, 1, prn);
--- 1910,1915 ----
***************
*** 1874,1903 ****
  
  static void
  add_to_row(int row, unsigned char *buf, size_t nbytes, int plane, int density,
!          int horizontal)
  {
    weave_t w;
    int color = get_color_by_params(plane, density);
!   lineoff_t *lineoffs = get_lineoffsets(row);
!   const linebufs_t *bufs = get_linebases(row);
!   weave_parameters_by_row(row, &w);
!   memcpy(bufs[horizontal].v[color] + lineoffs[horizontal].v[color],
!        buf, nbytes);
!   lineoffs[horizontal].v[color] += nbytes;
  }
  
  static void
  finalize_row(int row, int model, int width, int hoffset, int ydpi, int xdpi,
             FILE *prn)
  {
!   weave_t w;
!   int *lines = get_linecount(row);
!   weave_parameters_by_row(row, &w);
!   (*lines)++;
!   if (w.physpassend == row)
      {
!       pass_t *pass = get_pass(row);
!       flush_pass(pass->pass, model, width, hoffset, ydpi, xdpi, prn);
      }
  }
  
--- 1920,1952 ----
  
  static void
  add_to_row(int row, unsigned char *buf, size_t nbytes, int plane, int density,
!          int subpass)
  {
    weave_t w;
    int color = get_color_by_params(plane, density);
!   lineoff_t *lineoffs = get_lineoffsets(row, subpass);
!   const linebufs_t *bufs = get_linebases(row, subpass);
!   weave_parameters_by_row(row, subpass, &w);
!   memcpy(bufs[0].v[color] + lineoffs[0].v[color], buf, nbytes);
!   lineoffs[0].v[color] += nbytes;
  }
  
  static void
  finalize_row(int row, int model, int width, int hoffset, int ydpi, int xdpi,
             FILE *prn)
  {
!   int i;
!   for (i = 0; i < vertical_subpasses; i++)
      {
!       weave_t w;
!       int *lines = get_linecount(row, i);
!       weave_parameters_by_row(row, i, &w);
!       (*lines)++;
!       if (w.physpassend == row)
!       {
!         pass_t *pass = get_pass_by_row(row, i);
!         flush_pass(pass->pass, model, width, hoffset, ydpi, xdpi, prn);
!       }
      }
  }
  
***************
*** 1906,1912 ****
  {
    while (1)
      {
!       pass_t *pass = get_pass(last_pass + 1);
        if (pass->pass < 0)
        return;
        flush_pass(pass->pass, model, width, hoffset, ydpi, xdpi, prn);
--- 1955,1961 ----
  {
    while (1)
      {
!       pass_t *pass = get_pass_by_pass(last_pass + 1);
        if (pass->pass < 0)
        return;
        flush_pass(pass->pass, model, width, hoffset, ydpi, xdpi, prn);
***************
*** 1914,1919 ****
--- 1963,2003 ----
  }
  
  static void
+ escp2_split_2(int length,
+             const unsigned char *in,
+             unsigned char *outlo,
+             unsigned char *outhi)
+ {
+   int i;
+   for (i = 0; i < length; i++)
+     {
+       unsigned char inbyte = in[i];
+       outlo[i] = inbyte & 0x55;
+       outhi[i] = inbyte & 0xaa;
+     }
+ }
+ 
+ static void
+ escp2_split_4(int length,
+             const unsigned char *in,
+             unsigned char *out0,
+             unsigned char *out1,
+             unsigned char *out2,
+             unsigned char *out3)
+ {
+   int i;
+   for (i = 0; i < length; i++)
+     {
+       unsigned char inbyte = in[i];
+       out0[i] = inbyte & 0x11;
+       out1[i] = inbyte & 0x22;
+       out2[i] = inbyte & 0x44;
+       out3[i] = inbyte & 0x88;
+     }
+ }
+ 
+ 
+ static void
  escp2_unpack_2(int length,
               const unsigned char *in,
               unsigned char *outlo,
***************
*** 2050,2205 ****
                  unsigned char *M)
  {
    static int lineno = 0;
!   static unsigned char s[4][1536];
!   static unsigned char comp_buf[1536];
    unsigned char *comp_ptr;
!   int i;
  
    initialize_row(lineno, width);
    
!   if (c)
!     {
!       if (horizontal_weave > 1)
!       {
!         if (horizontal_weave == 2)
!           escp2_unpack_2(length, c, s[0], s[1]);
!         else
!           escp2_unpack_4(length, c, s[0], s[1], s[2], s[3]);
!         for (i = 0; i < horizontal_weave; i++)
!           {
!             escp2_pack(s[i],
!                        (length + horizontal_weave - 1) / horizontal_weave,
!                        comp_buf, &comp_ptr);
!             add_to_row(lineno, comp_buf, comp_ptr - comp_buf, 2, 0, i);
!           }
!       }
!       else
!       {
!         escp2_pack(c, length, comp_buf, &comp_ptr);
!         add_to_row(lineno, comp_buf, comp_ptr - comp_buf, 2, 0, 0);
!       }
!     }
! 
!   if (m)
!     {
!       if (horizontal_weave > 1)
!       {
!         if (horizontal_weave == 2)
!           escp2_unpack_2(length, m, s[0], s[1]);
!         else
!           escp2_unpack_4(length, m, s[0], s[1], s[2], s[3]);
!         for (i = 0; i < horizontal_weave; i++)
!           {
!             escp2_pack(s[i],
!                        (length + horizontal_weave - 1) / horizontal_weave,
!                        comp_buf, &comp_ptr);
!             add_to_row(lineno, comp_buf, comp_ptr - comp_buf, 1, 0, i);
!           }
!       }
!       else
!       {
!         escp2_pack(m, length, comp_buf, &comp_ptr);
!         add_to_row(lineno, comp_buf, comp_ptr - comp_buf, 1, 0, 0);
!       }
!     }
! 
!   if (y)
!     {
!       if (horizontal_weave > 1)
!       {
!         if (horizontal_weave == 2)
!           escp2_unpack_2(length, y, s[0], s[1]);
!         else
!           escp2_unpack_4(length, y, s[0], s[1], s[2], s[3]);
!         for (i = 0; i < horizontal_weave; i++)
!           {
!             escp2_pack(s[i],
!                        (length + horizontal_weave - 1) / horizontal_weave,
!                        comp_buf, &comp_ptr);
!             add_to_row(lineno, comp_buf, comp_ptr - comp_buf, 4, 0, i);
!           }
!       }
!       else
!       {
!         escp2_pack(y, length, comp_buf, &comp_ptr);
!         add_to_row(lineno, comp_buf, comp_ptr - comp_buf, 4, 0, 0);
!       }
!     }
! 
!   if (k)
!     {
!       if (horizontal_weave > 1)
!       {
!         if (horizontal_weave == 2)
!           escp2_unpack_2(length, k, s[0], s[1]);
!         else
!           escp2_unpack_4(length, k, s[0], s[1], s[2], s[3]);
!         for (i = 0; i < horizontal_weave; i++)
!           {
!             escp2_pack(s[i],
!                        (length + horizontal_weave - 1) / horizontal_weave,
!                        comp_buf, &comp_ptr);
!             add_to_row(lineno, comp_buf, comp_ptr - comp_buf, 0, 0, i);
!           }
!       }
!       else
!       {
!         escp2_pack(k, length, comp_buf, &comp_ptr);
!         add_to_row(lineno, comp_buf, comp_ptr - comp_buf, 0, 0, 0);
!       }
!     }
! 
!   if (C)
      {
!       if (horizontal_weave > 1)
        {
!         if (horizontal_weave == 2)
!           escp2_unpack_2(length, C, s[0], s[1]);
!         else
!           escp2_unpack_4(length, C, s[0], s[1], s[2], s[3]);
!         for (i = 0; i < horizontal_weave; i++)
            {
!             escp2_pack(s[i],
!                        (length + horizontal_weave - 1) / horizontal_weave,
!                        comp_buf, &comp_ptr);
!             add_to_row(lineno, comp_buf, comp_ptr - comp_buf, 2, 1, i);
            }
-       }
-       else
-       {
-         escp2_pack(C, length, comp_buf, &comp_ptr);
-         add_to_row(lineno, comp_buf, comp_ptr - comp_buf, 2, 1, 0);
-       }
-     }
- 
-   if (M)
-     {
-       if (horizontal_weave > 1)
-       {
-         if (horizontal_weave == 2)
-           escp2_unpack_2(length, M, s[0], s[1]);
          else
-           escp2_unpack_4(length, M, s[0], s[1], s[2], s[3]);
-         for (i = 0; i < horizontal_weave; i++)
            {
!             escp2_pack(s[i],
!                        (length + horizontal_weave - 1) / horizontal_weave,
!                        comp_buf, &comp_ptr);
!             add_to_row(lineno, comp_buf, comp_ptr - comp_buf, 1, 1, i);
            }
        }
-       else
-       {
-         escp2_pack(M, length, comp_buf, &comp_ptr);
-         add_to_row(lineno, comp_buf, comp_ptr - comp_buf, 1, 1, 0);
-       }
      }
- 
    finalize_row(lineno, model, width, offset, ydpi, xdpi, prn);
    lineno++;
- 
  }
  
  /*
!  * End of "$Id: print-escp2.c,v 1.12 1999/12/16 19:44:01 olofk Exp $".
   */
--- 2134,2205 ----
                  unsigned char *M)
  {
    static int lineno = 0;
!   static unsigned char s[4][3072];
!   static unsigned char comp_buf[3072];
    unsigned char *comp_ptr;
!   int i, j;
!   unsigned char *cols[6];
!   cols[0] = k;
!   cols[1] = m;
!   cols[2] = c;
!   cols[3] = y;
!   cols[4] = M;
!   cols[5] = C;
  
    initialize_row(lineno, width);
    
!   for (j = 0; j < 6; j++)
      {
!       if (cols[j])
        {
!         if (vertical_subpasses > 1)
            {
!             switch (oversample)
!               {
!               case 2:
!                 escp2_unpack_2(length, cols[j], s[0], s[1]);
!                 break;
!               case 4:
!                 escp2_unpack_4(length, cols[j], s[0], s[1], s[2], s[3]);
!                 break;
!               }
!             switch (vertical_subpasses / oversample)
!               {
!               case 4:
!                 escp2_split_4(length, cols[j], s[0], s[1], s[2], s[3]);
!                 break;
!               case 2:
!                 if (oversample == 1)
!                   {               
!                     escp2_split_2(length, cols[j], s[0], s[1]);
!                   }
!                 else
!                   {               
!                     escp2_split_2(length, s[1], s[1], s[3]);
!                     escp2_split_2(length, s[0], s[0], s[2]);
!                   }
!                 break;
!               }
!             for (i = 0; i < vertical_subpasses; i++)
!               {
!                 escp2_pack(s[i], ((length + oversample - 1) / oversample),
!                            comp_buf, &comp_ptr);
!                 add_to_row(lineno, comp_buf, comp_ptr - comp_buf,
!                            colors[j], densities[j], i);
!               }
            }
          else
            {
!             escp2_pack(cols[j], length, comp_buf, &comp_ptr);
!             add_to_row(lineno, comp_buf, comp_ptr - comp_buf,
!                        colors[j], densities[j], 0);
            }
        }
      }
    finalize_row(lineno, model, width, offset, ydpi, xdpi, prn);
    lineno++;
  }
  
  /*
!  * End of "$Id: print-escp2.c,v 1.39.2.1 2000/01/13 03:32:34 rlk Exp $".
   */
diff -rc print/print-pcl.c /tmp/print/print-pcl.c
*** print/print-pcl.c   Thu Dec 16 14:44:01 1999
--- /tmp/print/print-pcl.c      Sat Jan  8 18:30:56 2000
***************
*** 1,9 ****
  /*
!  * "$Id: print-pcl.c,v 1.12 1999/12/16 19:44:01 olofk Exp $"
   *
   *   Print plug-in HP PCL driver for the GIMP.
   *
!  *   Copyright 1997-1999 Michael Sweet ([EMAIL PROTECTED]) and
   *    Robert Krawitz ([EMAIL PROTECTED])
   *
   *   This program is free software; you can redistribute it and/or modify it
--- 1,9 ----
  /*
!  * "$Id: print-pcl.c,v 1.14 2000/01/08 23:30:56 rlk Exp $"
   *
   *   Print plug-in HP PCL driver for the GIMP.
   *
!  *   Copyright 1997-2000 Michael Sweet ([EMAIL PROTECTED]) and
   *    Robert Krawitz ([EMAIL PROTECTED])
   *
   *   This program is free software; you can redistribute it and/or modify it
***************
*** 32,77 ****
   * Revision History:
   *
   *   $Log: print-pcl.c,v $
!  *   Revision 1.12  1999/12/16 19:44:01  olofk
!  *   Thu Dec 16 20:15:25 CET 1999  Olof S Kylande <[EMAIL PROTECTED]>
!  *
!  *           Fix of KDE/Kwm  selection add/sub/inter problem
!  *           NOTE: This is a workaround, not a real fix.
!  *           Many Thanks to Matthias Ettrich
!  *
!  *           * app/disp_callbacks.c
!  *
!  *           Updated unsharp-mask to version 0.10
!  *
!  *           * plug-ins/unsharp/dialog_f.c
!  *           * plug-ins/unsharp/dialog_f.h
!  *           * plug-ins/unsharp/dialog_i.c
!  *           * plug-ins/unsharp/dialog_i.h
!  *           * plug-ins/unsharp/unsharp.c
!  *
!  *           Updated print plug-in to version 3.0.1
!  *
!  *           * plug-ins/print/README (new file)
!  *           * plug-ins/print/print-escp2.c
!  *           * plug-ins/print/print-pcl.c
!  *           * plug-ins/print/print-ps.c
!  *           * plug-ins/print/print-util.c
!  *           * plug-ins/print/print.c
!  *           * plug-ins/print/print.h
!  *
!  *           Updated all files in the help/C/dialogs dir. This is
!  *           a first alpha glimpse of the help system. Please give
!  *           me feedback of the content. However since it's in alpha
!  *           stage it means that there is spell, grammatical, etc errors.
!  *           There is may also be pure errors which I hope "you" will
!  *           report to either [EMAIL PROTECTED] or [EMAIL PROTECTED] Please
!  *           don't report spell, grammatical, etc error at this stage in dev.
!  *
!  *           If you have any plans to commit to the help system please write
!  *           to [EMAIL PROTECTED] (This is mandatory not a please ;-).
!  *
!  *           * help/C/welcome.html
!  *           * help/C/dialogs/about.html ..............
   *
   *   Revision 1.13  1999/11/23 02:11:37  rlk
   *   Rationalize variables, pass 3
--- 32,39 ----
   * Revision History:
   *
   *   $Log: print-pcl.c,v $
!  *   Revision 1.14  2000/01/08 23:30:56  rlk
!  *   Y2K copyright
   *
   *   Revision 1.13  1999/11/23 02:11:37  rlk
   *   Rationalize variables, pass 3
***************
*** 1227,1231 ****
  
  
  /*
!  * End of "$Id: print-pcl.c,v 1.12 1999/12/16 19:44:01 olofk Exp $".
   */
--- 1189,1193 ----
  
  
  /*
!  * End of "$Id: print-pcl.c,v 1.14 2000/01/08 23:30:56 rlk Exp $".
   */
diff -rc print/print-ps.c /tmp/print/print-ps.c
*** print/print-ps.c    Wed Jan 12 21:51:31 2000
--- /tmp/print/print-ps.c       Sat Jan  8 18:30:56 2000
***************
*** 1,9 ****
  /*
!  * "$Id: print-ps.c,v 1.16 1999/12/19 20:28:15 asbjoer Exp $"
   *
   *   Print plug-in Adobe PostScript driver for the GIMP.
   *
!  *   Copyright 1997-1999 Michael Sweet ([EMAIL PROTECTED]) and
   *    Robert Krawitz ([EMAIL PROTECTED])
   *
   *   This program is free software; you can redistribute it and/or modify it
--- 1,9 ----
  /*
!  * "$Id: print-ps.c,v 1.12 2000/01/08 23:30:56 rlk Exp $"
   *
   *   Print plug-in Adobe PostScript driver for the GIMP.
   *
!  *   Copyright 1997-2000 Michael Sweet ([EMAIL PROTECTED]) and
   *    Robert Krawitz ([EMAIL PROTECTED])
   *
   *   This program is free software; you can redistribute it and/or modify it
***************
*** 33,81 ****
   * Revision History:
   *
   *   $Log: print-ps.c,v $
!  *   Revision 1.16  1999/12/19 20:28:15  asbjoer
!  *   use g_strcasecmp()
   *
!  *   Revision 1.15  1999/12/16 19:44:01  olofk
!  *   Thu Dec 16 20:15:25 CET 1999  Olof S Kylande <[EMAIL PROTECTED]>
!  *
!  *           Fix of KDE/Kwm  selection add/sub/inter problem
!  *           NOTE: This is a workaround, not a real fix.
!  *           Many Thanks to Matthias Ettrich
!  *
!  *           * app/disp_callbacks.c
!  *
!  *           Updated unsharp-mask to version 0.10
!  *
!  *           * plug-ins/unsharp/dialog_f.c
!  *           * plug-ins/unsharp/dialog_f.h
!  *           * plug-ins/unsharp/dialog_i.c
!  *           * plug-ins/unsharp/dialog_i.h
!  *           * plug-ins/unsharp/unsharp.c
!  *
!  *           Updated print plug-in to version 3.0.1
!  *
!  *           * plug-ins/print/README (new file)
!  *           * plug-ins/print/print-escp2.c
!  *           * plug-ins/print/print-pcl.c
!  *           * plug-ins/print/print-ps.c
!  *           * plug-ins/print/print-util.c
!  *           * plug-ins/print/print.c
!  *           * plug-ins/print/print.h
!  *
!  *           Updated all files in the help/C/dialogs dir. This is
!  *           a first alpha glimpse of the help system. Please give
!  *           me feedback of the content. However since it's in alpha
!  *           stage it means that there is spell, grammatical, etc errors.
!  *           There is may also be pure errors which I hope "you" will
!  *           report to either [EMAIL PROTECTED] or [EMAIL PROTECTED] Please
!  *           don't report spell, grammatical, etc error at this stage in dev.
!  *
!  *           If you have any plans to commit to the help system please write
!  *           to [EMAIL PROTECTED] (This is mandatory not a please ;-).
!  *
!  *           * help/C/welcome.html
!  *           * help/C/dialogs/about.html ..............
   *
   *   Revision 1.10  1999/11/23 02:11:37  rlk
   *   Rationalize variables, pass 3
--- 33,43 ----
   * Revision History:
   *
   *   $Log: print-ps.c,v $
!  *   Revision 1.12  2000/01/08 23:30:56  rlk
!  *   Y2K copyright
   *
!  *   Revision 1.11  2000/01/03 13:25:13  rlk
!  *   Fix from Salvador Pinto Abreu <[EMAIL PROTECTED]>
   *
   *   Revision 1.10  1999/11/23 02:11:37  rlk
   *   Rationalize variables, pass 3
***************
*** 477,486 ****
      if (sscanf(line, "*%s %[^/:]", lname, loption) != 2)
        continue;
  
!     if (g_strcasecmp(lname, name) == 0)
      {
!       valptrs[(*count)] = malloc(strlen(media_sizes[*count]) + 1);
!       strcpy(valptrs[(*count)], media_sizes[*count]);
        (*count) ++;
      }
    }
--- 439,448 ----
      if (sscanf(line, "*%s %[^/:]", lname, loption) != 2)
        continue;
  
!     if (strcasecmp(lname, name) == 0)
      {
!       valptrs[(*count)] = malloc(strlen(loption) + 1);
!       strcpy(valptrs[(*count)], loption);
        (*count) ++;
      }
    }
***************
*** 1156,1162 ****
      if (line[0] != '*')
        continue;
  
!     if (g_strncasecmp(line, "*OrderDependency:", 17) == 0 && order != NULL)
      {
        sscanf(line, "%*s%d", order);
        continue;
--- 1118,1124 ----
      if (line[0] != '*')
        continue;
  
!     if (strncasecmp(line, "*OrderDependency:", 17) == 0 && order != NULL)
      {
        sscanf(line, "%*s%d", order);
        continue;
***************
*** 1164,1171 ****
      else if (sscanf(line, "*%s %[^/:]", lname, loption) != 2)
        continue;
  
!     if (g_strcasecmp(lname, name) == 0 &&
!         g_strcasecmp(loption, option) == 0)
      {
        opt = strchr(line, ':') + 1;
        while (*opt == ' ' || *opt == '\t')
--- 1126,1133 ----
      else if (sscanf(line, "*%s %[^/:]", lname, loption) != 2)
        continue;
  
!     if (strcasecmp(lname, name) == 0 &&
!         strcasecmp(loption, option) == 0)
      {
        opt = strchr(line, ':') + 1;
        while (*opt == ' ' || *opt == '\t')
***************
*** 1198,1202 ****
  
  
  /*
!  * End of "$Id: print-ps.c,v 1.16 1999/12/19 20:28:15 asbjoer Exp $".
   */
--- 1160,1164 ----
  
  
  /*
!  * End of "$Id: print-ps.c,v 1.12 2000/01/08 23:30:56 rlk Exp $".
   */
diff -rc print/print-util.c /tmp/print/print-util.c
*** print/print-util.c  Thu Dec 16 14:44:01 1999
--- /tmp/print/print-util.c     Thu Jan 13 18:41:29 2000
***************
*** 1,9 ****
  /*
!  * "$Id: print-util.c,v 1.11 1999/12/16 19:44:01 olofk Exp $"
   *
   *   Print plug-in driver utility functions for the GIMP.
   *
!  *   Copyright 1997-1999 Michael Sweet ([EMAIL PROTECTED]) and
   *    Robert Krawitz ([EMAIL PROTECTED])
   *
   *   This program is free software; you can redistribute it and/or modify it
--- 1,9 ----
  /*
!  * "$Id: print-util.c,v 1.49.2.1 2000/01/13 23:41:29 rlk Exp $"
   *
   *   Print plug-in driver utility functions for the GIMP.
   *
!  *   Copyright 1997-2000 Michael Sweet ([EMAIL PROTECTED]) and
   *    Robert Krawitz ([EMAIL PROTECTED])
   *
   *   This program is free software; you can redistribute it and/or modify it
***************
*** 38,83 ****
   * Revision History:
   *
   *   $Log: print-util.c,v $
!  *   Revision 1.11  1999/12/16 19:44:01  olofk
!  *   Thu Dec 16 20:15:25 CET 1999  Olof S Kylande <[EMAIL PROTECTED]>
   *
!  *           Fix of KDE/Kwm  selection add/sub/inter problem
!  *           NOTE: This is a workaround, not a real fix.
!  *           Many Thanks to Matthias Ettrich
!  *
!  *           * app/disp_callbacks.c
!  *
!  *           Updated unsharp-mask to version 0.10
!  *
!  *           * plug-ins/unsharp/dialog_f.c
!  *           * plug-ins/unsharp/dialog_f.h
!  *           * plug-ins/unsharp/dialog_i.c
!  *           * plug-ins/unsharp/dialog_i.h
!  *           * plug-ins/unsharp/unsharp.c
!  *
!  *           Updated print plug-in to version 3.0.1
!  *
!  *           * plug-ins/print/README (new file)
!  *           * plug-ins/print/print-escp2.c
!  *           * plug-ins/print/print-pcl.c
!  *           * plug-ins/print/print-ps.c
!  *           * plug-ins/print/print-util.c
!  *           * plug-ins/print/print.c
!  *           * plug-ins/print/print.h
!  *
!  *           Updated all files in the help/C/dialogs dir. This is
!  *           a first alpha glimpse of the help system. Please give
!  *           me feedback of the content. However since it's in alpha
!  *           stage it means that there is spell, grammatical, etc errors.
!  *           There is may also be pure errors which I hope "you" will
!  *           report to either [EMAIL PROTECTED] or [EMAIL PROTECTED] Please
!  *           don't report spell, grammatical, etc error at this stage in dev.
   *
!  *           If you have any plans to commit to the help system please write
!  *           to [EMAIL PROTECTED] (This is mandatory not a please ;-).
   *
!  *           * help/C/welcome.html
!  *           * help/C/dialogs/about.html ..............
   *
   *   Revision 1.37  1999/12/05 23:24:08  rlk
   *   don't want PRINT_LUT in release
--- 38,83 ----
   * Revision History:
   *
   *   $Log: print-util.c,v $
!  *   Revision 1.49.2.1  2000/01/13 23:41:29  rlk
!  *   Deal with null black pointer
   *
!  *   Revision 1.49  2000/01/08 23:30:37  rlk
!  *   Some tweaking
   *
!  *   Revision 1.48  1999/12/30 23:58:07  rlk
!  *   Silly little bug...
   *
!  *   Revision 1.47  1999/12/26 19:02:46  rlk
!  *   Performance stuff
!  *
!  *   Revision 1.46  1999/12/25 17:47:17  rlk
!  *   Cleanup
!  *
!  *   Revision 1.45  1999/12/25 00:41:01  rlk
!  *   some minor improvement
!  *
!  *   Revision 1.44  1999/12/24 12:57:38  rlk
!  *   Reduce grain; improve red
!  *
!  *   Revision 1.43  1999/12/22 03:24:34  rlk
!  *   round length up, not down
!  *
!  *   Revision 1.42  1999/12/22 03:12:17  rlk
!  *   More constant fiddling
!  *
!  *   Revision 1.41  1999/12/22 01:34:28  rlk
!  *   Reverse direction each pass
!  *
!  *   Revision 1.40  1999/12/18 23:45:07  rlk
!  *   typo
!  *
!  *   Revision 1.39  1999/12/12 20:49:01  rlk
!  *   Various changes
!  *
!  *   Revision 1.38  1999/12/11 23:12:06  rlk
!  *   Better matching between cmy/k
!  *
!  *   Smoother dither!
   *
   *   Revision 1.37  1999/12/05 23:24:08  rlk
   *   don't want PRINT_LUT in release
***************
*** 335,341 ****
  
    xstep  = src_width / dst_width;
    xmod   = src_width % dst_width;
!   length = (dst_width) / 8;
  
    kerror0 = error[row & 1][3];
    kerror1 = error[1 - (row & 1)][3];
--- 335,341 ----
  
    xstep  = src_width / dst_width;
    xmod   = src_width % dst_width;
!   length = (dst_width + 7) / 8;
  
    kerror0 = error[row & 1][3];
    kerror1 = error[1 - (row & 1)][3];
***************
*** 411,437 ****
   */
  
  #define NU_C 1
! #define DE_C 3
  #define NU_M 1
! #define DE_M 3
  #define NU_Y 1
! #define DE_Y 3
  
  #define I_RATIO_C NU_C / DE_C
  #define I_RATIO_C1 NU_C / (DE_C + NU_C)
  #define RATIO_C DE_C / NU_C
  #define RATIO_C1 (DE_C + NU_C) / NU_C
  
  #define I_RATIO_M NU_M / DE_M
  #define I_RATIO_M1 NU_M / (DE_M + NU_M)
  #define RATIO_M DE_M / NU_M
  #define RATIO_M1 (DE_M + NU_M) / NU_M
  
  #define I_RATIO_Y NU_Y / DE_Y
  #define I_RATIO_Y1 NU_Y / (DE_Y + NU_Y)
  #define RATIO_Y DE_Y / NU_Y
  #define RATIO_Y1 (DE_Y + NU_Y) / NU_Y
  
  /*
   * Lower and upper bounds for mixing CMY with K to produce gray scale.
   * Reducing KDARKNESS_LOWER results in more black being used with relatively
--- 411,446 ----
   */
  
  #define NU_C 1
! #define DE_C 1
  #define NU_M 1
! #define DE_M 1
  #define NU_Y 1
! #define DE_Y 1
  
  #define I_RATIO_C NU_C / DE_C
  #define I_RATIO_C1 NU_C / (DE_C + NU_C)
  #define RATIO_C DE_C / NU_C
  #define RATIO_C1 (DE_C + NU_C) / NU_C
  
+ const static int C_CONST_0 = 65536 * I_RATIO_C1;
+ const static int C_CONST_1 = 65536 * I_RATIO_C1;
+ 
  #define I_RATIO_M NU_M / DE_M
  #define I_RATIO_M1 NU_M / (DE_M + NU_M)
  #define RATIO_M DE_M / NU_M
  #define RATIO_M1 (DE_M + NU_M) / NU_M
  
+ const static int M_CONST_0 = 65536 * I_RATIO_M1;
+ const static int M_CONST_1 = 65536 * I_RATIO_M1;
+ 
  #define I_RATIO_Y NU_Y / DE_Y
  #define I_RATIO_Y1 NU_Y / (DE_Y + NU_Y)
  #define RATIO_Y DE_Y / NU_Y
  #define RATIO_Y1 (DE_Y + NU_Y) / NU_Y
  
+ const static int Y_CONST_0 = 65536 * I_RATIO_Y1;
+ const static int Y_CONST_1 = 65536 * I_RATIO_Y1;
+ 
  /*
   * Lower and upper bounds for mixing CMY with K to produce gray scale.
   * Reducing KDARKNESS_LOWER results in more black being used with relatively
***************
*** 439,446 ****
   * in more CMY being used in dark tones, which results in less pure black.
   * Decreasing the gap too much results in sharp crossover and stairstepping.
   */
! #define KDARKNESS_LOWER (32 * 256)
! #define KDARKNESS_UPPER (96 * 256)
  
  /*
   * Randomizing values for deciding when to output a bit.  Normally with the
--- 448,455 ----
   * in more CMY being used in dark tones, which results in less pure black.
   * Decreasing the gap too much results in sharp crossover and stairstepping.
   */
! #define KDARKNESS_LOWER (12 * 256)
! #define KDARKNESS_UPPER (128 * 256)
  
  /*
   * Randomizing values for deciding when to output a bit.  Normally with the
***************
*** 450,459 ****
   * result in greater randomizing.  We use less randomness for black output
   * to avoid production of black speckles in light regions.
   */
! #define C_RANDOMIZER 2
! #define M_RANDOMIZER 2
! #define Y_RANDOMIZER 2
! #define K_RANDOMIZER 8
  
  #ifdef PRINT_DEBUG
  #define UPDATE_COLOR_DBG(r)                   \
--- 459,468 ----
   * result in greater randomizing.  We use less randomness for black output
   * to avoid production of black speckles in light regions.
   */
! #define C_RANDOMIZER 0
! #define M_RANDOMIZER 0
! #define Y_RANDOMIZER 0
! #define K_RANDOMIZER 4
  
  #ifdef PRINT_DEBUG
  #define UPDATE_COLOR_DBG(r)                   \
***************
*** 482,503 ****
          I_RATIO_##R##1);                                              \
  } while (0)
  
! #define PRINT_D3(r, R, d1, d2)                                                \
  do {                                                                  \
!   fprintf(dbg, "Case 2: o" #r " %lld " #r                             \
          " %lld ditherbit" #d1 " %d ditherbit" #d2 " %d "              \
!         "num %lld den %lld test1 %lld test2 %lld\n",                  \
!         o##r, r, ditherbit##d1, ditherbit##d2,                        \
!         o##r, 65536ll,                                                \
!         ((32767 + (((long long) ditherbit##d2 / 1) - 32768)) * o##r / \
!          65536), cutoff);                                             \
! } while (0)
! 
! #define PRINT_D4(r, R, d1, d2)                                                \
! do {                                                                  \
!   fprintf(dbg, "Case 3: o" #r " %lld " #r                             \
!         " %lld ditherbit" #d1 " %d ditherbit" #d2 " %d "              \
!         "num %lld den %lld test1 %lld test2 %lld\n",                  \
          o##r, r, ditherbit##d1, ditherbit##d2,                        \
          o##r, 65536ll,                                                \
          ((32767 + (((long long) ditherbit##d2 / 1) - 32768)) * o##r / \
--- 491,501 ----
          I_RATIO_##R##1);                                              \
  } while (0)
  
! #define PRINT_D3(n, r, R, d1, d2)                                     \
  do {                                                                  \
!   fprintf(dbg, "Case %d: o" #r " %lld " #r                            \
          " %lld ditherbit" #d1 " %d ditherbit" #d2 " %d "              \
!         "num %lld den %lld test1 %lld test2 %lld\n", n,               \
          o##r, r, ditherbit##d1, ditherbit##d2,                        \
          o##r, 65536ll,                                                \
          ((32767 + (((long long) ditherbit##d2 / 1) - 32768)) * o##r / \
***************
*** 509,516 ****
  #define UPDATE_COLOR_DBG(r) do {} while (0)
  #define PRINT_D1(r, R, d1, d2) do {} while (0)
  #define PRINT_D2(r, R, d1, d2) do {} while (0)
! #define PRINT_D3(r, R, d1, d2) do {} while (0)
! #define PRINT_D4(r, R, d1, d2) do {} while (0)
  
  #endif
  
--- 507,513 ----
  #define UPDATE_COLOR_DBG(r) do {} while (0)
  #define PRINT_D1(r, R, d1, d2) do {} while (0)
  #define PRINT_D2(r, R, d1, d2) do {} while (0)
! #define PRINT_D3(n, r, R, d1, d2) do {} while (0)
  
  #endif
  
***************
*** 521,623 ****
    UPDATE_COLOR_DBG(r);                                \
  } while (0)
  
! #define PRINT_COLOR(color, r, R, d1, d2)                                   \
! do {                                                                       \
!   if (!l##color)                                                           \
!     {                                                                      \
!       if (r > (32767 + (((long long) ditherbit##d2 / R##_RANDOMIZER) -             \
!                       (32768 / R##_RANDOMIZER))))                          \
!       {                                                                    \
!         PRINT_D1(r, R, d1, d2);                                            \
!         if (r##bits++ % horizontal_overdensity == 0)                       \
!           if (! (*kptr & bit))                                             \
!             *r##ptr |= bit;                                                \
!         r -= 65535;                                                        \
!       }                                                                    \
!     }                                                                      \
!   else                                                                             \
!     {                                                                      \
!       if (r <= (65536 * I_RATIO_##R##1 * 2 / 3))                           \
!       {                                                                    \
!         if (r > (32767 + (((long long) ditherbit##d2 / R##_RANDOMIZER) -   \
!                           (32768 / R##_RANDOMIZER))) * I_RATIO_##R##1)     \
!           {                                                                \
!             PRINT_D2(r, R, d1, d2);                                        \
!             if (l##r##bits++ % horizontal_overdensity == 0)                \
!               if (! (*kptr & bit))                                         \
!                 *l##r##ptr |= bit;                                         \
!             r -= 65535 * I_RATIO_##R##1;                                   \
!           }                                                                \
!       }                                                                    \
!       else if (r > (32767 + (((long long) ditherbit##d2 / R##_RANDOMIZER) -  \
!                            (32768 / R##_RANDOMIZER))) * I_RATIO_##R##1)    \
!       {                                                                    \
!         int cutoff = ((density - (65536 * I_RATIO_##R##1 * 2 / 3)) *       \
!                       65536 / (65536 - (65536 * I_RATIO_##R##1 * 2 / 3))); \
!         long long sub = (65535ll * I_RATIO_##R##1) +                       \
!           ((65535ll - (65535ll * I_RATIO_##R##1)) * cutoff / 65536);       \
!         if (ditherbit##d1 > cutoff)                                        \
!           {                                                                \
!             PRINT_D3(r, R, d1, d2);                                        \
!             if (l##r##bits++ % horizontal_overdensity == 0)                \
!               if (! (*kptr & bit))                                         \
!                 *l##r##ptr |= bit;                                         \
!           }                                                                \
!         else                                                               \
!           {                                                                \
!             PRINT_D4(r, R, d1, d2);                                        \
!             if (r##bits++ % horizontal_overdensity == 0)                   \
!               if (! (*kptr & bit))                                         \
!                 *r##ptr |= bit;                                            \
!           }                                                                \
!         if (sub < (65535 * I_RATIO_##R##1))                                \
!           r -= (65535 * I_RATIO_##R##1);                                   \
!         else if (sub > 65535)                                              \
!           r -= 65535;                                                      \
!         else                                                               \
!           r -= sub;                                                        \
!       }                                                                    \
!     }                                                                      \
! } while (0)
! 
! #if 1
! #define UPDATE_DITHER(r, d2, x, width)                \
  do {                                          \
!   if (ditherbit##d2 & bit)                    \
      {                                         \
!       if (x > 0)                              \
!       r##error1[-1] += r;                     \
!       else                                    \
!       r##error1[0] = r;                       \
!       r##error1[0] += 3 * r;                  \
!       r##error1[1] = r;                               \
!       dither##r    = r##error0[1] + 3 * r;    \
      }                                         \
!   else                                                \
!     {                                         \
!       if (x > 0)                              \
!       r##error1[-1] += r * 3 / 4;             \
!       else                                    \
!       r##error1[0] = r * 3 / 4;               \
!       r##error1[0] +=  r * 3 / 2;             \
!       r##error1[1] = r * 3 / 4;                       \
!       dither##r    = r##error0[1] + 5 * r;    \
!     }                                         \
! } while (0)  
  #else
! #define UPDATE_DITHER(r, d2, x, width)                \
! do {                                          \
!   if (ditherbit##d2 & bit)                    \
!     {                                         \
!       r##error1[0] = 5 * r;                   \
!       dither##r    = r##error0[1] + 3 * r;    \
!     }                                         \
!   else                                                \
!     {                                         \
!       r##error1[0] = 3 * r;                   \
!       dither##r    = r##error0[1] + 5 * r;    \
!     }                                         \
! } while (0)  
  #endif
  
  void
--- 518,624 ----
    UPDATE_COLOR_DBG(r);                                \
  } while (0)
  
! #define DO_PRINT_COLOR(color)                 \
  do {                                          \
!   if (color##bits++ == horizontal_overdensity)        \
      {                                         \
!       *color##ptr |= bit;                     \
!       color##bits = 1;                                \
      }                                         \
! } while(0)
! 
! #define PRINT_COLOR(color, r, R, d1, d2)                                  \
! do {                                                                      \
!   int comp0 = (32767 + ((ditherbit##d2 >> R##_RANDOMIZER) -               \
!                       (32768 >> R##_RANDOMIZER)));                        \
!   if (!l##color)                                                          \
!     {                                                                     \
!       if (r > comp0)                                                      \
!       {                                                                   \
!         PRINT_D1(r, R, d1, d2);                                           \
!         DO_PRINT_COLOR(r);                                                \
!         r -= 65535;                                                       \
!       }                                                                   \
!     }                                                                     \
!   else                                                                            \
!     {                                                                     \
!       int compare = comp0 * I_RATIO_##R##1;                               \
!       if (r <= (R##_CONST_1))                                             \
!       {                                                                   \
!         if (r > compare)                                                  \
!           {                                                               \
!             PRINT_D2(r, R, d1, d2);                                       \
!             DO_PRINT_COLOR(l##r);                                         \
!             r -= R##_CONST_0;                                             \
!           }                                                               \
!       }                                                                   \
!       else if (r > compare)                                               \
!       {                                                                   \
!         int cutoff = ((density - R##_CONST_1) * 65536 /                   \
!                       (65536 - R##_CONST_1));                             \
!         long long sub;                                                    \
!         if (cutoff >= 0)                                                  \
!           sub = R##_CONST_0 + (((65535ll - R##_CONST_0) * cutoff) >> 16); \
!         else                                                              \
!           sub = R##_CONST_0 + ((65535ll - R##_CONST_0) * cutoff / 65536); \
!         if (ditherbit##d1 > cutoff)                                       \
!           {                                                               \
!             PRINT_D3(3, r, R, d1, d2);                                    \
!             DO_PRINT_COLOR(l##r);                                         \
!           }                                                               \
!         else                                                              \
!           {                                                               \
!             PRINT_D3(4, r, R, d1, d2);                                    \
!             DO_PRINT_COLOR(r);                                            \
!           }                                                               \
!         if (sub < R##_CONST_0)                                            \
!           r -= R##_CONST_0;                                               \
!         else if (sub > 65535)                                             \
!           r -= 65535;                                                     \
!         else                                                              \
!           r -= sub;                                                       \
!       }                                                                   \
!     }                                                                     \
! } while (0)
! 
! #if 1
! #define UPDATE_DITHER(r, d2, x, width)                                         \
! do {                                                                   \
!   int offset = (15 - (((o##r & 0xf000) >> 12)) * horizontal_overdensity) \
!                                      >> 1;                             \
!   if (x < offset)                                                      \
!     offset = x;                                                                \
!   else if (x > dst_width - offset - 1)                                         \
!     offset = dst_width - x - 1;                                                \
!   if (ditherbit##d2 & bit)                                             \
!     {                                                                  \
!       r##error1[-offset] += r;                                                 \
!       r##error1[0] += 3 * r;                                           \
!       r##error1[offset] += r;                                          \
!       dither##r    = r##error0[direction] + 3 * r;                     \
!     }                                                                  \
!   else                                                                         \
!     {                                                                  \
!       r##error1[-offset] += r;                                                 \
!       r##error1[0] +=  r;                                              \
!       r##error1[offset] += r;                                          \
!       dither##r    = r##error0[direction] + 5 * r;                     \
!     }                                                                  \
! } while (0)
  #else
! #define UPDATE_DITHER(r, d2, x, width)                        \
! do {                                                  \
!   if (ditherbit##d2 & bit)                            \
!     {                                                 \
!       r##error1[0] = 5 * r;                           \
!       dither##r    = r##error0[direction] + 3 * r;    \
!     }                                                 \
!   else                                                        \
!     {                                                 \
!       r##error1[0] = 3 * r;                           \
!       dither##r    = r##error0[direction] + 5 * r;    \
!     }                                                 \
! } while (0)
  #endif
  
  void
***************
*** 678,696 ****
     * at zero each line to avoid having a line of bits near the edge of the
     * image.
     */
!   static int cbits = 0;
!   static int mbits = 0;
!   static int ybits = 0;
!   static int kbits = 0;
!   static int lcbits = 0;
!   static int lmbits = 0;
!   static int lybits = 0;
  
  #ifdef PRINT_DEBUG
    long long odk, odc, odm, ody, dk, dc, dm, dy, xk, xc, xm, xy, yc, ym, yy;
    FILE *dbg;
  #endif
  
    xstep  = 3 * (src_width / dst_width);
    xmod   = src_width % dst_width;
    length = (dst_width + 7) / 8;
--- 679,722 ----
     * at zero each line to avoid having a line of bits near the edge of the
     * image.
     */
!   static int cbits = 1;
!   static int mbits = 1;
!   static int ybits = 1;
!   static int kbits = 1;
!   static int lcbits = 1;
!   static int lmbits = 1;
!   static int lybits = 1;
!   int overdensity_bits = 0;
  
  #ifdef PRINT_DEBUG
    long long odk, odc, odm, ody, dk, dc, dm, dy, xk, xc, xm, xy, yc, ym, yy;
    FILE *dbg;
  #endif
  
+   int terminate;
+   int direction = row & 1 ? 1 : -1;
+ 
+   switch (horizontal_overdensity)
+     {
+     case 0:
+     case 1:
+       overdensity_bits = 0;
+       break;
+     case 2:
+       overdensity_bits = 1;
+       break;
+     case 4:
+       overdensity_bits = 2;
+       break;
+     case 8:
+       overdensity_bits = 3;
+       break;
+     }
+ 
+   bit = (direction == 1) ? 128 : 1 << (7 - ((dst_width - 1) & 7));
+   x = (direction == 1) ? 0 : dst_width - 1;
+   terminate = (direction == 1) ? dst_width : -1;
+ 
    xstep  = 3 * (src_width / dst_width);
    xmod   = src_width % dst_width;
    length = (dst_width + 7) / 8;
***************
*** 706,711 ****
--- 732,775 ----
  
    kerror0 = error[row & 1][3];
    kerror1 = error[1 - (row & 1)][3];
+   memset(kerror1, 0, dst_width * sizeof(int));
+   memset(cerror1, 0, dst_width * sizeof(int));
+   memset(merror1, 0, dst_width * sizeof(int));
+   memset(yerror1, 0, dst_width * sizeof(int));
+   cptr = cyan;
+   mptr = magenta;
+   yptr = yellow;
+   lcptr = lcyan;
+   lmptr = lmagenta;
+   lyptr = lyellow;
+   kptr = black;
+   xerror = 0;
+   if (direction == -1)
+     {
+       cerror0 += dst_width - 1;
+       cerror1 += dst_width - 1;
+       merror0 += dst_width - 1;
+       merror1 += dst_width - 1;
+       yerror0 += dst_width - 1;
+       yerror1 += dst_width - 1;
+       kerror0 += dst_width - 1;
+       kerror1 += dst_width - 1;
+       cptr = cyan + length - 1;
+       if (lcptr)
+       lcptr = lcyan + length - 1;
+       mptr = magenta + length - 1;
+       if (lmptr)
+       lmptr = lmagenta + length - 1;
+       yptr = yellow + length - 1;
+       if (lyptr)
+       lyptr = lyellow + length - 1;
+       if (kptr)
+       kptr = black + length - 1;
+       xstep = -xstep;
+       rgb += 3 * (src_width - 1);
+       xerror = ((dst_width - 1) * xmod) % dst_width;
+       xmod = -xmod;
+     }
  
    memset(cyan, 0, length);
    if (lcyan)
***************
*** 726,735 ****
    /*
     * Main loop starts here!
     */
!   for (x = 0, bit = 128,
!        cptr = cyan, mptr = magenta, yptr = yellow, lcptr = lcyan,
!        lmptr = lmagenta, lyptr = lyellow, kptr = black, xerror = 0,
!        ditherbit = rand(),
         ditherc = cerror0[0], ditherm = merror0[0], dithery = yerror0[0],
         ditherk = kerror0[0],
         ditherbit0 = ditherbit & 0xffff,
--- 790,796 ----
    /*
     * Main loop starts here!
     */
!   for (ditherbit = rand(),
         ditherc = cerror0[0], ditherm = merror0[0], dithery = yerror0[0],
         ditherk = kerror0[0],
         ditherbit0 = ditherbit & 0xffff,
***************
*** 738,746 ****
                       ((ditherbit & 0x100) << 7)),
         ditherbit3 = (((ditherbit >> 24) & 0x7f) + ((ditherbit & 1) << 7) +
                       ((ditherbit >> 8) & 0xff00));
!        x < dst_width;
!        x ++, cerror0 ++, cerror1 ++, merror0 ++, merror1 ++, yerror0 ++,
!            yerror1 ++, kerror0 ++, kerror1 ++)
    {
  
     /*
--- 799,814 ----
                       ((ditherbit & 0x100) << 7)),
         ditherbit3 = (((ditherbit >> 24) & 0x7f) + ((ditherbit & 1) << 7) +
                       ((ditherbit >> 8) & 0xff00));
!        x != terminate;
!        x += direction,
!        cerror0 += direction,
!        cerror1 += direction,
!        merror0 += direction,
!        merror1 += direction,
!        yerror0 += direction,
!        yerror1 += direction,
!        kerror0 += direction,
!        kerror1 += direction)
    {
  
     /*
***************
*** 775,788 ****
        * Since we're printing black, adjust the black level based upon
        * the amount of color in the pixel (colorful pixels get less black)...
        */
!       long long xdiff = (abs(c - m) + abs(c - y) + abs(m - y)) / 3;
  
        diff = 65536 - xdiff;
!       diff = diff * diff * diff / (65536ll * 65536ll); /* diff = diff^3 */
        diff--;
        if (diff < 0)
        diff = 0;
!       k    = diff * k / 65535ll;
        ak = k;
        divk = 65535 - k;
        if (divk == 0)
--- 843,856 ----
        * Since we're printing black, adjust the black level based upon
        * the amount of color in the pixel (colorful pixels get less black)...
        */
!       int xdiff = (abs(c - m) + abs(c - y) + abs(m - y)) / 3;
  
        diff = 65536 - xdiff;
!       diff = (diff * diff * diff) >> 32; /* diff = diff^3 */
        diff--;
        if (diff < 0)
        diff = 0;
!       k    = (diff * k) >> 16;
        ak = k;
        divk = 65535 - k;
        if (divk == 0)
***************
*** 794,802 ****
          * CMY as necessary to give better blues, greens, and reds... :)
          */
  
!         c  = (65535 - (unsigned) rgb[1] / 4) * (c - k) / divk;
!         m  = (65535 - (unsigned) rgb[2] / 4) * (m - k) / divk;
!         y  = (65535 - (unsigned) rgb[0] / 4) * (y - k) / divk;
        }
  #ifdef PRINT_DEBUG
        yc = c;
--- 862,870 ----
          * CMY as necessary to give better blues, greens, and reds... :)
          */
  
!         c  = (65535 - ((rgb[2] + rgb[1]) >> 3)) * (c - k) / divk;
!         m  = (65535 - ((rgb[1] + rgb[0]) >> 3)) * (m - k) / divk;
!         y  = (65535 - ((rgb[0] + rgb[2]) >> 3)) * (y - k) / divk;
        }
  #ifdef PRINT_DEBUG
        yc = c;
***************
*** 811,827 ****
         */
        ok = k;
        nk = k + (ditherk) / 8;
!       kdarkness = MAX((c + c / 3 + m + 2 * y / 3) / 4, ak);
! /*
!       kdarkness = ak;
! */
        if (kdarkness < KDARKNESS_UPPER)
        {
          int rb;
- /*
-         ub = KDARKNESS_UPPER - kdarkness;
-         lb = ub * KDARKNESS_LOWER / KDARKNESS_UPPER;
- */
          ub = KDARKNESS_UPPER;
          lb = KDARKNESS_LOWER;
          rb = ub - lb;
--- 879,889 ----
         */
        ok = k;
        nk = k + (ditherk) / 8;
!       kdarkness = MAX((c + ((c + c + c) >> 3) + m +
!                      ((y + y + y + y + y) >> 3)) >> 2, ak);
        if (kdarkness < KDARKNESS_UPPER)
        {
          int rb;
          ub = KDARKNESS_UPPER;
          lb = KDARKNESS_LOWER;
          rb = ub - lb;
***************
*** 866,874 ****
         */
        if (lmagenta)
        {
!         c += ck * 10 / 8;
!         m += ck * 19 / 16;
!         y += ck * 3 / 2;
        }
        else
        {
--- 928,937 ----
         */
        if (lmagenta)
        {
!         int addon = 2 * ck;
!         c += addon;
!         m += addon;
!         y += addon;
        }
        else
        {
***************
*** 890,925 ****
        odk = ditherk;
        dk = k;
  #endif
!       if (k > (32767 + ((ditherbit0 / K_RANDOMIZER) - (32768 / K_RANDOMIZER))))
        {
!         if (kbits++ % horizontal_overdensity == 0)
!           *kptr |= bit;
          k -= 65535;
        }
  
        UPDATE_DITHER(k, 1, x, src_width);
- #if 0
-       if (ditherbit0 & bit)
-       {
-         if (x > 0)
-           kerror1[-1] += k;
-         else
-           kerror1[0] = k;
-         kerror1[0] += 2 * k;
-         kerror1[1] = k;
-         ditherk    = kerror0[1] + 3 * k;
-       }
-       else
-       {
-         if (x > 0)
-           kerror1[-1] += k / 2;
-         else
-           kerror1[0] = k / 2;
-         kerror1[0] += k;
-         kerror1[1] = k / 2;
-         ditherk    = kerror0[1] + 5 * k;
-       }
- #endif
      }
      else
      {
--- 953,966 ----
        odk = ditherk;
        dk = k;
  #endif
!       if (k > (32767 + ((ditherbit0 >> K_RANDOMIZER) -
!                       (32768 >> K_RANDOMIZER))))
        {
!         DO_PRINT_COLOR(k);
          k -= 65535;
        }
  
        UPDATE_DITHER(k, 1, x, src_width);
      }
      else
      {
***************
*** 934,964 ****
        y  = (65535 - rgb[0] / 4) * (y - k) / 65535 + k;
      }
  
! 
      UPDATE_COLOR(c);
      UPDATE_COLOR(m);
      UPDATE_COLOR(y);
!     density = (c + m + y) / horizontal_overdensity;
  
!     /*****************************************************************
!      * Cyan
!      *****************************************************************/
!     if (! (*kptr & bit))
!       PRINT_COLOR(cyan, c, C, 1, 2);
!     UPDATE_DITHER(c, 2, x, dst_width);
  
!     /*****************************************************************
!      * Magenta
!      *****************************************************************/
!     if (! (*kptr & bit))
!       PRINT_COLOR(magenta, m, M, 2, 3);
      UPDATE_DITHER(m, 3, x, dst_width);
- 
-     /*****************************************************************
-      * Yellow
-      *****************************************************************/
-     if (! (*kptr & bit))
-       PRINT_COLOR(yellow, y, Y, 3, 0);
      UPDATE_DITHER(y, 0, x, dst_width);
  
      /*****************************************************************
--- 975,996 ----
        y  = (65535 - rgb[0] / 4) * (y - k) / 65535 + k;
      }
  
!     density = (c + m + y) >> overdensity_bits;
      UPDATE_COLOR(c);
      UPDATE_COLOR(m);
      UPDATE_COLOR(y);
!     density += (c + m + y) >> overdensity_bits;
! /*     density >>= 1; */
  
!     if (!kptr || !(*kptr & bit))
!       {
!       PRINT_COLOR(cyan, c, C, 1, 2);
!       PRINT_COLOR(magenta, m, M, 2, 3);
!       PRINT_COLOR(yellow, y, Y, 3, 0);
!       }
  
!     UPDATE_DITHER(c, 2, x, dst_width);
      UPDATE_DITHER(m, 3, x, dst_width);
      UPDATE_DITHER(y, 0, x, dst_width);
  
      /*****************************************************************
***************
*** 984,1040 ****
            (black && (*kptr & bit)) ? 'k' : ' ',
            odk, odc, odm, ody,
            kdarkness, ck, bk, nk, ub, lb);
  #endif
!           
!     if (bit == 1)
        {
!       cptr ++;
!       if (lcptr)
!         lcptr ++;
!       mptr ++;
!       if (lmptr)
!         lmptr ++;
!       yptr ++;
!       if (lyptr)
!         lyptr ++;
!       if (kptr)
!         kptr ++;
!       ditherbit = rand();
!       ditherbit0 = ditherbit & 0xffff;
!       ditherbit1 = ((ditherbit >> 8) & 0xffff);
!       ditherbit2 = ((ditherbit >> 16) & 0x7fff) + ((ditherbit & 0x100) << 7);
!       ditherbit3 = ((ditherbit >> 24) & 0x7f) + ((ditherbit & 1) << 7) +
!         ((ditherbit >> 8) & 0xff00);
!       bit       = 128;
        }
      else
        {
!       ditherbit = rand();
!       ditherbit0 = ditherbit & 0xffff;
!       ditherbit1 = ((ditherbit >> 8) & 0xffff);
!       ditherbit2 = ((ditherbit >> 16) & 0x7fff) + ((ditherbit & 0x100) << 7);
!       ditherbit3 = ((ditherbit >> 24) & 0x7f) + ((ditherbit & 1) << 7) +
!         ((ditherbit >> 8) & 0xff00);
! #if 0
!       int dithertmp0 = (ditherbit1 >> 14) ^ ((ditherbit3 &0x3fff) << 2);
!       int dithertmp1 = (ditherbit2 >> 14) ^ ((ditherbit2 &0x3fff) << 2);
!       int dithertmp2 = (ditherbit3 >> 14) ^ ((ditherbit1 &0x3fff) << 2);
!       int dithertmp3 = (ditherbit0 >> 14) ^ ((ditherbit0 &0x3fff) << 2);
!       ditherbit0 = dithertmp0;
!       ditherbit1 = dithertmp1;
!       ditherbit2 = dithertmp2;
!       ditherbit3 = dithertmp3;
! #endif
!       bit >>= 1;
        }
  
      rgb    += xstep;
      xerror += xmod;
      if (xerror >= dst_width)
!     {
!       xerror -= dst_width;
!       rgb    += 3;
!     }
    }
    /*
     * Main loop ends here!
--- 1016,1085 ----
            (black && (*kptr & bit)) ? 'k' : ' ',
            odk, odc, odm, ody,
            kdarkness, ck, bk, nk, ub, lb);
+     fprintf(dbg, "x %d dir %d c %x %x m %x %x y %x %x k %x %x rgb %x bit %x\n",
+           x, direction, cptr, cyan, mptr, magenta, yptr, yellow, kptr, black,
+           rgb, bit);
  #endif
! 
!     ditherbit = rand();
!     ditherbit0 = ditherbit & 0xffff;
!     ditherbit1 = ((ditherbit >> 8) & 0xffff);
!     ditherbit2 = ((ditherbit >> 16) & 0x7fff) + ((ditherbit & 0x100) << 7);
!     ditherbit3 = ((ditherbit >> 24) & 0x7f) + ((ditherbit & 1) << 7) +
!       ((ditherbit >> 8) & 0xff00);
!     if (direction == 1)
        {
!       if (bit == 1)
!         {
!           cptr ++;
!           if (lcptr)
!             lcptr ++;
!           mptr ++;
!           if (lmptr)
!             lmptr ++;
!           yptr ++;
!           if (lyptr)
!             lyptr ++;
!           if (kptr)
!             kptr ++;
!           bit       = 128;
!         }
!       else
!         bit >>= 1;
        }
      else
        {
!       if (bit == 128)
!         {
!           cptr --;
!           if (lcptr)
!             lcptr --;
!           mptr --;
!           if (lmptr)
!             lmptr --;
!           yptr --;
!           if (lyptr)
!             lyptr --;
!           if (kptr)
!             kptr --;
!           bit       = 1;
!         }
!       else
!         bit <<= 1;
        }
  
      rgb    += xstep;
      xerror += xmod;
      if (xerror >= dst_width)
!       {
!       xerror -= dst_width;
!       rgb    += 3 * direction;
!       }
!     else if (xerror < 0)
!       {
!       xerror += dst_width;
!       rgb    += 3 * direction;
!       }      
    }
    /*
     * Main loop ends here!
***************
*** 1990,2061 ****
                                 pow(green_pixel, print_gamma));
          blue_pixel = 256.0 * (256.0 - 256.0 *
                                pow(blue_pixel, print_gamma));
- #if 0
-         if (red > 1.0)
-           red_pixel = 65536.0 + ((pixel - 65536.0) / red);
-         else
-           red_pixel = pixel * red;
-         if (green > 1.0)
-           green_pixel = 65536.0 + ((pixel - 65536.0) / green);
-         else
-           green_pixel = pixel * green;
-         if (blue > 1.0)
-           blue_pixel = 65536.0 + ((pixel - 65536.0) / blue);
-         else
-           blue_pixel = pixel * blue;
- #endif
  
          if (pixel <= 0.0)
!           {
!             lut->composite[i] = 0;
!           }
          else if (pixel >= 65535.0)
!           {
!             lut->composite[i] = 65535;
!           }
          else
!           {
!             lut->composite[i] = (unsigned)(pixel + 0.5);
!           }
  
          if (red_pixel <= 0.0)
!           {
!             lut->red[i] = 0;
!           }
          else if (red_pixel >= 65535.0)
!           {
!             lut->red[i] = 65535;
!           }
          else
!           {
!             lut->red[i] = (unsigned)(red_pixel + 0.5);
!           }
  
          if (green_pixel <= 0.0)
!           {
!             lut->green[i] = 0;
!           }
          else if (green_pixel >= 65535.0)
!           {
!             lut->green[i] = 65535;
!           }
          else
!           {
!             lut->green[i] = (unsigned)(green_pixel + 0.5);
!           }
  
          if (blue_pixel <= 0.0)
!           {
!             lut->blue[i] = 0;
!           }
          else if (blue_pixel >= 65535.0)
!           {
!             lut->blue[i] = 65535;
!           }
          else
!           {
!             lut->blue[i] = (unsigned)(blue_pixel + 0.5);
!           }
        }
  #ifdef PRINT_LUT
        fprintf(ltfile, "%3i  %5d  %5d  %5d  %5d  %f %f %f %f  %f %f %f  %f\n",
--- 2035,2068 ----
                                 pow(green_pixel, print_gamma));
          blue_pixel = 256.0 * (256.0 - 256.0 *
                                pow(blue_pixel, print_gamma));
  
          if (pixel <= 0.0)
!           lut->composite[i] = 0;
          else if (pixel >= 65535.0)
!           lut->composite[i] = 65535;
          else
!           lut->composite[i] = (unsigned)(pixel);
  
          if (red_pixel <= 0.0)
!           lut->red[i] = 0;
          else if (red_pixel >= 65535.0)
!           lut->red[i] = 65535;
          else
!           lut->red[i] = (unsigned)(red_pixel);
  
          if (green_pixel <= 0.0)
!           lut->green[i] = 0;
          else if (green_pixel >= 65535.0)
!           lut->green[i] = 65535;
          else
!           lut->green[i] = (unsigned)(green_pixel);
  
          if (blue_pixel <= 0.0)
!           lut->blue[i] = 0;
          else if (blue_pixel >= 65535.0)
!           lut->blue[i] = 65535;
          else
!           lut->blue[i] = (unsigned)(blue_pixel);
        }
  #ifdef PRINT_LUT
        fprintf(ltfile, "%3i  %5d  %5d  %5d  %5d  %f %f %f %f  %f %f %f  %f\n",
***************
*** 2546,2550 ****
  #endif
  
  /*
!  * End of "$Id: print-util.c,v 1.11 1999/12/16 19:44:01 olofk Exp $".
   */
--- 2553,2557 ----
  #endif
  
  /*
!  * End of "$Id: print-util.c,v 1.49.2.1 2000/01/13 23:41:29 rlk Exp $".
   */
diff -rc print/print.c /tmp/print/print.c
*** print/print.c       Wed Jan 12 21:51:31 2000
--- /tmp/print/print.c  Thu Jan 13 18:40:41 2000
***************
*** 1,9 ****
  /*
!  * "$Id: print.c,v 1.25 1999/12/30 18:54:16 neo Exp $"
   *
   *   Print plug-in for the GIMP.
   *
!  *   Copyright 1997-1999 Michael Sweet ([EMAIL PROTECTED]) and
   *    Robert Krawitz ([EMAIL PROTECTED])
   *
   *   This program is free software; you can redistribute it and/or modify it
--- 1,9 ----
  /*
!  * "$Id: print.c,v 1.38.2.2 2000/01/13 23:40:41 rlk Exp $"
   *
   *   Print plug-in for the GIMP.
   *
!  *   Copyright 1997-2000 Michael Sweet ([EMAIL PROTECTED]) and
   *    Robert Krawitz ([EMAIL PROTECTED])
   *
   *   This program is free software; you can redistribute it and/or modify it
***************
*** 47,52 ****
--- 47,56 ----
  /*
   * All Gimp-specific code is in this file.
   */
+ #include <gtk/gtk.h>
+ #include <libgimp/gimp.h>
+ #define PLUG_IN_VERSION               "3.0.5 - 13 Jan 2000"
+ #define PLUG_IN_NAME          "Print"
  
  #include <math.h>
  #include <signal.h>
***************
*** 56,63 ****
  #include <os2.h>
  #endif
  
! #include "libgimp/gimpui.h"
! #include "libgimp/stdplugins-intl.h"
  
  /*
   * Constants for GUI...
--- 60,97 ----
  #include <os2.h>
  #endif
  
! #include <libgimp/gimpui.h>
! #if 0
! #include <libgimp/stdplugins-intl.h>
! #else
! #include <libgimp/gimpintl.h>
! #include <locale.h>
! 
! #ifndef LOCALEDIR
! #define LOCALEDIR g_strconcat (gimp_data_directory (), \
!                              G_DIR_SEPARATOR_S, \
!                              "locale", \
!                              NULL)
! #endif
! #ifdef HAVE_LC_MESSAGES
! #define INIT_I18N() \
!   setlocale(LC_MESSAGES, ""); \
!   bindtextdomain("gimp-std-plugins", LOCALEDIR); \
!   textdomain("gimp-std-plugins")
! #define INIT_I18N_UI() \
!   gtk_set_locale(); \
!   setlocale (LC_NUMERIC, "C"); \
!   INIT_I18N();
! #else
! #define INIT_I18N() \
!   bindtextdomain("gimp-std-plugins", LOCALEDIR); \
!   textdomain("gimp-std-plugins")
! #define INIT_I18N_UI() \
!   gtk_set_locale(); \
!   setlocale (LC_NUMERIC, "C"); \
!   INIT_I18N();
! #endif
! #endif
  
  /*
   * Constants for GUI...
***************
*** 236,242 ****
      escp2_parameters, default_media_size,     escp2_imageable_area,   escp2_print },
    { N_("EPSON Stylus Photo EX"),      "escp2-ex",     1,      7,      0.585,  0.646,
      escp2_parameters, default_media_size,     escp2_imageable_area,   escp2_print },
!   { N_("EPSON Stylus Photo EX"),      "escp2-photo",  1,      8,      0.585,  0.646,
      escp2_parameters, default_media_size,     escp2_imageable_area,   escp2_print },
  };
  
--- 270,276 ----
      escp2_parameters, default_media_size,     escp2_imageable_area,   escp2_print },
    { N_("EPSON Stylus Photo EX"),      "escp2-ex",     1,      7,      0.585,  0.646,
      escp2_parameters, default_media_size,     escp2_imageable_area,   escp2_print },
!   { N_("EPSON Stylus Photo"), "escp2-photo",  1,      8,      0.585,  0.646,
      escp2_parameters, default_media_size,     escp2_imageable_area,   escp2_print },
  };
  
***************
*** 797,803 ****
    * Top-level table for dialog...
    */
  
!   table = gtk_table_new(9, 4, FALSE);
    gtk_container_border_width(GTK_CONTAINER(table), 6);
    gtk_table_set_col_spacings(GTK_TABLE(table), 4);
    gtk_table_set_row_spacings(GTK_TABLE(table), 8);
--- 831,837 ----
    * Top-level table for dialog...
    */
  
!   table = gtk_table_new(17, 4, FALSE);
    gtk_container_border_width(GTK_CONTAINER(table), 6);
    gtk_table_set_col_spacings(GTK_TABLE(table), 4);
    gtk_table_set_row_spacings(GTK_TABLE(table), 8);
***************
*** 956,961 ****
--- 990,1004 ----
    gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 0);
    gtk_widget_show(button);
  
+   label = gtk_label_new(_("Density:"));
+   gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
+   gtk_table_attach(GTK_TABLE(table), label, 2, 3, 7, 8, GTK_FILL, GTK_FILL, 0, 0);
+   gtk_widget_show(label);
+ 
+   box = gtk_hbox_new(FALSE, 8);
+   gtk_table_attach(GTK_TABLE(table), box, 3, 4, 7, 8, GTK_FILL, GTK_FILL, 0, 0);
+   gtk_widget_show(box);
+ 
    linear_off = button = gtk_radio_button_new_with_label(NULL, _("Normal scale"));
    linear_group = gtk_radio_button_group(GTK_RADIO_BUTTON(button));
    if (vars.linear == 0)
***************
*** 966,972 ****
    gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 0);
    gtk_widget_show(button);
  
!   linear_on = button = gtk_radio_button_new_with_label(linear_group, _("Linear 
scale"));
    if (vars.linear == 1)
      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
    gtk_signal_connect(GTK_OBJECT(button), "toggled",
--- 1009,1015 ----
    gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 0);
    gtk_widget_show(button);
  
!   linear_on = button = gtk_radio_button_new_with_label(linear_group, _("Experimental 
linear scale"));
    if (vars.linear == 1)
      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
    gtk_signal_connect(GTK_OBJECT(button), "toggled",
***************
*** 981,991 ****
  
    label = gtk_label_new(_("Scaling:"));
    gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
!   gtk_table_attach(GTK_TABLE(table), label, 0, 1, 7, 8, GTK_FILL, GTK_FILL, 0, 0);
    gtk_widget_show(label);
  
    box = gtk_hbox_new(FALSE, 8);
!   gtk_table_attach(GTK_TABLE(table), box, 1, 4, 7, 8, GTK_FILL, GTK_FILL, 0, 0);
    gtk_widget_show(box);
  
    if (vars.scaling < 0.0)
--- 1024,1034 ----
  
    label = gtk_label_new(_("Scaling:"));
    gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
!   gtk_table_attach(GTK_TABLE(table), label, 0, 1, 8, 9, GTK_FILL, GTK_FILL, 0, 0);
    gtk_widget_show(label);
  
    box = gtk_hbox_new(FALSE, 8);
!   gtk_table_attach(GTK_TABLE(table), box, 1, 4, 8, 9, GTK_FILL, GTK_FILL, 0, 0);
    gtk_widget_show(box);
  
    if (vars.scaling < 0.0)
***************
*** 1037,1047 ****
  
    label = gtk_label_new(_("Brightness:"));
    gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
!   gtk_table_attach(GTK_TABLE(table), label, 0, 1, 8, 9, GTK_FILL, GTK_FILL, 0, 0);
    gtk_widget_show(label);
  
    box = gtk_hbox_new(FALSE, 8);
!   gtk_table_attach(GTK_TABLE(table), box, 1, 4, 8, 9, GTK_FILL, GTK_FILL, 0, 0);
    gtk_widget_show(box);
  
    brightness_adjustment = scale_data =
--- 1080,1090 ----
  
    label = gtk_label_new(_("Brightness:"));
    gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
!   gtk_table_attach(GTK_TABLE(table), label, 0, 1, 9, 10, GTK_FILL, GTK_FILL, 0, 0);
    gtk_widget_show(label);
  
    box = gtk_hbox_new(FALSE, 8);
!   gtk_table_attach(GTK_TABLE(table), box, 1, 4, 9, 10, GTK_FILL, GTK_FILL, 0, 0);
    gtk_widget_show(box);
  
    brightness_adjustment = scale_data =
***************
*** 1072,1082 ****
  
    label = gtk_label_new(_("Gamma:"));
    gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
!   gtk_table_attach(GTK_TABLE(table), label, 0, 1, 9, 10, GTK_FILL, GTK_FILL, 0, 0);
    gtk_widget_show(label);
  
    box = gtk_hbox_new(FALSE, 8);
!   gtk_table_attach(GTK_TABLE(table), box, 1, 4, 9, 10, GTK_FILL, GTK_FILL, 0, 0);
    gtk_widget_show(box);
  
    gamma_adjustment = scale_data =
--- 1115,1125 ----
  
    label = gtk_label_new(_("Gamma:"));
    gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
!   gtk_table_attach(GTK_TABLE(table), label, 0, 1, 10, 11, GTK_FILL, GTK_FILL, 0, 0);
    gtk_widget_show(label);
  
    box = gtk_hbox_new(FALSE, 8);
!   gtk_table_attach(GTK_TABLE(table), box, 1, 4, 10, 11, GTK_FILL, GTK_FILL, 0, 0);
    gtk_widget_show(box);
  
    gamma_adjustment = scale_data =
***************
*** 1115,1124 ****
  
    label = gtk_label_new(_("Contrast:"));
    gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
!   gtk_table_attach(GTK_TABLE(table), label, 0, 1, 10, 11, GTK_FILL, GTK_FILL, 0, 0);
    gtk_widget_show(label);
    box = gtk_hbox_new(FALSE, 8);
!   gtk_table_attach(GTK_TABLE(table), box, 1, 4, 10, 11, GTK_FILL, GTK_FILL, 0, 0);
    gtk_widget_show(box);
  
    contrast_adjustment = scale_data =
--- 1158,1167 ----
  
    label = gtk_label_new(_("Contrast:"));
    gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
!   gtk_table_attach(GTK_TABLE(table), label, 0, 1, 11, 12, GTK_FILL, GTK_FILL, 0, 0);
    gtk_widget_show(label);
    box = gtk_hbox_new(FALSE, 8);
!   gtk_table_attach(GTK_TABLE(table), box, 1, 4, 11, 12, GTK_FILL, GTK_FILL, 0, 0);
    gtk_widget_show(box);
  
    contrast_adjustment = scale_data =
***************
*** 1149,1159 ****
  
    label = gtk_label_new(_("Red:"));
    gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
!   gtk_table_attach(GTK_TABLE(table), label, 0, 1, 11, 12, GTK_FILL, GTK_FILL, 0, 0);
    gtk_widget_show(label);
  
    box = gtk_hbox_new(FALSE, 8);
!   gtk_table_attach(GTK_TABLE(table), box, 1, 4, 11, 12, GTK_FILL, GTK_FILL, 0, 0);
    gtk_widget_show(box);
  
    red_adjustment = scale_data =
--- 1192,1202 ----
  
    label = gtk_label_new(_("Red:"));
    gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
!   gtk_table_attach(GTK_TABLE(table), label, 0, 1, 12, 13, GTK_FILL, GTK_FILL, 0, 0);
    gtk_widget_show(label);
  
    box = gtk_hbox_new(FALSE, 8);
!   gtk_table_attach(GTK_TABLE(table), box, 1, 4, 12, 13, GTK_FILL, GTK_FILL, 0, 0);
    gtk_widget_show(box);
  
    red_adjustment = scale_data =
***************
*** 1184,1194 ****
  
    label = gtk_label_new(_("Green:"));
    gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
!   gtk_table_attach(GTK_TABLE(table), label, 0, 1, 12, 13, GTK_FILL, GTK_FILL, 0, 0);
    gtk_widget_show(label);
  
    box = gtk_hbox_new(FALSE, 8);
!   gtk_table_attach(GTK_TABLE(table), box, 1, 4, 12, 13, GTK_FILL, GTK_FILL, 0, 0);
    gtk_widget_show(box);
  
    green_adjustment = scale_data =
--- 1227,1237 ----
  
    label = gtk_label_new(_("Green:"));
    gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
!   gtk_table_attach(GTK_TABLE(table), label, 0, 1, 13, 14, GTK_FILL, GTK_FILL, 0, 0);
    gtk_widget_show(label);
  
    box = gtk_hbox_new(FALSE, 8);
!   gtk_table_attach(GTK_TABLE(table), box, 1, 4, 13, 14, GTK_FILL, GTK_FILL, 0, 0);
    gtk_widget_show(box);
  
    green_adjustment = scale_data =
***************
*** 1219,1229 ****
  
    label = gtk_label_new(_("Blue:"));
    gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
!   gtk_table_attach(GTK_TABLE(table), label, 0, 1, 13, 14, GTK_FILL, GTK_FILL, 0, 0);
    gtk_widget_show(label);
  
    box = gtk_hbox_new(FALSE, 8);
!   gtk_table_attach(GTK_TABLE(table), box, 1, 4, 13, 14, GTK_FILL, GTK_FILL, 0, 0);
    gtk_widget_show(box);
  
    blue_adjustment = scale_data =
--- 1262,1272 ----
  
    label = gtk_label_new(_("Blue:"));
    gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
!   gtk_table_attach(GTK_TABLE(table), label, 0, 1, 14, 15, GTK_FILL, GTK_FILL, 0, 0);
    gtk_widget_show(label);
  
    box = gtk_hbox_new(FALSE, 8);
!   gtk_table_attach(GTK_TABLE(table), box, 1, 4, 14, 15, GTK_FILL, GTK_FILL, 0, 0);
    gtk_widget_show(box);
  
    blue_adjustment = scale_data =
***************
*** 1254,1264 ****
  
    label = gtk_label_new(_("Saturation:"));
    gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
!   gtk_table_attach(GTK_TABLE(table), label, 0, 1, 14, 15, GTK_FILL, GTK_FILL, 0, 0);
    gtk_widget_show(label);
  
    box = gtk_hbox_new(FALSE, 8);
!   gtk_table_attach(GTK_TABLE(table), box, 1, 4, 14, 15, GTK_FILL, GTK_FILL, 0, 0);
    gtk_widget_show(box);
  
    saturation_adjustment = scale_data =
--- 1297,1307 ----
  
    label = gtk_label_new(_("Saturation:"));
    gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
!   gtk_table_attach(GTK_TABLE(table), label, 0, 1, 15, 16, GTK_FILL, GTK_FILL, 0, 0);
    gtk_widget_show(label);
  
    box = gtk_hbox_new(FALSE, 8);
!   gtk_table_attach(GTK_TABLE(table), box, 1, 4, 15, 16, GTK_FILL, GTK_FILL, 0, 0);
    gtk_widget_show(box);
  
    saturation_adjustment = scale_data =
***************
*** 1289,1299 ****
  
    label = gtk_label_new(_("Density:"));
    gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
!   gtk_table_attach(GTK_TABLE(table), label, 0, 1, 15, 16, GTK_FILL, GTK_FILL, 0, 0);
    gtk_widget_show(label);
  
    box = gtk_hbox_new(FALSE, 8);
!   gtk_table_attach(GTK_TABLE(table), box, 1, 4, 15, 16, GTK_FILL, GTK_FILL, 0, 0);
    gtk_widget_show(box);
  
    density_adjustment = scale_data =
--- 1332,1342 ----
  
    label = gtk_label_new(_("Density:"));
    gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
!   gtk_table_attach(GTK_TABLE(table), label, 0, 1, 16, 17, GTK_FILL, GTK_FILL, 0, 0);
    gtk_widget_show(label);
  
    box = gtk_hbox_new(FALSE, 8);
!   gtk_table_attach(GTK_TABLE(table), box, 1, 4, 16, 17, GTK_FILL, GTK_FILL, 0, 0);
    gtk_widget_show(box);
  
    density_adjustment = scale_data =
***************
*** 1367,1379 ****
    * Print, cancel buttons...
    */
  
-   gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->action_area), 
2);
    gtk_box_set_homogeneous(GTK_BOX(GTK_DIALOG(dialog)->action_area), FALSE);
! 
!   hbbox = gtk_hbutton_box_new ();
!   gtk_button_box_set_spacing (GTK_BUTTON_BOX (hbbox), 4);
!   gtk_box_pack_end (GTK_BOX (GTK_DIALOG (dialog)->action_area), hbbox, FALSE,FALSE, 
0);
!   gtk_widget_show (hbbox);
  
    button = gtk_button_new_with_label (_("Print"));
    GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
--- 1410,1417 ----
    * Print, cancel buttons...
    */
  
    gtk_box_set_homogeneous(GTK_BOX(GTK_DIALOG(dialog)->action_area), FALSE);
!   gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(dialog)->action_area), 0);
  
    button = gtk_button_new_with_label (_("Print"));
    GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
***************
*** 3166,3173 ****
        for (i = 1; i <= pnum; i++)
        {
          sprintf(plist[plist_count].name, "LPT%d:", i);
!         sprintf(plist[plist_count].v.output_to, "PRINT /D:LPT%d /B ", i);
!           strcpy(plist[plist_count].v.driver, "ps2");
          initialize_printer(&plist[plist_count]);
            plist_count ++;
        }
--- 3204,3211 ----
        for (i = 1; i <= pnum; i++)
        {
          sprintf(plist[plist_count].name, "LPT%d:", i);
!         sprintf(plist[plist_count].output_to, "PRINT /D:LPT%d /B ", i);
!           strcpy(plist[plist_count].driver, "ps2");
          initialize_printer(&plist[plist_count]);
            plist_count ++;
        }
***************
*** 3259,3263 ****
  }
  
  /*
!  * End of "$Id: print.c,v 1.25 1999/12/30 18:54:16 neo Exp $".
   */
--- 3297,3301 ----
  }
  
  /*
!  * End of "$Id: print.c,v 1.38.2.2 2000/01/13 23:40:41 rlk Exp $".
   */
diff -rc print/print.h /tmp/print/print.h
*** print/print.h       Wed Jan 12 21:51:32 2000
--- /tmp/print/print.h  Wed Jan 12 22:17:11 2000
***************
*** 1,8 ****
  /*
   *
   *   Print plug-in header file for the GIMP.
   *
!  *   Copyright 1997-1999 Michael Sweet ([EMAIL PROTECTED]) and
   *    Robert Krawitz ([EMAIL PROTECTED])
   *
   *   This program is free software; you can redistribute it and/or modify it
--- 1,9 ----
  /*
+  * "$Id: print.h,v 1.22 2000/01/13 03:17:11 rlk Exp $"
   *
   *   Print plug-in header file for the GIMP.
   *
!  *   Copyright 1997-2000 Michael Sweet ([EMAIL PROTECTED]) and
   *    Robert Krawitz ([EMAIL PROTECTED])
   *
   *   This program is free software; you can redistribute it and/or modify it
***************
*** 25,33 ****
   */
  
  /*
   * Include necessary header files...
   */
! #include "config.h"
  
  #include <stdio.h>
  #include <stdlib.h>
--- 26,47 ----
   */
  
  /*
+  *
+  * This file must not include any gimp, glib, gtk, etc. headers.
+  *
+  * Eventually I intend to port this to GhostScript and/or CUPS.  The only
+  * file that should have GIMP-specific code is print.c.  The rest of this
+  * program should be completely generic.
+  *
+  * rlk 20000112
+  */
+ 
+ /*
   * Include necessary header files...
   */
! #ifndef HAVE_UNISTD_H
! #define HAVE_UNISTD_H
! #endif
  
  #include <stdio.h>
  #include <stdlib.h>
***************
*** 39,55 ****
  #include <unistd.h>
  #endif
  
- #include <gtk/gtk.h>
- #include <libgimp/gimp.h>
- 
- 
  /*
   * Constants...
   */
  
- 
- #define PLUG_IN_VERSION         "3.0.1 - 05 Dec 1999" 
- #define PLUG_IN_NAME            "Print"
  #define OUTPUT_GRAY           0       /* Grayscale output */
  #define OUTPUT_COLOR          1       /* Color output */
  
--- 53,62 ----
***************
*** 229,231 ****
--- 236,241 ----
                                lut_t *, unsigned char *, float);
  #endif
  
+ /*
+  * End of "$Id: print.h,v 1.22 2000/01/13 03:17:11 rlk Exp $".
+  */

Reply via email to