MagickCore  6.7.5
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-2012 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 "MagickCore/studio.h"
00044 #include "MagickCore/blob.h"
00045 #include "MagickCore/cache-view.h"
00046 #include "MagickCore/cache.h"
00047 #include "MagickCore/color.h"
00048 #include "MagickCore/color-private.h"
00049 #include "MagickCore/colorspace-private.h"
00050 #include "MagickCore/client.h"
00051 #include "MagickCore/configure.h"
00052 #include "MagickCore/exception.h"
00053 #include "MagickCore/exception-private.h"
00054 #include "MagickCore/gem.h"
00055 #include "MagickCore/gem-private.h"
00056 #include "MagickCore/geometry.h"
00057 #include "MagickCore/image-private.h"
00058 #include "MagickCore/memory_.h"
00059 #include "MagickCore/monitor.h"
00060 #include "MagickCore/monitor-private.h"
00061 #include "MagickCore/option.h"
00062 #include "MagickCore/pixel-accessor.h"
00063 #include "MagickCore/quantize.h"
00064 #include "MagickCore/quantum.h"
00065 #include "MagickCore/quantum-private.h"
00066 #include "MagickCore/semaphore.h"
00067 #include "MagickCore/string_.h"
00068 #include "MagickCore/token.h"
00069 #include "MagickCore/utility.h"
00070 #include "MagickCore/utility-private.h"
00071 #include "MagickCore/xml-tree.h"
00072 
00073 /*
00074   Define declarations.
00075 */
00076 #define ColorFilename  "colors.xml"
00077 
00078 /*
00079   Typedef declarations.
00080 */
00081 typedef struct _ColorMapInfo
00082 {
00083   const char
00084     *name;
00085 
00086   const unsigned char
00087     red,
00088     green,
00089     blue;
00090 
00091   const float
00092     alpha;
00093 
00094   const ssize_t
00095     compliance;
00096 } ColorMapInfo;
00097 
00098 /*
00099   Static declarations.
00100 */
00101 static const ColorMapInfo
00102   ColorMap[] =
00103   {
00104     { "none", 0, 0, 0, 0, SVGCompliance | XPMCompliance },
00105     { "black", 0, 0, 0, 1, SVGCompliance | X11Compliance | XPMCompliance },
00106     { "red", 255, 0, 0, 1, SVGCompliance | X11Compliance | XPMCompliance },
00107     { "magenta", 255, 0, 255, 1, SVGCompliance | X11Compliance | XPMCompliance },
00108     { "green", 0, 128, 0, 1, SVGCompliance },
00109     { "cyan", 0, 255, 255, 1, SVGCompliance | X11Compliance | XPMCompliance },
00110     { "blue", 0, 0, 255, 1, SVGCompliance | X11Compliance | XPMCompliance },
00111     { "yellow", 255, 255, 0, 1, SVGCompliance | X11Compliance | XPMCompliance },
00112     { "white", 255, 255, 255, 1, SVGCompliance | X11Compliance },
00113     { "AliceBlue", 240, 248, 255, 1, SVGCompliance | X11Compliance | XPMCompliance },
00114     { "AntiqueWhite", 250, 235, 215, 1, SVGCompliance | X11Compliance | XPMCompliance },
00115     { "AntiqueWhite1", 255, 239, 219, 1, X11Compliance },
00116     { "AntiqueWhite2", 238, 223, 204, 1, X11Compliance },
00117     { "AntiqueWhite3", 205, 192, 176, 1, X11Compliance },
00118     { "AntiqueWhite4", 139, 131, 120, 1, X11Compliance },
00119     { "aqua", 0, 255, 255, 1, SVGCompliance },
00120     { "aquamarine", 127, 255, 212, 1, SVGCompliance | X11Compliance | XPMCompliance },
00121     { "aquamarine1", 127, 255, 212, 1, X11Compliance },
00122     { "aquamarine2", 118, 238, 198, 1, X11Compliance },
00123     { "aquamarine3", 102, 205, 170, 1, X11Compliance },
00124     { "aquamarine4", 69, 139, 116, 1, X11Compliance },
00125     { "azure", 240, 255, 255, 1, SVGCompliance | X11Compliance | XPMCompliance },
00126     { "azure1", 240, 255, 255, 1, X11Compliance },
00127     { "azure2", 224, 238, 238, 1, X11Compliance },
00128     { "azure3", 193, 205, 205, 1, X11Compliance },
00129     { "azure4", 131, 139, 139, 1, X11Compliance },
00130     { "beige", 245, 245, 220, 1, SVGCompliance | X11Compliance | XPMCompliance },
00131     { "bisque", 255, 228, 196, 1, SVGCompliance | X11Compliance | XPMCompliance },
00132     { "bisque1", 255, 228, 196, 1, X11Compliance },
00133     { "bisque2", 238, 213, 183, 1, X11Compliance },
00134     { "bisque3", 205, 183, 158, 1, X11Compliance },
00135     { "bisque4", 139, 125, 107, 1, X11Compliance },
00136     { "BlanchedAlmond", 255, 235, 205, 1, SVGCompliance | X11Compliance | XPMCompliance },
00137     { "blue1", 0, 0, 255, 1, X11Compliance },
00138     { "blue2", 0, 0, 238, 1, X11Compliance },
00139     { "blue3", 0, 0, 205, 1, X11Compliance },
00140     { "blue4", 0, 0, 139, 1, X11Compliance },
00141     { "BlueViolet", 138, 43, 226, 1, SVGCompliance | X11Compliance | XPMCompliance },
00142     { "brown", 165, 42, 42, 1, SVGCompliance | X11Compliance | XPMCompliance },
00143     { "brown1", 255, 64, 64, 1, X11Compliance },
00144     { "brown2", 238, 59, 59, 1, X11Compliance },
00145     { "brown3", 205, 51, 51, 1, X11Compliance },
00146     { "brown4", 139, 35, 35, 1, X11Compliance },
00147     { "burlywood", 222, 184, 135, 1, SVGCompliance | X11Compliance | XPMCompliance },
00148     { "burlywood1", 255, 211, 155, 1, X11Compliance },
00149     { "burlywood2", 238, 197, 145, 1, X11Compliance },
00150     { "burlywood3", 205, 170, 125, 1, X11Compliance },
00151     { "burlywood4", 139, 115, 85, 1, X11Compliance },
00152     { "CadetBlue", 95, 158, 160, 1, SVGCompliance | X11Compliance | XPMCompliance },
00153     { "CadetBlue1", 152, 245, 255, 1, X11Compliance },
00154     { "CadetBlue2", 142, 229, 238, 1, X11Compliance },
00155     { "CadetBlue3", 122, 197, 205, 1, X11Compliance },
00156     { "CadetBlue4", 83, 134, 139, 1, X11Compliance },
00157     { "chartreuse", 127, 255, 0, 1, SVGCompliance | X11Compliance | XPMCompliance },
00158     { "chartreuse1", 127, 255, 0, 1, X11Compliance },
00159     { "chartreuse2", 118, 238, 0, 1, X11Compliance },
00160     { "chartreuse3", 102, 205, 0, 1, X11Compliance },
00161     { "chartreuse4", 69, 139, 0, 1, X11Compliance },
00162     { "chocolate", 210, 105, 30, 1, SVGCompliance | X11Compliance | XPMCompliance },
00163     { "chocolate1", 255, 127, 36, 1, X11Compliance },
00164     { "chocolate2", 238, 118, 33, 1, X11Compliance },
00165     { "chocolate3", 205, 102, 29, 1, X11Compliance },
00166     { "chocolate4", 139, 69, 19, 1, X11Compliance },
00167     { "coral", 255, 127, 80, 1, SVGCompliance | X11Compliance | XPMCompliance },
00168     { "coral1", 255, 114, 86, 1, X11Compliance },
00169     { "coral2", 238, 106, 80, 1, X11Compliance },
00170     { "coral3", 205, 91, 69, 1, X11Compliance },
00171     { "coral4", 139, 62, 47, 1, X11Compliance },
00172     { "CornflowerBlue", 100, 149, 237, 1, SVGCompliance | X11Compliance | XPMCompliance },
00173     { "cornsilk", 255, 248, 220, 1, SVGCompliance | X11Compliance | XPMCompliance },
00174     { "cornsilk1", 255, 248, 220, 1, X11Compliance },
00175     { "cornsilk2", 238, 232, 205, 1, X11Compliance },
00176     { "cornsilk3", 205, 200, 177, 1, X11Compliance },
00177     { "cornsilk4", 139, 136, 120, 1, X11Compliance },
00178     { "crimson", 220, 20, 60, 1, SVGCompliance },
00179     { "cyan1", 0, 255, 255, 1, X11Compliance },
00180     { "cyan2", 0, 238, 238, 1, X11Compliance },
00181     { "cyan3", 0, 205, 205, 1, X11Compliance },
00182     { "cyan4", 0, 139, 139, 1, X11Compliance },
00183     { "DarkBlue", 0, 0, 139, 1, SVGCompliance | X11Compliance },
00184     { "DarkCyan", 0, 139, 139, 1, SVGCompliance | X11Compliance },
00185     { "DarkGoldenrod", 184, 134, 11, 1, SVGCompliance | X11Compliance | XPMCompliance },
00186     { "DarkGoldenrod1", 255, 185, 15, 1, X11Compliance },
00187     { "DarkGoldenrod2", 238, 173, 14, 1, X11Compliance },
00188     { "DarkGoldenrod3", 205, 149, 12, 1, X11Compliance },
00189     { "DarkGoldenrod4", 139, 101, 8, 1, X11Compliance },
00190     { "DarkGray", 169, 169, 169, 1, SVGCompliance | X11Compliance },
00191     { "DarkGreen", 0, 100, 0, 1, SVGCompliance | X11Compliance | XPMCompliance },
00192     { "DarkGrey", 169, 169, 169, 1, SVGCompliance | X11Compliance },
00193     { "DarkKhaki", 189, 183, 107, 1, SVGCompliance | X11Compliance | XPMCompliance },
00194     { "DarkMagenta", 139, 0, 139, 1, SVGCompliance | X11Compliance },
00195     { "DarkOliveGreen", 85, 107, 47, 1, SVGCompliance | X11Compliance | XPMCompliance },
00196     { "DarkOliveGreen1", 202, 255, 112, 1, X11Compliance },
00197     { "DarkOliveGreen2", 188, 238, 104, 1, X11Compliance },
00198     { "DarkOliveGreen3", 162, 205, 90, 1, X11Compliance },
00199     { "DarkOliveGreen4", 110, 139, 61, 1, X11Compliance },
00200     { "DarkOrange", 255, 140, 0, 1, SVGCompliance | X11Compliance | XPMCompliance },
00201     { "DarkOrange1", 255, 127, 0, 1, X11Compliance },
00202     { "DarkOrange2", 238, 118, 0, 1, X11Compliance },
00203     { "DarkOrange3", 205, 102, 0, 1, X11Compliance },
00204     { "DarkOrange4", 139, 69, 0, 1, X11Compliance },
00205     { "DarkOrchid", 153, 50, 204, 1, SVGCompliance | X11Compliance | XPMCompliance },
00206     { "DarkOrchid1", 191, 62, 255, 1, X11Compliance },
00207     { "DarkOrchid2", 178, 58, 238, 1, X11Compliance },
00208     { "DarkOrchid3", 154, 50, 205, 1, X11Compliance },
00209     { "DarkOrchid4", 104, 34, 139, 1, X11Compliance },
00210     { "DarkRed", 139, 0, 0, 1, SVGCompliance | X11Compliance },
00211     { "DarkSalmon", 233, 150, 122, 1, SVGCompliance | X11Compliance | XPMCompliance },
00212     { "DarkSeaGreen", 143, 188, 143, 1, SVGCompliance | X11Compliance | XPMCompliance },
00213     { "DarkSeaGreen1", 193, 255, 193, 1, X11Compliance },
00214     { "DarkSeaGreen2", 180, 238, 180, 1, X11Compliance },
00215     { "DarkSeaGreen3", 155, 205, 155, 1, X11Compliance },
00216     { "DarkSeaGreen4", 105, 139, 105, 1, X11Compliance },
00217     { "DarkSlateBlue", 72, 61, 139, 1, SVGCompliance | X11Compliance | XPMCompliance },
00218     { "DarkSlateGray", 47, 79, 79, 1, SVGCompliance | X11Compliance | XPMCompliance },
00219     { "DarkSlateGray1", 151, 255, 255, 1, X11Compliance },
00220     { "DarkSlateGray2", 141, 238, 238, 1, X11Compliance },
00221     { "DarkSlateGray3", 121, 205, 205, 1, X11Compliance },
00222     { "DarkSlateGray4", 82, 139, 139, 1, X11Compliance },
00223     { "DarkSlateGrey", 47, 79, 79, 1, SVGCompliance | X11Compliance },
00224     { "DarkTurquoise", 0, 206, 209, 1, SVGCompliance | X11Compliance | XPMCompliance },
00225     { "DarkViolet", 148, 0, 211, 1, SVGCompliance | X11Compliance | XPMCompliance },
00226     { "DeepPink", 255, 20, 147, 1, SVGCompliance | X11Compliance | XPMCompliance },
00227     { "DeepPink1", 255, 20, 147, 1, X11Compliance },
00228     { "DeepPink2", 238, 18, 137, 1, X11Compliance },
00229     { "DeepPink3", 205, 16, 118, 1, X11Compliance },
00230     { "DeepPink4", 139, 10, 80, 1, X11Compliance },
00231     { "DeepSkyBlue", 0, 191, 255, 1, SVGCompliance | X11Compliance | XPMCompliance },
00232     { "DeepSkyBlue1", 0, 191, 255, 1, X11Compliance },
00233     { "DeepSkyBlue2", 0, 178, 238, 1, X11Compliance },
00234     { "DeepSkyBlue3", 0, 154, 205, 1, X11Compliance },
00235     { "DeepSkyBlue4", 0, 104, 139, 1, X11Compliance },
00236     { "DimGray", 105, 105, 105, 1, SVGCompliance | X11Compliance | XPMCompliance },
00237     { "DimGrey", 105, 105, 105, 1, SVGCompliance | X11Compliance },
00238     { "DodgerBlue", 30, 144, 255, 1, SVGCompliance | X11Compliance | XPMCompliance },
00239     { "DodgerBlue1", 30, 144, 255, 1, X11Compliance },
00240     { "DodgerBlue2", 28, 134, 238, 1, X11Compliance },
00241     { "DodgerBlue3", 24, 116, 205, 1, X11Compliance },
00242     { "DodgerBlue4", 16, 78, 139, 1, X11Compliance },
00243     { "firebrick", 178, 34, 34, 1, SVGCompliance | X11Compliance | XPMCompliance },
00244     { "firebrick1", 255, 48, 48, 1, X11Compliance },
00245     { "firebrick2", 238, 44, 44, 1, X11Compliance },
00246     { "firebrick3", 205, 38, 38, 1, X11Compliance },
00247     { "firebrick4", 139, 26, 26, 1, X11Compliance },
00248     { "FloralWhite", 255, 250, 240, 1, SVGCompliance | X11Compliance | XPMCompliance },
00249     { "ForestGreen", 34, 139, 34, 1, SVGCompliance | X11Compliance | XPMCompliance },
00250     { "fractal", 128, 128, 128, 1, SVGCompliance },
00251     { "freeze", 0, 0, 0, 0, SVGCompliance },
00252     { "fuchsia", 255, 0, 255, 1, SVGCompliance },
00253     { "gainsboro", 220, 220, 220, 1, SVGCompliance | X11Compliance | XPMCompliance },
00254     { "GhostWhite", 248, 248, 255, 1, SVGCompliance | X11Compliance | XPMCompliance },
00255     { "gold", 255, 215, 0, 1, SVGCompliance | X11Compliance | XPMCompliance },
00256     { "gold1", 255, 215, 0, 1, X11Compliance },
00257     { "gold2", 238, 201, 0, 1, X11Compliance },
00258     { "gold3", 205, 173, 0, 1, X11Compliance },
00259     { "gold4", 139, 117, 0, 1, X11Compliance },
00260     { "goldenrod", 218, 165, 32, 1, SVGCompliance | X11Compliance | XPMCompliance },
00261     { "goldenrod1", 255, 193, 37, 1, X11Compliance },
00262     { "goldenrod2", 238, 180, 34, 1, X11Compliance },
00263     { "goldenrod3", 205, 155, 29, 1, X11Compliance },
00264     { "goldenrod4", 139, 105, 20, 1, X11Compliance },
00265     { "gray", 126, 126, 126, 1, SVGCompliance },
00266     { "gray", 190, 190, 190, 1, X11Compliance | XPMCompliance },
00267     { "gray0", 0, 0, 0, 1, X11Compliance | XPMCompliance },
00268     { "gray1", 3, 3, 3, 1, X11Compliance | XPMCompliance },
00269     { "gray10", 26, 26, 26, 1, X11Compliance | XPMCompliance },
00270     { "gray100", 255, 255, 255, 1, X11Compliance | XPMCompliance },
00271     { "gray100", 255, 255, 255, 1, X11Compliance | XPMCompliance },
00272     { "gray11", 28, 28, 28, 1, X11Compliance | XPMCompliance },
00273     { "gray12", 31, 31, 31, 1, X11Compliance | XPMCompliance },
00274     { "gray13", 33, 33, 33, 1, X11Compliance | XPMCompliance },
00275     { "gray14", 36, 36, 36, 1, X11Compliance | XPMCompliance },
00276     { "gray15", 38, 38, 38, 1, X11Compliance | XPMCompliance },
00277     { "gray16", 41, 41, 41, 1, X11Compliance | XPMCompliance },
00278     { "gray17", 43, 43, 43, 1, X11Compliance | XPMCompliance },
00279     { "gray18", 46, 46, 46, 1, X11Compliance | XPMCompliance },
00280     { "gray19", 48, 48, 48, 1, X11Compliance | XPMCompliance },
00281     { "gray2", 5, 5, 5, 1, X11Compliance | XPMCompliance },
00282     { "gray20", 51, 51, 51, 1, X11Compliance | XPMCompliance },
00283     { "gray21", 54, 54, 54, 1, X11Compliance | XPMCompliance },
00284     { "gray22", 56, 56, 56, 1, X11Compliance | XPMCompliance },
00285     { "gray23", 59, 59, 59, 1, X11Compliance | XPMCompliance },
00286     { "gray24", 61, 61, 61, 1, X11Compliance | XPMCompliance },
00287     { "gray25", 64, 64, 64, 1, X11Compliance | XPMCompliance },
00288     { "gray26", 66, 66, 66, 1, X11Compliance | XPMCompliance },
00289     { "gray27", 69, 69, 69, 1, X11Compliance | XPMCompliance },
00290     { "gray28", 71, 71, 71, 1, X11Compliance | XPMCompliance },
00291     { "gray29", 74, 74, 74, 1, X11Compliance | XPMCompliance },
00292     { "gray3", 8, 8, 8, 1, X11Compliance | XPMCompliance },
00293     { "gray30", 77, 77, 77, 1, X11Compliance | XPMCompliance },
00294     { "gray31", 79, 79, 79, 1, X11Compliance | XPMCompliance },
00295     { "gray32", 82, 82, 82, 1, X11Compliance | XPMCompliance },
00296     { "gray33", 84, 84, 84, 1, X11Compliance | XPMCompliance },
00297     { "gray34", 87, 87, 87, 1, X11Compliance | XPMCompliance },
00298     { "gray35", 89, 89, 89, 1, X11Compliance | XPMCompliance },
00299     { "gray36", 92, 92, 92, 1, X11Compliance | XPMCompliance },
00300     { "gray37", 94, 94, 94, 1, X11Compliance | XPMCompliance },
00301     { "gray38", 97, 97, 97, 1, X11Compliance | XPMCompliance },
00302     { "gray39", 99, 99, 99, 1, X11Compliance | XPMCompliance },
00303     { "gray4", 10, 10, 10, 1, X11Compliance | XPMCompliance },
00304     { "gray40", 102, 102, 102, 1, X11Compliance | XPMCompliance },
00305     { "gray41", 105, 105, 105, 1, X11Compliance | XPMCompliance },
00306     { "gray42", 107, 107, 107, 1, X11Compliance | XPMCompliance },
00307     { "gray43", 110, 110, 110, 1, X11Compliance | XPMCompliance },
00308     { "gray44", 112, 112, 112, 1, X11Compliance | XPMCompliance },
00309     { "gray45", 115, 115, 115, 1, X11Compliance | XPMCompliance },
00310     { "gray46", 117, 117, 117, 1, X11Compliance | XPMCompliance },
00311     { "gray47", 120, 120, 120, 1, X11Compliance | XPMCompliance },
00312     { "gray48", 122, 122, 122, 1, X11Compliance | XPMCompliance },
00313     { "gray49", 125, 125, 125, 1, X11Compliance | XPMCompliance },
00314     { "gray5", 13, 13, 13, 1, X11Compliance | XPMCompliance },
00315     { "gray50", 127, 127, 127, 1, X11Compliance | XPMCompliance },
00316     { "gray51", 130, 130, 130, 1, X11Compliance | XPMCompliance },
00317     { "gray52", 133, 133, 133, 1, X11Compliance | XPMCompliance },
00318     { "gray53", 135, 135, 135, 1, X11Compliance | XPMCompliance },
00319     { "gray54", 138, 138, 138, 1, X11Compliance | XPMCompliance },
00320     { "gray55", 140, 140, 140, 1, X11Compliance | XPMCompliance },
00321     { "gray56", 143, 143, 143, 1, X11Compliance | XPMCompliance },
00322     { "gray57", 145, 145, 145, 1, X11Compliance | XPMCompliance },
00323     { "gray58", 148, 148, 148, 1, X11Compliance | XPMCompliance },
00324     { "gray59", 150, 150, 150, 1, X11Compliance | XPMCompliance },
00325     { "gray6", 15, 15, 15, 1, X11Compliance | XPMCompliance },
00326     { "gray60", 153, 153, 153, 1, X11Compliance | XPMCompliance },
00327     { "gray61", 156, 156, 156, 1, X11Compliance | XPMCompliance },
00328     { "gray62", 158, 158, 158, 1, X11Compliance | XPMCompliance },
00329     { "gray63", 161, 161, 161, 1, X11Compliance | XPMCompliance },
00330     { "gray64", 163, 163, 163, 1, X11Compliance | XPMCompliance },
00331     { "gray65", 166, 166, 166, 1, X11Compliance | XPMCompliance },
00332     { "gray66", 168, 168, 168, 1, X11Compliance | XPMCompliance },
00333     { "gray67", 171, 171, 171, 1, X11Compliance | XPMCompliance },
00334     { "gray68", 173, 173, 173, 1, X11Compliance | XPMCompliance },
00335     { "gray69", 176, 176, 176, 1, X11Compliance | XPMCompliance },
00336     { "gray7", 18, 18, 18, 1, X11Compliance | XPMCompliance },
00337     { "gray70", 179, 179, 179, 1, X11Compliance | XPMCompliance },
00338     { "gray71", 181, 181, 181, 1, X11Compliance | XPMCompliance },
00339     { "gray72", 184, 184, 184, 1, X11Compliance | XPMCompliance },
00340     { "gray73", 186, 186, 186, 1, X11Compliance | XPMCompliance },
00341     { "gray74", 189, 189, 189, 1, X11Compliance | XPMCompliance },
00342     { "gray75", 191, 191, 191, 1, X11Compliance | XPMCompliance },
00343     { "gray76", 194, 194, 194, 1, X11Compliance | XPMCompliance },
00344     { "gray77", 196, 196, 196, 1, X11Compliance | XPMCompliance },
00345     { "gray78", 199, 199, 199, 1, X11Compliance | XPMCompliance },
00346     { "gray79", 201, 201, 201, 1, X11Compliance | XPMCompliance },
00347     { "gray8", 20, 20, 20, 1, X11Compliance | XPMCompliance },
00348     { "gray80", 204, 204, 204, 1, X11Compliance | XPMCompliance },
00349     { "gray81", 207, 207, 207, 1, X11Compliance | XPMCompliance },
00350     { "gray82", 209, 209, 209, 1, X11Compliance | XPMCompliance },
00351     { "gray83", 212, 212, 212, 1, X11Compliance | XPMCompliance },
00352     { "gray84", 214, 214, 214, 1, X11Compliance | XPMCompliance },
00353     { "gray85", 217, 217, 217, 1, X11Compliance | XPMCompliance },
00354     { "gray86", 219, 219, 219, 1, X11Compliance | XPMCompliance },
00355     { "gray87", 222, 222, 222, 1, X11Compliance | XPMCompliance },
00356     { "gray88", 224, 224, 224, 1, X11Compliance | XPMCompliance },
00357     { "gray89", 227, 227, 227, 1, X11Compliance | XPMCompliance },
00358     { "gray9", 23, 23, 23, 1, X11Compliance | XPMCompliance },
00359     { "gray90", 229, 229, 229, 1, X11Compliance | XPMCompliance },
00360     { "gray91", 232, 232, 232, 1, X11Compliance | XPMCompliance },
00361     { "gray92", 235, 235, 235, 1, X11Compliance | XPMCompliance },
00362     { "gray93", 237, 237, 237, 1, X11Compliance | XPMCompliance },
00363     { "gray94", 240, 240, 240, 1, X11Compliance | XPMCompliance },
00364     { "gray95", 242, 242, 242, 1, X11Compliance | XPMCompliance },
00365     { "gray96", 245, 245, 245, 1, X11Compliance | XPMCompliance },
00366     { "gray97", 247, 247, 247, 1, X11Compliance | XPMCompliance },
00367     { "gray98", 250, 250, 250, 1, X11Compliance | XPMCompliance },
00368     { "gray99", 252, 252, 252, 1, X11Compliance | XPMCompliance },
00369     { "green", 0, 255, 0, 1, X11Compliance | XPMCompliance },
00370     { "green1", 0, 255, 0, 1, X11Compliance },
00371     { "green2", 0, 238, 0, 1, X11Compliance },
00372     { "green3", 0, 205, 0, 1, X11Compliance },
00373     { "green4", 0, 139, 0, 1, X11Compliance },
00374     { "GreenYellow", 173, 255, 47, 1, X11Compliance | XPMCompliance },
00375     { "grey", 190, 190, 190, 1, SVGCompliance | X11Compliance },
00376     { "grey0", 0, 0, 0, 1, SVGCompliance | X11Compliance },
00377     { "grey1", 3, 3, 3, 1, SVGCompliance | X11Compliance },
00378     { "grey10", 26, 26, 26, 1, SVGCompliance | X11Compliance },
00379     { "grey100", 255, 255, 255, 1, SVGCompliance | X11Compliance },
00380     { "grey11", 28, 28, 28, 1, SVGCompliance | X11Compliance },
00381     { "grey12", 31, 31, 31, 1, SVGCompliance | X11Compliance },
00382     { "grey13", 33, 33, 33, 1, SVGCompliance | X11Compliance },
00383     { "grey14", 36, 36, 36, 1, SVGCompliance | X11Compliance },
00384     { "grey15", 38, 38, 38, 1, SVGCompliance | X11Compliance },
00385     { "grey16", 41, 41, 41, 1, SVGCompliance | X11Compliance },
00386     { "grey17", 43, 43, 43, 1, SVGCompliance | X11Compliance },
00387     { "grey18", 46, 46, 46, 1, SVGCompliance | X11Compliance },
00388     { "grey19", 48, 48, 48, 1, SVGCompliance | X11Compliance },
00389     { "grey2", 5, 5, 5, 1, SVGCompliance | X11Compliance },
00390     { "grey20", 51, 51, 51, 1, SVGCompliance | X11Compliance },
00391     { "grey21", 54, 54, 54, 1, SVGCompliance | X11Compliance },
00392     { "grey22", 56, 56, 56, 1, SVGCompliance | X11Compliance },
00393     { "grey23", 59, 59, 59, 1, SVGCompliance | X11Compliance },
00394     { "grey24", 61, 61, 61, 1, SVGCompliance | X11Compliance },
00395     { "grey25", 64, 64, 64, 1, SVGCompliance | X11Compliance },
00396     { "grey26", 66, 66, 66, 1, SVGCompliance | X11Compliance },
00397     { "grey27", 69, 69, 69, 1, SVGCompliance | X11Compliance },
00398     { "grey28", 71, 71, 71, 1, SVGCompliance | X11Compliance },
00399     { "grey29", 74, 74, 74, 1, SVGCompliance | X11Compliance },
00400     { "grey3", 8, 8, 8, 1, SVGCompliance | X11Compliance },
00401     { "grey30", 77, 77, 77, 1, SVGCompliance | X11Compliance },
00402     { "grey31", 79, 79, 79, 1, SVGCompliance | X11Compliance },
00403     { "grey32", 82, 82, 82, 1, SVGCompliance | X11Compliance },
00404     { "grey33", 84, 84, 84, 1, SVGCompliance | X11Compliance },
00405     { "grey34", 87, 87, 87, 1, SVGCompliance | X11Compliance },
00406     { "grey35", 89, 89, 89, 1, SVGCompliance | X11Compliance },
00407     { "grey36", 92, 92, 92, 1, SVGCompliance | X11Compliance },
00408     { "grey37", 94, 94, 94, 1, SVGCompliance | X11Compliance },
00409     { "grey38", 97, 97, 97, 1, SVGCompliance | X11Compliance },
00410     { "grey39", 99, 99, 99, 1, SVGCompliance | X11Compliance },
00411     { "grey4", 10, 10, 10, 1, SVGCompliance | X11Compliance },
00412     { "grey40", 102, 102, 102, 1, SVGCompliance | X11Compliance },
00413     { "grey41", 105, 105, 105, 1, SVGCompliance | X11Compliance },
00414     { "grey42", 107, 107, 107, 1, SVGCompliance | X11Compliance },
00415     { "grey43", 110, 110, 110, 1, SVGCompliance | X11Compliance },
00416     { "grey44", 112, 112, 112, 1, SVGCompliance | X11Compliance },
00417     { "grey45", 115, 115, 115, 1, SVGCompliance | X11Compliance },
00418     { "grey46", 117, 117, 117, 1, SVGCompliance | X11Compliance },
00419     { "grey47", 120, 120, 120, 1, SVGCompliance | X11Compliance },
00420     { "grey48", 122, 122, 122, 1, SVGCompliance | X11Compliance },
00421     { "grey49", 125, 125, 125, 1, SVGCompliance | X11Compliance },
00422     { "grey5", 13, 13, 13, 1, SVGCompliance | X11Compliance },
00423     { "grey50", 127, 127, 127, 1, SVGCompliance | X11Compliance },
00424     { "grey51", 130, 130, 130, 1, SVGCompliance | X11Compliance },
00425     { "grey52", 133, 133, 133, 1, SVGCompliance | X11Compliance },
00426     { "grey53", 135, 135, 135, 1, SVGCompliance | X11Compliance },
00427     { "grey54", 138, 138, 138, 1, SVGCompliance | X11Compliance },
00428     { "grey55", 140, 140, 140, 1, SVGCompliance | X11Compliance },
00429     { "grey56", 143, 143, 143, 1, SVGCompliance | X11Compliance },
00430     { "grey57", 145, 145, 145, 1, SVGCompliance | X11Compliance },
00431     { "grey58", 148, 148, 148, 1, SVGCompliance | X11Compliance },
00432     { "grey59", 150, 150, 150, 1, SVGCompliance | X11Compliance },
00433     { "grey6", 15, 15, 15, 1, SVGCompliance | X11Compliance },
00434     { "grey60", 153, 153, 153, 1, SVGCompliance | X11Compliance },
00435     { "grey61", 156, 156, 156, 1, SVGCompliance | X11Compliance },
00436     { "grey62", 158, 158, 158, 1, SVGCompliance | X11Compliance },
00437     { "grey63", 161, 161, 161, 1, SVGCompliance | X11Compliance },
00438     { "grey64", 163, 163, 163, 1, SVGCompliance | X11Compliance },
00439     { "grey65", 166, 166, 166, 1, SVGCompliance | X11Compliance },
00440     { "grey66", 168, 168, 168, 1, SVGCompliance | X11Compliance },
00441     { "grey67", 171, 171, 171, 1, SVGCompliance | X11Compliance },
00442     { "grey68", 173, 173, 173, 1, SVGCompliance | X11Compliance },
00443     { "grey69", 176, 176, 176, 1, SVGCompliance | X11Compliance },
00444     { "grey7", 18, 18, 18, 1, SVGCompliance | X11Compliance },
00445     { "grey70", 179, 179, 179, 1, SVGCompliance | X11Compliance },
00446     { "grey71", 181, 181, 181, 1, SVGCompliance | X11Compliance },
00447     { "grey72", 184, 184, 184, 1, SVGCompliance | X11Compliance },
00448     { "grey73", 186, 186, 186, 1, SVGCompliance | X11Compliance },
00449     { "grey74", 189, 189, 189, 1, SVGCompliance | X11Compliance },
00450     { "grey75", 191, 191, 191, 1, SVGCompliance | X11Compliance },
00451     { "grey76", 194, 194, 194, 1, SVGCompliance | X11Compliance },
00452     { "grey77", 196, 196, 196, 1, SVGCompliance | X11Compliance },
00453     { "grey78", 199, 199, 199, 1, SVGCompliance | X11Compliance },
00454     { "grey79", 201, 201, 201, 1, SVGCompliance | X11Compliance },
00455     { "grey8", 20, 20, 20, 1, SVGCompliance | X11Compliance },
00456     { "grey80", 204, 204, 204, 1, SVGCompliance | X11Compliance },
00457     { "grey81", 207, 207, 207, 1, SVGCompliance | X11Compliance },
00458     { "grey82", 209, 209, 209, 1, SVGCompliance | X11Compliance },
00459     { "grey83", 212, 212, 212, 1, SVGCompliance | X11Compliance },
00460     { "grey84", 214, 214, 214, 1, SVGCompliance | X11Compliance },
00461     { "grey85", 217, 217, 217, 1, SVGCompliance | X11Compliance },
00462     { "grey86", 219, 219, 219, 1, SVGCompliance | X11Compliance },
00463     { "grey87", 222, 222, 222, 1, SVGCompliance | X11Compliance },
00464     { "grey88", 224, 224, 224, 1, SVGCompliance | X11Compliance },
00465     { "grey89", 227, 227, 227, 1, SVGCompliance | X11Compliance },
00466     { "grey9", 23, 23, 23, 1, SVGCompliance | X11Compliance },
00467     { "grey90", 229, 229, 229, 1, SVGCompliance | X11Compliance },
00468     { "grey91", 232, 232, 232, 1, SVGCompliance | X11Compliance },
00469     { "grey92", 235, 235, 235, 1, SVGCompliance | X11Compliance },
00470     { "grey93", 237, 237, 237, 1, SVGCompliance | X11Compliance },
00471     { "grey94", 240, 240, 240, 1, SVGCompliance | X11Compliance },
00472     { "grey95", 242, 242, 242, 1, SVGCompliance | X11Compliance },
00473     { "grey96", 245, 245, 245, 1, SVGCompliance | X11Compliance },
00474     { "grey97", 247, 247, 247, 1, SVGCompliance | X11Compliance },
00475     { "grey98", 250, 250, 250, 1, SVGCompliance | X11Compliance },
00476     { "grey99", 252, 252, 252, 1, SVGCompliance | X11Compliance },
00477     { "honeydew", 240, 255, 240, 1, SVGCompliance | X11Compliance | XPMCompliance },
00478     { "honeydew1", 240, 255, 240, 1, X11Compliance },
00479     { "honeydew2", 224, 238, 224, 1, X11Compliance },
00480     { "honeydew3", 193, 205, 193, 1, X11Compliance },
00481     { "honeydew4", 131, 139, 131, 1, X11Compliance },
00482     { "HotPink", 255, 105, 180, 1, SVGCompliance | X11Compliance | XPMCompliance },
00483     { "HotPink1", 255, 110, 180, 1, X11Compliance },
00484     { "HotPink2", 238, 106, 167, 1, X11Compliance },
00485     { "HotPink3", 205, 96, 144, 1, X11Compliance },
00486     { "HotPink4", 139, 58, 98, 1, X11Compliance },
00487     { "IndianRed", 205, 92, 92, 1, SVGCompliance | X11Compliance | XPMCompliance },
00488     { "IndianRed1", 255, 106, 106, 1, X11Compliance },
00489     { "IndianRed2", 238, 99, 99, 1, X11Compliance },
00490     { "IndianRed3", 205, 85, 85, 1, X11Compliance },
00491     { "IndianRed4", 139, 58, 58, 1, X11Compliance },
00492     { "indigo", 75, 0, 130, 1, SVGCompliance },
00493     { "ivory", 255, 255, 240, 1, SVGCompliance | X11Compliance | XPMCompliance },
00494     { "ivory1", 255, 255, 240, 1, X11Compliance },
00495     { "ivory2", 238, 238, 224, 1, X11Compliance },
00496     { "ivory3", 205, 205, 193, 1, X11Compliance },
00497     { "ivory4", 139, 139, 131, 1, X11Compliance },
00498     { "khaki", 240, 230, 140, 1, SVGCompliance | X11Compliance | XPMCompliance },
00499     { "khaki1", 255, 246, 143, 1, X11Compliance },
00500     { "khaki2", 238, 230, 133, 1, X11Compliance },
00501     { "khaki3", 205, 198, 115, 1, X11Compliance },
00502     { "khaki4", 139, 134, 78, 1, X11Compliance },
00503     { "lavender", 230, 230, 250, 1, SVGCompliance | X11Compliance | XPMCompliance },
00504     { "LavenderBlush", 255, 240, 245, 1, SVGCompliance | X11Compliance | XPMCompliance },
00505     { "LavenderBlush1", 255, 240, 245, 1, X11Compliance },
00506     { "LavenderBlush2", 238, 224, 229, 1, X11Compliance },
00507     { "LavenderBlush3", 205, 193, 197, 1, X11Compliance },
00508     { "LavenderBlush4", 139, 131, 134, 1, X11Compliance },
00509     { "LawnGreen", 124, 252, 0, 1, SVGCompliance | X11Compliance | XPMCompliance },
00510     { "LemonChiffon", 255, 250, 205, 1, SVGCompliance | X11Compliance | XPMCompliance },
00511     { "LemonChiffon1", 255, 250, 205, 1, X11Compliance },
00512     { "LemonChiffon2", 238, 233, 191, 1, X11Compliance },
00513     { "LemonChiffon3", 205, 201, 165, 1, X11Compliance },
00514     { "LemonChiffon4", 139, 137, 112, 1, X11Compliance },
00515     { "LightBlue", 173, 216, 230, 1, SVGCompliance | X11Compliance | XPMCompliance },
00516     { "LightBlue1", 191, 239, 255, 1, X11Compliance },
00517     { "LightBlue2", 178, 223, 238, 1, X11Compliance },
00518     { "LightBlue3", 154, 192, 205, 1, X11Compliance },
00519     { "LightBlue4", 104, 131, 139, 1, X11Compliance },
00520     { "LightCoral", 240, 128, 128, 1, SVGCompliance | X11Compliance | XPMCompliance },
00521     { "LightCyan", 224, 255, 255, 1, SVGCompliance | X11Compliance | XPMCompliance },
00522     { "LightCyan1", 224, 255, 255, 1, X11Compliance },
00523     { "LightCyan2", 209, 238, 238, 1, X11Compliance },
00524     { "LightCyan3", 180, 205, 205, 1, X11Compliance },
00525     { "LightCyan4", 122, 139, 139, 1, X11Compliance },
00526     { "LightGoldenrod", 238, 221, 130, 1, X11Compliance | XPMCompliance },
00527     { "LightGoldenrod1", 255, 236, 139, 1, X11Compliance },
00528     { "LightGoldenrod2", 238, 220, 130, 1, X11Compliance },
00529     { "LightGoldenrod3", 205, 190, 112, 1, X11Compliance },
00530     { "LightGoldenrod4", 139, 129, 76, 1, X11Compliance },
00531     { "LightGoldenrodYellow", 250, 250, 210, 1, SVGCompliance | X11Compliance | XPMCompliance },
00532     { "LightGray", 211, 211, 211, 1, SVGCompliance | X11Compliance | XPMCompliance },
00533     { "LightGreen", 144, 238, 144, 1, SVGCompliance | X11Compliance },
00534     { "LightGrey", 211, 211, 211, 1, SVGCompliance | X11Compliance },
00535     { "LightPink", 255, 182, 193, 1, SVGCompliance | X11Compliance | XPMCompliance },
00536     { "LightPink1", 255, 174, 185, 1, X11Compliance },
00537     { "LightPink2", 238, 162, 173, 1, X11Compliance },
00538     { "LightPink3", 205, 140, 149, 1, X11Compliance },
00539     { "LightPink4", 139, 95, 101, 1, X11Compliance },
00540     { "LightSalmon", 255, 160, 122, 1, SVGCompliance | X11Compliance | XPMCompliance },
00541     { "LightSalmon1", 255, 160, 122, 1, X11Compliance },
00542     { "LightSalmon2", 238, 149, 114, 1, X11Compliance },
00543     { "LightSalmon3", 205, 129, 98, 1, X11Compliance },
00544     { "LightSalmon4", 139, 87, 66, 1, X11Compliance },
00545     { "LightSeaGreen", 32, 178, 170, 1, SVGCompliance | X11Compliance | XPMCompliance },
00546     { "LightSkyBlue", 135, 206, 250, 1, SVGCompliance | X11Compliance | XPMCompliance },
00547     { "LightSkyBlue1", 176, 226, 255, 1, X11Compliance },
00548     { "LightSkyBlue2", 164, 211, 238, 1, X11Compliance },
00549     { "LightSkyBlue3", 141, 182, 205, 1, X11Compliance },
00550     { "LightSkyBlue4", 96, 123, 139, 1, X11Compliance },
00551     { "LightSlateBlue", 132, 112, 255, 1, X11Compliance | XPMCompliance },
00552     { "LightSlateGray", 119, 136, 153, 1, SVGCompliance | X11Compliance | XPMCompliance },
00553     { "LightSlateGrey", 119, 136, 153, 1, SVGCompliance | X11Compliance },
00554     { "LightSteelBlue", 176, 196, 222, 1, SVGCompliance | X11Compliance | XPMCompliance },
00555     { "LightSteelBlue1", 202, 225, 255, 1, X11Compliance },
00556     { "LightSteelBlue2", 188, 210, 238, 1, X11Compliance },
00557     { "LightSteelBlue3", 162, 181, 205, 1, X11Compliance },
00558     { "LightSteelBlue4", 110, 123, 139, 1, X11Compliance },
00559     { "LightYellow", 255, 255, 224, 1, SVGCompliance | X11Compliance | XPMCompliance },
00560     { "LightYellow1", 255, 255, 224, 1, X11Compliance },
00561     { "LightYellow2", 238, 238, 209, 1, X11Compliance },
00562     { "LightYellow3", 205, 205, 180, 1, X11Compliance },
00563     { "LightYellow4", 139, 139, 122, 1, X11Compliance },
00564     { "lime", 0, 255, 0, 1, SVGCompliance },
00565     { "LimeGreen", 50, 205, 50, 1, SVGCompliance | X11Compliance | XPMCompliance },
00566     { "linen", 250, 240, 230, 1, SVGCompliance | X11Compliance | XPMCompliance },
00567     { "magenta1", 255, 0, 255, 1, X11Compliance },
00568     { "magenta2", 238, 0, 238, 1, X11Compliance },
00569     { "magenta3", 205, 0, 205, 1, X11Compliance },
00570     { "magenta4", 139, 0, 139, 1, X11Compliance },
00571     { "maroon", 128, 0, 0, 1, SVGCompliance },
00572     { "maroon", 176, 48, 96, 1, X11Compliance | XPMCompliance },
00573     { "maroon1", 255, 52, 179, 1, X11Compliance },
00574     { "maroon2", 238, 48, 167, 1, X11Compliance },
00575     { "maroon3", 205, 41, 144, 1, X11Compliance },
00576     { "maroon4", 139, 28, 98, 1, X11Compliance },
00577     { "MediumAquamarine", 102, 205, 170, 1, SVGCompliance | X11Compliance | XPMCompliance },
00578     { "MediumBlue", 0, 0, 205, 1, SVGCompliance | X11Compliance | XPMCompliance },
00579     { "MediumForestGreen", 50, 129, 75, 1, X11Compliance | XPMCompliance },
00580     { "MediumGoldenRod", 209, 193, 102, 1, X11Compliance | XPMCompliance },
00581     { "MediumOrchid", 186, 85, 211, 1, SVGCompliance | X11Compliance | XPMCompliance },
00582     { "MediumOrchid1", 224, 102, 255, 1, X11Compliance },
00583     { "MediumOrchid2", 209, 95, 238, 1, X11Compliance },
00584     { "MediumOrchid3", 180, 82, 205, 1, X11Compliance },
00585     { "MediumOrchid4", 122, 55, 139, 1, X11Compliance },
00586     { "MediumPurple", 147, 112, 219, 1, SVGCompliance | X11Compliance | XPMCompliance },
00587     { "MediumPurple1", 171, 130, 255, 1, X11Compliance },
00588     { "MediumPurple2", 159, 121, 238, 1, X11Compliance },
00589     { "MediumPurple3", 137, 104, 205, 1, X11Compliance },
00590     { "MediumPurple4", 93, 71, 139, 1, X11Compliance },
00591     { "MediumSeaGreen", 60, 179, 113, 1, SVGCompliance | X11Compliance | XPMCompliance },
00592     { "MediumSlateBlue", 123, 104, 238, 1, SVGCompliance | X11Compliance | XPMCompliance },
00593     { "MediumSpringGreen", 0, 250, 154, 1, SVGCompliance | X11Compliance | XPMCompliance },
00594     { "MediumTurquoise", 72, 209, 204, 1, SVGCompliance | X11Compliance | XPMCompliance },
00595     { "MediumVioletRed", 199, 21, 133, 1, SVGCompliance | X11Compliance | XPMCompliance },
00596     { "MidnightBlue", 25, 25, 112, 1, SVGCompliance | X11Compliance | XPMCompliance },
00597     { "MintCream", 245, 255, 250, 1, SVGCompliance | X11Compliance | XPMCompliance },
00598     { "MistyRose", 255, 228, 225, 1, SVGCompliance | X11Compliance | XPMCompliance },
00599     { "MistyRose1", 255, 228, 225, 1, X11Compliance },
00600     { "MistyRose2", 238, 213, 210, 1, X11Compliance },
00601     { "MistyRose3", 205, 183, 181, 1, X11Compliance },
00602     { "MistyRose4", 139, 125, 123, 1, X11Compliance },
00603     { "moccasin", 255, 228, 181, 1, SVGCompliance | X11Compliance | XPMCompliance },
00604     { "NavajoWhite", 255, 222, 173, 1, SVGCompliance | X11Compliance | XPMCompliance },
00605     { "NavajoWhite1", 255, 222, 173, 1, X11Compliance },
00606     { "NavajoWhite2", 238, 207, 161, 1, X11Compliance },
00607     { "NavajoWhite3", 205, 179, 139, 1, X11Compliance },
00608     { "NavajoWhite4", 139, 121, 94, 1, X11Compliance },
00609     { "navy", 0, 0, 128, 1, SVGCompliance | X11Compliance | XPMCompliance },
00610     { "NavyBlue", 0, 0, 128, 1, X11Compliance | XPMCompliance },
00611     { "matte", 0, 0, 0, 0, SVGCompliance },
00612     { "OldLace", 253, 245, 230, 1, SVGCompliance | X11Compliance | XPMCompliance },
00613     { "olive", 128, 128, 0, 1, SVGCompliance },
00614     { "OliveDrab", 107, 142, 35, 1, SVGCompliance | X11Compliance | XPMCompliance },
00615     { "OliveDrab1", 192, 255, 62, 1, X11Compliance },
00616     { "OliveDrab2", 179, 238, 58, 1, X11Compliance },
00617     { "OliveDrab3", 154, 205, 50, 1, X11Compliance },
00618     { "OliveDrab4", 105, 139, 34, 1, X11Compliance },
00619     { "opaque", 0, 0, 0, 1, SVGCompliance },
00620     { "orange", 255, 165, 0, 1, SVGCompliance | X11Compliance | XPMCompliance },
00621     { "orange1", 255, 165, 0, 1, X11Compliance },
00622     { "orange2", 238, 154, 0, 1, X11Compliance },
00623     { "orange3", 205, 133, 0, 1, X11Compliance },
00624     { "orange4", 139, 90, 0, 1, X11Compliance },
00625     { "OrangeRed", 255, 69, 0, 1, SVGCompliance | X11Compliance | XPMCompliance },
00626     { "OrangeRed1", 255, 69, 0, 1, X11Compliance },
00627     { "OrangeRed2", 238, 64, 0, 1, X11Compliance },
00628     { "OrangeRed3", 205, 55, 0, 1, X11Compliance },
00629     { "OrangeRed4", 139, 37, 0, 1, X11Compliance },
00630     { "orchid", 218, 112, 214, 1, SVGCompliance | X11Compliance | XPMCompliance },
00631     { "orchid1", 255, 131, 250, 1, X11Compliance },
00632     { "orchid2", 238, 122, 233, 1, X11Compliance },
00633     { "orchid3", 205, 105, 201, 1, X11Compliance },
00634     { "orchid4", 139, 71, 137, 1, X11Compliance },
00635     { "PaleGoldenrod", 238, 232, 170, 1, SVGCompliance | X11Compliance | XPMCompliance },
00636     { "PaleGreen", 152, 251, 152, 1, SVGCompliance | X11Compliance | XPMCompliance },
00637     { "PaleGreen1", 154, 255, 154, 1, X11Compliance },
00638     { "PaleGreen2", 144, 238, 144, 1, X11Compliance },
00639     { "PaleGreen3", 124, 205, 124, 1, X11Compliance },
00640     { "PaleGreen4", 84, 139, 84, 1, X11Compliance },
00641     { "PaleTurquoise", 175, 238, 238, 1, SVGCompliance | X11Compliance | XPMCompliance },
00642     { "PaleTurquoise1", 187, 255, 255, 1, X11Compliance },
00643     { "PaleTurquoise2", 174, 238, 238, 1, X11Compliance },
00644     { "PaleTurquoise3", 150, 205, 205, 1, X11Compliance },
00645     { "PaleTurquoise4", 102, 139, 139, 1, X11Compliance },
00646     { "PaleVioletRed", 219, 112, 147, 1, SVGCompliance | X11Compliance | XPMCompliance },
00647     { "PaleVioletRed1", 255, 130, 171, 1, X11Compliance },
00648     { "PaleVioletRed2", 238, 121, 159, 1, X11Compliance },
00649     { "PaleVioletRed3", 205, 104, 137, 1, X11Compliance },
00650     { "PaleVioletRed4", 139, 71, 93, 1, X11Compliance },
00651     { "PapayaWhip", 255, 239, 213, 1, SVGCompliance | X11Compliance | XPMCompliance },
00652     { "PeachPuff", 255, 218, 185, 1, SVGCompliance | X11Compliance | XPMCompliance },
00653     { "PeachPuff1", 255, 218, 185, 1, X11Compliance },
00654     { "PeachPuff2", 238, 203, 173, 1, X11Compliance },
00655     { "PeachPuff3", 205, 175, 149, 1, X11Compliance },
00656     { "PeachPuff4", 139, 119, 101, 1, X11Compliance },
00657     { "peru", 205, 133, 63, 1, SVGCompliance | X11Compliance | XPMCompliance },
00658     { "pink", 255, 192, 203, 1, SVGCompliance | X11Compliance | XPMCompliance },
00659     { "pink1", 255, 181, 197, 1, X11Compliance },
00660     { "pink2", 238, 169, 184, 1, X11Compliance },
00661     { "pink3", 205, 145, 158, 1, X11Compliance },
00662     { "pink4", 139, 99, 108, 1, X11Compliance },
00663     { "plum", 221, 160, 221, 1, SVGCompliance | X11Compliance | XPMCompliance },
00664     { "plum1", 255, 187, 255, 1, X11Compliance },
00665     { "plum2", 238, 174, 238, 1, X11Compliance },
00666     { "plum3", 205, 150, 205, 1, X11Compliance },
00667     { "plum4", 139, 102, 139, 1, X11Compliance },
00668     { "PowderBlue", 176, 224, 230, 1, SVGCompliance | X11Compliance | XPMCompliance },
00669     { "purple", 128, 0, 128, 1, SVGCompliance },
00670     { "purple", 160, 32, 240, 1, X11Compliance | XPMCompliance },
00671     { "purple1", 155, 48, 255, 1, X11Compliance },
00672     { "purple2", 145, 44, 238, 1, X11Compliance },
00673     { "purple3", 125, 38, 205, 1, X11Compliance },
00674     { "purple4", 85, 26, 139, 1, X11Compliance },
00675     { "red1", 255, 0, 0, 1, X11Compliance },
00676     { "red2", 238, 0, 0, 1, X11Compliance },
00677     { "red3", 205, 0, 0, 1, X11Compliance },
00678     { "red4", 139, 0, 0, 1, X11Compliance },
00679     { "RosyBrown", 188, 143, 143, 1, SVGCompliance | X11Compliance | XPMCompliance },
00680     { "RosyBrown1", 255, 193, 193, 1, X11Compliance },
00681     { "RosyBrown2", 238, 180, 180, 1, X11Compliance },
00682     { "RosyBrown3", 205, 155, 155, 1, X11Compliance },
00683     { "RosyBrown4", 139, 105, 105, 1, X11Compliance },
00684     { "RoyalBlue", 65, 105, 225, 1, SVGCompliance | X11Compliance | XPMCompliance },
00685     { "RoyalBlue1", 72, 118, 255, 1, X11Compliance },
00686     { "RoyalBlue2", 67, 110, 238, 1, X11Compliance },
00687     { "RoyalBlue3", 58, 95, 205, 1, X11Compliance },
00688     { "RoyalBlue4", 39, 64, 139, 1, X11Compliance },
00689     { "SaddleBrown", 139, 69, 19, 1, SVGCompliance | X11Compliance | XPMCompliance },
00690     { "salmon", 250, 128, 114, 1, SVGCompliance | X11Compliance | XPMCompliance },
00691     { "salmon1", 255, 140, 105, 1, X11Compliance },
00692     { "salmon2", 238, 130, 98, 1, X11Compliance },
00693     { "salmon3", 205, 112, 84, 1, X11Compliance },
00694     { "salmon4", 139, 76, 57, 1, X11Compliance },
00695     { "SandyBrown", 244, 164, 96, 1, SVGCompliance | X11Compliance | XPMCompliance },
00696     { "SeaGreen", 46, 139, 87, 1, SVGCompliance | X11Compliance | XPMCompliance },
00697     { "SeaGreen1", 84, 255, 159, 1, X11Compliance },
00698     { "SeaGreen2", 78, 238, 148, 1, X11Compliance },
00699     { "SeaGreen3", 67, 205, 128, 1, X11Compliance },
00700     { "SeaGreen4", 46, 139, 87, 1, X11Compliance },
00701     { "seashell", 255, 245, 238, 1, SVGCompliance | X11Compliance | XPMCompliance },
00702     { "seashell1", 255, 245, 238, 1, X11Compliance },
00703     { "seashell2", 238, 229, 222, 1, X11Compliance },
00704     { "seashell3", 205, 197, 191, 1, X11Compliance },
00705     { "seashell4", 139, 134, 130, 1, X11Compliance },
00706     { "sienna", 160, 82, 45, 1, SVGCompliance | X11Compliance | XPMCompliance },
00707     { "sienna1", 255, 130, 71, 1, X11Compliance },
00708     { "sienna2", 238, 121, 66, 1, X11Compliance },
00709     { "sienna3", 205, 104, 57, 1, X11Compliance },
00710     { "sienna4", 139, 71, 38, 1, X11Compliance },
00711     { "silver", 192, 192, 192, 1, SVGCompliance },
00712     { "SkyBlue", 135, 206, 235, 1, SVGCompliance | X11Compliance | XPMCompliance },
00713     { "SkyBlue1", 135, 206, 255, 1, X11Compliance },
00714     { "SkyBlue2", 126, 192, 238, 1, X11Compliance },
00715     { "SkyBlue3", 108, 166, 205, 1, X11Compliance },
00716     { "SkyBlue4", 74, 112, 139, 1, X11Compliance },
00717     { "SlateBlue", 106, 90, 205, 1, SVGCompliance | X11Compliance | XPMCompliance },
00718     { "SlateBlue1", 131, 111, 255, 1, X11Compliance },
00719     { "SlateBlue2", 122, 103, 238, 1, X11Compliance },
00720     { "SlateBlue3", 105, 89, 205, 1, X11Compliance },
00721     { "SlateBlue4", 71, 60, 139, 1, X11Compliance },
00722     { "SlateGray", 112, 128, 144, 1, SVGCompliance | X11Compliance | XPMCompliance },
00723     { "SlateGray1", 198, 226, 255, 1, X11Compliance },
00724     { "SlateGray2", 185, 211, 238, 1, X11Compliance },
00725     { "SlateGray3", 159, 182, 205, 1, X11Compliance },
00726     { "SlateGray4", 108, 123, 139, 1, X11Compliance },
00727     { "SlateGrey", 112, 128, 144, 1, SVGCompliance | X11Compliance },
00728     { "snow", 255, 250, 250, 1, SVGCompliance | X11Compliance | XPMCompliance },
00729     { "snow1", 255, 250, 250, 1, X11Compliance },
00730     { "snow2", 238, 233, 233, 1, X11Compliance },
00731     { "snow3", 205, 201, 201, 1, X11Compliance },
00732     { "snow4", 139, 137, 137, 1, X11Compliance },
00733     { "SpringGreen", 0, 255, 127, 1, SVGCompliance | X11Compliance | XPMCompliance },
00734     { "SpringGreen1", 0, 255, 127, 1, X11Compliance },
00735     { "SpringGreen2", 0, 238, 118, 1, X11Compliance },
00736     { "SpringGreen3", 0, 205, 102, 1, X11Compliance },
00737     { "SpringGreen4", 0, 139, 69, 1, X11Compliance },
00738     { "SteelBlue", 70, 130, 180, 1, SVGCompliance | X11Compliance | XPMCompliance },
00739     { "SteelBlue1", 99, 184, 255, 1, X11Compliance },
00740     { "SteelBlue2", 92, 172, 238, 1, X11Compliance },
00741     { "SteelBlue3", 79, 148, 205, 1, X11Compliance },
00742     { "SteelBlue4", 54, 100, 139, 1, X11Compliance },
00743     { "tan", 210, 180, 140, 1, SVGCompliance | X11Compliance | XPMCompliance },
00744     { "tan1", 255, 165, 79, 1, X11Compliance },
00745     { "tan2", 238, 154, 73, 1, X11Compliance },
00746     { "tan3", 205, 133, 63, 1, X11Compliance },
00747     { "tan4", 139, 90, 43, 1, X11Compliance },
00748     { "teal", 0, 128, 128, 1, SVGCompliance },
00749     { "thistle", 216, 191, 216, 1, SVGCompliance | X11Compliance | XPMCompliance },
00750     { "thistle1", 255, 225, 255, 1, X11Compliance },
00751     { "thistle2", 238, 210, 238, 1, X11Compliance },
00752     { "thistle3", 205, 181, 205, 1, X11Compliance },
00753     { "thistle4", 139, 123, 139, 1, X11Compliance },
00754     { "tomato", 255, 99, 71, 1, SVGCompliance | X11Compliance | XPMCompliance },
00755     { "tomato1", 255, 99, 71, 1, X11Compliance },
00756     { "tomato2", 238, 92, 66, 1, X11Compliance },
00757     { "tomato3", 205, 79, 57, 1, X11Compliance },
00758     { "tomato4", 139, 54, 38, 1, X11Compliance },
00759     { "transparent", 0, 0, 0, 0, SVGCompliance },
00760     { "turquoise", 64, 224, 208, 1, SVGCompliance | X11Compliance | XPMCompliance },
00761     { "turquoise1", 0, 245, 255, 1, X11Compliance },
00762     { "turquoise2", 0, 229, 238, 1, X11Compliance },
00763     { "turquoise3", 0, 197, 205, 1, X11Compliance },
00764     { "turquoise4", 0, 134, 139, 1, X11Compliance },
00765     { "violet", 238, 130, 238, 1, SVGCompliance | X11Compliance | XPMCompliance },
00766     { "VioletRed", 208, 32, 144, 1, X11Compliance | XPMCompliance },
00767     { "VioletRed1", 255, 62, 150, 1, X11Compliance },
00768     { "VioletRed2", 238, 58, 140, 1, X11Compliance },
00769     { "VioletRed3", 205, 50, 120, 1, X11Compliance },
00770     { "VioletRed4", 139, 34, 82, 1, X11Compliance },
00771     { "wheat", 245, 222, 179, 1, SVGCompliance | X11Compliance | XPMCompliance },
00772     { "wheat1", 255, 231, 186, 1, X11Compliance },
00773     { "wheat2", 238, 216, 174, 1, X11Compliance },
00774     { "wheat3", 205, 186, 150, 1, X11Compliance },
00775     { "wheat4", 139, 126, 102, 1, X11Compliance },
00776     { "WhiteSmoke", 245, 245, 245, 1, SVGCompliance | X11Compliance | XPMCompliance },
00777     { "yellow1", 255, 255, 0, 1, X11Compliance },
00778     { "yellow2", 238, 238, 0, 1, X11Compliance },
00779     { "yellow3", 205, 205, 0, 1, X11Compliance },
00780     { "yellow4", 139, 139, 0, 1, X11Compliance },
00781     { "YellowGreen", 154, 205, 50, 1, SVGCompliance | X11Compliance | XPMCompliance }
00782   };
00783 
00784 /*
00785   Static declarations.
00786 */
00787 static LinkedListInfo
00788   *color_list = (LinkedListInfo *) NULL;
00789 
00790 static SemaphoreInfo
00791   *color_semaphore = (SemaphoreInfo *) NULL;
00792 
00793 static volatile MagickBooleanType
00794   instantiate_color = MagickFalse;
00795 
00796 /*
00797   Forward declarations.
00798 */
00799 static MagickBooleanType
00800   InitializeColorList(ExceptionInfo *),
00801   LoadColorLists(const char *,ExceptionInfo *);
00802 
00803 /*
00804 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00805 %                                                                             %
00806 %                                                                             %
00807 %                                                                             %
00808 +   C o l o r C o m p o n e n t G e n e s i s                                 %
00809 %                                                                             %
00810 %                                                                             %
00811 %                                                                             %
00812 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00813 %
00814 %  ColorComponentGenesis() instantiates the color component.
00815 %
00816 %  The format of the ColorComponentGenesis method is:
00817 %
00818 %      MagickBooleanType ColorComponentGenesis(void)
00819 %
00820 */
00821 MagickPrivate MagickBooleanType ColorComponentGenesis(void)
00822 {
00823   AcquireSemaphoreInfo(&color_semaphore);
00824   return(MagickTrue);
00825 }
00826 
00827 /*
00828 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00829 %                                                                             %
00830 %                                                                             %
00831 %                                                                             %
00832 +   C o l o r C o m p o n e n t T e r m i n u s                               %
00833 %                                                                             %
00834 %                                                                             %
00835 %                                                                             %
00836 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00837 %
00838 %  ColorComponentTerminus() destroys the color component.
00839 %
00840 %  The format of the ColorComponentTerminus method is:
00841 %
00842 %      ColorComponentTerminus(void)
00843 %
00844 */
00845 
00846 static void *DestroyColorElement(void *color_info)
00847 {
00848   register ColorInfo
00849     *p;
00850 
00851   p=(ColorInfo *) color_info;
00852   if (p->exempt  == MagickFalse)
00853     {
00854       if (p->path != (char *) NULL)
00855         p->path=DestroyString(p->path);
00856       if (p->name != (char *) NULL)
00857         p->name=DestroyString(p->name);
00858     }
00859   p=(ColorInfo *) RelinquishMagickMemory(p);
00860   return((void *) NULL);
00861 }
00862 
00863 MagickPrivate void ColorComponentTerminus(void)
00864 {
00865   if (color_semaphore == (SemaphoreInfo *) NULL)
00866     AcquireSemaphoreInfo(&color_semaphore);
00867   LockSemaphoreInfo(color_semaphore);
00868   if (color_list != (LinkedListInfo *) NULL)
00869     color_list=DestroyLinkedList(color_list,DestroyColorElement);
00870   instantiate_color=MagickFalse;
00871   UnlockSemaphoreInfo(color_semaphore);
00872   DestroySemaphoreInfo(&color_semaphore);
00873 }
00874 
00875 /*
00876 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00877 %                                                                             %
00878 %                                                                             %
00879 %                                                                             %
00880 +   G e t C o l o r C o m p l i a n c e                                       %
00881 %                                                                             %
00882 %                                                                             %
00883 %                                                                             %
00884 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00885 %
00886 %  GetColorInfo() searches the color list for the specified name and standards
00887 %  compliance and if found returns attributes for that color.
00888 %
00889 %  The format of the GetColorInfo method is:
00890 %
00891 %      const PixelInfo *GetColorInfo(const char *name,
00892 %        const ComplianceType compliance,ExceptionInfo *exception)
00893 %
00894 %  A description of each parameter follows:
00895 %
00896 %    o name: the color name.
00897 %
00898 %    o compliance: Adhere to this color standard: SVG, X11, or XPM.
00899 %
00900 %    o exception: return any errors or warnings in this structure.
00901 %
00902 */
00903 MagickExport const ColorInfo *GetColorCompliance(const char *name,
00904   const ComplianceType compliance,ExceptionInfo *exception)
00905 {
00906   char
00907     colorname[MaxTextExtent];
00908 
00909   register const ColorInfo
00910     *p;
00911 
00912   register char
00913     *q;
00914 
00915   assert(exception != (ExceptionInfo *) NULL);
00916   if ((color_list == (LinkedListInfo *) NULL) ||
00917       (instantiate_color == MagickFalse))
00918     if (InitializeColorList(exception) == MagickFalse)
00919       return((const ColorInfo *) NULL);
00920   if ((color_list == (LinkedListInfo *) NULL) ||
00921       (IsLinkedListEmpty(color_list) != MagickFalse))
00922     return((const ColorInfo *) NULL);
00923   if ((name == (const char *) NULL) || (LocaleCompare(name,"*") == 0))
00924     return((const ColorInfo *) GetValueFromLinkedList(color_list,0));
00925   /*
00926     Strip names of whitespace.
00927   */
00928   (void) CopyMagickString(colorname,name,MaxTextExtent);
00929   for (q=colorname; *q != '\0'; q++)
00930   {
00931     if (isspace((int) ((unsigned char) *q)) == 0)
00932       continue;
00933     (void) CopyMagickString(q,q+1,MaxTextExtent);
00934     q--;
00935   }
00936   /*
00937     Search for color tag.
00938   */
00939   LockSemaphoreInfo(color_semaphore);
00940   ResetLinkedListIterator(color_list);
00941   p=(const ColorInfo *) GetNextValueInLinkedList(color_list);
00942   while (p != (const ColorInfo *) NULL)
00943   {
00944     if (((p->compliance & compliance) != 0) &&
00945         (LocaleCompare(colorname,p->name) == 0))
00946       break;
00947     p=(const ColorInfo *) GetNextValueInLinkedList(color_list);
00948   }
00949   if (p == (ColorInfo *) NULL)
00950     (void) ThrowMagickException(exception,GetMagickModule(),OptionWarning,
00951       "UnrecognizedColor","`%s'",name);
00952   else
00953     (void) InsertValueInLinkedList(color_list,0,
00954       RemoveElementByValueFromLinkedList(color_list,p));
00955   UnlockSemaphoreInfo(color_semaphore);
00956   return(p);
00957 }
00958 
00959 /*
00960 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00961 %                                                                             %
00962 %                                                                             %
00963 %                                                                             %
00964 +   G e t C o l o r I n f o                                                   %
00965 %                                                                             %
00966 %                                                                             %
00967 %                                                                             %
00968 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00969 %
00970 %  GetColorInfo() searches the color list for the specified name and if found
00971 %  returns attributes for that color.
00972 %
00973 %  The format of the GetColorInfo method is:
00974 %
00975 %      const PixelInfo *GetColorInfo(const char *name,
00976 %        ExceptionInfo *exception)
00977 %
00978 %  A description of each parameter follows:
00979 %
00980 %    o color_info: search the color list for the specified name and if found
00981 %      return attributes for that color.
00982 %
00983 %    o name: the color name.
00984 %
00985 %    o exception: return any errors or warnings in this structure.
00986 %
00987 */
00988 MagickExport const ColorInfo *GetColorInfo(const char *name,
00989   ExceptionInfo *exception)
00990 {
00991   return(GetColorCompliance(name,AllCompliance,exception));
00992 }
00993 
00994 /*
00995 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00996 %                                                                             %
00997 %                                                                             %
00998 %                                                                             %
00999 +   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                         %
01000 %                                                                             %
01001 %                                                                             %
01002 %                                                                             %
01003 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01004 %
01005 %  ConcatenateColorComponent() returns the pixel as a canonical string.
01006 %
01007 %  The format of the ConcatenateColorComponent() method is:
01008 %
01009 %      void ConcatenateColorComponent(const PixelInfo *pixel,
01010 %        const PixelChannel component,const ComplianceType compliance,
01011 %        char *tuple)
01012 %
01013 %  A description of each parameter follows.
01014 %
01015 %    o pixel:  The pixel.
01016 %
01017 %    o component:  The pixel component.
01018 %
01019 %    o compliance: Adhere to this color standard: SVG, X11, or XPM.
01020 %
01021 %    o tuple:  The color tuple.
01022 %
01023 */
01024 MagickExport void ConcatenateColorComponent(const PixelInfo *pixel,
01025   const PixelChannel component,const ComplianceType compliance,char *tuple)
01026 {
01027   char
01028     text[MaxTextExtent];
01029 
01030   MagickRealType
01031     color;
01032 
01033   color=0.0;
01034   switch (component)
01035   {
01036     case RedPixelChannel:
01037     {
01038       color=pixel->red;
01039       break;
01040     }
01041     case GreenPixelChannel:
01042     {
01043       color=pixel->green;
01044       break;
01045     }
01046     case BluePixelChannel:
01047     {
01048       color=pixel->blue;
01049       break;
01050     }
01051     case AlphaPixelChannel:
01052     {
01053       color=pixel->alpha;
01054       break;
01055     }
01056     case BlackPixelChannel:
01057     {
01058       color=pixel->black;
01059       break;
01060     }
01061     default:
01062       break;
01063   }
01064   if (compliance != SVGCompliance)
01065     {
01066       if (pixel->depth > 16)
01067         {
01068           (void) FormatLocaleString(text,MaxTextExtent,"%10lu",(unsigned long)
01069             ScaleQuantumToLong(ClampToQuantum(color)));
01070           (void) ConcatenateMagickString(tuple,text,MaxTextExtent);
01071           return;
01072         }
01073       if (pixel->depth > 8)
01074         {
01075           (void) FormatLocaleString(text,MaxTextExtent,"%5d",
01076             ScaleQuantumToShort(ClampToQuantum(color)));
01077           (void) ConcatenateMagickString(tuple,text,MaxTextExtent);
01078           return;
01079         }
01080       (void) FormatLocaleString(text,MaxTextExtent,"%3d",
01081         ScaleQuantumToChar(ClampToQuantum(color)));
01082       (void) ConcatenateMagickString(tuple,text,MaxTextExtent);
01083       return;
01084     }
01085   if (component == AlphaPixelChannel)
01086     {
01087       (void) FormatLocaleString(text,MaxTextExtent,"%g",(double)
01088         (QuantumScale*color));
01089       (void) ConcatenateMagickString(tuple,text,MaxTextExtent);
01090       return;
01091     }
01092   if ((pixel->colorspace == HSLColorspace) ||
01093       (pixel->colorspace == HSBColorspace))
01094     {
01095       (void) FormatLocaleString(text,MaxTextExtent,"%g%%",(double)
01096         (100.0*QuantumScale*color));
01097       (void) ConcatenateMagickString(tuple,text,MaxTextExtent);
01098       return;
01099     }
01100   if (pixel->depth > 8)
01101     {
01102       (void) FormatLocaleString(text,MaxTextExtent,"%g%%",(double)
01103         (100.0*QuantumScale*color));
01104       (void) ConcatenateMagickString(tuple,text,MaxTextExtent);
01105       return;
01106     }
01107   (void) FormatLocaleString(text,MaxTextExtent,"%d",ScaleQuantumToChar(
01108     ClampToQuantum(color)));
01109   (void) ConcatenateMagickString(tuple,text,MaxTextExtent);
01110 }
01111 
01112 /*
01113 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01114 %                                                                             %
01115 %                                                                             %
01116 %                                                                             %
01117 %   G e t C o l o r I n f o L i s t                                           %
01118 %                                                                             %
01119 %                                                                             %
01120 %                                                                             %
01121 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01122 %
01123 %  GetColorInfoList() returns any colors that match the specified pattern.
01124 %
01125 %  The format of the GetColorInfoList function is:
01126 %
01127 %      const ColorInfo **GetColorInfoList(const char *pattern,
01128 %        size_t *number_colors,ExceptionInfo *exception)
01129 %
01130 %  A description of each parameter follows:
01131 %
01132 %    o pattern: Specifies a pointer to a text string containing a pattern.
01133 %
01134 %    o number_colors:  This integer returns the number of colors in the list.
01135 %
01136 %    o exception: return any errors or warnings in this structure.
01137 %
01138 */
01139 
01140 #if defined(__cplusplus) || defined(c_plusplus)
01141 extern "C" {
01142 #endif
01143 
01144 static int ColorInfoCompare(const void *x,const void *y)
01145 {
01146   const ColorInfo
01147     **p,
01148     **q;
01149 
01150   p=(const ColorInfo **) x,
01151   q=(const ColorInfo **) y;
01152   if (LocaleCompare((*p)->path,(*q)->path) == 0)
01153     return(LocaleCompare((*p)->name,(*q)->name));
01154   return(LocaleCompare((*p)->path,(*q)->path));
01155 }
01156 
01157 #if defined(__cplusplus) || defined(c_plusplus)
01158 }
01159 #endif
01160 
01161 MagickExport const ColorInfo **GetColorInfoList(const char *pattern,
01162   size_t *number_colors,ExceptionInfo *exception)
01163 {
01164   const ColorInfo
01165     **colors;
01166 
01167   register const ColorInfo
01168     *p;
01169 
01170   register ssize_t
01171     i;
01172 
01173   /*
01174     Allocate color list.
01175   */
01176   assert(pattern != (char *) NULL);
01177   (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",pattern);
01178   assert(number_colors != (size_t *) NULL);
01179   *number_colors=0;
01180   p=GetColorInfo("*",exception);
01181   if (p == (const ColorInfo *) NULL)
01182     return((const ColorInfo **) NULL);
01183   colors=(const ColorInfo **) AcquireQuantumMemory((size_t)
01184     GetNumberOfElementsInLinkedList(color_list)+1UL,sizeof(*colors));
01185   if (colors == (const ColorInfo **) NULL)
01186     return((const ColorInfo **) NULL);
01187   /*
01188     Generate color list.
01189   */
01190   LockSemaphoreInfo(color_semaphore);
01191   ResetLinkedListIterator(color_list);
01192   p=(const ColorInfo *) GetNextValueInLinkedList(color_list);
01193   for (i=0; p != (const ColorInfo *) NULL; )
01194   {
01195     if ((p->stealth == MagickFalse) &&
01196         (GlobExpression(p->name,pattern,MagickFalse) != MagickFalse))
01197       colors[i++]=p;
01198     p=(const ColorInfo *) GetNextValueInLinkedList(color_list);
01199   }
01200   UnlockSemaphoreInfo(color_semaphore);
01201   qsort((void *) colors,(size_t) i,sizeof(*colors),ColorInfoCompare);
01202   colors[i]=(ColorInfo *) NULL;
01203   *number_colors=(size_t) i;
01204   return(colors);
01205 }
01206 
01207 /*
01208 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01209 %                                                                             %
01210 %                                                                             %
01211 %                                                                             %
01212 %   G e t C o l o r L i s t                                                   %
01213 %                                                                             %
01214 %                                                                             %
01215 %                                                                             %
01216 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01217 %
01218 %  GetColorList() returns any colors that match the specified pattern.
01219 %
01220 %  The format of the GetColorList function is:
01221 %
01222 %      char **GetColorList(const char *pattern,size_t *number_colors,
01223 %        ExceptionInfo *exception)
01224 %
01225 %  A description of each parameter follows:
01226 %
01227 %    o pattern: Specifies a pointer to a text string containing a pattern.
01228 %
01229 %    o number_colors:  This integer returns the number of colors in the list.
01230 %
01231 %    o exception: return any errors or warnings in this structure.
01232 %
01233 */
01234 
01235 #if defined(__cplusplus) || defined(c_plusplus)
01236 extern "C" {
01237 #endif
01238 
01239 static int ColorCompare(const void *x,const void *y)
01240 {
01241   register const char
01242     **p,
01243     **q;
01244 
01245   p=(const char **) x;
01246   q=(const char **) y;
01247   return(LocaleCompare(*p,*q));
01248 }
01249 
01250 #if defined(__cplusplus) || defined(c_plusplus)
01251 }
01252 #endif
01253 
01254 MagickExport char **GetColorList(const char *pattern,
01255   size_t *number_colors,ExceptionInfo *exception)
01256 {
01257   char
01258     **colors;
01259 
01260   register const ColorInfo
01261     *p;
01262 
01263   register ssize_t
01264     i;
01265 
01266   /*
01267     Allocate color list.
01268   */
01269   assert(pattern != (char *) NULL);
01270   (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",pattern);
01271   assert(number_colors != (size_t *) NULL);
01272   *number_colors=0;
01273   p=GetColorInfo("*",exception);
01274   if (p == (const ColorInfo *) NULL)
01275     return((char **) NULL);
01276   colors=(char **) AcquireQuantumMemory((size_t)
01277     GetNumberOfElementsInLinkedList(color_list)+1UL,sizeof(*colors));
01278   if (colors == (char **) NULL)
01279     return((char **) NULL);
01280   /*
01281     Generate color list.
01282   */
01283   LockSemaphoreInfo(color_semaphore);
01284   ResetLinkedListIterator(color_list);
01285   p=(const ColorInfo *) GetNextValueInLinkedList(color_list);
01286   for (i=0; p != (const ColorInfo *) NULL; )
01287   {
01288     if ((p->stealth == MagickFalse) &&
01289         (GlobExpression(p->name,pattern,MagickFalse) != MagickFalse))
01290       colors[i++]=ConstantString(p->name);
01291     p=(const ColorInfo *) GetNextValueInLinkedList(color_list);
01292   }
01293   UnlockSemaphoreInfo(color_semaphore);
01294   qsort((void *) colors,(size_t) i,sizeof(*colors),ColorCompare);
01295   colors[i]=(char *) NULL;
01296   *number_colors=(size_t) i;
01297   return(colors);
01298 }
01299 
01300 /*
01301 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01302 %                                                                             %
01303 %                                                                             %
01304 %                                                                             %
01305 +   G e t C o l o r T u p l e                                                 %
01306 %                                                                             %
01307 %                                                                             %
01308 %                                                                             %
01309 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01310 %
01311 %  GetColorTuple() returns a color as a color tuple string (e.g. rgba(255,0,0))
01312 %  or hex string (e.g. #FF0000).
01313 %
01314 %  The format of the GetColorTuple method is:
01315 %
01316 %      GetColorTuple(const PixelInfo *pixel,const MagickBooleanType hex,
01317 %        char *tuple)
01318 %
01319 %  A description of each parameter follows.
01320 %
01321 %    o pixel: the pixel.
01322 %
01323 %    o hex: A value other than zero returns the tuple in a hexidecimal format.
01324 %
01325 %    o tuple: Return the color tuple as this string.
01326 %
01327 */
01328 
01329 static void ConcatentateHexColorComponent(const PixelInfo *pixel,
01330   const PixelChannel channel,char *tuple)
01331 {
01332   char
01333     component[MaxTextExtent];
01334 
01335   MagickRealType
01336     color;
01337 
01338   color=0.0;
01339   switch (channel)
01340   {
01341     case RedPixelChannel:
01342     {
01343       color=pixel->red;
01344       break;
01345     }
01346     case GreenPixelChannel:
01347     {
01348       color=pixel->green;
01349       break;
01350     }
01351     case BluePixelChannel:
01352     {
01353       color=pixel->blue;
01354       break;
01355     }
01356     case AlphaPixelChannel:
01357     {
01358       color=pixel->alpha;
01359       break;
01360     }
01361     case BlackPixelChannel:
01362     {
01363       color=pixel->black;
01364       break;
01365     }
01366     default:
01367       break;
01368   }
01369   if (pixel->depth > 32)
01370     {
01371       (void) FormatLocaleString(component,MaxTextExtent,"%08lX%08lX",
01372         (unsigned long) ScaleQuantumToLong(ClampToQuantum(color)),
01373         (unsigned long) ScaleQuantumToLong(ClampToQuantum(color)));
01374       (void) ConcatenateMagickString(tuple,component,MaxTextExtent);
01375       return;
01376     }
01377   if (pixel->depth > 16)
01378     {
01379       (void) FormatLocaleString(component,MaxTextExtent,"%08X",
01380         (unsigned int) ScaleQuantumToLong(ClampToQuantum(color)));
01381       (void) ConcatenateMagickString(tuple,component,MaxTextExtent);
01382       return;
01383     }
01384   if (pixel->depth > 8)
01385     {
01386       (void) FormatLocaleString(component,MaxTextExtent,"%04X",
01387         ScaleQuantumToShort(ClampToQuantum(color)));
01388       (void) ConcatenateMagickString(tuple,component,MaxTextExtent);
01389       return;
01390     }
01391   (void) FormatLocaleString(component,MaxTextExtent,"%02X",
01392     ScaleQuantumToChar(ClampToQuantum(color)));
01393   (void) ConcatenateMagickString(tuple,component,MaxTextExtent);
01394   return;
01395 }
01396 
01397 MagickExport void GetColorTuple(const PixelInfo *pixel,
01398   const MagickBooleanType hex,char *tuple)
01399 {
01400   PixelInfo
01401     color;
01402 
01403   assert(pixel != (const PixelInfo *) NULL);
01404   assert(tuple != (char *) NULL);
01405   (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",tuple);
01406   *tuple='\0';
01407   if (hex != MagickFalse)
01408     {
01409       /*
01410         Convert pixel to hex color.
01411       */
01412       (void) ConcatenateMagickString(tuple,"#",MaxTextExtent);
01413       ConcatentateHexColorComponent(pixel,RedPixelChannel,tuple);
01414       ConcatentateHexColorComponent(pixel,GreenPixelChannel,tuple);
01415       ConcatentateHexColorComponent(pixel,BluePixelChannel,tuple);
01416       if (pixel->colorspace == CMYKColorspace)
01417         ConcatentateHexColorComponent(pixel,BlackPixelChannel,tuple);
01418       if ((pixel->matte != MagickFalse) && (pixel->alpha != OpaqueAlpha))
01419         ConcatentateHexColorComponent(pixel,AlphaPixelChannel,tuple);
01420       return;
01421     }
01422   /*
01423     Convert pixel to rgb() or cmyk() color.
01424   */
01425   color=(*pixel);
01426   if (color.depth > 8)
01427     {
01428 #define SVGCompliant(component) ((MagickRealType) \
01429    ScaleCharToQuantum(ScaleQuantumToChar(ClampToQuantum(component))))
01430 
01431       MagickStatusType
01432         status;
01433 
01434       /*
01435         SVG requires color depths > 8 expressed as percentages.
01436       */
01437       status=fabs(color.red-SVGCompliant(color.red)) < MagickEpsilon ?
01438         MagickTrue : MagickFalse;
01439       status&=fabs(color.green-SVGCompliant(color.green)) < MagickEpsilon ?
01440         MagickTrue : MagickFalse;
01441       status&=fabs(color.blue-SVGCompliant(color.blue)) < MagickEpsilon ?
01442         MagickTrue : MagickFalse;
01443       if (color.colorspace-CMYKColorspace)
01444         status&=fabs(color.black-SVGCompliant(color.black)) < MagickEpsilon ?
01445           MagickTrue : MagickFalse;
01446       if (color.matte != MagickFalse)
01447         status&=fabs(color.alpha-SVGCompliant(color.alpha)) < MagickEpsilon ?
01448           MagickTrue : MagickFalse;
01449       if (status != MagickFalse)
01450         color.depth=8;
01451     }
01452   (void) ConcatenateMagickString(tuple,CommandOptionToMnemonic(
01453     MagickColorspaceOptions,(ssize_t) color.colorspace),MaxTextExtent);
01454   if (color.matte != MagickFalse)
01455     (void) ConcatenateMagickString(tuple,"a",MaxTextExtent);
01456   (void) ConcatenateMagickString(tuple,"(",MaxTextExtent);
01457   if (color.colorspace == GRAYColorspace)
01458     ConcatenateColorComponent(&color,GrayPixelChannel,SVGCompliance,tuple);
01459   else
01460     {
01461       ConcatenateColorComponent(&color,RedPixelChannel,SVGCompliance,tuple);
01462       (void) ConcatenateMagickString(tuple,",",MaxTextExtent);
01463       ConcatenateColorComponent(&color,GreenPixelChannel,SVGCompliance,tuple);
01464       (void) ConcatenateMagickString(tuple,",",MaxTextExtent);
01465       ConcatenateColorComponent(&color,BluePixelChannel,SVGCompliance,tuple);
01466     }
01467   if (color.colorspace == CMYKColorspace)
01468     {
01469       (void) ConcatenateMagickString(tuple,",",MaxTextExtent);
01470       ConcatenateColorComponent(&color,BlackPixelChannel,SVGCompliance,tuple);
01471     }
01472   if (color.matte != MagickFalse)
01473     {
01474       (void) ConcatenateMagickString(tuple,",",MaxTextExtent);
01475       ConcatenateColorComponent(&color,AlphaPixelChannel,SVGCompliance,tuple);
01476     }
01477   (void) ConcatenateMagickString(tuple,")",MaxTextExtent);
01478   LocaleLower(tuple);
01479   return;
01480 }
01481 
01482 /*
01483 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01484 %                                                                             %
01485 %                                                                             %
01486 %                                                                             %
01487 +   I n i t i a l i z e C o l o r L i s t                                     %
01488 %                                                                             %
01489 %                                                                             %
01490 %                                                                             %
01491 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01492 %
01493 %  InitializeColorList() initializes the color list.
01494 %
01495 %  The format of the InitializeColorList method is:
01496 %
01497 %      MagickBooleanType InitializeColorList(ExceptionInfo *exception)
01498 %
01499 %  A description of each parameter follows.
01500 %
01501 %    o exception: return any errors or warnings in this structure.
01502 %
01503 */
01504 static MagickBooleanType InitializeColorList(ExceptionInfo *exception)
01505 {
01506   if ((color_list == (LinkedListInfo *) NULL) &&
01507       (instantiate_color == MagickFalse))
01508     {
01509       if (color_semaphore == (SemaphoreInfo *) NULL)
01510         AcquireSemaphoreInfo(&color_semaphore);
01511       LockSemaphoreInfo(color_semaphore);
01512       if ((color_list == (LinkedListInfo *) NULL) &&
01513           (instantiate_color == MagickFalse))
01514         {
01515           (void) LoadColorLists(ColorFilename,exception);
01516           instantiate_color=MagickTrue;
01517         }
01518       UnlockSemaphoreInfo(color_semaphore);
01519     }
01520   return(color_list != (LinkedListInfo *) NULL ? MagickTrue : MagickFalse);
01521 }
01522 
01523 /*
01524 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01525 %                                                                             %
01526 %                                                                             %
01527 %                                                                             %
01528 +   I s A l p h a S i m i l a r                                               %
01529 %                                                                             %
01530 %                                                                             %
01531 %                                                                             %
01532 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01533 %
01534 %  IsEquivalentAlpha() returns true if the distance between two alpha values is
01535 %  less than the specified distance in a linear color space.  This method is
01536 %  used by MatteFloodFill() and other algorithms which compare two alpha values.
01537 %
01538 %  The format of the IsEquivalentAlpha method is:
01539 %
01540 %      void IsEquivalentAlpha(const Image *image,const PixelInfo *p,
01541 %        const PixelInfo *q)
01542 %
01543 %  A description of each parameter follows:
01544 %
01545 %    o image: the image.
01546 %
01547 %    o p: Pixel p.
01548 %
01549 %    o q: Pixel q.
01550 %
01551 */
01552 
01553 static inline double MagickMax(const double x,const double y)
01554 {
01555   if (x > y)
01556     return(x);
01557   return(y);
01558 }
01559 
01560 MagickExport MagickBooleanType IsEquivalentAlpha(const Image *image,
01561   const PixelInfo *p,const PixelInfo *q)
01562 {
01563   MagickRealType
01564     fuzz,
01565     pixel;
01566 
01567   register MagickRealType
01568     distance;
01569 
01570   if (image->matte == MagickFalse)
01571     return(MagickTrue);
01572   if (p->alpha == q->alpha)
01573     return(MagickTrue);
01574   fuzz=MagickMax(image->fuzz,MagickSQ1_2)*MagickMax(image->fuzz,MagickSQ1_2);
01575   pixel=(MagickRealType) p->alpha-(MagickRealType) q->alpha;
01576   distance=pixel*pixel;
01577   if (distance > fuzz)
01578     return(MagickFalse);
01579   return(MagickTrue);
01580 }
01581 
01582 /*
01583 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01584 %                                                                             %
01585 %                                                                             %
01586 %                                                                             %
01587 +   I s I m a g e S i m i l a r                                               %
01588 %                                                                             %
01589 %                                                                             %
01590 %                                                                             %
01591 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01592 %
01593 %  IsEquivalentImage() returns true if the target is similar to a region of the
01594 %  image.
01595 %
01596 %  The format of the IsEquivalentImage method is:
01597 %
01598 %      MagickBooleanType IsEquivalentImage(const Image *image,
01599 %        const Image *target_image,ssize_t *x_offset,ssize_t *y_offset,
01600 %        ExceptionInfo *exception)
01601 %
01602 %  A description of each parameter follows:
01603 %
01604 %    o image: the image.
01605 %
01606 %    o target_image: the target image.
01607 %
01608 %    o x_offset: On input the starting x position to search for a match;
01609 %      on output the x position of the first match found.
01610 %
01611 %    o y_offset: On input the starting y position to search for a match;
01612 %      on output the y position of the first match found.
01613 %
01614 %    o exception: return any errors or warnings in this structure.
01615 %
01616 */
01617 MagickExport MagickBooleanType IsEquivalentImage(const Image *image,
01618   const Image *target_image,ssize_t *x_offset,ssize_t *y_offset,
01619   ExceptionInfo *exception)
01620 {
01621 #define SearchImageText  "  Searching image...  "
01622 
01623   CacheView
01624     *image_view,
01625     *target_view;
01626 
01627   MagickBooleanType
01628     status;
01629 
01630   PixelInfo
01631     target,
01632     pixel;
01633 
01634   register const Quantum
01635     *p,
01636     *q;
01637 
01638   register ssize_t
01639     i,
01640     x;
01641 
01642   ssize_t
01643     j,
01644     y;
01645 
01646   assert(image != (Image *) NULL);
01647   assert(image->signature == MagickSignature);
01648   if (image->debug != MagickFalse)
01649     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
01650   assert(target_image != (Image *) NULL);
01651   assert(target_image->signature == MagickSignature);
01652   assert(x_offset != (ssize_t *) NULL);
01653   assert(y_offset != (ssize_t *) NULL);
01654   assert(exception != (ExceptionInfo *) NULL);
01655   x=0;
01656   status=MagickTrue;
01657   GetPixelInfo(image,&pixel);
01658   GetPixelInfo(image,&target);
01659   image_view=AcquireCacheView(image);
01660   target_view=AcquireCacheView(target_image);
01661   for (y=(*y_offset); y < (ssize_t) image->rows; y++)
01662   {
01663     for (x=y == 0 ? *x_offset : 0; x < (ssize_t) image->columns; x++)
01664     {
01665       for (j=0; j < (ssize_t) target_image->rows; j++)
01666       {
01667         for (i=0; i < (ssize_t) target_image->columns; i++)
01668         {
01669           p=GetCacheViewVirtualPixels(image_view,x+i,y+j,1,1,exception);
01670           GetPixelInfoPixel(image,p,&pixel);
01671           q=GetCacheViewVirtualPixels(target_view,i,j,1,1,exception);
01672           GetPixelInfoPixel(image,q,&target);
01673           if (IsFuzzyEquivalencePixelInfo(&pixel,&target) == MagickFalse)
01674             break;
01675         }
01676         if (i < (ssize_t) target_image->columns)
01677           break;
01678       }
01679       if (j == (ssize_t) target_image->rows)
01680         break;
01681     }
01682     if (x < (ssize_t) image->columns)
01683       break;
01684     if (image->progress_monitor != (MagickProgressMonitor) NULL)
01685       {
01686         MagickBooleanType
01687           proceed;
01688 
01689         proceed=SetImageProgress(image,SearchImageText,(MagickOffsetType) y,
01690           image->rows);
01691         if (proceed == MagickFalse)
01692           status=MagickFalse;
01693       }
01694   }
01695   target_view=DestroyCacheView(target_view);
01696   image_view=DestroyCacheView(image_view);
01697   *x_offset=x;
01698   *y_offset=y;
01699   if (status == MagickFalse)
01700     return(status);
01701   return(y < (ssize_t) image->rows ? MagickTrue : MagickFalse);
01702 }
01703 
01704 /*
01705 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01706 %                                                                             %
01707 %                                                                             %
01708 %                                                                             %
01709 %  L i s t C o l o r I n f o                                                  %
01710 %                                                                             %
01711 %                                                                             %
01712 %                                                                             %
01713 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01714 %
01715 %  ListColorInfo() lists color names to the specified file.  Color names
01716 %  are a convenience.  Rather than defining a color by its red, green, and
01717 %  blue intensities just use a color name such as white, blue, or yellow.
01718 %
01719 %  The format of the ListColorInfo method is:
01720 %
01721 %      MagickBooleanType ListColorInfo(FILE *file,ExceptionInfo *exception)
01722 %
01723 %  A description of each parameter follows.
01724 %
01725 %    o file:  List color names to this file handle.
01726 %
01727 %    o exception: return any errors or warnings in this structure.
01728 %
01729 */
01730 MagickExport MagickBooleanType ListColorInfo(FILE *file,
01731   ExceptionInfo *exception)
01732 {
01733   char
01734     tuple[MaxTextExtent];
01735 
01736   const char
01737     *path;
01738 
01739   const ColorInfo
01740     **color_info;
01741 
01742   register ssize_t
01743     i;
01744 
01745   size_t
01746     number_colors;
01747 
01748   /*
01749     List name and attributes of each color in the list.
01750   */
01751   if (file == (const FILE *) NULL)
01752     file=stdout;
01753   color_info=GetColorInfoList("*",&number_colors,exception);
01754   if (color_info == (const ColorInfo **) NULL)
01755     return(MagickFalse);
01756   path=(const char *) NULL;
01757   for (i=0; i < (ssize_t) number_colors; i++)
01758   {
01759     if (color_info[i]->stealth != MagickFalse)
01760       continue;
01761     if ((path == (const char *) NULL) ||
01762         (LocaleCompare(path,color_info[i]->path) != 0))
01763       {
01764         if (color_info[i]->path != (char *) NULL)
01765           (void) FormatLocaleFile(file,"\nPath: %s\n\n",color_info[i]->path);
01766         (void) FormatLocaleFile(file,
01767           "Name                  Color                  "
01768           "                       Compliance\n");
01769         (void) FormatLocaleFile(file,
01770           "-------------------------------------------------"
01771           "------------------------------\n");
01772       }
01773     path=color_info[i]->path;
01774     (void) FormatLocaleFile(file,"%-21.21s ",color_info[i]->name);
01775     GetColorTuple(&color_info[i]->color,MagickFalse,tuple);
01776     (void) FormatLocaleFile(file,"%-45.45s ",tuple);
01777     if ((color_info[i]->compliance & SVGCompliance) != 0)
01778       (void) FormatLocaleFile(file,"SVG ");
01779     if ((color_info[i]->compliance & X11Compliance) != 0)
01780       (void) FormatLocaleFile(file,"X11 ");
01781     if ((color_info[i]->compliance & XPMCompliance) != 0)
01782       (void) FormatLocaleFile(file,"XPM ");
01783     (void) FormatLocaleFile(file,"\n");
01784   }
01785   color_info=(const ColorInfo **) RelinquishMagickMemory((void *) color_info);
01786   (void) fflush(file);
01787   return(MagickTrue);
01788 }
01789 
01790 /*
01791 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01792 %                                                                             %
01793 %                                                                             %
01794 %                                                                             %
01795 +   L o a d C o l o r L i s t                                                 %
01796 %                                                                             %
01797 %                                                                             %
01798 %                                                                             %
01799 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
01800 %
01801 %  LoadColorList() loads the color configuration file which provides a mapping
01802 %  between color attributes and a color name.
01803 %
01804 %  The format of the LoadColorList method is:
01805 %
01806 %      MagickBooleanType LoadColorList(const char *xml,const char *filename,
01807 %        const size_t depth,ExceptionInfo *exception)
01808 %
01809 %  A description of each parameter follows:
01810 %
01811 %    o xml:  The color list in XML format.
01812 %
01813 %    o filename:  The color list filename.
01814 %
01815 %    o depth: depth of <include /> statements.
01816 %
01817 %    o exception: return any errors or warnings in this structure.
01818 %
01819 */
01820 static MagickBooleanType LoadColorList(const char *xml,const char *filename,
01821   const size_t depth,ExceptionInfo *exception)
01822 {
01823   char
01824     keyword[MaxTextExtent],
01825     *token;
01826 
01827   ColorInfo
01828     *color_info;
01829 
01830   const char
01831     *q;
01832 
01833   MagickBooleanType
01834     status;
01835 
01836   /*
01837     Load the color map file.
01838   */
01839   (void) LogMagickEvent(ConfigureEvent,GetMagickModule(),
01840     "Loading color file \"%s\" ...",filename);
01841   if (xml == (char *) NULL)
01842     return(MagickFalse);
01843   if (color_list == (LinkedListInfo *) NULL)
01844     {
01845       color_list=NewLinkedList(0);
01846       if (color_list == (LinkedListInfo *) NULL)
01847         {
01848           ThrowFileException(exception,ResourceLimitError,
01849             "MemoryAllocationFailed",filename);
01850           return(MagickFalse);
01851         }
01852     }
01853   status=MagickTrue;
01854   color_info=(ColorInfo *) NULL;
01855   token=AcquireString(xml);
01856   for (q=(char *) xml; *q != '\0'; )
01857   {
01858     /*
01859       Interpret XML.
01860     */
01861     GetMagickToken(q,&q,token);
01862     if (*token == '\0')
01863       break;
01864     (void) CopyMagickString(keyword,token,MaxTextExtent);
01865     if (LocaleNCompare(keyword,"<!DOCTYPE",9) == 0)
01866       {
01867         /*
01868           Doctype element.
01869         */
01870         while ((LocaleNCompare(q,"]>",2) != 0) && (*q != '\0'))
01871           GetMagickToken(q,&q,token);
01872         continue;
01873       }
01874     if (LocaleNCompare(keyword,"<!--",4) == 0)
01875       {
01876         /*
01877           Comment element.
01878         */
01879         while ((LocaleNCompare(q,"->",2) != 0) && (*q != '\0'))
01880           GetMagickToken(q,&q,token);
01881         continue;
01882       }
01883     if (LocaleCompare(keyword,"<include") == 0)
01884       {
01885         /*
01886           Include element.
01887         */
01888         while (((*token != '/') && (*(token+1) != '>')) && (*q != '\0'))
01889         {
01890           (void) CopyMagickString(keyword,token,MaxTextExtent);
01891           GetMagickToken(q,&q,token);
01892           if (*token != '=')
01893             continue;
01894           GetMagickToken(q,&q,token);
01895           if (LocaleCompare(keyword,"file") == 0)
01896             {
01897               if (depth > 200)
01898                 (void) ThrowMagickException(exception,GetMagickModule(),
01899                   ConfigureError,"IncludeElementNestedTooDeeply","`%s'",token);
01900               else
01901                 {
01902                   char
01903                     path[MaxTextExtent],
01904                     *xml;
01905 
01906                   GetPathComponent(filename,HeadPath,path);
01907                   if (*path != '\0')
01908                     (void) ConcatenateMagickString(path,DirectorySeparator,
01909                       MaxTextExtent);
01910                   if (*token == *DirectorySeparator)
01911                     (void) CopyMagickString(path,token,MaxTextExtent);
01912                   else
01913                     (void) ConcatenateMagickString(path,token,MaxTextExtent);
01914                   xml=FileToString(path,~0,exception);
01915                   if (xml != (char *) NULL)
01916                     {
01917                       status=LoadColorList(xml,path,depth+1,exception);
01918                       xml=(char *) RelinquishMagickMemory(xml);
01919                     }
01920                 }
01921             }
01922         }
01923         continue;
01924       }
01925     if (LocaleCompare(keyword,"<color") == 0)
01926       {
01927         /*
01928           Color element.
01929         */
01930         color_info=(ColorInfo *) AcquireMagickMemory(sizeof(*color_info));
01931         if (color_info == (ColorInfo *) NULL)
01932           ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
01933         (void) ResetMagickMemory(color_info,0,sizeof(*color_info));
01934         color_info->path=ConstantString(filename);
01935         color_info->exempt=MagickFalse;
01936         color_info->signature=MagickSignature;
01937         continue;
01938       }
01939     if (color_info == (ColorInfo *) NULL)
01940       continue;
01941     if (LocaleCompare(keyword,"/>") == 0)
01942       {
01943         status=AppendValueToLinkedList(color_list,color_info);
01944         if (status == MagickFalse)
01945           (void) ThrowMagickException(exception,GetMagickModule(),
01946             ResourceLimitError,"MemoryAllocationFailed","`%s'",
01947             color_info->name);
01948         color_info=(ColorInfo *) NULL;
01949       }
01950     GetMagickToken(q,(const char **) NULL,token);
01951     if (*token != '=')
01952       continue;
01953     GetMagickToken(q,&q,token);
01954     GetMagickToken(q,&q,token);
01955     switch (*keyword)
01956     {
01957       case 'C':
01958       case 'c':
01959       {
01960         if (LocaleCompare((char *) keyword,"color") == 0)
01961           {
01962             (void) QueryColorCompliance(token,AllCompliance,&color_info->color,
01963               exception);
01964             break;
01965           }
01966         if (LocaleCompare((char *) keyword,"compliance") == 0)
01967           {
01968             ssize_t
01969               compliance;
01970 
01971             compliance=color_info->compliance;
01972             if (GlobExpression(token,"*SVG*",MagickTrue) != MagickFalse)
01973               compliance|=SVGCompliance;
01974             if (GlobExpression(token,"*X11*",MagickTrue) != MagickFalse)
01975               compliance|=X11Compliance;
01976             if (GlobExpression(token,"*XPM*",MagickTrue) != MagickFalse)
01977               compliance|=XPMCompliance;
01978             color_info->compliance=(ComplianceType) compliance;
01979             break;
01980           }
01981         break;
01982       }
01983       case 'N':
01984       case 'n':
01985       {
01986         if (LocaleCompare((char *) keyword,"name") == 0)
01987           {
01988             color_info->name=ConstantString(token);
01989             break;
01990           }
01991         break;
01992       }
01993       case 'S':
01994       case 's':
01995       {
01996         if (LocaleCompare((char *) keyword,"stealth") == 0)
01997           {
01998             color_info->stealth=IsMagickTrue(token);
01999             break;
02000           }
02001         break;
02002       }
02003       default:
02004         break;
02005     }
02006   }
02007   token=(char *) RelinquishMagickMemory(token);
02008   return(status);
02009 }
02010 
02011 /*
02012 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
02013 %                                                                             %
02014 %                                                                             %
02015 %                                                                             %
02016 %  L o a d C o l o r L i s t s                                                %
02017 %                                                                             %
02018 %                                                                             %
02019 %                                                                             %
02020 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
02021 %
02022 %  LoadColorList() loads one or more color configuration file which provides a
02023 %  mapping between color attributes and a color name.
02024 %
02025 %  The format of the LoadColorLists method is:
02026 %
02027 %      MagickBooleanType LoadColorLists(const char *filename,
02028 %        ExceptionInfo *exception)
02029 %
02030 %  A description of each parameter follows:
02031 %
02032 %    o filename: the font file name.
02033 %
02034 %    o exception: return any errors or warnings in this structure.
02035 %
02036 */
02037 static MagickBooleanType LoadColorLists(const char *filename,
02038   ExceptionInfo *exception)
02039 {
02040   const StringInfo
02041     *option;
02042 
02043   LinkedListInfo
02044     *options;
02045 
02046   MagickStatusType
02047     status;
02048 
02049   register ssize_t
02050     i;
02051 
02052   /*
02053     Load built-in color map.
02054   */
02055   status=MagickFalse;
02056   if (color_list == (LinkedListInfo *) NULL)
02057     {
02058       color_list=NewLinkedList(0);
02059       if (color_list == (LinkedListInfo *) NULL)
02060         {
02061           ThrowFileException(exception,ResourceLimitError,
02062             "MemoryAllocationFailed",filename);
02063           return(MagickFalse);
02064         }
02065     }
02066   for (i=0; i < (ssize_t) (sizeof(ColorMap)/sizeof(*ColorMap)); i++)
02067   {
02068     ColorInfo
02069       *color_info;
02070 
02071     register const ColorMapInfo
02072       *p;
02073 
02074     p=ColorMap+i;
02075     color_info=(ColorInfo *) AcquireMagickMemory(sizeof(*color_info));
02076     if (color_info == (ColorInfo *) NULL)
02077       {
02078         (void) ThrowMagickException(exception,GetMagickModule(),
02079           ResourceLimitError,"MemoryAllocationFailed","`%s'",color_info->name);
02080         continue;
02081       }
02082     (void) ResetMagickMemory(color_info,0,sizeof(*color_info));
02083     color_info->path=(char *) "[built-in]";
02084     color_info->name=(char *) p->name;
02085     GetPixelInfo((Image *) NULL,&color_info->color);
02086     color_info->color.red=(MagickRealType) ScaleCharToQuantum(p->red);
02087     color_info->color.green=(MagickRealType) ScaleCharToQuantum(p->green);
02088     color_info->color.blue=(MagickRealType) ScaleCharToQuantum(p->blue);
02089     color_info->color.alpha=(MagickRealType) (QuantumRange*p->alpha);
02090     color_info->compliance=(ComplianceType) p->compliance;
02091     color_info->exempt=MagickTrue;
02092     color_info->signature=MagickSignature;
02093     status=AppendValueToLinkedList(color_list,color_info);
02094     if (status == MagickFalse)
02095       (void) ThrowMagickException(exception,GetMagickModule(),
02096         ResourceLimitError,"MemoryAllocationFailed","`%s'",color_info->name);
02097   }
02098   /*
02099     Load external color map.
02100   */
02101   options=GetConfigureOptions(filename,exception);
02102   option=(const StringInfo *) GetNextValueInLinkedList(options);
02103   while (option != (const StringInfo *) NULL)
02104   {
02105     status|=LoadColorList((const char *) GetStringInfoDatum(option),
02106       GetStringInfoPath(option),0,exception);
02107     option=(const StringInfo *) GetNextValueInLinkedList(options);
02108   }
02109   options=DestroyConfigureOptions(options);
02110   return(status != 0 ? MagickTrue : MagickFalse);
02111 }
02112 
02113 /*
02114 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
02115 %                                                                             %
02116 %                                                                             %
02117 %                                                                             %
02118 +   Q u e r y C o l o r C o m p l i a n c e                                   %
02119 %                                                                             %
02120 %                                                                             %
02121 %                                                                             %
02122 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
02123 %
02124 %  QueryColorCompliance() returns the red, green, blue, and alpha intensities
02125 %  for a given color name and standards compliance.
02126 %
02127 %  The format of the QueryColorCompliance method is:
02128 %
02129 %      MagickBooleanType QueryColorCompliance(const char *name,
02130 %        const ComplianceType compliance,PixelInfo *color,
02131 %        ExceptionInfo *exception)
02132 %
02133 %  A description of each parameter follows:
02134 %
02135 %    o name: the color name (e.g. white, blue, yellow).
02136 %
02137 %    o compliance: Adhere to this color standard: SVG, X11, or XPM.
02138 %
02139 %    o color: the red, green, blue, and opacity intensities values of the
02140 %      named color in this structure.
02141 %
02142 %    o exception: return any errors or warnings in this structure.
02143 %
02144 */
02145 MagickExport MagickBooleanType QueryColorCompliance(const char *name,
02146   const ComplianceType compliance,PixelInfo *color,ExceptionInfo *exception)
02147 {
02148   GeometryInfo
02149     geometry_info;
02150 
02151   MagickRealType
02152     scale;
02153 
02154   MagickStatusType
02155     flags;
02156 
02157   register const ColorInfo
02158     *p;
02159 
02160   register ssize_t
02161     i;
02162 
02163   ssize_t
02164     type;
02165 
02166   /*
02167     Initialize color return value.
02168   */
02169   assert(name != (const char *) NULL);
02170   (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",name);
02171   assert(color != (PixelInfo *) NULL);
02172   GetPixelInfo((Image *) NULL,color);
02173   if ((name == (char *) NULL) || (*name == '\0'))
02174     name=BackgroundColor;
02175   while (isspace((int) ((unsigned char) *name)) != 0)
02176     name++;
02177   if (*name == '#')
02178     {
02179       char
02180         c;
02181 
02182       PixelPacket
02183         pixel;
02184 
02185       QuantumAny
02186         range;
02187 
02188       size_t
02189         depth,
02190         n;
02191 
02192       /*
02193         Parse hex color.
02194       */
02195       (void) ResetMagickMemory(&pixel,0,sizeof(pixel));
02196       name++;
02197       for (n=0; isxdigit((int) ((unsigned char) name[n])) != MagickFalse; n++) ;
02198       if ((n % 3) == 0)
02199         {
02200           do
02201           {
02202             pixel.red=pixel.green;
02203             pixel.green=pixel.blue;
02204             pixel.blue=0;
02205             for (i=(ssize_t) (n/3-1); i >= 0; i--)
02206             {
02207               c=(*name++);
02208               pixel.blue<<=4;
02209               if ((c >= '0') && (c <= '9'))
02210                 pixel.blue|=(int) (c-'0');
02211               else
02212                 if ((c >= 'A') && (c <= 'F'))
02213                   pixel.blue|=(int) c-((int) 'A'-10);
02214                 else
02215                   if ((c >= 'a') && (c <= 'f'))
02216                     pixel.blue|=(int) c-((int) 'a'-10);
02217                   else
02218                     return(MagickFalse);
02219             }
02220           } while (isxdigit((int) ((unsigned char) *name)) != MagickFalse);
02221           depth=4*(n/3);
02222         }
02223       else
02224         {
02225           if ((n % 4) != 0)
02226             {
02227               (void) ThrowMagickException(exception,GetMagickModule(),
02228                 OptionWarning,"UnrecognizedColor","`%s'",name);
02229               return(MagickFalse);
02230             }
02231           do
02232           {
02233             pixel.red=pixel.green;
02234             pixel.green=pixel.blue;
02235             pixel.blue=pixel.alpha;
02236             pixel.alpha=0;
02237             for (i=(ssize_t) (n/4-1); i >= 0; i--)
02238             {
02239               c=(*name++);
02240               pixel.alpha<<=4;
02241               if ((c >= '0') && (c <= '9'))
02242                 pixel.alpha|=(int) (c-'0');
02243               else
02244                 if ((c >= 'A') && (c <= 'F'))
02245                   pixel.alpha|=(int) c-((int) 'A'-10);
02246                 else
02247                   if ((c >= 'a') && (c <= 'f'))
02248                     pixel.alpha|=(int) c-((int) 'a'-10);
02249                   else
02250                     return(MagickFalse);
02251             }
02252           } while (isxdigit((int) ((unsigned char) *name)) != MagickFalse);
02253           depth=4*(n/4);
02254         }
02255       color->colorspace=RGBColorspace;
02256       color->matte=MagickFalse;
02257       range=GetQuantumRange(depth);
02258       color->red=(MagickRealType) ScaleAnyToQuantum(pixel.red,range);
02259       color->green=(MagickRealType) ScaleAnyToQuantum(pixel.green,range);
02260       color->blue=(MagickRealType) ScaleAnyToQuantum(pixel.blue,range);
02261       color->alpha=(MagickRealType) OpaqueAlpha;
02262       if ((n % 3) != 0)
02263         {
02264           color->matte=MagickTrue;
02265           color->alpha=(MagickRealType) ScaleAnyToQuantum(pixel.alpha,range);
02266         }
02267       color->black=0.0;
02268       return(MagickTrue);
02269     }
02270   if (strchr(name,'(') != (char *) NULL)
02271     {
02272       char
02273         colorspace[MaxTextExtent];
02274 
02275       /*
02276         Parse color of the form rgb(100,255,0).
02277       */
02278       (void) CopyMagickString(colorspace,name,MaxTextExtent);
02279       for (i=0; colorspace[i] != '\0'; i++)
02280         if (colorspace[i] == '(')
02281           break;
02282       colorspace[i--]='\0';
02283       LocaleLower(colorspace);
02284       color->matte=MagickFalse;
02285       if ((i > 0) && (colorspace[i] == 'a'))
02286         {
02287           colorspace[i]='\0';
02288           color->matte=MagickTrue;
02289         }
02290       type=ParseCommandOption(MagickColorspaceOptions,MagickFalse,colorspace);
02291       if (type < 0)
02292         {
02293           (void) ThrowMagickException(exception,GetMagickModule(),
02294             OptionWarning,"UnrecognizedColor","`%s'",name);
02295           return(MagickFalse);
02296         }
02297       color->colorspace=(ColorspaceType) type;
02298       SetGeometryInfo(&geometry_info);
02299       flags=ParseGeometry(name+i+1,&geometry_info);
02300       scale=(MagickRealType) ScaleCharToQuantum(1);
02301       if ((flags & PercentValue) != 0)
02302         scale=(MagickRealType) (QuantumRange/100.0);
02303       if ((flags & RhoValue) != 0)
02304         color->red=(MagickRealType) ClampToQuantum(scale*geometry_info.rho);
02305       if ((flags & SigmaValue) != 0)
02306         color->green=(MagickRealType) ClampToQuantum(scale*geometry_info.sigma);
02307       if ((flags & XiValue) != 0)
02308         color->blue=(MagickRealType) ClampToQuantum(scale*geometry_info.xi);
02309       color->alpha=(MagickRealType) OpaqueAlpha;
02310       if ((flags & PsiValue) != 0)
02311         {
02312           if (color->colorspace == CMYKColorspace)
02313             color->black=(MagickRealType) ClampToQuantum(scale*
02314               geometry_info.psi);
02315           else
02316             if (color->matte != MagickFalse)
02317               color->alpha=(MagickRealType) ClampToQuantum((MagickRealType)
02318                 QuantumRange*geometry_info.psi);
02319         }
02320       if (((flags & ChiValue) != 0) && (color->matte != MagickFalse))
02321         color->alpha=(MagickRealType) ClampToQuantum((MagickRealType)
02322           QuantumRange*geometry_info.chi);
02323       if (LocaleCompare(colorspace,"gray") == 0)
02324         {
02325           color->green=color->red;
02326           color->blue=color->red;
02327           if (((flags & SigmaValue) != 0) && (color->matte != MagickFalse))
02328             color->alpha=(MagickRealType) ClampToQuantum((MagickRealType)
02329               QuantumRange*geometry_info.sigma);
02330         }
02331       if ((LocaleCompare(colorspace,"HSB") == 0) ||
02332           (LocaleCompare(colorspace,"HSL") == 0) ||
02333           (LocaleCompare(colorspace,"HWB") == 0))
02334         {
02335           PixelInfo
02336             pixel;
02337 
02338           scale=1.0/360.0;
02339           if ((flags & PercentValue) != 0)
02340             scale=1.0/100.0;
02341           geometry_info.rho*=360.0*scale;
02342           scale=1.0/255.0;
02343           if ((flags & PercentValue) != 0)
02344             scale=1.0/100.0;
02345           geometry_info.sigma*=scale;
02346           geometry_info.xi*=scale;
02347           if (LocaleCompare(colorspace,"HSB") == 0)
02348             ConvertHSBToRGB(fmod(fmod(geometry_info.rho,360.0)+360.0,360.0)/
02349               360.0,geometry_info.sigma,geometry_info.xi,&pixel.red,
02350               &pixel.green,&pixel.blue);
02351           else
02352             if (LocaleCompare(colorspace,"HSL") == 0)
02353               ConvertHSLToRGB(fmod(fmod(geometry_info.rho,360.0)+360.0,360.0)/
02354                 360.0,geometry_info.sigma,geometry_info.xi,&pixel.red,
02355                 &pixel.green,&pixel.blue);
02356             else
02357               ConvertHWBToRGB(fmod(fmod(geometry_info.rho,360.0)+360.0,360.0)/
02358                 360.0,geometry_info.sigma,geometry_info.xi,&pixel.red,
02359                 &pixel.green,&pixel.blue);
02360           color->colorspace=RGBColorspace;
02361           color->red=(MagickRealType) pixel.red;
02362           color->green=(MagickRealType) pixel.green;
02363           color->blue=(MagickRealType) pixel.blue;
02364         }
02365       return(MagickTrue);
02366     }
02367   /*
02368     Parse named color.
02369   */
02370   p=GetColorCompliance(name,compliance,exception);
02371   if (p == (const ColorInfo *) NULL)
02372     return(MagickFalse);
02373   color->colorspace=RGBColorspace;
02374   color->matte=p->color.alpha != OpaqueAlpha ? MagickTrue : MagickFalse;
02375   color->red=(MagickRealType) p->color.red;
02376   color->green=(MagickRealType) p->color.green;
02377   color->blue=(MagickRealType) p->color.blue;
02378   color->alpha=(MagickRealType) p->color.alpha;
02379   color->black=0.0;
02380   return(MagickTrue);
02381 }
02382 
02383 /*
02384 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
02385 %                                                                             %
02386 %                                                                             %
02387 %                                                                             %
02388 %  Q u e r y C o l o r n a m e                                                %
02389 %                                                                             %
02390 %                                                                             %
02391 %                                                                             %
02392 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
02393 %
02394 %  QueryColorname() returns a named color for the given color intensity.
02395 %  If an exact match is not found, a hex value is returned instead.  For
02396 %  example an intensity of rgb:(0,0,0) returns black whereas rgb:(223,223,223)
02397 %  returns #dfdfdf.
02398 %
02399 %  The format of the QueryColorname method is:
02400 %
02401 %      MagickBooleanType QueryColorname(const Image *image,
02402 %        const PixelInfo *color,const ComplianceType compliance,char *name,
02403 %        ExceptionInfo *exception)
02404 %
02405 %  A description of each parameter follows.
02406 %
02407 %    o image: the image.
02408 %
02409 %    o color: the color intensities.
02410 %
02411 %    o Compliance: Adhere to this color standard: SVG, X11, or XPM.
02412 %
02413 %    o name: Return the color name or hex value.
02414 %
02415 %    o exception: return any errors or warnings in this structure.
02416 %
02417 */
02418 
02419 static inline double MagickMin(const double x,const double y)
02420 {
02421   if (x < y)
02422     return(x);
02423   return(y);
02424 }
02425 
02426 MagickExport MagickBooleanType QueryColorname(const Image *image,
02427   const PixelInfo *color,const ComplianceType compliance,char *name,
02428   ExceptionInfo *exception)
02429 {
02430   PixelInfo
02431     pixel;
02432 
02433   MagickRealType
02434     opacity;
02435 
02436   register const ColorInfo
02437     *p;
02438 
02439   *name='\0';
02440   pixel=(*color);
02441   if (compliance == XPMCompliance)
02442     {
02443       pixel.matte=MagickFalse;
02444       pixel.depth=(size_t) MagickMin(1.0*image->depth,16.0);
02445     }
02446   GetColorTuple(&pixel,compliance != SVGCompliance ? MagickTrue : MagickFalse,
02447     name);
02448   if (IsRGBColorspace(pixel.colorspace) == MagickFalse)
02449     return(MagickFalse);
02450   (void) GetColorInfo("*",exception);
02451   ResetLinkedListIterator(color_list);
02452   opacity=image->matte != MagickFalse ? color->alpha : OpaqueAlpha;
02453   p=(const ColorInfo *) GetNextValueInLinkedList(color_list);
02454   while (p != (const ColorInfo *) NULL)
02455   {
02456     if (((p->compliance & compliance) != 0) &&
02457         ((fabs(p->color.red-color->red) < MagickEpsilon)) &&
02458          (fabs(p->color.green-color->green) < MagickEpsilon) &&
02459          (fabs(p->color.blue-color->blue) < MagickEpsilon) &&
02460          (fabs(p->color.alpha-opacity) < MagickEpsilon))
02461       {
02462         (void) CopyMagickString(name,p->name,MaxTextExtent);
02463         break;
02464       }
02465     p=(const ColorInfo *) GetNextValueInLinkedList(color_list);
02466   }
02467   return(MagickTrue);
02468 }