color.c

Go to the documentation of this file.
00001 /*
00002 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00003 %                                                                             %
00004 %                                                                             %
00005 %                       CCCC   OOO   L       OOO   RRRR                       %
00006 %                      C      O   O  L      O   O  R   R                      %
00007 %                      C      O   O  L      O   O  RRRR                       %
00008 %                      C      O   O  L      O   O  R R                        %
00009 %                       CCCC   OOO   LLLLL   OOO   R  R                       %
00010 %                                                                             %
00011 %                                                                             %
00012 %                          MagickCore Color Methods                           %
00013 %                                                                             %
00014 %                              Software Design                                %
00015 %                                John Cristy                                  %
00016 %                                 July 1992                                   %
00017 %                                                                             %
00018 %                                                                             %
00019 %  Copyright 1999-2008 ImageMagick Studio LLC, a non-profit organization      %
00020 %  dedicated to making software imaging solutions freely available.           %
00021 %                                                                             %
00022 %  You may not use this file except in compliance with the License.  You may  %
00023 %  obtain a copy of the License at                                            %
00024 %                                                                             %
00025 %    http://www.imagemagick.org/script/license.php                            %
00026 %                                                                             %
00027 %  Unless required by applicable law or agreed to in writing, software        %
00028 %  distributed under the License is distributed on an "AS IS" BASIS,          %
00029 %  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
00030 %  See the License for the specific language governing permissions and        %
00031 %  limitations under the License.                                             %
00032 %                                                                             %
00033 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00034 %
00035 %  We use linked-lists because splay-trees do not currently support duplicate
00036 %  key / value pairs (.e.g X11 green compliance and SVG green compliance).
00037 %
00038 */
00039 
00040 /*
00041   Include declarations.
00042 */
00043 #include "magick/studio.h"
00044 #include "magick/blob.h"
00045 #include "magick/cache-view.h"
00046 #include "magick/cache.h"
00047 #include "magick/color.h"
00048 #include "magick/color-private.h"
00049 #include "magick/client.h"
00050 #include "magick/configure.h"
00051 #include "magick/exception.h"
00052 #include "magick/exception-private.h"
00053 #include "magick/gem.h"
00054 #include "magick/geometry.h"
00055 #include "magick/image-private.h"
00056 #include "magick/memory_.h"
00057 #include "magick/monitor.h"
00058 #include "magick/monitor-private.h"
00059 #include "magick/option.h"
00060 #include "magick/pixel-private.h"
00061 #include "magick/quantize.h"
00062 #include "magick/quantum.h"
00063 #include "magick/semaphore.h"
00064 #include "magick/string_.h"
00065 #include "magick/token.h"
00066 #include "magick/utility.h"
00067 #include "magick/xml-tree.h"
00068 
00069 /*
00070   Define declarations.
00071 */
00072 #define ColorFilename  "colors.xml"
00073 #define MaxTreeDepth  8
00074 #define NodesInAList  1536
00075 
00076 /*
00077   Declare color map.
00078 */
00079 static const char
00080   *ColorMap = (const char *)
00081     "<?xml version=\"1.0\"?>"
00082     "<colormap>"
00083     "  <color name=\"none\" color=\"rgba(0,0,0,0)\" compliance=\"SVG\" />"
00084     "  <color name=\"black\" color=\"rgb(0,0,0)\" compliance=\"SVG, X11, XPM\" />"
00085     "  <color name=\"red\" color=\"rgb(255,0,0)\" compliance=\"SVG, X11, XPM\" />"
00086     "  <color name=\"magenta\" color=\"rgb(255,0,255)\" compliance=\"SVG, X11, XPM\" />"
00087     "  <color name=\"green\" color=\"rgb(0,128,0)\" compliance=\"SVG\" />"
00088     "  <color name=\"cyan\" color=\"rgb(0,255,255)\" compliance=\"SVG, X11, XPM\" />"
00089     "  <color name=\"blue\" color=\"rgb(0,0,255)\" compliance=\"SVG, X11, XPM\" />"
00090     "  <color name=\"yellow\" color=\"rgb(255,255,0)\" compliance=\"SVG, X11, XPM\" />"
00091     "  <color name=\"white\" color=\"rgb(255,255,255)\" compliance=\"SVG, X11\" />"
00092     "  <color name=\"AliceBlue\" color=\"rgb(240,248,255)\" compliance=\"SVG, X11, XPM\" />"
00093     "  <color name=\"AntiqueWhite\" color=\"rgb(250,235,215)\" compliance=\"SVG, X11, XPM\" />"
00094     "  <color name=\"aqua\" color=\"rgb(0,255,255)\" compliance=\"SVG\" />"
00095     "  <color name=\"aquamarine\" color=\"rgb(127,255,212)\" compliance=\"SVG, X11, XPM\" />"
00096     "  <color name=\"azure\" color=\"rgb(240,255,255)\" compliance=\"SVG, X11, XPM\" />"
00097     "  <color name=\"beige\" color=\"rgb(245,245,220)\" compliance=\"SVG, X11, XPM\" />"
00098     "  <color name=\"bisque\" color=\"rgb(255,228,196)\" compliance=\"SVG, X11, XPM\" />"
00099     "  <color name=\"BlanchedAlmond\" color=\"rgb(255,235,205)\" compliance=\"SVG, X11, XPM\" />"
00100     "  <color name=\"BlueViolet\" color=\"rgb(138,43,226)\" compliance=\"SVG, X11, XPM\" />"
00101     "  <color name=\"brown\" color=\"rgb(165,42,42)\" compliance=\"SVG, X11, XPM\" />"
00102     "  <color name=\"burlywood\" color=\"rgb(222,184,135)\" compliance=\"SVG, X11, XPM\" />"
00103     "  <color name=\"CadetBlue\" color=\"rgb(95,158,160)\" compliance=\"SVG, X11, XPM\" />"
00104     "  <color name=\"chartreuse\" color=\"rgb(127,255,0)\" compliance=\"SVG, X11, XPM\" />"
00105     "  <color name=\"chocolate\" color=\"rgb(210,105,30)\" compliance=\"SVG, X11, XPM\" />"
00106     "  <color name=\"coral\" color=\"rgb(255,127,80)\" compliance=\"SVG, X11, XPM\" />"
00107     "  <color name=\"CornflowerBlue\" color=\"rgb(100,149,237)\" compliance=\"SVG, X11, XPM\" />"
00108     "  <color name=\"cornsilk\" color=\"rgb(255,248,220)\" compliance=\"SVG, X11, XPM\" />"
00109     "  <color name=\"crimson\" color=\"rgb(220,20,60)\" compliance=\"SVG\" />"
00110     "  <color name=\"DarkBlue\" color=\"rgb(0,0,139)\" compliance=\"SVG, X11\" />"
00111     "  <color name=\"DarkCyan\" color=\"rgb(0,139,139)\" compliance=\"SVG, X11\" />"
00112     "  <color name=\"DarkGoldenrod\" color=\"rgb(184,134,11)\" compliance=\"SVG, X11, XPM\" />"
00113     "  <color name=\"DarkGray\" color=\"rgb(169,169,169)\" compliance=\"SVG, X11\" />"
00114     "  <color name=\"DarkGreen\" color=\"rgb(0,100,0)\" compliance=\"SVG, X11, XPM\" />"
00115     "  <color name=\"DarkGrey\" color=\"rgb(169,169,169)\" compliance=\"SVG, X11\" />"
00116     "  <color name=\"DarkKhaki\" color=\"rgb(189,183,107)\" compliance=\"SVG, X11, XPM\" />"
00117     "  <color name=\"DarkMagenta\" color=\"rgb(139,0,139)\" compliance=\"SVG, X11\" />"
00118     "  <color name=\"DarkOliveGreen\" color=\"rgb(85,107,47)\" compliance=\"SVG, X11, XPM\" />"
00119     "  <color name=\"DarkOrange\" color=\"rgb(255,140,0)\" compliance=\"SVG, X11, XPM\" />"
00120     "  <color name=\"DarkOrchid\" color=\"rgb(153,50,204)\" compliance=\"SVG, X11, XPM\" />"
00121     "  <color name=\"DarkRed\" color=\"rgb(139,0,0)\" compliance=\"SVG, X11\" />"
00122     "  <color name=\"DarkSalmon\" color=\"rgb(233,150,122)\" compliance=\"SVG, X11, XPM\" />"
00123     "  <color name=\"DarkSeaGreen\" color=\"rgb(143,188,143)\" compliance=\"SVG, X11, XPM\" />"
00124     "  <color name=\"DarkSlateBlue\" color=\"rgb(72,61,139)\" compliance=\"SVG, X11, XPM\" />"
00125     "  <color name=\"DarkSlateGray\" color=\"rgb(47,79,79)\" compliance=\"SVG, X11, XPM\" />"
00126     "  <color name=\"DarkSlateGrey\" color=\"rgb(47,79,79)\" compliance=\"SVG, X11\" />"
00127     "  <color name=\"DarkTurquoise\" color=\"rgb(0,206,209)\" compliance=\"SVG, X11, XPM\" />"
00128     "  <color name=\"DarkViolet\" color=\"rgb(148,0,211)\" compliance=\"SVG, X11, XPM\" />"
00129     "  <color name=\"DeepPink\" color=\"rgb(255,20,147)\" compliance=\"SVG, X11, XPM\" />"
00130     "  <color name=\"DeepSkyBlue\" color=\"rgb(0,191,255)\" compliance=\"SVG, X11, XPM\" />"
00131     "  <color name=\"DimGray\" color=\"rgb(105,105,105)\" compliance=\"SVG, X11, XPM\" />"
00132     "  <color name=\"DimGrey\" color=\"rgb(105,105,105)\" compliance=\"SVG, X11\" />"
00133     "  <color name=\"DodgerBlue\" color=\"rgb(30,144,255)\" compliance=\"SVG, X11, XPM\" />"
00134     "  <color name=\"firebrick\" color=\"rgb(178,34,34)\" compliance=\"SVG, X11, XPM\" />"
00135     "  <color name=\"FloralWhite\" color=\"rgb(255,250,240)\" compliance=\"SVG, X11, XPM\" />"
00136     "  <color name=\"ForestGreen\" color=\"rgb(34,139,34)\" compliance=\"SVG, X11, XPM\" />"
00137     "  <color name=\"fractal\" color=\"rgb(128,128,128)\" compliance=\"SVG\" />"
00138     "  <color name=\"fuchsia\" color=\"rgb(255,0,255)\" compliance=\"SVG\" />"
00139     "  <color name=\"gainsboro\" color=\"rgb(220,220,220)\" compliance=\"SVG, X11, XPM\" />"
00140     "  <color name=\"GhostWhite\" color=\"rgb(248,248,255)\" compliance=\"SVG, X11, XPM\" />"
00141     "  <color name=\"gold\" color=\"rgb(255,215,0)\" compliance=\"X11, XPM\" />"
00142     "  <color name=\"goldenrod\" color=\"rgb(218,165,32)\" compliance=\"SVG, X11, XPM\" />"
00143     "  <color name=\"gray\" color=\"rgb(126,126,126)\" compliance=\"SVG\" />"
00144     "  <color name=\"gray74\" color=\"rgb(189,189,189)\" compliance=\"SVG, X11\" />"
00145     "  <color name=\"gray100\" color=\"rgb(255,255,255)\" compliance=\"SVG, X11\" />"
00146     "  <color name=\"grey\" color=\"rgb(190,190,190)\" compliance=\"SVG, X11\" />"
00147     "  <color name=\"grey0\" color=\"rgb(0,0,0)\" compliance=\"SVG, X11\" />"
00148     "  <color name=\"grey1\" color=\"rgb(3,3,3)\" compliance=\"SVG, X11\" />"
00149     "  <color name=\"grey10\" color=\"rgb(26,26,26)\" compliance=\"SVG, X11\" />"
00150     "  <color name=\"grey100\" color=\"rgb(255,255,255)\" compliance=\"SVG, X11\" />"
00151     "  <color name=\"grey11\" color=\"rgb(28,28,28)\" compliance=\"SVG, X11\" />"
00152     "  <color name=\"grey12\" color=\"rgb(31,31,31)\" compliance=\"SVG, X11\" />"
00153     "  <color name=\"grey13\" color=\"rgb(33,33,33)\" compliance=\"SVG, X11\" />"
00154     "  <color name=\"grey14\" color=\"rgb(36,36,36)\" compliance=\"SVG, X11\" />"
00155     "  <color name=\"grey15\" color=\"rgb(38,38,38)\" compliance=\"SVG, X11\" />"
00156     "  <color name=\"grey16\" color=\"rgb(41,41,41)\" compliance=\"SVG, X11\" />"
00157     "  <color name=\"grey17\" color=\"rgb(43,43,43)\" compliance=\"SVG, X11\" />"
00158     "  <color name=\"grey18\" color=\"rgb(45,45,45)\" compliance=\"SVG, X11\" />"
00159     "  <color name=\"grey19\" color=\"rgb(48,48,48)\" compliance=\"SVG, X11\" />"
00160     "  <color name=\"grey2\" color=\"rgb(5,5,5)\" compliance=\"SVG, X11\" />"
00161     "  <color name=\"grey20\" color=\"rgb(51,51,51)\" compliance=\"SVG, X11\" />"
00162     "  <color name=\"grey21\" color=\"rgb(54,54,54)\" compliance=\"SVG, X11\" />"
00163     "  <color name=\"grey22\" color=\"rgb(56,56,56)\" compliance=\"SVG, X11\" />"
00164     "  <color name=\"grey23\" color=\"rgb(59,59,59)\" compliance=\"SVG, X11\" />"
00165     "  <color name=\"grey24\" color=\"rgb(61,61,61)\" compliance=\"SVG, X11\" />"
00166     "  <color name=\"grey25\" color=\"rgb(64,64,64)\" compliance=\"SVG, X11\" />"
00167     "  <color name=\"grey26\" color=\"rgb(66,66,66)\" compliance=\"SVG, X11\" />"
00168     "  <color name=\"grey27\" color=\"rgb(69,69,69)\" compliance=\"SVG, X11\" />"
00169     "  <color name=\"grey28\" color=\"rgb(71,71,71)\" compliance=\"SVG, X11\" />"
00170     "  <color name=\"grey29\" color=\"rgb(74,74,74)\" compliance=\"SVG, X11\" />"
00171     "  <color name=\"grey3\" color=\"rgb(8,8,8)\" compliance=\"SVG, X11\" />"
00172     "  <color name=\"grey30\" color=\"rgb(77,77,77)\" compliance=\"SVG, X11\" />"
00173     "  <color name=\"grey31\" color=\"rgb(79,79,79)\" compliance=\"SVG, X11\" />"
00174     "  <color name=\"grey32\" color=\"rgb(82,82,82)\" compliance=\"SVG, X11\" />"
00175     "  <color name=\"grey33\" color=\"rgb(84,84,84)\" compliance=\"SVG, X11\" />"
00176     "  <color name=\"grey34\" color=\"rgb(87,87,87)\" compliance=\"SVG, X11\" />"
00177     "  <color name=\"grey35\" color=\"rgb(89,89,89)\" compliance=\"SVG, X11\" />"
00178     "  <color name=\"grey36\" color=\"rgb(92,92,92)\" compliance=\"SVG, X11\" />"
00179     "  <color name=\"grey37\" color=\"rgb(94,94,94)\" compliance=\"SVG, X11\" />"
00180     "  <color name=\"grey38\" color=\"rgb(97,97,97)\" compliance=\"SVG, X11\" />"
00181     "  <color name=\"grey39\" color=\"rgb(99,99,99)\" compliance=\"SVG, X11\" />"
00182     "  <color name=\"grey4\" color=\"rgb(10,10,10)\" compliance=\"SVG, X11\" />"
00183     "  <color name=\"grey40\" color=\"rgb(102,102,102)\" compliance=\"SVG, X11\" />"
00184     "  <color name=\"grey41\" color=\"rgb(105,105,105)\" compliance=\"SVG, X11\" />"
00185     "  <color name=\"grey42\" color=\"rgb(107,107,107)\" compliance=\"SVG, X11\" />"
00186     "  <color name=\"grey43\" color=\"rgb(110,110,110)\" compliance=\"SVG, X11\" />"
00187     "  <color name=\"grey44\" color=\"rgb(112,112,112)\" compliance=\"SVG, X11\" />"
00188     "  <color name=\"grey45\" color=\"rgb(115,115,115)\" compliance=\"SVG, X11\" />"
00189     "  <color name=\"grey45\" color=\"rgb(117,117,117)\" compliance=\"SVG, X11\" />"
00190     "  <color name=\"grey47\" color=\"rgb(120,120,120)\" compliance=\"SVG, X11\" />"
00191     "  <color name=\"grey48\" color=\"rgb(122,122,122)\" compliance=\"SVG, X11\" />"
00192     "  <color name=\"grey49\" color=\"rgb(125,125,125)\" compliance=\"SVG, X11\" />"
00193     "  <color name=\"grey5\" color=\"rgb(13,13,13)\" compliance=\"SVG, X11\" />"
00194     "  <color name=\"grey50\" color=\"rgb(50%,50%,50%)\" compliance=\"SVG, X11\" />"
00195     "  <color name=\"grey51\" color=\"rgb(130,130,130)\" compliance=\"SVG, X11\" />"
00196     "  <color name=\"grey52\" color=\"rgb(133,133,133)\" compliance=\"SVG, X11\" />"
00197     "  <color name=\"grey53\" color=\"rgb(135,135,135)\" compliance=\"SVG, X11\" />"
00198     "  <color name=\"grey54\" color=\"rgb(138,138,138)\" compliance=\"SVG, X11\" />"
00199     "  <color name=\"grey55\" color=\"rgb(140,140,140)\" compliance=\"SVG, X11\" />"
00200     "  <color name=\"grey56\" color=\"rgb(143,143,143)\" compliance=\"SVG, X11\" />"
00201     "  <color name=\"grey57\" color=\"rgb(145,145,145)\" compliance=\"SVG, X11\" />"
00202     "  <color name=\"grey58\" color=\"rgb(148,148,148)\" compliance=\"SVG, X11\" />"
00203     "  <color name=\"grey59\" color=\"rgb(150,150,150)\" compliance=\"SVG, X11\" />"
00204     "  <color name=\"grey6\" color=\"rgb(15,15,15)\" compliance=\"SVG, X11\" />"
00205     "  <color name=\"grey60\" color=\"rgb(153,153,153)\" compliance=\"SVG, X11\" />"
00206     "  <color name=\"grey61\" color=\"rgb(156,156,156)\" compliance=\"SVG, X11\" />"
00207     "  <color name=\"grey62\" color=\"rgb(158,158,158)\" compliance=\"SVG, X11\" />"
00208     "  <color name=\"grey63\" color=\"rgb(161,161,161)\" compliance=\"SVG, X11\" />"
00209     "  <color name=\"grey64\" color=\"rgb(163,163,163)\" compliance=\"SVG, X11\" />"
00210     "  <color name=\"grey65\" color=\"rgb(166,166,166)\" compliance=\"SVG, X11\" />"
00211     "  <color name=\"grey66\" color=\"rgb(168,168,168)\" compliance=\"SVG, X11\" />"
00212     "  <color name=\"grey67\" color=\"rgb(171,171,171)\" compliance=\"SVG, X11\" />"
00213     "  <color name=\"grey68\" color=\"rgb(173,173,173)\" compliance=\"SVG, X11\" />"
00214     "  <color name=\"grey69\" color=\"rgb(176,176,176)\" compliance=\"SVG, X11\" />"
00215     "  <color name=\"grey7\" color=\"rgb(18,18,18)\" compliance=\"SVG, X11\" />"
00216     "  <color name=\"grey70\" color=\"rgb(179,179,179)\" compliance=\"SVG, X11\" />"
00217     "  <color name=\"grey71\" color=\"rgb(181,181,181)\" compliance=\"SVG, X11\" />"
00218     "  <color name=\"grey72\" color=\"rgb(184,184,184)\" compliance=\"SVG, X11\" />"
00219     "  <color name=\"grey73\" color=\"rgb(186,186,186)\" compliance=\"SVG, X11\" />"
00220     "  <color name=\"grey74\" color=\"rgb(189,189,189)\" compliance=\"SVG, X11\" />"
00221     "  <color name=\"grey75\" color=\"rgb(191,191,191)\" compliance=\"SVG, X11\" />"
00222     "  <color name=\"grey76\" color=\"rgb(194,194,194)\" compliance=\"SVG, X11\" />"
00223     "  <color name=\"grey77\" color=\"rgb(196,196,196)\" compliance=\"SVG, X11\" />"
00224     "  <color name=\"grey78\" color=\"rgb(199,199,199)\" compliance=\"SVG, X11\" />"
00225     "  <color name=\"grey79\" color=\"rgb(201,201,201)\" compliance=\"SVG, X11\" />"
00226     "  <color name=\"grey8\" color=\"rgb(20,20,20)\" compliance=\"SVG, X11\" />"
00227     "  <color name=\"grey80\" color=\"rgb(204,204,204)\" compliance=\"SVG, X11\" />"
00228     "  <color name=\"grey81\" color=\"rgb(207,207,207)\" compliance=\"SVG, X11\" />"
00229     "  <color name=\"grey82\" color=\"rgb(209,209,209)\" compliance=\"SVG, X11\" />"
00230     "  <color name=\"grey83\" color=\"rgb(212,212,212)\" compliance=\"SVG, X11\" />"
00231     "  <color name=\"grey84\" color=\"rgb(214,214,214)\" compliance=\"SVG, X11\" />"
00232     "  <color name=\"grey85\" color=\"rgb(217,217,217)\" compliance=\"SVG, X11\" />"
00233     "  <color name=\"grey86\" color=\"rgb(219,219,219)\" compliance=\"SVG, X11\" />"
00234     "  <color name=\"grey87\" color=\"rgb(222,222,222)\" compliance=\"SVG, X11\" />"
00235     "  <color name=\"grey88\" color=\"rgb(224,224,224)\" compliance=\"SVG, X11\" />"
00236     "  <color name=\"grey89\" color=\"rgb(227,227,227)\" compliance=\"SVG, X11\" />"
00237     "  <color name=\"grey9\" color=\"rgb(23,23,23)\" compliance=\"SVG, X11\" />"
00238     "  <color name=\"grey90\" color=\"rgb(229,229,229)\" compliance=\"SVG, X11\" />"
00239     "  <color name=\"grey91\" color=\"rgb(232,232,232)\" compliance=\"SVG, X11\" />"
00240     "  <color name=\"grey92\" color=\"rgb(235,235,235)\" compliance=\"SVG, X11\" />"
00241     "  <color name=\"grey93\" color=\"rgb(237,237,237)\" compliance=\"SVG, X11\" />"
00242     "  <color name=\"grey94\" color=\"rgb(240,240,240)\" compliance=\"SVG, X11\" />"
00243     "  <color name=\"grey95\" color=\"rgb(242,242,242)\" compliance=\"SVG, X11\" />"
00244     "  <color name=\"grey96\" color=\"rgb(245,245,245)\" compliance=\"SVG, X11\" />"
00245     "  <color name=\"grey97\" color=\"rgb(247,247,247)\" compliance=\"SVG, X11\" />"
00246     "  <color name=\"grey98\" color=\"rgb(250,250,250)\" compliance=\"SVG, X11\" />"
00247     "  <color name=\"grey99\" color=\"rgb(252,252,252)\" compliance=\"SVG, X11\" />"
00248     "  <color name=\"honeydew\" color=\"rgb(240,255,240)\" compliance=\"SVG, X11, XPM\" />"
00249     "  <color name=\"HotPink\" color=\"rgb(255,105,180)\" compliance=\"SVG, X11, XPM\" />"
00250     "  <color name=\"IndianRed\" color=\"rgb(205,92,92)\" compliance=\"SVG, X11, XPM\" />"
00251     "  <color name=\"indigo\" color=\"rgb(75,0,130)\" compliance=\"SVG\" />"
00252     "  <color name=\"ivory\" color=\"rgb(255,255,240)\" compliance=\"SVG, X11, XPM\" />"
00253     "  <color name=\"khaki\" color=\"rgb(240,230,140)\" compliance=\"SVG, X11, XPM\" />"
00254     "  <color name=\"lavender\" color=\"rgb(230,230,250)\" compliance=\"SVG, X11, XPM\" />"
00255     "  <color name=\"LavenderBlush\" color=\"rgb(255,240,245)\" compliance=\"SVG, X11, XPM\" />"
00256     "  <color name=\"LawnGreen\" color=\"rgb(124,252,0)\" compliance=\"SVG, X11, XPM\" />"
00257     "  <color name=\"LemonChiffon\" color=\"rgb(255,250,205)\" compliance=\"SVG, X11, XPM\" />"
00258     "  <color name=\"LightBlue\" color=\"rgb(173,216,230)\" compliance=\"SVG, X11, XPM\" />"
00259     "  <color name=\"LightCoral\" color=\"rgb(240,128,128)\" compliance=\"SVG, X11, XPM\" />"
00260     "  <color name=\"LightCyan\" color=\"rgb(224,255,255)\" compliance=\"SVG, X11, XPM\" />"
00261     "  <color name=\"LightGoldenrodYellow\" color=\"rgb(250,250,210)\" compliance=\"SVG, X11, XPM\" />"
00262     "  <color name=\"LightGray\" color=\"rgb(211,211,211)\" compliance=\"SVG, X11, XPM\" />"
00263     "  <color name=\"LightGreen\" color=\"rgb(144,238,144)\" compliance=\"SVG, X11\" />"
00264     "  <color name=\"LightGrey\" color=\"rgb(211,211,211)\" compliance=\"SVG, X11\" />"
00265     "  <color name=\"LightPink\" color=\"rgb(255,182,193)\" compliance=\"SVG, X11, XPM\" />"
00266     "  <color name=\"LightSalmon\" color=\"rgb(255,160,122)\" compliance=\"SVG, X11, XPM\" />"
00267     "  <color name=\"LightSeaGreen\" color=\"rgb(32,178,170)\" compliance=\"SVG, X11, XPM\" />"
00268     "  <color name=\"LightSkyBlue\" color=\"rgb(135,206,250)\" compliance=\"SVG, X11, XPM\" />"
00269     "  <color name=\"LightSlateGray\" color=\"rgb(119,136,153)\" compliance=\"SVG, X11, XPM\" />"
00270     "  <color name=\"LightSlateGrey\" color=\"rgb(119,136,153)\" compliance=\"SVG, X11\" />"
00271     "  <color name=\"LightSteelBlue\" color=\"rgb(176,196,222)\" compliance=\"SVG, X11, XPM\" />"
00272     "  <color name=\"LightYellow\" color=\"rgb(255,255,224)\" compliance=\"SVG, X11, XPM\" />"
00273     "  <color name=\"lime\" color=\"rgb(0,255,0)\" compliance=\"SVG\" />"
00274     "  <color name=\"LimeGreen\" color=\"rgb(50,205,50)\" compliance=\"SVG, X11, XPM\" />"
00275     "  <color name=\"linen\" color=\"rgb(250,240,230)\" compliance=\"SVG, X11, XPM\" />"
00276     "  <color name=\"maroon\" color=\"rgb(128,0,0)\" compliance=\"SVG\" />"
00277     "  <color name=\"MediumAquamarine\" color=\"rgb(102,205,170)\" compliance=\"SVG, X11, XPM\" />"
00278     "  <color name=\"MediumBlue\" color=\"rgb(0,0,205)\" compliance=\"SVG, X11, XPM\" />"
00279     "  <color name=\"MediumOrchid\" color=\"rgb(186,85,211)\" compliance=\"SVG, X11, XPM\" />"
00280     "  <color name=\"MediumPurple\" color=\"rgb(147,112,219)\" compliance=\"SVG, X11, XPM\" />"
00281     "  <color name=\"MediumSeaGreen\" color=\"rgb(60,179,113)\" compliance=\"SVG, X11, XPM\" />"
00282     "  <color name=\"MediumSlateBlue\" color=\"rgb(123,104,238)\" compliance=\"SVG, X11, XPM\" />"
00283     "  <color name=\"MediumSpringGreen\" color=\"rgb(0,250,154)\" compliance=\"SVG, X11, XPM\" />"
00284     "  <color name=\"MediumTurquoise\" color=\"rgb(72,209,204)\" compliance=\"SVG, X11, XPM\" />"
00285     "  <color name=\"MediumVioletRed\" color=\"rgb(199,21,133)\" compliance=\"SVG, X11, XPM\" />"
00286     "  <color name=\"MidnightBlue\" color=\"rgb(25,25,112)\" compliance=\"SVG, X11, XPM\" />"
00287     "  <color name=\"MintCream\" color=\"rgb(245,255,250)\" compliance=\"SVG, X11, XPM\" />"
00288     "  <color name=\"MistyRose\" color=\"rgb(255,228,225)\" compliance=\"SVG, X11, XPM\" />"
00289     "  <color name=\"moccasin\" color=\"rgb(255,228,181)\" compliance=\"SVG, X11, XPM\" />"
00290     "  <color name=\"NavajoWhite\" color=\"rgb(255,222,173)\" compliance=\"SVG, X11, XPM\" />"
00291     "  <color name=\"navy\" color=\"rgb(0,0,128)\" compliance=\"SVG, X11, XPM\" />"
00292     "  <color name=\"matte\" color=\"rgb(0,0,0,0)\" compliance=\"SVG\" />"
00293     "  <color name=\"OldLace\" color=\"rgb(253,245,230)\" compliance=\"SVG, X11, XPM\" />"
00294     "  <color name=\"olive\" color=\"rgb(128,128,0)\" compliance=\"SVG\" />"
00295     "  <color name=\"OliveDrab\" color=\"rgb(107,142,35)\" compliance=\"SVG, X11, XPM\" />"
00296     "  <color name=\"opaque\" color=\"rgb(0,0,0)\" compliance=\"SVG\" />"
00297     "  <color name=\"orange\" color=\"rgb(255,165,0)\" compliance=\"SVG, X11, XPM\" />"
00298     "  <color name=\"OrangeRed\" color=\"rgb(255,69,0)\" compliance=\"SVG, X11, XPM\" />"
00299     "  <color name=\"orchid\" color=\"rgb(218,112,214)\" compliance=\"SVG, X11, XPM\" />"
00300     "  <color name=\"PaleGoldenrod\" color=\"rgb(238,232,170)\" compliance=\"SVG, X11, XPM\" />"
00301     "  <color name=\"PaleGreen\" color=\"rgb(152,251,152)\" compliance=\"SVG, X11, XPM\" />"
00302     "  <color name=\"PaleTurquoise\" color=\"rgb(175,238,238)\" compliance=\"SVG, X11, XPM\" />"
00303     "  <color name=\"PaleVioletRed\" color=\"rgb(219,112,147)\" compliance=\"SVG, X11, XPM\" />"
00304     "  <color name=\"PapayaWhip\" color=\"rgb(255,239,213)\" compliance=\"SVG, X11, XPM\" />"
00305     "  <color name=\"PeachPuff\" color=\"rgb(255,218,185)\" compliance=\"SVG, X11, XPM\" />"
00306     "  <color name=\"peru\" color=\"rgb(205,133,63)\" compliance=\"SVG, X11, XPM\" />"
00307     "  <color name=\"pink\" color=\"rgb(255,192,203)\" compliance=\"SVG, X11, XPM\" />"
00308     "  <color name=\"plum\" color=\"rgb(221,160,221)\" compliance=\"SVG, X11, XPM\" />"
00309     "  <color name=\"PowderBlue\" color=\"rgb(176,224,230)\" compliance=\"SVG, X11, XPM\" />"
00310     "  <color name=\"purple\" color=\"rgb(128,0,128)\" compliance=\"SVG\" />"
00311     "  <color name=\"RosyBrown\" color=\"rgb(188,143,143)\" compliance=\"SVG, X11, XPM\" />"
00312     "  <color name=\"RoyalBlue\" color=\"rgb(65,105,225)\" compliance=\"SVG, X11, XPM\" />"
00313     "  <color name=\"SaddleBrown\" color=\"rgb(139,69,19)\" compliance=\"SVG, X11, XPM\" />"
00314     "  <color name=\"salmon\" color=\"rgb(250,128,114)\" compliance=\"SVG, X11, XPM\" />"
00315     "  <color name=\"SandyBrown\" color=\"rgb(244,164,96)\" compliance=\"SVG, X11, XPM\" />"
00316     "  <color name=\"SeaGreen\" color=\"rgb(45,139,87)\" compliance=\"SVG, X11, XPM\" />"
00317     "  <color name=\"seashell\" color=\"rgb(255,245,238)\" compliance=\"SVG, X11, XPM\" />"
00318     "  <color name=\"sienna\" color=\"rgb(160,82,45)\" compliance=\"SVG, X11, XPM\" />"
00319     "  <color name=\"silver\" color=\"rgb(192,192,192)\" compliance=\"SVG\" />"
00320     "  <color name=\"SkyBlue\" color=\"rgb(135,206,235)\" compliance=\"SVG, X11, XPM\" />"
00321     "  <color name=\"SlateBlue\" color=\"rgb(106,90,205)\" compliance=\"SVG, X11, XPM\" />"
00322     "  <color name=\"SlateGray\" color=\"rgb(112,128,144)\" compliance=\"SVG, X11, XPM\" />"
00323     "  <color name=\"SlateGrey\" color=\"rgb(112,128,144)\" compliance=\"SVG, X11\" />"
00324     "  <color name=\"snow\" color=\"rgb(255,250,250)\" compliance=\"SVG, X11, XPM\" />"
00325     "  <color name=\"SpringGreen\" color=\"rgb(0,255,127)\" compliance=\"SVG, X11, XPM\" />"
00326     "  <color name=\"SteelBlue\" color=\"rgb(70,130,180)\" compliance=\"SVG, X11, XPM\" />"
00327     "  <color name=\"tan\" color=\"rgb(210,180,140)\" compliance=\"SVG, X11, XPM\" />"
00328     "  <color name=\"teal\" color=\"rgb(0,128,128)\" compliance=\"SVG\" />"
00329     "  <color name=\"thistle\" color=\"rgb(216,191,216)\" compliance=\"SVG, X11, XPM\" />"
00330     "  <color name=\"tomato\" color=\"rgb(255,99,71)\" compliance=\"SVG, X11, XPM\" />"
00331     "  <color name=\"transparent\" color=\"rgba(0,0,0,0)\" compliance=\"SVG\" />"
00332     "  <color name=\"turquoise\" color=\"rgb(64,224,208)\" compliance=\"SVG, X11, XPM\" />"
00333     "  <color name=\"violet\" color=\"rgb(238,130,238)\" compliance=\"SVG, X11, XPM\" />"
00334     "  <color name=\"wheat\" color=\"rgb(245,222,179)\" compliance=\"SVG, X11, XPM\" />"
00335     "  <color name=\"WhiteSmoke\" color=\"rgb(245,245,245)\" compliance=\"SVG, X11, XPM\" />"
00336     "  <color name=\"YellowGreen\" color=\"rgb(154,205,50)\" compliance=\"SVG, X11, XPM\" />"
00337     "</colormap>";
00338 
00339 /*
00340   Typedef declarations.
00341 */
00342 typedef struct _NodeInfo
00343 {
00344   struct _NodeInfo
00345     *child[16];
00346 
00347   ColorPacket
00348     *list;
00349 
00350   MagickSizeType
00351     number_unique;
00352 
00353   unsigned long
00354     level;
00355 } NodeInfo;
00356 
00357 typedef struct _Nodes
00358 {
00359   NodeInfo
00360     nodes[NodesInAList];
00361 
00362   struct _Nodes
00363     *next;
00364 } Nodes;
00365 
00366 typedef struct _CubeInfo
00367 {
00368   NodeInfo
00369     *root;
00370 
00371   long
00372     x,
00373     progress;
00374 
00375   unsigned long
00376     colors,
00377     free_nodes;
00378 
00379   NodeInfo
00380     *node_info;
00381 
00382   Nodes
00383     *node_queue;
00384 } CubeInfo;
00385 
00386 /*
00387   Static declarations.
00388 */
00389 static LinkedListInfo
00390   *color_list = (LinkedListInfo *) NULL;
00391 
00392 static SemaphoreInfo
00393   *color_semaphore = (SemaphoreInfo *) NULL;
00394 
00395 static volatile MagickBooleanType
00396   instantiate_color = MagickFalse;
00397 
00398 /*
00399   Forward declarations.
00400 */
00401 static CubeInfo
00402   *GetCubeInfo(void);
00403 
00404 static NodeInfo
00405   *GetNodeInfo(CubeInfo *,const unsigned long);
00406 
00407 static MagickBooleanType
00408   InitializeColorList(ExceptionInfo *),
00409   LoadColorLists(const char *,ExceptionInfo *);
00410 
00411 static void
00412   DestroyColorCube(const Image *,NodeInfo *);
00413 
00414 /*
00415 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00416 %                                                                             %
00417 %                                                                             %
00418 %                                                                             %
00419 +   C l a s s i f y I m a g e C o l o r s                                     %
00420 %                                                                             %
00421 %                                                                             %
00422 %                                                                             %
00423 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00424 %
00425 %  ClassifyImageColors() builds a populated CubeInfo tree for the specified
00426 %  image.  The returned tree should be deallocated using DestroyCubeInfo()
00427 %  once it is no longer needed.
00428 %
00429 %  The format of the ClassifyImageColors() method is:
00430 %
00431 %      CubeInfo *ClassifyImageColors(const Image *image,
00432 %        ExceptionInfo *exception)
00433 %
00434 %  A description of each parameter follows.
00435 %
00436 %    o image: the image.
00437 %
00438 %    o exception: return any errors or warnings in this structure.
00439 %
00440 */
00441 
00442 static inline unsigned long ColorToNodeId(const Image *image,
00443   const MagickPixelPacket *pixel,unsigned long index)
00444 {
00445   unsigned long
00446     id;
00447 
00448   id=(unsigned long) (
00449     ((ScaleQuantumToChar(RoundToQuantum(pixel->red)) >> index) & 0x01) |
00450     ((ScaleQuantumToChar(RoundToQuantum(pixel->green)) >> index) & 0x01) << 1 |
00451     ((ScaleQuantumToChar(RoundToQuantum(pixel->blue)) >> index) & 0x01) << 2);
00452   if (image->matte != MagickFalse)
00453     id|=((ScaleQuantumToChar(RoundToQuantum(pixel->opacity)) >> index) &
00454       0x01) << 3;
00455   return(id);
00456 }
00457 
00458 static CubeInfo *ClassifyImageColors(const Image *image,
00459   ExceptionInfo *exception)
00460 {
00461 #define EvaluateImageTag  "  Compute image colors...  "
00462 
00463   CubeInfo
00464     *cube_info;
00465 
00466   long
00467     y;
00468 
00469   MagickBooleanType
00470     proceed;
00471 
00472   MagickPixelPacket
00473     pixel,
00474     target;
00475 
00476   NodeInfo
00477     *node_info;
00478 
00479   register const IndexPacket
00480     *indexes;
00481 
00482   register const PixelPacket
00483     *p;
00484 
00485   register long
00486     i,
00487     x;
00488 
00489   register unsigned long
00490     id,
00491     index,
00492     level;
00493 
00494   ViewInfo
00495     *image_view;
00496 
00497   /*
00498     Initialize color description tree.
00499   */
00500   assert(image != (const Image *) NULL);
00501   assert(image->signature == MagickSignature);
00502   if (image->debug != MagickFalse)
00503     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
00504   cube_info=GetCubeInfo();
00505   if (cube_info == (CubeInfo *) NULL)
00506     {
00507       (void) ThrowMagickException(exception,GetMagickModule(),
00508         ResourceLimitError,"MemoryAllocationFailed","`%s'",image->filename);
00509       return(cube_info);
00510     }
00511   GetMagickPixelPacket(image,&pixel);
00512   GetMagickPixelPacket(image,&target);
00513   image_view=AcquireCacheView(image);
00514   for (y=0; y < (long) image->rows; y++)
00515   {
00516     p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
00517     if (p == (const PixelPacket *) NULL)
00518       break;
00519     indexes=GetCacheViewVirtualIndexes(image_view);
00520     for (x=0; x < (long) image->columns; x++)
00521     {
00522       /*
00523         Start at the root and proceed level by level.
00524       */
00525       node_info=cube_info->root;
00526       index=MaxTreeDepth-1;
00527       for (level=1; level < MaxTreeDepth; level++)
00528       {
00529         SetMagickPixelPacket(image,p,indexes+x,&pixel);
00530         id=ColorToNodeId(image,&pixel,index);
00531         if (node_info->child[id] == (NodeInfo *) NULL)
00532           {
00533             node_info->child[id]=GetNodeInfo(cube_info,level);
00534             if (node_info->child[id] == (NodeInfo *) NULL)
00535               {
00536                 (void) ThrowMagickException(exception,GetMagickModule(),
00537                   ResourceLimitError,"MemoryAllocationFailed","`%s'",
00538                   image->filename);
00539                 return(0);
00540               }
00541           }
00542         node_info=node_info->child[id];
00543         index--;
00544       }
00545       for (i=0; i < (long) node_info->number_unique; i++)
00546       {
00547         SetMagickPixelPacket(image,&node_info->list[i].pixel,
00548           &node_info->list[i].index,&target);
00549         if (IsMagickColorEqual(&pixel,&target) != MagickFalse)
00550           break;
00551       }
00552       if (i < (long) node_info->number_unique)
00553         node_info->list[i].count++;
00554       else
00555         {
00556           if (node_info->number_unique == 0)
00557             node_info->list=(ColorPacket *) AcquireMagickMemory(
00558               sizeof(*node_info->list));
00559           else
00560             node_info->list=(ColorPacket *) ResizeQuantumMemory(node_info->list,
00561               (size_t) (i+1),sizeof(*node_info->list));
00562           if (node_info->list == (ColorPacket *) NULL)
00563             {
00564               (void) ThrowMagickException(exception,GetMagickModule(),
00565                 ResourceLimitError,"MemoryAllocationFailed","`%s'",
00566                 image->filename);
00567               return(0);
00568             }
00569           node_info->list[i].pixel=(*p);
00570           if ((image->colorspace == CMYKColorspace) ||
00571               (image->storage_class == PseudoClass))
00572             node_info->list[i].index=indexes[x];
00573           node_info->list[i].count=1;
00574           node_info->number_unique++;
00575           cube_info->colors++;
00576         }
00577       p++;
00578     }
00579     proceed=SetImageProgress(image,EvaluateImageTag,y,image->rows);
00580     if (proceed == MagickFalse)
00581       break;
00582   }
00583   image_view=DestroyCacheView(image_view);
00584   return(cube_info);
00585 }
00586 
00587 /*
00588 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00589 %                                                                             %
00590 %                                                                             %
00591 %                                                                             %
00592 +   C o n c a t e n a t e C o l o r C o m p o n e n t                         %
00593 %                                                                             %
00594 %                                                                             %
00595 %                                                                             %
00596 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00597 %
00598 %  ConcatenateColorComponent() returns the pixel as a canonical string.
00599 %
00600 %  The format of the ConcatenateColorComponent() method is:
00601 %
00602 %      void ConcatenateColorComponent(const MagickPixelPacket *pixel,
00603 %        const ChannelType channel,const ComplianceType compliance,char *tuple)
00604 %
00605 %  A description of each parameter follows.
00606 %
00607 %    o pixel:  The pixel.
00608 %
00609 %    channel:  The channel.
00610 %
00611 %    o compliance: Adhere to this color standard: SVG, X11, or XPM.
00612 %
00613 %    tuple:  The color tuple.
00614 %
00615 */
00616 MagickExport void ConcatenateColorComponent(const MagickPixelPacket *pixel,
00617   const ChannelType channel,const ComplianceType compliance,char *tuple)
00618 {
00619   char
00620     component[MaxTextExtent];
00621 
00622   MagickRealType
00623     color;
00624 
00625   color=0.0;
00626   switch (channel)
00627   {
00628     case RedChannel:
00629     {
00630       color=pixel->red;
00631       break;
00632     }
00633     case GreenChannel:
00634     {
00635       color=pixel->green;
00636       break;
00637     }
00638     case BlueChannel:
00639     {
00640       color=pixel->blue;
00641       break;
00642     }
00643     case AlphaChannel:
00644     {
00645       color=QuantumRange-pixel->opacity;
00646       break;
00647     }
00648     case IndexChannel:
00649     {
00650       color=pixel->index;
00651       break;
00652     }
00653     default:
00654       break;
00655   }
00656   if (compliance != SVGCompliance)
00657     {
00658       if (pixel->depth > 16)
00659         {
00660           (void) FormatMagickString(component,MaxTextExtent,"%10lu",
00661             (unsigned long) ScaleQuantumToLong(RoundToQuantum(color)));
00662           (void) ConcatenateMagickString(tuple,component,MaxTextExtent);
00663           return;
00664         }
00665       if (pixel->depth > 8)
00666         {
00667           (void) FormatMagickString(component,MaxTextExtent,"%5d",
00668             ScaleQuantumToShort(RoundToQuantum(color)));
00669           (void) ConcatenateMagickString(tuple,component,MaxTextExtent);
00670           return;
00671         }
00672       (void) FormatMagickString(component,MaxTextExtent,"%3d",
00673         ScaleQuantumToChar(RoundToQuantum(color)));
00674       (void) ConcatenateMagickString(tuple,component,MaxTextExtent);
00675       return;
00676     }
00677   if (channel == OpacityChannel)
00678     {
00679       (void) FormatMagickString(component,MaxTextExtent,"%g",
00680         (double) (QuantumScale*color));
00681       (void) ConcatenateMagickString(tuple,component,MaxTextExtent);
00682       return;
00683     }
00684   if (pixel->depth > 8)
00685     {
00686       (void) FormatMagickString(component,MaxTextExtent,"%g%%",
00687         (double) (100.0*QuantumScale*color));
00688       (void) ConcatenateMagickString(tuple,component,MaxTextExtent);
00689       return;
00690     }
00691   (void) FormatMagickString(component,MaxTextExtent,"%d",
00692     ScaleQuantumToChar(RoundToQuantum(color)));
00693   (void) ConcatenateMagickString(tuple,component,MaxTextExtent);
00694 }
00695 
00696 /*
00697 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00698 %                                                                             %
00699 %                                                                             %
00700 %                                                                             %
00701 +   D e f i n e I m a g e H i s t o g r a m                                   %
00702 %                                                                             %
00703 %                                                                             %
00704 %                                                                             %
00705 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00706 %
00707 %  DefineImageHistogram() traverses the color cube tree and notes each colormap
00708 %  entry.  A colormap entry is any node in the color cube tree where the
00709 %  of unique colors is not zero.
00710 %
00711 %  The format of the DefineImageHistogram method is:
00712 %
00713 %      DefineImageHistogram(const Image *image,NodeInfo *node_info,
00714 %        ColorPacket **unique_colors)
00715 %
00716 %  A description of each parameter follows.
00717 %
00718 %    o image: the image.
00719 %
00720 %    o node_info: the address of a structure of type NodeInfo which points to a
00721 %      node in the color cube tree that is to be pruned.
00722 %
00723 %    o histogram: the image histogram.
00724 %
00725 */
00726 static void DefineImageHistogram(const Image *image,NodeInfo *node_info,
00727   ColorPacket **histogram)
00728 {
00729   register long
00730     i;
00731 
00732   unsigned long
00733     number_children;
00734 
00735   /*
00736     Traverse any children.
00737   */
00738   number_children=image->matte == MagickFalse ? 8UL : 16UL;
00739   for (i=0; i < (long) number_children; i++)
00740     if (node_info->child[i] != (NodeInfo *) NULL)
00741       DefineImageHistogram(image,node_info->child[i],histogram);
00742   if (node_info->level == (MaxTreeDepth-1))
00743     {
00744       register ColorPacket
00745         *p;
00746 
00747       p=node_info->list;
00748       for (i=0; i < (long) node_info->number_unique; i++)
00749       {
00750         (*histogram)->pixel=p->pixel;
00751         (*histogram)->index=p->index;
00752         (*histogram)->count=p->count;
00753         (*histogram)++;
00754         p++;
00755       }
00756     }
00757 }
00758 
00759 /*
00760 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00761 %                                                                             %
00762 %                                                                             %
00763 %                                                                             %
00764 +   D e s t r o y C o l o r L i s t                                           %
00765 %                                                                             %
00766 %                                                                             %
00767 %                                                                             %
00768 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00769 %
00770 %  DestroyColorList() deallocates memory associated with the color list.
00771 %
00772 %  The format of the DestroyColorList method is:
00773 %
00774 %      DestroyColorList(void)
00775 %
00776 */
00777 
00778 static void *DestroyColorElement(void *color_info)
00779 {
00780   register ColorInfo
00781     *p;
00782 
00783   p=(ColorInfo *) color_info;
00784   if (p->path != (char *) NULL)
00785     p->path=DestroyString(p->path);
00786   if (p->name != (char *) NULL)
00787     p->name=DestroyString(p->name);
00788   p=(ColorInfo *) RelinquishMagickMemory(p);
00789   return((void *) NULL);
00790 }
00791 
00792 MagickExport void DestroyColorList(void)
00793 {
00794   AcquireSemaphoreInfo(&color_semaphore);
00795   if (color_list != (LinkedListInfo *) NULL)
00796     color_list=DestroyLinkedList(color_list,DestroyColorElement);
00797   instantiate_color=MagickFalse;
00798   RelinquishSemaphoreInfo(color_semaphore);
00799   DestroySemaphoreInfo(&color_semaphore);
00800 }
00801 
00802 /*
00803 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00804 %                                                                             %
00805 %                                                                             %
00806 %                                                                             %
00807 +   D e s t r o y C u b e I n f o                                             %
00808 %                                                                             %
00809 %                                                                             %
00810 %                                                                             %
00811 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00812 %
00813 %  DestroyCubeInfo() deallocates memory associated with a CubeInfo structure.
00814 %
00815 %  The format of the DestroyCubeInfo method is:
00816 %
00817 %      DestroyCubeInfo(const Image *image,CubeInfo *cube_info)
00818 %
00819 %  A description of each parameter follows:
00820 %
00821 %    o image: the image.
00822 %
00823 %    o cube_info: the address of a structure of type CubeInfo.
00824 %
00825 */
00826 static CubeInfo *DestroyCubeInfo(const Image *image,CubeInfo *cube_info)
00827 {
00828   register Nodes
00829     *nodes;
00830 
00831   /*
00832     Release color cube tree storage.
00833   */
00834   DestroyColorCube(image,cube_info->root);
00835   do
00836   {
00837     nodes=cube_info->node_queue->next;
00838     cube_info->node_queue=(Nodes *)
00839       RelinquishMagickMemory(cube_info->node_queue);
00840     cube_info->node_queue=nodes;
00841   } while (cube_info->node_queue != (Nodes *) NULL);
00842   return((CubeInfo *) RelinquishMagickMemory(cube_info));
00843 }
00844 
00845 /*
00846 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00847 %                                                                             %
00848 %                                                                             %
00849 %                                                                             %
00850 +  D e s t r o y C o l o r C u b e                                            %
00851 %                                                                             %
00852 %                                                                             %
00853 %                                                                             %
00854 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00855 %
00856 %  DestroyColorCube() traverses the color cube tree and frees the list of
00857 %  unique colors.
00858 %
00859 %  The format of the DestroyColorCube method is:
00860 %
00861 %      void DestroyColorCube(const Image *image,const NodeInfo *node_info)
00862 %
00863 %  A description of each parameter follows.
00864 %
00865 %    o image: the image.
00866 %
00867 %    o node_info: the address of a structure of type NodeInfo which points to a
00868 %      node in the color cube tree that is to be pruned.
00869 %
00870 */
00871 static void DestroyColorCube(const Image *image,NodeInfo *node_info)
00872 {
00873   register long
00874     i;
00875 
00876   unsigned long
00877     number_children;
00878 
00879   /*
00880     Traverse any children.
00881   */
00882   number_children=image->matte == MagickFalse ? 8UL : 16UL;
00883   for (i=0; i < (long) number_children; i++)
00884     if (node_info->child[i] != (NodeInfo *) NULL)
00885       DestroyColorCube(image,node_info->child[i]);
00886   if (node_info->list != (ColorPacket *) NULL)
00887     node_info->list=(ColorPacket *) RelinquishMagickMemory(node_info->list);
00888 }
00889 
00890 /*
00891 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00892 %                                                                             %
00893 %                                                                             %
00894 %                                                                             %
00895 +   G e t C o l o r I n f o                                                   %
00896 %                                                                             %
00897 %                                                                             %
00898 %                                                                             %
00899 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00900 %
00901 %  GetColorInfo() searches the color list for the specified name and if found
00902 %  returns attributes for that color.
00903 %
00904 %  The format of the GetColorInfo method is:
00905 %
00906 %      const PixelPacket *GetColorInfo(const char *name,
00907 %        ExceptionInfo *exception)
00908 %
00909 %  A description of each parameter follows:
00910 %
00911 %    o color_info: search the color list for the specified name and if found
00912 %      return attributes for that color.
00913 %
00914 %    o name: the color name.
00915 %
00916 %    o exception: return any errors or warnings in this structure.
00917 %
00918 */
00919 MagickExport const ColorInfo *GetColorInfo(const char *name,
00920   ExceptionInfo *exception)
00921 {
00922   char
00923     colorname[MaxTextExtent];
00924 
00925   register const ColorInfo
00926     *p;
00927 
00928   register char
00929     *q;
00930 
00931   assert(exception != (ExceptionInfo *) NULL);
00932   if ((color_list == (LinkedListInfo *) NULL) ||
00933       (instantiate_color == MagickFalse))
00934     if (InitializeColorList(exception) == MagickFalse)
00935       return((const ColorInfo *) NULL);
00936   if ((color_list == (LinkedListInfo *) NULL) ||
00937       (IsLinkedListEmpty(color_list) != MagickFalse))
00938     return((const ColorInfo *) NULL);
00939   if ((name == (const char *) NULL) || (LocaleCompare(name,"*") == 0))
00940     return((const ColorInfo *) GetValueFromLinkedList(color_list,0));
00941   /*
00942     Strip names of whitespace.
00943   */
00944   (void) CopyMagickString(colorname,name,MaxTextExtent);
00945   for (q=colorname; *q != '\0'; q++)
00946   {
00947     if (isspace((int) ((unsigned char) *q)) == 0)
00948       continue;
00949     (void) CopyMagickString(q,q+1,MaxTextExtent);
00950     q--;
00951   }
00952   /*
00953     Search for color tag.
00954   */
00955   AcquireSemaphoreInfo(&color_semaphore);
00956   ResetLinkedListIterator(color_list);
00957   p=(const ColorInfo *) GetNextValueInLinkedList(color_list);
00958   while (p != (const ColorInfo *) NULL)
00959   {
00960     if (LocaleCompare(colorname,p->name) == 0)
00961       break;
00962     p=(const ColorInfo *) GetNextValueInLinkedList(color_list);
00963   }
00964   if (p == (ColorInfo *) NULL)
00965     (void) ThrowMagickException(exception,GetMagickModule(),OptionWarning,
00966       "UnrecognizedColor","`%s'",name);
00967   else
00968     (void) InsertValueInLinkedList(color_list,0,
00969       RemoveElementByValueFromLinkedList(color_list,p));
00970   RelinquishSemaphoreInfo(color_semaphore);
00971   return(p);
00972 }
00973 
00974 /*
00975 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00976 %                                                                             %
00977 %                                                                             %
00978 %                                                                             %
00979 %   G e t C o l o r I n f o L i s t                                           %
00980 %                                                                             %
00981 %                                                                             %
00982 %                                                                             %
00983 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00984 %
00985 %  GetColorInfoList() returns any colors that match the specified pattern.
00986 %
00987 %  The format of the GetColorInfoList function is:
00988 %
00989 %      const ColorInfo **GetColorInfoList(const char *pattern,
00990 %        unsigned long *number_colors,ExceptionInfo *exception)
00991 %
00992 %  A description of each parameter follows:
00993 %
00994 %    o pattern: Specifies a pointer to a text string containing a pattern.
00995 %
00996 %    o number_colors:  This integer returns the number of colors in the list