xwindow.c revision f05d4947caf1bc27fbec041eb37c474a80c83c0b
13ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
23ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
33ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
43ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
53ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
63ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%              X   X  W   W  IIIII  N   N  DDDD    OOO   W   W                %
73ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%               X X   W   W    I    NN  N  D   D  O   O  W   W                %
83ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                X    W   W    I    N N N  D   D  O   O  W   W                %
93ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%               X X   W W W    I    N  NN  D   D  O   O  W W W                %
103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%              X   X   W W   IIIII  N   N  DDDD    OOO    W W                 %
113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                       MagickCore X11 Utility Methods                        %
143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                               Software Design                               %
163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                 John Cristy                                 %
173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                  July 1992                                  %
183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
201454be7db7a897f42cd40e4165f945d77196a6f8cristy%  Copyright 1999-2012 ImageMagick Studio LLC, a non-profit organization      %
213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  dedicated to making software imaging solutions freely available.           %
223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  You may not use this file except in compliance with the License.  You may  %
243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  obtain a copy of the License at                                            %
253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    http://www.imagemagick.org/script/license.php                            %
273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  Unless required by applicable law or agreed to in writing, software        %
293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  distributed under the License is distributed on an "AS IS" BASIS,          %
303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  See the License for the specific language governing permissions and        %
323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  limitations under the License.                                             %
333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Include declarations.
413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
424c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/studio.h"
434c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/animate.h"
444c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/artifact.h"
454c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/blob.h"
464c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/cache.h"
474c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/client.h"
484c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/color.h"
494c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/color-private.h"
504c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/colormap.h"
514c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/composite.h"
52030436f8fc9854b6bb39f4d7593d9e70ff83a8cacristy#include "MagickCore/constitute.h"
534c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/display.h"
54c53413df5789700e14e1a67e6cc2716d1716a387cristy#include "MagickCore/distort.h"
554c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception.h"
564c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception-private.h"
574c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/geometry.h"
584c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/identify.h"
594c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/image.h"
604c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/image-private.h"
614c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/list.h"
624c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/locale_.h"
634c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/log.h"
644c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/magick.h"
654c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/memory_.h"
664c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/monitor.h"
672c5fc27ae5b613b7fb9fd69c12a47b99c7d4d471cristy#include "MagickCore/nt-base-private.h"
684c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/option.h"
694c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/pixel-accessor.h"
704c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/PreRvIcccm.h"
714c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/quantize.h"
724c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/quantum.h"
734c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/quantum-private.h"
744c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/resource_.h"
754c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/resize.h"
764c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/statistic.h"
774c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/string_.h"
784c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/string-private.h"
794c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/transform.h"
804c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/utility.h"
81d1dd6e4fefa0810b9893e6ac9418f79c97c1b39acristy#include "MagickCore/utility-private.h"
824c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/widget.h"
83bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristy#include "MagickCore/widget-private.h"
844c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/xwindow.h"
854c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/xwindow-private.h"
864c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/version.h"
873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__BEOS__)
883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include <OS.h>
893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_X11_DELEGATE)
913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include <X11/Xproto.h>
923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include <X11/Xlocale.h>
933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICK_HAVE_POLL)
943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy# include <sys/poll.h>
953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HAVE_MACHINE_PARAM_H)
983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy# include <machine/param.h>
993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
1003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include <sys/ipc.h>
1013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include <sys/shm.h>
1023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include <X11/extensions/XShm.h>
1033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
1043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HAVE_SHAPE)
1053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include <X11/extensions/shape.h>
1063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
1073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
1093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  X defines.
1103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
111ce70c17bb6433add2eb069515a4f3105989e0662cristy#define XBlueGamma(color) ClampToQuantum(blue_gamma == 1.0 ? (double) \
1123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (color) : ((pow(((double) QuantumScale*(color)),1.0/(double) blue_gamma)* \
1133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  QuantumRange)))
1144c08aed51c5899665ade97263692328eea4af106cristy#define XGammaPacket(map,color)  (size_t) (map->base_pixel+ \
1157e9f233e6549b1e1856c1aa85b3f4dee8e9493facristy  ((ScaleQuantumToShort(XRedGamma((color)->red))*map->red_max/65535L)* \
1167e9f233e6549b1e1856c1aa85b3f4dee8e9493facristy    map->red_mult)+ \
1177e9f233e6549b1e1856c1aa85b3f4dee8e9493facristy  ((ScaleQuantumToShort(XGreenGamma((color)->green))*map->green_max/65535L)* \
1187e9f233e6549b1e1856c1aa85b3f4dee8e9493facristy    map->green_mult)+ \
1197e9f233e6549b1e1856c1aa85b3f4dee8e9493facristy  ((ScaleQuantumToShort(XBlueGamma((color)->blue))*map->blue_max/65535L)* \
1207e9f233e6549b1e1856c1aa85b3f4dee8e9493facristy    map->blue_mult))
1214c08aed51c5899665ade97263692328eea4af106cristy#define XGammaPixel(image,map,color)  (size_t) (map->base_pixel+ \
1224c08aed51c5899665ade97263692328eea4af106cristy  ((ScaleQuantumToShort(XRedGamma(GetPixelRed(image,color)))*map->red_max/65535L)* \
1234c08aed51c5899665ade97263692328eea4af106cristy    map->red_mult)+ \
1244c08aed51c5899665ade97263692328eea4af106cristy  ((ScaleQuantumToShort(XGreenGamma(GetPixelGreen(image,color)))*map->green_max/65535L)* \
1254c08aed51c5899665ade97263692328eea4af106cristy    map->green_mult)+ \
1264c08aed51c5899665ade97263692328eea4af106cristy  ((ScaleQuantumToShort(XBlueGamma(GetPixelBlue(image,color)))*map->blue_max/65535L)* \
1274c08aed51c5899665ade97263692328eea4af106cristy    map->blue_mult))
128ce70c17bb6433add2eb069515a4f3105989e0662cristy#define XGreenGamma(color) ClampToQuantum(green_gamma == 1.0 ? (double) \
1293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (color) : ((pow(((double) QuantumScale*(color)),1.0/(double) green_gamma)* \
1303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  QuantumRange)))
131ce70c17bb6433add2eb069515a4f3105989e0662cristy#define XRedGamma(color) ClampToQuantum(red_gamma == 1.0 ? (double) \
1323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (color) : ((pow(((double) QuantumScale*(color)),1.0/(double) red_gamma)* \
1333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  QuantumRange)))
134bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy#define XStandardPixel(map,color)  (size_t) (map->base_pixel+ \
1357e9f233e6549b1e1856c1aa85b3f4dee8e9493facristy  (((color)->red*map->red_max/65535L)*map->red_mult)+ \
1367e9f233e6549b1e1856c1aa85b3f4dee8e9493facristy  (((color)->green*map->green_max/65535L)*map->green_mult)+ \
1377e9f233e6549b1e1856c1aa85b3f4dee8e9493facristy  (((color)->blue*map->blue_max/65535L)*map->blue_mult))
1383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define AccentuateModulate  ScaleCharToQuantum(80)
1403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define HighlightModulate  ScaleCharToQuantum(125)
1413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define ShadowModulate  ScaleCharToQuantum(135)
1423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define DepthModulate  ScaleCharToQuantum(185)
1433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define TroughModulate  ScaleCharToQuantum(110)
1443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define XLIB_ILLEGAL_ACCESS  1
1463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#undef ForgetGravity
1473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#undef NorthWestGravity
1483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#undef NorthGravity
1493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#undef NorthEastGravity
1503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#undef WestGravity
1513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#undef CenterGravity
1523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#undef EastGravity
1533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#undef SouthWestGravity
1543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#undef SouthGravity
1553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#undef SouthEastGravity
1563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#undef StaticGravity
1573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#undef index
1593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(hpux9)
1603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define XFD_SET  int
1613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else
1623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define XFD_SET  fd_set
1633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
1643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
1663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Enumeration declarations.
1673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1683ed852eea50f9d4cd633efb8c2b054b8e33c253cristytypedef enum
1693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#undef DoRed
1713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  DoRed = 0x0001,
1723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#undef DoGreen
1733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  DoGreen = 0x0002,
1743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#undef DoBlue
1753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  DoBlue = 0x0004,
1763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  DoMatte = 0x0008
1773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} XColorFlags;
1783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
1803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Typedef declarations.
1813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1823ed852eea50f9d4cd633efb8c2b054b8e33c253cristytypedef struct _DiversityPacket
1833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Quantum
1853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    red,
1863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    green,
1873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    blue;
1883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned short
1903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    index;
1913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
192bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
1933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    count;
1943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} DiversityPacket;
1953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
1973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Constant declaractions.
1983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1993ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType
2003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  xerror_alert = MagickFalse;
2013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
2033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Method prototypes.
2043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
2053ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic const char
2063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *XVisualClassName(const int);
2073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2083ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickRealType
2093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  blue_gamma = 1.0,
2103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  green_gamma = 1.0,
2113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  red_gamma = 1.0;
2123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2133ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType
2143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XMakePixmap(Display *,const XResourceInfo *,XWindowInfo *);
2153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2163ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void
2173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XMakeImageLSBFirst(const XResourceInfo *,const XWindowInfo *,Image *,
218e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy    XImage *,XImage *,ExceptionInfo *),
2193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XMakeImageMSBFirst(const XResourceInfo *,const XWindowInfo *,Image *,
220e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy    XImage *,XImage *,ExceptionInfo *);
2213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2223ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Window
2233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSelectWindow(Display *,RectangleInfo *);
2243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
2263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   D e s t r o y X R e s o u r c e s                                         %
2313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  DestroyXResources() destroys any X resources.
2373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the DestroyXResources method is:
2393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void DestroyXResources()
2413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
2433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
2453ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport void DestroyXResources(void)
2463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
2473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register int
2483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
2493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
2513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_windows;
2523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWindowInfo
2543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *magick_windows[MaxXWindows];
2553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWindows
2573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *windows;
2583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  DestroyXWidget();
2603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows=XSetWindows((XWindows *) ~0);
2613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((windows == (XWindows *) NULL) || (windows->display == (Display *) NULL))
2623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return;
2633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  number_windows=0;
2643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magick_windows[number_windows++]=(&windows->context);
2653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magick_windows[number_windows++]=(&windows->group_leader);
2663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magick_windows[number_windows++]=(&windows->backdrop);
2673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magick_windows[number_windows++]=(&windows->icon);
2683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magick_windows[number_windows++]=(&windows->image);
2693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magick_windows[number_windows++]=(&windows->info);
2703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magick_windows[number_windows++]=(&windows->magnify);
2713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magick_windows[number_windows++]=(&windows->pan);
2723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magick_windows[number_windows++]=(&windows->command);
2733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magick_windows[number_windows++]=(&windows->widget);
2743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magick_windows[number_windows++]=(&windows->popup);
2753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magick_windows[number_windows++]=(&windows->context);
2763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; i < (int) number_windows; i++)
2773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
2783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (magick_windows[i]->mapped != MagickFalse)
2793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
2803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XWithdrawWindow(windows->display,magick_windows[i]->id,
2813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          magick_windows[i]->screen);
2823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        magick_windows[i]->mapped=MagickFalse;
2833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
2843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (magick_windows[i]->name != (char *) NULL)
2853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      magick_windows[i]->name=(char *)
2863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        RelinquishMagickMemory(magick_windows[i]->name);
2873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (magick_windows[i]->icon_name != (char *) NULL)
2883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      magick_windows[i]->icon_name=(char *)
2893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        RelinquishMagickMemory(magick_windows[i]->icon_name);
2903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (magick_windows[i]->cursor != (Cursor) NULL)
2913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
2923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XFreeCursor(windows->display,magick_windows[i]->cursor);
2933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        magick_windows[i]->cursor=(Cursor) NULL;
2943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
2953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (magick_windows[i]->busy_cursor != (Cursor) NULL)
2963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
2973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XFreeCursor(windows->display,magick_windows[i]->busy_cursor);
2983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        magick_windows[i]->busy_cursor=(Cursor) NULL;
2993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (magick_windows[i]->highlight_stipple != (Pixmap) NULL)
3013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XFreePixmap(windows->display,
3033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          magick_windows[i]->highlight_stipple);
3043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        magick_windows[i]->highlight_stipple=(Pixmap) NULL;
3053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (magick_windows[i]->shadow_stipple != (Pixmap) NULL)
3073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XFreePixmap(windows->display,magick_windows[i]->shadow_stipple);
3093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        magick_windows[i]->shadow_stipple=(Pixmap) NULL;
3103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (magick_windows[i]->ximage != (XImage *) NULL)
3123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDestroyImage(magick_windows[i]->ximage);
3143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        magick_windows[i]->ximage=(XImage *) NULL;
3153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (magick_windows[i]->pixmap != (Pixmap) NULL)
3173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XFreePixmap(windows->display,magick_windows[i]->pixmap);
3193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        magick_windows[i]->pixmap=(Pixmap) NULL;
3203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (magick_windows[i]->id != (Window) NULL)
3223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XDestroyWindow(windows->display,magick_windows[i]->id);
3243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        magick_windows[i]->id=(Window) NULL;
3253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (magick_windows[i]->destroy != MagickFalse)
3273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (magick_windows[i]->image != (Image *) NULL)
3293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            magick_windows[i]->image=DestroyImage(magick_windows[i]->image);
3313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            magick_windows[i]->image=NewImageList();
3323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (magick_windows[i]->matte_pixmap != (Pixmap) NULL)
3343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XFreePixmap(windows->display,
3363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              magick_windows[i]->matte_pixmap);
3373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            magick_windows[i]->matte_pixmap=(Pixmap) NULL;
3383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (magick_windows[i]->segment_info != (void *) NULL)
3413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
3433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XShmSegmentInfo
3443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *segment_info;
3453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        segment_info=(XShmSegmentInfo *) magick_windows[i]->segment_info;
3473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (segment_info != (XShmSegmentInfo *) NULL)
3483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (segment_info[0].shmid >= 0)
3493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
3503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (segment_info[0].shmaddr != NULL)
3513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (void) shmdt(segment_info[0].shmaddr);
3523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (void) shmctl(segment_info[0].shmid,IPC_RMID,0);
3533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              segment_info[0].shmaddr=NULL;
3543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              segment_info[0].shmid=(-1);
3553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
3563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
3573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        magick_windows[i]->segment_info=(void *)
3583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          RelinquishMagickMemory(magick_windows[i]->segment_info);
3593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
3613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->icon_resources=(XResourceInfo *)
3623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    RelinquishMagickMemory(windows->icon_resources);
3633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->icon_pixel != (XPixelInfo *) NULL)
3643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
365f2faecf9facdbbb14fcba373365f9f691a9658e0cristy      if (windows->icon_pixel->pixels != (unsigned long *) NULL)
366f2faecf9facdbbb14fcba373365f9f691a9658e0cristy        windows->icon_pixel->pixels=(unsigned long *)
3673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          RelinquishMagickMemory(windows->icon_pixel->pixels);
3683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (windows->icon_pixel->annotate_context != (GC) NULL)
3693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XFreeGC(windows->display,windows->icon_pixel->annotate_context);
3703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      windows->icon_pixel=(XPixelInfo *)
3713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        RelinquishMagickMemory(windows->icon_pixel);
3723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
3733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->pixel_info != (XPixelInfo *) NULL)
3743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
375f2faecf9facdbbb14fcba373365f9f691a9658e0cristy      if (windows->pixel_info->pixels != (unsigned long *) NULL)
376f2faecf9facdbbb14fcba373365f9f691a9658e0cristy        windows->pixel_info->pixels=(unsigned long *)
3773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          RelinquishMagickMemory(windows->pixel_info->pixels);
3783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (windows->pixel_info->annotate_context != (GC) NULL)
3793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XFreeGC(windows->display,windows->pixel_info->annotate_context);
3803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (windows->pixel_info->widget_context != (GC) NULL)
3813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XFreeGC(windows->display,windows->pixel_info->widget_context);
3823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (windows->pixel_info->highlight_context != (GC) NULL)
3833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XFreeGC(windows->display,windows->pixel_info->highlight_context);
3843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      windows->pixel_info=(XPixelInfo *)
3853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        RelinquishMagickMemory(windows->pixel_info);
3863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
3873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->font_info != (XFontStruct *) NULL)
3883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
3893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XFreeFont(windows->display,windows->font_info);
3903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      windows->font_info=(XFontStruct *) NULL;
3913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
3923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->class_hints != (XClassHint *) NULL)
3933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
394c9cc4a7b1dd605daff0dd2e0b0e1c42f178871ddcristy      if (windows->class_hints->res_name != (char *) NULL)
395c9cc4a7b1dd605daff0dd2e0b0e1c42f178871ddcristy        windows->class_hints->res_name=DestroyString(
396c9cc4a7b1dd605daff0dd2e0b0e1c42f178871ddcristy          windows->class_hints->res_name);
397c9cc4a7b1dd605daff0dd2e0b0e1c42f178871ddcristy      if (windows->class_hints->res_class != (char *) NULL)
398c9cc4a7b1dd605daff0dd2e0b0e1c42f178871ddcristy        windows->class_hints->res_class=DestroyString(
399c9cc4a7b1dd605daff0dd2e0b0e1c42f178871ddcristy          windows->class_hints->res_class);
4003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XFree(windows->class_hints);
4013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      windows->class_hints=(XClassHint *) NULL;
4023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
4033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->manager_hints != (XWMHints *) NULL)
4043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
4053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XFree(windows->manager_hints);
4063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      windows->manager_hints=(XWMHints *) NULL;
4073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
4083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->map_info != (XStandardColormap *) NULL)
4093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
4103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XFree(windows->map_info);
4113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      windows->map_info=(XStandardColormap *) NULL;
4123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
4133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->icon_map != (XStandardColormap *) NULL)
4143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
4153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XFree(windows->icon_map);
4163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      windows->icon_map=(XStandardColormap *) NULL;
4173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
4183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->visual_info != (XVisualInfo *) NULL)
4193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
4203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XFree(windows->visual_info);
4213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      windows->visual_info=(XVisualInfo *) NULL;
4223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
4233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->icon_visual != (XVisualInfo *) NULL)
4243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
4253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XFree(windows->icon_visual);
4263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      windows->icon_visual=(XVisualInfo *) NULL;
4273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
4283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XSetWindows((XWindows *) NULL);
4293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
4323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X A n n o t a t e I m a g e                                               %
4373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XAnnotateImage() annotates the image with text.
4433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XAnnotateImage method is:
4453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType XAnnotateImage(Display *display,
4477c3af951210f34d3f244b31f06ee291e5be8ecb7cristy%        const XPixelInfo *pixel,XAnnotateInfo *annotate_info,Image *image,
4487c3af951210f34d3f244b31f06ee291e5be8ecb7cristy%        ExceptionInfo *exception)
4493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
4513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
4533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
4543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o pixel: Specifies a pointer to a XPixelInfo structure.
4563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o annotate_info: Specifies a pointer to a XAnnotateInfo structure.
4583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image: the image.
4603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4617c3af951210f34d3f244b31f06ee291e5be8ecb7cristy%    o exception: return any errors or warnings in this structure.
4627c3af951210f34d3f244b31f06ee291e5be8ecb7cristy%
4633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
464bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate MagickBooleanType XAnnotateImage(Display *display,
4657c3af951210f34d3f244b31f06ee291e5be8ecb7cristy  const XPixelInfo *pixel,XAnnotateInfo *annotate_info,Image *image,
4667c3af951210f34d3f244b31f06ee291e5be8ecb7cristy  ExceptionInfo *exception)
4673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
468c57f694b2d04975a0e501613e34368c464708c19cristy  CacheView
469c57f694b2d04975a0e501613e34368c464708c19cristy    *annotate_view;
470c57f694b2d04975a0e501613e34368c464708c19cristy
4713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  GC
4723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    annotate_context;
4733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image
4753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *annotate_image;
4763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
4783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x,
4793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y;
4803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
4823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    matte;
4833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Pixmap
4853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    annotate_pixmap;
4863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
4883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    depth,
4893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    height,
4903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width;
4913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Window
4933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    root_window;
4943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XGCValues
4963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    context_values;
4973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XImage
4993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *annotate_ximage;
5003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
5023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize annotated image.
5033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
5043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
5053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
5063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(pixel != (XPixelInfo *) NULL);
5073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(annotate_info != (XAnnotateInfo *) NULL);
5083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image != (Image *) NULL);
5093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
5103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize annotated pixmap.
5113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
5123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  root_window=XRootWindow(display,XDefaultScreen(display));
5133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  depth=(unsigned int) XDefaultDepth(display,XDefaultScreen(display));
5143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  annotate_pixmap=XCreatePixmap(display,root_window,annotate_info->width,
5153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    annotate_info->height,depth);
5163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (annotate_pixmap == (Pixmap) NULL)
5173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
5183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
5193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize graphics info.
5203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
5213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  context_values.background=0;
522bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  context_values.foreground=(size_t) (~0);
5233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  context_values.font=annotate_info->font_info->fid;
524c57f694b2d04975a0e501613e34368c464708c19cristy  annotate_context=XCreateGC(display,root_window,(unsigned long)
525c57f694b2d04975a0e501613e34368c464708c19cristy    (GCBackground | GCFont | GCForeground),&context_values);
5263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (annotate_context == (GC) NULL)
5273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
5283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
5293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Draw text to pixmap.
5303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
5313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XDrawImageString(display,annotate_pixmap,annotate_context,0,
5323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (int) annotate_info->font_info->ascent,annotate_info->text,
5333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (int) strlen(annotate_info->text));
5343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFreeGC(display,annotate_context);
5353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
5363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize annotated X image.
5373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
5383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  annotate_ximage=XGetImage(display,annotate_pixmap,0,0,annotate_info->width,
5393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    annotate_info->height,AllPlanes,ZPixmap);
5403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (annotate_ximage == (XImage *) NULL)
5413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
5423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFreePixmap(display,annotate_pixmap);
5433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
5443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize annotated image.
5453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
5466710d8414f0ed06e4eaf9346366be72e2b4719efcristy  annotate_image=AcquireImage((ImageInfo *) NULL,exception);
5473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (annotate_image == (Image *) NULL)
5483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
5493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  annotate_image->columns=annotate_info->width;
5503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  annotate_image->rows=annotate_info->height;
5513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
5523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Transfer annotated X image to image.
5533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
5543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  width=(unsigned int) image->columns;
5553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  height=(unsigned int) image->rows;
5563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  x=0;
5573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  y=0;
5583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XParseGeometry(annotate_info->geometry,&x,&y,&width,&height);
559f05d4947caf1bc27fbec041eb37c474a80c83c0bcristy  (void) GetOneVirtualPixelInfo(image,UndefinedVirtualPixelMethod,(ssize_t) x,
560f05d4947caf1bc27fbec041eb37c474a80c83c0bcristy    (ssize_t) y,&annotate_image->background_color,exception);
5613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (annotate_info->stencil == ForegroundStencil)
5623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    annotate_image->matte=MagickTrue;
563c57f694b2d04975a0e501613e34368c464708c19cristy  annotate_view=AcquireCacheView(annotate_image);
5643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (y=0; y < (int) annotate_image->rows; y++)
5653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
566c57f694b2d04975a0e501613e34368c464708c19cristy    register int
5673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      x;
5683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5694c08aed51c5899665ade97263692328eea4af106cristy    register Quantum
570c47d1f8ecfe7d04f0f003cca0fe175658bbf0fb2cristy      *restrict q;
5713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
572c57f694b2d04975a0e501613e34368c464708c19cristy    q=GetCacheViewAuthenticPixels(annotate_view,0,(ssize_t) y,
573c57f694b2d04975a0e501613e34368c464708c19cristy      annotate_image->columns,1,exception);
574acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy    if (q == (Quantum *) NULL)
5753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
576c57f694b2d04975a0e501613e34368c464708c19cristy    for (x=0; x < (int) annotate_image->columns; x++)
5773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
5784c08aed51c5899665ade97263692328eea4af106cristy      SetPixelAlpha(annotate_image,OpaqueAlpha,q);
5793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (XGetPixel(annotate_ximage,x,y) == 0)
5803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
5813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
5823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Set this pixel to the background color.
5833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
5844c08aed51c5899665ade97263692328eea4af106cristy          SetPixelRed(annotate_image,ScaleShortToQuantum(
5854c08aed51c5899665ade97263692328eea4af106cristy            pixel->box_color.red),q);
5864c08aed51c5899665ade97263692328eea4af106cristy          SetPixelGreen(annotate_image,ScaleShortToQuantum(
5874c08aed51c5899665ade97263692328eea4af106cristy            pixel->box_color.green),q);
5884c08aed51c5899665ade97263692328eea4af106cristy          SetPixelBlue(annotate_image,ScaleShortToQuantum(
5894c08aed51c5899665ade97263692328eea4af106cristy            pixel->box_color.blue),q);
5903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((annotate_info->stencil == ForegroundStencil) ||
5913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (annotate_info->stencil == OpaqueStencil))
5924c08aed51c5899665ade97263692328eea4af106cristy            SetPixelAlpha(annotate_image,TransparentAlpha,q);
5933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
5943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
5953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
5963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
5973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Set this pixel to the pen color.
5983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
5994c08aed51c5899665ade97263692328eea4af106cristy          SetPixelRed(annotate_image,ScaleShortToQuantum(
6004c08aed51c5899665ade97263692328eea4af106cristy            pixel->pen_color.red),q);
6014c08aed51c5899665ade97263692328eea4af106cristy          SetPixelGreen(annotate_image,ScaleShortToQuantum(
6024c08aed51c5899665ade97263692328eea4af106cristy            pixel->pen_color.green),q);
6034c08aed51c5899665ade97263692328eea4af106cristy          SetPixelBlue(annotate_image,ScaleShortToQuantum(
6044c08aed51c5899665ade97263692328eea4af106cristy            pixel->pen_color.blue),q);
6053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (annotate_info->stencil == BackgroundStencil)
6064c08aed51c5899665ade97263692328eea4af106cristy            SetPixelAlpha(annotate_image,TransparentAlpha,q);
6073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
608ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy      q+=GetPixelChannels(annotate_image);
6093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
610c57f694b2d04975a0e501613e34368c464708c19cristy    if (SyncCacheViewAuthenticPixels(annotate_view,exception) == MagickFalse)
6113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
6123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
613c57f694b2d04975a0e501613e34368c464708c19cristy  annotate_view=DestroyCacheView(annotate_view);
6143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XDestroyImage(annotate_ximage);
6153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
6163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Determine annotate geometry.
6173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
6183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XParseGeometry(annotate_info->geometry,&x,&y,&width,&height);
6193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((width != (unsigned int) annotate_image->columns) ||
6203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (height != (unsigned int) annotate_image->rows))
6213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
6223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      char
6233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        image_geometry[MaxTextExtent];
6243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
6263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Scale image.
6273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
628b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy      (void) FormatLocaleString(image_geometry,MaxTextExtent,"%ux%u",
6293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        width,height);
630e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy      (void) TransformImage(&annotate_image,(char *) NULL,image_geometry,
631e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy        exception);
6323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
6333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (annotate_info->degrees != 0.0)
6343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
6353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Image
6363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *rotate_image;
6373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      int
6393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        rotations;
6403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      MagickRealType
6423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        normalized_degrees;
6433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
6453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Rotate image.
6463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
6476710d8414f0ed06e4eaf9346366be72e2b4719efcristy      rotate_image=RotateImage(annotate_image,annotate_info->degrees,exception);
6483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (rotate_image == (Image *) NULL)
6493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        return(MagickFalse);
6503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      annotate_image=DestroyImage(annotate_image);
6513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      annotate_image=rotate_image;
6523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
6533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Annotation is relative to the degree of rotation.
6543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
6553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      normalized_degrees=annotate_info->degrees;
6563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      while (normalized_degrees < -45.0)
6573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        normalized_degrees+=360.0;
6583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (rotations=0; normalized_degrees > 45.0; rotations++)
6593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        normalized_degrees-=90.0;
6603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      switch (rotations % 4)
6613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
6623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        default:
6633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 0:
6643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
6653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 1:
6663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
6673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
6683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Rotate 90 degrees.
6693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
6703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          x-=(int) annotate_image->columns/2;
6713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          y+=(int) annotate_image->columns/2;
6723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
6733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
6743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 2:
6753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
6763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
6773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Rotate 180 degrees.
6783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
6793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          x=x-(int) annotate_image->columns;
6803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
6813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
6823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 3:
6833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
6843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
6853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Rotate 270 degrees.
6863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
6873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          x=x-(int) annotate_image->columns/2;
6883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          y=y-(int) (annotate_image->rows-(annotate_image->columns/2));
6893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
6903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
6913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
6923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
6933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
6943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Composite text onto the image.
6953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
6963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XParseGeometry(annotate_info->geometry,&x,&y,&width,&height);
6973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  matte=image->matte;
6983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) CompositeImage(image,annotate_image->matte != MagickFalse ?
699e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy    OverCompositeOp : CopyCompositeOp,annotate_image,(ssize_t) x,(ssize_t) y,
700e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy    exception);
7013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  image->matte=matte;
7023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  annotate_image=DestroyImage(annotate_image);
7033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickTrue);
7043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
7053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
7073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X B e s t F o n t                                                         %
7123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XBestFont() returns the "best" font.  "Best" is defined as a font specified
7183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  in the X resource database or a font such that the text width displayed
7193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  with the font does not exceed the specified maximum width.
7203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XBestFont method is:
7223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XFontStruct *XBestFont(Display *display,
7243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const XResourceInfo *resource_info,const MagickBooleanType text_font)
7253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
7273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o font: XBestFont returns a pointer to a XFontStruct structure.
7293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
7313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
7323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
7343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o text_font:  True is font should be mono-spaced (typewriter style).
7363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
7383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7393ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic char **FontToList(char *font)
7403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
7413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
7423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **fontlist;
7433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register char
7453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p,
7463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
7473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register int
7493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
7503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
7523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    fonts;
7533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (font == (char *) NULL)
7553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((char **) NULL);
7563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
7573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Convert string to an ASCII list.
7583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
7593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  fonts=1U;
7603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (p=font; *p != '\0'; p++)
7613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((*p == ':') || (*p == ';') || (*p == ','))
7623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      fonts++;
7633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  fontlist=(char **) AcquireQuantumMemory((size_t) fonts+1UL,sizeof(*fontlist));
7643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (fontlist == (char **) NULL)
7653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
7663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowXWindowFatalException(ResourceLimitError,"MemoryAllocationFailed",
7673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        font);
7683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return((char **) NULL);
7693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
7703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=font;
7713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; i < (int) fonts; i++)
7723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
7733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    for (q=p; *q != '\0'; q++)
7743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((*q == ':') || (*q == ';') || (*q == ','))
7753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
7763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    fontlist[i]=(char *) AcquireQuantumMemory((size_t) (q-p)+1UL,
7773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      sizeof(*fontlist[i]));
7783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (fontlist[i] == (char *) NULL)
7793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
7803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowXWindowFatalException(ResourceLimitError,"MemoryAllocationFailed",
7813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          font);
7823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        return((char **) NULL);
7833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
7843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) CopyMagickString(fontlist[i],p,(size_t) (q-p+1));
7853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    p=q+1;
7863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
7873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  fontlist[i]=(char *) NULL;
7883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(fontlist);
7893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
7903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
791bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate XFontStruct *XBestFont(Display *display,
7923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const XResourceInfo *resource_info,const MagickBooleanType text_font)
7933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
7943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static const char
7953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *Fonts[]=
7963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
7973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "-*-helvetica-medium-r-normal--12-*-*-*-*-*-iso8859-1",
7983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "-*-arial-medium-r-normal--12-*-*-*-*-*-iso8859-1",
7993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "-*-helvetica-medium-r-normal--12-*-*-*-*-*-iso8859-15",
8003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "-*-arial-medium-r-normal--12-*-*-*-*-*-iso8859-15",
8013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "-*-helvetica-medium-r-normal--12-*-*-*-*-*-*-*",
8023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "-*-arial-medium-r-normal--12-*-*-*-*-*-*-*",
8033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "variable",
8043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "fixed",
8053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (char *) NULL
8063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    },
8073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *TextFonts[]=
8083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
8093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "-*-courier-medium-r-normal-*-12-*-*-*-*-*-iso8859-1",
8103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "-*-courier-medium-r-normal-*-12-*-*-*-*-*-iso8859-15",
8113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "-*-fixed-medium-r-normal-*-12-*-*-*-*-*-*-*",
8123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "fixed",
8133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (char *) NULL
8143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    };
8153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
8173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *font_name;
8183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const char
8203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **p;
8213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XFontStruct
8233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *font_info;
8243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  font_info=(XFontStruct *) NULL;
8263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  font_name=resource_info->font;
8273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (text_font != MagickFalse)
8283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    font_name=resource_info->text_font;
8293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((font_name != (char *) NULL) && (*font_name != '\0'))
8303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
8313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      char
8323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        **fontlist;
8333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      register int
8353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        i;
8363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
8383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Load preferred font specified in the X resource database.
8393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
8403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      fontlist=FontToList(font_name);
8413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (fontlist != (char **) NULL)
8423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
8433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (i=0; fontlist[i] != (char *) NULL; i++)
8443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
8453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (font_info == (XFontStruct *) NULL)
8463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              font_info=XLoadQueryFont(display,fontlist[i]);
8473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            fontlist[i]=DestroyString(fontlist[i]);
8483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
8493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          fontlist=(char **) RelinquishMagickMemory(fontlist);
8503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
8513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (font_info == (XFontStruct *) NULL)
8523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowXWindowFatalException(XServerError,"UnableToLoadFont",font_name);
8533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
8543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
8553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Load fonts from list of fonts until one is found.
8563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
8573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=Fonts;
8583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (text_font != MagickFalse)
8593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    p=TextFonts;
8603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (XDisplayHeight(display,XDefaultScreen(display)) >= 748)
8613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    p++;
8623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while (*p != (char *) NULL)
8633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
8643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (font_info != (XFontStruct *) NULL)
8653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
8663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    font_info=XLoadQueryFont(display,(char *) *p);
8673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    p++;
8683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
8693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(font_info);
8703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
8713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
8733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X B e s t I c o n S i z e                                                 %
8783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XBestIconSize() returns the "best" icon size.  "Best" is defined as an icon
8843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  size that maintains the aspect ratio of the image.  If the window manager
8853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  has preferred icon sizes, one of the preferred sizes is used.
8863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XBestIconSize method is:
8883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XBestIconSize(Display *display,XWindowInfo *window,Image *image)
8903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
8923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
8943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
8953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image: the image.
8973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
899bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XBestIconSize(Display *display,XWindowInfo *window,
9003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image *image)
9013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
9023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
9033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
9043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_sizes;
9053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickRealType
9073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    scale_factor;
9083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
9103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    height,
9113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    icon_height,
9123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    icon_width,
9133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width;
9143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Window
9163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    root_window;
9173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XIconSize
9193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *icon_size,
9203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *size_list;
9213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
9233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Determine if the window manager has specified preferred icon sizes.
9243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
9253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
9263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
9273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(window != (XWindowInfo *) NULL);
9283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image != (Image *) NULL);
9293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->width=MaxIconSize;
9303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->height=MaxIconSize;
9313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  icon_size=(XIconSize *) NULL;
9323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  number_sizes=0;
9333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  root_window=XRootWindow(display,window->screen);
9343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (XGetIconSizes(display,root_window,&size_list,&number_sizes) != 0)
9353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((number_sizes > 0) && (size_list != (XIconSize *) NULL))
9363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      icon_size=size_list;
9373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (icon_size == (XIconSize *) NULL)
9383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
9393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
9403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Window manager does not restrict icon size.
9413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
9423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      icon_size=XAllocIconSize();
9433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (icon_size == (XIconSize *) NULL)
9443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
9453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ThrowXWindowFatalException(ResourceLimitError,
9463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            "MemoryAllocationFailed",image->filename);
9473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          return;
9483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
9493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      icon_size->min_width=1;
9503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      icon_size->max_width=MaxIconSize;
9513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      icon_size->min_height=1;
9523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      icon_size->max_height=MaxIconSize;
9533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      icon_size->width_inc=1;
9543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      icon_size->height_inc=1;
9553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
9563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
9573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Determine aspect ratio of image.
9583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
9593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  width=(unsigned int) image->columns;
9603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  height=(unsigned int) image->rows;
9613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  i=0;
9623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->crop_geometry)
9633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XParseGeometry(window->crop_geometry,&i,&i,&width,&height);
9643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
9653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Look for an icon size that maintains the aspect ratio of image.
9663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
9673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  scale_factor=(MagickRealType) icon_size->max_width/width;
9683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (scale_factor > ((MagickRealType) icon_size->max_height/height))
9693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    scale_factor=(MagickRealType) icon_size->max_height/height;
9703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  icon_width=(unsigned int) icon_size->min_width;
9713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while ((int) icon_width < icon_size->max_width)
9723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
9733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (icon_width >= (unsigned int) (scale_factor*width+0.5))
9743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
9753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    icon_width+=icon_size->width_inc;
9763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
9773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  icon_height=(unsigned int) icon_size->min_height;
9783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while ((int) icon_height < icon_size->max_height)
9793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
9803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (icon_height >= (unsigned int) (scale_factor*height+0.5))
9813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
9823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    icon_height+=icon_size->height_inc;
9833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
9843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFree((void *) icon_size);
9853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->width=icon_width;
9863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->height=icon_height;
9873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
9883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
9903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X B e s t P i x e l                                                       %
9953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XBestPixel() returns a pixel from an array of pixels that is closest to the
10013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  requested color.  If the color array is NULL, the colors are obtained from
10023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  the X server.
10033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XBestPixel method is:
10053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XBestPixel(Display *display,const Colormap colormap,XColor *colors,
10073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        unsigned int number_colors,XColor *color)
10083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
10103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o pixel: XBestPixel returns the pixel value closest to the requested
10123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      color.
10133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
10153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
10163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o colormap: Specifies the ID of the X server colormap.
10183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o colors: Specifies an array of XColor structures.
10203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o number_colors: Specifies the number of XColor structures in the
10223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      color definition array.
10233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o color: Specifies the desired RGB value to find in the colors array.
10253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1027bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XBestPixel(Display *display,const Colormap colormap,
10283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XColor *colors,unsigned int number_colors,XColor *color)
10293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
10303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
10313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    query_server;
10323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10334c08aed51c5899665ade97263692328eea4af106cristy  PixelInfo
10343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel;
10353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickRealType
10373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    min_distance;
10383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register MagickRealType
10403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    distance;
10413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register int
10433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
10443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    j;
10453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
10473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
10483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
10503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Find closest representation for the requested RGB color.
10513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
10523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
10533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
10543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(color != (XColor *) NULL);
10553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XAllocColor(display,colormap,color);
10563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status != False)
10573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return;
10583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  query_server=colors == (XColor *) NULL ? MagickTrue : MagickFalse;
10593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (query_server != MagickFalse)
10603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
10613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
10623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Read X server colormap.
10633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
10643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      colors=(XColor *) AcquireQuantumMemory(number_colors,sizeof(*colors));
10653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (colors == (XColor *) NULL)
10663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
10673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ThrowXWindowFatalException(ResourceLimitError,
10683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            "MemoryAllocationFailed","...");
10693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          return;
10703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
10713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (i=0; i < (int) number_colors; i++)
1072bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        colors[i].pixel=(size_t) i;
10733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (number_colors > 256)
10743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        number_colors=256;
10753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XQueryColors(display,colormap,colors,(int) number_colors);
10763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
10773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  min_distance=3.0*((MagickRealType) QuantumRange+1.0)*((MagickRealType)
10783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    QuantumRange+1.0);
10793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  j=0;
10803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; i < (int) number_colors; i++)
10813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
10823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel.red=colors[i].red-(MagickRealType) color->red;
10833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    distance=pixel.red*pixel.red;
10843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (distance > min_distance)
10853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      continue;
10863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel.green=colors[i].green-(MagickRealType) color->green;
10873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    distance+=pixel.green*pixel.green;
10883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (distance > min_distance)
10893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      continue;
10903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel.blue=colors[i].blue-(MagickRealType) color->blue;
10913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    distance+=pixel.blue*pixel.blue;
10923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (distance > min_distance)
10933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      continue;
10943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    min_distance=distance;
10953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    color->pixel=colors[i].pixel;
10963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    j=i;
10973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
10983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XAllocColor(display,colormap,&colors[j]);
10993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (query_server != MagickFalse)
11003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    colors=(XColor *) RelinquishMagickMemory(colors);
11013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
11023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
11043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X B e s t V i s u a l I n f o                                             %
11093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XBestVisualInfo() returns visual information for a visual that is the "best"
11153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  the server supports.  "Best" is defined as:
11163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    1. Restrict the visual list to those supported by the default screen.
11183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    2. If a visual type is specified, restrict the visual list to those of
11203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%       that type.
11213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    3. If a map type is specified, choose the visual that matches the id
11233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%       specified by the Standard Colormap.
11243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    4  From the list of visuals, choose one that can display the most
11263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%       simultaneous colors.  If more than one visual can display the same
11273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%       number of simultaneous colors, one is chosen based on a rank.
11283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XBestVisualInfo method is:
11303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XVisualInfo *XBestVisualInfo(Display *display,
11323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        XStandardColormap *map_info,XResourceInfo *resource_info)
11333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
11353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o visual_info: XBestVisualInfo returns a pointer to a X11 XVisualInfo
11373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      structure.
11383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
11403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
11413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o map_info: If map_type is specified, this structure is initialized
11433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      with info from the Standard Colormap.
11443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
11463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
11483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11493ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic inline int MagickMax(const int x,const int y)
11503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
11513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (x > y)
11523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(x);
11533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(y);
11543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
11553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1156bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristystatic inline size_t MagickMin(const unsigned int x,
11573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const unsigned int y)
11583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
11593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (x < y)
11603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(x);
11613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(y);
11623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
11633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1164bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate XVisualInfo *XBestVisualInfo(Display *display,
11653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XStandardColormap *map_info,XResourceInfo *resource_info)
11663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
11673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define MaxStandardColormaps  7
11683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define XVisualColormapSize(visual_info) MagickMin((unsigned int) (\
11693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (visual_info->klass == TrueColor) || (visual_info->klass == DirectColor) ? \
11703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   visual_info->red_mask | visual_info->green_mask | visual_info->blue_mask : \
11713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   (unsigned int) visual_info->colormap_size),1U << visual_info->depth)
11723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
11743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *map_type,
11753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *visual_type;
11763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1177c57f694b2d04975a0e501613e34368c464708c19cristy  int
1178c57f694b2d04975a0e501613e34368c464708c19cristy    visual_mask;
1179c57f694b2d04975a0e501613e34368c464708c19cristy
11803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register int
11813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
11823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11838891f9ce489d3e61399b60436ea6c62f5ed9b887cristy  size_t
11848891f9ce489d3e61399b60436ea6c62f5ed9b887cristy    one;
11858891f9ce489d3e61399b60436ea6c62f5ed9b887cristy
11863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static int
11873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_visuals;
11883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static XVisualInfo
11903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    visual_template;
11913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XVisualInfo
11933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *visual_info,
11943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *visual_list;
11953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
11973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Restrict visual search by screen number.
11983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
11993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
12003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
12013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(map_info != (XStandardColormap *) NULL);
12023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(resource_info != (XResourceInfo *) NULL);
12033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  map_type=resource_info->map_type;
12043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  visual_type=resource_info->visual_type;
12053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  visual_mask=VisualScreenMask;
12063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  visual_template.screen=XDefaultScreen(display);
12073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  visual_template.depth=XDefaultDepth(display,XDefaultScreen(display));
12088891f9ce489d3e61399b60436ea6c62f5ed9b887cristy  one=1;
12093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((resource_info->immutable != MagickFalse) && (resource_info->colors != 0))
12108891f9ce489d3e61399b60436ea6c62f5ed9b887cristy    if (resource_info->colors <= (one << (size_t) visual_template.depth))
12113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      visual_mask|=VisualDepthMask;
12123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (visual_type != (char *) NULL)
12133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
12143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
12153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Restrict visual search by class or visual id.
12163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
12173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (LocaleCompare("staticgray",visual_type) == 0)
12183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
12193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          visual_mask|=VisualClassMask;
12203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          visual_template.klass=StaticGray;
12213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
12223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
12233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare("grayscale",visual_type) == 0)
12243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
12253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            visual_mask|=VisualClassMask;
12263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            visual_template.klass=GrayScale;
12273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
12283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        else
12293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (LocaleCompare("staticcolor",visual_type) == 0)
12303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
12313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              visual_mask|=VisualClassMask;
12323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              visual_template.klass=StaticColor;
12333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
12343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          else
12353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (LocaleCompare("pseudocolor",visual_type) == 0)
12363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
12373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                visual_mask|=VisualClassMask;
12383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                visual_template.klass=PseudoColor;
12393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
12403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            else
12413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (LocaleCompare("truecolor",visual_type) == 0)
12423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
12433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  visual_mask|=VisualClassMask;
12443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  visual_template.klass=TrueColor;
12453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
12463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              else
12473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if (LocaleCompare("directcolor",visual_type) == 0)
12483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  {
12493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    visual_mask|=VisualClassMask;
12503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    visual_template.klass=DirectColor;
12513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  }
12523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                else
12533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  if (LocaleCompare("default",visual_type) == 0)
12543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    {
12553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      visual_mask|=VisualIDMask;
12563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      visual_template.visualid=XVisualIDFromVisual(
12573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        XDefaultVisual(display,XDefaultScreen(display)));
12583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    }
12593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  else
12603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    if (isdigit((int) ((unsigned char) *visual_type)) != 0)
12613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      {
12623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        visual_mask|=VisualIDMask;
12633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        visual_template.visualid=
12643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                          strtol(visual_type,(char **) NULL,0);
12653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      }
12663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    else
12673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      ThrowXWindowFatalException(XServerError,
12683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        "UnrecognizedVisualSpecifier",visual_type);
12693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
12703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
12713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Get all visuals that meet our criteria so far.
12723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
12733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  number_visuals=0;
12743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  visual_list=XGetVisualInfo(display,visual_mask,&visual_template,
12753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    &number_visuals);
12763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  visual_mask=VisualScreenMask | VisualIDMask;
12773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((number_visuals == 0) || (visual_list == (XVisualInfo *) NULL))
12783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
12793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
12803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Failed to get visual;  try using the default visual.
12813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
12823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowXWindowFatalException(XServerWarning,"UnableToGetVisual",
12833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        visual_type);
12843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      visual_template.visualid=XVisualIDFromVisual(XDefaultVisual(display,
12853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDefaultScreen(display)));
12863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      visual_list=XGetVisualInfo(display,visual_mask,&visual_template,
12873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        &number_visuals);
12883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((number_visuals == 0) || (visual_list == (XVisualInfo *) NULL))
12893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        return((XVisualInfo *) NULL);
12903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowXWindowFatalException(XServerWarning,"UsingDefaultVisual",
12913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XVisualClassName(visual_list->klass));
12923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
12933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->color_recovery=MagickFalse;
12943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((map_info != (XStandardColormap *) NULL) && (map_type != (char *) NULL))
12953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
12963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Atom
12973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        map_property;
12983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      char
13003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        map_name[MaxTextExtent];
13013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
13023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      int
13033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        j,
13043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        number_maps;
13053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
13063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Status
13073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        status;
13083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
13093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Window
13103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        root_window;
13113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
13123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XStandardColormap
13133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *map_list;
13143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
13153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
13163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Choose a visual associated with a standard colormap.
13173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
13183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      root_window=XRootWindow(display,XDefaultScreen(display));
13193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=False;
13203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (LocaleCompare(map_type,"list") != 0)
13213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
13223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
13233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            User specified Standard Colormap.
13243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
1325b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy          (void) FormatLocaleString((char *) map_name,MaxTextExtent,
13263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            "RGB_%s_MAP",map_type);
13273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          LocaleUpper(map_name);
13283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          map_property=XInternAtom(display,(char *) map_name,MagickTrue);
13293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (map_property != (Atom) NULL)
13303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            status=XGetRGBColormaps(display,root_window,&map_list,&number_maps,
13313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              map_property);
13323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
13333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
13343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
13353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          static const char
13363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *colormap[MaxStandardColormaps]=
13373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
13383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              "_HP_RGB_SMOOTH_MAP_LIST",
13393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              "RGB_BEST_MAP",
13403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              "RGB_DEFAULT_MAP",
13413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              "RGB_GRAY_MAP",
13423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              "RGB_RED_MAP",
13433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              "RGB_GREEN_MAP",
13443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              "RGB_BLUE_MAP",
13453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            };
13463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
13473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
13483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Choose a standard colormap from a list.
13493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
13503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (i=0; i < MaxStandardColormaps; i++)
13513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
13523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            map_property=XInternAtom(display,(char *) colormap[i],MagickTrue);
13533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (map_property == (Atom) NULL)
13543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              continue;
13553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            status=XGetRGBColormaps(display,root_window,&map_list,&number_maps,
13563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              map_property);
13573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (status != False)
13583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
13593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
13603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          resource_info->color_recovery=i == 0 ? MagickTrue : MagickFalse;
13613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
13623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (status == False)
13633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
13643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ThrowXWindowFatalException(XServerError,"UnableToGetStandardColormap",
13653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            map_type);
13663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          return((XVisualInfo *) NULL);
13673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
13683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
13693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Search all Standard Colormaps and visuals for ids that match.
13703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
13713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      *map_info=map_list[0];
13723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if !defined(PRE_R4_ICCCM)
13733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      visual_template.visualid=XVisualIDFromVisual(visual_list[0].visual);
13743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (i=0; i < number_maps; i++)
13753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for (j=0; j < number_visuals; j++)
13763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (map_list[i].visualid ==
13773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              XVisualIDFromVisual(visual_list[j].visual))
13783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
13793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *map_info=map_list[i];
13803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              visual_template.visualid=XVisualIDFromVisual(
13813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                visual_list[j].visual);
13823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
13833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
13843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (map_info->visualid != visual_template.visualid)
13853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
13863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ThrowXWindowFatalException(XServerError,
13873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            "UnableToMatchVisualToStandardColormap",map_type);
13883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          return((XVisualInfo *) NULL);
13893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
13903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
13913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (map_info->colormap == (Colormap) NULL)
13923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
13933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ThrowXWindowFatalException(XServerError,
13943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            "StandardColormapIsNotInitialized",map_type);
13953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          return((XVisualInfo *) NULL);
13963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
13973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XFree((void *) map_list);
13983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
13993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
14003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
14013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      static const unsigned int
14023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        rank[]=
14033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
14043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            StaticGray,
14053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            GrayScale,
14063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            StaticColor,
14073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            DirectColor,
14083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            TrueColor,
14093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            PseudoColor
14103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          };
14113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
14123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XVisualInfo
14133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *p;
14143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
14153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
14163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Pick one visual that displays the most simultaneous colors.
14173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
14183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      visual_info=visual_list;
14193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      p=visual_list;
14203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (i=1; i < number_visuals; i++)
14213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
14223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        p++;
14233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (XVisualColormapSize(p) > XVisualColormapSize(visual_info))
14243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          visual_info=p;
14253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        else
14263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (XVisualColormapSize(p) == XVisualColormapSize(visual_info))
14273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (rank[p->klass] > rank[visual_info->klass])
14283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              visual_info=p;
14293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
14303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      visual_template.visualid=XVisualIDFromVisual(visual_info->visual);
14313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
14323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFree((void *) visual_list);
14333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
14343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Retrieve only one visual by its screen & id number.
14353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
14363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  visual_info=XGetVisualInfo(display,visual_mask,&visual_template,
14373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    &number_visuals);
14383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((number_visuals == 0) || (visual_info == (XVisualInfo *) NULL))
14393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((XVisualInfo *) NULL);
14403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(visual_info);
14413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
14423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
14433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
14443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
14453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X C h e c k D e f i n e C u r s o r                                       %
14493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
14533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XCheckDefineCursor() prevents cursor changes on the root window.
14553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XXCheckDefineCursor method is:
14573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XCheckDefineCursor(display,window,cursor)
14593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
14613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
14633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
14643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: the window.
14663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o cursor: the cursor.
14683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1470bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate int XCheckDefineCursor(Display *display,Window window,
14713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Cursor cursor)
14723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
14733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
14743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
14753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window == XRootWindow(display,XDefaultScreen(display)))
14763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(0);
14773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(XDefineCursor(display,window,cursor));
14783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
14793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
14803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
14813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
14823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X C h e c k R e f r e s h W i n d o w s                                   %
14863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
14903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XCheckRefreshWindows() checks the X server for exposure events for a
14923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  particular window and updates the areassociated with the exposure event.
14933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XCheckRefreshWindows method is:
14953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XCheckRefreshWindows(Display *display,XWindows *windows)
14973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
14993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
15013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
15023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o windows: Specifies a pointer to a XWindows structure.
15043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1506bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XCheckRefreshWindows(Display *display,XWindows *windows)
15073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
15083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Window
15093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    id;
15103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
15113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XEvent
15123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    event;
15133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
15143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
15153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
15163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(windows != (XWindows *) NULL);
15173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XDelay(display,SuspendTime);
15183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  id=windows->command.id;
15193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while (XCheckTypedWindowEvent(display,id,Expose,&event) != MagickFalse)
15203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XCommandWidget(display,windows,(char const **) NULL,&event);
15213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  id=windows->image.id;
15223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while (XCheckTypedWindowEvent(display,id,Expose,&event) != MagickFalse)
15233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    XRefreshWindow(display,&windows->image,&event);
15243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XDelay(display,SuspendTime << 1);
15253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  id=windows->command.id;
15263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while (XCheckTypedWindowEvent(display,id,Expose,&event) != MagickFalse)
15273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XCommandWidget(display,windows,(char const **) NULL,&event);
15283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  id=windows->image.id;
15293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while (XCheckTypedWindowEvent(display,id,Expose,&event) != MagickFalse)
15303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    XRefreshWindow(display,&windows->image,&event);
15313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
15323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
15333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
15343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
15353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X C l i e n t M e s s a g e                                               %
15393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
15433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XClientMessage() sends a reason to a window with XSendEvent.  The reason is
15453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  initialized with a particular protocol type and atom.
15463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XClientMessage function is:
15483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XClientMessage(display,window,protocol,reason,timestamp)
15503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
15523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a pointer to the Display structure;  returned from
15543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
15553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies a pointer to a Window structure.
15573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o protocol: Specifies an atom value.
15593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o reason: Specifies an atom value which is the reason to send.
15613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o timestamp: Specifies a value of type Time.
15633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1565bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XClientMessage(Display *display,const Window window,
15663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const Atom protocol,const Atom reason,const Time timestamp)
15673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
15683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XClientMessageEvent
15693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    client_event;
15703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
15713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
15723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  client_event.type=ClientMessage;
15733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  client_event.window=window;
15743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  client_event.message_type=protocol;
15753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  client_event.format=32;
1576c57f694b2d04975a0e501613e34368c464708c19cristy  client_event.data.l[0]=(long) reason;
1577c57f694b2d04975a0e501613e34368c464708c19cristy  client_event.data.l[1]=(long) timestamp;
15783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XSendEvent(display,window,MagickFalse,NoEventMask,(XEvent *) &client_event);
15793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
15803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
15813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
15823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
15833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy+   X C l i e n t W i n d o w                                                 %
15873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
15913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XClientWindow() finds a window, at or below the specified window, which has
15933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  a WM_STATE property.  If such a window is found, it is returned, otherwise
15943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  the argument window is returned.
15953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XClientWindow function is:
15973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      client_window=XClientWindow(display,target_window)
15993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
16013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o client_window: XClientWindow returns a window, at or below the specified
16033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      window, which has a WM_STATE property otherwise the argument
16043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      target_window is returned.
16053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a pointer to the Display structure;  returned from
16073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
16083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o target_window: Specifies the window to find a WM_STATE property.
16103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
16123ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Window XClientWindow(Display *display,Window target_window)
16133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
16143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Atom
16153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    state,
16163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    type;
16173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
16183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
16193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    format;
16203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
16213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
16223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
16233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
16243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned char
16253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *data;
16263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1627f2faecf9facdbbb14fcba373365f9f691a9658e0cristy  unsigned long
16283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    after,
16293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_items;
16303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
16313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Window
16323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    client_window;
16333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
16343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
16353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
16363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  state=XInternAtom(display,"WM_STATE",MagickTrue);
16373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (state == (Atom) NULL)
16383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(target_window);
16393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  type=(Atom) NULL;
16403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XGetWindowProperty(display,target_window,state,0L,0L,MagickFalse,
16413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (Atom) AnyPropertyType,&type,&format,&number_items,&after,&data);
16423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((status == Success) && (type != (Atom) NULL))
16433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(target_window);
16443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  client_window=XWindowByProperty(display,target_window,state);
16453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (client_window == (Window) NULL)
16463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(target_window);
16473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(client_window);
16483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
16493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
16503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
16513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
16523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1655f34a145c545cb86152ad42a787f6d5fffea6b77ccristy+   X C o m p o n e n t T e r m i n u s                                       %
1656f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1657f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1658f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1659f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1660f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
1661f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%  XComponentTerminus() destroys the module component.
1662f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
1663f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%  The format of the XComponentTerminus method is:
1664f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
1665f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%      XComponentTerminus(void)
1666f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
1667f34a145c545cb86152ad42a787f6d5fffea6b77ccristy*/
16685ff4eaf57b3cd47d0371f204f865cbba614674a0cristyMagickPrivate void XComponentTerminus(void)
1669f34a145c545cb86152ad42a787f6d5fffea6b77ccristy{
1670f34a145c545cb86152ad42a787f6d5fffea6b77ccristy  DestroyXResources();
1671f34a145c545cb86152ad42a787f6d5fffea6b77ccristy}
1672f34a145c545cb86152ad42a787f6d5fffea6b77ccristy
1673f34a145c545cb86152ad42a787f6d5fffea6b77ccristy/*
1674f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1675f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1676f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1677f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
16783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X C o n f i g u r e I m a g e C o l o r m a p                             %
16793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
16833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XConfigureImageColormap() creates a new X colormap.
16853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XConfigureImageColormap method is:
16873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XConfigureImageColormap(Display *display,
16896710d8414f0ed06e4eaf9346366be72e2b4719efcristy%        XResourceInfo *resource_info,XWindows *windows,Image *image,
16906710d8414f0ed06e4eaf9346366be72e2b4719efcristy%        ExceptionInfo *exception)
16913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
16933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server; returned from
16953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
16963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
16983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o windows: Specifies a pointer to a XWindows structure.
17003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image: the image.
17023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17036710d8414f0ed06e4eaf9346366be72e2b4719efcristy%    o exception: return any errors or warnings in this structure.
17046710d8414f0ed06e4eaf9346366be72e2b4719efcristy%
17053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1706bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XConfigureImageColormap(Display *display,
17076710d8414f0ed06e4eaf9346366be72e2b4719efcristy  XResourceInfo *resource_info,XWindows *windows,Image *image,
17086710d8414f0ed06e4eaf9346366be72e2b4719efcristy  ExceptionInfo *exception)
17093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
17103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Colormap
17113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    colormap;
17123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
17133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
17143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Make standard colormap.
17153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
17163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetCursorState(display,windows,MagickTrue);
17173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XCheckRefreshWindows(display,windows);
17183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XMakeStandardColormap(display,windows->visual_info,resource_info,image,
17196710d8414f0ed06e4eaf9346366be72e2b4719efcristy    windows->map_info,windows->pixel_info,exception);
17203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  colormap=windows->map_info->colormap;
17213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XSetWindowColormap(display,windows->image.id,colormap);
17223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XSetWindowColormap(display,windows->command.id,colormap);
17233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XSetWindowColormap(display,windows->widget.id,colormap);
17243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->magnify.mapped != MagickFalse)
17253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XSetWindowColormap(display,windows->magnify.id,colormap);
17263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->pan.mapped != MagickFalse)
17273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XSetWindowColormap(display,windows->pan.id,colormap);
17283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetCursorState(display,windows,MagickFalse);
17293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XClientMessage(display,windows->image.id,windows->im_protocols,
17303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    windows->im_update_colormap,CurrentTime);
17313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
17323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
17333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
17343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
17353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X C o n s t r a i n W i n d o w P o s i t i o n                           %
17393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
17433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XConstrainWindowPosition() assures a window is positioned within the X
17453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  server boundaries.
17463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XConstrainWindowPosition method is:
17483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XConstrainWindowPosition(Display *display,XWindowInfo *window_info)
17503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
17523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a pointer to the Display structure;  returned from
17543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
17553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window_info: Specifies a pointer to a XWindowInfo structure.
17573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1759bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XConstrainWindowPosition(Display *display,
17603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWindowInfo *window_info)
17613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
17623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
17633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    limit;
17643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
17653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
17663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
17673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(window_info != (XWindowInfo *) NULL);
17683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  limit=XDisplayWidth(display,window_info->screen)-window_info->width;
17693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window_info->x < 0)
17703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window_info->x=0;
17713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
17723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (window_info->x > (int) limit)
17733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window_info->x=(int) limit;
17743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  limit=XDisplayHeight(display,window_info->screen)-window_info->height;
17753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window_info->y < 0)
17763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window_info->y=0;
17773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
17783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (window_info->y > limit)
17793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window_info->y=limit;
17803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
17813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
17823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
17833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
17843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X D e l a y                                                               %
17883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
17923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XDelay() suspends program execution for the number of milliseconds
17943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  specified.
17953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the Delay method is:
17973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1798bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%      void XDelay(Display *display,const size_t milliseconds)
17993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
18013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a pointer to the Display structure;  returned from
18033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
18043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o milliseconds: Specifies the number of milliseconds to delay before
18063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      returning.
18073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1809bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XDelay(Display *display,const size_t milliseconds)
18103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
18113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
18123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFlush(display);
1813a21afdefe277667f7821fa90decc1f15a167eacfcristy  MagickDelay(milliseconds);
18143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
18153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
18163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
18173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
18183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X D e s t r o y R e s o u r c e I n f o                                   %
18223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
18263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XDestroyResourceInfo() frees memory associated with the XResourceInfo
18283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  structure.
18293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XDestroyResourceInfo method is:
18313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XDestroyResourceInfo(XResourceInfo *resource_info)
18333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
18353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
18373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
18393ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport void XDestroyResourceInfo(XResourceInfo *resource_info)
18403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
18413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (resource_info->image_geometry != (char *) NULL)
18423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    resource_info->image_geometry=(char *)
18433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      RelinquishMagickMemory(resource_info->image_geometry);
18443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (resource_info->quantize_info != (QuantizeInfo *) NULL)
18453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    resource_info->quantize_info=DestroyQuantizeInfo(
18463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      resource_info->quantize_info);
18473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (resource_info->client_name != (char *) NULL)
18483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    resource_info->client_name=(char *)
18493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      RelinquishMagickMemory(resource_info->client_name);
18503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (resource_info->name != (char *) NULL)
18513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    resource_info->name=DestroyString(resource_info->name);
18523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ResetMagickMemory(resource_info,0,sizeof(*resource_info));
18533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
18543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
18553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
18563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
18573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X D e s t r o y W i n d o w C o l o r s                                   %
18613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
18653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XDestroyWindowColors() frees X11 color resources previously saved on a
18673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  window by XRetainWindowColors or programs like xsetroot.
18683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XDestroyWindowColors method is:
18703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XDestroyWindowColors(Display *display,Window window)
18723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
18743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server; returned from
18763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
18773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies a pointer to a Window structure.
18793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1881bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XDestroyWindowColors(Display *display,Window window)
18823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
18833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Atom
18843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    property,
18853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    type;
18863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
18873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
18883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    format;
18893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
18903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
18913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
18923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
18933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned char
18943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *data;
18953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1896f2faecf9facdbbb14fcba373365f9f691a9658e0cristy  unsigned long
18973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    after,
18983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length;
18993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
19003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
19013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    If there are previous resources on the root window, destroy them.
19023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
19033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
19043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
19053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  property=XInternAtom(display,"_XSETROOT_ID",MagickFalse);
19063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (property == (Atom) NULL)
19073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
19083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowXWindowFatalException(XServerError,"UnableToCreateProperty",
19093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "_XSETROOT_ID");
19103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return;
19113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
19123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XGetWindowProperty(display,window,property,0L,1L,MagickTrue,
19133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (Atom) AnyPropertyType,&type,&format,&length,&after,&data);
19143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status != Success)
19153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return;
19163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((type == XA_PIXMAP) && (format == 32) && (length == 1) && (after == 0))
19173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
19183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XKillClient(display,(XID) (*((Pixmap *) data)));
19193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XDeleteProperty(display,window,property);
19203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
19213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (type != None)
19223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XFree((void *) data);
19233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
19243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
19253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
19263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
19273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
19283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
19293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
19303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X D i s p l a y I m a g e I n f o                                         %
19313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
19323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
19333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
19343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
19353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XDisplayImageInfo() displays information about an X image.
19373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XDisplayImageInfo method is:
19393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XDisplayImageInfo(Display *display,
19413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const XResourceInfo *resource_info,XWindows *windows,Image *undo_image,
19426710d8414f0ed06e4eaf9346366be72e2b4719efcristy%        Image *image,ExceptionInfo *exception)
19433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
19453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
19473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
19483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
19503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o windows: Specifies a pointer to a XWindows structure.
19523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o undo_image: the undo image.
19543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image: the image.
19563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19576710d8414f0ed06e4eaf9346366be72e2b4719efcristy%    o exception: return any errors or warnings in this structure.
19586710d8414f0ed06e4eaf9346366be72e2b4719efcristy%
19593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1960bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XDisplayImageInfo(Display *display,
19613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const XResourceInfo *resource_info,XWindows *windows,Image *undo_image,
19626710d8414f0ed06e4eaf9346366be72e2b4719efcristy  Image *image,ExceptionInfo *exception)
19633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
19643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
19653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    filename[MaxTextExtent],
19663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *text,
19673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **textlist;
19683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
19693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  FILE
19703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *file;
19713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
19723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
19733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    unique_file;
19743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1975bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
19763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
19773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1978bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
19793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_pixels;
19803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
19819d314ff2c17a77996c05413c2013880387e50f0ecristy  ssize_t
19829d314ff2c17a77996c05413c2013880387e50f0ecristy    bytes;
19839d314ff2c17a77996c05413c2013880387e50f0ecristy
19849d314ff2c17a77996c05413c2013880387e50f0ecristy  unsigned int
19859d314ff2c17a77996c05413c2013880387e50f0ecristy    levels;
19869d314ff2c17a77996c05413c2013880387e50f0ecristy
19873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
19883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Write info about the X server to a file.
19893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
19903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
19913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(resource_info != (XResourceInfo *) NULL);
19923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(windows != (XWindows *) NULL);
19933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image != (Image *) NULL);
19943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image->debug)
19953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
19963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  file=(FILE *) NULL;
19973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unique_file=AcquireUniqueFileResource(filename);
19983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (unique_file != -1)
19993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    file=fdopen(unique_file,"w");
20003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((unique_file == -1) || (file == (FILE *) NULL))
20013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
20023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XNoticeWidget(display,windows,"Unable to display image info",filename);
20033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return;
20043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
20053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (resource_info->gamma_correct != MagickFalse)
20063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (resource_info->display_gamma != (char *) NULL)
2007b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy      (void) FormatLocaleFile(file,"Display\n  gamma: %s\n\n",
20083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        resource_info->display_gamma);
20093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
20103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Write info about the X image to a file.
20113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
2012b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleFile(file,"X\n  visual: %s\n",
20133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    XVisualClassName((int) windows->image.storage_class));
2014b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleFile(file,"  depth: %d\n",windows->image.ximage->depth);
20153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->visual_info->colormap_size != 0)
2016b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(file,"  colormap size: %d\n",
20173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      windows->visual_info->colormap_size);
20183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (resource_info->colormap== SharedColormap)
2019b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(file,"  colormap type: Shared\n");
20203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
2021b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(file,"  colormap type: Private\n");
20221e604812fad85bb96f757a2393015ae3d061c39acristy  (void) FormatLocaleFile(file,"  geometry: %dx%d\n",
20231e604812fad85bb96f757a2393015ae3d061c39acristy    windows->image.ximage->width,windows->image.ximage->height);
20243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->image.crop_geometry != (char *) NULL)
20251e604812fad85bb96f757a2393015ae3d061c39acristy    (void) FormatLocaleFile(file,"  crop geometry: %s\n",
20261e604812fad85bb96f757a2393015ae3d061c39acristy      windows->image.crop_geometry);
20273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->image.pixmap == (Pixmap) NULL)
2028b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(file,"  type: X Image\n");
20293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
2030b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(file,"  type: Pixmap\n");
20313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->image.shape != MagickFalse)
2032b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(file,"  non-rectangular shape: True\n");
20333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
2034b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(file,"  non-rectangular shape: False\n");
20353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->image.shared_memory != MagickFalse)
2036b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(file,"  shared memory: True\n");
20373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
2038b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(file,"  shared memory: False\n");
2039b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleFile(file,"\n");
20403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (resource_info->font != (char *) NULL)
2041b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(file,"Font: %s\n\n",resource_info->font);
20423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (resource_info->text_font != (char *) NULL)
2043b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(file,"Text font: %s\n\n",resource_info->text_font);
20443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
20453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Write info about the undo cache to a file.
20463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
20473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  bytes=0;
20483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (levels=0; undo_image != (Image *) NULL; levels++)
20493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
20503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_pixels=undo_image->list->columns*undo_image->list->rows;
2051101ab708b0574518ac5715da4d3915400e9df79acristy    bytes+=number_pixels*sizeof(PixelInfo);
20523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    undo_image=GetPreviousImageInList(undo_image);
20533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
2054b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleFile(file,"Undo Edit Cache\n  levels: %u\n",levels);
20551e604812fad85bb96f757a2393015ae3d061c39acristy  (void) FormatLocaleFile(file,"  bytes: %.20gmb\n",(double)
20561e604812fad85bb96f757a2393015ae3d061c39acristy    ((bytes+(1 << 19)) >> 20));
2057b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleFile(file,"  limit: %.20gmb\n\n",(double)
2058f2faecf9facdbbb14fcba373365f9f691a9658e0cristy    resource_info->undo_cache);
20593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
20603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Write info about the image to a file.
20613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
20626710d8414f0ed06e4eaf9346366be72e2b4719efcristy  (void) IdentifyImage(image,file,MagickTrue,exception);
20633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) fclose(file);
20646710d8414f0ed06e4eaf9346366be72e2b4719efcristy  text=FileToString(filename,~0,exception);
20653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) RelinquishUniqueFileResource(filename);
20663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (text == (char *) NULL)
20673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
20683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XNoticeWidget(display,windows,"MemoryAllocationFailed",
20693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "UnableToDisplayImageInfo");
20703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return;
20713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
20723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  textlist=StringToList(text);
20733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (textlist != (char **) NULL)
20743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
20753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      char
20763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        title[MaxTextExtent];
20773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
20783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
20793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Display information about the image in the Text View widget.
20803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
20813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XWithdrawWindow(display,windows->info.id,windows->info.screen);
2082b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy      (void) FormatLocaleString(title,MaxTextExtent,"Image Info: %s",
20833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        image->filename);
20843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XTextViewWidget(display,resource_info,windows,MagickTrue,title,
20853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (char const **) textlist);
20863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (i=0; textlist[i] != (char *) NULL; i++)
20873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        textlist[i]=DestroyString(textlist[i]);
20883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      textlist=(char **) RelinquishMagickMemory(textlist);
20893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
20903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  text=DestroyString(text);
20913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
20923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
20933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
20943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
20953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
20963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
20973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
20983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy+     X D i t h e r I m a g e                                                 %
20993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
21003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
21013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
21023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
21033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
21043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XDitherImage() dithers the reference image as required by the HP Color
21053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  Recovery algorithm.  The color values are quantized to 3 bits of red and
21063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  green, and 2 bits of blue (3/3/2) and can be used as indices into a 8-bit X
21073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  standard colormap.
21083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
21093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XDitherImage method is:
21103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
21116710d8414f0ed06e4eaf9346366be72e2b4719efcristy%      void XDitherImage(Image *image,XImage *ximage,ExceptionInfo *exception)
21123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
21133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
21143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
21153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image: the image.
21163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
21173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o ximage: Specifies a pointer to a XImage structure;  returned from
21183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XCreateImage.
21193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
21206710d8414f0ed06e4eaf9346366be72e2b4719efcristy%    o exception: return any errors or warnings in this structure.
21216710d8414f0ed06e4eaf9346366be72e2b4719efcristy%
21223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
21236710d8414f0ed06e4eaf9346366be72e2b4719efcristystatic void XDitherImage(Image *image,XImage *ximage,ExceptionInfo *exception)
21243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
21253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static const short int
21263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    dither_red[2][16]=
21273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
21283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {-16,  4, -1, 11,-14,  6, -3,  9,-15,  5, -2, 10,-13,  7, -4,  8},
21293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      { 15, -5,  0,-12, 13, -7,  2,-10, 14, -6,  1,-11, 12, -8,  3, -9}
21303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    },
21313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    dither_green[2][16]=
21323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
21333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      { 11,-15,  7, -3,  8,-14,  4, -2, 10,-16,  6, -4,  9,-13,  5, -1},
21343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {-12, 14, -8,  2, -9, 13, -5,  1,-11, 15, -7,  3,-10, 12, -6,  0}
21353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    },
21363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    dither_blue[2][16]=
21373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
21383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      { -3,  9,-13,  7, -1, 11,-15,  5, -4,  8,-14,  6, -2, 10,-16,  4},
21393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {  2,-10, 12, -8,  0,-12, 14, -6,  3, -9, 13, -7,  1,-11, 15, -5}
21403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    };
21413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2142c57f694b2d04975a0e501613e34368c464708c19cristy  CacheView
2143c57f694b2d04975a0e501613e34368c464708c19cristy    *image_view;
21443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
21453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
2146c57f694b2d04975a0e501613e34368c464708c19cristy    value,
21473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y;
21483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2149101ab708b0574518ac5715da4d3915400e9df79acristy  PixelInfo
2150c57f694b2d04975a0e501613e34368c464708c19cristy    color;
21513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
21523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register char
21533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
21543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
21554c08aed51c5899665ade97263692328eea4af106cristy  register const Quantum
21563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
21573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
21583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register int
21593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
21603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    j,
21613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x;
21623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
21633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
21643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    scanline_pad;
21653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2166bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register size_t
21673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel;
21683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
21693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned char
21703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *blue_map[2][16],
21713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *green_map[2][16],
21723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *red_map[2][16];
21733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
21743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
21753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Allocate and initialize dither maps.
21763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
21773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; i < 2; i++)
21783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    for (j=0; j < 16; j++)
21793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
21803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      red_map[i][j]=(unsigned char *) AcquireQuantumMemory(256UL,
21813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        sizeof(*red_map));
21823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      green_map[i][j]=(unsigned char *) AcquireQuantumMemory(256UL,
21833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        sizeof(*green_map));
21843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      blue_map[i][j]=(unsigned char *) AcquireQuantumMemory(256UL,
21853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        sizeof(*blue_map));
21863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((red_map[i][j] == (unsigned char *) NULL) ||
21873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (green_map[i][j] == (unsigned char *) NULL) ||
21883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (blue_map[i][j] == (unsigned char *) NULL))
21893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
21903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ThrowXWindowFatalException(ResourceLimitError,
21913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            "MemoryAllocationFailed",image->filename);
21923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          return;
21933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
21943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
21953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
21963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize dither tables.
21973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
21983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; i < 2; i++)
21993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    for (j=0; j < 16; j++)
22003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (x=0; x < 256; x++)
22013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
22023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        value=x-16;
22033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (x < 48)
22043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          value=x/2+8;
22053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        value+=dither_red[i][j];
22063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        red_map[i][j][x]=(unsigned char)
22073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ((value < 0) ? 0 : (value > 255) ? 255 : value);
22083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        value=x-16;
22093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (x < 48)
22103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          value=x/2+8;
22113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        value+=dither_green[i][j];
22123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        green_map[i][j][x]=(unsigned char)
22133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ((value < 0) ? 0 : (value > 255) ? 255 : value);
22143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        value=x-32;
22153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (x < 112)
22163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          value=x/2+24;
2217bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        value+=((size_t) dither_blue[i][j] << 1);
22183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        blue_map[i][j][x]=(unsigned char)
22193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ((value < 0) ? 0 : (value > 255) ? 255 : value);
22203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
22213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
22223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Dither image.
22233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
22243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  scanline_pad=(unsigned int) (ximage->bytes_per_line-
2225bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    ((size_t) (ximage->width*ximage->bits_per_pixel) >> 3));
22263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  i=0;
22273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  j=0;
22283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  q=ximage->data;
2229c57f694b2d04975a0e501613e34368c464708c19cristy  image_view=AcquireCacheView(image);
22303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (y=0; y < (int) image->rows; y++)
22313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
2232c57f694b2d04975a0e501613e34368c464708c19cristy    p=GetCacheViewVirtualPixels(image_view,0,(ssize_t) y,image->columns,1,
22336710d8414f0ed06e4eaf9346366be72e2b4719efcristy      exception);
22344c08aed51c5899665ade97263692328eea4af106cristy    if (p == (const Quantum *) NULL)
22353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
22363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    for (x=0; x < (int) image->columns; x++)
22373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
2238e42f658533644aecb733785ffd91b286d6778deacristy      color.red=(double) ClampToQuantum((MagickRealType) (red_map[i][j][
2239e42f658533644aecb733785ffd91b286d6778deacristy        (int) ScaleQuantumToChar(GetPixelRed(image,p))] << 8));
2240e42f658533644aecb733785ffd91b286d6778deacristy      color.green=(double) ClampToQuantum((MagickRealType) (green_map[i][j][
2241e42f658533644aecb733785ffd91b286d6778deacristy        (int) ScaleQuantumToChar(GetPixelGreen(image,p))] << 8));
2242e42f658533644aecb733785ffd91b286d6778deacristy      color.blue=(double) ClampToQuantum((MagickRealType) (blue_map[i][j][
2243e42f658533644aecb733785ffd91b286d6778deacristy        (int) ScaleQuantumToChar(GetPixelBlue(image,p))] << 8));
2244bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      pixel=(size_t) (((size_t) color.red & 0xe0) |
2245bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        (((size_t) color.green & 0xe0) >> 3) |
2246bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        (((size_t) color.blue & 0xc0) >> 6));
22473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      *q++=(char) pixel;
2248ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy      p+=GetPixelChannels(image);
22493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      j++;
22503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (j == 16)
22513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        j=0;
22523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
22533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    q+=scanline_pad;
22543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i++;
22553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (i == 2)
22563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      i=0;
22573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
2258c57f694b2d04975a0e501613e34368c464708c19cristy  image_view=DestroyCacheView(image_view);
22593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
22603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Free allocated memory.
22613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
22623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; i < 2; i++)
22633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    for (j=0; j < 16; j++)
22643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
22653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      green_map[i][j]=(unsigned char *) RelinquishMagickMemory(green_map[i][j]);
22663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      blue_map[i][j]=(unsigned char *) RelinquishMagickMemory(blue_map[i][j]);
22673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      red_map[i][j]=(unsigned char *) RelinquishMagickMemory(red_map[i][j]);
22683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
22693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
22703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
22713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
22723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
22733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X D r a w I m a g e                                                       %
22773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
22813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XDrawImage() draws a line on the image.
22833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XDrawImage method is:
22853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22866710d8414f0ed06e4eaf9346366be72e2b4719efcristy%    MagickBooleanType XDrawImage(Display *display,const XPixelInfo *pixel,
22876710d8414f0ed06e4eaf9346366be72e2b4719efcristy%      XDrawInfo *draw_info,Image *image,ExceptionInfo *exception)
22883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
22903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
22923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
22933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o pixel: Specifies a pointer to a XPixelInfo structure.
22953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o draw_info: Specifies a pointer to a XDrawInfo structure.
22973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image: the image.
22993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
23006710d8414f0ed06e4eaf9346366be72e2b4719efcristy%    o exception: return any errors or warnings in this structure.
23016710d8414f0ed06e4eaf9346366be72e2b4719efcristy%
23023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
2303bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate MagickBooleanType XDrawImage(Display *display,
23046710d8414f0ed06e4eaf9346366be72e2b4719efcristy  const XPixelInfo *pixel,XDrawInfo *draw_info,Image *image,
23056710d8414f0ed06e4eaf9346366be72e2b4719efcristy  ExceptionInfo *exception)
23063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
2307c57f694b2d04975a0e501613e34368c464708c19cristy  CacheView
2308c57f694b2d04975a0e501613e34368c464708c19cristy    *draw_view;
2309c57f694b2d04975a0e501613e34368c464708c19cristy
23103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  GC
23113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    draw_context;
23123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
23133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image
23143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *draw_image;
23153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
23163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
23173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x,
23183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y;
23193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
23203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
23213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    matte;
23223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
23233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Pixmap
23243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    draw_pixmap;
23253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
23263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
23273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    depth,
23283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    height,
23293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width;
23303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
23313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Window
23323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    root_window;
23333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
23343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XGCValues
23353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    context_values;
23363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
23373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XImage
23383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *draw_ximage;
23393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
23403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
23413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize drawd image.
23423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
23433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
23443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(pixel != (XPixelInfo *) NULL);
23453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(draw_info != (XDrawInfo *) NULL);
23463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image != (Image *) NULL);
23473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image->debug != MagickFalse)
23483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
23493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
23503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize drawd pixmap.
23513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
23523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  root_window=XRootWindow(display,XDefaultScreen(display));
23533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  depth=(unsigned int) XDefaultDepth(display,XDefaultScreen(display));
23543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  draw_pixmap=XCreatePixmap(display,root_window,draw_info->width,
23553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    draw_info->height,depth);
23563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (draw_pixmap == (Pixmap) NULL)
23573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
23583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
23593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize graphics info.
23603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
2361bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  context_values.background=(size_t) (~0);
23623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  context_values.foreground=0;
23633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  context_values.line_width=(int) draw_info->line_width;
2364bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  draw_context=XCreateGC(display,root_window,(size_t)
23653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (GCBackground | GCForeground | GCLineWidth),&context_values);
23663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (draw_context == (GC) NULL)
23673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
23683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
23693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Clear pixmap.
23703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
23713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFillRectangle(display,draw_pixmap,draw_context,0,0,draw_info->width,
23723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    draw_info->height);
23733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
23743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Draw line to pixmap.
23753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
23763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XSetBackground(display,draw_context,0);
2377bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  (void) XSetForeground(display,draw_context,(size_t) (~0));
2378dd05bebf92311ac0db88ae24d6a6862a4729e8a5cristy  if (draw_info->stipple !=  (Pixmap) NULL)
2379dd05bebf92311ac0db88ae24d6a6862a4729e8a5cristy    {
2380dd05bebf92311ac0db88ae24d6a6862a4729e8a5cristy      (void) XSetFillStyle(display,draw_context,FillOpaqueStippled);
2381dd05bebf92311ac0db88ae24d6a6862a4729e8a5cristy      (void) XSetStipple(display,draw_context,draw_info->stipple);
2382dd05bebf92311ac0db88ae24d6a6862a4729e8a5cristy    }
23833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  switch (draw_info->element)
23843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
23853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case PointElement:
23863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    default:
23873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
23883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XDrawLines(display,draw_pixmap,draw_context,
23893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        draw_info->coordinate_info,(int) draw_info->number_coordinates,
23903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        CoordModeOrigin);
23913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
23923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
23933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case LineElement:
23943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
23953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XDrawLine(display,draw_pixmap,draw_context,draw_info->line_info.x1,
23963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        draw_info->line_info.y1,draw_info->line_info.x2,
23973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        draw_info->line_info.y2);
23983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
23993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
24003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case RectangleElement:
24013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
24023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XDrawRectangle(display,draw_pixmap,draw_context,
24033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (int) draw_info->rectangle_info.x,(int) draw_info->rectangle_info.y,
24043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (unsigned int) draw_info->rectangle_info.width,
24053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (unsigned int) draw_info->rectangle_info.height);
24063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
24073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
24083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case FillRectangleElement:
24093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
24103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XFillRectangle(display,draw_pixmap,draw_context,
24113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (int) draw_info->rectangle_info.x,(int) draw_info->rectangle_info.y,
24123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (unsigned int) draw_info->rectangle_info.width,
24133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (unsigned int) draw_info->rectangle_info.height);
24143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
24153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
24163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case CircleElement:
24173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case EllipseElement:
24183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
24193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XDrawArc(display,draw_pixmap,draw_context,
24203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (int) draw_info->rectangle_info.x,(int) draw_info->rectangle_info.y,
24213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (unsigned int) draw_info->rectangle_info.width,
24223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (unsigned int) draw_info->rectangle_info.height,0,360*64);
24233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
24243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
24253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case FillCircleElement:
24263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case FillEllipseElement:
24273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
24283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XFillArc(display,draw_pixmap,draw_context,
24293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (int) draw_info->rectangle_info.x,(int) draw_info->rectangle_info.y,
24303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (unsigned int) draw_info->rectangle_info.width,
24313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (unsigned int) draw_info->rectangle_info.height,0,360*64);
24323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
24333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
24343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case PolygonElement:
24353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
24363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XPoint
24373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *coordinate_info;
24383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
24393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      coordinate_info=draw_info->coordinate_info;
24403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XDrawLines(display,draw_pixmap,draw_context,coordinate_info,
24413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (int) draw_info->number_coordinates,CoordModeOrigin);
24423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XDrawLine(display,draw_pixmap,draw_context,
24433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        coordinate_info[draw_info->number_coordinates-1].x,
24443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        coordinate_info[draw_info->number_coordinates-1].y,
24453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        coordinate_info[0].x,coordinate_info[0].y);
24463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
24473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
24483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case FillPolygonElement:
24493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
24503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XFillPolygon(display,draw_pixmap,draw_context,
24513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        draw_info->coordinate_info,(int) draw_info->number_coordinates,Complex,
24523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        CoordModeOrigin);
24533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
24543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
24553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
24563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFreeGC(display,draw_context);
24573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
24583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize X image.
24593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
24603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  draw_ximage=XGetImage(display,draw_pixmap,0,0,draw_info->width,
24613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    draw_info->height,AllPlanes,ZPixmap);
24623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (draw_ximage == (XImage *) NULL)
24633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
24643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFreePixmap(display,draw_pixmap);
24653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
24663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize draw image.
24673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
24686710d8414f0ed06e4eaf9346366be72e2b4719efcristy  draw_image=AcquireImage((ImageInfo *) NULL,exception);
24693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (draw_image == (Image *) NULL)
24703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
24713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  draw_image->columns=draw_info->width;
24723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  draw_image->rows=draw_info->height;
24733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
24743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Transfer drawn X image to image.
24753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
24763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  width=(unsigned int) image->columns;
24773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  height=(unsigned int) image->rows;
24783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  x=0;
24793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  y=0;
24803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XParseGeometry(draw_info->geometry,&x,&y,&width,&height);
2481f05d4947caf1bc27fbec041eb37c474a80c83c0bcristy  (void) GetOneVirtualPixelInfo(image,UndefinedVirtualPixelMethod,(ssize_t) x,
2482f05d4947caf1bc27fbec041eb37c474a80c83c0bcristy    (ssize_t) y,&draw_image->background_color,exception);
24836710d8414f0ed06e4eaf9346366be72e2b4719efcristy  if (SetImageStorageClass(draw_image,DirectClass,exception) == MagickFalse)
24843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
24853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  draw_image->matte=MagickTrue;
2486c57f694b2d04975a0e501613e34368c464708c19cristy  draw_view=AcquireCacheView(draw_image);
24873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (y=0; y < (int) draw_image->rows; y++)
24883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
2489c57f694b2d04975a0e501613e34368c464708c19cristy    register int
24903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      x;
24913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
24924c08aed51c5899665ade97263692328eea4af106cristy    register Quantum
2493c47d1f8ecfe7d04f0f003cca0fe175658bbf0fb2cristy      *restrict q;
24943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2495c57f694b2d04975a0e501613e34368c464708c19cristy    q=QueueCacheViewAuthenticPixels(draw_view,0,(ssize_t) y,draw_image->columns,
2496c57f694b2d04975a0e501613e34368c464708c19cristy      1,exception);
2497acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy    if (q == (Quantum *) NULL)
24983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
2499c57f694b2d04975a0e501613e34368c464708c19cristy    for (x=0; x < (int) draw_image->columns; x++)
25003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
25013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (XGetPixel(draw_ximage,x,y) == 0)
25023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
25033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
25043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Set this pixel to the background color.
25053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
2506803640d20a6a664315eddfff6f8531d0c5e0871dcristy          SetPixelInfoPixel(draw_image,&draw_image->background_color,q);
25077676158e6c207e287beb252c9837d565863c3328cristy          SetPixelAlpha(draw_image,(Quantum) (draw_info->stencil ==
25084c08aed51c5899665ade97263692328eea4af106cristy            OpaqueStencil ? TransparentAlpha : OpaqueAlpha),q);
25093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
25103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
25113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
25123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
25133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Set this pixel to the pen color.
25143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
25154c08aed51c5899665ade97263692328eea4af106cristy          SetPixelRed(draw_image,ScaleShortToQuantum(
25164c08aed51c5899665ade97263692328eea4af106cristy            pixel->pen_color.red),q);
25174c08aed51c5899665ade97263692328eea4af106cristy          SetPixelGreen(draw_image,ScaleShortToQuantum(
25184c08aed51c5899665ade97263692328eea4af106cristy            pixel->pen_color.green),q);
25194c08aed51c5899665ade97263692328eea4af106cristy          SetPixelBlue(draw_image,ScaleShortToQuantum(
25204c08aed51c5899665ade97263692328eea4af106cristy            pixel->pen_color.blue),q);
25214c08aed51c5899665ade97263692328eea4af106cristy          SetPixelAlpha(draw_image,(Quantum) (draw_info->stencil ==
25224c08aed51c5899665ade97263692328eea4af106cristy            OpaqueStencil ? OpaqueAlpha : TransparentAlpha),q);
25233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
2524ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy      q+=GetPixelChannels(draw_image);
25253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
2526c57f694b2d04975a0e501613e34368c464708c19cristy    if (SyncCacheViewAuthenticPixels(draw_view,exception) == MagickFalse)
25273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
25283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
2529c57f694b2d04975a0e501613e34368c464708c19cristy  draw_view=DestroyCacheView(draw_view);
25303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XDestroyImage(draw_ximage);
25313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
25323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Determine draw geometry.
25333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
25343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XParseGeometry(draw_info->geometry,&x,&y,&width,&height);
25353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((width != (unsigned int) draw_image->columns) ||
25363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (height != (unsigned int) draw_image->rows))
25373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
25383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      char
25393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        image_geometry[MaxTextExtent];
25403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
25413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
25423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Scale image.
25433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
2544b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy      (void) FormatLocaleString(image_geometry,MaxTextExtent,"%ux%u",
25453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        width,height);
2546e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy      (void) TransformImage(&draw_image,(char *) NULL,image_geometry,
2547e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy        exception);
25483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
25493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (draw_info->degrees != 0.0)
25503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
25513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Image
25523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *rotate_image;
25533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
25543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      int
25553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        rotations;
25563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
25573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      MagickRealType
25583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        normalized_degrees;
25593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
25603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
25613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Rotate image.
25623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
25636710d8414f0ed06e4eaf9346366be72e2b4719efcristy      rotate_image=RotateImage(draw_image,draw_info->degrees,exception);
25643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (rotate_image == (Image *) NULL)
25653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        return(MagickFalse);
25663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      draw_image=DestroyImage(draw_image);
25673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      draw_image=rotate_image;
25683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
25693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Annotation is relative to the degree of rotation.
25703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
25713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      normalized_degrees=draw_info->degrees;
25723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      while (normalized_degrees < -45.0)
25733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        normalized_degrees+=360.0;
25743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (rotations=0; normalized_degrees > 45.0; rotations++)
25753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        normalized_degrees-=90.0;
25763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      switch (rotations % 4)
25773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
25783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        default:
25793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 0:
25803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
25813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 1:
25823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
25833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
25843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Rotate 90 degrees.
25853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
25863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          x=x-(int) draw_image->columns/2;
25873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          y=y+(int) draw_image->columns/2;
25883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
25893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
25903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 2:
25913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
25923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
25933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Rotate 180 degrees.
25943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
25953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          x=x-(int) draw_image->columns;
25963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
25973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
25983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 3:
25993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
26003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
26013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Rotate 270 degrees.
26023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
26033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          x=x-(int) draw_image->columns/2;
26043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          y=y-(int) (draw_image->rows-(draw_image->columns/2));
26053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
26063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
26073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
26083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
26093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
26103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Composite text onto the image.
26113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
2612c57f694b2d04975a0e501613e34368c464708c19cristy  draw_view=AcquireCacheView(draw_image);
26133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (y=0; y < (int) draw_image->rows; y++)
26143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
2615c57f694b2d04975a0e501613e34368c464708c19cristy    register int
26163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      x;
26173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
26184c08aed51c5899665ade97263692328eea4af106cristy    register Quantum
2619c47d1f8ecfe7d04f0f003cca0fe175658bbf0fb2cristy      *restrict q;
26203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2621c57f694b2d04975a0e501613e34368c464708c19cristy    q=GetCacheViewAuthenticPixels(draw_view,0,(ssize_t) y,draw_image->columns,1,
2622c57f694b2d04975a0e501613e34368c464708c19cristy      exception);
2623acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy    if (q == (Quantum *) NULL)
26243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
2625c57f694b2d04975a0e501613e34368c464708c19cristy    for (x=0; x < (int) draw_image->columns; x++)
26263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
26274c08aed51c5899665ade97263692328eea4af106cristy      if (GetPixelAlpha(image,q) != TransparentAlpha)
26284c08aed51c5899665ade97263692328eea4af106cristy        SetPixelAlpha(draw_image,OpaqueAlpha,q);
2629ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy      q+=GetPixelChannels(draw_image);
26303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
2631c57f694b2d04975a0e501613e34368c464708c19cristy    if (SyncCacheViewAuthenticPixels(draw_view,exception) == MagickFalse)
26323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
26333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
2634c57f694b2d04975a0e501613e34368c464708c19cristy  draw_view=DestroyCacheView(draw_view);
26353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XParseGeometry(draw_info->geometry,&x,&y,&width,&height);
26363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (draw_info->stencil == TransparentStencil)
2637e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy    (void) CompositeImage(image,CopyAlphaCompositeOp,draw_image,(ssize_t) x,
2638e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy      (ssize_t) y,exception);
26393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
26403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
26413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      matte=image->matte;
2642c57f694b2d04975a0e501613e34368c464708c19cristy      (void) CompositeImage(image,OverCompositeOp,draw_image,(ssize_t) x,
2643e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy        (ssize_t) y,exception);
26443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image->matte=matte;
26453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
26463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  draw_image=DestroyImage(draw_image);
26473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickTrue);
26483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
26493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
26503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
26513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
26523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
26533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
26543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
26553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X E r r o r                                                               %
26563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
26573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
26583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
26593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
26603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
26613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XError() ignores BadWindow errors for XQueryTree and XGetWindowAttributes,
26623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  and ignores BadDrawable errors for XGetGeometry, and ignores BadValue errors
2663bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristy%  for XQueryColor.  It returns MagickFalse in those cases.  Otherwise it
2664bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristy%  returns True.
26653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
26663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XError function is:
26673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2668bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristy%      int XError(display,error)
26693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
26703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
26713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
26723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a pointer to the Display structure;  returned from
26733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
26743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
26753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o error: Specifies the error event.
26763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
26773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
26783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
26793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus)
26803ed852eea50f9d4cd633efb8c2b054b8e33c253cristyextern "C" {
26813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
26823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
26833ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport int XError(Display *display,XErrorEvent *error)
26843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
26853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
26863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
26873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(error != (XErrorEvent *) NULL);
26883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  xerror_alert=MagickTrue;
26893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  switch (error->request_code)
26903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
26913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case X_GetGeometry:
26923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
26933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((int) error->error_code == BadDrawable)
26943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        return(MagickFalse);
26953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
26963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
26973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case X_GetWindowAttributes:
26983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case X_QueryTree:
26993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
27003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((int) error->error_code == BadWindow)
27013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        return(MagickFalse);
27023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
27033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
27043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case X_QueryColors:
27053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
27063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((int) error->error_code == BadValue)
27073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        return(MagickFalse);
27083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
27093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
27103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
27113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickTrue);
27123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
27133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
27143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus)
27153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
27163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
27173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
27183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
27193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
27203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
27213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
27223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
27233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X F r e e R e s o u r c e s                                               %
27243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
27253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
27263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
27273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
27283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
27293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XFreeResources() frees X11 resources.
27303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
27313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XFreeResources method is:
27323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
27333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XFreeResources(Display *display,XVisualInfo *visual_info,
27343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        XStandardColormap *map_info,XPixelInfo *pixel,XFontStruct *font_info,
27353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        XResourceInfo *resource_info,XWindowInfo *window_info)
27363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        resource_info,window_info)
27373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
27383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
27393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
27403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server; returned from
27413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
27423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
27433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o visual_info: Specifies a pointer to a X11 XVisualInfo structure;
27443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      returned from XGetVisualInfo.
27453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
27463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o map_info: If map_type is specified, this structure is initialized
27473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      with info from the Standard Colormap.
27483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
27493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o pixel: Specifies a pointer to a XPixelInfo structure.
27503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
27513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o font_info: Specifies a pointer to a XFontStruct structure.
27523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
27533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
27543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
27553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window_info: Specifies a pointer to a X11 XWindowInfo structure.
27563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
27573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
2758bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XFreeResources(Display *display,XVisualInfo *visual_info,
27593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XStandardColormap *map_info,XPixelInfo *pixel,XFontStruct *font_info,
27603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XResourceInfo *resource_info,XWindowInfo *window_info)
27613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
27623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
27633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
27643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(resource_info != (XResourceInfo *) NULL);
27653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window_info != (XWindowInfo *) NULL)
27663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
27673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
27683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Free X image.
27693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
27703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window_info->ximage != (XImage *) NULL)
27713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDestroyImage(window_info->ximage);
27723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window_info->id != (Window) NULL)
27733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
27743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
27753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Free destroy window and free cursors.
27763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
27773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (window_info->id != XRootWindow(display,visual_info->screen))
27783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XDestroyWindow(display,window_info->id);
27793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (window_info->annotate_context != (GC) NULL)
27803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XFreeGC(display,window_info->annotate_context);
27813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (window_info->highlight_context != (GC) NULL)
27823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XFreeGC(display,window_info->highlight_context);
27833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (window_info->widget_context != (GC) NULL)
27843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XFreeGC(display,window_info->widget_context);
27853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (window_info->cursor != (Cursor) NULL)
27863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XFreeCursor(display,window_info->cursor);
27873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          window_info->cursor=(Cursor) NULL;
27883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (window_info->busy_cursor != (Cursor) NULL)
27893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XFreeCursor(display,window_info->busy_cursor);
27903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          window_info->busy_cursor=(Cursor) NULL;
27913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
27923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
27933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
27943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Free font.
27953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
27963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (font_info != (XFontStruct *) NULL)
2797aafc19213cef0b96cd237edb693a33fd1a2466eacristy    {
2798aafc19213cef0b96cd237edb693a33fd1a2466eacristy      (void) XFreeFont(display,font_info);
2799aafc19213cef0b96cd237edb693a33fd1a2466eacristy      font_info=(XFontStruct *) NULL;
2800aafc19213cef0b96cd237edb693a33fd1a2466eacristy    }
28013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (map_info != (XStandardColormap *) NULL)
28023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
28033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
28043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Free X Standard Colormap.
28053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
28063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (resource_info->map_type == (char *) NULL)
28073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XFreeStandardColormap(display,visual_info,map_info,pixel);
28083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XFree((void *) map_info);
28093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
28103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
28113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Free X visual info.
28123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
28133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (visual_info != (XVisualInfo *) NULL)
28143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XFree((void *) visual_info);
28153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (resource_info->close_server != MagickFalse)
28163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XCloseDisplay(display);
28173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
28183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
28193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
28203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
28213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
28223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
28233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
28243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X F r e e S t a n d a r d C o l o r m a p                                 %
28253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
28263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
28273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
28283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
28293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
28303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XFreeStandardColormap() frees an X11 colormap.
28313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
28323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XFreeStandardColormap method is:
28333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
28343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XFreeStandardColormap(Display *display,
28353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const XVisualInfo *visual_info,XStandardColormap *map_info,
28363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        XPixelInfo *pixel)
28373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
28383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
28393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
28403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server; returned from
28413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
28423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
28433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o visual_info: Specifies a pointer to a X11 XVisualInfo structure;
28443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      returned from XGetVisualInfo.
28453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
28463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o map_info: If map_type is specified, this structure is initialized
28473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      with info from the Standard Colormap.
28483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
28493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o pixel: Specifies a pointer to a XPixelInfo structure.
28503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
28513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
2852bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XFreeStandardColormap(Display *display,
28533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const XVisualInfo *visual_info,XStandardColormap *map_info,XPixelInfo *pixel)
28543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
28553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
28563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Free colormap.
28573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
28583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
28593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
28603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(visual_info != (XVisualInfo *) NULL);
28613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(map_info != (XStandardColormap *) NULL);
28623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFlush(display);
28633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (map_info->colormap != (Colormap) NULL)
28643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
28653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (map_info->colormap != XDefaultColormap(display,visual_info->screen))
28663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XFreeColormap(display,map_info->colormap);
28673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
28683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (pixel != (XPixelInfo *) NULL)
28693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((visual_info->klass != TrueColor) &&
28703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (visual_info->klass != DirectColor))
28713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XFreeColors(display,map_info->colormap,pixel->pixels,
28723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (int) pixel->colors,0);
28733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
28743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  map_info->colormap=(Colormap) NULL;
28753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (pixel != (XPixelInfo *) NULL)
28763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
2877f2faecf9facdbbb14fcba373365f9f691a9658e0cristy      if (pixel->pixels != (unsigned long *) NULL)
2878f2faecf9facdbbb14fcba373365f9f691a9658e0cristy        pixel->pixels=(unsigned long *) RelinquishMagickMemory(pixel->pixels);
2879f2faecf9facdbbb14fcba373365f9f691a9658e0cristy      pixel->pixels=(unsigned long *) NULL;
28803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
28813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
28823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
28833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
28843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
28853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
28863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
28873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
28883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X G e t A n n o t a t e I n f o                                           %
28893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
28903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
28913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
28923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
28933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
28943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XGetAnnotateInfo() initializes the AnnotateInfo structure.
28953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
28963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XGetAnnotateInfo method is:
28973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
28983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XGetAnnotateInfo(XAnnotateInfo *annotate_info)
28993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
29003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
29013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
29023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o annotate_info: Specifies a pointer to a XAnnotateInfo structure.
29033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
29043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
2905bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XGetAnnotateInfo(XAnnotateInfo *annotate_info)
29063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
29073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
29083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize annotate structure.
29093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
29103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
29113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(annotate_info != (XAnnotateInfo *) NULL);
29123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  annotate_info->x=0;
29133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  annotate_info->y=0;
29143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  annotate_info->width=0;
29153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  annotate_info->height=0;
29163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  annotate_info->stencil=ForegroundStencil;
29173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  annotate_info->degrees=0.0;
29183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  annotate_info->font_info=(XFontStruct *) NULL;
29193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  annotate_info->text=(char *) NULL;
29203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *annotate_info->geometry='\0';
29213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  annotate_info->previous=(XAnnotateInfo *) NULL;
29223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  annotate_info->next=(XAnnotateInfo *) NULL;
29233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XSupportsLocale();
29243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XSetLocaleModifiers("");
29253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
29263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
29273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
29283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
29293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
29303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
29313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
29323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X G e t M a p I n f o                                                     %
29333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
29343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
29353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
29363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
29373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
29383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XGetMapInfo() initializes the XStandardColormap structure.
29393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
29403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XStandardColormap method is:
29413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
29423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XGetMapInfo(const XVisualInfo *visual_info,const Colormap colormap,
29433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        XStandardColormap *map_info)
29443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
29453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
29463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
29473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o colormap: Specifies the ID of the X server colormap.
29483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
29493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o visual_info: Specifies a pointer to a X11 XVisualInfo structure;
29503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      returned from XGetVisualInfo.
29513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
29523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o map_info: Specifies a pointer to a X11 XStandardColormap structure.
29533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
29543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
2955bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XGetMapInfo(const XVisualInfo *visual_info,
29563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const Colormap colormap,XStandardColormap *map_info)
29573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
29583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
29593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize map info.
29603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
29613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
29623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(visual_info != (XVisualInfo *) NULL);
29633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(map_info != (XStandardColormap *) NULL);
29643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  map_info->colormap=colormap;
29653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  map_info->red_max=visual_info->red_mask;
2966bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  map_info->red_mult=(size_t) (map_info->red_max != 0 ? 1 : 0);
29673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (map_info->red_max != 0)
29683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    while ((map_info->red_max & 0x01) == 0)
29693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
29703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      map_info->red_max>>=1;
29713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      map_info->red_mult<<=1;
29723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
29733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  map_info->green_max=visual_info->green_mask;
2974bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  map_info->green_mult=(size_t) (map_info->green_max != 0 ? 1 : 0);
29753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (map_info->green_max != 0)
29763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    while ((map_info->green_max & 0x01) == 0)
29773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
29783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      map_info->green_max>>=1;
29793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      map_info->green_mult<<=1;
29803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
29813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  map_info->blue_max=visual_info->blue_mask;
2982bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  map_info->blue_mult=(size_t) (map_info->blue_max != 0 ? 1 : 0);
29833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (map_info->blue_max != 0)
29843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    while ((map_info->blue_max & 0x01) == 0)
29853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
29863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      map_info->blue_max>>=1;
29873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      map_info->blue_mult<<=1;
29883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
29893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  map_info->base_pixel=0;
29903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
29913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
29923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
29933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
29943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
29953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
29963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
29973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X G e t P i x e l I n f o                                                 %
29983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
29993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
30003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
30013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
30023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3003101ab708b0574518ac5715da4d3915400e9df79acristy%  XGetPixelInfo() initializes the PixelInfo structure.
30043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
30054c08aed51c5899665ade97263692328eea4af106cristy%  The format of the XGetPixelInfo method is:
30063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
30074c08aed51c5899665ade97263692328eea4af106cristy%      void XGetPixelInfo(Display *display,const XVisualInfo *visual_info,
30083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const XStandardColormap *map_info,const XResourceInfo *resource_info,
30093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        Image *image,XPixelInfo *pixel)
30103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        pixel)
30113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
30123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
30133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
30143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server; returned from
30153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
30163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
30173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o visual_info: Specifies a pointer to a X11 XVisualInfo structure;
30183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      returned from XGetVisualInfo.
30193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
30203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o map_info: If map_type is specified, this structure is initialized
30213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      with info from the Standard Colormap.
30223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
30233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
30243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
30253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image: the image.
30263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
30273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o pixel: Specifies a pointer to a XPixelInfo structure.
30283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
30293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
3030bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XGetPixelInfo(Display *display,
30313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const XVisualInfo *visual_info,const XStandardColormap *map_info,
30323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const XResourceInfo *resource_info,Image *image,XPixelInfo *pixel)
30333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
30343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static const char
30353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *PenColors[MaxNumberPens]=
30363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
30373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "#000000000000",  /* black */
30383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "#00000000ffff",  /* blue */
30393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "#0000ffffffff",  /* cyan */
30403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "#0000ffff0000",  /* green */
30413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "#bdbdbdbdbdbd",  /* gray */
30423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "#ffff00000000",  /* red */
30433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "#ffff0000ffff",  /* magenta */
30443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "#ffffffff0000",  /* yellow */
30453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "#ffffffffffff",  /* white */
30463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "#bdbdbdbdbdbd",  /* gray */
30473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "#bdbdbdbdbdbd"   /* gray */
30483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    };
30493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
30503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Colormap
30513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    colormap;
30523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3053bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
30543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
30553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
30563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
30573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
30583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
30593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
30603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    packets;
30613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
30623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
30633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize pixel info.
30643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
30653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
30663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
30673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(visual_info != (XVisualInfo *) NULL);
30683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(map_info != (XStandardColormap *) NULL);
30693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(resource_info != (XResourceInfo *) NULL);
30703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(pixel != (XPixelInfo *) NULL);
30713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->colors=0;
30723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image != (Image *) NULL)
30733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (image->storage_class == PseudoClass)
3074c57f694b2d04975a0e501613e34368c464708c19cristy      pixel->colors=(ssize_t) image->colors;
30753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  packets=(unsigned int)
30763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    MagickMax((int) pixel->colors,visual_info->colormap_size)+MaxNumberPens;
3077f2faecf9facdbbb14fcba373365f9f691a9658e0cristy  if (pixel->pixels != (unsigned long *) NULL)
3078f2faecf9facdbbb14fcba373365f9f691a9658e0cristy    pixel->pixels=(unsigned long *) RelinquishMagickMemory(pixel->pixels);
3079f2faecf9facdbbb14fcba373365f9f691a9658e0cristy  pixel->pixels=(unsigned long *) AcquireQuantumMemory(packets,
30803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    sizeof(pixel->pixels));
3081f2faecf9facdbbb14fcba373365f9f691a9658e0cristy  if (pixel->pixels == (unsigned long *) NULL)
30823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowXWindowFatalException(ResourceLimitFatalError,"UnableToGetPixelInfo",
30833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image->filename);
30843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
30853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Set foreground color.
30863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
30873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  colormap=map_info->colormap;
30883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XParseColor(display,colormap,(char *) ForegroundColor,
30893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    &pixel->foreground_color);
30903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XParseColor(display,colormap,resource_info->foreground_color,
30913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    &pixel->foreground_color);
30923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status == False)
30933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowXWindowFatalException(XServerError,"ColorIsNotKnownToServer",
30943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      resource_info->foreground_color);
30953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->foreground_color.pixel=
30963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    XStandardPixel(map_info,&pixel->foreground_color);
30973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->foreground_color.flags=(char) (DoRed | DoGreen | DoBlue);
30983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
30993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Set background color.
31003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
31013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XParseColor(display,colormap,"#d6d6d6d6d6d6",&pixel->background_color);
31023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XParseColor(display,colormap,resource_info->background_color,
31033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    &pixel->background_color);
31043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status == False)
31053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowXWindowFatalException(XServerError,"ColorIsNotKnownToServer",
31063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      resource_info->background_color);
31073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->background_color.pixel=
31083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    XStandardPixel(map_info,&pixel->background_color);
31093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->background_color.flags=(char) (DoRed | DoGreen | DoBlue);
31103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
31113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Set border color.
31123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
31133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XParseColor(display,colormap,(char *) BorderColor,
31143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    &pixel->border_color);
31153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XParseColor(display,colormap,resource_info->border_color,
31163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    &pixel->border_color);
31173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status == False)
31183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowXWindowFatalException(XServerError,"ColorIsNotKnownToServer",
31193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      resource_info->border_color);
31203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->border_color.pixel=XStandardPixel(map_info,&pixel->border_color);
31213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->border_color.flags=(char) (DoRed | DoGreen | DoBlue);
31223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
31233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Set matte color.
31243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
31253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->matte_color=pixel->background_color;
31263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (resource_info->matte_color != (char *) NULL)
31273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
31283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
31293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Matte color is specified as a X resource or command line argument.
31303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
31313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=XParseColor(display,colormap,resource_info->matte_color,
31323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        &pixel->matte_color);
31333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (status == False)
31343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowXWindowFatalException(XServerError,"ColorIsNotKnownToServer",
31353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          resource_info->matte_color);
31363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      pixel->matte_color.pixel=XStandardPixel(map_info,&pixel->matte_color);
31373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      pixel->matte_color.flags=(char) (DoRed | DoGreen | DoBlue);
31383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
31393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
31403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Set highlight color.
31413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
31423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->highlight_color.red=(unsigned short) ((
31433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel->matte_color.red*ScaleQuantumToShort(HighlightModulate))/65535L+
31443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (ScaleQuantumToShort((Quantum) (QuantumRange-HighlightModulate))));
31453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->highlight_color.green=(unsigned short) ((
31463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel->matte_color.green*ScaleQuantumToShort(HighlightModulate))/65535L+
31473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (ScaleQuantumToShort((Quantum) (QuantumRange-HighlightModulate))));
31483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->highlight_color.blue=(unsigned short) ((
31493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel->matte_color.blue*ScaleQuantumToShort(HighlightModulate))/65535L+
31503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (ScaleQuantumToShort((Quantum) (QuantumRange-HighlightModulate))));
31513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->highlight_color.pixel=
31523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    XStandardPixel(map_info,&pixel->highlight_color);
31533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->highlight_color.flags=(char) (DoRed | DoGreen | DoBlue);
31543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
31553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Set shadow color.
31563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
31573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->shadow_color.red=(unsigned short) (((MagickRealType)
31583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel->matte_color.red*ScaleQuantumToShort(ShadowModulate))/65535L);
31593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->shadow_color.green=(unsigned short) (((MagickRealType)
31603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel->matte_color.green*ScaleQuantumToShort(ShadowModulate))/65535L);
31613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->shadow_color.blue=(unsigned short) (((MagickRealType)
31623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel->matte_color.blue*ScaleQuantumToShort(ShadowModulate))/65535L);
31633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->shadow_color.pixel=XStandardPixel(map_info,&pixel->shadow_color);
31643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->shadow_color.flags=(char) (DoRed | DoGreen | DoBlue);
31653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
31663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Set depth color.
31673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
31683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->depth_color.red=(unsigned short) (((MagickRealType)
31693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel->matte_color.red*ScaleQuantumToShort(DepthModulate))/65535L);
31703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->depth_color.green=(unsigned short) (((MagickRealType)
31713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel->matte_color.green*ScaleQuantumToShort(DepthModulate))/65535L);
31723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->depth_color.blue=(unsigned short) (((MagickRealType)
31733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel->matte_color.blue*ScaleQuantumToShort(DepthModulate))/65535L);
31743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->depth_color.pixel=XStandardPixel(map_info,&pixel->depth_color);
31753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->depth_color.flags=(char) (DoRed | DoGreen | DoBlue);
31763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
31773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Set trough color.
31783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
31793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->trough_color.red=(unsigned short) (((MagickRealType)
31803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel->matte_color.red*ScaleQuantumToShort(TroughModulate))/65535L);
31813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->trough_color.green=(unsigned short) (((MagickRealType)
31823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel->matte_color.green*ScaleQuantumToShort(TroughModulate))/65535L);
31833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->trough_color.blue=(unsigned short) (((MagickRealType)
31843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel->matte_color.blue*ScaleQuantumToShort(TroughModulate))/65535L);
31853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->trough_color.pixel=XStandardPixel(map_info,&pixel->trough_color);
31863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->trough_color.flags=(char) (DoRed | DoGreen | DoBlue);
31873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
31883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Set pen color.
31893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
31903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; i < MaxNumberPens; i++)
31913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
31923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XParseColor(display,colormap,(char *) PenColors[i],
31933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      &pixel->pen_colors[i]);
31943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status=XParseColor(display,colormap,resource_info->pen_colors[i],
31953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      &pixel->pen_colors[i]);
31963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (status == False)
31973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowXWindowFatalException(XServerError,"ColorIsNotKnownToServer",
31983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        resource_info->pen_colors[i]);
31993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel->pen_colors[i].pixel=XStandardPixel(map_info,&pixel->pen_colors[i]);
32003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel->pen_colors[i].flags=(char) (DoRed | DoGreen | DoBlue);
32013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
32023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->box_color=pixel->background_color;
32033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->pen_color=pixel->foreground_color;
32043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->box_index=0;
32053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->pen_index=1;
32063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image != (Image *) NULL)
32073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
32083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((resource_info->gamma_correct != MagickFalse) &&
32093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (image->gamma != 0.0))
32103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
32113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          GeometryInfo
32123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            geometry_info;
32133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
32143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          MagickStatusType
32153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            flags;
32163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
32173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
32183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Initialize map relative to display and image gamma.
32193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
32203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          flags=ParseGeometry(resource_info->display_gamma,&geometry_info);
32213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          red_gamma=geometry_info.rho;
32223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          green_gamma=geometry_info.sigma;
32233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((flags & SigmaValue) == 0)
32243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            green_gamma=red_gamma;
32253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          blue_gamma=geometry_info.xi;
32263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((flags & XiValue) == 0)
32273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            blue_gamma=red_gamma;
32283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          red_gamma*=image->gamma;
32293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          green_gamma*=image->gamma;
32303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          blue_gamma*=image->gamma;
32313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
32323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (image->storage_class == PseudoClass)
32333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
32343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
32353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Initialize pixel array for images of type PseudoClass.
32363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
3237bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy          for (i=0; i < (ssize_t) image->colors; i++)
32384c08aed51c5899665ade97263692328eea4af106cristy            pixel->pixels[i]=XGammaPacket(map_info,image->colormap+i);
32393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (i=0; i < MaxNumberPens; i++)
32403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            pixel->pixels[image->colors+i]=pixel->pen_colors[i].pixel;
32413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          pixel->colors+=MaxNumberPens;
32423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
32433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
32443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
32453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
32463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
32473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
32483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
32493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
32503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
32513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X G e t R e s o u r c e C l a s s                                         %
32523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
32533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
32543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
32553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
32563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
32573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XGetResourceClass() queries the X server for the specified resource name or
32583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  class.  If the resource name or class is not defined in the database, the
32593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  supplied default value is returned.
32603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
32613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XGetResourceClass method is:
32623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
32633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char *XGetResourceClass(XrmDatabase database,const char *client_name,
32643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *keyword,char *resource_default)
32653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
32663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
32673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
32683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o database: Specifies a resource database; returned from
32693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XrmGetStringDatabase.
32703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
32713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o client_name:  Specifies the application name used to retrieve resource
32723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      info from the X server database.
32733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
32743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o keyword: Specifies the keyword of the value being retrieved.
32753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
32763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o resource_default: Specifies the default value to return if the query
32773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      fails to find the specified keyword/class.
32783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
32793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
32803ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport char *XGetResourceClass(XrmDatabase database,
32813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *client_name,const char *keyword,char *resource_default)
32823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
32833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
32843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    resource_class[MaxTextExtent],
32853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    resource_name[MaxTextExtent];
32863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
32873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static char
32883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *resource_type;
32893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
32903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
32913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
32923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
32933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XrmValue
32943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    resource_value;
32953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
32963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (database == (XrmDatabase) NULL)
32973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(resource_default);
32983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *resource_name='\0';
32993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *resource_class='\0';
33003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (keyword != (char *) NULL)
33013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
33023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      int
33033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        c,
33043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        k;
33053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
33063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
33073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Initialize resource keyword and class.
33083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
3309b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy      (void) FormatLocaleString(resource_name,MaxTextExtent,"%s.%s",
33103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        client_name,keyword);
33113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      c=(int) (*client_name);
33123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((c >= XK_a) && (c <= XK_z))
33133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        c-=(XK_a-XK_A);
33143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
33153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((c >= XK_agrave) && (c <= XK_odiaeresis))
33163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          c-=(XK_agrave-XK_Agrave);
33173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        else
33183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((c >= XK_oslash) && (c <= XK_thorn))
33193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            c-=(XK_oslash-XK_Ooblique);
33203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      k=(int) (*keyword);
33213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((k >= XK_a) && (k <= XK_z))
33223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        k-=(XK_a-XK_A);
33233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
33243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((k >= XK_agrave) && (k <= XK_odiaeresis))
33253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          k-=(XK_agrave-XK_Agrave);
33263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        else
33273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((k >= XK_oslash) && (k <= XK_thorn))
33283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            k-=(XK_oslash-XK_Ooblique);
3329b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy      (void) FormatLocaleString(resource_class,MaxTextExtent,"%c%s.%c%s",c,
33303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        client_name+1,k,keyword+1);
33313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
33323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XrmGetResource(database,resource_name,resource_class,&resource_type,
33333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    &resource_value);
33343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status == False)
33353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(resource_default);
33363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(resource_value.addr);
33373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
33383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
33393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
33403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
33413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
33423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
33433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
33443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X G e t R e s o u r c e D a t a b a s e                                   %
33453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
33463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
33473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
33483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
33493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
33503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XGetResourceDatabase() creates a new resource database and initializes it.
33513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
33523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XGetResourceDatabase method is:
33533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
33543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XrmDatabase XGetResourceDatabase(Display *display,
33553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *client_name)
33563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
33573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
33583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
33593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o database: XGetResourceDatabase() returns the database after it is
33603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      initialized.
33613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
33623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
33633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
33643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
33653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o client_name:  Specifies the application name used to retrieve resource
33663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      info from the X server database.
33673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
33683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
33693ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport XrmDatabase XGetResourceDatabase(Display *display,
33703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *client_name)
33713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
33723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
33733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    filename[MaxTextExtent];
33743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
33753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
33763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    c;
33773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
33783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const char
33793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
33803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
33813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XrmDatabase
33823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    resource_database,
33833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    server_database;
33843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
33853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (display == (Display *) NULL)
33863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((XrmDatabase) NULL);
33873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(client_name != (char *) NULL);
33883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
33893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize resource database.
33903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
33913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XrmInitialize();
33923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XGetDefault(display,(char *) client_name,"dummy");
33933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_database=XrmGetDatabase(display);
33943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
33953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Combine application database.
33963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
33973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (client_name != (char *) NULL)
33983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
33993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
34003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Get basename of client.
34013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
34023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      p=client_name+(strlen(client_name)-1);
34033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      while ((p > client_name) && (*p != '/'))
34043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        p--;
34053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (*p == '/')
34063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        client_name=p+1;
34073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
34083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  c=(int) (*client_name);
34093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((c >= XK_a) && (c <= XK_z))
34103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    c-=(XK_a-XK_A);
34113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
34123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((c >= XK_agrave) && (c <= XK_odiaeresis))
34133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      c-=(XK_agrave-XK_Agrave);
34143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    else
34153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((c >= XK_oslash) && (c <= XK_thorn))
34163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        c-=(XK_oslash-XK_Ooblique);
34173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(X11_APPLICATION_PATH)
3418b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleString(filename,MaxTextExtent,"%s%c%s",
34193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    X11_APPLICATION_PATH,c,client_name+1);
34203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XrmCombineFileDatabase(filename,&resource_database,MagickFalse);
34213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
34223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (XResourceManagerString(display) != (char *) NULL)
34233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
34243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
34253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Combine server database.
34263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
34273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      server_database=XrmGetStringDatabase(XResourceManagerString(display));
34283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XrmCombineDatabase(server_database,&resource_database,MagickFalse);
34293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
34303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
34313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Merge user preferences database.
34323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
34333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(X11_PREFERENCES_PATH)
3434b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleString(filename,MaxTextExtent,"%s%src",
34353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    X11_PREFERENCES_PATH,client_name);
34363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ExpandFilename(filename);
34373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XrmCombineFileDatabase(filename,&resource_database,MagickFalse);
34383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
34393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(resource_database);
34403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
34413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
34423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
34433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
34443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
34453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
34463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
34473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X G e t R e s o u r c e I n f o                                           %
34483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
34493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
34503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
34513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
34523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
34533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XGetResourceInfo(image_info,) initializes the ResourceInfo structure.
34543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
34553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XGetResourceInfo method is:
34563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
34573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XGetResourceInfo(const ImageInfo *image_info,XrmDatabase database,
34583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *client_name,XResourceInfo *resource_info)
34593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
34603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
34613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
34623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image_info: the image info.
34633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
34643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o database: Specifies a resource database; returned from
34653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XrmGetStringDatabase.
34663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
34673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o client_name:  Specifies the application name used to retrieve
34683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      resource info from the X server database.
34693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
34703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
34713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
34723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
34733ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport void XGetResourceInfo(const ImageInfo *image_info,
34743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XrmDatabase database,const char *client_name,XResourceInfo *resource_info)
34753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
34763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
347700976d8abcff7a3bc7b986b8105dde8d091dee61cristy    *directory,
34783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *resource_value;
34793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
34803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
34813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize resource info fields.
34823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
34833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
34843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(resource_info != (XResourceInfo *) NULL);
34853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ResetMagickMemory(resource_info,0,sizeof(*resource_info));
34863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->resource_database=database;
34873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->image_info=(ImageInfo *) image_info;
34883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) SetImageInfoProgressMonitor(resource_info->image_info,
34893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    XMagickProgressMonitor,(void *) NULL);
34903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->quantize_info=CloneQuantizeInfo((QuantizeInfo *) NULL);
34913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->close_server=MagickTrue;
34923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->client_name=AcquireString(client_name);
34933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_value=XGetResourceClass(database,client_name,"backdrop",
34943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "False");
34953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->backdrop=IsMagickTrue(resource_value);
34963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->background_color=XGetResourceInstance(database,client_name,
34973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    "background",(char *) "#d6d6d6d6d6d6");
34983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->border_color=XGetResourceInstance(database,client_name,
34993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    "borderColor",BorderColor);
35003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_value=XGetResourceClass(database,client_name,"borderWidth",
35013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "2");
350200976d8abcff7a3bc7b986b8105dde8d091dee61cristy  resource_info->border_width=(unsigned int) StringToUnsignedLong(
350300976d8abcff7a3bc7b986b8105dde8d091dee61cristy    resource_value);
35043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_value=XGetResourceClass(database,client_name,"colormap",
35053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "shared");
35063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->colormap=UndefinedColormap;
35073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (LocaleCompare("private",resource_value) == 0)
35083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    resource_info->colormap=PrivateColormap;
35093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (LocaleCompare("shared",resource_value) == 0)
35103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    resource_info->colormap=SharedColormap;
35113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (resource_info->colormap == UndefinedColormap)
35123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowXWindowFatalException(OptionError,"UnrecognizedColormapType",
35133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      resource_value);
35143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_value=XGetResourceClass(database,client_name,
35153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    "colorRecovery",(char *) "False");
35163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->color_recovery=IsMagickTrue(resource_value);
35173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_value=XGetResourceClass(database,client_name,"confirmExit",
35183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "False");
35193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->confirm_exit=IsMagickTrue(resource_value);
35203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_value=XGetResourceClass(database,client_name,"confirmEdit",
35213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "False");
35223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->confirm_edit=IsMagickTrue(resource_value);
3523ba0c32599a8e592fffab86dd9b8ee367ca573c22cristy  resource_value=XGetResourceClass(database,client_name,"delay",(char *) "1");
3524e27293e706ca05b6b121e9512a83b16f7ad887f2cristy  resource_info->delay=(unsigned int) StringToUnsignedLong(resource_value);
35253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->display_gamma=XGetResourceClass(database,client_name,
35263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    "displayGamma",(char *) "2.2");
35273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_value=XGetResourceClass(database,client_name,"displayWarnings",
35283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "True");
35293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->display_warnings=IsMagickTrue(resource_value);
35303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->font=XGetResourceClass(database,client_name,"font",
35313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) NULL);
35323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->font=XGetResourceClass(database,client_name,"fontList",
35333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    resource_info->font);
35343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->font_name[0]=XGetResourceClass(database,client_name,"font1",
35353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "fixed");
35363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->font_name[1]=XGetResourceClass(database,client_name,"font2",
35373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "variable");
35383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->font_name[2]=XGetResourceClass(database,client_name,"font3",
35393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "5x8");
35403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->font_name[3]=XGetResourceClass(database,client_name,"font4",
35413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "6x10");
35423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->font_name[4]=XGetResourceClass(database,client_name,"font5",
35433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "7x13bold");
35443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->font_name[5]=XGetResourceClass(database,client_name,"font6",
35453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "8x13bold");
35463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->font_name[6]=XGetResourceClass(database,client_name,"font7",
35473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "9x15bold");
35483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->font_name[7]=XGetResourceClass(database,client_name,"font8",
35493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "10x20");
35503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->font_name[8]=XGetResourceClass(database,client_name,"font9",
35513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "12x24");
35523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->font_name[9]=XGetResourceClass(database,client_name,"font0",
35533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "fixed");
35543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->font_name[10]=XGetResourceClass(database,client_name,"font0",
35553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "fixed");
35563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->foreground_color=XGetResourceInstance(database,client_name,
35573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    "foreground",ForegroundColor);
35583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_value=XGetResourceClass(database,client_name,"gammaCorrect",
35593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "True");
35603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->gamma_correct=IsMagickTrue(resource_value);
35613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->image_geometry=ConstantString(XGetResourceClass(database,
35623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    client_name,"geometry",(char *) NULL));
35633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_value=XGetResourceClass(database,client_name,"gravity",
35643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "Center");
3565042ee78fa9004bf1ac6a95f09d9d1faca631dda1cristy  resource_info->gravity=(GravityType) ParseCommandOption(MagickGravityOptions,
35663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    MagickFalse,resource_value);
356700976d8abcff7a3bc7b986b8105dde8d091dee61cristy  directory=getcwd(resource_info->home_directory,MaxTextExtent);
356800976d8abcff7a3bc7b986b8105dde8d091dee61cristy  (void) directory;
35693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->icon_geometry=XGetResourceClass(database,client_name,
35703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    "iconGeometry",(char *) NULL);
35713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_value=XGetResourceClass(database,client_name,"iconic",
35723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "False");
35733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->iconic=IsMagickTrue(resource_value);
35743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_value=XGetResourceClass(database,client_name,"immutable",
35753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    LocaleCompare(client_name,"PerlMagick") == 0 ? (char *) "True" :
35763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "False");
35773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->immutable=IsMagickTrue(resource_value);
35783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_value=XGetResourceClass(database,client_name,"magnify",
35793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "3");
3580e27293e706ca05b6b121e9512a83b16f7ad887f2cristy  resource_info->magnify=(unsigned int) StringToUnsignedLong(resource_value);
35813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->map_type=XGetResourceClass(database,client_name,"map",
35823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) NULL);
35833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->matte_color=XGetResourceInstance(database,client_name,
35843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    "mattecolor",(char *) NULL);
35853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->name=ConstantString(XGetResourceClass(database,client_name,
35863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    "name",(char *) NULL));
35873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->pen_colors[0]=XGetResourceClass(database,client_name,"pen1",
35883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "black");
35893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->pen_colors[1]=XGetResourceClass(database,client_name,"pen2",
35903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "blue");
35913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->pen_colors[2]=XGetResourceClass(database,client_name,"pen3",
35923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "cyan");
35933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->pen_colors[3]=XGetResourceClass(database,client_name,"pen4",
35943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "green");
35953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->pen_colors[4]=XGetResourceClass(database,client_name,"pen5",
35963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "gray");
35973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->pen_colors[5]=XGetResourceClass(database,client_name,"pen6",
35983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "red");
35993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->pen_colors[6]=XGetResourceClass(database,client_name,"pen7",
36003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "magenta");
36013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->pen_colors[7]=XGetResourceClass(database,client_name,"pen8",
36023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "yellow");
36033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->pen_colors[8]=XGetResourceClass(database,client_name,"pen9",
36043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "white");
36053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->pen_colors[9]=XGetResourceClass(database,client_name,"pen0",
36063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "gray");
36073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->pen_colors[10]=XGetResourceClass(database,client_name,"pen0",
36083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "gray");
36093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_value=XGetResourceClass(database,client_name,"pause",(char *) "0");
3610e27293e706ca05b6b121e9512a83b16f7ad887f2cristy  resource_info->pause=(unsigned int) StringToUnsignedLong(resource_value);
36113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_value=XGetResourceClass(database,client_name,"quantum",(char *) "1");
3612f2f2727f17ecbb23d902f70bb98f81faabc92dbdcristy  resource_info->quantum=StringToLong(resource_value);
36133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->text_font=XGetResourceClass(database,client_name,(char *)
36143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    "font",(char *) "fixed");
36153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->text_font=XGetResourceClass(database,client_name,
36163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    "textFontList",resource_info->text_font);
36173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->title=XGetResourceClass(database,client_name,"title",
36183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) NULL);
36193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_value=XGetResourceClass(database,client_name,"undoCache",
36203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "16");
3621e27293e706ca05b6b121e9512a83b16f7ad887f2cristy  resource_info->undo_cache=(unsigned int) StringToUnsignedLong(resource_value);
36223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_value=XGetResourceClass(database,client_name,"update",
36233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "False");
36243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->update=IsMagickTrue(resource_value);
36253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_value=XGetResourceClass(database,client_name,"usePixmap",
36263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "True");
36273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->use_pixmap=IsMagickTrue(resource_value);
36283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_value=XGetResourceClass(database,client_name,"sharedMemory",
36293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "True");
36303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->use_shared_memory=IsMagickTrue(resource_value);
36313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->visual_type=XGetResourceClass(database,client_name,"visual",
36323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) NULL);
36333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->window_group=XGetResourceClass(database,client_name,
36343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    "windowGroup",(char *) NULL);
36353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->window_id=XGetResourceClass(database,client_name,"window",
36363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) NULL);
36373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->write_filename=XGetResourceClass(database,client_name,
36383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    "writeFilename",(char *) NULL);
36393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
36403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
36413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
36423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
36433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
36443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
36453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
36463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X G e t R e s o u r c e I n s t a n c e                                   %
36473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
36483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
36493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
36503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
36513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
36523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XGetResourceInstance() queries the X server for the specified resource name.
36533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  If the resource name is not defined in the database, the supplied default
36543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  value is returned.
36553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
36563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XGetResourceInstance method is:
36573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
36583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char *XGetResourceInstance(XrmDatabase database,const char *client_name,
36593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *keyword,const char *resource_default)
36603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
36613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
36623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
36633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o database: Specifies a resource database; returned from
36643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XrmGetStringDatabase.
36653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
36663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o client_name:  Specifies the application name used to retrieve
36673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      resource info from the X server database.
36683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
36693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o keyword: Specifies the keyword of the value being retrieved.
36703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
36713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o resource_default: Specifies the default value to return if the query
36723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      fails to find the specified keyword/class.
36733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
36743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
36753ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport char *XGetResourceInstance(XrmDatabase database,
36763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *client_name,const char *keyword,const char *resource_default)
36773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
36783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
36793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *resource_type,
36803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    resource_name[MaxTextExtent];
36813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
36823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
36833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
36843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
36853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XrmValue
36863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    resource_value;
36873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
36883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (database == (XrmDatabase) NULL)
36893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((char *) resource_default);
36903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *resource_name='\0';
36913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (keyword != (char *) NULL)
3692b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleString(resource_name,MaxTextExtent,"%s.%s",client_name,
36933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      keyword);
36943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XrmGetResource(database,resource_name,"ImageMagick",&resource_type,
36953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    &resource_value);
36963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status == False)
36973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((char *) resource_default);
36983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(resource_value.addr);
36993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
37003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
37013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
37023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
37033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
37043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
37053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
37063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X G e t S c r e e n D e n s i t y                                         %
37073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
37083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
37093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
37103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
37113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
37123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XGetScreenDensity() returns the density of the X server screen in
37133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  dots-per-inch.
37143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
37153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XGetScreenDensity method is:
37163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
37173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char *XGetScreenDensity(Display *display)
37183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
37193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
37203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
37213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o density: XGetScreenDensity() returns the density of the X screen in
37223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      dots-per-inch.
37233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
37243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
37253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
37263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
37273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
37283ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport char *XGetScreenDensity(Display *display)
37293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
37303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
37313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    density[MaxTextExtent];
37323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
37333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  double
37343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x_density,
37353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y_density;
37363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
37373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
37383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Set density as determined by screen size.
37393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
37403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  x_density=((((double) DisplayWidth(display,XDefaultScreen(display)))*25.4)/
37413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ((double) DisplayWidthMM(display,XDefaultScreen(display))));
37423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  y_density=((((double) DisplayHeight(display,XDefaultScreen(display)))*25.4)/
37433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ((double) DisplayHeightMM(display,XDefaultScreen(display))));
3744b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleString(density,MaxTextExtent,"%gx%g",x_density,
37458cd5b3193212b4aebce08c4e7afbb66b09778029cristy    y_density);
37463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(GetPageGeometry(density));
37473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
37483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
37493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
37503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
37513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
37523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
37533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
37543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy+   X G e t S u b w i n d o w                                                 %
37553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
37563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
37573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
37583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
37593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
37603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XGetSubwindow() returns the subwindow of a window chosen the user with the
37613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  pointer and a button press.
37623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
37633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XGetSubwindow method is:
37643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
37653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      Window XGetSubwindow(Display *display,Window window,int x,int y)
37663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
37673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
37683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
37693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o subwindow: XGetSubwindow() returns NULL if no subwindow is found
37703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      otherwise the subwindow is returned.
37713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
37723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
37733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
37743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
37753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies a pointer to a Window.
37763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
37773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o x: the x coordinate of the pointer relative to the origin of the
37783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      window.
37793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
37803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o y: the y coordinate of the pointer relative to the origin of the
37813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      window.
37823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
37833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
37843ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Window XGetSubwindow(Display *display,Window window,int x,int y)
37853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
37863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
37873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x_offset,
37883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y_offset;
37893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
37903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
37913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
37923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
37933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Window
37943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    source_window,
37953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    target_window;
37963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
37973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
37983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  source_window=XRootWindow(display,XDefaultScreen(display));
37993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window == (Window) NULL)
38003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(source_window);
38013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  target_window=window;
38023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for ( ; ; )
38033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
38043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status=XTranslateCoordinates(display,source_window,window,x,y,
38053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      &x_offset,&y_offset,&target_window);
38063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (status != True)
38073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
38083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (target_window == (Window) NULL)
38093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
38103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    source_window=window;
38113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window=target_window;
38123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x=x_offset;
38133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y=y_offset;
38143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
38153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (target_window == (Window) NULL)
38163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    target_window=window;
38173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(target_window);
38183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
38193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
38203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
38213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
38223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
38233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
38243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
38253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X G e t W i n d o w C o l o r                                             %
38263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
38273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
38283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
38293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
38303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
38313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XGetWindowColor() returns the color of a pixel interactively chosen from the
38323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  X server.
38333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
38343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XGetWindowColor method is:
38353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
38363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType XGetWindowColor(Display *display,XWindows *windows,
38376710d8414f0ed06e4eaf9346366be72e2b4719efcristy%        char *name,ExceptionInfo *exception)
38383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
38393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
38403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
38413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
38423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
38433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
38443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o windows: Specifies a pointer to a XWindows structure.
38453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
38463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o name: the name of the color if found in the X Color Database is
38473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      returned in this character string.
38483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
38496710d8414f0ed06e4eaf9346366be72e2b4719efcristy%    o exception: return any errors or warnings in this structure.
38506710d8414f0ed06e4eaf9346366be72e2b4719efcristy%
38513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
3852bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate MagickBooleanType XGetWindowColor(Display *display,
38536710d8414f0ed06e4eaf9346366be72e2b4719efcristy  XWindows *windows,char *name,ExceptionInfo *exception)
38543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
38553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
38563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x,
38573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y;
38583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3859101ab708b0574518ac5715da4d3915400e9df79acristy  PixelInfo
38603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel;
38613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
38623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  RectangleInfo
38633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    crop_info;
38643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
38653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
38663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
38673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
38683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Window
38693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    child,
38703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    client_window,
38713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    root_window,
38723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    target_window;
38733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
38743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XColor
38753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    color;
38763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
38773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XImage
38783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *ximage;
38793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
38803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWindowAttributes
38813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window_attributes;
38823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
38833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
38843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Choose a pixel from the X server.
38853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
38863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
38873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(name != (char *) NULL);
38883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",name);
38893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *name='\0';
38903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  target_window=XSelectWindow(display,&crop_info);
38913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (target_window == (Window) NULL)
38923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
38933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  root_window=XRootWindow(display,XDefaultScreen(display));
38943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  client_window=target_window;
38953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (target_window != root_window)
38963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
38973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      unsigned int
38983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        d;
38993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
39003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
39013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Get client window.
39023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
39033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=XGetGeometry(display,target_window,&root_window,&x,&x,&d,&d,&d,&d);
39043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (status != False)
39053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
39063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          client_window=XClientWindow(display,target_window);
39073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          target_window=client_window;
39083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
39093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
39103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
39113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Verify window is viewable.
39123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
39133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XGetWindowAttributes(display,target_window,&window_attributes);
39143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((status == False) || (window_attributes.map_state != IsViewable))
39153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
39163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
39173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Get window X image.
39183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
39193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XTranslateCoordinates(display,root_window,target_window,
39203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (int) crop_info.x,(int) crop_info.y,&x,&y,&child);
39213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ximage=XGetImage(display,target_window,x,y,1,1,AllPlanes,ZPixmap);
39223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (ximage == (XImage *) NULL)
39233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
39243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  color.pixel=XGetPixel(ximage,0,0);
39253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XDestroyImage(ximage);
39263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
39273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Match color against the color database.
39283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
39293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XQueryColor(display,window_attributes.colormap,&color);
3930e42f658533644aecb733785ffd91b286d6778deacristy  pixel.red=(double) ScaleShortToQuantum(color.red);
3931e42f658533644aecb733785ffd91b286d6778deacristy  pixel.green=(double) ScaleShortToQuantum(color.green);
3932e42f658533644aecb733785ffd91b286d6778deacristy  pixel.blue=(double) ScaleShortToQuantum(color.blue);
39334c08aed51c5899665ade97263692328eea4af106cristy  pixel.alpha=OpaqueAlpha;
39343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) QueryColorname(windows->image.image,&pixel,X11Compliance,name,
39356710d8414f0ed06e4eaf9346366be72e2b4719efcristy    exception);
39363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickTrue);
39373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
39383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
39393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
39403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
39413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
39423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
39433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
39443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy+   X G e t W i n d o w I m a g e                                             %
39453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
39463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
39473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
39483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
39493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
39503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XGetWindowImage() reads an image from the target X window and returns it.
39513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XGetWindowImage() optionally descends the window hierarchy and overlays the
39523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  target image with each child image in an optimized fashion.  Any child
39533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  window that have the same visual, colormap, and are contained by its parent
39543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  are exempted.
39553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
39563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XGetWindowImage method is:
39573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
39583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      Image *XGetWindowImage(Display *display,const Window window,
39596710d8414f0ed06e4eaf9346366be72e2b4719efcristy%        const unsigned int borders,const unsigned int level,
39606710d8414f0ed06e4eaf9346366be72e2b4719efcristy%        ExceptionInfo *exception)
39613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
39623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
39633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
39643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
39653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
39663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
39673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies the window to obtain the image from.
39683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
39693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o borders: Specifies whether borders pixels are to be saved with
39703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      the image.
39713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
39723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o level: Specifies an unsigned integer representing the level of
39733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      decent in the window hierarchy.  This value must be zero or one on
39743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      the initial call to XGetWindowImage.  A value of zero returns after
39753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      one call.  A value of one causes the function to descend the window
39763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      hierarchy and overlay the target image with each subwindow image.
39773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
39786710d8414f0ed06e4eaf9346366be72e2b4719efcristy%    o exception: return any errors or warnings in this structure.
39796710d8414f0ed06e4eaf9346366be72e2b4719efcristy%
39803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
39813ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *XGetWindowImage(Display *display,const Window window,
39826710d8414f0ed06e4eaf9346366be72e2b4719efcristy  const unsigned int borders,const unsigned int level,ExceptionInfo *exception)
39833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
39843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  typedef struct _ColormapInfo
39853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
39863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Colormap
39873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      colormap;
39883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
39893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    XColor
39903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      *colors;
39913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
39923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    struct _ColormapInfo
39933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      *next;
39943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  } ColormapInfo;
39953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
39963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  typedef struct _WindowInfo
39973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
39983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Window
39993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window,
40003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      parent;
40013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
40023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Visual
40033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      *visual;
40043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
40053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Colormap
40063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      colormap;
40073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
40083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    XSegment
40093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      bounds;
40103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
40113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    RectangleInfo
40123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      crop_info;
40133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  } WindowInfo;
40143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
40153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
40163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    display_height,
40173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    display_width,
40183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    id,
40193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x_offset,
40203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y_offset;
40213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
40224c08aed51c5899665ade97263692328eea4af106cristy  Quantum
40234c08aed51c5899665ade97263692328eea4af106cristy    index;
40244c08aed51c5899665ade97263692328eea4af106cristy
40253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  RectangleInfo
40263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    crop_info;
40273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
40283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register int
40293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
40303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
40313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static ColormapInfo
40323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *colormap_info = (ColormapInfo *) NULL;
40333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
40343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static int
40353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    max_windows = 0,
40363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_windows = 0;
40373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
40383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static WindowInfo
40393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *window_info;
40403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
40413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
40423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
40433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
40443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Window
40453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    child,
40463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    root_window;
40473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
40483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWindowAttributes
40493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window_attributes;
40503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
40513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
40523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Verify window is viewable.
40533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
40543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
40553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
40563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XGetWindowAttributes(display,window,&window_attributes);
40573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((status == False) || (window_attributes.map_state != IsViewable))
40583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((Image *) NULL);
40593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
40603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Cropping rectangle is relative to root window.
40613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
40623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  root_window=XRootWindow(display,XDefaultScreen(display));
40633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XTranslateCoordinates(display,window,root_window,0,0,&x_offset,
40643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    &y_offset,&child);
4065bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  crop_info.x=(ssize_t) x_offset;
4066bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  crop_info.y=(ssize_t) y_offset;
4067bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  crop_info.width=(size_t) window_attributes.width;
4068bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  crop_info.height=(size_t) window_attributes.height;
40693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (borders != MagickFalse)
40703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
40713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
40723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Include border in image.
40733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
4074bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      crop_info.x-=(ssize_t) window_attributes.border_width;
4075bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      crop_info.y-=(ssize_t) window_attributes.border_width;
4076bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      crop_info.width+=(size_t) (window_attributes.border_width << 1);
4077bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      crop_info.height+=(size_t) (window_attributes.border_width << 1);
40783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
40793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
40803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Crop to root window.
40813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
40823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (crop_info.x < 0)
40833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
40843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      crop_info.width+=crop_info.x;
40853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      crop_info.x=0;
40863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
40873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (crop_info.y < 0)
40883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
40893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      crop_info.height+=crop_info.y;
40903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      crop_info.y=0;
40913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
40923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  display_width=XDisplayWidth(display,XDefaultScreen(display));
40933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((int) (crop_info.x+crop_info.width) > display_width)
4094bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    crop_info.width=(size_t) (display_width-crop_info.x);
40953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  display_height=XDisplayHeight(display,XDefaultScreen(display));
40963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((int) (crop_info.y+crop_info.height) > display_height)
4097bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    crop_info.height=(size_t) (display_height-crop_info.y);
40983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
40993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize window info attributes.
41003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
41013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (number_windows >= max_windows)
41023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
41033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
41043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Allocate or resize window info buffer.
41053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
41063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      max_windows+=1024;
41073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window_info == (WindowInfo *) NULL)
41083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        window_info=(WindowInfo *) AcquireQuantumMemory((size_t) max_windows,
41093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          sizeof(*window_info));
41103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
41113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        window_info=(WindowInfo *) ResizeQuantumMemory(window_info,(size_t)
41123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          max_windows,sizeof(*window_info));
41133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
41143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window_info == (WindowInfo *) NULL)
41153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
41163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowXWindowFatalException(ResourceLimitError,
41173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "MemoryAllocationFailed","...");
41183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return((Image *) NULL);
41193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
41203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  id=number_windows++;
41213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_info[id].window=window;
41223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_info[id].visual=window_attributes.visual;
41233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_info[id].colormap=window_attributes.colormap;
41243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_info[id].bounds.x1=(short) crop_info.x;
41253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_info[id].bounds.y1=(short) crop_info.y;
41263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_info[id].bounds.x2=(short) (crop_info.x+(int) crop_info.width-1);
41273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_info[id].bounds.y2=(short) (crop_info.y+(int) crop_info.height-1);
41283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  crop_info.x-=x_offset;
41293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  crop_info.y-=y_offset;
41303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_info[id].crop_info=crop_info;
41313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (level != 0)
41323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
41333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      unsigned int
41343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        number_children;
41353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
41363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Window
41373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *children;
41383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
41393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
41403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Descend the window hierarchy.
41413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
41423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=XQueryTree(display,window,&root_window,&window_info[id].parent,
41433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        &children,&number_children);
41443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (i=0; i < id; i++)
41453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((window_info[i].window == window_info[id].parent) &&
41463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (window_info[i].visual == window_info[id].visual) &&
41473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (window_info[i].colormap == window_info[id].colormap))
41483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
41493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if ((window_info[id].bounds.x1 <= window_info[i].bounds.x1) ||
41503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (window_info[id].bounds.x1 >= window_info[i].bounds.x2) ||
41513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (window_info[id].bounds.y1 <= window_info[i].bounds.y1) ||
41523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (window_info[id].bounds.y1 >= window_info[i].bounds.y2))
41533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
41543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /*
41553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  Eliminate windows not circumscribed by their parent.
41563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                */
41573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                number_windows--;
41583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
41593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
41603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
41613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((status == True) && (number_children != 0))
41623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
41633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (i=0; i < (int) number_children; i++)
41646710d8414f0ed06e4eaf9346366be72e2b4719efcristy            (void) XGetWindowImage(display,children[i],MagickFalse,level+1,
41656710d8414f0ed06e4eaf9346366be72e2b4719efcristy              exception);
41663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) XFree((void *) children);
41673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
41683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
41693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (level <= 1)
41703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
4171c57f694b2d04975a0e501613e34368c464708c19cristy      CacheView
4172c57f694b2d04975a0e501613e34368c464708c19cristy        *composite_view;
4173c57f694b2d04975a0e501613e34368c464708c19cristy
41743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ColormapInfo
41753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *next;
41763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
41773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Image
41783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *composite_image,
41793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *image;
41803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
41813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      int
41823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        y;
41833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
41843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      MagickBooleanType
41853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        import;
41863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
41873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      register int
41883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        j,
41893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        x;
41903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
41914c08aed51c5899665ade97263692328eea4af106cristy      register Quantum
4192c47d1f8ecfe7d04f0f003cca0fe175658bbf0fb2cristy        *restrict q;
41933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4194bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      register size_t
41953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        pixel;
41963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
41973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      unsigned int
41983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        number_colors;
41993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
42003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XColor
42013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *colors;
42023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
42033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XImage
42043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *ximage;
42053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
42063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
42073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Get X image for each window in the list.
42083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
42093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image=NewImageList();
42103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (id=0; id < number_windows; id++)
42113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
42123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
42133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Does target window intersect top level window?
42143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
42153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        import=
42163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ((window_info[id].bounds.x2 >= window_info[0].bounds.x1) &&
42173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy           (window_info[id].bounds.x1 <= window_info[0].bounds.x2) &&
42183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy           (window_info[id].bounds.y2 >= window_info[0].bounds.y1) &&
42193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy           (window_info[id].bounds.y1 <= window_info[0].bounds.y2)) ?
42203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          MagickTrue : MagickFalse;
42213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
42223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Is target window contained by another window with the same colormap?
42233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
42243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for (j=0; j < id; j++)
42253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((window_info[id].visual == window_info[j].visual) &&
42263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (window_info[id].colormap == window_info[j].colormap))
42273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
42283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if ((window_info[id].bounds.x1 <= window_info[j].bounds.x1) ||
42293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  (window_info[id].bounds.x1 >= window_info[j].bounds.x2) ||
42303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  (window_info[id].bounds.y1 <= window_info[j].bounds.y1) ||
42313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  (window_info[id].bounds.y1 >= window_info[j].bounds.y2))
42323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  import=MagickFalse;
42333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
42343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          else
42353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if ((window_info[id].visual != window_info[j].visual) ||
42363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (window_info[id].colormap != window_info[j].colormap))
42373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
42383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if ((window_info[id].bounds.x2 > window_info[j].bounds.x1) &&
42393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    (window_info[id].bounds.x1 < window_info[j].bounds.x2) &&
42403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    (window_info[id].bounds.y2 > window_info[j].bounds.y1) &&
42413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    (window_info[id].bounds.y1 < window_info[j].bounds.y2))
42423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  import=MagickTrue;
42433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
42443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (import == MagickFalse)
42453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
42463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
42473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Get X image.
42483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
42493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ximage=XGetImage(display,window_info[id].window,(int)
42503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          window_info[id].crop_info.x,(int) window_info[id].crop_info.y,
42513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (unsigned int) window_info[id].crop_info.width,(unsigned int)
42523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          window_info[id].crop_info.height,AllPlanes,ZPixmap);
42533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (ximage == (XImage *) NULL)
42543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
42553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
42563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Initialize window colormap.
42573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
42583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        number_colors=0;
42593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        colors=(XColor *) NULL;
42603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (window_info[id].colormap != (Colormap) NULL)
42613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
42623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            ColormapInfo
42633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *p;
42643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
42653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
42663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Search colormap list for window colormap.
42673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
42683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            number_colors=(unsigned int) window_info[id].visual->map_entries;
42693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (p=colormap_info; p != (ColormapInfo *) NULL; p=p->next)
42703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (p->colormap == window_info[id].colormap)
42713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
42723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (p == (ColormapInfo *) NULL)
42733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
42743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /*
42753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  Get the window colormap.
42763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                */
42773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                colors=(XColor *) AcquireQuantumMemory(number_colors,
42783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  sizeof(*colors));
42793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if (colors == (XColor *) NULL)
42803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  {
42813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    XDestroyImage(ximage);
42823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    return((Image *) NULL);
42833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  }
42843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if ((window_info[id].visual->klass != DirectColor) &&
42853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    (window_info[id].visual->klass != TrueColor))
42863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  for (i=0; i < (int) number_colors; i++)
42873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  {
4288bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy                    colors[i].pixel=(size_t) i;
42893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    colors[i].pad='\0';
42903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  }
42913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                else
42923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  {
4293bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy                    size_t
42943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      blue,
42953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      blue_bit,
42963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      green,
42973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      green_bit,
42983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      red,
42993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      red_bit;
43003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
43013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    /*
43023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      DirectColor or TrueColor visual.
43033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    */
43043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    red=0;
43053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    green=0;
43063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    blue=0;
43073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    red_bit=window_info[id].visual->red_mask &
43083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      (~(window_info[id].visual->red_mask)+1);
43093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    green_bit=window_info[id].visual->green_mask &
43103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      (~(window_info[id].visual->green_mask)+1);
43113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    blue_bit=window_info[id].visual->blue_mask &
43123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      (~(window_info[id].visual->blue_mask)+1);
43133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    for (i=0; i < (int) number_colors; i++)
43143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    {
43158891f9ce489d3e61399b60436ea6c62f5ed9b887cristy                      colors[i].pixel=(unsigned long) (red | green | blue);
43163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      colors[i].pad='\0';
43173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      red+=red_bit;
43183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      if (red > window_info[id].visual->red_mask)
43193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        red=0;
43203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      green+=green_bit;
43213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      if (green > window_info[id].visual->green_mask)
43223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        green=0;
43233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      blue+=blue_bit;
43243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      if (blue > window_info[id].visual->blue_mask)
43253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        blue=0;
43263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    }
43273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  }
43283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (void) XQueryColors(display,window_info[id].colormap,colors,
43293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  (int) number_colors);
43303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /*
43313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  Append colormap to colormap list.
43323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                */
433373bd4a51b419e914565bdf204bf1540dc4c8ee26cristy                p=(ColormapInfo *) AcquireMagickMemory(sizeof(*p));
43343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if (p == (ColormapInfo *) NULL)
43353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  return((Image *) NULL);
43363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                p->colormap=window_info[id].colormap;
43373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                p->colors=colors;
43383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                p->next=colormap_info;
43393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                colormap_info=p;
43403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
43413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            colors=p->colors;
43423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
43433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
43443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Allocate image structure.
43453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
43466710d8414f0ed06e4eaf9346366be72e2b4719efcristy        composite_image=AcquireImage((ImageInfo *) NULL,exception);
43473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (composite_image == (Image *) NULL)
43483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
43493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDestroyImage(ximage);
43503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            return((Image *) NULL);
43513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
43523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
43533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Convert X image to MIFF format.
43543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
43553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((window_info[id].visual->klass != TrueColor) &&
43563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (window_info[id].visual->klass != DirectColor))
43573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          composite_image->storage_class=PseudoClass;
4358bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        composite_image->columns=(size_t) ximage->width;
4359bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        composite_image->rows=(size_t) ximage->height;
4360c57f694b2d04975a0e501613e34368c464708c19cristy        composite_view=AcquireCacheView(composite_image);
43613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        switch (composite_image->storage_class)
43623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
43633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          case DirectClass:
43643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          default:
43653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
4366bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            register size_t
43673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              color,
43683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              index;
43693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4370bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            size_t
43713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              blue_mask,
43723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              blue_shift,
43733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              green_mask,
43743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              green_shift,
43753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              red_mask,
43763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              red_shift;
43773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
43783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
43793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Determine shift and mask for red, green, and blue.
43803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
43813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            red_mask=window_info[id].visual->red_mask;
43823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            red_shift=0;
43833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            while ((red_mask != 0) && ((red_mask & 0x01) == 0))
43843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
43853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              red_mask>>=1;
43863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              red_shift++;
43873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
43883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            green_mask=window_info[id].visual->green_mask;
43893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            green_shift=0;
43903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            while ((green_mask != 0) && ((green_mask & 0x01) == 0))
43913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
43923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              green_mask>>=1;
43933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              green_shift++;
43943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
43953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            blue_mask=window_info[id].visual->blue_mask;
43963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            blue_shift=0;
43973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            while ((blue_mask != 0) && ((blue_mask & 0x01) == 0))
43983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
43993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              blue_mask>>=1;
44003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              blue_shift++;
44013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
44023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
44033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Convert X image to DirectClass packets.
44043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
44053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if ((number_colors != 0) &&
44063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (window_info[id].visual->klass == DirectColor))
44073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              for (y=0; y < (int) composite_image->rows; y++)
44083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
4409c57f694b2d04975a0e501613e34368c464708c19cristy                q=QueueCacheViewAuthenticPixels(composite_view,0,(ssize_t) y,
44103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  composite_image->columns,1,exception);
4411acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy                if (q == (Quantum *) NULL)
44123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
44133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                for (x=0; x < (int) composite_image->columns; x++)
44143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
44153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  pixel=XGetPixel(ximage,x,y);
44163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  index=(pixel >> red_shift) & red_mask;
44174c08aed51c5899665ade97263692328eea4af106cristy                  SetPixelRed(composite_image,
44184c08aed51c5899665ade97263692328eea4af106cristy                    ScaleShortToQuantum(colors[index].red),q);
44193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  index=(pixel >> green_shift) & green_mask;
44204c08aed51c5899665ade97263692328eea4af106cristy                  SetPixelGreen(composite_image,
44214c08aed51c5899665ade97263692328eea4af106cristy                    ScaleShortToQuantum(colors[index].green),q);
44223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  index=(pixel >> blue_shift) & blue_mask;
44234c08aed51c5899665ade97263692328eea4af106cristy                  SetPixelBlue(composite_image,
44244c08aed51c5899665ade97263692328eea4af106cristy                    ScaleShortToQuantum(colors[index].blue),q);
4425ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy                  q+=GetPixelChannels(composite_image);
44263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
44270b1a797184d12984eb55d950fb5f532298d9fd0fcristy                status=SyncCacheViewAuthenticPixels(composite_view,exception);
44280b1a797184d12984eb55d950fb5f532298d9fd0fcristy                if (status == MagickFalse)
44293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
44303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
44313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            else
44323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              for (y=0; y < (int) composite_image->rows; y++)
44333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
4434c57f694b2d04975a0e501613e34368c464708c19cristy                q=QueueCacheViewAuthenticPixels(composite_view,0,(ssize_t) y,
44353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  composite_image->columns,1,exception);
4436acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy                if (q == (Quantum *) NULL)
44373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
44383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                for (x=0; x < (int) composite_image->columns; x++)
44393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
44403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  pixel=XGetPixel(ximage,x,y);
44413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  color=(pixel >> red_shift) & red_mask;
44423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  color=(65535UL*color)/red_mask;
44434c08aed51c5899665ade97263692328eea4af106cristy                  SetPixelRed(composite_image,
44444c08aed51c5899665ade97263692328eea4af106cristy                    ScaleShortToQuantum((unsigned short) color),q);
44453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  color=(pixel >> green_shift) & green_mask;
44463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  color=(65535UL*color)/green_mask;
44474c08aed51c5899665ade97263692328eea4af106cristy                  SetPixelGreen(composite_image,
44484c08aed51c5899665ade97263692328eea4af106cristy                    ScaleShortToQuantum((unsigned short) color),q);
44493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  color=(pixel >> blue_shift) & blue_mask;
44503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  color=(65535UL*color)/blue_mask;
44514c08aed51c5899665ade97263692328eea4af106cristy                  SetPixelBlue(composite_image,
44524c08aed51c5899665ade97263692328eea4af106cristy                    ScaleShortToQuantum((unsigned short) color),q);
4453ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy                  q+=GetPixelChannels(composite_image);
44543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
44550b1a797184d12984eb55d950fb5f532298d9fd0fcristy                status=SyncCacheViewAuthenticPixels(composite_view,exception);
44560b1a797184d12984eb55d950fb5f532298d9fd0fcristy                if (status == MagickFalse)
44573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
44583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
44593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
44603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
44613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          case PseudoClass:
44623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
44633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
44643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Create colormap.
44653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
44660b1a797184d12984eb55d950fb5f532298d9fd0fcristy            status=AcquireImageColormap(composite_image,number_colors,
44670b1a797184d12984eb55d950fb5f532298d9fd0fcristy              exception);
44680b1a797184d12984eb55d950fb5f532298d9fd0fcristy            if (status == MagickFalse)
44693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
44703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                XDestroyImage(ximage);
44713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                composite_image=DestroyImage(composite_image);
44723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                return((Image *) NULL);
44733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
44743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (i=0; i < (int) composite_image->colors; i++)
44753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
4476e42f658533644aecb733785ffd91b286d6778deacristy              composite_image->colormap[colors[i].pixel].red=(double)
44773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                ScaleShortToQuantum(colors[i].red);
4478e42f658533644aecb733785ffd91b286d6778deacristy              composite_image->colormap[colors[i].pixel].green=(double)
44793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                ScaleShortToQuantum(colors[i].green);
4480e42f658533644aecb733785ffd91b286d6778deacristy              composite_image->colormap[colors[i].pixel].blue=(double)
44813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                ScaleShortToQuantum(colors[i].blue);
44823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
44833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
44843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Convert X image to PseudoClass packets.
44853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
44863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (y=0; y < (int) composite_image->rows; y++)
44873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
4488c57f694b2d04975a0e501613e34368c464708c19cristy              q=QueueCacheViewAuthenticPixels(composite_view,0,(ssize_t) y,
4489c57f694b2d04975a0e501613e34368c464708c19cristy                composite_image->columns,1,exception);
4490acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy              if (q == (Quantum *) NULL)
44913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
44923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              for (x=0; x < (int) composite_image->columns; x++)
44933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
44944c08aed51c5899665ade97263692328eea4af106cristy                index=(Quantum) XGetPixel(ximage,x,y);
44954c08aed51c5899665ade97263692328eea4af106cristy                SetPixelIndex(composite_image,index,q);
4496803640d20a6a664315eddfff6f8531d0c5e0871dcristy                SetPixelInfoPixel(composite_image,
44974c08aed51c5899665ade97263692328eea4af106cristy                  composite_image->colormap+(ssize_t) index,q);
4498ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy                q+=GetPixelChannels(composite_image);
44993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
45000b1a797184d12984eb55d950fb5f532298d9fd0fcristy              status=SyncCacheViewAuthenticPixels(composite_view,exception);
45010b1a797184d12984eb55d950fb5f532298d9fd0fcristy              if (status == MagickFalse)
45023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
45033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
45043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
45053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
45063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
4507c57f694b2d04975a0e501613e34368c464708c19cristy        composite_view=DestroyCacheView(composite_view);
45083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDestroyImage(ximage);
45093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (image == (Image *) NULL)
45103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
45113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            image=composite_image;
45123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            continue;
45133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
45143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
45153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Composite any children in back-to-front order.
45163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
45173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XTranslateCoordinates(display,window_info[id].window,window,0,0,
45183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          &x_offset,&y_offset,&child);
45193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        x_offset-=(int) crop_info.x;
45203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (x_offset < 0)
45213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          x_offset=0;
45223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        y_offset-=(int) crop_info.y;
45233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (y_offset < 0)
45243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          y_offset=0;
4525c57f694b2d04975a0e501613e34368c464708c19cristy        (void) CompositeImage(image,CopyCompositeOp,composite_image,(ssize_t)
4526e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy          x_offset,(ssize_t) y_offset,exception);
45275f257b2f02bdd982d9bbfe612f5bb1711608590ccristy        composite_image=DestroyImage(composite_image);
45283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
45293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
45303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Relinquish resources.
45313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
45323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      while (colormap_info != (ColormapInfo *) NULL)
45333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
45343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        next=colormap_info->next;
4535e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy        colormap_info->colors=(XColor *) RelinquishMagickMemory(
4536e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy          colormap_info->colors);
45373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        colormap_info=(ColormapInfo *) RelinquishMagickMemory(colormap_info);
45383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        colormap_info=next;
45393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
45403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
45413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Relinquish resources and restore initial state.
45423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
45433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window_info=(WindowInfo *) RelinquishMagickMemory(window_info);
45443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      max_windows=0;
45453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      number_windows=0;
45463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      colormap_info=(ColormapInfo *) NULL;
45473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return(image);
45483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
45493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return((Image *) NULL);
45503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
45513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
45523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
45533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
45543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
45553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
45563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
45573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X G e t W i n d o w I n f o                                               %
45583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
45593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
45603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
45613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
45623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
45633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XGetWindowInfo() initializes the XWindowInfo structure.
45643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
45653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XGetWindowInfo method is:
45663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
45673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XGetWindowInfo(Display *display,XVisualInfo *visual_info,
45683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        XStandardColormap *map_info,XPixelInfo *pixel,XFontStruct *font_info,
45693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        XResourceInfo *resource_info,XWindowInfo *window)
45703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        resource_info,window)
45713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
45723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
45733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
45743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server; returned from
45753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
45763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
45773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o visual_info: Specifies a pointer to a X11 XVisualInfo structure;
45783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      returned from XGetVisualInfo.
45793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
45803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o map_info: If map_type is specified, this structure is initialized
45813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      with info from the Standard Colormap.
45823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
45833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o pixel: Specifies a pointer to a XPixelInfo structure.
45843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
45853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o font_info: Specifies a pointer to a XFontStruct structure.
45863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
45873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
45883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
45893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
4590bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XGetWindowInfo(Display *display,XVisualInfo *visual_info,
45913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XStandardColormap *map_info,XPixelInfo *pixel,XFontStruct *font_info,
45923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XResourceInfo *resource_info,XWindowInfo *window)
45933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
45943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
45953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize window info.
45963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
45973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
45983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
45993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(visual_info != (XVisualInfo *) NULL);
46003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(map_info != (XStandardColormap *) NULL);
46013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(pixel != (XPixelInfo *) NULL);
46023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(resource_info != (XResourceInfo *) NULL);
46033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(window != (XWindowInfo *) NULL);
46043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->id != (Window) NULL)
46053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
46063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window->cursor != (Cursor) NULL)
46073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XFreeCursor(display,window->cursor);
46083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window->busy_cursor != (Cursor) NULL)
46093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XFreeCursor(display,window->busy_cursor);
46103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window->highlight_stipple != (Pixmap) NULL)
46113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XFreePixmap(display,window->highlight_stipple);
46123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window->shadow_stipple != (Pixmap) NULL)
46133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XFreePixmap(display,window->shadow_stipple);
46143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window->name == (char *) NULL)
46153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        window->name=AcquireString("");
46163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window->icon_name == (char *) NULL)
46173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        window->icon_name=AcquireString("");
46183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
46193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
46203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
46213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
46223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Initialize these attributes just once.
46233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
46243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window->id=(Window) NULL;
46253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window->name == (char *) NULL)
46263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        window->name=AcquireString("");
46273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window->icon_name == (char *) NULL)
46283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        window->icon_name=AcquireString("");
46293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window->x=XDisplayWidth(display,visual_info->screen) >> 1;
46303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window->y=XDisplayWidth(display,visual_info->screen) >> 1;
46313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window->ximage=(XImage *) NULL;
46323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window->matte_image=(XImage *) NULL;
46333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window->pixmap=(Pixmap) NULL;
46343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window->matte_pixmap=(Pixmap) NULL;
46353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window->mapped=MagickFalse;
46363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window->stasis=MagickFalse;
46373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window->shared_memory=MagickTrue;
46383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window->segment_info=(void *) NULL;
46393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
46403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
46413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XShmSegmentInfo
46423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *segment_info;
46433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
46443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (window->segment_info == (void *) NULL)
46453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          window->segment_info=AcquireQuantumMemory(2,sizeof(*segment_info));
46463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        segment_info=(XShmSegmentInfo *) window->segment_info;
46473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        segment_info[0].shmid=(-1);
46483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        segment_info[0].shmaddr=(char *) NULL;
46493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        segment_info[1].shmid=(-1);
46503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        segment_info[1].shmaddr=(char *) NULL;
46513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
46523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
46533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
46543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
46553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize these attributes every time function is called.
46563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
46573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->screen=visual_info->screen;
46583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->root=XRootWindow(display,visual_info->screen);
46593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->visual=visual_info->visual;
46603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->storage_class=(unsigned int) visual_info->klass;
46613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->depth=(unsigned int) visual_info->depth;
46623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->visual_info=visual_info;
46633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->map_info=map_info;
46643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->pixel_info=pixel;
46653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->font_info=font_info;
46663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->cursor=XCreateFontCursor(display,XC_left_ptr);
46673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->busy_cursor=XCreateFontCursor(display,XC_watch);
46683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->geometry=(char *) NULL;
46693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->icon_geometry=(char *) NULL;
46703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (resource_info->icon_geometry != (char *) NULL)
46713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) CloneString(&window->icon_geometry,resource_info->icon_geometry);
46723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->crop_geometry=(char *) NULL;
4673bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  window->flags=(size_t) PSize;
46743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->width=1;
46753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->height=1;
46763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->min_width=1;
46773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->min_height=1;
46783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->width_inc=1;
46793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->height_inc=1;
46803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->border_width=resource_info->border_width;
46813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->annotate_context=pixel->annotate_context;
46823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->highlight_context=pixel->highlight_context;
46833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->widget_context=pixel->widget_context;
46843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->shadow_stipple=(Pixmap) NULL;
46853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->highlight_stipple=(Pixmap) NULL;
46863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->use_pixmap=MagickTrue;
46873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->immutable=MagickFalse;
46883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->shape=MagickFalse;
46893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->data=0;
4690c57f694b2d04975a0e501613e34368c464708c19cristy  window->mask=(int) (CWBackingStore | CWBackPixel | CWBackPixmap |
46913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    CWBitGravity | CWBorderPixel | CWColormap | CWCursor | CWDontPropagate |
46923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    CWEventMask | CWOverrideRedirect | CWSaveUnder | CWWinGravity);
46933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->attributes.background_pixel=pixel->background_color.pixel;
46943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->attributes.background_pixmap=(Pixmap) NULL;
46953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->attributes.bit_gravity=ForgetGravity;
46963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->attributes.backing_store=WhenMapped;
46973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->attributes.save_under=MagickTrue;
46983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->attributes.border_pixel=pixel->border_color.pixel;
46993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->attributes.colormap=map_info->colormap;
47003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->attributes.cursor=window->cursor;
47013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->attributes.do_not_propagate_mask=NoEventMask;
47023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->attributes.event_mask=NoEventMask;
47033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->attributes.override_redirect=MagickFalse;
47043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->attributes.win_gravity=NorthWestGravity;
47053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->orphan=MagickFalse;
47063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
47073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
47083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
47093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
47103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
47113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
47123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
47133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X H i g h l i g h t E l l i p s e                                         %
47143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
47153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
47163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
47173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
47183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
47193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XHighlightEllipse() puts a border on the X server around a region defined by
47203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  highlight_info.
47213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
47223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XHighlightEllipse method is:
47233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
47243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XHighlightEllipse(Display *display,Window window,
47253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        GC annotate_context,const RectangleInfo *highlight_info)
47263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
47273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
47283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
47293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server; returned from
47303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
47313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
47323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies a pointer to a Window structure.
47333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
47343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o annotate_context: Specifies a pointer to a GC structure.
47353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
47363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o highlight_info: Specifies a pointer to a RectangleInfo structure.  It
47373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      contains the extents of any highlighting rectangle.
47383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
47393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
4740bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XHighlightEllipse(Display *display,Window window,
47413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  GC annotate_context,const RectangleInfo *highlight_info)
47423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
47433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
47443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
47453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(window != (Window) NULL);
47463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(annotate_context != (GC) NULL);
47473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(highlight_info != (RectangleInfo *) NULL);
47483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((highlight_info->width < 4) || (highlight_info->height < 4))
47493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return;
47503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XDrawArc(display,window,annotate_context,(int) highlight_info->x,
47513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (int) highlight_info->y,(unsigned int) highlight_info->width-1,
47523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (unsigned int) highlight_info->height-1,0,360*64);
47533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XDrawArc(display,window,annotate_context,(int) highlight_info->x+1,
47543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (int) highlight_info->y+1,(unsigned int) highlight_info->width-3,
47553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (unsigned int) highlight_info->height-3,0,360*64);
47563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
47573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
47583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
47593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
47603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
47613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
47623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
47633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X H i g h l i g h t L i n e                                               %
47643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
47653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
47663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
47673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
47683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
47693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XHighlightLine() puts a border on the X server around a region defined by
47703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  highlight_info.
47713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
47723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XHighlightLine method is:
47733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
47743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XHighlightLine(Display *display,Window window,GC annotate_context,
47753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const XSegment *highlight_info)
47763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
47773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
47783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
47793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server; returned from
47803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
47813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
47823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies a pointer to a Window structure.
47833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
47843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o annotate_context: Specifies a pointer to a GC structure.
47853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
47863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o highlight_info: Specifies a pointer to a RectangleInfo structure.  It
47873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      contains the extents of any highlighting rectangle.
47883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
47893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
4790bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XHighlightLine(Display *display,Window window,
47913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  GC annotate_context,const XSegment *highlight_info)
47923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
47933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
47943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
47953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(window != (Window) NULL);
47963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(annotate_context != (GC) NULL);
47973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(highlight_info != (XSegment *) NULL);
47983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XDrawLine(display,window,annotate_context,highlight_info->x1,
47993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    highlight_info->y1,highlight_info->x2,highlight_info->y2);
48003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
48013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
48023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
48033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
48043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
48053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
48063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
48073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X H i g h l i g h t R e c t a n g l e                                     %
48083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
48093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
48103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
48113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
48123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
48133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XHighlightRectangle() puts a border on the X server around a region defined
48143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  by highlight_info.
48153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
48163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XHighlightRectangle method is:
48173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
48183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XHighlightRectangle(Display *display,Window window,
48193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        GC annotate_context,const RectangleInfo *highlight_info)
48203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
48213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
48223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
48233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server; returned from
48243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
48253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
48263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies a pointer to a Window structure.
48273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
48283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o annotate_context: Specifies a pointer to a GC structure.
48293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
48303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o highlight_info: Specifies a pointer to a RectangleInfo structure.  It
48313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      contains the extents of any highlighting rectangle.
48323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
48333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
4834bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XHighlightRectangle(Display *display,Window window,
48353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  GC annotate_context,const RectangleInfo *highlight_info)
48363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
48373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
48383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
48393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(window != (Window) NULL);
48403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(annotate_context != (GC) NULL);
48413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(highlight_info != (RectangleInfo *) NULL);
48423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((highlight_info->width < 4) || (highlight_info->height < 4))
48433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return;
48443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XDrawRectangle(display,window,annotate_context,(int) highlight_info->x,
48453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (int) highlight_info->y,(unsigned int) highlight_info->width-1,
48463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (unsigned int) highlight_info->height-1);
48473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XDrawRectangle(display,window,annotate_context,(int) highlight_info->x+
48483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    1,(int) highlight_info->y+1,(unsigned int) highlight_info->width-3,
48493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (unsigned int) highlight_info->height-3);
48503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
48513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
48523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
48533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
48543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
48553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
48563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
48573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X I m p o r t I m a g e                                                   %
48583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
48593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
48603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
48613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
48623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
48633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XImportImage() reads an image from an X window.
48643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
48653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XImportImage method is:
48663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
48676710d8414f0ed06e4eaf9346366be72e2b4719efcristy%      Image *XImportImage(const ImageInfo *image_info,XImportInfo *ximage_info,
48686710d8414f0ed06e4eaf9346366be72e2b4719efcristy%        ExceptionInfo *exception)
48693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
48703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
48713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
48723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image_info: the image info.
48733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
48743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o ximage_info: Specifies a pointer to an XImportInfo structure.
48753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
48766710d8414f0ed06e4eaf9346366be72e2b4719efcristy%    o exception: return any errors or warnings in this structure.
48776710d8414f0ed06e4eaf9346366be72e2b4719efcristy%
48783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
48793ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport Image *XImportImage(const ImageInfo *image_info,
48806710d8414f0ed06e4eaf9346366be72e2b4719efcristy  XImportInfo *ximage_info,ExceptionInfo *exception)
48813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
48823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Colormap
48833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *colormaps;
48843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
48853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Display
48863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *display;
48873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
48883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image
48893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *image;
48903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
48913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
48923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_colormaps,
48933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_windows,
48943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x;
48953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
48963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  RectangleInfo
48973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    crop_info;
48983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
48993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
49003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
49013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
49023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Window
49033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *children,
49043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    client,
49053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    prior_target,
49063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    root,
49073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    target;
49083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
49093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XTextProperty
49103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window_name;
49113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
49123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
49133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Open X server connection.
49143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
49153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image_info != (const ImageInfo *) NULL);
49163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image_info->signature == MagickSignature);
49173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image_info->debug != MagickFalse)
49183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
49193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image_info->filename);
49203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(ximage_info != (XImportInfo *) NULL);
49213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  display=XOpenDisplay(image_info->server_name);
49223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (display == (Display *) NULL)
49233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
49243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowXWindowFatalException(XServerError,"UnableToOpenXServer",
49253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDisplayName(image_info->server_name));
49263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return((Image *) NULL);
49273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
49283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
49293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Set our forgiving exception handler.
49303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
49313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XSetErrorHandler(XError);
49323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
49333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Select target window.
49343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
49353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  crop_info.x=0;
49363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  crop_info.y=0;
49373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  crop_info.width=0;
49383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  crop_info.height=0;
49393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  root=XRootWindow(display,XDefaultScreen(display));
49403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  target=(Window) NULL;
49413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((image_info->filename != (char *) NULL) &&
49423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (*image_info->filename != '\0'))
49433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
49443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (LocaleCompare(image_info->filename,"root") == 0)
49453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        target=root;
49463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
49473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
49483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
49493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Select window by ID or name.
49503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
49513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (isdigit((unsigned char) *image_info->filename) != 0)
49523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            target=XWindowByID(display,root,(Window)
49533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              strtol(image_info->filename,(char **) NULL,0));
49543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (target == (Window) NULL)
49553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            target=XWindowByName(display,root,image_info->filename);
49563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (target == (Window) NULL)
49573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            ThrowXWindowFatalException(XServerError,
49583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              "NoWindowWithSpecifiedIDExists",image_info->filename);
49593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
49603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
49613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
49623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    If target window is not defined, interactively select one.
49633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
49643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  prior_target=target;
49653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (target == (Window) NULL)
49663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    target=XSelectWindow(display,&crop_info);
49673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (target == (Window) NULL)
49683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowXWindowFatalException(XServerError,"UnableToReadXWindowImage",
49693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image_info->filename);
49703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  client=target;   /* obsolete */
49713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (target != root)
49723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
49733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      unsigned int
49743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        d;
49753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
49763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=XGetGeometry(display,target,&root,&x,&x,&d,&d,&d,&d);
49773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (status != False)
49783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
49793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for ( ; ; )
49803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
49813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Window
49823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              parent;
49833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
49843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
49853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Find window manager frame.
49863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
49873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            status=XQueryTree(display,target,&root,&parent,&children,&d);
49883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if ((status != False) && (children != (Window *) NULL))
49893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (void) XFree((char *) children);
49903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if ((status == False) || (parent == (Window) NULL) ||
49913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (parent == root))
49923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
49933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            target=parent;
49943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
49953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
49963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Get client window.
49973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
49983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          client=XClientWindow(display,target);
49993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (ximage_info->frame == MagickFalse)
50003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            target=client;
50013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((ximage_info->frame == MagickFalse) &&
50023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (prior_target != MagickFalse))
50033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            target=prior_target;
50043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
50053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
50063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (ximage_info->screen)
50073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
50083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      int
50093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        y;
50103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
50113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Window
50123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        child;
50133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
50143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XWindowAttributes
50153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        window_attributes;
50163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
50173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
50183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Obtain window image directly from screen.
50193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
50203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=XGetWindowAttributes(display,target,&window_attributes);
50213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (status == False)
50223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
50233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ThrowXWindowFatalException(XServerError,
50243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            "UnableToReadXWindowAttributes",image_info->filename);
50253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) XCloseDisplay(display);
50263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          return((Image *) NULL);
50273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
50283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XTranslateCoordinates(display,target,root,0,0,&x,&y,&child);
5029c57f694b2d04975a0e501613e34368c464708c19cristy      crop_info.x=(ssize_t) x;
5030c57f694b2d04975a0e501613e34368c464708c19cristy      crop_info.y=(ssize_t) y;
5031bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      crop_info.width=(size_t) window_attributes.width;
5032bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      crop_info.height=(size_t) window_attributes.height;
5033553743c2f2d6c29405dcfab6390a1c505c79fececristy      if (ximage_info->borders != 0)
50343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
50353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
50363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Include border in image.
50373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
50383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          crop_info.x-=window_attributes.border_width;
50393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          crop_info.y-=window_attributes.border_width;
50403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          crop_info.width+=window_attributes.border_width << 1;
50413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          crop_info.height+=window_attributes.border_width << 1;
50423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
50433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      target=root;
50443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
50453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
50463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    If WM_COLORMAP_WINDOWS property is set or multiple colormaps, descend.
50473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
50483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  number_windows=0;
50493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XGetWMColormapWindows(display,target,&children,&number_windows);
50503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((status == True) && (number_windows > 0))
50513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
50523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ximage_info->descend=MagickTrue;
50533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XFree ((char *) children);
50543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
50553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  colormaps=XListInstalledColormaps(display,target,&number_colormaps);
50563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (number_colormaps > 0)
50573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
50583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (number_colormaps > 1)
50593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ximage_info->descend=MagickTrue;
50603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XFree((char *) colormaps);
50613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
50623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
50633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Alert the user not to alter the screen.
50643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
50653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (ximage_info->silent == MagickFalse)
50663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XBell(display,0);
50673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
50683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Get image by window id.
50693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
50703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XGrabServer(display);
50713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  image=XGetWindowImage(display,target,ximage_info->borders,
50726710d8414f0ed06e4eaf9346366be72e2b4719efcristy    ximage_info->descend ? 1U : 0U,exception);
50733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XUngrabServer(display);
50743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image == (Image *) NULL)
50753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowXWindowFatalException(XServerError,"UnableToReadXWindowImage",
50763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image_info->filename)
50773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
50783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
50793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) CopyMagickString(image->filename,image_info->filename,
50803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        MaxTextExtent);
50813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((crop_info.width != 0) && (crop_info.height != 0))
50823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
50833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Image
50843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *clone_image,
50853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *crop_image;
50863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
50873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
50883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Crop image as defined by the cropping rectangle.
50893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
50906710d8414f0ed06e4eaf9346366be72e2b4719efcristy          clone_image=CloneImage(image,0,0,MagickTrue,exception);
50913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (clone_image != (Image *) NULL)
50923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
50936710d8414f0ed06e4eaf9346366be72e2b4719efcristy              crop_image=CropImage(clone_image,&crop_info,exception);
50943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (crop_image != (Image *) NULL)
50953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
50963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  image=DestroyImage(image);
50973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  image=crop_image;
50983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
50993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
51003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
51013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=XGetWMName(display,target,&window_name);
51023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (status == True)
51033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
51043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((image_info->filename != (char *) NULL) &&
51053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (*image_info->filename == '\0'))
51063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) CopyMagickString(image->filename,(char *) window_name.value,
51073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (size_t) window_name.nitems+1);
51083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) XFree((void *) window_name.value);
51093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
51103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
51113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (ximage_info->silent == MagickFalse)
51123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
51133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
51143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Alert the user we're done.
51153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
51163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XBell(display,0);
51173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XBell(display,0);
51183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
51193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XCloseDisplay(display);
51203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(image);
51213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
51223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
51233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
51243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
51253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
51263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
51273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
51283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X I n i t i a l i z e W i n d o w s                                       %
51293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
51303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
51313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
51323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
51333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
51343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XInitializeWindows() initializes the XWindows structure.
51353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
51363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XInitializeWindows method is:
51373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
51383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XWindows *XInitializeWindows(Display *display,
51393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        XResourceInfo *resource_info)
51403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
51413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
51423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
51433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o windows: XInitializeWindows returns a pointer to a XWindows structure.
51443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
51453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
51463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
51473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
51483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
51493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
51503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
5151bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate XWindows *XInitializeWindows(Display *display,
51523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XResourceInfo *resource_info)
51533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
51543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Window
51553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    root_window;
51563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
51573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWindows
51583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *windows;
51593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
51603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
51613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Allocate windows structure.
51623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
516373bd4a51b419e914565bdf204bf1540dc4c8ee26cristy  windows=(XWindows *) AcquireMagickMemory(sizeof(*windows));
51643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows == (XWindows *) NULL)
51653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
51663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowXWindowFatalException(XServerFatalError,"MemoryAllocationFailed",
51673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "...");
51683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return((XWindows *) NULL);
51693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
51703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ResetMagickMemory(windows,0,sizeof(*windows));
51713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->pixel_info=(XPixelInfo *) AcquireMagickMemory(
51723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    sizeof(*windows->pixel_info));
51733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->icon_pixel=(XPixelInfo *) AcquireMagickMemory(
51743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    sizeof(*windows->icon_pixel));
51753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->icon_resources=(XResourceInfo *) AcquireMagickMemory(
51763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    sizeof(*windows->icon_resources));
51773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((windows->pixel_info == (XPixelInfo *) NULL) ||
51783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (windows->icon_pixel == (XPixelInfo *) NULL) ||
51793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (windows->icon_resources == (XResourceInfo *) NULL))
51803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
51813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowXWindowFatalException(XServerFatalError,"MemoryAllocationFailed",
51823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "...");
51833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return((XWindows *) NULL);
51843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
51853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
51863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize windows structure.
51873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
51883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->display=display;
51893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->wm_protocols=XInternAtom(display,"WM_PROTOCOLS",MagickFalse);
51903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->wm_delete_window=XInternAtom(display,"WM_DELETE_WINDOW",MagickFalse);
51913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->wm_take_focus=XInternAtom(display,"WM_TAKE_FOCUS",MagickFalse);
51923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->im_protocols=XInternAtom(display,"IM_PROTOCOLS",MagickFalse);
51933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->im_remote_command=
51943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    XInternAtom(display,"IM_REMOTE_COMMAND",MagickFalse);
51953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->im_update_widget=XInternAtom(display,"IM_UPDATE_WIDGET",MagickFalse);
51963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->im_update_colormap=
51973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    XInternAtom(display,"IM_UPDATE_COLORMAP",MagickFalse);
51983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->im_former_image=XInternAtom(display,"IM_FORMER_IMAGE",MagickFalse);
51993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->im_next_image=XInternAtom(display,"IM_NEXT_IMAGE",MagickFalse);
52003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->im_retain_colors=XInternAtom(display,"IM_RETAIN_COLORS",MagickFalse);
52013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->im_exit=XInternAtom(display,"IM_EXIT",MagickFalse);
52023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->dnd_protocols=XInternAtom(display,"DndProtocol",MagickFalse);
52030157aeadef2fce908277168097a160a8f15a6952cristy#if defined(MAGICKCORE_WINDOWS_SUPPORT)
52043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XSynchronize(display,IsWindows95());
52053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
52063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (IsEventLogging())
52073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
52083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XSynchronize(display,MagickTrue);
52093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"Version: %s",
5210bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        GetMagickVersion((size_t *) NULL));
52113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"Protocols:");
52123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),
52133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "  Window Manager: 0x%lx",windows->wm_protocols);
52143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),
52153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "    delete window: 0x%lx",windows->wm_delete_window);
52163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"    take focus: 0x%lx",
52173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->wm_take_focus);
52183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"  ImageMagick: 0x%lx",
52193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->im_protocols);
52203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),
52213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "    remote command: 0x%lx",windows->im_remote_command);
52223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),
52233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "    update widget: 0x%lx",windows->im_update_widget);
52243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),
52253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "    update colormap: 0x%lx",windows->im_update_colormap);
52263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),
52273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "    former image: 0x%lx",windows->im_former_image);
52283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"    next image: 0x%lx",
52293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->im_next_image);
52303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),
52313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "    retain colors: 0x%lx",windows->im_retain_colors);
52323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"    exit: 0x%lx",
52333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->im_exit);
52343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"  Drag and Drop: 0x%lx",
52353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->dnd_protocols);
52363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
52373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
52383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Allocate standard colormap.
52393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
52403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->map_info=XAllocStandardColormap();
52413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->icon_map=XAllocStandardColormap();
52423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((windows->map_info == (XStandardColormap *) NULL) ||
52433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (windows->icon_map == (XStandardColormap *) NULL))
52443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowXWindowFatalException(ResourceLimitFatalError,
52453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "MemoryAllocationFailed","...");
52463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->map_info->colormap=(Colormap) NULL;
52473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->icon_map->colormap=(Colormap) NULL;
5248f2faecf9facdbbb14fcba373365f9f691a9658e0cristy  windows->pixel_info->pixels=(unsigned long *) NULL;
52493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->pixel_info->annotate_context=(GC) NULL;
52503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->pixel_info->highlight_context=(GC) NULL;
52513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->pixel_info->widget_context=(GC) NULL;
52523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->font_info=(XFontStruct *) NULL;
52533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->icon_pixel->annotate_context=(GC) NULL;
5254f2faecf9facdbbb14fcba373365f9f691a9658e0cristy  windows->icon_pixel->pixels=(unsigned long *) NULL;
52553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
52563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Allocate visual.
52573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
52583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *windows->icon_resources=(*resource_info);
52593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->icon_resources->visual_type=(char *) "default";
52603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->icon_resources->colormap=SharedColormap;
52613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->visual_info=
52623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    XBestVisualInfo(display,windows->map_info,resource_info);
52633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->icon_visual=
52643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    XBestVisualInfo(display,windows->icon_map,windows->icon_resources);
52653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((windows->visual_info == (XVisualInfo *) NULL) ||
52663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (windows->icon_visual == (XVisualInfo *) NULL))
52673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowXWindowFatalException(XServerFatalError,"UnableToGetVisual",
52683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      resource_info->visual_type);
52693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (IsEventLogging())
52703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
52713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"Visual:");
52723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"  visual id: 0x%lx",
52733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->visual_info->visualid);
52743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"  class: %s",
52753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XVisualClassName(windows->visual_info->klass));
52763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"  depth: %d planes",
52773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->visual_info->depth);
52783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),
52793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "  size of colormap: %d entries",windows->visual_info->colormap_size);
52803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),
52813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "  red, green, blue masks: 0x%lx 0x%lx 0x%lx",
52823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->visual_info->red_mask,windows->visual_info->green_mask,
52833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->visual_info->blue_mask);
52843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),
52853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "  significant bits in color: %d bits",
52863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->visual_info->bits_per_rgb);
52873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
52883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
52893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Allocate class and manager hints.
52903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
52913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->class_hints=XAllocClassHint();
52923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->manager_hints=XAllocWMHints();
52933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((windows->class_hints == (XClassHint *) NULL) ||
52943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (windows->manager_hints == (XWMHints *) NULL))
52953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowXWindowFatalException(ResourceLimitFatalError,
52963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "MemoryAllocationFailed","...");
52973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
52983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Determine group leader if we have one.
52993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
53003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  root_window=XRootWindow(display,windows->visual_info->screen);
53013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->group_leader.id=(Window) NULL;
53023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (resource_info->window_group != (char *) NULL)
53033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
53043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (isdigit((unsigned char) *resource_info->window_group) != 0)
53053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->group_leader.id=XWindowByID(display,root_window,(Window)
53063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          strtol((char *) resource_info->window_group,(char **) NULL,0));
53073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (windows->group_leader.id == (Window) NULL)
53083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->group_leader.id=
53093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          XWindowByName(display,root_window,resource_info->window_group);
53103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
53113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(windows);
53123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
53133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
53143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
53153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
53163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
53173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
53183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
53193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X M a k e C u r s o r                                                     %
53203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
53213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
53223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
53233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
53243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
53253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XMakeCursor() creates a crosshairs X11 cursor.
53263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
53273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XMakeCursor method is:
53283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
53293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      Cursor XMakeCursor(Display *display,Window window,Colormap colormap,
53303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        char *background_color,char *foreground_color)
53313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
53323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
53333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
53343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
53353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
53363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
53373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies the ID of the window for which the cursor is
53383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      assigned.
53393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
53403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o colormap: Specifies the ID of the colormap from which the background
53413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      and foreground color will be retrieved.
53423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
53433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o background_color: Specifies the color to use for the cursor background.
53443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
53453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o foreground_color: Specifies the color to use for the cursor foreground.
53463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
53473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
5348bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate Cursor XMakeCursor(Display *display,Window window,
53493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Colormap colormap,char *background_color,char *foreground_color)
53503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
53513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define scope_height 17
53523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define scope_x_hot 8
53533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define scope_y_hot 8
53543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define scope_width 17
53553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
53563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static const unsigned char
53573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    scope_bits[] =
53583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
53593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x80, 0x03, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02,
53603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x7f,
53613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0xfc, 0x01, 0x01, 0x00, 0x01, 0x7f, 0xfc, 0x01, 0x80, 0x02, 0x00,
53623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02,
53633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0x80, 0x02, 0x00, 0x80, 0x03, 0x00
53643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    },
53653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    scope_mask_bits[] =
53663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
53673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0xc0, 0x07, 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x06, 0x00, 0xc0, 0x06,
53683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0xc0, 0x06, 0x00, 0xc0, 0x06, 0x00, 0xff, 0xfe, 0x01, 0x7f,
53693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0xfc, 0x01, 0x03, 0x80, 0x01, 0x7f, 0xfc, 0x01, 0xff, 0xfe, 0x01,
53703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0xc0, 0x06, 0x00, 0xc0, 0x06, 0x00, 0xc0, 0x06, 0x00, 0xc0, 0x06,
53713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0xc0, 0x07, 0x00, 0xc0, 0x07, 0x00
53723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    };
53733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
53743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Cursor
53753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    cursor;
53763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
53773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Pixmap
53783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    mask,
53793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    source;
53803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
53813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XColor
53823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    background,
53833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    foreground;
53843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
53853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
53863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(window != (Window) NULL);
53873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(colormap != (Colormap) NULL);
53883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(background_color != (char *) NULL);
53893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(foreground_color != (char *) NULL);
53903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",background_color);
53913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  source=XCreateBitmapFromData(display,window,(char *) scope_bits,scope_width,
53923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    scope_height);
53933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  mask=XCreateBitmapFromData(display,window,(char *) scope_mask_bits,
53943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    scope_width,scope_height);
53953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((source == (Pixmap) NULL) || (mask == (Pixmap) NULL))
53963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
53973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowXWindowFatalException(XServerError,"UnableToCreatePixmap","...");
53983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return((Cursor) NULL);
53993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
54003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XParseColor(display,colormap,background_color,&background);
54013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XParseColor(display,colormap,foreground_color,&foreground);
54023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  cursor=XCreatePixmapCursor(display,source,mask,&foreground,&background,
54033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    scope_x_hot,scope_y_hot);
54043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFreePixmap(display,source);
54053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFreePixmap(display,mask);
54063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(cursor);
54073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
54083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
54093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
54103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
54113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
54123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
54133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
54143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X M a k e I m a g e                                                       %
54153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
54163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
54173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
54183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
54193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
54203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XMakeImage() creates an X11 image.  If the image size differs from the X11
54213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  image size, the image is first resized.
54223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
54233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XMakeImage method is:
54243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
54253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType XMakeImage(Display *display,
54263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const XResourceInfo *resource_info,XWindowInfo *window,Image *image,
5427051718b74ad68f8584cdac01d0192974ec777f1bcristy%        unsigned int width,unsigned int height,ExceptionInfo *exception)
54283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
54293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
54303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
54313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server; returned from
54323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
54333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
54343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
54353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
54363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies a pointer to a XWindowInfo structure.
54373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
54383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image: the image.
54393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
54403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o width: Specifies the width in pixels of the rectangular area to
54413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      display.
54423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
54433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o height: Specifies the height in pixels of the rectangular area to
54443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      display.
54453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5446051718b74ad68f8584cdac01d0192974ec777f1bcristy%    o exception: return any errors or warnings in this structure.
5447051718b74ad68f8584cdac01d0192974ec777f1bcristy%
54483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
5449bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate MagickBooleanType XMakeImage(Display *display,
54503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const XResourceInfo *resource_info,XWindowInfo *window,Image *image,
5451051718b74ad68f8584cdac01d0192974ec777f1bcristy  unsigned int width,unsigned int height,ExceptionInfo *exception)
54523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
54533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define CheckOverflowException(length,width,height) \
54543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (((height) != 0) && ((length)/((size_t) height) != ((size_t) width)))
54553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
54563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
54573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    depth,
54583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    format;
54593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
54603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
54613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length;
54623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
54633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XImage
54643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *matte_image,
54653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *ximage;
54663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
54673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
54683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
54693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(resource_info != (XResourceInfo *) NULL);
54703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(window != (XWindowInfo *) NULL);
54713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(width != 0);
54723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(height != 0);
54733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((window->width == 0) || (window->height == 0))
54743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
54753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
54763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Apply user transforms to the image.
54773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
54783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XCheckDefineCursor(display,window->id,window->busy_cursor);
54793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFlush(display);
54803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  depth=(int) window->depth;
54813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->destroy)
54823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window->image=DestroyImage(window->image);
54833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->image=image;
54843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->destroy=MagickFalse;
54853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->image != (Image *) NULL)
54863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
54873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window->crop_geometry != (char *) NULL)
54883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
54893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Image
54903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *crop_image;
54913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
54923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          RectangleInfo
54933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            crop_info;
54943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
54953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
54963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Crop image.
54973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
54983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          window->image->page.x=0;
54993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          window->image->page.y=0;
55003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) ParsePageGeometry(window->image,window->crop_geometry,
55016710d8414f0ed06e4eaf9346366be72e2b4719efcristy            &crop_info,exception);
55026710d8414f0ed06e4eaf9346366be72e2b4719efcristy          crop_image=CropImage(window->image,&crop_info,exception);
55033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (crop_image != (Image *) NULL)
55043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
55053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (window->image != image)
55063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                window->image=DestroyImage(window->image);
55073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              window->image=crop_image;
55083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              window->destroy=MagickTrue;
55093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
55103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
55113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((width != (unsigned int) window->image->columns) ||
55123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (height != (unsigned int) window->image->rows))
55133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
55143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Image
55153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *resize_image;
55163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
55173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
55183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Resize image.
55193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
55203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          resize_image=NewImageList();
55213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (window->pixel_info->colors != 0)
55226710d8414f0ed06e4eaf9346366be72e2b4719efcristy            resize_image=SampleImage(window->image,width,height,exception);
55233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          else
55246710d8414f0ed06e4eaf9346366be72e2b4719efcristy            resize_image=ThumbnailImage(window->image,width,height,exception);
55253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (resize_image != (Image *) NULL)
55263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
55273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (window->image != image)
55283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                window->image=DestroyImage(window->image);
55293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              window->image=resize_image;
55303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              window->destroy=MagickTrue;
55313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
55323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
55333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      width=(unsigned int) window->image->columns;
5534bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      assert((size_t) width == window->image->columns);
55353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      height=(unsigned int) window->image->rows;
5536bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      assert((size_t) height == window->image->rows);
55373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
55383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
55393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Create X image.
55403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
55413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ximage=(XImage *) NULL;
55423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  format=(depth == 1) ? XYBitmap : ZPixmap;
55433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
55443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->shared_memory != MagickFalse)
55453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
55463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XShmSegmentInfo
55473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *segment_info;
55483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
55493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      segment_info=(XShmSegmentInfo *) window->segment_info;
55503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      segment_info[1].shmid=(-1);
55513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      segment_info[1].shmaddr=(char *) NULL;
55523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ximage=XShmCreateImage(display,window->visual,(unsigned int) depth,format,
55533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (char *) NULL,&segment_info[1],width,height);
55543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (ximage == (XImage *) NULL)
55553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        window->shared_memory=MagickFalse;
55563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      length=(size_t) ximage->bytes_per_line*ximage->height;
55573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (CheckOverflowException(length,ximage->bytes_per_line,ximage->height))
55583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        window->shared_memory=MagickFalse;
55593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window->shared_memory != MagickFalse)
55603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        segment_info[1].shmid=shmget(IPC_PRIVATE,length,IPC_CREAT | 0777);
55613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window->shared_memory != MagickFalse)
55623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        segment_info[1].shmaddr=(char *) shmat(segment_info[1].shmid,0,0);
55633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (segment_info[1].shmid < 0)
55643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        window->shared_memory=MagickFalse;
55653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window->shared_memory != MagickFalse)
55663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) shmctl(segment_info[1].shmid,IPC_RMID,0);
55673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
55683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
55693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (ximage != (XImage *) NULL)
55703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDestroyImage(ximage);
55713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ximage=(XImage *) NULL;
55723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (segment_info[1].shmaddr)
55733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
55743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (void) shmdt(segment_info[1].shmaddr);
55753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              segment_info[1].shmaddr=(char *) NULL;
55763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
55773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (segment_info[1].shmid >= 0)
55783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
55793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (void) shmctl(segment_info[1].shmid,IPC_RMID,0);
55803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              segment_info[1].shmid=(-1);
55813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
55823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
55833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
55843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
55853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
55863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Allocate X image pixel data.
55873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
55883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
55893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->shared_memory)
55903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
55913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Status
55923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        status;
55933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
55943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XShmSegmentInfo
55953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *segment_info;
55963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
55973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XSync(display,MagickFalse);
55983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      xerror_alert=MagickFalse;
55993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      segment_info=(XShmSegmentInfo *) window->segment_info;
56003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ximage->data=segment_info[1].shmaddr;
56013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      segment_info[1].readOnly=MagickFalse;
56023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=XShmAttach(display,&segment_info[1]);
56033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (status != False)
56043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XSync(display,MagickFalse);
56053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((status == False) || (xerror_alert != MagickFalse))
56063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
56073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          window->shared_memory=MagickFalse;
56083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (status != False)
56093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XShmDetach(display,&segment_info[1]);
56103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (ximage != (XImage *) NULL)
56113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
56123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              ximage->data=NULL;
56133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              XDestroyImage(ximage);
56143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              ximage=(XImage *) NULL;
56153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
56163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (segment_info[1].shmid >= 0)
56173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
56183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (segment_info[1].shmaddr != NULL)
56193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (void) shmdt(segment_info[1].shmaddr);
56203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (void) shmctl(segment_info[1].shmid,IPC_RMID,0);
56213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              segment_info[1].shmid=(-1);
56223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              segment_info[1].shmaddr=(char *) NULL;
56233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
56243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
56253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
56263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
56273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->shared_memory == MagickFalse)
56283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ximage=XCreateImage(display,window->visual,(unsigned int) depth,format,0,
56293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (char *) NULL,width,height,XBitmapPad(display),0);
56303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (ximage == (XImage *) NULL)
56313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
56323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
56333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Unable to create X image.
56343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
56353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XCheckDefineCursor(display,window->id,window->cursor);
56363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return(MagickFalse);
56373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
56383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  length=(size_t) ximage->bytes_per_line*ximage->height;
56393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (IsEventLogging())
56403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
56413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"XImage:");
56423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"  width, height: %dx%d",
56433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ximage->width,ximage->height);
56443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"  format: %d",
56453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ximage->format);
56463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"  byte order: %d",
56473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ximage->byte_order);
56483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),
56493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "  bitmap unit, bit order, pad: %d %d %d",ximage->bitmap_unit,
56503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ximage->bitmap_bit_order,ximage->bitmap_pad);
56513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"  depth: %d",
56523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ximage->depth);
56533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"  bytes per line: %d",
56543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ximage->bytes_per_line);
56553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"  bits per pixel: %d",
56563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ximage->bits_per_pixel);
56573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),
56583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "  red, green, blue masks: 0x%lx 0x%lx 0x%lx",ximage->red_mask,
56593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ximage->green_mask,ximage->blue_mask);
56603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
56613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->shared_memory == MagickFalse)
56623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
56633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (ximage->format != XYBitmap)
56643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ximage->data=(char *) AcquireQuantumMemory((size_t)
56653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ximage->bytes_per_line,(size_t) ximage->height);
56663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
56673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ximage->data=(char *) AcquireQuantumMemory((size_t)
56683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ximage->bytes_per_line*ximage->depth,(size_t) ximage->height);
56693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
56703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (ximage->data == (char *) NULL)
56713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
56723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
56733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Unable to allocate pixel data.
56743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
56753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XDestroyImage(ximage);
56763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ximage=(XImage *) NULL;
56773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XCheckDefineCursor(display,window->id,window->cursor);
56783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return(MagickFalse);
56793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
56803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->ximage != (XImage *) NULL)
56813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
56823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
56833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Destroy previous X image.
56843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
56853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      length=(size_t) window->ximage->bytes_per_line*window->ximage->height;
56863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
56873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window->segment_info != (XShmSegmentInfo *) NULL)
56883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
56893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          XShmSegmentInfo
56903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *segment_info;
56913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
56923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          segment_info=(XShmSegmentInfo *) window->segment_info;
56933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (segment_info[0].shmid >= 0)
56943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
56953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (void) XSync(display,MagickFalse);
56963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (void) XShmDetach(display,&segment_info[0]);
56973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (void) XSync(display,MagickFalse);
56983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (segment_info[0].shmaddr != (char *) NULL)
56993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (void) shmdt(segment_info[0].shmaddr);
57003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (void) shmctl(segment_info[0].shmid,IPC_RMID,0);
57013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              segment_info[0].shmid=(-1);
57023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              segment_info[0].shmaddr=(char *) NULL;
57033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              window->ximage->data=(char *) NULL;
57043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
57053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
57063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
57073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window->ximage->data != (char *) NULL)
57083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        free(window->ximage->data);
57093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window->ximage->data=(char *) NULL;
57103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XDestroyImage(window->ximage);
57113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window->ximage=(XImage *) NULL;
57123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
57133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
57143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->segment_info != (XShmSegmentInfo *) NULL)
57153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
57163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XShmSegmentInfo
57173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *segment_info;
57183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
57193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      segment_info=(XShmSegmentInfo *) window->segment_info;
57203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      segment_info[0]=segment_info[1];
57213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
57223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
57233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->ximage=ximage;
57243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  matte_image=(XImage *) NULL;
57253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((window->shape != MagickFalse) && (window->image != (Image *) NULL))
57263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((window->image->matte != MagickFalse) &&
5727c57f694b2d04975a0e501613e34368c464708c19cristy        ((int) width <= XDisplayWidth(display,window->screen)) &&
5728c57f694b2d04975a0e501613e34368c464708c19cristy        ((int) height <= XDisplayHeight(display,window->screen)))
57293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
57303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
57313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Create matte image.
57323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
57333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        matte_image=XCreateImage(display,window->visual,1,XYBitmap,0,
57343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (char *) NULL,width,height,XBitmapPad(display),0);
57353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (IsEventLogging())
57363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
57373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) LogMagickEvent(X11Event,GetMagickModule(),"Matte Image:");
57383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) LogMagickEvent(X11Event,GetMagickModule(),
57393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              "  width, height: %dx%d",matte_image->width,matte_image->height);
57403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
57413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (matte_image != (XImage *) NULL)
57423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
57433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
57443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Allocate matte image pixel data.
57453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
57463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            matte_image->data=(char *) AcquireQuantumMemory((size_t)
57473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              matte_image->bytes_per_line*matte_image->depth,
57483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (size_t) matte_image->height);
57493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (matte_image->data == (char *) NULL)
57503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
57513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                XDestroyImage(matte_image);
57523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                matte_image=(XImage *) NULL;
57533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
57543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
57553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
57563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->matte_image != (XImage *) NULL)
57573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
57583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
57593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Free matte image.
57603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
57613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window->matte_image->data != (char *) NULL)
57623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        free(window->matte_image->data);
57633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window->matte_image->data=(char *) NULL;
57643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XDestroyImage(window->matte_image);
57653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window->matte_image=(XImage *) NULL;
57663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
57673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->matte_image=matte_image;
57683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->matte_pixmap != (Pixmap) NULL)
57693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
57703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XFreePixmap(display,window->matte_pixmap);
57713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window->matte_pixmap=(Pixmap) NULL;
57723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HAVE_SHAPE)
57733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window->shape != MagickFalse)
57743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XShapeCombineMask(display,window->id,ShapeBounding,0,0,None,ShapeSet);
57753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
57763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
57773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->stasis=MagickFalse;
57783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
57793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Convert pixels to X image data.
57803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
57813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->image != (Image *) NULL)
57823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
57833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((ximage->byte_order == LSBFirst) || ((ximage->format == XYBitmap) &&
57843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (ximage->bitmap_bit_order == LSBFirst)))
57853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XMakeImageLSBFirst(resource_info,window,window->image,ximage,
5786e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy          matte_image,exception);
57873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
57883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XMakeImageMSBFirst(resource_info,window,window->image,ximage,
5789e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy          matte_image,exception);
57903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
57913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->matte_image != (XImage *) NULL)
57923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
57933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
57943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Create matte pixmap.
57953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
57963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window->matte_pixmap=XCreatePixmap(display,window->id,width,height,1);
57973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window->matte_pixmap != (Pixmap) NULL)
57983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
57993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          GC
58003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            graphics_context;
58013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
58023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          XGCValues
58033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            context_values;
58043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
58053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
58063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Copy matte image to matte pixmap.
58073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
58084c08aed51c5899665ade97263692328eea4af106cristy          context_values.background=0;
58094c08aed51c5899665ade97263692328eea4af106cristy          context_values.foreground=1;
58103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          graphics_context=XCreateGC(display,window->matte_pixmap,
5811bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            (size_t) (GCBackground | GCForeground),&context_values);
58123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) XPutImage(display,window->matte_pixmap,graphics_context,
58133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            window->matte_image,0,0,0,0,width,height);
58143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) XFreeGC(display,graphics_context);
58153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HAVE_SHAPE)
58163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (window->shape != MagickFalse)
58173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XShapeCombineMask(display,window->id,ShapeBounding,0,0,
58183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              window->matte_pixmap,ShapeSet);
58193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
58203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
58213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
58223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XMakePixmap(display,resource_info,window);
58233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
58243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Restore cursor.
58253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
58263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XCheckDefineCursor(display,window->id,window->cursor);
58273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickTrue);
58283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
58293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
58303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
58313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
58323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
58333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
58343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
58353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy+   X M a k e I m a g e L S B F i r s t                                       %
58363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
58373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
58383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
58393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
58403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
58413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XMakeImageLSBFirst() initializes the pixel data of an X11 Image. The X image
58423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  pixels are copied in least-significant bit and byte first order.  The
58433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  server's scanline pad is respected.  Rather than using one or two general
58443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  cases, many special cases are found here to help speed up the image
58453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  conversion.
58463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
58473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XMakeImageLSBFirst method is:
58483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5849e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy%      void XMakeImageLSBFirst(Display *display,XWindows *windows,
5850e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy%        ExceptionInfo *exception)
58513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
58523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
58533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
58543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
58553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
58563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies a pointer to a XWindowInfo structure.
58573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
58583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image: the image.
58593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
58603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o ximage: Specifies a pointer to a XImage structure;  returned from
58613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XCreateImage.
58623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
58633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o matte_image: Specifies a pointer to a XImage structure;  returned from
58643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XCreateImage.
58653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5866e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy%    o exception: return any errors or warnings in this structure.
5867e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy%
58683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
58693ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void XMakeImageLSBFirst(const XResourceInfo *resource_info,
5870e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy  const XWindowInfo *window,Image *image,XImage *ximage,XImage *matte_image,
5871e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy  ExceptionInfo *exception)
58723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
5873c57f694b2d04975a0e501613e34368c464708c19cristy  CacheView
5874c57f694b2d04975a0e501613e34368c464708c19cristy    *canvas_view;
5875c57f694b2d04975a0e501613e34368c464708c19cristy
58763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image
58773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *canvas;
58783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
58793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
58803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y;
58813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
58824c08aed51c5899665ade97263692328eea4af106cristy  register const Quantum
58833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
58843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
58853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register int
58863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x;
58873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
58883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register unsigned char
58893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
58903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
58913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned char
58923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    bit,
58933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    byte;
58943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
58953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
58963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    scanline_pad;
58973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5898f2faecf9facdbbb14fcba373365f9f691a9658e0cristy  unsigned long
58993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel,
59003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *pixels;
59013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
59023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XStandardColormap
59033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *map_info;
59043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
59053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(resource_info != (XResourceInfo *) NULL);
59063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(window != (XWindowInfo *) NULL);
59073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image != (Image *) NULL);
59083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image->debug != MagickFalse)
59093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
59103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  canvas=image;
5911bab87c3357f708174fd2d8ab87a0d7dbb3f70e31cristy  if ((window->immutable == MagickFalse) &&
591254666e85e8e3b0eca47d318178a186ebb2901a73cristy      (image->storage_class == DirectClass) && (image->matte != MagickFalse))
59133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
59143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      char
59153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        size[MaxTextExtent];
59163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
59173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Image
59183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *pattern;
59193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
59203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ImageInfo
59213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *image_info;
59223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
59233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image_info=AcquireImageInfo();
59243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) CopyMagickString(image_info->filename,
59253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        resource_info->image_info->texture != (char *) NULL ?
59263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        resource_info->image_info->texture : "pattern:checkerboard",
59273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        MaxTextExtent);
5928b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy      (void) FormatLocaleString(size,MaxTextExtent,"%.20gx%.20g",(double)
5929e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy        image->columns,(double) image->rows);
59303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image_info->size=ConstantString(size);
59316710d8414f0ed06e4eaf9346366be72e2b4719efcristy      pattern=ReadImage(image_info,exception);
59323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image_info=DestroyImageInfo(image_info);
59333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (pattern != (Image *) NULL)
59343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
59356710d8414f0ed06e4eaf9346366be72e2b4719efcristy          canvas=CloneImage(image,0,0,MagickTrue,exception);
59363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (canvas != (Image *) NULL)
5937e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy            (void) CompositeImage(canvas,DstOverCompositeOp,pattern,0,0,
5938e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy              exception);
59393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          pattern=DestroyImage(pattern);
59403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
59413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
59423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  scanline_pad=(unsigned int) (ximage->bytes_per_line-((ximage->width*
59433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ximage->bits_per_pixel) >> 3));
59443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  map_info=window->map_info;
59453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixels=window->pixel_info->pixels;
59463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  q=(unsigned char *) ximage->data;
59473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  x=0;
5948c57f694b2d04975a0e501613e34368c464708c19cristy  canvas_view=AcquireCacheView(canvas);
59493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (ximage->format == XYBitmap)
59503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
59513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      register unsigned short
59523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        polarity;
59533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
59543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      unsigned char
59553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        background,
59563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        foreground;
59573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
59583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
59593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Convert canvas to big-endian bitmap.
59603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
59613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      background=(unsigned char)
59623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (XPixelIntensity(&window->pixel_info->foreground_color) <
59633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy         XPixelIntensity(&window->pixel_info->background_color) ? 0x80 : 0x00);
59643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      foreground=(unsigned char)
59653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (XPixelIntensity(&window->pixel_info->background_color) <
59663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy         XPixelIntensity(&window->pixel_info->foreground_color) ? 0x80 : 0x00);
5967101ab708b0574518ac5715da4d3915400e9df79acristy      polarity=(unsigned short) ((GetPixelInfoIntensity(
59683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        &canvas->colormap[0])) < ((Quantum) QuantumRange/2) ? 1 : 0);
59693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (canvas->colors == 2)
5970101ab708b0574518ac5715da4d3915400e9df79acristy        polarity=GetPixelInfoIntensity(&canvas->colormap[0]) <
5971101ab708b0574518ac5715da4d3915400e9df79acristy          GetPixelInfoIntensity(&canvas->colormap[1]);
59723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (y=0; y < (int) canvas->rows; y++)
59733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
5974c57f694b2d04975a0e501613e34368c464708c19cristy        p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,canvas->columns,1,
59756710d8414f0ed06e4eaf9346366be72e2b4719efcristy          exception);
59764c08aed51c5899665ade97263692328eea4af106cristy        if (p == (const Quantum *) NULL)
59773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
59783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        bit=0;
59793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        byte=0;
59803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for (x=0; x < (int) canvas->columns; x++)
59813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
59823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          byte>>=1;
59834c08aed51c5899665ade97263692328eea4af106cristy          if (GetPixelIndex(canvas,p) == (Quantum) polarity)
59843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            byte|=foreground;
59853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          else
59863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            byte|=background;
59873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          bit++;
59883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (bit == 8)
59893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
59903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *q++=byte;
59913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              bit=0;
59923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              byte=0;
59933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
5994ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          p+=GetPixelChannels(canvas);
59953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
59963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (bit != 0)
59973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *q=byte >> (8-bit);
59983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q+=scanline_pad;
59993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
60003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
60013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
60023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (window->pixel_info->colors != 0)
60033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      switch (ximage->bits_per_pixel)
60043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
60053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 2:
60063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
60073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          register unsigned int
60083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            nibble;
60093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
60103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
60113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Convert to 2 bit color-mapped X canvas.
60123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
60133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (y=0; y < (int) canvas->rows; y++)
60143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
6015c57f694b2d04975a0e501613e34368c464708c19cristy            p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
60166710d8414f0ed06e4eaf9346366be72e2b4719efcristy              canvas->columns,1,exception);
60174c08aed51c5899665ade97263692328eea4af106cristy            if (p == (const Quantum *) NULL)
60183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
60193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            nibble=0;
60203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (x=0; x < (int) canvas->columns; x++)
60213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
60224c08aed51c5899665ade97263692328eea4af106cristy              pixel=pixels[(ssize_t) GetPixelIndex(canvas,p)] & 0x0f;
60233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              switch (nibble)
60243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
60253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 0:
60263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
60273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q=(unsigned char) pixel;
60283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble++;
60293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
60303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
60313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 1:
60323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
60333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q|=(unsigned char) (pixel << 2);
60343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble++;
60353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
60363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
60373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 2:
60383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
60393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q|=(unsigned char) (pixel << 4);
60403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble++;
60413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
60423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
60433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 3:
60443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
60453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q|=(unsigned char) (pixel << 6);
60463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  q++;
60473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble=0;
60483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
60493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
60503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
6051ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              p+=GetPixelChannels(canvas);
60523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
60533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q+=scanline_pad;
60543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
60553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
60563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
60573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 4:
60583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
60593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          register unsigned int
60603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            nibble;
60613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
60623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
60633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Convert to 4 bit color-mapped X canvas.
60643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
60653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (y=0; y < (int) canvas->rows; y++)
60663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
6067c57f694b2d04975a0e501613e34368c464708c19cristy            p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
60686710d8414f0ed06e4eaf9346366be72e2b4719efcristy              canvas->columns,1,exception);
60694c08aed51c5899665ade97263692328eea4af106cristy            if (p == (const Quantum *) NULL)
60703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
60713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            nibble=0;
60723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (x=0; x < (int) canvas->columns; x++)
60733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
60744c08aed51c5899665ade97263692328eea4af106cristy              pixel=pixels[(ssize_t) GetPixelIndex(canvas,p)] & 0xf;
60753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              switch (nibble)
60763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
60773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 0:
60783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
60793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q=(unsigned char) pixel;
60803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble++;
60813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
60823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
60833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 1:
60843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
60853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q|=(unsigned char) (pixel << 4);
60863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  q++;
60873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble=0;
60883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
60893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
60903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
6091ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              p+=GetPixelChannels(canvas);
60923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
60933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q+=scanline_pad;
60943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
60953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
60963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
60973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 6:
60983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 8:
60993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
61003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
61013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Convert to 8 bit color-mapped X canvas.
61023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
61033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (resource_info->color_recovery &&
61043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              resource_info->quantize_info->dither)
61053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
61066710d8414f0ed06e4eaf9346366be72e2b4719efcristy              XDitherImage(canvas,ximage,exception);
61073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
61083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
61093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (y=0; y < (int) canvas->rows; y++)
61103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
6111c57f694b2d04975a0e501613e34368c464708c19cristy            p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
61126710d8414f0ed06e4eaf9346366be72e2b4719efcristy              canvas->columns,1,exception);
61134c08aed51c5899665ade97263692328eea4af106cristy            if (p == (const Quantum *) NULL)
61143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
61153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (x=0; x < (int) canvas->columns; x++)
61163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
61174c08aed51c5899665ade97263692328eea4af106cristy              pixel=pixels[(ssize_t) GetPixelIndex(canvas,p)];
61183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *q++=(unsigned char) pixel;
6119ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              p+=GetPixelChannels(canvas);
61203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
61213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q+=scanline_pad;
61223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
61233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
61243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
61253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        default:
61263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
61273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          register int
61283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            k;
61293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
61303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          register unsigned int
61313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            bytes_per_pixel;
61323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
61333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          unsigned char
6134bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            channel[sizeof(size_t)];
61353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
61363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
61373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Convert to multi-byte color-mapped X canvas.
61383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
61393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          bytes_per_pixel=(unsigned int) (ximage->bits_per_pixel >> 3);
61403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (y=0; y < (int) canvas->rows; y++)
61413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
6142c57f694b2d04975a0e501613e34368c464708c19cristy            p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
61436710d8414f0ed06e4eaf9346366be72e2b4719efcristy              canvas->columns,1,exception);
61444c08aed51c5899665ade97263692328eea4af106cristy            if (p == (const Quantum *) NULL)
61453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
61463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (x=0; x < (int) canvas->columns; x++)
61473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
61484c08aed51c5899665ade97263692328eea4af106cristy              pixel=pixels[(ssize_t) GetPixelIndex(canvas,p)];
61493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              for (k=0; k < (int) bytes_per_pixel; k++)
61503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
61513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                channel[k]=(unsigned char) pixel;
61523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                pixel>>=8;
61533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
61543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              for (k=0; k < (int) bytes_per_pixel; k++)
61553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                *q++=channel[k];
6156ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              p+=GetPixelChannels(canvas);
61573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
61583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q+=scanline_pad;
61593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
61603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
61613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
61623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
61633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    else
61643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      switch (ximage->bits_per_pixel)
61653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
61663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 2:
61673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
61683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          register unsigned int
61693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            nibble;
61703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
61713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
61723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Convert to contiguous 2 bit continuous-tone X canvas.
61733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
61743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (y=0; y < (int) canvas->rows; y++)
61753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
61763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            nibble=0;
6177c57f694b2d04975a0e501613e34368c464708c19cristy            p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
61786710d8414f0ed06e4eaf9346366be72e2b4719efcristy              canvas->columns,1,exception);
61794c08aed51c5899665ade97263692328eea4af106cristy            if (p == (const Quantum *) NULL)
61803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
61813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (x=0; x < (int) canvas->columns; x++)
61823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
61834c08aed51c5899665ade97263692328eea4af106cristy              pixel=XGammaPixel(canvas,map_info,p);
61843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              pixel&=0xf;
61853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              switch (nibble)
61863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
61873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 0:
61883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
61893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q=(unsigned char) pixel;
61903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble++;
61913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
61923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
61933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 1:
61943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
61953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q|=(unsigned char) (pixel << 2);
61963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble++;
61973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
61983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
61993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 2:
62003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
62013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q|=(unsigned char) (pixel << 4);
62023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble++;
62033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
62043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
62053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 3:
62063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
62073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q|=(unsigned char) (pixel << 6);
62083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  q++;
62093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble=0;
62103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
62113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
62123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
6213ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              p+=GetPixelChannels(canvas);
62143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
62153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q+=scanline_pad;
62163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
62173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
62183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
62193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 4:
62203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
62213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          register unsigned int
62223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            nibble;
62233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
62243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
62253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Convert to contiguous 4 bit continuous-tone X canvas.
62263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
62273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (y=0; y < (int) canvas->rows; y++)
62283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
6229c57f694b2d04975a0e501613e34368c464708c19cristy            p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
62306710d8414f0ed06e4eaf9346366be72e2b4719efcristy              canvas->columns,1,exception);
62314c08aed51c5899665ade97263692328eea4af106cristy            if (p == (const Quantum *) NULL)
62323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
62333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            nibble=0;
62343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (x=0; x < (int) canvas->columns; x++)
62353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
62364c08aed51c5899665ade97263692328eea4af106cristy              pixel=XGammaPixel(canvas,map_info,p);
62373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              pixel&=0xf;
62383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              switch (nibble)
62393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
62403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 0:
62413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
62423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q=(unsigned char) pixel;
62433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble++;
62443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
62453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
62463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 1:
62473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
62483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q|=(unsigned char) (pixel << 4);
62493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  q++;
62503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble=0;
62513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
62523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
62533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
6254ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              p+=GetPixelChannels(canvas);
62553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
62563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q+=scanline_pad;
62573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
62583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
62593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
62603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 6:
62613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 8:
62623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
62633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
62643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Convert to contiguous 8 bit continuous-tone X canvas.
62653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
62663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (resource_info->color_recovery &&
62673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              resource_info->quantize_info->dither)
62683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
62696710d8414f0ed06e4eaf9346366be72e2b4719efcristy              XDitherImage(canvas,ximage,exception);
62703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
62713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
62723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (y=0; y < (int) canvas->rows; y++)
62733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
6274c57f694b2d04975a0e501613e34368c464708c19cristy            p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
62756710d8414f0ed06e4eaf9346366be72e2b4719efcristy              canvas->columns,1,exception);
62764c08aed51c5899665ade97263692328eea4af106cristy            if (p == (const Quantum *) NULL)
62773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
62783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (x=0; x < (int) canvas->columns; x++)
62793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
62804c08aed51c5899665ade97263692328eea4af106cristy              pixel=XGammaPixel(canvas,map_info,p);
62813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *q++=(unsigned char) pixel;
6282ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              p+=GetPixelChannels(canvas);
62833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
62843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q+=scanline_pad;
62853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
62863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
62873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
62883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        default:
62893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
62903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((ximage->bits_per_pixel == 32) && (map_info->red_max == 255) &&
62913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (map_info->green_max == 255) && (map_info->blue_max == 255) &&
62923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (map_info->red_mult == 65536L) && (map_info->green_mult == 256) &&
62933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (map_info->blue_mult == 1))
62943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
62953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
62963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Convert to 32 bit continuous-tone X canvas.
62973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
62983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              for (y=0; y < (int) canvas->rows; y++)
62993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
6300c57f694b2d04975a0e501613e34368c464708c19cristy                p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
63016710d8414f0ed06e4eaf9346366be72e2b4719efcristy                  canvas->columns,1,exception);
63024c08aed51c5899665ade97263692328eea4af106cristy                if (p == (const Quantum *) NULL)
63033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
63043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if ((red_gamma != 1.0) || (green_gamma != 1.0) ||
63053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    (blue_gamma != 1.0))
63063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  {
63073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    /*
63083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      Gamma correct canvas.
63093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    */
63103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    for (x=(int) canvas->columns-1; x >= 0; x--)
63113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    {
6312ccf844f01bcfb63e8c6260bc986878089bb4c85bcristy                      *q++=ScaleQuantumToChar(XBlueGamma(
63134c08aed51c5899665ade97263692328eea4af106cristy                        GetPixelBlue(canvas,p)));
6314ccf844f01bcfb63e8c6260bc986878089bb4c85bcristy                      *q++=ScaleQuantumToChar(XGreenGamma(
63154c08aed51c5899665ade97263692328eea4af106cristy                        GetPixelGreen(canvas,p)));
6316ccf844f01bcfb63e8c6260bc986878089bb4c85bcristy                      *q++=ScaleQuantumToChar(XRedGamma(
63174c08aed51c5899665ade97263692328eea4af106cristy                        GetPixelRed(canvas,p)));
63183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      *q++=0;
6319ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy                      p+=GetPixelChannels(canvas);
63203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    }
63213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    continue;
63223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  }
63233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                for (x=(int) canvas->columns-1; x >= 0; x--)
63243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
63254c08aed51c5899665ade97263692328eea4af106cristy                  *q++=ScaleQuantumToChar((Quantum)
63264c08aed51c5899665ade97263692328eea4af106cristy                    GetPixelBlue(canvas,p));
63274c08aed51c5899665ade97263692328eea4af106cristy                  *q++=ScaleQuantumToChar((Quantum)
63284c08aed51c5899665ade97263692328eea4af106cristy                    GetPixelGreen(canvas,p));
63294c08aed51c5899665ade97263692328eea4af106cristy                  *q++=ScaleQuantumToChar((Quantum)
63304c08aed51c5899665ade97263692328eea4af106cristy                    GetPixelRed(canvas,p));
63313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q++=0;
6332ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy                  p+=GetPixelChannels(canvas);
63333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
63343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
63353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
63363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          else
63373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if ((ximage->bits_per_pixel == 32) && (map_info->red_max == 255) &&
63383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (map_info->green_max == 255) && (map_info->blue_max == 255) &&
63393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (map_info->red_mult == 1) && (map_info->green_mult == 256) &&
63403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (map_info->blue_mult == 65536L))
63413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
63423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /*
63433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  Convert to 32 bit continuous-tone X canvas.
63443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                */
63453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                for (y=0; y < (int) canvas->rows; y++)
63463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
6347c57f694b2d04975a0e501613e34368c464708c19cristy                  p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
63486710d8414f0ed06e4eaf9346366be72e2b4719efcristy                    canvas->columns,1,exception);
63494c08aed51c5899665ade97263692328eea4af106cristy                  if (p == (const Quantum *) NULL)
63503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    break;
63513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  if ((red_gamma != 1.0) || (green_gamma != 1.0) ||
63523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      (blue_gamma != 1.0))
63533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    {
63543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      /*
63553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        Gamma correct canvas.
63563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      */
63573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      for (x=(int) canvas->columns-1; x >= 0; x--)
63583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      {
6359ccf844f01bcfb63e8c6260bc986878089bb4c85bcristy                        *q++=ScaleQuantumToChar(XRedGamma(
63604c08aed51c5899665ade97263692328eea4af106cristy                          GetPixelRed(canvas,p)));
6361ccf844f01bcfb63e8c6260bc986878089bb4c85bcristy                        *q++=ScaleQuantumToChar(XGreenGamma(
63624c08aed51c5899665ade97263692328eea4af106cristy                          GetPixelGreen(canvas,p)));
6363ccf844f01bcfb63e8c6260bc986878089bb4c85bcristy                        *q++=ScaleQuantumToChar(XBlueGamma(
63644c08aed51c5899665ade97263692328eea4af106cristy                          GetPixelBlue(canvas,p)));
63653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        *q++=0;
6366ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy                        p+=GetPixelChannels(canvas);
63673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      }
63683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      continue;
63693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    }
63703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  for (x=(int) canvas->columns-1; x >= 0; x--)
63713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  {
6372ccf844f01bcfb63e8c6260bc986878089bb4c85bcristy                    *q++=ScaleQuantumToChar((Quantum)
63734c08aed51c5899665ade97263692328eea4af106cristy                      GetPixelRed(canvas,p));
6374ccf844f01bcfb63e8c6260bc986878089bb4c85bcristy                    *q++=ScaleQuantumToChar((Quantum)
63754c08aed51c5899665ade97263692328eea4af106cristy                      GetPixelGreen(canvas,p));
6376ccf844f01bcfb63e8c6260bc986878089bb4c85bcristy                    *q++=ScaleQuantumToChar((Quantum)
63774c08aed51c5899665ade97263692328eea4af106cristy                      GetPixelBlue(canvas,p));
63783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    *q++=0;
6379ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy                    p+=GetPixelChannels(canvas);
63803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  }
63813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
63823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
63833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            else
63843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
63853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                register int
63863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  k;
63873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
63883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                register unsigned int
63893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  bytes_per_pixel;
63903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
63913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                unsigned char
6392bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy                  channel[sizeof(size_t)];
63933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
63943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /*
63953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  Convert to multi-byte continuous-tone X canvas.
63963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                */
63973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                bytes_per_pixel=(unsigned int) (ximage->bits_per_pixel >> 3);
63983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                for (y=0; y < (int) canvas->rows; y++)
63993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
6400c57f694b2d04975a0e501613e34368c464708c19cristy                  p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
64016710d8414f0ed06e4eaf9346366be72e2b4719efcristy                    canvas->columns,1,exception);
64024c08aed51c5899665ade97263692328eea4af106cristy                  if (p == (const Quantum *) NULL)
64033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    break;
6404c57f694b2d04975a0e501613e34368c464708c19cristy                  for (x=0; x < (int) canvas->columns; x++)
64053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  {
64064c08aed51c5899665ade97263692328eea4af106cristy                    pixel=XGammaPixel(canvas,map_info,p);
64073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    for (k=0; k < (int) bytes_per_pixel; k++)
64083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    {
64093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      channel[k]=(unsigned char) pixel;
64103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      pixel>>=8;
64113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    }
64123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    for (k=0; k < (int) bytes_per_pixel; k++)
64133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      *q++=channel[k];
6414ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy                    p+=GetPixelChannels(canvas);
64153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  }
64163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  q+=scanline_pad;
64173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
64183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
64193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
64203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
64213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
64223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (matte_image != (XImage *) NULL)
64233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
64243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
64253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Initialize matte canvas.
64263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
64273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      scanline_pad=(unsigned int) (matte_image->bytes_per_line-
64283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ((matte_image->width*matte_image->bits_per_pixel) >> 3));
64293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      q=(unsigned char *) matte_image->data;
64303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (y=0; y < (int) canvas->rows; y++)
64313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
6432c57f694b2d04975a0e501613e34368c464708c19cristy        p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,canvas->columns,1,
64336710d8414f0ed06e4eaf9346366be72e2b4719efcristy          exception);
64344c08aed51c5899665ade97263692328eea4af106cristy        if (p == (const Quantum *) NULL)
64353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
64363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        bit=0;
64373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        byte=0;
64383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for (x=(int) canvas->columns-1; x >= 0; x--)
64393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
64403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          byte>>=1;
64414c08aed51c5899665ade97263692328eea4af106cristy          if (GetPixelAlpha(canvas,p) > (QuantumRange/2))
64423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            byte|=0x80;
64433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          bit++;
64443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (bit == 8)
64453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
64463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *q++=byte;
64473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              bit=0;
64483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              byte=0;
64493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
6450ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          p+=GetPixelChannels(canvas);
64513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
64523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (bit != 0)
64533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *q=byte >> (8-bit);
64543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q+=scanline_pad;
64553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
64563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
6457c57f694b2d04975a0e501613e34368c464708c19cristy  canvas_view=DestroyCacheView(canvas_view);
64583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (canvas != image)
64593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    canvas=DestroyImage(canvas);
64603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
64613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
64623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
64633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
64643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
64653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
64663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
64673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy+   X M a k e I m a g e M S B F i r s t                                       %
64683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
64693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
64703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
64713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
64723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
64733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XMakeImageMSBFirst() initializes the pixel data of an X11 Image.  The X
64743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  image pixels are copied in most-significant bit and byte first order.  The
64753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  server's scanline pad is also respected. Rather than using one or two
64763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  general cases, many special cases are found here to help speed up the image
64773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  conversion.
64783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
64793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XMakeImageMSBFirst method is:
64803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6481e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy%      XMakeImageMSBFirst(resource_info,window,image,ximage,matte_image,
6482e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy%        ExceptionInfo *exception)
64833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
64843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
64853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
64863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
64873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
64883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies a pointer to a XWindowInfo structure.
64893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
64903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image: the image.
64913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
64923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o ximage: Specifies a pointer to a XImage structure;  returned from
64933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XCreateImage.
64943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
64953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o matte_image: Specifies a pointer to a XImage structure;  returned from
64963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XCreateImage.
64973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6498e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy%    o exception: return any errors or warnings in this structure.
6499e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy%
65003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
65013ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void XMakeImageMSBFirst(const XResourceInfo *resource_info,
6502e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy  const XWindowInfo *window,Image *image,XImage *ximage,XImage *matte_image,
6503e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy  ExceptionInfo *exception)
65043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
6505c57f694b2d04975a0e501613e34368c464708c19cristy  CacheView
6506c57f694b2d04975a0e501613e34368c464708c19cristy    *canvas_view;
6507c57f694b2d04975a0e501613e34368c464708c19cristy
65083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image
65093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *canvas;
65103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
65113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
65123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y;
65133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
65143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register int
65153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x;
65163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
65174c08aed51c5899665ade97263692328eea4af106cristy  register const Quantum
65183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
65193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
65203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register unsigned char
65213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
65223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
65233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned char
65243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    bit,
65253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    byte;
65263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
65273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
65283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    scanline_pad;
65293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6530f2faecf9facdbbb14fcba373365f9f691a9658e0cristy  unsigned long
65313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel,
65323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *pixels;
65333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
65343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XStandardColormap
65353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *map_info;
65363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
65373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(resource_info != (XResourceInfo *) NULL);
65383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(window != (XWindowInfo *) NULL);
65393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image != (Image *) NULL);
65403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image->debug != MagickFalse)
65413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
65423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  canvas=image;
654354666e85e8e3b0eca47d318178a186ebb2901a73cristy  if ((window->immutable != MagickFalse) &&
654454666e85e8e3b0eca47d318178a186ebb2901a73cristy      (image->storage_class == DirectClass) && (image->matte != MagickFalse))
65453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
65463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      char
65473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        size[MaxTextExtent];
65483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
65493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Image
65503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *pattern;
65513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
65523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ImageInfo
65533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *image_info;
65543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
65553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image_info=AcquireImageInfo();
65563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) CopyMagickString(image_info->filename,
65573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        resource_info->image_info->texture != (char *) NULL ?
65583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        resource_info->image_info->texture : "pattern:checkerboard",
65593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        MaxTextExtent);
6560b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy      (void) FormatLocaleString(size,MaxTextExtent,"%.20gx%.20g",(double)
6561e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy        image->columns,(double) image->rows);
65623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image_info->size=ConstantString(size);
65636710d8414f0ed06e4eaf9346366be72e2b4719efcristy      pattern=ReadImage(image_info,exception);
65643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image_info=DestroyImageInfo(image_info);
65653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (pattern != (Image *) NULL)
65663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
65676710d8414f0ed06e4eaf9346366be72e2b4719efcristy          canvas=CloneImage(image,0,0,MagickTrue,exception);
65683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (canvas != (Image *) NULL)
6569e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy            (void) CompositeImage(canvas,DstOverCompositeOp,pattern,0,0,
6570e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy              exception);
65713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          pattern=DestroyImage(pattern);
65723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
65733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
65744c08aed51c5899665ade97263692328eea4af106cristy  scanline_pad=(unsigned int) (ximage->bytes_per_line-((ximage->width*
65754c08aed51c5899665ade97263692328eea4af106cristy    ximage->bits_per_pixel) >> 3));
65763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  map_info=window->map_info;
65773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixels=window->pixel_info->pixels;
65783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  q=(unsigned char *) ximage->data;
65793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  x=0;
6580c57f694b2d04975a0e501613e34368c464708c19cristy  canvas_view=AcquireCacheView(canvas);
65813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (ximage->format == XYBitmap)
65823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
65833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      register unsigned short
65843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        polarity;
65853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
65863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      unsigned char
65873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        background,
65883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        foreground;
65893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
65903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
65913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Convert canvas to big-endian bitmap.
65923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
65933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      background=(unsigned char)
65943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (XPixelIntensity(&window->pixel_info->foreground_color) <
65953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy         XPixelIntensity(&window->pixel_info->background_color) ?  0x01 : 0x00);
65963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      foreground=(unsigned char)
65973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (XPixelIntensity(&window->pixel_info->background_color) <
65983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy         XPixelIntensity(&window->pixel_info->foreground_color) ?  0x01 : 0x00);
6599101ab708b0574518ac5715da4d3915400e9df79acristy      polarity=(unsigned short) ((GetPixelInfoIntensity(
66003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        &canvas->colormap[0])) < ((Quantum) QuantumRange/2) ? 1 : 0);
66013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (canvas->colors == 2)
6602101ab708b0574518ac5715da4d3915400e9df79acristy        polarity=GetPixelInfoIntensity(&canvas->colormap[0]) <
6603101ab708b0574518ac5715da4d3915400e9df79acristy          GetPixelInfoIntensity(&canvas->colormap[1]);
66043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (y=0; y < (int) canvas->rows; y++)
66053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
6606c57f694b2d04975a0e501613e34368c464708c19cristy        p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,canvas->columns,1,
66076710d8414f0ed06e4eaf9346366be72e2b4719efcristy          exception);
66084c08aed51c5899665ade97263692328eea4af106cristy        if (p == (const Quantum *) NULL)
66093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
66103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        bit=0;
66113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        byte=0;
66123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for (x=(int) canvas->columns-1; x >= 0; x--)
66133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
66143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          byte<<=1;
66154c08aed51c5899665ade97263692328eea4af106cristy          if (GetPixelIndex(canvas,p) == (Quantum) polarity)
66163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            byte|=foreground;
66173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          else
66183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            byte|=background;
66193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          bit++;
66203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (bit == 8)
66213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
66223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *q++=byte;
66233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              bit=0;
66243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              byte=0;
66253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
6626ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          p+=GetPixelChannels(canvas);
66273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
66283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (bit != 0)
66293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *q=byte << (8-bit);
66303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q+=scanline_pad;
66313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
66323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
66333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
66343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (window->pixel_info->colors != 0)
66353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      switch (ximage->bits_per_pixel)
66363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
66373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 2:
66383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
66393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          register unsigned int
66403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            nibble;
66413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
66423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
66433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Convert to 2 bit color-mapped X canvas.
66443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
66453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (y=0; y < (int) canvas->rows; y++)
66463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
6647c57f694b2d04975a0e501613e34368c464708c19cristy            p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
66486710d8414f0ed06e4eaf9346366be72e2b4719efcristy              canvas->columns,1,exception);
66494c08aed51c5899665ade97263692328eea4af106cristy            if (p == (const Quantum *) NULL)
66503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
66513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            nibble=0;
66523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (x=0; x < (int) canvas->columns; x++)
66533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
66544c08aed51c5899665ade97263692328eea4af106cristy              pixel=pixels[(ssize_t)
66554c08aed51c5899665ade97263692328eea4af106cristy                GetPixelIndex(canvas,p)] & 0xf;
66563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              switch (nibble)
66573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
66583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 0:
66593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
66603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q=(unsigned char) (pixel << 6);
66613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble++;
66623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
66633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
66643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 1:
66653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
66663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q|=(unsigned char) (pixel << 4);
66673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble++;
66683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
66693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
66703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 2:
66713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
66723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q|=(unsigned char) (pixel << 2);
66733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble++;
66743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
66753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
66763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 3:
66773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
66783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q|=(unsigned char) pixel;
66793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  q++;
66803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble=0;
66813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
66823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
66833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
6684ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              p+=GetPixelChannels(canvas);
66853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
66863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q+=scanline_pad;
66873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
66883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
66893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
66903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 4:
66913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
66923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          register unsigned int
66933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            nibble;
66943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
66953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
66963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Convert to 4 bit color-mapped X canvas.
66973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
66983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (y=0; y < (int) canvas->rows; y++)
66993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
6700c57f694b2d04975a0e501613e34368c464708c19cristy            p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
67016710d8414f0ed06e4eaf9346366be72e2b4719efcristy              canvas->columns,1,exception);
67024c08aed51c5899665ade97263692328eea4af106cristy            if (p == (const Quantum *) NULL)
67033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
67043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            nibble=0;
67053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (x=0; x < (int) canvas->columns; x++)
67063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
67074c08aed51c5899665ade97263692328eea4af106cristy              pixel=pixels[(ssize_t)
67084c08aed51c5899665ade97263692328eea4af106cristy                GetPixelIndex(canvas,p)] & 0xf;
67093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              switch (nibble)
67103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
67113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 0:
67123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
67133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q=(unsigned char) (pixel << 4);
67143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble++;
67153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
67163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
67173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 1:
67183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
67193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q|=(unsigned char) pixel;
67203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  q++;
67213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble=0;
67223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
67233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
67243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
6725ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              p+=GetPixelChannels(canvas);
67263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
67273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q+=scanline_pad;
67283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
67293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
67303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
67313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 6:
67323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 8:
67333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
67343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
67353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Convert to 8 bit color-mapped X canvas.
67363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
67373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (resource_info->color_recovery &&
67383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              resource_info->quantize_info->dither)
67393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
67406710d8414f0ed06e4eaf9346366be72e2b4719efcristy              XDitherImage(canvas,ximage,exception);
67413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
67423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
67433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (y=0; y < (int) canvas->rows; y++)
67443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
6745c57f694b2d04975a0e501613e34368c464708c19cristy            p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
67466710d8414f0ed06e4eaf9346366be72e2b4719efcristy              canvas->columns,1,exception);
67474c08aed51c5899665ade97263692328eea4af106cristy            if (p == (const Quantum *) NULL)
67483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
67493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (x=0; x < (int) canvas->columns; x++)
67503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
67516710d8414f0ed06e4eaf9346366be72e2b4719efcristy              pixel=pixels[(ssize_t) GetPixelIndex(canvas,p)];
67523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *q++=(unsigned char) pixel;
6753ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              p+=GetPixelChannels(canvas);
67543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
67553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q+=scanline_pad;
67563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
67573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
67583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
67593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        default:
67603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
67613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          register int
67623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            k;
67633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
67643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          register unsigned int
67653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            bytes_per_pixel;
67663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
67673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          unsigned char
6768bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            channel[sizeof(size_t)];
67693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
67703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
67713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Convert to 8 bit color-mapped X canvas.
67723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
67733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          bytes_per_pixel=(unsigned int) (ximage->bits_per_pixel >> 3);
67743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (y=0; y < (int) canvas->rows; y++)
67753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
6776c57f694b2d04975a0e501613e34368c464708c19cristy            p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
67776710d8414f0ed06e4eaf9346366be72e2b4719efcristy              canvas->columns,1,exception);
67784c08aed51c5899665ade97263692328eea4af106cristy            if (p == (const Quantum *) NULL)
67793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
67803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (x=0; x < (int) canvas->columns; x++)
67813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
67824c08aed51c5899665ade97263692328eea4af106cristy              pixel=pixels[(ssize_t)
67834c08aed51c5899665ade97263692328eea4af106cristy                GetPixelIndex(canvas,p)];
67843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              for (k=(int) bytes_per_pixel-1; k >= 0; k--)
67853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
67863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                channel[k]=(unsigned char) pixel;
67873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                pixel>>=8;
67883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
67893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              for (k=0; k < (int) bytes_per_pixel; k++)
67903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                *q++=channel[k];
6791ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              p+=GetPixelChannels(canvas);
67923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
67933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q+=scanline_pad;
67943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
67953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
67963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
67973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
67983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    else
67993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      switch (ximage->bits_per_pixel)
68003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
68013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 2:
68023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
68033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          register unsigned int
68043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            nibble;
68053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
68063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
68073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Convert to 4 bit continuous-tone X canvas.
68083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
68093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (y=0; y < (int) canvas->rows; y++)
68103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
6811c57f694b2d04975a0e501613e34368c464708c19cristy            p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
68126710d8414f0ed06e4eaf9346366be72e2b4719efcristy              canvas->columns,1,exception);
68134c08aed51c5899665ade97263692328eea4af106cristy            if (p == (const Quantum *) NULL)
68143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
68153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            nibble=0;
68163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (x=(int) canvas->columns-1; x >= 0; x--)
68173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
68184c08aed51c5899665ade97263692328eea4af106cristy              pixel=XGammaPixel(canvas,map_info,p);
68193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              pixel&=0xf;
68203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              switch (nibble)
68213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
68223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 0:
68233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
68243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q=(unsigned char) (pixel << 6);
68253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble++;
68263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
68273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
68283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 1:
68293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
68303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q|=(unsigned char) (pixel << 4);
68313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble++;
68323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
68333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
68343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 2:
68353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
68363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q|=(unsigned char) (pixel << 2);
68373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble++;
68383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
68393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
68403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 3:
68413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
68423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q|=(unsigned char) pixel;
68433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  q++;
68443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble=0;
68453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
68463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
68473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
6848ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              p+=GetPixelChannels(canvas);
68493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
68503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q+=scanline_pad;
68513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
68523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
68533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
68543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 4:
68553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
68563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          register unsigned int
68573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            nibble;
68583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
68593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
68603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Convert to 4 bit continuous-tone X canvas.
68613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
68623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (y=0; y < (int) canvas->rows; y++)
68633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
6864c57f694b2d04975a0e501613e34368c464708c19cristy            p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
68656710d8414f0ed06e4eaf9346366be72e2b4719efcristy              canvas->columns,1,exception);
68664c08aed51c5899665ade97263692328eea4af106cristy            if (p == (const Quantum *) NULL)
68673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
68683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            nibble=0;
68693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (x=(int) canvas->columns-1; x >= 0; x--)
68703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
68714c08aed51c5899665ade97263692328eea4af106cristy              pixel=XGammaPixel(canvas,map_info,p);
68723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              pixel&=0xf;
68733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              switch (nibble)
68743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
68753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 0:
68763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
68773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q=(unsigned char) (pixel << 4);
68783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble++;
68793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
68803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
68813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 1:
68823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
68833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q|=(unsigned char) pixel;
68843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  q++;
68853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble=0;
68863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
68873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
68883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
6889ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              p+=GetPixelChannels(canvas);
68903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
68913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q+=scanline_pad;
68923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
68933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
68943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
68953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 6:
68963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 8:
68973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
68983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
68993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Convert to 8 bit continuous-tone X canvas.
69003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
69013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (resource_info->color_recovery &&
69023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              resource_info->quantize_info->dither)
69033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
69046710d8414f0ed06e4eaf9346366be72e2b4719efcristy              XDitherImage(canvas,ximage,exception);
69053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
69063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
69073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (y=0; y < (int) canvas->rows; y++)
69083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
6909c57f694b2d04975a0e501613e34368c464708c19cristy            p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
69106710d8414f0ed06e4eaf9346366be72e2b4719efcristy              canvas->columns,1,exception);
69114c08aed51c5899665ade97263692328eea4af106cristy            if (p == (const Quantum *) NULL)
69123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
69133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (x=(int) canvas->columns-1; x >= 0; x--)
69143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
69154c08aed51c5899665ade97263692328eea4af106cristy              pixel=XGammaPixel(canvas,map_info,p);
69163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *q++=(unsigned char) pixel;
6917ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              p+=GetPixelChannels(canvas);
69183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
69193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q+=scanline_pad;
69203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
69213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
69223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
69233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        default:
69243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
69253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((ximage->bits_per_pixel == 32) && (map_info->red_max == 255) &&
69263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (map_info->green_max == 255) && (map_info->blue_max == 255) &&
69273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (map_info->red_mult == 65536L) && (map_info->green_mult == 256) &&
69283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (map_info->blue_mult == 1))
69293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
69303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
69313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Convert to 32 bit continuous-tone X canvas.
69323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
69333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              for (y=0; y < (int) canvas->rows; y++)
69343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
6935c57f694b2d04975a0e501613e34368c464708c19cristy                p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
69366710d8414f0ed06e4eaf9346366be72e2b4719efcristy                  canvas->columns,1,exception);
69374c08aed51c5899665ade97263692328eea4af106cristy                if (p == (const Quantum *) NULL)
69383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
69393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if ((red_gamma != 1.0) || (green_gamma != 1.0) ||
69403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    (blue_gamma != 1.0))
69413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  {
69423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    /*
69433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      Gamma correct canvas.
69443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    */
69453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    for (x=(int) canvas->columns-1; x >= 0; x--)
69463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    {
69473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      *q++=0;
6948ccf844f01bcfb63e8c6260bc986878089bb4c85bcristy                      *q++=ScaleQuantumToChar(XRedGamma(
69494c08aed51c5899665ade97263692328eea4af106cristy                        GetPixelRed(canvas,p)));
6950ccf844f01bcfb63e8c6260bc986878089bb4c85bcristy                      *q++=ScaleQuantumToChar(XGreenGamma(
69514c08aed51c5899665ade97263692328eea4af106cristy                        GetPixelGreen(canvas,p)));
6952ccf844f01bcfb63e8c6260bc986878089bb4c85bcristy                      *q++=ScaleQuantumToChar(XBlueGamma(
69534c08aed51c5899665ade97263692328eea4af106cristy                        GetPixelBlue(canvas,p)));
6954ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy                      p+=GetPixelChannels(canvas);
69553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    }
69563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    continue;
69573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  }
69583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                for (x=(int) canvas->columns-1; x >= 0; x--)
69593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
69603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q++=0;
69614c08aed51c5899665ade97263692328eea4af106cristy                  *q++=ScaleQuantumToChar((Quantum)
69624c08aed51c5899665ade97263692328eea4af106cristy                    GetPixelRed(canvas,p));
69634c08aed51c5899665ade97263692328eea4af106cristy                  *q++=ScaleQuantumToChar((Quantum)
69644c08aed51c5899665ade97263692328eea4af106cristy                    GetPixelGreen(canvas,p));
69654c08aed51c5899665ade97263692328eea4af106cristy                  *q++=ScaleQuantumToChar((Quantum)
69664c08aed51c5899665ade97263692328eea4af106cristy                    GetPixelBlue(canvas,p));
6967ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy                  p+=GetPixelChannels(canvas);
69683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
69693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
69703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
69713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          else
69723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if ((ximage->bits_per_pixel == 32) && (map_info->red_max == 255) &&
69733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (map_info->green_max == 255) && (map_info->blue_max == 255) &&
69743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (map_info->red_mult == 1) && (map_info->green_mult == 256) &&
69753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (map_info->blue_mult == 65536L))
69763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
69773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /*
69783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  Convert to 32 bit continuous-tone X canvas.
69793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                */
69803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                for (y=0; y < (int) canvas->rows; y++)
69813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
6982c57f694b2d04975a0e501613e34368c464708c19cristy                  p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
69836710d8414f0ed06e4eaf9346366be72e2b4719efcristy                    canvas->columns,1,exception);
69844c08aed51c5899665ade97263692328eea4af106cristy                  if (p == (const Quantum *) NULL)
69853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    break;
69863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  if ((red_gamma != 1.0) || (green_gamma != 1.0) ||
69873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      (blue_gamma != 1.0))
69883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    {
69893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      /*
69903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        Gamma correct canvas.
69913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      */
69923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      for (x=(int) canvas->columns-1; x >= 0; x--)
69933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      {
69943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        *q++=0;
6995ccf844f01bcfb63e8c6260bc986878089bb4c85bcristy                        *q++=ScaleQuantumToChar(XBlueGamma(
69964c08aed51c5899665ade97263692328eea4af106cristy                          GetPixelBlue(canvas,p)));
6997ccf844f01bcfb63e8c6260bc986878089bb4c85bcristy                        *q++=ScaleQuantumToChar(XGreenGamma(
69984c08aed51c5899665ade97263692328eea4af106cristy                          GetPixelGreen(canvas,p)));
6999ccf844f01bcfb63e8c6260bc986878089bb4c85bcristy                        *q++=ScaleQuantumToChar(XRedGamma(
70004c08aed51c5899665ade97263692328eea4af106cristy                          GetPixelRed(canvas,p)));
7001ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy                        p+=GetPixelChannels(canvas);
70023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      }
70033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      continue;
70043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    }
70053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  for (x=(int) canvas->columns-1; x >= 0; x--)
70063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  {
70073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    *q++=0;
7008ccf844f01bcfb63e8c6260bc986878089bb4c85bcristy                    *q++=ScaleQuantumToChar((Quantum)
70094c08aed51c5899665ade97263692328eea4af106cristy                      GetPixelBlue(canvas,p));
7010ccf844f01bcfb63e8c6260bc986878089bb4c85bcristy                    *q++=ScaleQuantumToChar((Quantum)
70114c08aed51c5899665ade97263692328eea4af106cristy                      GetPixelGreen(canvas,p));
7012ccf844f01bcfb63e8c6260bc986878089bb4c85bcristy                    *q++=ScaleQuantumToChar((Quantum)
70134c08aed51c5899665ade97263692328eea4af106cristy                      GetPixelRed(canvas,p));
7014ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy                    p+=GetPixelChannels(canvas);
70153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  }
70163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
70173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
70183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            else
70193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
70203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                register int
70213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  k;
70223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
70233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                register unsigned int
70243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  bytes_per_pixel;
70253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
70263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                unsigned char
7027bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy                  channel[sizeof(size_t)];
70283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
70293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /*
70303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  Convert to multi-byte continuous-tone X canvas.
70313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                */
70323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                bytes_per_pixel=(unsigned int) (ximage->bits_per_pixel >> 3);
70333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                for (y=0; y < (int) canvas->rows; y++)
70343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
7035c57f694b2d04975a0e501613e34368c464708c19cristy                  p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
70366710d8414f0ed06e4eaf9346366be72e2b4719efcristy                    canvas->columns,1,exception);
70374c08aed51c5899665ade97263692328eea4af106cristy                  if (p == (const Quantum *) NULL)
70383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    break;
70393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  for (x=(int) canvas->columns-1; x >= 0; x--)
70403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  {
70414c08aed51c5899665ade97263692328eea4af106cristy                    pixel=XGammaPixel(canvas,map_info,p);
70423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    for (k=(int) bytes_per_pixel-1; k >= 0; k--)
70433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    {
70443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      channel[k]=(unsigned char) pixel;
70453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      pixel>>=8;
70463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    }
70473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    for (k=0; k < (int) bytes_per_pixel; k++)
70483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      *q++=channel[k];
7049ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy                    p+=GetPixelChannels(canvas);
70503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  }
70513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  q+=scanline_pad;
70523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
70533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
70543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
70553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
70563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
70573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (matte_image != (XImage *) NULL)
70583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
70593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
70603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Initialize matte canvas.
70613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
70623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      scanline_pad=(unsigned int) (matte_image->bytes_per_line-
70633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ((matte_image->width*matte_image->bits_per_pixel) >> 3));
70643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      q=(unsigned char *) matte_image->data;
70653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (y=0; y < (int) canvas->rows; y++)
70663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
7067c57f694b2d04975a0e501613e34368c464708c19cristy        p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,canvas->columns,1,
70686710d8414f0ed06e4eaf9346366be72e2b4719efcristy          exception);
70694c08aed51c5899665ade97263692328eea4af106cristy        if (p == (const Quantum *) NULL)
70703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
70713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        bit=0;
70723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        byte=0;
70733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for (x=(int) canvas->columns-1; x >= 0; x--)
70743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
70753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          byte<<=1;
70764c08aed51c5899665ade97263692328eea4af106cristy          if (GetPixelAlpha(canvas,p) > (QuantumRange/2))
70773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            byte|=0x01;
70783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          bit++;
70793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (bit == 8)
70803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
70813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *q++=byte;
70823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              bit=0;
70833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              byte=0;
70843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
7085ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          p+=GetPixelChannels(canvas);
70863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
70873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (bit != 0)
70883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *q=byte << (8-bit);
70893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q+=scanline_pad;
70903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
70913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
7092c57f694b2d04975a0e501613e34368c464708c19cristy  canvas_view=DestroyCacheView(canvas_view);
70933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (canvas != image)
70943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    canvas=DestroyImage(canvas);
70953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
70963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
70973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
70983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
70993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
71003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
71013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
71023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X M a k e M a g n i f y I m a g e                                         %
71033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
71043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
71053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
71063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
71073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
71083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XMakeMagnifyImage() magnifies a region of an X image and displays it.
71093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
71103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XMakeMagnifyImage method is:
71113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
71126710d8414f0ed06e4eaf9346366be72e2b4719efcristy%      void XMakeMagnifyImage(Display *display,XWindows *windows,
71136710d8414f0ed06e4eaf9346366be72e2b4719efcristy%        ExceptionInfo *exception)
71143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
71153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
71163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
71173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
71183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
71193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
71203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o windows: Specifies a pointer to a XWindows structure.
71213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
71226710d8414f0ed06e4eaf9346366be72e2b4719efcristy%    o exception: return any errors or warnings in this structure.
71236710d8414f0ed06e4eaf9346366be72e2b4719efcristy%
71243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
71256710d8414f0ed06e4eaf9346366be72e2b4719efcristyMagickPrivate void XMakeMagnifyImage(Display *display,XWindows *windows,
71266710d8414f0ed06e4eaf9346366be72e2b4719efcristy  ExceptionInfo *exception)
71273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
71283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
71293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    tuple[MaxTextExtent];
71303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
71313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
71323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y;
71333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
71344c08aed51c5899665ade97263692328eea4af106cristy  PixelInfo
71353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel;
71363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
71373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register int
71383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x;
71393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7140bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
71413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
71423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
71433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register unsigned char
71443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p,
71453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
71463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
71479d314ff2c17a77996c05413c2013880387e50f0ecristy  ssize_t
71489d314ff2c17a77996c05413c2013880387e50f0ecristy    n;
71499d314ff2c17a77996c05413c2013880387e50f0ecristy
71503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static unsigned int
71513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    previous_magnify = 0;
71523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
71533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static XWindowInfo
71543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    magnify_window;
71553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
71563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
71573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    height,
71583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    j,
71593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    k,
71603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    l,
71613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    magnify,
71623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    scanline_pad,
71633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width;
71643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
71653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XImage
71663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *ximage;
71673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
71683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
71693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Check boundary conditions.
71703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
71713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
71723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
71733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(windows != (XWindows *) NULL);
71743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magnify=1;
7175bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  for (n=1; n < (ssize_t) windows->magnify.data; n++)
71763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    magnify<<=1;
71773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while ((magnify*windows->image.ximage->width) < windows->magnify.width)
71783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    magnify<<=1;
71793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while ((magnify*windows->image.ximage->height) < windows->magnify.height)
71803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    magnify<<=1;
71813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while (magnify > windows->magnify.width)
71823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    magnify>>=1;
71833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while (magnify > windows->magnify.height)
71843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    magnify>>=1;
71853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (magnify != previous_magnify)
71863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
71873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Status
71883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        status;
71893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
71903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XTextProperty
71913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        window_name;
71923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
71933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
71943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        New magnify factor:  update magnify window name.
71953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
71963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      i=0;
71973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      while ((1 << i) <= (int) magnify)
71983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        i++;
7199b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy      (void) FormatLocaleString(windows->magnify.name,MaxTextExtent,
7200e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy        "Magnify %.20gX",(double) i);
72013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=XStringListToTextProperty(&windows->magnify.name,1,&window_name);
72023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (status != False)
72033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
72043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          XSetWMName(display,windows->magnify.id,&window_name);
72053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          XSetWMIconName(display,windows->magnify.id,&window_name);
72063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) XFree((void *) window_name.value);
72073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
72083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
72093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  previous_magnify=magnify;
72103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ximage=windows->image.ximage;
72113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  width=(unsigned int) windows->magnify.ximage->width;
72123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  height=(unsigned int) windows->magnify.ximage->height;
72133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((windows->magnify.x < 0) ||
72143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (windows->magnify.x >= windows->image.ximage->width))
72153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    windows->magnify.x=windows->image.ximage->width >> 1;
72163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  x=windows->magnify.x-((width/magnify) >> 1);
72173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (x < 0)
72183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x=0;
72193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
72203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (x > (int) (ximage->width-(width/magnify)))
72213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      x=ximage->width-width/magnify;
72223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((windows->magnify.y < 0) ||
72233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (windows->magnify.y >= windows->image.ximage->height))
72243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    windows->magnify.y=windows->image.ximage->height >> 1;
72253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  y=windows->magnify.y-((height/magnify) >> 1);
72263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (y < 0)
72273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y=0;
72283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
72293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (y > (int) (ximage->height-(height/magnify)))
72303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      y=ximage->height-height/magnify;
72313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  q=(unsigned char *) windows->magnify.ximage->data;
72323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  scanline_pad=(unsigned int) (windows->magnify.ximage->bytes_per_line-
72333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ((width*windows->magnify.ximage->bits_per_pixel) >> 3));
72343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (ximage->bits_per_pixel < 8)
72353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
72363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      register unsigned char
72373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        background,
72383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        byte,
72393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        foreground,
72403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        p_bit,
72413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q_bit;
72423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
72433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      register unsigned int
72443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        plane;
72453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
72463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XPixelInfo
72473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *pixel_info;
72483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
72493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      pixel_info=windows->magnify.pixel_info;
72503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      switch (ximage->bitmap_bit_order)
72513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
72523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case LSBFirst:
72533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
72543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
72553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Magnify little-endian bitmap.
72563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
72573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          background=0x00;
72583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          foreground=0x80;
72593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (ximage->format == XYBitmap)
72603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
72613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              background=(unsigned char)
72623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (XPixelIntensity(&pixel_info->foreground_color) <
72633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                 XPixelIntensity(&pixel_info->background_color) ?  0x80 : 0x00);
72643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              foreground=(unsigned char)
72653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (XPixelIntensity(&pixel_info->background_color) <
72663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                 XPixelIntensity(&pixel_info->foreground_color) ?  0x80 : 0x00);
72673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (windows->magnify.depth > 1)
72683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Swap(background,foreground);
72693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
7270bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy          for (i=0; i < (ssize_t) height; i+=magnify)
72713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
72723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
72733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Propogate pixel magnify rows.
72743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
72753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (j=0; j < magnify; j++)
72763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
72773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              p=(unsigned char *) ximage->data+y*ximage->bytes_per_line+
72783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                ((x*ximage->bits_per_pixel) >> 3);
72793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              p_bit=(unsigned char) (x*ximage->bits_per_pixel) & 0x07;
72803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              q_bit=0;
72813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              byte=0;
72823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              for (k=0; k < width; k+=magnify)
72833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
72843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /*
72853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  Propogate pixel magnify columns.
72863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                */
72873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                for (l=0; l < magnify; l++)
72883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
72893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  /*
72903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    Propogate each bit plane.
72913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  */
72923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  for (plane=0; (int) plane < ximage->bits_per_pixel; plane++)
72933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  {
72943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    byte>>=1;
72953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    if (*p & (0x01 << (p_bit+plane)))
72963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      byte|=foreground;
72973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    else
72983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      byte|=background;
72993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    q_bit++;
73003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    if (q_bit == 8)
73013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      {
73023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        *q++=byte;
73033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        q_bit=0;
73043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        byte=0;
73053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      }
73063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  }
73073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
73083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                p_bit+=ximage->bits_per_pixel;
73093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if (p_bit == 8)
73103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  {
73113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    p++;
73123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    p_bit=0;
73133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  }
73143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if (q_bit != 0)
73153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q=byte >> (8-q_bit);
73163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                q+=scanline_pad;
73173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
73183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
73193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            y++;
73203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
73213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
73223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
73233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case MSBFirst:
73243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        default:
73253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
73263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
73273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Magnify big-endian bitmap.
73283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
73293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          background=0x00;
73303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          foreground=0x01;
73313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (ximage->format == XYBitmap)
73323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
73333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              background=(unsigned char)
73343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (XPixelIntensity(&pixel_info->foreground_color) <
73353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                 XPixelIntensity(&pixel_info->background_color) ?  0x01 : 0x00);
73363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              foreground=(unsigned char)
73373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (XPixelIntensity(&pixel_info->background_color) <
73383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                 XPixelIntensity(&pixel_info->foreground_color) ?  0x01 : 0x00);
73393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (windows->magnify.depth > 1)
73403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Swap(background,foreground);
73413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
7342bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy          for (i=0; i < (ssize_t) height; i+=magnify)
73433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
73443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
73453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Propogate pixel magnify rows.
73463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
73473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (j=0; j < magnify; j++)
73483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
73493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              p=(unsigned char *) ximage->data+y*ximage->bytes_per_line+
73503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                ((x*ximage->bits_per_pixel) >> 3);
73513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              p_bit=(unsigned char) (x*ximage->bits_per_pixel) & 0x07;
73523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              q_bit=0;
73533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              byte=0;
73543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              for (k=0; k < width; k+=magnify)
73553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
73563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /*
73573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  Propogate pixel magnify columns.
73583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                */
73593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                for (l=0; l < magnify; l++)
73603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
73613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  /*
73623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    Propogate each bit plane.
73633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  */
73643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  for (plane=0; (int) plane < ximage->bits_per_pixel; plane++)
73653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  {
73663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    byte<<=1;
73673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    if (*p & (0x80 >> (p_bit+plane)))
73683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      byte|=foreground;
73693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    else
73703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      byte|=background;
73713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    q_bit++;
73723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    if (q_bit == 8)
73733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      {
73743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        *q++=byte;
73753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        q_bit=0;
73763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        byte=0;
73773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      }
73783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  }
73793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
73803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                p_bit+=ximage->bits_per_pixel;
73813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if (p_bit == 8)
73823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  {
73833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    p++;
73843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    p_bit=0;
73853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  }
73863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if (q_bit != 0)
73873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q=byte << (8-q_bit);
73883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                q+=scanline_pad;
73893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
73903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
73913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            y++;
73923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
73933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
73943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
73953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
73963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
73973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
73983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    switch (ximage->bits_per_pixel)
73993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
74003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 6:
74013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 8:
74023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
74033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
74043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Magnify 8 bit X image.
74053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
7406bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (i=0; i < (ssize_t) height; i+=magnify)
74073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
74083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
74093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Propogate pixel magnify rows.
74103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
74113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (j=0; j < magnify; j++)
74123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
74133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            p=(unsigned char *) ximage->data+y*ximage->bytes_per_line+
74143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              ((x*ximage->bits_per_pixel) >> 3);
74153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (k=0; k < width; k+=magnify)
74163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
74173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
74183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Propogate pixel magnify columns.
74193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
74203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              for (l=0; l < magnify; l++)
74213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                *q++=(*p);
74223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              p++;
74233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
74243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q+=scanline_pad;
74253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
74263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          y++;
74273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
74283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
74293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
74303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      default:
74313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
74323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        register unsigned int
74333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          bytes_per_pixel,
74343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          m;
74353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
74363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
74373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Magnify multi-byte X image.
74383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
74393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        bytes_per_pixel=(unsigned int) ximage->bits_per_pixel >> 3;
7440bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (i=0; i < (ssize_t) height; i+=magnify)
74413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
74423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
74433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Propogate pixel magnify rows.
74443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
74453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (j=0; j < magnify; j++)
74463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
74473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            p=(unsigned char *) ximage->data+y*ximage->bytes_per_line+
74483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              ((x*ximage->bits_per_pixel) >> 3);
74493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (k=0; k < width; k+=magnify)
74503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
74513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
74523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Propogate pixel magnify columns.
74533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
74543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              for (l=0; l < magnify; l++)
74553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                for (m=0; m < bytes_per_pixel; m++)
74563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q++=(*(p+m));
74573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              p+=bytes_per_pixel;
74583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
74593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q+=scanline_pad;
74603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
74613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          y++;
74623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
74633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
74643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
74653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
74663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
74673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Copy X image to magnify pixmap.
74683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
74693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  x=windows->magnify.x-((width/magnify) >> 1);
74703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (x < 0)
74713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x=(int) ((width >> 1)-windows->magnify.x*magnify);
74723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
74733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (x > (int) (ximage->width-(width/magnify)))
74743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      x=(int) ((ximage->width-windows->magnify.x)*magnify-(width >> 1));
74753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    else
74763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      x=0;
74773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  y=windows->magnify.y-((height/magnify) >> 1);
74783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (y < 0)
74793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y=(int) ((height >> 1)-windows->magnify.y*magnify);
74803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
74813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (y > (int) (ximage->height-(height/magnify)))
74823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      y=(int) ((ximage->height-windows->magnify.y)*magnify-(height >> 1));
74833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    else
74843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      y=0;
74853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((x != 0) || (y != 0))
74863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XFillRectangle(display,windows->magnify.pixmap,
74873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      windows->magnify.annotate_context,0,0,width,height);
74883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XPutImage(display,windows->magnify.pixmap,
74893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    windows->magnify.annotate_context,windows->magnify.ximage,0,0,x,y,width-x,
74903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    height-y);
74913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((magnify > 1) && ((magnify <= (width >> 1)) &&
74923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (magnify <= (height >> 1))))
74933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
74943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      RectangleInfo
74953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        highlight_info;
74963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
74973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
74983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Highlight center pixel.
74993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
7500bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      highlight_info.x=(ssize_t) windows->magnify.width >> 1;
7501bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      highlight_info.y=(ssize_t) windows->magnify.height >> 1;
75023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      highlight_info.width=magnify;
75033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      highlight_info.height=magnify;
75043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XDrawRectangle(display,windows->magnify.pixmap,
75053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->magnify.highlight_context,(int) highlight_info.x,
75063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (int) highlight_info.y,(unsigned int) highlight_info.width-1,
75073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (unsigned int) highlight_info.height-1);
75083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (magnify > 2)
75093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XDrawRectangle(display,windows->magnify.pixmap,
75103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          windows->magnify.annotate_context,(int) highlight_info.x+1,
75113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (int) highlight_info.y+1,(unsigned int) highlight_info.width-3,
75123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (unsigned int) highlight_info.height-3);
75133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
75143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
75153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Show center pixel color.
75163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
75173aa9375ebfc21a5356d6b1754bcd1b162ad666c4cristy  (void) GetOneVirtualPixelInfo(windows->image.image,TileVirtualPixelMethod,
75185201002e1ba0118594060d26142b48bdfb1320a2cristy    (ssize_t) windows->magnify.x,(ssize_t) windows->magnify.y,&pixel,exception);
7519b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleString(tuple,MaxTextExtent,"%d,%d: ",
75203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    windows->magnify.x,windows->magnify.y);
75213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ConcatenateMagickString(tuple,"(",MaxTextExtent);
7522ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy  ConcatenateColorComponent(&pixel,RedPixelChannel,X11Compliance,tuple);
75233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ConcatenateMagickString(tuple,",",MaxTextExtent);
7524ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy  ConcatenateColorComponent(&pixel,GreenPixelChannel,X11Compliance,tuple);
75253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ConcatenateMagickString(tuple,",",MaxTextExtent);
7526ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy  ConcatenateColorComponent(&pixel,BluePixelChannel,X11Compliance,tuple);
75273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (pixel.colorspace == CMYKColorspace)
75283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
75293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) ConcatenateMagickString(tuple,",",MaxTextExtent);
7530ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy      ConcatenateColorComponent(&pixel,BlackPixelChannel,X11Compliance,tuple);
75313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
75323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (pixel.matte != MagickFalse)
75333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
75343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) ConcatenateMagickString(tuple,",",MaxTextExtent);
7535ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy      ConcatenateColorComponent(&pixel,AlphaPixelChannel,X11Compliance,tuple);
75363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
75373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ConcatenateMagickString(tuple,")",MaxTextExtent);
75383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  height=(unsigned int) windows->magnify.font_info->ascent+
75393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    windows->magnify.font_info->descent;
75403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  x=windows->magnify.font_info->max_bounds.width >> 1;
75413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  y=windows->magnify.font_info->ascent+(height >> 2);
75423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XDrawImageString(display,windows->magnify.pixmap,
75433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    windows->magnify.annotate_context,x,y,tuple,(int) strlen(tuple));
75443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  GetColorTuple(&pixel,MagickTrue,tuple);
75453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  y+=height;
75463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XDrawImageString(display,windows->magnify.pixmap,
75473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    windows->magnify.annotate_context,x,y,tuple,(int) strlen(tuple));
7548269c9413034627692b2a7d0a352f9dee4e8eada8cristy  (void) QueryColorname(windows->image.image,&pixel,SVGCompliance,tuple,
75496710d8414f0ed06e4eaf9346366be72e2b4719efcristy    exception);
75503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  y+=height;
75513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XDrawImageString(display,windows->magnify.pixmap,
75523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    windows->magnify.annotate_context,x,y,tuple,(int) strlen(tuple));
75533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
75543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Refresh magnify window.
75553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
75563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magnify_window=windows->magnify;
75573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magnify_window.x=0;
75583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magnify_window.y=0;
75593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XRefreshWindow(display,&magnify_window,(XEvent *) NULL);
75603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
75613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
75623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
75633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
75643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
75653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
75663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
75673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X M a k e P i x m a p                                                     %
75683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
75693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
75703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
75713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
75723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
75733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XMakePixmap() creates an X11 pixmap.
75743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
75753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XMakePixmap method is:
75763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
75773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XMakeStandardColormap(Display *display,XVisualInfo *visual_info,
75783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        XResourceInfo *resource_info,Image *image,XStandardColormap *map_info,
75793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        XPixelInfo *pixel)
75803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
75813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
75823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
75833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
75843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
75853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server; returned from
75863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
75873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
75883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies a pointer to a XWindowInfo structure.
75893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
75903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
75913ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType XMakePixmap(Display *display,
75923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const XResourceInfo *resource_info,XWindowInfo *window)
75933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
75943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
75953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    height,
75963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width;
75973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
75983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
75993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
76003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(resource_info != (XResourceInfo *) NULL);
76013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(window != (XWindowInfo  *) NULL);
76023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->pixmap != (Pixmap) NULL)
76033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
76043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
76053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Destroy previous X pixmap.
76063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
76073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XFreePixmap(display,window->pixmap);
76083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window->pixmap=(Pixmap) NULL;
76093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
76103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->use_pixmap == MagickFalse)
76113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
76123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->ximage == (XImage *) NULL)
76133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
76143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
76153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Display busy cursor.
76163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
76173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XCheckDefineCursor(display,window->id,window->busy_cursor);
76183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFlush(display);
76193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
76203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Create pixmap.
76213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
76223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  width=(unsigned int) window->ximage->width;
76233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  height=(unsigned int) window->ximage->height;
76243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->pixmap=XCreatePixmap(display,window->id,width,height,window->depth);
76253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->pixmap == (Pixmap) NULL)
76263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
76273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
76283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Unable to allocate pixmap.
76293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
76303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XCheckDefineCursor(display,window->id,window->cursor);
76313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return(MagickFalse);
76323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
76333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
76343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Copy X image to pixmap.
76353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
76363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
76373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->shared_memory)
76383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XShmPutImage(display,window->pixmap,window->annotate_context,
76393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window->ximage,0,0,0,0,width,height,MagickTrue);
76403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
76413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->shared_memory == MagickFalse)
76423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XPutImage(display,window->pixmap,window->annotate_context,
76433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window->ximage,0,0,0,0,width,height);
76443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (IsEventLogging())
76453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
76463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"Pixmap:");
76473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"  width, height: %ux%u",
76483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        width,height);
76493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
76503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
76513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Restore cursor.
76523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
76533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XCheckDefineCursor(display,window->id,window->cursor);
76543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickTrue);
76553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
76563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
76573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
76583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
76593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
76603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
76613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
76623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X M a k e S t a n d a r d C o l o r m a p                                 %
76633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
76643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
76653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
76663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
76673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
76683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XMakeStandardColormap() creates an X11 Standard Colormap.
76693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
76703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XMakeStandardColormap method is:
76713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
76726710d8414f0ed06e4eaf9346366be72e2b4719efcristy%      void XMakeStandardColormap(Display *display,XVisualInfo *visual_info,
76736710d8414f0ed06e4eaf9346366be72e2b4719efcristy%        XResourceInfo *resource_info,Image *image,XStandardColormap *map_info,
76746710d8414f0ed06e4eaf9346366be72e2b4719efcristy%        XPixelInfo *pixel,ExceptionInfo *exception)
76753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
76763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
76773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
76783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server; returned from
76793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
76803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
76813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o visual_info: Specifies a pointer to a X11 XVisualInfo structure;
76823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      returned from XGetVisualInfo.
76833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
76843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
76853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
76863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image: the image.
76873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
76883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o map_info: If a Standard Colormap type is specified, this structure is
76893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      initialized with info from the Standard Colormap.
76903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
76913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o pixel: Specifies a pointer to a XPixelInfo structure.
76923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
76936710d8414f0ed06e4eaf9346366be72e2b4719efcristy%    o exception: return any errors or warnings in this structure.
76946710d8414f0ed06e4eaf9346366be72e2b4719efcristy%
76953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
76963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
76973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus)
76983ed852eea50f9d4cd633efb8c2b054b8e33c253cristyextern "C" {
76993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
77003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
77013ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic inline MagickRealType DiversityPixelIntensity(
77023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const DiversityPacket *pixel)
77033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
77043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickRealType
77053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    intensity;
77063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
77073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  intensity=0.299*pixel->red+0.587*pixel->green+0.114*pixel->blue;
77083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(intensity);
77093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
77103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
77113ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic int IntensityCompare(const void *x,const void *y)
77123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
77133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  DiversityPacket
77143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *color_1,
77153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *color_2;
77163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
77173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
77183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    diversity;
77193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
77203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  color_1=(DiversityPacket *) x;
77213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  color_2=(DiversityPacket *) y;
77223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  diversity=(int) (DiversityPixelIntensity(color_2)-
77233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    DiversityPixelIntensity(color_1));
77243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(diversity);
77253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
77263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
77273ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic int PopularityCompare(const void *x,const void *y)
77283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
77293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  DiversityPacket
77303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *color_1,
77313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *color_2;
77323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
77333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  color_1=(DiversityPacket *) x;
77343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  color_2=(DiversityPacket *) y;
77353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return((int) color_2->count-(int) color_1->count);
77363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
77373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
77383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus)
77393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
77403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
77413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7742bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristystatic inline Quantum ScaleXToQuantum(const size_t x,
7743bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  const size_t scale)
77443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
77453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return((Quantum) (((MagickRealType) QuantumRange*x)/scale+0.5));
77463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
77473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7748bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XMakeStandardColormap(Display *display,
77493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XVisualInfo *visual_info,XResourceInfo *resource_info,Image *image,
77506710d8414f0ed06e4eaf9346366be72e2b4719efcristy  XStandardColormap *map_info,XPixelInfo *pixel,ExceptionInfo *exception)
77513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
77523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Colormap
77533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    colormap;
77543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7755bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
77563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
77573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
77583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
77593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
77603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7761bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
77623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_colors,
77633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    retain_colors;
77643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
77653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned short
77663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    gray_value;
77673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
77683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XColor
77693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    color,
77703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *colors,
77713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
77723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
77733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
77743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
77753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(visual_info != (XVisualInfo *) NULL);
77763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(map_info != (XStandardColormap *) NULL);
77773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(resource_info != (XResourceInfo *) NULL);
77783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(pixel != (XPixelInfo *) NULL);
77793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (resource_info->map_type != (char *) NULL)
77803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
77813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
77823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Standard Colormap is already defined (i.e. xstdcmap).
77833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
77844c08aed51c5899665ade97263692328eea4af106cristy      XGetPixelInfo(display,visual_info,map_info,resource_info,image,
77853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        pixel);
77863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      number_colors=(unsigned int) (map_info->base_pixel+
77873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (map_info->red_max+1)*(map_info->green_max+1)*(map_info->blue_max+1));
77883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((map_info->red_max*map_info->green_max*map_info->blue_max) != 0)
77893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((image->matte == MagickFalse) &&
77903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (resource_info->color_recovery == MagickFalse) &&
77913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            resource_info->quantize_info->dither &&
77923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (number_colors < MaxColormapSize))
77933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
77943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Image
77953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *affinity_image;
77963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
77974c08aed51c5899665ade97263692328eea4af106cristy            register Quantum
7798c47d1f8ecfe7d04f0f003cca0fe175658bbf0fb2cristy              *restrict q;
77993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
78003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
78013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Improve image appearance with error diffusion.
78023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
78036710d8414f0ed06e4eaf9346366be72e2b4719efcristy            affinity_image=AcquireImage((ImageInfo *) NULL,exception);
78043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (affinity_image == (Image *) NULL)
78053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              ThrowXWindowFatalException(ResourceLimitFatalError,
78063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                "UnableToDitherImage",image->filename);
78073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            affinity_image->columns=number_colors;
78083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            affinity_image->rows=1;
78093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
78103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Initialize colormap image.
78113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
78123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q=QueueAuthenticPixels(affinity_image,0,0,affinity_image->columns,
78133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              1,exception);
78144c08aed51c5899665ade97263692328eea4af106cristy            if (q != (Quantum *) NULL)
78153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
7816bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy                for (i=0; i < (ssize_t) number_colors; i++)
78173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
78184c08aed51c5899665ade97263692328eea4af106cristy                  SetPixelRed(affinity_image,0,q);
78193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  if (map_info->red_max != 0)
78204c08aed51c5899665ade97263692328eea4af106cristy                    SetPixelRed(affinity_image,
78214c08aed51c5899665ade97263692328eea4af106cristy                      ScaleXToQuantum((size_t) (i/map_info->red_mult),
78224c08aed51c5899665ade97263692328eea4af106cristy                      map_info->red_max),q);
78234c08aed51c5899665ade97263692328eea4af106cristy                  SetPixelGreen(affinity_image,0,q);
78243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  if (map_info->green_max != 0)
78254c08aed51c5899665ade97263692328eea4af106cristy                    SetPixelGreen(affinity_image,
78264c08aed51c5899665ade97263692328eea4af106cristy                      ScaleXToQuantum((size_t) ((i/map_info->green_mult) %
78274c08aed51c5899665ade97263692328eea4af106cristy                      (map_info->green_max+1)),map_info->green_max),q);
78284c08aed51c5899665ade97263692328eea4af106cristy                  SetPixelBlue(affinity_image,0,q);
78293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  if (map_info->blue_max != 0)
78304c08aed51c5899665ade97263692328eea4af106cristy                    SetPixelBlue(affinity_image,
78314c08aed51c5899665ade97263692328eea4af106cristy                      ScaleXToQuantum((size_t) (i % map_info->green_mult),
78324c08aed51c5899665ade97263692328eea4af106cristy                      map_info->blue_max),q);
78334c08aed51c5899665ade97263692328eea4af106cristy                  SetPixelAlpha(affinity_image,
78344c08aed51c5899665ade97263692328eea4af106cristy                    TransparentAlpha,q);
7835ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy                  q+=GetPixelChannels(affinity_image);
78363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
78373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (void) SyncAuthenticPixels(affinity_image,exception);
78383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (void) RemapImage(resource_info->quantize_info,image,
7839018f07f7333b25743d0afff892450cebdb905c1acristy                  affinity_image,exception);
78403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
78414c08aed51c5899665ade97263692328eea4af106cristy            XGetPixelInfo(display,visual_info,map_info,resource_info,image,
78423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              pixel);
7843574cc26500992189f637cd1cdf93d0654e7df7aecristy            (void) SetImageStorageClass(image,DirectClass,exception);
78443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            affinity_image=DestroyImage(affinity_image);
78453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
78463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (IsEventLogging())
78473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
78483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) LogMagickEvent(X11Event,GetMagickModule(),
78493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            "Standard Colormap:");
78503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) LogMagickEvent(X11Event,GetMagickModule(),
78513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            "  colormap id: 0x%lx",map_info->colormap);
78523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) LogMagickEvent(X11Event,GetMagickModule(),
78533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            "  red, green, blue max: %lu %lu %lu",map_info->red_max,
78543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            map_info->green_max,map_info->blue_max);
78553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) LogMagickEvent(X11Event,GetMagickModule(),
78563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            "  red, green, blue mult: %lu %lu %lu",map_info->red_mult,
78573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            map_info->green_mult,map_info->blue_mult);
78583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
78593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return;
78603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
78613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((visual_info->klass != DirectColor) &&
78623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (visual_info->klass != TrueColor))
78633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((image->storage_class == DirectClass) ||
78643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ((int) image->colors > visual_info->colormap_size))
78653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
78663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        QuantizeInfo
78673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          quantize_info;
78683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
78693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
78703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Image has more colors than the visual supports.
78713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
78723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        quantize_info=(*resource_info->quantize_info);
7873bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        quantize_info.number_colors=(size_t) visual_info->colormap_size;
7874018f07f7333b25743d0afff892450cebdb905c1acristy        (void) QuantizeImage(&quantize_info,image,exception);
78753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
78763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
78773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Free previous and create new colormap.
78783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
78793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFreeStandardColormap(display,visual_info,map_info,pixel);
78803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  colormap=XDefaultColormap(display,visual_info->screen);
78813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (visual_info->visual != XDefaultVisual(display,visual_info->screen))
78823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    colormap=XCreateColormap(display,XRootWindow(display,visual_info->screen),
78833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      visual_info->visual,visual_info->klass == DirectColor ?
78843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      AllocAll : AllocNone);
78853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (colormap == (Colormap) NULL)
78863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowXWindowFatalException(ResourceLimitFatalError,"UnableToCreateColormap",
78873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image->filename);
78883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
78893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize the map and pixel info structures.
78903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
78913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XGetMapInfo(visual_info,colormap,map_info);
78924c08aed51c5899665ade97263692328eea4af106cristy  XGetPixelInfo(display,visual_info,map_info,resource_info,image,pixel);
78933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
78943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Allocating colors in server colormap is based on visual class.
78953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
78963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  switch (visual_info->klass)
78973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
78983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case StaticGray:
78993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case StaticColor:
79003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
79013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
79023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Define Standard Colormap for StaticGray or StaticColor visual.
79033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
79043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      number_colors=image->colors;
79053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      colors=(XColor *) AcquireQuantumMemory((size_t)
79063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        visual_info->colormap_size,sizeof(*colors));
79073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (colors == (XColor *) NULL)
79083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowXWindowFatalException(ResourceLimitFatalError,
79093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          "UnableToCreateColormap",image->filename);
79103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      p=colors;
79113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      color.flags=(char) (DoRed | DoGreen | DoBlue);
7912bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (i=0; i < (ssize_t) image->colors; i++)
79133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
79143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        color.red=ScaleQuantumToShort(XRedGamma(image->colormap[i].red));
79153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        color.green=ScaleQuantumToShort(XGreenGamma(image->colormap[i].green));
79163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        color.blue=ScaleQuantumToShort(XBlueGamma(image->colormap[i].blue));
79173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (visual_info->klass != StaticColor)
79183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
79193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            gray_value=(unsigned short) XPixelIntensity(&color);
79203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            color.red=gray_value;
79213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            color.green=gray_value;
79223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            color.blue=gray_value;
79233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
79243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        status=XAllocColor(display,colormap,&color);
79253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (status == False)
79263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
79273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            colormap=XCopyColormapAndFree(display,colormap);
79283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XAllocColor(display,colormap,&color);
79293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
79303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        pixel->pixels[i]=color.pixel;
79313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *p++=color;
79323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
79333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
79343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
79353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case GrayScale:
79363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case PseudoColor:
79373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
79383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      unsigned int
79393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        colormap_type;
79403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
79413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
79423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Define Standard Colormap for GrayScale or PseudoColor visual.
79433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
79443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      number_colors=image->colors;
79453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      colors=(XColor *) AcquireQuantumMemory((size_t)
79463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        visual_info->colormap_size,sizeof(*colors));
79473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (colors == (XColor *) NULL)
79483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowXWindowFatalException(ResourceLimitFatalError,
79493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          "UnableToCreateColormap",image->filename);
79503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
79513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Preallocate our GUI colors.
79523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
79533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XAllocColor(display,colormap,&pixel->foreground_color);
79543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XAllocColor(display,colormap,&pixel->background_color);
79553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XAllocColor(display,colormap,&pixel->border_color);
79563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XAllocColor(display,colormap,&pixel->matte_color);
79573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XAllocColor(display,colormap,&pixel->highlight_color);
79583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XAllocColor(display,colormap,&pixel->shadow_color);
79593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XAllocColor(display,colormap,&pixel->depth_color);
79603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XAllocColor(display,colormap,&pixel->trough_color);
79613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (i=0; i < MaxNumberPens; i++)
79623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XAllocColor(display,colormap,&pixel->pen_colors[i]);
79633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
79643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Determine if image colors will "fit" into X server colormap.
79653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
79663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      colormap_type=resource_info->colormap;
7967f2faecf9facdbbb14fcba373365f9f691a9658e0cristy      status=XAllocColorCells(display,colormap,MagickFalse,(unsigned long *)
79683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        NULL,0,pixel->pixels,(unsigned int) image->colors);
79693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (status != False)
79703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        colormap_type=PrivateColormap;
79713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (colormap_type == SharedColormap)
79723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
7973c57f694b2d04975a0e501613e34368c464708c19cristy          CacheView
7974c57f694b2d04975a0e501613e34368c464708c19cristy            *image_view;
7975c57f694b2d04975a0e501613e34368c464708c19cristy
79763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          DiversityPacket
79773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *diversity;
79783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
79793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          int
79803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            y;
79813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
79823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          register int
79833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            x;
79843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
79853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          unsigned short
79863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            index;
79873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
79883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          XColor
79893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *server_colors;
79903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
79913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
79923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Define Standard colormap for shared GrayScale or PseudoColor visual.
79933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
79943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          diversity=(DiversityPacket *) AcquireQuantumMemory(image->colors,
79953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            sizeof(*diversity));
79963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (diversity == (DiversityPacket *) NULL)
79973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            ThrowXWindowFatalException(ResourceLimitFatalError,
79983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              "UnableToCreateColormap",image->filename);
7999bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy          for (i=0; i < (ssize_t) image->colors; i++)
80003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
8001e42f658533644aecb733785ffd91b286d6778deacristy            diversity[i].red=ClampToQuantum(image->colormap[i].red);
8002e42f658533644aecb733785ffd91b286d6778deacristy            diversity[i].green=ClampToQuantum(image->colormap[i].green);
8003e42f658533644aecb733785ffd91b286d6778deacristy            diversity[i].blue=ClampToQuantum(image->colormap[i].blue);
80043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            diversity[i].index=(unsigned short) i;
80053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            diversity[i].count=0;
80063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
8007c57f694b2d04975a0e501613e34368c464708c19cristy          image_view=AcquireCacheView(image);
80083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (y=0; y < (int) image->rows; y++)
80093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
8010c57f694b2d04975a0e501613e34368c464708c19cristy            register int
80113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              x;
80123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
80134c08aed51c5899665ade97263692328eea4af106cristy            register const Quantum
8014c57f694b2d04975a0e501613e34368c464708c19cristy              *restrict p;
80153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8016c57f694b2d04975a0e501613e34368c464708c19cristy            p=GetCacheViewAuthenticPixels(image_view,0,(ssize_t) y,
8017c57f694b2d04975a0e501613e34368c464708c19cristy              image->columns,1,exception);
80184c08aed51c5899665ade97263692328eea4af106cristy            if (p == (const Quantum *) NULL)
80193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
8020c57f694b2d04975a0e501613e34368c464708c19cristy            for (x=(int) image->columns-1; x >= 0; x--)
80214c08aed51c5899665ade97263692328eea4af106cristy            {
80224c08aed51c5899665ade97263692328eea4af106cristy              diversity[(ssize_t) GetPixelIndex(image,p)].count++;
8023ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              p+=GetPixelChannels(image);
80244c08aed51c5899665ade97263692328eea4af106cristy            }
80253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
8026c57f694b2d04975a0e501613e34368c464708c19cristy          image_view=DestroyCacheView(image_view);
80273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
80283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Sort colors by decreasing intensity.
80293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
80303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          qsort((void *) diversity,image->colors,sizeof(*diversity),
80313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            IntensityCompare);
8032bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy          for (i=0; i < (ssize_t) image->colors; )
80333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
80343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            diversity[i].count<<=4;  /* increase this colors popularity */
8035dfe2b6658f367de8f84405263f62768fb853adafcristy            i+=MagickMax((int) (image->colors >> 4),2);
80363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
80373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          diversity[image->colors-1].count<<=4;
80383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          qsort((void *) diversity,image->colors,sizeof(*diversity),
80393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            PopularityCompare);
80403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
80413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Allocate colors.
80423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
80433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          p=colors;
80443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          color.flags=(char) (DoRed | DoGreen | DoBlue);
8045bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy          for (i=0; i < (ssize_t) image->colors; i++)
80463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
80473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            index=diversity[i].index;
80483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            color.red=
80493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              ScaleQuantumToShort(XRedGamma(image->colormap[index].red));
80503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            color.green=
80513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              ScaleQuantumToShort(XGreenGamma(image->colormap[index].green));
80523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            color.blue=
80533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              ScaleQuantumToShort(XBlueGamma(image->colormap[index].blue));
80543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (visual_info->klass != PseudoColor)
80553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
80563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                gray_value=(unsigned short) XPixelIntensity(&color);
80573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                color.red=gray_value;
80583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                color.green=gray_value;
80593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                color.blue=gray_value;
80603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
80613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            status=XAllocColor(display,colormap,&color);
80623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (status == False)
80633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
80643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            pixel->pixels[index]=color.pixel;
80653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *p++=color;
80663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
80673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
80683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Read X server colormap.
80693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
80703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          server_colors=(XColor *) AcquireQuantumMemory((size_t)
80713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            visual_info->colormap_size,sizeof(*server_colors));
80723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (server_colors == (XColor *) NULL)
80733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            ThrowXWindowFatalException(ResourceLimitFatalError,
80743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              "UnableToCreateColormap",image->filename);
80753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (x=visual_info->colormap_size-1; x >= 0; x--)
8076bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            server_colors[x].pixel=(size_t) x;
80773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) XQueryColors(display,colormap,server_colors,
80783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (int) MagickMin((unsigned int) visual_info->colormap_size,256));
80793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
80803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Select remaining colors from X server colormap.
80813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
8082bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy          for (; i < (ssize_t) image->colors; i++)
80833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
80843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            index=diversity[i].index;
80853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            color.red=
80863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              ScaleQuantumToShort(XRedGamma(image->colormap[index].red));
80873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            color.green=
80883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              ScaleQuantumToShort(XGreenGamma(image->colormap[index].green));
80893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            color.blue=
80903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              ScaleQuantumToShort(XBlueGamma(image->colormap[index].blue));
80913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (visual_info->klass != PseudoColor)
80923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
80933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                gray_value=(unsigned short) XPixelIntensity(&color);
80943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                color.red=gray_value;
80953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                color.green=gray_value;
80963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                color.blue=gray_value;
80973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
80983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XBestPixel(display,colormap,server_colors,(unsigned int)
80993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              visual_info->colormap_size,&color);
81003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            pixel->pixels[index]=color.pixel;
81013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *p++=color;
81023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
81033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((int) image->colors < visual_info->colormap_size)
81043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
81053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
81063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Fill up colors array-- more choices for pen colors.
81073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
81083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              retain_colors=MagickMin((unsigned int)
81093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy               (visual_info->colormap_size-image->colors),256);
8110bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy              for (i=0; i < (ssize_t) retain_colors; i++)
81113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                *p++=server_colors[i];
81123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              number_colors+=retain_colors;
81133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
81143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          server_colors=(XColor *) RelinquishMagickMemory(server_colors);
81153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          diversity=(DiversityPacket *) RelinquishMagickMemory(diversity);
81163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
81173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
81183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
81193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Define Standard colormap for private GrayScale or PseudoColor visual.
81203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
81213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (status == False)
81223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
81233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
81243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Not enough colormap entries in the colormap-- Create a new colormap.
81253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
81263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          colormap=XCreateColormap(display,
81273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XRootWindow(display,visual_info->screen),visual_info->visual,
81283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            AllocNone);
81293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (colormap == (Colormap) NULL)
81303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            ThrowXWindowFatalException(ResourceLimitFatalError,
81313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              "UnableToCreateColormap",image->filename);
81323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          map_info->colormap=colormap;
81333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((int) image->colors < visual_info->colormap_size)
81343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
81353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
81363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Retain colors from the default colormap to help lessens the
81373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                effects of colormap flashing.
81383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
81393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              retain_colors=MagickMin((unsigned int)
81403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (visual_info->colormap_size-image->colors),256);
81413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              p=colors+image->colors;
8142bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy              for (i=0; i < (ssize_t) retain_colors; i++)
81433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
8144c57f694b2d04975a0e501613e34368c464708c19cristy                p->pixel=(unsigned long) i;
81453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                p++;
81463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
81473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (void) XQueryColors(display,
81483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                XDefaultColormap(display,visual_info->screen),
81493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                colors+image->colors,(int) retain_colors);
81503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
81513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Transfer colors from default to private colormap.
81523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
81533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (void) XAllocColorCells(display,colormap,MagickFalse,
8154f2faecf9facdbbb14fcba373365f9f691a9658e0cristy                (unsigned long *) NULL,0,pixel->pixels,(unsigned int)
81553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                retain_colors);
81563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              p=colors+image->colors;
8157bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy              for (i=0; i < (ssize_t) retain_colors; i++)
81583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
81593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                p->pixel=pixel->pixels[i];
81603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                p++;
81613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
81623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (void) XStoreColors(display,colormap,colors+image->colors,
81633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (int) retain_colors);
81643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              number_colors+=retain_colors;
81653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
81663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) XAllocColorCells(display,colormap,MagickFalse,
8167f2faecf9facdbbb14fcba373365f9f691a9658e0cristy            (unsigned long *) NULL,0,pixel->pixels,(unsigned int)
81683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            image->colors);
81693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
81703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
81713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Store the image colormap.
81723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
81733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      p=colors;
81743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      color.flags=(char) (DoRed | DoGreen | DoBlue);
8175bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (i=0; i < (ssize_t) image->colors; i++)
81763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
81773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        color.red=ScaleQuantumToShort(XRedGamma(image->colormap[i].red));
81783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        color.green=ScaleQuantumToShort(XGreenGamma(image->colormap[i].green));
81793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        color.blue=ScaleQuantumToShort(XBlueGamma(image->colormap[i].blue));
81803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (visual_info->klass != PseudoColor)
81813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
81823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            gray_value=(unsigned short) XPixelIntensity(&color);
81833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            color.red=gray_value;
81843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            color.green=gray_value;
81853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            color.blue=gray_value;
81863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
81873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        color.pixel=pixel->pixels[i];
81883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *p++=color;
81893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
81903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XStoreColors(display,colormap,colors,(int) image->colors);
81913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
81923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
81933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case TrueColor:
81943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case DirectColor:
81953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    default:
81963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
81973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      MagickBooleanType
81983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        linear_colormap;
81993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
82003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
82013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Define Standard Colormap for TrueColor or DirectColor visual.
82023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
82033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      number_colors=(unsigned int) ((map_info->red_max*map_info->red_mult)+
82043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (map_info->green_max*map_info->green_mult)+
82053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (map_info->blue_max*map_info->blue_mult)+1);
82063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      linear_colormap=(number_colors > 4096) ||
82073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (((int) (map_info->red_max+1) == visual_info->colormap_size) &&
82083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy         ((int) (map_info->green_max+1) == visual_info->colormap_size) &&
82093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy         ((int) (map_info->blue_max+1) == visual_info->colormap_size)) ?
82103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy         MagickTrue : MagickFalse;
82113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (linear_colormap != MagickFalse)
8212bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        number_colors=(size_t) visual_info->colormap_size;
82133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
82143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Allocate color array.
82153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
82163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      colors=(XColor *) AcquireQuantumMemory(number_colors,sizeof(*colors));
82173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (colors == (XColor *) NULL)
82183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowXWindowFatalException(ResourceLimitFatalError,
82193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          "UnableToCreateColormap",image->filename);
82203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
82213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Initialize linear color ramp.
82223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
82233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      p=colors;
82243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      color.flags=(char) (DoRed | DoGreen | DoBlue);
82253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (linear_colormap != MagickFalse)
8226bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (i=0; i < (ssize_t) number_colors; i++)
82273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
82283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          color.blue=(unsigned short) 0;
82293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (map_info->blue_max != 0)
8230bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            color.blue=(unsigned short) ((size_t)
82313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              ((65535L*(i % map_info->green_mult))/map_info->blue_max));
82323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          color.green=color.blue;
82333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          color.red=color.blue;
82343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          color.pixel=XStandardPixel(map_info,&color);
82353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *p++=color;
82363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
82373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
8238bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (i=0; i < (ssize_t) number_colors; i++)
82393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
82403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          color.red=(unsigned short) 0;
82413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (map_info->red_max != 0)
8242bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            color.red=(unsigned short) ((size_t)
82433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              ((65535L*(i/map_info->red_mult))/map_info->red_max));
82443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          color.green=(unsigned int) 0;
82453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (map_info->green_max != 0)
8246bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            color.green=(unsigned short) ((size_t)
82473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              ((65535L*((i/map_info->green_mult) % (map_info->green_max+1)))/
82483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                map_info->green_max));
82493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          color.blue=(unsigned short) 0;
82503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (map_info->blue_max != 0)
8251bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            color.blue=(unsigned short) ((size_t)
82523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              ((65535L*(i % map_info->green_mult))/map_info->blue_max));
82533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          color.pixel=XStandardPixel(map_info,&color);
82543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *p++=color;
82553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
82563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((visual_info->klass == DirectColor) &&
82573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (colormap != XDefaultColormap(display,visual_info->screen)))
82583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XStoreColors(display,colormap,colors,(int) number_colors);
82593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
8260bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (i=0; i < (ssize_t) number_colors; i++)
82613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) XAllocColor(display,colormap,&colors[i]);
82623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
82633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
82643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
82653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((visual_info->klass != DirectColor) &&
82663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (visual_info->klass != TrueColor))
82673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
82683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
82693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Set foreground, background, border, etc. pixels.
82703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
82713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XBestPixel(display,colormap,colors,(unsigned int) number_colors,
82723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        &pixel->foreground_color);
82733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XBestPixel(display,colormap,colors,(unsigned int) number_colors,
82743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        &pixel->background_color);
82753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (pixel->background_color.pixel == pixel->foreground_color.pixel)
82763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
82773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
82783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Foreground and background colors must differ.
82793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
82803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          pixel->background_color.red=(~pixel->foreground_color.red);
82813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          pixel->background_color.green=
82823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (~pixel->foreground_color.green);
82833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          pixel->background_color.blue=
82843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (~pixel->foreground_color.blue);
82853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          XBestPixel(display,colormap,colors,(unsigned int) number_colors,
82863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            &pixel->background_color);
82873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
82883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XBestPixel(display,colormap,colors,(unsigned int) number_colors,
82893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        &pixel->border_color);
82903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XBestPixel(display,colormap,colors,(unsigned int) number_colors,
82913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        &pixel->matte_color);
82923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XBestPixel(display,colormap,colors,(unsigned int) number_colors,
82933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        &pixel->highlight_color);
82943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XBestPixel(display,colormap,colors,(unsigned int) number_colors,
82953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        &pixel->shadow_color);
82963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XBestPixel(display,colormap,colors,(unsigned int) number_colors,
82973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        &pixel->depth_color);
82983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XBestPixel(display,colormap,colors,(unsigned int) number_colors,
82993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        &pixel->trough_color);
83003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (i=0; i < MaxNumberPens; i++)
83013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
83023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XBestPixel(display,colormap,colors,(unsigned int) number_colors,
83033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          &pixel->pen_colors[i]);
83043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        pixel->pixels[image->colors+i]=pixel->pen_colors[i].pixel;
83053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
8306c57f694b2d04975a0e501613e34368c464708c19cristy      pixel->colors=(ssize_t) (image->colors+MaxNumberPens);
83073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
83083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  colors=(XColor *) RelinquishMagickMemory(colors);
83093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (IsEventLogging())
83103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
83113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"Standard Colormap:");
83123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"  colormap id: 0x%lx",
83133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        map_info->colormap);
83143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),
83153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "  red, green, blue max: %lu %lu %lu",map_info->red_max,
83163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        map_info->green_max,map_info->blue_max);
83173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),
83183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "  red, green, blue mult: %lu %lu %lu",map_info->red_mult,
83193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        map_info->green_mult,map_info->blue_mult);
83203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
83213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
83223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
83233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
83243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
83253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
83263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
83273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
83283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X M a k e W i n d o w                                                     %
83293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
83303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
83313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
83323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
83333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
83343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XMakeWindow() creates an X11 window.
83353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
83363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XMakeWindow method is:
83373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
83383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XMakeWindow(Display *display,Window parent,char **argv,int argc,
83393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        XClassHint *class_hint,XWMHints *manager_hints,
83403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        XWindowInfo *window_info)
83413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
83423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
83433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
83443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server; returned from
83453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
83463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
83473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o parent: Specifies the parent window_info.
83483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
83493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o argv: Specifies the application's argument list.
83503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
83513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o argc: Specifies the number of arguments.
83523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
83533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o class_hint: Specifies a pointer to a X11 XClassHint structure.
83543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
83553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o manager_hints: Specifies a pointer to a X11 XWMHints structure.
83563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
83573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window_info: Specifies a pointer to a X11 XWindowInfo structure.
83583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
83593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
8360bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XMakeWindow(Display *display,Window parent,char **argv,
83613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int argc,XClassHint *class_hint,XWMHints *manager_hints,
83623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWindowInfo *window_info)
83633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
83643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define MinWindowSize  64
83653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
83663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Atom
83673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    atom_list[2];
83683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
83693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
83703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    gravity;
83713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
83723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static XTextProperty
83733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    icon_name,
83743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window_name;
83753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
83763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
83773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
83783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
83793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSizeHints
83803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *size_hints;
83813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
83823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
83833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Set window info hints.
83843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
83853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
83863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
83873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(window_info != (XWindowInfo *) NULL);
83883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_hints=XAllocSizeHints();
83893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (size_hints == (XSizeHints *) NULL)
83903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowXWindowFatalException(XServerFatalError,"UnableToMakeXWindow",argv[0]);
8391dfe2b6658f367de8f84405263f62768fb853adafcristy  size_hints->flags=(int) window_info->flags;
83923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_hints->x=window_info->x;
83933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_hints->y=window_info->y;
83943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_hints->width=(int) window_info->width;
83953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_hints->height=(int) window_info->height;
83963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window_info->immutable != MagickFalse)
83973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
83983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
83993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Window size cannot be changed.
84003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
84013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      size_hints->min_width=size_hints->width;
84023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      size_hints->min_height=size_hints->height;
84033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      size_hints->max_width=size_hints->width;
84043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      size_hints->max_height=size_hints->height;
84053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      size_hints->flags|=PMinSize;
84063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      size_hints->flags|=PMaxSize;
84073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
84083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
84093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
84103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
84113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Window size can be changed.
84123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
84133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      size_hints->min_width=(int) window_info->min_width;
84143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      size_hints->min_height=(int) window_info->min_height;
84153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      size_hints->flags|=PResizeInc;
84163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      size_hints->width_inc=(int) window_info->width_inc;
84173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      size_hints->height_inc=(int) window_info->height_inc;
84183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if !defined(PRE_R4_ICCCM)
84193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      size_hints->flags|=PBaseSize;
84203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      size_hints->base_width=size_hints->width_inc;
84213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      size_hints->base_height=size_hints->height_inc;
84223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
84233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
84243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  gravity=NorthWestGravity;
84253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window_info->geometry != (char *) NULL)
84263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
84273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      char
84283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        default_geometry[MaxTextExtent],
84293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        geometry[MaxTextExtent];
84303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
84313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      int
84323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        flags;
84333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
84343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      register char
84353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *p;
84363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
84373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
84383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        User specified geometry.
84393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
8440b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy      (void) FormatLocaleString(default_geometry,MaxTextExtent,"%dx%d",
84413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        size_hints->width,size_hints->height);
84423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) CopyMagickString(geometry,window_info->geometry,MaxTextExtent);
84433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      p=geometry;
84443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      while (strlen(p) != 0)
84453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
84463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((isspace((int) ((unsigned char) *p)) == 0) && (*p != '%'))
84473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          p++;
84483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        else
84493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) CopyMagickString(p,p+1,MaxTextExtent);
84503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
84513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      flags=XWMGeometry(display,window_info->screen,geometry,default_geometry,
84523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        window_info->border_width,size_hints,&size_hints->x,&size_hints->y,
84533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        &size_hints->width,&size_hints->height,&gravity);
84543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((flags & WidthValue) && (flags & HeightValue))
84553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        size_hints->flags|=USSize;
84563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((flags & XValue) && (flags & YValue))
84573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
84583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          size_hints->flags|=USPosition;
84593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          window_info->x=size_hints->x;
84603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          window_info->y=size_hints->y;
84613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
84623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
84633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if !defined(PRE_R4_ICCCM)
84643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_hints->win_gravity=gravity;
84653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_hints->flags|=PWinGravity;
84663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
84673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window_info->id == (Window) NULL)
84683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window_info->id=XCreateWindow(display,parent,window_info->x,window_info->y,
84693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (unsigned int) size_hints->width,(unsigned int) size_hints->height,
84703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window_info->border_width,(int) window_info->depth,InputOutput,
8471c57f694b2d04975a0e501613e34368c464708c19cristy      window_info->visual,(unsigned long) window_info->mask,
8472c57f694b2d04975a0e501613e34368c464708c19cristy      &window_info->attributes);
84733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
84743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
84753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      MagickStatusType
84763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        mask;
84773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
84783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XEvent
84793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        sans_event;
84803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
84813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XWindowChanges
84823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        window_changes;
84833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
84843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
84853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Window already exists;  change relevant attributes.
84863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
8487c57f694b2d04975a0e501613e34368c464708c19cristy      (void) XChangeWindowAttributes(display,window_info->id,(unsigned long)
8488c57f694b2d04975a0e501613e34368c464708c19cristy        window_info->mask,&window_info->attributes);
84893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      mask=ConfigureNotify;
84903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      while (XCheckTypedWindowEvent(display,window_info->id,(int) mask,&sans_event)) ;
84913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window_changes.x=window_info->x;
84923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window_changes.y=window_info->y;
84933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window_changes.width=(int) window_info->width;
84943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window_changes.height=(int) window_info->height;
84953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      mask=(MagickStatusType) (CWWidth | CWHeight);
84963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window_info->flags & USPosition)
84973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        mask|=CWX | CWY;
84983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XReconfigureWMWindow(display,window_info->id,window_info->screen,
84993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        mask,&window_changes);
85003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
85013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window_info->id == (Window) NULL)
85023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowXWindowFatalException(XServerFatalError,"UnableToCreateWindow",
85033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window_info->name);
85043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XStringListToTextProperty(&window_info->name,1,&window_name);
85053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status == False)
85063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowXWindowFatalException(XServerFatalError,"UnableToCreateTextProperty",
85073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window_info->name);
85083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XStringListToTextProperty(&window_info->icon_name,1,&icon_name);
85093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status == False)
85103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowXWindowFatalException(XServerFatalError,"UnableToCreateTextProperty",
85113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window_info->icon_name);
85123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window_info->icon_geometry != (char *) NULL)
85133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
85143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      int
85153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        flags,
85163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        height,
85173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        width;
85183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
85193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
85203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        User specified icon geometry.
85213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
85223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      size_hints->flags|=USPosition;
85233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      flags=XWMGeometry(display,window_info->screen,window_info->icon_geometry,
85243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (char *) NULL,0,size_hints,&manager_hints->icon_x,
85253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        &manager_hints->icon_y,&width,&height,&gravity);
85263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((flags & XValue) && (flags & YValue))
85273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        manager_hints->flags|=IconPositionHint;
85283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
85293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetWMProperties(display,window_info->id,&window_name,&icon_name,argv,argc,
85303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    size_hints,manager_hints,class_hint);
85313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window_name.value != (void *) NULL)
85323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
85333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XFree((void *) window_name.value);
85343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window_name.value=(unsigned char *) NULL;
85353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window_name.nitems=0;
85363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
85373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (icon_name.value != (void *) NULL)
85383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
85393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XFree((void *) icon_name.value);
85403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      icon_name.value=(unsigned char *) NULL;
85413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      icon_name.nitems=0;
85423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
85433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  atom_list[0]=XInternAtom(display,"WM_DELETE_WINDOW",MagickFalse);
85443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  atom_list[1]=XInternAtom(display,"WM_TAKE_FOCUS",MagickFalse);
85453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XSetWMProtocols(display,window_info->id,atom_list,2);
85463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFree((void *) size_hints);
85473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window_info->shape != MagickFalse)
85483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
85493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HAVE_SHAPE)
85503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      int
85513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        error_base,
85523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        event_base;
85533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
85543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
85553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Can we apply a non-rectangular shaping mask?
85563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
85573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      error_base=0;
85583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      event_base=0;
85593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (XShapeQueryExtension(display,&error_base,&event_base) == 0)
85603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        window_info->shape=MagickFalse;
85613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else
85623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window_info->shape=MagickFalse;
85633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
85643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
85653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window_info->shared_memory)
85663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
85673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
85683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
85693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Can we use shared memory with this window?
85703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
85713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (XShmQueryExtension(display) == 0)
85723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        window_info->shared_memory=MagickFalse;
85733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else
85743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window_info->shared_memory=MagickFalse;
85753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
85763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
85773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_info->image=NewImageList();
85783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_info->destroy=MagickFalse;
85793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
85803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
85813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
85823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
85833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
85843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
85853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
85863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X M a g i c k P r o g r e s s M o n i t o r                               %
85873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
85883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
85893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
85903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
85913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
85923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XMagickProgressMonitor() displays the progress a task is making in
85933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  completing a task.
85943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
85953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XMagickProgressMonitor method is:
85963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
85973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XMagickProgressMonitor(const char *task,
85983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const MagickOffsetType quantum,const MagickSizeType span,
85993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        void *client_data)
86003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
86013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
86023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
86033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o task: Identifies the task in progress.
86043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
86053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o quantum: Specifies the quantum position within the span which represents
86063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      how much progress has been made in completing a task.
86073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
86083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o span: Specifies the span relative to completing a task.
86093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
86103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o client_data: Pointer to any client data.
86113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
86123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
86133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
86143ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic const char *GetLocaleMonitorMessage(const char *text)
86153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
86163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
86173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    message[MaxTextExtent],
86183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    tag[MaxTextExtent];
86193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
86203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char
86213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *locale_message;
86223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
86233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register char
86243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
86253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
86263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) CopyMagickMemory(tag,text,MaxTextExtent);
86273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=strrchr(tag,'/');
86283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (p != (char *) NULL)
86293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p='\0';
8630b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleString(message,MaxTextExtent,"Monitor/%s",tag);
86313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  locale_message=GetLocaleMessage(message);
86323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (locale_message == message)
86333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(text);
86343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(locale_message);
86353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
86363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8637bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate MagickBooleanType XMagickProgressMonitor(const char *tag,
86383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const MagickOffsetType quantum,const MagickSizeType span,
86393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  void *magick_unused(client_data))
86403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
86413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWindows
86423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *windows;
86433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
86443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows=XSetWindows((XWindows *) ~0);
86453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows == (XWindows *) NULL)
86463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickTrue);
86473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->info.mapped != MagickFalse)
86483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    XProgressMonitorWidget(windows->display,windows,
86493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      GetLocaleMonitorMessage(tag),quantum,span);
86503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickTrue);
86513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
86523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
86533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
86543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
86553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
86563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
86573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
86583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X Q u e r y C o l o r D a t a b a s e                                     %
86593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
86603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
86613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
86623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
86633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
86649950d57e1124b73f684fb5946e206994cefda628cristy%  XQueryColorCompliance() looks up a RGB values for a color given in the target
86653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  string.
86663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
86673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XQueryColorDatabase method is:
86683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
86699950d57e1124b73f684fb5946e206994cefda628cristy%      MagickBooleanType XQueryColorCompliance(const char *target,XColor *color)
86703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
86713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
86723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
86733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o target: Specifies the color to lookup in the X color database.
86743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8675101ab708b0574518ac5715da4d3915400e9df79acristy%    o color: A pointer to an PixelInfo structure.  The RGB value of the target
86763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      color is returned as this value.
86773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
86783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
86799950d57e1124b73f684fb5946e206994cefda628cristyMagickPrivate MagickBooleanType XQueryColorCompliance(const char *target,
86803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XColor *color)
86813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
86823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Colormap
86833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    colormap;
86843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
86853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static Display
86863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *display = (Display *) NULL;
86873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
86883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
86893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
86903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
86913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XColor
86923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    xcolor;
86933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
86943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
86953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize color return value.
86963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
86973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(color != (XColor *) NULL);
86983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  color->red=0;
86993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  color->green=0;
87003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  color->blue=0;
87013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  color->flags=(char) (DoRed | DoGreen | DoBlue);
87023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((target == (char *) NULL) || (*target == '\0'))
87033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    target="#ffffffffffff";
87043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
87053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Let the X server define the color for us.
87063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
87073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (display == (Display *) NULL)
87083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    display=XOpenDisplay((char *) NULL);
87093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (display == (Display *) NULL)
87103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
87113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowXWindowFatalException(XServerError,"ColorIsNotKnownToServer",target);
87123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return(MagickFalse);
87133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
87143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  colormap=XDefaultColormap(display,XDefaultScreen(display));
87153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XParseColor(display,colormap,(char *) target,&xcolor);
87163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status == False)
87173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowXWindowFatalException(XServerError,"ColorIsNotKnownToServer",target)
87183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
87193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
87203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      color->red=xcolor.red;
87213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      color->green=xcolor.green;
87223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      color->blue=xcolor.blue;
87233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      color->flags=xcolor.flags;
87243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
87253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(status != False ? MagickTrue : MagickFalse);
87263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
87273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
87283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
87293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
87303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
87313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
87323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
87333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X Q u e r y P o s i t i o n                                               %
87343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
87353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
87363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
87373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
87383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
87393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XQueryPosition() gets the pointer coordinates relative to a window.
87403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
87413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XQueryPosition method is:
87423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
87433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XQueryPosition(Display *display,const Window window,int *x,int *y)
87443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
87453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
87463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
87473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
87483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
87493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
87503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies a pointer to a Window.
87513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
87523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o x: Return the x coordinate of the pointer relative to the origin of the
87533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      window.
87543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
87553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o y: Return the y coordinate of the pointer relative to the origin of the
87563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      window.
87573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
87583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
8759bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XQueryPosition(Display *display,const Window window,int *x,int *y)
87603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
87613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
87623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x_root,
87633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y_root;
87643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
87653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
87663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    mask;
87673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
87683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Window
87693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    root_window;
87703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
87713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
87723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
87733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(window != (Window) NULL);
87743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(x != (int *) NULL);
87753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(y != (int *) NULL);
87763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XQueryPointer(display,window,&root_window,&root_window,&x_root,&y_root,
87773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x,y,&mask);
87783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
87793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
87803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
87813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
87823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
87833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
87843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
87853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X R e f r e s h W i n d o w                                               %
87863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
87873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
87883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
87893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
87903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
87913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XRefreshWindow() refreshes an image in a X window.
87923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
87933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XRefreshWindow method is:
87943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
87953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XRefreshWindow(Display *display,const XWindowInfo *window,
87963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const XEvent *event)
87973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
87983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
87993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
88003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
88013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
88023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
88033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies a pointer to a XWindowInfo structure.
88043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
88053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o event: Specifies a pointer to a XEvent structure.  If it is NULL,
88063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      the entire image is refreshed.
88073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
88083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
8809bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XRefreshWindow(Display *display,const XWindowInfo *window,
88103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const XEvent *event)
88113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
88123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
88133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x,
88143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y;
88153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
88163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
88173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    height,
88183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width;
88193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
88203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
88213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
88223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(window != (XWindowInfo *) NULL);
88233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->ximage == (XImage *) NULL)
88243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return;
88253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (event != (XEvent *) NULL)
88263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
88273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
88283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Determine geometry from expose event.
88293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
88303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      x=event->xexpose.x;
88313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      y=event->xexpose.y;
88323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      width=(unsigned int) event->xexpose.width;
88333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      height=(unsigned int) event->xexpose.height;
88343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
88353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
88363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
88373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XEvent
88383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        sans_event;
88393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
88403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
88413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Refresh entire window; discard outstanding expose events.
88423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
88433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      x=0;
88443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      y=0;
88453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      width=window->width;
88463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      height=window->height;
88473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      while (XCheckTypedWindowEvent(display,window->id,Expose,&sans_event)) ;
8848a0e5ad575fbabf93f14a3748ae501376928998fccristy      if (window->matte_pixmap != (Pixmap) NULL)
8849a0e5ad575fbabf93f14a3748ae501376928998fccristy        {
8850a0e5ad575fbabf93f14a3748ae501376928998fccristy#if defined(MAGICKCORE_HAVE_SHAPE)
8851a0e5ad575fbabf93f14a3748ae501376928998fccristy          if (window->shape != MagickFalse)
8852a0e5ad575fbabf93f14a3748ae501376928998fccristy            XShapeCombineMask(display,window->id,ShapeBounding,0,0,
8853a0e5ad575fbabf93f14a3748ae501376928998fccristy              window->matte_pixmap,ShapeSet);
8854a0e5ad575fbabf93f14a3748ae501376928998fccristy#endif
8855a0e5ad575fbabf93f14a3748ae501376928998fccristy        }
88563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
88573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
88583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Check boundary conditions.
88593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
88603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((window->ximage->width-(x+window->x)) < (int) width)
88613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width=(unsigned int) (window->ximage->width-(x+window->x));
88623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((window->ximage->height-(y+window->y)) < (int) height)
88633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    height=(unsigned int) (window->ximage->height-(y+window->y));
88643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
88653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Refresh image.
88663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
88673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->matte_pixmap != (Pixmap) NULL)
8868a0e5ad575fbabf93f14a3748ae501376928998fccristy    (void) XSetClipMask(display,window->annotate_context,window->matte_pixmap);
88693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->pixmap != (Pixmap) NULL)
88703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
88713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window->depth > 1)
88723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XCopyArea(display,window->pixmap,window->id,
88733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          window->annotate_context,x+window->x,y+window->y,width,height,x,y);
88743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
88753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XCopyPlane(display,window->pixmap,window->id,
88763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          window->highlight_context,x+window->x,y+window->y,width,height,x,y,
88773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          1L);
88783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
88793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
88803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
88813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
88823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window->shared_memory)
88833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XShmPutImage(display,window->id,window->annotate_context,
88843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          window->ximage,x+window->x,y+window->y,x,y,width,height,MagickTrue);
88853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
88863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window->shared_memory == MagickFalse)
88873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XPutImage(display,window->id,window->annotate_context,
88883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          window->ximage,x+window->x,y+window->y,x,y,width,height);
88893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
88903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->matte_pixmap != (Pixmap) NULL)
88913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XSetClipMask(display,window->annotate_context,None);
88923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFlush(display);
88933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
88943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
88953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
88963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
88973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
88983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
88993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
89003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X R e m o t e C o m m a n d                                               %
89013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
89023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
89033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
89043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
89053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
89063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XRemoteCommand() forces a remote display(1) to display the specified
89073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  image filename.
89083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
89093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XRemoteCommand method is:
89103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
89113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType XRemoteCommand(Display *display,const char *window,
89123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *filename)
89133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
89143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
89153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
89163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server; returned from
89173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
89183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
89193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies the name or id of an X window.
89203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
89213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o filename: the name of the image filename to display.
89223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
89233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
89243ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport MagickBooleanType XRemoteCommand(Display *display,
89253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *window,const char *filename)
89263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
89273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Atom
89283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    remote_atom;
89293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
89303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Window
89313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    remote_window,
89323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    root_window;
89333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
89343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(filename != (char *) NULL);
89353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",filename);
89363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (display == (Display *) NULL)
89373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    display=XOpenDisplay((char *) NULL);
89383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (display == (Display *) NULL)
89393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
89403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowXWindowException(XServerError,"UnableToOpenXServer",filename);
89413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return(MagickFalse);
89423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
89433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  remote_atom=XInternAtom(display,"IM_PROTOCOLS",MagickFalse);
89443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  remote_window=(Window) NULL;
89453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  root_window=XRootWindow(display,XDefaultScreen(display));
89463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window != (char *) NULL)
89473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
89483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
89493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Search window hierarchy and identify any clients by name or ID.
89503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
89513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (isdigit((unsigned char) *window) != 0)
89523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        remote_window=XWindowByID(display,root_window,(Window)
89533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          strtol((char *) window,(char **) NULL,0));
89543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (remote_window == (Window) NULL)
89553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        remote_window=XWindowByName(display,root_window,window);
89563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
89573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (remote_window == (Window) NULL)
89583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    remote_window=XWindowByProperty(display,root_window,remote_atom);
89593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (remote_window == (Window) NULL)
89603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
89613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowXWindowException(XServerError,"UnableToConnectToRemoteDisplay",
89623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        filename);
89633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return(MagickFalse);
89643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
89653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
89663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Send remote command.
89673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
89683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  remote_atom=XInternAtom(display,"IM_REMOTE_COMMAND",MagickFalse);
89693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XChangeProperty(display,remote_window,remote_atom,XA_STRING,8,
89703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    PropModeReplace,(unsigned char *) filename,(int) strlen(filename));
89713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XSync(display,MagickFalse);
89723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickTrue);
89733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
89743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
89753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
89763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
89773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
89783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
89793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
89803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X R e t a i n W i n d o w C o l o r s                                     %
89813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
89823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
89833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
89843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
89853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
89863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XRetainWindowColors() sets X11 color resources on a window.  This preserves
89873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  the colors associated with an image displayed on the window.
89883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
89893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XRetainWindowColors method is:
89903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
89913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XRetainWindowColors(Display *display,const Window window)
89923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
89933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
89943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
89953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server; returned from
89963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
89973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
89983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies a pointer to a XWindowInfo structure.
89993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
90003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
90013ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport void XRetainWindowColors(Display *display,const Window window)
90023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
90033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Atom
90043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    property;
90053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
90063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Pixmap
90073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixmap;
90083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
90093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
90103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Put property on the window.
90113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
90123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
90133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
90143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(window != (Window) NULL);
90153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  property=XInternAtom(display,"_XSETROOT_ID",MagickFalse);
90163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (property == (Atom) NULL)
90173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
90183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowXWindowFatalException(XServerError,"UnableToCreateProperty",
90193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "_XSETROOT_ID");
90203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return;
90213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
90223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixmap=XCreatePixmap(display,window,1,1,1);
90233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (pixmap == (Pixmap) NULL)
90243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
90253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowXWindowFatalException(XServerError,"UnableToCreateBitmap","");
90263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return;
90273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
90283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XChangeProperty(display,window,property,XA_PIXMAP,32,PropModeReplace,
90293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (unsigned char *) &pixmap,1);
90303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XSetCloseDownMode(display,RetainPermanent);
90313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
90323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
90333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
90343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
90353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
90363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
90373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
90383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X S e l e c t W i n d o w                                                 %
90393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
90403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
90413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
90423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
90433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
90443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XSelectWindow() allows a user to select a window using the mouse.  If the
90453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  mouse moves, a cropping rectangle is drawn and the extents of the rectangle
90463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  is returned in the crop_info structure.
90473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
90483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XSelectWindow function is:
90493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
90503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      target_window=XSelectWindow(display,crop_info)
90513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
90523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
90533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
90543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: XSelectWindow returns the window id.
90553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
90563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a pointer to the Display structure;  returned from
90573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
90583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
90593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o crop_info: Specifies a pointer to a RectangleInfo structure.  It
90603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      contains the extents of any cropping rectangle.
90613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
90623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
90633ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Window XSelectWindow(Display *display,RectangleInfo *crop_info)
90643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
90653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define MinimumCropArea  (unsigned int) 9
90663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
90673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Cursor
90683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    target_cursor;
90693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
90703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  GC
90713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    annotate_context;
90723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
90733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
90743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    presses,
90753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x_offset,
90763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y_offset;
90773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
90783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
90793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
90803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
90813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Window
90823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    root_window,
90833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    target_window;
90843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
90853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XEvent
90863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    event;
90873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
90883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XGCValues
90893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    context_values;
90903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
90913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
90923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize graphic context.
90933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
90943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
90953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
90963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(crop_info != (RectangleInfo *) NULL);
90973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  root_window=XRootWindow(display,XDefaultScreen(display));
90983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  context_values.background=XBlackPixel(display,XDefaultScreen(display));
90993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  context_values.foreground=XWhitePixel(display,XDefaultScreen(display));
91003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  context_values.function=GXinvert;
91013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  context_values.plane_mask=
91023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    context_values.background ^ context_values.foreground;
91033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  context_values.subwindow_mode=IncludeInferiors;
9104bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  annotate_context=XCreateGC(display,root_window,(size_t) (GCBackground |
91053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    GCForeground | GCFunction | GCSubwindowMode),&context_values);
91063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (annotate_context == (GC) NULL)
91073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
91083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
91093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Grab the pointer using target cursor.
91103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
91113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  target_cursor=XMakeCursor(display,root_window,XDefaultColormap(display,
91123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    XDefaultScreen(display)),(char * ) "white",(char * ) "black");
91133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XGrabPointer(display,root_window,MagickFalse,(unsigned int)
91143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (ButtonPressMask | ButtonReleaseMask | ButtonMotionMask),GrabModeSync,
91153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    GrabModeAsync,root_window,target_cursor,CurrentTime);
91163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status != GrabSuccess)
91173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
91183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowXWindowFatalException(XServerError,"UnableToGrabMouse","");
91193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return((Window) NULL);
91203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
91213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
91223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Select a window.
91233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
91243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  crop_info->width=0;
91253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  crop_info->height=0;
91263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  presses=0;
91273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  target_window=(Window) NULL;
91283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  x_offset=0;
91293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  y_offset=0;
91303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  do
91313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
91323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((crop_info->width*crop_info->height) >= MinimumCropArea)
91333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XDrawRectangle(display,root_window,annotate_context,
91343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (int) crop_info->x,(int) crop_info->y,(unsigned int) crop_info->width-1,
91353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (unsigned int) crop_info->height-1);
91363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /*
91373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Allow another event.
91383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    */
91393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XAllowEvents(display,SyncPointer,CurrentTime);
91403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XWindowEvent(display,root_window,ButtonPressMask |
91413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ButtonReleaseMask | ButtonMotionMask,&event);
91423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((crop_info->width*crop_info->height) >= MinimumCropArea)
91433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XDrawRectangle(display,root_window,annotate_context,
91443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (int) crop_info->x,(int) crop_info->y,(unsigned int) crop_info->width-1,
91453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (unsigned int) crop_info->height-1);
91463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    switch (event.type)
91473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
91483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ButtonPress:
91493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
91503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        target_window=XGetSubwindow(display,event.xbutton.subwindow,
91513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          event.xbutton.x,event.xbutton.y);
91523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (target_window == (Window) NULL)
91533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          target_window=root_window;
91543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        x_offset=event.xbutton.x_root;
91553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        y_offset=event.xbutton.y_root;
9156ecd0ab5350482e4a2ea003705e3e0b2120b66384cristy        crop_info->x=(ssize_t) x_offset;
9157ecd0ab5350482e4a2ea003705e3e0b2120b66384cristy        crop_info->y=(ssize_t) y_offset;
91583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        crop_info->width=0;
91593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        crop_info->height=0;
91603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        presses++;
91613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
91623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
91633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ButtonRelease:
91643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
91653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        presses--;
91663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
91673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
91683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case MotionNotify:
91693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
91703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
91713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Discard pending button motion events.
91723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
91733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
9174ecd0ab5350482e4a2ea003705e3e0b2120b66384cristy        crop_info->x=(ssize_t) event.xmotion.x;
9175ecd0ab5350482e4a2ea003705e3e0b2120b66384cristy        crop_info->y=(ssize_t) event.xmotion.y;
91763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
91773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Check boundary conditions.
91783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
91793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((int) crop_info->x < x_offset)
9180ecd0ab5350482e4a2ea003705e3e0b2120b66384cristy          crop_info->width=(size_t) (x_offset-crop_info->x);
91813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        else
91823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
9183ecd0ab5350482e4a2ea003705e3e0b2120b66384cristy            crop_info->width=(size_t) (crop_info->x-x_offset);
9184ecd0ab5350482e4a2ea003705e3e0b2120b66384cristy            crop_info->x=(ssize_t) x_offset;
91853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
91863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((int) crop_info->y < y_offset)
9187ecd0ab5350482e4a2ea003705e3e0b2120b66384cristy          crop_info->height=(size_t) (y_offset-crop_info->y);
91883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        else
91893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
9190ecd0ab5350482e4a2ea003705e3e0b2120b66384cristy            crop_info->height=(size_t) (crop_info->y-y_offset);
9191ecd0ab5350482e4a2ea003705e3e0b2120b66384cristy            crop_info->y=(ssize_t) y_offset;
91923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
91933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
91943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      default:
91953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
91963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
91973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  } while ((target_window == (Window) NULL) || (presses > 0));
91983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XUngrabPointer(display,CurrentTime);
91993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFreeCursor(display,target_cursor);
92003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFreeGC(display,annotate_context);
92013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((crop_info->width*crop_info->height) < MinimumCropArea)
92023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
92033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      crop_info->width=0;
92043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      crop_info->height=0;
92053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
92063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((crop_info->width != 0) && (crop_info->height != 0))
92073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    target_window=root_window;
92083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(target_window);
92093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
92103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
92113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
92123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
92133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
92143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
92153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
92163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X S e t C u r s o r S t a t e                                             %
92173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
92183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
92193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
92203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
92213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
92223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XSetCursorState() sets the cursor state to busy, otherwise the cursor are
92233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  reset to their default.
92243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
92253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XXSetCursorState method is:
92263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
92273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XSetCursorState(display,windows,const MagickStatusType state)
92283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
92293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
92303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
92313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
92323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
92333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
92343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o windows: Specifies a pointer to a XWindows structure.
92353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
92363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o state: An unsigned integer greater than 0 sets the cursor state
92373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      to busy, otherwise the cursor are reset to their default.
92383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
92393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
9240bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XSetCursorState(Display *display,XWindows *windows,
92413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const MagickStatusType state)
92423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
92433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
92443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
92453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(windows != (XWindows *) NULL);
92463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (state)
92473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
92483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XCheckDefineCursor(display,windows->image.id,
92493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->image.busy_cursor);
92503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XCheckDefineCursor(display,windows->pan.id,
92513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->pan.busy_cursor);
92523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XCheckDefineCursor(display,windows->magnify.id,
92533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->magnify.busy_cursor);
92543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XCheckDefineCursor(display,windows->command.id,
92553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->command.busy_cursor);
92563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
92573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
92583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
92593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XCheckDefineCursor(display,windows->image.id,
92603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->image.cursor);
92613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XCheckDefineCursor(display,windows->pan.id,windows->pan.cursor);
92623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XCheckDefineCursor(display,windows->magnify.id,
92633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->magnify.cursor);
92643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XCheckDefineCursor(display,windows->command.id,
92653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->command.cursor);
92663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XCheckDefineCursor(display,windows->command.id,
92673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->widget.cursor);
92683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XWithdrawWindow(display,windows->info.id,windows->info.screen);
92693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
92703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->info.mapped=MagickFalse;
92713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
92723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
92733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
92743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
92753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
92763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
92773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
92783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X S e t W i n d o w s                                                     %
92793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
92803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
92813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
92823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
92833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
92843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XSetWindows() sets the X windows structure if the windows info is specified.
92853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  Otherwise the current windows structure is returned.
92863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
92873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XSetWindows method is:
92883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
92893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XWindows *XSetWindows(XWindows *windows_info)
92903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
92913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
92923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
92933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o windows_info: Initialize the Windows structure with this information.
92943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
92953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
9296bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate XWindows *XSetWindows(XWindows *windows_info)
92973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
92983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static XWindows
92993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *windows = (XWindows *) NULL;
93003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
93013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows_info != (XWindows *) ~0)
93023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
93033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      windows=(XWindows *) RelinquishMagickMemory(windows);
93043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      windows=windows_info;
93053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
93063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(windows);
93073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
93083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
93093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
93103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
93113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
93123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
93133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X U s e r P r e f e r e n c e s                                           %
93143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
93153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
93163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
93173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
93183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
93193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XUserPreferences() saves the preferences in a configuration file in the
93203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  users' home directory.
93213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
93223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XUserPreferences method is:
93233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
93243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XUserPreferences(XResourceInfo *resource_info)
93253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
93263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
93273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
93283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
93293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
93303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
9331bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XUserPreferences(XResourceInfo *resource_info)
93323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
93333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(X11_PREFERENCES_PATH)
93343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
93353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    cache[MaxTextExtent],
93363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    filename[MaxTextExtent],
93373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    specifier[MaxTextExtent];
93383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
93393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char
9340104cea817534e8601291610f22e496c10f8f9ddbcristy    *client_name,
93413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *value;
93423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
93433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XrmDatabase
93443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    preferences_database;
93453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
93463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
93473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Save user preferences to the client configuration file.
93483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
93493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(resource_info != (XResourceInfo *) NULL);
9350104cea817534e8601291610f22e496c10f8f9ddbcristy  client_name=GetClientName();
93513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  preferences_database=XrmGetStringDatabase("");
9352b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleString(specifier,MaxTextExtent,"%s.backdrop",client_name);
93533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  value=resource_info->backdrop ? "True" : "False";
93543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XrmPutStringResource(&preferences_database,specifier,(char *) value);
9355b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleString(specifier,MaxTextExtent,"%s.colormap",client_name);
93563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  value=resource_info->colormap == SharedColormap ? "Shared" : "Private";
93573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XrmPutStringResource(&preferences_database,specifier,(char *) value);
9358b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleString(specifier,MaxTextExtent,"%s.confirmExit",
9359104cea817534e8601291610f22e496c10f8f9ddbcristy    client_name);
93603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  value=resource_info->confirm_exit ? "True" : "False";
93613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XrmPutStringResource(&preferences_database,specifier,(char *) value);
9362b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleString(specifier,MaxTextExtent,"%s.confirmEdit",
9363104cea817534e8601291610f22e496c10f8f9ddbcristy    client_name);
93643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  value=resource_info->confirm_edit ? "True" : "False";
93653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XrmPutStringResource(&preferences_database,specifier,(char *) value);
9366b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleString(specifier,MaxTextExtent,"%s.displayWarnings",
9367104cea817534e8601291610f22e496c10f8f9ddbcristy    client_name);
93683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  value=resource_info->display_warnings ? "True" : "False";
93693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XrmPutStringResource(&preferences_database,specifier,(char *) value);
9370b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleString(specifier,MaxTextExtent,"%s.dither",client_name);
93713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  value=resource_info->quantize_info->dither ? "True" : "False";
93723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XrmPutStringResource(&preferences_database,specifier,(char *) value);
9373b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleString(specifier,MaxTextExtent,"%s.gammaCorrect",
9374104cea817534e8601291610f22e496c10f8f9ddbcristy    client_name);
93753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  value=resource_info->gamma_correct ? "True" : "False";
93763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XrmPutStringResource(&preferences_database,specifier,(char *) value);
9377b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleString(specifier,MaxTextExtent,"%s.undoCache",client_name);
9378b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleString(cache,MaxTextExtent,"%.20g",(double)
93793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    resource_info->undo_cache);
93803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XrmPutStringResource(&preferences_database,specifier,cache);
9381b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleString(specifier,MaxTextExtent,"%s.usePixmap",client_name);
93823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  value=resource_info->use_pixmap ? "True" : "False";
93833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XrmPutStringResource(&preferences_database,specifier,(char *) value);
9384b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleString(filename,MaxTextExtent,"%s%src",
9385104cea817534e8601291610f22e496c10f8f9ddbcristy    X11_PREFERENCES_PATH,client_name);
93863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ExpandFilename(filename);
93873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XrmPutFileDatabase(preferences_database,filename);
93883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
93893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
93903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
93913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
93923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
93933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
93943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
93953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
93963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X V i s u a l C l a s s N a m e                                           %
93973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
93983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
93993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
94003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
94013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
94023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XVisualClassName() returns the visual class name as a character string.
94033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
94043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XVisualClassName method is:
94053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
94063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char *XVisualClassName(const int visual_class)
94073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
94083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
94093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
94103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o visual_type: XVisualClassName returns the visual class as a character
94113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      string.
94123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
94133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o class: Specifies the visual class.
94143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
94153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
94163ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic const char *XVisualClassName(const int visual_class)
94173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
94183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  switch (visual_class)
94193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
94203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case StaticGray: return("StaticGray");
94213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case GrayScale: return("GrayScale");
94223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case StaticColor: return("StaticColor");
94233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case PseudoColor: return("PseudoColor");
94243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case TrueColor: return("TrueColor");
94253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case DirectColor: return("DirectColor");
94263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
94273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return("unknown visual class");
94283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
94293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
94303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
94313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
94323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
94333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
94343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
94353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X W a r n i n g                                                           %
94363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
94373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
94383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
94393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
94403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
94413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XWarning() displays a warning reason in a Notice widget.
94423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
94433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XWarning method is:
94443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
94453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XWarning(const unsigned int warning,const char *reason,
94463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *description)
94473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
94483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
94493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
94503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o warning: Specifies the numeric warning category.
94513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
94523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o reason: Specifies the reason to display before terminating the
94533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      program.
94543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
94553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o description: Specifies any description to the reason.
94563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
94573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
9458bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XWarning(const ExceptionType magick_unused(warning),
94593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *reason,const char *description)
94603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
94613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
94623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    text[MaxTextExtent];
94633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
94643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWindows
94653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *windows;
94663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
94673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (reason == (char *) NULL)
94683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return;
94693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) CopyMagickString(text,reason,MaxTextExtent);
94703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ConcatenateMagickString(text,":",MaxTextExtent);
94713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows=XSetWindows((XWindows *) ~0);
94723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XNoticeWidget(windows->display,windows,text,(char *) description);
94733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
94743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
94753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
94763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
94773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
94783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
94793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
94803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X W i n d o w B y I D                                                     %
94813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
94823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
94833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
94843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
94853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
94863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XWindowByID() locates a child window with a given ID.  If not window with
94873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  the given name is found, 0 is returned.   Only the window specified and its
94883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  subwindows are searched.
94893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
94903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XWindowByID function is:
94913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
94923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      child=XWindowByID(display,window,id)
94933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
94943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
94953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
94963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o child: XWindowByID returns the window with the specified
94973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      id.  If no windows are found, XWindowByID returns 0.
94983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
94993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a pointer to the Display structure;  returned from
95003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
95013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
95023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o id: Specifies the id of the window to locate.
95033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
95043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
9505bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate Window XWindowByID(Display *display,const Window root_window,
9506bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  const size_t id)
95073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
95083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  RectangleInfo
95093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    rectangle_info;
95103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
95113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register int
95123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
95133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
95143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
95153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
95163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
95173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
95183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_children;
95193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
95203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Window
95213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    child,
95223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *children,
95233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window;
95243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
95253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
95263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
95273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(root_window != (Window) NULL);
95283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (id == 0)
95293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(XSelectWindow(display,&rectangle_info));
95303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (root_window == id)
9531dfe2b6658f367de8f84405263f62768fb853adafcristy    return(root_window);
95323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XQueryTree(display,root_window,&child,&child,&children,
95333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    &number_children);
95343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status == False)
95353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((Window) NULL);
95363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window=(Window) NULL;
95373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; i < (int) number_children; i++)
95383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
95393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /*
95403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Search each child and their children.
95413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    */
95423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window=XWindowByID(display,children[i],id);
95433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (window != (Window) NULL)
95443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
95453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
95463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (children != (Window *) NULL)
95473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XFree((void *) children);
95483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(window);
95493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
95503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
95513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
95523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
95533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
95543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
95553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
95563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X W i n d o w B y N a m e                                                 %
95573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
95583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
95593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
95603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
95613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
95623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XWindowByName() locates a window with a given name on a display.  If no
95633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  window with the given name is found, 0 is returned. If more than one window
95643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  has the given name, the first one is returned.  Only root and its children
95653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  are searched.
95663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
95673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XWindowByName function is:
95683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
95693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      window=XWindowByName(display,root_window,name)
95703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
95713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
95723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
95733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: XWindowByName returns the window id.
95743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
95753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a pointer to the Display structure;  returned from
95763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
95773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
95783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o root_window: Specifies the id of the root window.
95793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
95803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o name: Specifies the name of the window to locate.
95813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
95823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
9583bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate Window XWindowByName(Display *display,const Window root_window,
95843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *name)
95853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
95863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register int
95873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
95883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
95893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
95903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
95913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
95923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
95933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_children;
95943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
95953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Window
95963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *children,
95973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    child,
95983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window;
95993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
96003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XTextProperty
96013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window_name;
96023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
96033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
96043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(root_window != (Window) NULL);
96053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(name != (char *) NULL);
96063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",name);
96073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (XGetWMName(display,root_window,&window_name) != 0)
96083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (LocaleCompare((char *) window_name.value,name) == 0)
96093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return(root_window);
96103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XQueryTree(display,root_window,&child,&child,&children,
96113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    &number_children);
96123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status == False)
96133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((Window) NULL);
96143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window=(Window) NULL;
96153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; i < (int) number_children; i++)
96163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
96173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /*
96183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Search each child and their children.
96193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    */
96203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window=XWindowByName(display,children[i],name);
96213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (window != (Window) NULL)
96223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
96233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
96243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (children != (Window *) NULL)
96253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XFree((void *) children);
96263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(window);
96273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
96283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
96293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
96303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
96313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
96323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
96333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
96343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X W i n d o w B y P r o p e r y                                           %
96353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
96363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
96373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
96383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
96393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
96403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XWindowByProperty() locates a child window with a given property. If not
96413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  window with the given name is found, 0 is returned.  If more than one window
96423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  has the given property, the first one is returned.  Only the window
96433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  specified and its subwindows are searched.
96443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
96453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XWindowByProperty function is:
96463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
96473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      child=XWindowByProperty(display,window,property)
96483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
96493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
96503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
96513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o child: XWindowByProperty returns the window id with the specified
96523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      property.  If no windows are found, XWindowByProperty returns 0.
96533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
96543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a pointer to the Display structure;  returned from
96553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
96563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
96573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o property: Specifies the property of the window to locate.
96583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
96593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
9660bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate Window XWindowByProperty(Display *display,const Window window,
96613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const Atom property)
96623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
96633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Atom
96643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    type;
96653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
96663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
96673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    format;
96683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
96693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
96703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
96713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
96723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned char
96733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *data;
96743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
96753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
96763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
96773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_children;
96783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9679f2faecf9facdbbb14fcba373365f9f691a9658e0cristy  unsigned long
96803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    after,
96813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_items;
96823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
96833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Window
96843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    child,
96853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *children,
96863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    parent,
96873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    root;
96883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
96893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
96903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
96913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(window != (Window) NULL);
96923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(property != (Atom) NULL);
96933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XQueryTree(display,window,&root,&parent,&children,&number_children);
96943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status == False)
96953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((Window) NULL);
96963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  type=(Atom) NULL;
96973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  child=(Window) NULL;
96983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; (i < number_children) && (child == (Window) NULL); i++)
96993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
97003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status=XGetWindowProperty(display,children[i],property,0L,0L,MagickFalse,
97013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (Atom) AnyPropertyType,&type,&format,&number_items,&after,&data);
97023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (data != NULL)
97033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XFree((void *) data);
97043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((status == Success) && (type != (Atom) NULL))
97053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      child=children[i];
97063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
97073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; (i < number_children) && (child == (Window) NULL); i++)
97083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    child=XWindowByProperty(display,children[i],property);
97093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (children != (Window *) NULL)
97103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XFree((void *) children);
97113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(child);
97123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
97133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else
97143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
97153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
97163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
97173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
97183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
97193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
97203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X I m p o r t I m a g e                                                   %
97213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
97223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
97233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
97243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
97253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
97263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XImportImage() reads an image from an X window.
97273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
97283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XImportImage method is:
97293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9730a0dc96a5df0a380c9ef855cc7f2a5f264bec8af3cristy%      Image *XImportImage(const ImageInfo *image_info,XImportInfo *ximage_info,
9731a0dc96a5df0a380c9ef855cc7f2a5f264bec8af3cristy%        ExceptionInfo *exception)
97323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
97333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
97343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
97353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image_info: the image info..
97363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
97373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o ximage_info: Specifies a pointer to an XImportInfo structure.
97383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9739a0dc96a5df0a380c9ef855cc7f2a5f264bec8af3cristy%    o exception: return any errors or warnings in this structure.
9740a0dc96a5df0a380c9ef855cc7f2a5f264bec8af3cristy%
97413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
9742bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate Image *XImportImage(const ImageInfo *image_info,
9743a0dc96a5df0a380c9ef855cc7f2a5f264bec8af3cristy  XImportInfo *ximage_info,ExceptionInfo *exception)
97443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
97453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image_info != (const ImageInfo *) NULL);
97463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image_info->signature == MagickSignature);
97473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image_info->debug != MagickFalse)
97483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
97493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image_info->filename);
97503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(ximage_info != (XImportInfo *) NULL);
9751a0dc96a5df0a380c9ef855cc7f2a5f264bec8af3cristy  assert(exception != (ExceptionInfo *) NULL);
9752a0dc96a5df0a380c9ef855cc7f2a5f264bec8af3cristy  assert(exception->signature == MagickSignature);
97533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return((Image *) NULL);
97543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
97553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
97563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
97573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
97583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
97593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
97603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
97613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9762576974eba31c1fac74b2492a74862b2fcd50f21ccristy+   X C o m p o n e n t G e n e s i s                                         %
9763576974eba31c1fac74b2492a74862b2fcd50f21ccristy%                                                                             %
9764576974eba31c1fac74b2492a74862b2fcd50f21ccristy%                                                                             %
9765576974eba31c1fac74b2492a74862b2fcd50f21ccristy%                                                                             %
9766576974eba31c1fac74b2492a74862b2fcd50f21ccristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9767576974eba31c1fac74b2492a74862b2fcd50f21ccristy%
9768576974eba31c1fac74b2492a74862b2fcd50f21ccristy%  XComponentGenesis() instantiates the X component.
9769576974eba31c1fac74b2492a74862b2fcd50f21ccristy%
9770576974eba31c1fac74b2492a74862b2fcd50f21ccristy%  The format of the XComponentGenesis method is:
9771576974eba31c1fac74b2492a74862b2fcd50f21ccristy%
9772576974eba31c1fac74b2492a74862b2fcd50f21ccristy%      MagickBooleanType XComponentGenesis(void)
9773576974eba31c1fac74b2492a74862b2fcd50f21ccristy%
9774576974eba31c1fac74b2492a74862b2fcd50f21ccristy*/
97755ff4eaf57b3cd47d0371f204f865cbba614674a0cristyMagickPrivate MagickBooleanType XComponentGenesis(void)
9776576974eba31c1fac74b2492a74862b2fcd50f21ccristy{
9777576974eba31c1fac74b2492a74862b2fcd50f21ccristy  return(MagickTrue);
9778576974eba31c1fac74b2492a74862b2fcd50f21ccristy}
9779576974eba31c1fac74b2492a74862b2fcd50f21ccristy
9780576974eba31c1fac74b2492a74862b2fcd50f21ccristy/*
9781576974eba31c1fac74b2492a74862b2fcd50f21ccristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9782576974eba31c1fac74b2492a74862b2fcd50f21ccristy%                                                                             %
9783576974eba31c1fac74b2492a74862b2fcd50f21ccristy%                                                                             %
9784576974eba31c1fac74b2492a74862b2fcd50f21ccristy%                                                                             %
97853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X G e t I m p o r t I n f o                                               %
97863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
97873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
97883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
97893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
97903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
97913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XGetImportInfo() initializes the XImportInfo structure.
97923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
97933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XGetImportInfo method is:
97943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
97953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XGetImportInfo(XImportInfo *ximage_info)
97963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
97973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
97983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
97993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o ximage_info: Specifies a pointer to an ImageInfo structure.
98003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
98013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
98023ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport void XGetImportInfo(XImportInfo *ximage_info)
98033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
98043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(ximage_info != (XImportInfo *) NULL);
98053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ximage_info->frame=MagickFalse;
98063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ximage_info->borders=MagickFalse;
98073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ximage_info->screen=MagickFalse;
98083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ximage_info->descend=MagickTrue;
98093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ximage_info->silent=MagickFalse;
98103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
9811