xwindow.c revision 534d0a353b31242ce2f7b26c4eb4fe53f914d0f5
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%                                                                             %
2045ef08fd6a09813e4a8f5ddadf85ba9e0ec2cdc7cristy%  Copyright 1999-2013 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"
8063a81879d3568083e4ee4f78ebcae2bc831cb764cristy#include "MagickCore/token.h"
814c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/utility.h"
82d1dd6e4fefa0810b9893e6ac9418f79c97c1b39acristy#include "MagickCore/utility-private.h"
834c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/widget.h"
84bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristy#include "MagickCore/widget-private.h"
854c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/xwindow.h"
864c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/xwindow-private.h"
874c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/version.h"
883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__BEOS__)
893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include <OS.h>
903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_X11_DELEGATE)
923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include <X11/Xproto.h>
933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include <X11/Xlocale.h>
943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICK_HAVE_POLL)
953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy# include <sys/poll.h>
963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HAVE_MACHINE_PARAM_H)
993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy# include <machine/param.h>
1003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
1013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include <sys/ipc.h>
1023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include <sys/shm.h>
1033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include <X11/extensions/XShm.h>
1043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
1053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HAVE_SHAPE)
1063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include <X11/extensions/shape.h>
1073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
1083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
1103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  X defines.
1113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
112ce70c17bb6433add2eb069515a4f3105989e0662cristy#define XBlueGamma(color) ClampToQuantum(blue_gamma == 1.0 ? (double) \
1133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (color) : ((pow(((double) QuantumScale*(color)),1.0/(double) blue_gamma)* \
1143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  QuantumRange)))
1154c08aed51c5899665ade97263692328eea4af106cristy#define XGammaPacket(map,color)  (size_t) (map->base_pixel+ \
1167e9f233e6549b1e1856c1aa85b3f4dee8e9493facristy  ((ScaleQuantumToShort(XRedGamma((color)->red))*map->red_max/65535L)* \
1177e9f233e6549b1e1856c1aa85b3f4dee8e9493facristy    map->red_mult)+ \
1187e9f233e6549b1e1856c1aa85b3f4dee8e9493facristy  ((ScaleQuantumToShort(XGreenGamma((color)->green))*map->green_max/65535L)* \
1197e9f233e6549b1e1856c1aa85b3f4dee8e9493facristy    map->green_mult)+ \
1207e9f233e6549b1e1856c1aa85b3f4dee8e9493facristy  ((ScaleQuantumToShort(XBlueGamma((color)->blue))*map->blue_max/65535L)* \
1217e9f233e6549b1e1856c1aa85b3f4dee8e9493facristy    map->blue_mult))
1224c08aed51c5899665ade97263692328eea4af106cristy#define XGammaPixel(image,map,color)  (size_t) (map->base_pixel+ \
1234c08aed51c5899665ade97263692328eea4af106cristy  ((ScaleQuantumToShort(XRedGamma(GetPixelRed(image,color)))*map->red_max/65535L)* \
1244c08aed51c5899665ade97263692328eea4af106cristy    map->red_mult)+ \
1254c08aed51c5899665ade97263692328eea4af106cristy  ((ScaleQuantumToShort(XGreenGamma(GetPixelGreen(image,color)))*map->green_max/65535L)* \
1264c08aed51c5899665ade97263692328eea4af106cristy    map->green_mult)+ \
1274c08aed51c5899665ade97263692328eea4af106cristy  ((ScaleQuantumToShort(XBlueGamma(GetPixelBlue(image,color)))*map->blue_max/65535L)* \
1284c08aed51c5899665ade97263692328eea4af106cristy    map->blue_mult))
129ce70c17bb6433add2eb069515a4f3105989e0662cristy#define XGreenGamma(color) ClampToQuantum(green_gamma == 1.0 ? (double) \
1303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (color) : ((pow(((double) QuantumScale*(color)),1.0/(double) green_gamma)* \
1313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  QuantumRange)))
132ce70c17bb6433add2eb069515a4f3105989e0662cristy#define XRedGamma(color) ClampToQuantum(red_gamma == 1.0 ? (double) \
1333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (color) : ((pow(((double) QuantumScale*(color)),1.0/(double) red_gamma)* \
1343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  QuantumRange)))
135bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy#define XStandardPixel(map,color)  (size_t) (map->base_pixel+ \
1367e9f233e6549b1e1856c1aa85b3f4dee8e9493facristy  (((color)->red*map->red_max/65535L)*map->red_mult)+ \
1377e9f233e6549b1e1856c1aa85b3f4dee8e9493facristy  (((color)->green*map->green_max/65535L)*map->green_mult)+ \
1387e9f233e6549b1e1856c1aa85b3f4dee8e9493facristy  (((color)->blue*map->blue_max/65535L)*map->blue_mult))
1393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define AccentuateModulate  ScaleCharToQuantum(80)
1413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define HighlightModulate  ScaleCharToQuantum(125)
1423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define ShadowModulate  ScaleCharToQuantum(135)
1433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define DepthModulate  ScaleCharToQuantum(185)
1443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define TroughModulate  ScaleCharToQuantum(110)
1453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define XLIB_ILLEGAL_ACCESS  1
1473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#undef ForgetGravity
1483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#undef NorthWestGravity
1493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#undef NorthGravity
1503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#undef NorthEastGravity
1513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#undef WestGravity
1523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#undef CenterGravity
1533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#undef EastGravity
1543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#undef SouthWestGravity
1553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#undef SouthGravity
1563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#undef SouthEastGravity
1573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#undef StaticGravity
1583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#undef index
1603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(hpux9)
1613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define XFD_SET  int
1623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else
1633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define XFD_SET  fd_set
1643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
1653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
1673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Enumeration declarations.
1683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1693ed852eea50f9d4cd633efb8c2b054b8e33c253cristytypedef enum
1703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#undef DoRed
1723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  DoRed = 0x0001,
1733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#undef DoGreen
1743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  DoGreen = 0x0002,
1753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#undef DoBlue
1763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  DoBlue = 0x0004,
1773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  DoMatte = 0x0008
1783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} XColorFlags;
1793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
1813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Typedef declarations.
1823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1833ed852eea50f9d4cd633efb8c2b054b8e33c253cristytypedef struct _DiversityPacket
1843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Quantum
1863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    red,
1873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    green,
1883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    blue;
1893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned short
1913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    index;
1923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
193bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
1943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    count;
1953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} DiversityPacket;
1963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
1983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Constant declaractions.
1993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
2003ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType
2013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  xerror_alert = MagickFalse;
2023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
2043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Method prototypes.
2053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
2063ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic const char
2073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *XVisualClassName(const int);
2083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
209a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristystatic double
2103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  blue_gamma = 1.0,
2113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  green_gamma = 1.0,
2123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  red_gamma = 1.0;
2133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2143ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType
2153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XMakePixmap(Display *,const XResourceInfo *,XWindowInfo *);
2163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2173ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void
2183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XMakeImageLSBFirst(const XResourceInfo *,const XWindowInfo *,Image *,
219e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy    XImage *,XImage *,ExceptionInfo *),
2203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XMakeImageMSBFirst(const XResourceInfo *,const XWindowInfo *,Image *,
221e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy    XImage *,XImage *,ExceptionInfo *);
2223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2233ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Window
2243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSelectWindow(Display *,RectangleInfo *);
2253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
2273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   D e s t r o y X R e s o u r c e s                                         %
2323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  DestroyXResources() destroys any X resources.
2383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the DestroyXResources method is:
2403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void DestroyXResources()
2423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
2443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
2463ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport void DestroyXResources(void)
2473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
2483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register int
2493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
2503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
2523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_windows;
2533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWindowInfo
2553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *magick_windows[MaxXWindows];
2563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWindows
2583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *windows;
2593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  DestroyXWidget();
2613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows=XSetWindows((XWindows *) ~0);
2623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((windows == (XWindows *) NULL) || (windows->display == (Display *) NULL))
2633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return;
2643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  number_windows=0;
2653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magick_windows[number_windows++]=(&windows->context);
2663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magick_windows[number_windows++]=(&windows->group_leader);
2673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magick_windows[number_windows++]=(&windows->backdrop);
2683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magick_windows[number_windows++]=(&windows->icon);
2693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magick_windows[number_windows++]=(&windows->image);
2703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magick_windows[number_windows++]=(&windows->info);
2713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magick_windows[number_windows++]=(&windows->magnify);
2723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magick_windows[number_windows++]=(&windows->pan);
2733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magick_windows[number_windows++]=(&windows->command);
2743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magick_windows[number_windows++]=(&windows->widget);
2753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magick_windows[number_windows++]=(&windows->popup);
2763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magick_windows[number_windows++]=(&windows->context);
2773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; i < (int) number_windows; i++)
2783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
2793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (magick_windows[i]->mapped != MagickFalse)
2803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
2813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XWithdrawWindow(windows->display,magick_windows[i]->id,
2823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          magick_windows[i]->screen);
2833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        magick_windows[i]->mapped=MagickFalse;
2843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
2853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (magick_windows[i]->name != (char *) NULL)
2863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      magick_windows[i]->name=(char *)
2873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        RelinquishMagickMemory(magick_windows[i]->name);
2883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (magick_windows[i]->icon_name != (char *) NULL)
2893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      magick_windows[i]->icon_name=(char *)
2903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        RelinquishMagickMemory(magick_windows[i]->icon_name);
2913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (magick_windows[i]->cursor != (Cursor) NULL)
2923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
2933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XFreeCursor(windows->display,magick_windows[i]->cursor);
2943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        magick_windows[i]->cursor=(Cursor) NULL;
2953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
2963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (magick_windows[i]->busy_cursor != (Cursor) NULL)
2973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
2983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XFreeCursor(windows->display,magick_windows[i]->busy_cursor);
2993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        magick_windows[i]->busy_cursor=(Cursor) NULL;
3003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (magick_windows[i]->highlight_stipple != (Pixmap) NULL)
3023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XFreePixmap(windows->display,
3043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          magick_windows[i]->highlight_stipple);
3053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        magick_windows[i]->highlight_stipple=(Pixmap) NULL;
3063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (magick_windows[i]->shadow_stipple != (Pixmap) NULL)
3083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XFreePixmap(windows->display,magick_windows[i]->shadow_stipple);
3103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        magick_windows[i]->shadow_stipple=(Pixmap) NULL;
3113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (magick_windows[i]->ximage != (XImage *) NULL)
3133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDestroyImage(magick_windows[i]->ximage);
3153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        magick_windows[i]->ximage=(XImage *) NULL;
3163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (magick_windows[i]->pixmap != (Pixmap) NULL)
3183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XFreePixmap(windows->display,magick_windows[i]->pixmap);
3203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        magick_windows[i]->pixmap=(Pixmap) NULL;
3213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (magick_windows[i]->id != (Window) NULL)
3233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XDestroyWindow(windows->display,magick_windows[i]->id);
3253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        magick_windows[i]->id=(Window) NULL;
3263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (magick_windows[i]->destroy != MagickFalse)
3283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (magick_windows[i]->image != (Image *) NULL)
3303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            magick_windows[i]->image=DestroyImage(magick_windows[i]->image);
3323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            magick_windows[i]->image=NewImageList();
3333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (magick_windows[i]->matte_pixmap != (Pixmap) NULL)
3353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XFreePixmap(windows->display,
3373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              magick_windows[i]->matte_pixmap);
3383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            magick_windows[i]->matte_pixmap=(Pixmap) NULL;
3393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (magick_windows[i]->segment_info != (void *) NULL)
3423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
3443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XShmSegmentInfo
3453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *segment_info;
3463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        segment_info=(XShmSegmentInfo *) magick_windows[i]->segment_info;
3483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (segment_info != (XShmSegmentInfo *) NULL)
3493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (segment_info[0].shmid >= 0)
3503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
3513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (segment_info[0].shmaddr != NULL)
3523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (void) shmdt(segment_info[0].shmaddr);
3533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (void) shmctl(segment_info[0].shmid,IPC_RMID,0);
3543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              segment_info[0].shmaddr=NULL;
3553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              segment_info[0].shmid=(-1);
3563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
3573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
3583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        magick_windows[i]->segment_info=(void *)
3593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          RelinquishMagickMemory(magick_windows[i]->segment_info);
3603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
3623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->icon_resources=(XResourceInfo *)
3633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    RelinquishMagickMemory(windows->icon_resources);
3643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->icon_pixel != (XPixelInfo *) NULL)
3653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
366f2faecf9facdbbb14fcba373365f9f691a9658e0cristy      if (windows->icon_pixel->pixels != (unsigned long *) NULL)
367f2faecf9facdbbb14fcba373365f9f691a9658e0cristy        windows->icon_pixel->pixels=(unsigned long *)
3683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          RelinquishMagickMemory(windows->icon_pixel->pixels);
3693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (windows->icon_pixel->annotate_context != (GC) NULL)
3703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XFreeGC(windows->display,windows->icon_pixel->annotate_context);
3713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      windows->icon_pixel=(XPixelInfo *)
3723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        RelinquishMagickMemory(windows->icon_pixel);
3733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
3743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->pixel_info != (XPixelInfo *) NULL)
3753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
376f2faecf9facdbbb14fcba373365f9f691a9658e0cristy      if (windows->pixel_info->pixels != (unsigned long *) NULL)
377f2faecf9facdbbb14fcba373365f9f691a9658e0cristy        windows->pixel_info->pixels=(unsigned long *)
3783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          RelinquishMagickMemory(windows->pixel_info->pixels);
3793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (windows->pixel_info->annotate_context != (GC) NULL)
3803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XFreeGC(windows->display,windows->pixel_info->annotate_context);
3813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (windows->pixel_info->widget_context != (GC) NULL)
3823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XFreeGC(windows->display,windows->pixel_info->widget_context);
3833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (windows->pixel_info->highlight_context != (GC) NULL)
3843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XFreeGC(windows->display,windows->pixel_info->highlight_context);
3853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      windows->pixel_info=(XPixelInfo *)
3863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        RelinquishMagickMemory(windows->pixel_info);
3873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
3883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->font_info != (XFontStruct *) NULL)
3893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
3903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XFreeFont(windows->display,windows->font_info);
3913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      windows->font_info=(XFontStruct *) NULL;
3923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
3933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->class_hints != (XClassHint *) NULL)
3943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
395c9cc4a7b1dd605daff0dd2e0b0e1c42f178871ddcristy      if (windows->class_hints->res_name != (char *) NULL)
396c9cc4a7b1dd605daff0dd2e0b0e1c42f178871ddcristy        windows->class_hints->res_name=DestroyString(
397c9cc4a7b1dd605daff0dd2e0b0e1c42f178871ddcristy          windows->class_hints->res_name);
398c9cc4a7b1dd605daff0dd2e0b0e1c42f178871ddcristy      if (windows->class_hints->res_class != (char *) NULL)
399c9cc4a7b1dd605daff0dd2e0b0e1c42f178871ddcristy        windows->class_hints->res_class=DestroyString(
400c9cc4a7b1dd605daff0dd2e0b0e1c42f178871ddcristy          windows->class_hints->res_class);
4013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XFree(windows->class_hints);
4023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      windows->class_hints=(XClassHint *) NULL;
4033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
4043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->manager_hints != (XWMHints *) NULL)
4053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
4063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XFree(windows->manager_hints);
4073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      windows->manager_hints=(XWMHints *) NULL;
4083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
4093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->map_info != (XStandardColormap *) NULL)
4103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
4113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XFree(windows->map_info);
4123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      windows->map_info=(XStandardColormap *) NULL;
4133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
4143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->icon_map != (XStandardColormap *) NULL)
4153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
4163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XFree(windows->icon_map);
4173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      windows->icon_map=(XStandardColormap *) NULL;
4183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
4193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->visual_info != (XVisualInfo *) NULL)
4203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
4213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XFree(windows->visual_info);
4223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      windows->visual_info=(XVisualInfo *) NULL;
4233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
4243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->icon_visual != (XVisualInfo *) NULL)
4253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
4263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XFree(windows->icon_visual);
4273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      windows->icon_visual=(XVisualInfo *) NULL;
4283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
4293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XSetWindows((XWindows *) NULL);
4303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
4333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X A n n o t a t e I m a g e                                               %
4383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XAnnotateImage() annotates the image with text.
4443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XAnnotateImage method is:
4463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType XAnnotateImage(Display *display,
4487c3af951210f34d3f244b31f06ee291e5be8ecb7cristy%        const XPixelInfo *pixel,XAnnotateInfo *annotate_info,Image *image,
4497c3af951210f34d3f244b31f06ee291e5be8ecb7cristy%        ExceptionInfo *exception)
4503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
4523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
4543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
4553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o pixel: Specifies a pointer to a XPixelInfo structure.
4573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o annotate_info: Specifies a pointer to a XAnnotateInfo structure.
4593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image: the image.
4613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4627c3af951210f34d3f244b31f06ee291e5be8ecb7cristy%    o exception: return any errors or warnings in this structure.
4637c3af951210f34d3f244b31f06ee291e5be8ecb7cristy%
4643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
465bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate MagickBooleanType XAnnotateImage(Display *display,
4667c3af951210f34d3f244b31f06ee291e5be8ecb7cristy  const XPixelInfo *pixel,XAnnotateInfo *annotate_info,Image *image,
4677c3af951210f34d3f244b31f06ee291e5be8ecb7cristy  ExceptionInfo *exception)
4683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
469c57f694b2d04975a0e501613e34368c464708c19cristy  CacheView
470c57f694b2d04975a0e501613e34368c464708c19cristy    *annotate_view;
471c57f694b2d04975a0e501613e34368c464708c19cristy
4723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  GC
4733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    annotate_context;
4743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image
4763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *annotate_image;
4773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
4793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x,
4803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y;
4813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
482b0a657e13c4aefba39c51292005427b47277869dcristy  PixelTrait
483b0a657e13c4aefba39c51292005427b47277869dcristy    alpha_trait;
4843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Pixmap
4863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    annotate_pixmap;
4873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
4893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    depth,
4903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    height,
4913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width;
4923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Window
4943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    root_window;
4953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XGCValues
4973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    context_values;
4983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XImage
5003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *annotate_ximage;
5013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
5033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize annotated image.
5043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
5053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
5063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
5073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(pixel != (XPixelInfo *) NULL);
5083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(annotate_info != (XAnnotateInfo *) NULL);
5093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image != (Image *) NULL);
5103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
5113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize annotated pixmap.
5123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
5133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  root_window=XRootWindow(display,XDefaultScreen(display));
5143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  depth=(unsigned int) XDefaultDepth(display,XDefaultScreen(display));
5153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  annotate_pixmap=XCreatePixmap(display,root_window,annotate_info->width,
5163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    annotate_info->height,depth);
5173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (annotate_pixmap == (Pixmap) NULL)
5183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
5193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
5203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize graphics info.
5213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
5223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  context_values.background=0;
523bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  context_values.foreground=(size_t) (~0);
5243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  context_values.font=annotate_info->font_info->fid;
525c57f694b2d04975a0e501613e34368c464708c19cristy  annotate_context=XCreateGC(display,root_window,(unsigned long)
526c57f694b2d04975a0e501613e34368c464708c19cristy    (GCBackground | GCFont | GCForeground),&context_values);
5273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (annotate_context == (GC) NULL)
5283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
5293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
5303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Draw text to pixmap.
5313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
5323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XDrawImageString(display,annotate_pixmap,annotate_context,0,
5333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (int) annotate_info->font_info->ascent,annotate_info->text,
5343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (int) strlen(annotate_info->text));
5353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFreeGC(display,annotate_context);
5363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
5373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize annotated X image.
5383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
5393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  annotate_ximage=XGetImage(display,annotate_pixmap,0,0,annotate_info->width,
5403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    annotate_info->height,AllPlanes,ZPixmap);
5413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (annotate_ximage == (XImage *) NULL)
5423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
5433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFreePixmap(display,annotate_pixmap);
5443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
5453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize annotated image.
5463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
5476710d8414f0ed06e4eaf9346366be72e2b4719efcristy  annotate_image=AcquireImage((ImageInfo *) NULL,exception);
5483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (annotate_image == (Image *) NULL)
5493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
5503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  annotate_image->columns=annotate_info->width;
5513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  annotate_image->rows=annotate_info->height;
5523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
5533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Transfer annotated X image to image.
5543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
5553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  width=(unsigned int) image->columns;
5563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  height=(unsigned int) image->rows;
5573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  x=0;
5583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  y=0;
5593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XParseGeometry(annotate_info->geometry,&x,&y,&width,&height);
560f05d4947caf1bc27fbec041eb37c474a80c83c0bcristy  (void) GetOneVirtualPixelInfo(image,UndefinedVirtualPixelMethod,(ssize_t) x,
561f05d4947caf1bc27fbec041eb37c474a80c83c0bcristy    (ssize_t) y,&annotate_image->background_color,exception);
5623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (annotate_info->stencil == ForegroundStencil)
5638a46d827a124555f0c48fb2368ec1bba8e079ab6cristy    annotate_image->alpha_trait=BlendPixelTrait;
5646f5395df39e037392db46729f9aab05f2a9a428fcristy  annotate_view=AcquireAuthenticCacheView(annotate_image,exception);
5653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (y=0; y < (int) annotate_image->rows; y++)
5663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
567c57f694b2d04975a0e501613e34368c464708c19cristy    register int
5683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      x;
5693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5704c08aed51c5899665ade97263692328eea4af106cristy    register Quantum
571c47d1f8ecfe7d04f0f003cca0fe175658bbf0fb2cristy      *restrict q;
5723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
573c57f694b2d04975a0e501613e34368c464708c19cristy    q=GetCacheViewAuthenticPixels(annotate_view,0,(ssize_t) y,
574c57f694b2d04975a0e501613e34368c464708c19cristy      annotate_image->columns,1,exception);
575acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy    if (q == (Quantum *) NULL)
5763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
577c57f694b2d04975a0e501613e34368c464708c19cristy    for (x=0; x < (int) annotate_image->columns; x++)
5783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
5794c08aed51c5899665ade97263692328eea4af106cristy      SetPixelAlpha(annotate_image,OpaqueAlpha,q);
5803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (XGetPixel(annotate_ximage,x,y) == 0)
5813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
5823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
5833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Set this pixel to the background color.
5843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
5854c08aed51c5899665ade97263692328eea4af106cristy          SetPixelRed(annotate_image,ScaleShortToQuantum(
5864c08aed51c5899665ade97263692328eea4af106cristy            pixel->box_color.red),q);
5874c08aed51c5899665ade97263692328eea4af106cristy          SetPixelGreen(annotate_image,ScaleShortToQuantum(
5884c08aed51c5899665ade97263692328eea4af106cristy            pixel->box_color.green),q);
5894c08aed51c5899665ade97263692328eea4af106cristy          SetPixelBlue(annotate_image,ScaleShortToQuantum(
5904c08aed51c5899665ade97263692328eea4af106cristy            pixel->box_color.blue),q);
5913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((annotate_info->stencil == ForegroundStencil) ||
5923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (annotate_info->stencil == OpaqueStencil))
5934c08aed51c5899665ade97263692328eea4af106cristy            SetPixelAlpha(annotate_image,TransparentAlpha,q);
5943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
5953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
5963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
5973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
5983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Set this pixel to the pen color.
5993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
6004c08aed51c5899665ade97263692328eea4af106cristy          SetPixelRed(annotate_image,ScaleShortToQuantum(
6014c08aed51c5899665ade97263692328eea4af106cristy            pixel->pen_color.red),q);
6024c08aed51c5899665ade97263692328eea4af106cristy          SetPixelGreen(annotate_image,ScaleShortToQuantum(
6034c08aed51c5899665ade97263692328eea4af106cristy            pixel->pen_color.green),q);
6044c08aed51c5899665ade97263692328eea4af106cristy          SetPixelBlue(annotate_image,ScaleShortToQuantum(
6054c08aed51c5899665ade97263692328eea4af106cristy            pixel->pen_color.blue),q);
6063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (annotate_info->stencil == BackgroundStencil)
6074c08aed51c5899665ade97263692328eea4af106cristy            SetPixelAlpha(annotate_image,TransparentAlpha,q);
6083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
609ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy      q+=GetPixelChannels(annotate_image);
6103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
611c57f694b2d04975a0e501613e34368c464708c19cristy    if (SyncCacheViewAuthenticPixels(annotate_view,exception) == MagickFalse)
6123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
6133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
614c57f694b2d04975a0e501613e34368c464708c19cristy  annotate_view=DestroyCacheView(annotate_view);
6153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XDestroyImage(annotate_ximage);
6163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
6173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Determine annotate geometry.
6183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
6193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XParseGeometry(annotate_info->geometry,&x,&y,&width,&height);
6203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((width != (unsigned int) annotate_image->columns) ||
6213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (height != (unsigned int) annotate_image->rows))
6223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
6233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      char
6243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        image_geometry[MaxTextExtent];
6253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
6273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Scale image.
6283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
629b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy      (void) FormatLocaleString(image_geometry,MaxTextExtent,"%ux%u",
6303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        width,height);
631e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy      (void) TransformImage(&annotate_image,(char *) NULL,image_geometry,
632e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy        exception);
6333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
6343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (annotate_info->degrees != 0.0)
6353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
6363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Image
6373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *rotate_image;
6383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      int
6403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        rotations;
6413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
642a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      double
6433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        normalized_degrees;
6443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
6463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Rotate image.
6473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
6486710d8414f0ed06e4eaf9346366be72e2b4719efcristy      rotate_image=RotateImage(annotate_image,annotate_info->degrees,exception);
6493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (rotate_image == (Image *) NULL)
6503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        return(MagickFalse);
6513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      annotate_image=DestroyImage(annotate_image);
6523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      annotate_image=rotate_image;
6533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
6543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Annotation is relative to the degree of rotation.
6553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
6563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      normalized_degrees=annotate_info->degrees;
6573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      while (normalized_degrees < -45.0)
6583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        normalized_degrees+=360.0;
6593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (rotations=0; normalized_degrees > 45.0; rotations++)
6603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        normalized_degrees-=90.0;
6613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      switch (rotations % 4)
6623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
6633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        default:
6643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 0:
6653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
6663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 1:
6673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
6683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
6693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Rotate 90 degrees.
6703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
6713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          x-=(int) annotate_image->columns/2;
6723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          y+=(int) annotate_image->columns/2;
6733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
6743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
6753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 2:
6763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
6773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
6783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Rotate 180 degrees.
6793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
6803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          x=x-(int) annotate_image->columns;
6813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
6823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
6833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 3:
6843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
6853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
6863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Rotate 270 degrees.
6873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
6883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          x=x-(int) annotate_image->columns/2;
6893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          y=y-(int) (annotate_image->rows-(annotate_image->columns/2));
6903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
6913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
6923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
6933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
6943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
6953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Composite text onto the image.
6963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
6973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XParseGeometry(annotate_info->geometry,&x,&y,&width,&height);
698b0a657e13c4aefba39c51292005427b47277869dcristy  alpha_trait=image->alpha_trait;
699feb3e9695150978a5d2372d3fe2f60466a7c8066cristy  (void) CompositeImage(image,annotate_image,
700b0a657e13c4aefba39c51292005427b47277869dcristy    annotate_image->alpha_trait == BlendPixelTrait ? OverCompositeOp :
701b0a657e13c4aefba39c51292005427b47277869dcristy    CopyCompositeOp,MagickTrue,(ssize_t) x,(ssize_t) y,exception);
702b0a657e13c4aefba39c51292005427b47277869dcristy  image->alpha_trait=alpha_trait;
7033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  annotate_image=DestroyImage(annotate_image);
7043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickTrue);
7053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
7063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
7083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X B e s t F o n t                                                         %
7133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XBestFont() returns the "best" font.  "Best" is defined as a font specified
7193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  in the X resource database or a font such that the text width displayed
7203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  with the font does not exceed the specified maximum width.
7213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XBestFont method is:
7233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XFontStruct *XBestFont(Display *display,
7253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const XResourceInfo *resource_info,const MagickBooleanType text_font)
7263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
7283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o font: XBestFont returns a pointer to a XFontStruct structure.
7303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
7323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
7333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
7353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o text_font:  True is font should be mono-spaced (typewriter style).
7373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
7393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7403ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic char **FontToList(char *font)
7413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
7423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
7433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **fontlist;
7443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register char
7463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p,
7473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
7483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register int
7503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
7513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
7533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    fonts;
7543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (font == (char *) NULL)
7563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((char **) NULL);
7573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
7583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Convert string to an ASCII list.
7593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
7603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  fonts=1U;
7613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (p=font; *p != '\0'; p++)
7623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((*p == ':') || (*p == ';') || (*p == ','))
7633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      fonts++;
7643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  fontlist=(char **) AcquireQuantumMemory((size_t) fonts+1UL,sizeof(*fontlist));
7653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (fontlist == (char **) NULL)
7663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
7673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowXWindowFatalException(ResourceLimitError,"MemoryAllocationFailed",
7683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        font);
7693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return((char **) NULL);
7703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
7713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=font;
7723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; i < (int) fonts; i++)
7733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
7743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    for (q=p; *q != '\0'; q++)
7753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((*q == ':') || (*q == ';') || (*q == ','))
7763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
7773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    fontlist[i]=(char *) AcquireQuantumMemory((size_t) (q-p)+1UL,
7783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      sizeof(*fontlist[i]));
7793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (fontlist[i] == (char *) NULL)
7803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
7813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowXWindowFatalException(ResourceLimitError,"MemoryAllocationFailed",
7823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          font);
7833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        return((char **) NULL);
7843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
7853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) CopyMagickString(fontlist[i],p,(size_t) (q-p+1));
7863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    p=q+1;
7873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
7883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  fontlist[i]=(char *) NULL;
7893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(fontlist);
7903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
7913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
792bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate XFontStruct *XBestFont(Display *display,
7933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const XResourceInfo *resource_info,const MagickBooleanType text_font)
7943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
7953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static const char
7963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *Fonts[]=
7973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
7983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "-*-helvetica-medium-r-normal--12-*-*-*-*-*-iso8859-1",
7993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "-*-arial-medium-r-normal--12-*-*-*-*-*-iso8859-1",
8003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "-*-helvetica-medium-r-normal--12-*-*-*-*-*-iso8859-15",
8013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "-*-arial-medium-r-normal--12-*-*-*-*-*-iso8859-15",
8023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "-*-helvetica-medium-r-normal--12-*-*-*-*-*-*-*",
8033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "-*-arial-medium-r-normal--12-*-*-*-*-*-*-*",
8043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "variable",
8053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "fixed",
8063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (char *) NULL
8073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    },
8083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *TextFonts[]=
8093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
8103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "-*-courier-medium-r-normal-*-12-*-*-*-*-*-iso8859-1",
8113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "-*-courier-medium-r-normal-*-12-*-*-*-*-*-iso8859-15",
8123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "-*-fixed-medium-r-normal-*-12-*-*-*-*-*-*-*",
8133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "fixed",
8143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (char *) NULL
8153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    };
8163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
8183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *font_name;
8193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const char
8213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **p;
8223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XFontStruct
8243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *font_info;
8253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  font_info=(XFontStruct *) NULL;
8273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  font_name=resource_info->font;
8283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (text_font != MagickFalse)
8293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    font_name=resource_info->text_font;
8303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((font_name != (char *) NULL) && (*font_name != '\0'))
8313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
8323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      char
8333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        **fontlist;
8343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      register int
8363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        i;
8373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
8393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Load preferred font specified in the X resource database.
8403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
8413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      fontlist=FontToList(font_name);
8423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (fontlist != (char **) NULL)
8433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
8443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (i=0; fontlist[i] != (char *) NULL; i++)
8453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
8463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (font_info == (XFontStruct *) NULL)
8473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              font_info=XLoadQueryFont(display,fontlist[i]);
8483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            fontlist[i]=DestroyString(fontlist[i]);
8493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
8503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          fontlist=(char **) RelinquishMagickMemory(fontlist);
8513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
8523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (font_info == (XFontStruct *) NULL)
8533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowXWindowFatalException(XServerError,"UnableToLoadFont",font_name);
8543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
8553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
8563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Load fonts from list of fonts until one is found.
8573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
8583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=Fonts;
8593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (text_font != MagickFalse)
8603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    p=TextFonts;
8613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (XDisplayHeight(display,XDefaultScreen(display)) >= 748)
8623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    p++;
8633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while (*p != (char *) NULL)
8643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
8653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (font_info != (XFontStruct *) NULL)
8663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
8673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    font_info=XLoadQueryFont(display,(char *) *p);
8683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    p++;
8693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
8703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(font_info);
8713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
8723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
8743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X B e s t I c o n S i z e                                                 %
8793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XBestIconSize() returns the "best" icon size.  "Best" is defined as an icon
8853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  size that maintains the aspect ratio of the image.  If the window manager
8863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  has preferred icon sizes, one of the preferred sizes is used.
8873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XBestIconSize method is:
8893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XBestIconSize(Display *display,XWindowInfo *window,Image *image)
8913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
8933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
8953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
8963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image: the image.
8983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
900bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XBestIconSize(Display *display,XWindowInfo *window,
9013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image *image)
9023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
9033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
9043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
9053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_sizes;
9063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
907a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  double
9083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    scale_factor;
9093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
9113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    height,
9123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    icon_height,
9133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    icon_width,
9143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width;
9153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Window
9173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    root_window;
9183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XIconSize
9203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *icon_size,
9213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *size_list;
9223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
9243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Determine if the window manager has specified preferred icon sizes.
9253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
9263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
9273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
9283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(window != (XWindowInfo *) NULL);
9293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image != (Image *) NULL);
9303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->width=MaxIconSize;
9313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->height=MaxIconSize;
9323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  icon_size=(XIconSize *) NULL;
9333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  number_sizes=0;
9343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  root_window=XRootWindow(display,window->screen);
9353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (XGetIconSizes(display,root_window,&size_list,&number_sizes) != 0)
9363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((number_sizes > 0) && (size_list != (XIconSize *) NULL))
9373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      icon_size=size_list;
9383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (icon_size == (XIconSize *) NULL)
9393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
9403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
9413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Window manager does not restrict icon size.
9423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
9433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      icon_size=XAllocIconSize();
9443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (icon_size == (XIconSize *) NULL)
9453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
9463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ThrowXWindowFatalException(ResourceLimitError,
9473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            "MemoryAllocationFailed",image->filename);
9483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          return;
9493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
9503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      icon_size->min_width=1;
9513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      icon_size->max_width=MaxIconSize;
9523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      icon_size->min_height=1;
9533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      icon_size->max_height=MaxIconSize;
9543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      icon_size->width_inc=1;
9553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      icon_size->height_inc=1;
9563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
9573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
9583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Determine aspect ratio of image.
9593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
9603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  width=(unsigned int) image->columns;
9613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  height=(unsigned int) image->rows;
9623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  i=0;
9633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->crop_geometry)
9643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XParseGeometry(window->crop_geometry,&i,&i,&width,&height);
9653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
9663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Look for an icon size that maintains the aspect ratio of image.
9673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
968a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  scale_factor=(double) icon_size->max_width/width;
969a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  if (scale_factor > ((double) icon_size->max_height/height))
970a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy    scale_factor=(double) icon_size->max_height/height;
9713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  icon_width=(unsigned int) icon_size->min_width;
9723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while ((int) icon_width < icon_size->max_width)
9733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
9743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (icon_width >= (unsigned int) (scale_factor*width+0.5))
9753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
9763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    icon_width+=icon_size->width_inc;
9773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
9783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  icon_height=(unsigned int) icon_size->min_height;
9793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while ((int) icon_height < icon_size->max_height)
9803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
9813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (icon_height >= (unsigned int) (scale_factor*height+0.5))
9823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
9833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    icon_height+=icon_size->height_inc;
9843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
9853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFree((void *) icon_size);
9863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->width=icon_width;
9873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->height=icon_height;
9883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
9893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
9913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X B e s t P i x e l                                                       %
9963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XBestPixel() returns a pixel from an array of pixels that is closest to the
10023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  requested color.  If the color array is NULL, the colors are obtained from
10033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  the X server.
10043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XBestPixel method is:
10063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XBestPixel(Display *display,const Colormap colormap,XColor *colors,
10083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        unsigned int number_colors,XColor *color)
10093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
10113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o pixel: XBestPixel returns the pixel value closest to the requested
10133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      color.
10143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
10163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
10173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o colormap: Specifies the ID of the X server colormap.
10193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o colors: Specifies an array of XColor structures.
10213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o number_colors: Specifies the number of XColor structures in the
10233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      color definition array.
10243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o color: Specifies the desired RGB value to find in the colors array.
10263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1028bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XBestPixel(Display *display,const Colormap colormap,
10293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XColor *colors,unsigned int number_colors,XColor *color)
10303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
10313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
10323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    query_server;
10333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10344c08aed51c5899665ade97263692328eea4af106cristy  PixelInfo
10353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel;
10363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1037a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  double
10383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    min_distance;
10393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1040a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  register double
10413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    distance;
10423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register int
10443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
10453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    j;
10463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
10483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
10493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
10513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Find closest representation for the requested RGB color.
10523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
10533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
10543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
10553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(color != (XColor *) NULL);
10563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XAllocColor(display,colormap,color);
10573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status != False)
10583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return;
10593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  query_server=colors == (XColor *) NULL ? MagickTrue : MagickFalse;
10603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (query_server != MagickFalse)
10613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
10623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
10633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Read X server colormap.
10643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
10653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      colors=(XColor *) AcquireQuantumMemory(number_colors,sizeof(*colors));
10663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (colors == (XColor *) NULL)
10673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
10683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ThrowXWindowFatalException(ResourceLimitError,
10693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            "MemoryAllocationFailed","...");
10703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          return;
10713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
10723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (i=0; i < (int) number_colors; i++)
1073bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        colors[i].pixel=(size_t) i;
10743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (number_colors > 256)
10753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        number_colors=256;
10763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XQueryColors(display,colormap,colors,(int) number_colors);
10773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
1078a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  min_distance=3.0*((double) QuantumRange+1.0)*((double)
10793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    QuantumRange+1.0);
10803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  j=0;
10813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; i < (int) number_colors; i++)
10823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
1083a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy    pixel.red=colors[i].red-(double) color->red;
10843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    distance=pixel.red*pixel.red;
10853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (distance > min_distance)
10863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      continue;
1087a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy    pixel.green=colors[i].green-(double) color->green;
10883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    distance+=pixel.green*pixel.green;
10893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (distance > min_distance)
10903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      continue;
1091a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy    pixel.blue=colors[i].blue-(double) color->blue;
10923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    distance+=pixel.blue*pixel.blue;
10933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (distance > min_distance)
10943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      continue;
10953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    min_distance=distance;
10963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    color->pixel=colors[i].pixel;
10973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    j=i;
10983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
10993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XAllocColor(display,colormap,&colors[j]);
11003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (query_server != MagickFalse)
11013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    colors=(XColor *) RelinquishMagickMemory(colors);
11023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
11033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
11053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X B e s t V i s u a l I n f o                                             %
11103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XBestVisualInfo() returns visual information for a visual that is the "best"
11163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  the server supports.  "Best" is defined as:
11173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    1. Restrict the visual list to those supported by the default screen.
11193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    2. If a visual type is specified, restrict the visual list to those of
11213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%       that type.
11223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    3. If a map type is specified, choose the visual that matches the id
11243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%       specified by the Standard Colormap.
11253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    4  From the list of visuals, choose one that can display the most
11273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%       simultaneous colors.  If more than one visual can display the same
11283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%       number of simultaneous colors, one is chosen based on a rank.
11293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XBestVisualInfo method is:
11313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XVisualInfo *XBestVisualInfo(Display *display,
11333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        XStandardColormap *map_info,XResourceInfo *resource_info)
11343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
11363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o visual_info: XBestVisualInfo returns a pointer to a X11 XVisualInfo
11383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      structure.
11393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
11413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
11423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o map_info: If map_type is specified, this structure is initialized
11443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      with info from the Standard Colormap.
11453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
11473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
11493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11503ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic inline int MagickMax(const int x,const int y)
11513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
11523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (x > y)
11533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(x);
11543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(y);
11553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
11563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1157bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristystatic inline size_t MagickMin(const unsigned int x,
11583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const unsigned int y)
11593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
11603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (x < y)
11613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(x);
11623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(y);
11633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
11643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1165bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate XVisualInfo *XBestVisualInfo(Display *display,
11663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XStandardColormap *map_info,XResourceInfo *resource_info)
11673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
11683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define MaxStandardColormaps  7
11693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define XVisualColormapSize(visual_info) MagickMin((unsigned int) (\
11703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (visual_info->klass == TrueColor) || (visual_info->klass == DirectColor) ? \
11713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   visual_info->red_mask | visual_info->green_mask | visual_info->blue_mask : \
11723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   (unsigned int) visual_info->colormap_size),1U << visual_info->depth)
11733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
11753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *map_type,
11763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *visual_type;
11773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1178c57f694b2d04975a0e501613e34368c464708c19cristy  int
1179c57f694b2d04975a0e501613e34368c464708c19cristy    visual_mask;
1180c57f694b2d04975a0e501613e34368c464708c19cristy
11813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register int
11823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
11833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11848891f9ce489d3e61399b60436ea6c62f5ed9b887cristy  size_t
11858891f9ce489d3e61399b60436ea6c62f5ed9b887cristy    one;
11868891f9ce489d3e61399b60436ea6c62f5ed9b887cristy
11873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static int
11883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_visuals;
11893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static XVisualInfo
11913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    visual_template;
11923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XVisualInfo
11943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *visual_info,
11953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *visual_list;
11963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
11983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Restrict visual search by screen number.
11993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
12003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
12013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
12023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(map_info != (XStandardColormap *) NULL);
12033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(resource_info != (XResourceInfo *) NULL);
12043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  map_type=resource_info->map_type;
12053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  visual_type=resource_info->visual_type;
12063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  visual_mask=VisualScreenMask;
12073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  visual_template.screen=XDefaultScreen(display);
12083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  visual_template.depth=XDefaultDepth(display,XDefaultScreen(display));
12098891f9ce489d3e61399b60436ea6c62f5ed9b887cristy  one=1;
12103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((resource_info->immutable != MagickFalse) && (resource_info->colors != 0))
12118891f9ce489d3e61399b60436ea6c62f5ed9b887cristy    if (resource_info->colors <= (one << (size_t) visual_template.depth))
12123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      visual_mask|=VisualDepthMask;
12133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (visual_type != (char *) NULL)
12143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
12153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
12163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Restrict visual search by class or visual id.
12173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
12183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (LocaleCompare("staticgray",visual_type) == 0)
12193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
12203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          visual_mask|=VisualClassMask;
12213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          visual_template.klass=StaticGray;
12223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
12233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
12243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare("grayscale",visual_type) == 0)
12253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
12263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            visual_mask|=VisualClassMask;
12273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            visual_template.klass=GrayScale;
12283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
12293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        else
12303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (LocaleCompare("staticcolor",visual_type) == 0)
12313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
12323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              visual_mask|=VisualClassMask;
12333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              visual_template.klass=StaticColor;
12343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
12353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          else
12363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (LocaleCompare("pseudocolor",visual_type) == 0)
12373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
12383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                visual_mask|=VisualClassMask;
12393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                visual_template.klass=PseudoColor;
12403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
12413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            else
12423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (LocaleCompare("truecolor",visual_type) == 0)
12433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
12443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  visual_mask|=VisualClassMask;
12453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  visual_template.klass=TrueColor;
12463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
12473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              else
12483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if (LocaleCompare("directcolor",visual_type) == 0)
12493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  {
12503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    visual_mask|=VisualClassMask;
12513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    visual_template.klass=DirectColor;
12523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  }
12533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                else
12543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  if (LocaleCompare("default",visual_type) == 0)
12553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    {
12563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      visual_mask|=VisualIDMask;
12573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      visual_template.visualid=XVisualIDFromVisual(
12583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        XDefaultVisual(display,XDefaultScreen(display)));
12593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    }
12603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  else
12613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    if (isdigit((int) ((unsigned char) *visual_type)) != 0)
12623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      {
12633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        visual_mask|=VisualIDMask;
12643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        visual_template.visualid=
12653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                          strtol(visual_type,(char **) NULL,0);
12663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      }
12673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    else
12683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      ThrowXWindowFatalException(XServerError,
12693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        "UnrecognizedVisualSpecifier",visual_type);
12703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
12713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
12723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Get all visuals that meet our criteria so far.
12733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
12743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  number_visuals=0;
12753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  visual_list=XGetVisualInfo(display,visual_mask,&visual_template,
12763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    &number_visuals);
12773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  visual_mask=VisualScreenMask | VisualIDMask;
12783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((number_visuals == 0) || (visual_list == (XVisualInfo *) NULL))
12793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
12803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
12813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Failed to get visual;  try using the default visual.
12823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
12833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowXWindowFatalException(XServerWarning,"UnableToGetVisual",
12843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        visual_type);
12853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      visual_template.visualid=XVisualIDFromVisual(XDefaultVisual(display,
12863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDefaultScreen(display)));
12873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      visual_list=XGetVisualInfo(display,visual_mask,&visual_template,
12883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        &number_visuals);
12893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((number_visuals == 0) || (visual_list == (XVisualInfo *) NULL))
12903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        return((XVisualInfo *) NULL);
12913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowXWindowFatalException(XServerWarning,"UsingDefaultVisual",
12923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XVisualClassName(visual_list->klass));
12933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
12943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->color_recovery=MagickFalse;
12953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((map_info != (XStandardColormap *) NULL) && (map_type != (char *) NULL))
12963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
12973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Atom
12983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        map_property;
12993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
13003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      char
13013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        map_name[MaxTextExtent];
13023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
13033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      int
13043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        j,
13053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        number_maps;
13063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
13073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Status
13083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        status;
13093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
13103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Window
13113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        root_window;
13123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
13133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XStandardColormap
13143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *map_list;
13153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
13163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
13173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Choose a visual associated with a standard colormap.
13183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
13193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      root_window=XRootWindow(display,XDefaultScreen(display));
13203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=False;
13213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (LocaleCompare(map_type,"list") != 0)
13223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
13233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
13243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            User specified Standard Colormap.
13253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
1326b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy          (void) FormatLocaleString((char *) map_name,MaxTextExtent,
13273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            "RGB_%s_MAP",map_type);
13283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          LocaleUpper(map_name);
13293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          map_property=XInternAtom(display,(char *) map_name,MagickTrue);
13303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (map_property != (Atom) NULL)
13313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            status=XGetRGBColormaps(display,root_window,&map_list,&number_maps,
13323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              map_property);
13333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
13343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
13353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
13363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          static const char
13373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *colormap[MaxStandardColormaps]=
13383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
13393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              "_HP_RGB_SMOOTH_MAP_LIST",
13403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              "RGB_BEST_MAP",
13413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              "RGB_DEFAULT_MAP",
13423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              "RGB_GRAY_MAP",
13433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              "RGB_RED_MAP",
13443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              "RGB_GREEN_MAP",
13453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              "RGB_BLUE_MAP",
13463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            };
13473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
13483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
13493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Choose a standard colormap from a list.
13503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
13513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (i=0; i < MaxStandardColormaps; i++)
13523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
13533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            map_property=XInternAtom(display,(char *) colormap[i],MagickTrue);
13543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (map_property == (Atom) NULL)
13553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              continue;
13563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            status=XGetRGBColormaps(display,root_window,&map_list,&number_maps,
13573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              map_property);
13583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (status != False)
13593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
13603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
13613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          resource_info->color_recovery=i == 0 ? MagickTrue : MagickFalse;
13623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
13633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (status == False)
13643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
13653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ThrowXWindowFatalException(XServerError,"UnableToGetStandardColormap",
13663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            map_type);
13673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          return((XVisualInfo *) NULL);
13683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
13693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
13703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Search all Standard Colormaps and visuals for ids that match.
13713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
13723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      *map_info=map_list[0];
13733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if !defined(PRE_R4_ICCCM)
13743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      visual_template.visualid=XVisualIDFromVisual(visual_list[0].visual);
13753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (i=0; i < number_maps; i++)
13763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for (j=0; j < number_visuals; j++)
13773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (map_list[i].visualid ==
13783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              XVisualIDFromVisual(visual_list[j].visual))
13793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
13803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *map_info=map_list[i];
13813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              visual_template.visualid=XVisualIDFromVisual(
13823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                visual_list[j].visual);
13833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
13843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
13853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (map_info->visualid != visual_template.visualid)
13863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
13873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ThrowXWindowFatalException(XServerError,
13883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            "UnableToMatchVisualToStandardColormap",map_type);
13893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          return((XVisualInfo *) NULL);
13903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
13913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
13923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (map_info->colormap == (Colormap) NULL)
13933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
13943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ThrowXWindowFatalException(XServerError,
13953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            "StandardColormapIsNotInitialized",map_type);
13963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          return((XVisualInfo *) NULL);
13973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
13983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XFree((void *) map_list);
13993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
14003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
14013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
14023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      static const unsigned int
14033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        rank[]=
14043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
14053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            StaticGray,
14063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            GrayScale,
14073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            StaticColor,
14083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            DirectColor,
14093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            TrueColor,
14103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            PseudoColor
14113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          };
14123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
14133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XVisualInfo
14143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *p;
14153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
14163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
14173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Pick one visual that displays the most simultaneous colors.
14183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
14193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      visual_info=visual_list;
14203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      p=visual_list;
14213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (i=1; i < number_visuals; i++)
14223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
14233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        p++;
14243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (XVisualColormapSize(p) > XVisualColormapSize(visual_info))
14253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          visual_info=p;
14263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        else
14273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (XVisualColormapSize(p) == XVisualColormapSize(visual_info))
14283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (rank[p->klass] > rank[visual_info->klass])
14293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              visual_info=p;
14303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
14313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      visual_template.visualid=XVisualIDFromVisual(visual_info->visual);
14323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
14333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFree((void *) visual_list);
14343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
14353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Retrieve only one visual by its screen & id number.
14363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
14373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  visual_info=XGetVisualInfo(display,visual_mask,&visual_template,
14383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    &number_visuals);
14393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((number_visuals == 0) || (visual_info == (XVisualInfo *) NULL))
14403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((XVisualInfo *) NULL);
14413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(visual_info);
14423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
14433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
14443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
14453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
14463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X C h e c k D e f i n e C u r s o r                                       %
14503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
14543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XCheckDefineCursor() prevents cursor changes on the root window.
14563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XXCheckDefineCursor method is:
14583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XCheckDefineCursor(display,window,cursor)
14603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
14623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
14643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
14653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: the window.
14673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o cursor: the cursor.
14693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1471bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate int XCheckDefineCursor(Display *display,Window window,
14723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Cursor cursor)
14733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
14743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
14753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
14763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window == XRootWindow(display,XDefaultScreen(display)))
14773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(0);
14783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(XDefineCursor(display,window,cursor));
14793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
14803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
14813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
14823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
14833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X C h e c k R e f r e s h W i n d o w s                                   %
14873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
14913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XCheckRefreshWindows() checks the X server for exposure events for a
14933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  particular window and updates the areassociated with the exposure event.
14943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XCheckRefreshWindows method is:
14963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XCheckRefreshWindows(Display *display,XWindows *windows)
14983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
15003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
15023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
15033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o windows: Specifies a pointer to a XWindows structure.
15053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1507bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XCheckRefreshWindows(Display *display,XWindows *windows)
15083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
15093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Window
15103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    id;
15113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
15123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XEvent
15133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    event;
15143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
15153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
15163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
15173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(windows != (XWindows *) NULL);
15183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XDelay(display,SuspendTime);
15193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  id=windows->command.id;
15203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while (XCheckTypedWindowEvent(display,id,Expose,&event) != MagickFalse)
15213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XCommandWidget(display,windows,(char const **) NULL,&event);
15223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  id=windows->image.id;
15233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while (XCheckTypedWindowEvent(display,id,Expose,&event) != MagickFalse)
15243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    XRefreshWindow(display,&windows->image,&event);
15253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XDelay(display,SuspendTime << 1);
15263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  id=windows->command.id;
15273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while (XCheckTypedWindowEvent(display,id,Expose,&event) != MagickFalse)
15283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XCommandWidget(display,windows,(char const **) NULL,&event);
15293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  id=windows->image.id;
15303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while (XCheckTypedWindowEvent(display,id,Expose,&event) != MagickFalse)
15313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    XRefreshWindow(display,&windows->image,&event);
15323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
15333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
15343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
15353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
15363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X C l i e n t M e s s a g e                                               %
15403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
15443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XClientMessage() sends a reason to a window with XSendEvent.  The reason is
15463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  initialized with a particular protocol type and atom.
15473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XClientMessage function is:
15493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XClientMessage(display,window,protocol,reason,timestamp)
15513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
15533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a pointer to the Display structure;  returned from
15553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
15563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies a pointer to a Window structure.
15583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o protocol: Specifies an atom value.
15603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o reason: Specifies an atom value which is the reason to send.
15623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o timestamp: Specifies a value of type Time.
15643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1566bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XClientMessage(Display *display,const Window window,
15673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const Atom protocol,const Atom reason,const Time timestamp)
15683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
15693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XClientMessageEvent
15703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    client_event;
15713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
15723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
15733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  client_event.type=ClientMessage;
15743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  client_event.window=window;
15753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  client_event.message_type=protocol;
15763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  client_event.format=32;
1577c57f694b2d04975a0e501613e34368c464708c19cristy  client_event.data.l[0]=(long) reason;
1578c57f694b2d04975a0e501613e34368c464708c19cristy  client_event.data.l[1]=(long) timestamp;
15793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XSendEvent(display,window,MagickFalse,NoEventMask,(XEvent *) &client_event);
15803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
15813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
15823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
15833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
15843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy+   X C l i e n t W i n d o w                                                 %
15883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
15923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XClientWindow() finds a window, at or below the specified window, which has
15943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  a WM_STATE property.  If such a window is found, it is returned, otherwise
15953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  the argument window is returned.
15963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XClientWindow function is:
15983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      client_window=XClientWindow(display,target_window)
16003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
16023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o client_window: XClientWindow returns a window, at or below the specified
16043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      window, which has a WM_STATE property otherwise the argument
16053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      target_window is returned.
16063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a pointer to the Display structure;  returned from
16083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
16093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o target_window: Specifies the window to find a WM_STATE property.
16113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
16133ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Window XClientWindow(Display *display,Window target_window)
16143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
16153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Atom
16163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    state,
16173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    type;
16183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
16193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
16203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    format;
16213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
16223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
16233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
16243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
16253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned char
16263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *data;
16273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1628f2faecf9facdbbb14fcba373365f9f691a9658e0cristy  unsigned long
16293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    after,
16303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_items;
16313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
16323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Window
16333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    client_window;
16343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
16353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
16363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
16373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  state=XInternAtom(display,"WM_STATE",MagickTrue);
16383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (state == (Atom) NULL)
16393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(target_window);
16403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  type=(Atom) NULL;
16413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XGetWindowProperty(display,target_window,state,0L,0L,MagickFalse,
16423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (Atom) AnyPropertyType,&type,&format,&number_items,&after,&data);
16433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((status == Success) && (type != (Atom) NULL))
16443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(target_window);
16453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  client_window=XWindowByProperty(display,target_window,state);
16463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (client_window == (Window) NULL)
16473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(target_window);
16483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(client_window);
16493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
16503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
16513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
16523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
16533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1656f34a145c545cb86152ad42a787f6d5fffea6b77ccristy+   X C o m p o n e n t T e r m i n u s                                       %
1657f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1658f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1659f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1660f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1661f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
1662f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%  XComponentTerminus() destroys the module component.
1663f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
1664f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%  The format of the XComponentTerminus method is:
1665f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
1666f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%      XComponentTerminus(void)
1667f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%
1668f34a145c545cb86152ad42a787f6d5fffea6b77ccristy*/
16695ff4eaf57b3cd47d0371f204f865cbba614674a0cristyMagickPrivate void XComponentTerminus(void)
1670f34a145c545cb86152ad42a787f6d5fffea6b77ccristy{
1671f34a145c545cb86152ad42a787f6d5fffea6b77ccristy  DestroyXResources();
1672f34a145c545cb86152ad42a787f6d5fffea6b77ccristy}
1673f34a145c545cb86152ad42a787f6d5fffea6b77ccristy
1674f34a145c545cb86152ad42a787f6d5fffea6b77ccristy/*
1675f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1676f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1677f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
1678f34a145c545cb86152ad42a787f6d5fffea6b77ccristy%                                                                             %
16793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X C o n f i g u r e I m a g e C o l o r m a p                             %
16803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
16833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
16843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XConfigureImageColormap() creates a new X colormap.
16863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XConfigureImageColormap method is:
16883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XConfigureImageColormap(Display *display,
16906710d8414f0ed06e4eaf9346366be72e2b4719efcristy%        XResourceInfo *resource_info,XWindows *windows,Image *image,
16916710d8414f0ed06e4eaf9346366be72e2b4719efcristy%        ExceptionInfo *exception)
16923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
16943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server; returned from
16963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
16973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
16993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o windows: Specifies a pointer to a XWindows structure.
17013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image: the image.
17033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17046710d8414f0ed06e4eaf9346366be72e2b4719efcristy%    o exception: return any errors or warnings in this structure.
17056710d8414f0ed06e4eaf9346366be72e2b4719efcristy%
17063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1707bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XConfigureImageColormap(Display *display,
17086710d8414f0ed06e4eaf9346366be72e2b4719efcristy  XResourceInfo *resource_info,XWindows *windows,Image *image,
17096710d8414f0ed06e4eaf9346366be72e2b4719efcristy  ExceptionInfo *exception)
17103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
17113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Colormap
17123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    colormap;
17133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
17143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
17153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Make standard colormap.
17163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
17173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetCursorState(display,windows,MagickTrue);
17183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XCheckRefreshWindows(display,windows);
17193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XMakeStandardColormap(display,windows->visual_info,resource_info,image,
17206710d8414f0ed06e4eaf9346366be72e2b4719efcristy    windows->map_info,windows->pixel_info,exception);
17213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  colormap=windows->map_info->colormap;
17223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XSetWindowColormap(display,windows->image.id,colormap);
17233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XSetWindowColormap(display,windows->command.id,colormap);
17243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XSetWindowColormap(display,windows->widget.id,colormap);
17253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->magnify.mapped != MagickFalse)
17263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XSetWindowColormap(display,windows->magnify.id,colormap);
17273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->pan.mapped != MagickFalse)
17283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XSetWindowColormap(display,windows->pan.id,colormap);
17293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetCursorState(display,windows,MagickFalse);
17303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XClientMessage(display,windows->image.id,windows->im_protocols,
17313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    windows->im_update_colormap,CurrentTime);
17323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
17333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
17343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
17353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
17363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X C o n s t r a i n W i n d o w P o s i t i o n                           %
17403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
17443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XConstrainWindowPosition() assures a window is positioned within the X
17463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  server boundaries.
17473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XConstrainWindowPosition method is:
17493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XConstrainWindowPosition(Display *display,XWindowInfo *window_info)
17513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
17533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a pointer to the Display structure;  returned from
17553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
17563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window_info: Specifies a pointer to a XWindowInfo structure.
17583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1760bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XConstrainWindowPosition(Display *display,
17613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWindowInfo *window_info)
17623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
17633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
17643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    limit;
17653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
17663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
17673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
17683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(window_info != (XWindowInfo *) NULL);
17693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  limit=XDisplayWidth(display,window_info->screen)-window_info->width;
17703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window_info->x < 0)
17713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window_info->x=0;
17723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
17733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (window_info->x > (int) limit)
17743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window_info->x=(int) limit;
17753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  limit=XDisplayHeight(display,window_info->screen)-window_info->height;
17763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window_info->y < 0)
17773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window_info->y=0;
17783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
17793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (window_info->y > limit)
17803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window_info->y=limit;
17813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
17823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
17833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
17843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
17853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X D e l a y                                                               %
17893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
17933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XDelay() suspends program execution for the number of milliseconds
17953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  specified.
17963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the Delay method is:
17983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1799bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%      void XDelay(Display *display,const size_t milliseconds)
18003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
18023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a pointer to the Display structure;  returned from
18043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
18053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o milliseconds: Specifies the number of milliseconds to delay before
18073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      returning.
18083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1810bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XDelay(Display *display,const size_t milliseconds)
18113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
18123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
18133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFlush(display);
1814a21afdefe277667f7821fa90decc1f15a167eacfcristy  MagickDelay(milliseconds);
18153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
18163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
18173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
18183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
18193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X D e s t r o y R e s o u r c e I n f o                                   %
18233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
18273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XDestroyResourceInfo() frees memory associated with the XResourceInfo
18293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  structure.
18303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XDestroyResourceInfo method is:
18323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XDestroyResourceInfo(XResourceInfo *resource_info)
18343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
18363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
18383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
18403ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport void XDestroyResourceInfo(XResourceInfo *resource_info)
18413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
18423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (resource_info->image_geometry != (char *) NULL)
18433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    resource_info->image_geometry=(char *)
18443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      RelinquishMagickMemory(resource_info->image_geometry);
18453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (resource_info->quantize_info != (QuantizeInfo *) NULL)
18463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    resource_info->quantize_info=DestroyQuantizeInfo(
18473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      resource_info->quantize_info);
18483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (resource_info->client_name != (char *) NULL)
18493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    resource_info->client_name=(char *)
18503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      RelinquishMagickMemory(resource_info->client_name);
18513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (resource_info->name != (char *) NULL)
18523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    resource_info->name=DestroyString(resource_info->name);
18533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ResetMagickMemory(resource_info,0,sizeof(*resource_info));
18543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
18553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
18563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
18573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
18583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X D e s t r o y W i n d o w C o l o r s                                   %
18623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
18653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
18663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XDestroyWindowColors() frees X11 color resources previously saved on a
18683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  window by XRetainWindowColors or programs like xsetroot.
18693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XDestroyWindowColors method is:
18713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XDestroyWindowColors(Display *display,Window window)
18733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
18753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server; returned from
18773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
18783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies a pointer to a Window structure.
18803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
18813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1882bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XDestroyWindowColors(Display *display,Window window)
18833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
18843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Atom
18853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    property,
18863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    type;
18873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
18883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
18893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    format;
18903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
18913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
18923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
18933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
18943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned char
18953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *data;
18963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1897f2faecf9facdbbb14fcba373365f9f691a9658e0cristy  unsigned long
18983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    after,
18993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length;
19003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
19013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
19023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    If there are previous resources on the root window, destroy them.
19033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
19043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
19053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
19063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  property=XInternAtom(display,"_XSETROOT_ID",MagickFalse);
19073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (property == (Atom) NULL)
19083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
19093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowXWindowFatalException(XServerError,"UnableToCreateProperty",
19103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "_XSETROOT_ID");
19113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return;
19123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
19133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XGetWindowProperty(display,window,property,0L,1L,MagickTrue,
19143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (Atom) AnyPropertyType,&type,&format,&length,&after,&data);
19153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status != Success)
19163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return;
19173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((type == XA_PIXMAP) && (format == 32) && (length == 1) && (after == 0))
19183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
19193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XKillClient(display,(XID) (*((Pixmap *) data)));
19203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XDeleteProperty(display,window,property);
19213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
19223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (type != None)
19233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XFree((void *) data);
19243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
19253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
19263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
19273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
19283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
19293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
19303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
19313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X D i s p l a y I m a g e I n f o                                         %
19323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
19333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
19343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
19353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
19363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XDisplayImageInfo() displays information about an X image.
19383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XDisplayImageInfo method is:
19403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XDisplayImageInfo(Display *display,
19423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const XResourceInfo *resource_info,XWindows *windows,Image *undo_image,
19436710d8414f0ed06e4eaf9346366be72e2b4719efcristy%        Image *image,ExceptionInfo *exception)
19443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
19463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
19483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
19493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
19513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o windows: Specifies a pointer to a XWindows structure.
19533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o undo_image: the undo image.
19553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image: the image.
19573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19586710d8414f0ed06e4eaf9346366be72e2b4719efcristy%    o exception: return any errors or warnings in this structure.
19596710d8414f0ed06e4eaf9346366be72e2b4719efcristy%
19603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1961bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XDisplayImageInfo(Display *display,
19623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const XResourceInfo *resource_info,XWindows *windows,Image *undo_image,
19636710d8414f0ed06e4eaf9346366be72e2b4719efcristy  Image *image,ExceptionInfo *exception)
19643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
19653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
19663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    filename[MaxTextExtent],
19673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *text,
19683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **textlist;
19693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
19703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  FILE
19713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *file;
19723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
19733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
19743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    unique_file;
19753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1976bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
19773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
19783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1979bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
19803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_pixels;
19813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
19829d314ff2c17a77996c05413c2013880387e50f0ecristy  ssize_t
19839d314ff2c17a77996c05413c2013880387e50f0ecristy    bytes;
19849d314ff2c17a77996c05413c2013880387e50f0ecristy
19859d314ff2c17a77996c05413c2013880387e50f0ecristy  unsigned int
19869d314ff2c17a77996c05413c2013880387e50f0ecristy    levels;
19879d314ff2c17a77996c05413c2013880387e50f0ecristy
19883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
19893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Write info about the X server to a file.
19903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
19913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
19923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(resource_info != (XResourceInfo *) NULL);
19933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(windows != (XWindows *) NULL);
19943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image != (Image *) NULL);
19953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image->debug)
19963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
19973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  file=(FILE *) NULL;
19983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unique_file=AcquireUniqueFileResource(filename);
19993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (unique_file != -1)
20003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    file=fdopen(unique_file,"w");
20013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((unique_file == -1) || (file == (FILE *) NULL))
20023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
20033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XNoticeWidget(display,windows,"Unable to display image info",filename);
20043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return;
20053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
20063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (resource_info->gamma_correct != MagickFalse)
20073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (resource_info->display_gamma != (char *) NULL)
2008b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy      (void) FormatLocaleFile(file,"Display\n  gamma: %s\n\n",
20093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        resource_info->display_gamma);
20103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
20113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Write info about the X image to a file.
20123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
2013b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleFile(file,"X\n  visual: %s\n",
20143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    XVisualClassName((int) windows->image.storage_class));
2015b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleFile(file,"  depth: %d\n",windows->image.ximage->depth);
20163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->visual_info->colormap_size != 0)
2017b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(file,"  colormap size: %d\n",
20183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      windows->visual_info->colormap_size);
20193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (resource_info->colormap== SharedColormap)
2020b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(file,"  colormap type: Shared\n");
20213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
2022b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(file,"  colormap type: Private\n");
20231e604812fad85bb96f757a2393015ae3d061c39acristy  (void) FormatLocaleFile(file,"  geometry: %dx%d\n",
20241e604812fad85bb96f757a2393015ae3d061c39acristy    windows->image.ximage->width,windows->image.ximage->height);
20253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->image.crop_geometry != (char *) NULL)
20261e604812fad85bb96f757a2393015ae3d061c39acristy    (void) FormatLocaleFile(file,"  crop geometry: %s\n",
20271e604812fad85bb96f757a2393015ae3d061c39acristy      windows->image.crop_geometry);
20283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->image.pixmap == (Pixmap) NULL)
2029b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(file,"  type: X Image\n");
20303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
2031b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(file,"  type: Pixmap\n");
20323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->image.shape != MagickFalse)
2033b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(file,"  non-rectangular shape: True\n");
20343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
2035b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(file,"  non-rectangular shape: False\n");
20363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->image.shared_memory != MagickFalse)
2037b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(file,"  shared memory: True\n");
20383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
2039b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(file,"  shared memory: False\n");
2040b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleFile(file,"\n");
20413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (resource_info->font != (char *) NULL)
2042b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(file,"Font: %s\n\n",resource_info->font);
20433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (resource_info->text_font != (char *) NULL)
2044b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(file,"Text font: %s\n\n",resource_info->text_font);
20453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
20463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Write info about the undo cache to a file.
20473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
20483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  bytes=0;
20493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (levels=0; undo_image != (Image *) NULL; levels++)
20503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
20513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_pixels=undo_image->list->columns*undo_image->list->rows;
2052101ab708b0574518ac5715da4d3915400e9df79acristy    bytes+=number_pixels*sizeof(PixelInfo);
20533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    undo_image=GetPreviousImageInList(undo_image);
20543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
2055b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleFile(file,"Undo Edit Cache\n  levels: %u\n",levels);
20561e604812fad85bb96f757a2393015ae3d061c39acristy  (void) FormatLocaleFile(file,"  bytes: %.20gmb\n",(double)
20571e604812fad85bb96f757a2393015ae3d061c39acristy    ((bytes+(1 << 19)) >> 20));
2058b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleFile(file,"  limit: %.20gmb\n\n",(double)
2059f2faecf9facdbbb14fcba373365f9f691a9658e0cristy    resource_info->undo_cache);
20603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
20613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Write info about the image to a file.
20623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
20636710d8414f0ed06e4eaf9346366be72e2b4719efcristy  (void) IdentifyImage(image,file,MagickTrue,exception);
20643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) fclose(file);
20656710d8414f0ed06e4eaf9346366be72e2b4719efcristy  text=FileToString(filename,~0,exception);
20663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) RelinquishUniqueFileResource(filename);
20673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (text == (char *) NULL)
20683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
20693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XNoticeWidget(display,windows,"MemoryAllocationFailed",
20703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "UnableToDisplayImageInfo");
20713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return;
20723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
20733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  textlist=StringToList(text);
20743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (textlist != (char **) NULL)
20753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
20763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      char
20773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        title[MaxTextExtent];
20783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
20793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
20803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Display information about the image in the Text View widget.
20813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
20823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XWithdrawWindow(display,windows->info.id,windows->info.screen);
2083b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy      (void) FormatLocaleString(title,MaxTextExtent,"Image Info: %s",
20843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        image->filename);
20853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XTextViewWidget(display,resource_info,windows,MagickTrue,title,
20863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (char const **) textlist);
20873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (i=0; textlist[i] != (char *) NULL; i++)
20883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        textlist[i]=DestroyString(textlist[i]);
20893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      textlist=(char **) RelinquishMagickMemory(textlist);
20903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
20913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  text=DestroyString(text);
20923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
20933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
20943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
20953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
20963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
20973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
20983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
20993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy+     X D i t h e r I m a g e                                                 %
21003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
21013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
21023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
21033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
21043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
21053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XDitherImage() dithers the reference image as required by the HP Color
21063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  Recovery algorithm.  The color values are quantized to 3 bits of red and
21073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  green, and 2 bits of blue (3/3/2) and can be used as indices into a 8-bit X
21083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  standard colormap.
21093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
21103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XDitherImage method is:
21113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
21126710d8414f0ed06e4eaf9346366be72e2b4719efcristy%      void XDitherImage(Image *image,XImage *ximage,ExceptionInfo *exception)
21133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
21143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
21153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
21163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image: the image.
21173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
21183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o ximage: Specifies a pointer to a XImage structure;  returned from
21193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XCreateImage.
21203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
21216710d8414f0ed06e4eaf9346366be72e2b4719efcristy%    o exception: return any errors or warnings in this structure.
21226710d8414f0ed06e4eaf9346366be72e2b4719efcristy%
21233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
21246710d8414f0ed06e4eaf9346366be72e2b4719efcristystatic void XDitherImage(Image *image,XImage *ximage,ExceptionInfo *exception)
21253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
21263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static const short int
21273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    dither_red[2][16]=
21283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
21293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {-16,  4, -1, 11,-14,  6, -3,  9,-15,  5, -2, 10,-13,  7, -4,  8},
21303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      { 15, -5,  0,-12, 13, -7,  2,-10, 14, -6,  1,-11, 12, -8,  3, -9}
21313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    },
21323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    dither_green[2][16]=
21333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
21343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      { 11,-15,  7, -3,  8,-14,  4, -2, 10,-16,  6, -4,  9,-13,  5, -1},
21353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {-12, 14, -8,  2, -9, 13, -5,  1,-11, 15, -7,  3,-10, 12, -6,  0}
21363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    },
21373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    dither_blue[2][16]=
21383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
21393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      { -3,  9,-13,  7, -1, 11,-15,  5, -4,  8,-14,  6, -2, 10,-16,  4},
21403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {  2,-10, 12, -8,  0,-12, 14, -6,  3, -9, 13, -7,  1,-11, 15, -5}
21413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    };
21423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2143c57f694b2d04975a0e501613e34368c464708c19cristy  CacheView
2144c57f694b2d04975a0e501613e34368c464708c19cristy    *image_view;
21453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
21463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
2147c57f694b2d04975a0e501613e34368c464708c19cristy    value,
21483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y;
21493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2150101ab708b0574518ac5715da4d3915400e9df79acristy  PixelInfo
2151c57f694b2d04975a0e501613e34368c464708c19cristy    color;
21523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
21533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register char
21543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
21553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
21564c08aed51c5899665ade97263692328eea4af106cristy  register const Quantum
21573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
21583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
21593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register int
21603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
21613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    j,
21623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x;
21633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
21643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
21653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    scanline_pad;
21663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2167bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register size_t
21683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel;
21693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
21703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned char
21713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *blue_map[2][16],
21723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *green_map[2][16],
21733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *red_map[2][16];
21743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
21753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
21763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Allocate and initialize dither maps.
21773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
21783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; i < 2; i++)
21793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    for (j=0; j < 16; j++)
21803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
21813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      red_map[i][j]=(unsigned char *) AcquireQuantumMemory(256UL,
21823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        sizeof(*red_map));
21833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      green_map[i][j]=(unsigned char *) AcquireQuantumMemory(256UL,
21843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        sizeof(*green_map));
21853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      blue_map[i][j]=(unsigned char *) AcquireQuantumMemory(256UL,
21863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        sizeof(*blue_map));
21873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((red_map[i][j] == (unsigned char *) NULL) ||
21883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (green_map[i][j] == (unsigned char *) NULL) ||
21893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (blue_map[i][j] == (unsigned char *) NULL))
21903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
21913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ThrowXWindowFatalException(ResourceLimitError,
21923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            "MemoryAllocationFailed",image->filename);
21933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          return;
21943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
21953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
21963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
21973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize dither tables.
21983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
21993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; i < 2; i++)
22003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    for (j=0; j < 16; j++)
22013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (x=0; x < 256; x++)
22023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
22033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        value=x-16;
22043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (x < 48)
22053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          value=x/2+8;
22063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        value+=dither_red[i][j];
22073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        red_map[i][j][x]=(unsigned char)
22083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ((value < 0) ? 0 : (value > 255) ? 255 : value);
22093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        value=x-16;
22103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (x < 48)
22113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          value=x/2+8;
22123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        value+=dither_green[i][j];
22133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        green_map[i][j][x]=(unsigned char)
22143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ((value < 0) ? 0 : (value > 255) ? 255 : value);
22153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        value=x-32;
22163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (x < 112)
22173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          value=x/2+24;
2218bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        value+=((size_t) dither_blue[i][j] << 1);
22193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        blue_map[i][j][x]=(unsigned char)
22203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ((value < 0) ? 0 : (value > 255) ? 255 : value);
22213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
22223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
22233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Dither image.
22243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
22253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  scanline_pad=(unsigned int) (ximage->bytes_per_line-
2226bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    ((size_t) (ximage->width*ximage->bits_per_pixel) >> 3));
22273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  i=0;
22283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  j=0;
22293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  q=ximage->data;
223046ff2676b1044ea4101ac7a59b83289cd8f6cfdacristy  image_view=AcquireVirtualCacheView(image,exception);
22313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (y=0; y < (int) image->rows; y++)
22323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
2233c57f694b2d04975a0e501613e34368c464708c19cristy    p=GetCacheViewVirtualPixels(image_view,0,(ssize_t) y,image->columns,1,
22346710d8414f0ed06e4eaf9346366be72e2b4719efcristy      exception);
22354c08aed51c5899665ade97263692328eea4af106cristy    if (p == (const Quantum *) NULL)
22363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
22373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    for (x=0; x < (int) image->columns; x++)
22383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
2239ada285ba46bd3b79ab9321bbd1e617c6551b1e33cristy      color.red=(double) ClampToQuantum((double) (red_map[i][j][
2240e42f658533644aecb733785ffd91b286d6778deacristy        (int) ScaleQuantumToChar(GetPixelRed(image,p))] << 8));
2241ada285ba46bd3b79ab9321bbd1e617c6551b1e33cristy      color.green=(double) ClampToQuantum((double) (green_map[i][j][
2242e42f658533644aecb733785ffd91b286d6778deacristy        (int) ScaleQuantumToChar(GetPixelGreen(image,p))] << 8));
2243ada285ba46bd3b79ab9321bbd1e617c6551b1e33cristy      color.blue=(double) ClampToQuantum((double) (blue_map[i][j][
2244e42f658533644aecb733785ffd91b286d6778deacristy        (int) ScaleQuantumToChar(GetPixelBlue(image,p))] << 8));
2245bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      pixel=(size_t) (((size_t) color.red & 0xe0) |
2246bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        (((size_t) color.green & 0xe0) >> 3) |
2247bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        (((size_t) color.blue & 0xc0) >> 6));
22483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      *q++=(char) pixel;
2249ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy      p+=GetPixelChannels(image);
22503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      j++;
22513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (j == 16)
22523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        j=0;
22533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
22543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    q+=scanline_pad;
22553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i++;
22563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (i == 2)
22573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      i=0;
22583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
2259c57f694b2d04975a0e501613e34368c464708c19cristy  image_view=DestroyCacheView(image_view);
22603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
22613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Free allocated memory.
22623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
22633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; i < 2; i++)
22643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    for (j=0; j < 16; j++)
22653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
22663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      green_map[i][j]=(unsigned char *) RelinquishMagickMemory(green_map[i][j]);
22673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      blue_map[i][j]=(unsigned char *) RelinquishMagickMemory(blue_map[i][j]);
22683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      red_map[i][j]=(unsigned char *) RelinquishMagickMemory(red_map[i][j]);
22693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
22703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
22713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
22723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
22733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
22743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X D r a w I m a g e                                                       %
22783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
22823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XDrawImage() draws a line on the image.
22843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XDrawImage method is:
22863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22876710d8414f0ed06e4eaf9346366be72e2b4719efcristy%    MagickBooleanType XDrawImage(Display *display,const XPixelInfo *pixel,
22886710d8414f0ed06e4eaf9346366be72e2b4719efcristy%      XDrawInfo *draw_info,Image *image,ExceptionInfo *exception)
22893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
22913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
22933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
22943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o pixel: Specifies a pointer to a XPixelInfo structure.
22963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o draw_info: Specifies a pointer to a XDrawInfo structure.
22983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image: the image.
23003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
23016710d8414f0ed06e4eaf9346366be72e2b4719efcristy%    o exception: return any errors or warnings in this structure.
23026710d8414f0ed06e4eaf9346366be72e2b4719efcristy%
23033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
2304bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate MagickBooleanType XDrawImage(Display *display,
23056710d8414f0ed06e4eaf9346366be72e2b4719efcristy  const XPixelInfo *pixel,XDrawInfo *draw_info,Image *image,
23066710d8414f0ed06e4eaf9346366be72e2b4719efcristy  ExceptionInfo *exception)
23073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
2308c57f694b2d04975a0e501613e34368c464708c19cristy  CacheView
2309c57f694b2d04975a0e501613e34368c464708c19cristy    *draw_view;
2310c57f694b2d04975a0e501613e34368c464708c19cristy
23113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  GC
23123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    draw_context;
23133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
23143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image
23153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *draw_image;
23163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
23173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
23183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x,
23193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y;
23203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2321b0a657e13c4aefba39c51292005427b47277869dcristy  PixelTrait
2322b0a657e13c4aefba39c51292005427b47277869dcristy    alpha_trait;
23233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
23243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Pixmap
23253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    draw_pixmap;
23263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
23273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
23283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    depth,
23293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    height,
23303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width;
23313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
23323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Window
23333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    root_window;
23343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
23353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XGCValues
23363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    context_values;
23373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
23383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XImage
23393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *draw_ximage;
23403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
23413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
23423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize drawd image.
23433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
23443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
23453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(pixel != (XPixelInfo *) NULL);
23463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(draw_info != (XDrawInfo *) NULL);
23473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image != (Image *) NULL);
23483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image->debug != MagickFalse)
23493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
23503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
23513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize drawd pixmap.
23523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
23533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  root_window=XRootWindow(display,XDefaultScreen(display));
23543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  depth=(unsigned int) XDefaultDepth(display,XDefaultScreen(display));
23553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  draw_pixmap=XCreatePixmap(display,root_window,draw_info->width,
23563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    draw_info->height,depth);
23573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (draw_pixmap == (Pixmap) NULL)
23583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
23593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
23603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize graphics info.
23613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
2362bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  context_values.background=(size_t) (~0);
23633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  context_values.foreground=0;
23643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  context_values.line_width=(int) draw_info->line_width;
2365bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  draw_context=XCreateGC(display,root_window,(size_t)
23663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (GCBackground | GCForeground | GCLineWidth),&context_values);
23673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (draw_context == (GC) NULL)
23683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
23693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
23703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Clear pixmap.
23713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
23723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFillRectangle(display,draw_pixmap,draw_context,0,0,draw_info->width,
23733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    draw_info->height);
23743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
23753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Draw line to pixmap.
23763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
23773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XSetBackground(display,draw_context,0);
2378bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  (void) XSetForeground(display,draw_context,(size_t) (~0));
2379dd05bebf92311ac0db88ae24d6a6862a4729e8a5cristy  if (draw_info->stipple !=  (Pixmap) NULL)
2380dd05bebf92311ac0db88ae24d6a6862a4729e8a5cristy    {
2381dd05bebf92311ac0db88ae24d6a6862a4729e8a5cristy      (void) XSetFillStyle(display,draw_context,FillOpaqueStippled);
2382dd05bebf92311ac0db88ae24d6a6862a4729e8a5cristy      (void) XSetStipple(display,draw_context,draw_info->stipple);
2383dd05bebf92311ac0db88ae24d6a6862a4729e8a5cristy    }
23843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  switch (draw_info->element)
23853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
23863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case PointElement:
23873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    default:
23883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
23893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XDrawLines(display,draw_pixmap,draw_context,
23903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        draw_info->coordinate_info,(int) draw_info->number_coordinates,
23913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        CoordModeOrigin);
23923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
23933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
23943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case LineElement:
23953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
23963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XDrawLine(display,draw_pixmap,draw_context,draw_info->line_info.x1,
23973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        draw_info->line_info.y1,draw_info->line_info.x2,
23983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        draw_info->line_info.y2);
23993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
24003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
24013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case RectangleElement:
24023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
24033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XDrawRectangle(display,draw_pixmap,draw_context,
24043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (int) draw_info->rectangle_info.x,(int) draw_info->rectangle_info.y,
24053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (unsigned int) draw_info->rectangle_info.width,
24063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (unsigned int) draw_info->rectangle_info.height);
24073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
24083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
24093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case FillRectangleElement:
24103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
24113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XFillRectangle(display,draw_pixmap,draw_context,
24123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (int) draw_info->rectangle_info.x,(int) draw_info->rectangle_info.y,
24133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (unsigned int) draw_info->rectangle_info.width,
24143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (unsigned int) draw_info->rectangle_info.height);
24153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
24163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
24173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case CircleElement:
24183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case EllipseElement:
24193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
24203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XDrawArc(display,draw_pixmap,draw_context,
24213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (int) draw_info->rectangle_info.x,(int) draw_info->rectangle_info.y,
24223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (unsigned int) draw_info->rectangle_info.width,
24233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (unsigned int) draw_info->rectangle_info.height,0,360*64);
24243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
24253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
24263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case FillCircleElement:
24273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case FillEllipseElement:
24283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
24293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XFillArc(display,draw_pixmap,draw_context,
24303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (int) draw_info->rectangle_info.x,(int) draw_info->rectangle_info.y,
24313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (unsigned int) draw_info->rectangle_info.width,
24323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (unsigned int) draw_info->rectangle_info.height,0,360*64);
24333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
24343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
24353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case PolygonElement:
24363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
24373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XPoint
24383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *coordinate_info;
24393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
24403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      coordinate_info=draw_info->coordinate_info;
24413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XDrawLines(display,draw_pixmap,draw_context,coordinate_info,
24423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (int) draw_info->number_coordinates,CoordModeOrigin);
24433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XDrawLine(display,draw_pixmap,draw_context,
24443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        coordinate_info[draw_info->number_coordinates-1].x,
24453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        coordinate_info[draw_info->number_coordinates-1].y,
24463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        coordinate_info[0].x,coordinate_info[0].y);
24473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
24483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
24493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case FillPolygonElement:
24503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
24513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XFillPolygon(display,draw_pixmap,draw_context,
24523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        draw_info->coordinate_info,(int) draw_info->number_coordinates,Complex,
24533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        CoordModeOrigin);
24543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
24553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
24563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
24573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFreeGC(display,draw_context);
24583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
24593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize X image.
24603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
24613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  draw_ximage=XGetImage(display,draw_pixmap,0,0,draw_info->width,
24623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    draw_info->height,AllPlanes,ZPixmap);
24633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (draw_ximage == (XImage *) NULL)
24643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
24653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFreePixmap(display,draw_pixmap);
24663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
24673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize draw image.
24683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
24696710d8414f0ed06e4eaf9346366be72e2b4719efcristy  draw_image=AcquireImage((ImageInfo *) NULL,exception);
24703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (draw_image == (Image *) NULL)
24713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
24723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  draw_image->columns=draw_info->width;
24733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  draw_image->rows=draw_info->height;
24743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
24753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Transfer drawn X image to image.
24763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
24773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  width=(unsigned int) image->columns;
24783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  height=(unsigned int) image->rows;
24793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  x=0;
24803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  y=0;
24813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XParseGeometry(draw_info->geometry,&x,&y,&width,&height);
2482f05d4947caf1bc27fbec041eb37c474a80c83c0bcristy  (void) GetOneVirtualPixelInfo(image,UndefinedVirtualPixelMethod,(ssize_t) x,
2483f05d4947caf1bc27fbec041eb37c474a80c83c0bcristy    (ssize_t) y,&draw_image->background_color,exception);
24846710d8414f0ed06e4eaf9346366be72e2b4719efcristy  if (SetImageStorageClass(draw_image,DirectClass,exception) == MagickFalse)
24853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
24868a46d827a124555f0c48fb2368ec1bba8e079ab6cristy  draw_image->alpha_trait=BlendPixelTrait;
24876f5395df39e037392db46729f9aab05f2a9a428fcristy  draw_view=AcquireAuthenticCacheView(draw_image,exception);
24883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (y=0; y < (int) draw_image->rows; y++)
24893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
2490c57f694b2d04975a0e501613e34368c464708c19cristy    register int
24913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      x;
24923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
24934c08aed51c5899665ade97263692328eea4af106cristy    register Quantum
2494c47d1f8ecfe7d04f0f003cca0fe175658bbf0fb2cristy      *restrict q;
24953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2496c57f694b2d04975a0e501613e34368c464708c19cristy    q=QueueCacheViewAuthenticPixels(draw_view,0,(ssize_t) y,draw_image->columns,
2497c57f694b2d04975a0e501613e34368c464708c19cristy      1,exception);
2498acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy    if (q == (Quantum *) NULL)
24993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
2500c57f694b2d04975a0e501613e34368c464708c19cristy    for (x=0; x < (int) draw_image->columns; x++)
25013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
25023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (XGetPixel(draw_ximage,x,y) == 0)
25033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
25043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
25053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Set this pixel to the background color.
25063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
2507803640d20a6a664315eddfff6f8531d0c5e0871dcristy          SetPixelInfoPixel(draw_image,&draw_image->background_color,q);
25087676158e6c207e287beb252c9837d565863c3328cristy          SetPixelAlpha(draw_image,(Quantum) (draw_info->stencil ==
25094c08aed51c5899665ade97263692328eea4af106cristy            OpaqueStencil ? TransparentAlpha : OpaqueAlpha),q);
25103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
25113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
25123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
25133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
25143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Set this pixel to the pen color.
25153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
25164c08aed51c5899665ade97263692328eea4af106cristy          SetPixelRed(draw_image,ScaleShortToQuantum(
25174c08aed51c5899665ade97263692328eea4af106cristy            pixel->pen_color.red),q);
25184c08aed51c5899665ade97263692328eea4af106cristy          SetPixelGreen(draw_image,ScaleShortToQuantum(
25194c08aed51c5899665ade97263692328eea4af106cristy            pixel->pen_color.green),q);
25204c08aed51c5899665ade97263692328eea4af106cristy          SetPixelBlue(draw_image,ScaleShortToQuantum(
25214c08aed51c5899665ade97263692328eea4af106cristy            pixel->pen_color.blue),q);
25224c08aed51c5899665ade97263692328eea4af106cristy          SetPixelAlpha(draw_image,(Quantum) (draw_info->stencil ==
25234c08aed51c5899665ade97263692328eea4af106cristy            OpaqueStencil ? OpaqueAlpha : TransparentAlpha),q);
25243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
2525ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy      q+=GetPixelChannels(draw_image);
25263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
2527c57f694b2d04975a0e501613e34368c464708c19cristy    if (SyncCacheViewAuthenticPixels(draw_view,exception) == MagickFalse)
25283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
25293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
2530c57f694b2d04975a0e501613e34368c464708c19cristy  draw_view=DestroyCacheView(draw_view);
25313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XDestroyImage(draw_ximage);
25323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
25333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Determine draw geometry.
25343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
25353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XParseGeometry(draw_info->geometry,&x,&y,&width,&height);
25363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((width != (unsigned int) draw_image->columns) ||
25373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (height != (unsigned int) draw_image->rows))
25383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
25393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      char
25403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        image_geometry[MaxTextExtent];
25413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
25423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
25433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Scale image.
25443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
2545b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy      (void) FormatLocaleString(image_geometry,MaxTextExtent,"%ux%u",
25463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        width,height);
2547e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy      (void) TransformImage(&draw_image,(char *) NULL,image_geometry,
2548e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy        exception);
25493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
25503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (draw_info->degrees != 0.0)
25513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
25523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Image
25533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *rotate_image;
25543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
25553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      int
25563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        rotations;
25573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2558a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      double
25593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        normalized_degrees;
25603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
25613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
25623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Rotate image.
25633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
25646710d8414f0ed06e4eaf9346366be72e2b4719efcristy      rotate_image=RotateImage(draw_image,draw_info->degrees,exception);
25653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (rotate_image == (Image *) NULL)
25663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        return(MagickFalse);
25673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      draw_image=DestroyImage(draw_image);
25683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      draw_image=rotate_image;
25693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
25703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Annotation is relative to the degree of rotation.
25713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
25723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      normalized_degrees=draw_info->degrees;
25733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      while (normalized_degrees < -45.0)
25743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        normalized_degrees+=360.0;
25753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (rotations=0; normalized_degrees > 45.0; rotations++)
25763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        normalized_degrees-=90.0;
25773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      switch (rotations % 4)
25783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
25793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        default:
25803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 0:
25813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
25823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 1:
25833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
25843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
25853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Rotate 90 degrees.
25863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
25873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          x=x-(int) draw_image->columns/2;
25883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          y=y+(int) draw_image->columns/2;
25893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
25903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
25913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 2:
25923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
25933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
25943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Rotate 180 degrees.
25953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
25963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          x=x-(int) draw_image->columns;
25973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
25983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
25993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 3:
26003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
26013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
26023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Rotate 270 degrees.
26033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
26043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          x=x-(int) draw_image->columns/2;
26053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          y=y-(int) (draw_image->rows-(draw_image->columns/2));
26063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
26073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
26083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
26093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
26103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
26113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Composite text onto the image.
26123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
26136f5395df39e037392db46729f9aab05f2a9a428fcristy  draw_view=AcquireAuthenticCacheView(draw_image,exception);
26143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (y=0; y < (int) draw_image->rows; y++)
26153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
2616c57f694b2d04975a0e501613e34368c464708c19cristy    register int
26173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      x;
26183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
26194c08aed51c5899665ade97263692328eea4af106cristy    register Quantum
2620c47d1f8ecfe7d04f0f003cca0fe175658bbf0fb2cristy      *restrict q;
26213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2622c57f694b2d04975a0e501613e34368c464708c19cristy    q=GetCacheViewAuthenticPixels(draw_view,0,(ssize_t) y,draw_image->columns,1,
2623c57f694b2d04975a0e501613e34368c464708c19cristy      exception);
2624acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy    if (q == (Quantum *) NULL)
26253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
2626c57f694b2d04975a0e501613e34368c464708c19cristy    for (x=0; x < (int) draw_image->columns; x++)
26273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
26284c08aed51c5899665ade97263692328eea4af106cristy      if (GetPixelAlpha(image,q) != TransparentAlpha)
26294c08aed51c5899665ade97263692328eea4af106cristy        SetPixelAlpha(draw_image,OpaqueAlpha,q);
2630ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy      q+=GetPixelChannels(draw_image);
26313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
2632c57f694b2d04975a0e501613e34368c464708c19cristy    if (SyncCacheViewAuthenticPixels(draw_view,exception) == MagickFalse)
26333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
26343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
2635c57f694b2d04975a0e501613e34368c464708c19cristy  draw_view=DestroyCacheView(draw_view);
26363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XParseGeometry(draw_info->geometry,&x,&y,&width,&height);
26373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (draw_info->stencil == TransparentStencil)
263839172408bad7ef2ef00a815fa9abf9979e7857cbcristy    (void) CompositeImage(image,draw_image,CopyAlphaCompositeOp,MagickTrue,
2639feb3e9695150978a5d2372d3fe2f60466a7c8066cristy      (ssize_t) x,(ssize_t) y,exception);
26403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
26413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
2642b0a657e13c4aefba39c51292005427b47277869dcristy      alpha_trait=image->alpha_trait;
264339172408bad7ef2ef00a815fa9abf9979e7857cbcristy      (void) CompositeImage(image,draw_image,OverCompositeOp,MagickTrue,
2644feb3e9695150978a5d2372d3fe2f60466a7c8066cristy        (ssize_t) x,(ssize_t) y,exception);
2645b0a657e13c4aefba39c51292005427b47277869dcristy      image->alpha_trait=alpha_trait;
26463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
26473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  draw_image=DestroyImage(draw_image);
26483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickTrue);
26493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
26503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
26513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
26523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
26533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
26543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
26553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
26563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X E r r o r                                                               %
26573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
26583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
26593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
26603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
26613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
26623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XError() ignores BadWindow errors for XQueryTree and XGetWindowAttributes,
26633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  and ignores BadDrawable errors for XGetGeometry, and ignores BadValue errors
2664bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristy%  for XQueryColor.  It returns MagickFalse in those cases.  Otherwise it
2665bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristy%  returns True.
26663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
26673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XError function is:
26683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2669bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristy%      int XError(display,error)
26703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
26713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
26723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
26733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a pointer to the Display structure;  returned from
26743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
26753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
26763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o error: Specifies the error event.
26773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
26783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
26793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
26803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus)
26813ed852eea50f9d4cd633efb8c2b054b8e33c253cristyextern "C" {
26823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
26833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
26843ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport int XError(Display *display,XErrorEvent *error)
26853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
26863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
26873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
26883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(error != (XErrorEvent *) NULL);
26893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  xerror_alert=MagickTrue;
26903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  switch (error->request_code)
26913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
26923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case X_GetGeometry:
26933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
26943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((int) error->error_code == BadDrawable)
26953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        return(MagickFalse);
26963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
26973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
26983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case X_GetWindowAttributes:
26993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case X_QueryTree:
27003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
27013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((int) error->error_code == BadWindow)
27023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        return(MagickFalse);
27033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
27043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
27053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case X_QueryColors:
27063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
27073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((int) error->error_code == BadValue)
27083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        return(MagickFalse);
27093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
27103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
27113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
27123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickTrue);
27133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
27143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
27153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus)
27163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
27173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
27183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
27193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
27203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
27213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
27223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
27233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
27243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X F r e e R e s o u r c e s                                               %
27253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
27263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
27273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
27283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
27293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
27303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XFreeResources() frees X11 resources.
27313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
27323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XFreeResources method is:
27333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
27343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XFreeResources(Display *display,XVisualInfo *visual_info,
27353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        XStandardColormap *map_info,XPixelInfo *pixel,XFontStruct *font_info,
27363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        XResourceInfo *resource_info,XWindowInfo *window_info)
27373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        resource_info,window_info)
27383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
27393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
27403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
27413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server; returned from
27423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
27433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
27443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o visual_info: Specifies a pointer to a X11 XVisualInfo structure;
27453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      returned from XGetVisualInfo.
27463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
27473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o map_info: If map_type is specified, this structure is initialized
27483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      with info from the Standard Colormap.
27493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
27503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o pixel: Specifies a pointer to a XPixelInfo structure.
27513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
27523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o font_info: Specifies a pointer to a XFontStruct structure.
27533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
27543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
27553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
27563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window_info: Specifies a pointer to a X11 XWindowInfo structure.
27573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
27583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
2759bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XFreeResources(Display *display,XVisualInfo *visual_info,
27603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XStandardColormap *map_info,XPixelInfo *pixel,XFontStruct *font_info,
27613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XResourceInfo *resource_info,XWindowInfo *window_info)
27623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
27633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
27643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
27653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(resource_info != (XResourceInfo *) NULL);
27663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window_info != (XWindowInfo *) NULL)
27673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
27683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
27693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Free X image.
27703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
27713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window_info->ximage != (XImage *) NULL)
27723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDestroyImage(window_info->ximage);
27733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window_info->id != (Window) NULL)
27743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
27753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
27763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Free destroy window and free cursors.
27773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
27783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (window_info->id != XRootWindow(display,visual_info->screen))
27793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XDestroyWindow(display,window_info->id);
27803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (window_info->annotate_context != (GC) NULL)
27813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XFreeGC(display,window_info->annotate_context);
27823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (window_info->highlight_context != (GC) NULL)
27833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XFreeGC(display,window_info->highlight_context);
27843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (window_info->widget_context != (GC) NULL)
27853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XFreeGC(display,window_info->widget_context);
27863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (window_info->cursor != (Cursor) NULL)
27873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XFreeCursor(display,window_info->cursor);
27883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          window_info->cursor=(Cursor) NULL;
27893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (window_info->busy_cursor != (Cursor) NULL)
27903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XFreeCursor(display,window_info->busy_cursor);
27913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          window_info->busy_cursor=(Cursor) NULL;
27923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
27933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
27943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
27953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Free font.
27963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
27973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (font_info != (XFontStruct *) NULL)
2798aafc19213cef0b96cd237edb693a33fd1a2466eacristy    {
2799aafc19213cef0b96cd237edb693a33fd1a2466eacristy      (void) XFreeFont(display,font_info);
2800aafc19213cef0b96cd237edb693a33fd1a2466eacristy      font_info=(XFontStruct *) NULL;
2801aafc19213cef0b96cd237edb693a33fd1a2466eacristy    }
28023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (map_info != (XStandardColormap *) NULL)
28033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
28043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
28053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Free X Standard Colormap.
28063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
28073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (resource_info->map_type == (char *) NULL)
28083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XFreeStandardColormap(display,visual_info,map_info,pixel);
28093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XFree((void *) map_info);
28103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
28113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
28123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Free X visual info.
28133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
28143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (visual_info != (XVisualInfo *) NULL)
28153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XFree((void *) visual_info);
28163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (resource_info->close_server != MagickFalse)
28173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XCloseDisplay(display);
28183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
28193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
28203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
28213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
28223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
28233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
28243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
28253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X F r e e S t a n d a r d C o l o r m a p                                 %
28263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
28273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
28283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
28293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
28303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
28313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XFreeStandardColormap() frees an X11 colormap.
28323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
28333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XFreeStandardColormap method is:
28343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
28353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XFreeStandardColormap(Display *display,
28363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const XVisualInfo *visual_info,XStandardColormap *map_info,
28373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        XPixelInfo *pixel)
28383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
28393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
28403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
28413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server; returned from
28423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
28433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
28443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o visual_info: Specifies a pointer to a X11 XVisualInfo structure;
28453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      returned from XGetVisualInfo.
28463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
28473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o map_info: If map_type is specified, this structure is initialized
28483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      with info from the Standard Colormap.
28493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
28503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o pixel: Specifies a pointer to a XPixelInfo structure.
28513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
28523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
2853bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XFreeStandardColormap(Display *display,
28543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const XVisualInfo *visual_info,XStandardColormap *map_info,XPixelInfo *pixel)
28553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
28563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
28573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Free colormap.
28583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
28593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
28603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
28613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(visual_info != (XVisualInfo *) NULL);
28623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(map_info != (XStandardColormap *) NULL);
28633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFlush(display);
28643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (map_info->colormap != (Colormap) NULL)
28653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
28663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (map_info->colormap != XDefaultColormap(display,visual_info->screen))
28673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XFreeColormap(display,map_info->colormap);
28683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
28693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (pixel != (XPixelInfo *) NULL)
28703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((visual_info->klass != TrueColor) &&
28713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (visual_info->klass != DirectColor))
28723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XFreeColors(display,map_info->colormap,pixel->pixels,
28733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (int) pixel->colors,0);
28743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
28753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  map_info->colormap=(Colormap) NULL;
28763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (pixel != (XPixelInfo *) NULL)
28773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
2878f2faecf9facdbbb14fcba373365f9f691a9658e0cristy      if (pixel->pixels != (unsigned long *) NULL)
2879f2faecf9facdbbb14fcba373365f9f691a9658e0cristy        pixel->pixels=(unsigned long *) RelinquishMagickMemory(pixel->pixels);
2880f2faecf9facdbbb14fcba373365f9f691a9658e0cristy      pixel->pixels=(unsigned long *) NULL;
28813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
28823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
28833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
28843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
28853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
28863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
28873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
28883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
28893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X G e t A n n o t a t e I n f o                                           %
28903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
28913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
28923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
28933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
28943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
28953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XGetAnnotateInfo() initializes the AnnotateInfo structure.
28963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
28973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XGetAnnotateInfo method is:
28983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
28993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XGetAnnotateInfo(XAnnotateInfo *annotate_info)
29003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
29013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
29023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
29033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o annotate_info: Specifies a pointer to a XAnnotateInfo structure.
29043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
29053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
2906bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XGetAnnotateInfo(XAnnotateInfo *annotate_info)
29073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
29083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
29093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize annotate structure.
29103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
29113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
29123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(annotate_info != (XAnnotateInfo *) NULL);
29133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  annotate_info->x=0;
29143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  annotate_info->y=0;
29153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  annotate_info->width=0;
29163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  annotate_info->height=0;
29173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  annotate_info->stencil=ForegroundStencil;
29183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  annotate_info->degrees=0.0;
29193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  annotate_info->font_info=(XFontStruct *) NULL;
29203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  annotate_info->text=(char *) NULL;
29213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *annotate_info->geometry='\0';
29223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  annotate_info->previous=(XAnnotateInfo *) NULL;
29233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  annotate_info->next=(XAnnotateInfo *) NULL;
29243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XSupportsLocale();
29253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XSetLocaleModifiers("");
29263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
29273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
29283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
29293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
29303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
29313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
29323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
29333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X G e t M a p I n f o                                                     %
29343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
29353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
29363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
29373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
29383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
29393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XGetMapInfo() initializes the XStandardColormap structure.
29403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
29413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XStandardColormap method is:
29423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
29433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XGetMapInfo(const XVisualInfo *visual_info,const Colormap colormap,
29443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        XStandardColormap *map_info)
29453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
29463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
29473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
29483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o colormap: Specifies the ID of the X server colormap.
29493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
29503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o visual_info: Specifies a pointer to a X11 XVisualInfo structure;
29513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      returned from XGetVisualInfo.
29523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
29533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o map_info: Specifies a pointer to a X11 XStandardColormap structure.
29543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
29553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
2956bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XGetMapInfo(const XVisualInfo *visual_info,
29573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const Colormap colormap,XStandardColormap *map_info)
29583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
29593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
29603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize map info.
29613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
29623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
29633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(visual_info != (XVisualInfo *) NULL);
29643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(map_info != (XStandardColormap *) NULL);
29653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  map_info->colormap=colormap;
29663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  map_info->red_max=visual_info->red_mask;
2967bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  map_info->red_mult=(size_t) (map_info->red_max != 0 ? 1 : 0);
29683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (map_info->red_max != 0)
29693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    while ((map_info->red_max & 0x01) == 0)
29703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
29713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      map_info->red_max>>=1;
29723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      map_info->red_mult<<=1;
29733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
29743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  map_info->green_max=visual_info->green_mask;
2975bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  map_info->green_mult=(size_t) (map_info->green_max != 0 ? 1 : 0);
29763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (map_info->green_max != 0)
29773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    while ((map_info->green_max & 0x01) == 0)
29783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
29793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      map_info->green_max>>=1;
29803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      map_info->green_mult<<=1;
29813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
29823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  map_info->blue_max=visual_info->blue_mask;
2983bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  map_info->blue_mult=(size_t) (map_info->blue_max != 0 ? 1 : 0);
29843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (map_info->blue_max != 0)
29853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    while ((map_info->blue_max & 0x01) == 0)
29863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
29873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      map_info->blue_max>>=1;
29883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      map_info->blue_mult<<=1;
29893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
29903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  map_info->base_pixel=0;
29913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
29923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
29933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
29943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
29953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
29963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
29973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
29983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X G e t P i x e l I n f o                                                 %
29993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
30003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
30013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
30023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
30033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3004101ab708b0574518ac5715da4d3915400e9df79acristy%  XGetPixelInfo() initializes the PixelInfo structure.
30053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
30064c08aed51c5899665ade97263692328eea4af106cristy%  The format of the XGetPixelInfo method is:
30073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
30084c08aed51c5899665ade97263692328eea4af106cristy%      void XGetPixelInfo(Display *display,const XVisualInfo *visual_info,
30093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const XStandardColormap *map_info,const XResourceInfo *resource_info,
30103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        Image *image,XPixelInfo *pixel)
30113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        pixel)
30123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
30133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
30143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
30153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server; returned from
30163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
30173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
30183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o visual_info: Specifies a pointer to a X11 XVisualInfo structure;
30193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      returned from XGetVisualInfo.
30203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
30213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o map_info: If map_type is specified, this structure is initialized
30223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      with info from the Standard Colormap.
30233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
30243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
30253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
30263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image: the image.
30273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
30283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o pixel: Specifies a pointer to a XPixelInfo structure.
30293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
30303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
3031bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XGetPixelInfo(Display *display,
30323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const XVisualInfo *visual_info,const XStandardColormap *map_info,
30333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const XResourceInfo *resource_info,Image *image,XPixelInfo *pixel)
30343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
30353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static const char
30363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *PenColors[MaxNumberPens]=
30373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
30383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "#000000000000",  /* black */
30393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "#00000000ffff",  /* blue */
30403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "#0000ffffffff",  /* cyan */
30413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "#0000ffff0000",  /* green */
30423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "#bdbdbdbdbdbd",  /* gray */
30433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "#ffff00000000",  /* red */
30443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "#ffff0000ffff",  /* magenta */
30453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "#ffffffff0000",  /* yellow */
30463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "#ffffffffffff",  /* white */
30473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "#bdbdbdbdbdbd",  /* gray */
30483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "#bdbdbdbdbdbd"   /* gray */
30493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    };
30503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
30513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Colormap
30523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    colormap;
30533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3054bcdf567d7dc3c69162ca349e41d43741faed2043cristy  extern const char
3055bcdf567d7dc3c69162ca349e41d43741faed2043cristy    BorderColor[],
3056bcdf567d7dc3c69162ca349e41d43741faed2043cristy    ForegroundColor[];
3057bcdf567d7dc3c69162ca349e41d43741faed2043cristy
3058bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
30593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
30603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
30613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
30623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
30633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
30643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
30653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    packets;
30663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
30673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
30683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize pixel info.
30693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
30703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
30713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
30723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(visual_info != (XVisualInfo *) NULL);
30733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(map_info != (XStandardColormap *) NULL);
30743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(resource_info != (XResourceInfo *) NULL);
30753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(pixel != (XPixelInfo *) NULL);
30763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->colors=0;
30773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image != (Image *) NULL)
30783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (image->storage_class == PseudoClass)
3079c57f694b2d04975a0e501613e34368c464708c19cristy      pixel->colors=(ssize_t) image->colors;
30803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  packets=(unsigned int)
30813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    MagickMax((int) pixel->colors,visual_info->colormap_size)+MaxNumberPens;
3082f2faecf9facdbbb14fcba373365f9f691a9658e0cristy  if (pixel->pixels != (unsigned long *) NULL)
3083f2faecf9facdbbb14fcba373365f9f691a9658e0cristy    pixel->pixels=(unsigned long *) RelinquishMagickMemory(pixel->pixels);
3084f2faecf9facdbbb14fcba373365f9f691a9658e0cristy  pixel->pixels=(unsigned long *) AcquireQuantumMemory(packets,
30853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    sizeof(pixel->pixels));
3086f2faecf9facdbbb14fcba373365f9f691a9658e0cristy  if (pixel->pixels == (unsigned long *) NULL)
30873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowXWindowFatalException(ResourceLimitFatalError,"UnableToGetPixelInfo",
30883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image->filename);
30893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
30903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Set foreground color.
30913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
30923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  colormap=map_info->colormap;
30933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XParseColor(display,colormap,(char *) ForegroundColor,
30943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    &pixel->foreground_color);
30953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XParseColor(display,colormap,resource_info->foreground_color,
30963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    &pixel->foreground_color);
30973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status == False)
30983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowXWindowFatalException(XServerError,"ColorIsNotKnownToServer",
30993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      resource_info->foreground_color);
31003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->foreground_color.pixel=
31013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    XStandardPixel(map_info,&pixel->foreground_color);
31023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->foreground_color.flags=(char) (DoRed | DoGreen | DoBlue);
31033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
31043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Set background color.
31053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
31063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XParseColor(display,colormap,"#d6d6d6d6d6d6",&pixel->background_color);
31073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XParseColor(display,colormap,resource_info->background_color,
31083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    &pixel->background_color);
31093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status == False)
31103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowXWindowFatalException(XServerError,"ColorIsNotKnownToServer",
31113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      resource_info->background_color);
31123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->background_color.pixel=
31133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    XStandardPixel(map_info,&pixel->background_color);
31143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->background_color.flags=(char) (DoRed | DoGreen | DoBlue);
31153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
31163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Set border color.
31173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
31183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XParseColor(display,colormap,(char *) BorderColor,
31193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    &pixel->border_color);
31203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XParseColor(display,colormap,resource_info->border_color,
31213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    &pixel->border_color);
31223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status == False)
31233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowXWindowFatalException(XServerError,"ColorIsNotKnownToServer",
31243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      resource_info->border_color);
31253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->border_color.pixel=XStandardPixel(map_info,&pixel->border_color);
31263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->border_color.flags=(char) (DoRed | DoGreen | DoBlue);
31273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
31283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Set matte color.
31293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
31303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->matte_color=pixel->background_color;
31313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (resource_info->matte_color != (char *) NULL)
31323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
31333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
31343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Matte color is specified as a X resource or command line argument.
31353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
31363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=XParseColor(display,colormap,resource_info->matte_color,
31373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        &pixel->matte_color);
31383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (status == False)
31393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowXWindowFatalException(XServerError,"ColorIsNotKnownToServer",
31403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          resource_info->matte_color);
31413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      pixel->matte_color.pixel=XStandardPixel(map_info,&pixel->matte_color);
31423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      pixel->matte_color.flags=(char) (DoRed | DoGreen | DoBlue);
31433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
31443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
31453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Set highlight color.
31463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
31473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->highlight_color.red=(unsigned short) ((
31483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel->matte_color.red*ScaleQuantumToShort(HighlightModulate))/65535L+
31493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (ScaleQuantumToShort((Quantum) (QuantumRange-HighlightModulate))));
31503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->highlight_color.green=(unsigned short) ((
31513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel->matte_color.green*ScaleQuantumToShort(HighlightModulate))/65535L+
31523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (ScaleQuantumToShort((Quantum) (QuantumRange-HighlightModulate))));
31533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->highlight_color.blue=(unsigned short) ((
31543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel->matte_color.blue*ScaleQuantumToShort(HighlightModulate))/65535L+
31553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (ScaleQuantumToShort((Quantum) (QuantumRange-HighlightModulate))));
31563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->highlight_color.pixel=
31573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    XStandardPixel(map_info,&pixel->highlight_color);
31583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->highlight_color.flags=(char) (DoRed | DoGreen | DoBlue);
31593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
31603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Set shadow color.
31613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
3162a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  pixel->shadow_color.red=(unsigned short) (((double)
31633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel->matte_color.red*ScaleQuantumToShort(ShadowModulate))/65535L);
3164a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  pixel->shadow_color.green=(unsigned short) (((double)
31653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel->matte_color.green*ScaleQuantumToShort(ShadowModulate))/65535L);
3166a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  pixel->shadow_color.blue=(unsigned short) (((double)
31673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel->matte_color.blue*ScaleQuantumToShort(ShadowModulate))/65535L);
31683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->shadow_color.pixel=XStandardPixel(map_info,&pixel->shadow_color);
31693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->shadow_color.flags=(char) (DoRed | DoGreen | DoBlue);
31703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
31713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Set depth color.
31723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
3173a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  pixel->depth_color.red=(unsigned short) (((double)
31743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel->matte_color.red*ScaleQuantumToShort(DepthModulate))/65535L);
3175a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  pixel->depth_color.green=(unsigned short) (((double)
31763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel->matte_color.green*ScaleQuantumToShort(DepthModulate))/65535L);
3177a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  pixel->depth_color.blue=(unsigned short) (((double)
31783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel->matte_color.blue*ScaleQuantumToShort(DepthModulate))/65535L);
31793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->depth_color.pixel=XStandardPixel(map_info,&pixel->depth_color);
31803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->depth_color.flags=(char) (DoRed | DoGreen | DoBlue);
31813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
31823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Set trough color.
31833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
3184a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  pixel->trough_color.red=(unsigned short) (((double)
31853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel->matte_color.red*ScaleQuantumToShort(TroughModulate))/65535L);
3186a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  pixel->trough_color.green=(unsigned short) (((double)
31873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel->matte_color.green*ScaleQuantumToShort(TroughModulate))/65535L);
3188a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  pixel->trough_color.blue=(unsigned short) (((double)
31893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel->matte_color.blue*ScaleQuantumToShort(TroughModulate))/65535L);
31903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->trough_color.pixel=XStandardPixel(map_info,&pixel->trough_color);
31913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->trough_color.flags=(char) (DoRed | DoGreen | DoBlue);
31923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
31933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Set pen color.
31943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
31953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; i < MaxNumberPens; i++)
31963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
31973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XParseColor(display,colormap,(char *) PenColors[i],
31983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      &pixel->pen_colors[i]);
31993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status=XParseColor(display,colormap,resource_info->pen_colors[i],
32003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      &pixel->pen_colors[i]);
32013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (status == False)
32023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowXWindowFatalException(XServerError,"ColorIsNotKnownToServer",
32033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        resource_info->pen_colors[i]);
32043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel->pen_colors[i].pixel=XStandardPixel(map_info,&pixel->pen_colors[i]);
32053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel->pen_colors[i].flags=(char) (DoRed | DoGreen | DoBlue);
32063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
32073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->box_color=pixel->background_color;
32083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->pen_color=pixel->foreground_color;
32093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->box_index=0;
32103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixel->pen_index=1;
32113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image != (Image *) NULL)
32123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
32133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((resource_info->gamma_correct != MagickFalse) &&
32143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (image->gamma != 0.0))
32153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
32163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          GeometryInfo
32173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            geometry_info;
32183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
32193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          MagickStatusType
32203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            flags;
32213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
32223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
32233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Initialize map relative to display and image gamma.
32243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
32253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          flags=ParseGeometry(resource_info->display_gamma,&geometry_info);
32263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          red_gamma=geometry_info.rho;
32273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          green_gamma=geometry_info.sigma;
32283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((flags & SigmaValue) == 0)
32293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            green_gamma=red_gamma;
32303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          blue_gamma=geometry_info.xi;
32313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((flags & XiValue) == 0)
32323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            blue_gamma=red_gamma;
32333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          red_gamma*=image->gamma;
32343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          green_gamma*=image->gamma;
32353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          blue_gamma*=image->gamma;
32363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
32373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (image->storage_class == PseudoClass)
32383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
32393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
32403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Initialize pixel array for images of type PseudoClass.
32413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
3242bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy          for (i=0; i < (ssize_t) image->colors; i++)
32434c08aed51c5899665ade97263692328eea4af106cristy            pixel->pixels[i]=XGammaPacket(map_info,image->colormap+i);
32443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (i=0; i < MaxNumberPens; i++)
32453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            pixel->pixels[image->colors+i]=pixel->pen_colors[i].pixel;
32463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          pixel->colors+=MaxNumberPens;
32473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
32483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
32493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
32503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
32513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
32523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
32533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
32543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
32553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
32563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X G e t R e s o u r c e C l a s s                                         %
32573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
32583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
32593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
32603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
32613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
32623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XGetResourceClass() queries the X server for the specified resource name or
32633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  class.  If the resource name or class is not defined in the database, the
32643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  supplied default value is returned.
32653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
32663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XGetResourceClass method is:
32673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
32683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char *XGetResourceClass(XrmDatabase database,const char *client_name,
32693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *keyword,char *resource_default)
32703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
32713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
32723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
32733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o database: Specifies a resource database; returned from
32743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XrmGetStringDatabase.
32753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
32763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o client_name:  Specifies the application name used to retrieve resource
32773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      info from the X server database.
32783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
32793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o keyword: Specifies the keyword of the value being retrieved.
32803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
32813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o resource_default: Specifies the default value to return if the query
32823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      fails to find the specified keyword/class.
32833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
32843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
32853ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport char *XGetResourceClass(XrmDatabase database,
32863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *client_name,const char *keyword,char *resource_default)
32873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
32883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
32893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    resource_class[MaxTextExtent],
32903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    resource_name[MaxTextExtent];
32913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
32923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static char
32933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *resource_type;
32943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
32953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
32963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
32973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
32983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XrmValue
32993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    resource_value;
33003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
33013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (database == (XrmDatabase) NULL)
33023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(resource_default);
33033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *resource_name='\0';
33043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *resource_class='\0';
33053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (keyword != (char *) NULL)
33063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
33073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      int
33083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        c,
33093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        k;
33103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
33113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
33123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Initialize resource keyword and class.
33133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
3314b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy      (void) FormatLocaleString(resource_name,MaxTextExtent,"%s.%s",
33153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        client_name,keyword);
33163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      c=(int) (*client_name);
33173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((c >= XK_a) && (c <= XK_z))
33183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        c-=(XK_a-XK_A);
33193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
33203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((c >= XK_agrave) && (c <= XK_odiaeresis))
33213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          c-=(XK_agrave-XK_Agrave);
33223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        else
33233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((c >= XK_oslash) && (c <= XK_thorn))
33243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            c-=(XK_oslash-XK_Ooblique);
33253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      k=(int) (*keyword);
33263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((k >= XK_a) && (k <= XK_z))
33273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        k-=(XK_a-XK_A);
33283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
33293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((k >= XK_agrave) && (k <= XK_odiaeresis))
33303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          k-=(XK_agrave-XK_Agrave);
33313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        else
33323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((k >= XK_oslash) && (k <= XK_thorn))
33333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            k-=(XK_oslash-XK_Ooblique);
3334b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy      (void) FormatLocaleString(resource_class,MaxTextExtent,"%c%s.%c%s",c,
33353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        client_name+1,k,keyword+1);
33363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
33373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XrmGetResource(database,resource_name,resource_class,&resource_type,
33383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    &resource_value);
33393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status == False)
33403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(resource_default);
33413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(resource_value.addr);
33423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
33433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
33443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
33453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
33463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
33473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
33483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
33493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X G e t R e s o u r c e D a t a b a s e                                   %
33503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
33513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
33523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
33533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
33543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
33553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XGetResourceDatabase() creates a new resource database and initializes it.
33563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
33573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XGetResourceDatabase method is:
33583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
33593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XrmDatabase XGetResourceDatabase(Display *display,
33603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *client_name)
33613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
33623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
33633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
33643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o database: XGetResourceDatabase() returns the database after it is
33653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      initialized.
33663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
33673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
33683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
33693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
33703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o client_name:  Specifies the application name used to retrieve resource
33713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      info from the X server database.
33723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
33733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
33743ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport XrmDatabase XGetResourceDatabase(Display *display,
33753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *client_name)
33763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
33773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
33783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    filename[MaxTextExtent];
33793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
33803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
33813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    c;
33823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
33833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const char
33843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
33853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
33863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XrmDatabase
33873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    resource_database,
33883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    server_database;
33893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
33903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (display == (Display *) NULL)
33913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((XrmDatabase) NULL);
33923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(client_name != (char *) NULL);
33933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
33943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize resource database.
33953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
33963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XrmInitialize();
33973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XGetDefault(display,(char *) client_name,"dummy");
33983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_database=XrmGetDatabase(display);
33993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
34003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Combine application database.
34013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
34023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (client_name != (char *) NULL)
34033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
34043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
34053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Get basename of client.
34063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
34073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      p=client_name+(strlen(client_name)-1);
34083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      while ((p > client_name) && (*p != '/'))
34093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        p--;
34103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (*p == '/')
34113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        client_name=p+1;
34123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
34133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  c=(int) (*client_name);
34143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((c >= XK_a) && (c <= XK_z))
34153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    c-=(XK_a-XK_A);
34163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
34173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((c >= XK_agrave) && (c <= XK_odiaeresis))
34183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      c-=(XK_agrave-XK_Agrave);
34193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    else
34203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((c >= XK_oslash) && (c <= XK_thorn))
34213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        c-=(XK_oslash-XK_Ooblique);
34223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(X11_APPLICATION_PATH)
3423b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleString(filename,MaxTextExtent,"%s%c%s",
34243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    X11_APPLICATION_PATH,c,client_name+1);
34253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XrmCombineFileDatabase(filename,&resource_database,MagickFalse);
34263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
34273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (XResourceManagerString(display) != (char *) NULL)
34283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
34293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
34303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Combine server database.
34313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
34323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      server_database=XrmGetStringDatabase(XResourceManagerString(display));
34333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XrmCombineDatabase(server_database,&resource_database,MagickFalse);
34343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
34353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
34363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Merge user preferences database.
34373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
34383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(X11_PREFERENCES_PATH)
3439b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleString(filename,MaxTextExtent,"%s%src",
34403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    X11_PREFERENCES_PATH,client_name);
34413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ExpandFilename(filename);
34423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XrmCombineFileDatabase(filename,&resource_database,MagickFalse);
34433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
34443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(resource_database);
34453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
34463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
34473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
34483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
34493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
34503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
34513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
34523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X G e t R e s o u r c e I n f o                                           %
34533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
34543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
34553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
34563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
34573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
34583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XGetResourceInfo(image_info,) initializes the ResourceInfo structure.
34593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
34603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XGetResourceInfo method is:
34613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
34623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XGetResourceInfo(const ImageInfo *image_info,XrmDatabase database,
34633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *client_name,XResourceInfo *resource_info)
34643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
34653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
34663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
34673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image_info: the image info.
34683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
34693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o database: Specifies a resource database; returned from
34703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XrmGetStringDatabase.
34713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
34723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o client_name:  Specifies the application name used to retrieve
34733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      resource info from the X server database.
34743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
34753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
34763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
34773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
34783ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport void XGetResourceInfo(const ImageInfo *image_info,
34793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XrmDatabase database,const char *client_name,XResourceInfo *resource_info)
34803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
34813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
348200976d8abcff7a3bc7b986b8105dde8d091dee61cristy    *directory,
34833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *resource_value;
34843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3485bcdf567d7dc3c69162ca349e41d43741faed2043cristy  extern const char
3486bcdf567d7dc3c69162ca349e41d43741faed2043cristy    BorderColor[],
3487bcdf567d7dc3c69162ca349e41d43741faed2043cristy    ForegroundColor[];
3488bcdf567d7dc3c69162ca349e41d43741faed2043cristy
34893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
34903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize resource info fields.
34913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
34923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
34933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(resource_info != (XResourceInfo *) NULL);
34943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ResetMagickMemory(resource_info,0,sizeof(*resource_info));
34953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->resource_database=database;
34963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->image_info=(ImageInfo *) image_info;
34973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) SetImageInfoProgressMonitor(resource_info->image_info,
34983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    XMagickProgressMonitor,(void *) NULL);
34993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->quantize_info=CloneQuantizeInfo((QuantizeInfo *) NULL);
35003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->close_server=MagickTrue;
35013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->client_name=AcquireString(client_name);
35023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_value=XGetResourceClass(database,client_name,"backdrop",
35033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "False");
35046f2013165d72f7d8ef5f66bb9453126d88113809anthony  resource_info->backdrop=IsStringTrue(resource_value);
35053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->background_color=XGetResourceInstance(database,client_name,
35063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    "background",(char *) "#d6d6d6d6d6d6");
35073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->border_color=XGetResourceInstance(database,client_name,
35083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    "borderColor",BorderColor);
35093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_value=XGetResourceClass(database,client_name,"borderWidth",
35103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "2");
351100976d8abcff7a3bc7b986b8105dde8d091dee61cristy  resource_info->border_width=(unsigned int) StringToUnsignedLong(
351200976d8abcff7a3bc7b986b8105dde8d091dee61cristy    resource_value);
35133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_value=XGetResourceClass(database,client_name,"colormap",
35143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "shared");
35153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->colormap=UndefinedColormap;
35163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (LocaleCompare("private",resource_value) == 0)
35173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    resource_info->colormap=PrivateColormap;
35183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (LocaleCompare("shared",resource_value) == 0)
35193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    resource_info->colormap=SharedColormap;
35203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (resource_info->colormap == UndefinedColormap)
35213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowXWindowFatalException(OptionError,"UnrecognizedColormapType",
35223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      resource_value);
35233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_value=XGetResourceClass(database,client_name,
35243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    "colorRecovery",(char *) "False");
35256f2013165d72f7d8ef5f66bb9453126d88113809anthony  resource_info->color_recovery=IsStringTrue(resource_value);
35263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_value=XGetResourceClass(database,client_name,"confirmExit",
35273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "False");
35286f2013165d72f7d8ef5f66bb9453126d88113809anthony  resource_info->confirm_exit=IsStringTrue(resource_value);
35293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_value=XGetResourceClass(database,client_name,"confirmEdit",
35303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "False");
35316f2013165d72f7d8ef5f66bb9453126d88113809anthony  resource_info->confirm_edit=IsStringTrue(resource_value);
3532ba0c32599a8e592fffab86dd9b8ee367ca573c22cristy  resource_value=XGetResourceClass(database,client_name,"delay",(char *) "1");
3533e27293e706ca05b6b121e9512a83b16f7ad887f2cristy  resource_info->delay=(unsigned int) StringToUnsignedLong(resource_value);
35343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->display_gamma=XGetResourceClass(database,client_name,
35353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    "displayGamma",(char *) "2.2");
35363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_value=XGetResourceClass(database,client_name,"displayWarnings",
35373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "True");
35386f2013165d72f7d8ef5f66bb9453126d88113809anthony  resource_info->display_warnings=IsStringTrue(resource_value);
35393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->font=XGetResourceClass(database,client_name,"font",
35403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) NULL);
35413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->font=XGetResourceClass(database,client_name,"fontList",
35423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    resource_info->font);
35433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->font_name[0]=XGetResourceClass(database,client_name,"font1",
35443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "fixed");
35453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->font_name[1]=XGetResourceClass(database,client_name,"font2",
35463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "variable");
35473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->font_name[2]=XGetResourceClass(database,client_name,"font3",
35483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "5x8");
35493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->font_name[3]=XGetResourceClass(database,client_name,"font4",
35503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "6x10");
35513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->font_name[4]=XGetResourceClass(database,client_name,"font5",
35523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "7x13bold");
35533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->font_name[5]=XGetResourceClass(database,client_name,"font6",
35543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "8x13bold");
35553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->font_name[6]=XGetResourceClass(database,client_name,"font7",
35563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "9x15bold");
35573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->font_name[7]=XGetResourceClass(database,client_name,"font8",
35583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "10x20");
35593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->font_name[8]=XGetResourceClass(database,client_name,"font9",
35603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "12x24");
35613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->font_name[9]=XGetResourceClass(database,client_name,"font0",
35623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "fixed");
35633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->font_name[10]=XGetResourceClass(database,client_name,"font0",
35643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "fixed");
35653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->foreground_color=XGetResourceInstance(database,client_name,
35663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    "foreground",ForegroundColor);
35673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_value=XGetResourceClass(database,client_name,"gammaCorrect",
35688bc259be59a7cde483c27474125272a7d65c5744cristy    (char *) "False");
35696f2013165d72f7d8ef5f66bb9453126d88113809anthony  resource_info->gamma_correct=IsStringTrue(resource_value);
35703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->image_geometry=ConstantString(XGetResourceClass(database,
35713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    client_name,"geometry",(char *) NULL));
35723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_value=XGetResourceClass(database,client_name,"gravity",
35733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "Center");
3574042ee78fa9004bf1ac6a95f09d9d1faca631dda1cristy  resource_info->gravity=(GravityType) ParseCommandOption(MagickGravityOptions,
35753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    MagickFalse,resource_value);
357600976d8abcff7a3bc7b986b8105dde8d091dee61cristy  directory=getcwd(resource_info->home_directory,MaxTextExtent);
357700976d8abcff7a3bc7b986b8105dde8d091dee61cristy  (void) directory;
35783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->icon_geometry=XGetResourceClass(database,client_name,
35793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    "iconGeometry",(char *) NULL);
35803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_value=XGetResourceClass(database,client_name,"iconic",
35813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "False");
35826f2013165d72f7d8ef5f66bb9453126d88113809anthony  resource_info->iconic=IsStringTrue(resource_value);
35833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_value=XGetResourceClass(database,client_name,"immutable",
35843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    LocaleCompare(client_name,"PerlMagick") == 0 ? (char *) "True" :
35853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "False");
35866f2013165d72f7d8ef5f66bb9453126d88113809anthony  resource_info->immutable=IsStringTrue(resource_value);
35873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_value=XGetResourceClass(database,client_name,"magnify",
35883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "3");
3589e27293e706ca05b6b121e9512a83b16f7ad887f2cristy  resource_info->magnify=(unsigned int) StringToUnsignedLong(resource_value);
35903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->map_type=XGetResourceClass(database,client_name,"map",
35913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) NULL);
35923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->matte_color=XGetResourceInstance(database,client_name,
35933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    "mattecolor",(char *) NULL);
35943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->name=ConstantString(XGetResourceClass(database,client_name,
35953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    "name",(char *) NULL));
35963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->pen_colors[0]=XGetResourceClass(database,client_name,"pen1",
35973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "black");
35983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->pen_colors[1]=XGetResourceClass(database,client_name,"pen2",
35993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "blue");
36003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->pen_colors[2]=XGetResourceClass(database,client_name,"pen3",
36013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "cyan");
36023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->pen_colors[3]=XGetResourceClass(database,client_name,"pen4",
36033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "green");
36043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->pen_colors[4]=XGetResourceClass(database,client_name,"pen5",
36053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "gray");
36063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->pen_colors[5]=XGetResourceClass(database,client_name,"pen6",
36073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "red");
36083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->pen_colors[6]=XGetResourceClass(database,client_name,"pen7",
36093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "magenta");
36103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->pen_colors[7]=XGetResourceClass(database,client_name,"pen8",
36113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "yellow");
36123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->pen_colors[8]=XGetResourceClass(database,client_name,"pen9",
36133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "white");
36143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->pen_colors[9]=XGetResourceClass(database,client_name,"pen0",
36153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "gray");
36163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->pen_colors[10]=XGetResourceClass(database,client_name,"pen0",
36173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "gray");
36183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_value=XGetResourceClass(database,client_name,"pause",(char *) "0");
3619e27293e706ca05b6b121e9512a83b16f7ad887f2cristy  resource_info->pause=(unsigned int) StringToUnsignedLong(resource_value);
36203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_value=XGetResourceClass(database,client_name,"quantum",(char *) "1");
3621f2f2727f17ecbb23d902f70bb98f81faabc92dbdcristy  resource_info->quantum=StringToLong(resource_value);
36223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->text_font=XGetResourceClass(database,client_name,(char *)
36233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    "font",(char *) "fixed");
36243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->text_font=XGetResourceClass(database,client_name,
36253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    "textFontList",resource_info->text_font);
36263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->title=XGetResourceClass(database,client_name,"title",
36273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) NULL);
36283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_value=XGetResourceClass(database,client_name,"undoCache",
362992befbd6a0f0f642bd44c58fdd32e3e073f6f141cristy    (char *) "256");
3630e27293e706ca05b6b121e9512a83b16f7ad887f2cristy  resource_info->undo_cache=(unsigned int) StringToUnsignedLong(resource_value);
36313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_value=XGetResourceClass(database,client_name,"update",
36323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "False");
36336f2013165d72f7d8ef5f66bb9453126d88113809anthony  resource_info->update=IsStringTrue(resource_value);
36343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_value=XGetResourceClass(database,client_name,"usePixmap",
36353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "True");
36366f2013165d72f7d8ef5f66bb9453126d88113809anthony  resource_info->use_pixmap=IsStringTrue(resource_value);
36373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_value=XGetResourceClass(database,client_name,"sharedMemory",
36383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) "True");
36396f2013165d72f7d8ef5f66bb9453126d88113809anthony  resource_info->use_shared_memory=IsStringTrue(resource_value);
36403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->visual_type=XGetResourceClass(database,client_name,"visual",
36413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) NULL);
36423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->window_group=XGetResourceClass(database,client_name,
36433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    "windowGroup",(char *) NULL);
36443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->window_id=XGetResourceClass(database,client_name,"window",
36453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) NULL);
36463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->write_filename=XGetResourceClass(database,client_name,
36473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    "writeFilename",(char *) NULL);
36483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
36493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
36503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
36513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
36523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
36533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
36543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
36553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X G e t R e s o u r c e I n s t a n c e                                   %
36563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
36573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
36583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
36593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
36603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
36613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XGetResourceInstance() queries the X server for the specified resource name.
36623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  If the resource name is not defined in the database, the supplied default
36633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  value is returned.
36643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
36653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XGetResourceInstance method is:
36663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
36673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char *XGetResourceInstance(XrmDatabase database,const char *client_name,
36683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *keyword,const char *resource_default)
36693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
36703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
36713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
36723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o database: Specifies a resource database; returned from
36733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XrmGetStringDatabase.
36743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
36753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o client_name:  Specifies the application name used to retrieve
36763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      resource info from the X server database.
36773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
36783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o keyword: Specifies the keyword of the value being retrieved.
36793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
36803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o resource_default: Specifies the default value to return if the query
36813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      fails to find the specified keyword/class.
36823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
36833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
36843ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport char *XGetResourceInstance(XrmDatabase database,
36853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *client_name,const char *keyword,const char *resource_default)
36863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
36873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
36883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *resource_type,
36893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    resource_name[MaxTextExtent];
36903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
36913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
36923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
36933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
36943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XrmValue
36953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    resource_value;
36963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
36973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (database == (XrmDatabase) NULL)
36983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((char *) resource_default);
36993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *resource_name='\0';
37003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (keyword != (char *) NULL)
3701b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleString(resource_name,MaxTextExtent,"%s.%s",client_name,
37023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      keyword);
37033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XrmGetResource(database,resource_name,"ImageMagick",&resource_type,
37043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    &resource_value);
37053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status == False)
37063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((char *) resource_default);
37073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(resource_value.addr);
37083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
37093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
37103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
37113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
37123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
37133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
37143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
37153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X G e t S c r e e n D e n s i t y                                         %
37163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
37173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
37183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
37193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
37203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
37213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XGetScreenDensity() returns the density of the X server screen in
37223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  dots-per-inch.
37233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
37243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XGetScreenDensity method is:
37253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
37263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char *XGetScreenDensity(Display *display)
37273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
37283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
37293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
37303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o density: XGetScreenDensity() returns the density of the X screen in
37313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      dots-per-inch.
37323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
37333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
37343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
37353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
37363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
37373ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport char *XGetScreenDensity(Display *display)
37383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
37393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
37403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    density[MaxTextExtent];
37413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
37423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  double
37433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x_density,
37443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y_density;
37453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
37463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
37473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Set density as determined by screen size.
37483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
37493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  x_density=((((double) DisplayWidth(display,XDefaultScreen(display)))*25.4)/
37503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ((double) DisplayWidthMM(display,XDefaultScreen(display))));
37513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  y_density=((((double) DisplayHeight(display,XDefaultScreen(display)))*25.4)/
37523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ((double) DisplayHeightMM(display,XDefaultScreen(display))));
3753b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleString(density,MaxTextExtent,"%gx%g",x_density,
37548cd5b3193212b4aebce08c4e7afbb66b09778029cristy    y_density);
37553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(GetPageGeometry(density));
37563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
37573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
37583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
37593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
37603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
37613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
37623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
37633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy+   X G e t S u b w i n d o w                                                 %
37643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
37653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
37663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
37673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
37683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
37693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XGetSubwindow() returns the subwindow of a window chosen the user with the
37703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  pointer and a button press.
37713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
37723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XGetSubwindow method is:
37733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
37743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      Window XGetSubwindow(Display *display,Window window,int x,int y)
37753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
37763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
37773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
37783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o subwindow: XGetSubwindow() returns NULL if no subwindow is found
37793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      otherwise the subwindow is returned.
37803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
37813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
37823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
37833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
37843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies a pointer to a Window.
37853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
37863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o x: the x coordinate of the pointer relative to the origin of the
37873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      window.
37883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
37893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o y: the y coordinate of the pointer relative to the origin of the
37903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      window.
37913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
37923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
37933ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Window XGetSubwindow(Display *display,Window window,int x,int y)
37943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
37953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
37963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x_offset,
37973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y_offset;
37983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
37993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
38003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
38013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
38023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Window
38033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    source_window,
38043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    target_window;
38053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
38063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
38073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  source_window=XRootWindow(display,XDefaultScreen(display));
38083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window == (Window) NULL)
38093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(source_window);
38103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  target_window=window;
38113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for ( ; ; )
38123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
38133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status=XTranslateCoordinates(display,source_window,window,x,y,
38143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      &x_offset,&y_offset,&target_window);
38153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (status != True)
38163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
38173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (target_window == (Window) NULL)
38183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
38193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    source_window=window;
38203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window=target_window;
38213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x=x_offset;
38223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y=y_offset;
38233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
38243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (target_window == (Window) NULL)
38253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    target_window=window;
38263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(target_window);
38273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
38283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
38293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
38303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
38313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
38323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
38333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
38343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X G e t W i n d o w C o l o r                                             %
38353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
38363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
38373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
38383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
38393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
38403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XGetWindowColor() returns the color of a pixel interactively chosen from the
38413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  X server.
38423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
38433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XGetWindowColor method is:
38443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
38453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType XGetWindowColor(Display *display,XWindows *windows,
38466710d8414f0ed06e4eaf9346366be72e2b4719efcristy%        char *name,ExceptionInfo *exception)
38473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
38483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
38493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
38503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
38513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
38523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
38533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o windows: Specifies a pointer to a XWindows structure.
38543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
38553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o name: the name of the color if found in the X Color Database is
38563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      returned in this character string.
38573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
38586710d8414f0ed06e4eaf9346366be72e2b4719efcristy%    o exception: return any errors or warnings in this structure.
38596710d8414f0ed06e4eaf9346366be72e2b4719efcristy%
38603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
3861bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate MagickBooleanType XGetWindowColor(Display *display,
38626710d8414f0ed06e4eaf9346366be72e2b4719efcristy  XWindows *windows,char *name,ExceptionInfo *exception)
38633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
38643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
38653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x,
38663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y;
38673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3868101ab708b0574518ac5715da4d3915400e9df79acristy  PixelInfo
38693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel;
38703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
38713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  RectangleInfo
38723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    crop_info;
38733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
38743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
38753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
38763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
38773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Window
38783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    child,
38793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    client_window,
38803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    root_window,
38813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    target_window;
38823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
38833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XColor
38843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    color;
38853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
38863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XImage
38873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *ximage;
38883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
38893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWindowAttributes
38903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window_attributes;
38913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
38923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
38933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Choose a pixel from the X server.
38943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
38953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
38963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(name != (char *) NULL);
38973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",name);
38983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *name='\0';
38993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  target_window=XSelectWindow(display,&crop_info);
39003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (target_window == (Window) NULL)
39013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
39023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  root_window=XRootWindow(display,XDefaultScreen(display));
39033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  client_window=target_window;
39043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (target_window != root_window)
39053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
39063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      unsigned int
39073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        d;
39083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
39093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
39103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Get client window.
39113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
39123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=XGetGeometry(display,target_window,&root_window,&x,&x,&d,&d,&d,&d);
39133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (status != False)
39143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
39153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          client_window=XClientWindow(display,target_window);
39163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          target_window=client_window;
39173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
39183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
39193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
39203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Verify window is viewable.
39213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
39223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XGetWindowAttributes(display,target_window,&window_attributes);
39233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((status == False) || (window_attributes.map_state != IsViewable))
39243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
39253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
39263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Get window X image.
39273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
39283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XTranslateCoordinates(display,root_window,target_window,
39293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (int) crop_info.x,(int) crop_info.y,&x,&y,&child);
39303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ximage=XGetImage(display,target_window,x,y,1,1,AllPlanes,ZPixmap);
39313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (ximage == (XImage *) NULL)
39323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
39333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  color.pixel=XGetPixel(ximage,0,0);
39343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XDestroyImage(ximage);
39353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
39363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Match color against the color database.
39373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
39383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XQueryColor(display,window_attributes.colormap,&color);
3939e42f658533644aecb733785ffd91b286d6778deacristy  pixel.red=(double) ScaleShortToQuantum(color.red);
3940e42f658533644aecb733785ffd91b286d6778deacristy  pixel.green=(double) ScaleShortToQuantum(color.green);
3941e42f658533644aecb733785ffd91b286d6778deacristy  pixel.blue=(double) ScaleShortToQuantum(color.blue);
39424c08aed51c5899665ade97263692328eea4af106cristy  pixel.alpha=OpaqueAlpha;
39433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) QueryColorname(windows->image.image,&pixel,X11Compliance,name,
39446710d8414f0ed06e4eaf9346366be72e2b4719efcristy    exception);
39453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickTrue);
39463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
39473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
39483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
39493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
39503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
39513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
39523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
39533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy+   X G e t W i n d o w I m a g e                                             %
39543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
39553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
39563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
39573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
39583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
39593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XGetWindowImage() reads an image from the target X window and returns it.
39603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XGetWindowImage() optionally descends the window hierarchy and overlays the
39613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  target image with each child image in an optimized fashion.  Any child
39623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  window that have the same visual, colormap, and are contained by its parent
39633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  are exempted.
39643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
39653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XGetWindowImage method is:
39663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
39673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      Image *XGetWindowImage(Display *display,const Window window,
39686710d8414f0ed06e4eaf9346366be72e2b4719efcristy%        const unsigned int borders,const unsigned int level,
39696710d8414f0ed06e4eaf9346366be72e2b4719efcristy%        ExceptionInfo *exception)
39703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
39713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
39723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
39733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
39743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
39753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
39763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies the window to obtain the image from.
39773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
39783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o borders: Specifies whether borders pixels are to be saved with
39793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      the image.
39803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
39813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o level: Specifies an unsigned integer representing the level of
39823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      decent in the window hierarchy.  This value must be zero or one on
39833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      the initial call to XGetWindowImage.  A value of zero returns after
39843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      one call.  A value of one causes the function to descend the window
39853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      hierarchy and overlay the target image with each subwindow image.
39863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
39876710d8414f0ed06e4eaf9346366be72e2b4719efcristy%    o exception: return any errors or warnings in this structure.
39886710d8414f0ed06e4eaf9346366be72e2b4719efcristy%
39893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
39903ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *XGetWindowImage(Display *display,const Window window,
39916710d8414f0ed06e4eaf9346366be72e2b4719efcristy  const unsigned int borders,const unsigned int level,ExceptionInfo *exception)
39923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
39933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  typedef struct _ColormapInfo
39943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
39953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Colormap
39963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      colormap;
39973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
39983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    XColor
39993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      *colors;
40003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
40013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    struct _ColormapInfo
40023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      *next;
40033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  } ColormapInfo;
40043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
40053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  typedef struct _WindowInfo
40063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
40073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Window
40083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window,
40093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      parent;
40103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
40113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Visual
40123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      *visual;
40133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
40143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Colormap
40153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      colormap;
40163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
40173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    XSegment
40183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      bounds;
40193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
40203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    RectangleInfo
40213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      crop_info;
40223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  } WindowInfo;
40233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
40243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
40253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    display_height,
40263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    display_width,
40273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    id,
40283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x_offset,
40293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y_offset;
40303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
40314c08aed51c5899665ade97263692328eea4af106cristy  Quantum
40324c08aed51c5899665ade97263692328eea4af106cristy    index;
40334c08aed51c5899665ade97263692328eea4af106cristy
40343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  RectangleInfo
40353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    crop_info;
40363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
40373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register int
40383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
40393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
40403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static ColormapInfo
40413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *colormap_info = (ColormapInfo *) NULL;
40423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
40433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static int
40443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    max_windows = 0,
40453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_windows = 0;
40463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
40473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static WindowInfo
40483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *window_info;
40493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
40503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
40513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
40523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
40533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Window
40543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    child,
40553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    root_window;
40563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
40573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWindowAttributes
40583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window_attributes;
40593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
40603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
40613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Verify window is viewable.
40623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
40633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
40643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
40653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XGetWindowAttributes(display,window,&window_attributes);
40663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((status == False) || (window_attributes.map_state != IsViewable))
40673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((Image *) NULL);
40683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
40693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Cropping rectangle is relative to root window.
40703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
40713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  root_window=XRootWindow(display,XDefaultScreen(display));
40723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XTranslateCoordinates(display,window,root_window,0,0,&x_offset,
40733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    &y_offset,&child);
4074bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  crop_info.x=(ssize_t) x_offset;
4075bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  crop_info.y=(ssize_t) y_offset;
4076bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  crop_info.width=(size_t) window_attributes.width;
4077bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  crop_info.height=(size_t) window_attributes.height;
40783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (borders != MagickFalse)
40793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
40803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
40813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Include border in image.
40823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
4083bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      crop_info.x-=(ssize_t) window_attributes.border_width;
4084bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      crop_info.y-=(ssize_t) window_attributes.border_width;
4085bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      crop_info.width+=(size_t) (window_attributes.border_width << 1);
4086bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      crop_info.height+=(size_t) (window_attributes.border_width << 1);
40873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
40883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
40893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Crop to root window.
40903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
40913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (crop_info.x < 0)
40923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
40933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      crop_info.width+=crop_info.x;
40943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      crop_info.x=0;
40953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
40963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (crop_info.y < 0)
40973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
40983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      crop_info.height+=crop_info.y;
40993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      crop_info.y=0;
41003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
41013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  display_width=XDisplayWidth(display,XDefaultScreen(display));
41023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((int) (crop_info.x+crop_info.width) > display_width)
4103bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    crop_info.width=(size_t) (display_width-crop_info.x);
41043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  display_height=XDisplayHeight(display,XDefaultScreen(display));
41053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((int) (crop_info.y+crop_info.height) > display_height)
4106bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    crop_info.height=(size_t) (display_height-crop_info.y);
41073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
41083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize window info attributes.
41093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
41103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (number_windows >= max_windows)
41113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
41123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
41133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Allocate or resize window info buffer.
41143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
41153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      max_windows+=1024;
41163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window_info == (WindowInfo *) NULL)
41173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        window_info=(WindowInfo *) AcquireQuantumMemory((size_t) max_windows,
41183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          sizeof(*window_info));
41193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
41203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        window_info=(WindowInfo *) ResizeQuantumMemory(window_info,(size_t)
41213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          max_windows,sizeof(*window_info));
41223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
41233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window_info == (WindowInfo *) NULL)
41243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
41253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowXWindowFatalException(ResourceLimitError,
41263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "MemoryAllocationFailed","...");
41273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return((Image *) NULL);
41283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
41293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  id=number_windows++;
41303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_info[id].window=window;
41313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_info[id].visual=window_attributes.visual;
41323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_info[id].colormap=window_attributes.colormap;
41333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_info[id].bounds.x1=(short) crop_info.x;
41343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_info[id].bounds.y1=(short) crop_info.y;
41353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_info[id].bounds.x2=(short) (crop_info.x+(int) crop_info.width-1);
41363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_info[id].bounds.y2=(short) (crop_info.y+(int) crop_info.height-1);
41373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  crop_info.x-=x_offset;
41383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  crop_info.y-=y_offset;
41393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_info[id].crop_info=crop_info;
41403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (level != 0)
41413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
41423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      unsigned int
41433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        number_children;
41443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
41453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Window
41463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *children;
41473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
41483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
41493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Descend the window hierarchy.
41503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
41513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=XQueryTree(display,window,&root_window,&window_info[id].parent,
41523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        &children,&number_children);
41533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (i=0; i < id; i++)
41543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((window_info[i].window == window_info[id].parent) &&
41553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (window_info[i].visual == window_info[id].visual) &&
41563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (window_info[i].colormap == window_info[id].colormap))
41573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
415864057b049640be82cf952fa3e01282917270850ecristy            if ((window_info[id].bounds.x1 < window_info[i].bounds.x1) ||
415964057b049640be82cf952fa3e01282917270850ecristy                (window_info[id].bounds.x2 > window_info[i].bounds.x2) ||
416064057b049640be82cf952fa3e01282917270850ecristy                (window_info[id].bounds.y1 < window_info[i].bounds.y1) ||
416164057b049640be82cf952fa3e01282917270850ecristy                (window_info[id].bounds.y2 > window_info[i].bounds.y2))
41623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
41633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /*
41643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  Eliminate windows not circumscribed by their parent.
41653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                */
41663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                number_windows--;
41673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
41683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
41693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
41703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((status == True) && (number_children != 0))
41713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
41723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (i=0; i < (int) number_children; i++)
41736710d8414f0ed06e4eaf9346366be72e2b4719efcristy            (void) XGetWindowImage(display,children[i],MagickFalse,level+1,
41746710d8414f0ed06e4eaf9346366be72e2b4719efcristy              exception);
41753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) XFree((void *) children);
41763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
41773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
41783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (level <= 1)
41793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
4180c57f694b2d04975a0e501613e34368c464708c19cristy      CacheView
4181c57f694b2d04975a0e501613e34368c464708c19cristy        *composite_view;
4182c57f694b2d04975a0e501613e34368c464708c19cristy
41833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ColormapInfo
41843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *next;
41853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
41863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Image
41873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *composite_image,
41883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *image;
41893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
41903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      int
41913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        y;
41923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
41933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      MagickBooleanType
41943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        import;
41953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
41963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      register int
41973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        j,
41983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        x;
41993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
42004c08aed51c5899665ade97263692328eea4af106cristy      register Quantum
4201c47d1f8ecfe7d04f0f003cca0fe175658bbf0fb2cristy        *restrict q;
42023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4203bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      register size_t
42043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        pixel;
42053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
42063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      unsigned int
42073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        number_colors;
42083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
42093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XColor
42103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *colors;
42113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
42123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XImage
42133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *ximage;
42143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
42153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
42163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Get X image for each window in the list.
42173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
42183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image=NewImageList();
42193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (id=0; id < number_windows; id++)
42203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
42213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
42223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Does target window intersect top level window?
42233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
42243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        import=
42253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ((window_info[id].bounds.x2 >= window_info[0].bounds.x1) &&
42263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy           (window_info[id].bounds.x1 <= window_info[0].bounds.x2) &&
42273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy           (window_info[id].bounds.y2 >= window_info[0].bounds.y1) &&
42283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy           (window_info[id].bounds.y1 <= window_info[0].bounds.y2)) ?
42293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          MagickTrue : MagickFalse;
42303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
42313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Is target window contained by another window with the same colormap?
42323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
42333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for (j=0; j < id; j++)
42343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((window_info[id].visual == window_info[j].visual) &&
42353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (window_info[id].colormap == window_info[j].colormap))
42363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
423764057b049640be82cf952fa3e01282917270850ecristy              if ((window_info[id].bounds.x1 >= window_info[j].bounds.x1) &&
423864057b049640be82cf952fa3e01282917270850ecristy                  (window_info[id].bounds.x2 <= window_info[j].bounds.x2) &&
423964057b049640be82cf952fa3e01282917270850ecristy                  (window_info[id].bounds.y1 >= window_info[j].bounds.y1) &&
424064057b049640be82cf952fa3e01282917270850ecristy                  (window_info[id].bounds.y2 <= window_info[j].bounds.y2))
42413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  import=MagickFalse;
42423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
42433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (import == MagickFalse)
42443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
42453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
42463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Get X image.
42473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
42483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ximage=XGetImage(display,window_info[id].window,(int)
42493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          window_info[id].crop_info.x,(int) window_info[id].crop_info.y,
42503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (unsigned int) window_info[id].crop_info.width,(unsigned int)
42513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          window_info[id].crop_info.height,AllPlanes,ZPixmap);
42523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (ximage == (XImage *) NULL)
42533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
42543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
42553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Initialize window colormap.
42563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
42573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        number_colors=0;
42583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        colors=(XColor *) NULL;
42593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (window_info[id].colormap != (Colormap) NULL)
42603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
42613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            ColormapInfo
42623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *p;
42633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
42643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
42653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Search colormap list for window colormap.
42663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
42673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            number_colors=(unsigned int) window_info[id].visual->map_entries;
42683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (p=colormap_info; p != (ColormapInfo *) NULL; p=p->next)
42693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (p->colormap == window_info[id].colormap)
42703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
42713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (p == (ColormapInfo *) NULL)
42723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
42733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /*
42743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  Get the window colormap.
42753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                */
42763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                colors=(XColor *) AcquireQuantumMemory(number_colors,
42773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  sizeof(*colors));
42783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if (colors == (XColor *) NULL)
42793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  {
42803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    XDestroyImage(ximage);
42813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    return((Image *) NULL);
42823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  }
42833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if ((window_info[id].visual->klass != DirectColor) &&
42843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    (window_info[id].visual->klass != TrueColor))
42853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  for (i=0; i < (int) number_colors; i++)
42863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  {
4287bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy                    colors[i].pixel=(size_t) i;
42883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    colors[i].pad='\0';
42893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  }
42903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                else
42913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  {
4292bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy                    size_t
42933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      blue,
42943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      blue_bit,
42953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      green,
42963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      green_bit,
42973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      red,
42983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      red_bit;
42993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
43003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    /*
43013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      DirectColor or TrueColor visual.
43023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    */
43033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    red=0;
43043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    green=0;
43053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    blue=0;
43063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    red_bit=window_info[id].visual->red_mask &
43073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      (~(window_info[id].visual->red_mask)+1);
43083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    green_bit=window_info[id].visual->green_mask &
43093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      (~(window_info[id].visual->green_mask)+1);
43103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    blue_bit=window_info[id].visual->blue_mask &
43113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      (~(window_info[id].visual->blue_mask)+1);
43123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    for (i=0; i < (int) number_colors; i++)
43133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    {
43148891f9ce489d3e61399b60436ea6c62f5ed9b887cristy                      colors[i].pixel=(unsigned long) (red | green | blue);
43153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      colors[i].pad='\0';
43163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      red+=red_bit;
43173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      if (red > window_info[id].visual->red_mask)
43183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        red=0;
43193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      green+=green_bit;
43203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      if (green > window_info[id].visual->green_mask)
43213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        green=0;
43223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      blue+=blue_bit;
43233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      if (blue > window_info[id].visual->blue_mask)
43243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        blue=0;
43253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    }
43263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  }
43273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (void) XQueryColors(display,window_info[id].colormap,colors,
43283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  (int) number_colors);
43293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /*
43303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  Append colormap to colormap list.
43313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                */
433273bd4a51b419e914565bdf204bf1540dc4c8ee26cristy                p=(ColormapInfo *) AcquireMagickMemory(sizeof(*p));
43333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if (p == (ColormapInfo *) NULL)
43343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  return((Image *) NULL);
43353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                p->colormap=window_info[id].colormap;
43363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                p->colors=colors;
43373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                p->next=colormap_info;
43383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                colormap_info=p;
43393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
43403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            colors=p->colors;
43413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
43423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
43433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Allocate image structure.
43443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
43456710d8414f0ed06e4eaf9346366be72e2b4719efcristy        composite_image=AcquireImage((ImageInfo *) NULL,exception);
43463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (composite_image == (Image *) NULL)
43473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
43483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDestroyImage(ximage);
43493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            return((Image *) NULL);
43503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
43513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
43523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Convert X image to MIFF format.
43533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
43543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((window_info[id].visual->klass != TrueColor) &&
43553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (window_info[id].visual->klass != DirectColor))
43563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          composite_image->storage_class=PseudoClass;
4357bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        composite_image->columns=(size_t) ximage->width;
4358bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        composite_image->rows=(size_t) ximage->height;
435946ff2676b1044ea4101ac7a59b83289cd8f6cfdacristy        composite_view=AcquireAuthenticCacheView(composite_image,exception);
43603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        switch (composite_image->storage_class)
43613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
43623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          case DirectClass:
43633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          default:
43643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
4365bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            register size_t
43663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              color,
43673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              index;
43683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4369bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            size_t
43703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              blue_mask,
43713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              blue_shift,
43723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              green_mask,
43733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              green_shift,
43743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              red_mask,
43753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              red_shift;
43763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
43773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
43783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Determine shift and mask for red, green, and blue.
43793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
43803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            red_mask=window_info[id].visual->red_mask;
43813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            red_shift=0;
43823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            while ((red_mask != 0) && ((red_mask & 0x01) == 0))
43833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
43843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              red_mask>>=1;
43853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              red_shift++;
43863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
43873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            green_mask=window_info[id].visual->green_mask;
43883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            green_shift=0;
43893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            while ((green_mask != 0) && ((green_mask & 0x01) == 0))
43903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
43913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              green_mask>>=1;
43923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              green_shift++;
43933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
43943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            blue_mask=window_info[id].visual->blue_mask;
43953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            blue_shift=0;
43963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            while ((blue_mask != 0) && ((blue_mask & 0x01) == 0))
43973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
43983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              blue_mask>>=1;
43993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              blue_shift++;
44003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
44013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
44023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Convert X image to DirectClass packets.
44033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
44043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if ((number_colors != 0) &&
44053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (window_info[id].visual->klass == DirectColor))
44063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              for (y=0; y < (int) composite_image->rows; y++)
44073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
4408c57f694b2d04975a0e501613e34368c464708c19cristy                q=QueueCacheViewAuthenticPixels(composite_view,0,(ssize_t) y,
44093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  composite_image->columns,1,exception);
4410acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy                if (q == (Quantum *) NULL)
44113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
44123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                for (x=0; x < (int) composite_image->columns; x++)
44133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
44143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  pixel=XGetPixel(ximage,x,y);
44153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  index=(pixel >> red_shift) & red_mask;
44164c08aed51c5899665ade97263692328eea4af106cristy                  SetPixelRed(composite_image,
44174c08aed51c5899665ade97263692328eea4af106cristy                    ScaleShortToQuantum(colors[index].red),q);
44183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  index=(pixel >> green_shift) & green_mask;
44194c08aed51c5899665ade97263692328eea4af106cristy                  SetPixelGreen(composite_image,
44204c08aed51c5899665ade97263692328eea4af106cristy                    ScaleShortToQuantum(colors[index].green),q);
44213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  index=(pixel >> blue_shift) & blue_mask;
44224c08aed51c5899665ade97263692328eea4af106cristy                  SetPixelBlue(composite_image,
44234c08aed51c5899665ade97263692328eea4af106cristy                    ScaleShortToQuantum(colors[index].blue),q);
4424ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy                  q+=GetPixelChannels(composite_image);
44253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
44260b1a797184d12984eb55d950fb5f532298d9fd0fcristy                status=SyncCacheViewAuthenticPixels(composite_view,exception);
44270b1a797184d12984eb55d950fb5f532298d9fd0fcristy                if (status == MagickFalse)
44283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
44293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
44303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            else
44313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              for (y=0; y < (int) composite_image->rows; y++)
44323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
4433c57f694b2d04975a0e501613e34368c464708c19cristy                q=QueueCacheViewAuthenticPixels(composite_view,0,(ssize_t) y,
44343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  composite_image->columns,1,exception);
4435acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy                if (q == (Quantum *) NULL)
44363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
44373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                for (x=0; x < (int) composite_image->columns; x++)
44383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
44393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  pixel=XGetPixel(ximage,x,y);
44403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  color=(pixel >> red_shift) & red_mask;
44413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  color=(65535UL*color)/red_mask;
44424c08aed51c5899665ade97263692328eea4af106cristy                  SetPixelRed(composite_image,
44434c08aed51c5899665ade97263692328eea4af106cristy                    ScaleShortToQuantum((unsigned short) color),q);
44443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  color=(pixel >> green_shift) & green_mask;
44453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  color=(65535UL*color)/green_mask;
44464c08aed51c5899665ade97263692328eea4af106cristy                  SetPixelGreen(composite_image,
44474c08aed51c5899665ade97263692328eea4af106cristy                    ScaleShortToQuantum((unsigned short) color),q);
44483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  color=(pixel >> blue_shift) & blue_mask;
44493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  color=(65535UL*color)/blue_mask;
44504c08aed51c5899665ade97263692328eea4af106cristy                  SetPixelBlue(composite_image,
44514c08aed51c5899665ade97263692328eea4af106cristy                    ScaleShortToQuantum((unsigned short) color),q);
4452ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy                  q+=GetPixelChannels(composite_image);
44533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
44540b1a797184d12984eb55d950fb5f532298d9fd0fcristy                status=SyncCacheViewAuthenticPixels(composite_view,exception);
44550b1a797184d12984eb55d950fb5f532298d9fd0fcristy                if (status == MagickFalse)
44563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
44573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
44583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
44593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
44603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          case PseudoClass:
44613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
44623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
44633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Create colormap.
44643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
44650b1a797184d12984eb55d950fb5f532298d9fd0fcristy            status=AcquireImageColormap(composite_image,number_colors,
44660b1a797184d12984eb55d950fb5f532298d9fd0fcristy              exception);
44670b1a797184d12984eb55d950fb5f532298d9fd0fcristy            if (status == MagickFalse)
44683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
44693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                XDestroyImage(ximage);
44703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                composite_image=DestroyImage(composite_image);
44713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                return((Image *) NULL);
44723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
44733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (i=0; i < (int) composite_image->colors; i++)
44743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
4475e42f658533644aecb733785ffd91b286d6778deacristy              composite_image->colormap[colors[i].pixel].red=(double)
44763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                ScaleShortToQuantum(colors[i].red);
4477e42f658533644aecb733785ffd91b286d6778deacristy              composite_image->colormap[colors[i].pixel].green=(double)
44783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                ScaleShortToQuantum(colors[i].green);
4479e42f658533644aecb733785ffd91b286d6778deacristy              composite_image->colormap[colors[i].pixel].blue=(double)
44803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                ScaleShortToQuantum(colors[i].blue);
44813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
44823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
44833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Convert X image to PseudoClass packets.
44843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
44853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (y=0; y < (int) composite_image->rows; y++)
44863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
4487c57f694b2d04975a0e501613e34368c464708c19cristy              q=QueueCacheViewAuthenticPixels(composite_view,0,(ssize_t) y,
4488c57f694b2d04975a0e501613e34368c464708c19cristy                composite_image->columns,1,exception);
4489acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy              if (q == (Quantum *) NULL)
44903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
44913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              for (x=0; x < (int) composite_image->columns; x++)
44923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
44934c08aed51c5899665ade97263692328eea4af106cristy                index=(Quantum) XGetPixel(ximage,x,y);
44944c08aed51c5899665ade97263692328eea4af106cristy                SetPixelIndex(composite_image,index,q);
4495803640d20a6a664315eddfff6f8531d0c5e0871dcristy                SetPixelInfoPixel(composite_image,
44964c08aed51c5899665ade97263692328eea4af106cristy                  composite_image->colormap+(ssize_t) index,q);
4497ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy                q+=GetPixelChannels(composite_image);
44983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
44990b1a797184d12984eb55d950fb5f532298d9fd0fcristy              status=SyncCacheViewAuthenticPixels(composite_view,exception);
45000b1a797184d12984eb55d950fb5f532298d9fd0fcristy              if (status == MagickFalse)
45013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
45023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
45033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
45043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
45053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
4506c57f694b2d04975a0e501613e34368c464708c19cristy        composite_view=DestroyCacheView(composite_view);
45073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDestroyImage(ximage);
45083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (image == (Image *) NULL)
45093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
45103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            image=composite_image;
45113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            continue;
45123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
45133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
45143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Composite any children in back-to-front order.
45153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
45163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XTranslateCoordinates(display,window_info[id].window,window,0,0,
45173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          &x_offset,&y_offset,&child);
45183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        x_offset-=(int) crop_info.x;
45193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (x_offset < 0)
45203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          x_offset=0;
45213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        y_offset-=(int) crop_info.y;
45223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (y_offset < 0)
45233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          y_offset=0;
452439172408bad7ef2ef00a815fa9abf9979e7857cbcristy        (void) CompositeImage(image,composite_image,CopyCompositeOp,MagickTrue,
4525feb3e9695150978a5d2372d3fe2f60466a7c8066cristy          (ssize_t) x_offset,(ssize_t) y_offset,exception);
45265f257b2f02bdd982d9bbfe612f5bb1711608590ccristy        composite_image=DestroyImage(composite_image);
45273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
45283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
45293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Relinquish resources.
45303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
45313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      while (colormap_info != (ColormapInfo *) NULL)
45323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
45333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        next=colormap_info->next;
4534e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy        colormap_info->colors=(XColor *) RelinquishMagickMemory(
4535e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy          colormap_info->colors);
45363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        colormap_info=(ColormapInfo *) RelinquishMagickMemory(colormap_info);
45373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        colormap_info=next;
45383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
45393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
45403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Relinquish resources and restore initial state.
45413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
45423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window_info=(WindowInfo *) RelinquishMagickMemory(window_info);
45433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      max_windows=0;
45443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      number_windows=0;
45453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      colormap_info=(ColormapInfo *) NULL;
45463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return(image);
45473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
45483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return((Image *) NULL);
45493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
45503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
45513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
45523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
45533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
45543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
45553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
45563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X G e t W i n d o w I n f o                                               %
45573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
45583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
45593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
45603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
45613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
45623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XGetWindowInfo() initializes the XWindowInfo structure.
45633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
45643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XGetWindowInfo method is:
45653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
45663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XGetWindowInfo(Display *display,XVisualInfo *visual_info,
45673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        XStandardColormap *map_info,XPixelInfo *pixel,XFontStruct *font_info,
45683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        XResourceInfo *resource_info,XWindowInfo *window)
45693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        resource_info,window)
45703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
45713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
45723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
45733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server; returned from
45743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
45753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
45763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o visual_info: Specifies a pointer to a X11 XVisualInfo structure;
45773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      returned from XGetVisualInfo.
45783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
45793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o map_info: If map_type is specified, this structure is initialized
45803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      with info from the Standard Colormap.
45813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
45823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o pixel: Specifies a pointer to a XPixelInfo structure.
45833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
45843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o font_info: Specifies a pointer to a XFontStruct structure.
45853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
45863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
45873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
45883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
4589bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XGetWindowInfo(Display *display,XVisualInfo *visual_info,
45903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XStandardColormap *map_info,XPixelInfo *pixel,XFontStruct *font_info,
45913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XResourceInfo *resource_info,XWindowInfo *window)
45923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
45933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
45943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize window info.
45953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
45963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
45973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
45983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(visual_info != (XVisualInfo *) NULL);
45993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(map_info != (XStandardColormap *) NULL);
46003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(pixel != (XPixelInfo *) NULL);
46013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(resource_info != (XResourceInfo *) NULL);
46023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(window != (XWindowInfo *) NULL);
46033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->id != (Window) NULL)
46043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
46053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window->cursor != (Cursor) NULL)
46063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XFreeCursor(display,window->cursor);
46073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window->busy_cursor != (Cursor) NULL)
46083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XFreeCursor(display,window->busy_cursor);
46093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window->highlight_stipple != (Pixmap) NULL)
46103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XFreePixmap(display,window->highlight_stipple);
46113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window->shadow_stipple != (Pixmap) NULL)
46123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XFreePixmap(display,window->shadow_stipple);
46133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window->name == (char *) NULL)
46143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        window->name=AcquireString("");
46153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window->icon_name == (char *) NULL)
46163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        window->icon_name=AcquireString("");
46173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
46183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
46193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
46203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
46213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Initialize these attributes just once.
46223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
46233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window->id=(Window) NULL;
46243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window->name == (char *) NULL)
46253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        window->name=AcquireString("");
46263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window->icon_name == (char *) NULL)
46273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        window->icon_name=AcquireString("");
46283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window->x=XDisplayWidth(display,visual_info->screen) >> 1;
46293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window->y=XDisplayWidth(display,visual_info->screen) >> 1;
46303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window->ximage=(XImage *) NULL;
46313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window->matte_image=(XImage *) NULL;
46323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window->pixmap=(Pixmap) NULL;
46333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window->matte_pixmap=(Pixmap) NULL;
46343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window->mapped=MagickFalse;
46353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window->stasis=MagickFalse;
46363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window->shared_memory=MagickTrue;
46373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window->segment_info=(void *) NULL;
46383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
46393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
46403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XShmSegmentInfo
46413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *segment_info;
46423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
46433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (window->segment_info == (void *) NULL)
46443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          window->segment_info=AcquireQuantumMemory(2,sizeof(*segment_info));
46453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        segment_info=(XShmSegmentInfo *) window->segment_info;
46463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        segment_info[0].shmid=(-1);
46473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        segment_info[0].shmaddr=(char *) NULL;
46483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        segment_info[1].shmid=(-1);
46493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        segment_info[1].shmaddr=(char *) NULL;
46503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
46513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
46523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
46533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
46543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize these attributes every time function is called.
46553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
46563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->screen=visual_info->screen;
46573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->root=XRootWindow(display,visual_info->screen);
46583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->visual=visual_info->visual;
46593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->storage_class=(unsigned int) visual_info->klass;
46603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->depth=(unsigned int) visual_info->depth;
46613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->visual_info=visual_info;
46623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->map_info=map_info;
46633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->pixel_info=pixel;
46643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->font_info=font_info;
46653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->cursor=XCreateFontCursor(display,XC_left_ptr);
46663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->busy_cursor=XCreateFontCursor(display,XC_watch);
46673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->geometry=(char *) NULL;
46683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->icon_geometry=(char *) NULL;
46693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (resource_info->icon_geometry != (char *) NULL)
46703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) CloneString(&window->icon_geometry,resource_info->icon_geometry);
46713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->crop_geometry=(char *) NULL;
4672bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  window->flags=(size_t) PSize;
46733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->width=1;
46743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->height=1;
46753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->min_width=1;
46763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->min_height=1;
46773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->width_inc=1;
46783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->height_inc=1;
46793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->border_width=resource_info->border_width;
46803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->annotate_context=pixel->annotate_context;
46813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->highlight_context=pixel->highlight_context;
46823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->widget_context=pixel->widget_context;
46833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->shadow_stipple=(Pixmap) NULL;
46843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->highlight_stipple=(Pixmap) NULL;
46853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->use_pixmap=MagickTrue;
46863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->immutable=MagickFalse;
46873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->shape=MagickFalse;
46883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->data=0;
4689c57f694b2d04975a0e501613e34368c464708c19cristy  window->mask=(int) (CWBackingStore | CWBackPixel | CWBackPixmap |
46903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    CWBitGravity | CWBorderPixel | CWColormap | CWCursor | CWDontPropagate |
46913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    CWEventMask | CWOverrideRedirect | CWSaveUnder | CWWinGravity);
46923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->attributes.background_pixel=pixel->background_color.pixel;
46933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->attributes.background_pixmap=(Pixmap) NULL;
46943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->attributes.bit_gravity=ForgetGravity;
46953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->attributes.backing_store=WhenMapped;
46963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->attributes.save_under=MagickTrue;
46973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->attributes.border_pixel=pixel->border_color.pixel;
46983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->attributes.colormap=map_info->colormap;
46993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->attributes.cursor=window->cursor;
47003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->attributes.do_not_propagate_mask=NoEventMask;
47013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->attributes.event_mask=NoEventMask;
47023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->attributes.override_redirect=MagickFalse;
47033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->attributes.win_gravity=NorthWestGravity;
47043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->orphan=MagickFalse;
47053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
47063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
47073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
47083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
47093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
47103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
47113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
47123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X H i g h l i g h t E l l i p s e                                         %
47133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
47143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
47153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
47163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
47173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
47183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XHighlightEllipse() puts a border on the X server around a region defined by
47193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  highlight_info.
47203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
47213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XHighlightEllipse method is:
47223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
47233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XHighlightEllipse(Display *display,Window window,
47243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        GC annotate_context,const RectangleInfo *highlight_info)
47253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
47263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
47273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
47283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server; returned from
47293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
47303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
47313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies a pointer to a Window structure.
47323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
47333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o annotate_context: Specifies a pointer to a GC structure.
47343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
47353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o highlight_info: Specifies a pointer to a RectangleInfo structure.  It
47363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      contains the extents of any highlighting rectangle.
47373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
47383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
4739bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XHighlightEllipse(Display *display,Window window,
47403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  GC annotate_context,const RectangleInfo *highlight_info)
47413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
47423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
47433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
47443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(window != (Window) NULL);
47453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(annotate_context != (GC) NULL);
47463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(highlight_info != (RectangleInfo *) NULL);
47473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((highlight_info->width < 4) || (highlight_info->height < 4))
47483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return;
47493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XDrawArc(display,window,annotate_context,(int) highlight_info->x,
47503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (int) highlight_info->y,(unsigned int) highlight_info->width-1,
47513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (unsigned int) highlight_info->height-1,0,360*64);
47523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XDrawArc(display,window,annotate_context,(int) highlight_info->x+1,
47533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (int) highlight_info->y+1,(unsigned int) highlight_info->width-3,
47543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (unsigned int) highlight_info->height-3,0,360*64);
47553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
47563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
47573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
47583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
47593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
47603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
47613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
47623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X H i g h l i g h t L i n e                                               %
47633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
47643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
47653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
47663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
47673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
47683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XHighlightLine() puts a border on the X server around a region defined by
47693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  highlight_info.
47703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
47713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XHighlightLine method is:
47723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
47733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XHighlightLine(Display *display,Window window,GC annotate_context,
47743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const XSegment *highlight_info)
47753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
47763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
47773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
47783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server; returned from
47793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
47803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
47813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies a pointer to a Window structure.
47823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
47833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o annotate_context: Specifies a pointer to a GC structure.
47843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
47853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o highlight_info: Specifies a pointer to a RectangleInfo structure.  It
47863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      contains the extents of any highlighting rectangle.
47873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
47883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
4789bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XHighlightLine(Display *display,Window window,
47903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  GC annotate_context,const XSegment *highlight_info)
47913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
47923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
47933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
47943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(window != (Window) NULL);
47953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(annotate_context != (GC) NULL);
47963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(highlight_info != (XSegment *) NULL);
47973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XDrawLine(display,window,annotate_context,highlight_info->x1,
47983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    highlight_info->y1,highlight_info->x2,highlight_info->y2);
47993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
48003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
48013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
48023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
48033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
48043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
48053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
48063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X H i g h l i g h t R e c t a n g l e                                     %
48073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
48083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
48093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
48103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
48113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
48123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XHighlightRectangle() puts a border on the X server around a region defined
48133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  by highlight_info.
48143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
48153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XHighlightRectangle method is:
48163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
48173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XHighlightRectangle(Display *display,Window window,
48183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        GC annotate_context,const RectangleInfo *highlight_info)
48193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
48203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
48213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
48223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server; returned from
48233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
48243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
48253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies a pointer to a Window structure.
48263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
48273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o annotate_context: Specifies a pointer to a GC structure.
48283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
48293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o highlight_info: Specifies a pointer to a RectangleInfo structure.  It
48303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      contains the extents of any highlighting rectangle.
48313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
48323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
4833bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XHighlightRectangle(Display *display,Window window,
48343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  GC annotate_context,const RectangleInfo *highlight_info)
48353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
48363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
48373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
48383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(window != (Window) NULL);
48393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(annotate_context != (GC) NULL);
48403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(highlight_info != (RectangleInfo *) NULL);
48413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((highlight_info->width < 4) || (highlight_info->height < 4))
48423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return;
48433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XDrawRectangle(display,window,annotate_context,(int) highlight_info->x,
48443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (int) highlight_info->y,(unsigned int) highlight_info->width-1,
48453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (unsigned int) highlight_info->height-1);
48463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XDrawRectangle(display,window,annotate_context,(int) highlight_info->x+
48473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    1,(int) highlight_info->y+1,(unsigned int) highlight_info->width-3,
48483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (unsigned int) highlight_info->height-3);
48493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
48503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
48513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
48523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
48533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
48543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
48553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
48563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X I m p o r t I m a g e                                                   %
48573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
48583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
48593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
48603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
48613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
48623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XImportImage() reads an image from an X window.
48633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
48643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XImportImage method is:
48653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
48666710d8414f0ed06e4eaf9346366be72e2b4719efcristy%      Image *XImportImage(const ImageInfo *image_info,XImportInfo *ximage_info,
48676710d8414f0ed06e4eaf9346366be72e2b4719efcristy%        ExceptionInfo *exception)
48683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
48693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
48703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
48713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image_info: the image info.
48723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
48733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o ximage_info: Specifies a pointer to an XImportInfo structure.
48743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
48756710d8414f0ed06e4eaf9346366be72e2b4719efcristy%    o exception: return any errors or warnings in this structure.
48766710d8414f0ed06e4eaf9346366be72e2b4719efcristy%
48773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
48783ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport Image *XImportImage(const ImageInfo *image_info,
48796710d8414f0ed06e4eaf9346366be72e2b4719efcristy  XImportInfo *ximage_info,ExceptionInfo *exception)
48803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
48813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Colormap
48823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *colormaps;
48833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
48843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Display
48853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *display;
48863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
48873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image
48883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *image;
48893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
48903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
48913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_colormaps,
48923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_windows,
48933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x;
48943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
48953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  RectangleInfo
48963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    crop_info;
48973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
48983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
48993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
49003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
49013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Window
49023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *children,
49033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    client,
49043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    prior_target,
49053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    root,
49063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    target;
49073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
49083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XTextProperty
49093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window_name;
49103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
49113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
49123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Open X server connection.
49133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
49143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image_info != (const ImageInfo *) NULL);
49153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image_info->signature == MagickSignature);
49163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image_info->debug != MagickFalse)
49173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
49183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image_info->filename);
49193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(ximage_info != (XImportInfo *) NULL);
49203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  display=XOpenDisplay(image_info->server_name);
49213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (display == (Display *) NULL)
49223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
49233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowXWindowFatalException(XServerError,"UnableToOpenXServer",
49243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDisplayName(image_info->server_name));
49253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return((Image *) NULL);
49263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
49273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
49283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Set our forgiving exception handler.
49293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
49303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XSetErrorHandler(XError);
49313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
49323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Select target window.
49333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
49343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  crop_info.x=0;
49353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  crop_info.y=0;
49363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  crop_info.width=0;
49373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  crop_info.height=0;
49383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  root=XRootWindow(display,XDefaultScreen(display));
49393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  target=(Window) NULL;
49403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((image_info->filename != (char *) NULL) &&
49413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (*image_info->filename != '\0'))
49423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
49433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (LocaleCompare(image_info->filename,"root") == 0)
49443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        target=root;
49453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
49463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
49473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
49483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Select window by ID or name.
49493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
49503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (isdigit((unsigned char) *image_info->filename) != 0)
49513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            target=XWindowByID(display,root,(Window)
49523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              strtol(image_info->filename,(char **) NULL,0));
49533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (target == (Window) NULL)
49543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            target=XWindowByName(display,root,image_info->filename);
49553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (target == (Window) NULL)
49563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            ThrowXWindowFatalException(XServerError,
49573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              "NoWindowWithSpecifiedIDExists",image_info->filename);
49583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
49593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
49603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
49613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    If target window is not defined, interactively select one.
49623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
49633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  prior_target=target;
49643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (target == (Window) NULL)
49653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    target=XSelectWindow(display,&crop_info);
49663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (target == (Window) NULL)
49673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowXWindowFatalException(XServerError,"UnableToReadXWindowImage",
49683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image_info->filename);
49693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  client=target;   /* obsolete */
49703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (target != root)
49713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
49723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      unsigned int
49733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        d;
49743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
49753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=XGetGeometry(display,target,&root,&x,&x,&d,&d,&d,&d);
49763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (status != False)
49773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
49783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for ( ; ; )
49793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
49803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Window
49813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              parent;
49823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
49833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
49843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Find window manager frame.
49853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
49863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            status=XQueryTree(display,target,&root,&parent,&children,&d);
49873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if ((status != False) && (children != (Window *) NULL))
49883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (void) XFree((char *) children);
49893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if ((status == False) || (parent == (Window) NULL) ||
49903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (parent == root))
49913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
49923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            target=parent;
49933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
49943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
49953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Get client window.
49963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
49973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          client=XClientWindow(display,target);
49983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (ximage_info->frame == MagickFalse)
49993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            target=client;
50003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((ximage_info->frame == MagickFalse) &&
50013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (prior_target != MagickFalse))
50023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            target=prior_target;
50033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
50043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
50053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (ximage_info->screen)
50063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
50073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      int
50083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        y;
50093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
50103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Window
50113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        child;
50123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
50133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XWindowAttributes
50143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        window_attributes;
50153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
50163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
50173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Obtain window image directly from screen.
50183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
50193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=XGetWindowAttributes(display,target,&window_attributes);
50203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (status == False)
50213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
50223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ThrowXWindowFatalException(XServerError,
50233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            "UnableToReadXWindowAttributes",image_info->filename);
50243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) XCloseDisplay(display);
50253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          return((Image *) NULL);
50263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
50273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XTranslateCoordinates(display,target,root,0,0,&x,&y,&child);
5028c57f694b2d04975a0e501613e34368c464708c19cristy      crop_info.x=(ssize_t) x;
5029c57f694b2d04975a0e501613e34368c464708c19cristy      crop_info.y=(ssize_t) y;
5030bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      crop_info.width=(size_t) window_attributes.width;
5031bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      crop_info.height=(size_t) window_attributes.height;
5032553743c2f2d6c29405dcfab6390a1c505c79fececristy      if (ximage_info->borders != 0)
50333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
50343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
50353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Include border in image.
50363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
50373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          crop_info.x-=window_attributes.border_width;
50383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          crop_info.y-=window_attributes.border_width;
50393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          crop_info.width+=window_attributes.border_width << 1;
50403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          crop_info.height+=window_attributes.border_width << 1;
50413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
50423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      target=root;
50433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
50443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
50453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    If WM_COLORMAP_WINDOWS property is set or multiple colormaps, descend.
50463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
50473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  number_windows=0;
50483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XGetWMColormapWindows(display,target,&children,&number_windows);
50493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((status == True) && (number_windows > 0))
50503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
50513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ximage_info->descend=MagickTrue;
50523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XFree ((char *) children);
50533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
50543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  colormaps=XListInstalledColormaps(display,target,&number_colormaps);
50553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (number_colormaps > 0)
50563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
50573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (number_colormaps > 1)
50583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ximage_info->descend=MagickTrue;
50593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XFree((char *) colormaps);
50603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
50613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
50623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Alert the user not to alter the screen.
50633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
50643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (ximage_info->silent == MagickFalse)
50653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XBell(display,0);
50663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
50673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Get image by window id.
50683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
50693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XGrabServer(display);
50703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  image=XGetWindowImage(display,target,ximage_info->borders,
50716710d8414f0ed06e4eaf9346366be72e2b4719efcristy    ximage_info->descend ? 1U : 0U,exception);
50723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XUngrabServer(display);
50733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image == (Image *) NULL)
50743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowXWindowFatalException(XServerError,"UnableToReadXWindowImage",
50753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image_info->filename)
50763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
50773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
50783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) CopyMagickString(image->filename,image_info->filename,
50793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        MaxTextExtent);
50803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((crop_info.width != 0) && (crop_info.height != 0))
50813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
50823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Image
50833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *clone_image,
50843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *crop_image;
50853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
50863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
50873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Crop image as defined by the cropping rectangle.
50883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
50896710d8414f0ed06e4eaf9346366be72e2b4719efcristy          clone_image=CloneImage(image,0,0,MagickTrue,exception);
50903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (clone_image != (Image *) NULL)
50913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
50926710d8414f0ed06e4eaf9346366be72e2b4719efcristy              crop_image=CropImage(clone_image,&crop_info,exception);
50933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (crop_image != (Image *) NULL)
50943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
50953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  image=DestroyImage(image);
50963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  image=crop_image;
50973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
50983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
50993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
51003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=XGetWMName(display,target,&window_name);
51013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (status == True)
51023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
51033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((image_info->filename != (char *) NULL) &&
51043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (*image_info->filename == '\0'))
51053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) CopyMagickString(image->filename,(char *) window_name.value,
51063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (size_t) window_name.nitems+1);
51073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) XFree((void *) window_name.value);
51083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
51093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
51103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (ximage_info->silent == MagickFalse)
51113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
51123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
51133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Alert the user we're done.
51143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
51153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XBell(display,0);
51163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XBell(display,0);
51173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
51183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XCloseDisplay(display);
51193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(image);
51203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
51213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
51223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
51233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
51243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
51253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
51263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
51273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X I n i t i a l i z e W i n d o w s                                       %
51283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
51293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
51303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
51313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
51323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
51333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XInitializeWindows() initializes the XWindows structure.
51343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
51353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XInitializeWindows method is:
51363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
51373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XWindows *XInitializeWindows(Display *display,
51383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        XResourceInfo *resource_info)
51393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
51403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
51413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
51423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o windows: XInitializeWindows returns a pointer to a XWindows structure.
51433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
51443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
51453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
51463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
51473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
51483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
51493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
5150bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate XWindows *XInitializeWindows(Display *display,
51513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XResourceInfo *resource_info)
51523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
51533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Window
51543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    root_window;
51553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
51563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWindows
51573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *windows;
51583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
51593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
51603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Allocate windows structure.
51613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
516273bd4a51b419e914565bdf204bf1540dc4c8ee26cristy  windows=(XWindows *) AcquireMagickMemory(sizeof(*windows));
51633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows == (XWindows *) NULL)
51643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
51653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowXWindowFatalException(XServerFatalError,"MemoryAllocationFailed",
51663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "...");
51673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return((XWindows *) NULL);
51683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
51693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ResetMagickMemory(windows,0,sizeof(*windows));
51703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->pixel_info=(XPixelInfo *) AcquireMagickMemory(
51713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    sizeof(*windows->pixel_info));
51723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->icon_pixel=(XPixelInfo *) AcquireMagickMemory(
51733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    sizeof(*windows->icon_pixel));
51743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->icon_resources=(XResourceInfo *) AcquireMagickMemory(
51753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    sizeof(*windows->icon_resources));
51763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((windows->pixel_info == (XPixelInfo *) NULL) ||
51773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (windows->icon_pixel == (XPixelInfo *) NULL) ||
51783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (windows->icon_resources == (XResourceInfo *) NULL))
51793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
51803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowXWindowFatalException(XServerFatalError,"MemoryAllocationFailed",
51813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "...");
51823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return((XWindows *) NULL);
51833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
51843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
51853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize windows structure.
51863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
51873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->display=display;
51883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->wm_protocols=XInternAtom(display,"WM_PROTOCOLS",MagickFalse);
51893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->wm_delete_window=XInternAtom(display,"WM_DELETE_WINDOW",MagickFalse);
51903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->wm_take_focus=XInternAtom(display,"WM_TAKE_FOCUS",MagickFalse);
51913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->im_protocols=XInternAtom(display,"IM_PROTOCOLS",MagickFalse);
51923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->im_remote_command=
51933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    XInternAtom(display,"IM_REMOTE_COMMAND",MagickFalse);
51943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->im_update_widget=XInternAtom(display,"IM_UPDATE_WIDGET",MagickFalse);
51953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->im_update_colormap=
51963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    XInternAtom(display,"IM_UPDATE_COLORMAP",MagickFalse);
51973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->im_former_image=XInternAtom(display,"IM_FORMER_IMAGE",MagickFalse);
51983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->im_next_image=XInternAtom(display,"IM_NEXT_IMAGE",MagickFalse);
51993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->im_retain_colors=XInternAtom(display,"IM_RETAIN_COLORS",MagickFalse);
52003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->im_exit=XInternAtom(display,"IM_EXIT",MagickFalse);
52013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->dnd_protocols=XInternAtom(display,"DndProtocol",MagickFalse);
52020157aeadef2fce908277168097a160a8f15a6952cristy#if defined(MAGICKCORE_WINDOWS_SUPPORT)
52033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XSynchronize(display,IsWindows95());
52043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
52053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (IsEventLogging())
52063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
52073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XSynchronize(display,MagickTrue);
52083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"Version: %s",
5209bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        GetMagickVersion((size_t *) NULL));
52103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"Protocols:");
52113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),
52123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "  Window Manager: 0x%lx",windows->wm_protocols);
52133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),
52143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "    delete window: 0x%lx",windows->wm_delete_window);
52153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"    take focus: 0x%lx",
52163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->wm_take_focus);
52173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"  ImageMagick: 0x%lx",
52183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->im_protocols);
52193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),
52203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "    remote command: 0x%lx",windows->im_remote_command);
52213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),
52223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "    update widget: 0x%lx",windows->im_update_widget);
52233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),
52243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "    update colormap: 0x%lx",windows->im_update_colormap);
52253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),
52263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "    former image: 0x%lx",windows->im_former_image);
52273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"    next image: 0x%lx",
52283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->im_next_image);
52293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),
52303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "    retain colors: 0x%lx",windows->im_retain_colors);
52313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"    exit: 0x%lx",
52323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->im_exit);
52333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"  Drag and Drop: 0x%lx",
52343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->dnd_protocols);
52353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
52363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
52373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Allocate standard colormap.
52383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
52393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->map_info=XAllocStandardColormap();
52403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->icon_map=XAllocStandardColormap();
52413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((windows->map_info == (XStandardColormap *) NULL) ||
52423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (windows->icon_map == (XStandardColormap *) NULL))
52433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowXWindowFatalException(ResourceLimitFatalError,
52443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "MemoryAllocationFailed","...");
52453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->map_info->colormap=(Colormap) NULL;
52463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->icon_map->colormap=(Colormap) NULL;
5247f2faecf9facdbbb14fcba373365f9f691a9658e0cristy  windows->pixel_info->pixels=(unsigned long *) NULL;
52483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->pixel_info->annotate_context=(GC) NULL;
52493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->pixel_info->highlight_context=(GC) NULL;
52503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->pixel_info->widget_context=(GC) NULL;
52513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->font_info=(XFontStruct *) NULL;
52523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->icon_pixel->annotate_context=(GC) NULL;
5253f2faecf9facdbbb14fcba373365f9f691a9658e0cristy  windows->icon_pixel->pixels=(unsigned long *) NULL;
52543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
52553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Allocate visual.
52563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
52573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *windows->icon_resources=(*resource_info);
52583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->icon_resources->visual_type=(char *) "default";
52593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->icon_resources->colormap=SharedColormap;
52603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->visual_info=
52613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    XBestVisualInfo(display,windows->map_info,resource_info);
52623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->icon_visual=
52633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    XBestVisualInfo(display,windows->icon_map,windows->icon_resources);
52643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((windows->visual_info == (XVisualInfo *) NULL) ||
52653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (windows->icon_visual == (XVisualInfo *) NULL))
52663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowXWindowFatalException(XServerFatalError,"UnableToGetVisual",
52673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      resource_info->visual_type);
52683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (IsEventLogging())
52693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
52703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"Visual:");
52713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"  visual id: 0x%lx",
52723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->visual_info->visualid);
52733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"  class: %s",
52743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XVisualClassName(windows->visual_info->klass));
52753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"  depth: %d planes",
52763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->visual_info->depth);
52773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),
52783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "  size of colormap: %d entries",windows->visual_info->colormap_size);
52793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),
52803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "  red, green, blue masks: 0x%lx 0x%lx 0x%lx",
52813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->visual_info->red_mask,windows->visual_info->green_mask,
52823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->visual_info->blue_mask);
52833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),
52843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "  significant bits in color: %d bits",
52853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->visual_info->bits_per_rgb);
52863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
52873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
52883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Allocate class and manager hints.
52893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
52903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->class_hints=XAllocClassHint();
52913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->manager_hints=XAllocWMHints();
52923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((windows->class_hints == (XClassHint *) NULL) ||
52933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (windows->manager_hints == (XWMHints *) NULL))
52943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowXWindowFatalException(ResourceLimitFatalError,
52953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "MemoryAllocationFailed","...");
52963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
52973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Determine group leader if we have one.
52983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
52993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  root_window=XRootWindow(display,windows->visual_info->screen);
53003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->group_leader.id=(Window) NULL;
53013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (resource_info->window_group != (char *) NULL)
53023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
53033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (isdigit((unsigned char) *resource_info->window_group) != 0)
53043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->group_leader.id=XWindowByID(display,root_window,(Window)
53053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          strtol((char *) resource_info->window_group,(char **) NULL,0));
53063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (windows->group_leader.id == (Window) NULL)
53073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->group_leader.id=
53083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          XWindowByName(display,root_window,resource_info->window_group);
53093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
53103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(windows);
53113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
53123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
53133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
53143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
53153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
53163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
53173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
53183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X M a k e C u r s o r                                                     %
53193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
53203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
53213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
53223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
53233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
53243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XMakeCursor() creates a crosshairs X11 cursor.
53253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
53263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XMakeCursor method is:
53273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
53283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      Cursor XMakeCursor(Display *display,Window window,Colormap colormap,
53293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        char *background_color,char *foreground_color)
53303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
53313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
53323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
53333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
53343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
53353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
53363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies the ID of the window for which the cursor is
53373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      assigned.
53383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
53393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o colormap: Specifies the ID of the colormap from which the background
53403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      and foreground color will be retrieved.
53413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
53423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o background_color: Specifies the color to use for the cursor background.
53433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
53443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o foreground_color: Specifies the color to use for the cursor foreground.
53453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
53463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
5347bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate Cursor XMakeCursor(Display *display,Window window,
53483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Colormap colormap,char *background_color,char *foreground_color)
53493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
53503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define scope_height 17
53513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define scope_x_hot 8
53523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define scope_y_hot 8
53533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define scope_width 17
53543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
53553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static const unsigned char
53563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    scope_bits[] =
53573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
53583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x80, 0x03, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02,
53593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x7f,
53603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0xfc, 0x01, 0x01, 0x00, 0x01, 0x7f, 0xfc, 0x01, 0x80, 0x02, 0x00,
53613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02,
53623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0x80, 0x02, 0x00, 0x80, 0x03, 0x00
53633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    },
53643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    scope_mask_bits[] =
53653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
53663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0xc0, 0x07, 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x06, 0x00, 0xc0, 0x06,
53673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0xc0, 0x06, 0x00, 0xc0, 0x06, 0x00, 0xff, 0xfe, 0x01, 0x7f,
53683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0xfc, 0x01, 0x03, 0x80, 0x01, 0x7f, 0xfc, 0x01, 0xff, 0xfe, 0x01,
53693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0xc0, 0x06, 0x00, 0xc0, 0x06, 0x00, 0xc0, 0x06, 0x00, 0xc0, 0x06,
53703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0xc0, 0x07, 0x00, 0xc0, 0x07, 0x00
53713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    };
53723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
53733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Cursor
53743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    cursor;
53753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
53763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Pixmap
53773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    mask,
53783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    source;
53793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
53803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XColor
53813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    background,
53823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    foreground;
53833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
53843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
53853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(window != (Window) NULL);
53863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(colormap != (Colormap) NULL);
53873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(background_color != (char *) NULL);
53883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(foreground_color != (char *) NULL);
53893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",background_color);
53903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  source=XCreateBitmapFromData(display,window,(char *) scope_bits,scope_width,
53913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    scope_height);
53923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  mask=XCreateBitmapFromData(display,window,(char *) scope_mask_bits,
53933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    scope_width,scope_height);
53943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((source == (Pixmap) NULL) || (mask == (Pixmap) NULL))
53953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
53963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowXWindowFatalException(XServerError,"UnableToCreatePixmap","...");
53973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return((Cursor) NULL);
53983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
53993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XParseColor(display,colormap,background_color,&background);
54003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XParseColor(display,colormap,foreground_color,&foreground);
54013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  cursor=XCreatePixmapCursor(display,source,mask,&foreground,&background,
54023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    scope_x_hot,scope_y_hot);
54033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFreePixmap(display,source);
54043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFreePixmap(display,mask);
54053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(cursor);
54063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
54073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
54083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
54093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
54103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
54113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
54123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
54133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X M a k e I m a g e                                                       %
54143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
54153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
54163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
54173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
54183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
54193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XMakeImage() creates an X11 image.  If the image size differs from the X11
54203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  image size, the image is first resized.
54213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
54223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XMakeImage method is:
54233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
54243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType XMakeImage(Display *display,
54253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const XResourceInfo *resource_info,XWindowInfo *window,Image *image,
5426051718b74ad68f8584cdac01d0192974ec777f1bcristy%        unsigned int width,unsigned int height,ExceptionInfo *exception)
54273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
54283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
54293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
54303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server; returned from
54313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
54323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
54333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
54343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
54353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies a pointer to a XWindowInfo structure.
54363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
54373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image: the image.
54383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
54393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o width: Specifies the width in pixels of the rectangular area to
54403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      display.
54413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
54423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o height: Specifies the height in pixels of the rectangular area to
54433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      display.
54443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5445051718b74ad68f8584cdac01d0192974ec777f1bcristy%    o exception: return any errors or warnings in this structure.
5446051718b74ad68f8584cdac01d0192974ec777f1bcristy%
54473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
5448bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate MagickBooleanType XMakeImage(Display *display,
54493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const XResourceInfo *resource_info,XWindowInfo *window,Image *image,
5450051718b74ad68f8584cdac01d0192974ec777f1bcristy  unsigned int width,unsigned int height,ExceptionInfo *exception)
54513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
54523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define CheckOverflowException(length,width,height) \
54533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (((height) != 0) && ((length)/((size_t) height) != ((size_t) width)))
54543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
54553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
54563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    depth,
54573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    format;
54583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
54593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
54603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length;
54613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
54623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XImage
54633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *matte_image,
54643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *ximage;
54653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
54663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
54673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
54683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(resource_info != (XResourceInfo *) NULL);
54693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(window != (XWindowInfo *) NULL);
54703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(width != 0);
54713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(height != 0);
54723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((window->width == 0) || (window->height == 0))
54733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
54743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
54753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Apply user transforms to the image.
54763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
54773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XCheckDefineCursor(display,window->id,window->busy_cursor);
54783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFlush(display);
54793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  depth=(int) window->depth;
54803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->destroy)
54813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window->image=DestroyImage(window->image);
54823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->image=image;
54833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->destroy=MagickFalse;
54843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->image != (Image *) NULL)
54853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
54863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window->crop_geometry != (char *) NULL)
54873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
54883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Image
54893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *crop_image;
54903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
54913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          RectangleInfo
54923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            crop_info;
54933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
54943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
54953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Crop image.
54963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
54973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          window->image->page.x=0;
54983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          window->image->page.y=0;
54993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) ParsePageGeometry(window->image,window->crop_geometry,
55006710d8414f0ed06e4eaf9346366be72e2b4719efcristy            &crop_info,exception);
55016710d8414f0ed06e4eaf9346366be72e2b4719efcristy          crop_image=CropImage(window->image,&crop_info,exception);
55023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (crop_image != (Image *) NULL)
55033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
55043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (window->image != image)
55053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                window->image=DestroyImage(window->image);
55063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              window->image=crop_image;
55073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              window->destroy=MagickTrue;
55083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
55093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
55103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((width != (unsigned int) window->image->columns) ||
55113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (height != (unsigned int) window->image->rows))
55123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
55133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Image
55143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *resize_image;
55153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
55163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
55173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Resize image.
55183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
55193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          resize_image=NewImageList();
55203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (window->pixel_info->colors != 0)
55216710d8414f0ed06e4eaf9346366be72e2b4719efcristy            resize_image=SampleImage(window->image,width,height,exception);
55223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          else
55236710d8414f0ed06e4eaf9346366be72e2b4719efcristy            resize_image=ThumbnailImage(window->image,width,height,exception);
55243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (resize_image != (Image *) NULL)
55253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
55263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (window->image != image)
55273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                window->image=DestroyImage(window->image);
55283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              window->image=resize_image;
55293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              window->destroy=MagickTrue;
55303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
55313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
55323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      width=(unsigned int) window->image->columns;
5533bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      assert((size_t) width == window->image->columns);
55343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      height=(unsigned int) window->image->rows;
5535bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      assert((size_t) height == window->image->rows);
55363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
55373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
55383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Create X image.
55393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
55403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ximage=(XImage *) NULL;
55413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  format=(depth == 1) ? XYBitmap : ZPixmap;
55423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
55433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->shared_memory != MagickFalse)
55443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
55453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XShmSegmentInfo
55463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *segment_info;
55473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
55483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      segment_info=(XShmSegmentInfo *) window->segment_info;
55493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      segment_info[1].shmid=(-1);
55503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      segment_info[1].shmaddr=(char *) NULL;
55513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ximage=XShmCreateImage(display,window->visual,(unsigned int) depth,format,
55523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (char *) NULL,&segment_info[1],width,height);
55533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (ximage == (XImage *) NULL)
55543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        window->shared_memory=MagickFalse;
55553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      length=(size_t) ximage->bytes_per_line*ximage->height;
55563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (CheckOverflowException(length,ximage->bytes_per_line,ximage->height))
55573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        window->shared_memory=MagickFalse;
55583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window->shared_memory != MagickFalse)
55593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        segment_info[1].shmid=shmget(IPC_PRIVATE,length,IPC_CREAT | 0777);
55603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window->shared_memory != MagickFalse)
55613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        segment_info[1].shmaddr=(char *) shmat(segment_info[1].shmid,0,0);
55623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (segment_info[1].shmid < 0)
55633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        window->shared_memory=MagickFalse;
55643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window->shared_memory != MagickFalse)
55653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) shmctl(segment_info[1].shmid,IPC_RMID,0);
55663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
55673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
55683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (ximage != (XImage *) NULL)
55693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDestroyImage(ximage);
55703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ximage=(XImage *) NULL;
55713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (segment_info[1].shmaddr)
55723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
55733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (void) shmdt(segment_info[1].shmaddr);
55743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              segment_info[1].shmaddr=(char *) NULL;
55753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
55763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (segment_info[1].shmid >= 0)
55773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
55783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (void) shmctl(segment_info[1].shmid,IPC_RMID,0);
55793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              segment_info[1].shmid=(-1);
55803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
55813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
55823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
55833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
55843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
55853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Allocate X image pixel data.
55863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
55873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
55883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->shared_memory)
55893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
55903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Status
55913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        status;
55923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
55933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XShmSegmentInfo
55943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *segment_info;
55953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
55963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XSync(display,MagickFalse);
55973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      xerror_alert=MagickFalse;
55983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      segment_info=(XShmSegmentInfo *) window->segment_info;
55993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ximage->data=segment_info[1].shmaddr;
56003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      segment_info[1].readOnly=MagickFalse;
56013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=XShmAttach(display,&segment_info[1]);
56023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (status != False)
56033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XSync(display,MagickFalse);
56043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((status == False) || (xerror_alert != MagickFalse))
56053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
56063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          window->shared_memory=MagickFalse;
56073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (status != False)
56083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XShmDetach(display,&segment_info[1]);
56093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (ximage != (XImage *) NULL)
56103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
56113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              ximage->data=NULL;
56123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              XDestroyImage(ximage);
56133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              ximage=(XImage *) NULL;
56143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
56153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (segment_info[1].shmid >= 0)
56163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
56173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (segment_info[1].shmaddr != NULL)
56183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (void) shmdt(segment_info[1].shmaddr);
56193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (void) shmctl(segment_info[1].shmid,IPC_RMID,0);
56203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              segment_info[1].shmid=(-1);
56213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              segment_info[1].shmaddr=(char *) NULL;
56223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
56233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
56243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
56253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
56263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->shared_memory == MagickFalse)
56273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ximage=XCreateImage(display,window->visual,(unsigned int) depth,format,0,
56283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (char *) NULL,width,height,XBitmapPad(display),0);
56293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (ximage == (XImage *) NULL)
56303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
56313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
56323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Unable to create X image.
56333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
56343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XCheckDefineCursor(display,window->id,window->cursor);
56353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return(MagickFalse);
56363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
56373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  length=(size_t) ximage->bytes_per_line*ximage->height;
56383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (IsEventLogging())
56393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
56403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"XImage:");
56413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"  width, height: %dx%d",
56423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ximage->width,ximage->height);
56433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"  format: %d",
56443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ximage->format);
56453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"  byte order: %d",
56463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ximage->byte_order);
56473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),
56483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "  bitmap unit, bit order, pad: %d %d %d",ximage->bitmap_unit,
56493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ximage->bitmap_bit_order,ximage->bitmap_pad);
56503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"  depth: %d",
56513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ximage->depth);
56523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"  bytes per line: %d",
56533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ximage->bytes_per_line);
56543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"  bits per pixel: %d",
56553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ximage->bits_per_pixel);
56563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),
56573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "  red, green, blue masks: 0x%lx 0x%lx 0x%lx",ximage->red_mask,
56583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ximage->green_mask,ximage->blue_mask);
56593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
56603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->shared_memory == MagickFalse)
56613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
56623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (ximage->format != XYBitmap)
56633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ximage->data=(char *) AcquireQuantumMemory((size_t)
56643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ximage->bytes_per_line,(size_t) ximage->height);
56653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
56663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ximage->data=(char *) AcquireQuantumMemory((size_t)
56673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ximage->bytes_per_line*ximage->depth,(size_t) ximage->height);
56683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
56693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (ximage->data == (char *) NULL)
56703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
56713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
56723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Unable to allocate pixel data.
56733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
56743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XDestroyImage(ximage);
56753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ximage=(XImage *) NULL;
56763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XCheckDefineCursor(display,window->id,window->cursor);
56773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return(MagickFalse);
56783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
56793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->ximage != (XImage *) NULL)
56803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
56813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
56823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Destroy previous X image.
56833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
56843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      length=(size_t) window->ximage->bytes_per_line*window->ximage->height;
56853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
56863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window->segment_info != (XShmSegmentInfo *) NULL)
56873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
56883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          XShmSegmentInfo
56893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *segment_info;
56903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
56913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          segment_info=(XShmSegmentInfo *) window->segment_info;
56923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (segment_info[0].shmid >= 0)
56933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
56943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (void) XSync(display,MagickFalse);
56953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (void) XShmDetach(display,&segment_info[0]);
56963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (void) XSync(display,MagickFalse);
56973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (segment_info[0].shmaddr != (char *) NULL)
56983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (void) shmdt(segment_info[0].shmaddr);
56993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (void) shmctl(segment_info[0].shmid,IPC_RMID,0);
57003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              segment_info[0].shmid=(-1);
57013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              segment_info[0].shmaddr=(char *) NULL;
57023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              window->ximage->data=(char *) NULL;
57033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
57043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
57053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
57063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window->ximage->data != (char *) NULL)
57073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        free(window->ximage->data);
57083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window->ximage->data=(char *) NULL;
57093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XDestroyImage(window->ximage);
57103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window->ximage=(XImage *) NULL;
57113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
57123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
57133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->segment_info != (XShmSegmentInfo *) NULL)
57143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
57153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XShmSegmentInfo
57163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *segment_info;
57173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
57183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      segment_info=(XShmSegmentInfo *) window->segment_info;
57193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      segment_info[0]=segment_info[1];
57203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
57213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
57223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->ximage=ximage;
57233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  matte_image=(XImage *) NULL;
57243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((window->shape != MagickFalse) && (window->image != (Image *) NULL))
57258a46d827a124555f0c48fb2368ec1bba8e079ab6cristy    if ((window->image->alpha_trait == BlendPixelTrait) &&
5726c57f694b2d04975a0e501613e34368c464708c19cristy        ((int) width <= XDisplayWidth(display,window->screen)) &&
5727c57f694b2d04975a0e501613e34368c464708c19cristy        ((int) height <= XDisplayHeight(display,window->screen)))
57283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
57293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
57303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Create matte image.
57313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
57323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        matte_image=XCreateImage(display,window->visual,1,XYBitmap,0,
57333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (char *) NULL,width,height,XBitmapPad(display),0);
57343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (IsEventLogging())
57353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
57363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) LogMagickEvent(X11Event,GetMagickModule(),"Matte Image:");
57373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) LogMagickEvent(X11Event,GetMagickModule(),
57383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              "  width, height: %dx%d",matte_image->width,matte_image->height);
57393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
57403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (matte_image != (XImage *) NULL)
57413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
57423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
57433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Allocate matte image pixel data.
57443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
57453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            matte_image->data=(char *) AcquireQuantumMemory((size_t)
57463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              matte_image->bytes_per_line*matte_image->depth,
57473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (size_t) matte_image->height);
57483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (matte_image->data == (char *) NULL)
57493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
57503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                XDestroyImage(matte_image);
57513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                matte_image=(XImage *) NULL;
57523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
57533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
57543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
57553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->matte_image != (XImage *) NULL)
57563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
57573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
57583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Free matte image.
57593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
57603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window->matte_image->data != (char *) NULL)
57613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        free(window->matte_image->data);
57623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window->matte_image->data=(char *) NULL;
57633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XDestroyImage(window->matte_image);
57643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window->matte_image=(XImage *) NULL;
57653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
57663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->matte_image=matte_image;
57673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->matte_pixmap != (Pixmap) NULL)
57683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
57693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XFreePixmap(display,window->matte_pixmap);
57703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window->matte_pixmap=(Pixmap) NULL;
57713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HAVE_SHAPE)
57723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window->shape != MagickFalse)
57733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XShapeCombineMask(display,window->id,ShapeBounding,0,0,None,ShapeSet);
57743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
57753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
57763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->stasis=MagickFalse;
57773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
57783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Convert pixels to X image data.
57793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
57803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->image != (Image *) NULL)
57813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
57823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((ximage->byte_order == LSBFirst) || ((ximage->format == XYBitmap) &&
57833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (ximage->bitmap_bit_order == LSBFirst)))
57843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XMakeImageLSBFirst(resource_info,window,window->image,ximage,
5785e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy          matte_image,exception);
57863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
57873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XMakeImageMSBFirst(resource_info,window,window->image,ximage,
5788e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy          matte_image,exception);
57893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
57903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->matte_image != (XImage *) NULL)
57913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
57923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
57933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Create matte pixmap.
57943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
57953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window->matte_pixmap=XCreatePixmap(display,window->id,width,height,1);
57963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window->matte_pixmap != (Pixmap) NULL)
57973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
57983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          GC
57993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            graphics_context;
58003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
58013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          XGCValues
58023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            context_values;
58033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
58043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
58053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Copy matte image to matte pixmap.
58063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
58074c08aed51c5899665ade97263692328eea4af106cristy          context_values.background=0;
58084c08aed51c5899665ade97263692328eea4af106cristy          context_values.foreground=1;
58093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          graphics_context=XCreateGC(display,window->matte_pixmap,
5810bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            (size_t) (GCBackground | GCForeground),&context_values);
58113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) XPutImage(display,window->matte_pixmap,graphics_context,
58123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            window->matte_image,0,0,0,0,width,height);
58133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) XFreeGC(display,graphics_context);
58143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HAVE_SHAPE)
58153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (window->shape != MagickFalse)
58163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XShapeCombineMask(display,window->id,ShapeBounding,0,0,
58173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              window->matte_pixmap,ShapeSet);
58183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
58193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
58203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
58213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XMakePixmap(display,resource_info,window);
58223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
58233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Restore cursor.
58243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
58253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XCheckDefineCursor(display,window->id,window->cursor);
58263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickTrue);
58273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
58283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
58293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
58303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
58313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
58323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
58333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
58343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy+   X M a k e I m a g e L S B F i r s t                                       %
58353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
58363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
58373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
58383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
58393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
58403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XMakeImageLSBFirst() initializes the pixel data of an X11 Image. The X image
58413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  pixels are copied in least-significant bit and byte first order.  The
58423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  server's scanline pad is respected.  Rather than using one or two general
58433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  cases, many special cases are found here to help speed up the image
58443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  conversion.
58453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
58463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XMakeImageLSBFirst method is:
58473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5848e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy%      void XMakeImageLSBFirst(Display *display,XWindows *windows,
5849e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy%        ExceptionInfo *exception)
58503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
58513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
58523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
58533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
58543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
58553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies a pointer to a XWindowInfo structure.
58563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
58573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image: the image.
58583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
58593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o ximage: Specifies a pointer to a XImage structure;  returned from
58603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XCreateImage.
58613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
58623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o matte_image: Specifies a pointer to a XImage structure;  returned from
58633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XCreateImage.
58643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5865e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy%    o exception: return any errors or warnings in this structure.
5866e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy%
58673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
58683ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void XMakeImageLSBFirst(const XResourceInfo *resource_info,
5869e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy  const XWindowInfo *window,Image *image,XImage *ximage,XImage *matte_image,
5870e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy  ExceptionInfo *exception)
58713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
5872c57f694b2d04975a0e501613e34368c464708c19cristy  CacheView
5873c57f694b2d04975a0e501613e34368c464708c19cristy    *canvas_view;
5874c57f694b2d04975a0e501613e34368c464708c19cristy
58753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image
58763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *canvas;
58773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
58783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
58793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y;
58803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
58814c08aed51c5899665ade97263692328eea4af106cristy  register const Quantum
58823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
58833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
58843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register int
58853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x;
58863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
58873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register unsigned char
58883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
58893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
58903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned char
58913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    bit,
58923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    byte;
58933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
58943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
58953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    scanline_pad;
58963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5897f2faecf9facdbbb14fcba373365f9f691a9658e0cristy  unsigned long
58983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel,
58993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *pixels;
59003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
59013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XStandardColormap
59023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *map_info;
59033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
59043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(resource_info != (XResourceInfo *) NULL);
59053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(window != (XWindowInfo *) NULL);
59063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image != (Image *) NULL);
59073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image->debug != MagickFalse)
59083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
59093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  canvas=image;
5910bab87c3357f708174fd2d8ab87a0d7dbb3f70e31cristy  if ((window->immutable == MagickFalse) &&
59118a46d827a124555f0c48fb2368ec1bba8e079ab6cristy      (image->storage_class == DirectClass) && (image->alpha_trait == BlendPixelTrait))
59123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
59133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      char
59143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        size[MaxTextExtent];
59153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
59163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Image
59173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *pattern;
59183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
59193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ImageInfo
59203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *image_info;
59213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
59223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image_info=AcquireImageInfo();
59233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) CopyMagickString(image_info->filename,
59243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        resource_info->image_info->texture != (char *) NULL ?
59253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        resource_info->image_info->texture : "pattern:checkerboard",
59263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        MaxTextExtent);
5927b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy      (void) FormatLocaleString(size,MaxTextExtent,"%.20gx%.20g",(double)
5928e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy        image->columns,(double) image->rows);
59293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image_info->size=ConstantString(size);
59306710d8414f0ed06e4eaf9346366be72e2b4719efcristy      pattern=ReadImage(image_info,exception);
59313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image_info=DestroyImageInfo(image_info);
59323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (pattern != (Image *) NULL)
59333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
59346710d8414f0ed06e4eaf9346366be72e2b4719efcristy          canvas=CloneImage(image,0,0,MagickTrue,exception);
59353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (canvas != (Image *) NULL)
593639172408bad7ef2ef00a815fa9abf9979e7857cbcristy            (void) CompositeImage(canvas,pattern,DstOverCompositeOp,MagickTrue,
5937feb3e9695150978a5d2372d3fe2f60466a7c8066cristy              0,0,exception);
59383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          pattern=DestroyImage(pattern);
59393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
59403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
59413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  scanline_pad=(unsigned int) (ximage->bytes_per_line-((ximage->width*
59423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ximage->bits_per_pixel) >> 3));
59433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  map_info=window->map_info;
59443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixels=window->pixel_info->pixels;
59453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  q=(unsigned char *) ximage->data;
59463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  x=0;
594746ff2676b1044ea4101ac7a59b83289cd8f6cfdacristy  canvas_view=AcquireVirtualCacheView(canvas,exception);
59483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (ximage->format == XYBitmap)
59493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
59503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      register unsigned short
59513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        polarity;
59523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
59533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      unsigned char
59543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        background,
59553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        foreground;
59563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
59573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
59583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Convert canvas to big-endian bitmap.
59593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
59603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      background=(unsigned char)
59613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (XPixelIntensity(&window->pixel_info->foreground_color) <
59623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy         XPixelIntensity(&window->pixel_info->background_color) ? 0x80 : 0x00);
59633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      foreground=(unsigned char)
59643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (XPixelIntensity(&window->pixel_info->background_color) <
59653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy         XPixelIntensity(&window->pixel_info->foreground_color) ? 0x80 : 0x00);
5966101ab708b0574518ac5715da4d3915400e9df79acristy      polarity=(unsigned short) ((GetPixelInfoIntensity(
59676e963d8cbd0aebba1073d7f4b61e3d17177d6fedcristy        &canvas->colormap[0])) < (QuantumRange/2) ? 1 : 0);
59683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (canvas->colors == 2)
5969101ab708b0574518ac5715da4d3915400e9df79acristy        polarity=GetPixelInfoIntensity(&canvas->colormap[0]) <
5970101ab708b0574518ac5715da4d3915400e9df79acristy          GetPixelInfoIntensity(&canvas->colormap[1]);
59713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (y=0; y < (int) canvas->rows; y++)
59723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
5973c57f694b2d04975a0e501613e34368c464708c19cristy        p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,canvas->columns,1,
59746710d8414f0ed06e4eaf9346366be72e2b4719efcristy          exception);
59754c08aed51c5899665ade97263692328eea4af106cristy        if (p == (const Quantum *) NULL)
59763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
59773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        bit=0;
59783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        byte=0;
59793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for (x=0; x < (int) canvas->columns; x++)
59803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
59813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          byte>>=1;
59824c08aed51c5899665ade97263692328eea4af106cristy          if (GetPixelIndex(canvas,p) == (Quantum) polarity)
59833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            byte|=foreground;
59843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          else
59853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            byte|=background;
59863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          bit++;
59873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (bit == 8)
59883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
59893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *q++=byte;
59903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              bit=0;
59913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              byte=0;
59923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
5993ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          p+=GetPixelChannels(canvas);
59943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
59953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (bit != 0)
59963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *q=byte >> (8-bit);
59973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q+=scanline_pad;
59983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
59993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
60003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
60013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (window->pixel_info->colors != 0)
60023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      switch (ximage->bits_per_pixel)
60033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
60043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 2:
60053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
60063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          register unsigned int
60073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            nibble;
60083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
60093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
60103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Convert to 2 bit color-mapped X canvas.
60113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
60123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (y=0; y < (int) canvas->rows; y++)
60133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
6014c57f694b2d04975a0e501613e34368c464708c19cristy            p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
60156710d8414f0ed06e4eaf9346366be72e2b4719efcristy              canvas->columns,1,exception);
60164c08aed51c5899665ade97263692328eea4af106cristy            if (p == (const Quantum *) NULL)
60173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
60183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            nibble=0;
60193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (x=0; x < (int) canvas->columns; x++)
60203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
60214c08aed51c5899665ade97263692328eea4af106cristy              pixel=pixels[(ssize_t) GetPixelIndex(canvas,p)] & 0x0f;
60223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              switch (nibble)
60233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
60243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 0:
60253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
60263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q=(unsigned char) pixel;
60273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble++;
60283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
60293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
60303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 1:
60313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
60323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q|=(unsigned char) (pixel << 2);
60333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble++;
60343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
60353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
60363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 2:
60373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
60383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q|=(unsigned char) (pixel << 4);
60393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble++;
60403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
60413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
60423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 3:
60433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
60443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q|=(unsigned char) (pixel << 6);
60453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  q++;
60463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble=0;
60473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
60483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
60493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
6050ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              p+=GetPixelChannels(canvas);
60513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
60523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q+=scanline_pad;
60533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
60543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
60553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
60563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 4:
60573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
60583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          register unsigned int
60593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            nibble;
60603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
60613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
60623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Convert to 4 bit color-mapped X canvas.
60633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
60643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (y=0; y < (int) canvas->rows; y++)
60653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
6066c57f694b2d04975a0e501613e34368c464708c19cristy            p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
60676710d8414f0ed06e4eaf9346366be72e2b4719efcristy              canvas->columns,1,exception);
60684c08aed51c5899665ade97263692328eea4af106cristy            if (p == (const Quantum *) NULL)
60693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
60703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            nibble=0;
60713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (x=0; x < (int) canvas->columns; x++)
60723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
60734c08aed51c5899665ade97263692328eea4af106cristy              pixel=pixels[(ssize_t) GetPixelIndex(canvas,p)] & 0xf;
60743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              switch (nibble)
60753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
60763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 0:
60773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
60783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q=(unsigned char) pixel;
60793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble++;
60803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
60813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
60823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 1:
60833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
60843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q|=(unsigned char) (pixel << 4);
60853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  q++;
60863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble=0;
60873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
60883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
60893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
6090ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              p+=GetPixelChannels(canvas);
60913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
60923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q+=scanline_pad;
60933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
60943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
60953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
60963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 6:
60973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 8:
60983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
60993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
61003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Convert to 8 bit color-mapped X canvas.
61013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
61023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (resource_info->color_recovery &&
6103cbda611068350bf4459f2dda1951f8823702e129cristy              resource_info->quantize_info->dither_method != NoDitherMethod)
61043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
61056710d8414f0ed06e4eaf9346366be72e2b4719efcristy              XDitherImage(canvas,ximage,exception);
61063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
61073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
61083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (y=0; y < (int) canvas->rows; y++)
61093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
6110c57f694b2d04975a0e501613e34368c464708c19cristy            p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
61116710d8414f0ed06e4eaf9346366be72e2b4719efcristy              canvas->columns,1,exception);
61124c08aed51c5899665ade97263692328eea4af106cristy            if (p == (const Quantum *) NULL)
61133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
61143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (x=0; x < (int) canvas->columns; x++)
61153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
61164c08aed51c5899665ade97263692328eea4af106cristy              pixel=pixels[(ssize_t) GetPixelIndex(canvas,p)];
61173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *q++=(unsigned char) pixel;
6118ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              p+=GetPixelChannels(canvas);
61193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
61203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q+=scanline_pad;
61213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
61223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
61233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
61243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        default:
61253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
61263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          register int
61273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            k;
61283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
61293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          register unsigned int
61303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            bytes_per_pixel;
61313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
61323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
61333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Convert to multi-byte color-mapped X canvas.
61343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
61353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          bytes_per_pixel=(unsigned int) (ximage->bits_per_pixel >> 3);
61363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (y=0; y < (int) canvas->rows; y++)
61373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
6138c57f694b2d04975a0e501613e34368c464708c19cristy            p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
61396710d8414f0ed06e4eaf9346366be72e2b4719efcristy              canvas->columns,1,exception);
61404c08aed51c5899665ade97263692328eea4af106cristy            if (p == (const Quantum *) NULL)
61413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
61423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (x=0; x < (int) canvas->columns; x++)
61433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
61444c08aed51c5899665ade97263692328eea4af106cristy              pixel=pixels[(ssize_t) GetPixelIndex(canvas,p)];
61453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              for (k=0; k < (int) bytes_per_pixel; k++)
61463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
614742daae1036998661b8574cbce1fa28d25c1a4f42cristy                *q++=(unsigned char) (pixel & 0xff);
61483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                pixel>>=8;
61493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
6150ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              p+=GetPixelChannels(canvas);
61513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
61523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q+=scanline_pad;
61533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
61543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
61553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
61563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
61573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    else
61583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      switch (ximage->bits_per_pixel)
61593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
61603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 2:
61613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
61623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          register unsigned int
61633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            nibble;
61643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
61653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
61663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Convert to contiguous 2 bit continuous-tone X canvas.
61673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
61683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (y=0; y < (int) canvas->rows; y++)
61693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
61703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            nibble=0;
6171c57f694b2d04975a0e501613e34368c464708c19cristy            p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
61726710d8414f0ed06e4eaf9346366be72e2b4719efcristy              canvas->columns,1,exception);
61734c08aed51c5899665ade97263692328eea4af106cristy            if (p == (const Quantum *) NULL)
61743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
61753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (x=0; x < (int) canvas->columns; x++)
61763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
61774c08aed51c5899665ade97263692328eea4af106cristy              pixel=XGammaPixel(canvas,map_info,p);
61783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              pixel&=0xf;
61793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              switch (nibble)
61803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
61813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 0:
61823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
61833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q=(unsigned char) pixel;
61843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble++;
61853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
61863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
61873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 1:
61883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
61893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q|=(unsigned char) (pixel << 2);
61903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble++;
61913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
61923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
61933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 2:
61943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
61953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q|=(unsigned char) (pixel << 4);
61963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble++;
61973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
61983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
61993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 3:
62003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
62013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q|=(unsigned char) (pixel << 6);
62023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  q++;
62033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble=0;
62043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
62053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
62063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
6207ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              p+=GetPixelChannels(canvas);
62083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
62093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q+=scanline_pad;
62103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
62113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
62123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
62133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 4:
62143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
62153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          register unsigned int
62163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            nibble;
62173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
62183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
62193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Convert to contiguous 4 bit continuous-tone X canvas.
62203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
62213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (y=0; y < (int) canvas->rows; y++)
62223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
6223c57f694b2d04975a0e501613e34368c464708c19cristy            p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
62246710d8414f0ed06e4eaf9346366be72e2b4719efcristy              canvas->columns,1,exception);
62254c08aed51c5899665ade97263692328eea4af106cristy            if (p == (const Quantum *) NULL)
62263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
62273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            nibble=0;
62283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (x=0; x < (int) canvas->columns; x++)
62293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
62304c08aed51c5899665ade97263692328eea4af106cristy              pixel=XGammaPixel(canvas,map_info,p);
62313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              pixel&=0xf;
62323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              switch (nibble)
62333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
62343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 0:
62353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
62363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q=(unsigned char) pixel;
62373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble++;
62383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
62393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
62403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 1:
62413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
62423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q|=(unsigned char) (pixel << 4);
62433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  q++;
62443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble=0;
62453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
62463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
62473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
6248ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              p+=GetPixelChannels(canvas);
62493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
62503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q+=scanline_pad;
62513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
62523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
62533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
62543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 6:
62553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 8:
62563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
62573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
62583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Convert to contiguous 8 bit continuous-tone X canvas.
62593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
62603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (resource_info->color_recovery &&
6261cbda611068350bf4459f2dda1951f8823702e129cristy              resource_info->quantize_info->dither_method != NoDitherMethod)
62623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
62636710d8414f0ed06e4eaf9346366be72e2b4719efcristy              XDitherImage(canvas,ximage,exception);
62643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
62653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
62663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (y=0; y < (int) canvas->rows; y++)
62673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
6268c57f694b2d04975a0e501613e34368c464708c19cristy            p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
62696710d8414f0ed06e4eaf9346366be72e2b4719efcristy              canvas->columns,1,exception);
62704c08aed51c5899665ade97263692328eea4af106cristy            if (p == (const Quantum *) NULL)
62713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
62723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (x=0; x < (int) canvas->columns; x++)
62733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
62744c08aed51c5899665ade97263692328eea4af106cristy              pixel=XGammaPixel(canvas,map_info,p);
62753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *q++=(unsigned char) pixel;
6276ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              p+=GetPixelChannels(canvas);
62773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
62783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q+=scanline_pad;
62793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
62803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
62813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
62823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        default:
62833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
62843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((ximage->bits_per_pixel == 32) && (map_info->red_max == 255) &&
62853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (map_info->green_max == 255) && (map_info->blue_max == 255) &&
62863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (map_info->red_mult == 65536L) && (map_info->green_mult == 256) &&
62873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (map_info->blue_mult == 1))
62883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
62893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
62903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Convert to 32 bit continuous-tone X canvas.
62913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
62923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              for (y=0; y < (int) canvas->rows; y++)
62933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
6294c57f694b2d04975a0e501613e34368c464708c19cristy                p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
62956710d8414f0ed06e4eaf9346366be72e2b4719efcristy                  canvas->columns,1,exception);
62964c08aed51c5899665ade97263692328eea4af106cristy                if (p == (const Quantum *) NULL)
62973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
62983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if ((red_gamma != 1.0) || (green_gamma != 1.0) ||
62993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    (blue_gamma != 1.0))
63003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  {
63013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    /*
63023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      Gamma correct canvas.
63033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    */
63043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    for (x=(int) canvas->columns-1; x >= 0; x--)
63053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    {
6306ccf844f01bcfb63e8c6260bc986878089bb4c85bcristy                      *q++=ScaleQuantumToChar(XBlueGamma(
63074c08aed51c5899665ade97263692328eea4af106cristy                        GetPixelBlue(canvas,p)));
6308ccf844f01bcfb63e8c6260bc986878089bb4c85bcristy                      *q++=ScaleQuantumToChar(XGreenGamma(
63094c08aed51c5899665ade97263692328eea4af106cristy                        GetPixelGreen(canvas,p)));
6310ccf844f01bcfb63e8c6260bc986878089bb4c85bcristy                      *q++=ScaleQuantumToChar(XRedGamma(
63114c08aed51c5899665ade97263692328eea4af106cristy                        GetPixelRed(canvas,p)));
63123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      *q++=0;
6313ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy                      p+=GetPixelChannels(canvas);
63143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    }
63153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    continue;
63163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  }
63173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                for (x=(int) canvas->columns-1; x >= 0; x--)
63183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
63198bc259be59a7cde483c27474125272a7d65c5744cristy                  *q++=ScaleQuantumToChar((Quantum) GetPixelBlue(canvas,p));
63208bc259be59a7cde483c27474125272a7d65c5744cristy                  *q++=ScaleQuantumToChar((Quantum) GetPixelGreen(canvas,p));
63218bc259be59a7cde483c27474125272a7d65c5744cristy                  *q++=ScaleQuantumToChar((Quantum) GetPixelRed(canvas,p));
63223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q++=0;
6323ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy                  p+=GetPixelChannels(canvas);
63243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
63253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
63263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
63273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          else
63283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if ((ximage->bits_per_pixel == 32) && (map_info->red_max == 255) &&
63293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (map_info->green_max == 255) && (map_info->blue_max == 255) &&
63303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (map_info->red_mult == 1) && (map_info->green_mult == 256) &&
63313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (map_info->blue_mult == 65536L))
63323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
63333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /*
63343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  Convert to 32 bit continuous-tone X canvas.
63353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                */
63363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                for (y=0; y < (int) canvas->rows; y++)
63373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
6338c57f694b2d04975a0e501613e34368c464708c19cristy                  p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
63396710d8414f0ed06e4eaf9346366be72e2b4719efcristy                    canvas->columns,1,exception);
63404c08aed51c5899665ade97263692328eea4af106cristy                  if (p == (const Quantum *) NULL)
63413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    break;
63423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  if ((red_gamma != 1.0) || (green_gamma != 1.0) ||
63433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      (blue_gamma != 1.0))
63443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    {
63453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      /*
63463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        Gamma correct canvas.
63473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      */
63483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      for (x=(int) canvas->columns-1; x >= 0; x--)
63493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      {
6350ccf844f01bcfb63e8c6260bc986878089bb4c85bcristy                        *q++=ScaleQuantumToChar(XRedGamma(
63514c08aed51c5899665ade97263692328eea4af106cristy                          GetPixelRed(canvas,p)));
6352ccf844f01bcfb63e8c6260bc986878089bb4c85bcristy                        *q++=ScaleQuantumToChar(XGreenGamma(
63534c08aed51c5899665ade97263692328eea4af106cristy                          GetPixelGreen(canvas,p)));
6354ccf844f01bcfb63e8c6260bc986878089bb4c85bcristy                        *q++=ScaleQuantumToChar(XBlueGamma(
63554c08aed51c5899665ade97263692328eea4af106cristy                          GetPixelBlue(canvas,p)));
63563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        *q++=0;
6357ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy                        p+=GetPixelChannels(canvas);
63583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      }
63593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      continue;
63603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    }
63613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  for (x=(int) canvas->columns-1; x >= 0; x--)
63623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  {
63638bc259be59a7cde483c27474125272a7d65c5744cristy                    *q++=ScaleQuantumToChar((Quantum) GetPixelRed(canvas,p));
63648bc259be59a7cde483c27474125272a7d65c5744cristy                    *q++=ScaleQuantumToChar((Quantum) GetPixelGreen(canvas,p));
63658bc259be59a7cde483c27474125272a7d65c5744cristy                    *q++=ScaleQuantumToChar((Quantum) GetPixelBlue(canvas,p));
63663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    *q++=0;
6367ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy                    p+=GetPixelChannels(canvas);
63683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  }
63693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
63703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
63713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            else
63723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
63733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                register int
63743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  k;
63753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
63763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                register unsigned int
63773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  bytes_per_pixel;
63783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
63793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /*
63803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  Convert to multi-byte continuous-tone X canvas.
63813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                */
63823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                bytes_per_pixel=(unsigned int) (ximage->bits_per_pixel >> 3);
63833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                for (y=0; y < (int) canvas->rows; y++)
63843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
6385c57f694b2d04975a0e501613e34368c464708c19cristy                  p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
63866710d8414f0ed06e4eaf9346366be72e2b4719efcristy                    canvas->columns,1,exception);
63874c08aed51c5899665ade97263692328eea4af106cristy                  if (p == (const Quantum *) NULL)
63883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    break;
6389c57f694b2d04975a0e501613e34368c464708c19cristy                  for (x=0; x < (int) canvas->columns; x++)
63903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  {
63914c08aed51c5899665ade97263692328eea4af106cristy                    pixel=XGammaPixel(canvas,map_info,p);
63923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    for (k=0; k < (int) bytes_per_pixel; k++)
63933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    {
639442daae1036998661b8574cbce1fa28d25c1a4f42cristy                      *q++=(unsigned char) (pixel & 0xff);
63953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      pixel>>=8;
63963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    }
6397ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy                    p+=GetPixelChannels(canvas);
63983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  }
63993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  q+=scanline_pad;
64003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
64013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
64023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
64033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
64043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
64053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (matte_image != (XImage *) NULL)
64063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
64073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
64083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Initialize matte canvas.
64093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
64103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      scanline_pad=(unsigned int) (matte_image->bytes_per_line-
64113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ((matte_image->width*matte_image->bits_per_pixel) >> 3));
64123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      q=(unsigned char *) matte_image->data;
64133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (y=0; y < (int) canvas->rows; y++)
64143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
6415c57f694b2d04975a0e501613e34368c464708c19cristy        p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,canvas->columns,1,
64166710d8414f0ed06e4eaf9346366be72e2b4719efcristy          exception);
64174c08aed51c5899665ade97263692328eea4af106cristy        if (p == (const Quantum *) NULL)
64183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
64193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        bit=0;
64203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        byte=0;
64213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for (x=(int) canvas->columns-1; x >= 0; x--)
64223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
64233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          byte>>=1;
64244c08aed51c5899665ade97263692328eea4af106cristy          if (GetPixelAlpha(canvas,p) > (QuantumRange/2))
64253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            byte|=0x80;
64263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          bit++;
64273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (bit == 8)
64283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
64293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *q++=byte;
64303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              bit=0;
64313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              byte=0;
64323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
6433ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          p+=GetPixelChannels(canvas);
64343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
64353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (bit != 0)
64363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *q=byte >> (8-bit);
64373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q+=scanline_pad;
64383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
64393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
6440c57f694b2d04975a0e501613e34368c464708c19cristy  canvas_view=DestroyCacheView(canvas_view);
64413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (canvas != image)
64423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    canvas=DestroyImage(canvas);
64433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
64443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
64453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
64463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
64473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
64483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
64493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
64503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy+   X M a k e I m a g e M S B F i r s t                                       %
64513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
64523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
64533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
64543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
64553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
64563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XMakeImageMSBFirst() initializes the pixel data of an X11 Image.  The X
64573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  image pixels are copied in most-significant bit and byte first order.  The
64583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  server's scanline pad is also respected. Rather than using one or two
64593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  general cases, many special cases are found here to help speed up the image
64603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  conversion.
64613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
64623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XMakeImageMSBFirst method is:
64633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6464e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy%      XMakeImageMSBFirst(resource_info,window,image,ximage,matte_image,
6465e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy%        ExceptionInfo *exception)
64663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
64673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
64683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
64693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
64703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
64713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies a pointer to a XWindowInfo structure.
64723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
64733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image: the image.
64743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
64753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o ximage: Specifies a pointer to a XImage structure;  returned from
64763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XCreateImage.
64773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
64783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o matte_image: Specifies a pointer to a XImage structure;  returned from
64793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XCreateImage.
64803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6481e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy%    o exception: return any errors or warnings in this structure.
6482e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy%
64833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
64843ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void XMakeImageMSBFirst(const XResourceInfo *resource_info,
6485e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy  const XWindowInfo *window,Image *image,XImage *ximage,XImage *matte_image,
6486e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy  ExceptionInfo *exception)
64873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
6488c57f694b2d04975a0e501613e34368c464708c19cristy  CacheView
6489c57f694b2d04975a0e501613e34368c464708c19cristy    *canvas_view;
6490c57f694b2d04975a0e501613e34368c464708c19cristy
64913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image
64923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *canvas;
64933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
64943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
64953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y;
64963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
64973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register int
64983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x;
64993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
65004c08aed51c5899665ade97263692328eea4af106cristy  register const Quantum
65013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
65023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
65033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register unsigned char
65043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
65053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
65063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned char
65073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    bit,
65083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    byte;
65093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
65103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
65113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    scanline_pad;
65123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6513f2faecf9facdbbb14fcba373365f9f691a9658e0cristy  unsigned long
65143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel,
65153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *pixels;
65163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
65173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XStandardColormap
65183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *map_info;
65193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
65203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(resource_info != (XResourceInfo *) NULL);
65213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(window != (XWindowInfo *) NULL);
65223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image != (Image *) NULL);
65233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image->debug != MagickFalse)
65243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
65253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  canvas=image;
652654666e85e8e3b0eca47d318178a186ebb2901a73cristy  if ((window->immutable != MagickFalse) &&
65278a46d827a124555f0c48fb2368ec1bba8e079ab6cristy      (image->storage_class == DirectClass) && (image->alpha_trait == BlendPixelTrait))
65283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
65293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      char
65303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        size[MaxTextExtent];
65313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
65323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Image
65333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *pattern;
65343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
65353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ImageInfo
65363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *image_info;
65373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
65383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image_info=AcquireImageInfo();
65393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) CopyMagickString(image_info->filename,
65403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        resource_info->image_info->texture != (char *) NULL ?
65413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        resource_info->image_info->texture : "pattern:checkerboard",
65423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        MaxTextExtent);
6543b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy      (void) FormatLocaleString(size,MaxTextExtent,"%.20gx%.20g",(double)
6544e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy        image->columns,(double) image->rows);
65453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image_info->size=ConstantString(size);
65466710d8414f0ed06e4eaf9346366be72e2b4719efcristy      pattern=ReadImage(image_info,exception);
65473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image_info=DestroyImageInfo(image_info);
65483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (pattern != (Image *) NULL)
65493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
65506710d8414f0ed06e4eaf9346366be72e2b4719efcristy          canvas=CloneImage(image,0,0,MagickTrue,exception);
65513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (canvas != (Image *) NULL)
6552feb3e9695150978a5d2372d3fe2f60466a7c8066cristy            (void) CompositeImage(canvas,pattern,DstOverCompositeOp,MagickFalse,
6553feb3e9695150978a5d2372d3fe2f60466a7c8066cristy              0,0,exception);
65543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          pattern=DestroyImage(pattern);
65553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
65563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
65574c08aed51c5899665ade97263692328eea4af106cristy  scanline_pad=(unsigned int) (ximage->bytes_per_line-((ximage->width*
65584c08aed51c5899665ade97263692328eea4af106cristy    ximage->bits_per_pixel) >> 3));
65593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  map_info=window->map_info;
65603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixels=window->pixel_info->pixels;
65613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  q=(unsigned char *) ximage->data;
65623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  x=0;
656346ff2676b1044ea4101ac7a59b83289cd8f6cfdacristy  canvas_view=AcquireVirtualCacheView(canvas,exception);
65643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (ximage->format == XYBitmap)
65653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
65663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      register unsigned short
65673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        polarity;
65683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
65693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      unsigned char
65703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        background,
65713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        foreground;
65723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
65733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
65743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Convert canvas to big-endian bitmap.
65753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
65763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      background=(unsigned char)
65773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (XPixelIntensity(&window->pixel_info->foreground_color) <
65783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy         XPixelIntensity(&window->pixel_info->background_color) ?  0x01 : 0x00);
65793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      foreground=(unsigned char)
65803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (XPixelIntensity(&window->pixel_info->background_color) <
65813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy         XPixelIntensity(&window->pixel_info->foreground_color) ?  0x01 : 0x00);
6582101ab708b0574518ac5715da4d3915400e9df79acristy      polarity=(unsigned short) ((GetPixelInfoIntensity(
65836e963d8cbd0aebba1073d7f4b61e3d17177d6fedcristy        &canvas->colormap[0])) < (QuantumRange/2) ? 1 : 0);
65843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (canvas->colors == 2)
6585101ab708b0574518ac5715da4d3915400e9df79acristy        polarity=GetPixelInfoIntensity(&canvas->colormap[0]) <
6586101ab708b0574518ac5715da4d3915400e9df79acristy          GetPixelInfoIntensity(&canvas->colormap[1]);
65873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (y=0; y < (int) canvas->rows; y++)
65883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
6589c57f694b2d04975a0e501613e34368c464708c19cristy        p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,canvas->columns,1,
65906710d8414f0ed06e4eaf9346366be72e2b4719efcristy          exception);
65914c08aed51c5899665ade97263692328eea4af106cristy        if (p == (const Quantum *) NULL)
65923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
65933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        bit=0;
65943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        byte=0;
65953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for (x=(int) canvas->columns-1; x >= 0; x--)
65963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
65973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          byte<<=1;
65984c08aed51c5899665ade97263692328eea4af106cristy          if (GetPixelIndex(canvas,p) == (Quantum) polarity)
65993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            byte|=foreground;
66003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          else
66013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            byte|=background;
66023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          bit++;
66033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (bit == 8)
66043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
66053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *q++=byte;
66063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              bit=0;
66073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              byte=0;
66083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
6609ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          p+=GetPixelChannels(canvas);
66103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
66113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (bit != 0)
66123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *q=byte << (8-bit);
66133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q+=scanline_pad;
66143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
66153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
66163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
66173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (window->pixel_info->colors != 0)
66183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      switch (ximage->bits_per_pixel)
66193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
66203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 2:
66213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
66223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          register unsigned int
66233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            nibble;
66243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
66253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
66263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Convert to 2 bit color-mapped X canvas.
66273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
66283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (y=0; y < (int) canvas->rows; y++)
66293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
6630c57f694b2d04975a0e501613e34368c464708c19cristy            p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
66316710d8414f0ed06e4eaf9346366be72e2b4719efcristy              canvas->columns,1,exception);
66324c08aed51c5899665ade97263692328eea4af106cristy            if (p == (const Quantum *) NULL)
66333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
66343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            nibble=0;
66353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (x=0; x < (int) canvas->columns; x++)
66363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
66374c08aed51c5899665ade97263692328eea4af106cristy              pixel=pixels[(ssize_t)
66384c08aed51c5899665ade97263692328eea4af106cristy                GetPixelIndex(canvas,p)] & 0xf;
66393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              switch (nibble)
66403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
66413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 0:
66423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
66433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q=(unsigned char) (pixel << 6);
66443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble++;
66453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
66463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
66473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 1:
66483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
66493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q|=(unsigned char) (pixel << 4);
66503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble++;
66513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
66523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
66533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 2:
66543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
66553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q|=(unsigned char) (pixel << 2);
66563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble++;
66573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
66583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
66593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 3:
66603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
66613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q|=(unsigned char) pixel;
66623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  q++;
66633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble=0;
66643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
66653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
66663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
6667ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              p+=GetPixelChannels(canvas);
66683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
66693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q+=scanline_pad;
66703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
66713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
66723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
66733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 4:
66743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
66753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          register unsigned int
66763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            nibble;
66773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
66783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
66793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Convert to 4 bit color-mapped X canvas.
66803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
66813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (y=0; y < (int) canvas->rows; y++)
66823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
6683c57f694b2d04975a0e501613e34368c464708c19cristy            p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
66846710d8414f0ed06e4eaf9346366be72e2b4719efcristy              canvas->columns,1,exception);
66854c08aed51c5899665ade97263692328eea4af106cristy            if (p == (const Quantum *) NULL)
66863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
66873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            nibble=0;
66883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (x=0; x < (int) canvas->columns; x++)
66893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
66904c08aed51c5899665ade97263692328eea4af106cristy              pixel=pixels[(ssize_t)
66914c08aed51c5899665ade97263692328eea4af106cristy                GetPixelIndex(canvas,p)] & 0xf;
66923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              switch (nibble)
66933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
66943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 0:
66953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
66963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q=(unsigned char) (pixel << 4);
66973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble++;
66983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
66993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
67003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 1:
67013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
67023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q|=(unsigned char) pixel;
67033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  q++;
67043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble=0;
67053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
67063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
67073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
6708ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              p+=GetPixelChannels(canvas);
67093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
67103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q+=scanline_pad;
67113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
67123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
67133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
67143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 6:
67153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 8:
67163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
67173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
67183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Convert to 8 bit color-mapped X canvas.
67193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
67203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (resource_info->color_recovery &&
6721cbda611068350bf4459f2dda1951f8823702e129cristy              resource_info->quantize_info->dither_method != NoDitherMethod)
67223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
67236710d8414f0ed06e4eaf9346366be72e2b4719efcristy              XDitherImage(canvas,ximage,exception);
67243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
67253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
67263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (y=0; y < (int) canvas->rows; y++)
67273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
6728c57f694b2d04975a0e501613e34368c464708c19cristy            p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
67296710d8414f0ed06e4eaf9346366be72e2b4719efcristy              canvas->columns,1,exception);
67304c08aed51c5899665ade97263692328eea4af106cristy            if (p == (const Quantum *) NULL)
67313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
67323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (x=0; x < (int) canvas->columns; x++)
67333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
67346710d8414f0ed06e4eaf9346366be72e2b4719efcristy              pixel=pixels[(ssize_t) GetPixelIndex(canvas,p)];
67353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *q++=(unsigned char) pixel;
6736ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              p+=GetPixelChannels(canvas);
67373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
67383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q+=scanline_pad;
67393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
67403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
67413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
67423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        default:
67433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
67443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          register int
67453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            k;
67463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
67473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          register unsigned int
67483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            bytes_per_pixel;
67493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
67503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          unsigned char
6751bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            channel[sizeof(size_t)];
67523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
67533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
67543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Convert to 8 bit color-mapped X canvas.
67553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
67563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          bytes_per_pixel=(unsigned int) (ximage->bits_per_pixel >> 3);
67573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (y=0; y < (int) canvas->rows; y++)
67583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
6759c57f694b2d04975a0e501613e34368c464708c19cristy            p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
67606710d8414f0ed06e4eaf9346366be72e2b4719efcristy              canvas->columns,1,exception);
67614c08aed51c5899665ade97263692328eea4af106cristy            if (p == (const Quantum *) NULL)
67623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
67633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (x=0; x < (int) canvas->columns; x++)
67643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
67654c08aed51c5899665ade97263692328eea4af106cristy              pixel=pixels[(ssize_t)
67664c08aed51c5899665ade97263692328eea4af106cristy                GetPixelIndex(canvas,p)];
67673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              for (k=(int) bytes_per_pixel-1; k >= 0; k--)
67683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
67693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                channel[k]=(unsigned char) pixel;
67703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                pixel>>=8;
67713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
67723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              for (k=0; k < (int) bytes_per_pixel; k++)
67733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                *q++=channel[k];
6774ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              p+=GetPixelChannels(canvas);
67753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
67763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q+=scanline_pad;
67773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
67783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
67793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
67803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
67813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    else
67823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      switch (ximage->bits_per_pixel)
67833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
67843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 2:
67853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
67863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          register unsigned int
67873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            nibble;
67883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
67893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
67903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Convert to 4 bit continuous-tone X canvas.
67913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
67923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (y=0; y < (int) canvas->rows; y++)
67933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
6794c57f694b2d04975a0e501613e34368c464708c19cristy            p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
67956710d8414f0ed06e4eaf9346366be72e2b4719efcristy              canvas->columns,1,exception);
67964c08aed51c5899665ade97263692328eea4af106cristy            if (p == (const Quantum *) NULL)
67973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
67983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            nibble=0;
67993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (x=(int) canvas->columns-1; x >= 0; x--)
68003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
68014c08aed51c5899665ade97263692328eea4af106cristy              pixel=XGammaPixel(canvas,map_info,p);
68023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              pixel&=0xf;
68033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              switch (nibble)
68043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
68053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 0:
68063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
68073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q=(unsigned char) (pixel << 6);
68083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble++;
68093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
68103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
68113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 1:
68123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
68133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q|=(unsigned char) (pixel << 4);
68143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble++;
68153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
68163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
68173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 2:
68183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
68193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q|=(unsigned char) (pixel << 2);
68203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble++;
68213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
68223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
68233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 3:
68243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
68253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q|=(unsigned char) pixel;
68263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  q++;
68273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble=0;
68283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
68293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
68303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
6831ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              p+=GetPixelChannels(canvas);
68323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
68333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q+=scanline_pad;
68343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
68353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
68363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
68373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 4:
68383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
68393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          register unsigned int
68403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            nibble;
68413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
68423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
68433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Convert to 4 bit continuous-tone X canvas.
68443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
68453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (y=0; y < (int) canvas->rows; y++)
68463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
6847c57f694b2d04975a0e501613e34368c464708c19cristy            p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
68486710d8414f0ed06e4eaf9346366be72e2b4719efcristy              canvas->columns,1,exception);
68494c08aed51c5899665ade97263692328eea4af106cristy            if (p == (const Quantum *) NULL)
68503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
68513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            nibble=0;
68523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (x=(int) canvas->columns-1; x >= 0; x--)
68533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
68544c08aed51c5899665ade97263692328eea4af106cristy              pixel=XGammaPixel(canvas,map_info,p);
68553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              pixel&=0xf;
68563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              switch (nibble)
68573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
68583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 0:
68593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
68603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q=(unsigned char) (pixel << 4);
68613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble++;
68623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
68633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
68643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                case 1:
68653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
68663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q|=(unsigned char) pixel;
68673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  q++;
68683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  nibble=0;
68693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
68703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
68713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
6872ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              p+=GetPixelChannels(canvas);
68733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
68743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q+=scanline_pad;
68753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
68763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
68773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
68783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 6:
68793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case 8:
68803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
68813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
68823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Convert to 8 bit continuous-tone X canvas.
68833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
68843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (resource_info->color_recovery &&
6885cbda611068350bf4459f2dda1951f8823702e129cristy              resource_info->quantize_info->dither_method != NoDitherMethod)
68863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
68876710d8414f0ed06e4eaf9346366be72e2b4719efcristy              XDitherImage(canvas,ximage,exception);
68883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
68893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
68903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (y=0; y < (int) canvas->rows; y++)
68913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
6892c57f694b2d04975a0e501613e34368c464708c19cristy            p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
68936710d8414f0ed06e4eaf9346366be72e2b4719efcristy              canvas->columns,1,exception);
68944c08aed51c5899665ade97263692328eea4af106cristy            if (p == (const Quantum *) NULL)
68953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
68963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (x=(int) canvas->columns-1; x >= 0; x--)
68973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
68984c08aed51c5899665ade97263692328eea4af106cristy              pixel=XGammaPixel(canvas,map_info,p);
68993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *q++=(unsigned char) pixel;
6900ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              p+=GetPixelChannels(canvas);
69013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
69023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q+=scanline_pad;
69033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
69043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
69053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
69063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        default:
69073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
69083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((ximage->bits_per_pixel == 32) && (map_info->red_max == 255) &&
69093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (map_info->green_max == 255) && (map_info->blue_max == 255) &&
69103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (map_info->red_mult == 65536L) && (map_info->green_mult == 256) &&
69113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (map_info->blue_mult == 1))
69123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
69133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
69143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Convert to 32 bit continuous-tone X canvas.
69153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
69163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              for (y=0; y < (int) canvas->rows; y++)
69173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
6918c57f694b2d04975a0e501613e34368c464708c19cristy                p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
69196710d8414f0ed06e4eaf9346366be72e2b4719efcristy                  canvas->columns,1,exception);
69204c08aed51c5899665ade97263692328eea4af106cristy                if (p == (const Quantum *) NULL)
69213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
69223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if ((red_gamma != 1.0) || (green_gamma != 1.0) ||
69233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    (blue_gamma != 1.0))
69243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  {
69253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    /*
69263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      Gamma correct canvas.
69273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    */
69283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    for (x=(int) canvas->columns-1; x >= 0; x--)
69293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    {
69303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      *q++=0;
6931ccf844f01bcfb63e8c6260bc986878089bb4c85bcristy                      *q++=ScaleQuantumToChar(XRedGamma(
69324c08aed51c5899665ade97263692328eea4af106cristy                        GetPixelRed(canvas,p)));
6933ccf844f01bcfb63e8c6260bc986878089bb4c85bcristy                      *q++=ScaleQuantumToChar(XGreenGamma(
69344c08aed51c5899665ade97263692328eea4af106cristy                        GetPixelGreen(canvas,p)));
6935ccf844f01bcfb63e8c6260bc986878089bb4c85bcristy                      *q++=ScaleQuantumToChar(XBlueGamma(
69364c08aed51c5899665ade97263692328eea4af106cristy                        GetPixelBlue(canvas,p)));
6937ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy                      p+=GetPixelChannels(canvas);
69383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    }
69393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    continue;
69403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  }
69413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                for (x=(int) canvas->columns-1; x >= 0; x--)
69423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
69433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q++=0;
69448bc259be59a7cde483c27474125272a7d65c5744cristy                  *q++=ScaleQuantumToChar((Quantum) GetPixelRed(canvas,p));
69458bc259be59a7cde483c27474125272a7d65c5744cristy                  *q++=ScaleQuantumToChar((Quantum) GetPixelGreen(canvas,p));
69468bc259be59a7cde483c27474125272a7d65c5744cristy                  *q++=ScaleQuantumToChar((Quantum) GetPixelBlue(canvas,p));
6947ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy                  p+=GetPixelChannels(canvas);
69483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
69493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
69503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
69513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          else
69523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if ((ximage->bits_per_pixel == 32) && (map_info->red_max == 255) &&
69533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (map_info->green_max == 255) && (map_info->blue_max == 255) &&
69543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (map_info->red_mult == 1) && (map_info->green_mult == 256) &&
69553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (map_info->blue_mult == 65536L))
69563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
69573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /*
69583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  Convert to 32 bit continuous-tone X canvas.
69593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                */
69603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                for (y=0; y < (int) canvas->rows; y++)
69613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
6962c57f694b2d04975a0e501613e34368c464708c19cristy                  p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
69636710d8414f0ed06e4eaf9346366be72e2b4719efcristy                    canvas->columns,1,exception);
69644c08aed51c5899665ade97263692328eea4af106cristy                  if (p == (const Quantum *) NULL)
69653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    break;
69663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  if ((red_gamma != 1.0) || (green_gamma != 1.0) ||
69673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      (blue_gamma != 1.0))
69683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    {
69693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      /*
69703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        Gamma correct canvas.
69713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      */
69723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      for (x=(int) canvas->columns-1; x >= 0; x--)
69733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      {
69743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        *q++=0;
6975ccf844f01bcfb63e8c6260bc986878089bb4c85bcristy                        *q++=ScaleQuantumToChar(XBlueGamma(
69764c08aed51c5899665ade97263692328eea4af106cristy                          GetPixelBlue(canvas,p)));
6977ccf844f01bcfb63e8c6260bc986878089bb4c85bcristy                        *q++=ScaleQuantumToChar(XGreenGamma(
69784c08aed51c5899665ade97263692328eea4af106cristy                          GetPixelGreen(canvas,p)));
6979ccf844f01bcfb63e8c6260bc986878089bb4c85bcristy                        *q++=ScaleQuantumToChar(XRedGamma(
69804c08aed51c5899665ade97263692328eea4af106cristy                          GetPixelRed(canvas,p)));
6981ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy                        p+=GetPixelChannels(canvas);
69823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      }
69833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      continue;
69843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    }
69853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  for (x=(int) canvas->columns-1; x >= 0; x--)
69863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  {
69873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    *q++=0;
69888bc259be59a7cde483c27474125272a7d65c5744cristy                    *q++=ScaleQuantumToChar((Quantum) GetPixelBlue(canvas,p));
69898bc259be59a7cde483c27474125272a7d65c5744cristy                    *q++=ScaleQuantumToChar((Quantum) GetPixelGreen(canvas,p));
69908bc259be59a7cde483c27474125272a7d65c5744cristy                    *q++=ScaleQuantumToChar((Quantum) GetPixelRed(canvas,p));
6991ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy                    p+=GetPixelChannels(canvas);
69923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  }
69933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
69943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
69953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            else
69963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
69973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                register int
69983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  k;
69993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
70003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                register unsigned int
70013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  bytes_per_pixel;
70023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
70033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                unsigned char
7004bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy                  channel[sizeof(size_t)];
70053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
70063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /*
70073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  Convert to multi-byte continuous-tone X canvas.
70083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                */
70093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                bytes_per_pixel=(unsigned int) (ximage->bits_per_pixel >> 3);
70103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                for (y=0; y < (int) canvas->rows; y++)
70113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
7012c57f694b2d04975a0e501613e34368c464708c19cristy                  p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
70136710d8414f0ed06e4eaf9346366be72e2b4719efcristy                    canvas->columns,1,exception);
70144c08aed51c5899665ade97263692328eea4af106cristy                  if (p == (const Quantum *) NULL)
70153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    break;
70163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  for (x=(int) canvas->columns-1; x >= 0; x--)
70173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  {
70184c08aed51c5899665ade97263692328eea4af106cristy                    pixel=XGammaPixel(canvas,map_info,p);
70193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    for (k=(int) bytes_per_pixel-1; k >= 0; k--)
70203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    {
70213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      channel[k]=(unsigned char) pixel;
70223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      pixel>>=8;
70233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    }
70243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    for (k=0; k < (int) bytes_per_pixel; k++)
70253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      *q++=channel[k];
7026ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy                    p+=GetPixelChannels(canvas);
70273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  }
70283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  q+=scanline_pad;
70293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
70303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
70313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
70323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
70333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
70343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (matte_image != (XImage *) NULL)
70353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
70363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
70373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Initialize matte canvas.
70383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
70393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      scanline_pad=(unsigned int) (matte_image->bytes_per_line-
70403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ((matte_image->width*matte_image->bits_per_pixel) >> 3));
70413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      q=(unsigned char *) matte_image->data;
70423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (y=0; y < (int) canvas->rows; y++)
70433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
7044c57f694b2d04975a0e501613e34368c464708c19cristy        p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,canvas->columns,1,
70456710d8414f0ed06e4eaf9346366be72e2b4719efcristy          exception);
70464c08aed51c5899665ade97263692328eea4af106cristy        if (p == (const Quantum *) NULL)
70473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
70483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        bit=0;
70493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        byte=0;
70503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for (x=(int) canvas->columns-1; x >= 0; x--)
70513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
70523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          byte<<=1;
70534c08aed51c5899665ade97263692328eea4af106cristy          if (GetPixelAlpha(canvas,p) > (QuantumRange/2))
70543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            byte|=0x01;
70553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          bit++;
70563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (bit == 8)
70573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
70583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *q++=byte;
70593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              bit=0;
70603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              byte=0;
70613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
7062ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          p+=GetPixelChannels(canvas);
70633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
70643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (bit != 0)
70653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *q=byte << (8-bit);
70663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q+=scanline_pad;
70673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
70683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
7069c57f694b2d04975a0e501613e34368c464708c19cristy  canvas_view=DestroyCacheView(canvas_view);
70703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (canvas != image)
70713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    canvas=DestroyImage(canvas);
70723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
70733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
70743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
70753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
70763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
70773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
70783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
70793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X M a k e M a g n i f y I m a g e                                         %
70803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
70813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
70823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
70833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
70843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
70853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XMakeMagnifyImage() magnifies a region of an X image and displays it.
70863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
70873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XMakeMagnifyImage method is:
70883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
70896710d8414f0ed06e4eaf9346366be72e2b4719efcristy%      void XMakeMagnifyImage(Display *display,XWindows *windows,
70906710d8414f0ed06e4eaf9346366be72e2b4719efcristy%        ExceptionInfo *exception)
70913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
70923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
70933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
70943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
70953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
70963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
70973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o windows: Specifies a pointer to a XWindows structure.
70983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
70996710d8414f0ed06e4eaf9346366be72e2b4719efcristy%    o exception: return any errors or warnings in this structure.
71006710d8414f0ed06e4eaf9346366be72e2b4719efcristy%
71013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
71026710d8414f0ed06e4eaf9346366be72e2b4719efcristyMagickPrivate void XMakeMagnifyImage(Display *display,XWindows *windows,
71036710d8414f0ed06e4eaf9346366be72e2b4719efcristy  ExceptionInfo *exception)
71043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
71053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
71063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    tuple[MaxTextExtent];
71073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
71083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
71093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y;
71103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
71114c08aed51c5899665ade97263692328eea4af106cristy  PixelInfo
71123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel;
71133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
71143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register int
71153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x;
71163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7117bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
71183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
71193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
71203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register unsigned char
71213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p,
71223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
71233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
71249d314ff2c17a77996c05413c2013880387e50f0ecristy  ssize_t
71259d314ff2c17a77996c05413c2013880387e50f0ecristy    n;
71269d314ff2c17a77996c05413c2013880387e50f0ecristy
71273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static unsigned int
71283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    previous_magnify = 0;
71293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
71303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static XWindowInfo
71313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    magnify_window;
71323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
71333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
71343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    height,
71353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    j,
71363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    k,
71373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    l,
71383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    magnify,
71393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    scanline_pad,
71403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width;
71413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
71423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XImage
71433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *ximage;
71443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
71453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
71463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Check boundary conditions.
71473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
71483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
71493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
71503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(windows != (XWindows *) NULL);
71513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magnify=1;
7152bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  for (n=1; n < (ssize_t) windows->magnify.data; n++)
71533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    magnify<<=1;
71543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while ((magnify*windows->image.ximage->width) < windows->magnify.width)
71553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    magnify<<=1;
71563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while ((magnify*windows->image.ximage->height) < windows->magnify.height)
71573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    magnify<<=1;
71583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while (magnify > windows->magnify.width)
71593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    magnify>>=1;
71603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while (magnify > windows->magnify.height)
71613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    magnify>>=1;
71623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (magnify != previous_magnify)
71633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
71643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Status
71653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        status;
71663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
71673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XTextProperty
71683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        window_name;
71693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
71703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
71713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        New magnify factor:  update magnify window name.
71723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
71733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      i=0;
71743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      while ((1 << i) <= (int) magnify)
71753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        i++;
7176b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy      (void) FormatLocaleString(windows->magnify.name,MaxTextExtent,
7177e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy        "Magnify %.20gX",(double) i);
71783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=XStringListToTextProperty(&windows->magnify.name,1,&window_name);
71793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (status != False)
71803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
71813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          XSetWMName(display,windows->magnify.id,&window_name);
71823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          XSetWMIconName(display,windows->magnify.id,&window_name);
71833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) XFree((void *) window_name.value);
71843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
71853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
71863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  previous_magnify=magnify;
71873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ximage=windows->image.ximage;
71883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  width=(unsigned int) windows->magnify.ximage->width;
71893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  height=(unsigned int) windows->magnify.ximage->height;
71903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((windows->magnify.x < 0) ||
71913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (windows->magnify.x >= windows->image.ximage->width))
71923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    windows->magnify.x=windows->image.ximage->width >> 1;
71933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  x=windows->magnify.x-((width/magnify) >> 1);
71943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (x < 0)
71953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x=0;
71963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
71973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (x > (int) (ximage->width-(width/magnify)))
71983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      x=ximage->width-width/magnify;
71993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((windows->magnify.y < 0) ||
72003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (windows->magnify.y >= windows->image.ximage->height))
72013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    windows->magnify.y=windows->image.ximage->height >> 1;
72023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  y=windows->magnify.y-((height/magnify) >> 1);
72033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (y < 0)
72043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y=0;
72053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
72063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (y > (int) (ximage->height-(height/magnify)))
72073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      y=ximage->height-height/magnify;
72083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  q=(unsigned char *) windows->magnify.ximage->data;
72093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  scanline_pad=(unsigned int) (windows->magnify.ximage->bytes_per_line-
72103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ((width*windows->magnify.ximage->bits_per_pixel) >> 3));
72113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (ximage->bits_per_pixel < 8)
72123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
72133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      register unsigned char
72143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        background,
72153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        byte,
72163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        foreground,
72173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        p_bit,
72183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q_bit;
72193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
72203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      register unsigned int
72213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        plane;
72223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
72233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XPixelInfo
72243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *pixel_info;
72253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
72263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      pixel_info=windows->magnify.pixel_info;
72273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      switch (ximage->bitmap_bit_order)
72283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
72293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case LSBFirst:
72303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
72313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
72323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Magnify little-endian bitmap.
72333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
72343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          background=0x00;
72353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          foreground=0x80;
72363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (ximage->format == XYBitmap)
72373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
72383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              background=(unsigned char)
72393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (XPixelIntensity(&pixel_info->foreground_color) <
72403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                 XPixelIntensity(&pixel_info->background_color) ?  0x80 : 0x00);
72413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              foreground=(unsigned char)
72423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (XPixelIntensity(&pixel_info->background_color) <
72433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                 XPixelIntensity(&pixel_info->foreground_color) ?  0x80 : 0x00);
72443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (windows->magnify.depth > 1)
72453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Swap(background,foreground);
72463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
7247bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy          for (i=0; i < (ssize_t) height; i+=magnify)
72483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
72493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
72503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Propogate pixel magnify rows.
72513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
72523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (j=0; j < magnify; j++)
72533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
72543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              p=(unsigned char *) ximage->data+y*ximage->bytes_per_line+
72553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                ((x*ximage->bits_per_pixel) >> 3);
72563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              p_bit=(unsigned char) (x*ximage->bits_per_pixel) & 0x07;
72573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              q_bit=0;
72583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              byte=0;
72593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              for (k=0; k < width; k+=magnify)
72603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
72613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /*
72623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  Propogate pixel magnify columns.
72633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                */
72643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                for (l=0; l < magnify; l++)
72653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
72663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  /*
72673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    Propogate each bit plane.
72683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  */
72693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  for (plane=0; (int) plane < ximage->bits_per_pixel; plane++)
72703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  {
72713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    byte>>=1;
72723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    if (*p & (0x01 << (p_bit+plane)))
72733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      byte|=foreground;
72743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    else
72753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      byte|=background;
72763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    q_bit++;
72773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    if (q_bit == 8)
72783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      {
72793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        *q++=byte;
72803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        q_bit=0;
72813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        byte=0;
72823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      }
72833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  }
72843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
72853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                p_bit+=ximage->bits_per_pixel;
72863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if (p_bit == 8)
72873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  {
72883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    p++;
72893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    p_bit=0;
72903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  }
72913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if (q_bit != 0)
72923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q=byte >> (8-q_bit);
72933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                q+=scanline_pad;
72943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
72953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
72963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            y++;
72973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
72983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
72993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
73003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        case MSBFirst:
73013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        default:
73023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
73033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
73043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Magnify big-endian bitmap.
73053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
73063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          background=0x00;
73073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          foreground=0x01;
73083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (ximage->format == XYBitmap)
73093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
73103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              background=(unsigned char)
73113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (XPixelIntensity(&pixel_info->foreground_color) <
73123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                 XPixelIntensity(&pixel_info->background_color) ?  0x01 : 0x00);
73133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              foreground=(unsigned char)
73143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (XPixelIntensity(&pixel_info->background_color) <
73153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                 XPixelIntensity(&pixel_info->foreground_color) ?  0x01 : 0x00);
73163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (windows->magnify.depth > 1)
73173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Swap(background,foreground);
73183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
7319bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy          for (i=0; i < (ssize_t) height; i+=magnify)
73203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
73213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
73223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Propogate pixel magnify rows.
73233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
73243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (j=0; j < magnify; j++)
73253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
73263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              p=(unsigned char *) ximage->data+y*ximage->bytes_per_line+
73273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                ((x*ximage->bits_per_pixel) >> 3);
73283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              p_bit=(unsigned char) (x*ximage->bits_per_pixel) & 0x07;
73293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              q_bit=0;
73303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              byte=0;
73313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              for (k=0; k < width; k+=magnify)
73323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
73333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /*
73343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  Propogate pixel magnify columns.
73353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                */
73363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                for (l=0; l < magnify; l++)
73373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
73383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  /*
73393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    Propogate each bit plane.
73403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  */
73413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  for (plane=0; (int) plane < ximage->bits_per_pixel; plane++)
73423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  {
73433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    byte<<=1;
73443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    if (*p & (0x80 >> (p_bit+plane)))
73453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      byte|=foreground;
73463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    else
73473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      byte|=background;
73483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    q_bit++;
73493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    if (q_bit == 8)
73503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      {
73513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        *q++=byte;
73523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        q_bit=0;
73533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        byte=0;
73543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      }
73553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  }
73563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
73573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                p_bit+=ximage->bits_per_pixel;
73583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if (p_bit == 8)
73593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  {
73603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    p++;
73613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    p_bit=0;
73623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  }
73633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if (q_bit != 0)
73643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q=byte << (8-q_bit);
73653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                q+=scanline_pad;
73663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
73673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
73683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            y++;
73693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
73703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
73713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
73723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
73733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
73743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
73753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    switch (ximage->bits_per_pixel)
73763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
73773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 6:
73783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 8:
73793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
73803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
73813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Magnify 8 bit X image.
73823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
7383bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (i=0; i < (ssize_t) height; i+=magnify)
73843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
73853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
73863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Propogate pixel magnify rows.
73873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
73883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (j=0; j < magnify; j++)
73893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
73903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            p=(unsigned char *) ximage->data+y*ximage->bytes_per_line+
73913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              ((x*ximage->bits_per_pixel) >> 3);
73923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (k=0; k < width; k+=magnify)
73933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
73943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
73953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Propogate pixel magnify columns.
73963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
73973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              for (l=0; l < magnify; l++)
73983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                *q++=(*p);
73993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              p++;
74003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
74013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q+=scanline_pad;
74023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
74033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          y++;
74043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
74053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
74063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
74073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      default:
74083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
74093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        register unsigned int
74103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          bytes_per_pixel,
74113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          m;
74123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
74133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
74143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Magnify multi-byte X image.
74153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
74163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        bytes_per_pixel=(unsigned int) ximage->bits_per_pixel >> 3;
7417bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (i=0; i < (ssize_t) height; i+=magnify)
74183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
74193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
74203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Propogate pixel magnify rows.
74213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
74223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (j=0; j < magnify; j++)
74233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
74243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            p=(unsigned char *) ximage->data+y*ximage->bytes_per_line+
74253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              ((x*ximage->bits_per_pixel) >> 3);
74263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (k=0; k < width; k+=magnify)
74273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
74283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
74293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Propogate pixel magnify columns.
74303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
74313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              for (l=0; l < magnify; l++)
74323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                for (m=0; m < bytes_per_pixel; m++)
74333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *q++=(*(p+m));
74343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              p+=bytes_per_pixel;
74353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
74363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q+=scanline_pad;
74373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
74383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          y++;
74393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
74403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
74413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
74423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
74433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
74443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Copy X image to magnify pixmap.
74453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
74463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  x=windows->magnify.x-((width/magnify) >> 1);
74473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (x < 0)
74483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x=(int) ((width >> 1)-windows->magnify.x*magnify);
74493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
74503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (x > (int) (ximage->width-(width/magnify)))
74513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      x=(int) ((ximage->width-windows->magnify.x)*magnify-(width >> 1));
74523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    else
74533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      x=0;
74543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  y=windows->magnify.y-((height/magnify) >> 1);
74553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (y < 0)
74563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y=(int) ((height >> 1)-windows->magnify.y*magnify);
74573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
74583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (y > (int) (ximage->height-(height/magnify)))
74593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      y=(int) ((ximage->height-windows->magnify.y)*magnify-(height >> 1));
74603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    else
74613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      y=0;
74623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((x != 0) || (y != 0))
74633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XFillRectangle(display,windows->magnify.pixmap,
74643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      windows->magnify.annotate_context,0,0,width,height);
74653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XPutImage(display,windows->magnify.pixmap,
74663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    windows->magnify.annotate_context,windows->magnify.ximage,0,0,x,y,width-x,
74673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    height-y);
74683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((magnify > 1) && ((magnify <= (width >> 1)) &&
74693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (magnify <= (height >> 1))))
74703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
74713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      RectangleInfo
74723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        highlight_info;
74733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
74743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
74753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Highlight center pixel.
74763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
7477bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      highlight_info.x=(ssize_t) windows->magnify.width >> 1;
7478bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      highlight_info.y=(ssize_t) windows->magnify.height >> 1;
74793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      highlight_info.width=magnify;
74803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      highlight_info.height=magnify;
74813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XDrawRectangle(display,windows->magnify.pixmap,
74823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->magnify.highlight_context,(int) highlight_info.x,
74833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (int) highlight_info.y,(unsigned int) highlight_info.width-1,
74843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (unsigned int) highlight_info.height-1);
74853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (magnify > 2)
74863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XDrawRectangle(display,windows->magnify.pixmap,
74873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          windows->magnify.annotate_context,(int) highlight_info.x+1,
74883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (int) highlight_info.y+1,(unsigned int) highlight_info.width-3,
74893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (unsigned int) highlight_info.height-3);
74903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
74913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
74923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Show center pixel color.
74933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
74943aa9375ebfc21a5356d6b1754bcd1b162ad666c4cristy  (void) GetOneVirtualPixelInfo(windows->image.image,TileVirtualPixelMethod,
74955201002e1ba0118594060d26142b48bdfb1320a2cristy    (ssize_t) windows->magnify.x,(ssize_t) windows->magnify.y,&pixel,exception);
7496b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleString(tuple,MaxTextExtent,"%d,%d: ",
74973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    windows->magnify.x,windows->magnify.y);
74983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ConcatenateMagickString(tuple,"(",MaxTextExtent);
7499ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy  ConcatenateColorComponent(&pixel,RedPixelChannel,X11Compliance,tuple);
75003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ConcatenateMagickString(tuple,",",MaxTextExtent);
7501ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy  ConcatenateColorComponent(&pixel,GreenPixelChannel,X11Compliance,tuple);
75023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ConcatenateMagickString(tuple,",",MaxTextExtent);
7503ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy  ConcatenateColorComponent(&pixel,BluePixelChannel,X11Compliance,tuple);
75043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (pixel.colorspace == CMYKColorspace)
75053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
75063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) ConcatenateMagickString(tuple,",",MaxTextExtent);
7507ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy      ConcatenateColorComponent(&pixel,BlackPixelChannel,X11Compliance,tuple);
75083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
75098a46d827a124555f0c48fb2368ec1bba8e079ab6cristy  if (pixel.alpha_trait == BlendPixelTrait)
75103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
75113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) ConcatenateMagickString(tuple,",",MaxTextExtent);
7512ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy      ConcatenateColorComponent(&pixel,AlphaPixelChannel,X11Compliance,tuple);
75133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
75143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ConcatenateMagickString(tuple,")",MaxTextExtent);
75153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  height=(unsigned int) windows->magnify.font_info->ascent+
75163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    windows->magnify.font_info->descent;
75173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  x=windows->magnify.font_info->max_bounds.width >> 1;
75183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  y=windows->magnify.font_info->ascent+(height >> 2);
75193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XDrawImageString(display,windows->magnify.pixmap,
75203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    windows->magnify.annotate_context,x,y,tuple,(int) strlen(tuple));
75213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  GetColorTuple(&pixel,MagickTrue,tuple);
75223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  y+=height;
75233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XDrawImageString(display,windows->magnify.pixmap,
75243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    windows->magnify.annotate_context,x,y,tuple,(int) strlen(tuple));
7525269c9413034627692b2a7d0a352f9dee4e8eada8cristy  (void) QueryColorname(windows->image.image,&pixel,SVGCompliance,tuple,
75266710d8414f0ed06e4eaf9346366be72e2b4719efcristy    exception);
75273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  y+=height;
75283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XDrawImageString(display,windows->magnify.pixmap,
75293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    windows->magnify.annotate_context,x,y,tuple,(int) strlen(tuple));
75303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
75313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Refresh magnify window.
75323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
75333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magnify_window=windows->magnify;
75343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magnify_window.x=0;
75353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  magnify_window.y=0;
75363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XRefreshWindow(display,&magnify_window,(XEvent *) NULL);
75373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
75383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
75393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
75403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
75413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
75423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
75433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
75443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X M a k e P i x m a p                                                     %
75453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
75463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
75473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
75483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
75493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
75503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XMakePixmap() creates an X11 pixmap.
75513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
75523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XMakePixmap method is:
75533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
75543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XMakeStandardColormap(Display *display,XVisualInfo *visual_info,
75553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        XResourceInfo *resource_info,Image *image,XStandardColormap *map_info,
75563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        XPixelInfo *pixel)
75573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
75583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
75593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
75603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
75613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
75623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server; returned from
75633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
75643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
75653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies a pointer to a XWindowInfo structure.
75663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
75673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
75683ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType XMakePixmap(Display *display,
75693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const XResourceInfo *resource_info,XWindowInfo *window)
75703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
75713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
75723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    height,
75733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width;
75743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
75753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
75763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
75773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(resource_info != (XResourceInfo *) NULL);
75783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(window != (XWindowInfo  *) NULL);
75793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->pixmap != (Pixmap) NULL)
75803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
75813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
75823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Destroy previous X pixmap.
75833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
75843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XFreePixmap(display,window->pixmap);
75853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window->pixmap=(Pixmap) NULL;
75863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
75873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->use_pixmap == MagickFalse)
75883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
75893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->ximage == (XImage *) NULL)
75903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
75913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
75923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Display busy cursor.
75933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
75943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XCheckDefineCursor(display,window->id,window->busy_cursor);
75953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFlush(display);
75963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
75973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Create pixmap.
75983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
75993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  width=(unsigned int) window->ximage->width;
76003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  height=(unsigned int) window->ximage->height;
76013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window->pixmap=XCreatePixmap(display,window->id,width,height,window->depth);
76023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->pixmap == (Pixmap) NULL)
76033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
76043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
76053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Unable to allocate pixmap.
76063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
76073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XCheckDefineCursor(display,window->id,window->cursor);
76083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return(MagickFalse);
76093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
76103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
76113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Copy X image to pixmap.
76123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
76133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
76143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->shared_memory)
76153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XShmPutImage(display,window->pixmap,window->annotate_context,
76163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window->ximage,0,0,0,0,width,height,MagickTrue);
76173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
76183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->shared_memory == MagickFalse)
76193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XPutImage(display,window->pixmap,window->annotate_context,
76203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window->ximage,0,0,0,0,width,height);
76213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (IsEventLogging())
76223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
76233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"Pixmap:");
76243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"  width, height: %ux%u",
76253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        width,height);
76263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
76273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
76283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Restore cursor.
76293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
76303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XCheckDefineCursor(display,window->id,window->cursor);
76313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickTrue);
76323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
76333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
76343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
76353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
76363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
76373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
76383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
76393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X M a k e S t a n d a r d C o l o r m a p                                 %
76403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
76413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
76423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
76433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
76443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
76453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XMakeStandardColormap() creates an X11 Standard Colormap.
76463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
76473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XMakeStandardColormap method is:
76483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
76496710d8414f0ed06e4eaf9346366be72e2b4719efcristy%      void XMakeStandardColormap(Display *display,XVisualInfo *visual_info,
76506710d8414f0ed06e4eaf9346366be72e2b4719efcristy%        XResourceInfo *resource_info,Image *image,XStandardColormap *map_info,
76516710d8414f0ed06e4eaf9346366be72e2b4719efcristy%        XPixelInfo *pixel,ExceptionInfo *exception)
76523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
76533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
76543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
76553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server; returned from
76563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
76573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
76583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o visual_info: Specifies a pointer to a X11 XVisualInfo structure;
76593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      returned from XGetVisualInfo.
76603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
76613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
76623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
76633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image: the image.
76643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
76653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o map_info: If a Standard Colormap type is specified, this structure is
76663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      initialized with info from the Standard Colormap.
76673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
76683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o pixel: Specifies a pointer to a XPixelInfo structure.
76693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
76706710d8414f0ed06e4eaf9346366be72e2b4719efcristy%    o exception: return any errors or warnings in this structure.
76716710d8414f0ed06e4eaf9346366be72e2b4719efcristy%
76723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
76733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
76743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus)
76753ed852eea50f9d4cd633efb8c2b054b8e33c253cristyextern "C" {
76763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
76773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7678a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristystatic inline double DiversityPixelIntensity(
76793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const DiversityPacket *pixel)
76803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
7681a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  double
76823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    intensity;
76833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7684a86a5cb565b7120f58b377f95e606867f28b08fecristy  intensity=0.298839f*pixel->red+0.586811f*pixel->green+0.114350f*pixel->blue;
76853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(intensity);
76863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
76873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
76883ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic int IntensityCompare(const void *x,const void *y)
76893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
76903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  DiversityPacket
76913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *color_1,
76923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *color_2;
76933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
76943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
76953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    diversity;
76963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
76973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  color_1=(DiversityPacket *) x;
76983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  color_2=(DiversityPacket *) y;
76993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  diversity=(int) (DiversityPixelIntensity(color_2)-
77003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    DiversityPixelIntensity(color_1));
77013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(diversity);
77023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
77033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
77043ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic int PopularityCompare(const void *x,const void *y)
77053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
77063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  DiversityPacket
77073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *color_1,
77083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *color_2;
77093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
77103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  color_1=(DiversityPacket *) x;
77113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  color_2=(DiversityPacket *) y;
77123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return((int) color_2->count-(int) color_1->count);
77133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
77143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
77153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus)
77163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
77173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
77183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7719bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristystatic inline Quantum ScaleXToQuantum(const size_t x,
7720bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  const size_t scale)
77213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
7722a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  return((Quantum) (((double) QuantumRange*x)/scale+0.5));
77233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
77243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7725bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XMakeStandardColormap(Display *display,
77263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XVisualInfo *visual_info,XResourceInfo *resource_info,Image *image,
77276710d8414f0ed06e4eaf9346366be72e2b4719efcristy  XStandardColormap *map_info,XPixelInfo *pixel,ExceptionInfo *exception)
77283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
77293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Colormap
77303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    colormap;
77313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7732bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
77333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
77343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
77353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
77363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
77373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7738bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
77393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_colors,
77403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    retain_colors;
77413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
77423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned short
77433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    gray_value;
77443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
77453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XColor
77463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    color,
77473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *colors,
77483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
77493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
77503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
77513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
77523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(visual_info != (XVisualInfo *) NULL);
77533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(map_info != (XStandardColormap *) NULL);
77543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(resource_info != (XResourceInfo *) NULL);
77553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(pixel != (XPixelInfo *) NULL);
77563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (resource_info->map_type != (char *) NULL)
77573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
77583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
77593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Standard Colormap is already defined (i.e. xstdcmap).
77603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
77614c08aed51c5899665ade97263692328eea4af106cristy      XGetPixelInfo(display,visual_info,map_info,resource_info,image,
77623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        pixel);
77633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      number_colors=(unsigned int) (map_info->base_pixel+
77643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (map_info->red_max+1)*(map_info->green_max+1)*(map_info->blue_max+1));
77653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((map_info->red_max*map_info->green_max*map_info->blue_max) != 0)
77668a46d827a124555f0c48fb2368ec1bba8e079ab6cristy        if ((image->alpha_trait != BlendPixelTrait) &&
77673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (resource_info->color_recovery == MagickFalse) &&
7768cbda611068350bf4459f2dda1951f8823702e129cristy            (resource_info->quantize_info->dither_method != NoDitherMethod) &&
77693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (number_colors < MaxColormapSize))
77703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
77713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Image
77723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *affinity_image;
77733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
77744c08aed51c5899665ade97263692328eea4af106cristy            register Quantum
7775c47d1f8ecfe7d04f0f003cca0fe175658bbf0fb2cristy              *restrict q;
77763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
77773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
77783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Improve image appearance with error diffusion.
77793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
77806710d8414f0ed06e4eaf9346366be72e2b4719efcristy            affinity_image=AcquireImage((ImageInfo *) NULL,exception);
77813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (affinity_image == (Image *) NULL)
77823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              ThrowXWindowFatalException(ResourceLimitFatalError,
77833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                "UnableToDitherImage",image->filename);
77843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            affinity_image->columns=number_colors;
77853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            affinity_image->rows=1;
77863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
77873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Initialize colormap image.
77883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
77893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q=QueueAuthenticPixels(affinity_image,0,0,affinity_image->columns,
77903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              1,exception);
77914c08aed51c5899665ade97263692328eea4af106cristy            if (q != (Quantum *) NULL)
77923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
7793bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy                for (i=0; i < (ssize_t) number_colors; i++)
77943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
77954c08aed51c5899665ade97263692328eea4af106cristy                  SetPixelRed(affinity_image,0,q);
77963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  if (map_info->red_max != 0)
7797534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy                    SetPixelRed(affinity_image,ScaleXToQuantum((size_t)
7798534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy                      (i/map_info->red_mult),map_info->red_max),q);
77994c08aed51c5899665ade97263692328eea4af106cristy                  SetPixelGreen(affinity_image,0,q);
78003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  if (map_info->green_max != 0)
7801534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy                    SetPixelGreen(affinity_image,ScaleXToQuantum((size_t)
7802534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy                      ((i/map_info->green_mult) % (map_info->green_max+1)),
7803534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy                      map_info->green_max),q);
78044c08aed51c5899665ade97263692328eea4af106cristy                  SetPixelBlue(affinity_image,0,q);
78053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  if (map_info->blue_max != 0)
7806534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy                    SetPixelBlue(affinity_image,ScaleXToQuantum((size_t)
7807534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy                      (i % map_info->green_mult),map_info->blue_max),q);
78084c08aed51c5899665ade97263692328eea4af106cristy                  SetPixelAlpha(affinity_image,
78094c08aed51c5899665ade97263692328eea4af106cristy                    TransparentAlpha,q);
7810ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy                  q+=GetPixelChannels(affinity_image);
78113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
78123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (void) SyncAuthenticPixels(affinity_image,exception);
78133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (void) RemapImage(resource_info->quantize_info,image,
7814018f07f7333b25743d0afff892450cebdb905c1acristy                  affinity_image,exception);
78153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
78164c08aed51c5899665ade97263692328eea4af106cristy            XGetPixelInfo(display,visual_info,map_info,resource_info,image,
78173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              pixel);
7818574cc26500992189f637cd1cdf93d0654e7df7aecristy            (void) SetImageStorageClass(image,DirectClass,exception);
78193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            affinity_image=DestroyImage(affinity_image);
78203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
78213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (IsEventLogging())
78223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
78233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) LogMagickEvent(X11Event,GetMagickModule(),
78243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            "Standard Colormap:");
78253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) LogMagickEvent(X11Event,GetMagickModule(),
78263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            "  colormap id: 0x%lx",map_info->colormap);
78273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) LogMagickEvent(X11Event,GetMagickModule(),
78283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            "  red, green, blue max: %lu %lu %lu",map_info->red_max,
78293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            map_info->green_max,map_info->blue_max);
78303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) LogMagickEvent(X11Event,GetMagickModule(),
78313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            "  red, green, blue mult: %lu %lu %lu",map_info->red_mult,
78323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            map_info->green_mult,map_info->blue_mult);
78333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
78343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return;
78353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
78363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((visual_info->klass != DirectColor) &&
78373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (visual_info->klass != TrueColor))
78383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((image->storage_class == DirectClass) ||
78393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ((int) image->colors > visual_info->colormap_size))
78403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
78413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        QuantizeInfo
78423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          quantize_info;
78433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
78443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
78453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Image has more colors than the visual supports.
78463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
78473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        quantize_info=(*resource_info->quantize_info);
7848bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        quantize_info.number_colors=(size_t) visual_info->colormap_size;
7849018f07f7333b25743d0afff892450cebdb905c1acristy        (void) QuantizeImage(&quantize_info,image,exception);
78503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
78513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
78523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Free previous and create new colormap.
78533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
78543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFreeStandardColormap(display,visual_info,map_info,pixel);
78553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  colormap=XDefaultColormap(display,visual_info->screen);
78563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (visual_info->visual != XDefaultVisual(display,visual_info->screen))
78573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    colormap=XCreateColormap(display,XRootWindow(display,visual_info->screen),
78583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      visual_info->visual,visual_info->klass == DirectColor ?
78593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      AllocAll : AllocNone);
78603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (colormap == (Colormap) NULL)
78613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowXWindowFatalException(ResourceLimitFatalError,"UnableToCreateColormap",
78623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image->filename);
78633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
78643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize the map and pixel info structures.
78653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
78663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XGetMapInfo(visual_info,colormap,map_info);
78674c08aed51c5899665ade97263692328eea4af106cristy  XGetPixelInfo(display,visual_info,map_info,resource_info,image,pixel);
78683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
78693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Allocating colors in server colormap is based on visual class.
78703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
78713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  switch (visual_info->klass)
78723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
78733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case StaticGray:
78743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case StaticColor:
78753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
78763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
78773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Define Standard Colormap for StaticGray or StaticColor visual.
78783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
78793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      number_colors=image->colors;
78803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      colors=(XColor *) AcquireQuantumMemory((size_t)
78813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        visual_info->colormap_size,sizeof(*colors));
78823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (colors == (XColor *) NULL)
78833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowXWindowFatalException(ResourceLimitFatalError,
78843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          "UnableToCreateColormap",image->filename);
78853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      p=colors;
78863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      color.flags=(char) (DoRed | DoGreen | DoBlue);
7887bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (i=0; i < (ssize_t) image->colors; i++)
78883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
78893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        color.red=ScaleQuantumToShort(XRedGamma(image->colormap[i].red));
78903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        color.green=ScaleQuantumToShort(XGreenGamma(image->colormap[i].green));
78913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        color.blue=ScaleQuantumToShort(XBlueGamma(image->colormap[i].blue));
78923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (visual_info->klass != StaticColor)
78933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
78943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            gray_value=(unsigned short) XPixelIntensity(&color);
78953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            color.red=gray_value;
78963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            color.green=gray_value;
78973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            color.blue=gray_value;
78983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
78993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        status=XAllocColor(display,colormap,&color);
79003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (status == False)
79013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
79023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            colormap=XCopyColormapAndFree(display,colormap);
79033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XAllocColor(display,colormap,&color);
79043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
79053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        pixel->pixels[i]=color.pixel;
79063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *p++=color;
79073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
79083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
79093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
79103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case GrayScale:
79113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case PseudoColor:
79123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
79133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      unsigned int
79143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        colormap_type;
79153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
79163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
79173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Define Standard Colormap for GrayScale or PseudoColor visual.
79183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
79193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      number_colors=image->colors;
79203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      colors=(XColor *) AcquireQuantumMemory((size_t)
79213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        visual_info->colormap_size,sizeof(*colors));
79223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (colors == (XColor *) NULL)
79233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowXWindowFatalException(ResourceLimitFatalError,
79243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          "UnableToCreateColormap",image->filename);
79253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
79263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Preallocate our GUI colors.
79273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
79283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XAllocColor(display,colormap,&pixel->foreground_color);
79293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XAllocColor(display,colormap,&pixel->background_color);
79303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XAllocColor(display,colormap,&pixel->border_color);
79313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XAllocColor(display,colormap,&pixel->matte_color);
79323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XAllocColor(display,colormap,&pixel->highlight_color);
79333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XAllocColor(display,colormap,&pixel->shadow_color);
79343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XAllocColor(display,colormap,&pixel->depth_color);
79353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XAllocColor(display,colormap,&pixel->trough_color);
79363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (i=0; i < MaxNumberPens; i++)
79373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XAllocColor(display,colormap,&pixel->pen_colors[i]);
79383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
79393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Determine if image colors will "fit" into X server colormap.
79403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
79413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      colormap_type=resource_info->colormap;
7942f2faecf9facdbbb14fcba373365f9f691a9658e0cristy      status=XAllocColorCells(display,colormap,MagickFalse,(unsigned long *)
79433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        NULL,0,pixel->pixels,(unsigned int) image->colors);
79443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (status != False)
79453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        colormap_type=PrivateColormap;
79463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (colormap_type == SharedColormap)
79473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
7948c57f694b2d04975a0e501613e34368c464708c19cristy          CacheView
7949c57f694b2d04975a0e501613e34368c464708c19cristy            *image_view;
7950c57f694b2d04975a0e501613e34368c464708c19cristy
79513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          DiversityPacket
79523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *diversity;
79533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
79543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          int
79553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            y;
79563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
79573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          register int
79583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            x;
79593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
79603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          unsigned short
79613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            index;
79623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
79633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          XColor
79643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *server_colors;
79653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
79663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
79673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Define Standard colormap for shared GrayScale or PseudoColor visual.
79683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
79693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          diversity=(DiversityPacket *) AcquireQuantumMemory(image->colors,
79703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            sizeof(*diversity));
79713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (diversity == (DiversityPacket *) NULL)
79723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            ThrowXWindowFatalException(ResourceLimitFatalError,
79733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              "UnableToCreateColormap",image->filename);
7974bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy          for (i=0; i < (ssize_t) image->colors; i++)
79753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
7976e42f658533644aecb733785ffd91b286d6778deacristy            diversity[i].red=ClampToQuantum(image->colormap[i].red);
7977e42f658533644aecb733785ffd91b286d6778deacristy            diversity[i].green=ClampToQuantum(image->colormap[i].green);
7978e42f658533644aecb733785ffd91b286d6778deacristy            diversity[i].blue=ClampToQuantum(image->colormap[i].blue);
79793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            diversity[i].index=(unsigned short) i;
79803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            diversity[i].count=0;
79813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
798246ff2676b1044ea4101ac7a59b83289cd8f6cfdacristy          image_view=AcquireAuthenticCacheView(image,exception);
79833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (y=0; y < (int) image->rows; y++)
79843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
7985c57f694b2d04975a0e501613e34368c464708c19cristy            register int
79863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              x;
79873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
79884c08aed51c5899665ade97263692328eea4af106cristy            register const Quantum
7989c57f694b2d04975a0e501613e34368c464708c19cristy              *restrict p;
79903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7991c57f694b2d04975a0e501613e34368c464708c19cristy            p=GetCacheViewAuthenticPixels(image_view,0,(ssize_t) y,
7992c57f694b2d04975a0e501613e34368c464708c19cristy              image->columns,1,exception);
79934c08aed51c5899665ade97263692328eea4af106cristy            if (p == (const Quantum *) NULL)
79943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
7995c57f694b2d04975a0e501613e34368c464708c19cristy            for (x=(int) image->columns-1; x >= 0; x--)
79964c08aed51c5899665ade97263692328eea4af106cristy            {
79974c08aed51c5899665ade97263692328eea4af106cristy              diversity[(ssize_t) GetPixelIndex(image,p)].count++;
7998ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              p+=GetPixelChannels(image);
79994c08aed51c5899665ade97263692328eea4af106cristy            }
80003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
8001c57f694b2d04975a0e501613e34368c464708c19cristy          image_view=DestroyCacheView(image_view);
80023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
80033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Sort colors by decreasing intensity.
80043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
80053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          qsort((void *) diversity,image->colors,sizeof(*diversity),
80063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            IntensityCompare);
8007bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy          for (i=0; i < (ssize_t) image->colors; )
80083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
80093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            diversity[i].count<<=4;  /* increase this colors popularity */
8010dfe2b6658f367de8f84405263f62768fb853adafcristy            i+=MagickMax((int) (image->colors >> 4),2);
80113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
80123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          diversity[image->colors-1].count<<=4;
80133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          qsort((void *) diversity,image->colors,sizeof(*diversity),
80143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            PopularityCompare);
80153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
80163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Allocate colors.
80173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
80183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          p=colors;
80193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          color.flags=(char) (DoRed | DoGreen | DoBlue);
8020bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy          for (i=0; i < (ssize_t) image->colors; i++)
80213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
80223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            index=diversity[i].index;
80233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            color.red=
80243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              ScaleQuantumToShort(XRedGamma(image->colormap[index].red));
80253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            color.green=
80263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              ScaleQuantumToShort(XGreenGamma(image->colormap[index].green));
80273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            color.blue=
80283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              ScaleQuantumToShort(XBlueGamma(image->colormap[index].blue));
80293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (visual_info->klass != PseudoColor)
80303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
80313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                gray_value=(unsigned short) XPixelIntensity(&color);
80323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                color.red=gray_value;
80333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                color.green=gray_value;
80343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                color.blue=gray_value;
80353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
80363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            status=XAllocColor(display,colormap,&color);
80373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (status == False)
80383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
80393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            pixel->pixels[index]=color.pixel;
80403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *p++=color;
80413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
80423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
80433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Read X server colormap.
80443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
80453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          server_colors=(XColor *) AcquireQuantumMemory((size_t)
80463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            visual_info->colormap_size,sizeof(*server_colors));
80473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (server_colors == (XColor *) NULL)
80483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            ThrowXWindowFatalException(ResourceLimitFatalError,
80493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              "UnableToCreateColormap",image->filename);
80503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (x=visual_info->colormap_size-1; x >= 0; x--)
8051bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            server_colors[x].pixel=(size_t) x;
80523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) XQueryColors(display,colormap,server_colors,
80533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (int) MagickMin((unsigned int) visual_info->colormap_size,256));
80543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
80553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Select remaining colors from X server colormap.
80563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
8057bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy          for (; i < (ssize_t) image->colors; i++)
80583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
80593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            index=diversity[i].index;
8060534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy            color.red=ScaleQuantumToShort(
8061534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy              XRedGamma(image->colormap[index].red));
8062534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy            color.green=ScaleQuantumToShort(
8063534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy              XGreenGamma(image->colormap[index].green));
8064534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy            color.blue=ScaleQuantumToShort(
8065534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy              XBlueGamma(image->colormap[index].blue));
80663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (visual_info->klass != PseudoColor)
80673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
80683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                gray_value=(unsigned short) XPixelIntensity(&color);
80693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                color.red=gray_value;
80703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                color.green=gray_value;
80713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                color.blue=gray_value;
80723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
80733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XBestPixel(display,colormap,server_colors,(unsigned int)
80743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              visual_info->colormap_size,&color);
80753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            pixel->pixels[index]=color.pixel;
80763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *p++=color;
80773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
80783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((int) image->colors < visual_info->colormap_size)
80793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
80803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
80813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Fill up colors array-- more choices for pen colors.
80823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
80833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              retain_colors=MagickMin((unsigned int)
80843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy               (visual_info->colormap_size-image->colors),256);
8085bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy              for (i=0; i < (ssize_t) retain_colors; i++)
80863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                *p++=server_colors[i];
80873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              number_colors+=retain_colors;
80883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
80893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          server_colors=(XColor *) RelinquishMagickMemory(server_colors);
80903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          diversity=(DiversityPacket *) RelinquishMagickMemory(diversity);
80913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
80923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
80933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
80943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Define Standard colormap for private GrayScale or PseudoColor visual.
80953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
80963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (status == False)
80973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
80983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
80993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Not enough colormap entries in the colormap-- Create a new colormap.
81003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
81013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          colormap=XCreateColormap(display,
81023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XRootWindow(display,visual_info->screen),visual_info->visual,
81033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            AllocNone);
81043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (colormap == (Colormap) NULL)
81053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            ThrowXWindowFatalException(ResourceLimitFatalError,
81063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              "UnableToCreateColormap",image->filename);
81073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          map_info->colormap=colormap;
81083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((int) image->colors < visual_info->colormap_size)
81093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
81103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
81113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Retain colors from the default colormap to help lessens the
81123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                effects of colormap flashing.
81133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
81143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              retain_colors=MagickMin((unsigned int)
81153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (visual_info->colormap_size-image->colors),256);
81163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              p=colors+image->colors;
8117bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy              for (i=0; i < (ssize_t) retain_colors; i++)
81183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
8119c57f694b2d04975a0e501613e34368c464708c19cristy                p->pixel=(unsigned long) i;
81203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                p++;
81213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
81223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (void) XQueryColors(display,
81233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                XDefaultColormap(display,visual_info->screen),
81243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                colors+image->colors,(int) retain_colors);
81253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
81263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Transfer colors from default to private colormap.
81273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
81283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (void) XAllocColorCells(display,colormap,MagickFalse,
8129f2faecf9facdbbb14fcba373365f9f691a9658e0cristy                (unsigned long *) NULL,0,pixel->pixels,(unsigned int)
81303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                retain_colors);
81313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              p=colors+image->colors;
8132bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy              for (i=0; i < (ssize_t) retain_colors; i++)
81333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
81343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                p->pixel=pixel->pixels[i];
81353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                p++;
81363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
81373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (void) XStoreColors(display,colormap,colors+image->colors,
81383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (int) retain_colors);
81393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              number_colors+=retain_colors;
81403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
81413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) XAllocColorCells(display,colormap,MagickFalse,
8142f2faecf9facdbbb14fcba373365f9f691a9658e0cristy            (unsigned long *) NULL,0,pixel->pixels,(unsigned int)
81433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            image->colors);
81443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
81453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
81463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Store the image colormap.
81473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
81483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      p=colors;
81493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      color.flags=(char) (DoRed | DoGreen | DoBlue);
8150bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (i=0; i < (ssize_t) image->colors; i++)
81513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
81523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        color.red=ScaleQuantumToShort(XRedGamma(image->colormap[i].red));
81533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        color.green=ScaleQuantumToShort(XGreenGamma(image->colormap[i].green));
81543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        color.blue=ScaleQuantumToShort(XBlueGamma(image->colormap[i].blue));
81553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (visual_info->klass != PseudoColor)
81563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
81573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            gray_value=(unsigned short) XPixelIntensity(&color);
81583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            color.red=gray_value;
81593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            color.green=gray_value;
81603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            color.blue=gray_value;
81613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
81623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        color.pixel=pixel->pixels[i];
81633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *p++=color;
81643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
81653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XStoreColors(display,colormap,colors,(int) image->colors);
81663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
81673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
81683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case TrueColor:
81693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case DirectColor:
81703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    default:
81713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
81723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      MagickBooleanType
81733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        linear_colormap;
81743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
81753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
81763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Define Standard Colormap for TrueColor or DirectColor visual.
81773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
81783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      number_colors=(unsigned int) ((map_info->red_max*map_info->red_mult)+
81793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (map_info->green_max*map_info->green_mult)+
81803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (map_info->blue_max*map_info->blue_mult)+1);
81813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      linear_colormap=(number_colors > 4096) ||
81823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (((int) (map_info->red_max+1) == visual_info->colormap_size) &&
81833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy         ((int) (map_info->green_max+1) == visual_info->colormap_size) &&
81843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy         ((int) (map_info->blue_max+1) == visual_info->colormap_size)) ?
81853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy         MagickTrue : MagickFalse;
81863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (linear_colormap != MagickFalse)
8187bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        number_colors=(size_t) visual_info->colormap_size;
81883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
81893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Allocate color array.
81903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
81913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      colors=(XColor *) AcquireQuantumMemory(number_colors,sizeof(*colors));
81923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (colors == (XColor *) NULL)
81933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowXWindowFatalException(ResourceLimitFatalError,
81943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          "UnableToCreateColormap",image->filename);
81953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
81963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Initialize linear color ramp.
81973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
81983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      p=colors;
81993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      color.flags=(char) (DoRed | DoGreen | DoBlue);
82003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (linear_colormap != MagickFalse)
8201bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (i=0; i < (ssize_t) number_colors; i++)
82023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
82033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          color.blue=(unsigned short) 0;
82043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (map_info->blue_max != 0)
8205bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            color.blue=(unsigned short) ((size_t)
82063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              ((65535L*(i % map_info->green_mult))/map_info->blue_max));
82073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          color.green=color.blue;
82083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          color.red=color.blue;
82093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          color.pixel=XStandardPixel(map_info,&color);
82103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *p++=color;
82113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
82123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
8213bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (i=0; i < (ssize_t) number_colors; i++)
82143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
82153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          color.red=(unsigned short) 0;
82163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (map_info->red_max != 0)
8217bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            color.red=(unsigned short) ((size_t)
82183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              ((65535L*(i/map_info->red_mult))/map_info->red_max));
82193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          color.green=(unsigned int) 0;
82203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (map_info->green_max != 0)
8221bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            color.green=(unsigned short) ((size_t)
82223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              ((65535L*((i/map_info->green_mult) % (map_info->green_max+1)))/
82233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                map_info->green_max));
82243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          color.blue=(unsigned short) 0;
82253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (map_info->blue_max != 0)
8226bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            color.blue=(unsigned short) ((size_t)
82273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              ((65535L*(i % map_info->green_mult))/map_info->blue_max));
82283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          color.pixel=XStandardPixel(map_info,&color);
82293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *p++=color;
82303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
82313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((visual_info->klass == DirectColor) &&
82323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (colormap != XDefaultColormap(display,visual_info->screen)))
82333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XStoreColors(display,colormap,colors,(int) number_colors);
82343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
8235bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (i=0; i < (ssize_t) number_colors; i++)
82363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) XAllocColor(display,colormap,&colors[i]);
82373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
82383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
82393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
82403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((visual_info->klass != DirectColor) &&
82413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (visual_info->klass != TrueColor))
82423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
82433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
82443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Set foreground, background, border, etc. pixels.
82453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
82463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XBestPixel(display,colormap,colors,(unsigned int) number_colors,
82473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        &pixel->foreground_color);
82483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XBestPixel(display,colormap,colors,(unsigned int) number_colors,
82493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        &pixel->background_color);
82503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (pixel->background_color.pixel == pixel->foreground_color.pixel)
82513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
82523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
82533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Foreground and background colors must differ.
82543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
82553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          pixel->background_color.red=(~pixel->foreground_color.red);
82563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          pixel->background_color.green=
82573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (~pixel->foreground_color.green);
82583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          pixel->background_color.blue=
82593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (~pixel->foreground_color.blue);
82603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          XBestPixel(display,colormap,colors,(unsigned int) number_colors,
82613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            &pixel->background_color);
82623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
82633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XBestPixel(display,colormap,colors,(unsigned int) number_colors,
82643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        &pixel->border_color);
82653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XBestPixel(display,colormap,colors,(unsigned int) number_colors,
82663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        &pixel->matte_color);
82673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XBestPixel(display,colormap,colors,(unsigned int) number_colors,
82683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        &pixel->highlight_color);
82693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XBestPixel(display,colormap,colors,(unsigned int) number_colors,
82703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        &pixel->shadow_color);
82713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XBestPixel(display,colormap,colors,(unsigned int) number_colors,
82723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        &pixel->depth_color);
82733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XBestPixel(display,colormap,colors,(unsigned int) number_colors,
82743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        &pixel->trough_color);
82753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (i=0; i < MaxNumberPens; i++)
82763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
82773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XBestPixel(display,colormap,colors,(unsigned int) number_colors,
82783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          &pixel->pen_colors[i]);
82793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        pixel->pixels[image->colors+i]=pixel->pen_colors[i].pixel;
82803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
8281c57f694b2d04975a0e501613e34368c464708c19cristy      pixel->colors=(ssize_t) (image->colors+MaxNumberPens);
82823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
82833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  colors=(XColor *) RelinquishMagickMemory(colors);
82843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (IsEventLogging())
82853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
82863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"Standard Colormap:");
82873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),"  colormap id: 0x%lx",
82883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        map_info->colormap);
82893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),
82903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "  red, green, blue max: %lu %lu %lu",map_info->red_max,
82913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        map_info->green_max,map_info->blue_max);
82923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) LogMagickEvent(X11Event,GetMagickModule(),
82933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "  red, green, blue mult: %lu %lu %lu",map_info->red_mult,
82943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        map_info->green_mult,map_info->blue_mult);
82953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
82963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
82973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
82983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
82993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
83003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
83013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
83023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
83033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X M a k e W i n d o w                                                     %
83043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
83053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
83063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
83073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
83083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
83093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XMakeWindow() creates an X11 window.
83103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
83113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XMakeWindow method is:
83123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
83133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XMakeWindow(Display *display,Window parent,char **argv,int argc,
83143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        XClassHint *class_hint,XWMHints *manager_hints,
83153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        XWindowInfo *window_info)
83163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
83173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
83183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
83193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server; returned from
83203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
83213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
83223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o parent: Specifies the parent window_info.
83233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
83243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o argv: Specifies the application's argument list.
83253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
83263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o argc: Specifies the number of arguments.
83273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
83283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o class_hint: Specifies a pointer to a X11 XClassHint structure.
83293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
83303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o manager_hints: Specifies a pointer to a X11 XWMHints structure.
83313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
83323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window_info: Specifies a pointer to a X11 XWindowInfo structure.
83333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
83343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
8335bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XMakeWindow(Display *display,Window parent,char **argv,
83363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int argc,XClassHint *class_hint,XWMHints *manager_hints,
83373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWindowInfo *window_info)
83383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
83393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define MinWindowSize  64
83403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
83413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Atom
83423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    atom_list[2];
83433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
83443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
83453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    gravity;
83463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
83473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static XTextProperty
83483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    icon_name,
83493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window_name;
83503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
83513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
83523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
83533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
83543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSizeHints
83553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *size_hints;
83563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
83573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
83583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Set window info hints.
83593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
83603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
83613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
83623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(window_info != (XWindowInfo *) NULL);
83633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_hints=XAllocSizeHints();
83643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (size_hints == (XSizeHints *) NULL)
83653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowXWindowFatalException(XServerFatalError,"UnableToMakeXWindow",argv[0]);
8366dfe2b6658f367de8f84405263f62768fb853adafcristy  size_hints->flags=(int) window_info->flags;
83673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_hints->x=window_info->x;
83683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_hints->y=window_info->y;
83693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_hints->width=(int) window_info->width;
83703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_hints->height=(int) window_info->height;
83713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window_info->immutable != MagickFalse)
83723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
83733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
83743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Window size cannot be changed.
83753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
83763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      size_hints->min_width=size_hints->width;
83773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      size_hints->min_height=size_hints->height;
83783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      size_hints->max_width=size_hints->width;
83793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      size_hints->max_height=size_hints->height;
83803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      size_hints->flags|=PMinSize;
83813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      size_hints->flags|=PMaxSize;
83823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
83833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
83843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
83853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
83863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Window size can be changed.
83873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
83883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      size_hints->min_width=(int) window_info->min_width;
83893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      size_hints->min_height=(int) window_info->min_height;
83903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      size_hints->flags|=PResizeInc;
83913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      size_hints->width_inc=(int) window_info->width_inc;
83923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      size_hints->height_inc=(int) window_info->height_inc;
83933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if !defined(PRE_R4_ICCCM)
83943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      size_hints->flags|=PBaseSize;
83953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      size_hints->base_width=size_hints->width_inc;
83963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      size_hints->base_height=size_hints->height_inc;
83973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
83983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
83993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  gravity=NorthWestGravity;
84003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window_info->geometry != (char *) NULL)
84013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
84023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      char
84033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        default_geometry[MaxTextExtent],
84043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        geometry[MaxTextExtent];
84053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
84063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      int
84073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        flags;
84083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
84093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      register char
84103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *p;
84113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
84123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
84133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        User specified geometry.
84143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
8415b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy      (void) FormatLocaleString(default_geometry,MaxTextExtent,"%dx%d",
84163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        size_hints->width,size_hints->height);
84173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) CopyMagickString(geometry,window_info->geometry,MaxTextExtent);
84183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      p=geometry;
84193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      while (strlen(p) != 0)
84203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
84213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((isspace((int) ((unsigned char) *p)) == 0) && (*p != '%'))
84223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          p++;
84233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        else
84243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) CopyMagickString(p,p+1,MaxTextExtent);
84253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
84263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      flags=XWMGeometry(display,window_info->screen,geometry,default_geometry,
84273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        window_info->border_width,size_hints,&size_hints->x,&size_hints->y,
84283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        &size_hints->width,&size_hints->height,&gravity);
84293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((flags & WidthValue) && (flags & HeightValue))
84303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        size_hints->flags|=USSize;
84313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((flags & XValue) && (flags & YValue))
84323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
84333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          size_hints->flags|=USPosition;
84343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          window_info->x=size_hints->x;
84353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          window_info->y=size_hints->y;
84363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
84373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
84383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if !defined(PRE_R4_ICCCM)
84393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_hints->win_gravity=gravity;
84403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_hints->flags|=PWinGravity;
84413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
84423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window_info->id == (Window) NULL)
84433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window_info->id=XCreateWindow(display,parent,window_info->x,window_info->y,
84443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (unsigned int) size_hints->width,(unsigned int) size_hints->height,
84453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window_info->border_width,(int) window_info->depth,InputOutput,
8446c57f694b2d04975a0e501613e34368c464708c19cristy      window_info->visual,(unsigned long) window_info->mask,
8447c57f694b2d04975a0e501613e34368c464708c19cristy      &window_info->attributes);
84483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
84493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
84503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      MagickStatusType
84513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        mask;
84523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
84533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XEvent
84543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        sans_event;
84553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
84563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XWindowChanges
84573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        window_changes;
84583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
84593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
84603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Window already exists;  change relevant attributes.
84613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
8462c57f694b2d04975a0e501613e34368c464708c19cristy      (void) XChangeWindowAttributes(display,window_info->id,(unsigned long)
8463c57f694b2d04975a0e501613e34368c464708c19cristy        window_info->mask,&window_info->attributes);
84643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      mask=ConfigureNotify;
84653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      while (XCheckTypedWindowEvent(display,window_info->id,(int) mask,&sans_event)) ;
84663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window_changes.x=window_info->x;
84673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window_changes.y=window_info->y;
84683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window_changes.width=(int) window_info->width;
84693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window_changes.height=(int) window_info->height;
84703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      mask=(MagickStatusType) (CWWidth | CWHeight);
84713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window_info->flags & USPosition)
84723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        mask|=CWX | CWY;
84733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XReconfigureWMWindow(display,window_info->id,window_info->screen,
84743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        mask,&window_changes);
84753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
84763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window_info->id == (Window) NULL)
84773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowXWindowFatalException(XServerFatalError,"UnableToCreateWindow",
84783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window_info->name);
84793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XStringListToTextProperty(&window_info->name,1,&window_name);
84803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status == False)
84813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowXWindowFatalException(XServerFatalError,"UnableToCreateTextProperty",
84823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window_info->name);
84833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XStringListToTextProperty(&window_info->icon_name,1,&icon_name);
84843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status == False)
84853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowXWindowFatalException(XServerFatalError,"UnableToCreateTextProperty",
84863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window_info->icon_name);
84873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window_info->icon_geometry != (char *) NULL)
84883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
84893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      int
84903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        flags,
84913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        height,
84923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        width;
84933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
84943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
84953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        User specified icon geometry.
84963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
84973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      size_hints->flags|=USPosition;
84983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      flags=XWMGeometry(display,window_info->screen,window_info->icon_geometry,
84993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (char *) NULL,0,size_hints,&manager_hints->icon_x,
85003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        &manager_hints->icon_y,&width,&height,&gravity);
85013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((flags & XValue) && (flags & YValue))
85023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        manager_hints->flags|=IconPositionHint;
85033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
85043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetWMProperties(display,window_info->id,&window_name,&icon_name,argv,argc,
85053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    size_hints,manager_hints,class_hint);
85063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window_name.value != (void *) NULL)
85073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
85083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XFree((void *) window_name.value);
85093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window_name.value=(unsigned char *) NULL;
85103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window_name.nitems=0;
85113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
85123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (icon_name.value != (void *) NULL)
85133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
85143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XFree((void *) icon_name.value);
85153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      icon_name.value=(unsigned char *) NULL;
85163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      icon_name.nitems=0;
85173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
85183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  atom_list[0]=XInternAtom(display,"WM_DELETE_WINDOW",MagickFalse);
85193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  atom_list[1]=XInternAtom(display,"WM_TAKE_FOCUS",MagickFalse);
85203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XSetWMProtocols(display,window_info->id,atom_list,2);
85213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFree((void *) size_hints);
85223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window_info->shape != MagickFalse)
85233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
85243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HAVE_SHAPE)
85253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      int
85263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        error_base,
85273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        event_base;
85283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
85293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
85303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Can we apply a non-rectangular shaping mask?
85313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
85323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      error_base=0;
85333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      event_base=0;
85343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (XShapeQueryExtension(display,&error_base,&event_base) == 0)
85353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        window_info->shape=MagickFalse;
85363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else
85373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window_info->shape=MagickFalse;
85383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
85393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
85403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window_info->shared_memory)
85413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
85423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
85433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
85443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Can we use shared memory with this window?
85453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
85463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (XShmQueryExtension(display) == 0)
85473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        window_info->shared_memory=MagickFalse;
85483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else
85493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window_info->shared_memory=MagickFalse;
85503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
85513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
85523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_info->image=NewImageList();
85533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_info->destroy=MagickFalse;
85543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
85553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
85563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
85573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
85583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
85593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
85603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
85613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X M a g i c k P r o g r e s s M o n i t o r                               %
85623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
85633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
85643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
85653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
85663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
85673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XMagickProgressMonitor() displays the progress a task is making in
85683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  completing a task.
85693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
85703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XMagickProgressMonitor method is:
85713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
85723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XMagickProgressMonitor(const char *task,
85733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const MagickOffsetType quantum,const MagickSizeType span,
85743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        void *client_data)
85753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
85763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
85773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
85783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o task: Identifies the task in progress.
85793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
85803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o quantum: Specifies the quantum position within the span which represents
85813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      how much progress has been made in completing a task.
85823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
85833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o span: Specifies the span relative to completing a task.
85843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
85853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o client_data: Pointer to any client data.
85863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
85873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
85883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
85893ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic const char *GetLocaleMonitorMessage(const char *text)
85903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
85913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
85923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    message[MaxTextExtent],
85933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    tag[MaxTextExtent];
85943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
85953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char
85963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *locale_message;
85973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
85983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register char
85993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
86003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
86013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) CopyMagickMemory(tag,text,MaxTextExtent);
86023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=strrchr(tag,'/');
86033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (p != (char *) NULL)
86043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p='\0';
8605b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleString(message,MaxTextExtent,"Monitor/%s",tag);
86063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  locale_message=GetLocaleMessage(message);
86073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (locale_message == message)
86083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(text);
86093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(locale_message);
86103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
86113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8612bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate MagickBooleanType XMagickProgressMonitor(const char *tag,
86133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const MagickOffsetType quantum,const MagickSizeType span,
86143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  void *magick_unused(client_data))
86153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
86163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWindows
86173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *windows;
86183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
86193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows=XSetWindows((XWindows *) ~0);
86203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows == (XWindows *) NULL)
86213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickTrue);
86223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->info.mapped != MagickFalse)
86233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    XProgressMonitorWidget(windows->display,windows,
86243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      GetLocaleMonitorMessage(tag),quantum,span);
86253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickTrue);
86263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
86273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
86283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
86293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
86303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
86313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
86323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
86333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X Q u e r y C o l o r D a t a b a s e                                     %
86343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
86353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
86363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
86373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
86383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
86399950d57e1124b73f684fb5946e206994cefda628cristy%  XQueryColorCompliance() looks up a RGB values for a color given in the target
86403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  string.
86413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
86423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XQueryColorDatabase method is:
86433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
86449950d57e1124b73f684fb5946e206994cefda628cristy%      MagickBooleanType XQueryColorCompliance(const char *target,XColor *color)
86453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
86463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
86473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
86483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o target: Specifies the color to lookup in the X color database.
86493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8650101ab708b0574518ac5715da4d3915400e9df79acristy%    o color: A pointer to an PixelInfo structure.  The RGB value of the target
86513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      color is returned as this value.
86523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
86533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
86549950d57e1124b73f684fb5946e206994cefda628cristyMagickPrivate MagickBooleanType XQueryColorCompliance(const char *target,
86553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XColor *color)
86563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
86573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Colormap
86583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    colormap;
86593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
86603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static Display
86613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *display = (Display *) NULL;
86623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
86633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
86643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
86653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
86663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XColor
86673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    xcolor;
86683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
86693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
86703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize color return value.
86713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
86723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(color != (XColor *) NULL);
86733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  color->red=0;
86743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  color->green=0;
86753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  color->blue=0;
86763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  color->flags=(char) (DoRed | DoGreen | DoBlue);
86773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((target == (char *) NULL) || (*target == '\0'))
86783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    target="#ffffffffffff";
86793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
86803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Let the X server define the color for us.
86813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
86823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (display == (Display *) NULL)
86833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    display=XOpenDisplay((char *) NULL);
86843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (display == (Display *) NULL)
86853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
86863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowXWindowFatalException(XServerError,"ColorIsNotKnownToServer",target);
86873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return(MagickFalse);
86883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
86893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  colormap=XDefaultColormap(display,XDefaultScreen(display));
86903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XParseColor(display,colormap,(char *) target,&xcolor);
86913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status == False)
86923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowXWindowFatalException(XServerError,"ColorIsNotKnownToServer",target)
86933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
86943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
86953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      color->red=xcolor.red;
86963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      color->green=xcolor.green;
86973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      color->blue=xcolor.blue;
86983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      color->flags=xcolor.flags;
86993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
87003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(status != False ? MagickTrue : MagickFalse);
87013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
87023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
87033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
87043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
87053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
87063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
87073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
87083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X Q u e r y P o s i t i o n                                               %
87093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
87103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
87113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
87123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
87133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
87143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XQueryPosition() gets the pointer coordinates relative to a window.
87153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
87163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XQueryPosition method is:
87173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
87183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XQueryPosition(Display *display,const Window window,int *x,int *y)
87193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
87203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
87213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
87223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
87233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
87243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
87253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies a pointer to a Window.
87263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
87273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o x: Return the x coordinate of the pointer relative to the origin of the
87283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      window.
87293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
87303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o y: Return the y coordinate of the pointer relative to the origin of the
87313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      window.
87323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
87333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
8734534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristyMagickPrivate void XQueryPosition(Display *display,const Window window,int *x,
8735534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  int *y)
87363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
87373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
87383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x_root,
87393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y_root;
87403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
87413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
87423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    mask;
87433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
87443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Window
87453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    root_window;
87463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
87473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
87483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
87493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(window != (Window) NULL);
87503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(x != (int *) NULL);
87513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(y != (int *) NULL);
87523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XQueryPointer(display,window,&root_window,&root_window,&x_root,&y_root,
87533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x,y,&mask);
87543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
87553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
87563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
87573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
87583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
87593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
87603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
87613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X R e f r e s h W i n d o w                                               %
87623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
87633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
87643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
87653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
87663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
87673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XRefreshWindow() refreshes an image in a X window.
87683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
87693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XRefreshWindow method is:
87703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
87713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XRefreshWindow(Display *display,const XWindowInfo *window,
87723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const XEvent *event)
87733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
87743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
87753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
87763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
87773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
87783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
87793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies a pointer to a XWindowInfo structure.
87803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
87813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o event: Specifies a pointer to a XEvent structure.  If it is NULL,
87823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      the entire image is refreshed.
87833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
87843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
8785bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XRefreshWindow(Display *display,const XWindowInfo *window,
87863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const XEvent *event)
87873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
87883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
87893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x,
87903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y;
87913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
87923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
87933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    height,
87943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width;
87953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
87963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
87973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
87983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(window != (XWindowInfo *) NULL);
87993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->ximage == (XImage *) NULL)
88003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return;
88013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (event != (XEvent *) NULL)
88023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
88033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
88043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Determine geometry from expose event.
88053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
88063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      x=event->xexpose.x;
88073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      y=event->xexpose.y;
88083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      width=(unsigned int) event->xexpose.width;
88093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      height=(unsigned int) event->xexpose.height;
88103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
88113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
88123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
88133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XEvent
88143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        sans_event;
88153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
88163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
88173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Refresh entire window; discard outstanding expose events.
88183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
88193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      x=0;
88203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      y=0;
88213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      width=window->width;
88223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      height=window->height;
88233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      while (XCheckTypedWindowEvent(display,window->id,Expose,&sans_event)) ;
8824a0e5ad575fbabf93f14a3748ae501376928998fccristy      if (window->matte_pixmap != (Pixmap) NULL)
8825a0e5ad575fbabf93f14a3748ae501376928998fccristy        {
8826a0e5ad575fbabf93f14a3748ae501376928998fccristy#if defined(MAGICKCORE_HAVE_SHAPE)
8827a0e5ad575fbabf93f14a3748ae501376928998fccristy          if (window->shape != MagickFalse)
8828a0e5ad575fbabf93f14a3748ae501376928998fccristy            XShapeCombineMask(display,window->id,ShapeBounding,0,0,
8829a0e5ad575fbabf93f14a3748ae501376928998fccristy              window->matte_pixmap,ShapeSet);
8830a0e5ad575fbabf93f14a3748ae501376928998fccristy#endif
8831a0e5ad575fbabf93f14a3748ae501376928998fccristy        }
88323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
88333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
88343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Check boundary conditions.
88353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
88363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((window->ximage->width-(x+window->x)) < (int) width)
88373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width=(unsigned int) (window->ximage->width-(x+window->x));
88383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((window->ximage->height-(y+window->y)) < (int) height)
88393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    height=(unsigned int) (window->ximage->height-(y+window->y));
88403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
88413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Refresh image.
88423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
88433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->matte_pixmap != (Pixmap) NULL)
8844a0e5ad575fbabf93f14a3748ae501376928998fccristy    (void) XSetClipMask(display,window->annotate_context,window->matte_pixmap);
88453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->pixmap != (Pixmap) NULL)
88463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
88473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window->depth > 1)
88483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XCopyArea(display,window->pixmap,window->id,
88493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          window->annotate_context,x+window->x,y+window->y,width,height,x,y);
88503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
88513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XCopyPlane(display,window->pixmap,window->id,
88523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          window->highlight_context,x+window->x,y+window->y,width,height,x,y,
88533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          1L);
88543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
88553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
88563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
88573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
88583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window->shared_memory)
88593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XShmPutImage(display,window->id,window->annotate_context,
88603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          window->ximage,x+window->x,y+window->y,x,y,width,height,MagickTrue);
88613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
88623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (window->shared_memory == MagickFalse)
88633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XPutImage(display,window->id,window->annotate_context,
88643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          window->ximage,x+window->x,y+window->y,x,y,width,height);
88653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
88663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window->matte_pixmap != (Pixmap) NULL)
88673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XSetClipMask(display,window->annotate_context,None);
88683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFlush(display);
88693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
88703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
88713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
88723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
88733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
88743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
88753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
88763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X R e m o t e C o m m a n d                                               %
88773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
88783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
88793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
88803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
88813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
88823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XRemoteCommand() forces a remote display(1) to display the specified
88833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  image filename.
88843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
88853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XRemoteCommand method is:
88863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
88873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType XRemoteCommand(Display *display,const char *window,
88883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *filename)
88893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
88903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
88913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
88923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server; returned from
88933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
88943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
88953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies the name or id of an X window.
88963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
88973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o filename: the name of the image filename to display.
88983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
88993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
89003ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport MagickBooleanType XRemoteCommand(Display *display,
89013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *window,const char *filename)
89023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
89033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Atom
89043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    remote_atom;
89053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
89063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Window
89073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    remote_window,
89083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    root_window;
89093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
89103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(filename != (char *) NULL);
89113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",filename);
89123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (display == (Display *) NULL)
89133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    display=XOpenDisplay((char *) NULL);
89143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (display == (Display *) NULL)
89153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
89163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowXWindowException(XServerError,"UnableToOpenXServer",filename);
89173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return(MagickFalse);
89183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
89193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  remote_atom=XInternAtom(display,"IM_PROTOCOLS",MagickFalse);
89203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  remote_window=(Window) NULL;
89213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  root_window=XRootWindow(display,XDefaultScreen(display));
89223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window != (char *) NULL)
89233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
89243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
89253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Search window hierarchy and identify any clients by name or ID.
89263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
89273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (isdigit((unsigned char) *window) != 0)
89283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        remote_window=XWindowByID(display,root_window,(Window)
89293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          strtol((char *) window,(char **) NULL,0));
89303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (remote_window == (Window) NULL)
89313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        remote_window=XWindowByName(display,root_window,window);
89323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
89333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (remote_window == (Window) NULL)
89343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    remote_window=XWindowByProperty(display,root_window,remote_atom);
89353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (remote_window == (Window) NULL)
89363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
89373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowXWindowException(XServerError,"UnableToConnectToRemoteDisplay",
89383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        filename);
89393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return(MagickFalse);
89403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
89413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
89423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Send remote command.
89433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
89443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  remote_atom=XInternAtom(display,"IM_REMOTE_COMMAND",MagickFalse);
89453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XChangeProperty(display,remote_window,remote_atom,XA_STRING,8,
89463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    PropModeReplace,(unsigned char *) filename,(int) strlen(filename));
89473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XSync(display,MagickFalse);
89483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickTrue);
89493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
89503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
89513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
89523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
89533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
89543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
89553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8956534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%   X R e n d e r I m a g e                                                   %
8957534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%                                                                             %
8958534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%                                                                             %
8959534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%                                                                             %
8960534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8961534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%
8962534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%  XRenderImage() renders text on the image with an X11 font.  It also returns
8963534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%  the bounding box of the text relative to the image.
8964534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%
8965534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%  The format of the XRenderImage method is:
8966534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%
8967534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%      MagickBooleanType XRenderImage(Image *image,DrawInfo *draw_info,
8968534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%        const PointInfo *offset,TypeMetric *metrics,ExceptionInfo *exception)
8969534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%
8970534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%  A description of each parameter follows:
8971534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%
8972534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%    o image: the image.
8973534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%
8974534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%    o draw_info: the draw info.
8975534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%
8976534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%    o offset: (x,y) location of text relative to image.
8977534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%
8978534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%    o metrics: bounding box of text.
8979534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%
8980534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%    o exception: return any errors or warnings in this structure.
8981534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%
8982534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy*/
8983534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristyMagickPrivate MagickBooleanType XRenderImage(Image *image,
8984534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  const DrawInfo *draw_info,const PointInfo *offset,TypeMetric *metrics,
8985534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  ExceptionInfo *exception)
8986534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy{
8987534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  const char
8988534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    *client_name;
8989534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy
8990534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  DrawInfo
8991534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    cache_info;
8992534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy
8993534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  Display
8994534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    *display;
8995534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy
8996534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  ImageInfo
8997534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    *image_info;
8998534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy
8999534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  MagickBooleanType
9000534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    status;
9001534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy
9002534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  size_t
9003534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    height,
9004534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    width;
9005534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy
9006534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  XAnnotateInfo
9007534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    annotate_info;
9008534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy
9009534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  XFontStruct
9010534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    *font_info;
9011534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy
9012534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  XPixelInfo
9013534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    pixel;
9014534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy
9015534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  XResourceInfo
9016534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    resource_info;
9017534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy
9018534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  XrmDatabase
9019534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    resource_database;
9020534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy
9021534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  XStandardColormap
9022534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    *map_info;
9023534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy
9024534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  XVisualInfo
9025534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    *visual_info;
9026534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy
9027534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  /*
9028534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    Open X server connection.
9029534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  */
9030534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  display=XOpenDisplay(draw_info->server_name);
9031534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  if (display == (Display *) NULL)
9032534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    {
9033534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy      ThrowXWindowException(XServerError,"UnableToOpenXServer",
9034534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy        draw_info->server_name);
9035534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy      return(MagickFalse);
9036534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    }
9037534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  /*
9038534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    Get user defaults from X resource database.
9039534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  */
9040534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  (void) XSetErrorHandler(XError);
9041534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  image_info=AcquireImageInfo();
9042534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  client_name=GetClientName();
9043534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  resource_database=XGetResourceDatabase(display,client_name);
9044534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  XGetResourceInfo(image_info,resource_database,client_name,&resource_info);
9045534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  resource_info.close_server=MagickFalse;
9046534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  resource_info.colormap=PrivateColormap;
9047534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  resource_info.font=AcquireString(draw_info->font);
9048534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  resource_info.background_color=AcquireString("#ffffffffffff");
9049534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  resource_info.foreground_color=AcquireString("#000000000000");
9050534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  map_info=XAllocStandardColormap();
9051534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  if (map_info == (XStandardColormap *) NULL)
9052534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    {
9053534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy      ThrowXWindowException(ResourceLimitError,"MemoryAllocationFailed",
9054534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy        image->filename);
9055534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy      return(MagickFalse);
9056534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    }
9057534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  /*
9058534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    Initialize visual info.
9059534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  */
9060534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  visual_info=XBestVisualInfo(display,map_info,&resource_info);
9061534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  if (visual_info == (XVisualInfo *) NULL)
9062534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    {
9063534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy      ThrowXWindowException(XServerError,"UnableToGetVisual",
9064534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy        image->filename);
9065534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy      return(MagickFalse);
9066534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    }
9067534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  map_info->colormap=(Colormap) NULL;
9068534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  pixel.pixels=(unsigned long *) NULL;
9069534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  /*
9070534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    Initialize Standard Colormap info.
9071534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  */
9072534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  XGetMapInfo(visual_info,XDefaultColormap(display,visual_info->screen),
9073534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    map_info);
9074534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  XGetPixelInfo(display,visual_info,map_info,&resource_info,(Image *) NULL,
9075534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    &pixel);
9076534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  pixel.annotate_context=XDefaultGC(display,visual_info->screen);
9077534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  /*
9078534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    Initialize font info.
9079534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  */
9080534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  font_info=XBestFont(display,&resource_info,MagickFalse);
9081534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  if (font_info == (XFontStruct *) NULL)
9082534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    {
9083534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy      ThrowXWindowException(XServerError,"UnableToLoadFont",draw_info->font);
9084534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy      return(MagickFalse);
9085534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    }
9086534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  if ((map_info == (XStandardColormap *) NULL) ||
9087534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy      (visual_info == (XVisualInfo *) NULL) ||
9088534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy      (font_info == (XFontStruct *) NULL))
9089534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    {
9090534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy      XFreeResources(display,visual_info,map_info,&pixel,font_info,
9091534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy        &resource_info,(XWindowInfo *) NULL);
9092534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy      ThrowXWindowException(XServerError,"UnableToLoadFont",image->filename);
9093534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy      return(MagickFalse);
9094534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    }
9095534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  cache_info=(*draw_info);
9096534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  /*
9097534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    Initialize annotate info.
9098534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  */
9099534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  XGetAnnotateInfo(&annotate_info);
9100534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  annotate_info.stencil=ForegroundStencil;
9101534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  if (cache_info.font != draw_info->font)
9102534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    {
9103534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy      /*
9104534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy        Type name has changed.
9105534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy      */
9106534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy      (void) XFreeFont(display,font_info);
9107534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy      (void) CloneString(&resource_info.font,draw_info->font);
9108534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy      font_info=XBestFont(display,&resource_info,MagickFalse);
9109534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy      if (font_info == (XFontStruct *) NULL)
9110534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy        {
9111534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy          ThrowXWindowException(XServerError,"UnableToLoadFont",
9112534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy            draw_info->font);
9113534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy          return(MagickFalse);
9114534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy        }
9115534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    }
9116534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  if (image->debug != MagickFalse)
9117534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    (void) LogMagickEvent(AnnotateEvent,GetMagickModule(),
9118534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy      "Font %s; pointsize %g",draw_info->font != (char *) NULL ?
9119534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy      draw_info->font : "none",draw_info->pointsize);
9120534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  cache_info=(*draw_info);
9121534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  annotate_info.font_info=font_info;
9122534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  annotate_info.text=(char *) draw_info->text;
9123534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  annotate_info.width=(unsigned int) XTextWidth(font_info,draw_info->text,(int)
9124534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    strlen(draw_info->text));
9125534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  annotate_info.height=(unsigned int) font_info->ascent+font_info->descent;
9126534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  metrics->pixels_per_em.x=(double) font_info->max_bounds.width;
9127534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  metrics->pixels_per_em.y=(double) font_info->ascent+font_info->descent;
9128534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  metrics->ascent=(double) font_info->ascent+4;
9129534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  metrics->descent=(double) (-font_info->descent);
9130534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  metrics->width=annotate_info.width/ExpandAffine(&draw_info->affine);
9131534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  metrics->height=font_info->ascent+font_info->descent;
9132534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  metrics->max_advance=(double) font_info->max_bounds.width;
9133534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  metrics->bounds.x1=0.0;
9134534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  metrics->bounds.y1=metrics->descent;
9135534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  metrics->bounds.x2=metrics->ascent+metrics->descent;
9136534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  metrics->bounds.y2=metrics->ascent+metrics->descent;
9137534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  metrics->underline_position=(-2.0);
9138534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  metrics->underline_thickness=1.0;
9139534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  if (draw_info->render == MagickFalse)
9140534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    return(MagickTrue);
9141534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  if (draw_info->fill.alpha == TransparentAlpha)
9142534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    return(MagickTrue);
9143534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  /*
9144534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    Render fill color.
9145534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  */
9146534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  width=annotate_info.width;
9147534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  height=annotate_info.height;
9148534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  if ((fabs(draw_info->affine.rx) >= MagickEpsilon) ||
9149534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy      (fabs(draw_info->affine.ry) >= MagickEpsilon))
9150534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    {
9151534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy      if ((fabs(draw_info->affine.sx-draw_info->affine.sy) < MagickEpsilon) &&
9152534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy          (fabs(draw_info->affine.rx+draw_info->affine.ry) < MagickEpsilon))
9153534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy        annotate_info.degrees=(double) (180.0/MagickPI)*
9154534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy          atan2(draw_info->affine.rx,draw_info->affine.sx);
9155534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    }
9156534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  (void) FormatLocaleString(annotate_info.geometry,MaxTextExtent,
9157534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    "%.20gx%.20g%+.20g%+.20g",(double) width,(double) height,
9158534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    ceil(offset->x-0.5),ceil(offset->y-metrics->ascent-metrics->descent+
9159534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    draw_info->interline_spacing-0.5));
9160534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  pixel.pen_color.red=ScaleQuantumToShort(draw_info->fill.red);
9161534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  pixel.pen_color.green=ScaleQuantumToShort(draw_info->fill.green);
9162534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  pixel.pen_color.blue=ScaleQuantumToShort(draw_info->fill.blue);
9163534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  status=XAnnotateImage(display,&pixel,&annotate_info,image,exception);
9164534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  if (status == 0)
9165534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    {
9166534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy      ThrowXWindowException(ResourceLimitError,"MemoryAllocationFailed",
9167534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy        image->filename);
9168534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy      return(MagickFalse);
9169534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    }
9170534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  return(MagickTrue);
9171534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy}
9172534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy
9173534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy/*
9174534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9175534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%                                                                             %
9176534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%                                                                             %
9177534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%                                                                             %
91783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X R e t a i n W i n d o w C o l o r s                                     %
91793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
91803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
91813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
91823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
91833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
91843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XRetainWindowColors() sets X11 color resources on a window.  This preserves
91853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  the colors associated with an image displayed on the window.
91863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
91873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XRetainWindowColors method is:
91883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
91893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XRetainWindowColors(Display *display,const Window window)
91903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
91913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
91923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
91933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server; returned from
91943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
91953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
91963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies a pointer to a XWindowInfo structure.
91973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
91983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
91993ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport void XRetainWindowColors(Display *display,const Window window)
92003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
92013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Atom
92023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    property;
92033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
92043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Pixmap
92053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixmap;
92063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
92073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
92083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Put property on the window.
92093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
92103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
92113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
92123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(window != (Window) NULL);
92133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  property=XInternAtom(display,"_XSETROOT_ID",MagickFalse);
92143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (property == (Atom) NULL)
92153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
92163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowXWindowFatalException(XServerError,"UnableToCreateProperty",
92173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "_XSETROOT_ID");
92183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return;
92193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
92203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixmap=XCreatePixmap(display,window,1,1,1);
92213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (pixmap == (Pixmap) NULL)
92223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
92233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowXWindowFatalException(XServerError,"UnableToCreateBitmap","");
92243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return;
92253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
92263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XChangeProperty(display,window,property,XA_PIXMAP,32,PropModeReplace,
92273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (unsigned char *) &pixmap,1);
92283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XSetCloseDownMode(display,RetainPermanent);
92293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
92303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
92313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
92323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
92333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
92343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
92353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
92363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X S e l e c t W i n d o w                                                 %
92373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
92383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
92393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
92403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
92413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
92423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XSelectWindow() allows a user to select a window using the mouse.  If the
92433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  mouse moves, a cropping rectangle is drawn and the extents of the rectangle
92443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  is returned in the crop_info structure.
92453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
92463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XSelectWindow function is:
92473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
92483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      target_window=XSelectWindow(display,crop_info)
92493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
92503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
92513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
92523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: XSelectWindow returns the window id.
92533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
92543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a pointer to the Display structure;  returned from
92553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
92563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
92573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o crop_info: Specifies a pointer to a RectangleInfo structure.  It
92583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      contains the extents of any cropping rectangle.
92593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
92603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
92613ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Window XSelectWindow(Display *display,RectangleInfo *crop_info)
92623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
92633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define MinimumCropArea  (unsigned int) 9
92643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
92653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Cursor
92663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    target_cursor;
92673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
92683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  GC
92693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    annotate_context;
92703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
92713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
92723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    presses,
92733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x_offset,
92743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y_offset;
92753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
92763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
92773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
92783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
92793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Window
92803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    root_window,
92813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    target_window;
92823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
92833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XEvent
92843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    event;
92853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
92863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XGCValues
92873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    context_values;
92883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
92893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
92903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize graphic context.
92913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
92923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
92933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
92943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(crop_info != (RectangleInfo *) NULL);
92953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  root_window=XRootWindow(display,XDefaultScreen(display));
92963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  context_values.background=XBlackPixel(display,XDefaultScreen(display));
92973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  context_values.foreground=XWhitePixel(display,XDefaultScreen(display));
92983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  context_values.function=GXinvert;
92993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  context_values.plane_mask=
93003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    context_values.background ^ context_values.foreground;
93013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  context_values.subwindow_mode=IncludeInferiors;
9302bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  annotate_context=XCreateGC(display,root_window,(size_t) (GCBackground |
93033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    GCForeground | GCFunction | GCSubwindowMode),&context_values);
93043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (annotate_context == (GC) NULL)
93053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
93063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
93073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Grab the pointer using target cursor.
93083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
93093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  target_cursor=XMakeCursor(display,root_window,XDefaultColormap(display,
93103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    XDefaultScreen(display)),(char * ) "white",(char * ) "black");
93113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XGrabPointer(display,root_window,MagickFalse,(unsigned int)
93123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (ButtonPressMask | ButtonReleaseMask | ButtonMotionMask),GrabModeSync,
93133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    GrabModeAsync,root_window,target_cursor,CurrentTime);
93143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status != GrabSuccess)
93153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
93163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowXWindowFatalException(XServerError,"UnableToGrabMouse","");
93173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return((Window) NULL);
93183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
93193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
93203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Select a window.
93213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
93223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  crop_info->width=0;
93233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  crop_info->height=0;
93243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  presses=0;
93253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  target_window=(Window) NULL;
93263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  x_offset=0;
93273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  y_offset=0;
93283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  do
93293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
93303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((crop_info->width*crop_info->height) >= MinimumCropArea)
93313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XDrawRectangle(display,root_window,annotate_context,
93323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (int) crop_info->x,(int) crop_info->y,(unsigned int) crop_info->width-1,
93333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (unsigned int) crop_info->height-1);
93343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /*
93353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Allow another event.
93363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    */
93373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XAllowEvents(display,SyncPointer,CurrentTime);
93383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XWindowEvent(display,root_window,ButtonPressMask |
93393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ButtonReleaseMask | ButtonMotionMask,&event);
93403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((crop_info->width*crop_info->height) >= MinimumCropArea)
93413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XDrawRectangle(display,root_window,annotate_context,
93423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (int) crop_info->x,(int) crop_info->y,(unsigned int) crop_info->width-1,
93433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (unsigned int) crop_info->height-1);
93443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    switch (event.type)
93453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
93463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ButtonPress:
93473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
93483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        target_window=XGetSubwindow(display,event.xbutton.subwindow,
93493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          event.xbutton.x,event.xbutton.y);
93503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (target_window == (Window) NULL)
93513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          target_window=root_window;
93523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        x_offset=event.xbutton.x_root;
93533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        y_offset=event.xbutton.y_root;
9354ecd0ab5350482e4a2ea003705e3e0b2120b66384cristy        crop_info->x=(ssize_t) x_offset;
9355ecd0ab5350482e4a2ea003705e3e0b2120b66384cristy        crop_info->y=(ssize_t) y_offset;
93563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        crop_info->width=0;
93573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        crop_info->height=0;
93583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        presses++;
93593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
93603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
93613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ButtonRelease:
93623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
93633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        presses--;
93643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
93653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
93663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case MotionNotify:
93673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
93683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
93693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Discard pending button motion events.
93703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
93713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
9372ecd0ab5350482e4a2ea003705e3e0b2120b66384cristy        crop_info->x=(ssize_t) event.xmotion.x;
9373ecd0ab5350482e4a2ea003705e3e0b2120b66384cristy        crop_info->y=(ssize_t) event.xmotion.y;
93743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
93753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Check boundary conditions.
93763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
93773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((int) crop_info->x < x_offset)
9378ecd0ab5350482e4a2ea003705e3e0b2120b66384cristy          crop_info->width=(size_t) (x_offset-crop_info->x);
93793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        else
93803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
9381ecd0ab5350482e4a2ea003705e3e0b2120b66384cristy            crop_info->width=(size_t) (crop_info->x-x_offset);
9382ecd0ab5350482e4a2ea003705e3e0b2120b66384cristy            crop_info->x=(ssize_t) x_offset;
93833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
93843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((int) crop_info->y < y_offset)
9385ecd0ab5350482e4a2ea003705e3e0b2120b66384cristy          crop_info->height=(size_t) (y_offset-crop_info->y);
93863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        else
93873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
9388ecd0ab5350482e4a2ea003705e3e0b2120b66384cristy            crop_info->height=(size_t) (crop_info->y-y_offset);
9389ecd0ab5350482e4a2ea003705e3e0b2120b66384cristy            crop_info->y=(ssize_t) y_offset;
93903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
93913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
93923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      default:
93933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
93943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
93953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  } while ((target_window == (Window) NULL) || (presses > 0));
93963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XUngrabPointer(display,CurrentTime);
93973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFreeCursor(display,target_cursor);
93983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFreeGC(display,annotate_context);
93993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((crop_info->width*crop_info->height) < MinimumCropArea)
94003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
94013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      crop_info->width=0;
94023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      crop_info->height=0;
94033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
94043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((crop_info->width != 0) && (crop_info->height != 0))
94053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    target_window=root_window;
94063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(target_window);
94073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
94083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
94093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
94103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
94113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
94123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
94133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
94143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X S e t C u r s o r S t a t e                                             %
94153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
94163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
94173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
94183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
94193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
94203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XSetCursorState() sets the cursor state to busy, otherwise the cursor are
94213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  reset to their default.
94223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
94233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XXSetCursorState method is:
94243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
94253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XSetCursorState(display,windows,const MagickStatusType state)
94263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
94273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
94283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
94293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
94303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
94313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
94323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o windows: Specifies a pointer to a XWindows structure.
94333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
94343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o state: An unsigned integer greater than 0 sets the cursor state
94353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      to busy, otherwise the cursor are reset to their default.
94363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
94373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
9438bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XSetCursorState(Display *display,XWindows *windows,
94393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const MagickStatusType state)
94403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
94413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
94423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
94433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(windows != (XWindows *) NULL);
94443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (state)
94453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
94463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XCheckDefineCursor(display,windows->image.id,
94473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->image.busy_cursor);
94483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XCheckDefineCursor(display,windows->pan.id,
94493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->pan.busy_cursor);
94503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XCheckDefineCursor(display,windows->magnify.id,
94513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->magnify.busy_cursor);
94523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XCheckDefineCursor(display,windows->command.id,
94533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->command.busy_cursor);
94543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
94553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
94563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
94573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XCheckDefineCursor(display,windows->image.id,
94583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->image.cursor);
94593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XCheckDefineCursor(display,windows->pan.id,windows->pan.cursor);
94603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XCheckDefineCursor(display,windows->magnify.id,
94613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->magnify.cursor);
94623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XCheckDefineCursor(display,windows->command.id,
94633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->command.cursor);
94643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XCheckDefineCursor(display,windows->command.id,
94653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->widget.cursor);
94663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XWithdrawWindow(display,windows->info.id,windows->info.screen);
94673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
94683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->info.mapped=MagickFalse;
94693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
94703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
94713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
94723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
94733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
94743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
94753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
94763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X S e t W i n d o w s                                                     %
94773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
94783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
94793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
94803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
94813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
94823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XSetWindows() sets the X windows structure if the windows info is specified.
94833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  Otherwise the current windows structure is returned.
94843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
94853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XSetWindows method is:
94863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
94873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XWindows *XSetWindows(XWindows *windows_info)
94883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
94893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
94903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
94913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o windows_info: Initialize the Windows structure with this information.
94923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
94933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
9494bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate XWindows *XSetWindows(XWindows *windows_info)
94953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
94963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static XWindows
94973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *windows = (XWindows *) NULL;
94983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
94993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows_info != (XWindows *) ~0)
95003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
95013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      windows=(XWindows *) RelinquishMagickMemory(windows);
95023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      windows=windows_info;
95033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
95043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(windows);
95053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
95063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
95073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
95083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
95093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
95103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
95113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X U s e r P r e f e r e n c e s                                           %
95123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
95133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
95143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
95153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
95163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
95173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XUserPreferences() saves the preferences in a configuration file in the
95183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  users' home directory.
95193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
95203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XUserPreferences method is:
95213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
95223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XUserPreferences(XResourceInfo *resource_info)
95233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
95243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
95253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
95263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
95273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
95283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
9529bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XUserPreferences(XResourceInfo *resource_info)
95303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
95313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(X11_PREFERENCES_PATH)
95323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
95333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    cache[MaxTextExtent],
95343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    filename[MaxTextExtent],
95353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    specifier[MaxTextExtent];
95363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
95373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char
9538104cea817534e8601291610f22e496c10f8f9ddbcristy    *client_name,
95393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *value;
95403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
95413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XrmDatabase
95423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    preferences_database;
95433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
95443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
95453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Save user preferences to the client configuration file.
95463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
95473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(resource_info != (XResourceInfo *) NULL);
9548104cea817534e8601291610f22e496c10f8f9ddbcristy  client_name=GetClientName();
95493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  preferences_database=XrmGetStringDatabase("");
9550b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleString(specifier,MaxTextExtent,"%s.backdrop",client_name);
95513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  value=resource_info->backdrop ? "True" : "False";
95523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XrmPutStringResource(&preferences_database,specifier,(char *) value);
9553b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleString(specifier,MaxTextExtent,"%s.colormap",client_name);
95543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  value=resource_info->colormap == SharedColormap ? "Shared" : "Private";
95553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XrmPutStringResource(&preferences_database,specifier,(char *) value);
9556b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleString(specifier,MaxTextExtent,"%s.confirmExit",
9557104cea817534e8601291610f22e496c10f8f9ddbcristy    client_name);
95583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  value=resource_info->confirm_exit ? "True" : "False";
95593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XrmPutStringResource(&preferences_database,specifier,(char *) value);
9560b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleString(specifier,MaxTextExtent,"%s.confirmEdit",
9561104cea817534e8601291610f22e496c10f8f9ddbcristy    client_name);
95623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  value=resource_info->confirm_edit ? "True" : "False";
95633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XrmPutStringResource(&preferences_database,specifier,(char *) value);
9564b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleString(specifier,MaxTextExtent,"%s.displayWarnings",
9565104cea817534e8601291610f22e496c10f8f9ddbcristy    client_name);
95663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  value=resource_info->display_warnings ? "True" : "False";
95673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XrmPutStringResource(&preferences_database,specifier,(char *) value);
9568b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleString(specifier,MaxTextExtent,"%s.dither",client_name);
9569cbda611068350bf4459f2dda1951f8823702e129cristy  value=resource_info->quantize_info->dither_method != NoDitherMethod ?
9570cbda611068350bf4459f2dda1951f8823702e129cristy    "True" : "False";
95713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XrmPutStringResource(&preferences_database,specifier,(char *) value);
9572b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleString(specifier,MaxTextExtent,"%s.gammaCorrect",
9573104cea817534e8601291610f22e496c10f8f9ddbcristy    client_name);
95743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  value=resource_info->gamma_correct ? "True" : "False";
95753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XrmPutStringResource(&preferences_database,specifier,(char *) value);
9576b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleString(specifier,MaxTextExtent,"%s.undoCache",client_name);
9577b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleString(cache,MaxTextExtent,"%.20g",(double)
95783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    resource_info->undo_cache);
95793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XrmPutStringResource(&preferences_database,specifier,cache);
9580b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleString(specifier,MaxTextExtent,"%s.usePixmap",client_name);
95813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  value=resource_info->use_pixmap ? "True" : "False";
95823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XrmPutStringResource(&preferences_database,specifier,(char *) value);
9583b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleString(filename,MaxTextExtent,"%s%src",
9584104cea817534e8601291610f22e496c10f8f9ddbcristy    X11_PREFERENCES_PATH,client_name);
95853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ExpandFilename(filename);
95863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XrmPutFileDatabase(preferences_database,filename);
95873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
95883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
95893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
95903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
95913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
95923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
95933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
95943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
95953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X V i s u a l C l a s s N a m e                                           %
95963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
95973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
95983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
95993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
96003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
96013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XVisualClassName() returns the visual class name as a character string.
96023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
96033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XVisualClassName method is:
96043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
96053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      char *XVisualClassName(const int visual_class)
96063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
96073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
96083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
96093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o visual_type: XVisualClassName returns the visual class as a character
96103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      string.
96113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
96123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o class: Specifies the visual class.
96133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
96143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
96153ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic const char *XVisualClassName(const int visual_class)
96163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
96173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  switch (visual_class)
96183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
96193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case StaticGray: return("StaticGray");
96203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case GrayScale: return("GrayScale");
96213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case StaticColor: return("StaticColor");
96223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case PseudoColor: return("PseudoColor");
96233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case TrueColor: return("TrueColor");
96243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case DirectColor: return("DirectColor");
96253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
96263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return("unknown visual class");
96273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
96283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
96293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
96303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
96313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
96323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
96333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
96343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X W a r n i n g                                                           %
96353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
96363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
96373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
96383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
96393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
96403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XWarning() displays a warning reason in a Notice widget.
96413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
96423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XWarning method is:
96433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
96443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XWarning(const unsigned int warning,const char *reason,
96453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *description)
96463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
96473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
96483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
96493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o warning: Specifies the numeric warning category.
96503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
96513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o reason: Specifies the reason to display before terminating the
96523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      program.
96533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
96543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o description: Specifies any description to the reason.
96553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
96563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
9657bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XWarning(const ExceptionType magick_unused(warning),
96583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *reason,const char *description)
96593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
96603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
96613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    text[MaxTextExtent];
96623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
96633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWindows
96643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *windows;
96653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
96663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (reason == (char *) NULL)
96673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return;
96683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) CopyMagickString(text,reason,MaxTextExtent);
96693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ConcatenateMagickString(text,":",MaxTextExtent);
96703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows=XSetWindows((XWindows *) ~0);
96713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XNoticeWidget(windows->display,windows,text,(char *) description);
96723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
96733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
96743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
96753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
96763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
96773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
96783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
96793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X W i n d o w B y I D                                                     %
96803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
96813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
96823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
96833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
96843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
96853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XWindowByID() locates a child window with a given ID.  If not window with
96863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  the given name is found, 0 is returned.   Only the window specified and its
96873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  subwindows are searched.
96883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
96893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XWindowByID function is:
96903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
96913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      child=XWindowByID(display,window,id)
96923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
96933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
96943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
96953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o child: XWindowByID returns the window with the specified
96963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      id.  If no windows are found, XWindowByID returns 0.
96973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
96983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a pointer to the Display structure;  returned from
96993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
97003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
97013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o id: Specifies the id of the window to locate.
97023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
97033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
9704bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate Window XWindowByID(Display *display,const Window root_window,
9705bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  const size_t id)
97063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
97073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  RectangleInfo
97083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    rectangle_info;
97093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
97103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register int
97113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
97123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
97133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
97143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
97153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
97163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
97173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_children;
97183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
97193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Window
97203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    child,
97213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *children,
97223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window;
97233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
97243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
97253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
97263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(root_window != (Window) NULL);
97273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (id == 0)
97283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(XSelectWindow(display,&rectangle_info));
97293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (root_window == id)
9730dfe2b6658f367de8f84405263f62768fb853adafcristy    return(root_window);
97313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XQueryTree(display,root_window,&child,&child,&children,
97323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    &number_children);
97333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status == False)
97343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((Window) NULL);
97353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window=(Window) NULL;
97363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; i < (int) number_children; i++)
97373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
97383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /*
97393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Search each child and their children.
97403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    */
97413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window=XWindowByID(display,children[i],id);
97423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (window != (Window) NULL)
97433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
97443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
97453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (children != (Window *) NULL)
97463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XFree((void *) children);
97473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(window);
97483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
97493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
97503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
97513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
97523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
97533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
97543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
97553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X W i n d o w B y N a m e                                                 %
97563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
97573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
97583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
97593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
97603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
97613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XWindowByName() locates a window with a given name on a display.  If no
97623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  window with the given name is found, 0 is returned. If more than one window
97633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  has the given name, the first one is returned.  Only root and its children
97643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  are searched.
97653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
97663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XWindowByName function is:
97673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
97683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      window=XWindowByName(display,root_window,name)
97693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
97703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
97713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
97723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: XWindowByName returns the window id.
97733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
97743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a pointer to the Display structure;  returned from
97753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
97763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
97773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o root_window: Specifies the id of the root window.
97783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
97793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o name: Specifies the name of the window to locate.
97803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
97813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
9782bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate Window XWindowByName(Display *display,const Window root_window,
97833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *name)
97843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
97853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register int
97863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
97873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
97883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
97893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
97903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
97913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
97923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_children;
97933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
97943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Window
97953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *children,
97963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    child,
97973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window;
97983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
97993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XTextProperty
98003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window_name;
98013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
98023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
98033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(root_window != (Window) NULL);
98043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(name != (char *) NULL);
98053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",name);
98063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (XGetWMName(display,root_window,&window_name) != 0)
98073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (LocaleCompare((char *) window_name.value,name) == 0)
98083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return(root_window);
98093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XQueryTree(display,root_window,&child,&child,&children,
98103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    &number_children);
98113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status == False)
98123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((Window) NULL);
98133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window=(Window) NULL;
98143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; i < (int) number_children; i++)
98153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
98163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /*
98173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Search each child and their children.
98183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    */
98193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window=XWindowByName(display,children[i],name);
98203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (window != (Window) NULL)
98213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
98223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
98233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (children != (Window *) NULL)
98243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XFree((void *) children);
98253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(window);
98263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
98273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
98283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
98293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
98303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
98313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
98323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
98333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X W i n d o w B y P r o p e r y                                           %
98343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
98353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
98363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
98373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
98383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
98393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XWindowByProperty() locates a child window with a given property. If not
98403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  window with the given name is found, 0 is returned.  If more than one window
98413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  has the given property, the first one is returned.  Only the window
98423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  specified and its subwindows are searched.
98433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
98443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XWindowByProperty function is:
98453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
98463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      child=XWindowByProperty(display,window,property)
98473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
98483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
98493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
98503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o child: XWindowByProperty returns the window id with the specified
98513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      property.  If no windows are found, XWindowByProperty returns 0.
98523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
98533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a pointer to the Display structure;  returned from
98543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
98553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
98563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o property: Specifies the property of the window to locate.
98573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
98583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
9859bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate Window XWindowByProperty(Display *display,const Window window,
98603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const Atom property)
98613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
98623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Atom
98633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    type;
98643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
98653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
98663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    format;
98673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
98683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
98693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
98703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
98713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned char
98723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *data;
98733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
98743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
98753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
98763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_children;
98773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9878f2faecf9facdbbb14fcba373365f9f691a9658e0cristy  unsigned long
98793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    after,
98803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_items;
98813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
98823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Window
98833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    child,
98843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *children,
98853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    parent,
98863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    root;
98873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
98883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
98893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
98903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(window != (Window) NULL);
98913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(property != (Atom) NULL);
98923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XQueryTree(display,window,&root,&parent,&children,&number_children);
98933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status == False)
98943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((Window) NULL);
98953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  type=(Atom) NULL;
98963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  child=(Window) NULL;
98973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; (i < number_children) && (child == (Window) NULL); i++)
98983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
98993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status=XGetWindowProperty(display,children[i],property,0L,0L,MagickFalse,
99003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (Atom) AnyPropertyType,&type,&format,&number_items,&after,&data);
99013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (data != NULL)
99023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XFree((void *) data);
99033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((status == Success) && (type != (Atom) NULL))
99043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      child=children[i];
99053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
99063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; (i < number_children) && (child == (Window) NULL); i++)
99073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    child=XWindowByProperty(display,children[i],property);
99083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (children != (Window *) NULL)
99093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XFree((void *) children);
99103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(child);
99113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
99123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else
99133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
99143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
99153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
99163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
99173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
99183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
99193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X I m p o r t I m a g e                                                   %
99203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
99213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
99223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
99233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
99243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
99253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XImportImage() reads an image from an X window.
99263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
99273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XImportImage method is:
99283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9929a0dc96a5df0a380c9ef855cc7f2a5f264bec8af3cristy%      Image *XImportImage(const ImageInfo *image_info,XImportInfo *ximage_info,
9930a0dc96a5df0a380c9ef855cc7f2a5f264bec8af3cristy%        ExceptionInfo *exception)
99313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
99323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
99333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
99343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image_info: the image info..
99353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
99363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o ximage_info: Specifies a pointer to an XImportInfo structure.
99373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9938a0dc96a5df0a380c9ef855cc7f2a5f264bec8af3cristy%    o exception: return any errors or warnings in this structure.
9939a0dc96a5df0a380c9ef855cc7f2a5f264bec8af3cristy%
99403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
99414bc52025ac134838f6a62b8dc8ea6cfacab91796cristyMagickExport Image *XImportImage(const ImageInfo *image_info,
9942a0dc96a5df0a380c9ef855cc7f2a5f264bec8af3cristy  XImportInfo *ximage_info,ExceptionInfo *exception)
99433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
99443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image_info != (const ImageInfo *) NULL);
99453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image_info->signature == MagickSignature);
99463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image_info->debug != MagickFalse)
99473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
99483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image_info->filename);
99493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(ximage_info != (XImportInfo *) NULL);
9950a0dc96a5df0a380c9ef855cc7f2a5f264bec8af3cristy  assert(exception != (ExceptionInfo *) NULL);
9951a0dc96a5df0a380c9ef855cc7f2a5f264bec8af3cristy  assert(exception->signature == MagickSignature);
99523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return((Image *) NULL);
99533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
9954534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy
9955534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy/*
9956534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9957534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%                                                                             %
9958534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%                                                                             %
9959534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%                                                                             %
9960534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%   X R e n d e r X 1 1                                                       %
9961534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%                                                                             %
9962534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%                                                                             %
9963534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%                                                                             %
9964534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9965534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%
9966534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%  XRenderImage() renders text on the image with an X11 font.  It also returns
9967534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%  the bounding box of the text relative to the image.
9968534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%
9969534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%  The format of the XRenderImage method is:
9970534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%
9971534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%      MagickBooleanType XRenderImage(Image *image,DrawInfo *draw_info,
9972534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%        const PointInfo *offset,TypeMetric *metrics,ExceptionInfo *exception)
9973534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%
9974534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%  A description of each parameter follows:
9975534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%
9976534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%    o image: the image.
9977534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%
9978534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%    o draw_info: the draw info.
9979534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%
9980534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%    o offset: (x,y) location of text relative to image.
9981534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%
9982534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%    o metrics: bounding box of text.
9983534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%
9984534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%    o exception: return any errors or warnings in this structure.
9985534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy%
9986534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy*/
9987534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristyMagickPrivate MagickBooleanType XRenderImage(Image *image,
9988534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  const DrawInfo *draw_info,const PointInfo *offset,TypeMetric *metrics,
9989534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  ExceptionInfo *exception)
9990534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy{
9991534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  (void) draw_info;
9992534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  (void) offset;
9993534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  (void) metrics;
9994534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  (void) ThrowMagickException(exception,GetMagickModule(),
9995534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    MissingDelegateError,"DelegateLibrarySupportNotBuiltIn","'%s' (X11)",
9996534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy    image->filename);
9997534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy  return(MagickFalse);
9998534d0a353b31242ce2f7b26c4eb4fe53f914d0f5cristy}
99993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
100003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
100013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
100023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
100033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
100043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
100053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10006576974eba31c1fac74b2492a74862b2fcd50f21ccristy+   X C o m p o n e n t G e n e s i s                                         %
10007576974eba31c1fac74b2492a74862b2fcd50f21ccristy%                                                                             %
10008576974eba31c1fac74b2492a74862b2fcd50f21ccristy%                                                                             %
10009576974eba31c1fac74b2492a74862b2fcd50f21ccristy%                                                                             %
10010576974eba31c1fac74b2492a74862b2fcd50f21ccristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10011576974eba31c1fac74b2492a74862b2fcd50f21ccristy%
10012576974eba31c1fac74b2492a74862b2fcd50f21ccristy%  XComponentGenesis() instantiates the X component.
10013576974eba31c1fac74b2492a74862b2fcd50f21ccristy%
10014576974eba31c1fac74b2492a74862b2fcd50f21ccristy%  The format of the XComponentGenesis method is:
10015576974eba31c1fac74b2492a74862b2fcd50f21ccristy%
10016576974eba31c1fac74b2492a74862b2fcd50f21ccristy%      MagickBooleanType XComponentGenesis(void)
10017576974eba31c1fac74b2492a74862b2fcd50f21ccristy%
10018576974eba31c1fac74b2492a74862b2fcd50f21ccristy*/
100195ff4eaf57b3cd47d0371f204f865cbba614674a0cristyMagickPrivate MagickBooleanType XComponentGenesis(void)
10020576974eba31c1fac74b2492a74862b2fcd50f21ccristy{
10021576974eba31c1fac74b2492a74862b2fcd50f21ccristy  return(MagickTrue);
10022576974eba31c1fac74b2492a74862b2fcd50f21ccristy}
10023576974eba31c1fac74b2492a74862b2fcd50f21ccristy
10024576974eba31c1fac74b2492a74862b2fcd50f21ccristy/*
10025576974eba31c1fac74b2492a74862b2fcd50f21ccristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10026576974eba31c1fac74b2492a74862b2fcd50f21ccristy%                                                                             %
10027576974eba31c1fac74b2492a74862b2fcd50f21ccristy%                                                                             %
10028576974eba31c1fac74b2492a74862b2fcd50f21ccristy%                                                                             %
100293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X G e t I m p o r t I n f o                                               %
100303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
100313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
100323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
100333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
100343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
100353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XGetImportInfo() initializes the XImportInfo structure.
100363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
100373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XGetImportInfo method is:
100383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
100393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XGetImportInfo(XImportInfo *ximage_info)
100403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
100413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
100423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
100433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o ximage_info: Specifies a pointer to an ImageInfo structure.
100443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
100453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
100463ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport void XGetImportInfo(XImportInfo *ximage_info)
100473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
100483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(ximage_info != (XImportInfo *) NULL);
100493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ximage_info->frame=MagickFalse;
100503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ximage_info->borders=MagickFalse;
100513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ximage_info->screen=MagickFalse;
100523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ximage_info->descend=MagickTrue;
100533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ximage_info->silent=MagickFalse;
100543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
10055