Annotation of embedaddon/php/ext/gd/libgd/gd_topal.c, revision 1.1

1.1     ! misho       1: /* TODO: oim and nim in the lower level functions;
        !             2:   correct use of stub (sigh). */
        !             3: 
        !             4: /* 2.0.12: a new adaptation from the same original, this time
        !             5:        by Barend Gehrels. My attempt to incorporate alpha channel
        !             6:        into the result worked poorly and degraded the quality of
        !             7:        palette conversion even when the source contained no
        !             8:        alpha channel data. This version does not attempt to produce
        !             9:        an output file with transparency in some of the palette
        !            10:        indexes, which, in practice, doesn't look so hot anyway. TBB */
        !            11: 
        !            12: /*
        !            13:  * gd_topal, adapted from jquant2.c
        !            14:  *
        !            15:  * Copyright (C) 1991-1996, Thomas G. Lane.
        !            16:  * This file is part of the Independent JPEG Group's software.
        !            17:  * For conditions of distribution and use, see the accompanying README file.
        !            18:  *
        !            19:  * This file contains 2-pass color quantization (color mapping) routines.
        !            20:  * These routines provide selection of a custom color map for an image,
        !            21:  * followed by mapping of the image to that color map, with optional
        !            22:  * Floyd-Steinberg dithering.
        !            23:  * It is also possible to use just the second pass to map to an arbitrary
        !            24:  * externally-given color map.
        !            25:  *
        !            26:  * Note: ordered dithering is not supported, since there isn't any fast
        !            27:  * way to compute intercolor distances; it's unclear that ordered dither's
        !            28:  * fundamental assumptions even hold with an irregularly spaced color map.
        !            29:  */
        !            30: 
        !            31: #ifdef ORIGINAL_LIB_JPEG
        !            32: 
        !            33: #define JPEG_INTERNALS
        !            34: 
        !            35: #include "jinclude.h"
        !            36: #include "jpeglib.h"
        !            37: 
        !            38: #else
        !            39: 
        !            40: /*
        !            41:  * THOMAS BOUTELL & BAREND GEHRELS, february 2003
        !            42:  * adapted the code to work within gd rather than within libjpeg.
        !            43:  * If it is not working, it's not Thomas G. Lane's fault.
        !            44:  */
        !            45: 
        !            46: /* 
        !            47:   SETTING THIS ONE CAUSES STRIPED IMAGE
        !            48:   to be done: solve this
        !            49:   #define ORIGINAL_LIB_JPEG_REVERSE_ODD_ROWS
        !            50:  */
        !            51: 
        !            52: #include <string.h>
        !            53: #include "gd.h"
        !            54: #include "gdhelpers.h"
        !            55: 
        !            56: /* (Re)define some defines known by libjpeg */
        !            57: #define QUANT_2PASS_SUPPORTED
        !            58: 
        !            59: #define RGB_RED                0
        !            60: #define RGB_GREEN      1
        !            61: #define RGB_BLUE       2
        !            62: 
        !            63: #define JSAMPLE unsigned char
        !            64: #define MAXJSAMPLE (gdMaxColors-1)
        !            65: #define BITS_IN_JSAMPLE 8
        !            66: 
        !            67: #define JSAMPROW int*
        !            68: #define JDIMENSION int
        !            69: 
        !            70: #define METHODDEF(type) static type
        !            71: #define LOCAL(type)    static type
        !            72: 
        !            73: 
        !            74: /* We assume that right shift corresponds to signed division by 2 with
        !            75:  * rounding towards minus infinity.  This is correct for typical "arithmetic
        !            76:  * shift" instructions that shift in copies of the sign bit.  But some
        !            77:  * C compilers implement >> with an unsigned shift.  For these machines you
        !            78:  * must define RIGHT_SHIFT_IS_UNSIGNED.
        !            79:  * RIGHT_SHIFT provides a proper signed right shift of an INT32 quantity.
        !            80:  * It is only applied with constant shift counts.  SHIFT_TEMPS must be
        !            81:  * included in the variables of any routine using RIGHT_SHIFT.
        !            82:  */
        !            83: 
        !            84: #ifdef RIGHT_SHIFT_IS_UNSIGNED
        !            85: #define SHIFT_TEMPS    INT32 shift_temp;
        !            86: #define RIGHT_SHIFT(x,shft)  \
        !            87:        ((shift_temp = (x)) < 0 ? \
        !            88:         (shift_temp >> (shft)) | ((~((INT32) 0)) << (32-(shft))) : \
        !            89:         (shift_temp >> (shft)))
        !            90: #else
        !            91: #define SHIFT_TEMPS
        !            92: #define RIGHT_SHIFT(x,shft)    ((x) >> (shft))
        !            93: #endif
        !            94: 
        !            95: 
        !            96: #define range_limit(x) { if(x<0) x=0; if (x>255) x=255; }
        !            97: 
        !            98: 
        !            99: #ifndef INT16
        !           100: #define INT16  short
        !           101: #endif
        !           102: 
        !           103: #ifndef UINT16
        !           104: #define UINT16 unsigned short
        !           105: #endif
        !           106: 
        !           107: #ifndef INT32
        !           108: #define INT32 int
        !           109: #endif
        !           110: 
        !           111: #ifndef FAR
        !           112: #define FAR
        !           113: #endif
        !           114: 
        !           115: 
        !           116: 
        !           117: #ifndef boolean
        !           118: #define boolean int
        !           119: #endif
        !           120: 
        !           121: #ifndef TRUE
        !           122: #define TRUE 1
        !           123: #endif
        !           124: 
        !           125: #ifndef FALSE
        !           126: #define FALSE 0
        !           127: #endif
        !           128: 
        !           129: 
        !           130: #define input_buf (oim->tpixels)
        !           131: #define output_buf (nim->pixels)
        !           132: 
        !           133: #endif
        !           134: 
        !           135: #ifdef QUANT_2PASS_SUPPORTED
        !           136: 
        !           137: 
        !           138: /*
        !           139:  * This module implements the well-known Heckbert paradigm for color
        !           140:  * quantization.  Most of the ideas used here can be traced back to
        !           141:  * Heckbert's seminal paper
        !           142:  *   Heckbert, Paul.  "Color Image Quantization for Frame Buffer Display",
        !           143:  *   Proc. SIGGRAPH '82, Computer Graphics v.16 #3 (July 1982), pp 297-304.
        !           144:  *
        !           145:  * In the first pass over the image, we accumulate a histogram showing the
        !           146:  * usage count of each possible color.  To keep the histogram to a reasonable
        !           147:  * size, we reduce the precision of the input; typical practice is to retain
        !           148:  * 5 or 6 bits per color, so that 8 or 4 different input values are counted
        !           149:  * in the same histogram cell.
        !           150:  *
        !           151:  * Next, the color-selection step begins with a box representing the whole
        !           152:  * color space, and repeatedly splits the "largest" remaining box until we
        !           153:  * have as many boxes as desired colors.  Then the mean color in each
        !           154:  * remaining box becomes one of the possible output colors.
        !           155:  * 
        !           156:  * The second pass over the image maps each input pixel to the closest output
        !           157:  * color (optionally after applying a Floyd-Steinberg dithering correction).
        !           158:  * This mapping is logically trivial, but making it go fast enough requires
        !           159:  * considerable care.
        !           160:  *
        !           161:  * Heckbert-style quantizers vary a good deal in their policies for choosing
        !           162:  * the "largest" box and deciding where to cut it.  The particular policies
        !           163:  * used here have proved out well in experimental comparisons, but better ones
        !           164:  * may yet be found.
        !           165:  *
        !           166:  * In earlier versions of the IJG code, this module quantized in YCbCr color
        !           167:  * space, processing the raw upsampled data without a color conversion step.
        !           168:  * This allowed the color conversion math to be done only once per colormap
        !           169:  * entry, not once per pixel.  However, that optimization precluded other
        !           170:  * useful optimizations (such as merging color conversion with upsampling)
        !           171:  * and it also interfered with desired capabilities such as quantizing to an
        !           172:  * externally-supplied colormap.  We have therefore abandoned that approach.
        !           173:  * The present code works in the post-conversion color space, typically RGB.
        !           174:  *
        !           175:  * To improve the visual quality of the results, we actually work in scaled
        !           176:  * RGB space, giving G distances more weight than R, and R in turn more than
        !           177:  * B.  To do everything in integer math, we must use integer scale factors.
        !           178:  * The 2/3/1 scale factors used here correspond loosely to the relative
        !           179:  * weights of the colors in the NTSC grayscale equation.
        !           180:  * If you want to use this code to quantize a non-RGB color space, you'll
        !           181:  * probably need to change these scale factors.
        !           182:  */
        !           183: 
        !           184: #define R_SCALE 2              /* scale R distances by this much */
        !           185: #define G_SCALE 3              /* scale G distances by this much */
        !           186: #define B_SCALE 1              /* and B by this much */
        !           187: 
        !           188: /* Relabel R/G/B as components 0/1/2, respecting the RGB ordering defined
        !           189:  * in jmorecfg.h.  As the code stands, it will do the right thing for R,G,B
        !           190:  * and B,G,R orders.  If you define some other weird order in jmorecfg.h,
        !           191:  * you'll get compile errors until you extend this logic.  In that case
        !           192:  * you'll probably want to tweak the histogram sizes too.
        !           193:  */
        !           194: 
        !           195: #if RGB_RED == 0
        !           196: #define C0_SCALE R_SCALE
        !           197: #endif
        !           198: #if RGB_BLUE == 0
        !           199: #define C0_SCALE B_SCALE
        !           200: #endif
        !           201: #if RGB_GREEN == 1
        !           202: #define C1_SCALE G_SCALE
        !           203: #endif
        !           204: #if RGB_RED == 2
        !           205: #define C2_SCALE R_SCALE
        !           206: #endif
        !           207: #if RGB_BLUE == 2
        !           208: #define C2_SCALE B_SCALE
        !           209: #endif
        !           210: 
        !           211: 
        !           212: /*
        !           213:  * First we have the histogram data structure and routines for creating it.
        !           214:  *
        !           215:  * The number of bits of precision can be adjusted by changing these symbols.
        !           216:  * We recommend keeping 6 bits for G and 5 each for R and B.
        !           217:  * If you have plenty of memory and cycles, 6 bits all around gives marginally
        !           218:  * better results; if you are short of memory, 5 bits all around will save
        !           219:  * some space but degrade the results.
        !           220:  * To maintain a fully accurate histogram, we'd need to allocate a "long"
        !           221:  * (preferably unsigned long) for each cell.  In practice this is overkill;
        !           222:  * we can get by with 16 bits per cell.  Few of the cell counts will overflow,
        !           223:  * and clamping those that do overflow to the maximum value will give close-
        !           224:  * enough results.  This reduces the recommended histogram size from 256Kb
        !           225:  * to 128Kb, which is a useful savings on PC-class machines.
        !           226:  * (In the second pass the histogram space is re-used for pixel mapping data;
        !           227:  * in that capacity, each cell must be able to store zero to the number of
        !           228:  * desired colors.  16 bits/cell is plenty for that too.)
        !           229:  * Since the JPEG code is intended to run in small memory model on 80x86
        !           230:  * machines, we can't just allocate the histogram in one chunk.  Instead
        !           231:  * of a true 3-D array, we use a row of pointers to 2-D arrays.  Each
        !           232:  * pointer corresponds to a C0 value (typically 2^5 = 32 pointers) and
        !           233:  * each 2-D array has 2^6*2^5 = 2048 or 2^6*2^6 = 4096 entries.  Note that
        !           234:  * on 80x86 machines, the pointer row is in near memory but the actual
        !           235:  * arrays are in far memory (same arrangement as we use for image arrays).
        !           236:  */
        !           237: 
        !           238: #define MAXNUMCOLORS  (MAXJSAMPLE+1)   /* maximum size of colormap */
        !           239: 
        !           240: /* These will do the right thing for either R,G,B or B,G,R color order,
        !           241:  * but you may not like the results for other color orders.
        !           242:  */
        !           243: #define HIST_C0_BITS  5                /* bits of precision in R/B histogram */
        !           244: #define HIST_C1_BITS  6                /* bits of precision in G histogram */
        !           245: #define HIST_C2_BITS  5                /* bits of precision in B/R histogram */
        !           246: 
        !           247: /* Number of elements along histogram axes. */
        !           248: #define HIST_C0_ELEMS  (1<<HIST_C0_BITS)
        !           249: #define HIST_C1_ELEMS  (1<<HIST_C1_BITS)
        !           250: #define HIST_C2_ELEMS  (1<<HIST_C2_BITS)
        !           251: 
        !           252: /* These are the amounts to shift an input value to get a histogram index. */
        !           253: #define C0_SHIFT  (BITS_IN_JSAMPLE-HIST_C0_BITS)
        !           254: #define C1_SHIFT  (BITS_IN_JSAMPLE-HIST_C1_BITS)
        !           255: #define C2_SHIFT  (BITS_IN_JSAMPLE-HIST_C2_BITS)
        !           256: 
        !           257: 
        !           258: typedef UINT16 histcell;       /* histogram cell; prefer an unsigned type */
        !           259: 
        !           260: typedef histcell FAR *histptr; /* for pointers to histogram cells */
        !           261: 
        !           262: typedef histcell hist1d[HIST_C2_ELEMS];        /* typedefs for the array */
        !           263: typedef hist1d FAR *hist2d;    /* type for the 2nd-level pointers */
        !           264: typedef hist2d *hist3d;                /* type for top-level pointer */
        !           265: 
        !           266: 
        !           267: /* Declarations for Floyd-Steinberg dithering.
        !           268:  *
        !           269:  * Errors are accumulated into the array fserrors[], at a resolution of
        !           270:  * 1/16th of a pixel count.  The error at a given pixel is propagated
        !           271:  * to its not-yet-processed neighbors using the standard F-S fractions,
        !           272:  *             ...     (here)  7/16
        !           273:  *             3/16    5/16    1/16
        !           274:  * We work left-to-right on even rows, right-to-left on odd rows.
        !           275:  *
        !           276:  * We can get away with a single array (holding one row's worth of errors)
        !           277:  * by using it to store the current row's errors at pixel columns not yet
        !           278:  * processed, but the next row's errors at columns already processed.  We
        !           279:  * need only a few extra variables to hold the errors immediately around the
        !           280:  * current column.  (If we are lucky, those variables are in registers, but
        !           281:  * even if not, they're probably cheaper to access than array elements are.)
        !           282:  *
        !           283:  * The fserrors[] array has (#columns + 2) entries; the extra entry at
        !           284:  * each end saves us from special-casing the first and last pixels.
        !           285:  * Each entry is three values long, one value for each color component.
        !           286:  *
        !           287:  * Note: on a wide image, we might not have enough room in a PC's near data
        !           288:  * segment to hold the error array; so it is allocated with alloc_large.
        !           289:  */
        !           290: 
        !           291: #if BITS_IN_JSAMPLE == 8
        !           292: typedef INT16 FSERROR;         /* 16 bits should be enough */
        !           293: typedef int LOCFSERROR;                /* use 'int' for calculation temps */
        !           294: #else
        !           295: typedef INT32 FSERROR;         /* may need more than 16 bits */
        !           296: typedef INT32 LOCFSERROR;      /* be sure calculation temps are big enough */
        !           297: #endif
        !           298: 
        !           299: typedef FSERROR FAR *FSERRPTR; /* pointer to error array (in FAR storage!) */
        !           300: 
        !           301: 
        !           302: /* Private subobject */
        !           303: 
        !           304: typedef struct
        !           305: {
        !           306: #ifdef ORIGINAL_LIB_JPEG
        !           307:   struct jpeg_color_quantizer pub;     /* public fields */
        !           308: 
        !           309:   /* Space for the eventually created colormap is stashed here */
        !           310:   JSAMPARRAY sv_colormap;      /* colormap allocated at init time */
        !           311:   int desired;                 /* desired # of colors = size of colormap */
        !           312:   boolean needs_zeroed;                /* TRUE if next pass must zero histogram */
        !           313: #endif
        !           314: 
        !           315:   /* Variables for accumulating image statistics */
        !           316:   hist3d histogram;            /* pointer to the histogram */
        !           317: 
        !           318: 
        !           319:   /* Variables for Floyd-Steinberg dithering */
        !           320:   FSERRPTR fserrors;           /* accumulated errors */
        !           321: 
        !           322:   boolean on_odd_row;          /* flag to remember which row we are on */
        !           323:   int *error_limiter;          /* table for clamping the applied error */
        !           324: #ifndef ORIGINAL_LIB_JPEG
        !           325:   int *error_limiter_storage;  /* gdMalloc'd storage for the above */
        !           326: #endif
        !           327: }
        !           328: my_cquantizer;
        !           329: 
        !           330: typedef my_cquantizer *my_cquantize_ptr;
        !           331: 
        !           332: 
        !           333: /*
        !           334:  * Prescan some rows of pixels.
        !           335:  * In this module the prescan simply updates the histogram, which has been
        !           336:  * initialized to zeroes by start_pass.
        !           337:  * An output_buf parameter is required by the method signature, but no data
        !           338:  * is actually output (in fact the buffer controller is probably passing a
        !           339:  * NULL pointer).
        !           340:  */
        !           341: 
        !           342: METHODDEF (void)
        !           343: #ifndef ORIGINAL_LIB_JPEG
        !           344: prescan_quantize (gdImagePtr oim, gdImagePtr nim, my_cquantize_ptr cquantize)
        !           345: {
        !           346: #else
        !           347: prescan_quantize (j_decompress_ptr cinfo, JSAMPARRAY input_buf,
        !           348:                  JSAMPARRAY output_buf, int num_rows)
        !           349: {
        !           350:   my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
        !           351: #endif
        !           352:   register JSAMPROW ptr;
        !           353:   register histptr histp;
        !           354:   register hist3d histogram = cquantize->histogram;
        !           355:   int row;
        !           356:   JDIMENSION col;
        !           357: #ifdef ORIGINAL_LIB_JPEG
        !           358:   JDIMENSION width = cinfo->output_width;
        !           359: #else
        !           360:   int width = oim->sx;
        !           361:   int num_rows = oim->sy;
        !           362: #endif
        !           363: 
        !           364:   for (row = 0; row < num_rows; row++)
        !           365:     {
        !           366:       ptr = input_buf[row];
        !           367:       for (col = width; col > 0; col--)
        !           368:        {
        !           369: #ifdef ORIGINAL_LIB_JPEG
        !           370:          int r = GETJSAMPLE (ptr[0]) >> C0_SHIFT;
        !           371:          int g = GETJSAMPLE (ptr[1]) >> C1_SHIFT;
        !           372:          int b = GETJSAMPLE (ptr[2]) >> C2_SHIFT;
        !           373: #else
        !           374:          int r = gdTrueColorGetRed (*ptr) >> C0_SHIFT;
        !           375:          int g = gdTrueColorGetGreen (*ptr) >> C1_SHIFT;
        !           376:          int b = gdTrueColorGetBlue (*ptr) >> C2_SHIFT;
        !           377:          /* 2.0.12: Steven Brown: support a single totally transparent
        !           378:             color in the original. */
        !           379:          if ((oim->transparent >= 0) && (*ptr == oim->transparent))
        !           380:            {
        !           381:              ptr++;
        !           382:              continue;
        !           383:            }
        !           384: #endif
        !           385:          /* get pixel value and index into the histogram */
        !           386:          histp = &histogram[r][g][b];
        !           387:          /* increment, check for overflow and undo increment if so. */
        !           388:          if (++(*histp) == 0)
        !           389:            (*histp)--;
        !           390: #ifdef ORIGINAL_LIB_JPEG
        !           391:          ptr += 3;
        !           392: #else
        !           393:          ptr++;
        !           394: #endif
        !           395:        }
        !           396:     }
        !           397: }
        !           398: 
        !           399: 
        !           400: /*
        !           401:  * Next we have the really interesting routines: selection of a colormap
        !           402:  * given the completed histogram.
        !           403:  * These routines work with a list of "boxes", each representing a rectangular
        !           404:  * subset of the input color space (to histogram precision).
        !           405:  */
        !           406: 
        !           407: typedef struct
        !           408: {
        !           409:   /* The bounds of the box (inclusive); expressed as histogram indexes */
        !           410:   int c0min, c0max;
        !           411:   int c1min, c1max;
        !           412:   int c2min, c2max;
        !           413:   /* The volume (actually 2-norm) of the box */
        !           414:   INT32 volume;
        !           415:   /* The number of nonzero histogram cells within this box */
        !           416:   long colorcount;
        !           417: }
        !           418: box;
        !           419: 
        !           420: typedef box *boxptr;
        !           421: 
        !           422: 
        !           423: LOCAL (boxptr) find_biggest_color_pop (boxptr boxlist, int numboxes)
        !           424: /* Find the splittable box with the largest color population */
        !           425: /* Returns NULL if no splittable boxes remain */
        !           426: {
        !           427:   register boxptr boxp;
        !           428:   register int i;
        !           429:   register long maxc = 0;
        !           430:   boxptr which = NULL;
        !           431: 
        !           432:   for (i = 0, boxp = boxlist; i < numboxes; i++, boxp++)
        !           433:     {
        !           434:       if (boxp->colorcount > maxc && boxp->volume > 0)
        !           435:        {
        !           436:          which = boxp;
        !           437:          maxc = boxp->colorcount;
        !           438:        }
        !           439:     }
        !           440:   return which;
        !           441: }
        !           442: 
        !           443: 
        !           444: LOCAL (boxptr) find_biggest_volume (boxptr boxlist, int numboxes)
        !           445: /* Find the splittable box with the largest (scaled) volume */
        !           446: /* Returns NULL if no splittable boxes remain */
        !           447: {
        !           448:   register boxptr boxp;
        !           449:   register int i;
        !           450:   register INT32 maxv = 0;
        !           451:   boxptr which = NULL;
        !           452: 
        !           453:   for (i = 0, boxp = boxlist; i < numboxes; i++, boxp++)
        !           454:     {
        !           455:       if (boxp->volume > maxv)
        !           456:        {
        !           457:          which = boxp;
        !           458:          maxv = boxp->volume;
        !           459:        }
        !           460:     }
        !           461:   return which;
        !           462: }
        !           463: 
        !           464: 
        !           465: LOCAL (void)
        !           466: #ifndef ORIGINAL_LIB_JPEG
        !           467:   update_box (gdImagePtr oim, gdImagePtr nim, my_cquantize_ptr cquantize, boxptr boxp)
        !           468: {
        !           469: #else
        !           470:   update_box (j_decompress_ptr cinfo, boxptr boxp)
        !           471: /* Shrink the min/max bounds of a box to enclose only nonzero elements, */
        !           472: /* and recompute its volume and population */
        !           473: {
        !           474:   my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
        !           475: #endif
        !           476:   hist3d histogram = cquantize->histogram;
        !           477:   histptr histp;
        !           478:   int c0, c1, c2;
        !           479:   int c0min, c0max, c1min, c1max, c2min, c2max;
        !           480:   INT32 dist0, dist1, dist2;
        !           481:   long ccount;
        !           482: 
        !           483:   c0min = boxp->c0min;
        !           484:   c0max = boxp->c0max;
        !           485:   c1min = boxp->c1min;
        !           486:   c1max = boxp->c1max;
        !           487:   c2min = boxp->c2min;
        !           488:   c2max = boxp->c2max;
        !           489: 
        !           490:   if (c0max > c0min)
        !           491:     for (c0 = c0min; c0 <= c0max; c0++)
        !           492:       for (c1 = c1min; c1 <= c1max; c1++)
        !           493:        {
        !           494:          histp = &histogram[c0][c1][c2min];
        !           495:          for (c2 = c2min; c2 <= c2max; c2++)
        !           496:            if (*histp++ != 0)
        !           497:              {
        !           498:                boxp->c0min = c0min = c0;
        !           499:                goto have_c0min;
        !           500:              }
        !           501:        }
        !           502: have_c0min:
        !           503:   if (c0max > c0min)
        !           504:     for (c0 = c0max; c0 >= c0min; c0--)
        !           505:       for (c1 = c1min; c1 <= c1max; c1++)
        !           506:        {
        !           507:          histp = &histogram[c0][c1][c2min];
        !           508:          for (c2 = c2min; c2 <= c2max; c2++)
        !           509:            if (*histp++ != 0)
        !           510:              {
        !           511:                boxp->c0max = c0max = c0;
        !           512:                goto have_c0max;
        !           513:              }
        !           514:        }
        !           515: have_c0max:
        !           516:   if (c1max > c1min)
        !           517:     for (c1 = c1min; c1 <= c1max; c1++)
        !           518:       for (c0 = c0min; c0 <= c0max; c0++)
        !           519:        {
        !           520:          histp = &histogram[c0][c1][c2min];
        !           521:          for (c2 = c2min; c2 <= c2max; c2++)
        !           522:            if (*histp++ != 0)
        !           523:              {
        !           524:                boxp->c1min = c1min = c1;
        !           525:                goto have_c1min;
        !           526:              }
        !           527:        }
        !           528: have_c1min:
        !           529:   if (c1max > c1min)
        !           530:     for (c1 = c1max; c1 >= c1min; c1--)
        !           531:       for (c0 = c0min; c0 <= c0max; c0++)
        !           532:        {
        !           533:          histp = &histogram[c0][c1][c2min];
        !           534:          for (c2 = c2min; c2 <= c2max; c2++)
        !           535:            if (*histp++ != 0)
        !           536:              {
        !           537:                boxp->c1max = c1max = c1;
        !           538:                goto have_c1max;
        !           539:              }
        !           540:        }
        !           541: have_c1max:
        !           542:   if (c2max > c2min)
        !           543:     for (c2 = c2min; c2 <= c2max; c2++)
        !           544:       for (c0 = c0min; c0 <= c0max; c0++)
        !           545:        {
        !           546:          histp = &histogram[c0][c1min][c2];
        !           547:          for (c1 = c1min; c1 <= c1max; c1++, histp += HIST_C2_ELEMS)
        !           548:            if (*histp != 0)
        !           549:              {
        !           550:                boxp->c2min = c2min = c2;
        !           551:                goto have_c2min;
        !           552:              }
        !           553:        }
        !           554: have_c2min:
        !           555:   if (c2max > c2min)
        !           556:     for (c2 = c2max; c2 >= c2min; c2--)
        !           557:       for (c0 = c0min; c0 <= c0max; c0++)
        !           558:        {
        !           559:          histp = &histogram[c0][c1min][c2];
        !           560:          for (c1 = c1min; c1 <= c1max; c1++, histp += HIST_C2_ELEMS)
        !           561:            if (*histp != 0)
        !           562:              {
        !           563:                boxp->c2max = c2max = c2;
        !           564:                goto have_c2max;
        !           565:              }
        !           566:        }
        !           567: have_c2max:
        !           568: 
        !           569:   /* Update box volume.
        !           570:    * We use 2-norm rather than real volume here; this biases the method
        !           571:    * against making long narrow boxes, and it has the side benefit that
        !           572:    * a box is splittable iff norm > 0.
        !           573:    * Since the differences are expressed in histogram-cell units,
        !           574:    * we have to shift back to JSAMPLE units to get consistent distances;
        !           575:    * after which, we scale according to the selected distance scale factors.
        !           576:    */
        !           577:   dist0 = ((c0max - c0min) << C0_SHIFT) * C0_SCALE;
        !           578:   dist1 = ((c1max - c1min) << C1_SHIFT) * C1_SCALE;
        !           579:   dist2 = ((c2max - c2min) << C2_SHIFT) * C2_SCALE;
        !           580:   boxp->volume = dist0 * dist0 + dist1 * dist1 + dist2 * dist2;
        !           581: 
        !           582:   /* Now scan remaining volume of box and compute population */
        !           583:   ccount = 0;
        !           584:   for (c0 = c0min; c0 <= c0max; c0++)
        !           585:     for (c1 = c1min; c1 <= c1max; c1++)
        !           586:       {
        !           587:        histp = &histogram[c0][c1][c2min];
        !           588:        for (c2 = c2min; c2 <= c2max; c2++, histp++)
        !           589:          if (*histp != 0)
        !           590:            {
        !           591:              ccount++;
        !           592:            }
        !           593:       }
        !           594:   boxp->colorcount = ccount;
        !           595: }
        !           596: 
        !           597: 
        !           598: LOCAL (int)
        !           599: #ifdef ORIGINAL_LIB_JPEG
        !           600: median_cut (j_decompress_ptr cinfo, boxptr boxlist, int numboxes,
        !           601:            int desired_colors)
        !           602: #else
        !           603: median_cut (gdImagePtr oim, gdImagePtr nim, my_cquantize_ptr cquantize,
        !           604:            boxptr boxlist, int numboxes, int desired_colors)
        !           605: #endif
        !           606: /* Repeatedly select and split the largest box until we have enough boxes */
        !           607: {
        !           608:   int n, lb;
        !           609:   int c0, c1, c2, cmax;
        !           610:   register boxptr b1, b2;
        !           611: 
        !           612:   while (numboxes < desired_colors)
        !           613:     {
        !           614:       /* Select box to split.
        !           615:        * Current algorithm: by population for first half, then by volume.
        !           616:        */
        !           617:       if (numboxes * 2 <= desired_colors)
        !           618:        {
        !           619:          b1 = find_biggest_color_pop (boxlist, numboxes);
        !           620:        }
        !           621:       else
        !           622:        {
        !           623:          b1 = find_biggest_volume (boxlist, numboxes);
        !           624:        }
        !           625:       if (b1 == NULL)          /* no splittable boxes left! */
        !           626:        break;
        !           627:       b2 = &boxlist[numboxes]; /* where new box will go */
        !           628:       /* Copy the color bounds to the new box. */
        !           629:       b2->c0max = b1->c0max;
        !           630:       b2->c1max = b1->c1max;
        !           631:       b2->c2max = b1->c2max;
        !           632:       b2->c0min = b1->c0min;
        !           633:       b2->c1min = b1->c1min;
        !           634:       b2->c2min = b1->c2min;
        !           635:       /* Choose which axis to split the box on.
        !           636:        * Current algorithm: longest scaled axis.
        !           637:        * See notes in update_box about scaling distances.
        !           638:        */
        !           639:       c0 = ((b1->c0max - b1->c0min) << C0_SHIFT) * C0_SCALE;
        !           640:       c1 = ((b1->c1max - b1->c1min) << C1_SHIFT) * C1_SCALE;
        !           641:       c2 = ((b1->c2max - b1->c2min) << C2_SHIFT) * C2_SCALE;
        !           642:       /* We want to break any ties in favor of green, then red, blue last.
        !           643:        * This code does the right thing for R,G,B or B,G,R color orders only.
        !           644:        */
        !           645: #if RGB_RED == 0
        !           646:       cmax = c1;
        !           647:       n = 1;
        !           648:       if (c0 > cmax)
        !           649:        {
        !           650:          cmax = c0;
        !           651:          n = 0;
        !           652:        }
        !           653:       if (c2 > cmax)
        !           654:        {
        !           655:          n = 2;
        !           656:        }
        !           657: #else
        !           658:       cmax = c1;
        !           659:       n = 1;
        !           660:       if (c2 > cmax)
        !           661:        {
        !           662:          cmax = c2;
        !           663:          n = 2;
        !           664:        }
        !           665:       if (c0 > cmax)
        !           666:        {
        !           667:          n = 0;
        !           668:        }
        !           669: #endif
        !           670:       /* Choose split point along selected axis, and update box bounds.
        !           671:        * Current algorithm: split at halfway point.
        !           672:        * (Since the box has been shrunk to minimum volume,
        !           673:        * any split will produce two nonempty subboxes.)
        !           674:        * Note that lb value is max for lower box, so must be < old max.
        !           675:        */
        !           676:       switch (n)
        !           677:        {
        !           678:        case 0:
        !           679:          lb = (b1->c0max + b1->c0min) / 2;
        !           680:          b1->c0max = lb;
        !           681:          b2->c0min = lb + 1;
        !           682:          break;
        !           683:        case 1:
        !           684:          lb = (b1->c1max + b1->c1min) / 2;
        !           685:          b1->c1max = lb;
        !           686:          b2->c1min = lb + 1;
        !           687:          break;
        !           688:        case 2:
        !           689:          lb = (b1->c2max + b1->c2min) / 2;
        !           690:          b1->c2max = lb;
        !           691:          b2->c2min = lb + 1;
        !           692:          break;
        !           693:        }
        !           694:       /* Update stats for boxes */
        !           695: #ifdef ORIGINAL_LIB_JPEG
        !           696:       update_box (cinfo, b1);
        !           697:       update_box (cinfo, b2);
        !           698: #else
        !           699:       update_box (oim, nim, cquantize, b1);
        !           700:       update_box (oim, nim, cquantize, b2);
        !           701: #endif
        !           702:       numboxes++;
        !           703:     }
        !           704:   return numboxes;
        !           705: }
        !           706: 
        !           707: 
        !           708: LOCAL (void)
        !           709: #ifndef ORIGINAL_LIB_JPEG
        !           710:   compute_color (gdImagePtr oim, gdImagePtr nim, my_cquantize_ptr cquantize,
        !           711:               boxptr boxp, int icolor)
        !           712: {
        !           713: #else
        !           714:   compute_color (j_decompress_ptr cinfo, boxptr boxp, int icolor)
        !           715: /* Compute representative color for a box, put it in colormap[icolor] */
        !           716: {
        !           717:   /* Current algorithm: mean weighted by pixels (not colors) */
        !           718:   /* Note it is important to get the rounding correct! */
        !           719:   my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
        !           720: #endif
        !           721:   hist3d histogram = cquantize->histogram;
        !           722:   histptr histp;
        !           723:   int c0, c1, c2;
        !           724:   int c0min, c0max, c1min, c1max, c2min, c2max;
        !           725:   long count = 0; /* 2.0.28: = 0 */
        !           726:   long total = 0;
        !           727:   long c0total = 0;
        !           728:   long c1total = 0;
        !           729:   long c2total = 0;
        !           730: 
        !           731:   c0min = boxp->c0min;
        !           732:   c0max = boxp->c0max;
        !           733:   c1min = boxp->c1min;
        !           734:   c1max = boxp->c1max;
        !           735:   c2min = boxp->c2min;
        !           736:   c2max = boxp->c2max;
        !           737: 
        !           738:   for (c0 = c0min; c0 <= c0max; c0++)
        !           739:     for (c1 = c1min; c1 <= c1max; c1++)
        !           740:       {
        !           741:        histp = &histogram[c0][c1][c2min];
        !           742:        for (c2 = c2min; c2 <= c2max; c2++)
        !           743:          {
        !           744:            if ((count = *histp++) != 0)
        !           745:              {
        !           746:                total += count;
        !           747:                c0total +=
        !           748:                  ((c0 << C0_SHIFT) + ((1 << C0_SHIFT) >> 1)) * count;
        !           749:                c1total +=
        !           750:                  ((c1 << C1_SHIFT) + ((1 << C1_SHIFT) >> 1)) * count;
        !           751:                c2total +=
        !           752:                  ((c2 << C2_SHIFT) + ((1 << C2_SHIFT) >> 1)) * count;
        !           753:              }
        !           754:          }
        !           755:       }
        !           756: 
        !           757: #ifdef ORIGINAL_LIB_JPEG
        !           758:   cinfo->colormap[0][icolor] = (JSAMPLE) ((c0total + (total >> 1)) / total);
        !           759:   cinfo->colormap[1][icolor] = (JSAMPLE) ((c1total + (total >> 1)) / total);
        !           760:   cinfo->colormap[2][icolor] = (JSAMPLE) ((c2total + (total >> 1)) / total);
        !           761: #else
        !           762:   /* 2.0.16: Paul den Dulk found an occasion where total can be 0 */
        !           763:   if (count)
        !           764:     {
        !           765:       nim->red[icolor] = (int) ((c0total + (total >> 1)) / total);
        !           766:       nim->green[icolor] = (int) ((c1total + (total >> 1)) / total);
        !           767:       nim->blue[icolor] = (int) ((c2total + (total >> 1)) / total);
        !           768:     }
        !           769:   else
        !           770:     {
        !           771:       nim->red[icolor] = 255;
        !           772:       nim->green[icolor] = 255;
        !           773:       nim->blue[icolor] = 255;
        !           774:     }
        !           775:                nim->open[icolor] = 0;
        !           776: #endif
        !           777: }
        !           778: 
        !           779: 
        !           780: LOCAL (void)
        !           781: #ifdef ORIGINAL_LIB_JPEG
        !           782: select_colors (j_decompress_ptr cinfo, int desired_colors)
        !           783: #else
        !           784: select_colors (gdImagePtr oim, gdImagePtr nim, my_cquantize_ptr cquantize, int desired_colors)
        !           785: #endif
        !           786: /* Master routine for color selection */
        !           787: {
        !           788:   boxptr boxlist;
        !           789:   int numboxes;
        !           790:   int i;
        !           791: 
        !           792:   /* Allocate workspace for box list */
        !           793: #ifdef ORIGINAL_LIB_JPEG
        !           794:   boxlist = (boxptr) (*cinfo->mem->alloc_small)
        !           795:     ((j_common_ptr) cinfo, JPOOL_IMAGE, desired_colors * SIZEOF (box));
        !           796: #else
        !           797:   boxlist = (boxptr) safe_emalloc(desired_colors, sizeof (box), 1);
        !           798: #endif
        !           799:   /* Initialize one box containing whole space */
        !           800:   numboxes = 1;
        !           801:   boxlist[0].c0min = 0;
        !           802:   boxlist[0].c0max = MAXJSAMPLE >> C0_SHIFT;
        !           803:   boxlist[0].c1min = 0;
        !           804:   boxlist[0].c1max = MAXJSAMPLE >> C1_SHIFT;
        !           805:   boxlist[0].c2min = 0;
        !           806:   boxlist[0].c2max = MAXJSAMPLE >> C2_SHIFT;
        !           807: #ifdef ORIGINAL_LIB_JPEG
        !           808:   /* Shrink it to actually-used volume and set its statistics */
        !           809:   update_box (cinfo, &boxlist[0]);
        !           810:   /* Perform median-cut to produce final box list */
        !           811:   numboxes = median_cut (cinfo, boxlist, numboxes, desired_colors);
        !           812:   /* Compute the representative color for each box, fill colormap */
        !           813:   for (i = 0; i < numboxes; i++)
        !           814:     compute_color (cinfo, &boxlist[i], i);
        !           815:   cinfo->actual_number_of_colors = numboxes;
        !           816:   TRACEMS1 (cinfo, 1, JTRC_QUANT_SELECTED, numboxes);
        !           817: #else
        !           818:   /* Shrink it to actually-used volume and set its statistics */
        !           819:   update_box (oim, nim, cquantize, &boxlist[0]);
        !           820:   /* Perform median-cut to produce final box list */
        !           821:   numboxes = median_cut (oim, nim, cquantize, boxlist, numboxes, desired_colors);
        !           822:   /* Compute the representative color for each box, fill colormap */
        !           823:   for (i = 0; i < numboxes; i++)
        !           824:     compute_color (oim, nim, cquantize, &boxlist[i], i);
        !           825:   nim->colorsTotal = numboxes;
        !           826: 
        !           827:   /* If we had a pure transparency color, add it as the last palette entry.
        !           828:    * Skip incrementing the color count so that the dither / matching phase
        !           829:    * won't use it on pixels that shouldn't have been transparent.  We'll
        !           830:    * increment it after all that finishes. */
        !           831:   if (oim->transparent >= 0)
        !           832:     {
        !           833:       /* Save the transparent color. */
        !           834:       nim->red[nim->colorsTotal] = gdTrueColorGetRed (oim->transparent);
        !           835:       nim->green[nim->colorsTotal] = gdTrueColorGetGreen (oim->transparent);
        !           836:       nim->blue[nim->colorsTotal] = gdTrueColorGetBlue (oim->transparent);
        !           837:       nim->alpha[nim->colorsTotal] = gdAlphaTransparent;
        !           838:       nim->open[nim->colorsTotal] = 0;
        !           839:     }
        !           840: 
        !           841:   gdFree (boxlist);
        !           842: #endif
        !           843: }
        !           844: 
        !           845: 
        !           846: /*
        !           847:  * These routines are concerned with the time-critical task of mapping input
        !           848:  * colors to the nearest color in the selected colormap.
        !           849:  *
        !           850:  * We re-use the histogram space as an "inverse color map", essentially a
        !           851:  * cache for the results of nearest-color searches.  All colors within a
        !           852:  * histogram cell will be mapped to the same colormap entry, namely the one
        !           853:  * closest to the cell's center.  This may not be quite the closest entry to
        !           854:  * the actual input color, but it's almost as good.  A zero in the cache
        !           855:  * indicates we haven't found the nearest color for that cell yet; the array
        !           856:  * is cleared to zeroes before starting the mapping pass.  When we find the
        !           857:  * nearest color for a cell, its colormap index plus one is recorded in the
        !           858:  * cache for future use.  The pass2 scanning routines call fill_inverse_cmap
        !           859:  * when they need to use an unfilled entry in the cache.
        !           860:  *
        !           861:  * Our method of efficiently finding nearest colors is based on the "locally
        !           862:  * sorted search" idea described by Heckbert and on the incremental distance
        !           863:  * calculation described by Spencer W. Thomas in chapter III.1 of Graphics
        !           864:  * Gems II (James Arvo, ed.  Academic Press, 1991).  Thomas points out that
        !           865:  * the distances from a given colormap entry to each cell of the histogram can
        !           866:  * be computed quickly using an incremental method: the differences between
        !           867:  * distances to adjacent cells themselves differ by a constant.  This allows a
        !           868:  * fairly fast implementation of the "brute force" approach of computing the
        !           869:  * distance from every colormap entry to every histogram cell.  Unfortunately,
        !           870:  * it needs a work array to hold the best-distance-so-far for each histogram
        !           871:  * cell (because the inner loop has to be over cells, not colormap entries).
        !           872:  * The work array elements have to be INT32s, so the work array would need
        !           873:  * 256Kb at our recommended precision.  This is not feasible in DOS machines.
        !           874:  *
        !           875:  * To get around these problems, we apply Thomas' method to compute the
        !           876:  * nearest colors for only the cells within a small subbox of the histogram.
        !           877:  * The work array need be only as big as the subbox, so the memory usage
        !           878:  * problem is solved.  Furthermore, we need not fill subboxes that are never
        !           879:  * referenced in pass2; many images use only part of the color gamut, so a
        !           880:  * fair amount of work is saved.  An additional advantage of this
        !           881:  * approach is that we can apply Heckbert's locality criterion to quickly
        !           882:  * eliminate colormap entries that are far away from the subbox; typically
        !           883:  * three-fourths of the colormap entries are rejected by Heckbert's criterion,
        !           884:  * and we need not compute their distances to individual cells in the subbox.
        !           885:  * The speed of this approach is heavily influenced by the subbox size: too
        !           886:  * small means too much overhead, too big loses because Heckbert's criterion
        !           887:  * can't eliminate as many colormap entries.  Empirically the best subbox
        !           888:  * size seems to be about 1/512th of the histogram (1/8th in each direction).
        !           889:  *
        !           890:  * Thomas' article also describes a refined method which is asymptotically
        !           891:  * faster than the brute-force method, but it is also far more complex and
        !           892:  * cannot efficiently be applied to small subboxes.  It is therefore not
        !           893:  * useful for programs intended to be portable to DOS machines.  On machines
        !           894:  * with plenty of memory, filling the whole histogram in one shot with Thomas'
        !           895:  * refined method might be faster than the present code --- but then again,
        !           896:  * it might not be any faster, and it's certainly more complicated.
        !           897:  */
        !           898: 
        !           899: 
        !           900: /* log2(histogram cells in update box) for each axis; this can be adjusted */
        !           901: #define BOX_C0_LOG  (HIST_C0_BITS-3)
        !           902: #define BOX_C1_LOG  (HIST_C1_BITS-3)
        !           903: #define BOX_C2_LOG  (HIST_C2_BITS-3)
        !           904: 
        !           905: #define BOX_C0_ELEMS  (1<<BOX_C0_LOG)  /* # of hist cells in update box */
        !           906: #define BOX_C1_ELEMS  (1<<BOX_C1_LOG)
        !           907: #define BOX_C2_ELEMS  (1<<BOX_C2_LOG)
        !           908: 
        !           909: #define BOX_C0_SHIFT  (C0_SHIFT + BOX_C0_LOG)
        !           910: #define BOX_C1_SHIFT  (C1_SHIFT + BOX_C1_LOG)
        !           911: #define BOX_C2_SHIFT  (C2_SHIFT + BOX_C2_LOG)
        !           912: 
        !           913: 
        !           914: /*
        !           915:  * The next three routines implement inverse colormap filling.  They could
        !           916:  * all be folded into one big routine, but splitting them up this way saves
        !           917:  * some stack space (the mindist[] and bestdist[] arrays need not coexist)
        !           918:  * and may allow some compilers to produce better code by registerizing more
        !           919:  * inner-loop variables.
        !           920:  */
        !           921: 
        !           922: LOCAL (int)
        !           923: find_nearby_colors (
        !           924: #ifdef ORIGINAL_LIB_JPEG
        !           925:                     j_decompress_ptr cinfo,
        !           926: #else
        !           927:                     gdImagePtr oim, gdImagePtr nim, my_cquantize_ptr cquantize,
        !           928: #endif
        !           929:                     int minc0, int minc1, int minc2, JSAMPLE colorlist[])
        !           930: /* Locate the colormap entries close enough to an update box to be candidates
        !           931:  * for the nearest entry to some cell(s) in the update box.  The update box
        !           932:  * is specified by the center coordinates of its first cell.  The number of
        !           933:  * candidate colormap entries is returned, and their colormap indexes are
        !           934:  * placed in colorlist[].
        !           935:  * This routine uses Heckbert's "locally sorted search" criterion to select
        !           936:  * the colors that need further consideration.
        !           937:  */
        !           938: {
        !           939: #ifdef ORIGINAL_LIB_JPEG
        !           940:   int numcolors = cinfo->actual_number_of_colors;
        !           941: #else
        !           942:   int numcolors = nim->colorsTotal;
        !           943: #endif
        !           944:   int maxc0, maxc1, maxc2;
        !           945:   int centerc0, centerc1, centerc2;
        !           946:   int i, x, ncolors;
        !           947:   INT32 minmaxdist, min_dist, max_dist, tdist;
        !           948:   INT32 mindist[MAXNUMCOLORS]; /* min distance to colormap entry i */
        !           949: 
        !           950:   /* Compute true coordinates of update box's upper corner and center.
        !           951:    * Actually we compute the coordinates of the center of the upper-corner
        !           952:    * histogram cell, which are the upper bounds of the volume we care about.
        !           953:    * Note that since ">>" rounds down, the "center" values may be closer to
        !           954:    * min than to max; hence comparisons to them must be "<=", not "<".
        !           955:    */
        !           956:   maxc0 = minc0 + ((1 << BOX_C0_SHIFT) - (1 << C0_SHIFT));
        !           957:   centerc0 = (minc0 + maxc0) >> 1;
        !           958:   maxc1 = minc1 + ((1 << BOX_C1_SHIFT) - (1 << C1_SHIFT));
        !           959:   centerc1 = (minc1 + maxc1) >> 1;
        !           960:   maxc2 = minc2 + ((1 << BOX_C2_SHIFT) - (1 << C2_SHIFT));
        !           961:   centerc2 = (minc2 + maxc2) >> 1;
        !           962: 
        !           963:   /* For each color in colormap, find:
        !           964:    *  1. its minimum squared-distance to any point in the update box
        !           965:    *     (zero if color is within update box);
        !           966:    *  2. its maximum squared-distance to any point in the update box.
        !           967:    * Both of these can be found by considering only the corners of the box.
        !           968:    * We save the minimum distance for each color in mindist[];
        !           969:    * only the smallest maximum distance is of interest.
        !           970:    */
        !           971:   minmaxdist = 0x7FFFFFFFL;
        !           972: 
        !           973:   for (i = 0; i < numcolors; i++)
        !           974:     {
        !           975:       /* We compute the squared-c0-distance term, then add in the other two. */
        !           976: #ifdef ORIGINAL_LIB_JPEG
        !           977:       x = GETJSAMPLE (cinfo->colormap[0][i]);
        !           978: #else
        !           979:       x = nim->red[i];
        !           980: #endif
        !           981:       if (x < minc0)
        !           982:        {
        !           983:          tdist = (x - minc0) * C0_SCALE;
        !           984:          min_dist = tdist * tdist;
        !           985:          tdist = (x - maxc0) * C0_SCALE;
        !           986:          max_dist = tdist * tdist;
        !           987:        }
        !           988:       else if (x > maxc0)
        !           989:        {
        !           990:          tdist = (x - maxc0) * C0_SCALE;
        !           991:          min_dist = tdist * tdist;
        !           992:          tdist = (x - minc0) * C0_SCALE;
        !           993:          max_dist = tdist * tdist;
        !           994:        }
        !           995:       else
        !           996:        {
        !           997:          /* within cell range so no contribution to min_dist */
        !           998:          min_dist = 0;
        !           999:          if (x <= centerc0)
        !          1000:            {
        !          1001:              tdist = (x - maxc0) * C0_SCALE;
        !          1002:              max_dist = tdist * tdist;
        !          1003:            }
        !          1004:          else
        !          1005:            {
        !          1006:              tdist = (x - minc0) * C0_SCALE;
        !          1007:              max_dist = tdist * tdist;
        !          1008:            }
        !          1009:        }
        !          1010: 
        !          1011: #ifdef ORIGINAL_LIB_JPEG
        !          1012:       x = GETJSAMPLE (cinfo->colormap[1][i]);
        !          1013: #else
        !          1014:       x = nim->green[i];
        !          1015: #endif
        !          1016:       if (x < minc1)
        !          1017:        {
        !          1018:          tdist = (x - minc1) * C1_SCALE;
        !          1019:          min_dist += tdist * tdist;
        !          1020:          tdist = (x - maxc1) * C1_SCALE;
        !          1021:          max_dist += tdist * tdist;
        !          1022:        }
        !          1023:       else if (x > maxc1)
        !          1024:        {
        !          1025:          tdist = (x - maxc1) * C1_SCALE;
        !          1026:          min_dist += tdist * tdist;
        !          1027:          tdist = (x - minc1) * C1_SCALE;
        !          1028:          max_dist += tdist * tdist;
        !          1029:        }
        !          1030:       else
        !          1031:        {
        !          1032:          /* within cell range so no contribution to min_dist */
        !          1033:          if (x <= centerc1)
        !          1034:            {
        !          1035:              tdist = (x - maxc1) * C1_SCALE;
        !          1036:              max_dist += tdist * tdist;
        !          1037:            }
        !          1038:          else
        !          1039:            {
        !          1040:              tdist = (x - minc1) * C1_SCALE;
        !          1041:              max_dist += tdist * tdist;
        !          1042:            }
        !          1043:        }
        !          1044: 
        !          1045: #ifdef ORIGINAL_LIB_JPEG
        !          1046:       x = GETJSAMPLE (cinfo->colormap[2][i]);
        !          1047: #else
        !          1048:       x = nim->blue[i];
        !          1049: #endif
        !          1050:       if (x < minc2)
        !          1051:        {
        !          1052:          tdist = (x - minc2) * C2_SCALE;
        !          1053:          min_dist += tdist * tdist;
        !          1054:          tdist = (x - maxc2) * C2_SCALE;
        !          1055:          max_dist += tdist * tdist;
        !          1056:        }
        !          1057:       else if (x > maxc2)
        !          1058:        {
        !          1059:          tdist = (x - maxc2) * C2_SCALE;
        !          1060:          min_dist += tdist * tdist;
        !          1061:          tdist = (x - minc2) * C2_SCALE;
        !          1062:          max_dist += tdist * tdist;
        !          1063:        }
        !          1064:       else
        !          1065:        {
        !          1066:          /* within cell range so no contribution to min_dist */
        !          1067:          if (x <= centerc2)
        !          1068:            {
        !          1069:              tdist = (x - maxc2) * C2_SCALE;
        !          1070:              max_dist += tdist * tdist;
        !          1071:            }
        !          1072:          else
        !          1073:            {
        !          1074:              tdist = (x - minc2) * C2_SCALE;
        !          1075:              max_dist += tdist * tdist;
        !          1076:            }
        !          1077:        }
        !          1078: 
        !          1079:       mindist[i] = min_dist;   /* save away the results */
        !          1080:       if (max_dist < minmaxdist)
        !          1081:        minmaxdist = max_dist;
        !          1082:     }
        !          1083: 
        !          1084:   /* Now we know that no cell in the update box is more than minmaxdist
        !          1085:    * away from some colormap entry.  Therefore, only colors that are
        !          1086:    * within minmaxdist of some part of the box need be considered.
        !          1087:    */
        !          1088:   ncolors = 0;
        !          1089:   for (i = 0; i < numcolors; i++)
        !          1090:     {
        !          1091:       if (mindist[i] <= minmaxdist)
        !          1092:        colorlist[ncolors++] = (JSAMPLE) i;
        !          1093:     }
        !          1094:   return ncolors;
        !          1095: }
        !          1096: 
        !          1097: 
        !          1098: LOCAL (void) find_best_colors (
        !          1099: #ifdef ORIGINAL_LIB_JPEG
        !          1100:                                j_decompress_ptr cinfo,
        !          1101: #else
        !          1102:                                gdImagePtr oim, gdImagePtr nim, my_cquantize_ptr cquantize,
        !          1103: #endif
        !          1104:                                int minc0, int minc1, int minc2,
        !          1105:                                int numcolors, JSAMPLE colorlist[],
        !          1106:                                JSAMPLE bestcolor[])
        !          1107: /* Find the closest colormap entry for each cell in the update box,
        !          1108:  * given the list of candidate colors prepared by find_nearby_colors.
        !          1109:  * Return the indexes of the closest entries in the bestcolor[] array.
        !          1110:  * This routine uses Thomas' incremental distance calculation method to
        !          1111:  * find the distance from a colormap entry to successive cells in the box.
        !          1112:  */
        !          1113: {
        !          1114:   int ic0, ic1, ic2;
        !          1115:   int i, icolor;
        !          1116:   register INT32 *bptr;                /* pointer into bestdist[] array */
        !          1117:   JSAMPLE *cptr;               /* pointer into bestcolor[] array */
        !          1118:   INT32 dist0, dist1;          /* initial distance values */
        !          1119:   register INT32 dist2;                /* current distance in inner loop */
        !          1120:   INT32 xx0, xx1;              /* distance increments */
        !          1121:   register INT32 xx2;
        !          1122:   INT32 inc0, inc1, inc2;      /* initial values for increments */
        !          1123:   /* This array holds the distance to the nearest-so-far color for each cell */
        !          1124:   INT32 bestdist[BOX_C0_ELEMS * BOX_C1_ELEMS * BOX_C2_ELEMS];
        !          1125: 
        !          1126:   /* Initialize best-distance for each cell of the update box */
        !          1127:   bptr = bestdist;
        !          1128:   for (i = BOX_C0_ELEMS * BOX_C1_ELEMS * BOX_C2_ELEMS - 1; i >= 0; i--)
        !          1129:     *bptr++ = 0x7FFFFFFFL;
        !          1130: 
        !          1131:   /* For each color selected by find_nearby_colors,
        !          1132:    * compute its distance to the center of each cell in the box.
        !          1133:    * If that's less than best-so-far, update best distance and color number.
        !          1134:    */
        !          1135: 
        !          1136:   /* Nominal steps between cell centers ("x" in Thomas article) */
        !          1137: #define STEP_C0  ((1 << C0_SHIFT) * C0_SCALE)
        !          1138: #define STEP_C1  ((1 << C1_SHIFT) * C1_SCALE)
        !          1139: #define STEP_C2  ((1 << C2_SHIFT) * C2_SCALE)
        !          1140: 
        !          1141:   for (i = 0; i < numcolors; i++)
        !          1142:     {
        !          1143:       int r, g, b;
        !          1144: #ifdef ORIGINAL_LIB_JPEG
        !          1145: 
        !          1146:       icolor = GETJSAMPLE (colorlist[i]);
        !          1147:       r = GETJSAMPLE (cinfo->colormap[0][icolor]);
        !          1148:       g = GETJSAMPLE (cinfo->colormap[1][icolor]);
        !          1149:       b = GETJSAMPLE (cinfo->colormap[2][icolor]);
        !          1150: #else
        !          1151:       icolor = colorlist[i];
        !          1152:       r = nim->red[icolor];
        !          1153:       g = nim->green[icolor];
        !          1154:       b = nim->blue[icolor];
        !          1155: #endif
        !          1156: 
        !          1157:       /* Compute (square of) distance from minc0/c1/c2 to this color */
        !          1158:       inc0 = (minc0 - r) * C0_SCALE;
        !          1159:       dist0 = inc0 * inc0;
        !          1160:       inc1 = (minc1 - g) * C1_SCALE;
        !          1161:       dist0 += inc1 * inc1;
        !          1162:       inc2 = (minc2 - b) * C2_SCALE;
        !          1163:       dist0 += inc2 * inc2;
        !          1164:       /* Form the initial difference increments */
        !          1165:       inc0 = inc0 * (2 * STEP_C0) + STEP_C0 * STEP_C0;
        !          1166:       inc1 = inc1 * (2 * STEP_C1) + STEP_C1 * STEP_C1;
        !          1167:       inc2 = inc2 * (2 * STEP_C2) + STEP_C2 * STEP_C2;
        !          1168:       /* Now loop over all cells in box, updating distance per Thomas method */
        !          1169:       bptr = bestdist;
        !          1170:       cptr = bestcolor;
        !          1171:       xx0 = inc0;
        !          1172:       for (ic0 = BOX_C0_ELEMS - 1; ic0 >= 0; ic0--)
        !          1173:        {
        !          1174:          dist1 = dist0;
        !          1175:          xx1 = inc1;
        !          1176:          for (ic1 = BOX_C1_ELEMS - 1; ic1 >= 0; ic1--)
        !          1177:            {
        !          1178:              dist2 = dist1;
        !          1179:              xx2 = inc2;
        !          1180:              for (ic2 = BOX_C2_ELEMS - 1; ic2 >= 0; ic2--)
        !          1181:                {
        !          1182:                  if (dist2 < *bptr)
        !          1183:                    {
        !          1184:                      *bptr = dist2;
        !          1185:                      *cptr = (JSAMPLE) icolor;
        !          1186:                    }
        !          1187:                  dist2 += xx2;
        !          1188:                  xx2 += 2 * STEP_C2 * STEP_C2;
        !          1189:                  bptr++;
        !          1190:                  cptr++;
        !          1191:                }
        !          1192:              dist1 += xx1;
        !          1193:              xx1 += 2 * STEP_C1 * STEP_C1;
        !          1194:            }
        !          1195:          dist0 += xx0;
        !          1196:          xx0 += 2 * STEP_C0 * STEP_C0;
        !          1197:        }
        !          1198:     }
        !          1199: }
        !          1200: 
        !          1201: 
        !          1202: LOCAL (void)
        !          1203: fill_inverse_cmap (
        !          1204: #ifdef ORIGINAL_LIB_JPEG
        !          1205:                    j_decompress_ptr cinfo,
        !          1206: #else
        !          1207:                    gdImagePtr oim, gdImagePtr nim, my_cquantize_ptr cquantize,
        !          1208: #endif
        !          1209:                    int c0, int c1, int c2)
        !          1210: /* Fill the inverse-colormap entries in the update box that contains */
        !          1211: /* histogram cell c0/c1/c2.  (Only that one cell MUST be filled, but */
        !          1212: /* we can fill as many others as we wish.) */
        !          1213: {
        !          1214: #ifdef ORIGINAL_LIB_JPEG
        !          1215:   my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
        !          1216: #endif
        !          1217:   hist3d histogram = cquantize->histogram;
        !          1218:   int minc0, minc1, minc2;     /* lower left corner of update box */
        !          1219:   int ic0, ic1, ic2;
        !          1220:   register JSAMPLE *cptr;      /* pointer into bestcolor[] array */
        !          1221:   register histptr cachep;     /* pointer into main cache array */
        !          1222:   /* This array lists the candidate colormap indexes. */
        !          1223:   JSAMPLE colorlist[MAXNUMCOLORS];
        !          1224:   int numcolors;               /* number of candidate colors */
        !          1225:   /* This array holds the actually closest colormap index for each cell. */
        !          1226:   JSAMPLE bestcolor[BOX_C0_ELEMS * BOX_C1_ELEMS * BOX_C2_ELEMS];
        !          1227: 
        !          1228:   /* Convert cell coordinates to update box ID */
        !          1229:   c0 >>= BOX_C0_LOG;
        !          1230:   c1 >>= BOX_C1_LOG;
        !          1231:   c2 >>= BOX_C2_LOG;
        !          1232: 
        !          1233:   /* Compute true coordinates of update box's origin corner.
        !          1234:    * Actually we compute the coordinates of the center of the corner
        !          1235:    * histogram cell, which are the lower bounds of the volume we care about.
        !          1236:    */
        !          1237:   minc0 = (c0 << BOX_C0_SHIFT) + ((1 << C0_SHIFT) >> 1);
        !          1238:   minc1 = (c1 << BOX_C1_SHIFT) + ((1 << C1_SHIFT) >> 1);
        !          1239:   minc2 = (c2 << BOX_C2_SHIFT) + ((1 << C2_SHIFT) >> 1);
        !          1240: 
        !          1241:   /* Determine which colormap entries are close enough to be candidates
        !          1242:    * for the nearest entry to some cell in the update box.
        !          1243:    */
        !          1244: #ifdef ORIGINAL_LIB_JPEG
        !          1245:   numcolors = find_nearby_colors (cinfo, minc0, minc1, minc2, colorlist);
        !          1246: 
        !          1247:   /* Determine the actually nearest colors. */
        !          1248:   find_best_colors (cinfo, minc0, minc1, minc2, numcolors, colorlist,
        !          1249:                    bestcolor);
        !          1250: #else
        !          1251:   numcolors =
        !          1252:     find_nearby_colors (oim, nim, cquantize, minc0, minc1, minc2, colorlist);
        !          1253:   find_best_colors (oim, nim, cquantize, minc0, minc1, minc2, numcolors,
        !          1254:                    colorlist, bestcolor);
        !          1255: #endif
        !          1256: 
        !          1257:   /* Save the best color numbers (plus 1) in the main cache array */
        !          1258:   c0 <<= BOX_C0_LOG;           /* convert ID back to base cell indexes */
        !          1259:   c1 <<= BOX_C1_LOG;
        !          1260:   c2 <<= BOX_C2_LOG;
        !          1261:   cptr = bestcolor;
        !          1262:   for (ic0 = 0; ic0 < BOX_C0_ELEMS; ic0++)
        !          1263:     {
        !          1264:       for (ic1 = 0; ic1 < BOX_C1_ELEMS; ic1++)
        !          1265:        {
        !          1266:          cachep = &histogram[c0 + ic0][c1 + ic1][c2];
        !          1267:          for (ic2 = 0; ic2 < BOX_C2_ELEMS; ic2++)
        !          1268:            {
        !          1269: #ifdef ORIGINAL_LIB_JPEG
        !          1270:              *cachep++ = (histcell) (GETJSAMPLE (*cptr++) + 1);
        !          1271: #else
        !          1272:              *cachep++ = (histcell) ((*cptr++) + 1);
        !          1273: #endif
        !          1274:            }
        !          1275:        }
        !          1276:     }
        !          1277: }
        !          1278: 
        !          1279: 
        !          1280: /*
        !          1281:  * Map some rows of pixels to the output colormapped representation.
        !          1282:  */
        !          1283: 
        !          1284: METHODDEF (void)
        !          1285: #ifndef ORIGINAL_LIB_JPEG
        !          1286: pass2_no_dither (gdImagePtr oim, gdImagePtr nim, my_cquantize_ptr cquantize)
        !          1287: {
        !          1288:   register int *inptr;
        !          1289:   register unsigned char *outptr;
        !          1290:   int width = oim->sx;
        !          1291:   int num_rows = oim->sy;
        !          1292: #else
        !          1293: pass2_no_dither (j_decompress_ptr cinfo,
        !          1294:                 JSAMPARRAY input_buf, JSAMPARRAY output_buf, int num_rows)
        !          1295: /* This version performs no dithering */
        !          1296: {
        !          1297:   my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
        !          1298:   register JSAMPROW inptr, outptr;
        !          1299:   JDIMENSION width = cinfo->output_width;
        !          1300: #endif
        !          1301:   hist3d histogram = cquantize->histogram;
        !          1302:   register int c0, c1, c2;
        !          1303:   int row;
        !          1304:   JDIMENSION col;
        !          1305:   register histptr cachep;
        !          1306: 
        !          1307: 
        !          1308:   for (row = 0; row < num_rows; row++)
        !          1309:     {
        !          1310:       inptr = input_buf[row];
        !          1311:       outptr = output_buf[row];
        !          1312:       for (col = width; col > 0; col--)
        !          1313:        {
        !          1314:          /* get pixel value and index into the cache */
        !          1315:          int r, g, b;
        !          1316: #ifdef ORIGINAL_LIB_JPEG
        !          1317:          r = GETJSAMPLE (*inptr++);
        !          1318:          g = GETJSAMPLE (*inptr++);
        !          1319:          b = GETJSAMPLE (*inptr++);
        !          1320: #else
        !          1321:          r = gdTrueColorGetRed (*inptr);
        !          1322:          g = gdTrueColorGetGreen (*inptr);
        !          1323:          /* 
        !          1324:             2.0.24: inptr must not be incremented until after
        !          1325:             transparency check, if any. Thanks to "Super Pikeman." 
        !          1326:           */
        !          1327:          b = gdTrueColorGetBlue (*inptr);
        !          1328: 
        !          1329:          /* If the pixel is transparent, we assign it the palette index that
        !          1330:           * will later be added at the end of the palette as the transparent
        !          1331:           * index. */
        !          1332:          if ((oim->transparent >= 0) && (oim->transparent == *(inptr - 1)))
        !          1333:            {
        !          1334:              *outptr++ = nim->colorsTotal;
        !          1335:              inptr++;
        !          1336:              continue;
        !          1337:            }
        !          1338:          inptr++;
        !          1339: #endif
        !          1340:          c0 = r >> C0_SHIFT;
        !          1341:          c1 = g >> C1_SHIFT;
        !          1342:          c2 = b >> C2_SHIFT;
        !          1343:          cachep = &histogram[c0][c1][c2];
        !          1344:          /* If we have not seen this color before, find nearest colormap entry */
        !          1345:          /* and update the cache */
        !          1346:          if (*cachep == 0)
        !          1347: #ifdef ORIGINAL_LIB_JPEG
        !          1348:            fill_inverse_cmap (cinfo, c0, c1, c2);
        !          1349: #else
        !          1350:            fill_inverse_cmap (oim, nim, cquantize, c0, c1, c2);
        !          1351: #endif
        !          1352:          /* Now emit the colormap index for this cell */
        !          1353: #ifdef ORIGINAL_LIB_JPEG
        !          1354:          *outptr++ = (JSAMPLE) (*cachep - 1);
        !          1355: #else
        !          1356:          *outptr++ = (*cachep - 1);
        !          1357: #endif
        !          1358:        }
        !          1359:     }
        !          1360: }
        !          1361: 
        !          1362: 
        !          1363: METHODDEF (void)
        !          1364: #ifndef ORIGINAL_LIB_JPEG
        !          1365: pass2_fs_dither (gdImagePtr oim, gdImagePtr nim, my_cquantize_ptr cquantize)
        !          1366: {
        !          1367: #else
        !          1368: pass2_fs_dither (j_decompress_ptr cinfo,
        !          1369:                 JSAMPARRAY input_buf, JSAMPARRAY output_buf, int num_rows)
        !          1370: /* This version performs Floyd-Steinberg dithering */
        !          1371: {
        !          1372:   my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
        !          1373:   JSAMPROW inptr;              /* => current input pixel */
        !          1374: #endif
        !          1375:   hist3d histogram = cquantize->histogram;
        !          1376:   register LOCFSERROR cur0, cur1, cur2;        /* current error or pixel value */
        !          1377:   LOCFSERROR belowerr0, belowerr1, belowerr2;  /* error for pixel below cur */
        !          1378:   LOCFSERROR bpreverr0, bpreverr1, bpreverr2;  /* error for below/prev col */
        !          1379:   register FSERRPTR errorptr;  /* => fserrors[] at column before current */
        !          1380:   histptr cachep;
        !          1381:   int dir;                     /* +1 or -1 depending on direction */
        !          1382:   int dir3;                    /* 3*dir, for advancing inptr & errorptr */
        !          1383:   int row;
        !          1384:   JDIMENSION col;
        !          1385: #ifdef ORIGINAL_LIB_JPEG
        !          1386:   JSAMPROW outptr;             /* => current output pixel */
        !          1387:   JDIMENSION width = cinfo->output_width;
        !          1388:   JSAMPLE *range_limit = cinfo->sample_range_limit;
        !          1389:   JSAMPROW colormap0 = cinfo->colormap[0];
        !          1390:   JSAMPROW colormap1 = cinfo->colormap[1];
        !          1391:   JSAMPROW colormap2 = cinfo->colormap[2];
        !          1392: #else
        !          1393:   int *inptr;                  /* => current input pixel */
        !          1394:   unsigned char *outptr;       /* => current output pixel */
        !          1395:   int width = oim->sx;
        !          1396:   int num_rows = oim->sy;
        !          1397:   int *colormap0 = nim->red;
        !          1398:   int *colormap1 = nim->green;
        !          1399:   int *colormap2 = nim->blue;
        !          1400: #endif
        !          1401:   int *error_limit = cquantize->error_limiter;
        !          1402: 
        !          1403: 
        !          1404:   SHIFT_TEMPS for (row = 0; row < num_rows; row++)
        !          1405:     {
        !          1406:       inptr = input_buf[row];
        !          1407:       outptr = output_buf[row];
        !          1408:       if (cquantize->on_odd_row)
        !          1409:        {
        !          1410:          /* work right to left in this row */
        !          1411:          inptr += (width - 1) * 3;     /* so point to rightmost pixel */
        !          1412:          outptr += width - 1;
        !          1413:          dir = -1;
        !          1414:          dir3 = -3;
        !          1415:          errorptr = cquantize->fserrors + (width + 1) * 3;     /* => entry after last column */
        !          1416: #ifdef ORIGINAL_LIB_JPEG_REVERSE_ODD_ROWS
        !          1417:          cquantize->on_odd_row = FALSE;        /* flip for next time */
        !          1418: #endif
        !          1419:        }
        !          1420:       else
        !          1421:        {
        !          1422:          /* work left to right in this row */
        !          1423:          dir = 1;
        !          1424:          dir3 = 3;
        !          1425:          errorptr = cquantize->fserrors;       /* => entry before first real column */
        !          1426: #ifdef ORIGINAL_LIB_JPEG_REVERSE_ODD_ROWS
        !          1427:          cquantize->on_odd_row = TRUE; /* flip for next time */
        !          1428: #endif
        !          1429:        }
        !          1430:       /* Preset error values: no error propagated to first pixel from left */
        !          1431:       cur0 = cur1 = cur2 = 0;
        !          1432:       /* and no error propagated to row below yet */
        !          1433:       belowerr0 = belowerr1 = belowerr2 = 0;
        !          1434:       bpreverr0 = bpreverr1 = bpreverr2 = 0;
        !          1435: 
        !          1436:       for (col = width; col > 0; col--)
        !          1437:        {
        !          1438: 
        !          1439:          /* If this pixel is transparent, we want to assign it to the special
        !          1440:           * transparency color index past the end of the palette rather than
        !          1441:           * go through matching / dithering. */
        !          1442:          if ((oim->transparent >= 0) && (*inptr == oim->transparent))
        !          1443:            {
        !          1444:              *outptr = nim->colorsTotal;
        !          1445:              errorptr[0] = 0;
        !          1446:              errorptr[1] = 0;
        !          1447:              errorptr[2] = 0;
        !          1448:              errorptr[3] = 0;
        !          1449:              inptr += dir;
        !          1450:              outptr += dir;
        !          1451:              errorptr += dir3;
        !          1452:              continue;
        !          1453:            }
        !          1454:          /* curN holds the error propagated from the previous pixel on the
        !          1455:           * current line.  Add the error propagated from the previous line
        !          1456:           * to form the complete error correction term for this pixel, and
        !          1457:           * round the error term (which is expressed * 16) to an integer.
        !          1458:           * RIGHT_SHIFT rounds towards minus infinity, so adding 8 is correct
        !          1459:           * for either sign of the error value.
        !          1460:           * Note: errorptr points to *previous* column's array entry.
        !          1461:           */
        !          1462:          cur0 = RIGHT_SHIFT (cur0 + errorptr[dir3 + 0] + 8, 4);
        !          1463:          cur1 = RIGHT_SHIFT (cur1 + errorptr[dir3 + 1] + 8, 4);
        !          1464:          cur2 = RIGHT_SHIFT (cur2 + errorptr[dir3 + 2] + 8, 4);
        !          1465:          /* Limit the error using transfer function set by init_error_limit.
        !          1466:           * See comments with init_error_limit for rationale.
        !          1467:           */
        !          1468:          cur0 = error_limit[cur0];
        !          1469:          cur1 = error_limit[cur1];
        !          1470:          cur2 = error_limit[cur2];
        !          1471:          /* Form pixel value + error, and range-limit to 0..MAXJSAMPLE.
        !          1472:           * The maximum error is +- MAXJSAMPLE (or less with error limiting);
        !          1473:           * this sets the required size of the range_limit array.
        !          1474:           */
        !          1475: #ifdef ORIGINAL_LIB_JPEG
        !          1476:          cur0 += GETJSAMPLE (inptr[0]);
        !          1477:          cur1 += GETJSAMPLE (inptr[1]);
        !          1478:          cur2 += GETJSAMPLE (inptr[2]);
        !          1479:          cur0 = GETJSAMPLE (range_limit[cur0]);
        !          1480:          cur1 = GETJSAMPLE (range_limit[cur1]);
        !          1481:          cur2 = GETJSAMPLE (range_limit[cur2]);
        !          1482: #else
        !          1483:          cur0 += gdTrueColorGetRed (*inptr);
        !          1484:          cur1 += gdTrueColorGetGreen (*inptr);
        !          1485:          cur2 += gdTrueColorGetBlue (*inptr);
        !          1486:          range_limit (cur0);
        !          1487:          range_limit (cur1);
        !          1488:          range_limit (cur2);
        !          1489: #endif
        !          1490: 
        !          1491:          /* Index into the cache with adjusted pixel value */
        !          1492:          cachep =
        !          1493:            &histogram[cur0 >> C0_SHIFT][cur1 >> C1_SHIFT][cur2 >> C2_SHIFT];
        !          1494:          /* If we have not seen this color before, find nearest colormap */
        !          1495:          /* entry and update the cache */
        !          1496:          if (*cachep == 0)
        !          1497: #ifdef ORIGINAL_LIB_JPEG
        !          1498:            fill_inverse_cmap (cinfo, cur0 >> C0_SHIFT, cur1 >> C1_SHIFT,
        !          1499:                               cur2 >> C2_SHIFT);
        !          1500: #else
        !          1501:            fill_inverse_cmap (oim, nim, cquantize, cur0 >> C0_SHIFT,
        !          1502:                               cur1 >> C1_SHIFT, cur2 >> C2_SHIFT);
        !          1503: #endif
        !          1504:          /* Now emit the colormap index for this cell */
        !          1505:          {
        !          1506:            register int pixcode = *cachep - 1;
        !          1507:            *outptr = (JSAMPLE) pixcode;
        !          1508:            /* Compute representation error for this pixel */
        !          1509: #define GETJSAMPLE
        !          1510:            cur0 -= GETJSAMPLE (colormap0[pixcode]);
        !          1511:            cur1 -= GETJSAMPLE (colormap1[pixcode]);
        !          1512:            cur2 -= GETJSAMPLE (colormap2[pixcode]);
        !          1513: #undef GETJSAMPLE
        !          1514:          }
        !          1515:          /* Compute error fractions to be propagated to adjacent pixels.
        !          1516:           * Add these into the running sums, and simultaneously shift the
        !          1517:           * next-line error sums left by 1 column.
        !          1518:           */
        !          1519:          {
        !          1520:            register LOCFSERROR bnexterr, delta;
        !          1521: 
        !          1522:            bnexterr = cur0;    /* Process component 0 */
        !          1523:            delta = cur0 * 2;
        !          1524:            cur0 += delta;      /* form error * 3 */
        !          1525:            errorptr[0] = (FSERROR) (bpreverr0 + cur0);
        !          1526:            cur0 += delta;      /* form error * 5 */
        !          1527:            bpreverr0 = belowerr0 + cur0;
        !          1528:            belowerr0 = bnexterr;
        !          1529:            cur0 += delta;      /* form error * 7 */
        !          1530:            bnexterr = cur1;    /* Process component 1 */
        !          1531:            delta = cur1 * 2;
        !          1532:            cur1 += delta;      /* form error * 3 */
        !          1533:            errorptr[1] = (FSERROR) (bpreverr1 + cur1);
        !          1534:            cur1 += delta;      /* form error * 5 */
        !          1535:            bpreverr1 = belowerr1 + cur1;
        !          1536:            belowerr1 = bnexterr;
        !          1537:            cur1 += delta;      /* form error * 7 */
        !          1538:            bnexterr = cur2;    /* Process component 2 */
        !          1539:            delta = cur2 * 2;
        !          1540:            cur2 += delta;      /* form error * 3 */
        !          1541:            errorptr[2] = (FSERROR) (bpreverr2 + cur2);
        !          1542:            cur2 += delta;      /* form error * 5 */
        !          1543:            bpreverr2 = belowerr2 + cur2;
        !          1544:            belowerr2 = bnexterr;
        !          1545:            cur2 += delta;      /* form error * 7 */
        !          1546:          }
        !          1547:          /* At this point curN contains the 7/16 error value to be propagated
        !          1548:           * to the next pixel on the current line, and all the errors for the
        !          1549:           * next line have been shifted over.  We are therefore ready to move on.
        !          1550:           */
        !          1551: #ifdef ORIGINAL_LIB_JPEG
        !          1552:          inptr += dir3;        /* Advance pixel pointers to next column */
        !          1553: #else
        !          1554:          inptr += dir;         /* Advance pixel pointers to next column */
        !          1555: #endif
        !          1556:          outptr += dir;
        !          1557:          errorptr += dir3;     /* advance errorptr to current column */
        !          1558:        }
        !          1559:       /* Post-loop cleanup: we must unload the final error values into the
        !          1560:        * final fserrors[] entry.  Note we need not unload belowerrN because
        !          1561:        * it is for the dummy column before or after the actual array.
        !          1562:        */
        !          1563:       errorptr[0] = (FSERROR) bpreverr0;       /* unload prev errs into array */
        !          1564:       errorptr[1] = (FSERROR) bpreverr1;
        !          1565:       errorptr[2] = (FSERROR) bpreverr2;
        !          1566:     }
        !          1567: }
        !          1568: 
        !          1569: 
        !          1570: /*
        !          1571:  * Initialize the error-limiting transfer function (lookup table).
        !          1572:  * The raw F-S error computation can potentially compute error values of up to
        !          1573:  * +- MAXJSAMPLE.  But we want the maximum correction applied to a pixel to be
        !          1574:  * much less, otherwise obviously wrong pixels will be created.  (Typical
        !          1575:  * effects include weird fringes at color-area boundaries, isolated bright
        !          1576:  * pixels in a dark area, etc.)  The standard advice for avoiding this problem
        !          1577:  * is to ensure that the "corners" of the color cube are allocated as output
        !          1578:  * colors; then repeated errors in the same direction cannot cause cascading
        !          1579:  * error buildup.  However, that only prevents the error from getting
        !          1580:  * completely out of hand; Aaron Giles reports that error limiting improves
        !          1581:  * the results even with corner colors allocated.
        !          1582:  * A simple clamping of the error values to about +- MAXJSAMPLE/8 works pretty
        !          1583:  * well, but the smoother transfer function used below is even better.  Thanks
        !          1584:  * to Aaron Giles for this idea.
        !          1585:  */
        !          1586: 
        !          1587: LOCAL (void)
        !          1588: #ifdef ORIGINAL_LIB_JPEG
        !          1589: init_error_limit (j_decompress_ptr cinfo)
        !          1590: #else
        !          1591: init_error_limit (gdImagePtr oim, gdImagePtr nim, my_cquantize_ptr cquantize)
        !          1592: #endif
        !          1593: /* Allocate and fill in the error_limiter table */
        !          1594: {
        !          1595:   int *table;
        !          1596:   int in, out;
        !          1597: #ifdef ORIGINAL_LIB_JPEG
        !          1598:   my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
        !          1599:   table = (int *) (*cinfo->mem->alloc_small)
        !          1600:     ((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE * 2 + 1) * SIZEOF (int));
        !          1601: #else
        !          1602:   cquantize->error_limiter_storage =
        !          1603:     (int *) safe_emalloc ((MAXJSAMPLE * 2 + 1), sizeof (int), 0);
        !          1604:   if (!cquantize->error_limiter_storage)
        !          1605:     {
        !          1606:       return;
        !          1607:     }
        !          1608:   table = cquantize->error_limiter_storage;
        !          1609: #endif
        !          1610: 
        !          1611:   table += MAXJSAMPLE;         /* so can index -MAXJSAMPLE .. +MAXJSAMPLE */
        !          1612:   cquantize->error_limiter = table;
        !          1613: 
        !          1614: #define STEPSIZE ((MAXJSAMPLE+1)/16)
        !          1615:   /* Map errors 1:1 up to +- MAXJSAMPLE/16 */
        !          1616:   out = 0;
        !          1617:   for (in = 0; in < STEPSIZE; in++, out++)
        !          1618:     {
        !          1619:       table[in] = out;
        !          1620:       table[-in] = -out;
        !          1621:     }
        !          1622:   /* Map errors 1:2 up to +- 3*MAXJSAMPLE/16 */
        !          1623:   for (; in < STEPSIZE * 3; in++, out += (in & 1) ? 0 : 1)
        !          1624:     {
        !          1625:       table[in] = out;
        !          1626:       table[-in] = -out;
        !          1627:     }
        !          1628:   /* Clamp the rest to final out value (which is (MAXJSAMPLE+1)/8) */
        !          1629:   for (; in <= MAXJSAMPLE; in++)
        !          1630:     {
        !          1631:       table[in] = out;
        !          1632:       table[-in] = -out;
        !          1633:     }
        !          1634: #undef STEPSIZE
        !          1635: }
        !          1636: 
        !          1637: 
        !          1638: /*
        !          1639:  * Finish up at the end of each pass.
        !          1640:  */
        !          1641: 
        !          1642: #ifdef ORIGINAL_LIB_JPEG
        !          1643: METHODDEF (void)
        !          1644: finish_pass1 (j_decompress_ptr cinfo)
        !          1645: {
        !          1646:   my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
        !          1647: 
        !          1648:   /* Select the representative colors and fill in cinfo->colormap */
        !          1649:   cinfo->colormap = cquantize->sv_colormap;
        !          1650:   select_colors (cinfo, cquantize->desired);
        !          1651:   /* Force next pass to zero the color index table */
        !          1652:   cquantize->needs_zeroed = TRUE;
        !          1653: }
        !          1654: 
        !          1655: 
        !          1656: METHODDEF (void)
        !          1657: finish_pass2 (j_decompress_ptr cinfo)
        !          1658: {
        !          1659:   /* no work */
        !          1660: }
        !          1661: 
        !          1662: /*
        !          1663:  * Initialize for each processing pass.
        !          1664:  */
        !          1665: 
        !          1666: METHODDEF (void)
        !          1667: start_pass_2_quant (j_decompress_ptr cinfo, boolean is_pre_scan)
        !          1668: {
        !          1669:   my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
        !          1670:   hist3d histogram = cquantize->histogram;
        !          1671:   int i;
        !          1672: 
        !          1673:   /* Only F-S dithering or no dithering is supported. */
        !          1674:   /* If user asks for ordered dither, give him F-S. */
        !          1675:   if (cinfo->dither_mode != JDITHER_NONE)
        !          1676:     cinfo->dither_mode = JDITHER_FS;
        !          1677: 
        !          1678:   if (is_pre_scan)
        !          1679:     {
        !          1680:       /* Set up method pointers */
        !          1681:       cquantize->pub.color_quantize = prescan_quantize;
        !          1682:       cquantize->pub.finish_pass = finish_pass1;
        !          1683:       cquantize->needs_zeroed = TRUE;  /* Always zero histogram */
        !          1684:     }
        !          1685:   else
        !          1686:     {
        !          1687:       /* Set up method pointers */
        !          1688:       if (cinfo->dither_mode == JDITHER_FS)
        !          1689:        cquantize->pub.color_quantize = pass2_fs_dither;
        !          1690:       else
        !          1691:        cquantize->pub.color_quantize = pass2_no_dither;
        !          1692:       cquantize->pub.finish_pass = finish_pass2;
        !          1693: 
        !          1694:       /* Make sure color count is acceptable */
        !          1695:       i = cinfo->actual_number_of_colors;
        !          1696:       if (i < 1)
        !          1697:        ERREXIT1 (cinfo, JERR_QUANT_FEW_COLORS, 1);
        !          1698:       if (i > MAXNUMCOLORS)
        !          1699:        ERREXIT1 (cinfo, JERR_QUANT_MANY_COLORS, MAXNUMCOLORS);
        !          1700: 
        !          1701:       if (cinfo->dither_mode == JDITHER_FS)
        !          1702:        {
        !          1703:          size_t arraysize = (size_t) ((cinfo->output_width + 2) *
        !          1704:                                       (3 * SIZEOF (FSERROR)));
        !          1705:          /* Allocate Floyd-Steinberg workspace if we didn't already. */
        !          1706:          if (cquantize->fserrors == NULL)
        !          1707:            cquantize->fserrors = (FSERRPTR) (*cinfo->mem->alloc_large)
        !          1708:              ((j_common_ptr) cinfo, JPOOL_IMAGE, arraysize);
        !          1709:          /* Initialize the propagated errors to zero. */
        !          1710:          jzero_far ((void FAR *) cquantize->fserrors, arraysize);
        !          1711:          /* Make the error-limit table if we didn't already. */
        !          1712:          if (cquantize->error_limiter == NULL)
        !          1713:            init_error_limit (cinfo);
        !          1714:          cquantize->on_odd_row = FALSE;
        !          1715:        }
        !          1716: 
        !          1717:     }
        !          1718:   /* Zero the histogram or inverse color map, if necessary */
        !          1719:   if (cquantize->needs_zeroed)
        !          1720:     {
        !          1721:       for (i = 0; i < HIST_C0_ELEMS; i++)
        !          1722:        {
        !          1723:          jzero_far ((void FAR *) histogram[i],
        !          1724:                     HIST_C1_ELEMS * HIST_C2_ELEMS * SIZEOF (histcell));
        !          1725:        }
        !          1726:       cquantize->needs_zeroed = FALSE;
        !          1727:     }
        !          1728: }
        !          1729: 
        !          1730: 
        !          1731: /*
        !          1732:  * Switch to a new external colormap between output passes.
        !          1733:  */
        !          1734: 
        !          1735: METHODDEF (void)
        !          1736: new_color_map_2_quant (j_decompress_ptr cinfo)
        !          1737: {
        !          1738:   my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize;
        !          1739: 
        !          1740:   /* Reset the inverse color map */
        !          1741:   cquantize->needs_zeroed = TRUE;
        !          1742: }
        !          1743: #else
        !          1744: static void
        !          1745: zeroHistogram (hist3d histogram)
        !          1746: {
        !          1747:   int i;
        !          1748:   /* Zero the histogram or inverse color map */
        !          1749:   for (i = 0; i < HIST_C0_ELEMS; i++)
        !          1750:     {
        !          1751:       memset (histogram[i],
        !          1752:              0, HIST_C1_ELEMS * HIST_C2_ELEMS * sizeof (histcell));
        !          1753:     }
        !          1754: }
        !          1755: #endif
        !          1756: 
        !          1757: static void gdImageTrueColorToPaletteBody (gdImagePtr oim, int dither, int colorsWanted, gdImagePtr *cimP);
        !          1758: 
        !          1759: gdImagePtr gdImageCreatePaletteFromTrueColor (gdImagePtr im, int dither, int colorsWanted)
        !          1760: {
        !          1761:        gdImagePtr nim;
        !          1762:        gdImageTrueColorToPaletteBody(im, dither, colorsWanted, &nim);
        !          1763:        return nim;
        !          1764: }
        !          1765: 
        !          1766: void gdImageTrueColorToPalette (gdImagePtr im, int dither, int colorsWanted)
        !          1767: {
        !          1768:        gdImageTrueColorToPaletteBody(im, dither, colorsWanted, 0);
        !          1769: }
        !          1770: 
        !          1771: /*
        !          1772:  * Module initialization routine for 2-pass color quantization.
        !          1773:  */
        !          1774: 
        !          1775: #ifdef ORIGINAL_LIB_JPEG
        !          1776: GLOBAL (void)
        !          1777: jinit_2pass_quantizer (j_decompress_ptr cinfo)
        !          1778: #else
        !          1779: static void gdImageTrueColorToPaletteBody (gdImagePtr oim, int dither, int colorsWanted, gdImagePtr *cimP)
        !          1780: #endif
        !          1781: {
        !          1782:   my_cquantize_ptr cquantize = NULL;
        !          1783:   int i;
        !          1784: 
        !          1785: #ifndef ORIGINAL_LIB_JPEG
        !          1786:   /* Allocate the JPEG palette-storage */
        !          1787:   size_t arraysize;
        !          1788:   int maxColors = gdMaxColors;
        !          1789:   gdImagePtr nim;
        !          1790:   if (cimP) {
        !          1791:     nim = gdImageCreate(oim->sx, oim->sy);
        !          1792:     *cimP = nim;
        !          1793:     if (!nim) {
        !          1794:       return;
        !          1795:     }
        !          1796:   } else {
        !          1797:     nim = oim;
        !          1798:   }     
        !          1799:   if (!oim->trueColor)
        !          1800:     {
        !          1801:       /* (Almost) nothing to do! */
        !          1802:       if (cimP) {
        !          1803:         gdImageCopy(nim, oim, 0, 0, 0, 0, oim->sx, oim->sy);
        !          1804:         *cimP = nim;
        !          1805:       }
        !          1806:       return;
        !          1807:     }
        !          1808: 
        !          1809:   /* If we have a transparent color (the alphaless mode of transparency), we
        !          1810:    * must reserve a palette entry for it at the end of the palette. */
        !          1811:   if (oim->transparent >= 0)
        !          1812:     {
        !          1813:       maxColors--;
        !          1814:     }
        !          1815:   if (colorsWanted > maxColors)
        !          1816:     {
        !          1817:       colorsWanted = maxColors;
        !          1818:     }
        !          1819:   if (!cimP) {
        !          1820:     nim->pixels = gdCalloc (sizeof (unsigned char *), oim->sy);
        !          1821:     if (!nim->pixels)
        !          1822:       {
        !          1823:         /* No can do */
        !          1824:         goto outOfMemory;
        !          1825:       }
        !          1826:     for (i = 0; (i < nim->sy); i++)
        !          1827:       {
        !          1828:         nim->pixels[i] = gdCalloc (sizeof (unsigned char *), oim->sx);
        !          1829:         if (!nim->pixels[i])
        !          1830:        {
        !          1831:          goto outOfMemory;
        !          1832:        }
        !          1833:       }
        !          1834:   }
        !          1835: #endif
        !          1836: 
        !          1837: #ifdef ORIGINAL_LIB_JPEG
        !          1838:   cquantize = (my_cquantize_ptr)
        !          1839:     (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
        !          1840:                                SIZEOF (my_cquantizer));
        !          1841:   cinfo->cquantize = (struct jpeg_color_quantizer *) cquantize;
        !          1842:   cquantize->pub.start_pass = start_pass_2_quant;
        !          1843:   cquantize->pub.new_color_map = new_color_map_2_quant;
        !          1844:   /* Make sure jdmaster didn't give me a case I can't handle */
        !          1845:   if (cinfo->out_color_components != 3)
        !          1846:     ERREXIT (cinfo, JERR_NOTIMPL);
        !          1847: #else
        !          1848:   cquantize = (my_cquantize_ptr) gdCalloc (sizeof (my_cquantizer), 1);
        !          1849:   if (!cquantize)
        !          1850:     {
        !          1851:       /* No can do */
        !          1852:       goto outOfMemory;
        !          1853:     }
        !          1854: #endif
        !          1855:   cquantize->fserrors = NULL;  /* flag optional arrays not allocated */
        !          1856:   cquantize->error_limiter = NULL;
        !          1857: 
        !          1858: 
        !          1859:   /* Allocate the histogram/inverse colormap storage */
        !          1860: #ifdef ORIGINAL_LIB_JPEG
        !          1861:   cquantize->histogram = (hist3d) (*cinfo->mem->alloc_small)
        !          1862:     ((j_common_ptr) cinfo, JPOOL_IMAGE, HIST_C0_ELEMS * SIZEOF (hist2d));
        !          1863:   for (i = 0; i < HIST_C0_ELEMS; i++)
        !          1864:     {
        !          1865:       cquantize->histogram[i] = (hist2d) (*cinfo->mem->alloc_large)
        !          1866:        ((j_common_ptr) cinfo, JPOOL_IMAGE,
        !          1867:         HIST_C1_ELEMS * HIST_C2_ELEMS * SIZEOF (histcell));
        !          1868:     }
        !          1869:   cquantize->needs_zeroed = TRUE;      /* histogram is garbage now */
        !          1870: #else
        !          1871:   cquantize->histogram = (hist3d) safe_emalloc (HIST_C0_ELEMS, sizeof (hist2d), 0);
        !          1872:   for (i = 0; i < HIST_C0_ELEMS; i++)
        !          1873:     {
        !          1874:       cquantize->histogram[i] =
        !          1875:        (hist2d) safe_emalloc (HIST_C1_ELEMS * HIST_C2_ELEMS, sizeof (histcell), 0);
        !          1876:       if (!cquantize->histogram[i])
        !          1877:        {
        !          1878:          goto outOfMemory;
        !          1879:        }
        !          1880:     }
        !          1881: #endif
        !          1882: 
        !          1883: #ifdef ORIGINAL_LIB_JPEG
        !          1884:   /* Allocate storage for the completed colormap, if required.
        !          1885:    * We do this now since it is FAR storage and may affect
        !          1886:    * the memory manager's space calculations.
        !          1887:    */
        !          1888:   if (cinfo->enable_2pass_quant)
        !          1889:     {
        !          1890:       /* Make sure color count is acceptable */
        !          1891:       int desired = cinfo->desired_number_of_colors;
        !          1892:       /* Lower bound on # of colors ... somewhat arbitrary as long as > 0 */
        !          1893:       if (desired < 8)
        !          1894:        ERREXIT1 (cinfo, JERR_QUANT_FEW_COLORS, 8);
        !          1895:       /* Make sure colormap indexes can be represented by JSAMPLEs */
        !          1896:       if (desired > MAXNUMCOLORS)
        !          1897:        ERREXIT1 (cinfo, JERR_QUANT_MANY_COLORS, MAXNUMCOLORS);
        !          1898:       cquantize->sv_colormap = (*cinfo->mem->alloc_sarray)
        !          1899:        ((j_common_ptr) cinfo, JPOOL_IMAGE, (JDIMENSION) desired,
        !          1900:         (JDIMENSION) 3);
        !          1901:       cquantize->desired = desired;
        !          1902:     }
        !          1903:   else
        !          1904:     cquantize->sv_colormap = NULL;
        !          1905: 
        !          1906:   /* Only F-S dithering or no dithering is supported. */
        !          1907:   /* If user asks for ordered dither, give him F-S. */
        !          1908:   if (cinfo->dither_mode != JDITHER_NONE)
        !          1909:     cinfo->dither_mode = JDITHER_FS;
        !          1910: 
        !          1911:   /* Allocate Floyd-Steinberg workspace if necessary.
        !          1912:    * This isn't really needed until pass 2, but again it is FAR storage.
        !          1913:    * Although we will cope with a later change in dither_mode,
        !          1914:    * we do not promise to honor max_memory_to_use if dither_mode changes.
        !          1915:    */
        !          1916:   if (cinfo->dither_mode == JDITHER_FS)
        !          1917:     {
        !          1918:       cquantize->fserrors = (FSERRPTR) (*cinfo->mem->alloc_large)
        !          1919:        ((j_common_ptr) cinfo, JPOOL_IMAGE,
        !          1920:         (size_t) ((cinfo->output_width + 2) * (3 * SIZEOF (FSERROR))));
        !          1921:       /* Might as well create the error-limiting table too. */
        !          1922:       init_error_limit (cinfo);
        !          1923:     }
        !          1924: #else
        !          1925: 
        !          1926:   cquantize->fserrors = (FSERRPTR) safe_emalloc (3, sizeof (FSERROR), 0);
        !          1927:   init_error_limit (oim, nim, cquantize);
        !          1928:   arraysize = (size_t) ((nim->sx + 2) * (3 * sizeof (FSERROR)));
        !          1929:   /* Allocate Floyd-Steinberg workspace. */
        !          1930:   cquantize->fserrors = gdRealloc(cquantize->fserrors, arraysize);
        !          1931:   memset(cquantize->fserrors, 0, arraysize);
        !          1932:   if (!cquantize->fserrors)
        !          1933:     {
        !          1934:       goto outOfMemory;
        !          1935:     }
        !          1936:   cquantize->on_odd_row = FALSE;
        !          1937: 
        !          1938:   /* Do the work! */
        !          1939:   zeroHistogram (cquantize->histogram);
        !          1940:   prescan_quantize (oim, nim, cquantize);
        !          1941:   /* TBB 2.0.5: pass colorsWanted, not 256! */
        !          1942:   select_colors (oim, nim, cquantize, colorsWanted);
        !          1943:   zeroHistogram (cquantize->histogram);
        !          1944:   if (dither)
        !          1945:     {
        !          1946:       pass2_fs_dither (oim, nim, cquantize);
        !          1947:     }
        !          1948:   else
        !          1949:     {
        !          1950:       pass2_no_dither (oim, nim, cquantize);
        !          1951:     }
        !          1952: #if 0                          /* 2.0.12; we no longer attempt full alpha in palettes */
        !          1953:   if (cquantize->transparentIsPresent)
        !          1954:     {
        !          1955:       int mt = -1;
        !          1956:       int mtIndex = -1;
        !          1957:       for (i = 0; (i < im->colorsTotal); i++)
        !          1958:        {
        !          1959:          if (im->alpha[i] > mt)
        !          1960:            {
        !          1961:              mtIndex = i;
        !          1962:              mt = im->alpha[i];
        !          1963:            }
        !          1964:        }
        !          1965:       for (i = 0; (i < im->colorsTotal); i++)
        !          1966:        {
        !          1967:          if (im->alpha[i] == mt)
        !          1968:            {
        !          1969:              im->alpha[i] = gdAlphaTransparent;
        !          1970:            }
        !          1971:        }
        !          1972:     }
        !          1973:   if (cquantize->opaqueIsPresent)
        !          1974:     {
        !          1975:       int mo = 128;
        !          1976:       int moIndex = -1;
        !          1977:       for (i = 0; (i < im->colorsTotal); i++)
        !          1978:        {
        !          1979:          if (im->alpha[i] < mo)
        !          1980:            {
        !          1981:              moIndex = i;
        !          1982:              mo = im->alpha[i];
        !          1983:            }
        !          1984:        }
        !          1985:       for (i = 0; (i < im->colorsTotal); i++)
        !          1986:        {
        !          1987:          if (im->alpha[i] == mo)
        !          1988:            {
        !          1989:              im->alpha[i] = gdAlphaOpaque;
        !          1990:            }
        !          1991:        }
        !          1992:     }
        !          1993: #endif
        !          1994: 
        !          1995:   /* If we had a 'transparent' color, increment the color count so it's
        !          1996:    * officially in the palette and convert the transparent variable to point to
        !          1997:    * an index rather than a color (Its data already exists and transparent
        !          1998:    * pixels have already been mapped to it by this point, it is done late as to
        !          1999:    * avoid color matching / dithering with it). */
        !          2000:   if (oim->transparent >= 0)
        !          2001:     {
        !          2002:       nim->transparent = nim->colorsTotal;
        !          2003:       nim->colorsTotal++;
        !          2004:     }
        !          2005: 
        !          2006:   /* Success! Get rid of the truecolor image data. */
        !          2007:   if (!cimP) { 
        !          2008:     oim->trueColor = 0;
        !          2009:     /* Junk the truecolor pixels */
        !          2010:     for (i = 0; i < oim->sy; i++)
        !          2011:       {
        !          2012:         gdFree (oim->tpixels[i]);
        !          2013:       }
        !          2014:     gdFree (oim->tpixels);
        !          2015:     oim->tpixels = 0;
        !          2016:   }
        !          2017:   goto success;
        !          2018:   /* Tediously free stuff. */
        !          2019: outOfMemory:
        !          2020:   if (oim->trueColor)
        !          2021:     {
        !          2022:       if (!cimP) {
        !          2023:         /* On failure only */
        !          2024:         for (i = 0; i < nim->sy; i++)
        !          2025:        {
        !          2026:          if (nim->pixels[i])
        !          2027:            {
        !          2028:              gdFree (nim->pixels[i]);
        !          2029:            }
        !          2030:        }
        !          2031:         if (nim->pixels)
        !          2032:        {
        !          2033:          gdFree (nim->pixels);
        !          2034:        }
        !          2035:         nim->pixels = 0;
        !          2036:       } else {
        !          2037:         gdImageDestroy(nim);
        !          2038:         *cimP = 0;
        !          2039:       }
        !          2040:     }
        !          2041: success:
        !          2042:   for (i = 0; i < HIST_C0_ELEMS; i++)
        !          2043:     {
        !          2044:       if (cquantize->histogram[i])
        !          2045:        {
        !          2046:          gdFree (cquantize->histogram[i]);
        !          2047:        }
        !          2048:     }
        !          2049:   if (cquantize->histogram)
        !          2050:     {
        !          2051:       gdFree (cquantize->histogram);
        !          2052:     }
        !          2053:   if (cquantize->fserrors)
        !          2054:     {
        !          2055:       gdFree (cquantize->fserrors);
        !          2056:     }
        !          2057:   if (cquantize->error_limiter_storage)
        !          2058:     {
        !          2059:       gdFree (cquantize->error_limiter_storage);
        !          2060:     }
        !          2061:   if (cquantize)
        !          2062:     {
        !          2063:       gdFree (cquantize);
        !          2064:     }
        !          2065: 
        !          2066: #endif
        !          2067: }
        !          2068: 
        !          2069: 
        !          2070: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>