home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 2002 April / pcpro0402.iso / essentials / graphics / Gimp / gimp-src-20001226.exe / src / gimp / plug-ins / print / print-dither.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-10-06  |  70.1 KB  |  2,571 lines

  1. /*
  2.  * "$Id: print-dither.c,v 1.2 2000/10/04 01:47:59 mitch Exp $"
  3.  *
  4.  *   Print plug-in driver utility functions for the GIMP.
  5.  *
  6.  *   Copyright 1997-2000 Michael Sweet (mike@easysw.com) and
  7.  *    Robert Krawitz (rlk@alum.mit.edu)
  8.  *
  9.  *   This program is free software; you can redistribute it and/or modify it
  10.  *   under the terms of the GNU General Public License as published by the Free
  11.  *   Software Foundation; either version 2 of the License, or (at your option)
  12.  *   any later version.
  13.  *
  14.  *   This program is distributed in the hope that it will be useful, but
  15.  *   WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  16.  *   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  17.  *   for more details.
  18.  *
  19.  *   You should have received a copy of the GNU General Public License
  20.  *   along with this program; if not, write to the Free Software
  21.  *   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  22.  *
  23.  * Revision History:
  24.  *
  25.  *   See ChangeLog
  26.  */
  27.  
  28. /*
  29.  * This file must include only standard C header files.  The core code must
  30.  * compile on generic platforms that don't support glib, gimp, gtk, etc.
  31.  */
  32.  
  33.  
  34. /* #define PRINT_DEBUG */
  35.  
  36.  
  37. #include "print.h"
  38. #include <limits.h>
  39. #include <math.h>
  40.  
  41. /*
  42.  * The GNU C library provides a good rand() function, but most others
  43.  * use a separate function called random() to provide the same quality
  44.  * (and size) numbers...
  45.  */
  46.  
  47. #ifdef HAVE_RANDOM
  48. #  define rand random
  49. #endif /* HAVE_RANDOM */
  50.  
  51. #if !defined(__GNUC__) && !(defined(_sgi) && _COMPILER_VERSION >= 210)
  52. #  define inline
  53. #endif /* not GNU C or SGI C */
  54.  
  55. /* If you don't want detailed performance numbers in this file, 
  56.  * uncomment this:
  57.  */
  58. /*#define QUANT(x) */
  59.  
  60. #define D_FLOYD_HYBRID 0
  61. #define D_FLOYD 1
  62. #define D_ADAPTIVE_BASE 4
  63. #define D_ADAPTIVE_HYBRID (D_ADAPTIVE_BASE | D_FLOYD_HYBRID)
  64. #define D_ADAPTIVE_RANDOM (D_ADAPTIVE_BASE | D_FLOYD)
  65. #define D_ORDERED_BASE 8
  66. #define D_ORDERED (D_ORDERED_BASE)
  67. #define D_FAST_BASE 16
  68. #define D_FAST (D_FAST_BASE)
  69. #define D_VERY_FAST (D_FAST_BASE + 1)
  70.  
  71. #define DITHER_FAST_STEPS (6)
  72. #define DITHER_FAST_MASK ((1 << DITHER_FAST_STEPS) - 1)
  73.  
  74. char *dither_algo_names[] =
  75. {
  76.   "Adaptive Hybrid",
  77.   "Ordered",
  78.   "Fast",
  79.   "Very Fast",
  80.   "Adaptive Random",
  81.   "Hybrid Floyd-Steinberg",
  82.   "Random Floyd-Steinberg",
  83. };
  84.  
  85. int num_dither_algos = sizeof(dither_algo_names) / sizeof(char *);
  86.  
  87. #define ERROR_ROWS 2
  88. #define NCOLORS (4)
  89.  
  90. #define ECOLOR_C 0
  91. #define ECOLOR_M 1
  92. #define ECOLOR_Y 2
  93. #define ECOLOR_K 3
  94.  
  95. #define MAX_SPREAD 32
  96.  
  97. /*
  98.  * A segment of the entire 0-65536 intensity range.
  99.  */
  100. typedef struct dither_segment
  101. {
  102.   unsigned range_l;        /* Bottom of range */
  103.   unsigned range_h;        /* Top of range */
  104.   unsigned value_l;        /* Value of lighter ink */
  105.   unsigned value_h;        /* Value of upper ink */
  106.   unsigned bits_l;        /* Bit pattern of lower */
  107.   unsigned bits_h;        /* Bit pattern of upper */
  108.   unsigned range_span;        /* Span (to avoid calculation on the fly) */
  109.   unsigned value_span;        /* Span of values */
  110.   unsigned dot_size_l;        /* Size of lower dot */
  111.   unsigned dot_size_h;        /* Size of upper dot */
  112.   char isdark_l;        /* Is lower value dark ink? */
  113.   char isdark_h;        /* Is upper value dark ink? */
  114. } dither_segment_t;
  115.  
  116. typedef struct dither_color
  117. {
  118.   int nlevels;
  119.   unsigned bit_max;
  120.   unsigned signif_bits;
  121.   dither_segment_t *ranges;
  122. } dither_color_t;
  123.  
  124. typedef struct dither_matrix
  125. {
  126.   int base;
  127.   int exp;
  128.   int x_size;
  129.   int y_size;
  130.   int total_size;
  131.   int last_x;
  132.   int last_x_mod;
  133.   int last_y;
  134.   int last_y_mod;
  135.   int index;
  136.   int i_own;
  137.   int x_offset;
  138.   int y_offset;
  139.   unsigned *matrix;
  140. } dither_matrix_t;
  141.  
  142. typedef struct dither
  143. {
  144.   int src_width;        /* Input width */
  145.   int dst_width;        /* Output width */
  146.  
  147.   int density;            /* Desired density, 0-1.0 (scaled 0-65536) */
  148.   int k_lower;            /* Transition range (lower/upper) for CMY */
  149.   int k_upper;            /* vs. K */
  150.   int density2;            /* Density * 2 */
  151.   unsigned dlb_range;
  152.   unsigned bound_range;
  153.  
  154.   int spread;            /* With Floyd-Steinberg, how widely the */
  155.                 /* error is distributed.  This should be */
  156.                 /* between 12 (very broad distribution) and */
  157.                 /* 19 (very narrow) */
  158.  
  159.   unsigned c_randomizer;    /* With Floyd-Steinberg dithering, control */
  160.   unsigned m_randomizer;    /* how much randomness is applied to the */
  161.   unsigned y_randomizer;    /* threshold values (0-65536).  With ordered */
  162.   unsigned k_randomizer;    /* dithering, how much randomness is added */
  163.                 /* to the matrix value. */
  164.  
  165.   int k_clevel;            /* Amount of each ink (in 64ths) required */
  166.   int k_mlevel;            /* to create equivalent black */
  167.   int k_ylevel;
  168.  
  169.   int c_darkness;        /* Perceived "darkness" of each ink, */
  170.   int m_darkness;        /* in 64ths, to calculate CMY-K transitions */
  171.   int y_darkness;
  172.  
  173.   int dither_type;
  174.  
  175.   int d_cutoff;            /* When ordered dither is used, threshold */
  176.                 /* above which no randomness is used. */
  177.   int adaptive_divisor;
  178.   int adaptive_limit;
  179.   int adaptive_lower_limit;
  180.  
  181.   int x_aspect;            /* Aspect ratio numerator */
  182.   int y_aspect;            /* Aspect ratio denominator */
  183.  
  184.   dither_color_t c_dither;
  185.   dither_color_t m_dither;
  186.   dither_color_t y_dither;
  187.   dither_color_t k_dither;
  188.  
  189.   int *errs[ERROR_ROWS][NCOLORS];
  190.   unsigned short *vals[NCOLORS];
  191.   int *offset0_table;
  192.   int *offset1_table;
  193.  
  194.   int ink_limit;        /* Maximum amount of ink that may be */
  195.                 /* deposited */
  196.   int oversampling;
  197.   int last_line_was_empty;
  198.  
  199.   /* Hardwiring these matrices in here is an abomination.  This */
  200.   /* eventually needs to be cleaned up. */
  201.   dither_matrix_t mat6;
  202.   dither_matrix_t mat7;
  203.  
  204.   dither_matrix_t c_pick;
  205.   dither_matrix_t c_dithermat;
  206.   dither_matrix_t m_pick;
  207.   dither_matrix_t m_dithermat;
  208.   dither_matrix_t y_pick;
  209.   dither_matrix_t y_dithermat;
  210.   dither_matrix_t k_pick;
  211.   dither_matrix_t k_dithermat;
  212. } dither_t;
  213.  
  214. /*
  215.  * Bayer's dither matrix using Judice, Jarvis, and Ninke recurrence relation
  216.  * http://www.cs.rit.edu/~sxc7922/Project/CRT.htm
  217.  */
  218.  
  219. static unsigned sq2[] =
  220. {
  221.   0, 2,
  222.   3, 1
  223. };
  224.  
  225. #if 0
  226. static unsigned sq3[] =
  227. {
  228.   3, 2, 7,
  229.   8, 4, 0,
  230.   1, 6, 5
  231. };
  232.  
  233. /*
  234.  * This magic square taken from
  235.  * http://www.pse.che.tohoku.ac.jp/~msuzuki/MagicSquare.5x5.selfsim.html
  236.  *
  237.  * It is magic in the following ways:
  238.  * Rows and columns
  239.  * Major and minor diagonals
  240.  * Self-complementary
  241.  * Four neighbors at distance of 1 or 2 (diagonal or lateral)
  242.  */
  243.  
  244. static unsigned msq0[] =
  245. {
  246.   00, 14, 21, 17,  8,
  247.   22, 18,  5,  4, 11,
  248.   9,   1, 12, 23, 15,
  249.   13, 20, 19,  6,  2,
  250.   16,  7,  3, 10, 24
  251. };
  252.  
  253. static unsigned msq1[] =
  254. {
  255.   03, 11, 20, 17,  9,
  256.   22, 19,  8,  1, 10,
  257.   06,  0, 12, 24, 18,
  258.   14, 23, 16,  5,  2,
  259.   15,  7,  4, 13, 21
  260. };
  261.  
  262. static unsigned short quic0[] = {
  263. #include "quickmatrix199.h"
  264. };
  265.  
  266. static unsigned short quic1[] = {
  267. #include "quickmatrix199-2.h"
  268. };
  269. #endif
  270.  
  271. static unsigned int quic2[] = {
  272. #include "quickmatrix257.h"
  273. };
  274.  
  275. static unsigned int rect2x1[] = {
  276. #include "ran.367.179.h"
  277. };
  278.  
  279. static inline int
  280. calc_ordered_point(unsigned x, unsigned y, int steps, int multiplier,
  281.            int size, int *map)
  282. {
  283.   int i, j;
  284.   unsigned retval = 0;
  285.   int divisor = 1;
  286.   int div1;
  287.   for (i = 0; i < steps; i++)
  288.     {
  289.       int xa = (x / divisor) % size;
  290.       int ya = (y / divisor) % size;
  291.       unsigned base;
  292.       base = map[ya + (xa * size)];
  293.       div1 = 1;
  294.       for (j = i; j < steps - 1; j++)
  295.     div1 *= size * size;
  296.       retval += base * div1;
  297.       divisor *= size;
  298.     }
  299.   return retval * multiplier;
  300. }
  301.  
  302. static void
  303. init_iterated_matrix(dither_matrix_t *mat, int size, int exp,
  304.              unsigned *array)
  305. {
  306.   int i;
  307.   int x, y;
  308.   mat->base = size;
  309.   mat->exp = exp;
  310.   mat->x_size = 1;
  311.   for (i = 0; i < exp; i++)
  312.     mat->x_size *= mat->base;
  313.   mat->y_size = mat->x_size;
  314.   mat->total_size = mat->x_size * mat->y_size;
  315.   mat->matrix = malloc(sizeof(unsigned) * mat->x_size * mat->y_size);
  316.   for (x = 0; x < mat->x_size; x++)
  317.     for (y = 0; y < mat->y_size; y++)
  318.       {
  319.     mat->matrix[x + y * mat->x_size] =
  320.       calc_ordered_point(x, y, mat->exp, 1, mat->base, array);
  321.     mat->matrix[x + y * mat->x_size] =
  322.       (long long) mat->matrix[x + y * mat->x_size] * 65536ll /
  323.       (long long) (mat->x_size * mat->y_size);
  324.       }
  325.   mat->last_x = mat->last_x_mod = 0;
  326.   mat->last_y = mat->last_y_mod = 0;
  327.   mat->index = 0;
  328.   mat->i_own = 1;
  329. }
  330.  
  331. static void
  332. init_matrix(dither_matrix_t *mat, int x_size, int y_size,
  333.         unsigned int *array, int transpose)
  334. {
  335.   int x, y;
  336.   mat->base = x_size;
  337.   mat->exp = 1;
  338.   mat->x_size = x_size;
  339.   mat->y_size = y_size;
  340.   mat->total_size = mat->x_size * mat->y_size;
  341.   mat->matrix = malloc(sizeof(unsigned) * mat->x_size * mat->y_size);
  342.   for (x = 0; x < mat->x_size; x++)
  343.     for (y = 0; y < mat->y_size; y++)
  344.       {
  345.     if (transpose)
  346.       mat->matrix[x + y * mat->x_size] = array[y + x * mat->y_size];
  347.     else
  348.       mat->matrix[x + y * mat->x_size] = array[x + y * mat->x_size];
  349.     mat->matrix[x + y * mat->x_size] =
  350.       (long long) mat->matrix[x + y * mat->x_size] * 65536ll /
  351.       (long long) (mat->x_size * mat->y_size);
  352.       }
  353.   mat->last_x = mat->last_x_mod = 0;
  354.   mat->last_y = mat->last_y_mod = 0;
  355.   mat->index = 0;
  356.   mat->i_own = 1;
  357. }
  358.  
  359. #if 0
  360. static void
  361. init_matrix_short(dither_matrix_t *mat, int x_size, int y_size,
  362.           unsigned short *array, int transpose)
  363. {
  364.   int x, y;
  365.   mat->base = x_size;
  366.   mat->exp = 1;
  367.   mat->x_size = x_size;
  368.   mat->y_size = y_size;
  369.   mat->total_size = mat->x_size * mat->y_size;
  370.   mat->matrix = malloc(sizeof(unsigned) * mat->x_size * mat->y_size);
  371.   for (x = 0; x < mat->x_size; x++)
  372.     for (y = 0; y < mat->y_size; y++)
  373.       {
  374.     if (transpose)
  375.       mat->matrix[x + y * mat->x_size] = array[y + x * mat->x_size];
  376.     else
  377.       mat->matrix[x + y * mat->x_size] = array[x + y * mat->x_size];
  378.     mat->matrix[x + y * mat->x_size] =
  379.       (long long) mat->matrix[x + y * mat->x_size] * 65536ll /
  380.       (long long) (mat->x_size * mat->y_size);
  381.       }
  382.   mat->last_x = mat->last_x_mod = 0;
  383.   mat->last_y = mat->last_y_mod = 0;
  384.   mat->index = 0;
  385.   mat->i_own = 1;
  386. }
  387. #endif
  388.  
  389. static void
  390. destroy_matrix(dither_matrix_t *mat)
  391. {
  392.   if (mat->i_own && mat->matrix)
  393.     free(mat->matrix);
  394.   mat->matrix = NULL;
  395.   mat->base = 0;
  396.   mat->exp = 0;
  397.   mat->x_size = 0;
  398.   mat->y_size = 0;
  399.   mat->total_size = 0;
  400.   mat->i_own = 0;
  401. }
  402.  
  403. static void
  404. clone_matrix(const dither_matrix_t *src, dither_matrix_t *dest,
  405.          int x_offset, int y_offset)
  406. {
  407.   dest->base = src->base;
  408.   dest->exp = src->exp;
  409.   dest->x_size = src->x_size;
  410.   dest->y_size = src->y_size;
  411.   dest->total_size = src->total_size;
  412.   dest->matrix = src->matrix;
  413.   dest->x_offset = x_offset;
  414.   dest->y_offset = y_offset;
  415.   dest->last_x = 0;
  416.   dest->last_x_mod = dest->x_offset % dest->x_size;
  417.   dest->last_y = 0;
  418.   dest->last_y_mod = dest->x_size * (dest->y_offset % dest->y_size);
  419.   dest->index = dest->last_x_mod + dest->last_y_mod;
  420.   dest->i_own = 0;
  421. }
  422.  
  423. static void
  424. copy_matrix(const dither_matrix_t *src, dither_matrix_t *dest)
  425. {
  426.   int x;
  427.   dest->base = src->base;
  428.   dest->exp = src->exp;
  429.   dest->x_size = src->x_size;
  430.   dest->y_size = src->y_size;
  431.   dest->total_size = src->total_size;
  432.   dest->matrix = malloc(sizeof(unsigned) * dest->x_size * dest->y_size);
  433.   for (x = 0; x < dest->x_size * dest->y_size; x++)
  434.     dest->matrix[x] = src->matrix[x];
  435.   dest->x_offset = 0;
  436.   dest->y_offset = 0;
  437.   dest->last_x = 0;
  438.   dest->last_x_mod = 0;
  439.   dest->last_y = 0;
  440.   dest->last_y_mod = 0;
  441.   dest->index = 0;
  442.   dest->i_own = 1;
  443. }
  444.  
  445. static void
  446. exponential_scale_matrix(dither_matrix_t *mat, double exponent)
  447. {
  448.   int i;
  449.   for (i = 0; i < mat->x_size * mat->y_size; i++)
  450.     {
  451.       double dd = mat->matrix[i] / 65535.0;
  452.       dd = pow(dd, exponent);
  453.       mat->matrix[i] = 65535 * dd;
  454.     }
  455. }
  456.  
  457. static void
  458. matrix_set_row(const dither_t *d, dither_matrix_t *mat, int y)
  459. {
  460.   mat->last_y = y;
  461.   mat->last_y_mod = mat->x_size * ((y + mat->y_offset) % mat->y_size);
  462.   mat->index = mat->last_x_mod + mat->last_y_mod;
  463. }
  464.  
  465. static inline unsigned
  466. ditherpoint(const dither_t *d, dither_matrix_t *mat, int x)
  467. {
  468.   /*
  469.    * This rather bizarre code is an attempt to avoid having to compute a lot
  470.    * of modulus and multiplication operations, which are typically slow.
  471.    */
  472.  
  473.   if (x == mat->last_x + 1)
  474.     {
  475.       mat->last_x = x;
  476.       mat->last_x_mod++;
  477.       mat->index++;
  478.       if (mat->last_x_mod >= mat->x_size)
  479.     {
  480.       mat->last_x_mod -= mat->x_size;
  481.       mat->index -= mat->x_size;
  482.     }
  483.     }
  484.   else if (x == mat->last_x - 1)
  485.     {
  486.       mat->last_x = x;
  487.       mat->last_x_mod--;
  488.       mat->index--;
  489.       if (mat->last_x_mod < 0)
  490.     {
  491.       mat->last_x_mod += mat->x_size;
  492.       mat->index += mat->x_size;
  493.     }
  494.     }
  495.   else if (x == mat->last_x)
  496.     {
  497.     }
  498.   else
  499.     {
  500.       mat->last_x = x;
  501.       mat->last_x_mod = (x + mat->x_offset) % mat->x_size;
  502.       mat->index = mat->last_x_mod + mat->last_y_mod;
  503.     }
  504.   return mat->matrix[mat->index];
  505. }
  506.  
  507. static inline unsigned
  508. ditherpoint_fast(const dither_t *d, dither_matrix_t *mat, int x)
  509. {
  510.   if (mat->exp == 1)
  511.     return ditherpoint(d, mat, x);
  512.   else
  513.     return mat->matrix[(mat->last_y_mod +
  514.             ((x + mat->x_offset) & DITHER_FAST_MASK))];
  515. }
  516.  
  517. void *
  518. init_dither(int in_width, int out_width, int horizontal_aspect,
  519.         int vertical_aspect, vars_t *v)
  520. {
  521.   int x_3, y_3;
  522.   dither_t *d = malloc(sizeof(dither_t));
  523.   simple_dither_range_t r;
  524.   memset(d, 0, sizeof(dither_t));
  525.   r.value = 1.0;
  526.   r.bit_pattern = 1;
  527.   r.is_dark = 1;
  528.   r.dot_size = 1;
  529.   dither_set_c_ranges(d, 1, &r, 1.0);
  530.   dither_set_m_ranges(d, 1, &r, 1.0);
  531.   dither_set_y_ranges(d, 1, &r, 1.0);
  532.   dither_set_k_ranges(d, 1, &r, 1.0);
  533.   d->offset0_table = NULL;
  534.   d->offset1_table = NULL;
  535.   d->x_aspect = horizontal_aspect;
  536.   d->y_aspect = vertical_aspect;
  537.  
  538.   if (!strcmp(v->dither_algorithm, "Hybrid Floyd-Steinberg"))
  539.     d->dither_type = D_FLOYD_HYBRID;
  540.   else if (!strcmp(v->dither_algorithm, "Random Floyd-Steinberg"))
  541.     d->dither_type = D_FLOYD;
  542.   else if (!strcmp(v->dither_algorithm, "Ordered"))
  543.     d->dither_type = D_ORDERED;
  544.   else if (!strcmp(v->dither_algorithm, "Adaptive Hybrid"))
  545.     d->dither_type = D_ADAPTIVE_HYBRID;
  546.   else if (!strcmp(v->dither_algorithm, "Adaptive Random"))
  547.     d->dither_type = D_ADAPTIVE_RANDOM;
  548.   else if (!strcmp(v->dither_algorithm, "Fast"))
  549.     d->dither_type = D_FAST;
  550.   else if (!strcmp(v->dither_algorithm, "Very Fast"))
  551.     d->dither_type = D_VERY_FAST;
  552.   else
  553.     d->dither_type = D_FLOYD_HYBRID;
  554.  
  555.   if (d->dither_type == D_VERY_FAST)
  556.     init_iterated_matrix(&(d->mat6), 2, DITHER_FAST_STEPS, sq2);
  557.   else
  558.     {
  559.       if (d->y_aspect / d->x_aspect == 2)
  560.     init_matrix(&(d->mat6), 367, 179, rect2x1, 0);
  561.       else if (d->x_aspect / d->y_aspect == 2)
  562.     init_matrix(&(d->mat6), 179, 367, rect2x1, 1);
  563.       else
  564.     init_matrix(&(d->mat6), 257, 257, quic2, 0);
  565.     }
  566.  
  567.   x_3 = d->mat6.x_size / 3;
  568.   y_3 = d->mat6.y_size / 3;
  569.  
  570.   clone_matrix(&(d->mat6), &(d->c_dithermat), 2 * x_3, y_3);
  571.   clone_matrix(&(d->mat6), &(d->m_dithermat), x_3, 2 * y_3);
  572.   clone_matrix(&(d->mat6), &(d->y_dithermat), 0, y_3);
  573.   clone_matrix(&(d->mat6), &(d->k_dithermat), 0, 0);
  574.   dither_set_transition(d, .6);
  575.  
  576.   d->src_width = in_width;
  577.   d->dst_width = out_width;
  578.   d->adaptive_divisor = 2;
  579.  
  580.   dither_set_max_ink(d, INT_MAX, 1.0);
  581.   dither_set_ink_spread(d, 13);
  582.   dither_set_black_lower(d, .4);
  583.   dither_set_black_upper(d, .7);
  584.   dither_set_black_levels(d, 1.0, 1.0, 1.0);
  585.   dither_set_randomizers(d, 1.0, 1.0, 1.0, 1.0);
  586.   dither_set_ink_darkness(d, .4, .3, .2);
  587.   dither_set_density(d, 1.0);
  588.   return d;
  589. }
  590.  
  591. void
  592. dither_set_transition(void *vd, double exponent)
  593. {
  594.   dither_t *d = (dither_t *) vd;
  595.   int x_3 = d->mat6.x_size / 3;
  596.   int y_3 = d->mat6.y_size / 3;
  597.   destroy_matrix(&(d->c_pick));
  598.   destroy_matrix(&(d->m_pick));
  599.   destroy_matrix(&(d->y_pick));
  600.   destroy_matrix(&(d->k_pick));
  601.   destroy_matrix(&(d->mat7));
  602.   copy_matrix(&(d->mat6), &(d->mat7));
  603.   exponential_scale_matrix(&(d->mat7), exponent);
  604.   clone_matrix(&(d->mat7), &(d->c_pick), x_3, 0);
  605.   clone_matrix(&(d->mat7), &(d->m_pick), 0, 2 * y_3);
  606.   clone_matrix(&(d->mat7), &(d->y_pick), 2 * x_3, 0);
  607.   clone_matrix(&(d->mat7), &(d->k_pick), x_3, 2 * y_3);
  608. }
  609.  
  610. void
  611. dither_set_density(void *vd, double density)
  612. {
  613.   dither_t *d = (dither_t *) vd;
  614.   if (density > 1)
  615.     density = 1;
  616.   else if (density < 0)
  617.     density = 0;
  618.   d->k_upper = d->k_upper * density;
  619.   d->k_lower = d->k_lower * density;
  620.   d->density = (int) ((65536 * density) + .5);
  621.   d->density2 = 2 * d->density;
  622.   d->dlb_range = d->density - d->k_lower;
  623.   d->bound_range = d->k_upper - d->k_lower;
  624.   d->d_cutoff = d->density / 16;
  625.   d->adaptive_limit = d->density / d->adaptive_divisor;
  626.   d->adaptive_lower_limit = d->adaptive_limit / 4;
  627. }
  628.  
  629. static double
  630. imax(double a, double b)
  631. {
  632.   return ((a > b) ? a : b);
  633. }
  634.  
  635. void
  636. dither_set_max_ink(void *vd, int levels, double max_ink)
  637. {
  638.   dither_t *d = (dither_t *) vd;
  639.   d->ink_limit = imax(max_ink, 1)*levels;
  640.   d->ink_limit = max_ink*levels+0.5;
  641. #ifdef VERBOSE
  642.   fprintf(stderr, "Maxink: %f %d\n", max_ink, d->ink_limit);
  643. #endif
  644. }
  645.  
  646. void
  647. dither_set_adaptive_divisor(void *vd, unsigned divisor)
  648. {
  649.   dither_t *d = (dither_t *) vd;
  650.   d->adaptive_divisor = divisor;
  651.   d->adaptive_limit = d->density / d->adaptive_divisor;
  652.   d->adaptive_lower_limit = d->adaptive_limit / 4;
  653. }
  654.  
  655. void
  656. dither_set_black_lower(void *vd, double k_lower)
  657. {
  658.   dither_t *d = (dither_t *) vd;
  659.   d->k_lower = (int) (k_lower * 65536);
  660. }
  661.  
  662. void
  663. dither_set_black_upper(void *vd, double k_upper)
  664. {
  665.   dither_t *d = (dither_t *) vd;
  666.   d->k_upper = (int) (k_upper * 65536);
  667. }
  668.  
  669. void
  670. dither_set_ink_spread(void *vd, int spread)
  671. {
  672.   dither_t *d = (dither_t *) vd;
  673.   if (d->offset0_table)
  674.     {
  675.       free(d->offset0_table);
  676.       d->offset0_table = NULL;
  677.     }
  678.   if (d->offset1_table)
  679.     {
  680.       free(d->offset1_table);
  681.       d->offset1_table = NULL;
  682.     }
  683.   if (spread >= 16)
  684.     {
  685.       d->spread = 16;
  686.     }
  687.   else
  688.     {
  689.       int max_offset;
  690.       int i;
  691.       d->spread = spread;
  692.       max_offset = (1 << (16 - spread)) + 1;
  693.       d->offset0_table = malloc(sizeof(int) * max_offset);
  694.       d->offset1_table = malloc(sizeof(int) * max_offset);
  695.       for (i = 0; i < max_offset; i++)
  696.     {
  697.       d->offset0_table[i] = (i + 1) * (i + 1);
  698.       d->offset1_table[i] = ((i + 1) * i) / 2;
  699.     }
  700.     }
  701.  
  702.   d->adaptive_limit = d->density / d->adaptive_divisor;
  703.   d->adaptive_lower_limit = d->adaptive_limit / 4;
  704. }
  705.  
  706. void
  707. dither_set_black_levels(void *vd, double c, double m, double y)
  708. {
  709.   dither_t *d = (dither_t *) vd;
  710.   d->k_clevel = (int) (c * 64);
  711.   d->k_mlevel = (int) (m * 64);
  712.   d->k_ylevel = (int) (y * 64);
  713. }
  714.  
  715. void
  716. dither_set_randomizers(void *vd, double c, double m, double y, double k)
  717. {
  718.   dither_t *d = (dither_t *) vd;
  719.   d->c_randomizer = c * 65536;
  720.   d->m_randomizer = m * 65536;
  721.   d->y_randomizer = y * 65536;
  722.   d->k_randomizer = k * 65536;
  723. }
  724.  
  725. void
  726. dither_set_ink_darkness(void *vd, double c, double m, double y)
  727. {
  728.   dither_t *d = (dither_t *) vd;
  729.   d->c_darkness = (int) (c * 64);
  730.   d->m_darkness = (int) (m * 64);
  731.   d->y_darkness = (int) (y * 64);
  732. }
  733.  
  734. void
  735. dither_set_light_inks(void *vd, double c, double m, double y, double density)
  736. {
  737.   simple_dither_range_t range[2];
  738.   range[0].bit_pattern = 1;
  739.   range[0].is_dark = 0;
  740.   range[1].value = 1;
  741.   range[1].bit_pattern = 1;
  742.   range[1].is_dark = 1;
  743.   range[1].dot_size = 1;
  744.   if (c > 0)
  745.     {
  746.       range[0].value = c;
  747.       range[0].dot_size = 1;
  748.       dither_set_c_ranges(vd, 2, range, density);
  749.     }
  750.   if (m > 0)
  751.     {
  752.       range[0].value = m;
  753.       range[0].dot_size = 1;
  754.       dither_set_m_ranges(vd, 2, range, density);
  755.     }
  756.   if (y > 0)
  757.     {
  758.       range[0].value = y;
  759.       range[0].dot_size = 1;
  760.       dither_set_y_ranges(vd, 2, range, density);
  761.     }
  762. }
  763.  
  764. static void
  765. dither_set_ranges(dither_color_t *s, int nlevels,
  766.           const simple_dither_range_t *ranges, double density)
  767. {
  768.   int i;
  769.   unsigned lbit;
  770.   if (s->ranges)
  771.     free(s->ranges);
  772.   s->nlevels = nlevels > 1 ? nlevels + 1 : nlevels;
  773.   s->ranges = (dither_segment_t *)
  774.     malloc(s->nlevels * sizeof(dither_segment_t));
  775.   s->bit_max = 0;
  776. #ifdef VERBOSE
  777.   fprintf(stderr, "dither_set_ranges nlevels %d density %f\n", nlevels, density);
  778.   for (i = 0; i < nlevels; i++)
  779.     fprintf(stderr, "  level %d value %f pattern %x is_dark %d\n", i,
  780.         ranges[i].value, ranges[i].bit_pattern, ranges[i].is_dark);
  781. #endif
  782.   s->ranges[0].range_l = 0;
  783.   s->ranges[0].value_l = ranges[0].value * 65536.0;
  784.   s->ranges[0].bits_l = ranges[0].bit_pattern;
  785.   s->ranges[0].isdark_l = ranges[0].is_dark;
  786.   s->ranges[0].dot_size_l = ranges[0].dot_size;
  787.   if (nlevels == 1)
  788.     s->ranges[0].range_h = 65536;
  789.   else
  790.     s->ranges[0].range_h = ranges[0].value * 65536.0 * density;
  791.   if (s->ranges[0].range_h > 65536)
  792.     s->ranges[0].range_h = 65536;
  793.   s->ranges[0].value_h = ranges[0].value * 65536.0;
  794.   if (s->ranges[0].value_h > 65536)
  795.     s->ranges[0].value_h = 65536;
  796.   s->ranges[0].bits_h = ranges[0].bit_pattern;
  797.   if (ranges[0].bit_pattern > s->bit_max)
  798.     s->bit_max = ranges[0].bit_pattern;
  799.   s->ranges[0].isdark_h = ranges[0].is_dark;
  800.   s->ranges[0].dot_size_h = ranges[0].dot_size;
  801.   s->ranges[0].range_span = s->ranges[0].range_h;
  802.   s->ranges[0].value_span = 0;
  803.   if (s->nlevels > 1)
  804.     {
  805.       for (i = 0; i < nlevels - 1; i++)
  806.     {
  807.       int l = i + 1;
  808.       s->ranges[l].range_l = s->ranges[i].range_h;
  809.       s->ranges[l].value_l = s->ranges[i].value_h;
  810.       s->ranges[l].bits_l = s->ranges[i].bits_h;
  811.       s->ranges[l].isdark_l = s->ranges[i].isdark_h;
  812.       s->ranges[l].dot_size_l = s->ranges[i].dot_size_h;
  813.       if (i == nlevels - 1)
  814.         s->ranges[l].range_h = 65536;
  815.       else
  816.         s->ranges[l].range_h =
  817.           (ranges[l].value + ranges[l].value) * 65536.0 * density / 2;
  818.       if (s->ranges[l].range_h > 65536)
  819.         s->ranges[l].range_h = 65536;
  820.       s->ranges[l].value_h = ranges[l].value * 65536.0;
  821.       if (s->ranges[l].value_h > 65536)
  822.         s->ranges[l].value_h = 65536;
  823.       s->ranges[l].bits_h = ranges[l].bit_pattern;
  824.       if (ranges[l].bit_pattern > s->bit_max)
  825.         s->bit_max = ranges[l].bit_pattern;
  826.       s->ranges[l].isdark_h = ranges[l].is_dark;
  827.       s->ranges[l].dot_size_h = ranges[l].dot_size;
  828.       s->ranges[l].range_span =
  829.         s->ranges[l].range_h - s->ranges[l].range_l;
  830.       s->ranges[l].value_span =
  831.         s->ranges[l].value_h - s->ranges[l].value_l;
  832.     }
  833.       i++;
  834.       s->ranges[i].range_l = s->ranges[i - 1].range_h;
  835.       s->ranges[i].value_l = s->ranges[i - 1].value_h;
  836.       s->ranges[i].bits_l = s->ranges[i - 1].bits_h;
  837.       s->ranges[i].isdark_l = s->ranges[i - 1].isdark_h;
  838.       s->ranges[i].dot_size_l = s->ranges[i - 1].dot_size_h;
  839.       s->ranges[i].range_h = 65536;
  840.       s->ranges[i].value_h = s->ranges[i].value_l;
  841.       s->ranges[i].bits_h = s->ranges[i].bits_l;
  842.       s->ranges[i].isdark_h = s->ranges[i].isdark_l;
  843.       s->ranges[i].dot_size_h = s->ranges[i].dot_size_l;
  844.       s->ranges[i].range_span = s->ranges[i].range_h - s->ranges[i].range_l;
  845.       s->ranges[i].value_span = s->ranges[i].value_h - s->ranges[i].value_l;
  846.     }
  847.   lbit = s->bit_max;
  848.   s->signif_bits = 0;
  849.   while (lbit > 0)
  850.     {
  851.       s->signif_bits++;
  852.       lbit >>= 1;
  853.     }
  854. #ifdef VERBOSE
  855.   for (i = 0; i < s->nlevels; i++)
  856.     {
  857.       fprintf(stderr, "    level %d value_l %d value_h %d range_l %d range_h %d\n",
  858.           i, s->ranges[i].value_l, s->ranges[i].value_h,
  859.           s->ranges[i].range_l, s->ranges[i].range_h);
  860.       fprintf(stderr, "       bits_l %d bits_h %d isdark_l %d isdark_h %d\n",
  861.           s->ranges[i].bits_l, s->ranges[i].bits_h,
  862.           s->ranges[i].isdark_l, s->ranges[i].isdark_h);
  863.       fprintf(stderr, "       rangespan %d valuespan %d\n",
  864.           s->ranges[i].range_span, s->ranges[i].value_span);
  865.     }
  866.   fprintf(stderr, "  bit_max %d signif_bits %d\n", s->bit_max, s->signif_bits);
  867. #endif
  868. }
  869.  
  870. static void
  871. dither_set_ranges_full(dither_color_t *s, int nlevels,
  872.                const full_dither_range_t *ranges, double density,
  873.                int max_ink)
  874. {
  875.   int i, j;
  876.   unsigned lbit;
  877.   if (s->ranges)
  878.     free(s->ranges);
  879.   s->nlevels = nlevels > 1 ? nlevels + 1 : nlevels;
  880.   s->nlevels = nlevels+1;
  881.   s->ranges = (dither_segment_t *)
  882.     malloc(s->nlevels * sizeof(dither_segment_t));
  883.   s->bit_max = 0;
  884. #ifdef VERBOSE
  885.   fprintf(stderr, "dither_set_ranges nlevels %d density %f\n", nlevels, density);
  886.   for (i = 0; i < nlevels; i++)
  887.     fprintf(stderr, "  level %d value: low %f high %f pattern low %x high %x is_dark low %d high %d\n", i,
  888.         ranges[i].value_l, ranges[i].value_h, ranges[i].bits_l, ranges[i].bits_h,ranges[i].isdark_l, ranges[i].isdark_h);
  889. #endif
  890.   for(i=j=0; i < nlevels; i++) {
  891.     if (ranges[i].bits_h > s->bit_max)
  892.       s->bit_max = ranges[i].bits_h;
  893.     if (ranges[i].bits_l > s->bit_max)
  894.       s->bit_max = ranges[i].bits_l;
  895.     s->ranges[j].dot_size_l = ranges[i].bits_l; /* FIXME */
  896.     s->ranges[j].dot_size_h = ranges[i].bits_h;
  897.     /*if(s->ranges[j].dot_size_l > max_ink || s->ranges[j].dot_size_h > max_ink)
  898.            continue;*/
  899.     s->ranges[j].value_l = ranges[i].value_l * 65535;
  900.     s->ranges[j].value_h = ranges[i].value_h * 65535;
  901.     s->ranges[j].range_l = s->ranges[j].value_l*density;
  902.     s->ranges[j].range_h = s->ranges[j].value_h*density;
  903.     s->ranges[j].bits_l = ranges[i].bits_l;
  904.     s->ranges[j].bits_h = ranges[i].bits_h;
  905.     s->ranges[j].isdark_l = ranges[i].isdark_l;
  906.     s->ranges[j].isdark_h = ranges[i].isdark_h;
  907.     s->ranges[j].range_span = s->ranges[j].range_h-s->ranges[j].range_l;
  908.     s->ranges[j].value_span = s->ranges[j].value_h-s->ranges[j].value_l;
  909.     j++;
  910.   }
  911.   s->ranges[j].range_l = s->ranges[j - 1].range_h;
  912.   s->ranges[j].value_l = s->ranges[j - 1].value_h;
  913.   s->ranges[j].bits_l = s->ranges[j - 1].bits_h;
  914.   s->ranges[j].isdark_l = s->ranges[j - 1].isdark_h;
  915.   s->ranges[j].dot_size_l = s->ranges[j - 1].dot_size_h;
  916.   s->ranges[j].range_h = 65535;
  917.   s->ranges[j].value_h = 65535;
  918.   s->ranges[j].bits_h = s->ranges[j].bits_l;
  919.   s->ranges[j].isdark_h = s->ranges[j].isdark_l;
  920.   s->ranges[j].dot_size_h = s->ranges[j].dot_size_l;
  921.   s->ranges[j].range_span = s->ranges[j].range_h - s->ranges[j].range_l;
  922.   s->ranges[j].value_span = 0;
  923.   s->nlevels = j+1;
  924.   lbit = s->bit_max;
  925.   s->signif_bits = 0;
  926.   while (lbit > 0)
  927.     {
  928.       s->signif_bits++;
  929.       lbit >>= 1;
  930.     }
  931. #ifdef VERBOSE
  932.   for (i = 0; i < s->nlevels; i++)
  933.     {
  934.       fprintf(stderr, "    level %d value_l %d value_h %d range_l %d range_h %d\n",
  935.           i, s->ranges[i].value_l, s->ranges[i].value_h,
  936.           s->ranges[i].range_l, s->ranges[i].range_h);
  937.       fprintf(stderr, "       bits_l %d bits_h %d isdark_l %d isdark_h %d\n",
  938.           s->ranges[i].bits_l, s->ranges[i].bits_h,
  939.           s->ranges[i].isdark_l, s->ranges[i].isdark_h);
  940.       fprintf(stderr, "       rangespan %d valuespan %d\n",
  941.           s->ranges[i].range_span, s->ranges[i].value_span);
  942.     }
  943.   fprintf(stderr, "  bit_max %d signif_bits %d\n", s->bit_max, s->signif_bits);
  944. #endif
  945. }
  946.  
  947. void
  948. dither_set_c_ranges(void *vd, int nlevels, const simple_dither_range_t *ranges,
  949.             double density)
  950. {
  951.   dither_t *d = (dither_t *) vd;
  952.   dither_set_ranges(&(d->c_dither), nlevels, ranges, density);
  953. }
  954.  
  955. void
  956. dither_set_c_ranges_simple(void *vd, int nlevels, const double *levels,
  957.                double density)
  958. {
  959.   simple_dither_range_t *r = malloc(nlevels * sizeof(simple_dither_range_t));
  960.   int i;
  961.   for (i = 0; i < nlevels; i++)
  962.     {
  963.       r[i].bit_pattern = i + 1;
  964.       r[i].dot_size = i + 1;
  965.       r[i].value = levels[i];
  966.       r[i].is_dark = 1;
  967.     }
  968.   dither_set_c_ranges(vd, nlevels, r, density);
  969.   free(r);
  970. }
  971.  
  972. void
  973. dither_set_c_ranges_full(void *vd, int nlevels,
  974.              const full_dither_range_t *ranges, double density)
  975. {
  976.   dither_t *d = (dither_t *) vd;
  977.   dither_set_ranges_full(&(d->c_dither), nlevels, ranges, density,
  978.              d->ink_limit);
  979. }
  980.  
  981. void
  982. dither_set_m_ranges(void *vd, int nlevels, const simple_dither_range_t *ranges,
  983.             double density)
  984. {
  985.   dither_t *d = (dither_t *) vd;
  986.   dither_set_ranges(&(d->m_dither), nlevels, ranges, density);
  987. }
  988.  
  989. void
  990. dither_set_m_ranges_simple(void *vd, int nlevels, const double *levels,
  991.                double density)
  992. {
  993.   simple_dither_range_t *r = malloc(nlevels * sizeof(simple_dither_range_t));
  994.   int i;
  995.   for (i = 0; i < nlevels; i++)
  996.     {
  997.       r[i].bit_pattern = i + 1;
  998.       r[i].dot_size = i + 1;
  999.       r[i].value = levels[i];
  1000.       r[i].is_dark = 1;
  1001.     }
  1002.   dither_set_m_ranges(vd, nlevels, r, density);
  1003.   free(r);
  1004. }
  1005.  
  1006. void
  1007. dither_set_m_ranges_full(void *vd, int nlevels,
  1008.              const full_dither_range_t *ranges, double density)
  1009. {
  1010.   dither_t *d = (dither_t *) vd;
  1011.   dither_set_ranges_full(&(d->m_dither), nlevels, ranges, density,
  1012.              d->ink_limit);
  1013. }
  1014.  
  1015. void
  1016. dither_set_y_ranges(void *vd, int nlevels, const simple_dither_range_t *ranges,
  1017.             double density)
  1018. {
  1019.   dither_t *d = (dither_t *) vd;
  1020.   dither_set_ranges(&(d->y_dither), nlevels, ranges, density);
  1021. }
  1022.  
  1023. void
  1024. dither_set_y_ranges_simple(void *vd, int nlevels, const double *levels,
  1025.                double density)
  1026. {
  1027.   simple_dither_range_t *r = malloc(nlevels * sizeof(simple_dither_range_t));
  1028.   int i;
  1029.   for (i = 0; i < nlevels; i++)
  1030.     {
  1031.       r[i].bit_pattern = i + 1;
  1032.       r[i].dot_size = i + 1;
  1033.       r[i].value = levels[i];
  1034.       r[i].is_dark = 1;
  1035.     }
  1036.   dither_set_y_ranges(vd, nlevels, r, density);
  1037.   free(r);
  1038. }
  1039.  
  1040. void
  1041. dither_set_y_ranges_full(void *vd, int nlevels,
  1042.              const full_dither_range_t *ranges, double density)
  1043. {
  1044.   dither_t *d = (dither_t *) vd;
  1045.   dither_set_ranges_full(&(d->y_dither), nlevels, ranges, density,
  1046.              d->ink_limit);
  1047. }
  1048.  
  1049. void
  1050. dither_set_k_ranges(void *vd, int nlevels, const simple_dither_range_t *ranges,
  1051.             double density)
  1052. {
  1053.   dither_t *d = (dither_t *) vd;
  1054.   dither_set_ranges(&(d->k_dither), nlevels, ranges, density);
  1055. }
  1056.  
  1057. void
  1058. dither_set_k_ranges_simple(void *vd, int nlevels, const double *levels,
  1059.                double density)
  1060. {
  1061.   simple_dither_range_t *r = malloc(nlevels * sizeof(simple_dither_range_t));
  1062.   int i;
  1063.   for (i = 0; i < nlevels; i++)
  1064.     {
  1065.       r[i].bit_pattern = i + 1;
  1066.       r[i].dot_size = i + 1;
  1067.       r[i].value = levels[i];
  1068.       r[i].is_dark = 1;
  1069.     }
  1070.   dither_set_k_ranges(vd, nlevels, r, density);
  1071.   free(r);
  1072. }
  1073.  
  1074. void
  1075. dither_set_k_ranges_full(void *vd, int nlevels,
  1076.              const full_dither_range_t *ranges, double density)
  1077. {
  1078.   dither_t *d = (dither_t *) vd;
  1079.   dither_set_ranges_full(&(d->k_dither), nlevels, ranges, density,
  1080.              d->ink_limit);
  1081. }
  1082.  
  1083. void
  1084. free_dither(void *vd)
  1085. {
  1086.   dither_t *d = (dither_t *) vd;
  1087.   int i;
  1088.   int j;
  1089.   for (j = 0; j < NCOLORS; j++)
  1090.     {
  1091.       if (d->vals[j])
  1092.     {
  1093.       free(d->vals[j]);
  1094.       d->vals[j] = NULL;
  1095.     }
  1096.       for (i = 0; i < ERROR_ROWS; i++)
  1097.     {
  1098.       if (d->errs[i][j])
  1099.         {
  1100.           free(d->errs[i][j]);
  1101.           d->errs[i][j] = NULL;
  1102.         }
  1103.     }
  1104.     }
  1105.   free(d->c_dither.ranges);
  1106.   d->c_dither.ranges = NULL;
  1107.   free(d->m_dither.ranges);
  1108.   d->m_dither.ranges = NULL;
  1109.   free(d->y_dither.ranges);
  1110.   d->y_dither.ranges = NULL;
  1111.   free(d->k_dither.ranges);
  1112.   d->k_dither.ranges = NULL;
  1113.   if (d->offset0_table)
  1114.     {
  1115.       free(d->offset0_table);
  1116.       d->offset0_table = NULL;
  1117.     }
  1118.   if (d->offset1_table)
  1119.     {
  1120.       free(d->offset1_table);
  1121.       d->offset1_table = NULL;
  1122.     }
  1123.   destroy_matrix(&(d->c_pick));
  1124.   destroy_matrix(&(d->c_dithermat));
  1125.   destroy_matrix(&(d->m_pick));
  1126.   destroy_matrix(&(d->m_dithermat));
  1127.   destroy_matrix(&(d->y_pick));
  1128.   destroy_matrix(&(d->y_dithermat));
  1129.   destroy_matrix(&(d->k_pick));
  1130.   destroy_matrix(&(d->k_dithermat));
  1131.   destroy_matrix(&(d->mat6));
  1132.   destroy_matrix(&(d->mat7));
  1133.   free(d);
  1134. }
  1135.  
  1136. static int *
  1137. get_errline(dither_t *d, int row, int color)
  1138. {
  1139.   if (row < 0 || color < 0 || color >= NCOLORS)
  1140.     return NULL;
  1141.   if (d->errs[row & 1][color])
  1142.     return d->errs[row & 1][color] + MAX_SPREAD;
  1143.   else
  1144.     {
  1145.       int size = 2 * MAX_SPREAD + (16 * ((d->dst_width + 7) / 8));
  1146.       d->errs[row & 1][color] = malloc(size * sizeof(int));
  1147.       memset(d->errs[row & 1][color], 0, size * sizeof(int));
  1148.       return d->errs[row & 1][color] + MAX_SPREAD;
  1149.     }
  1150. }
  1151.  
  1152. static unsigned short *
  1153. get_valueline(dither_t *d, int color)
  1154. {
  1155.   if (color < 0 || color >= NCOLORS)
  1156.     return NULL;
  1157.   if (d->vals[color])
  1158.     return d->vals[color];
  1159.   else
  1160.     {
  1161.       int size = (8 * ((d->dst_width + 7) / 8));
  1162.       d->vals[color] = malloc(size * sizeof(unsigned short));
  1163.       return d->vals[color];
  1164.     }
  1165. }
  1166.  
  1167. /*
  1168.  * Add the error to the input value.  Notice that we micro-optimize this
  1169.  * to save a division when appropriate.
  1170.  */
  1171.  
  1172. #define UPDATE_COLOR(color, dither) (\
  1173.         ((dither) >= 0)? \
  1174.                 (color) + ((dither) >> 3): \
  1175.                 (color) - ((-(dither)) >> 3))
  1176.  
  1177. /*
  1178.  * For Floyd-Steinberg, distribute the error residual.  We spread the
  1179.  * error to nearby points, spreading more broadly in lighter regions to
  1180.  * achieve more uniform distribution of color.  The actual distribution
  1181.  * is a triangular function.
  1182.  */
  1183.  
  1184. static inline int
  1185. update_dither(int r, int o, int width, int odb, int odb_mask,
  1186.           int direction, int *error0, int *error1, dither_t *d)
  1187. {
  1188.   int tmp = r;
  1189.   if (tmp != 0)
  1190.     {
  1191.       int i, dist;
  1192.       int dist1;
  1193.       int offset;
  1194.       int delta, delta1;
  1195.       int nextspread = 4;
  1196.       int thisspread = 8 - nextspread;
  1197.       if (tmp > 65535)
  1198.     tmp = 65535;
  1199.       if (odb >= 16 || o >= 2048)
  1200.     offset = 0;
  1201.       else
  1202.     {
  1203.       int tmpo = o * 32;
  1204.       offset = (65535 - (tmpo & 0xffff)) >> odb;
  1205.       if ((rand() & odb_mask) > (tmpo & odb_mask))
  1206.         offset++;
  1207.       if (offset > MAX_SPREAD - 1)
  1208.         offset = MAX_SPREAD - 1;
  1209.     }
  1210.       if (offset == 0)
  1211.     {
  1212.       dist = nextspread * tmp;
  1213.       error1[0] += dist;
  1214.       return error0[direction] + thisspread * tmp;
  1215.     }
  1216.       else
  1217.     {
  1218.       dist = nextspread * tmp / d->offset0_table[offset];
  1219.       dist1 = thisspread * tmp / d->offset1_table[offset];
  1220.       delta1 = dist1 * offset;
  1221.     }
  1222.       delta = dist;
  1223.       for (i = -offset; i <= offset; i++)
  1224.     {
  1225.       error1[i] += delta;
  1226.       if ((i > 0 && direction > 0) || (i < 0 && direction < 0))
  1227.         {
  1228.           error0[i] += delta1;
  1229.           delta1 -= dist1;
  1230.         }
  1231.       if (i < 0)
  1232.         delta += dist;
  1233.       else
  1234.         delta -= dist;
  1235.     }
  1236.     }
  1237.   return error0[direction];
  1238. }
  1239.  
  1240. /*
  1241.  * Print a single dot.  This routine has become awfully complicated
  1242.  * awfully fast!
  1243.  *
  1244.  * Note that the ink budget is both an input and an output parameter
  1245.  */
  1246.  
  1247. static inline int
  1248. print_color(dither_t *d, dither_color_t *rv, int base, int density,
  1249.         int adjusted, int x, int y, unsigned char *c, unsigned char *lc,
  1250.         unsigned char bit, int length, unsigned randomizer, int dontprint,
  1251.         int *ink_budget, dither_matrix_t *pick_matrix,
  1252.         dither_matrix_t *dither_matrix, int dither_type)
  1253. {
  1254.   unsigned rangepoint;
  1255.   unsigned virtual_value;
  1256.   unsigned vmatrix;
  1257.   int i;
  1258.   int j;
  1259.   int isdark;
  1260.   unsigned char *tptr;
  1261.   unsigned bits;
  1262.   unsigned v;
  1263.   unsigned dot_size;
  1264.   int levels = rv->nlevels - 1;
  1265.   int dither_value = adjusted;
  1266.   dither_segment_t *dd;
  1267.  
  1268.   if ((adjusted <= 0 && !(dither_type & D_ADAPTIVE_BASE)) ||
  1269.       base <= 0 || density <= 0)
  1270.     return adjusted;
  1271.   if (density > 65536)
  1272.     density = 65536;
  1273.  
  1274.   /*
  1275.    * Look for the appropriate range into which the input value falls.
  1276.    * Notice that we use the input, not the error, to decide what dot type
  1277.    * to print (if any).  We actually use the "density" input to permit
  1278.    * the caller to use something other that simply the input value, if it's
  1279.    * desired to use some function of overall density, rather than just
  1280.    * this color's input, for this purpose.
  1281.    */
  1282.   for (i = levels; i >= 0; i--)
  1283.     {
  1284.       dd = &(rv->ranges[i]);
  1285.  
  1286.       if (density <= dd->range_l)
  1287.     continue;
  1288.  
  1289.       /*
  1290.        * If we're using an adaptive dithering method, decide whether
  1291.        * to use the Floyd-Steinberg or the ordered method based on the
  1292.        * input value.  The choice of 1/128 is somewhat arbitrary and
  1293.        * could stand to be parameterized.  Another possibility would be
  1294.        * to scale to something less than pure ordered at 0 input value.
  1295.        */
  1296.       if (dither_type & D_ADAPTIVE_BASE)
  1297.     {
  1298.       dither_type -= D_ADAPTIVE_BASE;
  1299.       if (base <= d->adaptive_limit)
  1300.         {
  1301.           dither_type = D_ORDERED;
  1302.           dither_value = base;
  1303.         }
  1304.       else if (adjusted <= 0)
  1305.         return adjusted;
  1306.     }
  1307.  
  1308.       /*
  1309.        * Where are we within the range.  If we're going to print at
  1310.        * all, this determines the probability of printing the darker
  1311.        * vs. the lighter ink.  If the inks are identical (same value
  1312.        * and darkness), it doesn't matter.
  1313.        *
  1314.        * We scale the input linearly against the top and bottom of the
  1315.        * range.
  1316.        */
  1317.       if (dd->range_span == 0 ||
  1318.       (dd->value_span == 0 && dd->isdark_l == dd->isdark_h))
  1319.     rangepoint = 32768;
  1320.       else
  1321.     rangepoint =
  1322.       ((unsigned) (density - dd->range_l)) * 65536 / dd->range_span;
  1323.  
  1324.       /*
  1325.        * Compute the virtual dot size that we're going to print.
  1326.        * This is somewhere between the two candidate dot sizes.
  1327.        * This is scaled between the high and low value.
  1328.        */
  1329.  
  1330.       if (dd->value_span == 0)
  1331.     virtual_value = dd->value_h;
  1332.       else if (dd->range_span == 0)
  1333.     virtual_value = (dd->value_h + dd->value_l) / 2;
  1334.       else if (dd->value_h == 65536 && rangepoint == 65536)
  1335.     virtual_value = 65536;
  1336.       else
  1337.     virtual_value = dd->value_l + (dd->value_span * rangepoint / 65536);
  1338.  
  1339.       /*
  1340.        * Reduce the randomness as the base value increases, to get
  1341.        * smoother output in the midtones.  Idea suggested by
  1342.        * Thomas Tonino.
  1343.        */
  1344.       if (!(dither_type & D_ORDERED_BASE))
  1345.     {
  1346.       if (randomizer > 0)
  1347.         {
  1348.           if (base > d->d_cutoff)
  1349.         randomizer = 0;
  1350.           else if (base > d->d_cutoff / 2)
  1351.         randomizer = randomizer * 2 * (d->d_cutoff - base) / d->d_cutoff;
  1352.         }
  1353.     }
  1354.       else
  1355.     randomizer = 65536;    /* With ordered dither, we need this */
  1356.  
  1357.       /*
  1358.        * Compute the comparison value to decide whether to print at
  1359.        * all.  If there is no randomness, simply divide the virtual
  1360.        * dotsize by 2 to get standard "pure" Floyd-Steinberg (or "pure"
  1361.        * matrix dithering, which degenerates to a threshold).
  1362.        */
  1363.       if (randomizer == 0)
  1364.     vmatrix = virtual_value / 2;
  1365.       else
  1366.     {
  1367.       /*
  1368.        * First, compute a value between 0 and 65536 that will be
  1369.        * scaled to produce an offset from the desired threshold.
  1370.        */
  1371.       switch (dither_type)
  1372.         {
  1373.         case D_FLOYD:
  1374.           /*
  1375.            * Floyd-Steinberg: use a mildly Gaussian random number.
  1376.            * This might be a bit too Gaussian.
  1377.            */
  1378.           vmatrix = ((rand() & 0xffff000) +
  1379.              (rand() & 0xffff000)) >> 13;
  1380.           break;
  1381.         case D_FLOYD_HYBRID:
  1382.           /*
  1383.            * Hybrid Floyd-Steinberg: use a matrix to generate the offset.
  1384.            */
  1385.         case D_ORDERED:
  1386.         default:
  1387.           vmatrix = ditherpoint(d, dither_matrix, x);
  1388.         }
  1389.  
  1390.       if (vmatrix == 65536 && virtual_value == 65536)
  1391.         /*
  1392.          * These numbers will break 32-bit unsigned arithmetic!
  1393.          * Maybe this is so rare that we'd be better off using
  1394.          * long long arithmetic, but that's likely to be much more
  1395.          * expensive on 32-bit architectures.
  1396.          */
  1397.         vmatrix = 65536;
  1398.       else
  1399.         {
  1400.           /*
  1401.            * Now, scale the virtual dot size appropriately.  Note that
  1402.            * we'll get something evenly distributed between 0 and
  1403.            * the virtual dot size, centered on the dot size / 2,
  1404.            * which is the normal threshold value.
  1405.            */
  1406.           vmatrix = vmatrix * virtual_value / 65536;
  1407.           if (randomizer != 65536)
  1408.         {
  1409.           /*
  1410.            * We want vmatrix to be scaled between 0 and
  1411.            * virtual_value when randomizer is 65536 (fully random).
  1412.            * When it's less, we want it to scale through part of
  1413.            * that range. In all cases, it should center around
  1414.            * virtual_value / 2.
  1415.            *
  1416.            * vbase is the bottom of the scaling range.
  1417.            */
  1418.           unsigned vbase = virtual_value * (65536u - randomizer) /
  1419.             131072u;
  1420.           vmatrix = vmatrix * randomizer / 65536;
  1421.           vmatrix += vbase;
  1422.         }
  1423.         }
  1424.     } /* randomizer != 0 */
  1425.  
  1426.       /*
  1427.        * After all that, printing is almost an afterthought.
  1428.        * Pick the actual dot size (using a matrix here) and print it.
  1429.        */
  1430.       if (dither_value >= vmatrix)
  1431.     {
  1432.       if (dd->isdark_h == dd->isdark_l && dd->bits_h == dd->bits_l)
  1433.         {
  1434.           isdark = dd->isdark_h;
  1435.           bits = dd->bits_h;
  1436.           v = dd->value_h;
  1437.           dot_size = dd->dot_size_h;
  1438.         }
  1439.       else if (rangepoint >= ditherpoint(d, pick_matrix, x))
  1440.         {
  1441.           isdark = dd->isdark_h;
  1442.           bits = dd->bits_h;
  1443.           v = dd->value_h;
  1444.           dot_size = dd->dot_size_h;
  1445.         }
  1446.       else
  1447.         {
  1448.           isdark = dd->isdark_l;
  1449.           bits = dd->bits_l;
  1450.           v = dd->value_l;
  1451.           dot_size = dd->dot_size_l;
  1452.         }
  1453.       tptr = isdark ? c : lc;
  1454.  
  1455.       /*
  1456.        * Lay down all of the bits in the pixel.
  1457.        */
  1458.       if (dontprint < v && (!ink_budget || *ink_budget >= dot_size))
  1459.         {
  1460.           for (j = 1; j <= bits; j += j, tptr += length)
  1461.         {
  1462.           if (j & bits)
  1463.             tptr[0] |= bit;
  1464.         }
  1465.           if (ink_budget)
  1466.         *ink_budget -= dot_size;
  1467.         }
  1468.       if (dither_type & D_ORDERED_BASE)
  1469.         adjusted = -(int) (2 * v / 4);
  1470.       else
  1471.         adjusted -= v;
  1472.     }
  1473.       return adjusted;
  1474.     }
  1475.   return adjusted;
  1476. }
  1477.  
  1478. static inline void
  1479. print_color_fast(dither_t *d, dither_color_t *rv, int base,
  1480.          int adjusted, int x, int y, unsigned char *c,
  1481.          unsigned char *lc, unsigned char bit, int length,
  1482.          dither_matrix_t *dither_matrix, int very_fast)
  1483. {
  1484.   int i;
  1485.   int levels = rv->nlevels - 1;
  1486.   int j;
  1487.   unsigned char *tptr;
  1488.   unsigned bits;
  1489.  
  1490.   if (adjusted <= 0 || base <= 0)
  1491.     return;
  1492.   if (very_fast)
  1493.     {
  1494.       if (adjusted >= ditherpoint_fast(d, dither_matrix, x))
  1495.     c[0] |= bit;
  1496.       return;
  1497.     }
  1498.   /*
  1499.    * Look for the appropriate range into which the input value falls.
  1500.    * Notice that we use the input, not the error, to decide what dot type
  1501.    * to print (if any).  We actually use the "density" input to permit
  1502.    * the caller to use something other that simply the input value, if it's
  1503.    * desired to use some function of overall density, rather than just
  1504.    * this color's input, for this purpose.
  1505.    */
  1506.   for (i = levels; i >= 0; i--)
  1507.     {
  1508.       dither_segment_t *dd = &(rv->ranges[i]);
  1509.       unsigned vmatrix;
  1510.       if (base <= dd->range_l)
  1511.     continue;
  1512.  
  1513.       vmatrix = (dd->value_h * ditherpoint_fast(d, dither_matrix, x)) >> 16;
  1514.  
  1515.       /*
  1516.        * After all that, printing is almost an afterthought.
  1517.        * Pick the actual dot size (using a matrix here) and print it.
  1518.        */
  1519.       if (adjusted >= vmatrix)
  1520.     {
  1521.       bits = dd->bits_h;
  1522.       tptr = dd->isdark_h ? c : lc;
  1523.  
  1524.       /*
  1525.        * Lay down all of the bits in the pixel.
  1526.        */
  1527.       if (bits == 1)
  1528.         {
  1529.           tptr[0] |= bit;
  1530.         }
  1531.       else
  1532.         {
  1533.           for (j = 1; j <= bits; j += j, tptr += length)
  1534.         {
  1535.           if (j & bits)
  1536.             tptr[0] |= bit;
  1537.         }
  1538.         }
  1539.     }
  1540.       return;
  1541.     }
  1542.   return;
  1543. }
  1544.  
  1545. /*
  1546.  * Dithering functions!
  1547.  *
  1548.  * Documentation moved to README.dither
  1549.  */
  1550.  
  1551. /*
  1552.  * 'dither_monochrome()' - Dither grayscale pixels to black using a hard
  1553.  * threshold.  This is for use with predithered output, or for text
  1554.  * or other pure black and white only.
  1555.  */
  1556.  
  1557. void
  1558. dither_monochrome(const unsigned short  *gray,    /* I - Grayscale pixels */
  1559.          int                   row,    /* I - Current Y coordinate */
  1560.          void             *vd,
  1561.          unsigned char         *black,    /* O - Black bitmap pixels */
  1562.          int            duplicate_line)
  1563. {
  1564.   int        x,        /* Current X coordinate */
  1565.         xerror,        /* X error count */
  1566.         xstep,        /* X step */
  1567.         xmod,        /* X error modulus */
  1568.         length;        /* Length of output bitmap in bytes */
  1569.   unsigned char    bit,        /* Current bit */
  1570.         *kptr;        /* Current black pixel */
  1571.   dither_t *d = (dither_t *) vd;
  1572.   dither_matrix_t *kdither = &(d->k_dithermat);
  1573.   unsigned bits = d->k_dither.signif_bits;
  1574.   int j;
  1575.   unsigned char *tptr;
  1576.   int dst_width = d->dst_width;
  1577.  
  1578.   bit = 128;
  1579.   x = 0;
  1580.  
  1581.   xstep  = d->src_width / d->dst_width;
  1582.   xmod   = d->src_width % d->dst_width;
  1583.   length = (d->dst_width + 7) / 8;
  1584.  
  1585.   memset(black, 0, length * bits);
  1586.   kptr = black;
  1587.   xerror = 0;
  1588.   matrix_set_row(d, kdither, row);
  1589.   for (x = 0; x < dst_width; x++)
  1590.     {
  1591.       if (!gray[0])
  1592.     {
  1593.       if (d->density >= ditherpoint_fast(d, kdither, x))
  1594.         {
  1595.           tptr = kptr;
  1596.           for (j = 0; j < bits; j++, tptr += length)
  1597.         tptr[0] |= bit;
  1598.         }
  1599.     }
  1600.  
  1601.       gray   += xstep;
  1602.       xerror += xmod;
  1603.       if (bit == 1)
  1604.     {
  1605.       kptr ++;
  1606.       bit = 128;
  1607.     }
  1608.       else
  1609.     bit >>= 1;
  1610.       if (xerror >= dst_width)
  1611.     {
  1612.       xerror -= dst_width;
  1613.       gray++;
  1614.     }
  1615.     }
  1616. }
  1617.  
  1618. /*
  1619.  * 'dither_black()' - Dither grayscale pixels to black.
  1620.  * This is for grayscale output.
  1621.  */
  1622.  
  1623. void
  1624. dither_black_fast(const unsigned short   *gray,    /* I - Grayscale pixels */
  1625.           int           row,        /* I - Current Y coordinate */
  1626.           void         *vd,
  1627.           unsigned char *black,        /* O - Black bitmap pixels */
  1628.           int        duplicate_line)
  1629. {
  1630.  
  1631.   int        x,        /* Current X coordinate */
  1632.         xerror,        /* X error count */
  1633.         xstep,        /* X step */
  1634.         xmod,        /* X error modulus */
  1635.         length;        /* Length of output bitmap in bytes */
  1636.   unsigned char    bit,        /* Current bit */
  1637.         *kptr;        /* Current black pixel */
  1638.   int        k;
  1639.   dither_t *d = (dither_t *) vd;
  1640.   dither_color_t *kd = &(d->k_dither);
  1641.   dither_matrix_t *kdither = &(d->k_dithermat);
  1642.   int dst_width = d->dst_width;
  1643.   int dither_very_fast = 0;
  1644.   if (kd->nlevels == 1 && kd->ranges[0].bits_h == 1 && kd->ranges[0].isdark_h)
  1645.     dither_very_fast = 1;
  1646.  
  1647.   bit = 128;
  1648.  
  1649.   xstep  = d->src_width / d->dst_width;
  1650.   xmod   = d->src_width % d->dst_width;
  1651.   length = (d->dst_width + 7) / 8;
  1652.  
  1653.   memset(black, 0, length * d->k_dither.signif_bits);
  1654.   kptr = black;
  1655.   xerror = 0;
  1656.   matrix_set_row(d, &(d->k_dithermat), row);
  1657.  
  1658.   for (x = 0; x < dst_width; x++)
  1659.     {
  1660.       k = 65535 - *gray;
  1661.       print_color_fast(d, kd, k, k, x, row, kptr, NULL, bit, length, kdither,
  1662.                dither_very_fast);
  1663.  
  1664.       gray   += xstep;
  1665.       xerror += xmod;
  1666.       if (bit == 1)
  1667.     {
  1668.       kptr ++;
  1669.       bit = 128;
  1670.     }
  1671.       else
  1672.     bit >>= 1;
  1673.       if (xerror >= dst_width)
  1674.     {
  1675.       xerror -= dst_width;
  1676.       gray++;
  1677.     }
  1678.     }
  1679. }
  1680.  
  1681. void
  1682. dither_black(const unsigned short   *gray,    /* I - Grayscale pixels */
  1683.          int               row,        /* I - Current Y coordinate */
  1684.          void         *vd,
  1685.          unsigned char     *black,        /* O - Black bitmap pixels */
  1686.          int        duplicate_line)
  1687. {
  1688.  
  1689.   int        x,        /* Current X coordinate */
  1690.         xerror,        /* X error count */
  1691.         xstep,        /* X step */
  1692.         xmod,        /* X error modulus */
  1693.         length;        /* Length of output bitmap in bytes */
  1694.   unsigned char    bit,        /* Current bit */
  1695.         *kptr;        /* Current black pixel */
  1696.   int        k, ok,        /* Current black error */
  1697.         ditherk,    /* Next error value in buffer */
  1698.         *kerror0,    /* Pointer to current error row */
  1699.         *kerror1;    /* Pointer to next error row */
  1700.   dither_t *d = (dither_t *) vd;
  1701.   int terminate;
  1702.   int direction = row & 1 ? 1 : -1;
  1703.   int odb = d->spread;
  1704.   int odb_mask = (1 << odb) - 1;
  1705.   int ink_budget;
  1706.  
  1707.   if (d->dither_type & D_FAST_BASE)
  1708.     {
  1709.       dither_black_fast(gray, row, vd, black, duplicate_line);
  1710.       return;
  1711.     }
  1712.  
  1713.   bit = (direction == 1) ? 128 : 1 << (7 - ((d->dst_width - 1) & 7));
  1714.   x = (direction == 1) ? 0 : d->dst_width - 1;
  1715.   terminate = (direction == 1) ? d->dst_width : -1;
  1716.  
  1717.   xstep  = d->src_width / d->dst_width;
  1718.   xmod   = d->src_width % d->dst_width;
  1719.   length = (d->dst_width + 7) / 8;
  1720.  
  1721.   kerror0 = get_errline(d, row, ECOLOR_K);
  1722.   kerror1 = get_errline(d, row + 1, ECOLOR_K);
  1723.   memset(kerror1, 0, d->dst_width * sizeof(int));
  1724.  
  1725.   memset(black, 0, length * d->k_dither.signif_bits);
  1726.   kptr = black;
  1727.   xerror = 0;
  1728.   if (direction == -1)
  1729.     {
  1730.       kerror0 += d->dst_width - 1;
  1731.       kerror1 += d->dst_width - 1;
  1732.       kptr = black + length - 1;
  1733.       xstep = -xstep;
  1734.       gray += d->src_width - 1;
  1735.       xerror = ((d->dst_width - 1) * xmod) % d->dst_width;
  1736.       xmod = -xmod;
  1737.     }
  1738.   matrix_set_row(d, &(d->k_dithermat), row);
  1739.   matrix_set_row(d, &(d->k_pick), row);
  1740.  
  1741.   for (ditherk = kerror0[0];
  1742.        x != terminate;
  1743.        x += direction,
  1744.      kerror0 += direction,
  1745.      kerror1 += direction)
  1746.     {
  1747.       ink_budget = d->ink_limit;
  1748.  
  1749.       k = 65535 - *gray;
  1750.       ok = k;
  1751.       if (d->dither_type & D_ORDERED_BASE)
  1752.     print_color(d, &(d->k_dither), k, k, k, x, row, kptr, NULL, bit,
  1753.             length, d->k_randomizer, 0, &ink_budget,
  1754.             &(d->k_pick), &(d->k_dithermat), d->dither_type);
  1755.       else
  1756.     {
  1757.       k = UPDATE_COLOR(k, ditherk);
  1758.       k = print_color(d, &(d->k_dither), ok, ok, k, x, row, kptr, NULL,
  1759.               bit, length, d->k_randomizer, 0, &ink_budget,
  1760.               &(d->k_pick), &(d->k_dithermat), d->dither_type);
  1761.       if (!(d->dither_type & D_ORDERED_BASE))
  1762.         ditherk = update_dither(k, ok, d->src_width, odb, odb_mask,
  1763.                     direction, kerror0, kerror1, d);
  1764.     }
  1765.  
  1766.       gray   += xstep;
  1767.       xerror += xmod;
  1768.       if (direction == 1)
  1769.     {
  1770.       if (bit == 1)
  1771.         {
  1772.           kptr ++;
  1773.           bit = 128;
  1774.         }
  1775.       else
  1776.         bit >>= 1;
  1777.       if (xerror >= d->dst_width)
  1778.         {
  1779.           xerror -= d->dst_width;
  1780.           gray++;
  1781.         }
  1782.     }
  1783.       else
  1784.     {
  1785.       if (bit == 128)
  1786.         {
  1787.           kptr --;
  1788.           bit = 1;
  1789.         }
  1790.       else
  1791.         bit <<= 1;
  1792.       if (xerror < 0)
  1793.         {
  1794.           xerror += d->dst_width;
  1795.           gray--;
  1796.         }
  1797.     }
  1798.     }
  1799. }
  1800.  
  1801. #define USMIN(a, b) ((a) < (b) ? (a) : (b))
  1802.  
  1803. static void
  1804. generate_cmy(dither_t *d,
  1805.          const unsigned short *rgb,
  1806.          int *nonzero,
  1807.          int row)
  1808. {
  1809.   register unsigned short cc, mm, yy;
  1810.   register unsigned short *c = get_valueline(d, ECOLOR_C);
  1811.   register unsigned short *m = get_valueline(d, ECOLOR_M);
  1812.   register unsigned short *y = get_valueline(d, ECOLOR_Y);
  1813.   register int lnonzero = 0;
  1814.   register int x, xerror, xstep, xmod;
  1815.  
  1816.   if (d->src_width == d->dst_width)
  1817.     {
  1818.       for (x = d->dst_width; x > 0; x--)
  1819.     {
  1820.       cc = *c++ = 65535 - *rgb++;
  1821.       mm = *m++ = 65535 - *rgb++;
  1822.       yy = *y++ = 65535 - *rgb++;
  1823.  
  1824.       lnonzero |= cc || mm || yy;
  1825.     }
  1826.     }
  1827.   else
  1828.     {
  1829.       xstep  = 3 * (d->src_width / d->dst_width);
  1830.       xmod   = d->src_width % d->dst_width;
  1831.       xerror = 0;
  1832.       for (x = d->dst_width; x > 0; x--)
  1833.     {
  1834.       cc = *c++ = 65535 - rgb[0];
  1835.       mm = *m++ = 65535 - rgb[1];
  1836.       yy = *y++ = 65535 - rgb[2];
  1837.  
  1838.       lnonzero |= cc || mm || yy;
  1839.  
  1840.       rgb += xstep;
  1841.       xerror += xmod;
  1842.       if (xerror >= d->dst_width)
  1843.         {
  1844.           xerror -= d->dst_width;
  1845.           rgb += 3;
  1846.         }
  1847.     }
  1848.     }
  1849.  
  1850.   *nonzero = lnonzero;
  1851. }
  1852.  
  1853. static inline void
  1854. update_cmy(const dither_t *d, int c, int m, int y, int k,
  1855.         int *nc, int *nm, int *ny)
  1856. {
  1857.   /*
  1858.    * We're not printing black, but let's adjust the CMY levels to
  1859.    * produce better reds, greens, and blues...
  1860.    *
  1861.    * This code needs to be tuned
  1862.    */
  1863.  
  1864.   unsigned ck = c - k;
  1865.   unsigned mk = m - k;
  1866.   unsigned yk = y - k;
  1867.  
  1868.   *nc  = ((unsigned) (65535 - c / 4)) * ck / 65535 + k;
  1869.   *nm  = ((unsigned) (65535 - m / 4)) * mk / 65535 + k;
  1870.   *ny  = ((unsigned) (65535 - y / 4)) * yk / 65535 + k;
  1871. }
  1872.  
  1873. static inline void
  1874. update_cmyk(const dither_t *d, int c, int m, int y, int k,
  1875.         int *nc, int *nm, int *ny, int *nk, int *jk)
  1876. {
  1877.   int ak;
  1878.   int kdarkness;
  1879.   unsigned ks, kl;
  1880.   int ub, lb;
  1881.   int ok;
  1882.   int bk;
  1883.  
  1884.   ub = d->k_upper;    /* Upper bound */
  1885.   lb = d->k_lower;    /* Lower bound */
  1886.  
  1887.   /*
  1888.    * Calculate total ink amount.
  1889.    * If there is a lot of ink, black gets added sooner. Saves ink
  1890.    * and with a lot of ink the black doesn't show as speckles.
  1891.    *
  1892.    * k already contains the grey contained in CMY.
  1893.    * First we find out if the color is darker than the K amount
  1894.    * suggests, and we look up where is value is between
  1895.    * lowerbound and density:
  1896.    */
  1897.  
  1898.   kdarkness = c + c + m + m + y - d->density2;
  1899.   if (kdarkness > (k + k + k))
  1900.     ok = kdarkness / 3;
  1901.   else
  1902.     ok = k;
  1903.   if ( ok > lb )
  1904.     kl = (unsigned) ( ok - lb ) * (unsigned) d->density /
  1905.       d->dlb_range;
  1906.   else
  1907.     kl = 0;
  1908.   if (kl > d->density)
  1909.     kl = d->density;
  1910.  
  1911.   /*
  1912.    * We have a second value, ks, that will be the scaler.
  1913.    * ks is initially showing where the original black
  1914.    * amount is between upper and lower bounds:
  1915.    */
  1916.  
  1917.   if ( k > ub )
  1918.     ks = d->density;
  1919.   else if ( k < lb )
  1920.     ks = 0;
  1921.   else
  1922.     ks = (unsigned) (k - lb) * (unsigned) d->density /
  1923.       d->bound_range;
  1924.   if (ks > d->density)
  1925.     ks = d->density;
  1926.  
  1927.   /*
  1928.    * ks is then processed by a second order function that produces
  1929.    * an S curve: 2ks - ks^2. This is then multiplied by the
  1930.    * darkness value in kl. If we think this is too complex the
  1931.    * following line can be tried instead:
  1932.    * ak = ks;
  1933.    */
  1934.   ak = ks;
  1935.   k = (unsigned) kl * (unsigned) ak / (unsigned) d->density;
  1936.   if (k > d->density)
  1937.     k = d->density;
  1938.   ok = k;
  1939.   bk = k;
  1940.  
  1941.   if (k && ak)
  1942.     {
  1943.       /*
  1944.        * Because black is always fairly neutral, we do not have to
  1945.        * calculate the amount to take out of CMY. The result will
  1946.        * be a bit dark but that is OK. If things are okay CMY
  1947.        * cannot go negative here - unless extra K is added in the
  1948.        * previous block. We multiply by ak to prevent taking out
  1949.        * too much. This prevents dark areas from becoming very
  1950.        * dull.
  1951.        */
  1952.  
  1953.       ok = (unsigned) k * (unsigned) ak / (unsigned) d->density;
  1954.       c -= ok;
  1955.       m -= ok;
  1956.       y -= ok;
  1957.  
  1958.       if (c < 0)
  1959.     c = 0;
  1960.       if (m < 0)
  1961.     m = 0;
  1962.       if (y < 0)
  1963.     y = 0;
  1964.     }
  1965.   *nc = c;
  1966.   *nm = m;
  1967.   *ny = y;
  1968.   *nk = bk;
  1969.   *jk = k;
  1970. }
  1971.  
  1972. void
  1973. dither_cmyk_fast(const unsigned short  *rgb,    /* I - RGB pixels */
  1974.          int           row,    /* I - Current Y coordinate */
  1975.          void         *vd,
  1976.          unsigned char *cyan,    /* O - Cyan bitmap pixels */
  1977.          unsigned char *lcyan,    /* O - Light cyan bitmap pixels */
  1978.          unsigned char *magenta, /* O - Magenta bitmap pixels */
  1979.          unsigned char *lmagenta, /* O - Light magenta bitmap pixels */
  1980.          unsigned char *yellow,    /* O - Yellow bitmap pixels */
  1981.          unsigned char *lyellow, /* O - Light yellow bitmap pixels */
  1982.          unsigned char *black,    /* O - Black bitmap pixels */
  1983.          int           duplicate_line)
  1984. {
  1985.   int        x,        /* Current X coordinate */
  1986.         length;        /* Length of output bitmap in bytes */
  1987.   int        c, m, y, k,    /* CMYK values */
  1988.             oc, om, oy, ok;
  1989.   unsigned char    bit,        /* Current bit */
  1990.             *cptr,        /* Current cyan pixel */
  1991.             *mptr,        /* Current magenta pixel */
  1992.             *yptr,        /* Current yellow pixel */
  1993.             *lmptr,        /* Current light magenta pixel */
  1994.             *lcptr,        /* Current light cyan pixel */
  1995.             *lyptr,        /* Current light yellow pixel */
  1996.             *kptr;        /* Current black pixel */
  1997.   dither_t    *d = (dither_t *) vd;
  1998.   const unsigned short *cline = get_valueline(d, ECOLOR_C);
  1999.   const unsigned short *mline = get_valueline(d, ECOLOR_M);
  2000.   const unsigned short *yline = get_valueline(d, ECOLOR_Y);
  2001.   int nonzero;
  2002.  
  2003.   dither_color_t *cd = &(d->c_dither);
  2004.   dither_matrix_t *cdither = &(d->c_dithermat);
  2005.   dither_color_t *md = &(d->m_dither);
  2006.   dither_matrix_t *mdither = &(d->m_dithermat);
  2007.   dither_color_t *yd = &(d->y_dither);
  2008.   dither_matrix_t *ydither = &(d->y_dithermat);
  2009.   dither_color_t *kd = &(d->k_dither);
  2010.   dither_matrix_t *kdither = &(d->k_dithermat);
  2011.   int dst_width = d->dst_width;
  2012.   int cdither_very_fast = 0;
  2013.   int mdither_very_fast = 0;
  2014.   int ydither_very_fast = 0;
  2015.   int kdither_very_fast = 0;
  2016.  
  2017.   if (cd->nlevels == 1 && cd->ranges[0].bits_h == 1 && cd->ranges[0].isdark_h)
  2018.     cdither_very_fast = 1;
  2019.   if (md->nlevels == 1 && md->ranges[0].bits_h == 1 && md->ranges[0].isdark_h)
  2020.     mdither_very_fast = 1;
  2021.   if (yd->nlevels == 1 && yd->ranges[0].bits_h == 1 && yd->ranges[0].isdark_h)
  2022.     ydither_very_fast = 1;
  2023.   if (kd->nlevels == 1 && kd->ranges[0].bits_h == 1 && kd->ranges[0].isdark_h)
  2024.     kdither_very_fast = 1;
  2025.  
  2026.   length = (d->dst_width + 7) / 8;
  2027.  
  2028.   memset(cyan, 0, length * d->c_dither.signif_bits);
  2029.   if (lcyan)
  2030.     memset(lcyan, 0, length * d->c_dither.signif_bits);
  2031.   memset(magenta, 0, length * d->m_dither.signif_bits);
  2032.   if (lmagenta)
  2033.     memset(lmagenta, 0, length * d->m_dither.signif_bits);
  2034.   memset(yellow, 0, length * d->y_dither.signif_bits);
  2035.   if (lyellow)
  2036.     memset(lyellow, 0, length * d->y_dither.signif_bits);
  2037.   if (black)
  2038.     memset(black, 0, length * d->k_dither.signif_bits);
  2039.   /*
  2040.    * First, generate the CMYK separation.  If there's nothing in
  2041.    * this row, and we're using an ordered dither, there's no reason
  2042.    * to do anything at all.
  2043.    */
  2044.   if (!duplicate_line)
  2045.     {
  2046.       generate_cmy(d, rgb, &nonzero, row);
  2047.       if (nonzero)
  2048.     d->last_line_was_empty = 0;
  2049.       else
  2050.     d->last_line_was_empty++;
  2051.     }
  2052.   else if (d->last_line_was_empty)
  2053.     d->last_line_was_empty++;
  2054.   /*
  2055.    * First, generate the CMYK separation.  If there's nothing in
  2056.    * this row, and we're using an ordered dither, there's no reason
  2057.    * to do anything at all.
  2058.    */
  2059.   if (d->last_line_was_empty)
  2060.     return;
  2061.  
  2062.   /*
  2063.    * Boilerplate
  2064.    */
  2065.  
  2066.   bit = 128;
  2067.   x = 0;
  2068.   cptr = cyan;
  2069.   mptr = magenta;
  2070.   yptr = yellow;
  2071.   lcptr = lcyan;
  2072.   lmptr = lmagenta;
  2073.   lyptr = lyellow;
  2074.   kptr = black;
  2075.  
  2076.   k = 0;            /* Shut up the compiler */
  2077.   ok = 0;
  2078.   matrix_set_row(d, &(d->k_dithermat), row);
  2079.   matrix_set_row(d, &(d->c_dithermat), row);
  2080.   matrix_set_row(d, &(d->m_dithermat), row);
  2081.   matrix_set_row(d, &(d->y_dithermat), row);
  2082.  
  2083.   /*
  2084.    * Main loop starts here!
  2085.    */
  2086.   QUANT(14);
  2087.   for (; x != dst_width; x++)
  2088.     {
  2089.       /*
  2090.        * First get the standard CMYK separation color values.
  2091.        */
  2092.  
  2093.       c = cline[x];
  2094.       m = mline[x];
  2095.       y = yline[x];
  2096.       oc = c;
  2097.       om = m;
  2098.       oy = y;
  2099.  
  2100.       /*
  2101.        * If we're doing ordered dither, and there's no ink, we aren't
  2102.        * going to print anything.
  2103.        */
  2104.       if (c == 0 && m == 0 && y == 0)
  2105.     {
  2106.       goto advance;
  2107.     }
  2108.  
  2109.       if (black)
  2110.     {
  2111.       k = USMIN(c, USMIN(m, y));
  2112.       if (k < 32768)
  2113.         k = 0;
  2114.       else
  2115.         k = 65535 - ((65535 - k) * 2);
  2116.       c -= k;
  2117.       m -= k;
  2118.       y -= k;
  2119.       ok = k;
  2120.     }
  2121.       QUANT(15);
  2122.  
  2123.       if (black)
  2124.     print_color_fast(d, kd, ok,
  2125.              k, x, row, kptr, NULL, bit, length,
  2126.              kdither, kdither_very_fast);
  2127.       print_color_fast(d, kd, oc,
  2128.                c, x, row, cptr, lcptr, bit, length,
  2129.                cdither, cdither_very_fast);
  2130.       print_color_fast(d, kd, om,
  2131.                m, x, row, mptr, lmptr, bit, length,
  2132.                mdither, mdither_very_fast);
  2133.       print_color_fast(d, kd, oy,
  2134.                y, x, row, yptr, lyptr, bit, length,
  2135.                ydither, ydither_very_fast);
  2136.       QUANT(16);
  2137.  
  2138.       /*****************************************************************
  2139.        * Advance the loop
  2140.        *****************************************************************/
  2141.  
  2142.     advance:
  2143.       if (bit == 1)
  2144.     {
  2145.       cptr ++;
  2146.       if (lcptr)
  2147.         lcptr ++;
  2148.       mptr ++;
  2149.       if (lmptr)
  2150.         lmptr ++;
  2151.       yptr ++;
  2152.       if (lyptr)
  2153.         lyptr ++;
  2154.       if (kptr)
  2155.         kptr ++;
  2156.       bit       = 128;
  2157.     }
  2158.       else
  2159.     bit >>= 1;
  2160.       QUANT(17);
  2161.     }
  2162.   /*
  2163.    * Main loop ends here!
  2164.    */
  2165. }
  2166.  
  2167. void
  2168. dither_cmyk(const unsigned short  *rgb,    /* I - RGB pixels */
  2169.         int           row,    /* I - Current Y coordinate */
  2170.         void         *vd,
  2171.         unsigned char *cyan,    /* O - Cyan bitmap pixels */
  2172.         unsigned char *lcyan,    /* O - Light cyan bitmap pixels */
  2173.         unsigned char *magenta,    /* O - Magenta bitmap pixels */
  2174.         unsigned char *lmagenta,    /* O - Light magenta bitmap pixels */
  2175.         unsigned char *yellow,    /* O - Yellow bitmap pixels */
  2176.         unsigned char *lyellow,    /* O - Light yellow bitmap pixels */
  2177.         unsigned char *black,    /* O - Black bitmap pixels */
  2178.         int          duplicate_line)
  2179. {
  2180.   int        x,        /* Current X coordinate */
  2181.         length;        /* Length of output bitmap in bytes */
  2182.   int        c, m, y, k,    /* CMYK values */
  2183.         oc, om, oy;
  2184.   unsigned char    bit,        /* Current bit */
  2185.         *cptr,        /* Current cyan pixel */
  2186.         *mptr,        /* Current magenta pixel */
  2187.         *yptr,        /* Current yellow pixel */
  2188.         *lmptr,        /* Current light magenta pixel */
  2189.         *lcptr,        /* Current light cyan pixel */
  2190.         *lyptr,        /* Current light yellow pixel */
  2191.         *kptr;        /* Current black pixel */
  2192.   int        ditherc = 0,    /* Next error value in buffer */
  2193.         *cerror0 = 0,    /* Pointer to current error row */
  2194.         *cerror1 = 0;    /* Pointer to next error row */
  2195.   int        dithery = 0,    /* Next error value in buffer */
  2196.         *yerror0 = 0,    /* Pointer to current error row */
  2197.         *yerror1 = 0;    /* Pointer to next error row */
  2198.   int        ditherm = 0,    /* Next error value in buffer */
  2199.         *merror0 = 0,    /* Pointer to current error row */
  2200.         *merror1 = 0;    /* Pointer to next error row */
  2201.   int        ditherk = 0,    /* Next error value in buffer */
  2202.         *kerror0 = 0,    /* Pointer to current error row */
  2203.         *kerror1 = 0;    /* Pointer to next error row */
  2204.   int        bk = 0;
  2205.   dither_t    *d = (dither_t *) vd;
  2206.   const unsigned short *cline = get_valueline(d, ECOLOR_C);
  2207.   const unsigned short *mline = get_valueline(d, ECOLOR_M);
  2208.   const unsigned short *yline = get_valueline(d, ECOLOR_Y);
  2209.   int nonzero;
  2210.  
  2211.   int        terminate;
  2212.   int        direction = row & 1 ? 1 : -1;
  2213.   int        odb = d->spread;
  2214.   int        odb_mask = (1 << odb) - 1;
  2215.   int        first_color = row % 3;
  2216.   int        printed_black;
  2217.   int        ink_budget;
  2218.  
  2219.   if (d->dither_type & D_FAST_BASE)
  2220.     {
  2221.       dither_cmyk_fast(rgb, row, vd, cyan, lcyan, magenta, lmagenta,
  2222.                yellow, lyellow, black, duplicate_line);
  2223.       return;
  2224.     }
  2225.  
  2226.   length = (d->dst_width + 7) / 8;
  2227.  
  2228.   memset(cyan, 0, length * d->c_dither.signif_bits);
  2229.   if (lcyan)
  2230.     memset(lcyan, 0, length * d->c_dither.signif_bits);
  2231.   memset(magenta, 0, length * d->m_dither.signif_bits);
  2232.   if (lmagenta)
  2233.     memset(lmagenta, 0, length * d->m_dither.signif_bits);
  2234.   memset(yellow, 0, length * d->y_dither.signif_bits);
  2235.   if (lyellow)
  2236.     memset(lyellow, 0, length * d->y_dither.signif_bits);
  2237.   if (black)
  2238.     memset(black, 0, length * d->k_dither.signif_bits);
  2239.   /*
  2240.    * First, generate the CMYK separation.  If there's nothing in
  2241.    * this row, and we're using an ordered dither, there's no reason
  2242.    * to do anything at all.
  2243.    */
  2244.   if (!duplicate_line)
  2245.     {
  2246.       generate_cmy(d, rgb, &nonzero, row);
  2247.       if (nonzero)
  2248.     d->last_line_was_empty = 0;
  2249.       else
  2250.     d->last_line_was_empty++;
  2251.     }
  2252.   else if (d->last_line_was_empty)
  2253.     d->last_line_was_empty++;
  2254.   if ((d->last_line_was_empty && (d->dither_type & D_ORDERED_BASE)) ||
  2255.       d->last_line_was_empty >= 5)
  2256.     return;
  2257.  
  2258.   /*
  2259.    * Boilerplate
  2260.    */
  2261.  
  2262.   if (d->dither_type & D_ORDERED_BASE)
  2263.     direction = 1;
  2264.  
  2265.   bit = (direction == 1) ? 128 : 1 << (7 - ((d->dst_width - 1) & 7));
  2266.   x = (direction == 1) ? 0 : d->dst_width - 1;
  2267.   terminate = (direction == 1) ? d->dst_width : -1;
  2268.  
  2269.   if (! (d->dither_type & D_ORDERED_BASE))
  2270.     {
  2271.       cerror0 = get_errline(d, row, ECOLOR_C);
  2272.       cerror1 = get_errline(d, row + 1, ECOLOR_C);
  2273.  
  2274.       merror0 = get_errline(d, row, ECOLOR_M);
  2275.       merror1 = get_errline(d, row + 1, ECOLOR_M);
  2276.  
  2277.       yerror0 = get_errline(d, row, ECOLOR_Y);
  2278.       yerror1 = get_errline(d, row + 1, ECOLOR_Y);
  2279.  
  2280.       kerror0 = get_errline(d, row, ECOLOR_K);
  2281.       kerror1 = get_errline(d, row + 1, ECOLOR_K);
  2282.       memset(kerror1, 0, d->dst_width * sizeof(int));
  2283.       memset(cerror1, 0, d->dst_width * sizeof(int));
  2284.       memset(merror1, 0, d->dst_width * sizeof(int));
  2285.       memset(yerror1, 0, d->dst_width * sizeof(int));
  2286.       if (d->last_line_was_empty >= 4)
  2287.     {
  2288.       if (d->last_line_was_empty == 4)
  2289.         {
  2290.           memset(kerror0, 0, d->dst_width * sizeof(int));
  2291.           memset(cerror0, 0, d->dst_width * sizeof(int));
  2292.           memset(merror0, 0, d->dst_width * sizeof(int));
  2293.           memset(yerror0, 0, d->dst_width * sizeof(int));
  2294.         }
  2295.       return;
  2296.     }
  2297.     }
  2298.   cptr = cyan;
  2299.   mptr = magenta;
  2300.   yptr = yellow;
  2301.   lcptr = lcyan;
  2302.   lmptr = lmagenta;
  2303.   lyptr = lyellow;
  2304.   kptr = black;
  2305.   if (direction == -1)
  2306.     {
  2307.       if (! (d->dither_type & D_ORDERED_BASE))
  2308.     {
  2309.       cerror0 += d->dst_width - 1;
  2310.       cerror1 += d->dst_width - 1;
  2311.       merror0 += d->dst_width - 1;
  2312.       merror1 += d->dst_width - 1;
  2313.       yerror0 += d->dst_width - 1;
  2314.       yerror1 += d->dst_width - 1;
  2315.       kerror0 += d->dst_width - 1;
  2316.       kerror1 += d->dst_width - 1;
  2317.     }
  2318.       cptr = cyan + length - 1;
  2319.       if (lcptr)
  2320.     lcptr = lcyan + length - 1;
  2321.       mptr = magenta + length - 1;
  2322.       if (lmptr)
  2323.     lmptr = lmagenta + length - 1;
  2324.       yptr = yellow + length - 1;
  2325.       if (lyptr)
  2326.     lyptr = lyellow + length - 1;
  2327.       if (kptr)
  2328.     kptr = black + length - 1;
  2329.       first_color = (first_color + d->dst_width - 1) % 3;
  2330.     }
  2331.  
  2332.   if (! (d->dither_type & D_ORDERED_BASE))
  2333.     {
  2334.       ditherc = cerror0[0];
  2335.       ditherm = merror0[0];
  2336.       dithery = yerror0[0];
  2337.       ditherk = kerror0[0];
  2338.     }
  2339.   matrix_set_row(d, &(d->k_dithermat), row);
  2340.   matrix_set_row(d, &(d->c_dithermat), row);
  2341.   matrix_set_row(d, &(d->m_dithermat), row);
  2342.   matrix_set_row(d, &(d->y_dithermat), row);
  2343.   matrix_set_row(d, &(d->k_pick), row);
  2344.   matrix_set_row(d, &(d->c_pick), row);
  2345.   matrix_set_row(d, &(d->m_pick), row);
  2346.   matrix_set_row(d, &(d->y_pick), row);
  2347.    QUANT(6);
  2348.   /*
  2349.    * Main loop starts here!
  2350.    */
  2351.   for (; x != terminate; x += direction)
  2352.     {
  2353.       /*
  2354.        * First get the standard CMYK separation color values.
  2355.        */
  2356.  
  2357.       c = cline[x];
  2358.       m = mline[x];
  2359.       y = yline[x];
  2360.       oc = c;
  2361.       om = m;
  2362.       oy = y;
  2363.  
  2364.       /*
  2365.        * If we're doing ordered dither, and there's no ink, we aren't
  2366.        * going to print anything.
  2367.        */
  2368.       if (c == 0 && m == 0 && y == 0)
  2369.     {
  2370.       if (d->dither_type & D_ORDERED_BASE)
  2371.         goto advance;
  2372.       else
  2373.         {
  2374.           c = UPDATE_COLOR(c, ditherc);
  2375.           m = UPDATE_COLOR(m, ditherm);
  2376.           y = UPDATE_COLOR(y, dithery);
  2377.           goto out;
  2378.         }
  2379.     }
  2380.  
  2381.       QUANT(7);
  2382.  
  2383.       k = USMIN(c, USMIN(m, y));
  2384.  
  2385.       /*
  2386.        * At this point we've computed the basic CMYK separations.
  2387.        * Now we adjust the levels of each to improve the print quality.
  2388.        */
  2389.  
  2390.       if (k > 0)
  2391.     {
  2392.       if (black != NULL)
  2393.         update_cmyk(d, oc, om, oy, k, &c, &m, &y, &bk, &k);
  2394.       else
  2395.         update_cmy(d, oc, om, oy, k, &c, &m, &y);
  2396.     }
  2397.  
  2398.       QUANT(8);
  2399.       /*
  2400.        * We've done all of the cmyk separations at this point.
  2401.        * Now to do the dithering.
  2402.        *
  2403.        * At this point:
  2404.        *
  2405.        * bk = Amount of black printed with black ink
  2406.        * ak = Adjusted "raw" K value
  2407.        * k = raw K value derived from CMY
  2408.        * oc, om, oy = raw CMY values assuming no K component
  2409.        * c, m, y = CMY values adjusted for the presence of K
  2410.        *
  2411.        * The main reason for this rather elaborate setup, where we have
  2412.        * 8 channels at this point, is to handle variable intensities
  2413.        * (in particular light and dark variants) of inks.  Very dark regions
  2414.        * with slight color tints should be printed with dark inks, not with
  2415.        * the light inks that would be implied by the small amount of remnant
  2416.        * CMY.
  2417.        *
  2418.        * It's quite likely that for simple four-color printers ordinary
  2419.        * CMYK separations would work.  It's possible that they would work
  2420.        * for variable dot sizes, too.
  2421.        */
  2422.  
  2423.       if (!(d->dither_type & D_ORDERED_BASE))
  2424.     {
  2425.       c = UPDATE_COLOR(c, ditherc);
  2426.       m = UPDATE_COLOR(m, ditherm);
  2427.       y = UPDATE_COLOR(y, dithery);
  2428.     }
  2429.  
  2430.       QUANT(9);
  2431.  
  2432.       ink_budget = d->ink_limit;
  2433.  
  2434.       if (black)
  2435.     {
  2436.       int tk = print_color(d, &(d->k_dither), bk, bk, k, x, row, kptr,
  2437.                    NULL, bit, length, 0, 0, &ink_budget,
  2438.                    &(d->k_pick), &(d->k_dithermat), D_ORDERED);
  2439.       printed_black = k - tk;
  2440.       k = tk;
  2441.     }
  2442.       else
  2443.         printed_black = 0;
  2444.  
  2445.       QUANT(10);
  2446.       /*
  2447.        * If the printed density is high, ink reduction loses too much
  2448.        * ink.  However, at low densities it seems to be safe.  Of course,
  2449.        * at low densities it won't do as much.
  2450.        */
  2451.       if (d->density > 45000)
  2452.     printed_black = 0;
  2453.  
  2454.       /*
  2455.        * Uh oh spaghetti-o!
  2456.        *
  2457.        * It has been determined experimentally that inlining print_color
  2458.        * saves a substantial amount of time.  However, expanding this out
  2459.        * as a switch drastically increases the code volume by about 10 KB.
  2460.        * The solution for now (until we do this properly, via an array)
  2461.        * is to use this ugly code.
  2462.        */
  2463.  
  2464.       if (first_color == ECOLOR_M)
  2465.     goto ecm;
  2466.       else if (first_color == ECOLOR_Y)
  2467.     goto ecy;
  2468.     ecc:
  2469.       c = print_color(d, &(d->c_dither), oc, oc,
  2470.               c, x, row, cptr, lcptr, bit, length,
  2471.               d->c_randomizer, printed_black, &ink_budget,
  2472.               &(d->c_pick), &(d->c_dithermat), d->dither_type);
  2473.       if (first_color == ECOLOR_M)
  2474.     goto out;
  2475.     ecm:
  2476.       m = print_color(d, &(d->m_dither), om, om,
  2477.               m, x, row, mptr, lmptr, bit, length,
  2478.               d->m_randomizer, printed_black, &ink_budget,
  2479.               &(d->m_pick), &(d->m_dithermat), d->dither_type);
  2480.       if (first_color == ECOLOR_Y)
  2481.     goto out;
  2482.     ecy:
  2483.       y = print_color(d, &(d->y_dither), oy, oy,
  2484.               y, x, row, yptr, lyptr, bit, length,
  2485.               d->y_randomizer, printed_black, &ink_budget,
  2486.               &(d->y_pick), &(d->y_dithermat), d->dither_type);
  2487.       if (first_color != ECOLOR_C)
  2488.     goto ecc;
  2489.     out:
  2490.  
  2491.       QUANT(11);
  2492.       if (!(d->dither_type & D_ORDERED_BASE))
  2493.     {
  2494.       ditherc = update_dither(c, oc, d->src_width, odb, odb_mask,
  2495.                   direction, cerror0, cerror1, d);
  2496.       ditherm = update_dither(m, om, d->src_width, odb, odb_mask,
  2497.                   direction, merror0, merror1, d);
  2498.       dithery = update_dither(y, oy, d->src_width, odb, odb_mask,
  2499.                   direction, yerror0, yerror1, d);
  2500.     }
  2501.  
  2502.       /*****************************************************************
  2503.        * Advance the loop
  2504.        *****************************************************************/
  2505.  
  2506.       QUANT(12);
  2507.     advance:
  2508.       if (direction == 1)
  2509.     {
  2510.       if (bit == 1)
  2511.         {
  2512.           cptr ++;
  2513.           if (lcptr)
  2514.         lcptr ++;
  2515.           mptr ++;
  2516.           if (lmptr)
  2517.         lmptr ++;
  2518.           yptr ++;
  2519.           if (lyptr)
  2520.         lyptr ++;
  2521.           if (kptr)
  2522.         kptr ++;
  2523.           bit       = 128;
  2524.         }
  2525.       else
  2526.         bit >>= 1;
  2527.       first_color++;
  2528.       if (first_color >= 3)
  2529.         first_color = 0;
  2530.     }
  2531.       else
  2532.     {
  2533.       if (bit == 128)
  2534.         {
  2535.           cptr --;
  2536.           if (lcptr)
  2537.         lcptr --;
  2538.           mptr --;
  2539.           if (lmptr)
  2540.         lmptr --;
  2541.           yptr --;
  2542.           if (lyptr)
  2543.         lyptr --;
  2544.           if (kptr)
  2545.         kptr --;
  2546.           bit       = 1;
  2547.         }
  2548.       else
  2549.         bit <<= 1;
  2550.       first_color--;
  2551.       if (first_color <= 0)
  2552.         first_color = 2;
  2553.     }
  2554.       if (!(d->dither_type & D_ORDERED_BASE))
  2555.     {
  2556.       cerror0 += direction;
  2557.       cerror1 += direction;
  2558.       merror0 += direction;
  2559.       merror1 += direction;
  2560.       yerror0 += direction;
  2561.       yerror1 += direction;
  2562.       kerror0 += direction;
  2563.       kerror1 += direction;
  2564.     }
  2565.       QUANT(13);
  2566.   }
  2567.   /*
  2568.    * Main loop ends here!
  2569.    */
  2570. }
  2571.