root / ImageMagick / branches / ImageMagick-6.3.5 / magick / color.c

Revision 8064, 125.8 kB (checked in by cristy, 14 months ago)
Line 
1/*
2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3%                                                                             %
4%                                                                             %
5%                       CCCC   OOO   L       OOO   RRRR                       %
6%                      C      O   O  L      O   O  R   R                      %
7%                      C      O   O  L      O   O  RRRR                       %
8%                      C      O   O  L      O   O  R R                        %
9%                       CCCC   OOO   LLLLL   OOO   R  R                       %
10%                                                                             %
11%                                                                             %
12%                          ImageMagick Color Methods                          %
13%                                                                             %
14%                              Software Design                                %
15%                                John Cristy                                  %
16%                                 July 1992                                   %
17%                                                                             %
18%                                                                             %
19%  Copyright 1999-2007 ImageMagick Studio LLC, a non-profit organization      %
20%  dedicated to making software imaging solutions freely available.           %
21%                                                                             %
22%  You may not use this file except in compliance with the License.  You may  %
23%  obtain a copy of the License at                                            %
24%                                                                             %
25%    http://www.imagemagick.org/script/license.php                            %
26%                                                                             %
27%  Unless required by applicable law or agreed to in writing, software        %
28%  distributed under the License is distributed on an "AS IS" BASIS,          %
29%  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
30%  See the License for the specific language governing permissions and        %
31%  limitations under the License.                                             %
32%                                                                             %
33%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
34%
35%
36*/
37
38/*
39  Include declarations.
40*/
41#include "magick/studio.h"
42#include "magick/blob.h"
43#include "magick/cache-view.h"
44#include "magick/color.h"
45#include "magick/color-private.h"
46#include "magick/client.h"
47#include "magick/configure.h"
48#include "magick/exception.h"
49#include "magick/exception-private.h"
50#include "magick/gem.h"
51#include "magick/geometry.h"
52#include "magick/image-private.h"
53#include "magick/memory_.h"
54#include "magick/monitor.h"
55#include "magick/pixel-private.h"
56#include "magick/quantize.h"
57#include "magick/quantum.h"
58#include "magick/semaphore.h"
59#include "magick/string_.h"
60#include "magick/token.h"
61#include "magick/utility.h"
62#include "magick/xml-tree.h"
63
64/*
65  Define declarations.
66*/
67#define ColorFilename  "colors.xml"
68#define MaxTreeDepth  8
69#define NodesInAList  1536
70
71/*
72  Declare color map.
73*/
74static const char
75  *ColorMap = (const char *)
76    "<?xml version=\"1.0\"?>"
77    "<colormap>"
78    "  <color name=\"none\" color=\"rgb(0,0,0,0)\" compliance=\"SVG\" />"
79    "  <color name=\"black\" color=\"rgb(0,0,0)\" compliance=\"SVG, X11, XPM\" />"
80    "  <color name=\"red\" color=\"rgb(255,0,0)\" compliance=\"SVG, X11, XPM\" />"
81    "  <color name=\"magenta\" color=\"rgb(255,0,255)\" compliance=\"SVG, X11, XPM\" />"
82    "  <color name=\"green\" color=\"rgb(0,128,0)\" compliance=\"SVG\" />"
83    "  <color name=\"cyan\" color=\"rgb(0,255,255)\" compliance=\"SVG, X11, XPM\" />"
84    "  <color name=\"blue\" color=\"rgb(0,0,255)\" compliance=\"SVG, X11, XPM\" />"
85    "  <color name=\"yellow\" color=\"rgb(255,255,0)\" compliance=\"SVG, X11, XPM\" />"
86    "  <color name=\"white\" color=\"rgb(255,255,255)\" compliance=\"SVG, X11\" />"
87    "  <color name=\"AliceBlue\" color=\"rgb(240,248,255)\" compliance=\"SVG, X11, XPM\" />"
88    "  <color name=\"AntiqueWhite\" color=\"rgb(250,235,215)\" compliance=\"SVG, X11, XPM\" />"
89    "  <color name=\"aqua\" color=\"rgb(0,255,255)\" compliance=\"SVG\" />"
90    "  <color name=\"aquamarine\" color=\"rgb(127,255,212)\" compliance=\"SVG, X11, XPM\" />"
91    "  <color name=\"azure\" color=\"rgb(240,255,255)\" compliance=\"SVG, X11, XPM\" />"
92    "  <color name=\"beige\" color=\"rgb(245,245,220)\" compliance=\"SVG, X11, XPM\" />"
93    "  <color name=\"bisque\" color=\"rgb(255,228,196)\" compliance=\"SVG, X11, XPM\" />"
94    "  <color name=\"BlanchedAlmond\" color=\"rgb(255,235,205)\" compliance=\"SVG, X11, XPM\" />"
95    "  <color name=\"BlueViolet\" color=\"rgb(138,43,226)\" compliance=\"SVG, X11, XPM\" />"
96    "  <color name=\"brown\" color=\"rgb(165,42,42)\" compliance=\"SVG, X11, XPM\" />"
97    "  <color name=\"burlywood\" color=\"rgb(222,184,135)\" compliance=\"SVG, X11, XPM\" />"
98    "  <color name=\"CadetBlue\" color=\"rgb(95,158,160)\" compliance=\"SVG, X11, XPM\" />"
99    "  <color name=\"chartreuse\" color=\"rgb(127,255,0)\" compliance=\"SVG, X11, XPM\" />"
100    "  <color name=\"chocolate\" color=\"rgb(210,105,30)\" compliance=\"SVG, X11, XPM\" />"
101    "  <color name=\"coral\" color=\"rgb(255,127,80)\" compliance=\"SVG, X11, XPM\" />"
102    "  <color name=\"CornflowerBlue\" color=\"rgb(100,149,237)\" compliance=\"SVG, X11, XPM\" />"
103    "  <color name=\"cornsilk\" color=\"rgb(255,248,220)\" compliance=\"SVG, X11, XPM\" />"
104    "  <color name=\"crimson\" color=\"rgb(220,20,60)\" compliance=\"SVG\" />"
105    "  <color name=\"DarkBlue\" color=\"rgb(0,0,139)\" compliance=\"SVG, X11\" />"
106    "  <color name=\"DarkCyan\" color=\"rgb(0,139,139)\" compliance=\"SVG, X11\" />"
107    "  <color name=\"DarkGoldenrod\" color=\"rgb(184,134,11)\" compliance=\"SVG, X11, XPM\" />"
108    "  <color name=\"DarkGray\" color=\"rgb(169,169,169)\" compliance=\"SVG, X11\" />"
109    "  <color name=\"DarkGreen\" color=\"rgb(0,100,0)\" compliance=\"SVG, X11, XPM\" />"
110    "  <color name=\"DarkGrey\" color=\"rgb(169,169,169)\" compliance=\"SVG, X11\" />"
111    "  <color name=\"DarkKhaki\" color=\"rgb(189,183,107)\" compliance=\"SVG, X11, XPM\" />"
112    "  <color name=\"DarkMagenta\" color=\"rgb(139,0,139)\" compliance=\"SVG, X11\" />"
113    "  <color name=\"DarkOliveGreen\" color=\"rgb(85,107,47)\" compliance=\"SVG, X11, XPM\" />"
114    "  <color name=\"DarkOrange\" color=\"rgb(255,140,0)\" compliance=\"SVG, X11, XPM\" />"
115    "  <color name=\"DarkOrchid\" color=\"rgb(153,50,204)\" compliance=\"SVG, X11, XPM\" />"
116    "  <color name=\"DarkRed\" color=\"rgb(139,0,0)\" compliance=\"SVG, X11\" />"
117    "  <color name=\"DarkSalmon\" color=\"rgb(233,150,122)\" compliance=\"SVG, X11, XPM\" />"
118    "  <color name=\"DarkSeaGreen\" color=\"rgb(143,188,143)\" compliance=\"SVG, X11, XPM\" />"
119    "  <color name=\"DarkSlateBlue\" color=\"rgb(72,61,139)\" compliance=\"SVG, X11, XPM\" />"
120    "  <color name=\"DarkSlateGray\" color=\"rgb(47,79,79)\" compliance=\"SVG, X11, XPM\" />"
121    "  <color name=\"DarkSlateGrey\" color=\"rgb(47,79,79)\" compliance=\"SVG, X11\" />"
122    "  <color name=\"DarkTurquoise\" color=\"rgb(0,206,209)\" compliance=\"SVG, X11, XPM\" />"
123    "  <color name=\"DarkViolet\" color=\"rgb(148,0,211)\" compliance=\"SVG, X11, XPM\" />"
124    "  <color name=\"DeepPink\" color=\"rgb(255,20,147)\" compliance=\"SVG, X11, XPM\" />"
125    "  <color name=\"DeepSkyBlue\" color=\"rgb(0,191,255)\" compliance=\"SVG, X11, XPM\" />"
126    "  <color name=\"DimGray\" color=\"rgb(105,105,105)\" compliance=\"SVG, X11, XPM\" />"
127    "  <color name=\"DimGrey\" color=\"rgb(105,105,105)\" compliance=\"SVG, X11\" />"
128    "  <color name=\"DodgerBlue\" color=\"rgb(30,144,255)\" compliance=\"SVG, X11, XPM\" />"
129    "  <color name=\"firebrick\" color=\"rgb(178,34,34)\" compliance=\"SVG, X11, XPM\" />"
130    "  <color name=\"FloralWhite\" color=\"rgb(255,250,240)\" compliance=\"SVG, X11, XPM\" />"
131    "  <color name=\"ForestGreen\" color=\"rgb(34,139,34)\" compliance=\"SVG, X11, XPM\" />"
132    "  <color name=\"fractal\" color=\"rgb(128,128,128)\" compliance=\"SVG\" />"
133    "  <color name=\"fuchsia\" color=\"rgb(255,0,255)\" compliance=\"SVG\" />"
134    "  <color name=\"gainsboro\" color=\"rgb(220,220,220)\" compliance=\"SVG, X11, XPM\" />"
135    "  <color name=\"GhostWhite\" color=\"rgb(248,248,255)\" compliance=\"SVG, X11, XPM\" />"
136    "  <color name=\"gold\" color=\"rgb(255,215,0)\" compliance=\"X11, XPM\" />"
137    "  <color name=\"goldenrod\" color=\"rgb(218,165,32)\" compliance=\"SVG, X11, XPM\" />"
138    "  <color name=\"gray\" color=\"rgb(126,126,126)\" compliance=\"SVG\" />"
139    "  <color name=\"gray74\" color=\"rgb(189,189,189)\" compliance=\"SVG, X11\" />"
140    "  <color name=\"gray100\" color=\"rgb(255,255,255)\" compliance=\"SVG, X11\" />"
141    "  <color name=\"grey\" color=\"rgb(190,190,190)\" compliance=\"SVG, X11\" />"
142    "  <color name=\"grey0\" color=\"rgb(0,0,0)\" compliance=\"SVG, X11\" />"
143    "  <color name=\"grey1\" color=\"rgb(3,3,3)\" compliance=\"SVG, X11\" />"
144    "  <color name=\"grey10\" color=\"rgb(26,26,26)\" compliance=\"SVG, X11\" />"
145    "  <color name=\"grey100\" color=\"rgb(255,255,255)\" compliance=\"SVG, X11\" />"
146    "  <color name=\"grey11\" color=\"rgb(28,28,28)\" compliance=\"SVG, X11\" />"
147    "  <color name=\"grey12\" color=\"rgb(31,31,31)\" compliance=\"SVG, X11\" />"
148    "  <color name=\"grey13\" color=\"rgb(33,33,33)\" compliance=\"SVG, X11\" />"
149    "  <color name=\"grey14\" color=\"rgb(36,36,36)\" compliance=\"SVG, X11\" />"
150    "  <color name=\"grey15\" color=\"rgb(38,38,38)\" compliance=\"SVG, X11\" />"
151    "  <color name=\"grey16\" color=\"rgb(41,41,41)\" compliance=\"SVG, X11\" />"
152    "  <color name=\"grey17\" color=\"rgb(43,43,43)\" compliance=\"SVG, X11\" />"
153    "  <color name=\"grey18\" color=\"rgb(45,45,45)\" compliance=\"SVG, X11\" />"
154    "  <color name=\"grey19\" color=\"rgb(48,48,48)\" compliance=\"SVG, X11\" />"
155    "  <color name=\"grey2\" color=\"rgb(5,5,5)\" compliance=\"SVG, X11\" />"
156    "  <color name=\"grey20\" color=\"rgb(51,51,51)\" compliance=\"SVG, X11\" />"
157    "  <color name=\"grey21\" color=\"rgb(54,54,54)\" compliance=\"SVG, X11\" />"
158    "  <color name=\"grey22\" color=\"rgb(56,56,56)\" compliance=\"SVG, X11\" />"
159    "  <color name=\"grey23\" color=\"rgb(59,59,59)\" compliance=\"SVG, X11\" />"
160    "  <color name=\"grey24\" color=\"rgb(61,61,61)\" compliance=\"SVG, X11\" />"
161    "  <color name=\"grey25\" color=\"rgb(64,64,64)\" compliance=\"SVG, X11\" />"
162    "  <color name=\"grey26\" color=\"rgb(66,66,66)\" compliance=\"SVG, X11\" />"
163    "  <color name=\"grey27\" color=\"rgb(69,69,69)\" compliance=\"SVG, X11\" />"
164    "  <color name=\"grey28\" color=\"rgb(71,71,71)\" compliance=\"SVG, X11\" />"
165    "  <color name=\"grey29\" color=\"rgb(74,74,74)\" compliance=\"SVG, X11\" />"
166    "  <color name=\"grey3\" color=\"rgb(8,8,8)\" compliance=\"SVG, X11\" />"
167    "  <color name=\"grey30\" color=\"rgb(77,77,77)\" compliance=\"SVG, X11\" />"
168    "  <color name=\"grey31\" color=\"rgb(79,79,79)\" compliance=\"SVG, X11\" />"
169    "  <color name=\"grey32\" color=\"rgb(82,82,82)\" compliance=\"SVG, X11\" />"
170    "  <color name=\"grey33\" color=\"rgb(84,84,84)\" compliance=\"SVG, X11\" />"
171    "  <color name=\"grey34\" color=\"rgb(87,87,87)\" compliance=\"SVG, X11\" />"
172    "  <color name=\"grey35\" color=\"rgb(89,89,89)\" compliance=\"SVG, X11\" />"
173    "  <color name=\"grey36\" color=\"rgb(92,92,92)\" compliance=\"SVG, X11\" />"
174    "  <color name=\"grey37\" color=\"rgb(94,94,94)\" compliance=\"SVG, X11\" />"
175    "  <color name=\"grey38\" color=\"rgb(97,97,97)\" compliance=\"SVG, X11\" />"
176    "  <color name=\"grey39\" color=\"rgb(99,99,99)\" compliance=\"SVG, X11\" />"
177    "  <color name=\"grey4\" color=\"rgb(10,10,10)\" compliance=\"SVG, X11\" />"
178    "  <color name=\"grey40\" color=\"rgb(102,102,102)\" compliance=\"SVG, X11\" />"
179    "  <color name=\"grey41\" color=\"rgb(105,105,105)\" compliance=\"SVG, X11\" />"
180    "  <color name=\"grey42\" color=\"rgb(107,107,107)\" compliance=\"SVG, X11\" />"
181    "  <color name=\"grey43\" color=\"rgb(110,110,110)\" compliance=\"SVG, X11\" />"
182    "  <color name=\"grey44\" color=\"rgb(112,112,112)\" compliance=\"SVG, X11\" />"
183    "  <color name=\"grey45\" color=\"rgb(115,115,115)\" compliance=\"SVG, X11\" />"
184    "  <color name=\"grey45\" color=\"rgb(117,117,117)\" compliance=\"SVG, X11\" />"
185    "  <color name=\"grey47\" color=\"rgb(120,120,120)\" compliance=\"SVG, X11\" />"
186    "  <color name=\"grey48\" color=\"rgb(122,122,122)\" compliance=\"SVG, X11\" />"
187    "  <color name=\"grey49\" color=\"rgb(125,125,125)\" compliance=\"SVG, X11\" />"
188    "  <color name=\"grey5\" color=\"rgb(13,13,13)\" compliance=\"SVG, X11\" />"
189    "  <color name=\"grey50\" color=\"rgb(50%,50%,50%)\" compliance=\"SVG, X11\" />"
190    "  <color name=\"grey51\" color=\"rgb(130,130,130)\" compliance=\"SVG, X11\" />"
191    "  <color name=\"grey52\" color=\"rgb(133,133,133)\" compliance=\"SVG, X11\" />"
192    "  <color name=\"grey53\" color=\"rgb(135,135,135)\" compliance=\"SVG, X11\" />"
193    "  <color name=\"grey54\" color=\"rgb(138,138,138)\" compliance=\"SVG, X11\" />"
194    "  <color name=\"grey55\" color=\"rgb(140,140,140)\" compliance=\"SVG, X11\" />"
195    "  <color name=\"grey56\" color=\"rgb(143,143,143)\" compliance=\"SVG, X11\" />"
196    "  <color name=\"grey57\" color=\"rgb(145,145,145)\" compliance=\"SVG, X11\" />"
197    "  <color name=\"grey58\" color=\"rgb(148,148,148)\" compliance=\"SVG, X11\" />"
198    "  <color name=\"grey59\" color=\"rgb(150,150,150)\" compliance=\"SVG, X11\" />"
199    "  <color name=\"grey6\" color=\"rgb(15,15,15)\" compliance=\"SVG, X11\" />"
200    "  <color name=\"grey60\" color=\"rgb(153,153,153)\" compliance=\"SVG, X11\" />"
201    "  <color name=\"grey61\" color=\"rgb(156,156,156)\" compliance=\"SVG, X11\" />"
202    "  <color name=\"grey62\" color=\"rgb(158,158,158)\" compliance=\"SVG, X11\" />"
203    "  <color name=\"grey63\" color=\"rgb(161,161,161)\" compliance=\"SVG, X11\" />"
204    "  <color name=\"grey64\" color=\"rgb(163,163,163)\" compliance=\"SVG, X11\" />"
205    "  <color name=\"grey65\" color=\"rgb(166,166,166)\" compliance=\"SVG, X11\" />"
206    "  <color name=\"grey66\" color=\"rgb(168,168,168)\" compliance=\"SVG, X11\" />"
207    "  <color name=\"grey67\" color=\"rgb(171,171,171)\" compliance=\"SVG, X11\" />"
208    "  <color name=\"grey68\" color=\"rgb(173,173,173)\" compliance=\"SVG, X11\" />"
209    "  <color name=\"grey69\" color=\"rgb(176,176,176)\" compliance=\"SVG, X11\" />"
210    "  <color name=\"grey7\" color=\"rgb(18,18,18)\" compliance=\"SVG, X11\" />"
211    "  <color name=\"grey70\" color=\"rgb(179,179,179)\" compliance=\"SVG, X11\" />"
212    "  <color name=\"grey71\" color=\"rgb(181,181,181)\" compliance=\"SVG, X11\" />"
213    "  <color name=\"grey72\" color=\"rgb(184,184,184)\" compliance=\"SVG, X11\" />"
214    "  <color name=\"grey73\" color=\"rgb(186,186,186)\" compliance=\"SVG, X11\" />"
215    "  <color name=\"grey74\" color=\"rgb(189,189,189)\" compliance=\"SVG, X11\" />"
216    "  <color name=\"grey75\" color=\"rgb(191,191,191)\" compliance=\"SVG, X11\" />"
217    "  <color name=\"grey76\" color=\"rgb(194,194,194)\" compliance=\"SVG, X11\" />"
218    "  <color name=\"grey77\" color=\"rgb(196,196,196)\" compliance=\"SVG, X11\" />"
219    "  <color name=\"grey78\" color=\"rgb(199,199,199)\" compliance=\"SVG, X11\" />"
220    "  <color name=\"grey79\" color=\"rgb(201,201,201)\" compliance=\"SVG, X11\" />"
221    "  <color name=\"grey8\" color=\"rgb(20,20,20)\" compliance=\"SVG, X11\" />"
222    "  <color name=\"grey80\" color=\"rgb(204,204,204)\" compliance=\"SVG, X11\" />"
223    "  <color name=\"grey81\" color=\"rgb(207,207,207)\" compliance=\"SVG, X11\" />"
224    "  <color name=\"grey82\" color=\"rgb(209,209,209)\" compliance=\"SVG, X11\" />"
225    "  <color name=\"grey83\" color=\"rgb(212,212,212)\" compliance=\"SVG, X11\" />"
226    "  <color name=\"grey84\" color=\"rgb(214,214,214)\" compliance=\"SVG, X11\" />"
227    "  <color name=\"grey85\" color=\"rgb(217,217,217)\" compliance=\"SVG, X11\" />"
228    "  <color name=\"grey86\" color=\"rgb(219,219,219)\" compliance=\"SVG, X11\" />"
229    "  <color name=\"grey87\" color=\"rgb(222,222,222)\" compliance=\"SVG, X11\" />"
230    "  <color name=\"grey88\" color=\"rgb(224,224,224)\" compliance=\"SVG, X11\" />"
231    "  <color name=\"grey89\" color=\"rgb(227,227,227)\" compliance=\"SVG, X11\" />"
232    "  <color name=\"grey9\" color=\"rgb(23,23,23)\" compliance=\"SVG, X11\" />"
233    "  <color name=\"grey90\" color=\"rgb(229,229,229)\" compliance=\"SVG, X11\" />"
234    "  <color name=\"grey91\" color=\"rgb(232,232,232)\" compliance=\"SVG, X11\" />"
235    "  <color name=\"grey92\" color=\"rgb(235,235,235)\" compliance=\"SVG, X11\" />"
236    "  <color name=\"grey93\" color=\"rgb(237,237,237)\" compliance=\"SVG, X11\" />"
237    "  <color name=\"grey94\" color=\"rgb(240,240,240)\" compliance=\"SVG, X11\" />"
238    "  <color name=\"grey95\" color=\"rgb(242,242,242)\" compliance=\"SVG, X11\" />"
239    "  <color name=\"grey96\" color=\"rgb(245,245,245)\" compliance=\"SVG, X11\" />"
240    "  <color name=\"grey97\" color=\"rgb(247,247,247)\" compliance=\"SVG, X11\" />"
241    "  <color name=\"grey98\" color=\"rgb(250,250,250)\" compliance=\"SVG, X11\" />"
242    "  <color name=\"grey99\" color=\"rgb(252,252,252)\" compliance=\"SVG, X11\" />"
243    "  <color name=\"honeydew\" color=\"rgb(240,255,240)\" compliance=\"SVG, X11, XPM\" />"
244    "  <color name=\"HotPink\" color=\"rgb(255,105,180)\" compliance=\"SVG, X11, XPM\" />"
245    "  <color name=\"IndianRed\" color=\"rgb(205,92,92)\" compliance=\"SVG, X11, XPM\" />"
246    "  <color name=\"indigo\" color=\"rgb(75,0,130)\" compliance=\"SVG\" />"
247    "  <color name=\"ivory\" color=\"rgb(255,255,240)\" compliance=\"SVG, X11, XPM\" />"
248    "  <color name=\"khaki\" color=\"rgb(240,230,140)\" compliance=\"SVG, X11, XPM\" />"
249    "  <color name=\"lavender\" color=\"rgb(230,230,250)\" compliance=\"SVG, X11, XPM\" />"
250    "  <color name=\"LavenderBlush\" color=\"rgb(255,240,245)\" compliance=\"SVG, X11, XPM\" />"
251    "  <color name=\"LawnGreen\" color=\"rgb(124,252,0)\" compliance=\"SVG, X11, XPM\" />"
252    "  <color name=\"LemonChiffon\" color=\"rgb(255,250,205)\" compliance=\"SVG, X11, XPM\" />"
253    "  <color name=\"LightBlue\" color=\"rgb(173,216,230)\" compliance=\"SVG, X11, XPM\" />"
254    "  <color name=\"LightCoral\" color=\"rgb(240,128,128)\" compliance=\"SVG, X11, XPM\" />"
255    "  <color name=\"LightCyan\" color=\"rgb(224,255,255)\" compliance=\"SVG, X11, XPM\" />"
256    "  <color name=\"LightGoldenrodYellow\" color=\"rgb(250,250,210)\" compliance=\"SVG, X11, XPM\" />"
257    "  <color name=\"LightGray\" color=\"rgb(211,211,211)\" compliance=\"SVG, X11, XPM\" />"
258    "  <color name=\"LightGreen\" color=\"rgb(144,238,144)\" compliance=\"SVG, X11\" />"
259    "  <color name=\"LightGrey\" color=\"rgb(211,211,211)\" compliance=\"SVG, X11\" />"
260    "  <color name=\"LightPink\" color=\"rgb(255,182,193)\" compliance=\"SVG, X11, XPM\" />"
261    "  <color name=\"LightSalmon\" color=\"rgb(255,160,122)\" compliance=\"SVG, X11, XPM\" />"
262    "  <color name=\"LightSeaGreen\" color=\"rgb(32,178,170)\" compliance=\"SVG, X11, XPM\" />"
263    "  <color name=\"LightSkyBlue\" color=\"rgb(135,206,250)\" compliance=\"SVG, X11, XPM\" />"
264    "  <color name=\"LightSlateGray\" color=\"rgb(119,136,153)\" compliance=\"SVG, X11, XPM\" />"
265    "  <color name=\"LightSlateGrey\" color=\"rgb(119,136,153)\" compliance=\"SVG, X11\" />"
266    "  <color name=\"LightSteelBlue\" color=\"rgb(176,196,222)\" compliance=\"SVG, X11, XPM\" />"
267    "  <color name=\"LightYellow\" color=\"rgb(255,255,224)\" compliance=\"SVG, X11, XPM\" />"
268    "  <color name=\"lime\" color=\"rgb(0,255,0)\" compliance=\"SVG\" />"
269    "  <color name=\"LimeGreen\" color=\"rgb(50,205,50)\" compliance=\"SVG, X11, XPM\" />"
270    "  <color name=\"linen\" color=\"rgb(250,240,230)\" compliance=\"SVG, X11, XPM\" />"
271    "  <color name=\"maroon\" color=\"rgb(128,0,0)\" compliance=\"SVG\" />"
272    "  <color name=\"MediumAquamarine\" color=\"rgb(102,205,170)\" compliance=\"SVG, X11, XPM\" />"
273    "  <color name=\"MediumBlue\" color=\"rgb(0,0,205)\" compliance=\"SVG, X11, XPM\" />"
274    "  <color name=\"MediumOrchid\" color=\"rgb(186,85,211)\" compliance=\"SVG, X11, XPM\" />"
275    "  <color name=\"MediumPurple\" color=\"rgb(147,112,219)\" compliance=\"SVG, X11, XPM\" />"
276    "  <color name=\"MediumSeaGreen\" color=\"rgb(60,179,113)\" compliance=\"SVG, X11, XPM\" />"
277    "  <color name=\"MediumSlateBlue\" color=\"rgb(123,104,238)\" compliance=\"SVG, X11, XPM\" />"
278    "  <color name=\"MediumSpringGreen\" color=\"rgb(0,250,154)\" compliance=\"SVG, X11, XPM\" />"
279    "  <color name=\"MediumTurquoise\" color=\"rgb(72,209,204)\" compliance=\"SVG, X11, XPM\" />"
280    "  <color name=\"MediumVioletRed\" color=\"rgb(199,21,133)\" compliance=\"SVG, X11, XPM\" />"
281    "  <color name=\"MidnightBlue\" color=\"rgb(25,25,112)\" compliance=\"SVG, X11, XPM\" />"
282    "  <color name=\"MintCream\" color=\"rgb(245,255,250)\" compliance=\"SVG, X11, XPM\" />"
283    "  <color name=\"MistyRose\" color=\"rgb(255,228,225)\" compliance=\"SVG, X11, XPM\" />"
284    "  <color name=\"moccasin\" color=\"rgb(255,228,181)\" compliance=\"SVG, X11, XPM\" />"
285    "  <color name=\"NavajoWhite\" color=\"rgb(255,222,173)\" compliance=\"SVG, X11, XPM\" />"
286    "  <color name=\"navy\" color=\"rgb(0,0,128)\" compliance=\"SVG, X11, XPM\" />"
287    "  <color name=\"matte\" color=\"rgb(0,0,0,0)\" compliance=\"SVG\" />"
288    "  <color name=\"OldLace\" color=\"rgb(253,245,230)\" compliance=\"SVG, X11, XPM\" />"
289    "  <color name=\"olive\" color=\"rgb(128,128,0)\" compliance=\"SVG\" />"
290    "  <color name=\"OliveDrab\" color=\"rgb(107,142,35)\" compliance=\"SVG, X11, XPM\" />"
291    "  <color name=\"opaque\" color=\"rgba(0,0,0)\" compliance=\"SVG\" />"
292    "  <color name=\"orange\" color=\"rgb(255,165,0)\" compliance=\"SVG, X11, XPM\" />"
293    "  <color name=\"OrangeRed\" color=\"rgb(255,69,0)\" compliance=\"SVG, X11, XPM\" />"
294    "  <color name=\"orchid\" color=\"rgb(218,112,214)\" compliance=\"SVG, X11, XPM\" />"
295    "  <color name=\"PaleGoldenrod\" color=\"rgb(238,232,170)\" compliance=\"SVG, X11, XPM\" />"
296    "  <color name=\"PaleGreen\" color=\"rgb(152,251,152)\" compliance=\"SVG, X11, XPM\" />"
297    "  <color name=\"PaleTurquoise\" color=\"rgb(175,238,238)\" compliance=\"SVG, X11, XPM\" />"
298    "  <color name=\"PaleVioletRed\" color=\"rgb(219,112,147)\" compliance=\"SVG, X11, XPM\" />"
299    "  <color name=\"PapayaWhip\" color=\"rgb(255,239,213)\" compliance=\"SVG, X11, XPM\" />"
300    "  <color name=\"PeachPuff\" color=\"rgb(255,218,185)\" compliance=\"SVG, X11, XPM\" />"
301    "  <color name=\"peru\" color=\"rgb(205,133,63)\" compliance=\"SVG, X11, XPM\" />"
302    "  <color name=\"pink\" color=\"rgb(255,192,203)\" compliance=\"SVG, X11, XPM\" />"
303    "  <color name=\"plum\" color=\"rgb(221,160,221)\" compliance=\"SVG, X11, XPM\" />"
304    "  <color name=\"PowderBlue\" color=\"rgb(176,224,230)\" compliance=\"SVG, X11, XPM\" />"
305    "  <color name=\"purple\" color=\"rgb(128,0,128)\" compliance=\"SVG\" />"
306    "  <color name=\"RosyBrown\" color=\"rgb(188,143,143)\" compliance=\"SVG, X11, XPM\" />"
307    "  <color name=\"RoyalBlue\" color=\"rgb(65,105,225)\" compliance=\"SVG, X11, XPM\" />"
308    "  <color name=\"SaddleBrown\" color=\"rgb(139,69,19)\" compliance=\"SVG, X11, XPM\" />"
309    "  <color name=\"salmon\" color=\"rgb(250,128,114)\" compliance=\"SVG, X11, XPM\" />"
310    "  <color name=\"SandyBrown\" color=\"rgb(244,164,96)\" compliance=\"SVG, X11, XPM\" />"
311    "  <color name=\"SeaGreen\" color=\"rgb(45,139,87)\" compliance=\"SVG, X11, XPM\" />"
312    "  <color name=\"seashell\" color=\"rgb(255,245,238)\" compliance=\"SVG, X11, XPM\" />"
313    "  <color name=\"sienna\" color=\"rgb(160,82,45)\" compliance=\"SVG, X11, XPM\" />"
314    "  <color name=\"silver\" color=\"rgb(192,192,192)\" compliance=\"SVG\" />"
315    "  <color name=\"SkyBlue\" color=\"rgb(135,206,235)\" compliance=\"SVG, X11, XPM\" />"
316    "  <color name=\"SlateBlue\" color=\"rgb(106,90,205)\" compliance=\"SVG, X11, XPM\" />"
317    "  <color name=\"SlateGray\" color=\"rgb(112,128,144)\" compliance=\"SVG, X11, XPM\" />"
318    "  <color name=\"SlateGrey\" color=\"rgb(112,128,144)\" compliance=\"SVG, X11\" />"
319    "  <color name=\"snow\" color=\"rgb(255,250,250)\" compliance=\"SVG, X11, XPM\" />"
320    "  <color name=\"SpringGreen\" color=\"rgb(0,255,127)\" compliance=\"SVG, X11, XPM\" />"
321    "  <color name=\"SteelBlue\" color=\"rgb(70,130,180)\" compliance=\"SVG, X11, XPM\" />"
322    "  <color name=\"tan\" color=\"rgb(210,180,140)\" compliance=\"SVG, X11, XPM\" />"
323    "  <color name=\"teal\" color=\"rgb(0,128,128)\" compliance=\"SVG\" />"
324    "  <color name=\"thistle\" color=\"rgb(216,191,216)\" compliance=\"SVG, X11, XPM\" />"
325    "  <color name=\"tomato\" color=\"rgb(255,99,71)\" compliance=\"SVG, X11, XPM\" />"
326    "  <color name=\"transparent\" color=\"rgb(0,0,0,0)\" compliance=\"SVG\" />"
327    "  <color name=\"turquoise\" color=\"rgb(64,224,208)\" compliance=\"SVG, X11, XPM\" />"
328    "  <color name=\"violet\" color=\"rgb(238,130,238)\" compliance=\"SVG, X11, XPM\" />"
329    "  <color name=\"wheat\" color=\"rgb(245,222,179)\" compliance=\"SVG, X11, XPM\" />"
330    "  <color name=\"WhiteSmoke\" color=\"rgb(245,245,245)\" compliance=\"SVG, X11, XPM\" />"
331    "  <color name=\"YellowGreen\" color=\"rgb(154,205,50)\" compliance=\"SVG, X11, XPM\" />"
332    "</colormap>";
333
334/*
335  Typedef declarations.
336*/
337typedef struct _NodeInfo
338{
339  struct _NodeInfo
340    *child[16];
341
342  ColorPacket
343    *list;
344
345  MagickSizeType
346    number_unique;
347
348  unsigned long
349    level;
350} NodeInfo;
351
352typedef struct _Nodes
353{
354  NodeInfo
355    nodes[NodesInAList];
356
357  struct _Nodes
358    *next;
359} Nodes;
360
361typedef struct _CubeInfo
362{
363  NodeInfo
364    *root;
365
366  long
367    x,
368    progress;
369
370  unsigned long
371    colors,
372    free_nodes;
373
374  NodeInfo
375    *node_info;
376
377  Nodes
378    *node_queue;
379} CubeInfo;
380
381/*
382  Static declarations.
383*/
384static LinkedListInfo
385  *color_list = (LinkedListInfo *) NULL;
386
387static SemaphoreInfo
388  *color_semaphore = (SemaphoreInfo *) NULL;
389
390static volatile MagickBooleanType
391  instantiate_color = MagickFalse;
392
393/*
394  Forward declarations.
395*/
396static CubeInfo
397  *GetCubeInfo(void);
398
399static NodeInfo
400  *GetNodeInfo(CubeInfo *,const unsigned long);
401
402static MagickBooleanType
403  InitializeColorList(ExceptionInfo *),
404  LoadColorLists(const char *,ExceptionInfo *);
405
406static void
407  DestroyColorCube(const Image *,NodeInfo *);
408
409/*
410%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
411%                                                                             %
412%                                                                             %
413%                                                                             %
414+   C l a s s i f y I m a g e C o l o r s                                     %
415%                                                                             %
416%                                                                             %
417%                                                                             %
418%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
419%
420%  ClassifyImageColors() builds a populated CubeInfo tree for the specified
421%  image.  The returned tree should be deallocated using DestroyCubeInfo()
422%  once it is no longer needed.
423%
424%  The format of the ClassifyImageColors() method is:
425%
426%      CubeInfo *ClassifyImageColors(const Image *image,
427%        ExceptionInfo *exception)
428%
429%  A description of each parameter follows.
430%
431%    o image: The image.
432%
433%    o exception: Return any errors or warnings in this structure.
434%
435*/
436
437static inline unsigned long ColorToNodeId(const Image *image,
438  const MagickPixelPacket *pixel,unsigned long index)
439{
440  unsigned long
441    id;
442
443  id=(unsigned long) (
444    ((ScaleQuantumToChar(RoundToQuantum(pixel->red)) >> index) & 0x01) |
445    ((ScaleQuantumToChar(RoundToQuantum(pixel->green)) >> index) & 0x01) << 1 |
446    ((ScaleQuantumToChar(RoundToQuantum(pixel->blue)) >> index) & 0x01) << 2);
447  if (image->matte != MagickFalse)
448    id|=((ScaleQuantumToChar(RoundToQuantum(pixel->opacity)) >> index) &
449      0x01) << 3;
450  return(id);
451}
452
453static CubeInfo *ClassifyImageColors(const Image *image,
454  ExceptionInfo *exception)
455{
456#define EvaluateImageColorsText  "  Compute image colors...  "
457
458  CubeInfo
459    *cube_info;
460
461  long
462    y;
463
464  MagickBooleanType
465    status;
466
467  MagickPixelPacket
468    pixel,
469    target;
470
471  NodeInfo
472    *node_info;
473
474  register const IndexPacket
475    *indexes;
476
477  register const PixelPacket
478    *p;
479
480  register long
481    i,
482    x;
483
484  register unsigned long
485    id,
486    index,
487    level;
488
489  ViewInfo
490    *image_view;
491
492  /*
493    Initialize color description tree.
494  */
495  assert(image != (const Image *) NULL);
496  assert(image->signature == MagickSignature);
497  if (image->debug != MagickFalse)
498    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
499  cube_info=GetCubeInfo();
500  if (cube_info == (CubeInfo *) NULL)
501    {
502      (void) ThrowMagickException(exception,GetMagickModule(),
503        ResourceLimitError,"MemoryAllocationFailed","`%s'",image->filename);
504      return(cube_info);
505    }
506  GetMagickPixelPacket(image,&pixel);
507  GetMagickPixelPacket(image,&target);
508  image_view=OpenCacheView(image);
509  for (y=0; y < (long) image->rows; y++)
510  {
511    p=AcquireCacheViewPixels(image_view,0,y,image->columns,1,exception);
512    if (p == (const PixelPacket *) NULL)
513      break;
514    indexes=AcquireCacheViewIndexes(image_view);
515    for (x=0; x < (long) image->columns; x++)
516    {
517      /*
518        Start at the root and proceed level by level.
519      */
520      node_info=cube_info->root;
521      index=MaxTreeDepth-1;
522      for (level=1; level < MaxTreeDepth; level++)
523      {
524        SetMagickPixelPacket(image,p,indexes+x,&pixel);
525        id=ColorToNodeId(image,&pixel,index);
526        if (node_info->child[id] == (NodeInfo *) NULL)
527          {
528            node_info->child[id]=GetNodeInfo(cube_info,level);
529            if (node_info->child[id] == (NodeInfo *) NULL)
530              {
531                (void) ThrowMagickException(exception,GetMagickModule(),
532                  ResourceLimitError,"MemoryAllocationFailed","`%s'",
533                  image->filename);
534                return(0);
535              }
536          }
537        node_info=node_info->child[id];
538        index--;
539      }
540      for (i=0; i < (long) node_info->number_unique; i++)
541      {
542        SetMagickPixelPacket(image,&node_info->list[i].pixel,
543          &node_info->list[i].index,&target);
544        if (IsMagickColorEqual(&pixel,&target) != MagickFalse)
545          break;
546      }
547      if (i < (long) node_info->number_unique)
548        node_info->list[i].count++;
549      else
550        {
551          if (node_info->number_unique == 0)
552            node_info->list=(ColorPacket *) AcquireMagickMemory(
553              sizeof(*node_info->list));
554          else
555            node_info->list=(ColorPacket *) ResizeQuantumMemory(node_info->list,
556              (size_t) (i+1),sizeof(*node_info->list));
557          if (node_info->list == (ColorPacket *) NULL)
558            {
559              (void) ThrowMagickException(exception,GetMagickModule(),
560                ResourceLimitError,"MemoryAllocationFailed","`%s'",
561                image->filename);
562              return(0);
563            }
564          node_info->list[i].pixel=(*p);
565          if ((image->colorspace == CMYKColorspace) ||
566              (image->storage_class == PseudoClass))
567            node_info->list[i].index=indexes[x];
568          node_info->list[i].count=1;
569          node_info->number_unique++;
570          cube_info->colors++;
571        }
572      p++;
573    }
574    if ((image->progress_monitor != (MagickProgressMonitor) NULL) &&
575        (QuantumTick(y,image->rows) != MagickFalse))
576      {
577        status=image->progress_monitor(EvaluateImageColorsText,y,image->rows,
578          image->client_data);
579        if (status == MagickFalse)
580          break;
581      }
582  }
583  image_view=CloseCacheView(image_view);
584  return(cube_info);
585}
586
587/*
588%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
589%                                                                             %
590%                                                                             %
591%                                                                             %
592+   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                         %
593%                                                                             %
594%                                                                             %
595%                                                                             %
596%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
597%
598%  ConcatenateColorComponent() returns the pixel as a canonical string.
599%
600%  The format of the ConcatenateColorComponent() method is:
601%
602%      void ConcatenateColorComponent(const MagickPixelPacket *pixel,
603%        const ChannelType channel,const ComplianceType compliance,char *tuple)
604%
605%  A description of each parameter follows.
606%
607%    o pixel:  The pixel.
608%
609%    channel:  The channel.
610%
611%    o compliance: Adhere to this color standard: SVG, X11, or XPM.
612%
613%    tuple:  The color tuple.
614%
615*/
616MagickExport void ConcatenateColorComponent(const MagickPixelPacket *pixel,
617  const ChannelType channel,const ComplianceType compliance,char *tuple)
618{
619  char
620    component[MaxTextExtent];
621
622  MagickRealType
623    color;
624
625  color=0.0;
626  switch (channel)
627  {
628    case RedChannel:
629    {
630      color=pixel->red;
631      break;
632    }
633    case GreenChannel:
634    {
635      color=pixel->green;
636      break;
637    }
638    case BlueChannel:
639    {
640      color=pixel->blue;
641      break;
642    }
643    case OpacityChannel:
644    {
645      color=pixel->opacity;
646      break;
647    }
648    case IndexChannel:
649    {
650      color=pixel->index;
651      break;
652    }
653    default: break;
654  }
655  if (compliance != SVGCompliance)
656    {
657      if (pixel->depth > 16)
658        {
659          (void) FormatMagickString(component,MaxTextExtent,"%10lu",
660            (unsigned long) ScaleQuantumToLong(RoundToQuantum(color)));
661          (void) ConcatenateMagickString(tuple,component,MaxTextExtent);
662          return;
663        }
664      if (pixel->depth > 8)
665        {
666          (void) FormatMagickString(component,MaxTextExtent,"%5d",
667            ScaleQuantumToShort(RoundToQuantum(color)));
668          (void) ConcatenateMagickString(tuple,component,MaxTextExtent);
669          return;
670        }
671      (void) FormatMagickString(component,MaxTextExtent,"%3d",
672        ScaleQuantumToChar(RoundToQuantum(color)));
673      (void) ConcatenateMagickString(tuple,component,MaxTextExtent);
674      return;
675    }
676  if (channel == OpacityChannel)
677    {
678      (void) FormatMagickString(component,MaxTextExtent,"%g",
679        (double) (QuantumScale*color));
680      (void) ConcatenateMagickString(tuple,component,MaxTextExtent);
681      return;
682    }
683  if (pixel->depth > 8)
684    {
685      (void) FormatMagickString(component,MaxTextExtent,"%g%%",
686        (double) (100.0*QuantumScale*color));
687      (void) ConcatenateMagickString(tuple,component,MaxTextExtent);
688      return;
689    }
690  (void) FormatMagickString(component,MaxTextExtent,"%d",
691    ScaleQuantumToChar(RoundToQuantum(color)));
692  (void) ConcatenateMagickString(tuple,component,MaxTextExtent);
693}
694
695/*
696%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
697%                                                                             %
698%                                                                             %
699%                                                                             %
700+   D e f i n e I m a g e H i s t o g r a m                                   %
701%                                                                             %
702%                                                                             %
703%                                                                             %
704%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
705%
706%  DefineImageHistogram() traverses the color cube tree and notes each colormap
707%  entry.  A colormap entry is any node in the color cube tree where the
708%  of unique colors is not zero.
709%
710%  The format of the DefineImageHistogram method is:
711%
712%      DefineImageHistogram(const Image *image,NodeInfo *node_info,
713%        ColorPacket **unique_colors)
714%
715%  A description of each parameter follows.
716%
717%    o image: The image.
718%
719%    o node_info: The address of a structure of type NodeInfo which points to a
720%      node in the color cube tree that is to be pruned.
721%
722%    o histogram: The image histogram.
723%
724*/
725static void DefineImageHistogram(const Image *image,NodeInfo *node_info,
726  ColorPacket **histogram)
727{
728  register long
729    i;
730
731  unsigned long
732    number_children;
733
734  /*
735    Traverse any children.
736  */
737  number_children=image->matte == MagickFalse ? 8UL : 16UL;
738  for (i=0; i < (long) number_children; i++)
739    if (node_info->child[i] != (NodeInfo *) NULL)
740      DefineImageHistogram(image,node_info->child[i],histogram);
741  if (node_info->level == (MaxTreeDepth-1))
742    {
743      register ColorPacket
744        *p;
745
746      p=node_info->list;
747      for (i=0; i < (long) node_info->number_unique; i++)
748      {
749        (*histogram)->pixel=p->pixel;
750        (*histogram)->index=p->index;
751        (*histogram)->count=p->count;
752        (*histogram)++;
753        p++;
754      }
755    }
756}
757
758/*
759%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
760%                                                                             %
761%                                                                             %
762%                                                                             %
763+   D e s t r o y C o l o r L i s t                                           %
764%                                                                             %
765%                                                                             %
766%                                                                             %
767%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
768%
769%  DestroyColorList() deallocates memory associated with the color list.
770%
771%  The format of the DestroyColorList method is:
772%
773%      DestroyColorList(void)
774%
775*/
776
777static void *DestroyColorElement(void *color_info)
778{
779  register ColorInfo
780    *p;
781
782  p=(ColorInfo *) color_info;
783  if (p->path != (char *) NULL)
784    p->path=DestroyString(p->path);
785  if (p->name != (char *) NULL)
786    p->name=DestroyString(p->name);
787  p=(ColorInfo *) RelinquishMagickMemory(p);
788  return((void *) NULL);
789}
790
791MagickExport void DestroyColorList(void)
792{
793  AcquireSemaphoreInfo(&color_semaphore);
794  if (color_list != (LinkedListInfo *) NULL)
795    color_list=DestroyLinkedList(color_list,DestroyColorElement);
796  instantiate_color=MagickFalse;
797  RelinquishSemaphoreInfo(color_semaphore);
798  color_semaphore=DestroySemaphoreInfo(color_semaphore);
799}
800
801/*
802%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
803%                                                                             %
804%                                                                             %
805%                                                                             %
806+   D e s t r o y C u b e I n f o                                             %
807%                                                                             %
808%                                                                             %
809%                                                                             %
810%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
811%
812%  DestroyCubeInfo() deallocates memory associated with a CubeInfo structure.
813%
814%  The format of the DestroyCubeInfo method is:
815%
816%      DestroyCubeInfo(const Image *image,CubeInfo *cube_info)
817%
818%  A description of each parameter follows:
819%
820%    o image: The image.
821%
822%    o cube_info: The address of a structure of type CubeInfo.
823%
824*/
825static CubeInfo *DestroyCubeInfo(const Image *image,CubeInfo *cube_info)
826{
827  register Nodes
828    *nodes;
829
830  /*
831    Release color cube tree storage.
832  */
833  DestroyColorCube(image,cube_info->root);
834  do
835  {
836    nodes=cube_info->node_queue->next;
837    cube_info->node_queue=(Nodes *)
838      RelinquishMagickMemory(cube_info->node_queue);
839    cube_info->node_queue=nodes;
840  } while (cube_info->node_queue != (Nodes *) NULL);
841  return((CubeInfo *) RelinquishMagickMemory(cube_info));
842}
843
844/*
845%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
846%                                                                             %
847%                                                                             %
848%                                                                             %
849+  D e s t r o y C o l o r C u b e                                            %
850%                                                        Â