2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6 % X X W W IIIII N N DDDD OOO W W %
7 % X X W W I NN N D D O O W W %
8 % X W W I N N N D D O O W W %
9 % X X W W W I N NN D D O O W W W %
10 % X X W W IIIII N N DDDD OOO W W %
13 % MagickCore X11 Utility Methods %
20 % Copyright 1999-2011 ImageMagick Studio LLC, a non-profit organization %
21 % dedicated to making software imaging solutions freely available. %
23 % You may not use this file except in compliance with the License. You may %
24 % obtain a copy of the License at %
26 % http://www.imagemagick.org/script/license.php %
28 % Unless required by applicable law or agreed to in writing, software %
29 % distributed under the License is distributed on an "AS IS" BASIS, %
30 % WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %
31 % See the License for the specific language governing permissions and %
32 % limitations under the License. %
34 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
42 #include "magick/studio.h"
43 #include "magick/animate.h"
44 #include "magick/artifact.h"
45 #include "magick/blob.h"
46 #include "magick/cache.h"
47 #include "magick/client.h"
48 #include "magick/color.h"
49 #include "magick/color-private.h"
50 #include "magick/colormap.h"
51 #include "magick/composite.h"
52 #include "magick/display.h"
53 #include "magick/exception.h"
54 #include "magick/exception-private.h"
55 #include "magick/geometry.h"
56 #include "magick/identify.h"
57 #include "magick/image.h"
58 #include "magick/image-private.h"
59 #include "magick/list.h"
60 #include "magick/locale_.h"
61 #include "magick/log.h"
62 #include "magick/magick.h"
63 #include "magick/memory_.h"
64 #include "magick/monitor.h"
65 #include "magick/option.h"
66 #include "magick/PreRvIcccm.h"
67 #include "magick/quantize.h"
68 #include "magick/quantum.h"
69 #include "magick/quantum-private.h"
70 #include "magick/resource_.h"
71 #include "magick/resize.h"
72 #include "magick/shear.h"
73 #include "magick/statistic.h"
74 #include "magick/string_.h"
75 #include "magick/string-private.h"
76 #include "magick/transform.h"
77 #include "magick/utility.h"
78 #include "magick/widget.h"
79 #include "magick/xwindow.h"
80 #include "magick/xwindow-private.h"
81 #include "magick/version.h"
85 #if defined(MAGICKCORE_X11_DELEGATE)
86 #include <X11/Xproto.h>
87 #include <X11/Xlocale.h>
88 #if defined(MAGICK_HAVE_POLL)
89 # include <sys/poll.h>
91 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
92 #if defined(MAGICKCORE_HAVE_MACHINE_PARAM_H)
93 # include <machine/param.h>
97 #include <X11/extensions/XShm.h>
99 #if defined(MAGICKCORE_HAVE_SHAPE)
100 #include <X11/extensions/shape.h>
106 #define XBlueGamma(color) ClampToQuantum(blue_gamma == 1.0 ? (double) \
107 (color) : ((pow(((double) QuantumScale*(color)),1.0/(double) blue_gamma)* \
109 #define XGammaPixel(map,color) (size_t) (map->base_pixel+ \
110 ((ScaleQuantumToShort(XRedGamma((color)->red))*map->red_max/65535L)* \
112 ((ScaleQuantumToShort(XGreenGamma((color)->green))*map->green_max/65535L)* \
114 ((ScaleQuantumToShort(XBlueGamma((color)->blue))*map->blue_max/65535L)* \
116 #define XGreenGamma(color) ClampToQuantum(green_gamma == 1.0 ? (double) \
117 (color) : ((pow(((double) QuantumScale*(color)),1.0/(double) green_gamma)* \
119 #define XRedGamma(color) ClampToQuantum(red_gamma == 1.0 ? (double) \
120 (color) : ((pow(((double) QuantumScale*(color)),1.0/(double) red_gamma)* \
122 #define XStandardPixel(map,color) (size_t) (map->base_pixel+ \
123 (((color)->red*map->red_max/65535L)*map->red_mult)+ \
124 (((color)->green*map->green_max/65535L)*map->green_mult)+ \
125 (((color)->blue*map->blue_max/65535L)*map->blue_mult))
127 #define AccentuateModulate ScaleCharToQuantum(80)
128 #define HighlightModulate ScaleCharToQuantum(125)
129 #define ShadowModulate ScaleCharToQuantum(135)
130 #define DepthModulate ScaleCharToQuantum(185)
131 #define TroughModulate ScaleCharToQuantum(110)
133 #define XLIB_ILLEGAL_ACCESS 1
135 #undef NorthWestGravity
137 #undef NorthEastGravity
141 #undef SouthWestGravity
143 #undef SouthEastGravity
150 #define XFD_SET fd_set
154 Enumeration declarations.
168 Typedef declarations.
170 typedef struct _DiversityPacket
185 Constant declaractions.
187 static MagickBooleanType
188 xerror_alert = MagickFalse;
194 *XVisualClassName(const int);
196 static MagickRealType
201 static MagickBooleanType
202 XMakePixmap(Display *,const XResourceInfo *,XWindowInfo *);
205 XMakeImageLSBFirst(const XResourceInfo *,const XWindowInfo *,Image *,
207 XMakeImageMSBFirst(const XResourceInfo *,const XWindowInfo *,Image *,
211 XSelectWindow(Display *,RectangleInfo *);
214 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
218 % D e s t r o y X R e s o u r c e s %
222 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
224 % DestroyXResources() destroys any X resources.
226 % The format of the DestroyXResources method is:
228 % void DestroyXResources()
230 % A description of each parameter follows:
233 MagickExport void DestroyXResources(void)
242 *magick_windows[MaxXWindows];
248 windows=XSetWindows((XWindows *) ~0);
249 if ((windows == (XWindows *) NULL) || (windows->display == (Display *) NULL))
252 magick_windows[number_windows++]=(&windows->context);
253 magick_windows[number_windows++]=(&windows->group_leader);
254 magick_windows[number_windows++]=(&windows->backdrop);
255 magick_windows[number_windows++]=(&windows->icon);
256 magick_windows[number_windows++]=(&windows->image);
257 magick_windows[number_windows++]=(&windows->info);
258 magick_windows[number_windows++]=(&windows->magnify);
259 magick_windows[number_windows++]=(&windows->pan);
260 magick_windows[number_windows++]=(&windows->command);
261 magick_windows[number_windows++]=(&windows->widget);
262 magick_windows[number_windows++]=(&windows->popup);
263 magick_windows[number_windows++]=(&windows->context);
264 for (i=0; i < (int) number_windows; i++)
266 if (magick_windows[i]->mapped != MagickFalse)
268 (void) XWithdrawWindow(windows->display,magick_windows[i]->id,
269 magick_windows[i]->screen);
270 magick_windows[i]->mapped=MagickFalse;
272 if (magick_windows[i]->name != (char *) NULL)
273 magick_windows[i]->name=(char *)
274 RelinquishMagickMemory(magick_windows[i]->name);
275 if (magick_windows[i]->icon_name != (char *) NULL)
276 magick_windows[i]->icon_name=(char *)
277 RelinquishMagickMemory(magick_windows[i]->icon_name);
278 if (magick_windows[i]->cursor != (Cursor) NULL)
280 (void) XFreeCursor(windows->display,magick_windows[i]->cursor);
281 magick_windows[i]->cursor=(Cursor) NULL;
283 if (magick_windows[i]->busy_cursor != (Cursor) NULL)
285 (void) XFreeCursor(windows->display,magick_windows[i]->busy_cursor);
286 magick_windows[i]->busy_cursor=(Cursor) NULL;
288 if (magick_windows[i]->highlight_stipple != (Pixmap) NULL)
290 (void) XFreePixmap(windows->display,
291 magick_windows[i]->highlight_stipple);
292 magick_windows[i]->highlight_stipple=(Pixmap) NULL;
294 if (magick_windows[i]->shadow_stipple != (Pixmap) NULL)
296 (void) XFreePixmap(windows->display,magick_windows[i]->shadow_stipple);
297 magick_windows[i]->shadow_stipple=(Pixmap) NULL;
299 if (magick_windows[i]->ximage != (XImage *) NULL)
301 XDestroyImage(magick_windows[i]->ximage);
302 magick_windows[i]->ximage=(XImage *) NULL;
304 if (magick_windows[i]->pixmap != (Pixmap) NULL)
306 (void) XFreePixmap(windows->display,magick_windows[i]->pixmap);
307 magick_windows[i]->pixmap=(Pixmap) NULL;
309 if (magick_windows[i]->id != (Window) NULL)
311 (void) XDestroyWindow(windows->display,magick_windows[i]->id);
312 magick_windows[i]->id=(Window) NULL;
314 if (magick_windows[i]->destroy != MagickFalse)
316 if (magick_windows[i]->image != (Image *) NULL)
318 magick_windows[i]->image=DestroyImage(magick_windows[i]->image);
319 magick_windows[i]->image=NewImageList();
321 if (magick_windows[i]->matte_pixmap != (Pixmap) NULL)
323 (void) XFreePixmap(windows->display,
324 magick_windows[i]->matte_pixmap);
325 magick_windows[i]->matte_pixmap=(Pixmap) NULL;
328 if (magick_windows[i]->segment_info != (void *) NULL)
330 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
334 segment_info=(XShmSegmentInfo *) magick_windows[i]->segment_info;
335 if (segment_info != (XShmSegmentInfo *) NULL)
336 if (segment_info[0].shmid >= 0)
338 if (segment_info[0].shmaddr != NULL)
339 (void) shmdt(segment_info[0].shmaddr);
340 (void) shmctl(segment_info[0].shmid,IPC_RMID,0);
341 segment_info[0].shmaddr=NULL;
342 segment_info[0].shmid=(-1);
345 magick_windows[i]->segment_info=(void *)
346 RelinquishMagickMemory(magick_windows[i]->segment_info);
349 windows->icon_resources=(XResourceInfo *)
350 RelinquishMagickMemory(windows->icon_resources);
351 if (windows->icon_pixel != (XPixelInfo *) NULL)
353 if (windows->icon_pixel->pixels != (unsigned long *) NULL)
354 windows->icon_pixel->pixels=(unsigned long *)
355 RelinquishMagickMemory(windows->icon_pixel->pixels);
356 if (windows->icon_pixel->annotate_context != (GC) NULL)
357 XFreeGC(windows->display,windows->icon_pixel->annotate_context);
358 windows->icon_pixel=(XPixelInfo *)
359 RelinquishMagickMemory(windows->icon_pixel);
361 if (windows->pixel_info != (XPixelInfo *) NULL)
363 if (windows->pixel_info->pixels != (unsigned long *) NULL)
364 windows->pixel_info->pixels=(unsigned long *)
365 RelinquishMagickMemory(windows->pixel_info->pixels);
366 if (windows->pixel_info->annotate_context != (GC) NULL)
367 XFreeGC(windows->display,windows->pixel_info->annotate_context);
368 if (windows->pixel_info->widget_context != (GC) NULL)
369 XFreeGC(windows->display,windows->pixel_info->widget_context);
370 if (windows->pixel_info->highlight_context != (GC) NULL)
371 XFreeGC(windows->display,windows->pixel_info->highlight_context);
372 windows->pixel_info=(XPixelInfo *)
373 RelinquishMagickMemory(windows->pixel_info);
375 if (windows->font_info != (XFontStruct *) NULL)
377 XFreeFont(windows->display,windows->font_info);
378 windows->font_info=(XFontStruct *) NULL;
380 if (windows->class_hints != (XClassHint *) NULL)
382 if (windows->class_hints->res_name != (char *) NULL)
383 XFree(windows->class_hints->res_name);
384 if (windows->class_hints->res_class != (char *) NULL)
385 XFree(windows->class_hints->res_class);
386 XFree(windows->class_hints);
387 windows->class_hints=(XClassHint *) NULL;
389 if (windows->manager_hints != (XWMHints *) NULL)
391 XFree(windows->manager_hints);
392 windows->manager_hints=(XWMHints *) NULL;
394 if (windows->map_info != (XStandardColormap *) NULL)
396 XFree(windows->map_info);
397 windows->map_info=(XStandardColormap *) NULL;
399 if (windows->icon_map != (XStandardColormap *) NULL)
401 XFree(windows->icon_map);
402 windows->icon_map=(XStandardColormap *) NULL;
404 if (windows->visual_info != (XVisualInfo *) NULL)
406 XFree(windows->visual_info);
407 windows->visual_info=(XVisualInfo *) NULL;
409 if (windows->icon_visual != (XVisualInfo *) NULL)
411 XFree(windows->icon_visual);
412 windows->icon_visual=(XVisualInfo *) NULL;
414 (void) XSetWindows((XWindows *) NULL);
418 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
422 % X A n n o t a t e I m a g e %
426 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
428 % XAnnotateImage() annotates the image with text.
430 % The format of the XAnnotateImage method is:
432 % MagickBooleanType XAnnotateImage(Display *display,
433 % const XPixelInfo *pixel,XAnnotateInfo *annotate_info,Image *image)
435 % A description of each parameter follows:
437 % o display: Specifies a connection to an X server; returned from
440 % o pixel: Specifies a pointer to a XPixelInfo structure.
442 % o annotate_info: Specifies a pointer to a XAnnotateInfo structure.
444 % o image: the image.
447 MagickExport MagickBooleanType XAnnotateImage(Display *display,
448 const XPixelInfo *pixel,XAnnotateInfo *annotate_info,Image *image)
487 Initialize annotated image.
489 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
490 assert(display != (Display *) NULL);
491 assert(pixel != (XPixelInfo *) NULL);
492 assert(annotate_info != (XAnnotateInfo *) NULL);
493 assert(image != (Image *) NULL);
495 Initialize annotated pixmap.
497 root_window=XRootWindow(display,XDefaultScreen(display));
498 depth=(unsigned int) XDefaultDepth(display,XDefaultScreen(display));
499 annotate_pixmap=XCreatePixmap(display,root_window,annotate_info->width,
500 annotate_info->height,depth);
501 if (annotate_pixmap == (Pixmap) NULL)
504 Initialize graphics info.
506 context_values.background=0;
507 context_values.foreground=(size_t) (~0);
508 context_values.font=annotate_info->font_info->fid;
509 annotate_context=XCreateGC(display,root_window,(unsigned long)
510 (GCBackground | GCFont | GCForeground),&context_values);
511 if (annotate_context == (GC) NULL)
516 (void) XDrawImageString(display,annotate_pixmap,annotate_context,0,
517 (int) annotate_info->font_info->ascent,annotate_info->text,
518 (int) strlen(annotate_info->text));
519 (void) XFreeGC(display,annotate_context);
521 Initialize annotated X image.
523 annotate_ximage=XGetImage(display,annotate_pixmap,0,0,annotate_info->width,
524 annotate_info->height,AllPlanes,ZPixmap);
525 if (annotate_ximage == (XImage *) NULL)
527 (void) XFreePixmap(display,annotate_pixmap);
529 Initialize annotated image.
531 annotate_image=AcquireImage((ImageInfo *) NULL);
532 if (annotate_image == (Image *) NULL)
534 annotate_image->columns=annotate_info->width;
535 annotate_image->rows=annotate_info->height;
537 Transfer annotated X image to image.
539 width=(unsigned int) image->columns;
540 height=(unsigned int) image->rows;
543 (void) XParseGeometry(annotate_info->geometry,&x,&y,&width,&height);
544 (void) GetOneVirtualPixel(image,(ssize_t) x,(ssize_t) y,
545 &annotate_image->background_color,&image->exception);
546 if (annotate_info->stencil == ForegroundStencil)
547 annotate_image->matte=MagickTrue;
548 exception=(&image->exception);
549 annotate_view=AcquireCacheView(annotate_image);
550 for (y=0; y < (int) annotate_image->rows; y++)
558 q=GetCacheViewAuthenticPixels(annotate_view,0,(ssize_t) y,
559 annotate_image->columns,1,exception);
560 if (q == (PixelPacket *) NULL)
562 for (x=0; x < (int) annotate_image->columns; x++)
564 SetOpacityPixelComponent(q,OpaqueOpacity);
565 if (XGetPixel(annotate_ximage,x,y) == 0)
568 Set this pixel to the background color.
570 q->red=ScaleShortToQuantum(pixel->box_color.red);
571 q->green=ScaleShortToQuantum(pixel->box_color.green);
572 q->blue=ScaleShortToQuantum(pixel->box_color.blue);
573 if ((annotate_info->stencil == ForegroundStencil) ||
574 (annotate_info->stencil == OpaqueStencil))
575 q->opacity=(Quantum) TransparentOpacity;
580 Set this pixel to the pen color.
582 q->red=ScaleShortToQuantum(pixel->pen_color.red);
583 q->green=ScaleShortToQuantum(pixel->pen_color.green);
584 q->blue=ScaleShortToQuantum(pixel->pen_color.blue);
585 if (annotate_info->stencil == BackgroundStencil)
586 q->opacity=(Quantum) TransparentOpacity;
590 if (SyncCacheViewAuthenticPixels(annotate_view,exception) == MagickFalse)
593 annotate_view=DestroyCacheView(annotate_view);
594 XDestroyImage(annotate_ximage);
596 Determine annotate geometry.
598 (void) XParseGeometry(annotate_info->geometry,&x,&y,&width,&height);
599 if ((width != (unsigned int) annotate_image->columns) ||
600 (height != (unsigned int) annotate_image->rows))
603 image_geometry[MaxTextExtent];
608 (void) FormatMagickString(image_geometry,MaxTextExtent,"%ux%u",
610 (void) TransformImage(&annotate_image,(char *) NULL,image_geometry);
612 if (annotate_info->degrees != 0.0)
627 RotateImage(annotate_image,annotate_info->degrees,&image->exception);
628 if (rotate_image == (Image *) NULL)
630 annotate_image=DestroyImage(annotate_image);
631 annotate_image=rotate_image;
633 Annotation is relative to the degree of rotation.
635 normalized_degrees=annotate_info->degrees;
636 while (normalized_degrees < -45.0)
637 normalized_degrees+=360.0;
638 for (rotations=0; normalized_degrees > 45.0; rotations++)
639 normalized_degrees-=90.0;
640 switch (rotations % 4)
650 x-=(int) annotate_image->columns/2;
651 y+=(int) annotate_image->columns/2;
659 x=x-(int) annotate_image->columns;
667 x=x-(int) annotate_image->columns/2;
668 y=y-(int) (annotate_image->rows-(annotate_image->columns/2));
674 Composite text onto the image.
676 (void) XParseGeometry(annotate_info->geometry,&x,&y,&width,&height);
678 (void) CompositeImage(image,annotate_image->matte != MagickFalse ?
679 OverCompositeOp : CopyCompositeOp,annotate_image,(ssize_t) x,(ssize_t) y);
681 annotate_image=DestroyImage(annotate_image);
686 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
690 % X B e s t F o n t %
694 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
696 % XBestFont() returns the "best" font. "Best" is defined as a font specified
697 % in the X resource database or a font such that the text width displayed
698 % with the font does not exceed the specified maximum width.
700 % The format of the XBestFont method is:
702 % XFontStruct *XBestFont(Display *display,
703 % const XResourceInfo *resource_info,const MagickBooleanType text_font)
705 % A description of each parameter follows:
707 % o font: XBestFont returns a pointer to a XFontStruct structure.
709 % o display: Specifies a connection to an X server; returned from
712 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
714 % o text_font: True is font should be mono-spaced (typewriter style).
718 static char **FontToList(char *font)
733 if (font == (char *) NULL)
734 return((char **) NULL);
736 Convert string to an ASCII list.
739 for (p=font; *p != '\0'; p++)
740 if ((*p == ':') || (*p == ';') || (*p == ','))
742 fontlist=(char **) AcquireQuantumMemory((size_t) fonts+1UL,sizeof(*fontlist));
743 if (fontlist == (char **) NULL)
745 ThrowXWindowFatalException(ResourceLimitError,"MemoryAllocationFailed",
747 return((char **) NULL);
750 for (i=0; i < (int) fonts; i++)
752 for (q=p; *q != '\0'; q++)
753 if ((*q == ':') || (*q == ';') || (*q == ','))
755 fontlist[i]=(char *) AcquireQuantumMemory((size_t) (q-p)+1UL,
756 sizeof(*fontlist[i]));
757 if (fontlist[i] == (char *) NULL)
759 ThrowXWindowFatalException(ResourceLimitError,"MemoryAllocationFailed",
761 return((char **) NULL);
763 (void) CopyMagickString(fontlist[i],p,(size_t) (q-p+1));
766 fontlist[i]=(char *) NULL;
770 MagickExport XFontStruct *XBestFont(Display *display,
771 const XResourceInfo *resource_info,const MagickBooleanType text_font)
776 "-*-helvetica-medium-r-normal--12-*-*-*-*-*-iso8859-1",
777 "-*-arial-medium-r-normal--12-*-*-*-*-*-iso8859-1",
778 "-*-helvetica-medium-r-normal--12-*-*-*-*-*-iso8859-15",
779 "-*-arial-medium-r-normal--12-*-*-*-*-*-iso8859-15",
780 "-*-helvetica-medium-r-normal--12-*-*-*-*-*-*-*",
781 "-*-arial-medium-r-normal--12-*-*-*-*-*-*-*",
788 "-*-courier-medium-r-normal-*-12-*-*-*-*-*-iso8859-1",
789 "-*-courier-medium-r-normal-*-12-*-*-*-*-*-iso8859-15",
790 "-*-fixed-medium-r-normal-*-12-*-*-*-*-*-*-*",
804 font_info=(XFontStruct *) NULL;
805 font_name=resource_info->font;
806 if (text_font != MagickFalse)
807 font_name=resource_info->text_font;
808 if ((font_name != (char *) NULL) && (*font_name != '\0'))
817 Load preferred font specified in the X resource database.
819 fontlist=FontToList(font_name);
820 if (fontlist != (char **) NULL)
822 for (i=0; fontlist[i] != (char *) NULL; i++)
824 if (font_info == (XFontStruct *) NULL)
825 font_info=XLoadQueryFont(display,fontlist[i]);
826 fontlist[i]=DestroyString(fontlist[i]);
828 fontlist=(char **) RelinquishMagickMemory(fontlist);
830 if (font_info == (XFontStruct *) NULL)
831 ThrowXWindowFatalException(XServerError,"UnableToLoadFont",font_name);
834 Load fonts from list of fonts until one is found.
837 if (text_font != MagickFalse)
839 if (XDisplayHeight(display,XDefaultScreen(display)) >= 748)
841 while (*p != (char *) NULL)
843 if (font_info != (XFontStruct *) NULL)
845 font_info=XLoadQueryFont(display,(char *) *p);
852 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
856 % X B e s t I c o n S i z e %
860 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
862 % XBestIconSize() returns the "best" icon size. "Best" is defined as an icon
863 % size that maintains the aspect ratio of the image. If the window manager
864 % has preferred icon sizes, one of the preferred sizes is used.
866 % The format of the XBestIconSize method is:
868 % void XBestIconSize(Display *display,XWindowInfo *window,Image *image)
870 % A description of each parameter follows:
872 % o display: Specifies a connection to an X server; returned from
875 % o image: the image.
878 MagickExport void XBestIconSize(Display *display,XWindowInfo *window,
902 Determine if the window manager has specified preferred icon sizes.
904 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
905 assert(display != (Display *) NULL);
906 assert(window != (XWindowInfo *) NULL);
907 assert(image != (Image *) NULL);
908 window->width=MaxIconSize;
909 window->height=MaxIconSize;
910 icon_size=(XIconSize *) NULL;
912 root_window=XRootWindow(display,window->screen);
913 if (XGetIconSizes(display,root_window,&size_list,&number_sizes) != 0)
914 if ((number_sizes > 0) && (size_list != (XIconSize *) NULL))
916 if (icon_size == (XIconSize *) NULL)
919 Window manager does not restrict icon size.
921 icon_size=XAllocIconSize();
922 if (icon_size == (XIconSize *) NULL)
924 ThrowXWindowFatalException(ResourceLimitError,
925 "MemoryAllocationFailed",image->filename);
928 icon_size->min_width=1;
929 icon_size->max_width=MaxIconSize;
930 icon_size->min_height=1;
931 icon_size->max_height=MaxIconSize;
932 icon_size->width_inc=1;
933 icon_size->height_inc=1;
936 Determine aspect ratio of image.
938 width=(unsigned int) image->columns;
939 height=(unsigned int) image->rows;
941 if (window->crop_geometry)
942 (void) XParseGeometry(window->crop_geometry,&i,&i,&width,&height);
944 Look for an icon size that maintains the aspect ratio of image.
946 scale_factor=(MagickRealType) icon_size->max_width/width;
947 if (scale_factor > ((MagickRealType) icon_size->max_height/height))
948 scale_factor=(MagickRealType) icon_size->max_height/height;
949 icon_width=(unsigned int) icon_size->min_width;
950 while ((int) icon_width < icon_size->max_width)
952 if (icon_width >= (unsigned int) (scale_factor*width+0.5))
954 icon_width+=icon_size->width_inc;
956 icon_height=(unsigned int) icon_size->min_height;
957 while ((int) icon_height < icon_size->max_height)
959 if (icon_height >= (unsigned int) (scale_factor*height+0.5))
961 icon_height+=icon_size->height_inc;
963 (void) XFree((void *) icon_size);
964 window->width=icon_width;
965 window->height=icon_height;
969 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
973 % X B e s t P i x e l %
977 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
979 % XBestPixel() returns a pixel from an array of pixels that is closest to the
980 % requested color. If the color array is NULL, the colors are obtained from
983 % The format of the XBestPixel method is:
985 % void XBestPixel(Display *display,const Colormap colormap,XColor *colors,
986 % unsigned int number_colors,XColor *color)
988 % A description of each parameter follows:
990 % o pixel: XBestPixel returns the pixel value closest to the requested
993 % o display: Specifies a connection to an X server; returned from
996 % o colormap: Specifies the ID of the X server colormap.
998 % o colors: Specifies an array of XColor structures.
1000 % o number_colors: Specifies the number of XColor structures in the
1001 % color definition array.
1003 % o color: Specifies the desired RGB value to find in the colors array.
1006 MagickExport void XBestPixel(Display *display,const Colormap colormap,
1007 XColor *colors,unsigned int number_colors,XColor *color)
1018 register MagickRealType
1029 Find closest representation for the requested RGB color.
1031 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1032 assert(display != (Display *) NULL);
1033 assert(color != (XColor *) NULL);
1034 status=XAllocColor(display,colormap,color);
1035 if (status != False)
1037 query_server=colors == (XColor *) NULL ? MagickTrue : MagickFalse;
1038 if (query_server != MagickFalse)
1041 Read X server colormap.
1043 colors=(XColor *) AcquireQuantumMemory(number_colors,sizeof(*colors));
1044 if (colors == (XColor *) NULL)
1046 ThrowXWindowFatalException(ResourceLimitError,
1047 "MemoryAllocationFailed","...");
1050 for (i=0; i < (int) number_colors; i++)
1051 colors[i].pixel=(size_t) i;
1052 if (number_colors > 256)
1054 (void) XQueryColors(display,colormap,colors,(int) number_colors);
1056 min_distance=3.0*((MagickRealType) QuantumRange+1.0)*((MagickRealType)
1059 for (i=0; i < (int) number_colors; i++)
1061 pixel.red=colors[i].red-(MagickRealType) color->red;
1062 distance=pixel.red*pixel.red;
1063 if (distance > min_distance)
1065 pixel.green=colors[i].green-(MagickRealType) color->green;
1066 distance+=pixel.green*pixel.green;
1067 if (distance > min_distance)
1069 pixel.blue=colors[i].blue-(MagickRealType) color->blue;
1070 distance+=pixel.blue*pixel.blue;
1071 if (distance > min_distance)
1073 min_distance=distance;
1074 color->pixel=colors[i].pixel;
1077 (void) XAllocColor(display,colormap,&colors[j]);
1078 if (query_server != MagickFalse)
1079 colors=(XColor *) RelinquishMagickMemory(colors);
1083 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1087 % X B e s t V i s u a l I n f o %
1091 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1093 % XBestVisualInfo() returns visual information for a visual that is the "best"
1094 % the server supports. "Best" is defined as:
1096 % 1. Restrict the visual list to those supported by the default screen.
1098 % 2. If a visual type is specified, restrict the visual list to those of
1101 % 3. If a map type is specified, choose the visual that matches the id
1102 % specified by the Standard Colormap.
1104 % 4 From the list of visuals, choose one that can display the most
1105 % simultaneous colors. If more than one visual can display the same
1106 % number of simultaneous colors, one is chosen based on a rank.
1108 % The format of the XBestVisualInfo method is:
1110 % XVisualInfo *XBestVisualInfo(Display *display,
1111 % XStandardColormap *map_info,XResourceInfo *resource_info)
1113 % A description of each parameter follows:
1115 % o visual_info: XBestVisualInfo returns a pointer to a X11 XVisualInfo
1118 % o display: Specifies a connection to an X server; returned from
1121 % o map_info: If map_type is specified, this structure is initialized
1122 % with info from the Standard Colormap.
1124 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
1128 static inline int MagickMax(const int x,const int y)
1135 static inline size_t MagickMin(const unsigned int x,
1136 const unsigned int y)
1143 MagickExport XVisualInfo *XBestVisualInfo(Display *display,
1144 XStandardColormap *map_info,XResourceInfo *resource_info)
1146 #define MaxStandardColormaps 7
1147 #define XVisualColormapSize(visual_info) MagickMin((unsigned int) (\
1148 (visual_info->klass == TrueColor) || (visual_info->klass == DirectColor) ? \
1149 visual_info->red_mask | visual_info->green_mask | visual_info->blue_mask : \
1150 (unsigned int) visual_info->colormap_size),1U << visual_info->depth)
1176 Restrict visual search by screen number.
1178 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1179 assert(display != (Display *) NULL);
1180 assert(map_info != (XStandardColormap *) NULL);
1181 assert(resource_info != (XResourceInfo *) NULL);
1182 map_type=resource_info->map_type;
1183 visual_type=resource_info->visual_type;
1184 visual_mask=VisualScreenMask;
1185 visual_template.screen=XDefaultScreen(display);
1186 visual_template.depth=XDefaultDepth(display,XDefaultScreen(display));
1188 if ((resource_info->immutable != MagickFalse) && (resource_info->colors != 0))
1189 if (resource_info->colors <= (one << (size_t) visual_template.depth))
1190 visual_mask|=VisualDepthMask;
1191 if (visual_type != (char *) NULL)
1194 Restrict visual search by class or visual id.
1196 if (LocaleCompare("staticgray",visual_type) == 0)
1198 visual_mask|=VisualClassMask;
1199 visual_template.klass=StaticGray;
1202 if (LocaleCompare("grayscale",visual_type) == 0)
1204 visual_mask|=VisualClassMask;
1205 visual_template.klass=GrayScale;
1208 if (LocaleCompare("staticcolor",visual_type) == 0)
1210 visual_mask|=VisualClassMask;
1211 visual_template.klass=StaticColor;
1214 if (LocaleCompare("pseudocolor",visual_type) == 0)
1216 visual_mask|=VisualClassMask;
1217 visual_template.klass=PseudoColor;
1220 if (LocaleCompare("truecolor",visual_type) == 0)
1222 visual_mask|=VisualClassMask;
1223 visual_template.klass=TrueColor;
1226 if (LocaleCompare("directcolor",visual_type) == 0)
1228 visual_mask|=VisualClassMask;
1229 visual_template.klass=DirectColor;
1232 if (LocaleCompare("default",visual_type) == 0)
1234 visual_mask|=VisualIDMask;
1235 visual_template.visualid=XVisualIDFromVisual(
1236 XDefaultVisual(display,XDefaultScreen(display)));
1239 if (isdigit((int) ((unsigned char) *visual_type)) != 0)
1241 visual_mask|=VisualIDMask;
1242 visual_template.visualid=
1243 strtol(visual_type,(char **) NULL,0);
1246 ThrowXWindowFatalException(XServerError,
1247 "UnrecognizedVisualSpecifier",visual_type);
1250 Get all visuals that meet our criteria so far.
1253 visual_list=XGetVisualInfo(display,visual_mask,&visual_template,
1255 visual_mask=VisualScreenMask | VisualIDMask;
1256 if ((number_visuals == 0) || (visual_list == (XVisualInfo *) NULL))
1259 Failed to get visual; try using the default visual.
1261 ThrowXWindowFatalException(XServerWarning,"UnableToGetVisual",
1263 visual_template.visualid=XVisualIDFromVisual(XDefaultVisual(display,
1264 XDefaultScreen(display)));
1265 visual_list=XGetVisualInfo(display,visual_mask,&visual_template,
1267 if ((number_visuals == 0) || (visual_list == (XVisualInfo *) NULL))
1268 return((XVisualInfo *) NULL);
1269 ThrowXWindowFatalException(XServerWarning,"UsingDefaultVisual",
1270 XVisualClassName(visual_list->klass));
1272 resource_info->color_recovery=MagickFalse;
1273 if ((map_info != (XStandardColormap *) NULL) && (map_type != (char *) NULL))
1279 map_name[MaxTextExtent];
1295 Choose a visual associated with a standard colormap.
1297 root_window=XRootWindow(display,XDefaultScreen(display));
1299 if (LocaleCompare(map_type,"list") != 0)
1302 User specified Standard Colormap.
1304 (void) FormatMagickString((char *) map_name,MaxTextExtent,
1305 "RGB_%s_MAP",map_type);
1306 LocaleUpper(map_name);
1307 map_property=XInternAtom(display,(char *) map_name,MagickTrue);
1308 if (map_property != (Atom) NULL)
1309 status=XGetRGBColormaps(display,root_window,&map_list,&number_maps,
1315 *colormap[MaxStandardColormaps]=
1317 "_HP_RGB_SMOOTH_MAP_LIST",
1327 Choose a standard colormap from a list.
1329 for (i=0; i < MaxStandardColormaps; i++)
1331 map_property=XInternAtom(display,(char *) colormap[i],MagickTrue);
1332 if (map_property == (Atom) NULL)
1334 status=XGetRGBColormaps(display,root_window,&map_list,&number_maps,
1336 if (status != False)
1339 resource_info->color_recovery=i == 0 ? MagickTrue : MagickFalse;
1341 if (status == False)
1343 ThrowXWindowFatalException(XServerError,"UnableToGetStandardColormap",
1345 return((XVisualInfo *) NULL);
1348 Search all Standard Colormaps and visuals for ids that match.
1350 *map_info=map_list[0];
1351 #if !defined(PRE_R4_ICCCM)
1352 visual_template.visualid=XVisualIDFromVisual(visual_list[0].visual);
1353 for (i=0; i < number_maps; i++)
1354 for (j=0; j < number_visuals; j++)
1355 if (map_list[i].visualid ==
1356 XVisualIDFromVisual(visual_list[j].visual))
1358 *map_info=map_list[i];
1359 visual_template.visualid=XVisualIDFromVisual(
1360 visual_list[j].visual);
1363 if (map_info->visualid != visual_template.visualid)
1365 ThrowXWindowFatalException(XServerError,
1366 "UnableToMatchVisualToStandardColormap",map_type);
1367 return((XVisualInfo *) NULL);
1370 if (map_info->colormap == (Colormap) NULL)
1372 ThrowXWindowFatalException(XServerError,
1373 "StandardColormapIsNotInitialized",map_type);
1374 return((XVisualInfo *) NULL);
1376 (void) XFree((void *) map_list);
1380 static const unsigned int
1395 Pick one visual that displays the most simultaneous colors.
1397 visual_info=visual_list;
1399 for (i=1; i < number_visuals; i++)
1402 if (XVisualColormapSize(p) > XVisualColormapSize(visual_info))
1405 if (XVisualColormapSize(p) == XVisualColormapSize(visual_info))
1406 if (rank[p->klass] > rank[visual_info->klass])
1409 visual_template.visualid=XVisualIDFromVisual(visual_info->visual);
1411 (void) XFree((void *) visual_list);
1413 Retrieve only one visual by its screen & id number.
1415 visual_info=XGetVisualInfo(display,visual_mask,&visual_template,
1417 if ((number_visuals == 0) || (visual_info == (XVisualInfo *) NULL))
1418 return((XVisualInfo *) NULL);
1419 return(visual_info);
1423 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1427 % X C h e c k D e f i n e C u r s o r %
1431 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1433 % XCheckDefineCursor() prevents cursor changes on the root window.
1435 % The format of the XXCheckDefineCursor method is:
1437 % XCheckDefineCursor(display,window,cursor)
1439 % A description of each parameter follows:
1441 % o display: Specifies a connection to an X server; returned from
1444 % o window: the window.
1446 % o cursor: the cursor.
1449 MagickExport int XCheckDefineCursor(Display *display,Window window,
1452 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1453 assert(display != (Display *) NULL);
1454 if (window == XRootWindow(display,XDefaultScreen(display)))
1456 return(XDefineCursor(display,window,cursor));
1460 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1464 % X C h e c k R e f r e s h W i n d o w s %
1468 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1470 % XCheckRefreshWindows() checks the X server for exposure events for a
1471 % particular window and updates the areassociated with the exposure event.
1473 % The format of the XCheckRefreshWindows method is:
1475 % void XCheckRefreshWindows(Display *display,XWindows *windows)
1477 % A description of each parameter follows:
1479 % o display: Specifies a connection to an X server; returned from
1482 % o windows: Specifies a pointer to a XWindows structure.
1485 MagickExport void XCheckRefreshWindows(Display *display,XWindows *windows)
1493 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1494 assert(display != (Display *) NULL);
1495 assert(windows != (XWindows *) NULL);
1496 XDelay(display,SuspendTime);
1497 id=windows->command.id;
1498 while (XCheckTypedWindowEvent(display,id,Expose,&event) != MagickFalse)
1499 (void) XCommandWidget(display,windows,(char const **) NULL,&event);
1500 id=windows->image.id;
1501 while (XCheckTypedWindowEvent(display,id,Expose,&event) != MagickFalse)
1502 XRefreshWindow(display,&windows->image,&event);
1503 XDelay(display,SuspendTime << 1);
1504 id=windows->command.id;
1505 while (XCheckTypedWindowEvent(display,id,Expose,&event) != MagickFalse)
1506 (void) XCommandWidget(display,windows,(char const **) NULL,&event);
1507 id=windows->image.id;
1508 while (XCheckTypedWindowEvent(display,id,Expose,&event) != MagickFalse)
1509 XRefreshWindow(display,&windows->image,&event);
1513 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1517 % X C l i e n t M e s s a g e %
1521 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1523 % XClientMessage() sends a reason to a window with XSendEvent. The reason is
1524 % initialized with a particular protocol type and atom.
1526 % The format of the XClientMessage function is:
1528 % XClientMessage(display,window,protocol,reason,timestamp)
1530 % A description of each parameter follows:
1532 % o display: Specifies a pointer to the Display structure; returned from
1535 % o window: Specifies a pointer to a Window structure.
1537 % o protocol: Specifies an atom value.
1539 % o reason: Specifies an atom value which is the reason to send.
1541 % o timestamp: Specifies a value of type Time.
1544 MagickExport void XClientMessage(Display *display,const Window window,
1545 const Atom protocol,const Atom reason,const Time timestamp)
1550 assert(display != (Display *) NULL);
1551 client_event.type=ClientMessage;
1552 client_event.window=window;
1553 client_event.message_type=protocol;
1554 client_event.format=32;
1555 client_event.data.l[0]=(long) reason;
1556 client_event.data.l[1]=(long) timestamp;
1557 (void) XSendEvent(display,window,MagickFalse,NoEventMask,(XEvent *) &client_event);
1561 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1565 + X C l i e n t W i n d o w %
1569 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1571 % XClientWindow() finds a window, at or below the specified window, which has
1572 % a WM_STATE property. If such a window is found, it is returned, otherwise
1573 % the argument window is returned.
1575 % The format of the XClientWindow function is:
1577 % client_window=XClientWindow(display,target_window)
1579 % A description of each parameter follows:
1581 % o client_window: XClientWindow returns a window, at or below the specified
1582 % window, which has a WM_STATE property otherwise the argument
1583 % target_window is returned.
1585 % o display: Specifies a pointer to the Display structure; returned from
1588 % o target_window: Specifies the window to find a WM_STATE property.
1591 static Window XClientWindow(Display *display,Window target_window)
1613 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1614 assert(display != (Display *) NULL);
1615 state=XInternAtom(display,"WM_STATE",MagickTrue);
1616 if (state == (Atom) NULL)
1617 return(target_window);
1619 status=XGetWindowProperty(display,target_window,state,0L,0L,MagickFalse,
1620 (Atom) AnyPropertyType,&type,&format,&number_items,&after,&data);
1621 if ((status == Success) && (type != (Atom) NULL))
1622 return(target_window);
1623 client_window=XWindowByProperty(display,target_window,state);
1624 if (client_window == (Window) NULL)
1625 return(target_window);
1626 return(client_window);
1630 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1634 + X C o m p o n e n t T e r m i n u s %
1638 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1640 % XComponentTerminus() destroys the module component.
1642 % The format of the XComponentTerminus method is:
1644 % XComponentTerminus(void)
1647 MagickExport void XComponentTerminus(void)
1649 DestroyXResources();
1653 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1657 % X C o n f i g u r e I m a g e C o l o r m a p %
1661 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1663 % XConfigureImageColormap() creates a new X colormap.
1665 % The format of the XConfigureImageColormap method is:
1667 % void XConfigureImageColormap(Display *display,
1668 % XResourceInfo *resource_info,XWindows *windows,Image *image)
1670 % A description of each parameter follows:
1672 % o display: Specifies a connection to an X server; returned from
1675 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
1677 % o windows: Specifies a pointer to a XWindows structure.
1679 % o image: the image.
1682 MagickExport void XConfigureImageColormap(Display *display,
1683 XResourceInfo *resource_info,XWindows *windows,Image *image)
1689 Make standard colormap.
1691 XSetCursorState(display,windows,MagickTrue);
1692 XCheckRefreshWindows(display,windows);
1693 XMakeStandardColormap(display,windows->visual_info,resource_info,image,
1694 windows->map_info,windows->pixel_info);
1695 colormap=windows->map_info->colormap;
1696 (void) XSetWindowColormap(display,windows->image.id,colormap);
1697 (void) XSetWindowColormap(display,windows->command.id,colormap);
1698 (void) XSetWindowColormap(display,windows->widget.id,colormap);
1699 if (windows->magnify.mapped != MagickFalse)
1700 (void) XSetWindowColormap(display,windows->magnify.id,colormap);
1701 if (windows->pan.mapped != MagickFalse)
1702 (void) XSetWindowColormap(display,windows->pan.id,colormap);
1703 XSetCursorState(display,windows,MagickFalse);
1704 XClientMessage(display,windows->image.id,windows->im_protocols,
1705 windows->im_update_colormap,CurrentTime);
1709 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1713 % X C o n s t r a i n W i n d o w P o s i t i o n %
1717 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1719 % XConstrainWindowPosition() assures a window is positioned within the X
1720 % server boundaries.
1722 % The format of the XConstrainWindowPosition method is:
1724 % void XConstrainWindowPosition(Display *display,XWindowInfo *window_info)
1726 % A description of each parameter follows:
1728 % o display: Specifies a pointer to the Display structure; returned from
1731 % o window_info: Specifies a pointer to a XWindowInfo structure.
1734 MagickExport void XConstrainWindowPosition(Display *display,
1735 XWindowInfo *window_info)
1740 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1741 assert(display != (Display *) NULL);
1742 assert(window_info != (XWindowInfo *) NULL);
1743 limit=XDisplayWidth(display,window_info->screen)-window_info->width;
1744 if (window_info->x < 0)
1747 if (window_info->x > (int) limit)
1748 window_info->x=(int) limit;
1749 limit=XDisplayHeight(display,window_info->screen)-window_info->height;
1750 if (window_info->y < 0)
1753 if (window_info->y > limit)
1754 window_info->y=limit;
1758 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1766 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1768 % XDelay() suspends program execution for the number of milliseconds
1771 % The format of the Delay method is:
1773 % void XDelay(Display *display,const size_t milliseconds)
1775 % A description of each parameter follows:
1777 % o display: Specifies a pointer to the Display structure; returned from
1780 % o milliseconds: Specifies the number of milliseconds to delay before
1784 MagickExport void XDelay(Display *display,const size_t milliseconds)
1786 assert(display != (Display *) NULL);
1787 (void) XFlush(display);
1788 MagickDelay(milliseconds);
1792 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1796 % X D e s t r o y R e s o u r c e I n f o %
1800 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1802 % XDestroyResourceInfo() frees memory associated with the XResourceInfo
1805 % The format of the XDestroyResourceInfo method is:
1807 % void XDestroyResourceInfo(XResourceInfo *resource_info)
1809 % A description of each parameter follows:
1811 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
1814 MagickExport void XDestroyResourceInfo(XResourceInfo *resource_info)
1816 if (resource_info->image_geometry != (char *) NULL)
1817 resource_info->image_geometry=(char *)
1818 RelinquishMagickMemory(resource_info->image_geometry);
1819 if (resource_info->quantize_info != (QuantizeInfo *) NULL)
1820 resource_info->quantize_info=DestroyQuantizeInfo(
1821 resource_info->quantize_info);
1822 if (resource_info->client_name != (char *) NULL)
1823 resource_info->client_name=(char *)
1824 RelinquishMagickMemory(resource_info->client_name);
1825 if (resource_info->name != (char *) NULL)
1826 resource_info->name=DestroyString(resource_info->name);
1827 (void) ResetMagickMemory(resource_info,0,sizeof(*resource_info));
1831 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1835 % X D e s t r o y W i n d o w C o l o r s %
1839 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1841 % XDestroyWindowColors() frees X11 color resources previously saved on a
1842 % window by XRetainWindowColors or programs like xsetroot.
1844 % The format of the XDestroyWindowColors method is:
1846 % void XDestroyWindowColors(Display *display,Window window)
1848 % A description of each parameter follows:
1850 % o display: Specifies a connection to an X server; returned from
1853 % o window: Specifies a pointer to a Window structure.
1856 MagickExport void XDestroyWindowColors(Display *display,Window window)
1876 If there are previous resources on the root window, destroy them.
1878 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1879 assert(display != (Display *) NULL);
1880 property=XInternAtom(display,"_XSETROOT_ID",MagickFalse);
1881 if (property == (Atom) NULL)
1883 ThrowXWindowFatalException(XServerError,"UnableToCreateProperty",
1887 status=XGetWindowProperty(display,window,property,0L,1L,MagickTrue,
1888 (Atom) AnyPropertyType,&type,&format,&length,&after,&data);
1889 if (status != Success)
1891 if ((type == XA_PIXMAP) && (format == 32) && (length == 1) && (after == 0))
1893 (void) XKillClient(display,(XID) (*((Pixmap *) data)));
1894 (void) XDeleteProperty(display,window,property);
1897 (void) XFree((void *) data);
1901 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1905 % X D i s p l a y I m a g e I n f o %
1909 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1911 % XDisplayImageInfo() displays information about an X image.
1913 % The format of the XDisplayImageInfo method is:
1915 % void XDisplayImageInfo(Display *display,
1916 % const XResourceInfo *resource_info,XWindows *windows,Image *undo_image,
1919 % A description of each parameter follows:
1921 % o display: Specifies a connection to an X server; returned from
1924 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
1926 % o windows: Specifies a pointer to a XWindows structure.
1928 % o undo_image: the undo image.
1930 % o image: the image.
1933 MagickExport void XDisplayImageInfo(Display *display,
1934 const XResourceInfo *resource_info,XWindows *windows,Image *undo_image,
1938 filename[MaxTextExtent],
1961 Write info about the X server to a file.
1963 assert(display != (Display *) NULL);
1964 assert(resource_info != (XResourceInfo *) NULL);
1965 assert(windows != (XWindows *) NULL);
1966 assert(image != (Image *) NULL);
1968 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
1970 unique_file=AcquireUniqueFileResource(filename);
1971 if (unique_file != -1)
1972 file=fdopen(unique_file,"w");
1973 if ((unique_file == -1) || (file == (FILE *) NULL))
1975 XNoticeWidget(display,windows,"Unable to display image info",filename);
1978 if (resource_info->gamma_correct != MagickFalse)
1979 if (resource_info->display_gamma != (char *) NULL)
1980 (void) fprintf(file,"Display\n gamma: %s\n\n",
1981 resource_info->display_gamma);
1983 Write info about the X image to a file.
1985 (void) fprintf(file,"X\n visual: %s\n",
1986 XVisualClassName((int) windows->image.storage_class));
1987 (void) fprintf(file," depth: %d\n",windows->image.ximage->depth);
1988 if (windows->visual_info->colormap_size != 0)
1989 (void) fprintf(file," colormap size: %d\n",
1990 windows->visual_info->colormap_size);
1991 if (resource_info->colormap== SharedColormap)
1992 (void) fprintf(file," colormap type: Shared\n");
1994 (void) fprintf(file," colormap type: Private\n");
1995 (void) fprintf(file," geometry: %dx%d\n",windows->image.ximage->width,
1996 windows->image.ximage->height);
1997 if (windows->image.crop_geometry != (char *) NULL)
1998 (void) fprintf(file," crop geometry: %s\n",windows->image.crop_geometry);
1999 if (windows->image.pixmap == (Pixmap) NULL)
2000 (void) fprintf(file," type: X Image\n");
2002 (void) fprintf(file," type: Pixmap\n");
2003 if (windows->image.shape != MagickFalse)
2004 (void) fprintf(file," non-rectangular shape: True\n");
2006 (void) fprintf(file," non-rectangular shape: False\n");
2007 if (windows->image.shared_memory != MagickFalse)
2008 (void) fprintf(file," shared memory: True\n");
2010 (void) fprintf(file," shared memory: False\n");
2011 (void) fprintf(file,"\n");
2012 if (resource_info->font != (char *) NULL)
2013 (void) fprintf(file,"Font: %s\n\n",resource_info->font);
2014 if (resource_info->text_font != (char *) NULL)
2015 (void) fprintf(file,"Text font: %s\n\n",resource_info->text_font);
2017 Write info about the undo cache to a file.
2020 for (levels=0; undo_image != (Image *) NULL; levels++)
2022 number_pixels=undo_image->list->columns*undo_image->list->rows;
2023 bytes+=number_pixels*sizeof(PixelPacket);
2024 undo_image=GetPreviousImageInList(undo_image);
2026 (void) fprintf(file,"Undo Edit Cache\n levels: %u\n",levels);
2027 (void) fprintf(file," bytes: %.20gmb\n",(double) ((bytes+(1 << 19)) >> 20));
2028 (void) fprintf(file," limit: %.20gmb\n\n",(double)
2029 resource_info->undo_cache);
2031 Write info about the image to a file.
2033 (void) IdentifyImage(image,file,MagickTrue);
2034 (void) fclose(file);
2035 text=FileToString(filename,~0,&image->exception);
2036 (void) RelinquishUniqueFileResource(filename);
2037 if (text == (char *) NULL)
2039 XNoticeWidget(display,windows,"MemoryAllocationFailed",
2040 "UnableToDisplayImageInfo");
2043 textlist=StringToList(text);
2044 if (textlist != (char **) NULL)
2047 title[MaxTextExtent];
2050 Display information about the image in the Text View widget.
2052 (void) XWithdrawWindow(display,windows->info.id,windows->info.screen);
2053 (void) FormatMagickString(title,MaxTextExtent,"Image Info: %s",
2055 XTextViewWidget(display,resource_info,windows,MagickTrue,title,
2056 (char const **) textlist);
2057 for (i=0; textlist[i] != (char *) NULL; i++)
2058 textlist[i]=DestroyString(textlist[i]);
2059 textlist=(char **) RelinquishMagickMemory(textlist);
2061 text=DestroyString(text);
2065 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2069 + X D i t h e r I m a g e %
2073 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2075 % XDitherImage() dithers the reference image as required by the HP Color
2076 % Recovery algorithm. The color values are quantized to 3 bits of red and
2077 % green, and 2 bits of blue (3/3/2) and can be used as indices into a 8-bit X
2078 % standard colormap.
2080 % The format of the XDitherImage method is:
2082 % void XDitherImage(Image *image,XImage *ximage)
2084 % A description of each parameter follows:
2086 % o image: the image.
2088 % o ximage: Specifies a pointer to a XImage structure; returned from
2092 static void XDitherImage(Image *image,XImage *ximage)
2094 static const short int
2097 {-16, 4, -1, 11,-14, 6, -3, 9,-15, 5, -2, 10,-13, 7, -4, 8},
2098 { 15, -5, 0,-12, 13, -7, 2,-10, 14, -6, 1,-11, 12, -8, 3, -9}
2100 dither_green[2][16]=
2102 { 11,-15, 7, -3, 8,-14, 4, -2, 10,-16, 6, -4, 9,-13, 5, -1},
2103 {-12, 14, -8, 2, -9, 13, -5, 1,-11, 15, -7, 3,-10, 12, -6, 0}
2107 { -3, 9,-13, 7, -1, 11,-15, 5, -4, 8,-14, 6, -2, 10,-16, 4},
2108 { 2,-10, 12, -8, 0,-12, 14, -6, 3, -9, 13, -7, 1,-11, 15, -5}
2124 register const PixelPacket
2144 Allocate and initialize dither maps.
2146 for (i=0; i < 2; i++)
2147 for (j=0; j < 16; j++)
2149 red_map[i][j]=(unsigned char *) AcquireQuantumMemory(256UL,
2151 green_map[i][j]=(unsigned char *) AcquireQuantumMemory(256UL,
2152 sizeof(*green_map));
2153 blue_map[i][j]=(unsigned char *) AcquireQuantumMemory(256UL,
2155 if ((red_map[i][j] == (unsigned char *) NULL) ||
2156 (green_map[i][j] == (unsigned char *) NULL) ||
2157 (blue_map[i][j] == (unsigned char *) NULL))
2159 ThrowXWindowFatalException(ResourceLimitError,
2160 "MemoryAllocationFailed",image->filename);
2165 Initialize dither tables.
2167 for (i=0; i < 2; i++)
2168 for (j=0; j < 16; j++)
2169 for (x=0; x < 256; x++)
2174 value+=dither_red[i][j];
2175 red_map[i][j][x]=(unsigned char)
2176 ((value < 0) ? 0 : (value > 255) ? 255 : value);
2180 value+=dither_green[i][j];
2181 green_map[i][j][x]=(unsigned char)
2182 ((value < 0) ? 0 : (value > 255) ? 255 : value);
2186 value+=((size_t) dither_blue[i][j] << 1);
2187 blue_map[i][j][x]=(unsigned char)
2188 ((value < 0) ? 0 : (value > 255) ? 255 : value);
2193 scanline_pad=(unsigned int) (ximage->bytes_per_line-
2194 ((size_t) (ximage->width*ximage->bits_per_pixel) >> 3));
2198 image_view=AcquireCacheView(image);
2199 for (y=0; y < (int) image->rows; y++)
2201 p=GetCacheViewVirtualPixels(image_view,0,(ssize_t) y,image->columns,1,
2203 if (p == (const PixelPacket *) NULL)
2205 for (x=0; x < (int) image->columns; x++)
2207 color.red=ClampToQuantum((MagickRealType) (red_map[i][j][(int)
2208 ScaleQuantumToChar(GetRedPixelComponent(p))] << 8));
2209 color.green=ClampToQuantum((MagickRealType) (green_map[i][j][(int)
2210 ScaleQuantumToChar(GetGreenPixelComponent(p))] << 8));
2211 color.blue=ClampToQuantum((MagickRealType) (blue_map[i][j][(int)
2212 ScaleQuantumToChar(GetBluePixelComponent(p))] << 8));
2213 pixel=(size_t) (((size_t) color.red & 0xe0) |
2214 (((size_t) color.green & 0xe0) >> 3) |
2215 (((size_t) color.blue & 0xc0) >> 6));
2227 image_view=DestroyCacheView(image_view);
2229 Free allocated memory.
2231 for (i=0; i < 2; i++)
2232 for (j=0; j < 16; j++)
2234 green_map[i][j]=(unsigned char *) RelinquishMagickMemory(green_map[i][j]);
2235 blue_map[i][j]=(unsigned char *) RelinquishMagickMemory(blue_map[i][j]);
2236 red_map[i][j]=(unsigned char *) RelinquishMagickMemory(red_map[i][j]);
2241 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2245 % X D r a w I m a g e %
2249 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2251 % XDrawImage() draws a line on the image.
2253 % The format of the XDrawImage method is:
2255 % MagickBooleanType XDrawImage(display,pixel,draw_info,image)
2257 % A description of each parameter follows:
2259 % o display: Specifies a connection to an X server; returned from
2262 % o pixel: Specifies a pointer to a XPixelInfo structure.
2264 % o draw_info: Specifies a pointer to a XDrawInfo structure.
2266 % o image: the image.
2269 MagickExport MagickBooleanType XDrawImage(Display *display,
2270 const XPixelInfo *pixel,XDrawInfo *draw_info,Image *image)
2309 Initialize drawd image.
2311 assert(display != (Display *) NULL);
2312 assert(pixel != (XPixelInfo *) NULL);
2313 assert(draw_info != (XDrawInfo *) NULL);
2314 assert(image != (Image *) NULL);
2315 if (image->debug != MagickFalse)
2316 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
2318 Initialize drawd pixmap.
2320 root_window=XRootWindow(display,XDefaultScreen(display));
2321 depth=(unsigned int) XDefaultDepth(display,XDefaultScreen(display));
2322 draw_pixmap=XCreatePixmap(display,root_window,draw_info->width,
2323 draw_info->height,depth);
2324 if (draw_pixmap == (Pixmap) NULL)
2325 return(MagickFalse);
2327 Initialize graphics info.
2329 context_values.background=(size_t) (~0);
2330 context_values.foreground=0;
2331 context_values.line_width=(int) draw_info->line_width;
2332 draw_context=XCreateGC(display,root_window,(size_t)
2333 (GCBackground | GCForeground | GCLineWidth),&context_values);
2334 if (draw_context == (GC) NULL)
2335 return(MagickFalse);
2339 (void) XFillRectangle(display,draw_pixmap,draw_context,0,0,draw_info->width,
2342 Draw line to pixmap.
2344 (void) XSetBackground(display,draw_context,0);
2345 (void) XSetForeground(display,draw_context,(size_t) (~0));
2346 if (draw_info->stipple != (Pixmap) NULL)
2348 (void) XSetFillStyle(display,draw_context,FillOpaqueStippled);
2349 (void) XSetStipple(display,draw_context,draw_info->stipple);
2351 switch (draw_info->element)
2356 (void) XDrawLines(display,draw_pixmap,draw_context,
2357 draw_info->coordinate_info,(int) draw_info->number_coordinates,
2363 (void) XDrawLine(display,draw_pixmap,draw_context,draw_info->line_info.x1,
2364 draw_info->line_info.y1,draw_info->line_info.x2,
2365 draw_info->line_info.y2);
2368 case RectangleElement:
2370 (void) XDrawRectangle(display,draw_pixmap,draw_context,
2371 (int) draw_info->rectangle_info.x,(int) draw_info->rectangle_info.y,
2372 (unsigned int) draw_info->rectangle_info.width,
2373 (unsigned int) draw_info->rectangle_info.height);
2376 case FillRectangleElement:
2378 (void) XFillRectangle(display,draw_pixmap,draw_context,
2379 (int) draw_info->rectangle_info.x,(int) draw_info->rectangle_info.y,
2380 (unsigned int) draw_info->rectangle_info.width,
2381 (unsigned int) draw_info->rectangle_info.height);
2385 case EllipseElement:
2387 (void) XDrawArc(display,draw_pixmap,draw_context,
2388 (int) draw_info->rectangle_info.x,(int) draw_info->rectangle_info.y,
2389 (unsigned int) draw_info->rectangle_info.width,
2390 (unsigned int) draw_info->rectangle_info.height,0,360*64);
2393 case FillCircleElement:
2394 case FillEllipseElement:
2396 (void) XFillArc(display,draw_pixmap,draw_context,
2397 (int) draw_info->rectangle_info.x,(int) draw_info->rectangle_info.y,
2398 (unsigned int) draw_info->rectangle_info.width,
2399 (unsigned int) draw_info->rectangle_info.height,0,360*64);
2402 case PolygonElement:
2407 coordinate_info=draw_info->coordinate_info;
2408 (void) XDrawLines(display,draw_pixmap,draw_context,coordinate_info,
2409 (int) draw_info->number_coordinates,CoordModeOrigin);
2410 (void) XDrawLine(display,draw_pixmap,draw_context,
2411 coordinate_info[draw_info->number_coordinates-1].x,
2412 coordinate_info[draw_info->number_coordinates-1].y,
2413 coordinate_info[0].x,coordinate_info[0].y);
2416 case FillPolygonElement:
2418 (void) XFillPolygon(display,draw_pixmap,draw_context,
2419 draw_info->coordinate_info,(int) draw_info->number_coordinates,Complex,
2424 (void) XFreeGC(display,draw_context);
2428 draw_ximage=XGetImage(display,draw_pixmap,0,0,draw_info->width,
2429 draw_info->height,AllPlanes,ZPixmap);
2430 if (draw_ximage == (XImage *) NULL)
2431 return(MagickFalse);
2432 (void) XFreePixmap(display,draw_pixmap);
2434 Initialize draw image.
2436 draw_image=AcquireImage((ImageInfo *) NULL);
2437 if (draw_image == (Image *) NULL)
2438 return(MagickFalse);
2439 draw_image->columns=draw_info->width;
2440 draw_image->rows=draw_info->height;
2442 Transfer drawn X image to image.
2444 width=(unsigned int) image->columns;
2445 height=(unsigned int) image->rows;
2448 (void) XParseGeometry(draw_info->geometry,&x,&y,&width,&height);
2449 (void) GetOneVirtualPixel(image,(ssize_t) x,(ssize_t) y,
2450 &draw_image->background_color,&image->exception);
2451 if (SetImageStorageClass(draw_image,DirectClass) == MagickFalse)
2452 return(MagickFalse);
2453 draw_image->matte=MagickTrue;
2454 exception=(&image->exception);
2455 draw_view=AcquireCacheView(draw_image);
2456 for (y=0; y < (int) draw_image->rows; y++)
2461 register PixelPacket
2464 q=QueueCacheViewAuthenticPixels(draw_view,0,(ssize_t) y,draw_image->columns,
2466 if (q == (PixelPacket *) NULL)
2468 for (x=0; x < (int) draw_image->columns; x++)
2470 if (XGetPixel(draw_ximage,x,y) == 0)
2473 Set this pixel to the background color.
2475 *q=draw_image->background_color;
2476 q->opacity=(Quantum) (draw_info->stencil == OpaqueStencil ?
2477 TransparentOpacity : OpaqueOpacity);
2482 Set this pixel to the pen color.
2484 q->red=ScaleShortToQuantum(pixel->pen_color.red);
2485 q->green=ScaleShortToQuantum(pixel->pen_color.green);
2486 q->blue=ScaleShortToQuantum(pixel->pen_color.blue);
2487 q->opacity=(Quantum) (draw_info->stencil == OpaqueStencil ?
2488 OpaqueOpacity : TransparentOpacity);
2492 if (SyncCacheViewAuthenticPixels(draw_view,exception) == MagickFalse)
2495 draw_view=DestroyCacheView(draw_view);
2496 XDestroyImage(draw_ximage);
2498 Determine draw geometry.
2500 (void) XParseGeometry(draw_info->geometry,&x,&y,&width,&height);
2501 if ((width != (unsigned int) draw_image->columns) ||
2502 (height != (unsigned int) draw_image->rows))
2505 image_geometry[MaxTextExtent];
2510 (void) FormatMagickString(image_geometry,MaxTextExtent,"%ux%u",
2512 (void) TransformImage(&draw_image,(char *) NULL,image_geometry);
2514 if (draw_info->degrees != 0.0)
2528 rotate_image=RotateImage(draw_image,draw_info->degrees,&image->exception);
2529 if (rotate_image == (Image *) NULL)
2530 return(MagickFalse);
2531 draw_image=DestroyImage(draw_image);
2532 draw_image=rotate_image;
2534 Annotation is relative to the degree of rotation.
2536 normalized_degrees=draw_info->degrees;
2537 while (normalized_degrees < -45.0)
2538 normalized_degrees+=360.0;
2539 for (rotations=0; normalized_degrees > 45.0; rotations++)
2540 normalized_degrees-=90.0;
2541 switch (rotations % 4)
2551 x=x-(int) draw_image->columns/2;
2552 y=y+(int) draw_image->columns/2;
2560 x=x-(int) draw_image->columns;
2568 x=x-(int) draw_image->columns/2;
2569 y=y-(int) (draw_image->rows-(draw_image->columns/2));
2575 Composite text onto the image.
2577 draw_view=AcquireCacheView(draw_image);
2578 for (y=0; y < (int) draw_image->rows; y++)
2583 register PixelPacket
2586 q=GetCacheViewAuthenticPixels(draw_view,0,(ssize_t) y,draw_image->columns,1,
2588 if (q == (PixelPacket *) NULL)
2590 for (x=0; x < (int) draw_image->columns; x++)
2592 if (q->opacity != (Quantum) TransparentOpacity)
2593 SetOpacityPixelComponent(q,OpaqueOpacity);
2596 if (SyncCacheViewAuthenticPixels(draw_view,exception) == MagickFalse)
2599 draw_view=DestroyCacheView(draw_view);
2600 (void) XParseGeometry(draw_info->geometry,&x,&y,&width,&height);
2601 if (draw_info->stencil == TransparentStencil)
2602 (void) CompositeImage(image,CopyOpacityCompositeOp,draw_image,(ssize_t) x,
2607 (void) CompositeImage(image,OverCompositeOp,draw_image,(ssize_t) x,
2611 draw_image=DestroyImage(draw_image);
2616 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2624 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2626 % XError() ignores BadWindow errors for XQueryTree and XGetWindowAttributes,
2627 % and ignores BadDrawable errors for XGetGeometry, and ignores BadValue errors
2628 % for XQueryColor. It returns MagickFalse in those cases. Otherwise it returns
2631 % The format of the XError function is:
2633 % XError(display,error)
2635 % A description of each parameter follows:
2637 % o display: Specifies a pointer to the Display structure; returned from
2640 % o error: Specifies the error event.
2644 #if defined(__cplusplus) || defined(c_plusplus)
2648 MagickExport int XError(Display *display,XErrorEvent *error)
2650 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
2651 assert(display != (Display *) NULL);
2652 assert(error != (XErrorEvent *) NULL);
2653 xerror_alert=MagickTrue;
2654 switch (error->request_code)
2658 if ((int) error->error_code == BadDrawable)
2659 return(MagickFalse);
2662 case X_GetWindowAttributes:
2665 if ((int) error->error_code == BadWindow)
2666 return(MagickFalse);
2671 if ((int) error->error_code == BadValue)
2672 return(MagickFalse);
2679 #if defined(__cplusplus) || defined(c_plusplus)
2684 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2688 % X F r e e R e s o u r c e s %
2692 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2694 % XFreeResources() frees X11 resources.
2696 % The format of the XFreeResources method is:
2698 % void XFreeResources(Display *display,XVisualInfo *visual_info,
2699 % XStandardColormap *map_info,XPixelInfo *pixel,XFontStruct *font_info,
2700 % XResourceInfo *resource_info,XWindowInfo *window_info)
2701 % resource_info,window_info)
2703 % A description of each parameter follows:
2705 % o display: Specifies a connection to an X server; returned from
2708 % o visual_info: Specifies a pointer to a X11 XVisualInfo structure;
2709 % returned from XGetVisualInfo.
2711 % o map_info: If map_type is specified, this structure is initialized
2712 % with info from the Standard Colormap.
2714 % o pixel: Specifies a pointer to a XPixelInfo structure.
2716 % o font_info: Specifies a pointer to a XFontStruct structure.
2718 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
2720 % o window_info: Specifies a pointer to a X11 XWindowInfo structure.
2723 MagickExport void XFreeResources(Display *display,XVisualInfo *visual_info,
2724 XStandardColormap *map_info,XPixelInfo *pixel,XFontStruct *font_info,
2725 XResourceInfo *resource_info,XWindowInfo *window_info)
2727 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
2728 assert(display != (Display *) NULL);
2729 assert(resource_info != (XResourceInfo *) NULL);
2730 if (window_info != (XWindowInfo *) NULL)
2735 if (window_info->ximage != (XImage *) NULL)
2736 XDestroyImage(window_info->ximage);
2737 if (window_info->id != (Window) NULL)
2740 Free destroy window and free cursors.
2742 if (window_info->id != XRootWindow(display,visual_info->screen))
2743 (void) XDestroyWindow(display,window_info->id);
2744 if (window_info->annotate_context != (GC) NULL)
2745 (void) XFreeGC(display,window_info->annotate_context);
2746 if (window_info->highlight_context != (GC) NULL)
2747 (void) XFreeGC(display,window_info->highlight_context);
2748 if (window_info->widget_context != (GC) NULL)
2749 (void) XFreeGC(display,window_info->widget_context);
2750 if (window_info->cursor != (Cursor) NULL)
2751 (void) XFreeCursor(display,window_info->cursor);
2752 window_info->cursor=(Cursor) NULL;
2753 if (window_info->busy_cursor != (Cursor) NULL)
2754 (void) XFreeCursor(display,window_info->busy_cursor);
2755 window_info->busy_cursor=(Cursor) NULL;
2761 if (font_info != (XFontStruct *) NULL)
2763 (void) XFreeFont(display,font_info);
2764 font_info=(XFontStruct *) NULL;
2766 if (map_info != (XStandardColormap *) NULL)
2769 Free X Standard Colormap.
2771 if (resource_info->map_type == (char *) NULL)
2772 (void) XFreeStandardColormap(display,visual_info,map_info,pixel);
2773 (void) XFree((void *) map_info);
2778 if (visual_info != (XVisualInfo *) NULL)
2779 (void) XFree((void *) visual_info);
2780 if (resource_info->close_server != MagickFalse)
2781 (void) XCloseDisplay(display);
2785 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2789 % X F r e e S t a n d a r d C o l o r m a p %
2793 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2795 % XFreeStandardColormap() frees an X11 colormap.
2797 % The format of the XFreeStandardColormap method is:
2799 % void XFreeStandardColormap(Display *display,
2800 % const XVisualInfo *visual_info,XStandardColormap *map_info,
2801 % XPixelInfo *pixel)
2803 % A description of each parameter follows:
2805 % o display: Specifies a connection to an X server; returned from
2808 % o visual_info: Specifies a pointer to a X11 XVisualInfo structure;
2809 % returned from XGetVisualInfo.
2811 % o map_info: If map_type is specified, this structure is initialized
2812 % with info from the Standard Colormap.
2814 % o pixel: Specifies a pointer to a XPixelInfo structure.
2817 MagickExport void XFreeStandardColormap(Display *display,
2818 const XVisualInfo *visual_info,XStandardColormap *map_info,XPixelInfo *pixel)
2823 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
2824 assert(display != (Display *) NULL);
2825 assert(visual_info != (XVisualInfo *) NULL);
2826 assert(map_info != (XStandardColormap *) NULL);
2827 (void) XFlush(display);
2828 if (map_info->colormap != (Colormap) NULL)
2830 if (map_info->colormap != XDefaultColormap(display,visual_info->screen))
2831 (void) XFreeColormap(display,map_info->colormap);
2833 if (pixel != (XPixelInfo *) NULL)
2834 if ((visual_info->klass != TrueColor) &&
2835 (visual_info->klass != DirectColor))
2836 (void) XFreeColors(display,map_info->colormap,pixel->pixels,
2837 (int) pixel->colors,0);
2839 map_info->colormap=(Colormap) NULL;
2840 if (pixel != (XPixelInfo *) NULL)
2842 if (pixel->pixels != (unsigned long *) NULL)
2843 pixel->pixels=(unsigned long *) RelinquishMagickMemory(pixel->pixels);
2844 pixel->pixels=(unsigned long *) NULL;
2849 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2853 % X G e t A n n o t a t e I n f o %
2857 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2859 % XGetAnnotateInfo() initializes the AnnotateInfo structure.
2861 % The format of the XGetAnnotateInfo method is:
2863 % void XGetAnnotateInfo(XAnnotateInfo *annotate_info)
2865 % A description of each parameter follows:
2867 % o annotate_info: Specifies a pointer to a XAnnotateInfo structure.
2870 MagickExport void XGetAnnotateInfo(XAnnotateInfo *annotate_info)
2873 Initialize annotate structure.
2875 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
2876 assert(annotate_info != (XAnnotateInfo *) NULL);
2879 annotate_info->width=0;
2880 annotate_info->height=0;
2881 annotate_info->stencil=ForegroundStencil;
2882 annotate_info->degrees=0.0;
2883 annotate_info->font_info=(XFontStruct *) NULL;
2884 annotate_info->text=(char *) NULL;
2885 *annotate_info->geometry='\0';
2886 annotate_info->previous=(XAnnotateInfo *) NULL;
2887 annotate_info->next=(XAnnotateInfo *) NULL;
2888 (void) XSupportsLocale();
2889 (void) XSetLocaleModifiers("");
2893 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2897 % X G e t M a p I n f o %
2901 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2903 % XGetMapInfo() initializes the XStandardColormap structure.
2905 % The format of the XStandardColormap method is:
2907 % void XGetMapInfo(const XVisualInfo *visual_info,const Colormap colormap,
2908 % XStandardColormap *map_info)
2910 % A description of each parameter follows:
2912 % o colormap: Specifies the ID of the X server colormap.
2914 % o visual_info: Specifies a pointer to a X11 XVisualInfo structure;
2915 % returned from XGetVisualInfo.
2917 % o map_info: Specifies a pointer to a X11 XStandardColormap structure.
2920 MagickExport void XGetMapInfo(const XVisualInfo *visual_info,
2921 const Colormap colormap,XStandardColormap *map_info)
2924 Initialize map info.
2926 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
2927 assert(visual_info != (XVisualInfo *) NULL);
2928 assert(map_info != (XStandardColormap *) NULL);
2929 map_info->colormap=colormap;
2930 map_info->red_max=visual_info->red_mask;
2931 map_info->red_mult=(size_t) (map_info->red_max != 0 ? 1 : 0);
2932 if (map_info->red_max != 0)
2933 while ((map_info->red_max & 0x01) == 0)
2935 map_info->red_max>>=1;
2936 map_info->red_mult<<=1;
2938 map_info->green_max=visual_info->green_mask;
2939 map_info->green_mult=(size_t) (map_info->green_max != 0 ? 1 : 0);
2940 if (map_info->green_max != 0)
2941 while ((map_info->green_max & 0x01) == 0)
2943 map_info->green_max>>=1;
2944 map_info->green_mult<<=1;
2946 map_info->blue_max=visual_info->blue_mask;
2947 map_info->blue_mult=(size_t) (map_info->blue_max != 0 ? 1 : 0);
2948 if (map_info->blue_max != 0)
2949 while ((map_info->blue_max & 0x01) == 0)
2951 map_info->blue_max>>=1;
2952 map_info->blue_mult<<=1;
2954 map_info->base_pixel=0;
2958 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2962 % X G e t P i x e l I n f o %
2966 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2968 % XGetPixelPacket() initializes the PixelPacket structure.
2970 % The format of the XGetPixelPacket method is:
2972 % void XGetPixelPacket(Display *display,const XVisualInfo *visual_info,
2973 % const XStandardColormap *map_info,const XResourceInfo *resource_info,
2974 % Image *image,XPixelInfo *pixel)
2977 % A description of each parameter follows:
2979 % o display: Specifies a connection to an X server; returned from
2982 % o visual_info: Specifies a pointer to a X11 XVisualInfo structure;
2983 % returned from XGetVisualInfo.
2985 % o map_info: If map_type is specified, this structure is initialized
2986 % with info from the Standard Colormap.
2988 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
2990 % o image: the image.
2992 % o pixel: Specifies a pointer to a XPixelInfo structure.
2995 MagickExport void XGetPixelPacket(Display *display,
2996 const XVisualInfo *visual_info,const XStandardColormap *map_info,
2997 const XResourceInfo *resource_info,Image *image,XPixelInfo *pixel)
3000 *PenColors[MaxNumberPens]=
3002 "#000000000000", /* black */
3003 "#00000000ffff", /* blue */
3004 "#0000ffffffff", /* cyan */
3005 "#0000ffff0000", /* green */
3006 "#bdbdbdbdbdbd", /* gray */
3007 "#ffff00000000", /* red */
3008 "#ffff0000ffff", /* magenta */
3009 "#ffffffff0000", /* yellow */
3010 "#ffffffffffff", /* white */
3011 "#bdbdbdbdbdbd", /* gray */
3012 "#bdbdbdbdbdbd" /* gray */
3028 Initialize pixel info.
3030 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
3031 assert(display != (Display *) NULL);
3032 assert(visual_info != (XVisualInfo *) NULL);
3033 assert(map_info != (XStandardColormap *) NULL);
3034 assert(resource_info != (XResourceInfo *) NULL);
3035 assert(pixel != (XPixelInfo *) NULL);
3037 if (image != (Image *) NULL)
3038 if (image->storage_class == PseudoClass)
3039 pixel->colors=(ssize_t) image->colors;
3040 packets=(unsigned int)
3041 MagickMax((int) pixel->colors,visual_info->colormap_size)+MaxNumberPens;
3042 if (pixel->pixels != (unsigned long *) NULL)
3043 pixel->pixels=(unsigned long *) RelinquishMagickMemory(pixel->pixels);
3044 pixel->pixels=(unsigned long *) AcquireQuantumMemory(packets,
3045 sizeof(pixel->pixels));
3046 if (pixel->pixels == (unsigned long *) NULL)
3047 ThrowXWindowFatalException(ResourceLimitFatalError,"UnableToGetPixelInfo",
3050 Set foreground color.
3052 colormap=map_info->colormap;
3053 (void) XParseColor(display,colormap,(char *) ForegroundColor,
3054 &pixel->foreground_color);
3055 status=XParseColor(display,colormap,resource_info->foreground_color,
3056 &pixel->foreground_color);
3057 if (status == False)
3058 ThrowXWindowFatalException(XServerError,"ColorIsNotKnownToServer",
3059 resource_info->foreground_color);
3060 pixel->foreground_color.pixel=
3061 XStandardPixel(map_info,&pixel->foreground_color);
3062 pixel->foreground_color.flags=(char) (DoRed | DoGreen | DoBlue);
3064 Set background color.
3066 (void) XParseColor(display,colormap,"#d6d6d6d6d6d6",&pixel->background_color);
3067 status=XParseColor(display,colormap,resource_info->background_color,
3068 &pixel->background_color);
3069 if (status == False)
3070 ThrowXWindowFatalException(XServerError,"ColorIsNotKnownToServer",
3071 resource_info->background_color);
3072 pixel->background_color.pixel=
3073 XStandardPixel(map_info,&pixel->background_color);
3074 pixel->background_color.flags=(char) (DoRed | DoGreen | DoBlue);
3078 (void) XParseColor(display,colormap,(char *) BorderColor,
3079 &pixel->border_color);
3080 status=XParseColor(display,colormap,resource_info->border_color,
3081 &pixel->border_color);
3082 if (status == False)
3083 ThrowXWindowFatalException(XServerError,"ColorIsNotKnownToServer",
3084 resource_info->border_color);
3085 pixel->border_color.pixel=XStandardPixel(map_info,&pixel->border_color);
3086 pixel->border_color.flags=(char) (DoRed | DoGreen | DoBlue);
3090 pixel->matte_color=pixel->background_color;
3091 if (resource_info->matte_color != (char *) NULL)
3094 Matte color is specified as a X resource or command line argument.
3096 status=XParseColor(display,colormap,resource_info->matte_color,
3097 &pixel->matte_color);
3098 if (status == False)
3099 ThrowXWindowFatalException(XServerError,"ColorIsNotKnownToServer",
3100 resource_info->matte_color);
3101 pixel->matte_color.pixel=XStandardPixel(map_info,&pixel->matte_color);
3102 pixel->matte_color.flags=(char) (DoRed | DoGreen | DoBlue);
3105 Set highlight color.
3107 pixel->highlight_color.red=(unsigned short) ((
3108 pixel->matte_color.red*ScaleQuantumToShort(HighlightModulate))/65535L+
3109 (ScaleQuantumToShort((Quantum) (QuantumRange-HighlightModulate))));
3110 pixel->highlight_color.green=(unsigned short) ((
3111 pixel->matte_color.green*ScaleQuantumToShort(HighlightModulate))/65535L+
3112 (ScaleQuantumToShort((Quantum) (QuantumRange-HighlightModulate))));
3113 pixel->highlight_color.blue=(unsigned short) ((
3114 pixel->matte_color.blue*ScaleQuantumToShort(HighlightModulate))/65535L+
3115 (ScaleQuantumToShort((Quantum) (QuantumRange-HighlightModulate))));
3116 pixel->highlight_color.pixel=
3117 XStandardPixel(map_info,&pixel->highlight_color);
3118 pixel->highlight_color.flags=(char) (DoRed | DoGreen | DoBlue);
3122 pixel->shadow_color.red=(unsigned short) (((MagickRealType)
3123 pixel->matte_color.red*ScaleQuantumToShort(ShadowModulate))/65535L);
3124 pixel->shadow_color.green=(unsigned short) (((MagickRealType)
3125 pixel->matte_color.green*ScaleQuantumToShort(ShadowModulate))/65535L);
3126 pixel->shadow_color.blue=(unsigned short) (((MagickRealType)
3127 pixel->matte_color.blue*ScaleQuantumToShort(ShadowModulate))/65535L);
3128 pixel->shadow_color.pixel=XStandardPixel(map_info,&pixel->shadow_color);
3129 pixel->shadow_color.flags=(char) (DoRed | DoGreen | DoBlue);
3133 pixel->depth_color.red=(unsigned short) (((MagickRealType)
3134 pixel->matte_color.red*ScaleQuantumToShort(DepthModulate))/65535L);
3135 pixel->depth_color.green=(unsigned short) (((MagickRealType)
3136 pixel->matte_color.green*ScaleQuantumToShort(DepthModulate))/65535L);
3137 pixel->depth_color.blue=(unsigned short) (((MagickRealType)
3138 pixel->matte_color.blue*ScaleQuantumToShort(DepthModulate))/65535L);
3139 pixel->depth_color.pixel=XStandardPixel(map_info,&pixel->depth_color);
3140 pixel->depth_color.flags=(char) (DoRed | DoGreen | DoBlue);
3144 pixel->trough_color.red=(unsigned short) (((MagickRealType)
3145 pixel->matte_color.red*ScaleQuantumToShort(TroughModulate))/65535L);
3146 pixel->trough_color.green=(unsigned short) (((MagickRealType)
3147 pixel->matte_color.green*ScaleQuantumToShort(TroughModulate))/65535L);
3148 pixel->trough_color.blue=(unsigned short) (((MagickRealType)
3149 pixel->matte_color.blue*ScaleQuantumToShort(TroughModulate))/65535L);
3150 pixel->trough_color.pixel=XStandardPixel(map_info,&pixel->trough_color);
3151 pixel->trough_color.flags=(char) (DoRed | DoGreen | DoBlue);
3155 for (i=0; i < MaxNumberPens; i++)
3157 (void) XParseColor(display,colormap,(char *) PenColors[i],
3158 &pixel->pen_colors[i]);
3159 status=XParseColor(display,colormap,resource_info->pen_colors[i],
3160 &pixel->pen_colors[i]);
3161 if (status == False)
3162 ThrowXWindowFatalException(XServerError,"ColorIsNotKnownToServer",
3163 resource_info->pen_colors[i]);
3164 pixel->pen_colors[i].pixel=XStandardPixel(map_info,&pixel->pen_colors[i]);
3165 pixel->pen_colors[i].flags=(char) (DoRed | DoGreen | DoBlue);
3167 pixel->box_color=pixel->background_color;
3168 pixel->pen_color=pixel->foreground_color;
3171 if (image != (Image *) NULL)
3173 if ((resource_info->gamma_correct != MagickFalse) &&
3174 (image->gamma != 0.0))
3183 Initialize map relative to display and image gamma.
3185 flags=ParseGeometry(resource_info->display_gamma,&geometry_info);
3186 red_gamma=geometry_info.rho;
3187 green_gamma=geometry_info.sigma;
3188 if ((flags & SigmaValue) == 0)
3189 green_gamma=red_gamma;
3190 blue_gamma=geometry_info.xi;
3191 if ((flags & XiValue) == 0)
3192 blue_gamma=red_gamma;
3193 red_gamma*=image->gamma;
3194 green_gamma*=image->gamma;
3195 blue_gamma*=image->gamma;
3197 if (image->storage_class == PseudoClass)
3200 Initialize pixel array for images of type PseudoClass.
3202 for (i=0; i < (ssize_t) image->colors; i++)
3204 XGammaPixel(map_info,image->colormap+i);
3205 for (i=0; i < MaxNumberPens; i++)
3206 pixel->pixels[image->colors+i]=pixel->pen_colors[i].pixel;
3207 pixel->colors+=MaxNumberPens;
3213 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3217 % X G e t R e s o u r c e C l a s s %
3221 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3223 % XGetResourceClass() queries the X server for the specified resource name or
3224 % class. If the resource name or class is not defined in the database, the
3225 % supplied default value is returned.
3227 % The format of the XGetResourceClass method is:
3229 % char *XGetResourceClass(XrmDatabase database,const char *client_name,
3230 % const char *keyword,char *resource_default)
3232 % A description of each parameter follows:
3234 % o database: Specifies a resource database; returned from
3235 % XrmGetStringDatabase.
3237 % o client_name: Specifies the application name used to retrieve resource
3238 % info from the X server database.
3240 % o keyword: Specifies the keyword of the value being retrieved.
3242 % o resource_default: Specifies the default value to return if the query
3243 % fails to find the specified keyword/class.
3246 MagickExport char *XGetResourceClass(XrmDatabase database,
3247 const char *client_name,const char *keyword,char *resource_default)
3250 resource_class[MaxTextExtent],
3251 resource_name[MaxTextExtent];
3262 if (database == (XrmDatabase) NULL)
3263 return(resource_default);
3264 *resource_name='\0';
3265 *resource_class='\0';
3266 if (keyword != (char *) NULL)
3273 Initialize resource keyword and class.
3275 (void) FormatMagickString(resource_name,MaxTextExtent,"%s.%s",
3276 client_name,keyword);
3277 c=(int) (*client_name);
3278 if ((c >= XK_a) && (c <= XK_z))
3281 if ((c >= XK_agrave) && (c <= XK_odiaeresis))
3282 c-=(XK_agrave-XK_Agrave);
3284 if ((c >= XK_oslash) && (c <= XK_thorn))
3285 c-=(XK_oslash-XK_Ooblique);
3287 if ((k >= XK_a) && (k <= XK_z))
3290 if ((k >= XK_agrave) && (k <= XK_odiaeresis))
3291 k-=(XK_agrave-XK_Agrave);
3293 if ((k >= XK_oslash) && (k <= XK_thorn))
3294 k-=(XK_oslash-XK_Ooblique);
3295 (void) FormatMagickString(resource_class,MaxTextExtent,"%c%s.%c%s",c,
3296 client_name+1,k,keyword+1);
3298 status=XrmGetResource(database,resource_name,resource_class,&resource_type,
3300 if (status == False)
3301 return(resource_default);
3302 return(resource_value.addr);
3306 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3310 % X G e t R e s o u r c e D a t a b a s e %
3314 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3316 % XGetResourceDatabase() creates a new resource database and initializes it.
3318 % The format of the XGetResourceDatabase method is:
3320 % XrmDatabase XGetResourceDatabase(Display *display,
3321 % const char *client_name)
3323 % A description of each parameter follows:
3325 % o database: XGetResourceDatabase() returns the database after it is
3328 % o display: Specifies a connection to an X server; returned from
3331 % o client_name: Specifies the application name used to retrieve resource
3332 % info from the X server database.
3335 MagickExport XrmDatabase XGetResourceDatabase(Display *display,
3336 const char *client_name)
3339 filename[MaxTextExtent];
3351 if (display == (Display *) NULL)
3352 return((XrmDatabase) NULL);
3353 assert(client_name != (char *) NULL);
3355 Initialize resource database.
3358 (void) XGetDefault(display,(char *) client_name,"dummy");
3359 resource_database=XrmGetDatabase(display);
3361 Combine application database.
3363 if (client_name != (char *) NULL)
3366 Get basename of client.
3368 p=client_name+(strlen(client_name)-1);
3369 while ((p > client_name) && (*p != '/'))
3374 c=(int) (*client_name);
3375 if ((c >= XK_a) && (c <= XK_z))
3378 if ((c >= XK_agrave) && (c <= XK_odiaeresis))
3379 c-=(XK_agrave-XK_Agrave);
3381 if ((c >= XK_oslash) && (c <= XK_thorn))
3382 c-=(XK_oslash-XK_Ooblique);
3383 #if defined(X11_APPLICATION_PATH)
3384 (void) FormatMagickString(filename,MaxTextExtent,"%s%c%s",
3385 X11_APPLICATION_PATH,c,client_name+1);
3386 (void) XrmCombineFileDatabase(filename,&resource_database,MagickFalse);
3388 if (XResourceManagerString(display) != (char *) NULL)
3391 Combine server database.
3393 server_database=XrmGetStringDatabase(XResourceManagerString(display));
3394 XrmCombineDatabase(server_database,&resource_database,MagickFalse);
3397 Merge user preferences database.
3399 #if defined(X11_PREFERENCES_PATH)
3400 (void) FormatMagickString(filename,MaxTextExtent,"%s%src",
3401 X11_PREFERENCES_PATH,client_name);
3402 ExpandFilename(filename);
3403 (void) XrmCombineFileDatabase(filename,&resource_database,MagickFalse);
3405 return(resource_database);
3409 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3413 % X G e t R e s o u r c e I n f o %
3417 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3419 % XGetResourceInfo(image_info,) initializes the ResourceInfo structure.
3421 % The format of the XGetResourceInfo method is:
3423 % void XGetResourceInfo(const ImageInfo *image_info,XrmDatabase database,
3424 % const char *client_name,XResourceInfo *resource_info)
3426 % A description of each parameter follows:
3428 % o image_info: the image info.
3430 % o database: Specifies a resource database; returned from
3431 % XrmGetStringDatabase.
3433 % o client_name: Specifies the application name used to retrieve
3434 % resource info from the X server database.
3436 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
3439 MagickExport void XGetResourceInfo(const ImageInfo *image_info,
3440 XrmDatabase database,const char *client_name,XResourceInfo *resource_info)
3447 Initialize resource info fields.
3449 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
3450 assert(resource_info != (XResourceInfo *) NULL);
3451 (void) ResetMagickMemory(resource_info,0,sizeof(*resource_info));
3452 resource_info->resource_database=database;
3453 resource_info->image_info=(ImageInfo *) image_info;
3454 (void) SetImageInfoProgressMonitor(resource_info->image_info,
3455 XMagickProgressMonitor,(void *) NULL);
3456 resource_info->quantize_info=CloneQuantizeInfo((QuantizeInfo *) NULL);
3457 resource_info->close_server=MagickTrue;
3458 resource_info->client_name=AcquireString(client_name);
3459 resource_value=XGetResourceClass(database,client_name,"backdrop",
3461 resource_info->backdrop=IsMagickTrue(resource_value);
3462 resource_info->background_color=XGetResourceInstance(database,client_name,
3463 "background",(char *) "#d6d6d6d6d6d6");
3464 resource_info->border_color=XGetResourceInstance(database,client_name,
3465 "borderColor",BorderColor);
3466 resource_value=XGetResourceClass(database,client_name,"borderWidth",
3468 resource_info->border_width=(unsigned int) StringToUnsignedLong(
3470 resource_value=XGetResourceClass(database,client_name,"colormap",
3472 resource_info->colormap=UndefinedColormap;
3473 if (LocaleCompare("private",resource_value) == 0)
3474 resource_info->colormap=PrivateColormap;
3475 if (LocaleCompare("shared",resource_value) == 0)
3476 resource_info->colormap=SharedColormap;
3477 if (resource_info->colormap == UndefinedColormap)
3478 ThrowXWindowFatalException(OptionError,"UnrecognizedColormapType",
3480 resource_value=XGetResourceClass(database,client_name,
3481 "colorRecovery",(char *) "False");
3482 resource_info->color_recovery=IsMagickTrue(resource_value);
3483 resource_value=XGetResourceClass(database,client_name,"confirmExit",
3485 resource_info->confirm_exit=IsMagickTrue(resource_value);
3486 resource_value=XGetResourceClass(database,client_name,"confirmEdit",
3488 resource_info->confirm_edit=IsMagickTrue(resource_value);
3489 resource_value=XGetResourceClass(database,client_name,"delay",(char *) "1");
3490 resource_info->delay=(unsigned int) StringToUnsignedLong(resource_value);
3491 resource_info->display_gamma=XGetResourceClass(database,client_name,
3492 "displayGamma",(char *) "2.2");
3493 resource_value=XGetResourceClass(database,client_name,"displayWarnings",
3495 resource_info->display_warnings=IsMagickTrue(resource_value);
3496 resource_info->font=XGetResourceClass(database,client_name,"font",
3498 resource_info->font=XGetResourceClass(database,client_name,"fontList",
3499 resource_info->font);
3500 resource_info->font_name[0]=XGetResourceClass(database,client_name,"font1",
3502 resource_info->font_name[1]=XGetResourceClass(database,client_name,"font2",
3503 (char *) "variable");
3504 resource_info->font_name[2]=XGetResourceClass(database,client_name,"font3",
3506 resource_info->font_name[3]=XGetResourceClass(database,client_name,"font4",
3508 resource_info->font_name[4]=XGetResourceClass(database,client_name,"font5",
3509 (char *) "7x13bold");
3510 resource_info->font_name[5]=XGetResourceClass(database,client_name,"font6",
3511 (char *) "8x13bold");
3512 resource_info->font_name[6]=XGetResourceClass(database,client_name,"font7",
3513 (char *) "9x15bold");
3514 resource_info->font_name[7]=XGetResourceClass(database,client_name,"font8",
3516 resource_info->font_name[8]=XGetResourceClass(database,client_name,"font9",
3518 resource_info->font_name[9]=XGetResourceClass(database,client_name,"font0",
3520 resource_info->font_name[10]=XGetResourceClass(database,client_name,"font0",
3522 resource_info->foreground_color=XGetResourceInstance(database,client_name,
3523 "foreground",ForegroundColor);
3524 resource_value=XGetResourceClass(database,client_name,"gammaCorrect",
3526 resource_info->gamma_correct=IsMagickTrue(resource_value);
3527 resource_info->image_geometry=ConstantString(XGetResourceClass(database,
3528 client_name,"geometry",(char *) NULL));
3529 resource_value=XGetResourceClass(database,client_name,"gravity",
3531 resource_info->gravity=(GravityType) ParseMagickOption(MagickGravityOptions,
3532 MagickFalse,resource_value);
3533 directory=getcwd(resource_info->home_directory,MaxTextExtent);
3535 resource_info->icon_geometry=XGetResourceClass(database,client_name,
3536 "iconGeometry",(char *) NULL);
3537 resource_value=XGetResourceClass(database,client_name,"iconic",
3539 resource_info->iconic=IsMagickTrue(resource_value);
3540 resource_value=XGetResourceClass(database,client_name,"immutable",
3541 LocaleCompare(client_name,"PerlMagick") == 0 ? (char *) "True" :
3543 resource_info->immutable=IsMagickTrue(resource_value);
3544 resource_value=XGetResourceClass(database,client_name,"magnify",
3546 resource_info->magnify=(unsigned int) StringToUnsignedLong(resource_value);
3547 resource_info->map_type=XGetResourceClass(database,client_name,"map",
3549 resource_info->matte_color=XGetResourceInstance(database,client_name,
3550 "mattecolor",(char *) NULL);
3551 resource_info->name=ConstantString(XGetResourceClass(database,client_name,
3552 "name",(char *) NULL));
3553 resource_info->pen_colors[0]=XGetResourceClass(database,client_name,"pen1",
3555 resource_info->pen_colors[1]=XGetResourceClass(database,client_name,"pen2",
3557 resource_info->pen_colors[2]=XGetResourceClass(database,client_name,"pen3",
3559 resource_info->pen_colors[3]=XGetResourceClass(database,client_name,"pen4",
3561 resource_info->pen_colors[4]=XGetResourceClass(database,client_name,"pen5",
3563 resource_info->pen_colors[5]=XGetResourceClass(database,client_name,"pen6",
3565 resource_info->pen_colors[6]=XGetResourceClass(database,client_name,"pen7",
3566 (char *) "magenta");
3567 resource_info->pen_colors[7]=XGetResourceClass(database,client_name,"pen8",
3569 resource_info->pen_colors[8]=XGetResourceClass(database,client_name,"pen9",
3571 resource_info->pen_colors[9]=XGetResourceClass(database,client_name,"pen0",
3573 resource_info->pen_colors[10]=XGetResourceClass(database,client_name,"pen0",
3575 resource_value=XGetResourceClass(database,client_name,"pause",(char *) "0");
3576 resource_info->pause=(unsigned int) StringToUnsignedLong(resource_value);
3577 resource_value=XGetResourceClass(database,client_name,"quantum",(char *) "1");
3578 resource_info->quantum=StringToLong(resource_value);
3579 resource_info->text_font=XGetResourceClass(database,client_name,(char *)
3580 "font",(char *) "fixed");
3581 resource_info->text_font=XGetResourceClass(database,client_name,
3582 "textFontList",resource_info->text_font);
3583 resource_info->title=XGetResourceClass(database,client_name,"title",
3585 resource_value=XGetResourceClass(database,client_name,"undoCache",
3587 resource_info->undo_cache=(unsigned int) StringToUnsignedLong(resource_value);
3588 resource_value=XGetResourceClass(database,client_name,"update",
3590 resource_info->update=IsMagickTrue(resource_value);
3591 resource_value=XGetResourceClass(database,client_name,"usePixmap",
3593 resource_info->use_pixmap=IsMagickTrue(resource_value);
3594 resource_value=XGetResourceClass(database,client_name,"sharedMemory",
3596 resource_info->use_shared_memory=IsMagickTrue(resource_value);
3597 resource_info->visual_type=XGetResourceClass(database,client_name,"visual",
3599 resource_info->window_group=XGetResourceClass(database,client_name,
3600 "windowGroup",(char *) NULL);
3601 resource_info->window_id=XGetResourceClass(database,client_name,"window",
3603 resource_info->write_filename=XGetResourceClass(database,client_name,
3604 "writeFilename",(char *) NULL);
3608 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3612 % X G e t R e s o u r c e I n s t a n c e %
3616 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3618 % XGetResourceInstance() queries the X server for the specified resource name.
3619 % If the resource name is not defined in the database, the supplied default
3620 % value is returned.
3622 % The format of the XGetResourceInstance method is:
3624 % char *XGetResourceInstance(XrmDatabase database,const char *client_name,
3625 % const char *keyword,const char *resource_default)
3627 % A description of each parameter follows:
3629 % o database: Specifies a resource database; returned from
3630 % XrmGetStringDatabase.
3632 % o client_name: Specifies the application name used to retrieve
3633 % resource info from the X server database.
3635 % o keyword: Specifies the keyword of the value being retrieved.
3637 % o resource_default: Specifies the default value to return if the query
3638 % fails to find the specified keyword/class.
3641 MagickExport char *XGetResourceInstance(XrmDatabase database,
3642 const char *client_name,const char *keyword,const char *resource_default)
3646 resource_name[MaxTextExtent];
3654 if (database == (XrmDatabase) NULL)
3655 return((char *) resource_default);
3656 *resource_name='\0';
3657 if (keyword != (char *) NULL)
3658 (void) FormatMagickString(resource_name,MaxTextExtent,"%s.%s",client_name,
3660 status=XrmGetResource(database,resource_name,"ImageMagick",&resource_type,
3662 if (status == False)
3663 return((char *) resource_default);
3664 return(resource_value.addr);
3668 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3672 % X G e t S c r e e n D e n s i t y %
3676 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3678 % XGetScreenDensity() returns the density of the X server screen in
3681 % The format of the XGetScreenDensity method is:
3683 % char *XGetScreenDensity(Display *display)
3685 % A description of each parameter follows:
3687 % o density: XGetScreenDensity() returns the density of the X screen in
3690 % o display: Specifies a connection to an X server; returned from
3694 MagickExport char *XGetScreenDensity(Display *display)
3697 density[MaxTextExtent];
3704 Set density as determined by screen size.
3706 x_density=((((double) DisplayWidth(display,XDefaultScreen(display)))*25.4)/
3707 ((double) DisplayWidthMM(display,XDefaultScreen(display))));
3708 y_density=((((double) DisplayHeight(display,XDefaultScreen(display)))*25.4)/
3709 ((double) DisplayHeightMM(display,XDefaultScreen(display))));
3710 (void) FormatMagickString(density,MaxTextExtent,"%gx%g",x_density,
3712 return(GetPageGeometry(density));
3716 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3720 + X G e t S u b w i n d o w %
3724 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3726 % XGetSubwindow() returns the subwindow of a window chosen the user with the
3727 % pointer and a button press.
3729 % The format of the XGetSubwindow method is:
3731 % Window XGetSubwindow(Display *display,Window window,int x,int y)
3733 % A description of each parameter follows:
3735 % o subwindow: XGetSubwindow() returns NULL if no subwindow is found
3736 % otherwise the subwindow is returned.
3738 % o display: Specifies a connection to an X server; returned from
3741 % o window: Specifies a pointer to a Window.
3743 % o x: the x coordinate of the pointer relative to the origin of the
3746 % o y: the y coordinate of the pointer relative to the origin of the
3750 static Window XGetSubwindow(Display *display,Window window,int x,int y)
3763 assert(display != (Display *) NULL);
3764 source_window=XRootWindow(display,XDefaultScreen(display));
3765 if (window == (Window) NULL)
3766 return(source_window);
3767 target_window=window;
3770 status=XTranslateCoordinates(display,source_window,window,x,y,
3771 &x_offset,&y_offset,&target_window);
3774 if (target_window == (Window) NULL)
3776 source_window=window;
3777 window=target_window;
3781 if (target_window == (Window) NULL)
3782 target_window=window;
3783 return(target_window);
3787 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3791 % X G e t W i n d o w C o l o r %
3795 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3797 % XGetWindowColor() returns the color of a pixel interactively chosen from the
3800 % The format of the XGetWindowColor method is:
3802 % MagickBooleanType XGetWindowColor(Display *display,XWindows *windows,
3805 % A description of each parameter follows:
3807 % o display: Specifies a connection to an X server; returned from
3810 % o windows: Specifies a pointer to a XWindows structure.
3812 % o name: the name of the color if found in the X Color Database is
3813 % returned in this character string.
3816 MagickExport MagickBooleanType XGetWindowColor(Display *display,
3817 XWindows *windows,char *name)
3848 Choose a pixel from the X server.
3850 assert(display != (Display *) NULL);
3851 assert(name != (char *) NULL);
3852 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",name);
3854 target_window=XSelectWindow(display,&crop_info);
3855 if (target_window == (Window) NULL)
3856 return(MagickFalse);
3857 root_window=XRootWindow(display,XDefaultScreen(display));
3858 client_window=target_window;
3859 if (target_window != root_window)
3867 status=XGetGeometry(display,target_window,&root_window,&x,&x,&d,&d,&d,&d);
3868 if (status != False)
3870 client_window=XClientWindow(display,target_window);
3871 target_window=client_window;
3875 Verify window is viewable.
3877 status=XGetWindowAttributes(display,target_window,&window_attributes);
3878 if ((status == False) || (window_attributes.map_state != IsViewable))
3879 return(MagickFalse);
3883 (void) XTranslateCoordinates(display,root_window,target_window,
3884 (int) crop_info.x,(int) crop_info.y,&x,&y,&child);
3885 ximage=XGetImage(display,target_window,x,y,1,1,AllPlanes,ZPixmap);
3886 if (ximage == (XImage *) NULL)
3887 return(MagickFalse);
3888 color.pixel=XGetPixel(ximage,0,0);
3889 XDestroyImage(ximage);
3891 Match color against the color database.
3893 (void) XQueryColor(display,window_attributes.colormap,&color);
3894 pixel.red=ScaleShortToQuantum(color.red);
3895 pixel.green=ScaleShortToQuantum(color.green);
3896 pixel.blue=ScaleShortToQuantum(color.blue);
3897 pixel.opacity=OpaqueOpacity;
3898 (void) QueryColorname(windows->image.image,&pixel,X11Compliance,name,
3899 &windows->image.image->exception);
3904 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3908 + X G e t W i n d o w I m a g e %
3912 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3914 % XGetWindowImage() reads an image from the target X window and returns it.
3915 % XGetWindowImage() optionally descends the window hierarchy and overlays the
3916 % target image with each child image in an optimized fashion. Any child
3917 % window that have the same visual, colormap, and are contained by its parent
3920 % The format of the XGetWindowImage method is:
3922 % Image *XGetWindowImage(Display *display,const Window window,
3923 % const unsigned int borders,const unsigned int level)
3925 % A description of each parameter follows:
3927 % o display: Specifies a connection to an X server; returned from
3930 % o window: Specifies the window to obtain the image from.
3932 % o borders: Specifies whether borders pixels are to be saved with
3935 % o level: Specifies an unsigned integer representing the level of
3936 % decent in the window hierarchy. This value must be zero or one on
3937 % the initial call to XGetWindowImage. A value of zero returns after
3938 % one call. A value of one causes the function to descend the window
3939 % hierarchy and overlay the target image with each subwindow image.
3942 static Image *XGetWindowImage(Display *display,const Window window,
3943 const unsigned int borders,const unsigned int level)
3945 typedef struct _ColormapInfo
3953 struct _ColormapInfo
3957 typedef struct _WindowInfo
3989 register IndexPacket
3996 *colormap_info = (ColormapInfo *) NULL;
4016 Verify window is viewable.
4018 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
4019 assert(display != (Display *) NULL);
4020 status=XGetWindowAttributes(display,window,&window_attributes);
4021 if ((status == False) || (window_attributes.map_state != IsViewable))
4022 return((Image *) NULL);
4024 Cropping rectangle is relative to root window.
4026 root_window=XRootWindow(display,XDefaultScreen(display));
4027 (void) XTranslateCoordinates(display,window,root_window,0,0,&x_offset,
4029 crop_info.x=(ssize_t) x_offset;
4030 crop_info.y=(ssize_t) y_offset;
4031 crop_info.width=(size_t) window_attributes.width;
4032 crop_info.height=(size_t) window_attributes.height;
4033 if (borders != MagickFalse)
4036 Include border in image.
4038 crop_info.x-=(ssize_t) window_attributes.border_width;
4039 crop_info.y-=(ssize_t) window_attributes.border_width;
4040 crop_info.width+=(size_t) (window_attributes.border_width << 1);
4041 crop_info.height+=(size_t) (window_attributes.border_width << 1);
4044 Crop to root window.
4046 if (crop_info.x < 0)
4048 crop_info.width+=crop_info.x;
4051 if (crop_info.y < 0)
4053 crop_info.height+=crop_info.y;
4056 display_width=XDisplayWidth(display,XDefaultScreen(display));
4057 if ((int) (crop_info.x+crop_info.width) > display_width)
4058 crop_info.width=(size_t) (display_width-crop_info.x);
4059 display_height=XDisplayHeight(display,XDefaultScreen(display));
4060 if ((int) (crop_info.y+crop_info.height) > display_height)
4061 crop_info.height=(size_t) (display_height-crop_info.y);
4063 Initialize window info attributes.
4065 if (number_windows >= max_windows)
4068 Allocate or resize window info buffer.
4071 if (window_info == (WindowInfo *) NULL)
4072 window_info=(WindowInfo *) AcquireQuantumMemory((size_t) max_windows,
4073 sizeof(*window_info));
4075 window_info=(WindowInfo *) ResizeQuantumMemory(window_info,(size_t)
4076 max_windows,sizeof(*window_info));
4078 if (window_info == (WindowInfo *) NULL)
4080 ThrowXWindowFatalException(ResourceLimitError,
4081 "MemoryAllocationFailed","...");
4082 return((Image *) NULL);
4084 id=number_windows++;
4085 window_info[id].window=window;
4086 window_info[id].visual=window_attributes.visual;
4087 window_info[id].colormap=window_attributes.colormap;
4088 window_info[id].bounds.x1=(short) crop_info.x;
4089 window_info[id].bounds.y1=(short) crop_info.y;
4090 window_info[id].bounds.x2=(short) (crop_info.x+(int) crop_info.width-1);
4091 window_info[id].bounds.y2=(short) (crop_info.y+(int) crop_info.height-1);
4092 crop_info.x-=x_offset;
4093 crop_info.y-=y_offset;
4094 window_info[id].crop_info=crop_info;
4104 Descend the window hierarchy.
4106 status=XQueryTree(display,window,&root_window,&window_info[id].parent,
4107 &children,&number_children);
4108 for (i=0; i < id; i++)
4109 if ((window_info[i].window == window_info[id].parent) &&
4110 (window_info[i].visual == window_info[id].visual) &&
4111 (window_info[i].colormap == window_info[id].colormap))
4113 if ((window_info[id].bounds.x1 <= window_info[i].bounds.x1) ||
4114 (window_info[id].bounds.x1 >= window_info[i].bounds.x2) ||
4115 (window_info[id].bounds.y1 <= window_info[i].bounds.y1) ||
4116 (window_info[id].bounds.y1 >= window_info[i].bounds.y2))
4119 Eliminate windows not circumscribed by their parent.
4125 if ((status == True) && (number_children != 0))
4127 for (i=0; i < (int) number_children; i++)
4128 (void) XGetWindowImage(display,children[i],MagickFalse,level+1);
4129 (void) XFree((void *) children);
4157 register PixelPacket
4173 Get X image for each window in the list.
4175 image=NewImageList();
4176 for (id=0; id < number_windows; id++)
4179 Does target window intersect top level window?
4182 ((window_info[id].bounds.x2 >= window_info[0].bounds.x1) &&
4183 (window_info[id].bounds.x1 <= window_info[0].bounds.x2) &&
4184 (window_info[id].bounds.y2 >= window_info[0].bounds.y1) &&
4185 (window_info[id].bounds.y1 <= window_info[0].bounds.y2)) ?
4186 MagickTrue : MagickFalse;
4188 Is target window contained by another window with the same colormap?
4190 for (j=0; j < id; j++)
4191 if ((window_info[id].visual == window_info[j].visual) &&
4192 (window_info[id].colormap == window_info[j].colormap))
4194 if ((window_info[id].bounds.x1 <= window_info[j].bounds.x1) ||
4195 (window_info[id].bounds.x1 >= window_info[j].bounds.x2) ||
4196 (window_info[id].bounds.y1 <= window_info[j].bounds.y1) ||
4197 (window_info[id].bounds.y1 >= window_info[j].bounds.y2))
4201 if ((window_info[id].visual != window_info[j].visual) ||
4202 (window_info[id].colormap != window_info[j].colormap))
4204 if ((window_info[id].bounds.x2 > window_info[j].bounds.x1) &&
4205 (window_info[id].bounds.x1 < window_info[j].bounds.x2) &&
4206 (window_info[id].bounds.y2 > window_info[j].bounds.y1) &&
4207 (window_info[id].bounds.y1 < window_info[j].bounds.y2))
4210 if (import == MagickFalse)
4215 ximage=XGetImage(display,window_info[id].window,(int)
4216 window_info[id].crop_info.x,(int) window_info[id].crop_info.y,
4217 (unsigned int) window_info[id].crop_info.width,(unsigned int)
4218 window_info[id].crop_info.height,AllPlanes,ZPixmap);
4219 if (ximage == (XImage *) NULL)
4222 Initialize window colormap.
4225 colors=(XColor *) NULL;
4226 if (window_info[id].colormap != (Colormap) NULL)
4232 Search colormap list for window colormap.
4234 number_colors=(unsigned int) window_info[id].visual->map_entries;
4235 for (p=colormap_info; p != (ColormapInfo *) NULL; p=p->next)
4236 if (p->colormap == window_info[id].colormap)
4238 if (p == (ColormapInfo *) NULL)
4241 Get the window colormap.
4243 colors=(XColor *) AcquireQuantumMemory(number_colors,
4245 if (colors == (XColor *) NULL)
4247 XDestroyImage(ximage);
4248 return((Image *) NULL);
4250 if ((window_info[id].visual->klass != DirectColor) &&
4251 (window_info[id].visual->klass != TrueColor))
4252 for (i=0; i < (int) number_colors; i++)
4254 colors[i].pixel=(size_t) i;
4268 DirectColor or TrueColor visual.
4273 red_bit=window_info[id].visual->red_mask &
4274 (~(window_info[id].visual->red_mask)+1);
4275 green_bit=window_info[id].visual->green_mask &
4276 (~(window_info[id].visual->green_mask)+1);
4277 blue_bit=window_info[id].visual->blue_mask &
4278 (~(window_info[id].visual->blue_mask)+1);
4279 for (i=0; i < (int) number_colors; i++)
4281 colors[i].pixel=(unsigned long) (red | green | blue);
4284 if (red > window_info[id].visual->red_mask)
4287 if (green > window_info[id].visual->green_mask)
4290 if (blue > window_info[id].visual->blue_mask)
4294 (void) XQueryColors(display,window_info[id].colormap,colors,
4295 (int) number_colors);
4297 Append colormap to colormap list.
4299 p=(ColormapInfo *) AcquireMagickMemory(sizeof(*p));
4300 if (p == (ColormapInfo *) NULL)
4301 return((Image *) NULL);
4302 p->colormap=window_info[id].colormap;
4304 p->next=colormap_info;
4310 Allocate image structure.
4312 composite_image=AcquireImage((ImageInfo *) NULL);
4313 if (composite_image == (Image *) NULL)
4315 XDestroyImage(ximage);
4316 return((Image *) NULL);
4319 Convert X image to MIFF format.
4321 if ((window_info[id].visual->klass != TrueColor) &&
4322 (window_info[id].visual->klass != DirectColor))
4323 composite_image->storage_class=PseudoClass;
4324 composite_image->columns=(size_t) ximage->width;
4325 composite_image->rows=(size_t) ximage->height;
4326 exception=(&composite_image->exception);
4327 composite_view=AcquireCacheView(composite_image);
4328 switch (composite_image->storage_class)
4346 Determine shift and mask for red, green, and blue.
4348 red_mask=window_info[id].visual->red_mask;
4350 while ((red_mask != 0) && ((red_mask & 0x01) == 0))
4355 green_mask=window_info[id].visual->green_mask;
4357 while ((green_mask != 0) && ((green_mask & 0x01) == 0))
4362 blue_mask=window_info[id].visual->blue_mask;
4364 while ((blue_mask != 0) && ((blue_mask & 0x01) == 0))
4370 Convert X image to DirectClass packets.
4372 if ((number_colors != 0) &&
4373 (window_info[id].visual->klass == DirectColor))
4374 for (y=0; y < (int) composite_image->rows; y++)
4376 q=QueueCacheViewAuthenticPixels(composite_view,0,(ssize_t) y,
4377 composite_image->columns,1,exception);
4378 if (q == (PixelPacket *) NULL)
4380 for (x=0; x < (int) composite_image->columns; x++)
4382 pixel=XGetPixel(ximage,x,y);
4383 index=(pixel >> red_shift) & red_mask;
4384 q->red=ScaleShortToQuantum(colors[index].red);
4385 index=(pixel >> green_shift) & green_mask;
4386 q->green=ScaleShortToQuantum(colors[index].green);
4387 index=(pixel >> blue_shift) & blue_mask;
4388 q->blue=ScaleShortToQuantum(colors[index].blue);
4391 if (SyncCacheViewAuthenticPixels(composite_view,exception) == MagickFalse)
4395 for (y=0; y < (int) composite_image->rows; y++)
4397 q=QueueCacheViewAuthenticPixels(composite_view,0,(ssize_t) y,
4398 composite_image->columns,1,exception);
4399 if (q == (PixelPacket *) NULL)
4401 for (x=0; x < (int) composite_image->columns; x++)
4403 pixel=XGetPixel(ximage,x,y);
4404 color=(pixel >> red_shift) & red_mask;
4405 color=(65535UL*color)/red_mask;
4406 q->red=ScaleShortToQuantum((unsigned short) color);
4407 color=(pixel >> green_shift) & green_mask;
4408 color=(65535UL*color)/green_mask;
4409 q->green=ScaleShortToQuantum((unsigned short) color);
4410 color=(pixel >> blue_shift) & blue_mask;
4411 color=(65535UL*color)/blue_mask;
4412 q->blue=ScaleShortToQuantum((unsigned short) color);
4415 if (SyncCacheViewAuthenticPixels(composite_view,exception) == MagickFalse)
4425 if (AcquireImageColormap(composite_image,number_colors) == MagickFalse)
4427 XDestroyImage(ximage);
4428 composite_image=DestroyImage(composite_image);
4429 return((Image *) NULL);
4431 for (i=0; i < (int) composite_image->colors; i++)
4433 composite_image->colormap[colors[i].pixel].red=
4434 ScaleShortToQuantum(colors[i].red);
4435 composite_image->colormap[colors[i].pixel].green=
4436 ScaleShortToQuantum(colors[i].green);
4437 composite_image->colormap[colors[i].pixel].blue=
4438 ScaleShortToQuantum(colors[i].blue);
4441 Convert X image to PseudoClass packets.
4443 for (y=0; y < (int) composite_image->rows; y++)
4445 q=QueueCacheViewAuthenticPixels(composite_view,0,(ssize_t) y,
4446 composite_image->columns,1,exception);
4447 if (q == (PixelPacket *) NULL)
4449 indexes=GetCacheViewAuthenticIndexQueue(composite_view);
4450 for (x=0; x < (int) composite_image->columns; x++)
4452 index=(IndexPacket) XGetPixel(ximage,x,y);
4454 *q++=composite_image->colormap[(ssize_t) index];
4456 if (SyncCacheViewAuthenticPixels(composite_view,exception) == MagickFalse)
4462 composite_view=DestroyCacheView(composite_view);
4463 XDestroyImage(ximage);
4464 if (image == (Image *) NULL)
4466 image=composite_image;
4470 Composite any children in back-to-front order.
4472 (void) XTranslateCoordinates(display,window_info[id].window,window,0,0,
4473 &x_offset,&y_offset,&child);
4474 x_offset-=(int) crop_info.x;
4477 y_offset-=(int) crop_info.y;
4480 (void) CompositeImage(image,CopyCompositeOp,composite_image,(ssize_t)
4481 x_offset,(ssize_t) y_offset);
4484 Relinquish resources.
4486 while (colormap_info != (ColormapInfo *) NULL)
4488 next=colormap_info->next;
4489 colormap_info->colors=(XColor *)
4490 RelinquishMagickMemory(colormap_info->colors);
4491 colormap_info=(ColormapInfo *) RelinquishMagickMemory(colormap_info);
4495 Relinquish resources and restore initial state.
4497 window_info=(WindowInfo *) RelinquishMagickMemory(window_info);
4500 colormap_info=(ColormapInfo *) NULL;
4503 return((Image *) NULL);
4507 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4511 % X G e t W i n d o w I n f o %
4515 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4517 % XGetWindowInfo() initializes the XWindowInfo structure.
4519 % The format of the XGetWindowInfo method is:
4521 % void XGetWindowInfo(Display *display,XVisualInfo *visual_info,
4522 % XStandardColormap *map_info,XPixelInfo *pixel,XFontStruct *font_info,
4523 % XResourceInfo *resource_info,XWindowInfo *window)
4524 % resource_info,window)
4526 % A description of each parameter follows:
4528 % o display: Specifies a connection to an X server; returned from
4531 % o visual_info: Specifies a pointer to a X11 XVisualInfo structure;
4532 % returned from XGetVisualInfo.
4534 % o map_info: If map_type is specified, this structure is initialized
4535 % with info from the Standard Colormap.
4537 % o pixel: Specifies a pointer to a XPixelInfo structure.
4539 % o font_info: Specifies a pointer to a XFontStruct structure.
4541 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
4544 MagickExport void XGetWindowInfo(Display *display,XVisualInfo *visual_info,
4545 XStandardColormap *map_info,XPixelInfo *pixel,XFontStruct *font_info,
4546 XResourceInfo *resource_info,XWindowInfo *window)
4549 Initialize window info.
4551 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
4552 assert(display != (Display *) NULL);
4553 assert(visual_info != (XVisualInfo *) NULL);
4554 assert(map_info != (XStandardColormap *) NULL);
4555 assert(pixel != (XPixelInfo *) NULL);
4556 assert(resource_info != (XResourceInfo *) NULL);
4557 assert(window != (XWindowInfo *) NULL);
4558 if (window->id != (Window) NULL)
4560 if (window->cursor != (Cursor) NULL)
4561 (void) XFreeCursor(display,window->cursor);
4562 if (window->busy_cursor != (Cursor) NULL)
4563 (void) XFreeCursor(display,window->busy_cursor);
4564 if (window->highlight_stipple != (Pixmap) NULL)
4565 (void) XFreePixmap(display,window->highlight_stipple);
4566 if (window->shadow_stipple != (Pixmap) NULL)
4567 (void) XFreePixmap(display,window->shadow_stipple);
4568 if (window->name == (char *) NULL)
4569 window->name=AcquireString("");
4570 if (window->icon_name == (char *) NULL)
4571 window->icon_name=AcquireString("");
4576 Initialize these attributes just once.
4578 window->id=(Window) NULL;
4579 if (window->name == (char *) NULL)
4580 window->name=AcquireString("");
4581 if (window->icon_name == (char *) NULL)
4582 window->icon_name=AcquireString("");
4583 window->x=XDisplayWidth(display,visual_info->screen) >> 1;
4584 window->y=XDisplayWidth(display,visual_info->screen) >> 1;
4585 window->ximage=(XImage *) NULL;
4586 window->matte_image=(XImage *) NULL;
4587 window->pixmap=(Pixmap) NULL;
4588 window->matte_pixmap=(Pixmap) NULL;
4589 window->mapped=MagickFalse;
4590 window->stasis=MagickFalse;
4591 window->shared_memory=MagickTrue;
4592 window->segment_info=(void *) NULL;
4593 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
4598 if (window->segment_info == (void *) NULL)
4599 window->segment_info=AcquireQuantumMemory(2,sizeof(*segment_info));
4600 segment_info=(XShmSegmentInfo *) window->segment_info;
4601 segment_info[0].shmid=(-1);
4602 segment_info[0].shmaddr=(char *) NULL;
4603 segment_info[1].shmid=(-1);
4604 segment_info[1].shmaddr=(char *) NULL;
4609 Initialize these attributes every time function is called.
4611 window->screen=visual_info->screen;
4612 window->root=XRootWindow(display,visual_info->screen);
4613 window->visual=visual_info->visual;
4614 window->storage_class=(unsigned int) visual_info->klass;
4615 window->depth=(unsigned int) visual_info->depth;
4616 window->visual_info=visual_info;
4617 window->map_info=map_info;
4618 window->pixel_info=pixel;
4619 window->font_info=font_info;
4620 window->cursor=XCreateFontCursor(display,XC_left_ptr);
4621 window->busy_cursor=XCreateFontCursor(display,XC_watch);
4622 window->geometry=(char *) NULL;
4623 window->icon_geometry=(char *) NULL;
4624 if (resource_info->icon_geometry != (char *) NULL)
4625 (void) CloneString(&window->icon_geometry,resource_info->icon_geometry);
4626 window->crop_geometry=(char *) NULL;
4627 window->flags=(size_t) PSize;
4630 window->min_width=1;
4631 window->min_height=1;
4632 window->width_inc=1;
4633 window->height_inc=1;
4634 window->border_width=resource_info->border_width;
4635 window->annotate_context=pixel->annotate_context;
4636 window->highlight_context=pixel->highlight_context;
4637 window->widget_context=pixel->widget_context;
4638 window->shadow_stipple=(Pixmap) NULL;
4639 window->highlight_stipple=(Pixmap) NULL;
4640 window->use_pixmap=MagickTrue;
4641 window->immutable=MagickFalse;
4642 window->shape=MagickFalse;
4644 window->mask=(int) (CWBackingStore | CWBackPixel | CWBackPixmap |
4645 CWBitGravity | CWBorderPixel | CWColormap | CWCursor | CWDontPropagate |
4646 CWEventMask | CWOverrideRedirect | CWSaveUnder | CWWinGravity);
4647 window->attributes.background_pixel=pixel->background_color.pixel;
4648 window->attributes.background_pixmap=(Pixmap) NULL;
4649 window->attributes.bit_gravity=ForgetGravity;
4650 window->attributes.backing_store=WhenMapped;
4651 window->attributes.save_under=MagickTrue;
4652 window->attributes.border_pixel=pixel->border_color.pixel;
4653 window->attributes.colormap=map_info->colormap;
4654 window->attributes.cursor=window->cursor;
4655 window->attributes.do_not_propagate_mask=NoEventMask;
4656 window->attributes.event_mask=NoEventMask;
4657 window->attributes.override_redirect=MagickFalse;
4658 window->attributes.win_gravity=NorthWestGravity;
4659 window->orphan=MagickFalse;
4663 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4667 % X H i g h l i g h t E l l i p s e %
4671 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4673 % XHighlightEllipse() puts a border on the X server around a region defined by
4676 % The format of the XHighlightEllipse method is:
4678 % void XHighlightEllipse(Display *display,Window window,
4679 % GC annotate_context,const RectangleInfo *highlight_info)
4681 % A description of each parameter follows:
4683 % o display: Specifies a connection to an X server; returned from
4686 % o window: Specifies a pointer to a Window structure.
4688 % o annotate_context: Specifies a pointer to a GC structure.
4690 % o highlight_info: Specifies a pointer to a RectangleInfo structure. It
4691 % contains the extents of any highlighting rectangle.
4694 MagickExport void XHighlightEllipse(Display *display,Window window,
4695 GC annotate_context,const RectangleInfo *highlight_info)
4697 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
4698 assert(display != (Display *) NULL);
4699 assert(window != (Window) NULL);
4700 assert(annotate_context != (GC) NULL);
4701 assert(highlight_info != (RectangleInfo *) NULL);
4702 if ((highlight_info->width < 4) || (highlight_info->height < 4))
4704 (void) XDrawArc(display,window,annotate_context,(int) highlight_info->x,
4705 (int) highlight_info->y,(unsigned int) highlight_info->width-1,
4706 (unsigned int) highlight_info->height-1,0,360*64);
4707 (void) XDrawArc(display,window,annotate_context,(int) highlight_info->x+1,
4708 (int) highlight_info->y+1,(unsigned int) highlight_info->width-3,
4709 (unsigned int) highlight_info->height-3,0,360*64);
4713 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4717 % X H i g h l i g h t L i n e %
4721 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4723 % XHighlightLine() puts a border on the X server around a region defined by
4726 % The format of the XHighlightLine method is:
4728 % void XHighlightLine(Display *display,Window window,GC annotate_context,
4729 % const XSegment *highlight_info)
4731 % A description of each parameter follows:
4733 % o display: Specifies a connection to an X server; returned from
4736 % o window: Specifies a pointer to a Window structure.
4738 % o annotate_context: Specifies a pointer to a GC structure.
4740 % o highlight_info: Specifies a pointer to a RectangleInfo structure. It
4741 % contains the extents of any highlighting rectangle.
4744 MagickExport void XHighlightLine(Display *display,Window window,
4745 GC annotate_context,const XSegment *highlight_info)
4747 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
4748 assert(display != (Display *) NULL);
4749 assert(window != (Window) NULL);
4750 assert(annotate_context != (GC) NULL);
4751 assert(highlight_info != (XSegment *) NULL);
4752 (void) XDrawLine(display,window,annotate_context,highlight_info->x1,
4753 highlight_info->y1,highlight_info->x2,highlight_info->y2);
4757 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4761 % X H i g h l i g h t R e c t a n g l e %
4765 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4767 % XHighlightRectangle() puts a border on the X server around a region defined
4768 % by highlight_info.
4770 % The format of the XHighlightRectangle method is:
4772 % void XHighlightRectangle(Display *display,Window window,
4773 % GC annotate_context,const RectangleInfo *highlight_info)
4775 % A description of each parameter follows:
4777 % o display: Specifies a connection to an X server; returned from
4780 % o window: Specifies a pointer to a Window structure.
4782 % o annotate_context: Specifies a pointer to a GC structure.
4784 % o highlight_info: Specifies a pointer to a RectangleInfo structure. It
4785 % contains the extents of any highlighting rectangle.
4788 MagickExport void XHighlightRectangle(Display *display,Window window,
4789 GC annotate_context,const RectangleInfo *highlight_info)
4791 assert(display != (Display *) NULL);
4792 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
4793 assert(window != (Window) NULL);
4794 assert(annotate_context != (GC) NULL);
4795 assert(highlight_info != (RectangleInfo *) NULL);
4796 if ((highlight_info->width < 4) || (highlight_info->height < 4))
4798 (void) XDrawRectangle(display,window,annotate_context,(int) highlight_info->x,
4799 (int) highlight_info->y,(unsigned int) highlight_info->width-1,
4800 (unsigned int) highlight_info->height-1);
4801 (void) XDrawRectangle(display,window,annotate_context,(int) highlight_info->x+
4802 1,(int) highlight_info->y+1,(unsigned int) highlight_info->width-3,
4803 (unsigned int) highlight_info->height-3);
4807 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4811 % X I m p o r t I m a g e %
4815 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4817 % XImportImage() reads an image from an X window.
4819 % The format of the XImportImage method is:
4821 % Image *XImportImage(const ImageInfo *image_info,XImportInfo *ximage_info)
4823 % A description of each parameter follows:
4825 % o image_info: the image info.
4827 % o ximage_info: Specifies a pointer to an XImportInfo structure.
4830 MagickExport Image *XImportImage(const ImageInfo *image_info,
4831 XImportInfo *ximage_info)
4864 Open X server connection.
4866 assert(image_info != (const ImageInfo *) NULL);
4867 assert(image_info->signature == MagickSignature);
4868 if (image_info->debug != MagickFalse)
4869 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
4870 image_info->filename);
4871 assert(ximage_info != (XImportInfo *) NULL);
4872 display=XOpenDisplay(image_info->server_name);
4873 if (display == (Display *) NULL)
4875 ThrowXWindowFatalException(XServerError,"UnableToOpenXServer",
4876 XDisplayName(image_info->server_name));
4877 return((Image *) NULL);
4880 Set our forgiving exception handler.
4882 (void) XSetErrorHandler(XError);
4884 Select target window.
4890 root=XRootWindow(display,XDefaultScreen(display));
4891 target=(Window) NULL;
4892 if ((image_info->filename != (char *) NULL) &&
4893 (*image_info->filename != '\0'))
4895 if (LocaleCompare(image_info->filename,"root") == 0)
4900 Select window by ID or name.
4902 if (isdigit((unsigned char) *image_info->filename) != 0)
4903 target=XWindowByID(display,root,(Window)
4904 strtol(image_info->filename,(char **) NULL,0));
4905 if (target == (Window) NULL)
4906 target=XWindowByName(display,root,image_info->filename);
4907 if (target == (Window) NULL)
4908 ThrowXWindowFatalException(XServerError,
4909 "NoWindowWithSpecifiedIDExists",image_info->filename);
4913 If target window is not defined, interactively select one.
4915 prior_target=target;
4916 if (target == (Window) NULL)
4917 target=XSelectWindow(display,&crop_info);
4918 if (target == (Window) NULL)
4919 ThrowXWindowFatalException(XServerError,"UnableToReadXWindowImage",
4920 image_info->filename);
4921 client=target; /* obsolete */
4927 status=XGetGeometry(display,target,&root,&x,&x,&d,&d,&d,&d);
4928 if (status != False)
4936 Find window manager frame.
4938 status=XQueryTree(display,target,&root,&parent,&children,&d);
4939 if ((status != False) && (children != (Window *) NULL))
4940 (void) XFree((char *) children);
4941 if ((status == False) || (parent == (Window) NULL) ||
4949 client=XClientWindow(display,target);
4950 if (ximage_info->frame == MagickFalse)
4952 if ((ximage_info->frame == MagickFalse) &&
4953 (prior_target != MagickFalse))
4954 target=prior_target;
4955 XDelay(display,SuspendTime << 4);
4958 if (ximage_info->screen)
4970 Obtain window image directly from screen.
4972 status=XGetWindowAttributes(display,target,&window_attributes);
4973 if (status == False)
4975 ThrowXWindowFatalException(XServerError,
4976 "UnableToReadXWindowAttributes",image_info->filename);
4977 (void) XCloseDisplay(display);
4978 return((Image *) NULL);
4980 (void) XTranslateCoordinates(display,target,root,0,0,&x,&y,&child);
4981 crop_info.x=(ssize_t) x;
4982 crop_info.y=(ssize_t) y;
4983 crop_info.width=(size_t) window_attributes.width;
4984 crop_info.height=(size_t) window_attributes.height;
4985 if (ximage_info->borders != 0)
4988 Include border in image.
4990 crop_info.x-=window_attributes.border_width;
4991 crop_info.y-=window_attributes.border_width;
4992 crop_info.width+=window_attributes.border_width << 1;
4993 crop_info.height+=window_attributes.border_width << 1;
4998 If WM_COLORMAP_WINDOWS property is set or multiple colormaps, descend.
5001 status=XGetWMColormapWindows(display,target,&children,&number_windows);
5002 if ((status == True) && (number_windows > 0))
5004 ximage_info->descend=MagickTrue;
5005 (void) XFree ((char *) children);
5007 colormaps=XListInstalledColormaps(display,target,&number_colormaps);
5008 if (number_colormaps > 0)
5010 if (number_colormaps > 1)
5011 ximage_info->descend=MagickTrue;
5012 (void) XFree((char *) colormaps);
5015 Alert the user not to alter the screen.
5017 if (ximage_info->silent == MagickFalse)
5018 (void) XBell(display,0);
5020 Get image by window id.
5022 (void) XGrabServer(display);
5023 image=XGetWindowImage(display,target,ximage_info->borders,
5024 ximage_info->descend ? 1U : 0U);
5025 (void) XUngrabServer(display);
5026 if (image == (Image *) NULL)
5027 ThrowXWindowFatalException(XServerError,"UnableToReadXWindowImage",
5028 image_info->filename)
5031 (void) CopyMagickString(image->filename,image_info->filename,
5033 if ((crop_info.width != 0) && (crop_info.height != 0))
5040 Crop image as defined by the cropping rectangle.
5042 clone_image=CloneImage(image,0,0,MagickTrue,&image->exception);
5043 if (clone_image != (Image *) NULL)
5045 crop_image=CropImage(clone_image,&crop_info,&image->exception);
5046 if (crop_image != (Image *) NULL)
5048 image=DestroyImage(image);
5053 status=XGetWMName(display,target,&window_name);
5056 if ((image_info->filename != (char *) NULL) &&
5057 (*image_info->filename == '\0'))
5058 (void) CopyMagickString(image->filename,(char *) window_name.value,
5059 (size_t) window_name.nitems+1);
5060 (void) XFree((void *) window_name.value);
5063 if (ximage_info->silent == MagickFalse)
5066 Alert the user we're done.
5068 (void) XBell(display,0);
5069 (void) XBell(display,0);
5071 (void) XCloseDisplay(display);
5076 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5080 % X I n i t i a l i z e W i n d o w s %
5084 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5086 % XInitializeWindows() initializes the XWindows structure.
5088 % The format of the XInitializeWindows method is:
5090 % XWindows *XInitializeWindows(Display *display,
5091 % XResourceInfo *resource_info)
5093 % A description of each parameter follows:
5095 % o windows: XInitializeWindows returns a pointer to a XWindows structure.
5097 % o display: Specifies a connection to an X server; returned from
5100 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
5103 MagickExport XWindows *XInitializeWindows(Display *display,
5104 XResourceInfo *resource_info)
5113 Allocate windows structure.
5115 windows=(XWindows *) AcquireMagickMemory(sizeof(*windows));
5116 if (windows == (XWindows *) NULL)
5118 ThrowXWindowFatalException(XServerFatalError,"MemoryAllocationFailed",
5120 return((XWindows *) NULL);
5122 (void) ResetMagickMemory(windows,0,sizeof(*windows));
5123 windows->pixel_info=(XPixelInfo *) AcquireMagickMemory(
5124 sizeof(*windows->pixel_info));
5125 windows->icon_pixel=(XPixelInfo *) AcquireMagickMemory(
5126 sizeof(*windows->icon_pixel));
5127 windows->icon_resources=(XResourceInfo *) AcquireMagickMemory(
5128 sizeof(*windows->icon_resources));
5129 if ((windows->pixel_info == (XPixelInfo *) NULL) ||
5130 (windows->icon_pixel == (XPixelInfo *) NULL) ||
5131 (windows->icon_resources == (XResourceInfo *) NULL))
5133 ThrowXWindowFatalException(XServerFatalError,"MemoryAllocationFailed",
5135 return((XWindows *) NULL);
5138 Initialize windows structure.
5140 windows->display=display;
5141 windows->wm_protocols=XInternAtom(display,"WM_PROTOCOLS",MagickFalse);
5142 windows->wm_delete_window=XInternAtom(display,"WM_DELETE_WINDOW",MagickFalse);
5143 windows->wm_take_focus=XInternAtom(display,"WM_TAKE_FOCUS",MagickFalse);
5144 windows->im_protocols=XInternAtom(display,"IM_PROTOCOLS",MagickFalse);
5145 windows->im_remote_command=
5146 XInternAtom(display,"IM_REMOTE_COMMAND",MagickFalse);
5147 windows->im_update_widget=XInternAtom(display,"IM_UPDATE_WIDGET",MagickFalse);
5148 windows->im_update_colormap=
5149 XInternAtom(display,"IM_UPDATE_COLORMAP",MagickFalse);
5150 windows->im_former_image=XInternAtom(display,"IM_FORMER_IMAGE",MagickFalse);
5151 windows->im_next_image=XInternAtom(display,"IM_NEXT_IMAGE",MagickFalse);
5152 windows->im_retain_colors=XInternAtom(display,"IM_RETAIN_COLORS",MagickFalse);
5153 windows->im_exit=XInternAtom(display,"IM_EXIT",MagickFalse);
5154 windows->dnd_protocols=XInternAtom(display,"DndProtocol",MagickFalse);
5155 #if defined(MAGICKCORE_WINDOWS_SUPPORT)
5156 (void) XSynchronize(display,IsWindows95());
5158 if (IsEventLogging())
5160 (void) XSynchronize(display,MagickTrue);
5161 (void) LogMagickEvent(X11Event,GetMagickModule(),"Version: %s",
5162 GetMagickVersion((size_t *) NULL));
5163 (void) LogMagickEvent(X11Event,GetMagickModule(),"Protocols:");
5164 (void) LogMagickEvent(X11Event,GetMagickModule(),
5165 " Window Manager: 0x%lx",windows->wm_protocols);
5166 (void) LogMagickEvent(X11Event,GetMagickModule(),
5167 " delete window: 0x%lx",windows->wm_delete_window);
5168 (void) LogMagickEvent(X11Event,GetMagickModule()," take focus: 0x%lx",
5169 windows->wm_take_focus);
5170 (void) LogMagickEvent(X11Event,GetMagickModule()," ImageMagick: 0x%lx",
5171 windows->im_protocols);
5172 (void) LogMagickEvent(X11Event,GetMagickModule(),
5173 " remote command: 0x%lx",windows->im_remote_command);
5174 (void) LogMagickEvent(X11Event,GetMagickModule(),
5175 " update widget: 0x%lx",windows->im_update_widget);
5176 (void) LogMagickEvent(X11Event,GetMagickModule(),
5177 " update colormap: 0x%lx",windows->im_update_colormap);
5178 (void) LogMagickEvent(X11Event,GetMagickModule(),
5179 " former image: 0x%lx",windows->im_former_image);
5180 (void) LogMagickEvent(X11Event,GetMagickModule()," next image: 0x%lx",
5181 windows->im_next_image);
5182 (void) LogMagickEvent(X11Event,GetMagickModule(),
5183 " retain colors: 0x%lx",windows->im_retain_colors);
5184 (void) LogMagickEvent(X11Event,GetMagickModule()," exit: 0x%lx",
5186 (void) LogMagickEvent(X11Event,GetMagickModule()," Drag and Drop: 0x%lx",
5187 windows->dnd_protocols);
5190 Allocate standard colormap.
5192 windows->map_info=XAllocStandardColormap();
5193 windows->icon_map=XAllocStandardColormap();
5194 if ((windows->map_info == (XStandardColormap *) NULL) ||
5195 (windows->icon_map == (XStandardColormap *) NULL))
5196 ThrowXWindowFatalException(ResourceLimitFatalError,
5197 "MemoryAllocationFailed","...");
5198 windows->map_info->colormap=(Colormap) NULL;
5199 windows->icon_map->colormap=(Colormap) NULL;
5200 windows->pixel_info->pixels=(unsigned long *) NULL;
5201 windows->pixel_info->annotate_context=(GC) NULL;
5202 windows->pixel_info->highlight_context=(GC) NULL;
5203 windows->pixel_info->widget_context=(GC) NULL;
5204 windows->font_info=(XFontStruct *) NULL;
5205 windows->icon_pixel->annotate_context=(GC) NULL;
5206 windows->icon_pixel->pixels=(unsigned long *) NULL;
5210 *windows->icon_resources=(*resource_info);
5211 windows->icon_resources->visual_type=(char *) "default";
5212 windows->icon_resources->colormap=SharedColormap;
5213 windows->visual_info=
5214 XBestVisualInfo(display,windows->map_info,resource_info);
5215 windows->icon_visual=
5216 XBestVisualInfo(display,windows->icon_map,windows->icon_resources);
5217 if ((windows->visual_info == (XVisualInfo *) NULL) ||
5218 (windows->icon_visual == (XVisualInfo *) NULL))
5219 ThrowXWindowFatalException(XServerFatalError,"UnableToGetVisual",
5220 resource_info->visual_type);
5221 if (IsEventLogging())
5223 (void) LogMagickEvent(X11Event,GetMagickModule(),"Visual:");
5224 (void) LogMagickEvent(X11Event,GetMagickModule()," visual id: 0x%lx",
5225 windows->visual_info->visualid);
5226 (void) LogMagickEvent(X11Event,GetMagickModule()," class: %s",
5227 XVisualClassName(windows->visual_info->klass));
5228 (void) LogMagickEvent(X11Event,GetMagickModule()," depth: %d planes",
5229 windows->visual_info->depth);
5230 (void) LogMagickEvent(X11Event,GetMagickModule(),
5231 " size of colormap: %d entries",windows->visual_info->colormap_size);
5232 (void) LogMagickEvent(X11Event,GetMagickModule(),
5233 " red, green, blue masks: 0x%lx 0x%lx 0x%lx",
5234 windows->visual_info->red_mask,windows->visual_info->green_mask,
5235 windows->visual_info->blue_mask);
5236 (void) LogMagickEvent(X11Event,GetMagickModule(),
5237 " significant bits in color: %d bits",
5238 windows->visual_info->bits_per_rgb);
5241 Allocate class and manager hints.
5243 windows->class_hints=XAllocClassHint();
5244 windows->manager_hints=XAllocWMHints();
5245 if ((windows->class_hints == (XClassHint *) NULL) ||
5246 (windows->manager_hints == (XWMHints *) NULL))
5247 ThrowXWindowFatalException(ResourceLimitFatalError,
5248 "MemoryAllocationFailed","...");
5250 Determine group leader if we have one.
5252 root_window=XRootWindow(display,windows->visual_info->screen);
5253 windows->group_leader.id=(Window) NULL;
5254 if (resource_info->window_group != (char *) NULL)
5256 if (isdigit((unsigned char) *resource_info->window_group) != 0)
5257 windows->group_leader.id=XWindowByID(display,root_window,(Window)
5258 strtol((char *) resource_info->window_group,(char **) NULL,0));
5259 if (windows->group_leader.id == (Window) NULL)
5260 windows->group_leader.id=
5261 XWindowByName(display,root_window,resource_info->window_group);
5267 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5271 % X M a k e C u r s o r %
5275 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5277 % XMakeCursor() creates a crosshairs X11 cursor.
5279 % The format of the XMakeCursor method is:
5281 % Cursor XMakeCursor(Display *display,Window window,Colormap colormap,
5282 % char *background_color,char *foreground_color)
5284 % A description of each parameter follows:
5286 % o display: Specifies a connection to an X server; returned from
5289 % o window: Specifies the ID of the window for which the cursor is
5292 % o colormap: Specifies the ID of the colormap from which the background
5293 % and foreground color will be retrieved.
5295 % o background_color: Specifies the color to use for the cursor background.
5297 % o foreground_color: Specifies the color to use for the cursor foreground.
5300 MagickExport Cursor XMakeCursor(Display *display,Window window,
5301 Colormap colormap,char *background_color,char *foreground_color)
5303 #define scope_height 17
5304 #define scope_x_hot 8
5305 #define scope_y_hot 8
5306 #define scope_width 17
5308 static const unsigned char
5311 0x80, 0x03, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02,
5312 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x7f,
5313 0xfc, 0x01, 0x01, 0x00, 0x01, 0x7f, 0xfc, 0x01, 0x80, 0x02, 0x00,
5314 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02,
5315 0x00, 0x80, 0x02, 0x00, 0x80, 0x03, 0x00
5319 0xc0, 0x07, 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x06, 0x00, 0xc0, 0x06,
5320 0x00, 0xc0, 0x06, 0x00, 0xc0, 0x06, 0x00, 0xff, 0xfe, 0x01, 0x7f,
5321 0xfc, 0x01, 0x03, 0x80, 0x01, 0x7f, 0xfc, 0x01, 0xff, 0xfe, 0x01,
5322 0xc0, 0x06, 0x00, 0xc0, 0x06, 0x00, 0xc0, 0x06, 0x00, 0xc0, 0x06,
5323 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x07, 0x00
5337 assert(display != (Display *) NULL);
5338 assert(window != (Window) NULL);
5339 assert(colormap != (Colormap) NULL);
5340 assert(background_color != (char *) NULL);
5341 assert(foreground_color != (char *) NULL);
5342 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",background_color);
5343 source=XCreateBitmapFromData(display,window,(char *) scope_bits,scope_width,
5345 mask=XCreateBitmapFromData(display,window,(char *) scope_mask_bits,
5346 scope_width,scope_height);
5347 if ((source == (Pixmap) NULL) || (mask == (Pixmap) NULL))
5349 ThrowXWindowFatalException(XServerError,"UnableToCreatePixmap","...");
5350 return((Cursor) NULL);
5352 (void) XParseColor(display,colormap,background_color,&background);
5353 (void) XParseColor(display,colormap,foreground_color,&foreground);
5354 cursor=XCreatePixmapCursor(display,source,mask,&foreground,&background,
5355 scope_x_hot,scope_y_hot);
5356 (void) XFreePixmap(display,source);
5357 (void) XFreePixmap(display,mask);
5362 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5366 % X M a k e I m a g e %
5370 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5372 % XMakeImage() creates an X11 image. If the image size differs from the X11
5373 % image size, the image is first resized.
5375 % The format of the XMakeImage method is:
5377 % MagickBooleanType XMakeImage(Display *display,
5378 % const XResourceInfo *resource_info,XWindowInfo *window,Image *image,
5379 % unsigned int width,unsigned int height)
5381 % A description of each parameter follows:
5383 % o display: Specifies a connection to an X server; returned from
5386 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
5388 % o window: Specifies a pointer to a XWindowInfo structure.
5390 % o image: the image.
5392 % o width: Specifies the width in pixels of the rectangular area to
5395 % o height: Specifies the height in pixels of the rectangular area to
5399 MagickExport MagickBooleanType XMakeImage(Display *display,
5400 const XResourceInfo *resource_info,XWindowInfo *window,Image *image,
5401 unsigned int width,unsigned int height)
5403 #define CheckOverflowException(length,width,height) \
5404 (((height) != 0) && ((length)/((size_t) height) != ((size_t) width)))
5417 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
5418 assert(display != (Display *) NULL);
5419 assert(resource_info != (XResourceInfo *) NULL);
5420 assert(window != (XWindowInfo *) NULL);
5422 assert(height != 0);
5423 if ((window->width == 0) || (window->height == 0))
5424 return(MagickFalse);
5426 Apply user transforms to the image.
5428 (void) XCheckDefineCursor(display,window->id,window->busy_cursor);
5429 (void) XFlush(display);
5430 depth=(int) window->depth;
5431 if (window->destroy)
5432 window->image=DestroyImage(window->image);
5433 window->image=image;
5434 window->destroy=MagickFalse;
5435 if (window->image != (Image *) NULL)
5437 if (window->crop_geometry != (char *) NULL)
5448 window->image->page.x=0;
5449 window->image->page.y=0;
5450 (void) ParsePageGeometry(window->image,window->crop_geometry,
5451 &crop_info,&image->exception);
5452 crop_image=CropImage(window->image,&crop_info,&image->exception);
5453 if (crop_image != (Image *) NULL)
5455 if (window->image != image)
5456 window->image=DestroyImage(window->image);
5457 window->image=crop_image;
5458 window->destroy=MagickTrue;
5461 if ((width != (unsigned int) window->image->columns) ||
5462 (height != (unsigned int) window->image->rows))
5470 resize_image=NewImageList();
5471 if (window->pixel_info->colors != 0)
5472 resize_image=SampleImage(window->image,width,height,
5475 resize_image=ThumbnailImage(window->image,width,height,
5477 if (resize_image != (Image *) NULL)
5479 if (window->image != image)
5480 window->image=DestroyImage(window->image);
5481 window->image=resize_image;
5482 window->destroy=MagickTrue;
5485 width=(unsigned int) window->image->columns;
5486 assert((size_t) width == window->image->columns);
5487 height=(unsigned int) window->image->rows;
5488 assert((size_t) height == window->image->rows);
5493 ximage=(XImage *) NULL;
5494 format=(depth == 1) ? XYBitmap : ZPixmap;
5495 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
5496 if (window->shared_memory != MagickFalse)
5501 segment_info=(XShmSegmentInfo *) window->segment_info;
5502 segment_info[1].shmid=(-1);
5503 segment_info[1].shmaddr=(char *) NULL;
5504 ximage=XShmCreateImage(display,window->visual,(unsigned int) depth,format,
5505 (char *) NULL,&segment_info[1],width,height);
5506 if (ximage == (XImage *) NULL)
5507 window->shared_memory=MagickFalse;
5508 length=(size_t) ximage->bytes_per_line*ximage->height;
5509 if (CheckOverflowException(length,ximage->bytes_per_line,ximage->height))
5510 window->shared_memory=MagickFalse;
5511 if (window->shared_memory != MagickFalse)
5512 segment_info[1].shmid=shmget(IPC_PRIVATE,length,IPC_CREAT | 0777);
5513 if (window->shared_memory != MagickFalse)
5514 segment_info[1].shmaddr=(char *) shmat(segment_info[1].shmid,0,0);
5515 if (segment_info[1].shmid < 0)
5516 window->shared_memory=MagickFalse;
5517 if (window->shared_memory != MagickFalse)
5518 (void) shmctl(segment_info[1].shmid,IPC_RMID,0);
5521 if (ximage != (XImage *) NULL)
5522 XDestroyImage(ximage);
5523 ximage=(XImage *) NULL;
5524 if (segment_info[1].shmaddr)
5526 (void) shmdt(segment_info[1].shmaddr);
5527 segment_info[1].shmaddr=(char *) NULL;
5529 if (segment_info[1].shmid >= 0)
5531 (void) shmctl(segment_info[1].shmid,IPC_RMID,0);
5532 segment_info[1].shmid=(-1);
5538 Allocate X image pixel data.
5540 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
5541 if (window->shared_memory)
5549 (void) XSync(display,MagickFalse);
5550 xerror_alert=MagickFalse;
5551 segment_info=(XShmSegmentInfo *) window->segment_info;
5552 ximage->data=segment_info[1].shmaddr;
5553 segment_info[1].readOnly=MagickFalse;
5554 status=XShmAttach(display,&segment_info[1]);
5555 if (status != False)
5556 (void) XSync(display,MagickFalse);
5557 if ((status == False) || (xerror_alert != MagickFalse))
5559 window->shared_memory=MagickFalse;
5560 if (status != False)
5561 XShmDetach(display,&segment_info[1]);
5562 if (ximage != (XImage *) NULL)
5565 XDestroyImage(ximage);
5566 ximage=(XImage *) NULL;
5568 if (segment_info[1].shmid >= 0)
5570 if (segment_info[1].shmaddr != NULL)
5571 (void) shmdt(segment_info[1].shmaddr);
5572 (void) shmctl(segment_info[1].shmid,IPC_RMID,0);
5573 segment_info[1].shmid=(-1);
5574 segment_info[1].shmaddr=(char *) NULL;
5579 if (window->shared_memory == MagickFalse)
5580 ximage=XCreateImage(display,window->visual,(unsigned int) depth,format,0,
5581 (char *) NULL,width,height,XBitmapPad(display),0);
5582 if (ximage == (XImage *) NULL)
5585 Unable to create X image.
5587 (void) XCheckDefineCursor(display,window->id,window->cursor);
5588 return(MagickFalse);
5590 length=(size_t) ximage->bytes_per_line*ximage->height;
5591 if (IsEventLogging())
5593 (void) LogMagickEvent(X11Event,GetMagickModule(),"XImage:");
5594 (void) LogMagickEvent(X11Event,GetMagickModule()," width, height: %dx%d",
5595 ximage->width,ximage->height);
5596 (void) LogMagickEvent(X11Event,GetMagickModule()," format: %d",
5598 (void) LogMagickEvent(X11Event,GetMagickModule()," byte order: %d",
5599 ximage->byte_order);
5600 (void) LogMagickEvent(X11Event,GetMagickModule(),
5601 " bitmap unit, bit order, pad: %d %d %d",ximage->bitmap_unit,
5602 ximage->bitmap_bit_order,ximage->bitmap_pad);
5603 (void) LogMagickEvent(X11Event,GetMagickModule()," depth: %d",
5605 (void) LogMagickEvent(X11Event,GetMagickModule()," bytes per line: %d",
5606 ximage->bytes_per_line);
5607 (void) LogMagickEvent(X11Event,GetMagickModule()," bits per pixel: %d",
5608 ximage->bits_per_pixel);
5609 (void) LogMagickEvent(X11Event,GetMagickModule(),
5610 " red, green, blue masks: 0x%lx 0x%lx 0x%lx",ximage->red_mask,
5611 ximage->green_mask,ximage->blue_mask);
5613 if (window->shared_memory == MagickFalse)
5615 if (ximage->format != XYBitmap)
5616 ximage->data=(char *) AcquireQuantumMemory((size_t)
5617 ximage->bytes_per_line,(size_t) ximage->height);
5619 ximage->data=(char *) AcquireQuantumMemory((size_t)
5620 ximage->bytes_per_line*ximage->depth,(size_t) ximage->height);
5622 if (ximage->data == (char *) NULL)
5625 Unable to allocate pixel data.
5627 XDestroyImage(ximage);
5628 ximage=(XImage *) NULL;
5629 (void) XCheckDefineCursor(display,window->id,window->cursor);
5630 return(MagickFalse);
5632 if (window->ximage != (XImage *) NULL)
5635 Destroy previous X image.
5637 length=(size_t) window->ximage->bytes_per_line*window->ximage->height;
5638 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
5639 if (window->segment_info != (XShmSegmentInfo *) NULL)
5644 segment_info=(XShmSegmentInfo *) window->segment_info;
5645 if (segment_info[0].shmid >= 0)
5647 (void) XSync(display,MagickFalse);
5648 (void) XShmDetach(display,&segment_info[0]);
5649 (void) XSync(display,MagickFalse);
5650 if (segment_info[0].shmaddr != (char *) NULL)
5651 (void) shmdt(segment_info[0].shmaddr);
5652 (void) shmctl(segment_info[0].shmid,IPC_RMID,0);
5653 segment_info[0].shmid=(-1);
5654 segment_info[0].shmaddr=(char *) NULL;
5655 window->ximage->data=(char *) NULL;
5659 if (window->ximage->data != (char *) NULL)
5660 free(window->ximage->data);
5661 window->ximage->data=(char *) NULL;
5662 XDestroyImage(window->ximage);
5663 window->ximage=(XImage *) NULL;
5665 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
5666 if (window->segment_info != (XShmSegmentInfo *) NULL)
5671 segment_info=(XShmSegmentInfo *) window->segment_info;
5672 segment_info[0]=segment_info[1];
5675 window->ximage=ximage;
5676 matte_image=(XImage *) NULL;
5677 if ((window->shape != MagickFalse) && (window->image != (Image *) NULL))
5678 if ((window->image->matte != MagickFalse) &&
5679 ((int) width <= XDisplayWidth(display,window->screen)) &&
5680 ((int) height <= XDisplayHeight(display,window->screen)))
5685 matte_image=XCreateImage(display,window->visual,1,XYBitmap,0,
5686 (char *) NULL,width,height,XBitmapPad(display),0);
5687 if (IsEventLogging())
5689 (void) LogMagickEvent(X11Event,GetMagickModule(),"Matte Image:");
5690 (void) LogMagickEvent(X11Event,GetMagickModule(),
5691 " width, height: %dx%d",matte_image->width,matte_image->height);
5693 if (matte_image != (XImage *) NULL)
5696 Allocate matte image pixel data.
5698 matte_image->data=(char *) AcquireQuantumMemory((size_t)
5699 matte_image->bytes_per_line*matte_image->depth,
5700 (size_t) matte_image->height);
5701 if (matte_image->data == (char *) NULL)
5703 XDestroyImage(matte_image);
5704 matte_image=(XImage *) NULL;
5708 if (window->matte_image != (XImage *) NULL)
5713 if (window->matte_image->data != (char *) NULL)
5714 free(window->matte_image->data);
5715 window->matte_image->data=(char *) NULL;
5716 XDestroyImage(window->matte_image);
5717 window->matte_image=(XImage *) NULL;
5719 window->matte_image=matte_image;
5720 if (window->matte_pixmap != (Pixmap) NULL)
5722 (void) XFreePixmap(display,window->matte_pixmap);
5723 window->matte_pixmap=(Pixmap) NULL;
5724 #if defined(MAGICKCORE_HAVE_SHAPE)
5725 if (window->shape != MagickFalse)
5726 XShapeCombineMask(display,window->id,ShapeBounding,0,0,None,ShapeSet);
5729 window->stasis=MagickFalse;
5731 Convert pixels to X image data.
5733 if (window->image != (Image *) NULL)
5735 if ((ximage->byte_order == LSBFirst) || ((ximage->format == XYBitmap) &&
5736 (ximage->bitmap_bit_order == LSBFirst)))
5737 XMakeImageLSBFirst(resource_info,window,window->image,ximage,
5740 XMakeImageMSBFirst(resource_info,window,window->image,ximage,
5743 if (window->matte_image != (XImage *) NULL)
5746 Create matte pixmap.
5748 window->matte_pixmap=XCreatePixmap(display,window->id,width,height,1);
5749 if (window->matte_pixmap != (Pixmap) NULL)
5758 Copy matte image to matte pixmap.
5760 context_values.background=1;
5761 context_values.foreground=0;
5762 graphics_context=XCreateGC(display,window->matte_pixmap,
5763 (size_t) (GCBackground | GCForeground),&context_values);
5764 (void) XPutImage(display,window->matte_pixmap,graphics_context,
5765 window->matte_image,0,0,0,0,width,height);
5766 (void) XFreeGC(display,graphics_context);
5767 #if defined(MAGICKCORE_HAVE_SHAPE)
5768 if (window->shape != MagickFalse)
5769 XShapeCombineMask(display,window->id,ShapeBounding,0,0,
5770 window->matte_pixmap,ShapeSet);
5774 (void) XMakePixmap(display,resource_info,window);
5778 (void) XCheckDefineCursor(display,window->id,window->cursor);
5783 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5787 + X M a k e I m a g e L S B F i r s t %
5791 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5793 % XMakeImageLSBFirst() initializes the pixel data of an X11 Image. The X image
5794 % pixels are copied in least-significant bit and byte first order. The
5795 % server's scanline pad is respected. Rather than using one or two general
5796 % cases, many special cases are found here to help speed up the image
5799 % The format of the XMakeImageLSBFirst method is:
5801 % void XMakeImageLSBFirst(Display *display,XWindows *windows)
5803 % A description of each parameter follows:
5805 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
5807 % o window: Specifies a pointer to a XWindowInfo structure.
5809 % o image: the image.
5811 % o ximage: Specifies a pointer to a XImage structure; returned from
5814 % o matte_image: Specifies a pointer to a XImage structure; returned from
5818 static void XMakeImageLSBFirst(const XResourceInfo *resource_info,
5819 const XWindowInfo *window,Image *image,XImage *ximage,XImage *matte_image)
5830 register const IndexPacket
5833 register const PixelPacket
5839 register unsigned char
5856 assert(resource_info != (XResourceInfo *) NULL);
5857 assert(window != (XWindowInfo *) NULL);
5858 assert(image != (Image *) NULL);
5859 if (image->debug != MagickFalse)
5860 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
5862 if ((window->immutable == MagickFalse) &&
5863 (image->storage_class == DirectClass) && (image->matte != MagickFalse))
5866 size[MaxTextExtent];
5874 image_info=AcquireImageInfo();
5875 (void) CopyMagickString(image_info->filename,
5876 resource_info->image_info->texture != (char *) NULL ?
5877 resource_info->image_info->texture : "pattern:checkerboard",
5879 (void) FormatMagickString(size,MaxTextExtent,"%.20gx%.20g",(double)
5880 image->columns,(double) image->rows);
5881 image_info->size=ConstantString(size);
5882 pattern=ReadImage(image_info,&image->exception);
5883 image_info=DestroyImageInfo(image_info);
5884 if (pattern != (Image *) NULL)
5886 canvas=CloneImage(image,0,0,MagickTrue,&image->exception);
5887 if (canvas != (Image *) NULL)
5888 (void) CompositeImage(canvas,DstOverCompositeOp,pattern,0,0);
5889 pattern=DestroyImage(pattern);
5892 scanline_pad=(unsigned int) (ximage->bytes_per_line-((ximage->width*
5893 ximage->bits_per_pixel) >> 3));
5894 map_info=window->map_info;
5895 pixels=window->pixel_info->pixels;
5896 q=(unsigned char *) ximage->data;
5898 canvas_view=AcquireCacheView(canvas);
5899 if (ximage->format == XYBitmap)
5901 register unsigned short
5909 Convert canvas to big-endian bitmap.
5911 background=(unsigned char)
5912 (XPixelIntensity(&window->pixel_info->foreground_color) <
5913 XPixelIntensity(&window->pixel_info->background_color) ? 0x80 : 0x00);
5914 foreground=(unsigned char)
5915 (XPixelIntensity(&window->pixel_info->background_color) <
5916 XPixelIntensity(&window->pixel_info->foreground_color) ? 0x80 : 0x00);
5917 polarity=(unsigned short) ((PixelIntensityToQuantum(
5918 &canvas->colormap[0])) < ((Quantum) QuantumRange/2) ? 1 : 0);
5919 if (canvas->colors == 2)
5920 polarity=PixelIntensity(&canvas->colormap[0]) <
5921 PixelIntensity(&canvas->colormap[1]);
5922 for (y=0; y < (int) canvas->rows; y++)
5924 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,canvas->columns,1,
5925 &canvas->exception);
5926 if (p == (const PixelPacket *) NULL)
5928 indexes=GetCacheViewVirtualIndexQueue(canvas_view);
5931 for (x=0; x < (int) canvas->columns; x++)
5934 if (indexes[x] == (IndexPacket) polarity)
5952 if (window->pixel_info->colors != 0)
5953 switch (ximage->bits_per_pixel)
5957 register unsigned int
5961 Convert to 2 bit color-mapped X canvas.
5963 for (y=0; y < (int) canvas->rows; y++)
5965 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
5966 canvas->columns,1,&canvas->exception);
5967 if (p == (const PixelPacket *) NULL)
5969 indexes=GetCacheViewVirtualIndexQueue(canvas_view);
5971 for (x=0; x < (int) canvas->columns; x++)
5973 pixel=pixels[(ssize_t) indexes[x]] & 0x0f;
5978 *q=(unsigned char) pixel;
5984 *q|=(unsigned char) (pixel << 2);
5990 *q|=(unsigned char) (pixel << 4);
5996 *q|=(unsigned char) (pixel << 6);
6009 register unsigned int
6013 Convert to 4 bit color-mapped X canvas.
6015 for (y=0; y < (int) canvas->rows; y++)
6017 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6018 canvas->columns,1,&canvas->exception);
6019 if (p == (const PixelPacket *) NULL)
6021 indexes=GetCacheViewVirtualIndexQueue(canvas_view);
6023 for (x=0; x < (int) canvas->columns; x++)
6025 pixel=pixels[(ssize_t) indexes[x]] & 0xf;
6030 *q=(unsigned char) pixel;
6036 *q|=(unsigned char) (pixel << 4);
6051 Convert to 8 bit color-mapped X canvas.
6053 if (resource_info->color_recovery &&
6054 resource_info->quantize_info->dither)
6056 XDitherImage(canvas,ximage);
6059 for (y=0; y < (int) canvas->rows; y++)
6061 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6062 canvas->columns,1,&canvas->exception);
6063 if (p == (const PixelPacket *) NULL)
6065 indexes=GetCacheViewVirtualIndexQueue(canvas_view);
6066 for (x=0; x < (int) canvas->columns; x++)
6068 pixel=pixels[(ssize_t) indexes[x]];
6069 *q++=(unsigned char) pixel;
6080 register unsigned int
6084 channel[sizeof(size_t)];
6087 Convert to multi-byte color-mapped X canvas.
6089 bytes_per_pixel=(unsigned int) (ximage->bits_per_pixel >> 3);
6090 for (y=0; y < (int) canvas->rows; y++)
6092 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6093 canvas->columns,1,&canvas->exception);
6094 if (p == (const PixelPacket *) NULL)
6096 indexes=GetCacheViewVirtualIndexQueue(canvas_view);
6097 for (x=0; x < (int) canvas->columns; x++)
6099 pixel=pixels[(ssize_t) indexes[x]];
6100 for (k=0; k < (int) bytes_per_pixel; k++)
6102 channel[k]=(unsigned char) pixel;
6105 for (k=0; k < (int) bytes_per_pixel; k++)
6114 switch (ximage->bits_per_pixel)
6118 register unsigned int
6122 Convert to contiguous 2 bit continuous-tone X canvas.
6124 for (y=0; y < (int) canvas->rows; y++)
6127 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6128 canvas->columns,1,&canvas->exception);
6129 if (p == (const PixelPacket *) NULL)
6131 for (x=0; x < (int) canvas->columns; x++)
6133 pixel=XGammaPixel(map_info,p);
6139 *q=(unsigned char) pixel;
6145 *q|=(unsigned char) (pixel << 2);
6151 *q|=(unsigned char) (pixel << 4);
6157 *q|=(unsigned char) (pixel << 6);
6171 register unsigned int
6175 Convert to contiguous 4 bit continuous-tone X canvas.
6177 for (y=0; y < (int) canvas->rows; y++)
6179 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6180 canvas->columns,1,&canvas->exception);
6181 if (p == (const PixelPacket *) NULL)
6184 for (x=0; x < (int) canvas->columns; x++)
6186 pixel=XGammaPixel(map_info,p);
6192 *q=(unsigned char) pixel;
6198 *q|=(unsigned char) (pixel << 4);
6214 Convert to contiguous 8 bit continuous-tone X canvas.
6216 if (resource_info->color_recovery &&
6217 resource_info->quantize_info->dither)
6219 XDitherImage(canvas,ximage);
6222 for (y=0; y < (int) canvas->rows; y++)
6224 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6225 canvas->columns,1,&canvas->exception);
6226 if (p == (const PixelPacket *) NULL)
6228 for (x=0; x < (int) canvas->columns; x++)
6230 pixel=XGammaPixel(map_info,p);
6231 *q++=(unsigned char) pixel;
6240 if ((ximage->bits_per_pixel == 32) && (map_info->red_max == 255) &&
6241 (map_info->green_max == 255) && (map_info->blue_max == 255) &&
6242 (map_info->red_mult == 65536L) && (map_info->green_mult == 256) &&
6243 (map_info->blue_mult == 1))
6246 Convert to 32 bit continuous-tone X canvas.
6248 for (y=0; y < (int) canvas->rows; y++)
6250 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6251 canvas->columns,1,&canvas->exception);
6252 if (p == (const PixelPacket *) NULL)
6254 if ((red_gamma != 1.0) || (green_gamma != 1.0) ||
6255 (blue_gamma != 1.0))
6258 Gamma correct canvas.
6260 for (x=(int) canvas->columns-1; x >= 0; x--)
6262 *q++=ScaleQuantumToChar(XBlueGamma(
6263 GetBluePixelComponent(p)));
6264 *q++=ScaleQuantumToChar(XGreenGamma(
6265 GetGreenPixelComponent(p)));
6266 *q++=ScaleQuantumToChar(XRedGamma(
6267 GetRedPixelComponent(p)));
6273 for (x=(int) canvas->columns-1; x >= 0; x--)
6275 *q++=ScaleQuantumToChar((Quantum) GetBluePixelComponent(p));
6276 *q++=ScaleQuantumToChar((Quantum) GetGreenPixelComponent(p));
6277 *q++=ScaleQuantumToChar((Quantum) GetRedPixelComponent(p));
6284 if ((ximage->bits_per_pixel == 32) && (map_info->red_max == 255) &&
6285 (map_info->green_max == 255) && (map_info->blue_max == 255) &&
6286 (map_info->red_mult == 1) && (map_info->green_mult == 256) &&
6287 (map_info->blue_mult == 65536L))
6290 Convert to 32 bit continuous-tone X canvas.
6292 for (y=0; y < (int) canvas->rows; y++)
6294 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6295 canvas->columns,1,&canvas->exception);
6296 if (p == (const PixelPacket *) NULL)
6298 if ((red_gamma != 1.0) || (green_gamma != 1.0) ||
6299 (blue_gamma != 1.0))
6302 Gamma correct canvas.
6304 for (x=(int) canvas->columns-1; x >= 0; x--)
6306 *q++=ScaleQuantumToChar(XRedGamma(
6307 GetRedPixelComponent(p)));
6308 *q++=ScaleQuantumToChar(XGreenGamma(
6309 GetGreenPixelComponent(p)));
6310 *q++=ScaleQuantumToChar(XBlueGamma(
6311 GetBluePixelComponent(p)));
6317 for (x=(int) canvas->columns-1; x >= 0; x--)
6319 *q++=ScaleQuantumToChar((Quantum)
6320 GetRedPixelComponent(p));
6321 *q++=ScaleQuantumToChar((Quantum)
6322 GetGreenPixelComponent(p));
6323 *q++=ScaleQuantumToChar((Quantum)
6324 GetBluePixelComponent(p));
6335 register unsigned int
6339 channel[sizeof(size_t)];
6342 Convert to multi-byte continuous-tone X canvas.
6344 bytes_per_pixel=(unsigned int) (ximage->bits_per_pixel >> 3);
6345 for (y=0; y < (int) canvas->rows; y++)
6347 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6348 canvas->columns,1,&canvas->exception);
6349 if (p == (PixelPacket *) NULL)
6351 for (x=0; x < (int) canvas->columns; x++)
6353 pixel=XGammaPixel(map_info,p);
6354 for (k=0; k < (int) bytes_per_pixel; k++)
6356 channel[k]=(unsigned char) pixel;
6359 for (k=0; k < (int) bytes_per_pixel; k++)
6369 if (matte_image != (XImage *) NULL)
6372 Initialize matte canvas.
6374 scanline_pad=(unsigned int) (matte_image->bytes_per_line-
6375 ((matte_image->width*matte_image->bits_per_pixel) >> 3));
6376 q=(unsigned char *) matte_image->data;
6377 for (y=0; y < (int) canvas->rows; y++)
6379 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,canvas->columns,1,
6380 &canvas->exception);
6381 if (p == (const PixelPacket *) NULL)
6385 for (x=(int) canvas->columns-1; x >= 0; x--)
6388 if (p->opacity > (QuantumRange/2))
6404 canvas_view=DestroyCacheView(canvas_view);
6405 if (canvas != image)
6406 canvas=DestroyImage(canvas);
6410 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6414 + X M a k e I m a g e M S B F i r s t %
6418 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6420 % XMakeImageMSBFirst() initializes the pixel data of an X11 Image. The X
6421 % image pixels are copied in most-significant bit and byte first order. The
6422 % server's scanline pad is also respected. Rather than using one or two
6423 % general cases, many special cases are found here to help speed up the image
6426 % The format of the XMakeImageMSBFirst method is:
6428 % XMakeImageMSBFirst(resource_info,window,image,ximage,matte_image)
6430 % A description of each parameter follows:
6432 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
6434 % o window: Specifies a pointer to a XWindowInfo structure.
6436 % o image: the image.
6438 % o ximage: Specifies a pointer to a XImage structure; returned from
6441 % o matte_image: Specifies a pointer to a XImage structure; returned from
6445 static void XMakeImageMSBFirst(const XResourceInfo *resource_info,
6446 const XWindowInfo *window,Image *image,XImage *ximage,XImage *matte_image)
6460 register const IndexPacket
6463 register const PixelPacket
6466 register unsigned char
6483 assert(resource_info != (XResourceInfo *) NULL);
6484 assert(window != (XWindowInfo *) NULL);
6485 assert(image != (Image *) NULL);
6486 if (image->debug != MagickFalse)
6487 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
6489 if ((window->immutable != MagickFalse) &&
6490 (image->storage_class == DirectClass) && (image->matte != MagickFalse))
6493 size[MaxTextExtent];
6501 image_info=AcquireImageInfo();
6502 (void) CopyMagickString(image_info->filename,
6503 resource_info->image_info->texture != (char *) NULL ?
6504 resource_info->image_info->texture : "pattern:checkerboard",
6506 (void) FormatMagickString(size,MaxTextExtent,"%.20gx%.20g",(double)
6507 image->columns,(double) image->rows);
6508 image_info->size=ConstantString(size);
6509 pattern=ReadImage(image_info,&image->exception);
6510 image_info=DestroyImageInfo(image_info);
6511 if (pattern != (Image *) NULL)
6513 canvas=CloneImage(image,0,0,MagickTrue,&image->exception);
6514 if (canvas != (Image *) NULL)
6515 (void) CompositeImage(canvas,DstOverCompositeOp,pattern,0,0);
6516 pattern=DestroyImage(pattern);
6519 scanline_pad=(unsigned int) (ximage->bytes_per_line-
6520 ((ximage->width*ximage->bits_per_pixel) >> 3));
6521 map_info=window->map_info;
6522 pixels=window->pixel_info->pixels;
6523 q=(unsigned char *) ximage->data;
6525 canvas_view=AcquireCacheView(canvas);
6526 if (ximage->format == XYBitmap)
6528 register unsigned short
6536 Convert canvas to big-endian bitmap.
6538 background=(unsigned char)
6539 (XPixelIntensity(&window->pixel_info->foreground_color) <
6540 XPixelIntensity(&window->pixel_info->background_color) ? 0x01 : 0x00);
6541 foreground=(unsigned char)
6542 (XPixelIntensity(&window->pixel_info->background_color) <
6543 XPixelIntensity(&window->pixel_info->foreground_color) ? 0x01 : 0x00);
6544 polarity=(unsigned short) ((PixelIntensityToQuantum(
6545 &canvas->colormap[0])) < ((Quantum) QuantumRange/2) ? 1 : 0);
6546 if (canvas->colors == 2)
6547 polarity=PixelIntensity(&canvas->colormap[0]) <
6548 PixelIntensity(&canvas->colormap[1]);
6549 for (y=0; y < (int) canvas->rows; y++)
6551 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,canvas->columns,1,
6552 &canvas->exception);
6553 if (p == (const PixelPacket *) NULL)
6555 indexes=GetCacheViewVirtualIndexQueue(canvas_view);
6558 for (x=(int) canvas->columns-1; x >= 0; x--)
6561 if (indexes[x] == (IndexPacket) polarity)
6579 if (window->pixel_info->colors != 0)
6580 switch (ximage->bits_per_pixel)
6584 register unsigned int
6588 Convert to 2 bit color-mapped X canvas.
6590 for (y=0; y < (int) canvas->rows; y++)
6592 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6593 canvas->columns,1,&canvas->exception);
6594 if (p == (const PixelPacket *) NULL)
6596 indexes=GetCacheViewVirtualIndexQueue(canvas_view);
6598 for (x=0; x < (int) canvas->columns; x++)
6600 pixel=pixels[(ssize_t) indexes[x]] & 0xf;
6605 *q=(unsigned char) (pixel << 6);
6611 *q|=(unsigned char) (pixel << 4);
6617 *q|=(unsigned char) (pixel << 2);
6623 *q|=(unsigned char) pixel;
6636 register unsigned int
6640 Convert to 4 bit color-mapped X canvas.
6642 for (y=0; y < (int) canvas->rows; y++)
6644 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6645 canvas->columns,1,&canvas->exception);
6646 if (p == (const PixelPacket *) NULL)
6648 indexes=GetCacheViewVirtualIndexQueue(canvas_view);
6650 for (x=0; x < (int) canvas->columns; x++)
6652 pixel=pixels[(ssize_t) indexes[x]] & 0xf;
6657 *q=(unsigned char) (pixel << 4);
6663 *q|=(unsigned char) pixel;
6678 Convert to 8 bit color-mapped X canvas.
6680 if (resource_info->color_recovery &&
6681 resource_info->quantize_info->dither)
6683 XDitherImage(canvas,ximage);
6686 for (y=0; y < (int) canvas->rows; y++)
6688 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6689 canvas->columns,1,&canvas->exception);
6690 if (p == (const PixelPacket *) NULL)
6692 indexes=GetCacheViewVirtualIndexQueue(canvas_view);
6693 for (x=0; x < (int) canvas->columns; x++)
6695 pixel=pixels[(ssize_t) indexes[x]];
6696 *q++=(unsigned char) pixel;
6707 register unsigned int
6711 channel[sizeof(size_t)];
6714 Convert to 8 bit color-mapped X canvas.
6716 bytes_per_pixel=(unsigned int) (ximage->bits_per_pixel >> 3);
6717 for (y=0; y < (int) canvas->rows; y++)
6719 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6720 canvas->columns,1,&canvas->exception);
6721 if (p == (const PixelPacket *) NULL)
6723 indexes=GetCacheViewVirtualIndexQueue(canvas_view);
6724 for (x=0; x < (int) canvas->columns; x++)
6726 pixel=pixels[(ssize_t) indexes[x]];
6727 for (k=(int) bytes_per_pixel-1; k >= 0; k--)
6729 channel[k]=(unsigned char) pixel;
6732 for (k=0; k < (int) bytes_per_pixel; k++)
6741 switch (ximage->bits_per_pixel)
6745 register unsigned int
6749 Convert to 4 bit continuous-tone X canvas.
6751 for (y=0; y < (int) canvas->rows; y++)
6753 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6754 canvas->columns,1,&canvas->exception);
6755 if (p == (const PixelPacket *) NULL)
6758 for (x=(int) canvas->columns-1; x >= 0; x--)
6760 pixel=XGammaPixel(map_info,p);
6766 *q=(unsigned char) (pixel << 6);
6772 *q|=(unsigned char) (pixel << 4);
6778 *q|=(unsigned char) (pixel << 2);
6784 *q|=(unsigned char) pixel;
6798 register unsigned int
6802 Convert to 4 bit continuous-tone X canvas.
6804 for (y=0; y < (int) canvas->rows; y++)
6806 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6807 canvas->columns,1,&canvas->exception);
6808 if (p == (const PixelPacket *) NULL)
6811 for (x=(int) canvas->columns-1; x >= 0; x--)
6813 pixel=XGammaPixel(map_info,p);
6819 *q=(unsigned char) (pixel << 4);
6825 *q|=(unsigned char) pixel;
6841 Convert to 8 bit continuous-tone X canvas.
6843 if (resource_info->color_recovery &&
6844 resource_info->quantize_info->dither)
6846 XDitherImage(canvas,ximage);
6849 for (y=0; y < (int) canvas->rows; y++)
6851 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6852 canvas->columns,1,&canvas->exception);
6853 if (p == (const PixelPacket *) NULL)
6855 for (x=(int) canvas->columns-1; x >= 0; x--)
6857 pixel=XGammaPixel(map_info,p);
6858 *q++=(unsigned char) pixel;
6867 if ((ximage->bits_per_pixel == 32) && (map_info->red_max == 255) &&
6868 (map_info->green_max == 255) && (map_info->blue_max == 255) &&
6869 (map_info->red_mult == 65536L) && (map_info->green_mult == 256) &&
6870 (map_info->blue_mult == 1))
6873 Convert to 32 bit continuous-tone X canvas.
6875 for (y=0; y < (int) canvas->rows; y++)
6877 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6878 canvas->columns,1,&canvas->exception);
6879 if (p == (const PixelPacket *) NULL)
6881 if ((red_gamma != 1.0) || (green_gamma != 1.0) ||
6882 (blue_gamma != 1.0))
6885 Gamma correct canvas.
6887 for (x=(int) canvas->columns-1; x >= 0; x--)
6890 *q++=ScaleQuantumToChar(XRedGamma(
6891 GetRedPixelComponent(p)));
6892 *q++=ScaleQuantumToChar(XGreenGamma(
6893 GetGreenPixelComponent(p)));
6894 *q++=ScaleQuantumToChar(XBlueGamma(
6895 GetBluePixelComponent(p)));
6900 for (x=(int) canvas->columns-1; x >= 0; x--)
6903 *q++=ScaleQuantumToChar((Quantum) GetRedPixelComponent(p));
6904 *q++=ScaleQuantumToChar((Quantum) GetGreenPixelComponent(p));
6905 *q++=ScaleQuantumToChar((Quantum) GetBluePixelComponent(p));
6911 if ((ximage->bits_per_pixel == 32) && (map_info->red_max == 255) &&
6912 (map_info->green_max == 255) && (map_info->blue_max == 255) &&
6913 (map_info->red_mult == 1) && (map_info->green_mult == 256) &&
6914 (map_info->blue_mult == 65536L))
6917 Convert to 32 bit continuous-tone X canvas.
6919 for (y=0; y < (int) canvas->rows; y++)
6921 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6922 canvas->columns,1,&canvas->exception);
6923 if (p == (const PixelPacket *) NULL)
6925 if ((red_gamma != 1.0) || (green_gamma != 1.0) ||
6926 (blue_gamma != 1.0))
6929 Gamma correct canvas.
6931 for (x=(int) canvas->columns-1; x >= 0; x--)
6934 *q++=ScaleQuantumToChar(XBlueGamma(
6935 GetBluePixelComponent(p)));
6936 *q++=ScaleQuantumToChar(XGreenGamma(
6937 GetGreenPixelComponent(p)));
6938 *q++=ScaleQuantumToChar(XRedGamma(
6939 GetRedPixelComponent(p)));
6944 for (x=(int) canvas->columns-1; x >= 0; x--)
6947 *q++=ScaleQuantumToChar((Quantum)
6948 GetBluePixelComponent(p));
6949 *q++=ScaleQuantumToChar((Quantum)
6950 GetGreenPixelComponent(p));
6951 *q++=ScaleQuantumToChar((Quantum)
6952 GetRedPixelComponent(p));
6962 register unsigned int
6966 channel[sizeof(size_t)];
6969 Convert to multi-byte continuous-tone X canvas.
6971 bytes_per_pixel=(unsigned int) (ximage->bits_per_pixel >> 3);
6972 for (y=0; y < (int) canvas->rows; y++)
6974 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6975 canvas->columns,1,&canvas->exception);
6976 if (p == (const PixelPacket *) NULL)
6978 for (x=(int) canvas->columns-1; x >= 0; x--)
6980 pixel=XGammaPixel(map_info,p);
6981 for (k=(int) bytes_per_pixel-1; k >= 0; k--)
6983 channel[k]=(unsigned char) pixel;
6986 for (k=0; k < (int) bytes_per_pixel; k++)
6996 if (matte_image != (XImage *) NULL)
6999 Initialize matte canvas.
7001 scanline_pad=(unsigned int) (matte_image->bytes_per_line-
7002 ((matte_image->width*matte_image->bits_per_pixel) >> 3));
7003 q=(unsigned char *) matte_image->data;
7004 for (y=0; y < (int) canvas->rows; y++)
7006 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,canvas->columns,1,
7007 &canvas->exception);
7008 if (p == (const PixelPacket *) NULL)
7012 for (x=(int) canvas->columns-1; x >= 0; x--)
7015 if (p->opacity > (QuantumRange/2))
7031 canvas_view=DestroyCacheView(canvas_view);
7032 if (canvas != image)
7033 canvas=DestroyImage(canvas);
7037 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7041 % X M a k e M a g n i f y I m a g e %
7045 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7047 % XMakeMagnifyImage() magnifies a region of an X image and displays it.
7049 % The format of the XMakeMagnifyImage method is:
7051 % void XMakeMagnifyImage(display,windows)
7053 % A description of each parameter follows:
7055 % o display: Specifies a connection to an X server; returned from
7058 % o windows: Specifies a pointer to a XWindows structure.
7061 MagickExport void XMakeMagnifyImage(Display *display,XWindows *windows)
7064 tuple[MaxTextExtent];
7081 register unsigned char
7086 previous_magnify = 0;
7104 Check boundary conditions.
7106 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
7107 assert(display != (Display *) NULL);
7108 assert(windows != (XWindows *) NULL);
7110 for (n=1; n < (ssize_t) windows->magnify.data; n++)
7112 while ((magnify*windows->image.ximage->width) < windows->magnify.width)
7114 while ((magnify*windows->image.ximage->height) < windows->magnify.height)
7116 while (magnify > windows->magnify.width)
7118 while (magnify > windows->magnify.height)
7120 if (magnify != previous_magnify)
7129 New magnify factor: update magnify window name.
7132 while ((1 << i) <= (int) magnify)
7134 (void) FormatMagickString(windows->magnify.name,MaxTextExtent,
7135 "Magnify %.20gX",(double) i);
7136 status=XStringListToTextProperty(&windows->magnify.name,1,&window_name);
7137 if (status != False)
7139 XSetWMName(display,windows->magnify.id,&window_name);
7140 XSetWMIconName(display,windows->magnify.id,&window_name);
7141 (void) XFree((void *) window_name.value);
7144 previous_magnify=magnify;
7145 ximage=windows->image.ximage;
7146 width=(unsigned int) windows->magnify.ximage->width;
7147 height=(unsigned int) windows->magnify.ximage->height;
7148 if ((windows->magnify.x < 0) ||
7149 (windows->magnify.x >= windows->image.ximage->width))
7150 windows->magnify.x=windows->image.ximage->width >> 1;
7151 x=windows->magnify.x-((width/magnify) >> 1);
7155 if (x > (int) (ximage->width-(width/magnify)))
7156 x=ximage->width-width/magnify;
7157 if ((windows->magnify.y < 0) ||
7158 (windows->magnify.y >= windows->image.ximage->height))
7159 windows->magnify.y=windows->image.ximage->height >> 1;
7160 y=windows->magnify.y-((height/magnify) >> 1);
7164 if (y > (int) (ximage->height-(height/magnify)))
7165 y=ximage->height-height/magnify;
7166 q=(unsigned char *) windows->magnify.ximage->data;
7167 scanline_pad=(unsigned int) (windows->magnify.ximage->bytes_per_line-
7168 ((width*windows->magnify.ximage->bits_per_pixel) >> 3));
7169 if (ximage->bits_per_pixel < 8)
7171 register unsigned char
7178 register unsigned int
7184 pixel_info=windows->magnify.pixel_info;
7185 switch (ximage->bitmap_bit_order)
7190 Magnify little-endian bitmap.
7194 if (ximage->format == XYBitmap)
7196 background=(unsigned char)
7197 (XPixelIntensity(&pixel_info->foreground_color) <
7198 XPixelIntensity(&pixel_info->background_color) ? 0x80 : 0x00);
7199 foreground=(unsigned char)
7200 (XPixelIntensity(&pixel_info->background_color) <
7201 XPixelIntensity(&pixel_info->foreground_color) ? 0x80 : 0x00);
7202 if (windows->magnify.depth > 1)
7203 Swap(background,foreground);
7205 for (i=0; i < (ssize_t) height; i+=magnify)
7208 Propogate pixel magnify rows.
7210 for (j=0; j < magnify; j++)
7212 p=(unsigned char *) ximage->data+y*ximage->bytes_per_line+
7213 ((x*ximage->bits_per_pixel) >> 3);
7214 p_bit=(unsigned char) (x*ximage->bits_per_pixel) & 0x07;
7217 for (k=0; k < width; k+=magnify)
7220 Propogate pixel magnify columns.
7222 for (l=0; l < magnify; l++)
7225 Propogate each bit plane.
7227 for (plane=0; (int) plane < ximage->bits_per_pixel; plane++)
7230 if (*p & (0x01 << (p_bit+plane)))
7243 p_bit+=ximage->bits_per_pixel;
7250 *q=byte >> (8-q_bit);
7262 Magnify big-endian bitmap.
7266 if (ximage->format == XYBitmap)
7268 background=(unsigned char)
7269 (XPixelIntensity(&pixel_info->foreground_color) <
7270 XPixelIntensity(&pixel_info->background_color) ? 0x01 : 0x00);
7271 foreground=(unsigned char)
7272 (XPixelIntensity(&pixel_info->background_color) <
7273 XPixelIntensity(&pixel_info->foreground_color) ? 0x01 : 0x00);
7274 if (windows->magnify.depth > 1)
7275 Swap(background,foreground);
7277 for (i=0; i < (ssize_t) height; i+=magnify)
7280 Propogate pixel magnify rows.
7282 for (j=0; j < magnify; j++)
7284 p=(unsigned char *) ximage->data+y*ximage->bytes_per_line+
7285 ((x*ximage->bits_per_pixel) >> 3);
7286 p_bit=(unsigned char) (x*ximage->bits_per_pixel) & 0x07;
7289 for (k=0; k < width; k+=magnify)
7292 Propogate pixel magnify columns.
7294 for (l=0; l < magnify; l++)
7297 Propogate each bit plane.
7299 for (plane=0; (int) plane < ximage->bits_per_pixel; plane++)
7302 if (*p & (0x80 >> (p_bit+plane)))
7315 p_bit+=ximage->bits_per_pixel;
7322 *q=byte << (8-q_bit);
7333 switch (ximage->bits_per_pixel)
7339 Magnify 8 bit X image.
7341 for (i=0; i < (ssize_t) height; i+=magnify)
7344 Propogate pixel magnify rows.
7346 for (j=0; j < magnify; j++)
7348 p=(unsigned char *) ximage->data+y*ximage->bytes_per_line+
7349 ((x*ximage->bits_per_pixel) >> 3);
7350 for (k=0; k < width; k+=magnify)
7353 Propogate pixel magnify columns.
7355 for (l=0; l < magnify; l++)
7367 register unsigned int
7372 Magnify multi-byte X image.
7374 bytes_per_pixel=(unsigned int) ximage->bits_per_pixel >> 3;
7375 for (i=0; i < (ssize_t) height; i+=magnify)
7378 Propogate pixel magnify rows.
7380 for (j=0; j < magnify; j++)
7382 p=(unsigned char *) ximage->data+y*ximage->bytes_per_line+
7383 ((x*ximage->bits_per_pixel) >> 3);
7384 for (k=0; k < width; k+=magnify)
7387 Propogate pixel magnify columns.
7389 for (l=0; l < magnify; l++)
7390 for (m=0; m < bytes_per_pixel; m++)
7402 Copy X image to magnify pixmap.
7404 x=windows->magnify.x-((width/magnify) >> 1);
7406 x=(int) ((width >> 1)-windows->magnify.x*magnify);
7408 if (x > (int) (ximage->width-(width/magnify)))
7409 x=(int) ((ximage->width-windows->magnify.x)*magnify-(width >> 1));
7412 y=windows->magnify.y-((height/magnify) >> 1);
7414 y=(int) ((height >> 1)-windows->magnify.y*magnify);
7416 if (y > (int) (ximage->height-(height/magnify)))
7417 y=(int) ((ximage->height-windows->magnify.y)*magnify-(height >> 1));
7420 if ((x != 0) || (y != 0))
7421 (void) XFillRectangle(display,windows->magnify.pixmap,
7422 windows->magnify.annotate_context,0,0,width,height);
7423 (void) XPutImage(display,windows->magnify.pixmap,
7424 windows->magnify.annotate_context,windows->magnify.ximage,0,0,x,y,width-x,
7426 if ((magnify > 1) && ((magnify <= (width >> 1)) &&
7427 (magnify <= (height >> 1))))
7433 Highlight center pixel.
7435 highlight_info.x=(ssize_t) windows->magnify.width >> 1;
7436 highlight_info.y=(ssize_t) windows->magnify.height >> 1;
7437 highlight_info.width=magnify;
7438 highlight_info.height=magnify;
7439 (void) XDrawRectangle(display,windows->magnify.pixmap,
7440 windows->magnify.highlight_context,(int) highlight_info.x,
7441 (int) highlight_info.y,(unsigned int) highlight_info.width-1,
7442 (unsigned int) highlight_info.height-1);
7444 (void) XDrawRectangle(display,windows->magnify.pixmap,
7445 windows->magnify.annotate_context,(int) highlight_info.x+1,
7446 (int) highlight_info.y+1,(unsigned int) highlight_info.width-3,
7447 (unsigned int) highlight_info.height-3);
7450 Show center pixel color.
7452 (void) GetOneVirtualMagickPixel(windows->image.image,(ssize_t)
7453 windows->magnify.x,(ssize_t) windows->magnify.y,&pixel,
7454 &windows->image.image->exception);
7455 (void) FormatMagickString(tuple,MaxTextExtent,"%d,%d: ",
7456 windows->magnify.x,windows->magnify.y);
7457 (void) ConcatenateMagickString(tuple,"(",MaxTextExtent);
7458 ConcatenateColorComponent(&pixel,RedChannel,X11Compliance,tuple);
7459 (void) ConcatenateMagickString(tuple,",",MaxTextExtent);
7460 ConcatenateColorComponent(&pixel,GreenChannel,X11Compliance,tuple);
7461 (void) ConcatenateMagickString(tuple,",",MaxTextExtent);
7462 ConcatenateColorComponent(&pixel,BlueChannel,X11Compliance,tuple);
7463 if (pixel.colorspace == CMYKColorspace)
7465 (void) ConcatenateMagickString(tuple,",",MaxTextExtent);
7466 ConcatenateColorComponent(&pixel,IndexChannel,X11Compliance,tuple);
7468 if (pixel.matte != MagickFalse)
7470 (void) ConcatenateMagickString(tuple,",",MaxTextExtent);
7471 ConcatenateColorComponent(&pixel,OpacityChannel,X11Compliance,tuple);
7473 (void) ConcatenateMagickString(tuple,")",MaxTextExtent);
7474 height=(unsigned int) windows->magnify.font_info->ascent+
7475 windows->magnify.font_info->descent;
7476 x=windows->magnify.font_info->max_bounds.width >> 1;
7477 y=windows->magnify.font_info->ascent+(height >> 2);
7478 (void) XDrawImageString(display,windows->magnify.pixmap,
7479 windows->magnify.annotate_context,x,y,tuple,(int) strlen(tuple));
7480 GetColorTuple(&pixel,MagickTrue,tuple);
7482 (void) XDrawImageString(display,windows->magnify.pixmap,
7483 windows->magnify.annotate_context,x,y,tuple,(int) strlen(tuple));
7484 (void) QueryMagickColorname(windows->image.image,&pixel,SVGCompliance,tuple,
7485 &windows->image.image->exception);
7487 (void) XDrawImageString(display,windows->magnify.pixmap,
7488 windows->magnify.annotate_context,x,y,tuple,(int) strlen(tuple));
7490 Refresh magnify window.
7492 magnify_window=windows->magnify;
7495 XRefreshWindow(display,&magnify_window,(XEvent *) NULL);
7499 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7503 % X M a k e P i x m a p %
7507 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7509 % XMakePixmap() creates an X11 pixmap.
7511 % The format of the XMakePixmap method is:
7513 % void XMakeStandardColormap(Display *display,XVisualInfo *visual_info,
7514 % XResourceInfo *resource_info,Image *image,XStandardColormap *map_info,
7515 % XPixelInfo *pixel)
7517 % A description of each parameter follows:
7519 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
7521 % o display: Specifies a connection to an X server; returned from
7524 % o window: Specifies a pointer to a XWindowInfo structure.
7527 static MagickBooleanType XMakePixmap(Display *display,
7528 const XResourceInfo *resource_info,XWindowInfo *window)
7534 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
7535 assert(display != (Display *) NULL);
7536 assert(resource_info != (XResourceInfo *) NULL);
7537 assert(window != (XWindowInfo *) NULL);
7538 if (window->pixmap != (Pixmap) NULL)
7541 Destroy previous X pixmap.
7543 (void) XFreePixmap(display,window->pixmap);
7544 window->pixmap=(Pixmap) NULL;
7546 if (window->use_pixmap == MagickFalse)
7547 return(MagickFalse);
7548 if (window->ximage == (XImage *) NULL)
7549 return(MagickFalse);
7551 Display busy cursor.
7553 (void) XCheckDefineCursor(display,window->id,window->busy_cursor);
7554 (void) XFlush(display);
7558 width=(unsigned int) window->ximage->width;
7559 height=(unsigned int) window->ximage->height;
7560 window->pixmap=XCreatePixmap(display,window->id,width,height,window->depth);
7561 if (window->pixmap == (Pixmap) NULL)
7564 Unable to allocate pixmap.
7566 (void) XCheckDefineCursor(display,window->id,window->cursor);
7567 return(MagickFalse);
7570 Copy X image to pixmap.
7572 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
7573 if (window->shared_memory)
7574 (void) XShmPutImage(display,window->pixmap,window->annotate_context,
7575 window->ximage,0,0,0,0,width,height,MagickTrue);
7577 if (window->shared_memory == MagickFalse)
7578 (void) XPutImage(display,window->pixmap,window->annotate_context,
7579 window->ximage,0,0,0,0,width,height);
7580 if (IsEventLogging())
7582 (void) LogMagickEvent(X11Event,GetMagickModule(),"Pixmap:");
7583 (void) LogMagickEvent(X11Event,GetMagickModule()," width, height: %ux%u",
7589 (void) XCheckDefineCursor(display,window->id,window->cursor);
7594 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7598 % X M a k e S t a n d a r d C o l o r m a p %
7602 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7604 % XMakeStandardColormap() creates an X11 Standard Colormap.
7606 % The format of the XMakeStandardColormap method is:
7608 % XMakeStandardColormap(display,visual_info,resource_info,image,
7611 % A description of each parameter follows:
7613 % o display: Specifies a connection to an X server; returned from
7616 % o visual_info: Specifies a pointer to a X11 XVisualInfo structure;
7617 % returned from XGetVisualInfo.
7619 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
7621 % o image: the image.
7623 % o map_info: If a Standard Colormap type is specified, this structure is
7624 % initialized with info from the Standard Colormap.
7626 % o pixel: Specifies a pointer to a XPixelInfo structure.
7630 #if defined(__cplusplus) || defined(c_plusplus)
7634 static inline MagickRealType DiversityPixelIntensity(
7635 const DiversityPacket *pixel)
7640 intensity=0.299*pixel->red+0.587*pixel->green+0.114*pixel->blue;
7644 static int IntensityCompare(const void *x,const void *y)
7653 color_1=(DiversityPacket *) x;
7654 color_2=(DiversityPacket *) y;
7655 diversity=(int) (DiversityPixelIntensity(color_2)-
7656 DiversityPixelIntensity(color_1));
7660 static int PopularityCompare(const void *x,const void *y)
7666 color_1=(DiversityPacket *) x;
7667 color_2=(DiversityPacket *) y;
7668 return((int) color_2->count-(int) color_1->count);
7671 #if defined(__cplusplus) || defined(c_plusplus)
7675 static inline Quantum ScaleXToQuantum(const size_t x,
7678 return((Quantum) (((MagickRealType) QuantumRange*x)/scale+0.5));
7681 MagickExport void XMakeStandardColormap(Display *display,
7682 XVisualInfo *visual_info,XResourceInfo *resource_info,Image *image,
7683 XStandardColormap *map_info,XPixelInfo *pixel)
7691 register IndexPacket
7712 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
7713 assert(display != (Display *) NULL);
7714 assert(visual_info != (XVisualInfo *) NULL);
7715 assert(map_info != (XStandardColormap *) NULL);
7716 assert(resource_info != (XResourceInfo *) NULL);
7717 assert(pixel != (XPixelInfo *) NULL);
7718 exception=(&image->exception);
7719 if (resource_info->map_type != (char *) NULL)
7722 Standard Colormap is already defined (i.e. xstdcmap).
7724 XGetPixelPacket(display,visual_info,map_info,resource_info,image,
7726 number_colors=(unsigned int) (map_info->base_pixel+
7727 (map_info->red_max+1)*(map_info->green_max+1)*(map_info->blue_max+1));
7728 if ((map_info->red_max*map_info->green_max*map_info->blue_max) != 0)
7729 if ((image->matte == MagickFalse) &&
7730 (resource_info->color_recovery == MagickFalse) &&
7731 resource_info->quantize_info->dither &&
7732 (number_colors < MaxColormapSize))
7737 register PixelPacket
7741 Improve image appearance with error diffusion.
7743 affinity_image=AcquireImage((ImageInfo *) NULL);
7744 if (affinity_image == (Image *) NULL)
7745 ThrowXWindowFatalException(ResourceLimitFatalError,
7746 "UnableToDitherImage",image->filename);
7747 affinity_image->columns=number_colors;
7748 affinity_image->rows=1;
7750 Initialize colormap image.
7752 q=QueueAuthenticPixels(affinity_image,0,0,affinity_image->columns,
7754 if (q != (PixelPacket *) NULL)
7756 for (i=0; i < (ssize_t) number_colors; i++)
7759 if (map_info->red_max != 0)
7760 q->red=ScaleXToQuantum((size_t) (i/
7761 map_info->red_mult),map_info->red_max);
7762 q->green=(Quantum) 0;
7763 if (map_info->green_max != 0)
7764 q->green=ScaleXToQuantum((size_t) ((i/
7765 map_info->green_mult) % (map_info->green_max+1)),
7766 map_info->green_max);
7767 q->blue=(Quantum) 0;
7768 if (map_info->blue_max != 0)
7769 q->blue=ScaleXToQuantum((size_t) (i %
7770 map_info->green_mult),map_info->blue_max);
7771 q->opacity=(Quantum) TransparentOpacity;
7774 (void) SyncAuthenticPixels(affinity_image,exception);
7775 (void) RemapImage(resource_info->quantize_info,image,
7778 XGetPixelPacket(display,visual_info,map_info,resource_info,image,
7780 (void) SetImageStorageClass(image,DirectClass);
7781 affinity_image=DestroyImage(affinity_image);
7783 if (IsEventLogging())
7785 (void) LogMagickEvent(X11Event,GetMagickModule(),
7786 "Standard Colormap:");
7787 (void) LogMagickEvent(X11Event,GetMagickModule(),
7788 " colormap id: 0x%lx",map_info->colormap);
7789 (void) LogMagickEvent(X11Event,GetMagickModule(),
7790 " red, green, blue max: %lu %lu %lu",map_info->red_max,
7791 map_info->green_max,map_info->blue_max);
7792 (void) LogMagickEvent(X11Event,GetMagickModule(),
7793 " red, green, blue mult: %lu %lu %lu",map_info->red_mult,
7794 map_info->green_mult,map_info->blue_mult);
7798 if ((visual_info->klass != DirectColor) &&
7799 (visual_info->klass != TrueColor))
7800 if ((image->storage_class == DirectClass) ||
7801 ((int) image->colors > visual_info->colormap_size))
7807 Image has more colors than the visual supports.
7809 quantize_info=(*resource_info->quantize_info);
7810 quantize_info.number_colors=(size_t) visual_info->colormap_size;
7811 (void) QuantizeImage(&quantize_info,image);
7814 Free previous and create new colormap.
7816 (void) XFreeStandardColormap(display,visual_info,map_info,pixel);
7817 colormap=XDefaultColormap(display,visual_info->screen);
7818 if (visual_info->visual != XDefaultVisual(display,visual_info->screen))
7819 colormap=XCreateColormap(display,XRootWindow(display,visual_info->screen),
7820 visual_info->visual,visual_info->klass == DirectColor ?
7821 AllocAll : AllocNone);
7822 if (colormap == (Colormap) NULL)
7823 ThrowXWindowFatalException(ResourceLimitFatalError,"UnableToCreateColormap",
7826 Initialize the map and pixel info structures.
7828 XGetMapInfo(visual_info,colormap,map_info);
7829 XGetPixelPacket(display,visual_info,map_info,resource_info,image,pixel);
7831 Allocating colors in server colormap is based on visual class.
7833 switch (visual_info->klass)
7839 Define Standard Colormap for StaticGray or StaticColor visual.
7841 number_colors=image->colors;
7842 colors=(XColor *) AcquireQuantumMemory((size_t)
7843 visual_info->colormap_size,sizeof(*colors));
7844 if (colors == (XColor *) NULL)
7845 ThrowXWindowFatalException(ResourceLimitFatalError,
7846 "UnableToCreateColormap",image->filename);
7848 color.flags=(char) (DoRed | DoGreen | DoBlue);
7849 for (i=0; i < (ssize_t) image->colors; i++)
7851 color.red=ScaleQuantumToShort(XRedGamma(image->colormap[i].red));
7852 color.green=ScaleQuantumToShort(XGreenGamma(image->colormap[i].green));
7853 color.blue=ScaleQuantumToShort(XBlueGamma(image->colormap[i].blue));
7854 if (visual_info->klass != StaticColor)
7856 gray_value=(unsigned short) XPixelIntensity(&color);
7857 color.red=gray_value;
7858 color.green=gray_value;
7859 color.blue=gray_value;
7861 status=XAllocColor(display,colormap,&color);
7862 if (status == False)
7864 colormap=XCopyColormapAndFree(display,colormap);
7865 (void) XAllocColor(display,colormap,&color);
7867 pixel->pixels[i]=color.pixel;
7879 Define Standard Colormap for GrayScale or PseudoColor visual.
7881 number_colors=image->colors;
7882 colors=(XColor *) AcquireQuantumMemory((size_t)
7883 visual_info->colormap_size,sizeof(*colors));
7884 if (colors == (XColor *) NULL)
7885 ThrowXWindowFatalException(ResourceLimitFatalError,
7886 "UnableToCreateColormap",image->filename);
7888 Preallocate our GUI colors.
7890 (void) XAllocColor(display,colormap,&pixel->foreground_color);
7891 (void) XAllocColor(display,colormap,&pixel->background_color);
7892 (void) XAllocColor(display,colormap,&pixel->border_color);
7893 (void) XAllocColor(display,colormap,&pixel->matte_color);
7894 (void) XAllocColor(display,colormap,&pixel->highlight_color);
7895 (void) XAllocColor(display,colormap,&pixel->shadow_color);
7896 (void) XAllocColor(display,colormap,&pixel->depth_color);
7897 (void) XAllocColor(display,colormap,&pixel->trough_color);
7898 for (i=0; i < MaxNumberPens; i++)
7899 (void) XAllocColor(display,colormap,&pixel->pen_colors[i]);
7901 Determine if image colors will "fit" into X server colormap.
7903 colormap_type=resource_info->colormap;
7904 status=XAllocColorCells(display,colormap,MagickFalse,(unsigned long *)
7905 NULL,0,pixel->pixels,(unsigned int) image->colors);
7906 if (status != False)
7907 colormap_type=PrivateColormap;
7908 if (colormap_type == SharedColormap)
7929 Define Standard colormap for shared GrayScale or PseudoColor visual.
7931 diversity=(DiversityPacket *) AcquireQuantumMemory(image->colors,
7932 sizeof(*diversity));
7933 if (diversity == (DiversityPacket *) NULL)
7934 ThrowXWindowFatalException(ResourceLimitFatalError,
7935 "UnableToCreateColormap",image->filename);
7936 for (i=0; i < (ssize_t) image->colors; i++)
7938 diversity[i].red=image->colormap[i].red;
7939 diversity[i].green=image->colormap[i].green;
7940 diversity[i].blue=image->colormap[i].blue;
7941 diversity[i].index=(unsigned short) i;
7942 diversity[i].count=0;
7944 image_view=AcquireCacheView(image);
7945 for (y=0; y < (int) image->rows; y++)
7950 register const PixelPacket
7953 p=GetCacheViewAuthenticPixels(image_view,0,(ssize_t) y,
7954 image->columns,1,exception);
7955 if (p == (const PixelPacket *) NULL)
7957 indexes=GetCacheViewAuthenticIndexQueue(image_view);
7958 for (x=(int) image->columns-1; x >= 0; x--)
7959 diversity[(ssize_t) indexes[x]].count++;
7961 image_view=DestroyCacheView(image_view);
7963 Sort colors by decreasing intensity.
7965 qsort((void *) diversity,image->colors,sizeof(*diversity),
7967 for (i=0; i < (ssize_t) image->colors; )
7969 diversity[i].count<<=4; /* increase this colors popularity */
7970 i+=MagickMax((int) (image->colors >> 4),2);
7972 diversity[image->colors-1].count<<=4;
7973 qsort((void *) diversity,image->colors,sizeof(*diversity),
7979 color.flags=(char) (DoRed | DoGreen | DoBlue);
7980 for (i=0; i < (ssize_t) image->colors; i++)
7982 index=diversity[i].index;
7984 ScaleQuantumToShort(XRedGamma(image->colormap[index].red));
7986 ScaleQuantumToShort(XGreenGamma(image->colormap[index].green));
7988 ScaleQuantumToShort(XBlueGamma(image->colormap[index].blue));
7989 if (visual_info->klass != PseudoColor)
7991 gray_value=(unsigned short) XPixelIntensity(&color);
7992 color.red=gray_value;
7993 color.green=gray_value;
7994 color.blue=gray_value;
7996 status=XAllocColor(display,colormap,&color);
7997 if (status == False)
7999 pixel->pixels[index]=color.pixel;
8003 Read X server colormap.
8005 server_colors=(XColor *) AcquireQuantumMemory((size_t)
8006 visual_info->colormap_size,sizeof(*server_colors));
8007 if (server_colors == (XColor *) NULL)
8008 ThrowXWindowFatalException(ResourceLimitFatalError,
8009 "UnableToCreateColormap",image->filename);
8010 for (x=visual_info->colormap_size-1; x >= 0; x--)
8011 server_colors[x].pixel=(size_t) x;
8012 (void) XQueryColors(display,colormap,server_colors,
8013 (int) MagickMin((unsigned int) visual_info->colormap_size,256));
8015 Select remaining colors from X server colormap.
8017 for (; i < (ssize_t) image->colors; i++)
8019 index=diversity[i].index;
8021 ScaleQuantumToShort(XRedGamma(image->colormap[index].red));
8023 ScaleQuantumToShort(XGreenGamma(image->colormap[index].green));
8025 ScaleQuantumToShort(XBlueGamma(image->colormap[index].blue));
8026 if (visual_info->klass != PseudoColor)
8028 gray_value=(unsigned short) XPixelIntensity(&color);
8029 color.red=gray_value;
8030 color.green=gray_value;
8031 color.blue=gray_value;
8033 XBestPixel(display,colormap,server_colors,(unsigned int)
8034 visual_info->colormap_size,&color);
8035 pixel->pixels[index]=color.pixel;
8038 if ((int) image->colors < visual_info->colormap_size)
8041 Fill up colors array-- more choices for pen colors.
8043 retain_colors=MagickMin((unsigned int)
8044 (visual_info->colormap_size-image->colors),256);
8045 for (i=0; i < (ssize_t) retain_colors; i++)
8046 *p++=server_colors[i];
8047 number_colors+=retain_colors;
8049 server_colors=(XColor *) RelinquishMagickMemory(server_colors);
8050 diversity=(DiversityPacket *) RelinquishMagickMemory(diversity);
8054 Define Standard colormap for private GrayScale or PseudoColor visual.
8056 if (status == False)
8059 Not enough colormap entries in the colormap-- Create a new colormap.
8061 colormap=XCreateColormap(display,
8062 XRootWindow(display,visual_info->screen),visual_info->visual,
8064 if (colormap == (Colormap) NULL)
8065 ThrowXWindowFatalException(ResourceLimitFatalError,
8066 "UnableToCreateColormap",image->filename);
8067 map_info->colormap=colormap;
8068 if ((int) image->colors < visual_info->colormap_size)
8071 Retain colors from the default colormap to help lessens the
8072 effects of colormap flashing.
8074 retain_colors=MagickMin((unsigned int)
8075 (visual_info->colormap_size-image->colors),256);
8076 p=colors+image->colors;
8077 for (i=0; i < (ssize_t) retain_colors; i++)
8079 p->pixel=(unsigned long) i;
8082 (void) XQueryColors(display,
8083 XDefaultColormap(display,visual_info->screen),
8084 colors+image->colors,(int) retain_colors);
8086 Transfer colors from default to private colormap.
8088 (void) XAllocColorCells(display,colormap,MagickFalse,
8089 (unsigned long *) NULL,0,pixel->pixels,(unsigned int)
8091 p=colors+image->colors;
8092 for (i=0; i < (ssize_t) retain_colors; i++)
8094 p->pixel=pixel->pixels[i];
8097 (void) XStoreColors(display,colormap,colors+image->colors,
8098 (int) retain_colors);
8099 number_colors+=retain_colors;
8101 (void) XAllocColorCells(display,colormap,MagickFalse,
8102 (unsigned long *) NULL,0,pixel->pixels,(unsigned int)
8106 Store the image colormap.
8109 color.flags=(char) (DoRed | DoGreen | DoBlue);
8110 for (i=0; i < (ssize_t) image->colors; i++)
8112 color.red=ScaleQuantumToShort(XRedGamma(image->colormap[i].red));
8113 color.green=ScaleQuantumToShort(XGreenGamma(image->colormap[i].green));
8114 color.blue=ScaleQuantumToShort(XBlueGamma(image->colormap[i].blue));
8115 if (visual_info->klass != PseudoColor)
8117 gray_value=(unsigned short) XPixelIntensity(&color);
8118 color.red=gray_value;
8119 color.green=gray_value;
8120 color.blue=gray_value;
8122 color.pixel=pixel->pixels[i];
8125 (void) XStoreColors(display,colormap,colors,(int) image->colors);
8136 Define Standard Colormap for TrueColor or DirectColor visual.
8138 number_colors=(unsigned int) ((map_info->red_max*map_info->red_mult)+
8139 (map_info->green_max*map_info->green_mult)+
8140 (map_info->blue_max*map_info->blue_mult)+1);
8141 linear_colormap=(number_colors > 4096) ||
8142 (((int) (map_info->red_max+1) == visual_info->colormap_size) &&
8143 ((int) (map_info->green_max+1) == visual_info->colormap_size) &&
8144 ((int) (map_info->blue_max+1) == visual_info->colormap_size)) ?
8145 MagickTrue : MagickFalse;
8146 if (linear_colormap != MagickFalse)
8147 number_colors=(size_t) visual_info->colormap_size;
8149 Allocate color array.
8151 colors=(XColor *) AcquireQuantumMemory(number_colors,sizeof(*colors));
8152 if (colors == (XColor *) NULL)
8153 ThrowXWindowFatalException(ResourceLimitFatalError,
8154 "UnableToCreateColormap",image->filename);
8156 Initialize linear color ramp.
8159 color.flags=(char) (DoRed | DoGreen | DoBlue);
8160 if (linear_colormap != MagickFalse)
8161 for (i=0; i < (ssize_t) number_colors; i++)
8163 color.blue=(unsigned short) 0;
8164 if (map_info->blue_max != 0)
8165 color.blue=(unsigned short) ((size_t)
8166 ((65535L*(i % map_info->green_mult))/map_info->blue_max));
8167 color.green=color.blue;
8168 color.red=color.blue;
8169 color.pixel=XStandardPixel(map_info,&color);
8173 for (i=0; i < (ssize_t) number_colors; i++)
8175 color.red=(unsigned short) 0;
8176 if (map_info->red_max != 0)
8177 color.red=(unsigned short) ((size_t)
8178 ((65535L*(i/map_info->red_mult))/map_info->red_max));
8179 color.green=(unsigned int) 0;
8180 if (map_info->green_max != 0)
8181 color.green=(unsigned short) ((size_t)
8182 ((65535L*((i/map_info->green_mult) % (map_info->green_max+1)))/
8183 map_info->green_max));
8184 color.blue=(unsigned short) 0;
8185 if (map_info->blue_max != 0)
8186 color.blue=(unsigned short) ((size_t)
8187 ((65535L*(i % map_info->green_mult))/map_info->blue_max));
8188 color.pixel=XStandardPixel(map_info,&color);
8191 if ((visual_info->klass == DirectColor) &&
8192 (colormap != XDefaultColormap(display,visual_info->screen)))
8193 (void) XStoreColors(display,colormap,colors,(int) number_colors);
8195 for (i=0; i < (ssize_t) number_colors; i++)
8196 (void) XAllocColor(display,colormap,&colors[i]);
8200 if ((visual_info->klass != DirectColor) &&
8201 (visual_info->klass != TrueColor))
8204 Set foreground, background, border, etc. pixels.
8206 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8207 &pixel->foreground_color);
8208 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8209 &pixel->background_color);
8210 if (pixel->background_color.pixel == pixel->foreground_color.pixel)
8213 Foreground and background colors must differ.
8215 pixel->background_color.red=(~pixel->foreground_color.red);
8216 pixel->background_color.green=
8217 (~pixel->foreground_color.green);
8218 pixel->background_color.blue=
8219 (~pixel->foreground_color.blue);
8220 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8221 &pixel->background_color);
8223 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8224 &pixel->border_color);
8225 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8226 &pixel->matte_color);
8227 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8228 &pixel->highlight_color);
8229 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8230 &pixel->shadow_color);
8231 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8232 &pixel->depth_color);
8233 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8234 &pixel->trough_color);
8235 for (i=0; i < MaxNumberPens; i++)
8237 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8238 &pixel->pen_colors[i]);
8239 pixel->pixels[image->colors+i]=pixel->pen_colors[i].pixel;
8241 pixel->colors=(ssize_t) (image->colors+MaxNumberPens);
8243 colors=(XColor *) RelinquishMagickMemory(colors);
8244 if (IsEventLogging())
8246 (void) LogMagickEvent(X11Event,GetMagickModule(),"Standard Colormap:");
8247 (void) LogMagickEvent(X11Event,GetMagickModule()," colormap id: 0x%lx",
8248 map_info->colormap);
8249 (void) LogMagickEvent(X11Event,GetMagickModule(),
8250 " red, green, blue max: %lu %lu %lu",map_info->red_max,
8251 map_info->green_max,map_info->blue_max);
8252 (void) LogMagickEvent(X11Event,GetMagickModule(),
8253 " red, green, blue mult: %lu %lu %lu",map_info->red_mult,
8254 map_info->green_mult,map_info->blue_mult);
8259 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8263 % X M a k e W i n d o w %
8267 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8269 % XMakeWindow() creates an X11 window.
8271 % The format of the XMakeWindow method is:
8273 % void XMakeWindow(Display *display,Window parent,char **argv,int argc,
8274 % XClassHint *class_hint,XWMHints *manager_hints,
8275 % XWindowInfo *window_info)
8277 % A description of each parameter follows:
8279 % o display: Specifies a connection to an X server; returned from
8282 % o parent: Specifies the parent window_info.
8284 % o argv: Specifies the application's argument list.
8286 % o argc: Specifies the number of arguments.
8288 % o class_hint: Specifies a pointer to a X11 XClassHint structure.
8290 % o manager_hints: Specifies a pointer to a X11 XWMHints structure.
8292 % o window_info: Specifies a pointer to a X11 XWindowInfo structure.
8295 MagickExport void XMakeWindow(Display *display,Window parent,char **argv,
8296 int argc,XClassHint *class_hint,XWMHints *manager_hints,
8297 XWindowInfo *window_info)
8299 #define MinWindowSize 64
8307 static XTextProperty
8318 Set window info hints.
8320 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
8321 assert(display != (Display *) NULL);
8322 assert(window_info != (XWindowInfo *) NULL);
8323 size_hints=XAllocSizeHints();
8324 if (size_hints == (XSizeHints *) NULL)
8325 ThrowXWindowFatalException(XServerFatalError,"UnableToMakeXWindow",argv[0]);
8326 size_hints->flags=(int) window_info->flags;
8327 size_hints->x=window_info->x;
8328 size_hints->y=window_info->y;
8329 size_hints->width=(int) window_info->width;
8330 size_hints->height=(int) window_info->height;
8331 if (window_info->immutable != MagickFalse)
8334 Window size cannot be changed.
8336 size_hints->min_width=size_hints->width;
8337 size_hints->min_height=size_hints->height;
8338 size_hints->max_width=size_hints->width;
8339 size_hints->max_height=size_hints->height;
8340 size_hints->flags|=PMinSize;
8341 size_hints->flags|=PMaxSize;
8346 Window size can be changed.
8348 size_hints->min_width=(int) window_info->min_width;
8349 size_hints->min_height=(int) window_info->min_height;
8350 size_hints->flags|=PResizeInc;
8351 size_hints->width_inc=(int) window_info->width_inc;
8352 size_hints->height_inc=(int) window_info->height_inc;
8353 #if !defined(PRE_R4_ICCCM)
8354 size_hints->flags|=PBaseSize;
8355 size_hints->base_width=size_hints->width_inc;
8356 size_hints->base_height=size_hints->height_inc;
8359 gravity=NorthWestGravity;
8360 if (window_info->geometry != (char *) NULL)
8363 default_geometry[MaxTextExtent],
8364 geometry[MaxTextExtent];
8373 User specified geometry.
8375 (void) FormatMagickString(default_geometry,MaxTextExtent,"%dx%d",
8376 size_hints->width,size_hints->height);
8377 (void) CopyMagickString(geometry,window_info->geometry,MaxTextExtent);
8379 while (strlen(p) != 0)
8381 if ((isspace((int) ((unsigned char) *p)) == 0) && (*p != '%'))
8384 (void) CopyMagickString(p,p+1,MaxTextExtent);
8386 flags=XWMGeometry(display,window_info->screen,geometry,default_geometry,
8387 window_info->border_width,size_hints,&size_hints->x,&size_hints->y,
8388 &size_hints->width,&size_hints->height,&gravity);
8389 if ((flags & WidthValue) && (flags & HeightValue))
8390 size_hints->flags|=USSize;
8391 if ((flags & XValue) && (flags & YValue))
8393 size_hints->flags|=USPosition;
8394 window_info->x=size_hints->x;
8395 window_info->y=size_hints->y;
8398 #if !defined(PRE_R4_ICCCM)
8399 size_hints->win_gravity=gravity;
8400 size_hints->flags|=PWinGravity;
8402 if (window_info->id == (Window) NULL)
8403 window_info->id=XCreateWindow(display,parent,window_info->x,window_info->y,
8404 (unsigned int) size_hints->width,(unsigned int) size_hints->height,
8405 window_info->border_width,(int) window_info->depth,InputOutput,
8406 window_info->visual,(unsigned long) window_info->mask,
8407 &window_info->attributes);
8420 Window already exists; change relevant attributes.
8422 (void) XChangeWindowAttributes(display,window_info->id,(unsigned long)
8423 window_info->mask,&window_info->attributes);
8424 mask=ConfigureNotify;
8425 while (XCheckTypedWindowEvent(display,window_info->id,(int) mask,&sans_event)) ;
8426 window_changes.x=window_info->x;
8427 window_changes.y=window_info->y;
8428 window_changes.width=(int) window_info->width;
8429 window_changes.height=(int) window_info->height;
8430 mask=(MagickStatusType) (CWWidth | CWHeight);
8431 if (window_info->flags & USPosition)
8433 (void) XReconfigureWMWindow(display,window_info->id,window_info->screen,
8434 mask,&window_changes);
8436 if (window_info->id == (Window) NULL)
8437 ThrowXWindowFatalException(XServerFatalError,"UnableToCreateWindow",
8439 status=XStringListToTextProperty(&window_info->name,1,&window_name);
8440 if (status == False)
8441 ThrowXWindowFatalException(XServerFatalError,"UnableToCreateTextProperty",
8443 status=XStringListToTextProperty(&window_info->icon_name,1,&icon_name);
8444 if (status == False)
8445 ThrowXWindowFatalException(XServerFatalError,"UnableToCreateTextProperty",
8446 window_info->icon_name);
8447 if (window_info->icon_geometry != (char *) NULL)
8455 User specified icon geometry.
8457 size_hints->flags|=USPosition;
8458 flags=XWMGeometry(display,window_info->screen,window_info->icon_geometry,
8459 (char *) NULL,0,size_hints,&manager_hints->icon_x,
8460 &manager_hints->icon_y,&width,&height,&gravity);
8461 if ((flags & XValue) && (flags & YValue))
8462 manager_hints->flags|=IconPositionHint;
8464 XSetWMProperties(display,window_info->id,&window_name,&icon_name,argv,argc,
8465 size_hints,manager_hints,class_hint);
8466 if (window_name.value != (void *) NULL)
8468 (void) XFree((void *) window_name.value);
8469 window_name.value=(unsigned char *) NULL;
8470 window_name.nitems=0;
8472 if (icon_name.value != (void *) NULL)
8474 (void) XFree((void *) icon_name.value);
8475 icon_name.value=(unsigned char *) NULL;
8478 atom_list[0]=XInternAtom(display,"WM_DELETE_WINDOW",MagickFalse);
8479 atom_list[1]=XInternAtom(display,"WM_TAKE_FOCUS",MagickFalse);
8480 (void) XSetWMProtocols(display,window_info->id,atom_list,2);
8481 (void) XFree((void *) size_hints);
8482 if (window_info->shape != MagickFalse)
8484 #if defined(MAGICKCORE_HAVE_SHAPE)
8490 Can we apply a non-rectangular shaping mask?
8494 if (XShapeQueryExtension(display,&error_base,&event_base) == 0)
8495 window_info->shape=MagickFalse;
8497 window_info->shape=MagickFalse;
8500 if (window_info->shared_memory)
8502 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
8504 Can we use shared memory with this window?
8506 if (XShmQueryExtension(display) == 0)
8507 window_info->shared_memory=MagickFalse;
8509 window_info->shared_memory=MagickFalse;
8512 window_info->image=NewImageList();
8513 window_info->destroy=MagickFalse;
8517 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8521 % X M a g i c k P r o g r e s s M o n i t o r %
8525 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8527 % XMagickProgressMonitor() displays the progress a task is making in
8528 % completing a task.
8530 % The format of the XMagickProgressMonitor method is:
8532 % void XMagickProgressMonitor(const char *task,
8533 % const MagickOffsetType quantum,const MagickSizeType span,
8534 % void *client_data)
8536 % A description of each parameter follows:
8538 % o task: Identifies the task in progress.
8540 % o quantum: Specifies the quantum position within the span which represents
8541 % how much progress has been made in completing a task.
8543 % o span: Specifies the span relative to completing a task.
8545 % o client_data: Pointer to any client data.
8549 static const char *GetLocaleMonitorMessage(const char *text)
8552 message[MaxTextExtent],
8561 (void) CopyMagickMemory(tag,text,MaxTextExtent);
8563 if (p != (char *) NULL)
8565 (void) FormatMagickString(message,MaxTextExtent,"Monitor/%s",tag);
8566 locale_message=GetLocaleMessage(message);
8567 if (locale_message == message)
8569 return(locale_message);
8572 MagickExport MagickBooleanType XMagickProgressMonitor(const char *tag,
8573 const MagickOffsetType quantum,const MagickSizeType span,
8574 void *magick_unused(client_data))
8579 windows=XSetWindows((XWindows *) ~0);
8580 if (windows == (XWindows *) NULL)
8582 if (windows->info.mapped != MagickFalse)
8583 XProgressMonitorWidget(windows->display,windows,
8584 GetLocaleMonitorMessage(tag),quantum,span);
8589 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8593 % X Q u e r y C o l o r D a t a b a s e %
8597 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8599 % XQueryColorDatabase() looks up a RGB values for a color given in the target
8602 % The format of the XQueryColorDatabase method is:
8604 % MagickBooleanType XQueryColorDatabase(const char *target,XColor *color)
8606 % A description of each parameter follows:
8608 % o target: Specifies the color to lookup in the X color database.
8610 % o color: A pointer to an PixelPacket structure. The RGB value of the target
8611 % color is returned as this value.
8614 MagickExport MagickBooleanType XQueryColorDatabase(const char *target,
8621 *display = (Display *) NULL;
8630 Initialize color return value.
8632 assert(color != (XColor *) NULL);
8636 color->flags=(char) (DoRed | DoGreen | DoBlue);
8637 if ((target == (char *) NULL) || (*target == '\0'))
8638 target="#ffffffffffff";
8640 Let the X server define the color for us.
8642 if (display == (Display *) NULL)
8643 display=XOpenDisplay((char *) NULL);
8644 if (display == (Display *) NULL)
8646 ThrowXWindowFatalException(XServerError,"ColorIsNotKnownToServer",target);
8647 return(MagickFalse);
8649 colormap=XDefaultColormap(display,XDefaultScreen(display));
8650 status=XParseColor(display,colormap,(char *) target,&xcolor);
8651 if (status == False)
8652 ThrowXWindowFatalException(XServerError,"ColorIsNotKnownToServer",target)
8655 color->red=xcolor.red;
8656 color->green=xcolor.green;
8657 color->blue=xcolor.blue;
8658 color->flags=xcolor.flags;
8660 return(status != False ? MagickTrue : MagickFalse);
8664 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8668 % X Q u e r y P o s i t i o n %
8672 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8674 % XQueryPosition() gets the pointer coordinates relative to a window.
8676 % The format of the XQueryPosition method is:
8678 % void XQueryPosition(Display *display,const Window window,int *x,int *y)
8680 % A description of each parameter follows:
8682 % o display: Specifies a connection to an X server; returned from
8685 % o window: Specifies a pointer to a Window.
8687 % o x: Return the x coordinate of the pointer relative to the origin of the
8690 % o y: Return the y coordinate of the pointer relative to the origin of the
8694 MagickExport void XQueryPosition(Display *display,const Window window,int *x,int *y)
8706 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
8707 assert(display != (Display *) NULL);
8708 assert(window != (Window) NULL);
8709 assert(x != (int *) NULL);
8710 assert(y != (int *) NULL);
8711 (void) XQueryPointer(display,window,&root_window,&root_window,&x_root,&y_root,
8716 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8720 % X R e f r e s h W i n d o w %
8724 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8726 % XRefreshWindow() refreshes an image in a X window.
8728 % The format of the XRefreshWindow method is:
8730 % void XRefreshWindow(Display *display,const XWindowInfo *window,
8731 % const XEvent *event)
8733 % A description of each parameter follows:
8735 % o display: Specifies a connection to an X server; returned from
8738 % o window: Specifies a pointer to a XWindowInfo structure.
8740 % o event: Specifies a pointer to a XEvent structure. If it is NULL,
8741 % the entire image is refreshed.
8744 MagickExport void XRefreshWindow(Display *display,const XWindowInfo *window,
8745 const XEvent *event)
8755 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
8756 assert(display != (Display *) NULL);
8757 assert(window != (XWindowInfo *) NULL);
8758 if (window->ximage == (XImage *) NULL)
8760 if (event != (XEvent *) NULL)
8763 Determine geometry from expose event.
8767 width=(unsigned int) event->xexpose.width;
8768 height=(unsigned int) event->xexpose.height;
8776 Refresh entire window; discard outstanding expose events.
8780 width=window->width;
8781 height=window->height;
8782 while (XCheckTypedWindowEvent(display,window->id,Expose,&sans_event)) ;
8783 if (window->matte_pixmap != (Pixmap) NULL)
8785 #if defined(MAGICKCORE_HAVE_SHAPE)
8786 if (window->shape != MagickFalse)
8787 XShapeCombineMask(display,window->id,ShapeBounding,0,0,
8788 window->matte_pixmap,ShapeSet);
8793 Check boundary conditions.
8795 if ((window->ximage->width-(x+window->x)) < (int) width)
8796 width=(unsigned int) (window->ximage->width-(x+window->x));
8797 if ((window->ximage->height-(y+window->y)) < (int) height)
8798 height=(unsigned int) (window->ximage->height-(y+window->y));
8802 if (window->matte_pixmap != (Pixmap) NULL)
8803 (void) XSetClipMask(display,window->annotate_context,window->matte_pixmap);
8804 if (window->pixmap != (Pixmap) NULL)
8806 if (window->depth > 1)
8807 (void) XCopyArea(display,window->pixmap,window->id,
8808 window->annotate_context,x+window->x,y+window->y,width,height,x,y);
8810 (void) XCopyPlane(display,window->pixmap,window->id,
8811 window->highlight_context,x+window->x,y+window->y,width,height,x,y,
8816 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
8817 if (window->shared_memory)
8818 (void) XShmPutImage(display,window->id,window->annotate_context,
8819 window->ximage,x+window->x,y+window->y,x,y,width,height,MagickTrue);
8821 if (window->shared_memory == MagickFalse)
8822 (void) XPutImage(display,window->id,window->annotate_context,
8823 window->ximage,x+window->x,y+window->y,x,y,width,height);
8825 if (window->matte_pixmap != (Pixmap) NULL)
8826 (void) XSetClipMask(display,window->annotate_context,None);
8827 (void) XFlush(display);
8831 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8835 % X R e m o t e C o m m a n d %
8839 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8841 % XRemoteCommand() forces a remote display(1) to display the specified
8844 % The format of the XRemoteCommand method is:
8846 % MagickBooleanType XRemoteCommand(Display *display,const char *window,
8847 % const char *filename)
8849 % A description of each parameter follows:
8851 % o display: Specifies a connection to an X server; returned from
8854 % o window: Specifies the name or id of an X window.
8856 % o filename: the name of the image filename to display.
8859 MagickExport MagickBooleanType XRemoteCommand(Display *display,
8860 const char *window,const char *filename)
8869 assert(filename != (char *) NULL);
8870 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",filename);
8871 if (display == (Display *) NULL)
8872 display=XOpenDisplay((char *) NULL);
8873 if (display == (Display *) NULL)
8875 ThrowXWindowException(XServerError,"UnableToOpenXServer",filename);
8876 return(MagickFalse);
8878 remote_atom=XInternAtom(display,"IM_PROTOCOLS",MagickFalse);
8879 remote_window=(Window) NULL;
8880 root_window=XRootWindow(display,XDefaultScreen(display));
8881 if (window != (char *) NULL)
8884 Search window hierarchy and identify any clients by name or ID.
8886 if (isdigit((unsigned char) *window) != 0)
8887 remote_window=XWindowByID(display,root_window,(Window)
8888 strtol((char *) window,(char **) NULL,0));
8889 if (remote_window == (Window) NULL)
8890 remote_window=XWindowByName(display,root_window,window);
8892 if (remote_window == (Window) NULL)
8893 remote_window=XWindowByProperty(display,root_window,remote_atom);
8894 if (remote_window == (Window) NULL)
8896 ThrowXWindowException(XServerError,"UnableToConnectToRemoteDisplay",
8898 return(MagickFalse);
8901 Send remote command.
8903 remote_atom=XInternAtom(display,"IM_REMOTE_COMMAND",MagickFalse);
8904 (void) XChangeProperty(display,remote_window,remote_atom,XA_STRING,8,
8905 PropModeReplace,(unsigned char *) filename,(int) strlen(filename));
8906 (void) XSync(display,MagickFalse);
8911 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8915 % X R e t a i n W i n d o w C o l o r s %
8919 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8921 % XRetainWindowColors() sets X11 color resources on a window. This preserves
8922 % the colors associated with an image displayed on the window.
8924 % The format of the XRetainWindowColors method is:
8926 % void XRetainWindowColors(Display *display,const Window window)
8928 % A description of each parameter follows:
8930 % o display: Specifies a connection to an X server; returned from
8933 % o window: Specifies a pointer to a XWindowInfo structure.
8936 MagickExport void XRetainWindowColors(Display *display,const Window window)
8945 Put property on the window.
8947 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
8948 assert(display != (Display *) NULL);
8949 assert(window != (Window) NULL);
8950 property=XInternAtom(display,"_XSETROOT_ID",MagickFalse);
8951 if (property == (Atom) NULL)
8953 ThrowXWindowFatalException(XServerError,"UnableToCreateProperty",
8957 pixmap=XCreatePixmap(display,window,1,1,1);
8958 if (pixmap == (Pixmap) NULL)
8960 ThrowXWindowFatalException(XServerError,"UnableToCreateBitmap","");
8963 (void) XChangeProperty(display,window,property,XA_PIXMAP,32,PropModeReplace,
8964 (unsigned char *) &pixmap,1);
8965 (void) XSetCloseDownMode(display,RetainPermanent);
8969 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8973 % X S e l e c t W i n d o w %
8977 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8979 % XSelectWindow() allows a user to select a window using the mouse. If the
8980 % mouse moves, a cropping rectangle is drawn and the extents of the rectangle
8981 % is returned in the crop_info structure.
8983 % The format of the XSelectWindow function is:
8985 % target_window=XSelectWindow(display,crop_info)
8987 % A description of each parameter follows:
8989 % o window: XSelectWindow returns the window id.
8991 % o display: Specifies a pointer to the Display structure; returned from
8994 % o crop_info: Specifies a pointer to a RectangleInfo structure. It
8995 % contains the extents of any cropping rectangle.
8998 static Window XSelectWindow(Display *display,RectangleInfo *crop_info)
9000 #define MinimumCropArea (unsigned int) 9
9027 Initialize graphic context.
9029 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
9030 assert(display != (Display *) NULL);
9031 assert(crop_info != (RectangleInfo *) NULL);
9032 root_window=XRootWindow(display,XDefaultScreen(display));
9033 context_values.background=XBlackPixel(display,XDefaultScreen(display));
9034 context_values.foreground=XWhitePixel(display,XDefaultScreen(display));
9035 context_values.function=GXinvert;
9036 context_values.plane_mask=
9037 context_values.background ^ context_values.foreground;
9038 context_values.subwindow_mode=IncludeInferiors;
9039 annotate_context=XCreateGC(display,root_window,(size_t) (GCBackground |
9040 GCForeground | GCFunction | GCSubwindowMode),&context_values);
9041 if (annotate_context == (GC) NULL)
9042 return(MagickFalse);
9044 Grab the pointer using target cursor.
9046 target_cursor=XMakeCursor(display,root_window,XDefaultColormap(display,
9047 XDefaultScreen(display)),(char * ) "white",(char * ) "black");
9048 status=XGrabPointer(display,root_window,MagickFalse,(unsigned int)
9049 (ButtonPressMask | ButtonReleaseMask | ButtonMotionMask),GrabModeSync,
9050 GrabModeAsync,root_window,target_cursor,CurrentTime);
9051 if (status != GrabSuccess)
9053 ThrowXWindowFatalException(XServerError,"UnableToGrabMouse","");
9054 return((Window) NULL);
9060 crop_info->height=0;
9062 target_window=(Window) NULL;
9067 if ((crop_info->width*crop_info->height) >= MinimumCropArea)
9068 (void) XDrawRectangle(display,root_window,annotate_context,
9069 (int) crop_info->x,(int) crop_info->y,(unsigned int) crop_info->width-1,
9070 (unsigned int) crop_info->height-1);
9072 Allow another event.
9074 (void) XAllowEvents(display,SyncPointer,CurrentTime);
9075 (void) XWindowEvent(display,root_window,ButtonPressMask |
9076 ButtonReleaseMask | ButtonMotionMask,&event);
9077 if ((crop_info->width*crop_info->height) >= MinimumCropArea)
9078 (void) XDrawRectangle(display,root_window,annotate_context,
9079 (int) crop_info->x,(int) crop_info->y,(unsigned int) crop_info->width-1,
9080 (unsigned int) crop_info->height-1);
9085 target_window=XGetSubwindow(display,event.xbutton.subwindow,
9086 event.xbutton.x,event.xbutton.y);
9087 if (target_window == (Window) NULL)
9088 target_window=root_window;
9089 x_offset=event.xbutton.x_root;
9090 y_offset=event.xbutton.y_root;
9091 crop_info->x=(ssize_t) x_offset;
9092 crop_info->y=(ssize_t) y_offset;
9094 crop_info->height=0;
9106 Discard pending button motion events.
9108 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
9109 crop_info->x=(ssize_t) event.xmotion.x;
9110 crop_info->y=(ssize_t) event.xmotion.y;
9112 Check boundary conditions.
9114 if ((int) crop_info->x < x_offset)
9115 crop_info->width=(size_t) (x_offset-crop_info->x);
9118 crop_info->width=(size_t) (crop_info->x-x_offset);
9119 crop_info->x=(ssize_t) x_offset;
9121 if ((int) crop_info->y < y_offset)
9122 crop_info->height=(size_t) (y_offset-crop_info->y);
9125 crop_info->height=(size_t) (crop_info->y-y_offset);
9126 crop_info->y=(ssize_t) y_offset;
9132 } while ((target_window == (Window) NULL) || (presses > 0));
9133 (void) XUngrabPointer(display,CurrentTime);
9134 (void) XFreeCursor(display,target_cursor);
9135 (void) XFreeGC(display,annotate_context);
9136 if ((crop_info->width*crop_info->height) < MinimumCropArea)
9139 crop_info->height=0;
9141 if ((crop_info->width != 0) && (crop_info->height != 0))
9142 target_window=root_window;
9143 return(target_window);
9147 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9151 % X S e t C u r s o r S t a t e %
9155 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9157 % XSetCursorState() sets the cursor state to busy, otherwise the cursor are
9158 % reset to their default.
9160 % The format of the XXSetCursorState method is:
9162 % XSetCursorState(display,windows,const MagickStatusType state)
9164 % A description of each parameter follows:
9166 % o display: Specifies a connection to an X server; returned from
9169 % o windows: Specifies a pointer to a XWindows structure.
9171 % o state: An unsigned integer greater than 0 sets the cursor state
9172 % to busy, otherwise the cursor are reset to their default.
9175 MagickExport void XSetCursorState(Display *display,XWindows *windows,
9176 const MagickStatusType state)
9178 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
9179 assert(display != (Display *) NULL);
9180 assert(windows != (XWindows *) NULL);
9183 (void) XCheckDefineCursor(display,windows->image.id,
9184 windows->image.busy_cursor);
9185 (void) XCheckDefineCursor(display,windows->pan.id,
9186 windows->pan.busy_cursor);
9187 (void) XCheckDefineCursor(display,windows->magnify.id,
9188 windows->magnify.busy_cursor);
9189 (void) XCheckDefineCursor(display,windows->command.id,
9190 windows->command.busy_cursor);
9194 (void) XCheckDefineCursor(display,windows->image.id,
9195 windows->image.cursor);
9196 (void) XCheckDefineCursor(display,windows->pan.id,windows->pan.cursor);
9197 (void) XCheckDefineCursor(display,windows->magnify.id,
9198 windows->magnify.cursor);
9199 (void) XCheckDefineCursor(display,windows->command.id,
9200 windows->command.cursor);
9201 (void) XCheckDefineCursor(display,windows->command.id,
9202 windows->widget.cursor);
9203 (void) XWithdrawWindow(display,windows->info.id,windows->info.screen);
9205 windows->info.mapped=MagickFalse;
9209 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9213 % X S e t W i n d o w s %
9217 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9219 % XSetWindows() sets the X windows structure if the windows info is specified.
9220 % Otherwise the current windows structure is returned.
9222 % The format of the XSetWindows method is:
9224 % XWindows *XSetWindows(XWindows *windows_info)
9226 % A description of each parameter follows:
9228 % o windows_info: Initialize the Windows structure with this information.
9231 MagickExport XWindows *XSetWindows(XWindows *windows_info)
9234 *windows = (XWindows *) NULL;
9236 if (windows_info != (XWindows *) ~0)
9238 windows=(XWindows *) RelinquishMagickMemory(windows);
9239 windows=windows_info;
9244 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9248 % X U s e r P r e f e r e n c e s %
9252 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9254 % XUserPreferences() saves the preferences in a configuration file in the
9255 % users' home directory.
9257 % The format of the XUserPreferences method is:
9259 % void XUserPreferences(XResourceInfo *resource_info)
9261 % A description of each parameter follows:
9263 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
9266 MagickExport void XUserPreferences(XResourceInfo *resource_info)
9268 #if defined(X11_PREFERENCES_PATH)
9270 cache[MaxTextExtent],
9271 filename[MaxTextExtent],
9272 specifier[MaxTextExtent];
9279 preferences_database;
9282 Save user preferences to the client configuration file.
9284 assert(resource_info != (XResourceInfo *) NULL);
9285 client_name=GetClientName();
9286 preferences_database=XrmGetStringDatabase("");
9287 (void) FormatMagickString(specifier,MaxTextExtent,"%s.backdrop",client_name);
9288 value=resource_info->backdrop ? "True" : "False";
9289 XrmPutStringResource(&preferences_database,specifier,(char *) value);
9290 (void) FormatMagickString(specifier,MaxTextExtent,"%s.colormap",client_name);
9291 value=resource_info->colormap == SharedColormap ? "Shared" : "Private";
9292 XrmPutStringResource(&preferences_database,specifier,(char *) value);
9293 (void) FormatMagickString(specifier,MaxTextExtent,"%s.confirmExit",
9295 value=resource_info->confirm_exit ? "True" : "False";
9296 XrmPutStringResource(&preferences_database,specifier,(char *) value);
9297 (void) FormatMagickString(specifier,MaxTextExtent,"%s.confirmEdit",
9299 value=resource_info->confirm_edit ? "True" : "False";
9300 XrmPutStringResource(&preferences_database,specifier,(char *) value);
9301 (void) FormatMagickString(specifier,MaxTextExtent,"%s.displayWarnings",
9303 value=resource_info->display_warnings ? "True" : "False";
9304 XrmPutStringResource(&preferences_database,specifier,(char *) value);
9305 (void) FormatMagickString(specifier,MaxTextExtent,"%s.dither",client_name);
9306 value=resource_info->quantize_info->dither ? "True" : "False";
9307 XrmPutStringResource(&preferences_database,specifier,(char *) value);
9308 (void) FormatMagickString(specifier,MaxTextExtent,"%s.gammaCorrect",
9310 value=resource_info->gamma_correct ? "True" : "False";
9311 XrmPutStringResource(&preferences_database,specifier,(char *) value);
9312 (void) FormatMagickString(specifier,MaxTextExtent,"%s.undoCache",client_name);
9313 (void) FormatMagickString(cache,MaxTextExtent,"%.20g",(double)
9314 resource_info->undo_cache);
9315 XrmPutStringResource(&preferences_database,specifier,cache);
9316 (void) FormatMagickString(specifier,MaxTextExtent,"%s.usePixmap",client_name);
9317 value=resource_info->use_pixmap ? "True" : "False";
9318 XrmPutStringResource(&preferences_database,specifier,(char *) value);
9319 (void) FormatMagickString(filename,MaxTextExtent,"%s%src",
9320 X11_PREFERENCES_PATH,client_name);
9321 ExpandFilename(filename);
9322 XrmPutFileDatabase(preferences_database,filename);
9327 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9331 % X V i s u a l C l a s s N a m e %
9335 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9337 % XVisualClassName() returns the visual class name as a character string.
9339 % The format of the XVisualClassName method is:
9341 % char *XVisualClassName(const int visual_class)
9343 % A description of each parameter follows:
9345 % o visual_type: XVisualClassName returns the visual class as a character
9348 % o class: Specifies the visual class.
9351 static const char *XVisualClassName(const int visual_class)
9353 switch (visual_class)
9355 case StaticGray: return("StaticGray");
9356 case GrayScale: return("GrayScale");
9357 case StaticColor: return("StaticColor");
9358 case PseudoColor: return("PseudoColor");
9359 case TrueColor: return("TrueColor");
9360 case DirectColor: return("DirectColor");
9362 return("unknown visual class");
9366 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9374 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9376 % XWarning() displays a warning reason in a Notice widget.
9378 % The format of the XWarning method is:
9380 % void XWarning(const unsigned int warning,const char *reason,
9381 % const char *description)
9383 % A description of each parameter follows:
9385 % o warning: Specifies the numeric warning category.
9387 % o reason: Specifies the reason to display before terminating the
9390 % o description: Specifies any description to the reason.
9393 MagickExport void XWarning(const ExceptionType magick_unused(warning),
9394 const char *reason,const char *description)
9397 text[MaxTextExtent];
9402 if (reason == (char *) NULL)
9404 (void) CopyMagickString(text,reason,MaxTextExtent);
9405 (void) ConcatenateMagickString(text,":",MaxTextExtent);
9406 windows=XSetWindows((XWindows *) ~0);
9407 XNoticeWidget(windows->display,windows,text,(char *) description);
9411 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9415 % X W i n d o w B y I D %
9419 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9421 % XWindowByID() locates a child window with a given ID. If not window with
9422 % the given name is found, 0 is returned. Only the window specified and its
9423 % subwindows are searched.
9425 % The format of the XWindowByID function is:
9427 % child=XWindowByID(display,window,id)
9429 % A description of each parameter follows:
9431 % o child: XWindowByID returns the window with the specified
9432 % id. If no windows are found, XWindowByID returns 0.
9434 % o display: Specifies a pointer to the Display structure; returned from
9437 % o id: Specifies the id of the window to locate.
9440 MagickExport Window XWindowByID(Display *display,const Window root_window,
9460 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
9461 assert(display != (Display *) NULL);
9462 assert(root_window != (Window) NULL);
9464 return(XSelectWindow(display,&rectangle_info));
9465 if (root_window == id)
9466 return(root_window);
9467 status=XQueryTree(display,root_window,&child,&child,&children,
9469 if (status == False)
9470 return((Window) NULL);
9471 window=(Window) NULL;
9472 for (i=0; i < (int) number_children; i++)
9475 Search each child and their children.
9477 window=XWindowByID(display,children[i],id);
9478 if (window != (Window) NULL)
9481 if (children != (Window *) NULL)
9482 (void) XFree((void *) children);
9487 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9491 % X W i n d o w B y N a m e %
9495 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9497 % XWindowByName() locates a window with a given name on a display. If no
9498 % window with the given name is found, 0 is returned. If more than one window
9499 % has the given name, the first one is returned. Only root and its children
9502 % The format of the XWindowByName function is:
9504 % window=XWindowByName(display,root_window,name)
9506 % A description of each parameter follows:
9508 % o window: XWindowByName returns the window id.
9510 % o display: Specifies a pointer to the Display structure; returned from
9513 % o root_window: Specifies the id of the root window.
9515 % o name: Specifies the name of the window to locate.
9518 MagickExport Window XWindowByName(Display *display,const Window root_window,
9538 assert(display != (Display *) NULL);
9539 assert(root_window != (Window) NULL);
9540 assert(name != (char *) NULL);
9541 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",name);
9542 if (XGetWMName(display,root_window,&window_name) != 0)
9543 if (LocaleCompare((char *) window_name.value,name) == 0)
9544 return(root_window);
9545 status=XQueryTree(display,root_window,&child,&child,&children,
9547 if (status == False)
9548 return((Window) NULL);
9549 window=(Window) NULL;
9550 for (i=0; i < (int) number_children; i++)
9553 Search each child and their children.
9555 window=XWindowByName(display,children[i],name);
9556 if (window != (Window) NULL)
9559 if (children != (Window *) NULL)
9560 (void) XFree((void *) children);
9565 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9569 % X W i n d o w B y P r o p e r y %
9573 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9575 % XWindowByProperty() locates a child window with a given property. If not
9576 % window with the given name is found, 0 is returned. If more than one window
9577 % has the given property, the first one is returned. Only the window
9578 % specified and its subwindows are searched.
9580 % The format of the XWindowByProperty function is:
9582 % child=XWindowByProperty(display,window,property)
9584 % A description of each parameter follows:
9586 % o child: XWindowByProperty returns the window id with the specified
9587 % property. If no windows are found, XWindowByProperty returns 0.
9589 % o display: Specifies a pointer to the Display structure; returned from
9592 % o property: Specifies the property of the window to locate.
9595 MagickExport Window XWindowByProperty(Display *display,const Window window,
9596 const Atom property)
9624 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
9625 assert(display != (Display *) NULL);
9626 assert(window != (Window) NULL);
9627 assert(property != (Atom) NULL);
9628 status=XQueryTree(display,window,&root,&parent,&children,&number_children);
9629 if (status == False)
9630 return((Window) NULL);
9632 child=(Window) NULL;
9633 for (i=0; (i < number_children) && (child == (Window) NULL); i++)
9635 status=XGetWindowProperty(display,children[i],property,0L,0L,MagickFalse,
9636 (Atom) AnyPropertyType,&type,&format,&number_items,&after,&data);
9638 (void) XFree((void *) data);
9639 if ((status == Success) && (type != (Atom) NULL))
9642 for (i=0; (i < number_children) && (child == (Window) NULL); i++)
9643 child=XWindowByProperty(display,children[i],property);
9644 if (children != (Window *) NULL)
9645 (void) XFree((void *) children);
9651 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9655 % X I m p o r t I m a g e %
9659 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9661 % XImportImage() reads an image from an X window.
9663 % The format of the XImportImage method is:
9665 % Image *XImportImage(const ImageInfo *image_info,XImportInfo *ximage_info)
9667 % A description of each parameter follows:
9669 % o image_info: the image info..
9671 % o ximage_info: Specifies a pointer to an XImportInfo structure.
9674 MagickExport Image *XImportImage(const ImageInfo *image_info,
9675 XImportInfo *ximage_info)
9677 assert(image_info != (const ImageInfo *) NULL);
9678 assert(image_info->signature == MagickSignature);
9679 if (image_info->debug != MagickFalse)
9680 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
9681 image_info->filename);
9682 assert(ximage_info != (XImportInfo *) NULL);
9683 return((Image *) NULL);
9688 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9692 + X C o m p o n e n t G e n e s i s %
9696 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9698 % XComponentGenesis() instantiates the X component.
9700 % The format of the XComponentGenesis method is:
9702 % MagickBooleanType XComponentGenesis(void)
9705 MagickExport MagickBooleanType XComponentGenesis(void)
9711 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9715 % X G e t I m p o r t I n f o %
9719 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9721 % XGetImportInfo() initializes the XImportInfo structure.
9723 % The format of the XGetImportInfo method is:
9725 % void XGetImportInfo(XImportInfo *ximage_info)
9727 % A description of each parameter follows:
9729 % o ximage_info: Specifies a pointer to an ImageInfo structure.
9732 MagickExport void XGetImportInfo(XImportInfo *ximage_info)
9734 assert(ximage_info != (XImportInfo *) NULL);
9735 ximage_info->frame=MagickFalse;
9736 ximage_info->borders=MagickFalse;
9737 ximage_info->screen=MagickFalse;
9738 ximage_info->descend=MagickTrue;
9739 ximage_info->silent=MagickFalse;