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-2014 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 "MagickCore/studio.h"
43 #include "MagickCore/animate.h"
44 #include "MagickCore/artifact.h"
45 #include "MagickCore/blob.h"
46 #include "MagickCore/cache.h"
47 #include "MagickCore/client.h"
48 #include "MagickCore/color.h"
49 #include "MagickCore/color-private.h"
50 #include "MagickCore/colormap.h"
51 #include "MagickCore/composite.h"
52 #include "MagickCore/constitute.h"
53 #include "MagickCore/display.h"
54 #include "MagickCore/distort.h"
55 #include "MagickCore/exception.h"
56 #include "MagickCore/exception-private.h"
57 #include "MagickCore/geometry.h"
58 #include "MagickCore/identify.h"
59 #include "MagickCore/image.h"
60 #include "MagickCore/image-private.h"
61 #include "MagickCore/list.h"
62 #include "MagickCore/locale_.h"
63 #include "MagickCore/log.h"
64 #include "MagickCore/magick.h"
65 #include "MagickCore/memory_.h"
66 #include "MagickCore/monitor.h"
67 #include "MagickCore/nt-base-private.h"
68 #include "MagickCore/option.h"
69 #include "MagickCore/pixel-accessor.h"
70 #include "MagickCore/PreRvIcccm.h"
71 #include "MagickCore/quantize.h"
72 #include "MagickCore/quantum.h"
73 #include "MagickCore/quantum-private.h"
74 #include "MagickCore/resource_.h"
75 #include "MagickCore/resize.h"
76 #include "MagickCore/statistic.h"
77 #include "MagickCore/string_.h"
78 #include "MagickCore/string-private.h"
79 #include "MagickCore/transform.h"
80 #include "MagickCore/token.h"
81 #include "MagickCore/utility.h"
82 #include "MagickCore/utility-private.h"
83 #include "MagickCore/widget.h"
84 #include "MagickCore/widget-private.h"
85 #include "MagickCore/xwindow.h"
86 #include "MagickCore/xwindow-private.h"
87 #include "MagickCore/version.h"
91 #if defined(MAGICKCORE_X11_DELEGATE)
92 #include <X11/Xproto.h>
93 #include <X11/Xlocale.h>
94 #if defined(MAGICK_HAVE_POLL)
95 # include <sys/poll.h>
97 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
98 #if defined(MAGICKCORE_HAVE_MACHINE_PARAM_H)
99 # include <machine/param.h>
103 #include <X11/extensions/XShm.h>
105 #if defined(MAGICKCORE_HAVE_SHAPE)
106 #include <X11/extensions/shape.h>
112 #define XBlueGamma(color) ClampToQuantum(blue_gamma == 1.0 ? (double) \
113 (color) : ((pow(((double) QuantumScale*(color)),1.0/(double) blue_gamma)* \
115 #define XGammaPacket(map,color) (size_t) (map->base_pixel+ \
116 ((ScaleQuantumToShort(XRedGamma((color)->red))*map->red_max/65535L)* \
118 ((ScaleQuantumToShort(XGreenGamma((color)->green))*map->green_max/65535L)* \
120 ((ScaleQuantumToShort(XBlueGamma((color)->blue))*map->blue_max/65535L)* \
122 #define XGammaPixel(image,map,color) (size_t) (map->base_pixel+ \
123 ((ScaleQuantumToShort(XRedGamma(GetPixelRed(image,color)))*map->red_max/65535L)* \
125 ((ScaleQuantumToShort(XGreenGamma(GetPixelGreen(image,color)))*map->green_max/65535L)* \
127 ((ScaleQuantumToShort(XBlueGamma(GetPixelBlue(image,color)))*map->blue_max/65535L)* \
129 #define XGreenGamma(color) ClampToQuantum(green_gamma == 1.0 ? (double) \
130 (color) : ((pow(((double) QuantumScale*(color)),1.0/(double) green_gamma)* \
132 #define XRedGamma(color) ClampToQuantum(red_gamma == 1.0 ? (double) \
133 (color) : ((pow(((double) QuantumScale*(color)),1.0/(double) red_gamma)* \
135 #define XStandardPixel(map,color) (size_t) (map->base_pixel+ \
136 (((color)->red*map->red_max/65535L)*map->red_mult)+ \
137 (((color)->green*map->green_max/65535L)*map->green_mult)+ \
138 (((color)->blue*map->blue_max/65535L)*map->blue_mult))
140 #define AccentuateModulate ScaleCharToQuantum(80)
141 #define HighlightModulate ScaleCharToQuantum(125)
142 #define ShadowModulate ScaleCharToQuantum(135)
143 #define DepthModulate ScaleCharToQuantum(185)
144 #define TroughModulate ScaleCharToQuantum(110)
146 #define XLIB_ILLEGAL_ACCESS 1
148 #undef NorthWestGravity
150 #undef NorthEastGravity
154 #undef SouthWestGravity
156 #undef SouthEastGravity
163 #define XFD_SET fd_set
167 Enumeration declarations.
181 Typedef declarations.
183 typedef struct _DiversityPacket
198 Constant declaractions.
200 static MagickBooleanType
201 xerror_alert = MagickFalse;
207 *XVisualClassName(const int);
214 static MagickBooleanType
215 XMakePixmap(Display *,const XResourceInfo *,XWindowInfo *);
218 XMakeImageLSBFirst(const XResourceInfo *,const XWindowInfo *,Image *,
219 XImage *,XImage *,ExceptionInfo *),
220 XMakeImageMSBFirst(const XResourceInfo *,const XWindowInfo *,Image *,
221 XImage *,XImage *,ExceptionInfo *);
224 XSelectWindow(Display *,RectangleInfo *);
227 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
231 % D e s t r o y X R e s o u r c e s %
235 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
237 % DestroyXResources() destroys any X resources.
239 % The format of the DestroyXResources method is:
241 % void DestroyXResources()
243 % A description of each parameter follows:
246 MagickExport void DestroyXResources(void)
255 *magick_windows[MaxXWindows];
261 windows=XSetWindows((XWindows *) ~0);
262 if ((windows == (XWindows *) NULL) || (windows->display == (Display *) NULL))
265 magick_windows[number_windows++]=(&windows->context);
266 magick_windows[number_windows++]=(&windows->group_leader);
267 magick_windows[number_windows++]=(&windows->backdrop);
268 magick_windows[number_windows++]=(&windows->icon);
269 magick_windows[number_windows++]=(&windows->image);
270 magick_windows[number_windows++]=(&windows->info);
271 magick_windows[number_windows++]=(&windows->magnify);
272 magick_windows[number_windows++]=(&windows->pan);
273 magick_windows[number_windows++]=(&windows->command);
274 magick_windows[number_windows++]=(&windows->widget);
275 magick_windows[number_windows++]=(&windows->popup);
276 magick_windows[number_windows++]=(&windows->context);
277 for (i=0; i < (int) number_windows; i++)
279 if (magick_windows[i]->mapped != MagickFalse)
281 (void) XWithdrawWindow(windows->display,magick_windows[i]->id,
282 magick_windows[i]->screen);
283 magick_windows[i]->mapped=MagickFalse;
285 if (magick_windows[i]->name != (char *) NULL)
286 magick_windows[i]->name=(char *)
287 RelinquishMagickMemory(magick_windows[i]->name);
288 if (magick_windows[i]->icon_name != (char *) NULL)
289 magick_windows[i]->icon_name=(char *)
290 RelinquishMagickMemory(magick_windows[i]->icon_name);
291 if (magick_windows[i]->cursor != (Cursor) NULL)
293 (void) XFreeCursor(windows->display,magick_windows[i]->cursor);
294 magick_windows[i]->cursor=(Cursor) NULL;
296 if (magick_windows[i]->busy_cursor != (Cursor) NULL)
298 (void) XFreeCursor(windows->display,magick_windows[i]->busy_cursor);
299 magick_windows[i]->busy_cursor=(Cursor) NULL;
301 if (magick_windows[i]->highlight_stipple != (Pixmap) NULL)
303 (void) XFreePixmap(windows->display,
304 magick_windows[i]->highlight_stipple);
305 magick_windows[i]->highlight_stipple=(Pixmap) NULL;
307 if (magick_windows[i]->shadow_stipple != (Pixmap) NULL)
309 (void) XFreePixmap(windows->display,magick_windows[i]->shadow_stipple);
310 magick_windows[i]->shadow_stipple=(Pixmap) NULL;
312 if (magick_windows[i]->ximage != (XImage *) NULL)
314 XDestroyImage(magick_windows[i]->ximage);
315 magick_windows[i]->ximage=(XImage *) NULL;
317 if (magick_windows[i]->pixmap != (Pixmap) NULL)
319 (void) XFreePixmap(windows->display,magick_windows[i]->pixmap);
320 magick_windows[i]->pixmap=(Pixmap) NULL;
322 if (magick_windows[i]->id != (Window) NULL)
324 (void) XDestroyWindow(windows->display,magick_windows[i]->id);
325 magick_windows[i]->id=(Window) NULL;
327 if (magick_windows[i]->destroy != MagickFalse)
329 if (magick_windows[i]->image != (Image *) NULL)
331 magick_windows[i]->image=DestroyImage(magick_windows[i]->image);
332 magick_windows[i]->image=NewImageList();
334 if (magick_windows[i]->matte_pixmap != (Pixmap) NULL)
336 (void) XFreePixmap(windows->display,
337 magick_windows[i]->matte_pixmap);
338 magick_windows[i]->matte_pixmap=(Pixmap) NULL;
341 if (magick_windows[i]->segment_info != (void *) NULL)
343 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
347 segment_info=(XShmSegmentInfo *) magick_windows[i]->segment_info;
348 if (segment_info != (XShmSegmentInfo *) NULL)
349 if (segment_info[0].shmid >= 0)
351 if (segment_info[0].shmaddr != NULL)
352 (void) shmdt(segment_info[0].shmaddr);
353 (void) shmctl(segment_info[0].shmid,IPC_RMID,0);
354 segment_info[0].shmaddr=NULL;
355 segment_info[0].shmid=(-1);
358 magick_windows[i]->segment_info=(void *)
359 RelinquishMagickMemory(magick_windows[i]->segment_info);
362 windows->icon_resources=(XResourceInfo *)
363 RelinquishMagickMemory(windows->icon_resources);
364 if (windows->icon_pixel != (XPixelInfo *) NULL)
366 if (windows->icon_pixel->pixels != (unsigned long *) NULL)
367 windows->icon_pixel->pixels=(unsigned long *)
368 RelinquishMagickMemory(windows->icon_pixel->pixels);
369 if (windows->icon_pixel->annotate_context != (GC) NULL)
370 XFreeGC(windows->display,windows->icon_pixel->annotate_context);
371 windows->icon_pixel=(XPixelInfo *)
372 RelinquishMagickMemory(windows->icon_pixel);
374 if (windows->pixel_info != (XPixelInfo *) NULL)
376 if (windows->pixel_info->pixels != (unsigned long *) NULL)
377 windows->pixel_info->pixels=(unsigned long *)
378 RelinquishMagickMemory(windows->pixel_info->pixels);
379 if (windows->pixel_info->annotate_context != (GC) NULL)
380 XFreeGC(windows->display,windows->pixel_info->annotate_context);
381 if (windows->pixel_info->widget_context != (GC) NULL)
382 XFreeGC(windows->display,windows->pixel_info->widget_context);
383 if (windows->pixel_info->highlight_context != (GC) NULL)
384 XFreeGC(windows->display,windows->pixel_info->highlight_context);
385 windows->pixel_info=(XPixelInfo *)
386 RelinquishMagickMemory(windows->pixel_info);
388 if (windows->font_info != (XFontStruct *) NULL)
390 XFreeFont(windows->display,windows->font_info);
391 windows->font_info=(XFontStruct *) NULL;
393 if (windows->class_hints != (XClassHint *) NULL)
395 if (windows->class_hints->res_name != (char *) NULL)
396 windows->class_hints->res_name=DestroyString(
397 windows->class_hints->res_name);
398 if (windows->class_hints->res_class != (char *) NULL)
399 windows->class_hints->res_class=DestroyString(
400 windows->class_hints->res_class);
401 XFree(windows->class_hints);
402 windows->class_hints=(XClassHint *) NULL;
404 if (windows->manager_hints != (XWMHints *) NULL)
406 XFree(windows->manager_hints);
407 windows->manager_hints=(XWMHints *) NULL;
409 if (windows->map_info != (XStandardColormap *) NULL)
411 XFree(windows->map_info);
412 windows->map_info=(XStandardColormap *) NULL;
414 if (windows->icon_map != (XStandardColormap *) NULL)
416 XFree(windows->icon_map);
417 windows->icon_map=(XStandardColormap *) NULL;
419 if (windows->visual_info != (XVisualInfo *) NULL)
421 XFree(windows->visual_info);
422 windows->visual_info=(XVisualInfo *) NULL;
424 if (windows->icon_visual != (XVisualInfo *) NULL)
426 XFree(windows->icon_visual);
427 windows->icon_visual=(XVisualInfo *) NULL;
429 (void) XSetWindows((XWindows *) NULL);
433 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
437 % X A n n o t a t e I m a g e %
441 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
443 % XAnnotateImage() annotates the image with text.
445 % The format of the XAnnotateImage method is:
447 % MagickBooleanType XAnnotateImage(Display *display,
448 % const XPixelInfo *pixel,XAnnotateInfo *annotate_info,Image *image,
449 % ExceptionInfo *exception)
451 % A description of each parameter follows:
453 % o display: Specifies a connection to an X server; returned from
456 % o pixel: Specifies a pointer to a XPixelInfo structure.
458 % o annotate_info: Specifies a pointer to a XAnnotateInfo structure.
460 % o image: the image.
462 % o exception: return any errors or warnings in this structure.
465 MagickPrivate MagickBooleanType XAnnotateImage(Display *display,
466 const XPixelInfo *pixel,XAnnotateInfo *annotate_info,Image *image,
467 ExceptionInfo *exception)
503 Initialize annotated image.
505 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
506 assert(display != (Display *) NULL);
507 assert(pixel != (XPixelInfo *) NULL);
508 assert(annotate_info != (XAnnotateInfo *) NULL);
509 assert(image != (Image *) NULL);
511 Initialize annotated pixmap.
513 root_window=XRootWindow(display,XDefaultScreen(display));
514 depth=(unsigned int) XDefaultDepth(display,XDefaultScreen(display));
515 annotate_pixmap=XCreatePixmap(display,root_window,annotate_info->width,
516 annotate_info->height,depth);
517 if (annotate_pixmap == (Pixmap) NULL)
520 Initialize graphics info.
522 context_values.background=0;
523 context_values.foreground=(size_t) (~0);
524 context_values.font=annotate_info->font_info->fid;
525 annotate_context=XCreateGC(display,root_window,(unsigned long)
526 (GCBackground | GCFont | GCForeground),&context_values);
527 if (annotate_context == (GC) NULL)
532 (void) XDrawImageString(display,annotate_pixmap,annotate_context,0,
533 (int) annotate_info->font_info->ascent,annotate_info->text,
534 (int) strlen(annotate_info->text));
535 (void) XFreeGC(display,annotate_context);
537 Initialize annotated X image.
539 annotate_ximage=XGetImage(display,annotate_pixmap,0,0,annotate_info->width,
540 annotate_info->height,AllPlanes,ZPixmap);
541 if (annotate_ximage == (XImage *) NULL)
543 (void) XFreePixmap(display,annotate_pixmap);
545 Initialize annotated image.
547 annotate_image=AcquireImage((ImageInfo *) NULL,exception);
548 if (annotate_image == (Image *) NULL)
550 annotate_image->columns=annotate_info->width;
551 annotate_image->rows=annotate_info->height;
553 Transfer annotated X image to image.
555 width=(unsigned int) image->columns;
556 height=(unsigned int) image->rows;
559 (void) XParseGeometry(annotate_info->geometry,&x,&y,&width,&height);
560 (void) GetOneVirtualPixelInfo(image,UndefinedVirtualPixelMethod,(ssize_t) x,
561 (ssize_t) y,&annotate_image->background_color,exception);
562 if (annotate_info->stencil == ForegroundStencil)
563 annotate_image->alpha_trait=BlendPixelTrait;
564 annotate_view=AcquireAuthenticCacheView(annotate_image,exception);
565 for (y=0; y < (int) annotate_image->rows; y++)
573 q=GetCacheViewAuthenticPixels(annotate_view,0,(ssize_t) y,
574 annotate_image->columns,1,exception);
575 if (q == (Quantum *) NULL)
577 for (x=0; x < (int) annotate_image->columns; x++)
579 SetPixelAlpha(annotate_image,OpaqueAlpha,q);
580 if (XGetPixel(annotate_ximage,x,y) == 0)
583 Set this pixel to the background color.
585 SetPixelRed(annotate_image,ScaleShortToQuantum(
586 pixel->box_color.red),q);
587 SetPixelGreen(annotate_image,ScaleShortToQuantum(
588 pixel->box_color.green),q);
589 SetPixelBlue(annotate_image,ScaleShortToQuantum(
590 pixel->box_color.blue),q);
591 if ((annotate_info->stencil == ForegroundStencil) ||
592 (annotate_info->stencil == OpaqueStencil))
593 SetPixelAlpha(annotate_image,TransparentAlpha,q);
598 Set this pixel to the pen color.
600 SetPixelRed(annotate_image,ScaleShortToQuantum(
601 pixel->pen_color.red),q);
602 SetPixelGreen(annotate_image,ScaleShortToQuantum(
603 pixel->pen_color.green),q);
604 SetPixelBlue(annotate_image,ScaleShortToQuantum(
605 pixel->pen_color.blue),q);
606 if (annotate_info->stencil == BackgroundStencil)
607 SetPixelAlpha(annotate_image,TransparentAlpha,q);
609 q+=GetPixelChannels(annotate_image);
611 if (SyncCacheViewAuthenticPixels(annotate_view,exception) == MagickFalse)
614 annotate_view=DestroyCacheView(annotate_view);
615 XDestroyImage(annotate_ximage);
617 Determine annotate geometry.
619 (void) XParseGeometry(annotate_info->geometry,&x,&y,&width,&height);
620 if ((width != (unsigned int) annotate_image->columns) ||
621 (height != (unsigned int) annotate_image->rows))
624 image_geometry[MaxTextExtent];
629 (void) FormatLocaleString(image_geometry,MaxTextExtent,"%ux%u",
631 (void) TransformImage(&annotate_image,(char *) NULL,image_geometry,
634 if (annotate_info->degrees != 0.0)
648 rotate_image=RotateImage(annotate_image,annotate_info->degrees,exception);
649 if (rotate_image == (Image *) NULL)
651 annotate_image=DestroyImage(annotate_image);
652 annotate_image=rotate_image;
654 Annotation is relative to the degree of rotation.
656 normalized_degrees=annotate_info->degrees;
657 while (normalized_degrees < -45.0)
658 normalized_degrees+=360.0;
659 for (rotations=0; normalized_degrees > 45.0; rotations++)
660 normalized_degrees-=90.0;
661 switch (rotations % 4)
671 x-=(int) annotate_image->columns/2;
672 y+=(int) annotate_image->columns/2;
680 x=x-(int) annotate_image->columns;
688 x=x-(int) annotate_image->columns/2;
689 y=y-(int) (annotate_image->rows-(annotate_image->columns/2));
695 Composite text onto the image.
697 (void) XParseGeometry(annotate_info->geometry,&x,&y,&width,&height);
698 alpha_trait=image->alpha_trait;
699 (void) CompositeImage(image,annotate_image,
700 annotate_image->alpha_trait == BlendPixelTrait ? OverCompositeOp :
701 CopyCompositeOp,MagickTrue,(ssize_t) x,(ssize_t) y,exception);
702 image->alpha_trait=alpha_trait;
703 annotate_image=DestroyImage(annotate_image);
708 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
712 % X B e s t F o n t %
716 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
718 % XBestFont() returns the "best" font. "Best" is defined as a font specified
719 % in the X resource database or a font such that the text width displayed
720 % with the font does not exceed the specified maximum width.
722 % The format of the XBestFont method is:
724 % XFontStruct *XBestFont(Display *display,
725 % const XResourceInfo *resource_info,const MagickBooleanType text_font)
727 % A description of each parameter follows:
729 % o font: XBestFont returns a pointer to a XFontStruct structure.
731 % o display: Specifies a connection to an X server; returned from
734 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
736 % o text_font: True is font should be mono-spaced (typewriter style).
740 static char **FontToList(char *font)
755 if (font == (char *) NULL)
756 return((char **) NULL);
758 Convert string to an ASCII list.
761 for (p=font; *p != '\0'; p++)
762 if ((*p == ':') || (*p == ';') || (*p == ','))
764 fontlist=(char **) AcquireQuantumMemory((size_t) fonts+1UL,sizeof(*fontlist));
765 if (fontlist == (char **) NULL)
767 ThrowXWindowException(ResourceLimitError,"MemoryAllocationFailed",font);
768 return((char **) NULL);
771 for (i=0; i < (int) fonts; i++)
773 for (q=p; *q != '\0'; q++)
774 if ((*q == ':') || (*q == ';') || (*q == ','))
776 fontlist[i]=(char *) AcquireQuantumMemory((size_t) (q-p)+1UL,
777 sizeof(*fontlist[i]));
778 if (fontlist[i] == (char *) NULL)
780 ThrowXWindowException(ResourceLimitError,"MemoryAllocationFailed",font);
781 return((char **) NULL);
783 (void) CopyMagickString(fontlist[i],p,(size_t) (q-p+1));
786 fontlist[i]=(char *) NULL;
790 MagickPrivate XFontStruct *XBestFont(Display *display,
791 const XResourceInfo *resource_info,const MagickBooleanType text_font)
796 "-*-helvetica-medium-r-normal--12-*-*-*-*-*-iso8859-1",
797 "-*-arial-medium-r-normal--12-*-*-*-*-*-iso8859-1",
798 "-*-helvetica-medium-r-normal--12-*-*-*-*-*-iso8859-15",
799 "-*-arial-medium-r-normal--12-*-*-*-*-*-iso8859-15",
800 "-*-helvetica-medium-r-normal--12-*-*-*-*-*-*-*",
801 "-*-arial-medium-r-normal--12-*-*-*-*-*-*-*",
808 "-*-courier-medium-r-normal-*-12-*-*-*-*-*-iso8859-1",
809 "-*-courier-medium-r-normal-*-12-*-*-*-*-*-iso8859-15",
810 "-*-fixed-medium-r-normal-*-12-*-*-*-*-*-*-*",
824 font_info=(XFontStruct *) NULL;
825 font_name=resource_info->font;
826 if (text_font != MagickFalse)
827 font_name=resource_info->text_font;
828 if ((font_name != (char *) NULL) && (*font_name != '\0'))
837 Load preferred font specified in the X resource database.
839 fontlist=FontToList(font_name);
840 if (fontlist != (char **) NULL)
842 for (i=0; fontlist[i] != (char *) NULL; i++)
844 if (font_info == (XFontStruct *) NULL)
845 font_info=XLoadQueryFont(display,fontlist[i]);
846 fontlist[i]=DestroyString(fontlist[i]);
848 fontlist=(char **) RelinquishMagickMemory(fontlist);
850 if (font_info == (XFontStruct *) NULL)
851 ThrowXWindowException(XServerError,"UnableToLoadFont",font_name);
854 Load fonts from list of fonts until one is found.
857 if (text_font != MagickFalse)
859 if (XDisplayHeight(display,XDefaultScreen(display)) >= 748)
861 while (*p != (char *) NULL)
863 if (font_info != (XFontStruct *) NULL)
865 font_info=XLoadQueryFont(display,(char *) *p);
872 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
876 % X B e s t I c o n S i z e %
880 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
882 % XBestIconSize() returns the "best" icon size. "Best" is defined as an icon
883 % size that maintains the aspect ratio of the image. If the window manager
884 % has preferred icon sizes, one of the preferred sizes is used.
886 % The format of the XBestIconSize method is:
888 % void XBestIconSize(Display *display,XWindowInfo *window,Image *image)
890 % A description of each parameter follows:
892 % o display: Specifies a connection to an X server; returned from
895 % o image: the image.
898 MagickPrivate void XBestIconSize(Display *display,XWindowInfo *window,
922 Determine if the window manager has specified preferred icon sizes.
924 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
925 assert(display != (Display *) NULL);
926 assert(window != (XWindowInfo *) NULL);
927 assert(image != (Image *) NULL);
928 window->width=MaxIconSize;
929 window->height=MaxIconSize;
930 icon_size=(XIconSize *) NULL;
932 root_window=XRootWindow(display,window->screen);
933 if (XGetIconSizes(display,root_window,&size_list,&number_sizes) != 0)
934 if ((number_sizes > 0) && (size_list != (XIconSize *) NULL))
936 if (icon_size == (XIconSize *) NULL)
939 Window manager does not restrict icon size.
941 icon_size=XAllocIconSize();
942 if (icon_size == (XIconSize *) NULL)
944 ThrowXWindowException(ResourceLimitError,"MemoryAllocationFailed",
948 icon_size->min_width=1;
949 icon_size->max_width=MaxIconSize;
950 icon_size->min_height=1;
951 icon_size->max_height=MaxIconSize;
952 icon_size->width_inc=1;
953 icon_size->height_inc=1;
956 Determine aspect ratio of image.
958 width=(unsigned int) image->columns;
959 height=(unsigned int) image->rows;
961 if (window->crop_geometry)
962 (void) XParseGeometry(window->crop_geometry,&i,&i,&width,&height);
964 Look for an icon size that maintains the aspect ratio of image.
966 scale_factor=(double) icon_size->max_width/width;
967 if (scale_factor > ((double) icon_size->max_height/height))
968 scale_factor=(double) icon_size->max_height/height;
969 icon_width=(unsigned int) icon_size->min_width;
970 while ((int) icon_width < icon_size->max_width)
972 if (icon_width >= (unsigned int) (scale_factor*width+0.5))
974 icon_width+=icon_size->width_inc;
976 icon_height=(unsigned int) icon_size->min_height;
977 while ((int) icon_height < icon_size->max_height)
979 if (icon_height >= (unsigned int) (scale_factor*height+0.5))
981 icon_height+=icon_size->height_inc;
983 (void) XFree((void *) icon_size);
984 window->width=icon_width;
985 window->height=icon_height;
989 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
993 % X B e s t P i x e l %
997 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
999 % XBestPixel() returns a pixel from an array of pixels that is closest to the
1000 % requested color. If the color array is NULL, the colors are obtained from
1003 % The format of the XBestPixel method is:
1005 % void XBestPixel(Display *display,const Colormap colormap,XColor *colors,
1006 % unsigned int number_colors,XColor *color)
1008 % A description of each parameter follows:
1010 % o pixel: XBestPixel returns the pixel value closest to the requested
1013 % o display: Specifies a connection to an X server; returned from
1016 % o colormap: Specifies the ID of the X server colormap.
1018 % o colors: Specifies an array of XColor structures.
1020 % o number_colors: Specifies the number of XColor structures in the
1021 % color definition array.
1023 % o color: Specifies the desired RGB value to find in the colors array.
1026 MagickPrivate void XBestPixel(Display *display,const Colormap colormap,
1027 XColor *colors,unsigned int number_colors,XColor *color)
1049 Find closest representation for the requested RGB color.
1051 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1052 assert(display != (Display *) NULL);
1053 assert(color != (XColor *) NULL);
1054 status=XAllocColor(display,colormap,color);
1055 if (status != False)
1057 query_server=colors == (XColor *) NULL ? MagickTrue : MagickFalse;
1058 if (query_server != MagickFalse)
1061 Read X server colormap.
1063 colors=(XColor *) AcquireQuantumMemory(number_colors,sizeof(*colors));
1064 if (colors == (XColor *) NULL)
1066 ThrowXWindowException(ResourceLimitError,"MemoryAllocationFailed",
1070 for (i=0; i < (int) number_colors; i++)
1071 colors[i].pixel=(size_t) i;
1072 if (number_colors > 256)
1074 (void) XQueryColors(display,colormap,colors,(int) number_colors);
1076 min_distance=3.0*((double) QuantumRange+1.0)*((double)
1079 for (i=0; i < (int) number_colors; i++)
1081 pixel.red=colors[i].red-(double) color->red;
1082 distance=pixel.red*pixel.red;
1083 if (distance > min_distance)
1085 pixel.green=colors[i].green-(double) color->green;
1086 distance+=pixel.green*pixel.green;
1087 if (distance > min_distance)
1089 pixel.blue=colors[i].blue-(double) color->blue;
1090 distance+=pixel.blue*pixel.blue;
1091 if (distance > min_distance)
1093 min_distance=distance;
1094 color->pixel=colors[i].pixel;
1097 (void) XAllocColor(display,colormap,&colors[j]);
1098 if (query_server != MagickFalse)
1099 colors=(XColor *) RelinquishMagickMemory(colors);
1103 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1107 % X B e s t V i s u a l I n f o %
1111 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1113 % XBestVisualInfo() returns visual information for a visual that is the "best"
1114 % the server supports. "Best" is defined as:
1116 % 1. Restrict the visual list to those supported by the default screen.
1118 % 2. If a visual type is specified, restrict the visual list to those of
1121 % 3. If a map type is specified, choose the visual that matches the id
1122 % specified by the Standard Colormap.
1124 % 4 From the list of visuals, choose one that can display the most
1125 % simultaneous colors. If more than one visual can display the same
1126 % number of simultaneous colors, one is chosen based on a rank.
1128 % The format of the XBestVisualInfo method is:
1130 % XVisualInfo *XBestVisualInfo(Display *display,
1131 % XStandardColormap *map_info,XResourceInfo *resource_info)
1133 % A description of each parameter follows:
1135 % o visual_info: XBestVisualInfo returns a pointer to a X11 XVisualInfo
1138 % o display: Specifies a connection to an X server; returned from
1141 % o map_info: If map_type is specified, this structure is initialized
1142 % with info from the Standard Colormap.
1144 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
1148 static inline int MagickMax(const int x,const int y)
1155 static inline size_t MagickMin(const unsigned int x,
1156 const unsigned int y)
1163 MagickPrivate XVisualInfo *XBestVisualInfo(Display *display,
1164 XStandardColormap *map_info,XResourceInfo *resource_info)
1166 #define MaxStandardColormaps 7
1167 #define XVisualColormapSize(visual_info) MagickMin((unsigned int) (\
1168 (visual_info->klass == TrueColor) || (visual_info->klass == DirectColor) ? \
1169 visual_info->red_mask | visual_info->green_mask | visual_info->blue_mask : \
1170 (unsigned int) visual_info->colormap_size),1U << visual_info->depth)
1196 Restrict visual search by screen number.
1198 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1199 assert(display != (Display *) NULL);
1200 assert(map_info != (XStandardColormap *) NULL);
1201 assert(resource_info != (XResourceInfo *) NULL);
1202 map_type=resource_info->map_type;
1203 visual_type=resource_info->visual_type;
1204 visual_mask=VisualScreenMask;
1205 visual_template.screen=XDefaultScreen(display);
1206 visual_template.depth=XDefaultDepth(display,XDefaultScreen(display));
1208 if ((resource_info->immutable != MagickFalse) && (resource_info->colors != 0))
1209 if (resource_info->colors <= (one << (size_t) visual_template.depth))
1210 visual_mask|=VisualDepthMask;
1211 if (visual_type != (char *) NULL)
1214 Restrict visual search by class or visual id.
1216 if (LocaleCompare("staticgray",visual_type) == 0)
1218 visual_mask|=VisualClassMask;
1219 visual_template.klass=StaticGray;
1222 if (LocaleCompare("grayscale",visual_type) == 0)
1224 visual_mask|=VisualClassMask;
1225 visual_template.klass=GrayScale;
1228 if (LocaleCompare("staticcolor",visual_type) == 0)
1230 visual_mask|=VisualClassMask;
1231 visual_template.klass=StaticColor;
1234 if (LocaleCompare("pseudocolor",visual_type) == 0)
1236 visual_mask|=VisualClassMask;
1237 visual_template.klass=PseudoColor;
1240 if (LocaleCompare("truecolor",visual_type) == 0)
1242 visual_mask|=VisualClassMask;
1243 visual_template.klass=TrueColor;
1246 if (LocaleCompare("directcolor",visual_type) == 0)
1248 visual_mask|=VisualClassMask;
1249 visual_template.klass=DirectColor;
1252 if (LocaleCompare("default",visual_type) == 0)
1254 visual_mask|=VisualIDMask;
1255 visual_template.visualid=XVisualIDFromVisual(
1256 XDefaultVisual(display,XDefaultScreen(display)));
1259 if (isdigit((int) ((unsigned char) *visual_type)) != 0)
1261 visual_mask|=VisualIDMask;
1262 visual_template.visualid=
1263 strtol(visual_type,(char **) NULL,0);
1266 ThrowXWindowException(XServerError,
1267 "UnrecognizedVisualSpecifier",visual_type);
1270 Get all visuals that meet our criteria so far.
1273 visual_list=XGetVisualInfo(display,visual_mask,&visual_template,
1275 visual_mask=VisualScreenMask | VisualIDMask;
1276 if ((number_visuals == 0) || (visual_list == (XVisualInfo *) NULL))
1279 Failed to get visual; try using the default visual.
1281 ThrowXWindowException(XServerWarning,"UnableToGetVisual",visual_type);
1282 visual_template.visualid=XVisualIDFromVisual(XDefaultVisual(display,
1283 XDefaultScreen(display)));
1284 visual_list=XGetVisualInfo(display,visual_mask,&visual_template,
1286 if ((number_visuals == 0) || (visual_list == (XVisualInfo *) NULL))
1287 return((XVisualInfo *) NULL);
1288 ThrowXWindowException(XServerWarning,"UsingDefaultVisual",
1289 XVisualClassName(visual_list->klass));
1291 resource_info->color_recovery=MagickFalse;
1292 if ((map_info != (XStandardColormap *) NULL) && (map_type != (char *) NULL))
1298 map_name[MaxTextExtent];
1314 Choose a visual associated with a standard colormap.
1316 root_window=XRootWindow(display,XDefaultScreen(display));
1319 if (LocaleCompare(map_type,"list") != 0)
1322 User specified Standard Colormap.
1324 (void) FormatLocaleString((char *) map_name,MaxTextExtent,
1325 "RGB_%s_MAP",map_type);
1326 LocaleUpper(map_name);
1327 map_property=XInternAtom(display,(char *) map_name,MagickTrue);
1328 if (map_property != (Atom) NULL)
1329 status=XGetRGBColormaps(display,root_window,&map_list,&number_maps,
1335 *colormap[MaxStandardColormaps]=
1337 "_HP_RGB_SMOOTH_MAP_LIST",
1347 Choose a standard colormap from a list.
1349 for (i=0; i < MaxStandardColormaps; i++)
1351 map_property=XInternAtom(display,(char *) colormap[i],MagickTrue);
1352 if (map_property == (Atom) NULL)
1354 status=XGetRGBColormaps(display,root_window,&map_list,&number_maps,
1356 if (status != False)
1359 resource_info->color_recovery=i == 0 ? MagickTrue : MagickFalse;
1361 if (status == False)
1363 ThrowXWindowException(XServerError,"UnableToGetStandardColormap",
1365 return((XVisualInfo *) NULL);
1368 Search all Standard Colormaps and visuals for ids that match.
1370 *map_info=map_list[0];
1371 #if !defined(PRE_R4_ICCCM)
1372 visual_template.visualid=XVisualIDFromVisual(visual_list[0].visual);
1373 for (i=0; i < number_maps; i++)
1374 for (j=0; j < number_visuals; j++)
1375 if (map_list[i].visualid ==
1376 XVisualIDFromVisual(visual_list[j].visual))
1378 *map_info=map_list[i];
1379 visual_template.visualid=XVisualIDFromVisual(
1380 visual_list[j].visual);
1383 if (map_info->visualid != visual_template.visualid)
1385 ThrowXWindowException(XServerError,
1386 "UnableToMatchVisualToStandardColormap",map_type);
1387 return((XVisualInfo *) NULL);
1390 if (map_info->colormap == (Colormap) NULL)
1392 ThrowXWindowException(XServerError,"StandardColormapIsNotInitialized",
1394 return((XVisualInfo *) NULL);
1396 (void) XFree((void *) map_list);
1400 static const unsigned int
1415 Pick one visual that displays the most simultaneous colors.
1417 visual_info=visual_list;
1419 for (i=1; i < number_visuals; i++)
1422 if (XVisualColormapSize(p) > XVisualColormapSize(visual_info))
1425 if (XVisualColormapSize(p) == XVisualColormapSize(visual_info))
1426 if (rank[p->klass] > rank[visual_info->klass])
1429 visual_template.visualid=XVisualIDFromVisual(visual_info->visual);
1431 (void) XFree((void *) visual_list);
1433 Retrieve only one visual by its screen & id number.
1435 visual_info=XGetVisualInfo(display,visual_mask,&visual_template,
1437 if ((number_visuals == 0) || (visual_info == (XVisualInfo *) NULL))
1438 return((XVisualInfo *) NULL);
1439 return(visual_info);
1443 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1447 % X C h e c k D e f i n e C u r s o r %
1451 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1453 % XCheckDefineCursor() prevents cursor changes on the root window.
1455 % The format of the XXCheckDefineCursor method is:
1457 % XCheckDefineCursor(display,window,cursor)
1459 % A description of each parameter follows:
1461 % o display: Specifies a connection to an X server; returned from
1464 % o window: the window.
1466 % o cursor: the cursor.
1469 MagickPrivate int XCheckDefineCursor(Display *display,Window window,
1472 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1473 assert(display != (Display *) NULL);
1474 if (window == XRootWindow(display,XDefaultScreen(display)))
1476 return(XDefineCursor(display,window,cursor));
1480 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1484 % X C h e c k R e f r e s h W i n d o w s %
1488 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1490 % XCheckRefreshWindows() checks the X server for exposure events for a
1491 % particular window and updates the areassociated with the exposure event.
1493 % The format of the XCheckRefreshWindows method is:
1495 % void XCheckRefreshWindows(Display *display,XWindows *windows)
1497 % A description of each parameter follows:
1499 % o display: Specifies a connection to an X server; returned from
1502 % o windows: Specifies a pointer to a XWindows structure.
1505 MagickPrivate void XCheckRefreshWindows(Display *display,XWindows *windows)
1513 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1514 assert(display != (Display *) NULL);
1515 assert(windows != (XWindows *) NULL);
1516 XDelay(display,SuspendTime);
1517 id=windows->command.id;
1518 while (XCheckTypedWindowEvent(display,id,Expose,&event) != MagickFalse)
1519 (void) XCommandWidget(display,windows,(char const **) NULL,&event);
1520 id=windows->image.id;
1521 while (XCheckTypedWindowEvent(display,id,Expose,&event) != MagickFalse)
1522 XRefreshWindow(display,&windows->image,&event);
1523 XDelay(display,SuspendTime << 1);
1524 id=windows->command.id;
1525 while (XCheckTypedWindowEvent(display,id,Expose,&event) != MagickFalse)
1526 (void) XCommandWidget(display,windows,(char const **) NULL,&event);
1527 id=windows->image.id;
1528 while (XCheckTypedWindowEvent(display,id,Expose,&event) != MagickFalse)
1529 XRefreshWindow(display,&windows->image,&event);
1533 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1537 % X C l i e n t M e s s a g e %
1541 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1543 % XClientMessage() sends a reason to a window with XSendEvent. The reason is
1544 % initialized with a particular protocol type and atom.
1546 % The format of the XClientMessage function is:
1548 % XClientMessage(display,window,protocol,reason,timestamp)
1550 % A description of each parameter follows:
1552 % o display: Specifies a pointer to the Display structure; returned from
1555 % o window: Specifies a pointer to a Window structure.
1557 % o protocol: Specifies an atom value.
1559 % o reason: Specifies an atom value which is the reason to send.
1561 % o timestamp: Specifies a value of type Time.
1564 MagickPrivate void XClientMessage(Display *display,const Window window,
1565 const Atom protocol,const Atom reason,const Time timestamp)
1570 assert(display != (Display *) NULL);
1571 client_event.type=ClientMessage;
1572 client_event.window=window;
1573 client_event.message_type=protocol;
1574 client_event.format=32;
1575 client_event.data.l[0]=(long) reason;
1576 client_event.data.l[1]=(long) timestamp;
1577 (void) XSendEvent(display,window,MagickFalse,NoEventMask,(XEvent *) &client_event);
1581 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1585 + X C l i e n t W i n d o w %
1589 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1591 % XClientWindow() finds a window, at or below the specified window, which has
1592 % a WM_STATE property. If such a window is found, it is returned, otherwise
1593 % the argument window is returned.
1595 % The format of the XClientWindow function is:
1597 % client_window=XClientWindow(display,target_window)
1599 % A description of each parameter follows:
1601 % o client_window: XClientWindow returns a window, at or below the specified
1602 % window, which has a WM_STATE property otherwise the argument
1603 % target_window is returned.
1605 % o display: Specifies a pointer to the Display structure; returned from
1608 % o target_window: Specifies the window to find a WM_STATE property.
1611 static Window XClientWindow(Display *display,Window target_window)
1633 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1634 assert(display != (Display *) NULL);
1635 state=XInternAtom(display,"WM_STATE",MagickTrue);
1636 if (state == (Atom) NULL)
1637 return(target_window);
1639 status=XGetWindowProperty(display,target_window,state,0L,0L,MagickFalse,
1640 (Atom) AnyPropertyType,&type,&format,&number_items,&after,&data);
1641 if ((status == Success) && (type != (Atom) NULL))
1642 return(target_window);
1643 client_window=XWindowByProperty(display,target_window,state);
1644 if (client_window == (Window) NULL)
1645 return(target_window);
1646 return(client_window);
1650 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1654 + X C o m p o n e n t T e r m i n u s %
1658 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1660 % XComponentTerminus() destroys the module component.
1662 % The format of the XComponentTerminus method is:
1664 % XComponentTerminus(void)
1667 MagickPrivate void XComponentTerminus(void)
1669 DestroyXResources();
1673 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1677 % X C o n f i g u r e I m a g e C o l o r m a p %
1681 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1683 % XConfigureImageColormap() creates a new X colormap.
1685 % The format of the XConfigureImageColormap method is:
1687 % void XConfigureImageColormap(Display *display,
1688 % XResourceInfo *resource_info,XWindows *windows,Image *image,
1689 % ExceptionInfo *exception)
1691 % A description of each parameter follows:
1693 % o display: Specifies a connection to an X server; returned from
1696 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
1698 % o windows: Specifies a pointer to a XWindows structure.
1700 % o image: the image.
1702 % o exception: return any errors or warnings in this structure.
1705 MagickPrivate void XConfigureImageColormap(Display *display,
1706 XResourceInfo *resource_info,XWindows *windows,Image *image,
1707 ExceptionInfo *exception)
1713 Make standard colormap.
1715 XSetCursorState(display,windows,MagickTrue);
1716 XCheckRefreshWindows(display,windows);
1717 XMakeStandardColormap(display,windows->visual_info,resource_info,image,
1718 windows->map_info,windows->pixel_info,exception);
1719 colormap=windows->map_info->colormap;
1720 (void) XSetWindowColormap(display,windows->image.id,colormap);
1721 (void) XSetWindowColormap(display,windows->command.id,colormap);
1722 (void) XSetWindowColormap(display,windows->widget.id,colormap);
1723 if (windows->magnify.mapped != MagickFalse)
1724 (void) XSetWindowColormap(display,windows->magnify.id,colormap);
1725 if (windows->pan.mapped != MagickFalse)
1726 (void) XSetWindowColormap(display,windows->pan.id,colormap);
1727 XSetCursorState(display,windows,MagickFalse);
1728 XClientMessage(display,windows->image.id,windows->im_protocols,
1729 windows->im_update_colormap,CurrentTime);
1733 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1737 % X C o n s t r a i n W i n d o w P o s i t i o n %
1741 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1743 % XConstrainWindowPosition() assures a window is positioned within the X
1744 % server boundaries.
1746 % The format of the XConstrainWindowPosition method is:
1748 % void XConstrainWindowPosition(Display *display,XWindowInfo *window_info)
1750 % A description of each parameter follows:
1752 % o display: Specifies a pointer to the Display structure; returned from
1755 % o window_info: Specifies a pointer to a XWindowInfo structure.
1758 MagickPrivate void XConstrainWindowPosition(Display *display,
1759 XWindowInfo *window_info)
1764 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1765 assert(display != (Display *) NULL);
1766 assert(window_info != (XWindowInfo *) NULL);
1767 limit=XDisplayWidth(display,window_info->screen)-window_info->width;
1768 if (window_info->x < 0)
1771 if (window_info->x > (int) limit)
1772 window_info->x=(int) limit;
1773 limit=XDisplayHeight(display,window_info->screen)-window_info->height;
1774 if (window_info->y < 0)
1777 if (window_info->y > limit)
1778 window_info->y=limit;
1782 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1790 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1792 % XDelay() suspends program execution for the number of milliseconds
1795 % The format of the Delay method is:
1797 % void XDelay(Display *display,const size_t milliseconds)
1799 % A description of each parameter follows:
1801 % o display: Specifies a pointer to the Display structure; returned from
1804 % o milliseconds: Specifies the number of milliseconds to delay before
1808 MagickPrivate void XDelay(Display *display,const size_t milliseconds)
1810 assert(display != (Display *) NULL);
1811 (void) XFlush(display);
1812 MagickDelay(milliseconds);
1816 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1820 % X D e s t r o y R e s o u r c e I n f o %
1824 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1826 % XDestroyResourceInfo() frees memory associated with the XResourceInfo
1829 % The format of the XDestroyResourceInfo method is:
1831 % void XDestroyResourceInfo(XResourceInfo *resource_info)
1833 % A description of each parameter follows:
1835 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
1838 MagickExport void XDestroyResourceInfo(XResourceInfo *resource_info)
1840 if (resource_info->image_geometry != (char *) NULL)
1841 resource_info->image_geometry=(char *)
1842 RelinquishMagickMemory(resource_info->image_geometry);
1843 if (resource_info->quantize_info != (QuantizeInfo *) NULL)
1844 resource_info->quantize_info=DestroyQuantizeInfo(
1845 resource_info->quantize_info);
1846 if (resource_info->client_name != (char *) NULL)
1847 resource_info->client_name=(char *)
1848 RelinquishMagickMemory(resource_info->client_name);
1849 if (resource_info->name != (char *) NULL)
1850 resource_info->name=DestroyString(resource_info->name);
1851 (void) ResetMagickMemory(resource_info,0,sizeof(*resource_info));
1855 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1859 % X D e s t r o y W i n d o w C o l o r s %
1863 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1865 % XDestroyWindowColors() frees X11 color resources previously saved on a
1866 % window by XRetainWindowColors or programs like xsetroot.
1868 % The format of the XDestroyWindowColors method is:
1870 % void XDestroyWindowColors(Display *display,Window window)
1872 % A description of each parameter follows:
1874 % o display: Specifies a connection to an X server; returned from
1877 % o window: Specifies a pointer to a Window structure.
1880 MagickPrivate void XDestroyWindowColors(Display *display,Window window)
1900 If there are previous resources on the root window, destroy them.
1902 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1903 assert(display != (Display *) NULL);
1904 property=XInternAtom(display,"_XSETROOT_ID",MagickFalse);
1905 if (property == (Atom) NULL)
1907 ThrowXWindowException(XServerError,"UnableToCreateProperty",
1911 status=XGetWindowProperty(display,window,property,0L,1L,MagickTrue,
1912 (Atom) AnyPropertyType,&type,&format,&length,&after,&data);
1913 if (status != Success)
1915 if ((type == XA_PIXMAP) && (format == 32) && (length == 1) && (after == 0))
1917 (void) XKillClient(display,(XID) (*((Pixmap *) data)));
1918 (void) XDeleteProperty(display,window,property);
1921 (void) XFree((void *) data);
1925 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1929 % X D i s p l a y I m a g e I n f o %
1933 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1935 % XDisplayImageInfo() displays information about an X image.
1937 % The format of the XDisplayImageInfo method is:
1939 % void XDisplayImageInfo(Display *display,
1940 % const XResourceInfo *resource_info,XWindows *windows,Image *undo_image,
1941 % Image *image,ExceptionInfo *exception)
1943 % A description of each parameter follows:
1945 % o display: Specifies a connection to an X server; returned from
1948 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
1950 % o windows: Specifies a pointer to a XWindows structure.
1952 % o undo_image: the undo image.
1954 % o image: the image.
1956 % o exception: return any errors or warnings in this structure.
1959 MagickPrivate void XDisplayImageInfo(Display *display,
1960 const XResourceInfo *resource_info,XWindows *windows,Image *undo_image,
1961 Image *image,ExceptionInfo *exception)
1964 filename[MaxTextExtent],
1987 Write info about the X server to a file.
1989 assert(display != (Display *) NULL);
1990 assert(resource_info != (XResourceInfo *) NULL);
1991 assert(windows != (XWindows *) NULL);
1992 assert(image != (Image *) NULL);
1994 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
1996 unique_file=AcquireUniqueFileResource(filename);
1997 if (unique_file != -1)
1998 file=fdopen(unique_file,"w");
1999 if ((unique_file == -1) || (file == (FILE *) NULL))
2001 XNoticeWidget(display,windows,"Unable to display image info",filename);
2004 if (resource_info->gamma_correct != MagickFalse)
2005 if (resource_info->display_gamma != (char *) NULL)
2006 (void) FormatLocaleFile(file,"Display\n gamma: %s\n\n",
2007 resource_info->display_gamma);
2009 Write info about the X image to a file.
2011 (void) FormatLocaleFile(file,"X\n visual: %s\n",
2012 XVisualClassName((int) windows->image.storage_class));
2013 (void) FormatLocaleFile(file," depth: %d\n",windows->image.ximage->depth);
2014 if (windows->visual_info->colormap_size != 0)
2015 (void) FormatLocaleFile(file," colormap size: %d\n",
2016 windows->visual_info->colormap_size);
2017 if (resource_info->colormap== SharedColormap)
2018 (void) FormatLocaleFile(file," colormap type: Shared\n");
2020 (void) FormatLocaleFile(file," colormap type: Private\n");
2021 (void) FormatLocaleFile(file," geometry: %dx%d\n",
2022 windows->image.ximage->width,windows->image.ximage->height);
2023 if (windows->image.crop_geometry != (char *) NULL)
2024 (void) FormatLocaleFile(file," crop geometry: %s\n",
2025 windows->image.crop_geometry);
2026 if (windows->image.pixmap == (Pixmap) NULL)
2027 (void) FormatLocaleFile(file," type: X Image\n");
2029 (void) FormatLocaleFile(file," type: Pixmap\n");
2030 if (windows->image.shape != MagickFalse)
2031 (void) FormatLocaleFile(file," non-rectangular shape: True\n");
2033 (void) FormatLocaleFile(file," non-rectangular shape: False\n");
2034 if (windows->image.shared_memory != MagickFalse)
2035 (void) FormatLocaleFile(file," shared memory: True\n");
2037 (void) FormatLocaleFile(file," shared memory: False\n");
2038 (void) FormatLocaleFile(file,"\n");
2039 if (resource_info->font != (char *) NULL)
2040 (void) FormatLocaleFile(file,"Font: %s\n\n",resource_info->font);
2041 if (resource_info->text_font != (char *) NULL)
2042 (void) FormatLocaleFile(file,"Text font: %s\n\n",resource_info->text_font);
2044 Write info about the undo cache to a file.
2047 for (levels=0; undo_image != (Image *) NULL; levels++)
2049 number_pixels=undo_image->list->columns*undo_image->list->rows;
2050 bytes+=number_pixels*sizeof(PixelInfo);
2051 undo_image=GetPreviousImageInList(undo_image);
2053 (void) FormatLocaleFile(file,"Undo Edit Cache\n levels: %u\n",levels);
2054 (void) FormatLocaleFile(file," bytes: %.20gmb\n",(double)
2055 ((bytes+(1 << 19)) >> 20));
2056 (void) FormatLocaleFile(file," limit: %.20gmb\n\n",(double)
2057 resource_info->undo_cache);
2059 Write info about the image to a file.
2061 (void) IdentifyImage(image,file,MagickTrue,exception);
2062 (void) fclose(file);
2063 text=FileToString(filename,~0UL,exception);
2064 (void) RelinquishUniqueFileResource(filename);
2065 if (text == (char *) NULL)
2067 XNoticeWidget(display,windows,"MemoryAllocationFailed",
2068 "UnableToDisplayImageInfo");
2071 textlist=StringToList(text);
2072 if (textlist != (char **) NULL)
2075 title[MaxTextExtent];
2078 Display information about the image in the Text View widget.
2080 (void) XWithdrawWindow(display,windows->info.id,windows->info.screen);
2081 (void) FormatLocaleString(title,MaxTextExtent,"Image Info: %s",
2083 XTextViewWidget(display,resource_info,windows,MagickTrue,title,
2084 (char const **) textlist);
2085 for (i=0; textlist[i] != (char *) NULL; i++)
2086 textlist[i]=DestroyString(textlist[i]);
2087 textlist=(char **) RelinquishMagickMemory(textlist);
2089 text=DestroyString(text);
2093 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2097 + X D i t h e r I m a g e %
2101 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2103 % XDitherImage() dithers the reference image as required by the HP Color
2104 % Recovery algorithm. The color values are quantized to 3 bits of red and
2105 % green, and 2 bits of blue (3/3/2) and can be used as indices into a 8-bit X
2106 % standard colormap.
2108 % The format of the XDitherImage method is:
2110 % void XDitherImage(Image *image,XImage *ximage,ExceptionInfo *exception)
2112 % A description of each parameter follows:
2114 % o image: the image.
2116 % o ximage: Specifies a pointer to a XImage structure; returned from
2119 % o exception: return any errors or warnings in this structure.
2122 static void XDitherImage(Image *image,XImage *ximage,ExceptionInfo *exception)
2124 static const short int
2127 {-16, 4, -1, 11,-14, 6, -3, 9,-15, 5, -2, 10,-13, 7, -4, 8},
2128 { 15, -5, 0,-12, 13, -7, 2,-10, 14, -6, 1,-11, 12, -8, 3, -9}
2130 dither_green[2][16]=
2132 { 11,-15, 7, -3, 8,-14, 4, -2, 10,-16, 6, -4, 9,-13, 5, -1},
2133 {-12, 14, -8, 2, -9, 13, -5, 1,-11, 15, -7, 3,-10, 12, -6, 0}
2137 { -3, 9,-13, 7, -1, 11,-15, 5, -4, 8,-14, 6, -2, 10,-16, 4},
2138 { 2,-10, 12, -8, 0,-12, 14, -6, 3, -9, 13, -7, 1,-11, 15, -5}
2154 register const Quantum
2174 Allocate and initialize dither maps.
2176 for (i=0; i < 2; i++)
2177 for (j=0; j < 16; j++)
2179 red_map[i][j]=(unsigned char *) AcquireQuantumMemory(256UL,
2181 green_map[i][j]=(unsigned char *) AcquireQuantumMemory(256UL,
2182 sizeof(*green_map));
2183 blue_map[i][j]=(unsigned char *) AcquireQuantumMemory(256UL,
2185 if ((red_map[i][j] == (unsigned char *) NULL) ||
2186 (green_map[i][j] == (unsigned char *) NULL) ||
2187 (blue_map[i][j] == (unsigned char *) NULL))
2189 ThrowXWindowException(ResourceLimitError,"MemoryAllocationFailed",
2195 Initialize dither tables.
2197 for (i=0; i < 2; i++)
2198 for (j=0; j < 16; j++)
2199 for (x=0; x < 256; x++)
2204 value+=dither_red[i][j];
2205 red_map[i][j][x]=(unsigned char)
2206 ((value < 0) ? 0 : (value > 255) ? 255 : value);
2210 value+=dither_green[i][j];
2211 green_map[i][j][x]=(unsigned char)
2212 ((value < 0) ? 0 : (value > 255) ? 255 : value);
2216 value+=((size_t) dither_blue[i][j] << 1);
2217 blue_map[i][j][x]=(unsigned char)
2218 ((value < 0) ? 0 : (value > 255) ? 255 : value);
2223 scanline_pad=(unsigned int) (ximage->bytes_per_line-
2224 ((size_t) (ximage->width*ximage->bits_per_pixel) >> 3));
2228 image_view=AcquireVirtualCacheView(image,exception);
2229 for (y=0; y < (int) image->rows; y++)
2231 p=GetCacheViewVirtualPixels(image_view,0,(ssize_t) y,image->columns,1,
2233 if (p == (const Quantum *) NULL)
2235 for (x=0; x < (int) image->columns; x++)
2237 color.red=(double) ClampToQuantum((double) (red_map[i][j][
2238 (int) ScaleQuantumToChar(GetPixelRed(image,p))] << 8));
2239 color.green=(double) ClampToQuantum((double) (green_map[i][j][
2240 (int) ScaleQuantumToChar(GetPixelGreen(image,p))] << 8));
2241 color.blue=(double) ClampToQuantum((double) (blue_map[i][j][
2242 (int) ScaleQuantumToChar(GetPixelBlue(image,p))] << 8));
2243 pixel=(size_t) (((size_t) color.red & 0xe0) |
2244 (((size_t) color.green & 0xe0) >> 3) |
2245 (((size_t) color.blue & 0xc0) >> 6));
2247 p+=GetPixelChannels(image);
2257 image_view=DestroyCacheView(image_view);
2259 Free allocated memory.
2261 for (i=0; i < 2; i++)
2262 for (j=0; j < 16; j++)
2264 green_map[i][j]=(unsigned char *) RelinquishMagickMemory(green_map[i][j]);
2265 blue_map[i][j]=(unsigned char *) RelinquishMagickMemory(blue_map[i][j]);
2266 red_map[i][j]=(unsigned char *) RelinquishMagickMemory(red_map[i][j]);
2271 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2275 % X D r a w I m a g e %
2279 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2281 % XDrawImage() draws a line on the image.
2283 % The format of the XDrawImage method is:
2285 % MagickBooleanType XDrawImage(Display *display,const XPixelInfo *pixel,
2286 % XDrawInfo *draw_info,Image *image,ExceptionInfo *exception)
2288 % A description of each parameter follows:
2290 % o display: Specifies a connection to an X server; returned from
2293 % o pixel: Specifies a pointer to a XPixelInfo structure.
2295 % o draw_info: Specifies a pointer to a XDrawInfo structure.
2297 % o image: the image.
2299 % o exception: return any errors or warnings in this structure.
2302 MagickPrivate MagickBooleanType XDrawImage(Display *display,
2303 const XPixelInfo *pixel,XDrawInfo *draw_info,Image *image,
2304 ExceptionInfo *exception)
2340 Initialize drawd image.
2342 assert(display != (Display *) NULL);
2343 assert(pixel != (XPixelInfo *) NULL);
2344 assert(draw_info != (XDrawInfo *) NULL);
2345 assert(image != (Image *) NULL);
2346 if (image->debug != MagickFalse)
2347 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
2349 Initialize drawd pixmap.
2351 root_window=XRootWindow(display,XDefaultScreen(display));
2352 depth=(unsigned int) XDefaultDepth(display,XDefaultScreen(display));
2353 draw_pixmap=XCreatePixmap(display,root_window,draw_info->width,
2354 draw_info->height,depth);
2355 if (draw_pixmap == (Pixmap) NULL)
2356 return(MagickFalse);
2358 Initialize graphics info.
2360 context_values.background=(size_t) (~0);
2361 context_values.foreground=0;
2362 context_values.line_width=(int) draw_info->line_width;
2363 draw_context=XCreateGC(display,root_window,(size_t)
2364 (GCBackground | GCForeground | GCLineWidth),&context_values);
2365 if (draw_context == (GC) NULL)
2366 return(MagickFalse);
2370 (void) XFillRectangle(display,draw_pixmap,draw_context,0,0,draw_info->width,
2373 Draw line to pixmap.
2375 (void) XSetBackground(display,draw_context,0);
2376 (void) XSetForeground(display,draw_context,(size_t) (~0));
2377 if (draw_info->stipple != (Pixmap) NULL)
2379 (void) XSetFillStyle(display,draw_context,FillOpaqueStippled);
2380 (void) XSetStipple(display,draw_context,draw_info->stipple);
2382 switch (draw_info->element)
2387 (void) XDrawLines(display,draw_pixmap,draw_context,
2388 draw_info->coordinate_info,(int) draw_info->number_coordinates,
2394 (void) XDrawLine(display,draw_pixmap,draw_context,draw_info->line_info.x1,
2395 draw_info->line_info.y1,draw_info->line_info.x2,
2396 draw_info->line_info.y2);
2399 case RectangleElement:
2401 (void) XDrawRectangle(display,draw_pixmap,draw_context,
2402 (int) draw_info->rectangle_info.x,(int) draw_info->rectangle_info.y,
2403 (unsigned int) draw_info->rectangle_info.width,
2404 (unsigned int) draw_info->rectangle_info.height);
2407 case FillRectangleElement:
2409 (void) XFillRectangle(display,draw_pixmap,draw_context,
2410 (int) draw_info->rectangle_info.x,(int) draw_info->rectangle_info.y,
2411 (unsigned int) draw_info->rectangle_info.width,
2412 (unsigned int) draw_info->rectangle_info.height);
2416 case EllipseElement:
2418 (void) XDrawArc(display,draw_pixmap,draw_context,
2419 (int) draw_info->rectangle_info.x,(int) draw_info->rectangle_info.y,
2420 (unsigned int) draw_info->rectangle_info.width,
2421 (unsigned int) draw_info->rectangle_info.height,0,360*64);
2424 case FillCircleElement:
2425 case FillEllipseElement:
2427 (void) XFillArc(display,draw_pixmap,draw_context,
2428 (int) draw_info->rectangle_info.x,(int) draw_info->rectangle_info.y,
2429 (unsigned int) draw_info->rectangle_info.width,
2430 (unsigned int) draw_info->rectangle_info.height,0,360*64);
2433 case PolygonElement:
2438 coordinate_info=draw_info->coordinate_info;
2439 (void) XDrawLines(display,draw_pixmap,draw_context,coordinate_info,
2440 (int) draw_info->number_coordinates,CoordModeOrigin);
2441 (void) XDrawLine(display,draw_pixmap,draw_context,
2442 coordinate_info[draw_info->number_coordinates-1].x,
2443 coordinate_info[draw_info->number_coordinates-1].y,
2444 coordinate_info[0].x,coordinate_info[0].y);
2447 case FillPolygonElement:
2449 (void) XFillPolygon(display,draw_pixmap,draw_context,
2450 draw_info->coordinate_info,(int) draw_info->number_coordinates,Complex,
2455 (void) XFreeGC(display,draw_context);
2459 draw_ximage=XGetImage(display,draw_pixmap,0,0,draw_info->width,
2460 draw_info->height,AllPlanes,ZPixmap);
2461 if (draw_ximage == (XImage *) NULL)
2462 return(MagickFalse);
2463 (void) XFreePixmap(display,draw_pixmap);
2465 Initialize draw image.
2467 draw_image=AcquireImage((ImageInfo *) NULL,exception);
2468 if (draw_image == (Image *) NULL)
2469 return(MagickFalse);
2470 draw_image->columns=draw_info->width;
2471 draw_image->rows=draw_info->height;
2473 Transfer drawn X image to image.
2475 width=(unsigned int) image->columns;
2476 height=(unsigned int) image->rows;
2479 (void) XParseGeometry(draw_info->geometry,&x,&y,&width,&height);
2480 (void) GetOneVirtualPixelInfo(image,UndefinedVirtualPixelMethod,(ssize_t) x,
2481 (ssize_t) y,&draw_image->background_color,exception);
2482 if (SetImageStorageClass(draw_image,DirectClass,exception) == MagickFalse)
2483 return(MagickFalse);
2484 draw_image->alpha_trait=BlendPixelTrait;
2485 draw_view=AcquireAuthenticCacheView(draw_image,exception);
2486 for (y=0; y < (int) draw_image->rows; y++)
2494 q=QueueCacheViewAuthenticPixels(draw_view,0,(ssize_t) y,draw_image->columns,
2496 if (q == (Quantum *) NULL)
2498 for (x=0; x < (int) draw_image->columns; x++)
2500 if (XGetPixel(draw_ximage,x,y) == 0)
2503 Set this pixel to the background color.
2505 SetPixelInfoPixel(draw_image,&draw_image->background_color,q);
2506 SetPixelAlpha(draw_image,(Quantum) (draw_info->stencil ==
2507 OpaqueStencil ? TransparentAlpha : OpaqueAlpha),q);
2512 Set this pixel to the pen color.
2514 SetPixelRed(draw_image,ScaleShortToQuantum(
2515 pixel->pen_color.red),q);
2516 SetPixelGreen(draw_image,ScaleShortToQuantum(
2517 pixel->pen_color.green),q);
2518 SetPixelBlue(draw_image,ScaleShortToQuantum(
2519 pixel->pen_color.blue),q);
2520 SetPixelAlpha(draw_image,(Quantum) (draw_info->stencil ==
2521 OpaqueStencil ? OpaqueAlpha : TransparentAlpha),q);
2523 q+=GetPixelChannels(draw_image);
2525 if (SyncCacheViewAuthenticPixels(draw_view,exception) == MagickFalse)
2528 draw_view=DestroyCacheView(draw_view);
2529 XDestroyImage(draw_ximage);
2531 Determine draw geometry.
2533 (void) XParseGeometry(draw_info->geometry,&x,&y,&width,&height);
2534 if ((width != (unsigned int) draw_image->columns) ||
2535 (height != (unsigned int) draw_image->rows))
2538 image_geometry[MaxTextExtent];
2543 (void) FormatLocaleString(image_geometry,MaxTextExtent,"%ux%u",
2545 (void) TransformImage(&draw_image,(char *) NULL,image_geometry,
2548 if (draw_info->degrees != 0.0)
2562 rotate_image=RotateImage(draw_image,draw_info->degrees,exception);
2563 if (rotate_image == (Image *) NULL)
2564 return(MagickFalse);
2565 draw_image=DestroyImage(draw_image);
2566 draw_image=rotate_image;
2568 Annotation is relative to the degree of rotation.
2570 normalized_degrees=draw_info->degrees;
2571 while (normalized_degrees < -45.0)
2572 normalized_degrees+=360.0;
2573 for (rotations=0; normalized_degrees > 45.0; rotations++)
2574 normalized_degrees-=90.0;
2575 switch (rotations % 4)
2585 x=x-(int) draw_image->columns/2;
2586 y=y+(int) draw_image->columns/2;
2594 x=x-(int) draw_image->columns;
2602 x=x-(int) draw_image->columns/2;
2603 y=y-(int) (draw_image->rows-(draw_image->columns/2));
2609 Composite text onto the image.
2611 draw_view=AcquireAuthenticCacheView(draw_image,exception);
2612 for (y=0; y < (int) draw_image->rows; y++)
2620 q=GetCacheViewAuthenticPixels(draw_view,0,(ssize_t) y,draw_image->columns,1,
2622 if (q == (Quantum *) NULL)
2624 for (x=0; x < (int) draw_image->columns; x++)
2626 if (GetPixelAlpha(image,q) != TransparentAlpha)
2627 SetPixelAlpha(draw_image,OpaqueAlpha,q);
2628 q+=GetPixelChannels(draw_image);
2630 if (SyncCacheViewAuthenticPixels(draw_view,exception) == MagickFalse)
2633 draw_view=DestroyCacheView(draw_view);
2634 (void) XParseGeometry(draw_info->geometry,&x,&y,&width,&height);
2635 if (draw_info->stencil == TransparentStencil)
2636 (void) CompositeImage(image,draw_image,CopyAlphaCompositeOp,MagickTrue,
2637 (ssize_t) x,(ssize_t) y,exception);
2640 alpha_trait=image->alpha_trait;
2641 (void) CompositeImage(image,draw_image,OverCompositeOp,MagickTrue,
2642 (ssize_t) x,(ssize_t) y,exception);
2643 image->alpha_trait=alpha_trait;
2645 draw_image=DestroyImage(draw_image);
2650 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2658 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2660 % XError() ignores BadWindow errors for XQueryTree and XGetWindowAttributes,
2661 % and ignores BadDrawable errors for XGetGeometry, and ignores BadValue errors
2662 % for XQueryColor. It returns MagickFalse in those cases. Otherwise it
2665 % The format of the XError function is:
2667 % int XError(display,error)
2669 % A description of each parameter follows:
2671 % o display: Specifies a pointer to the Display structure; returned from
2674 % o error: Specifies the error event.
2678 #if defined(__cplusplus) || defined(c_plusplus)
2682 MagickExport int XError(Display *display,XErrorEvent *error)
2684 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
2685 assert(display != (Display *) NULL);
2686 assert(error != (XErrorEvent *) NULL);
2687 xerror_alert=MagickTrue;
2688 switch (error->request_code)
2692 if ((int) error->error_code == BadDrawable)
2693 return(MagickFalse);
2696 case X_GetWindowAttributes:
2699 if ((int) error->error_code == BadWindow)
2700 return(MagickFalse);
2705 if ((int) error->error_code == BadValue)
2706 return(MagickFalse);
2713 #if defined(__cplusplus) || defined(c_plusplus)
2718 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2722 % X F r e e R e s o u r c e s %
2726 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2728 % XFreeResources() frees X11 resources.
2730 % The format of the XFreeResources method is:
2732 % void XFreeResources(Display *display,XVisualInfo *visual_info,
2733 % XStandardColormap *map_info,XPixelInfo *pixel,XFontStruct *font_info,
2734 % XResourceInfo *resource_info,XWindowInfo *window_info)
2735 % resource_info,window_info)
2737 % A description of each parameter follows:
2739 % o display: Specifies a connection to an X server; returned from
2742 % o visual_info: Specifies a pointer to a X11 XVisualInfo structure;
2743 % returned from XGetVisualInfo.
2745 % o map_info: If map_type is specified, this structure is initialized
2746 % with info from the Standard Colormap.
2748 % o pixel: Specifies a pointer to a XPixelInfo structure.
2750 % o font_info: Specifies a pointer to a XFontStruct structure.
2752 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
2754 % o window_info: Specifies a pointer to a X11 XWindowInfo structure.
2757 MagickPrivate void XFreeResources(Display *display,XVisualInfo *visual_info,
2758 XStandardColormap *map_info,XPixelInfo *pixel,XFontStruct *font_info,
2759 XResourceInfo *resource_info,XWindowInfo *window_info)
2761 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
2762 assert(display != (Display *) NULL);
2763 assert(resource_info != (XResourceInfo *) NULL);
2764 if (window_info != (XWindowInfo *) NULL)
2769 if (window_info->ximage != (XImage *) NULL)
2770 XDestroyImage(window_info->ximage);
2771 if (window_info->id != (Window) NULL)
2774 Free destroy window and free cursors.
2776 if (window_info->id != XRootWindow(display,visual_info->screen))
2777 (void) XDestroyWindow(display,window_info->id);
2778 if (window_info->annotate_context != (GC) NULL)
2779 (void) XFreeGC(display,window_info->annotate_context);
2780 if (window_info->highlight_context != (GC) NULL)
2781 (void) XFreeGC(display,window_info->highlight_context);
2782 if (window_info->widget_context != (GC) NULL)
2783 (void) XFreeGC(display,window_info->widget_context);
2784 if (window_info->cursor != (Cursor) NULL)
2785 (void) XFreeCursor(display,window_info->cursor);
2786 window_info->cursor=(Cursor) NULL;
2787 if (window_info->busy_cursor != (Cursor) NULL)
2788 (void) XFreeCursor(display,window_info->busy_cursor);
2789 window_info->busy_cursor=(Cursor) NULL;
2795 if (font_info != (XFontStruct *) NULL)
2797 (void) XFreeFont(display,font_info);
2798 font_info=(XFontStruct *) NULL;
2800 if (map_info != (XStandardColormap *) NULL)
2803 Free X Standard Colormap.
2805 if (resource_info->map_type == (char *) NULL)
2806 (void) XFreeStandardColormap(display,visual_info,map_info,pixel);
2807 (void) XFree((void *) map_info);
2812 if (visual_info != (XVisualInfo *) NULL)
2813 (void) XFree((void *) visual_info);
2814 if (resource_info->close_server != MagickFalse)
2815 (void) XCloseDisplay(display);
2819 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2823 % X F r e e S t a n d a r d C o l o r m a p %
2827 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2829 % XFreeStandardColormap() frees an X11 colormap.
2831 % The format of the XFreeStandardColormap method is:
2833 % void XFreeStandardColormap(Display *display,
2834 % const XVisualInfo *visual_info,XStandardColormap *map_info,
2835 % XPixelInfo *pixel)
2837 % A description of each parameter follows:
2839 % o display: Specifies a connection to an X server; returned from
2842 % o visual_info: Specifies a pointer to a X11 XVisualInfo structure;
2843 % returned from XGetVisualInfo.
2845 % o map_info: If map_type is specified, this structure is initialized
2846 % with info from the Standard Colormap.
2848 % o pixel: Specifies a pointer to a XPixelInfo structure.
2851 MagickPrivate void XFreeStandardColormap(Display *display,
2852 const XVisualInfo *visual_info,XStandardColormap *map_info,XPixelInfo *pixel)
2857 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
2858 assert(display != (Display *) NULL);
2859 assert(visual_info != (XVisualInfo *) NULL);
2860 assert(map_info != (XStandardColormap *) NULL);
2861 (void) XFlush(display);
2862 if (map_info->colormap != (Colormap) NULL)
2864 if (map_info->colormap != XDefaultColormap(display,visual_info->screen))
2865 (void) XFreeColormap(display,map_info->colormap);
2867 if (pixel != (XPixelInfo *) NULL)
2868 if ((visual_info->klass != TrueColor) &&
2869 (visual_info->klass != DirectColor))
2870 (void) XFreeColors(display,map_info->colormap,pixel->pixels,
2871 (int) pixel->colors,0);
2873 map_info->colormap=(Colormap) NULL;
2874 if (pixel != (XPixelInfo *) NULL)
2876 if (pixel->pixels != (unsigned long *) NULL)
2877 pixel->pixels=(unsigned long *) RelinquishMagickMemory(pixel->pixels);
2878 pixel->pixels=(unsigned long *) NULL;
2883 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2887 % X G e t A n n o t a t e I n f o %
2891 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2893 % XGetAnnotateInfo() initializes the AnnotateInfo structure.
2895 % The format of the XGetAnnotateInfo method is:
2897 % void XGetAnnotateInfo(XAnnotateInfo *annotate_info)
2899 % A description of each parameter follows:
2901 % o annotate_info: Specifies a pointer to a XAnnotateInfo structure.
2904 MagickPrivate void XGetAnnotateInfo(XAnnotateInfo *annotate_info)
2907 Initialize annotate structure.
2909 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
2910 assert(annotate_info != (XAnnotateInfo *) NULL);
2913 annotate_info->width=0;
2914 annotate_info->height=0;
2915 annotate_info->stencil=ForegroundStencil;
2916 annotate_info->degrees=0.0;
2917 annotate_info->font_info=(XFontStruct *) NULL;
2918 annotate_info->text=(char *) NULL;
2919 *annotate_info->geometry='\0';
2920 annotate_info->previous=(XAnnotateInfo *) NULL;
2921 annotate_info->next=(XAnnotateInfo *) NULL;
2922 (void) XSupportsLocale();
2923 (void) XSetLocaleModifiers("");
2927 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2931 % X G e t M a p I n f o %
2935 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2937 % XGetMapInfo() initializes the XStandardColormap structure.
2939 % The format of the XStandardColormap method is:
2941 % void XGetMapInfo(const XVisualInfo *visual_info,const Colormap colormap,
2942 % XStandardColormap *map_info)
2944 % A description of each parameter follows:
2946 % o colormap: Specifies the ID of the X server colormap.
2948 % o visual_info: Specifies a pointer to a X11 XVisualInfo structure;
2949 % returned from XGetVisualInfo.
2951 % o map_info: Specifies a pointer to a X11 XStandardColormap structure.
2954 MagickPrivate void XGetMapInfo(const XVisualInfo *visual_info,
2955 const Colormap colormap,XStandardColormap *map_info)
2958 Initialize map info.
2960 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
2961 assert(visual_info != (XVisualInfo *) NULL);
2962 assert(map_info != (XStandardColormap *) NULL);
2963 map_info->colormap=colormap;
2964 map_info->red_max=visual_info->red_mask;
2965 map_info->red_mult=(size_t) (map_info->red_max != 0 ? 1 : 0);
2966 if (map_info->red_max != 0)
2967 while ((map_info->red_max & 0x01) == 0)
2969 map_info->red_max>>=1;
2970 map_info->red_mult<<=1;
2972 map_info->green_max=visual_info->green_mask;
2973 map_info->green_mult=(size_t) (map_info->green_max != 0 ? 1 : 0);
2974 if (map_info->green_max != 0)
2975 while ((map_info->green_max & 0x01) == 0)
2977 map_info->green_max>>=1;
2978 map_info->green_mult<<=1;
2980 map_info->blue_max=visual_info->blue_mask;
2981 map_info->blue_mult=(size_t) (map_info->blue_max != 0 ? 1 : 0);
2982 if (map_info->blue_max != 0)
2983 while ((map_info->blue_max & 0x01) == 0)
2985 map_info->blue_max>>=1;
2986 map_info->blue_mult<<=1;
2988 map_info->base_pixel=0;
2992 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2996 % X G e t P i x e l I n f o %
3000 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3002 % XGetPixelInfo() initializes the PixelInfo structure.
3004 % The format of the XGetPixelInfo method is:
3006 % void XGetPixelInfo(Display *display,const XVisualInfo *visual_info,
3007 % const XStandardColormap *map_info,const XResourceInfo *resource_info,
3008 % Image *image,XPixelInfo *pixel)
3011 % A description of each parameter follows:
3013 % o display: Specifies a connection to an X server; returned from
3016 % o visual_info: Specifies a pointer to a X11 XVisualInfo structure;
3017 % returned from XGetVisualInfo.
3019 % o map_info: If map_type is specified, this structure is initialized
3020 % with info from the Standard Colormap.
3022 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
3024 % o image: the image.
3026 % o pixel: Specifies a pointer to a XPixelInfo structure.
3029 MagickPrivate void XGetPixelInfo(Display *display,
3030 const XVisualInfo *visual_info,const XStandardColormap *map_info,
3031 const XResourceInfo *resource_info,Image *image,XPixelInfo *pixel)
3034 *PenColors[MaxNumberPens]=
3036 "#000000000000", /* black */
3037 "#00000000ffff", /* blue */
3038 "#0000ffffffff", /* cyan */
3039 "#0000ffff0000", /* green */
3040 "#bdbdbdbdbdbd", /* gray */
3041 "#ffff00000000", /* red */
3042 "#ffff0000ffff", /* magenta */
3043 "#ffffffff0000", /* yellow */
3044 "#ffffffffffff", /* white */
3045 "#bdbdbdbdbdbd", /* gray */
3046 "#bdbdbdbdbdbd" /* gray */
3066 Initialize pixel info.
3068 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
3069 assert(display != (Display *) NULL);
3070 assert(visual_info != (XVisualInfo *) NULL);
3071 assert(map_info != (XStandardColormap *) NULL);
3072 assert(resource_info != (XResourceInfo *) NULL);
3073 assert(pixel != (XPixelInfo *) NULL);
3075 if (image != (Image *) NULL)
3076 if (image->storage_class == PseudoClass)
3077 pixel->colors=(ssize_t) image->colors;
3078 packets=(unsigned int)
3079 MagickMax((int) pixel->colors,visual_info->colormap_size)+MaxNumberPens;
3080 if (pixel->pixels != (unsigned long *) NULL)
3081 pixel->pixels=(unsigned long *) RelinquishMagickMemory(pixel->pixels);
3082 pixel->pixels=(unsigned long *) AcquireQuantumMemory(packets,
3083 sizeof(pixel->pixels));
3084 if (pixel->pixels == (unsigned long *) NULL)
3085 ThrowXWindowFatalException(ResourceLimitFatalError,"UnableToGetPixelInfo",
3088 Set foreground color.
3090 colormap=map_info->colormap;
3091 (void) XParseColor(display,colormap,(char *) ForegroundColor,
3092 &pixel->foreground_color);
3093 status=XParseColor(display,colormap,resource_info->foreground_color,
3094 &pixel->foreground_color);
3095 if (status == False)
3096 ThrowXWindowException(XServerError,"ColorIsNotKnownToServer",
3097 resource_info->foreground_color);
3098 pixel->foreground_color.pixel=
3099 XStandardPixel(map_info,&pixel->foreground_color);
3100 pixel->foreground_color.flags=(char) (DoRed | DoGreen | DoBlue);
3102 Set background color.
3104 (void) XParseColor(display,colormap,"#d6d6d6d6d6d6",&pixel->background_color);
3105 status=XParseColor(display,colormap,resource_info->background_color,
3106 &pixel->background_color);
3107 if (status == False)
3108 ThrowXWindowException(XServerError,"ColorIsNotKnownToServer",
3109 resource_info->background_color);
3110 pixel->background_color.pixel=
3111 XStandardPixel(map_info,&pixel->background_color);
3112 pixel->background_color.flags=(char) (DoRed | DoGreen | DoBlue);
3116 (void) XParseColor(display,colormap,(char *) BorderColor,
3117 &pixel->border_color);
3118 status=XParseColor(display,colormap,resource_info->border_color,
3119 &pixel->border_color);
3120 if (status == False)
3121 ThrowXWindowException(XServerError,"ColorIsNotKnownToServer",
3122 resource_info->border_color);
3123 pixel->border_color.pixel=XStandardPixel(map_info,&pixel->border_color);
3124 pixel->border_color.flags=(char) (DoRed | DoGreen | DoBlue);
3128 pixel->matte_color=pixel->background_color;
3129 if (resource_info->matte_color != (char *) NULL)
3132 Matte color is specified as a X resource or command line argument.
3134 status=XParseColor(display,colormap,resource_info->matte_color,
3135 &pixel->matte_color);
3136 if (status == False)
3137 ThrowXWindowException(XServerError,"ColorIsNotKnownToServer",
3138 resource_info->matte_color);
3139 pixel->matte_color.pixel=XStandardPixel(map_info,&pixel->matte_color);
3140 pixel->matte_color.flags=(char) (DoRed | DoGreen | DoBlue);
3143 Set highlight color.
3145 pixel->highlight_color.red=(unsigned short) (((double)
3146 pixel->matte_color.red*ScaleQuantumToShort(HighlightModulate))/65535L+
3147 (ScaleQuantumToShort((Quantum) (QuantumRange-HighlightModulate))));
3148 pixel->highlight_color.green=(unsigned short) (((double)
3149 pixel->matte_color.green*ScaleQuantumToShort(HighlightModulate))/65535L+
3150 (ScaleQuantumToShort((Quantum) (QuantumRange-HighlightModulate))));
3151 pixel->highlight_color.blue=(unsigned short) (((double)
3152 pixel->matte_color.blue*ScaleQuantumToShort(HighlightModulate))/65535L+
3153 (ScaleQuantumToShort((Quantum) (QuantumRange-HighlightModulate))));
3154 pixel->highlight_color.pixel=XStandardPixel(map_info,&pixel->highlight_color);
3155 pixel->highlight_color.flags=(char) (DoRed | DoGreen | DoBlue);
3159 pixel->shadow_color.red=(unsigned short) (((double)
3160 pixel->matte_color.red*ScaleQuantumToShort(ShadowModulate))/65535L);
3161 pixel->shadow_color.green=(unsigned short) (((double)
3162 pixel->matte_color.green*ScaleQuantumToShort(ShadowModulate))/65535L);
3163 pixel->shadow_color.blue=(unsigned short) (((double)
3164 pixel->matte_color.blue*ScaleQuantumToShort(ShadowModulate))/65535L);
3165 pixel->shadow_color.pixel=XStandardPixel(map_info,&pixel->shadow_color);
3166 pixel->shadow_color.flags=(char) (DoRed | DoGreen | DoBlue);
3170 pixel->depth_color.red=(unsigned short) (((double)
3171 pixel->matte_color.red*ScaleQuantumToShort(DepthModulate))/65535L);
3172 pixel->depth_color.green=(unsigned short) (((double)
3173 pixel->matte_color.green*ScaleQuantumToShort(DepthModulate))/65535L);
3174 pixel->depth_color.blue=(unsigned short) (((double)
3175 pixel->matte_color.blue*ScaleQuantumToShort(DepthModulate))/65535L);
3176 pixel->depth_color.pixel=XStandardPixel(map_info,&pixel->depth_color);
3177 pixel->depth_color.flags=(char) (DoRed | DoGreen | DoBlue);
3181 pixel->trough_color.red=(unsigned short) (((double)
3182 pixel->matte_color.red*ScaleQuantumToShort(TroughModulate))/65535L);
3183 pixel->trough_color.green=(unsigned short) (((double)
3184 pixel->matte_color.green*ScaleQuantumToShort(TroughModulate))/65535L);
3185 pixel->trough_color.blue=(unsigned short) (((double)
3186 pixel->matte_color.blue*ScaleQuantumToShort(TroughModulate))/65535L);
3187 pixel->trough_color.pixel=XStandardPixel(map_info,&pixel->trough_color);
3188 pixel->trough_color.flags=(char) (DoRed | DoGreen | DoBlue);
3192 for (i=0; i < MaxNumberPens; i++)
3194 (void) XParseColor(display,colormap,(char *) PenColors[i],
3195 &pixel->pen_colors[i]);
3196 status=XParseColor(display,colormap,resource_info->pen_colors[i],
3197 &pixel->pen_colors[i]);
3198 if (status == False)
3199 ThrowXWindowException(XServerError,"ColorIsNotKnownToServer",
3200 resource_info->pen_colors[i]);
3201 pixel->pen_colors[i].pixel=XStandardPixel(map_info,&pixel->pen_colors[i]);
3202 pixel->pen_colors[i].flags=(char) (DoRed | DoGreen | DoBlue);
3204 pixel->box_color=pixel->background_color;
3205 pixel->pen_color=pixel->foreground_color;
3208 if (image != (Image *) NULL)
3210 if ((resource_info->gamma_correct != MagickFalse) &&
3211 (image->gamma != 0.0))
3220 Initialize map relative to display and image gamma.
3222 flags=ParseGeometry(resource_info->display_gamma,&geometry_info);
3223 red_gamma=geometry_info.rho;
3224 green_gamma=geometry_info.sigma;
3225 if ((flags & SigmaValue) == 0)
3226 green_gamma=red_gamma;
3227 blue_gamma=geometry_info.xi;
3228 if ((flags & XiValue) == 0)
3229 blue_gamma=red_gamma;
3230 red_gamma*=image->gamma;
3231 green_gamma*=image->gamma;
3232 blue_gamma*=image->gamma;
3234 if (image->storage_class == PseudoClass)
3237 Initialize pixel array for images of type PseudoClass.
3239 for (i=0; i < (ssize_t) image->colors; i++)
3240 pixel->pixels[i]=XGammaPacket(map_info,image->colormap+i);
3241 for (i=0; i < MaxNumberPens; i++)
3242 pixel->pixels[image->colors+i]=pixel->pen_colors[i].pixel;
3243 pixel->colors+=MaxNumberPens;
3249 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3253 % X G e t R e s o u r c e C l a s s %
3257 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3259 % XGetResourceClass() queries the X server for the specified resource name or
3260 % class. If the resource name or class is not defined in the database, the
3261 % supplied default value is returned.
3263 % The format of the XGetResourceClass method is:
3265 % char *XGetResourceClass(XrmDatabase database,const char *client_name,
3266 % const char *keyword,char *resource_default)
3268 % A description of each parameter follows:
3270 % o database: Specifies a resource database; returned from
3271 % XrmGetStringDatabase.
3273 % o client_name: Specifies the application name used to retrieve resource
3274 % info from the X server database.
3276 % o keyword: Specifies the keyword of the value being retrieved.
3278 % o resource_default: Specifies the default value to return if the query
3279 % fails to find the specified keyword/class.
3282 MagickExport char *XGetResourceClass(XrmDatabase database,
3283 const char *client_name,const char *keyword,char *resource_default)
3286 resource_class[MaxTextExtent],
3287 resource_name[MaxTextExtent];
3298 if (database == (XrmDatabase) NULL)
3299 return(resource_default);
3300 *resource_name='\0';
3301 *resource_class='\0';
3302 if (keyword != (char *) NULL)
3309 Initialize resource keyword and class.
3311 (void) FormatLocaleString(resource_name,MaxTextExtent,"%s.%s",
3312 client_name,keyword);
3313 c=(int) (*client_name);
3314 if ((c >= XK_a) && (c <= XK_z))
3317 if ((c >= XK_agrave) && (c <= XK_odiaeresis))
3318 c-=(XK_agrave-XK_Agrave);
3320 if ((c >= XK_oslash) && (c <= XK_thorn))
3321 c-=(XK_oslash-XK_Ooblique);
3323 if ((k >= XK_a) && (k <= XK_z))
3326 if ((k >= XK_agrave) && (k <= XK_odiaeresis))
3327 k-=(XK_agrave-XK_Agrave);
3329 if ((k >= XK_oslash) && (k <= XK_thorn))
3330 k-=(XK_oslash-XK_Ooblique);
3331 (void) FormatLocaleString(resource_class,MaxTextExtent,"%c%s.%c%s",c,
3332 client_name+1,k,keyword+1);
3334 status=XrmGetResource(database,resource_name,resource_class,&resource_type,
3336 if (status == False)
3337 return(resource_default);
3338 return(resource_value.addr);
3342 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3346 % X G e t R e s o u r c e D a t a b a s e %
3350 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3352 % XGetResourceDatabase() creates a new resource database and initializes it.
3354 % The format of the XGetResourceDatabase method is:
3356 % XrmDatabase XGetResourceDatabase(Display *display,
3357 % const char *client_name)
3359 % A description of each parameter follows:
3361 % o database: XGetResourceDatabase() returns the database after it is
3364 % o display: Specifies a connection to an X server; returned from
3367 % o client_name: Specifies the application name used to retrieve resource
3368 % info from the X server database.
3371 MagickExport XrmDatabase XGetResourceDatabase(Display *display,
3372 const char *client_name)
3375 filename[MaxTextExtent];
3387 if (display == (Display *) NULL)
3388 return((XrmDatabase) NULL);
3389 assert(client_name != (char *) NULL);
3391 Initialize resource database.
3394 (void) XGetDefault(display,(char *) client_name,"dummy");
3395 resource_database=XrmGetDatabase(display);
3397 Combine application database.
3399 if (client_name != (char *) NULL)
3402 Get basename of client.
3404 p=client_name+(strlen(client_name)-1);
3405 while ((p > client_name) && (*p != '/'))
3410 c=(int) (*client_name);
3411 if ((c >= XK_a) && (c <= XK_z))
3414 if ((c >= XK_agrave) && (c <= XK_odiaeresis))
3415 c-=(XK_agrave-XK_Agrave);
3417 if ((c >= XK_oslash) && (c <= XK_thorn))
3418 c-=(XK_oslash-XK_Ooblique);
3419 #if defined(X11_APPLICATION_PATH)
3420 (void) FormatLocaleString(filename,MaxTextExtent,"%s%c%s",
3421 X11_APPLICATION_PATH,c,client_name+1);
3422 (void) XrmCombineFileDatabase(filename,&resource_database,MagickFalse);
3424 if (XResourceManagerString(display) != (char *) NULL)
3427 Combine server database.
3429 server_database=XrmGetStringDatabase(XResourceManagerString(display));
3430 XrmCombineDatabase(server_database,&resource_database,MagickFalse);
3433 Merge user preferences database.
3435 #if defined(X11_PREFERENCES_PATH)
3436 (void) FormatLocaleString(filename,MaxTextExtent,"%s%src",
3437 X11_PREFERENCES_PATH,client_name);
3438 ExpandFilename(filename);
3439 (void) XrmCombineFileDatabase(filename,&resource_database,MagickFalse);
3441 return(resource_database);
3445 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3449 % X G e t R e s o u r c e I n f o %
3453 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3455 % XGetResourceInfo(image_info,) initializes the ResourceInfo structure.
3457 % The format of the XGetResourceInfo method is:
3459 % void XGetResourceInfo(const ImageInfo *image_info,XrmDatabase database,
3460 % const char *client_name,XResourceInfo *resource_info)
3462 % A description of each parameter follows:
3464 % o image_info: the image info.
3466 % o database: Specifies a resource database; returned from
3467 % XrmGetStringDatabase.
3469 % o client_name: Specifies the application name used to retrieve
3470 % resource info from the X server database.
3472 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
3475 MagickExport void XGetResourceInfo(const ImageInfo *image_info,
3476 XrmDatabase database,const char *client_name,XResourceInfo *resource_info)
3487 Initialize resource info fields.
3489 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
3490 assert(resource_info != (XResourceInfo *) NULL);
3491 (void) ResetMagickMemory(resource_info,0,sizeof(*resource_info));
3492 resource_info->resource_database=database;
3493 resource_info->image_info=(ImageInfo *) image_info;
3494 (void) SetImageInfoProgressMonitor(resource_info->image_info,
3495 XMagickProgressMonitor,(void *) NULL);
3496 resource_info->quantize_info=CloneQuantizeInfo((QuantizeInfo *) NULL);
3497 resource_info->close_server=MagickTrue;
3498 resource_info->client_name=AcquireString(client_name);
3499 resource_value=XGetResourceClass(database,client_name,"backdrop",
3501 resource_info->backdrop=IsStringTrue(resource_value);
3502 resource_info->background_color=XGetResourceInstance(database,client_name,
3503 "background",(char *) "#d6d6d6d6d6d6");
3504 resource_info->border_color=XGetResourceInstance(database,client_name,
3505 "borderColor",BorderColor);
3506 resource_value=XGetResourceClass(database,client_name,"borderWidth",
3508 resource_info->border_width=(unsigned int) StringToUnsignedLong(
3510 resource_value=XGetResourceClass(database,client_name,"colormap",
3512 resource_info->colormap=UndefinedColormap;
3513 if (LocaleCompare("private",resource_value) == 0)
3514 resource_info->colormap=PrivateColormap;
3515 if (LocaleCompare("shared",resource_value) == 0)
3516 resource_info->colormap=SharedColormap;
3517 if (resource_info->colormap == UndefinedColormap)
3518 ThrowXWindowException(OptionError,"UnrecognizedColormapType",
3520 resource_value=XGetResourceClass(database,client_name,
3521 "colorRecovery",(char *) "False");
3522 resource_info->color_recovery=IsStringTrue(resource_value);
3523 resource_value=XGetResourceClass(database,client_name,"confirmExit",
3525 resource_info->confirm_exit=IsStringTrue(resource_value);
3526 resource_value=XGetResourceClass(database,client_name,"confirmEdit",
3528 resource_info->confirm_edit=IsStringTrue(resource_value);
3529 resource_value=XGetResourceClass(database,client_name,"delay",(char *) "1");
3530 resource_info->delay=(unsigned int) StringToUnsignedLong(resource_value);
3531 resource_info->display_gamma=XGetResourceClass(database,client_name,
3532 "displayGamma",(char *) "2.2");
3533 resource_value=XGetResourceClass(database,client_name,"displayWarnings",
3535 resource_info->display_warnings=IsStringTrue(resource_value);
3536 resource_info->font=XGetResourceClass(database,client_name,"font",
3538 resource_info->font=XGetResourceClass(database,client_name,"fontList",
3539 resource_info->font);
3540 resource_info->font_name[0]=XGetResourceClass(database,client_name,"font1",
3542 resource_info->font_name[1]=XGetResourceClass(database,client_name,"font2",
3543 (char *) "variable");
3544 resource_info->font_name[2]=XGetResourceClass(database,client_name,"font3",
3546 resource_info->font_name[3]=XGetResourceClass(database,client_name,"font4",
3548 resource_info->font_name[4]=XGetResourceClass(database,client_name,"font5",
3549 (char *) "7x13bold");
3550 resource_info->font_name[5]=XGetResourceClass(database,client_name,"font6",
3551 (char *) "8x13bold");
3552 resource_info->font_name[6]=XGetResourceClass(database,client_name,"font7",
3553 (char *) "9x15bold");
3554 resource_info->font_name[7]=XGetResourceClass(database,client_name,"font8",
3556 resource_info->font_name[8]=XGetResourceClass(database,client_name,"font9",
3558 resource_info->font_name[9]=XGetResourceClass(database,client_name,"font0",
3560 resource_info->font_name[10]=XGetResourceClass(database,client_name,"font0",
3562 resource_info->foreground_color=XGetResourceInstance(database,client_name,
3563 "foreground",ForegroundColor);
3564 resource_value=XGetResourceClass(database,client_name,"gammaCorrect",
3566 resource_info->gamma_correct=IsStringTrue(resource_value);
3567 resource_info->image_geometry=ConstantString(XGetResourceClass(database,
3568 client_name,"geometry",(char *) NULL));
3569 resource_value=XGetResourceClass(database,client_name,"gravity",
3571 resource_info->gravity=(GravityType) ParseCommandOption(MagickGravityOptions,
3572 MagickFalse,resource_value);
3573 directory=getcwd(resource_info->home_directory,MaxTextExtent);
3575 resource_info->icon_geometry=XGetResourceClass(database,client_name,
3576 "iconGeometry",(char *) NULL);
3577 resource_value=XGetResourceClass(database,client_name,"iconic",
3579 resource_info->iconic=IsStringTrue(resource_value);
3580 resource_value=XGetResourceClass(database,client_name,"immutable",
3581 LocaleCompare(client_name,"PerlMagick") == 0 ? (char *) "True" :
3583 resource_info->immutable=IsStringTrue(resource_value);
3584 resource_value=XGetResourceClass(database,client_name,"magnify",
3586 resource_info->magnify=(unsigned int) StringToUnsignedLong(resource_value);
3587 resource_info->map_type=XGetResourceClass(database,client_name,"map",
3589 resource_info->matte_color=XGetResourceInstance(database,client_name,
3590 "mattecolor",(char *) NULL);
3591 resource_info->name=ConstantString(XGetResourceClass(database,client_name,
3592 "name",(char *) NULL));
3593 resource_info->pen_colors[0]=XGetResourceClass(database,client_name,"pen1",
3595 resource_info->pen_colors[1]=XGetResourceClass(database,client_name,"pen2",
3597 resource_info->pen_colors[2]=XGetResourceClass(database,client_name,"pen3",
3599 resource_info->pen_colors[3]=XGetResourceClass(database,client_name,"pen4",
3601 resource_info->pen_colors[4]=XGetResourceClass(database,client_name,"pen5",
3603 resource_info->pen_colors[5]=XGetResourceClass(database,client_name,"pen6",
3605 resource_info->pen_colors[6]=XGetResourceClass(database,client_name,"pen7",
3606 (char *) "magenta");
3607 resource_info->pen_colors[7]=XGetResourceClass(database,client_name,"pen8",
3609 resource_info->pen_colors[8]=XGetResourceClass(database,client_name,"pen9",
3611 resource_info->pen_colors[9]=XGetResourceClass(database,client_name,"pen0",
3613 resource_info->pen_colors[10]=XGetResourceClass(database,client_name,"pen0",
3615 resource_value=XGetResourceClass(database,client_name,"pause",(char *) "0");
3616 resource_info->pause=(unsigned int) StringToUnsignedLong(resource_value);
3617 resource_value=XGetResourceClass(database,client_name,"quantum",(char *) "1");
3618 resource_info->quantum=StringToLong(resource_value);
3619 resource_info->text_font=XGetResourceClass(database,client_name,(char *)
3620 "font",(char *) "fixed");
3621 resource_info->text_font=XGetResourceClass(database,client_name,
3622 "textFontList",resource_info->text_font);
3623 resource_info->title=XGetResourceClass(database,client_name,"title",
3625 resource_value=XGetResourceClass(database,client_name,"undoCache",
3627 resource_info->undo_cache=(unsigned int) StringToUnsignedLong(resource_value);
3628 resource_value=XGetResourceClass(database,client_name,"update",
3630 resource_info->update=IsStringTrue(resource_value);
3631 resource_value=XGetResourceClass(database,client_name,"usePixmap",
3633 resource_info->use_pixmap=IsStringTrue(resource_value);
3634 resource_value=XGetResourceClass(database,client_name,"sharedMemory",
3636 resource_info->use_shared_memory=IsStringTrue(resource_value);
3637 resource_info->visual_type=XGetResourceClass(database,client_name,"visual",
3639 resource_info->window_group=XGetResourceClass(database,client_name,
3640 "windowGroup",(char *) NULL);
3641 resource_info->window_id=XGetResourceClass(database,client_name,"window",
3643 resource_info->write_filename=XGetResourceClass(database,client_name,
3644 "writeFilename",(char *) NULL);
3648 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3652 % X G e t R e s o u r c e I n s t a n c e %
3656 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3658 % XGetResourceInstance() queries the X server for the specified resource name.
3659 % If the resource name is not defined in the database, the supplied default
3660 % value is returned.
3662 % The format of the XGetResourceInstance method is:
3664 % char *XGetResourceInstance(XrmDatabase database,const char *client_name,
3665 % const char *keyword,const char *resource_default)
3667 % A description of each parameter follows:
3669 % o database: Specifies a resource database; returned from
3670 % XrmGetStringDatabase.
3672 % o client_name: Specifies the application name used to retrieve
3673 % resource info from the X server database.
3675 % o keyword: Specifies the keyword of the value being retrieved.
3677 % o resource_default: Specifies the default value to return if the query
3678 % fails to find the specified keyword/class.
3681 MagickExport char *XGetResourceInstance(XrmDatabase database,
3682 const char *client_name,const char *keyword,const char *resource_default)
3686 resource_name[MaxTextExtent];
3694 if (database == (XrmDatabase) NULL)
3695 return((char *) resource_default);
3696 *resource_name='\0';
3697 if (keyword != (char *) NULL)
3698 (void) FormatLocaleString(resource_name,MaxTextExtent,"%s.%s",client_name,
3700 status=XrmGetResource(database,resource_name,"ImageMagick",&resource_type,
3702 if (status == False)
3703 return((char *) resource_default);
3704 return(resource_value.addr);
3708 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3712 % X G e t S c r e e n D e n s i t y %
3716 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3718 % XGetScreenDensity() returns the density of the X server screen in
3721 % The format of the XGetScreenDensity method is:
3723 % char *XGetScreenDensity(Display *display)
3725 % A description of each parameter follows:
3727 % o density: XGetScreenDensity() returns the density of the X screen in
3730 % o display: Specifies a connection to an X server; returned from
3734 MagickExport char *XGetScreenDensity(Display *display)
3737 density[MaxTextExtent];
3744 Set density as determined by screen size.
3746 x_density=((((double) DisplayWidth(display,XDefaultScreen(display)))*25.4)/
3747 ((double) DisplayWidthMM(display,XDefaultScreen(display))));
3748 y_density=((((double) DisplayHeight(display,XDefaultScreen(display)))*25.4)/
3749 ((double) DisplayHeightMM(display,XDefaultScreen(display))));
3750 (void) FormatLocaleString(density,MaxTextExtent,"%gx%g",x_density,
3752 return(GetPageGeometry(density));
3756 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3760 + X G e t S u b w i n d o w %
3764 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3766 % XGetSubwindow() returns the subwindow of a window chosen the user with the
3767 % pointer and a button press.
3769 % The format of the XGetSubwindow method is:
3771 % Window XGetSubwindow(Display *display,Window window,int x,int y)
3773 % A description of each parameter follows:
3775 % o subwindow: XGetSubwindow() returns NULL if no subwindow is found
3776 % otherwise the subwindow is returned.
3778 % o display: Specifies a connection to an X server; returned from
3781 % o window: Specifies a pointer to a Window.
3783 % o x: the x coordinate of the pointer relative to the origin of the
3786 % o y: the y coordinate of the pointer relative to the origin of the
3790 static Window XGetSubwindow(Display *display,Window window,int x,int y)
3803 assert(display != (Display *) NULL);
3804 source_window=XRootWindow(display,XDefaultScreen(display));
3805 if (window == (Window) NULL)
3806 return(source_window);
3807 target_window=window;
3810 status=XTranslateCoordinates(display,source_window,window,x,y,
3811 &x_offset,&y_offset,&target_window);
3814 if (target_window == (Window) NULL)
3816 source_window=window;
3817 window=target_window;
3821 if (target_window == (Window) NULL)
3822 target_window=window;
3823 return(target_window);
3827 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3831 % X G e t W i n d o w C o l o r %
3835 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3837 % XGetWindowColor() returns the color of a pixel interactively chosen from the
3840 % The format of the XGetWindowColor method is:
3842 % MagickBooleanType XGetWindowColor(Display *display,XWindows *windows,
3843 % char *name,ExceptionInfo *exception)
3845 % A description of each parameter follows:
3847 % o display: Specifies a connection to an X server; returned from
3850 % o windows: Specifies a pointer to a XWindows structure.
3852 % o name: the name of the color if found in the X Color Database is
3853 % returned in this character string.
3855 % o exception: return any errors or warnings in this structure.
3858 MagickPrivate MagickBooleanType XGetWindowColor(Display *display,
3859 XWindows *windows,char *name,ExceptionInfo *exception)
3890 Choose a pixel from the X server.
3892 assert(display != (Display *) NULL);
3893 assert(name != (char *) NULL);
3894 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",name);
3896 target_window=XSelectWindow(display,&crop_info);
3897 if (target_window == (Window) NULL)
3898 return(MagickFalse);
3899 root_window=XRootWindow(display,XDefaultScreen(display));
3900 client_window=target_window;
3901 if (target_window != root_window)
3909 status=XGetGeometry(display,target_window,&root_window,&x,&x,&d,&d,&d,&d);
3910 if (status != False)
3912 client_window=XClientWindow(display,target_window);
3913 target_window=client_window;
3917 Verify window is viewable.
3919 status=XGetWindowAttributes(display,target_window,&window_attributes);
3920 if ((status == False) || (window_attributes.map_state != IsViewable))
3921 return(MagickFalse);
3925 (void) XTranslateCoordinates(display,root_window,target_window,
3926 (int) crop_info.x,(int) crop_info.y,&x,&y,&child);
3927 ximage=XGetImage(display,target_window,x,y,1,1,AllPlanes,ZPixmap);
3928 if (ximage == (XImage *) NULL)
3929 return(MagickFalse);
3930 color.pixel=XGetPixel(ximage,0,0);
3931 XDestroyImage(ximage);
3933 Match color against the color database.
3935 (void) XQueryColor(display,window_attributes.colormap,&color);
3936 pixel.red=(double) ScaleShortToQuantum(color.red);
3937 pixel.green=(double) ScaleShortToQuantum(color.green);
3938 pixel.blue=(double) ScaleShortToQuantum(color.blue);
3939 pixel.alpha=OpaqueAlpha;
3940 (void) QueryColorname(windows->image.image,&pixel,X11Compliance,name,
3946 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3950 + X G e t W i n d o w I m a g e %
3954 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3956 % XGetWindowImage() reads an image from the target X window and returns it.
3957 % XGetWindowImage() optionally descends the window hierarchy and overlays the
3958 % target image with each child image in an optimized fashion. Any child
3959 % window that have the same visual, colormap, and are contained by its parent
3962 % The format of the XGetWindowImage method is:
3964 % Image *XGetWindowImage(Display *display,const Window window,
3965 % const unsigned int borders,const unsigned int level,
3966 % ExceptionInfo *exception)
3968 % A description of each parameter follows:
3970 % o display: Specifies a connection to an X server; returned from
3973 % o window: Specifies the window to obtain the image from.
3975 % o borders: Specifies whether borders pixels are to be saved with
3978 % o level: Specifies an unsigned integer representing the level of
3979 % decent in the window hierarchy. This value must be zero or one on
3980 % the initial call to XGetWindowImage. A value of zero returns after
3981 % one call. A value of one causes the function to descend the window
3982 % hierarchy and overlay the target image with each subwindow image.
3984 % o exception: return any errors or warnings in this structure.
3987 static Image *XGetWindowImage(Display *display,const Window window,
3988 const unsigned int borders,const unsigned int level,ExceptionInfo *exception)
3990 typedef struct _ColormapInfo
3998 struct _ColormapInfo
4002 typedef struct _WindowInfo
4038 *colormap_info = (ColormapInfo *) NULL;
4058 Verify window is viewable.
4060 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
4061 assert(display != (Display *) NULL);
4062 status=XGetWindowAttributes(display,window,&window_attributes);
4063 if ((status == False) || (window_attributes.map_state != IsViewable))
4064 return((Image *) NULL);
4066 Cropping rectangle is relative to root window.
4068 root_window=XRootWindow(display,XDefaultScreen(display));
4069 (void) XTranslateCoordinates(display,window,root_window,0,0,&x_offset,
4071 crop_info.x=(ssize_t) x_offset;
4072 crop_info.y=(ssize_t) y_offset;
4073 crop_info.width=(size_t) window_attributes.width;
4074 crop_info.height=(size_t) window_attributes.height;
4075 if (borders != MagickFalse)
4078 Include border in image.
4080 crop_info.x-=(ssize_t) window_attributes.border_width;
4081 crop_info.y-=(ssize_t) window_attributes.border_width;
4082 crop_info.width+=(size_t) (window_attributes.border_width << 1);
4083 crop_info.height+=(size_t) (window_attributes.border_width << 1);
4086 Crop to root window.
4088 if (crop_info.x < 0)
4090 crop_info.width+=crop_info.x;
4093 if (crop_info.y < 0)
4095 crop_info.height+=crop_info.y;
4098 display_width=XDisplayWidth(display,XDefaultScreen(display));
4099 if ((int) (crop_info.x+crop_info.width) > display_width)
4100 crop_info.width=(size_t) (display_width-crop_info.x);
4101 display_height=XDisplayHeight(display,XDefaultScreen(display));
4102 if ((int) (crop_info.y+crop_info.height) > display_height)
4103 crop_info.height=(size_t) (display_height-crop_info.y);
4105 Initialize window info attributes.
4107 if (number_windows >= max_windows)
4110 Allocate or resize window info buffer.
4113 if (window_info == (WindowInfo *) NULL)
4114 window_info=(WindowInfo *) AcquireQuantumMemory((size_t) max_windows,
4115 sizeof(*window_info));
4117 window_info=(WindowInfo *) ResizeQuantumMemory(window_info,(size_t)
4118 max_windows,sizeof(*window_info));
4120 if (window_info == (WindowInfo *) NULL)
4122 ThrowXWindowException(ResourceLimitError,"MemoryAllocationFailed","...");
4123 return((Image *) NULL);
4125 id=number_windows++;
4126 window_info[id].window=window;
4127 window_info[id].visual=window_attributes.visual;
4128 window_info[id].colormap=window_attributes.colormap;
4129 window_info[id].bounds.x1=(short) crop_info.x;
4130 window_info[id].bounds.y1=(short) crop_info.y;
4131 window_info[id].bounds.x2=(short) (crop_info.x+(int) crop_info.width-1);
4132 window_info[id].bounds.y2=(short) (crop_info.y+(int) crop_info.height-1);
4133 crop_info.x-=x_offset;
4134 crop_info.y-=y_offset;
4135 window_info[id].crop_info=crop_info;
4145 Descend the window hierarchy.
4147 status=XQueryTree(display,window,&root_window,&window_info[id].parent,
4148 &children,&number_children);
4149 for (i=0; i < id; i++)
4150 if ((window_info[i].window == window_info[id].parent) &&
4151 (window_info[i].visual == window_info[id].visual) &&
4152 (window_info[i].colormap == window_info[id].colormap))
4154 if ((window_info[id].bounds.x1 < window_info[i].bounds.x1) ||
4155 (window_info[id].bounds.x2 > window_info[i].bounds.x2) ||
4156 (window_info[id].bounds.y1 < window_info[i].bounds.y1) ||
4157 (window_info[id].bounds.y2 > window_info[i].bounds.y2))
4160 Eliminate windows not circumscribed by their parent.
4166 if ((status == True) && (number_children != 0))
4168 for (i=0; i < (int) number_children; i++)
4169 (void) XGetWindowImage(display,children[i],MagickFalse,level+1,
4171 (void) XFree((void *) children);
4212 Get X image for each window in the list.
4214 image=NewImageList();
4215 for (id=0; id < number_windows; id++)
4218 Does target window intersect top level window?
4220 import=((window_info[id].bounds.x2 >= window_info[0].bounds.x1) &&
4221 (window_info[id].bounds.x1 <= window_info[0].bounds.x2) &&
4222 (window_info[id].bounds.y2 >= window_info[0].bounds.y1) &&
4223 (window_info[id].bounds.y1 <= window_info[0].bounds.y2)) ?
4224 MagickTrue : MagickFalse;
4226 Is target window contained by another window with the same colormap?
4228 for (j=0; j < id; j++)
4229 if ((window_info[id].visual == window_info[j].visual) &&
4230 (window_info[id].colormap == window_info[j].colormap))
4232 if ((window_info[id].bounds.x1 >= window_info[j].bounds.x1) &&
4233 (window_info[id].bounds.x2 <= window_info[j].bounds.x2) &&
4234 (window_info[id].bounds.y1 >= window_info[j].bounds.y1) &&
4235 (window_info[id].bounds.y2 <= window_info[j].bounds.y2))
4238 if (import == MagickFalse)
4243 ximage=XGetImage(display,window_info[id].window,(int)
4244 window_info[id].crop_info.x,(int) window_info[id].crop_info.y,
4245 (unsigned int) window_info[id].crop_info.width,(unsigned int)
4246 window_info[id].crop_info.height,AllPlanes,ZPixmap);
4247 if (ximage == (XImage *) NULL)
4250 Initialize window colormap.
4253 colors=(XColor *) NULL;
4254 if (window_info[id].colormap != (Colormap) NULL)
4260 Search colormap list for window colormap.
4262 number_colors=(unsigned int) window_info[id].visual->map_entries;
4263 for (p=colormap_info; p != (ColormapInfo *) NULL; p=p->next)
4264 if (p->colormap == window_info[id].colormap)
4266 if (p == (ColormapInfo *) NULL)
4269 Get the window colormap.
4271 colors=(XColor *) AcquireQuantumMemory(number_colors,
4273 if (colors == (XColor *) NULL)
4275 XDestroyImage(ximage);
4276 return((Image *) NULL);
4278 if ((window_info[id].visual->klass != DirectColor) &&
4279 (window_info[id].visual->klass != TrueColor))
4280 for (i=0; i < (int) number_colors; i++)
4282 colors[i].pixel=(size_t) i;
4296 DirectColor or TrueColor visual.
4301 red_bit=window_info[id].visual->red_mask &
4302 (~(window_info[id].visual->red_mask)+1);
4303 green_bit=window_info[id].visual->green_mask &
4304 (~(window_info[id].visual->green_mask)+1);
4305 blue_bit=window_info[id].visual->blue_mask &
4306 (~(window_info[id].visual->blue_mask)+1);
4307 for (i=0; i < (int) number_colors; i++)
4309 colors[i].pixel=(unsigned long) (red | green | blue);
4312 if (red > window_info[id].visual->red_mask)
4315 if (green > window_info[id].visual->green_mask)
4318 if (blue > window_info[id].visual->blue_mask)
4322 (void) XQueryColors(display,window_info[id].colormap,colors,
4323 (int) number_colors);
4325 Append colormap to colormap list.
4327 p=(ColormapInfo *) AcquireMagickMemory(sizeof(*p));
4328 if (p == (ColormapInfo *) NULL)
4329 return((Image *) NULL);
4330 p->colormap=window_info[id].colormap;
4332 p->next=colormap_info;
4338 Allocate image structure.
4340 composite_image=AcquireImage((ImageInfo *) NULL,exception);
4341 if (composite_image == (Image *) NULL)
4343 XDestroyImage(ximage);
4344 return((Image *) NULL);
4347 Convert X image to MIFF format.
4349 if ((window_info[id].visual->klass != TrueColor) &&
4350 (window_info[id].visual->klass != DirectColor))
4351 composite_image->storage_class=PseudoClass;
4352 composite_image->columns=(size_t) ximage->width;
4353 composite_image->rows=(size_t) ximage->height;
4354 composite_view=AcquireAuthenticCacheView(composite_image,exception);
4355 switch (composite_image->storage_class)
4373 Determine shift and mask for red, green, and blue.
4375 red_mask=window_info[id].visual->red_mask;
4377 while ((red_mask != 0) && ((red_mask & 0x01) == 0))
4382 green_mask=window_info[id].visual->green_mask;
4384 while ((green_mask != 0) && ((green_mask & 0x01) == 0))
4389 blue_mask=window_info[id].visual->blue_mask;
4391 while ((blue_mask != 0) && ((blue_mask & 0x01) == 0))
4397 Convert X image to DirectClass packets.
4399 if ((number_colors != 0) &&
4400 (window_info[id].visual->klass == DirectColor))
4401 for (y=0; y < (int) composite_image->rows; y++)
4403 q=QueueCacheViewAuthenticPixels(composite_view,0,(ssize_t) y,
4404 composite_image->columns,1,exception);
4405 if (q == (Quantum *) NULL)
4407 for (x=0; x < (int) composite_image->columns; x++)
4409 pixel=XGetPixel(ximage,x,y);
4410 index=(pixel >> red_shift) & red_mask;
4411 SetPixelRed(composite_image,
4412 ScaleShortToQuantum(colors[index].red),q);
4413 index=(pixel >> green_shift) & green_mask;
4414 SetPixelGreen(composite_image,
4415 ScaleShortToQuantum(colors[index].green),q);
4416 index=(pixel >> blue_shift) & blue_mask;
4417 SetPixelBlue(composite_image,
4418 ScaleShortToQuantum(colors[index].blue),q);
4419 q+=GetPixelChannels(composite_image);
4421 status=SyncCacheViewAuthenticPixels(composite_view,exception);
4422 if (status == MagickFalse)
4426 for (y=0; y < (int) composite_image->rows; y++)
4428 q=QueueCacheViewAuthenticPixels(composite_view,0,(ssize_t) y,
4429 composite_image->columns,1,exception);
4430 if (q == (Quantum *) NULL)
4432 for (x=0; x < (int) composite_image->columns; x++)
4434 pixel=XGetPixel(ximage,x,y);
4435 color=(pixel >> red_shift) & red_mask;
4437 color=(65535UL*color)/red_mask;
4438 SetPixelRed(composite_image,ScaleShortToQuantum(
4439 (unsigned short) color),q);
4440 color=(pixel >> green_shift) & green_mask;
4441 if (green_mask != 0)
4442 color=(65535UL*color)/green_mask;
4443 SetPixelGreen(composite_image,ScaleShortToQuantum(
4444 (unsigned short) color),q);
4445 color=(pixel >> blue_shift) & blue_mask;
4447 color=(65535UL*color)/blue_mask;
4448 SetPixelBlue(composite_image,ScaleShortToQuantum(
4449 (unsigned short) color),q);
4450 q+=GetPixelChannels(composite_image);
4452 status=SyncCacheViewAuthenticPixels(composite_view,exception);
4453 if (status == MagickFalse)
4463 status=AcquireImageColormap(composite_image,number_colors,
4465 if (status == MagickFalse)
4467 XDestroyImage(ximage);
4468 composite_image=DestroyImage(composite_image);
4469 return((Image *) NULL);
4471 for (i=0; i < (int) composite_image->colors; i++)
4473 composite_image->colormap[colors[i].pixel].red=(double)
4474 ScaleShortToQuantum(colors[i].red);
4475 composite_image->colormap[colors[i].pixel].green=(double)
4476 ScaleShortToQuantum(colors[i].green);
4477 composite_image->colormap[colors[i].pixel].blue=(double)
4478 ScaleShortToQuantum(colors[i].blue);
4481 Convert X image to PseudoClass packets.
4483 for (y=0; y < (int) composite_image->rows; y++)
4485 q=QueueCacheViewAuthenticPixels(composite_view,0,(ssize_t) y,
4486 composite_image->columns,1,exception);
4487 if (q == (Quantum *) NULL)
4489 for (x=0; x < (int) composite_image->columns; x++)
4491 index=(Quantum) XGetPixel(ximage,x,y);
4492 SetPixelIndex(composite_image,index,q);
4493 SetPixelInfoPixel(composite_image,
4494 composite_image->colormap+(ssize_t) index,q);
4495 q+=GetPixelChannels(composite_image);
4497 status=SyncCacheViewAuthenticPixels(composite_view,exception);
4498 if (status == MagickFalse)
4504 composite_view=DestroyCacheView(composite_view);
4505 XDestroyImage(ximage);
4506 if (image == (Image *) NULL)
4508 image=composite_image;
4512 Composite any children in back-to-front order.
4514 (void) XTranslateCoordinates(display,window_info[id].window,window,0,0,
4515 &x_offset,&y_offset,&child);
4516 x_offset-=(int) crop_info.x;
4519 y_offset-=(int) crop_info.y;
4522 (void) CompositeImage(image,composite_image,CopyCompositeOp,MagickTrue,
4523 (ssize_t) x_offset,(ssize_t) y_offset,exception);
4524 composite_image=DestroyImage(composite_image);
4527 Relinquish resources.
4529 while (colormap_info != (ColormapInfo *) NULL)
4531 next=colormap_info->next;
4532 colormap_info->colors=(XColor *) RelinquishMagickMemory(
4533 colormap_info->colors);
4534 colormap_info=(ColormapInfo *) RelinquishMagickMemory(colormap_info);
4538 Relinquish resources and restore initial state.
4540 window_info=(WindowInfo *) RelinquishMagickMemory(window_info);
4543 colormap_info=(ColormapInfo *) NULL;
4546 return((Image *) NULL);
4550 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4554 % X G e t W i n d o w I n f o %
4558 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4560 % XGetWindowInfo() initializes the XWindowInfo structure.
4562 % The format of the XGetWindowInfo method is:
4564 % void XGetWindowInfo(Display *display,XVisualInfo *visual_info,
4565 % XStandardColormap *map_info,XPixelInfo *pixel,XFontStruct *font_info,
4566 % XResourceInfo *resource_info,XWindowInfo *window)
4567 % resource_info,window)
4569 % A description of each parameter follows:
4571 % o display: Specifies a connection to an X server; returned from
4574 % o visual_info: Specifies a pointer to a X11 XVisualInfo structure;
4575 % returned from XGetVisualInfo.
4577 % o map_info: If map_type is specified, this structure is initialized
4578 % with info from the Standard Colormap.
4580 % o pixel: Specifies a pointer to a XPixelInfo structure.
4582 % o font_info: Specifies a pointer to a XFontStruct structure.
4584 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
4587 MagickPrivate void XGetWindowInfo(Display *display,XVisualInfo *visual_info,
4588 XStandardColormap *map_info,XPixelInfo *pixel,XFontStruct *font_info,
4589 XResourceInfo *resource_info,XWindowInfo *window)
4592 Initialize window info.
4594 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
4595 assert(display != (Display *) NULL);
4596 assert(visual_info != (XVisualInfo *) NULL);
4597 assert(map_info != (XStandardColormap *) NULL);
4598 assert(pixel != (XPixelInfo *) NULL);
4599 assert(resource_info != (XResourceInfo *) NULL);
4600 assert(window != (XWindowInfo *) NULL);
4601 if (window->id != (Window) NULL)
4603 if (window->cursor != (Cursor) NULL)
4604 (void) XFreeCursor(display,window->cursor);
4605 if (window->busy_cursor != (Cursor) NULL)
4606 (void) XFreeCursor(display,window->busy_cursor);
4607 if (window->highlight_stipple != (Pixmap) NULL)
4608 (void) XFreePixmap(display,window->highlight_stipple);
4609 if (window->shadow_stipple != (Pixmap) NULL)
4610 (void) XFreePixmap(display,window->shadow_stipple);
4611 if (window->name == (char *) NULL)
4612 window->name=AcquireString("");
4613 if (window->icon_name == (char *) NULL)
4614 window->icon_name=AcquireString("");
4619 Initialize these attributes just once.
4621 window->id=(Window) NULL;
4622 if (window->name == (char *) NULL)
4623 window->name=AcquireString("");
4624 if (window->icon_name == (char *) NULL)
4625 window->icon_name=AcquireString("");
4626 window->x=XDisplayWidth(display,visual_info->screen) >> 1;
4627 window->y=XDisplayWidth(display,visual_info->screen) >> 1;
4628 window->ximage=(XImage *) NULL;
4629 window->matte_image=(XImage *) NULL;
4630 window->pixmap=(Pixmap) NULL;
4631 window->matte_pixmap=(Pixmap) NULL;
4632 window->mapped=MagickFalse;
4633 window->stasis=MagickFalse;
4634 window->shared_memory=MagickTrue;
4635 window->segment_info=(void *) NULL;
4636 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
4641 if (window->segment_info == (void *) NULL)
4642 window->segment_info=AcquireQuantumMemory(2,sizeof(*segment_info));
4643 segment_info=(XShmSegmentInfo *) window->segment_info;
4644 segment_info[0].shmid=(-1);
4645 segment_info[0].shmaddr=(char *) NULL;
4646 segment_info[1].shmid=(-1);
4647 segment_info[1].shmaddr=(char *) NULL;
4652 Initialize these attributes every time function is called.
4654 window->screen=visual_info->screen;
4655 window->root=XRootWindow(display,visual_info->screen);
4656 window->visual=visual_info->visual;
4657 window->storage_class=(unsigned int) visual_info->klass;
4658 window->depth=(unsigned int) visual_info->depth;
4659 window->visual_info=visual_info;
4660 window->map_info=map_info;
4661 window->pixel_info=pixel;
4662 window->font_info=font_info;
4663 window->cursor=XCreateFontCursor(display,XC_left_ptr);
4664 window->busy_cursor=XCreateFontCursor(display,XC_watch);
4665 window->geometry=(char *) NULL;
4666 window->icon_geometry=(char *) NULL;
4667 if (resource_info->icon_geometry != (char *) NULL)
4668 (void) CloneString(&window->icon_geometry,resource_info->icon_geometry);
4669 window->crop_geometry=(char *) NULL;
4670 window->flags=(size_t) PSize;
4673 window->min_width=1;
4674 window->min_height=1;
4675 window->width_inc=1;
4676 window->height_inc=1;
4677 window->border_width=resource_info->border_width;
4678 window->annotate_context=pixel->annotate_context;
4679 window->highlight_context=pixel->highlight_context;
4680 window->widget_context=pixel->widget_context;
4681 window->shadow_stipple=(Pixmap) NULL;
4682 window->highlight_stipple=(Pixmap) NULL;
4683 window->use_pixmap=MagickTrue;
4684 window->immutable=MagickFalse;
4685 window->shape=MagickFalse;
4687 window->mask=(int) (CWBackingStore | CWBackPixel | CWBackPixmap |
4688 CWBitGravity | CWBorderPixel | CWColormap | CWCursor | CWDontPropagate |
4689 CWEventMask | CWOverrideRedirect | CWSaveUnder | CWWinGravity);
4690 window->attributes.background_pixel=pixel->background_color.pixel;
4691 window->attributes.background_pixmap=(Pixmap) NULL;
4692 window->attributes.bit_gravity=ForgetGravity;
4693 window->attributes.backing_store=WhenMapped;
4694 window->attributes.save_under=MagickTrue;
4695 window->attributes.border_pixel=pixel->border_color.pixel;
4696 window->attributes.colormap=map_info->colormap;
4697 window->attributes.cursor=window->cursor;
4698 window->attributes.do_not_propagate_mask=NoEventMask;
4699 window->attributes.event_mask=NoEventMask;
4700 window->attributes.override_redirect=MagickFalse;
4701 window->attributes.win_gravity=NorthWestGravity;
4702 window->orphan=MagickFalse;
4706 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4710 % X H i g h l i g h t E l l i p s e %
4714 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4716 % XHighlightEllipse() puts a border on the X server around a region defined by
4719 % The format of the XHighlightEllipse method is:
4721 % void XHighlightEllipse(Display *display,Window window,
4722 % GC annotate_context,const RectangleInfo *highlight_info)
4724 % A description of each parameter follows:
4726 % o display: Specifies a connection to an X server; returned from
4729 % o window: Specifies a pointer to a Window structure.
4731 % o annotate_context: Specifies a pointer to a GC structure.
4733 % o highlight_info: Specifies a pointer to a RectangleInfo structure. It
4734 % contains the extents of any highlighting rectangle.
4737 MagickPrivate void XHighlightEllipse(Display *display,Window window,
4738 GC annotate_context,const RectangleInfo *highlight_info)
4740 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
4741 assert(display != (Display *) NULL);
4742 assert(window != (Window) NULL);
4743 assert(annotate_context != (GC) NULL);
4744 assert(highlight_info != (RectangleInfo *) NULL);
4745 if ((highlight_info->width < 4) || (highlight_info->height < 4))
4747 (void) XDrawArc(display,window,annotate_context,(int) highlight_info->x,
4748 (int) highlight_info->y,(unsigned int) highlight_info->width-1,
4749 (unsigned int) highlight_info->height-1,0,360*64);
4750 (void) XDrawArc(display,window,annotate_context,(int) highlight_info->x+1,
4751 (int) highlight_info->y+1,(unsigned int) highlight_info->width-3,
4752 (unsigned int) highlight_info->height-3,0,360*64);
4756 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4760 % X H i g h l i g h t L i n e %
4764 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4766 % XHighlightLine() puts a border on the X server around a region defined by
4769 % The format of the XHighlightLine method is:
4771 % void XHighlightLine(Display *display,Window window,GC annotate_context,
4772 % const XSegment *highlight_info)
4774 % A description of each parameter follows:
4776 % o display: Specifies a connection to an X server; returned from
4779 % o window: Specifies a pointer to a Window structure.
4781 % o annotate_context: Specifies a pointer to a GC structure.
4783 % o highlight_info: Specifies a pointer to a RectangleInfo structure. It
4784 % contains the extents of any highlighting rectangle.
4787 MagickPrivate void XHighlightLine(Display *display,Window window,
4788 GC annotate_context,const XSegment *highlight_info)
4790 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
4791 assert(display != (Display *) NULL);
4792 assert(window != (Window) NULL);
4793 assert(annotate_context != (GC) NULL);
4794 assert(highlight_info != (XSegment *) NULL);
4795 (void) XDrawLine(display,window,annotate_context,highlight_info->x1,
4796 highlight_info->y1,highlight_info->x2,highlight_info->y2);
4800 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4804 % X H i g h l i g h t R e c t a n g l e %
4808 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4810 % XHighlightRectangle() puts a border on the X server around a region defined
4811 % by highlight_info.
4813 % The format of the XHighlightRectangle method is:
4815 % void XHighlightRectangle(Display *display,Window window,
4816 % GC annotate_context,const RectangleInfo *highlight_info)
4818 % A description of each parameter follows:
4820 % o display: Specifies a connection to an X server; returned from
4823 % o window: Specifies a pointer to a Window structure.
4825 % o annotate_context: Specifies a pointer to a GC structure.
4827 % o highlight_info: Specifies a pointer to a RectangleInfo structure. It
4828 % contains the extents of any highlighting rectangle.
4831 MagickPrivate void XHighlightRectangle(Display *display,Window window,
4832 GC annotate_context,const RectangleInfo *highlight_info)
4834 assert(display != (Display *) NULL);
4835 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
4836 assert(window != (Window) NULL);
4837 assert(annotate_context != (GC) NULL);
4838 assert(highlight_info != (RectangleInfo *) NULL);
4839 if ((highlight_info->width < 4) || (highlight_info->height < 4))
4841 (void) XDrawRectangle(display,window,annotate_context,(int) highlight_info->x,
4842 (int) highlight_info->y,(unsigned int) highlight_info->width-1,
4843 (unsigned int) highlight_info->height-1);
4844 (void) XDrawRectangle(display,window,annotate_context,(int) highlight_info->x+
4845 1,(int) highlight_info->y+1,(unsigned int) highlight_info->width-3,
4846 (unsigned int) highlight_info->height-3);
4850 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4854 % X I m p o r t I m a g e %
4858 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4860 % XImportImage() reads an image from an X window.
4862 % The format of the XImportImage method is:
4864 % Image *XImportImage(const ImageInfo *image_info,XImportInfo *ximage_info,
4865 % ExceptionInfo *exception)
4867 % A description of each parameter follows:
4869 % o image_info: the image info.
4871 % o ximage_info: Specifies a pointer to an XImportInfo structure.
4873 % o exception: return any errors or warnings in this structure.
4876 MagickExport Image *XImportImage(const ImageInfo *image_info,
4877 XImportInfo *ximage_info,ExceptionInfo *exception)
4910 Open X server connection.
4912 assert(image_info != (const ImageInfo *) NULL);
4913 assert(image_info->signature == MagickSignature);
4914 if (image_info->debug != MagickFalse)
4915 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
4916 image_info->filename);
4917 assert(ximage_info != (XImportInfo *) NULL);
4918 display=XOpenDisplay(image_info->server_name);
4919 if (display == (Display *) NULL)
4921 ThrowXWindowException(XServerError,"UnableToOpenXServer",
4922 XDisplayName(image_info->server_name));
4923 return((Image *) NULL);
4926 Set our forgiving exception handler.
4928 (void) XSetErrorHandler(XError);
4930 Select target window.
4936 root=XRootWindow(display,XDefaultScreen(display));
4937 target=(Window) NULL;
4938 if ((image_info->filename != (char *) NULL) &&
4939 (*image_info->filename != '\0'))
4941 if (LocaleCompare(image_info->filename,"root") == 0)
4946 Select window by ID or name.
4948 if (isdigit((int) ((unsigned char) *image_info->filename)) != 0)
4949 target=XWindowByID(display,root,(Window)
4950 strtol(image_info->filename,(char **) NULL,0));
4951 if (target == (Window) NULL)
4952 target=XWindowByName(display,root,image_info->filename);
4953 if (target == (Window) NULL)
4954 ThrowXWindowException(XServerError,"NoWindowWithSpecifiedIDExists",
4955 image_info->filename);
4959 If target window is not defined, interactively select one.
4961 prior_target=target;
4962 if (target == (Window) NULL)
4963 target=XSelectWindow(display,&crop_info);
4964 if (target == (Window) NULL)
4965 ThrowXWindowException(XServerError,"UnableToReadXWindowImage",
4966 image_info->filename);
4967 client=target; /* obsolete */
4973 status=XGetGeometry(display,target,&root,&x,&x,&d,&d,&d,&d);
4974 if (status != False)
4982 Find window manager frame.
4984 status=XQueryTree(display,target,&root,&parent,&children,&d);
4985 if ((status != False) && (children != (Window *) NULL))
4986 (void) XFree((char *) children);
4987 if ((status == False) || (parent == (Window) NULL) ||
4995 client=XClientWindow(display,target);
4996 if (ximage_info->frame == MagickFalse)
4998 if ((ximage_info->frame == MagickFalse) &&
4999 (prior_target != MagickFalse))
5000 target=prior_target;
5003 if (ximage_info->screen)
5015 Obtain window image directly from screen.
5017 status=XGetWindowAttributes(display,target,&window_attributes);
5018 if (status == False)
5020 ThrowXWindowException(XServerError,"UnableToReadXWindowAttributes",
5021 image_info->filename);
5022 (void) XCloseDisplay(display);
5023 return((Image *) NULL);
5025 (void) XTranslateCoordinates(display,target,root,0,0,&x,&y,&child);
5026 crop_info.x=(ssize_t) x;
5027 crop_info.y=(ssize_t) y;
5028 crop_info.width=(size_t) window_attributes.width;
5029 crop_info.height=(size_t) window_attributes.height;
5030 if (ximage_info->borders != 0)
5033 Include border in image.
5035 crop_info.x-=window_attributes.border_width;
5036 crop_info.y-=window_attributes.border_width;
5037 crop_info.width+=window_attributes.border_width << 1;
5038 crop_info.height+=window_attributes.border_width << 1;
5043 If WM_COLORMAP_WINDOWS property is set or multiple colormaps, descend.
5046 status=XGetWMColormapWindows(display,target,&children,&number_windows);
5047 if ((status == True) && (number_windows > 0))
5049 ximage_info->descend=MagickTrue;
5050 (void) XFree ((char *) children);
5052 colormaps=XListInstalledColormaps(display,target,&number_colormaps);
5053 if (number_colormaps > 0)
5055 if (number_colormaps > 1)
5056 ximage_info->descend=MagickTrue;
5057 (void) XFree((char *) colormaps);
5060 Alert the user not to alter the screen.
5062 if (ximage_info->silent == MagickFalse)
5063 (void) XBell(display,0);
5065 Get image by window id.
5067 (void) XGrabServer(display);
5068 image=XGetWindowImage(display,target,ximage_info->borders,
5069 ximage_info->descend ? 1U : 0U,exception);
5070 (void) XUngrabServer(display);
5071 if (image == (Image *) NULL)
5072 ThrowXWindowException(XServerError,"UnableToReadXWindowImage",
5073 image_info->filename)
5076 (void) CopyMagickString(image->filename,image_info->filename,
5078 if ((crop_info.width != 0) && (crop_info.height != 0))
5085 Crop image as defined by the cropping rectangle.
5087 clone_image=CloneImage(image,0,0,MagickTrue,exception);
5088 if (clone_image != (Image *) NULL)
5090 crop_image=CropImage(clone_image,&crop_info,exception);
5091 if (crop_image != (Image *) NULL)
5093 image=DestroyImage(image);
5098 status=XGetWMName(display,target,&window_name);
5101 if (*image_info->filename == '\0')
5102 (void) CopyMagickString(image->filename,(char *) window_name.value,
5103 (size_t) window_name.nitems+1);
5104 (void) XFree((void *) window_name.value);
5107 if (ximage_info->silent == MagickFalse)
5110 Alert the user we're done.
5112 (void) XBell(display,0);
5113 (void) XBell(display,0);
5115 (void) XCloseDisplay(display);
5120 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5124 % X I n i t i a l i z e W i n d o w s %
5128 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5130 % XInitializeWindows() initializes the XWindows structure.
5132 % The format of the XInitializeWindows method is:
5134 % XWindows *XInitializeWindows(Display *display,
5135 % XResourceInfo *resource_info)
5137 % A description of each parameter follows:
5139 % o windows: XInitializeWindows returns a pointer to a XWindows structure.
5141 % o display: Specifies a connection to an X server; returned from
5144 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
5147 MagickPrivate XWindows *XInitializeWindows(Display *display,
5148 XResourceInfo *resource_info)
5157 Allocate windows structure.
5159 windows=(XWindows *) AcquireMagickMemory(sizeof(*windows));
5160 if (windows == (XWindows *) NULL)
5162 ThrowXWindowFatalException(XServerFatalError,"MemoryAllocationFailed",
5164 return((XWindows *) NULL);
5166 (void) ResetMagickMemory(windows,0,sizeof(*windows));
5167 windows->pixel_info=(XPixelInfo *) AcquireMagickMemory(
5168 sizeof(*windows->pixel_info));
5169 windows->icon_pixel=(XPixelInfo *) AcquireMagickMemory(
5170 sizeof(*windows->icon_pixel));
5171 windows->icon_resources=(XResourceInfo *) AcquireMagickMemory(
5172 sizeof(*windows->icon_resources));
5173 if ((windows->pixel_info == (XPixelInfo *) NULL) ||
5174 (windows->icon_pixel == (XPixelInfo *) NULL) ||
5175 (windows->icon_resources == (XResourceInfo *) NULL))
5177 ThrowXWindowFatalException(XServerFatalError,"MemoryAllocationFailed",
5179 return((XWindows *) NULL);
5182 Initialize windows structure.
5184 windows->display=display;
5185 windows->wm_protocols=XInternAtom(display,"WM_PROTOCOLS",MagickFalse);
5186 windows->wm_delete_window=XInternAtom(display,"WM_DELETE_WINDOW",MagickFalse);
5187 windows->wm_take_focus=XInternAtom(display,"WM_TAKE_FOCUS",MagickFalse);
5188 windows->im_protocols=XInternAtom(display,"IM_PROTOCOLS",MagickFalse);
5189 windows->im_remote_command=
5190 XInternAtom(display,"IM_REMOTE_COMMAND",MagickFalse);
5191 windows->im_update_widget=XInternAtom(display,"IM_UPDATE_WIDGET",MagickFalse);
5192 windows->im_update_colormap=
5193 XInternAtom(display,"IM_UPDATE_COLORMAP",MagickFalse);
5194 windows->im_former_image=XInternAtom(display,"IM_FORMER_IMAGE",MagickFalse);
5195 windows->im_next_image=XInternAtom(display,"IM_NEXT_IMAGE",MagickFalse);
5196 windows->im_retain_colors=XInternAtom(display,"IM_RETAIN_COLORS",MagickFalse);
5197 windows->im_exit=XInternAtom(display,"IM_EXIT",MagickFalse);
5198 windows->dnd_protocols=XInternAtom(display,"DndProtocol",MagickFalse);
5199 #if defined(MAGICKCORE_WINDOWS_SUPPORT)
5200 (void) XSynchronize(display,IsWindows95());
5202 if (IsEventLogging())
5204 (void) XSynchronize(display,MagickTrue);
5205 (void) LogMagickEvent(X11Event,GetMagickModule(),"Version: %s",
5206 GetMagickVersion((size_t *) NULL));
5207 (void) LogMagickEvent(X11Event,GetMagickModule(),"Protocols:");
5208 (void) LogMagickEvent(X11Event,GetMagickModule(),
5209 " Window Manager: 0x%lx",windows->wm_protocols);
5210 (void) LogMagickEvent(X11Event,GetMagickModule(),
5211 " delete window: 0x%lx",windows->wm_delete_window);
5212 (void) LogMagickEvent(X11Event,GetMagickModule()," take focus: 0x%lx",
5213 windows->wm_take_focus);
5214 (void) LogMagickEvent(X11Event,GetMagickModule()," ImageMagick: 0x%lx",
5215 windows->im_protocols);
5216 (void) LogMagickEvent(X11Event,GetMagickModule(),
5217 " remote command: 0x%lx",windows->im_remote_command);
5218 (void) LogMagickEvent(X11Event,GetMagickModule(),
5219 " update widget: 0x%lx",windows->im_update_widget);
5220 (void) LogMagickEvent(X11Event,GetMagickModule(),
5221 " update colormap: 0x%lx",windows->im_update_colormap);
5222 (void) LogMagickEvent(X11Event,GetMagickModule(),
5223 " former image: 0x%lx",windows->im_former_image);
5224 (void) LogMagickEvent(X11Event,GetMagickModule()," next image: 0x%lx",
5225 windows->im_next_image);
5226 (void) LogMagickEvent(X11Event,GetMagickModule(),
5227 " retain colors: 0x%lx",windows->im_retain_colors);
5228 (void) LogMagickEvent(X11Event,GetMagickModule()," exit: 0x%lx",
5230 (void) LogMagickEvent(X11Event,GetMagickModule()," Drag and Drop: 0x%lx",
5231 windows->dnd_protocols);
5234 Allocate standard colormap.
5236 windows->map_info=XAllocStandardColormap();
5237 windows->icon_map=XAllocStandardColormap();
5238 if ((windows->map_info == (XStandardColormap *) NULL) ||
5239 (windows->icon_map == (XStandardColormap *) NULL))
5240 ThrowXWindowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed",
5242 windows->map_info->colormap=(Colormap) NULL;
5243 windows->icon_map->colormap=(Colormap) NULL;
5244 windows->pixel_info->pixels=(unsigned long *) NULL;
5245 windows->pixel_info->annotate_context=(GC) NULL;
5246 windows->pixel_info->highlight_context=(GC) NULL;
5247 windows->pixel_info->widget_context=(GC) NULL;
5248 windows->font_info=(XFontStruct *) NULL;
5249 windows->icon_pixel->annotate_context=(GC) NULL;
5250 windows->icon_pixel->pixels=(unsigned long *) NULL;
5254 *windows->icon_resources=(*resource_info);
5255 windows->icon_resources->visual_type=(char *) "default";
5256 windows->icon_resources->colormap=SharedColormap;
5257 windows->visual_info=
5258 XBestVisualInfo(display,windows->map_info,resource_info);
5259 windows->icon_visual=
5260 XBestVisualInfo(display,windows->icon_map,windows->icon_resources);
5261 if ((windows->visual_info == (XVisualInfo *) NULL) ||
5262 (windows->icon_visual == (XVisualInfo *) NULL))
5263 ThrowXWindowFatalException(XServerFatalError,"UnableToGetVisual",
5264 resource_info->visual_type);
5265 if (IsEventLogging())
5267 (void) LogMagickEvent(X11Event,GetMagickModule(),"Visual:");
5268 (void) LogMagickEvent(X11Event,GetMagickModule()," visual id: 0x%lx",
5269 windows->visual_info->visualid);
5270 (void) LogMagickEvent(X11Event,GetMagickModule()," class: %s",
5271 XVisualClassName(windows->visual_info->klass));
5272 (void) LogMagickEvent(X11Event,GetMagickModule()," depth: %d planes",
5273 windows->visual_info->depth);
5274 (void) LogMagickEvent(X11Event,GetMagickModule(),
5275 " size of colormap: %d entries",windows->visual_info->colormap_size);
5276 (void) LogMagickEvent(X11Event,GetMagickModule(),
5277 " red, green, blue masks: 0x%lx 0x%lx 0x%lx",
5278 windows->visual_info->red_mask,windows->visual_info->green_mask,
5279 windows->visual_info->blue_mask);
5280 (void) LogMagickEvent(X11Event,GetMagickModule(),
5281 " significant bits in color: %d bits",
5282 windows->visual_info->bits_per_rgb);
5285 Allocate class and manager hints.
5287 windows->class_hints=XAllocClassHint();
5288 windows->manager_hints=XAllocWMHints();
5289 if ((windows->class_hints == (XClassHint *) NULL) ||
5290 (windows->manager_hints == (XWMHints *) NULL))
5291 ThrowXWindowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed",
5294 Determine group leader if we have one.
5296 root_window=XRootWindow(display,windows->visual_info->screen);
5297 windows->group_leader.id=(Window) NULL;
5298 if (resource_info->window_group != (char *) NULL)
5300 if (isdigit((int) ((unsigned char) *resource_info->window_group)) != 0)
5301 windows->group_leader.id=XWindowByID(display,root_window,(Window)
5302 strtol((char *) resource_info->window_group,(char **) NULL,0));
5303 if (windows->group_leader.id == (Window) NULL)
5304 windows->group_leader.id=
5305 XWindowByName(display,root_window,resource_info->window_group);
5311 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5315 % X M a k e C u r s o r %
5319 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5321 % XMakeCursor() creates a crosshairs X11 cursor.
5323 % The format of the XMakeCursor method is:
5325 % Cursor XMakeCursor(Display *display,Window window,Colormap colormap,
5326 % char *background_color,char *foreground_color)
5328 % A description of each parameter follows:
5330 % o display: Specifies a connection to an X server; returned from
5333 % o window: Specifies the ID of the window for which the cursor is
5336 % o colormap: Specifies the ID of the colormap from which the background
5337 % and foreground color will be retrieved.
5339 % o background_color: Specifies the color to use for the cursor background.
5341 % o foreground_color: Specifies the color to use for the cursor foreground.
5344 MagickPrivate Cursor XMakeCursor(Display *display,Window window,
5345 Colormap colormap,char *background_color,char *foreground_color)
5347 #define scope_height 17
5348 #define scope_x_hot 8
5349 #define scope_y_hot 8
5350 #define scope_width 17
5352 static const unsigned char
5355 0x80, 0x03, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02,
5356 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x7f,
5357 0xfc, 0x01, 0x01, 0x00, 0x01, 0x7f, 0xfc, 0x01, 0x80, 0x02, 0x00,
5358 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02,
5359 0x00, 0x80, 0x02, 0x00, 0x80, 0x03, 0x00
5363 0xc0, 0x07, 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x06, 0x00, 0xc0, 0x06,
5364 0x00, 0xc0, 0x06, 0x00, 0xc0, 0x06, 0x00, 0xff, 0xfe, 0x01, 0x7f,
5365 0xfc, 0x01, 0x03, 0x80, 0x01, 0x7f, 0xfc, 0x01, 0xff, 0xfe, 0x01,
5366 0xc0, 0x06, 0x00, 0xc0, 0x06, 0x00, 0xc0, 0x06, 0x00, 0xc0, 0x06,
5367 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x07, 0x00
5381 assert(display != (Display *) NULL);
5382 assert(window != (Window) NULL);
5383 assert(colormap != (Colormap) NULL);
5384 assert(background_color != (char *) NULL);
5385 assert(foreground_color != (char *) NULL);
5386 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",background_color);
5387 source=XCreateBitmapFromData(display,window,(char *) scope_bits,scope_width,
5389 mask=XCreateBitmapFromData(display,window,(char *) scope_mask_bits,
5390 scope_width,scope_height);
5391 if ((source == (Pixmap) NULL) || (mask == (Pixmap) NULL))
5393 ThrowXWindowException(XServerError,"UnableToCreatePixmap","...");
5394 return((Cursor) NULL);
5396 (void) XParseColor(display,colormap,background_color,&background);
5397 (void) XParseColor(display,colormap,foreground_color,&foreground);
5398 cursor=XCreatePixmapCursor(display,source,mask,&foreground,&background,
5399 scope_x_hot,scope_y_hot);
5400 (void) XFreePixmap(display,source);
5401 (void) XFreePixmap(display,mask);
5406 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5410 % X M a k e I m a g e %
5414 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5416 % XMakeImage() creates an X11 image. If the image size differs from the X11
5417 % image size, the image is first resized.
5419 % The format of the XMakeImage method is:
5421 % MagickBooleanType XMakeImage(Display *display,
5422 % const XResourceInfo *resource_info,XWindowInfo *window,Image *image,
5423 % unsigned int width,unsigned int height,ExceptionInfo *exception)
5425 % A description of each parameter follows:
5427 % o display: Specifies a connection to an X server; returned from
5430 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
5432 % o window: Specifies a pointer to a XWindowInfo structure.
5434 % o image: the image.
5436 % o width: Specifies the width in pixels of the rectangular area to
5439 % o height: Specifies the height in pixels of the rectangular area to
5442 % o exception: return any errors or warnings in this structure.
5445 MagickPrivate MagickBooleanType XMakeImage(Display *display,
5446 const XResourceInfo *resource_info,XWindowInfo *window,Image *image,
5447 unsigned int width,unsigned int height,ExceptionInfo *exception)
5449 #define CheckOverflowException(length,width,height) \
5450 (((height) != 0) && ((length)/((size_t) height) != ((size_t) width)))
5463 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
5464 assert(display != (Display *) NULL);
5465 assert(resource_info != (XResourceInfo *) NULL);
5466 assert(window != (XWindowInfo *) NULL);
5468 assert(height != 0);
5469 if ((window->width == 0) || (window->height == 0))
5470 return(MagickFalse);
5472 Apply user transforms to the image.
5474 (void) XCheckDefineCursor(display,window->id,window->busy_cursor);
5475 (void) XFlush(display);
5476 depth=(int) window->depth;
5477 if (window->destroy)
5478 window->image=DestroyImage(window->image);
5479 window->image=image;
5480 window->destroy=MagickFalse;
5481 if (window->image != (Image *) NULL)
5483 if (window->crop_geometry != (char *) NULL)
5494 window->image->page.x=0;
5495 window->image->page.y=0;
5496 (void) ParsePageGeometry(window->image,window->crop_geometry,
5497 &crop_info,exception);
5498 crop_image=CropImage(window->image,&crop_info,exception);
5499 if (crop_image != (Image *) NULL)
5501 if (window->image != image)
5502 window->image=DestroyImage(window->image);
5503 window->image=crop_image;
5504 window->destroy=MagickTrue;
5507 if ((width != (unsigned int) window->image->columns) ||
5508 (height != (unsigned int) window->image->rows))
5516 resize_image=NewImageList();
5517 if ((window->pixel_info->colors == 0) &&
5518 (window->image->rows > (unsigned long) XDisplayHeight(display,window->screen)) &&
5519 (window->image->columns > (unsigned long) XDisplayWidth(display,window->screen)))
5520 resize_image=ResizeImage(window->image,width,height,
5521 image->filter,exception);
5524 if (window->image->storage_class == PseudoClass)
5525 resize_image=SampleImage(window->image,width,height,
5528 resize_image=ThumbnailImage(window->image,width,height,
5531 if (resize_image != (Image *) NULL)
5533 if (window->image != image)
5534 window->image=DestroyImage(window->image);
5535 window->image=resize_image;
5536 window->destroy=MagickTrue;
5539 width=(unsigned int) window->image->columns;
5540 assert((size_t) width == window->image->columns);
5541 height=(unsigned int) window->image->rows;
5542 assert((size_t) height == window->image->rows);
5547 ximage=(XImage *) NULL;
5548 format=(depth == 1) ? XYBitmap : ZPixmap;
5549 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
5550 if (window->shared_memory != MagickFalse)
5555 segment_info=(XShmSegmentInfo *) window->segment_info;
5556 segment_info[1].shmid=(-1);
5557 segment_info[1].shmaddr=(char *) NULL;
5558 ximage=XShmCreateImage(display,window->visual,(unsigned int) depth,format,
5559 (char *) NULL,&segment_info[1],width,height);
5560 if (ximage == (XImage *) NULL)
5561 window->shared_memory=MagickFalse;
5562 length=(size_t) ximage->bytes_per_line*ximage->height;
5563 if (CheckOverflowException(length,ximage->bytes_per_line,ximage->height))
5564 window->shared_memory=MagickFalse;
5565 if (window->shared_memory != MagickFalse)
5566 segment_info[1].shmid=shmget(IPC_PRIVATE,length,IPC_CREAT | 0777);
5567 if (window->shared_memory != MagickFalse)
5568 segment_info[1].shmaddr=(char *) shmat(segment_info[1].shmid,0,0);
5569 if (segment_info[1].shmid < 0)
5570 window->shared_memory=MagickFalse;
5571 if (window->shared_memory != MagickFalse)
5572 (void) shmctl(segment_info[1].shmid,IPC_RMID,0);
5575 if (ximage != (XImage *) NULL)
5576 XDestroyImage(ximage);
5577 ximage=(XImage *) NULL;
5578 if (segment_info[1].shmaddr)
5580 (void) shmdt(segment_info[1].shmaddr);
5581 segment_info[1].shmaddr=(char *) NULL;
5583 if (segment_info[1].shmid >= 0)
5585 (void) shmctl(segment_info[1].shmid,IPC_RMID,0);
5586 segment_info[1].shmid=(-1);
5592 Allocate X image pixel data.
5594 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
5595 if (window->shared_memory)
5603 (void) XSync(display,MagickFalse);
5604 xerror_alert=MagickFalse;
5605 segment_info=(XShmSegmentInfo *) window->segment_info;
5606 ximage->data=segment_info[1].shmaddr;
5607 segment_info[1].readOnly=MagickFalse;
5608 status=XShmAttach(display,&segment_info[1]);
5609 if (status != False)
5610 (void) XSync(display,MagickFalse);
5611 if ((status == False) || (xerror_alert != MagickFalse))
5613 window->shared_memory=MagickFalse;
5614 if (status != False)
5615 XShmDetach(display,&segment_info[1]);
5617 XDestroyImage(ximage);
5618 ximage=(XImage *) NULL;
5619 if (segment_info[1].shmid >= 0)
5621 if (segment_info[1].shmaddr != NULL)
5622 (void) shmdt(segment_info[1].shmaddr);
5623 (void) shmctl(segment_info[1].shmid,IPC_RMID,0);
5624 segment_info[1].shmid=(-1);
5625 segment_info[1].shmaddr=(char *) NULL;
5630 if (window->shared_memory == MagickFalse)
5631 ximage=XCreateImage(display,window->visual,(unsigned int) depth,format,0,
5632 (char *) NULL,width,height,XBitmapPad(display),0);
5633 if (ximage == (XImage *) NULL)
5636 Unable to create X image.
5638 (void) XCheckDefineCursor(display,window->id,window->cursor);
5639 return(MagickFalse);
5641 length=(size_t) ximage->bytes_per_line*ximage->height;
5642 if (IsEventLogging())
5644 (void) LogMagickEvent(X11Event,GetMagickModule(),"XImage:");
5645 (void) LogMagickEvent(X11Event,GetMagickModule()," width, height: %dx%d",
5646 ximage->width,ximage->height);
5647 (void) LogMagickEvent(X11Event,GetMagickModule()," format: %d",
5649 (void) LogMagickEvent(X11Event,GetMagickModule()," byte order: %d",
5650 ximage->byte_order);
5651 (void) LogMagickEvent(X11Event,GetMagickModule(),
5652 " bitmap unit, bit order, pad: %d %d %d",ximage->bitmap_unit,
5653 ximage->bitmap_bit_order,ximage->bitmap_pad);
5654 (void) LogMagickEvent(X11Event,GetMagickModule()," depth: %d",
5656 (void) LogMagickEvent(X11Event,GetMagickModule()," bytes per line: %d",
5657 ximage->bytes_per_line);
5658 (void) LogMagickEvent(X11Event,GetMagickModule()," bits per pixel: %d",
5659 ximage->bits_per_pixel);
5660 (void) LogMagickEvent(X11Event,GetMagickModule(),
5661 " red, green, blue masks: 0x%lx 0x%lx 0x%lx",ximage->red_mask,
5662 ximage->green_mask,ximage->blue_mask);
5664 if (window->shared_memory == MagickFalse)
5666 if (ximage->format != XYBitmap)
5667 ximage->data=(char *) malloc((size_t) ximage->bytes_per_line*
5670 ximage->data=(char *) malloc((size_t) ximage->bytes_per_line*
5671 ximage->depth*ximage->height);
5673 if (ximage->data == (char *) NULL)
5676 Unable to allocate pixel data.
5678 XDestroyImage(ximage);
5679 ximage=(XImage *) NULL;
5680 (void) XCheckDefineCursor(display,window->id,window->cursor);
5681 return(MagickFalse);
5683 if (window->ximage != (XImage *) NULL)
5686 Destroy previous X image.
5688 length=(size_t) window->ximage->bytes_per_line*window->ximage->height;
5689 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
5690 if (window->segment_info != (XShmSegmentInfo *) NULL)
5695 segment_info=(XShmSegmentInfo *) window->segment_info;
5696 if (segment_info[0].shmid >= 0)
5698 (void) XSync(display,MagickFalse);
5699 (void) XShmDetach(display,&segment_info[0]);
5700 (void) XSync(display,MagickFalse);
5701 if (segment_info[0].shmaddr != (char *) NULL)
5702 (void) shmdt(segment_info[0].shmaddr);
5703 (void) shmctl(segment_info[0].shmid,IPC_RMID,0);
5704 segment_info[0].shmid=(-1);
5705 segment_info[0].shmaddr=(char *) NULL;
5706 window->ximage->data=(char *) NULL;
5710 if (window->ximage->data != (char *) NULL)
5711 free(window->ximage->data);
5712 window->ximage->data=(char *) NULL;
5713 XDestroyImage(window->ximage);
5714 window->ximage=(XImage *) NULL;
5716 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
5717 if (window->segment_info != (XShmSegmentInfo *) NULL)
5722 segment_info=(XShmSegmentInfo *) window->segment_info;
5723 segment_info[0]=segment_info[1];
5726 window->ximage=ximage;
5727 matte_image=(XImage *) NULL;
5728 if ((window->shape != MagickFalse) && (window->image != (Image *) NULL))
5729 if ((window->image->alpha_trait == BlendPixelTrait) &&
5730 ((int) width <= XDisplayWidth(display,window->screen)) &&
5731 ((int) height <= XDisplayHeight(display,window->screen)))
5736 matte_image=XCreateImage(display,window->visual,1,XYBitmap,0,
5737 (char *) NULL,width,height,XBitmapPad(display),0);
5738 if (IsEventLogging())
5740 (void) LogMagickEvent(X11Event,GetMagickModule(),"Matte Image:");
5741 (void) LogMagickEvent(X11Event,GetMagickModule(),
5742 " width, height: %dx%d",matte_image->width,matte_image->height);
5744 if (matte_image != (XImage *) NULL)
5747 Allocate matte image pixel data.
5749 matte_image->data=(char *) malloc((size_t)
5750 matte_image->bytes_per_line*matte_image->depth*
5751 matte_image->height);
5752 if (matte_image->data == (char *) NULL)
5754 XDestroyImage(matte_image);
5755 matte_image=(XImage *) NULL;
5759 if (window->matte_image != (XImage *) NULL)
5764 if (window->matte_image->data != (char *) NULL)
5765 free(window->matte_image->data);
5766 window->matte_image->data=(char *) NULL;
5767 XDestroyImage(window->matte_image);
5768 window->matte_image=(XImage *) NULL;
5770 window->matte_image=matte_image;
5771 if (window->matte_pixmap != (Pixmap) NULL)
5773 (void) XFreePixmap(display,window->matte_pixmap);
5774 window->matte_pixmap=(Pixmap) NULL;
5775 #if defined(MAGICKCORE_HAVE_SHAPE)
5776 if (window->shape != MagickFalse)
5777 XShapeCombineMask(display,window->id,ShapeBounding,0,0,None,ShapeSet);
5780 window->stasis=MagickFalse;
5782 Convert pixels to X image data.
5784 if (window->image != (Image *) NULL)
5786 if ((ximage->byte_order == LSBFirst) || ((ximage->format == XYBitmap) &&
5787 (ximage->bitmap_bit_order == LSBFirst)))
5788 XMakeImageLSBFirst(resource_info,window,window->image,ximage,
5789 matte_image,exception);
5791 XMakeImageMSBFirst(resource_info,window,window->image,ximage,
5792 matte_image,exception);
5794 if (window->matte_image != (XImage *) NULL)
5797 Create matte pixmap.
5799 window->matte_pixmap=XCreatePixmap(display,window->id,width,height,1);
5800 if (window->matte_pixmap != (Pixmap) NULL)
5809 Copy matte image to matte pixmap.
5811 context_values.background=0;
5812 context_values.foreground=1;
5813 graphics_context=XCreateGC(display,window->matte_pixmap,
5814 (size_t) (GCBackground | GCForeground),&context_values);
5815 (void) XPutImage(display,window->matte_pixmap,graphics_context,
5816 window->matte_image,0,0,0,0,width,height);
5817 (void) XFreeGC(display,graphics_context);
5818 #if defined(MAGICKCORE_HAVE_SHAPE)
5819 if (window->shape != MagickFalse)
5820 XShapeCombineMask(display,window->id,ShapeBounding,0,0,
5821 window->matte_pixmap,ShapeSet);
5825 (void) XMakePixmap(display,resource_info,window);
5829 (void) XCheckDefineCursor(display,window->id,window->cursor);
5834 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5838 + X M a k e I m a g e L S B F i r s t %
5842 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5844 % XMakeImageLSBFirst() initializes the pixel data of an X11 Image. The X image
5845 % pixels are copied in least-significant bit and byte first order. The
5846 % server's scanline pad is respected. Rather than using one or two general
5847 % cases, many special cases are found here to help speed up the image
5850 % The format of the XMakeImageLSBFirst method is:
5852 % void XMakeImageLSBFirst(Display *display,XWindows *windows,
5853 % ExceptionInfo *exception)
5855 % A description of each parameter follows:
5857 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
5859 % o window: Specifies a pointer to a XWindowInfo structure.
5861 % o image: the image.
5863 % o ximage: Specifies a pointer to a XImage structure; returned from
5866 % o matte_image: Specifies a pointer to a XImage structure; returned from
5869 % o exception: return any errors or warnings in this structure.
5872 static void XMakeImageLSBFirst(const XResourceInfo *resource_info,
5873 const XWindowInfo *window,Image *image,XImage *ximage,XImage *matte_image,
5874 ExceptionInfo *exception)
5885 register const Quantum
5891 register unsigned char
5908 assert(resource_info != (XResourceInfo *) NULL);
5909 assert(window != (XWindowInfo *) NULL);
5910 assert(image != (Image *) NULL);
5911 if (image->debug != MagickFalse)
5912 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
5914 if ((window->immutable == MagickFalse) &&
5915 (image->storage_class == DirectClass) && (image->alpha_trait == BlendPixelTrait))
5918 size[MaxTextExtent];
5926 image_info=AcquireImageInfo();
5927 (void) CopyMagickString(image_info->filename,
5928 resource_info->image_info->texture != (char *) NULL ?
5929 resource_info->image_info->texture : "pattern:checkerboard",
5931 (void) FormatLocaleString(size,MaxTextExtent,"%.20gx%.20g",(double)
5932 image->columns,(double) image->rows);
5933 image_info->size=ConstantString(size);
5934 pattern=ReadImage(image_info,exception);
5935 image_info=DestroyImageInfo(image_info);
5936 if (pattern != (Image *) NULL)
5938 canvas=CloneImage(image,0,0,MagickTrue,exception);
5939 if (canvas != (Image *) NULL)
5940 (void) CompositeImage(canvas,pattern,DstOverCompositeOp,MagickTrue,
5942 pattern=DestroyImage(pattern);
5945 scanline_pad=(unsigned int) (ximage->bytes_per_line-((ximage->width*
5946 ximage->bits_per_pixel) >> 3));
5947 map_info=window->map_info;
5948 pixels=window->pixel_info->pixels;
5949 q=(unsigned char *) ximage->data;
5951 canvas_view=AcquireVirtualCacheView(canvas,exception);
5952 if (ximage->format == XYBitmap)
5954 register unsigned short
5962 Convert canvas to big-endian bitmap.
5964 background=(unsigned char)
5965 (XPixelIntensity(&window->pixel_info->foreground_color) <
5966 XPixelIntensity(&window->pixel_info->background_color) ? 0x80 : 0x00);
5967 foreground=(unsigned char)
5968 (XPixelIntensity(&window->pixel_info->background_color) <
5969 XPixelIntensity(&window->pixel_info->foreground_color) ? 0x80 : 0x00);
5970 polarity=(unsigned short) ((GetPixelInfoIntensity(
5971 &canvas->colormap[0])) < (QuantumRange/2) ? 1 : 0);
5972 if (canvas->colors == 2)
5973 polarity=GetPixelInfoIntensity(&canvas->colormap[0]) <
5974 GetPixelInfoIntensity(&canvas->colormap[1]);
5975 for (y=0; y < (int) canvas->rows; y++)
5977 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,canvas->columns,1,
5979 if (p == (const Quantum *) NULL)
5983 for (x=0; x < (int) canvas->columns; x++)
5986 if (GetPixelIndex(canvas,p) == (Quantum) polarity)
5997 p+=GetPixelChannels(canvas);
6005 if (window->pixel_info->colors != 0)
6006 switch (ximage->bits_per_pixel)
6010 register unsigned int
6014 Convert to 2 bit color-mapped X canvas.
6016 for (y=0; y < (int) canvas->rows; y++)
6018 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6019 canvas->columns,1,exception);
6020 if (p == (const Quantum *) NULL)
6023 for (x=0; x < (int) canvas->columns; x++)
6025 pixel=pixels[(ssize_t) GetPixelIndex(canvas,p)] & 0x0f;
6030 *q=(unsigned char) pixel;
6036 *q|=(unsigned char) (pixel << 2);
6042 *q|=(unsigned char) (pixel << 4);
6048 *q|=(unsigned char) (pixel << 6);
6054 p+=GetPixelChannels(canvas);
6062 register unsigned int
6066 Convert to 4 bit color-mapped X canvas.
6068 for (y=0; y < (int) canvas->rows; y++)
6070 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6071 canvas->columns,1,exception);
6072 if (p == (const Quantum *) NULL)
6075 for (x=0; x < (int) canvas->columns; x++)
6077 pixel=pixels[(ssize_t) GetPixelIndex(canvas,p)] & 0xf;
6082 *q=(unsigned char) pixel;
6088 *q|=(unsigned char) (pixel << 4);
6094 p+=GetPixelChannels(canvas);
6104 Convert to 8 bit color-mapped X canvas.
6106 if (resource_info->color_recovery &&
6107 resource_info->quantize_info->dither_method != NoDitherMethod)
6109 XDitherImage(canvas,ximage,exception);
6112 for (y=0; y < (int) canvas->rows; y++)
6114 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6115 canvas->columns,1,exception);
6116 if (p == (const Quantum *) NULL)
6118 for (x=0; x < (int) canvas->columns; x++)
6120 pixel=pixels[(ssize_t) GetPixelIndex(canvas,p)];
6121 *q++=(unsigned char) pixel;
6122 p+=GetPixelChannels(canvas);
6133 register unsigned int
6137 Convert to multi-byte color-mapped X canvas.
6139 bytes_per_pixel=(unsigned int) (ximage->bits_per_pixel >> 3);
6140 for (y=0; y < (int) canvas->rows; y++)
6142 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6143 canvas->columns,1,exception);
6144 if (p == (const Quantum *) NULL)
6146 for (x=0; x < (int) canvas->columns; x++)
6148 pixel=pixels[(ssize_t) GetPixelIndex(canvas,p)];
6149 for (k=0; k < (int) bytes_per_pixel; k++)
6151 *q++=(unsigned char) (pixel & 0xff);
6154 p+=GetPixelChannels(canvas);
6162 switch (ximage->bits_per_pixel)
6166 register unsigned int
6170 Convert to contiguous 2 bit continuous-tone X canvas.
6172 for (y=0; y < (int) canvas->rows; y++)
6175 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6176 canvas->columns,1,exception);
6177 if (p == (const Quantum *) NULL)
6179 for (x=0; x < (int) canvas->columns; x++)
6181 pixel=XGammaPixel(canvas,map_info,p);
6187 *q=(unsigned char) pixel;
6193 *q|=(unsigned char) (pixel << 2);
6199 *q|=(unsigned char) (pixel << 4);
6205 *q|=(unsigned char) (pixel << 6);
6211 p+=GetPixelChannels(canvas);
6219 register unsigned int
6223 Convert to contiguous 4 bit continuous-tone X canvas.
6225 for (y=0; y < (int) canvas->rows; y++)
6227 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6228 canvas->columns,1,exception);
6229 if (p == (const Quantum *) NULL)
6232 for (x=0; x < (int) canvas->columns; x++)
6234 pixel=XGammaPixel(canvas,map_info,p);
6240 *q=(unsigned char) pixel;
6246 *q|=(unsigned char) (pixel << 4);
6252 p+=GetPixelChannels(canvas);
6262 Convert to contiguous 8 bit continuous-tone X canvas.
6264 if (resource_info->color_recovery &&
6265 resource_info->quantize_info->dither_method != NoDitherMethod)
6267 XDitherImage(canvas,ximage,exception);
6270 for (y=0; y < (int) canvas->rows; y++)
6272 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6273 canvas->columns,1,exception);
6274 if (p == (const Quantum *) NULL)
6276 for (x=0; x < (int) canvas->columns; x++)
6278 pixel=XGammaPixel(canvas,map_info,p);
6279 *q++=(unsigned char) pixel;
6280 p+=GetPixelChannels(canvas);
6288 if ((ximage->bits_per_pixel == 32) && (map_info->red_max == 255) &&
6289 (map_info->green_max == 255) && (map_info->blue_max == 255) &&
6290 (map_info->red_mult == 65536L) && (map_info->green_mult == 256) &&
6291 (map_info->blue_mult == 1))
6294 Convert to 32 bit continuous-tone X canvas.
6296 for (y=0; y < (int) canvas->rows; y++)
6298 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6299 canvas->columns,1,exception);
6300 if (p == (const Quantum *) NULL)
6302 if ((red_gamma != 1.0) || (green_gamma != 1.0) ||
6303 (blue_gamma != 1.0))
6306 Gamma correct canvas.
6308 for (x=(int) canvas->columns-1; x >= 0; x--)
6310 *q++=ScaleQuantumToChar(XBlueGamma(
6311 GetPixelBlue(canvas,p)));
6312 *q++=ScaleQuantumToChar(XGreenGamma(
6313 GetPixelGreen(canvas,p)));
6314 *q++=ScaleQuantumToChar(XRedGamma(
6315 GetPixelRed(canvas,p)));
6317 p+=GetPixelChannels(canvas);
6321 for (x=(int) canvas->columns-1; x >= 0; x--)
6323 *q++=ScaleQuantumToChar((Quantum) GetPixelBlue(canvas,p));
6324 *q++=ScaleQuantumToChar((Quantum) GetPixelGreen(canvas,p));
6325 *q++=ScaleQuantumToChar((Quantum) GetPixelRed(canvas,p));
6327 p+=GetPixelChannels(canvas);
6332 if ((ximage->bits_per_pixel == 32) && (map_info->red_max == 255) &&
6333 (map_info->green_max == 255) && (map_info->blue_max == 255) &&
6334 (map_info->red_mult == 1) && (map_info->green_mult == 256) &&
6335 (map_info->blue_mult == 65536L))
6338 Convert to 32 bit continuous-tone X canvas.
6340 for (y=0; y < (int) canvas->rows; y++)
6342 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6343 canvas->columns,1,exception);
6344 if (p == (const Quantum *) NULL)
6346 if ((red_gamma != 1.0) || (green_gamma != 1.0) ||
6347 (blue_gamma != 1.0))
6350 Gamma correct canvas.
6352 for (x=(int) canvas->columns-1; x >= 0; x--)
6354 *q++=ScaleQuantumToChar(XRedGamma(
6355 GetPixelRed(canvas,p)));
6356 *q++=ScaleQuantumToChar(XGreenGamma(
6357 GetPixelGreen(canvas,p)));
6358 *q++=ScaleQuantumToChar(XBlueGamma(
6359 GetPixelBlue(canvas,p)));
6361 p+=GetPixelChannels(canvas);
6365 for (x=(int) canvas->columns-1; x >= 0; x--)
6367 *q++=ScaleQuantumToChar((Quantum) GetPixelRed(canvas,p));
6368 *q++=ScaleQuantumToChar((Quantum) GetPixelGreen(canvas,p));
6369 *q++=ScaleQuantumToChar((Quantum) GetPixelBlue(canvas,p));
6371 p+=GetPixelChannels(canvas);
6380 register unsigned int
6384 Convert to multi-byte continuous-tone X canvas.
6386 bytes_per_pixel=(unsigned int) (ximage->bits_per_pixel >> 3);
6387 for (y=0; y < (int) canvas->rows; y++)
6389 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6390 canvas->columns,1,exception);
6391 if (p == (const Quantum *) NULL)
6393 for (x=0; x < (int) canvas->columns; x++)
6395 pixel=XGammaPixel(canvas,map_info,p);
6396 for (k=0; k < (int) bytes_per_pixel; k++)
6398 *q++=(unsigned char) (pixel & 0xff);
6401 p+=GetPixelChannels(canvas);
6409 if (matte_image != (XImage *) NULL)
6412 Initialize matte canvas.
6414 scanline_pad=(unsigned int) (matte_image->bytes_per_line-
6415 ((matte_image->width*matte_image->bits_per_pixel) >> 3));
6416 q=(unsigned char *) matte_image->data;
6417 for (y=0; y < (int) canvas->rows; y++)
6419 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,canvas->columns,1,
6421 if (p == (const Quantum *) NULL)
6425 for (x=(int) canvas->columns-1; x >= 0; x--)
6428 if (GetPixelAlpha(canvas,p) > (QuantumRange/2))
6437 p+=GetPixelChannels(canvas);
6444 canvas_view=DestroyCacheView(canvas_view);
6445 if (canvas != image)
6446 canvas=DestroyImage(canvas);
6450 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6454 + X M a k e I m a g e M S B F i r s t %
6458 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6460 % XMakeImageMSBFirst() initializes the pixel data of an X11 Image. The X
6461 % image pixels are copied in most-significant bit and byte first order. The
6462 % server's scanline pad is also respected. Rather than using one or two
6463 % general cases, many special cases are found here to help speed up the image
6466 % The format of the XMakeImageMSBFirst method is:
6468 % XMakeImageMSBFirst(resource_info,window,image,ximage,matte_image,
6469 % ExceptionInfo *exception)
6471 % A description of each parameter follows:
6473 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
6475 % o window: Specifies a pointer to a XWindowInfo structure.
6477 % o image: the image.
6479 % o ximage: Specifies a pointer to a XImage structure; returned from
6482 % o matte_image: Specifies a pointer to a XImage structure; returned from
6485 % o exception: return any errors or warnings in this structure.
6488 static void XMakeImageMSBFirst(const XResourceInfo *resource_info,
6489 const XWindowInfo *window,Image *image,XImage *ximage,XImage *matte_image,
6490 ExceptionInfo *exception)
6504 register const Quantum
6507 register unsigned char
6524 assert(resource_info != (XResourceInfo *) NULL);
6525 assert(window != (XWindowInfo *) NULL);
6526 assert(image != (Image *) NULL);
6527 if (image->debug != MagickFalse)
6528 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
6530 if ((window->immutable != MagickFalse) &&
6531 (image->storage_class == DirectClass) && (image->alpha_trait == BlendPixelTrait))
6534 size[MaxTextExtent];
6542 image_info=AcquireImageInfo();
6543 (void) CopyMagickString(image_info->filename,
6544 resource_info->image_info->texture != (char *) NULL ?
6545 resource_info->image_info->texture : "pattern:checkerboard",
6547 (void) FormatLocaleString(size,MaxTextExtent,"%.20gx%.20g",(double)
6548 image->columns,(double) image->rows);
6549 image_info->size=ConstantString(size);
6550 pattern=ReadImage(image_info,exception);
6551 image_info=DestroyImageInfo(image_info);
6552 if (pattern != (Image *) NULL)
6554 canvas=CloneImage(image,0,0,MagickTrue,exception);
6555 if (canvas != (Image *) NULL)
6556 (void) CompositeImage(canvas,pattern,DstOverCompositeOp,MagickFalse,
6558 pattern=DestroyImage(pattern);
6561 scanline_pad=(unsigned int) (ximage->bytes_per_line-((ximage->width*
6562 ximage->bits_per_pixel) >> 3));
6563 map_info=window->map_info;
6564 pixels=window->pixel_info->pixels;
6565 q=(unsigned char *) ximage->data;
6567 canvas_view=AcquireVirtualCacheView(canvas,exception);
6568 if (ximage->format == XYBitmap)
6570 register unsigned short
6578 Convert canvas to big-endian bitmap.
6580 background=(unsigned char)
6581 (XPixelIntensity(&window->pixel_info->foreground_color) <
6582 XPixelIntensity(&window->pixel_info->background_color) ? 0x01 : 0x00);
6583 foreground=(unsigned char)
6584 (XPixelIntensity(&window->pixel_info->background_color) <
6585 XPixelIntensity(&window->pixel_info->foreground_color) ? 0x01 : 0x00);
6586 polarity=(unsigned short) ((GetPixelInfoIntensity(
6587 &canvas->colormap[0])) < (QuantumRange/2) ? 1 : 0);
6588 if (canvas->colors == 2)
6589 polarity=GetPixelInfoIntensity(&canvas->colormap[0]) <
6590 GetPixelInfoIntensity(&canvas->colormap[1]);
6591 for (y=0; y < (int) canvas->rows; y++)
6593 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,canvas->columns,1,
6595 if (p == (const Quantum *) NULL)
6599 for (x=(int) canvas->columns-1; x >= 0; x--)
6602 if (GetPixelIndex(canvas,p) == (Quantum) polarity)
6613 p+=GetPixelChannels(canvas);
6621 if (window->pixel_info->colors != 0)
6622 switch (ximage->bits_per_pixel)
6626 register unsigned int
6630 Convert to 2 bit color-mapped X canvas.
6632 for (y=0; y < (int) canvas->rows; y++)
6634 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6635 canvas->columns,1,exception);
6636 if (p == (const Quantum *) NULL)
6639 for (x=0; x < (int) canvas->columns; x++)
6641 pixel=pixels[(ssize_t)
6642 GetPixelIndex(canvas,p)] & 0xf;
6647 *q=(unsigned char) (pixel << 6);
6653 *q|=(unsigned char) (pixel << 4);
6659 *q|=(unsigned char) (pixel << 2);
6665 *q|=(unsigned char) pixel;
6671 p+=GetPixelChannels(canvas);
6679 register unsigned int
6683 Convert to 4 bit color-mapped X canvas.
6685 for (y=0; y < (int) canvas->rows; y++)
6687 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6688 canvas->columns,1,exception);
6689 if (p == (const Quantum *) NULL)
6692 for (x=0; x < (int) canvas->columns; x++)
6694 pixel=pixels[(ssize_t)
6695 GetPixelIndex(canvas,p)] & 0xf;
6700 *q=(unsigned char) (pixel << 4);
6706 *q|=(unsigned char) pixel;
6712 p+=GetPixelChannels(canvas);
6722 Convert to 8 bit color-mapped X canvas.
6724 if (resource_info->color_recovery &&
6725 resource_info->quantize_info->dither_method != NoDitherMethod)
6727 XDitherImage(canvas,ximage,exception);
6730 for (y=0; y < (int) canvas->rows; y++)
6732 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6733 canvas->columns,1,exception);
6734 if (p == (const Quantum *) NULL)
6736 for (x=0; x < (int) canvas->columns; x++)
6738 pixel=pixels[(ssize_t) GetPixelIndex(canvas,p)];
6739 *q++=(unsigned char) pixel;
6740 p+=GetPixelChannels(canvas);
6751 register unsigned int
6755 channel[sizeof(size_t)];
6758 Convert to 8 bit color-mapped X canvas.
6760 bytes_per_pixel=(unsigned int) (ximage->bits_per_pixel >> 3);
6761 for (y=0; y < (int) canvas->rows; y++)
6763 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6764 canvas->columns,1,exception);
6765 if (p == (const Quantum *) NULL)
6767 for (x=0; x < (int) canvas->columns; x++)
6769 pixel=pixels[(ssize_t)
6770 GetPixelIndex(canvas,p)];
6771 for (k=(int) bytes_per_pixel-1; k >= 0; k--)
6773 channel[k]=(unsigned char) pixel;
6776 for (k=0; k < (int) bytes_per_pixel; k++)
6778 p+=GetPixelChannels(canvas);
6786 switch (ximage->bits_per_pixel)
6790 register unsigned int
6794 Convert to 4 bit continuous-tone X canvas.
6796 for (y=0; y < (int) canvas->rows; y++)
6798 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6799 canvas->columns,1,exception);
6800 if (p == (const Quantum *) NULL)
6803 for (x=(int) canvas->columns-1; x >= 0; x--)
6805 pixel=XGammaPixel(canvas,map_info,p);
6811 *q=(unsigned char) (pixel << 6);
6817 *q|=(unsigned char) (pixel << 4);
6823 *q|=(unsigned char) (pixel << 2);
6829 *q|=(unsigned char) pixel;
6835 p+=GetPixelChannels(canvas);
6843 register unsigned int
6847 Convert to 4 bit continuous-tone X canvas.
6849 for (y=0; y < (int) canvas->rows; y++)
6851 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6852 canvas->columns,1,exception);
6853 if (p == (const Quantum *) NULL)
6856 for (x=(int) canvas->columns-1; x >= 0; x--)
6858 pixel=XGammaPixel(canvas,map_info,p);
6864 *q=(unsigned char) (pixel << 4);
6870 *q|=(unsigned char) pixel;
6876 p+=GetPixelChannels(canvas);
6886 Convert to 8 bit continuous-tone X canvas.
6888 if (resource_info->color_recovery &&
6889 resource_info->quantize_info->dither_method != NoDitherMethod)
6891 XDitherImage(canvas,ximage,exception);
6894 for (y=0; y < (int) canvas->rows; y++)
6896 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6897 canvas->columns,1,exception);
6898 if (p == (const Quantum *) NULL)
6900 for (x=(int) canvas->columns-1; x >= 0; x--)
6902 pixel=XGammaPixel(canvas,map_info,p);
6903 *q++=(unsigned char) pixel;
6904 p+=GetPixelChannels(canvas);
6912 if ((ximage->bits_per_pixel == 32) && (map_info->red_max == 255) &&
6913 (map_info->green_max == 255) && (map_info->blue_max == 255) &&
6914 (map_info->red_mult == 65536L) && (map_info->green_mult == 256) &&
6915 (map_info->blue_mult == 1))
6918 Convert to 32 bit continuous-tone X canvas.
6920 for (y=0; y < (int) canvas->rows; y++)
6922 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6923 canvas->columns,1,exception);
6924 if (p == (const Quantum *) NULL)
6926 if ((red_gamma != 1.0) || (green_gamma != 1.0) ||
6927 (blue_gamma != 1.0))
6930 Gamma correct canvas.
6932 for (x=(int) canvas->columns-1; x >= 0; x--)
6935 *q++=ScaleQuantumToChar(XRedGamma(
6936 GetPixelRed(canvas,p)));
6937 *q++=ScaleQuantumToChar(XGreenGamma(
6938 GetPixelGreen(canvas,p)));
6939 *q++=ScaleQuantumToChar(XBlueGamma(
6940 GetPixelBlue(canvas,p)));
6941 p+=GetPixelChannels(canvas);
6945 for (x=(int) canvas->columns-1; x >= 0; x--)
6948 *q++=ScaleQuantumToChar((Quantum) GetPixelRed(canvas,p));
6949 *q++=ScaleQuantumToChar((Quantum) GetPixelGreen(canvas,p));
6950 *q++=ScaleQuantumToChar((Quantum) GetPixelBlue(canvas,p));
6951 p+=GetPixelChannels(canvas);
6956 if ((ximage->bits_per_pixel == 32) && (map_info->red_max == 255) &&
6957 (map_info->green_max == 255) && (map_info->blue_max == 255) &&
6958 (map_info->red_mult == 1) && (map_info->green_mult == 256) &&
6959 (map_info->blue_mult == 65536L))
6962 Convert to 32 bit continuous-tone X canvas.
6964 for (y=0; y < (int) canvas->rows; y++)
6966 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6967 canvas->columns,1,exception);
6968 if (p == (const Quantum *) NULL)
6970 if ((red_gamma != 1.0) || (green_gamma != 1.0) ||
6971 (blue_gamma != 1.0))
6974 Gamma correct canvas.
6976 for (x=(int) canvas->columns-1; x >= 0; x--)
6979 *q++=ScaleQuantumToChar(XBlueGamma(
6980 GetPixelBlue(canvas,p)));
6981 *q++=ScaleQuantumToChar(XGreenGamma(
6982 GetPixelGreen(canvas,p)));
6983 *q++=ScaleQuantumToChar(XRedGamma(
6984 GetPixelRed(canvas,p)));
6985 p+=GetPixelChannels(canvas);
6989 for (x=(int) canvas->columns-1; x >= 0; x--)
6992 *q++=ScaleQuantumToChar((Quantum) GetPixelBlue(canvas,p));
6993 *q++=ScaleQuantumToChar((Quantum) GetPixelGreen(canvas,p));
6994 *q++=ScaleQuantumToChar((Quantum) GetPixelRed(canvas,p));
6995 p+=GetPixelChannels(canvas);
7004 register unsigned int
7008 channel[sizeof(size_t)];
7011 Convert to multi-byte continuous-tone X canvas.
7013 bytes_per_pixel=(unsigned int) (ximage->bits_per_pixel >> 3);
7014 for (y=0; y < (int) canvas->rows; y++)
7016 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
7017 canvas->columns,1,exception);
7018 if (p == (const Quantum *) NULL)
7020 for (x=(int) canvas->columns-1; x >= 0; x--)
7022 pixel=XGammaPixel(canvas,map_info,p);
7023 for (k=(int) bytes_per_pixel-1; k >= 0; k--)
7025 channel[k]=(unsigned char) pixel;
7028 for (k=0; k < (int) bytes_per_pixel; k++)
7030 p+=GetPixelChannels(canvas);
7038 if (matte_image != (XImage *) NULL)
7041 Initialize matte canvas.
7043 scanline_pad=(unsigned int) (matte_image->bytes_per_line-
7044 ((matte_image->width*matte_image->bits_per_pixel) >> 3));
7045 q=(unsigned char *) matte_image->data;
7046 for (y=0; y < (int) canvas->rows; y++)
7048 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,canvas->columns,1,
7050 if (p == (const Quantum *) NULL)
7054 for (x=(int) canvas->columns-1; x >= 0; x--)
7057 if (GetPixelAlpha(canvas,p) > (QuantumRange/2))
7066 p+=GetPixelChannels(canvas);
7073 canvas_view=DestroyCacheView(canvas_view);
7074 if (canvas != image)
7075 canvas=DestroyImage(canvas);
7079 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7083 % X M a k e M a g n i f y I m a g e %
7087 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7089 % XMakeMagnifyImage() magnifies a region of an X image and displays it.
7091 % The format of the XMakeMagnifyImage method is:
7093 % void XMakeMagnifyImage(Display *display,XWindows *windows,
7094 % ExceptionInfo *exception)
7096 % A description of each parameter follows:
7098 % o display: Specifies a connection to an X server; returned from
7101 % o windows: Specifies a pointer to a XWindows structure.
7103 % o exception: return any errors or warnings in this structure.
7106 MagickPrivate void XMakeMagnifyImage(Display *display,XWindows *windows,
7107 ExceptionInfo *exception)
7110 tuple[MaxTextExtent];
7124 register unsigned char
7132 previous_magnify = 0;
7150 Check boundary conditions.
7152 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
7153 assert(display != (Display *) NULL);
7154 assert(windows != (XWindows *) NULL);
7156 for (n=1; n < (ssize_t) windows->magnify.data; n++)
7158 while ((magnify*windows->image.ximage->width) < windows->magnify.width)
7160 while ((magnify*windows->image.ximage->height) < windows->magnify.height)
7162 while (magnify > windows->magnify.width)
7164 while (magnify > windows->magnify.height)
7166 if (magnify != previous_magnify)
7175 New magnify factor: update magnify window name.
7178 while ((1 << i) <= (int) magnify)
7180 (void) FormatLocaleString(windows->magnify.name,MaxTextExtent,
7181 "Magnify %.20gX",(double) i);
7182 status=XStringListToTextProperty(&windows->magnify.name,1,&window_name);
7183 if (status != False)
7185 XSetWMName(display,windows->magnify.id,&window_name);
7186 XSetWMIconName(display,windows->magnify.id,&window_name);
7187 (void) XFree((void *) window_name.value);
7190 previous_magnify=magnify;
7191 ximage=windows->image.ximage;
7192 width=(unsigned int) windows->magnify.ximage->width;
7193 height=(unsigned int) windows->magnify.ximage->height;
7194 if ((windows->magnify.x < 0) ||
7195 (windows->magnify.x >= windows->image.ximage->width))
7196 windows->magnify.x=windows->image.ximage->width >> 1;
7197 x=windows->magnify.x-((width/magnify) >> 1);
7201 if (x > (int) (ximage->width-(width/magnify)))
7202 x=ximage->width-width/magnify;
7203 if ((windows->magnify.y < 0) ||
7204 (windows->magnify.y >= windows->image.ximage->height))
7205 windows->magnify.y=windows->image.ximage->height >> 1;
7206 y=windows->magnify.y-((height/magnify) >> 1);
7210 if (y > (int) (ximage->height-(height/magnify)))
7211 y=ximage->height-height/magnify;
7212 q=(unsigned char *) windows->magnify.ximage->data;
7213 scanline_pad=(unsigned int) (windows->magnify.ximage->bytes_per_line-
7214 ((width*windows->magnify.ximage->bits_per_pixel) >> 3));
7215 if (ximage->bits_per_pixel < 8)
7217 register unsigned char
7224 register unsigned int
7230 pixel_info=windows->magnify.pixel_info;
7231 switch (ximage->bitmap_bit_order)
7236 Magnify little-endian bitmap.
7240 if (ximage->format == XYBitmap)
7242 background=(unsigned char)
7243 (XPixelIntensity(&pixel_info->foreground_color) <
7244 XPixelIntensity(&pixel_info->background_color) ? 0x80 : 0x00);
7245 foreground=(unsigned char)
7246 (XPixelIntensity(&pixel_info->background_color) <
7247 XPixelIntensity(&pixel_info->foreground_color) ? 0x80 : 0x00);
7248 if (windows->magnify.depth > 1)
7249 Swap(background,foreground);
7251 for (i=0; i < (ssize_t) height; i+=magnify)
7254 Propogate pixel magnify rows.
7256 for (j=0; j < magnify; j++)
7258 p=(unsigned char *) ximage->data+y*ximage->bytes_per_line+
7259 ((x*ximage->bits_per_pixel) >> 3);
7260 p_bit=(unsigned char) (x*ximage->bits_per_pixel) & 0x07;
7263 for (k=0; k < width; k+=magnify)
7266 Propogate pixel magnify columns.
7268 for (l=0; l < magnify; l++)
7271 Propogate each bit plane.
7273 for (plane=0; (int) plane < ximage->bits_per_pixel; plane++)
7276 if (*p & (0x01 << (p_bit+plane)))
7289 p_bit+=ximage->bits_per_pixel;
7296 *q=byte >> (8-q_bit);
7308 Magnify big-endian bitmap.
7312 if (ximage->format == XYBitmap)
7314 background=(unsigned char)
7315 (XPixelIntensity(&pixel_info->foreground_color) <
7316 XPixelIntensity(&pixel_info->background_color) ? 0x01 : 0x00);
7317 foreground=(unsigned char)
7318 (XPixelIntensity(&pixel_info->background_color) <
7319 XPixelIntensity(&pixel_info->foreground_color) ? 0x01 : 0x00);
7320 if (windows->magnify.depth > 1)
7321 Swap(background,foreground);
7323 for (i=0; i < (ssize_t) height; i+=magnify)
7326 Propogate pixel magnify rows.
7328 for (j=0; j < magnify; j++)
7330 p=(unsigned char *) ximage->data+y*ximage->bytes_per_line+
7331 ((x*ximage->bits_per_pixel) >> 3);
7332 p_bit=(unsigned char) (x*ximage->bits_per_pixel) & 0x07;
7335 for (k=0; k < width; k+=magnify)
7338 Propogate pixel magnify columns.
7340 for (l=0; l < magnify; l++)
7343 Propogate each bit plane.
7345 for (plane=0; (int) plane < ximage->bits_per_pixel; plane++)
7348 if (*p & (0x80 >> (p_bit+plane)))
7361 p_bit+=ximage->bits_per_pixel;
7368 *q=byte << (8-q_bit);
7379 switch (ximage->bits_per_pixel)
7385 Magnify 8 bit X image.
7387 for (i=0; i < (ssize_t) height; i+=magnify)
7390 Propogate pixel magnify rows.
7392 for (j=0; j < magnify; j++)
7394 p=(unsigned char *) ximage->data+y*ximage->bytes_per_line+
7395 ((x*ximage->bits_per_pixel) >> 3);
7396 for (k=0; k < width; k+=magnify)
7399 Propogate pixel magnify columns.
7401 for (l=0; l < magnify; l++)
7413 register unsigned int
7418 Magnify multi-byte X image.
7420 bytes_per_pixel=(unsigned int) ximage->bits_per_pixel >> 3;
7421 for (i=0; i < (ssize_t) height; i+=magnify)
7424 Propogate pixel magnify rows.
7426 for (j=0; j < magnify; j++)
7428 p=(unsigned char *) ximage->data+y*ximage->bytes_per_line+
7429 ((x*ximage->bits_per_pixel) >> 3);
7430 for (k=0; k < width; k+=magnify)
7433 Propogate pixel magnify columns.
7435 for (l=0; l < magnify; l++)
7436 for (m=0; m < bytes_per_pixel; m++)
7448 Copy X image to magnify pixmap.
7450 x=windows->magnify.x-((width/magnify) >> 1);
7452 x=(int) ((width >> 1)-windows->magnify.x*magnify);
7454 if (x > (int) (ximage->width-(width/magnify)))
7455 x=(int) ((ximage->width-windows->magnify.x)*magnify-(width >> 1));
7458 y=windows->magnify.y-((height/magnify) >> 1);
7460 y=(int) ((height >> 1)-windows->magnify.y*magnify);
7462 if (y > (int) (ximage->height-(height/magnify)))
7463 y=(int) ((ximage->height-windows->magnify.y)*magnify-(height >> 1));
7466 if ((x != 0) || (y != 0))
7467 (void) XFillRectangle(display,windows->magnify.pixmap,
7468 windows->magnify.annotate_context,0,0,width,height);
7469 (void) XPutImage(display,windows->magnify.pixmap,
7470 windows->magnify.annotate_context,windows->magnify.ximage,0,0,x,y,width-x,
7472 if ((magnify > 1) && ((magnify <= (width >> 1)) &&
7473 (magnify <= (height >> 1))))
7479 Highlight center pixel.
7481 highlight_info.x=(ssize_t) windows->magnify.width >> 1;
7482 highlight_info.y=(ssize_t) windows->magnify.height >> 1;
7483 highlight_info.width=magnify;
7484 highlight_info.height=magnify;
7485 (void) XDrawRectangle(display,windows->magnify.pixmap,
7486 windows->magnify.highlight_context,(int) highlight_info.x,
7487 (int) highlight_info.y,(unsigned int) highlight_info.width-1,
7488 (unsigned int) highlight_info.height-1);
7490 (void) XDrawRectangle(display,windows->magnify.pixmap,
7491 windows->magnify.annotate_context,(int) highlight_info.x+1,
7492 (int) highlight_info.y+1,(unsigned int) highlight_info.width-3,
7493 (unsigned int) highlight_info.height-3);
7496 Show center pixel color.
7498 (void) GetOneVirtualPixelInfo(windows->image.image,TileVirtualPixelMethod,
7499 (ssize_t) windows->magnify.x,(ssize_t) windows->magnify.y,&pixel,exception);
7500 (void) FormatLocaleString(tuple,MaxTextExtent,"%d,%d: ",
7501 windows->magnify.x,windows->magnify.y);
7502 (void) ConcatenateMagickString(tuple,"(",MaxTextExtent);
7503 ConcatenateColorComponent(&pixel,RedPixelChannel,X11Compliance,tuple);
7504 (void) ConcatenateMagickString(tuple,",",MaxTextExtent);
7505 ConcatenateColorComponent(&pixel,GreenPixelChannel,X11Compliance,tuple);
7506 (void) ConcatenateMagickString(tuple,",",MaxTextExtent);
7507 ConcatenateColorComponent(&pixel,BluePixelChannel,X11Compliance,tuple);
7508 if (pixel.colorspace == CMYKColorspace)
7510 (void) ConcatenateMagickString(tuple,",",MaxTextExtent);
7511 ConcatenateColorComponent(&pixel,BlackPixelChannel,X11Compliance,tuple);
7513 if (pixel.alpha_trait == BlendPixelTrait)
7515 (void) ConcatenateMagickString(tuple,",",MaxTextExtent);
7516 ConcatenateColorComponent(&pixel,AlphaPixelChannel,X11Compliance,tuple);
7518 (void) ConcatenateMagickString(tuple,")",MaxTextExtent);
7519 height=(unsigned int) windows->magnify.font_info->ascent+
7520 windows->magnify.font_info->descent;
7521 x=windows->magnify.font_info->max_bounds.width >> 1;
7522 y=windows->magnify.font_info->ascent+(height >> 2);
7523 (void) XDrawImageString(display,windows->magnify.pixmap,
7524 windows->magnify.annotate_context,x,y,tuple,(int) strlen(tuple));
7525 GetColorTuple(&pixel,MagickTrue,tuple);
7527 (void) XDrawImageString(display,windows->magnify.pixmap,
7528 windows->magnify.annotate_context,x,y,tuple,(int) strlen(tuple));
7529 (void) QueryColorname(windows->image.image,&pixel,SVGCompliance,tuple,
7532 (void) XDrawImageString(display,windows->magnify.pixmap,
7533 windows->magnify.annotate_context,x,y,tuple,(int) strlen(tuple));
7535 Refresh magnify window.
7537 magnify_window=windows->magnify;
7540 XRefreshWindow(display,&magnify_window,(XEvent *) NULL);
7544 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7548 % X M a k e P i x m a p %
7552 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7554 % XMakePixmap() creates an X11 pixmap.
7556 % The format of the XMakePixmap method is:
7558 % void XMakeStandardColormap(Display *display,XVisualInfo *visual_info,
7559 % XResourceInfo *resource_info,Image *image,XStandardColormap *map_info,
7560 % XPixelInfo *pixel)
7562 % A description of each parameter follows:
7564 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
7566 % o display: Specifies a connection to an X server; returned from
7569 % o window: Specifies a pointer to a XWindowInfo structure.
7572 static MagickBooleanType XMakePixmap(Display *display,
7573 const XResourceInfo *resource_info,XWindowInfo *window)
7579 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
7580 assert(display != (Display *) NULL);
7581 assert(resource_info != (XResourceInfo *) NULL);
7582 assert(window != (XWindowInfo *) NULL);
7583 if (window->pixmap != (Pixmap) NULL)
7586 Destroy previous X pixmap.
7588 (void) XFreePixmap(display,window->pixmap);
7589 window->pixmap=(Pixmap) NULL;
7591 if (window->use_pixmap == MagickFalse)
7592 return(MagickFalse);
7593 if (window->ximage == (XImage *) NULL)
7594 return(MagickFalse);
7596 Display busy cursor.
7598 (void) XCheckDefineCursor(display,window->id,window->busy_cursor);
7599 (void) XFlush(display);
7603 width=(unsigned int) window->ximage->width;
7604 height=(unsigned int) window->ximage->height;
7605 window->pixmap=XCreatePixmap(display,window->id,width,height,window->depth);
7606 if (window->pixmap == (Pixmap) NULL)
7609 Unable to allocate pixmap.
7611 (void) XCheckDefineCursor(display,window->id,window->cursor);
7612 return(MagickFalse);
7615 Copy X image to pixmap.
7617 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
7618 if (window->shared_memory)
7619 (void) XShmPutImage(display,window->pixmap,window->annotate_context,
7620 window->ximage,0,0,0,0,width,height,MagickTrue);
7622 if (window->shared_memory == MagickFalse)
7623 (void) XPutImage(display,window->pixmap,window->annotate_context,
7624 window->ximage,0,0,0,0,width,height);
7625 if (IsEventLogging())
7627 (void) LogMagickEvent(X11Event,GetMagickModule(),"Pixmap:");
7628 (void) LogMagickEvent(X11Event,GetMagickModule()," width, height: %ux%u",
7634 (void) XCheckDefineCursor(display,window->id,window->cursor);
7639 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7643 % X M a k e S t a n d a r d C o l o r m a p %
7647 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7649 % XMakeStandardColormap() creates an X11 Standard Colormap.
7651 % The format of the XMakeStandardColormap method is:
7653 % void XMakeStandardColormap(Display *display,XVisualInfo *visual_info,
7654 % XResourceInfo *resource_info,Image *image,XStandardColormap *map_info,
7655 % XPixelInfo *pixel,ExceptionInfo *exception)
7657 % A description of each parameter follows:
7659 % o display: Specifies a connection to an X server; returned from
7662 % o visual_info: Specifies a pointer to a X11 XVisualInfo structure;
7663 % returned from XGetVisualInfo.
7665 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
7667 % o image: the image.
7669 % o map_info: If a Standard Colormap type is specified, this structure is
7670 % initialized with info from the Standard Colormap.
7672 % o pixel: Specifies a pointer to a XPixelInfo structure.
7674 % o exception: return any errors or warnings in this structure.
7678 #if defined(__cplusplus) || defined(c_plusplus)
7682 static inline double DiversityPixelIntensity(
7683 const DiversityPacket *pixel)
7688 intensity=0.212656*pixel->red+0.715158*pixel->green+0.072186*pixel->blue;
7692 static int IntensityCompare(const void *x,const void *y)
7701 color_1=(DiversityPacket *) x;
7702 color_2=(DiversityPacket *) y;
7703 diversity=(int) (DiversityPixelIntensity(color_2)-
7704 DiversityPixelIntensity(color_1));
7708 static int PopularityCompare(const void *x,const void *y)
7714 color_1=(DiversityPacket *) x;
7715 color_2=(DiversityPacket *) y;
7716 return((int) color_2->count-(int) color_1->count);
7719 #if defined(__cplusplus) || defined(c_plusplus)
7723 static inline Quantum ScaleXToQuantum(const size_t x,
7726 return((Quantum) (((double) QuantumRange*x)/scale+0.5));
7729 MagickPrivate void XMakeStandardColormap(Display *display,
7730 XVisualInfo *visual_info,XResourceInfo *resource_info,Image *image,
7731 XStandardColormap *map_info,XPixelInfo *pixel,ExceptionInfo *exception)
7754 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
7755 assert(display != (Display *) NULL);
7756 assert(visual_info != (XVisualInfo *) NULL);
7757 assert(map_info != (XStandardColormap *) NULL);
7758 assert(resource_info != (XResourceInfo *) NULL);
7759 assert(pixel != (XPixelInfo *) NULL);
7760 if (resource_info->map_type != (char *) NULL)
7763 Standard Colormap is already defined (i.e. xstdcmap).
7765 XGetPixelInfo(display,visual_info,map_info,resource_info,image,
7767 number_colors=(unsigned int) (map_info->base_pixel+
7768 (map_info->red_max+1)*(map_info->green_max+1)*(map_info->blue_max+1));
7769 if ((map_info->red_max*map_info->green_max*map_info->blue_max) != 0)
7770 if ((image->alpha_trait != BlendPixelTrait) &&
7771 (resource_info->color_recovery == MagickFalse) &&
7772 (resource_info->quantize_info->dither_method != NoDitherMethod) &&
7773 (number_colors < MaxColormapSize))
7782 Improve image appearance with error diffusion.
7784 affinity_image=AcquireImage((ImageInfo *) NULL,exception);
7785 if (affinity_image == (Image *) NULL)
7786 ThrowXWindowFatalException(ResourceLimitFatalError,
7787 "UnableToDitherImage",image->filename);
7788 affinity_image->columns=number_colors;
7789 affinity_image->rows=1;
7791 Initialize colormap image.
7793 q=QueueAuthenticPixels(affinity_image,0,0,affinity_image->columns,
7795 if (q != (Quantum *) NULL)
7797 for (i=0; i < (ssize_t) number_colors; i++)
7799 SetPixelRed(affinity_image,0,q);
7800 if (map_info->red_max != 0)
7801 SetPixelRed(affinity_image,ScaleXToQuantum((size_t)
7802 (i/map_info->red_mult),map_info->red_max),q);
7803 SetPixelGreen(affinity_image,0,q);
7804 if (map_info->green_max != 0)
7805 SetPixelGreen(affinity_image,ScaleXToQuantum((size_t)
7806 ((i/map_info->green_mult) % (map_info->green_max+1)),
7807 map_info->green_max),q);
7808 SetPixelBlue(affinity_image,0,q);
7809 if (map_info->blue_max != 0)
7810 SetPixelBlue(affinity_image,ScaleXToQuantum((size_t)
7811 (i % map_info->green_mult),map_info->blue_max),q);
7812 SetPixelAlpha(affinity_image,
7813 TransparentAlpha,q);
7814 q+=GetPixelChannels(affinity_image);
7816 (void) SyncAuthenticPixels(affinity_image,exception);
7817 (void) RemapImage(resource_info->quantize_info,image,
7818 affinity_image,exception);
7820 XGetPixelInfo(display,visual_info,map_info,resource_info,image,
7822 (void) SetImageStorageClass(image,DirectClass,exception);
7823 affinity_image=DestroyImage(affinity_image);
7825 if (IsEventLogging())
7827 (void) LogMagickEvent(X11Event,GetMagickModule(),
7828 "Standard Colormap:");
7829 (void) LogMagickEvent(X11Event,GetMagickModule(),
7830 " colormap id: 0x%lx",map_info->colormap);
7831 (void) LogMagickEvent(X11Event,GetMagickModule(),
7832 " red, green, blue max: %lu %lu %lu",map_info->red_max,
7833 map_info->green_max,map_info->blue_max);
7834 (void) LogMagickEvent(X11Event,GetMagickModule(),
7835 " red, green, blue mult: %lu %lu %lu",map_info->red_mult,
7836 map_info->green_mult,map_info->blue_mult);
7840 if ((visual_info->klass != DirectColor) &&
7841 (visual_info->klass != TrueColor))
7842 if ((image->storage_class == DirectClass) ||
7843 ((int) image->colors > visual_info->colormap_size))
7849 Image has more colors than the visual supports.
7851 quantize_info=(*resource_info->quantize_info);
7852 quantize_info.number_colors=(size_t) visual_info->colormap_size;
7853 (void) QuantizeImage(&quantize_info,image,exception);
7856 Free previous and create new colormap.
7858 (void) XFreeStandardColormap(display,visual_info,map_info,pixel);
7859 colormap=XDefaultColormap(display,visual_info->screen);
7860 if (visual_info->visual != XDefaultVisual(display,visual_info->screen))
7861 colormap=XCreateColormap(display,XRootWindow(display,visual_info->screen),
7862 visual_info->visual,visual_info->klass == DirectColor ?
7863 AllocAll : AllocNone);
7864 if (colormap == (Colormap) NULL)
7865 ThrowXWindowFatalException(ResourceLimitFatalError,"UnableToCreateColormap",
7868 Initialize the map and pixel info structures.
7870 XGetMapInfo(visual_info,colormap,map_info);
7871 XGetPixelInfo(display,visual_info,map_info,resource_info,image,pixel);
7873 Allocating colors in server colormap is based on visual class.
7875 switch (visual_info->klass)
7881 Define Standard Colormap for StaticGray or StaticColor visual.
7883 number_colors=image->colors;
7884 colors=(XColor *) AcquireQuantumMemory((size_t)
7885 visual_info->colormap_size,sizeof(*colors));
7886 if (colors == (XColor *) NULL)
7887 ThrowXWindowFatalException(ResourceLimitFatalError,
7888 "UnableToCreateColormap",image->filename);
7890 color.flags=(char) (DoRed | DoGreen | DoBlue);
7891 for (i=0; i < (ssize_t) image->colors; i++)
7893 color.red=ScaleQuantumToShort(XRedGamma(image->colormap[i].red));
7894 color.green=ScaleQuantumToShort(XGreenGamma(image->colormap[i].green));
7895 color.blue=ScaleQuantumToShort(XBlueGamma(image->colormap[i].blue));
7896 if (visual_info->klass != StaticColor)
7898 gray_value=(unsigned short) XPixelIntensity(&color);
7899 color.red=gray_value;
7900 color.green=gray_value;
7901 color.blue=gray_value;
7903 status=XAllocColor(display,colormap,&color);
7904 if (status == False)
7906 colormap=XCopyColormapAndFree(display,colormap);
7907 (void) XAllocColor(display,colormap,&color);
7909 pixel->pixels[i]=color.pixel;
7921 Define Standard Colormap for GrayScale or PseudoColor visual.
7923 number_colors=image->colors;
7924 colors=(XColor *) AcquireQuantumMemory((size_t)
7925 visual_info->colormap_size,sizeof(*colors));
7926 if (colors == (XColor *) NULL)
7927 ThrowXWindowFatalException(ResourceLimitFatalError,
7928 "UnableToCreateColormap",image->filename);
7930 Preallocate our GUI colors.
7932 (void) XAllocColor(display,colormap,&pixel->foreground_color);
7933 (void) XAllocColor(display,colormap,&pixel->background_color);
7934 (void) XAllocColor(display,colormap,&pixel->border_color);
7935 (void) XAllocColor(display,colormap,&pixel->matte_color);
7936 (void) XAllocColor(display,colormap,&pixel->highlight_color);
7937 (void) XAllocColor(display,colormap,&pixel->shadow_color);
7938 (void) XAllocColor(display,colormap,&pixel->depth_color);
7939 (void) XAllocColor(display,colormap,&pixel->trough_color);
7940 for (i=0; i < MaxNumberPens; i++)
7941 (void) XAllocColor(display,colormap,&pixel->pen_colors[i]);
7943 Determine if image colors will "fit" into X server colormap.
7945 colormap_type=resource_info->colormap;
7946 status=XAllocColorCells(display,colormap,MagickFalse,(unsigned long *)
7947 NULL,0,pixel->pixels,(unsigned int) image->colors);
7948 if (status != False)
7949 colormap_type=PrivateColormap;
7950 if (colormap_type == SharedColormap)
7971 Define Standard colormap for shared GrayScale or PseudoColor visual.
7973 diversity=(DiversityPacket *) AcquireQuantumMemory(image->colors,
7974 sizeof(*diversity));
7975 if (diversity == (DiversityPacket *) NULL)
7976 ThrowXWindowFatalException(ResourceLimitFatalError,
7977 "UnableToCreateColormap",image->filename);
7978 for (i=0; i < (ssize_t) image->colors; i++)
7980 diversity[i].red=ClampToQuantum(image->colormap[i].red);
7981 diversity[i].green=ClampToQuantum(image->colormap[i].green);
7982 diversity[i].blue=ClampToQuantum(image->colormap[i].blue);
7983 diversity[i].index=(unsigned short) i;
7984 diversity[i].count=0;
7986 image_view=AcquireAuthenticCacheView(image,exception);
7987 for (y=0; y < (int) image->rows; y++)
7992 register const Quantum
7995 p=GetCacheViewAuthenticPixels(image_view,0,(ssize_t) y,
7996 image->columns,1,exception);
7997 if (p == (const Quantum *) NULL)
7999 for (x=(int) image->columns-1; x >= 0; x--)
8001 diversity[(ssize_t) GetPixelIndex(image,p)].count++;
8002 p+=GetPixelChannels(image);
8005 image_view=DestroyCacheView(image_view);
8007 Sort colors by decreasing intensity.
8009 qsort((void *) diversity,image->colors,sizeof(*diversity),
8011 for (i=0; i < (ssize_t) image->colors; )
8013 diversity[i].count<<=4; /* increase this colors popularity */
8014 i+=MagickMax((int) (image->colors >> 4),2);
8016 diversity[image->colors-1].count<<=4;
8017 qsort((void *) diversity,image->colors,sizeof(*diversity),
8023 color.flags=(char) (DoRed | DoGreen | DoBlue);
8024 for (i=0; i < (ssize_t) image->colors; i++)
8026 index=diversity[i].index;
8028 ScaleQuantumToShort(XRedGamma(image->colormap[index].red));
8030 ScaleQuantumToShort(XGreenGamma(image->colormap[index].green));
8032 ScaleQuantumToShort(XBlueGamma(image->colormap[index].blue));
8033 if (visual_info->klass != PseudoColor)
8035 gray_value=(unsigned short) XPixelIntensity(&color);
8036 color.red=gray_value;
8037 color.green=gray_value;
8038 color.blue=gray_value;
8040 status=XAllocColor(display,colormap,&color);
8041 if (status == False)
8043 pixel->pixels[index]=color.pixel;
8047 Read X server colormap.
8049 server_colors=(XColor *) AcquireQuantumMemory((size_t)
8050 visual_info->colormap_size,sizeof(*server_colors));
8051 if (server_colors == (XColor *) NULL)
8052 ThrowXWindowFatalException(ResourceLimitFatalError,
8053 "UnableToCreateColormap",image->filename);
8054 for (x=visual_info->colormap_size-1; x >= 0; x--)
8055 server_colors[x].pixel=(size_t) x;
8056 (void) XQueryColors(display,colormap,server_colors,
8057 (int) MagickMin((unsigned int) visual_info->colormap_size,256));
8059 Select remaining colors from X server colormap.
8061 for (; i < (ssize_t) image->colors; i++)
8063 index=diversity[i].index;
8064 color.red=ScaleQuantumToShort(
8065 XRedGamma(image->colormap[index].red));
8066 color.green=ScaleQuantumToShort(
8067 XGreenGamma(image->colormap[index].green));
8068 color.blue=ScaleQuantumToShort(
8069 XBlueGamma(image->colormap[index].blue));
8070 if (visual_info->klass != PseudoColor)
8072 gray_value=(unsigned short) XPixelIntensity(&color);
8073 color.red=gray_value;
8074 color.green=gray_value;
8075 color.blue=gray_value;
8077 XBestPixel(display,colormap,server_colors,(unsigned int)
8078 visual_info->colormap_size,&color);
8079 pixel->pixels[index]=color.pixel;
8082 if ((int) image->colors < visual_info->colormap_size)
8085 Fill up colors array-- more choices for pen colors.
8087 retain_colors=MagickMin((unsigned int)
8088 (visual_info->colormap_size-image->colors),256);
8089 for (i=0; i < (ssize_t) retain_colors; i++)
8090 *p++=server_colors[i];
8091 number_colors+=retain_colors;
8093 server_colors=(XColor *) RelinquishMagickMemory(server_colors);
8094 diversity=(DiversityPacket *) RelinquishMagickMemory(diversity);
8098 Define Standard colormap for private GrayScale or PseudoColor visual.
8100 if (status == False)
8103 Not enough colormap entries in the colormap-- Create a new colormap.
8105 colormap=XCreateColormap(display,
8106 XRootWindow(display,visual_info->screen),visual_info->visual,
8108 if (colormap == (Colormap) NULL)
8109 ThrowXWindowFatalException(ResourceLimitFatalError,
8110 "UnableToCreateColormap",image->filename);
8111 map_info->colormap=colormap;
8112 if ((int) image->colors < visual_info->colormap_size)
8115 Retain colors from the default colormap to help lessens the
8116 effects of colormap flashing.
8118 retain_colors=MagickMin((unsigned int)
8119 (visual_info->colormap_size-image->colors),256);
8120 p=colors+image->colors;
8121 for (i=0; i < (ssize_t) retain_colors; i++)
8123 p->pixel=(unsigned long) i;
8126 (void) XQueryColors(display,
8127 XDefaultColormap(display,visual_info->screen),
8128 colors+image->colors,(int) retain_colors);
8130 Transfer colors from default to private colormap.
8132 (void) XAllocColorCells(display,colormap,MagickFalse,
8133 (unsigned long *) NULL,0,pixel->pixels,(unsigned int)
8135 p=colors+image->colors;
8136 for (i=0; i < (ssize_t) retain_colors; i++)
8138 p->pixel=pixel->pixels[i];
8141 (void) XStoreColors(display,colormap,colors+image->colors,
8142 (int) retain_colors);
8143 number_colors+=retain_colors;
8145 (void) XAllocColorCells(display,colormap,MagickFalse,
8146 (unsigned long *) NULL,0,pixel->pixels,(unsigned int)
8150 Store the image colormap.
8153 color.flags=(char) (DoRed | DoGreen | DoBlue);
8154 for (i=0; i < (ssize_t) image->colors; i++)
8156 color.red=ScaleQuantumToShort(XRedGamma(image->colormap[i].red));
8157 color.green=ScaleQuantumToShort(XGreenGamma(image->colormap[i].green));
8158 color.blue=ScaleQuantumToShort(XBlueGamma(image->colormap[i].blue));
8159 if (visual_info->klass != PseudoColor)
8161 gray_value=(unsigned short) XPixelIntensity(&color);
8162 color.red=gray_value;
8163 color.green=gray_value;
8164 color.blue=gray_value;
8166 color.pixel=pixel->pixels[i];
8169 (void) XStoreColors(display,colormap,colors,(int) image->colors);
8180 Define Standard Colormap for TrueColor or DirectColor visual.
8182 number_colors=(unsigned int) ((map_info->red_max*map_info->red_mult)+
8183 (map_info->green_max*map_info->green_mult)+
8184 (map_info->blue_max*map_info->blue_mult)+1);
8185 linear_colormap=(number_colors > 4096) ||
8186 (((int) (map_info->red_max+1) == visual_info->colormap_size) &&
8187 ((int) (map_info->green_max+1) == visual_info->colormap_size) &&
8188 ((int) (map_info->blue_max+1) == visual_info->colormap_size)) ?
8189 MagickTrue : MagickFalse;
8190 if (linear_colormap != MagickFalse)
8191 number_colors=(size_t) visual_info->colormap_size;
8193 Allocate color array.
8195 colors=(XColor *) AcquireQuantumMemory(number_colors,sizeof(*colors));
8196 if (colors == (XColor *) NULL)
8197 ThrowXWindowFatalException(ResourceLimitFatalError,
8198 "UnableToCreateColormap",image->filename);
8200 Initialize linear color ramp.
8203 color.flags=(char) (DoRed | DoGreen | DoBlue);
8204 if (linear_colormap != MagickFalse)
8205 for (i=0; i < (ssize_t) number_colors; i++)
8207 color.blue=(unsigned short) 0;
8208 if (map_info->blue_max != 0)
8209 color.blue=(unsigned short) ((size_t)
8210 ((65535L*(i % map_info->green_mult))/map_info->blue_max));
8211 color.green=color.blue;
8212 color.red=color.blue;
8213 color.pixel=XStandardPixel(map_info,&color);
8217 for (i=0; i < (ssize_t) number_colors; i++)
8219 color.red=(unsigned short) 0;
8220 if (map_info->red_max != 0)
8221 color.red=(unsigned short) ((size_t)
8222 ((65535L*(i/map_info->red_mult))/map_info->red_max));
8223 color.green=(unsigned int) 0;
8224 if (map_info->green_max != 0)
8225 color.green=(unsigned short) ((size_t)
8226 ((65535L*((i/map_info->green_mult) % (map_info->green_max+1)))/
8227 map_info->green_max));
8228 color.blue=(unsigned short) 0;
8229 if (map_info->blue_max != 0)
8230 color.blue=(unsigned short) ((size_t)
8231 ((65535L*(i % map_info->green_mult))/map_info->blue_max));
8232 color.pixel=XStandardPixel(map_info,&color);
8235 if ((visual_info->klass == DirectColor) &&
8236 (colormap != XDefaultColormap(display,visual_info->screen)))
8237 (void) XStoreColors(display,colormap,colors,(int) number_colors);
8239 for (i=0; i < (ssize_t) number_colors; i++)
8240 (void) XAllocColor(display,colormap,&colors[i]);
8244 if ((visual_info->klass != DirectColor) &&
8245 (visual_info->klass != TrueColor))
8248 Set foreground, background, border, etc. pixels.
8250 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8251 &pixel->foreground_color);
8252 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8253 &pixel->background_color);
8254 if (pixel->background_color.pixel == pixel->foreground_color.pixel)
8257 Foreground and background colors must differ.
8259 pixel->background_color.red=(~pixel->foreground_color.red);
8260 pixel->background_color.green=
8261 (~pixel->foreground_color.green);
8262 pixel->background_color.blue=
8263 (~pixel->foreground_color.blue);
8264 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8265 &pixel->background_color);
8267 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8268 &pixel->border_color);
8269 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8270 &pixel->matte_color);
8271 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8272 &pixel->highlight_color);
8273 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8274 &pixel->shadow_color);
8275 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8276 &pixel->depth_color);
8277 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8278 &pixel->trough_color);
8279 for (i=0; i < MaxNumberPens; i++)
8281 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8282 &pixel->pen_colors[i]);
8283 pixel->pixels[image->colors+i]=pixel->pen_colors[i].pixel;
8285 pixel->colors=(ssize_t) (image->colors+MaxNumberPens);
8287 colors=(XColor *) RelinquishMagickMemory(colors);
8288 if (IsEventLogging())
8290 (void) LogMagickEvent(X11Event,GetMagickModule(),"Standard Colormap:");
8291 (void) LogMagickEvent(X11Event,GetMagickModule()," colormap id: 0x%lx",
8292 map_info->colormap);
8293 (void) LogMagickEvent(X11Event,GetMagickModule(),
8294 " red, green, blue max: %lu %lu %lu",map_info->red_max,
8295 map_info->green_max,map_info->blue_max);
8296 (void) LogMagickEvent(X11Event,GetMagickModule(),
8297 " red, green, blue mult: %lu %lu %lu",map_info->red_mult,
8298 map_info->green_mult,map_info->blue_mult);
8303 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8307 % X M a k e W i n d o w %
8311 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8313 % XMakeWindow() creates an X11 window.
8315 % The format of the XMakeWindow method is:
8317 % void XMakeWindow(Display *display,Window parent,char **argv,int argc,
8318 % XClassHint *class_hint,XWMHints *manager_hints,
8319 % XWindowInfo *window_info)
8321 % A description of each parameter follows:
8323 % o display: Specifies a connection to an X server; returned from
8326 % o parent: Specifies the parent window_info.
8328 % o argv: Specifies the application's argument list.
8330 % o argc: Specifies the number of arguments.
8332 % o class_hint: Specifies a pointer to a X11 XClassHint structure.
8334 % o manager_hints: Specifies a pointer to a X11 XWMHints structure.
8336 % o window_info: Specifies a pointer to a X11 XWindowInfo structure.
8339 MagickPrivate void XMakeWindow(Display *display,Window parent,char **argv,
8340 int argc,XClassHint *class_hint,XWMHints *manager_hints,
8341 XWindowInfo *window_info)
8343 #define MinWindowSize 64
8351 static XTextProperty
8362 Set window info hints.
8364 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
8365 assert(display != (Display *) NULL);
8366 assert(window_info != (XWindowInfo *) NULL);
8367 size_hints=XAllocSizeHints();
8368 if (size_hints == (XSizeHints *) NULL)
8369 ThrowXWindowFatalException(XServerFatalError,"UnableToMakeXWindow",argv[0]);
8370 size_hints->flags=(int) window_info->flags;
8371 size_hints->x=window_info->x;
8372 size_hints->y=window_info->y;
8373 size_hints->width=(int) window_info->width;
8374 size_hints->height=(int) window_info->height;
8375 if (window_info->immutable != MagickFalse)
8378 Window size cannot be changed.
8380 size_hints->min_width=size_hints->width;
8381 size_hints->min_height=size_hints->height;
8382 size_hints->max_width=size_hints->width;
8383 size_hints->max_height=size_hints->height;
8384 size_hints->flags|=PMinSize;
8385 size_hints->flags|=PMaxSize;
8390 Window size can be changed.
8392 size_hints->min_width=(int) window_info->min_width;
8393 size_hints->min_height=(int) window_info->min_height;
8394 size_hints->flags|=PResizeInc;
8395 size_hints->width_inc=(int) window_info->width_inc;
8396 size_hints->height_inc=(int) window_info->height_inc;
8397 #if !defined(PRE_R4_ICCCM)
8398 size_hints->flags|=PBaseSize;
8399 size_hints->base_width=size_hints->width_inc;
8400 size_hints->base_height=size_hints->height_inc;
8403 gravity=NorthWestGravity;
8404 if (window_info->geometry != (char *) NULL)
8407 default_geometry[MaxTextExtent],
8408 geometry[MaxTextExtent];
8417 User specified geometry.
8419 (void) FormatLocaleString(default_geometry,MaxTextExtent,"%dx%d",
8420 size_hints->width,size_hints->height);
8421 (void) CopyMagickString(geometry,window_info->geometry,MaxTextExtent);
8423 while (strlen(p) != 0)
8425 if ((isspace((int) ((unsigned char) *p)) == 0) && (*p != '%'))
8428 (void) CopyMagickString(p,p+1,MaxTextExtent);
8430 flags=XWMGeometry(display,window_info->screen,geometry,default_geometry,
8431 window_info->border_width,size_hints,&size_hints->x,&size_hints->y,
8432 &size_hints->width,&size_hints->height,&gravity);
8433 if ((flags & WidthValue) && (flags & HeightValue))
8434 size_hints->flags|=USSize;
8435 if ((flags & XValue) && (flags & YValue))
8437 size_hints->flags|=USPosition;
8438 window_info->x=size_hints->x;
8439 window_info->y=size_hints->y;
8442 #if !defined(PRE_R4_ICCCM)
8443 size_hints->win_gravity=gravity;
8444 size_hints->flags|=PWinGravity;
8446 if (window_info->id == (Window) NULL)
8447 window_info->id=XCreateWindow(display,parent,window_info->x,window_info->y,
8448 (unsigned int) size_hints->width,(unsigned int) size_hints->height,
8449 window_info->border_width,(int) window_info->depth,InputOutput,
8450 window_info->visual,(unsigned long) window_info->mask,
8451 &window_info->attributes);
8464 Window already exists; change relevant attributes.
8466 (void) XChangeWindowAttributes(display,window_info->id,(unsigned long)
8467 window_info->mask,&window_info->attributes);
8468 mask=ConfigureNotify;
8469 while (XCheckTypedWindowEvent(display,window_info->id,(int) mask,&sans_event)) ;
8470 window_changes.x=window_info->x;
8471 window_changes.y=window_info->y;
8472 window_changes.width=(int) window_info->width;
8473 window_changes.height=(int) window_info->height;
8474 mask=(MagickStatusType) (CWWidth | CWHeight);
8475 if (window_info->flags & USPosition)
8477 (void) XReconfigureWMWindow(display,window_info->id,window_info->screen,
8478 mask,&window_changes);
8480 if (window_info->id == (Window) NULL)
8481 ThrowXWindowFatalException(XServerFatalError,"UnableToCreateWindow",
8483 status=XStringListToTextProperty(&window_info->name,1,&window_name);
8484 if (status == False)
8485 ThrowXWindowFatalException(XServerFatalError,"UnableToCreateTextProperty",
8487 status=XStringListToTextProperty(&window_info->icon_name,1,&icon_name);
8488 if (status == False)
8489 ThrowXWindowFatalException(XServerFatalError,"UnableToCreateTextProperty",
8490 window_info->icon_name);
8491 if (window_info->icon_geometry != (char *) NULL)
8499 User specified icon geometry.
8501 size_hints->flags|=USPosition;
8502 flags=XWMGeometry(display,window_info->screen,window_info->icon_geometry,
8503 (char *) NULL,0,size_hints,&manager_hints->icon_x,
8504 &manager_hints->icon_y,&width,&height,&gravity);
8505 if ((flags & XValue) && (flags & YValue))
8506 manager_hints->flags|=IconPositionHint;
8508 XSetWMProperties(display,window_info->id,&window_name,&icon_name,argv,argc,
8509 size_hints,manager_hints,class_hint);
8510 if (window_name.value != (void *) NULL)
8512 (void) XFree((void *) window_name.value);
8513 window_name.value=(unsigned char *) NULL;
8514 window_name.nitems=0;
8516 if (icon_name.value != (void *) NULL)
8518 (void) XFree((void *) icon_name.value);
8519 icon_name.value=(unsigned char *) NULL;
8522 atom_list[0]=XInternAtom(display,"WM_DELETE_WINDOW",MagickFalse);
8523 atom_list[1]=XInternAtom(display,"WM_TAKE_FOCUS",MagickFalse);
8524 (void) XSetWMProtocols(display,window_info->id,atom_list,2);
8525 (void) XFree((void *) size_hints);
8526 if (window_info->shape != MagickFalse)
8528 #if defined(MAGICKCORE_HAVE_SHAPE)
8534 Can we apply a non-rectangular shaping mask?
8538 if (XShapeQueryExtension(display,&error_base,&event_base) == 0)
8539 window_info->shape=MagickFalse;
8541 window_info->shape=MagickFalse;
8544 if (window_info->shared_memory)
8546 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
8548 Can we use shared memory with this window?
8550 if (XShmQueryExtension(display) == 0)
8551 window_info->shared_memory=MagickFalse;
8553 window_info->shared_memory=MagickFalse;
8556 window_info->image=NewImageList();
8557 window_info->destroy=MagickFalse;
8561 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8565 % X M a g i c k P r o g r e s s M o n i t o r %
8569 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8571 % XMagickProgressMonitor() displays the progress a task is making in
8572 % completing a task.
8574 % The format of the XMagickProgressMonitor method is:
8576 % void XMagickProgressMonitor(const char *task,
8577 % const MagickOffsetType quantum,const MagickSizeType span,
8578 % void *client_data)
8580 % A description of each parameter follows:
8582 % o task: Identifies the task in progress.
8584 % o quantum: Specifies the quantum position within the span which represents
8585 % how much progress has been made in completing a task.
8587 % o span: Specifies the span relative to completing a task.
8589 % o client_data: Pointer to any client data.
8593 static const char *GetLocaleMonitorMessage(const char *text)
8596 message[MaxTextExtent],
8605 (void) CopyMagickMemory(tag,text,MaxTextExtent);
8607 if (p != (char *) NULL)
8609 (void) FormatLocaleString(message,MaxTextExtent,"Monitor/%s",tag);
8610 locale_message=GetLocaleMessage(message);
8611 if (locale_message == message)
8613 return(locale_message);
8616 MagickPrivate MagickBooleanType XMagickProgressMonitor(const char *tag,
8617 const MagickOffsetType quantum,const MagickSizeType span,
8618 void *magick_unused(client_data))
8623 windows=XSetWindows((XWindows *) ~0);
8624 if (windows == (XWindows *) NULL)
8626 if (windows->info.mapped != MagickFalse)
8627 XProgressMonitorWidget(windows->display,windows,
8628 GetLocaleMonitorMessage(tag),quantum,span);
8633 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8637 % X Q u e r y C o l o r D a t a b a s e %
8641 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8643 % XQueryColorCompliance() looks up a RGB values for a color given in the target
8646 % The format of the XQueryColorDatabase method is:
8648 % MagickBooleanType XQueryColorCompliance(const char *target,XColor *color)
8650 % A description of each parameter follows:
8652 % o target: Specifies the color to lookup in the X color database.
8654 % o color: A pointer to an PixelInfo structure. The RGB value of the target
8655 % color is returned as this value.
8658 MagickPrivate MagickBooleanType XQueryColorCompliance(const char *target,
8665 *display = (Display *) NULL;
8674 Initialize color return value.
8676 assert(color != (XColor *) NULL);
8680 color->flags=(char) (DoRed | DoGreen | DoBlue);
8681 if ((target == (char *) NULL) || (*target == '\0'))
8682 target="#ffffffffffff";
8684 Let the X server define the color for us.
8686 if (display == (Display *) NULL)
8687 display=XOpenDisplay((char *) NULL);
8688 if (display == (Display *) NULL)
8690 ThrowXWindowException(XServerError,"ColorIsNotKnownToServer",target);
8691 return(MagickFalse);
8693 colormap=XDefaultColormap(display,XDefaultScreen(display));
8694 status=XParseColor(display,colormap,(char *) target,&xcolor);
8695 if (status == False)
8696 ThrowXWindowException(XServerError,"ColorIsNotKnownToServer",target)
8699 color->red=xcolor.red;
8700 color->green=xcolor.green;
8701 color->blue=xcolor.blue;
8702 color->flags=xcolor.flags;
8704 return(status != False ? MagickTrue : MagickFalse);
8708 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8712 % X Q u e r y P o s i t i o n %
8716 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8718 % XQueryPosition() gets the pointer coordinates relative to a window.
8720 % The format of the XQueryPosition method is:
8722 % void XQueryPosition(Display *display,const Window window,int *x,int *y)
8724 % A description of each parameter follows:
8726 % o display: Specifies a connection to an X server; returned from
8729 % o window: Specifies a pointer to a Window.
8731 % o x: Return the x coordinate of the pointer relative to the origin of the
8734 % o y: Return the y coordinate of the pointer relative to the origin of the
8738 MagickPrivate void XQueryPosition(Display *display,const Window window,int *x,
8751 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
8752 assert(display != (Display *) NULL);
8753 assert(window != (Window) NULL);
8754 assert(x != (int *) NULL);
8755 assert(y != (int *) NULL);
8756 (void) XQueryPointer(display,window,&root_window,&root_window,&x_root,&y_root,
8761 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8765 % X R e f r e s h W i n d o w %
8769 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8771 % XRefreshWindow() refreshes an image in a X window.
8773 % The format of the XRefreshWindow method is:
8775 % void XRefreshWindow(Display *display,const XWindowInfo *window,
8776 % const XEvent *event)
8778 % A description of each parameter follows:
8780 % o display: Specifies a connection to an X server; returned from
8783 % o window: Specifies a pointer to a XWindowInfo structure.
8785 % o event: Specifies a pointer to a XEvent structure. If it is NULL,
8786 % the entire image is refreshed.
8789 MagickPrivate void XRefreshWindow(Display *display,const XWindowInfo *window,
8790 const XEvent *event)
8800 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
8801 assert(display != (Display *) NULL);
8802 assert(window != (XWindowInfo *) NULL);
8803 if (window->ximage == (XImage *) NULL)
8805 if (event != (XEvent *) NULL)
8808 Determine geometry from expose event.
8812 width=(unsigned int) event->xexpose.width;
8813 height=(unsigned int) event->xexpose.height;
8821 Refresh entire window; discard outstanding expose events.
8825 width=window->width;
8826 height=window->height;
8827 while (XCheckTypedWindowEvent(display,window->id,Expose,&sans_event)) ;
8828 if (window->matte_pixmap != (Pixmap) NULL)
8830 #if defined(MAGICKCORE_HAVE_SHAPE)
8831 if (window->shape != MagickFalse)
8832 XShapeCombineMask(display,window->id,ShapeBounding,0,0,
8833 window->matte_pixmap,ShapeSet);
8838 Check boundary conditions.
8840 if ((window->ximage->width-(x+window->x)) < (int) width)
8841 width=(unsigned int) (window->ximage->width-(x+window->x));
8842 if ((window->ximage->height-(y+window->y)) < (int) height)
8843 height=(unsigned int) (window->ximage->height-(y+window->y));
8847 if (window->matte_pixmap != (Pixmap) NULL)
8848 (void) XSetClipMask(display,window->annotate_context,window->matte_pixmap);
8849 if (window->pixmap != (Pixmap) NULL)
8851 if (window->depth > 1)
8852 (void) XCopyArea(display,window->pixmap,window->id,
8853 window->annotate_context,x+window->x,y+window->y,width,height,x,y);
8855 (void) XCopyPlane(display,window->pixmap,window->id,
8856 window->highlight_context,x+window->x,y+window->y,width,height,x,y,
8861 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
8862 if (window->shared_memory)
8863 (void) XShmPutImage(display,window->id,window->annotate_context,
8864 window->ximage,x+window->x,y+window->y,x,y,width,height,MagickTrue);
8866 if (window->shared_memory == MagickFalse)
8867 (void) XPutImage(display,window->id,window->annotate_context,
8868 window->ximage,x+window->x,y+window->y,x,y,width,height);
8870 if (window->matte_pixmap != (Pixmap) NULL)
8871 (void) XSetClipMask(display,window->annotate_context,None);
8872 (void) XFlush(display);
8876 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8880 % X R e m o t e C o m m a n d %
8884 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8886 % XRemoteCommand() forces a remote display(1) to display the specified
8889 % The format of the XRemoteCommand method is:
8891 % MagickBooleanType XRemoteCommand(Display *display,const char *window,
8892 % const char *filename)
8894 % A description of each parameter follows:
8896 % o display: Specifies a connection to an X server; returned from
8899 % o window: Specifies the name or id of an X window.
8901 % o filename: the name of the image filename to display.
8904 MagickExport MagickBooleanType XRemoteCommand(Display *display,
8905 const char *window,const char *filename)
8914 assert(filename != (char *) NULL);
8915 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",filename);
8916 if (display == (Display *) NULL)
8917 display=XOpenDisplay((char *) NULL);
8918 if (display == (Display *) NULL)
8920 ThrowXWindowException(XServerError,"UnableToOpenXServer",filename);
8921 return(MagickFalse);
8923 remote_atom=XInternAtom(display,"IM_PROTOCOLS",MagickFalse);
8924 remote_window=(Window) NULL;
8925 root_window=XRootWindow(display,XDefaultScreen(display));
8926 if (window != (char *) NULL)
8929 Search window hierarchy and identify any clients by name or ID.
8931 if (isdigit((int) ((unsigned char) *window)) != 0)
8932 remote_window=XWindowByID(display,root_window,(Window)
8933 strtol((char *) window,(char **) NULL,0));
8934 if (remote_window == (Window) NULL)
8935 remote_window=XWindowByName(display,root_window,window);
8937 if (remote_window == (Window) NULL)
8938 remote_window=XWindowByProperty(display,root_window,remote_atom);
8939 if (remote_window == (Window) NULL)
8941 ThrowXWindowException(XServerError,"UnableToConnectToRemoteDisplay",
8943 return(MagickFalse);
8946 Send remote command.
8948 remote_atom=XInternAtom(display,"IM_REMOTE_COMMAND",MagickFalse);
8949 (void) XChangeProperty(display,remote_window,remote_atom,XA_STRING,8,
8950 PropModeReplace,(unsigned char *) filename,(int) strlen(filename));
8951 (void) XSync(display,MagickFalse);
8956 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8960 % X R e n d e r I m a g e %
8964 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8966 % XRenderImage() renders text on the image with an X11 font. It also returns
8967 % the bounding box of the text relative to the image.
8969 % The format of the XRenderImage method is:
8971 % MagickBooleanType XRenderImage(Image *image,DrawInfo *draw_info,
8972 % const PointInfo *offset,TypeMetric *metrics,ExceptionInfo *exception)
8974 % A description of each parameter follows:
8976 % o image: the image.
8978 % o draw_info: the draw info.
8980 % o offset: (x,y) location of text relative to image.
8982 % o metrics: bounding box of text.
8984 % o exception: return any errors or warnings in this structure.
8987 MagickPrivate MagickBooleanType XRenderImage(Image *image,
8988 const DrawInfo *draw_info,const PointInfo *offset,TypeMetric *metrics,
8989 ExceptionInfo *exception)
9032 Open X server connection.
9034 display=XOpenDisplay(draw_info->server_name);
9035 if (display == (Display *) NULL)
9037 ThrowXWindowException(XServerError,"UnableToOpenXServer",
9038 draw_info->server_name);
9039 return(MagickFalse);
9042 Get user defaults from X resource database.
9044 (void) XSetErrorHandler(XError);
9045 image_info=AcquireImageInfo();
9046 client_name=GetClientName();
9047 resource_database=XGetResourceDatabase(display,client_name);
9048 XGetResourceInfo(image_info,resource_database,client_name,&resource_info);
9049 resource_info.close_server=MagickFalse;
9050 resource_info.colormap=PrivateColormap;
9051 resource_info.font=AcquireString(draw_info->font);
9052 resource_info.background_color=AcquireString("#ffffffffffff");
9053 resource_info.foreground_color=AcquireString("#000000000000");
9054 map_info=XAllocStandardColormap();
9055 if (map_info == (XStandardColormap *) NULL)
9057 ThrowXWindowException(ResourceLimitError,"MemoryAllocationFailed",
9059 return(MagickFalse);
9062 Initialize visual info.
9064 visual_info=XBestVisualInfo(display,map_info,&resource_info);
9065 if (visual_info == (XVisualInfo *) NULL)
9067 ThrowXWindowException(XServerError,"UnableToGetVisual",image->filename);
9068 return(MagickFalse);
9070 map_info->colormap=(Colormap) NULL;
9071 pixel.pixels=(unsigned long *) NULL;
9073 Initialize Standard Colormap info.
9075 XGetMapInfo(visual_info,XDefaultColormap(display,visual_info->screen),
9077 XGetPixelInfo(display,visual_info,map_info,&resource_info,(Image *) NULL,
9079 pixel.annotate_context=XDefaultGC(display,visual_info->screen);
9081 Initialize font info.
9083 font_info=XBestFont(display,&resource_info,MagickFalse);
9084 if (font_info == (XFontStruct *) NULL)
9086 ThrowXWindowException(XServerError,"UnableToLoadFont",draw_info->font);
9087 return(MagickFalse);
9089 if ((map_info == (XStandardColormap *) NULL) ||
9090 (visual_info == (XVisualInfo *) NULL) ||
9091 (font_info == (XFontStruct *) NULL))
9093 XFreeResources(display,visual_info,map_info,&pixel,font_info,
9094 &resource_info,(XWindowInfo *) NULL);
9095 ThrowXWindowException(XServerError,"UnableToLoadFont",image->filename);
9096 return(MagickFalse);
9098 cache_info=(*draw_info);
9100 Initialize annotate info.
9102 XGetAnnotateInfo(&annotate_info);
9103 annotate_info.stencil=ForegroundStencil;
9104 if (cache_info.font != draw_info->font)
9107 Type name has changed.
9109 (void) XFreeFont(display,font_info);
9110 (void) CloneString(&resource_info.font,draw_info->font);
9111 font_info=XBestFont(display,&resource_info,MagickFalse);
9112 if (font_info == (XFontStruct *) NULL)
9114 ThrowXWindowException(XServerError,"UnableToLoadFont",
9116 return(MagickFalse);
9119 if (image->debug != MagickFalse)
9120 (void) LogMagickEvent(AnnotateEvent,GetMagickModule(),
9121 "Font %s; pointsize %g",draw_info->font != (char *) NULL ?
9122 draw_info->font : "none",draw_info->pointsize);
9123 cache_info=(*draw_info);
9124 annotate_info.font_info=font_info;
9125 annotate_info.text=(char *) draw_info->text;
9126 annotate_info.width=(unsigned int) XTextWidth(font_info,draw_info->text,(int)
9127 strlen(draw_info->text));
9128 annotate_info.height=(unsigned int) font_info->ascent+font_info->descent;
9129 metrics->pixels_per_em.x=(double) font_info->max_bounds.width;
9130 metrics->pixels_per_em.y=(double) font_info->ascent+font_info->descent;
9131 metrics->ascent=(double) font_info->ascent+4;
9132 metrics->descent=(double) (-font_info->descent);
9133 metrics->width=annotate_info.width/ExpandAffine(&draw_info->affine);
9134 metrics->height=font_info->ascent+font_info->descent;
9135 metrics->max_advance=(double) font_info->max_bounds.width;
9136 metrics->bounds.x1=0.0;
9137 metrics->bounds.y1=metrics->descent;
9138 metrics->bounds.x2=metrics->ascent+metrics->descent;
9139 metrics->bounds.y2=metrics->ascent+metrics->descent;
9140 metrics->underline_position=(-2.0);
9141 metrics->underline_thickness=1.0;
9142 if (draw_info->render == MagickFalse)
9144 if (draw_info->fill.alpha == TransparentAlpha)
9149 width=annotate_info.width;
9150 height=annotate_info.height;
9151 if ((fabs(draw_info->affine.rx) >= MagickEpsilon) ||
9152 (fabs(draw_info->affine.ry) >= MagickEpsilon))
9154 if ((fabs(draw_info->affine.sx-draw_info->affine.sy) < MagickEpsilon) &&
9155 (fabs(draw_info->affine.rx+draw_info->affine.ry) < MagickEpsilon))
9156 annotate_info.degrees=(double) (180.0/MagickPI)*
9157 atan2(draw_info->affine.rx,draw_info->affine.sx);
9159 (void) FormatLocaleString(annotate_info.geometry,MaxTextExtent,
9160 "%.20gx%.20g%+.20g%+.20g",(double) width,(double) height,
9161 ceil(offset->x-0.5),ceil(offset->y-metrics->ascent-metrics->descent+
9162 draw_info->interline_spacing-0.5));
9163 pixel.pen_color.red=ScaleQuantumToShort(draw_info->fill.red);
9164 pixel.pen_color.green=ScaleQuantumToShort(draw_info->fill.green);
9165 pixel.pen_color.blue=ScaleQuantumToShort(draw_info->fill.blue);
9166 status=XAnnotateImage(display,&pixel,&annotate_info,image,exception);
9169 ThrowXWindowException(ResourceLimitError,"MemoryAllocationFailed",
9171 return(MagickFalse);
9177 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9181 % X R e t a i n W i n d o w C o l o r s %
9185 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9187 % XRetainWindowColors() sets X11 color resources on a window. This preserves
9188 % the colors associated with an image displayed on the window.
9190 % The format of the XRetainWindowColors method is:
9192 % void XRetainWindowColors(Display *display,const Window window)
9194 % A description of each parameter follows:
9196 % o display: Specifies a connection to an X server; returned from
9199 % o window: Specifies a pointer to a XWindowInfo structure.
9202 MagickExport void XRetainWindowColors(Display *display,const Window window)
9211 Put property on the window.
9213 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
9214 assert(display != (Display *) NULL);
9215 assert(window != (Window) NULL);
9216 property=XInternAtom(display,"_XSETROOT_ID",MagickFalse);
9217 if (property == (Atom) NULL)
9219 ThrowXWindowException(XServerError,"UnableToCreateProperty",
9223 pixmap=XCreatePixmap(display,window,1,1,1);
9224 if (pixmap == (Pixmap) NULL)
9226 ThrowXWindowException(XServerError,"UnableToCreateBitmap","");
9229 (void) XChangeProperty(display,window,property,XA_PIXMAP,32,PropModeReplace,
9230 (unsigned char *) &pixmap,1);
9231 (void) XSetCloseDownMode(display,RetainPermanent);
9235 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9239 % X S e l e c t W i n d o w %
9243 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9245 % XSelectWindow() allows a user to select a window using the mouse. If the
9246 % mouse moves, a cropping rectangle is drawn and the extents of the rectangle
9247 % is returned in the crop_info structure.
9249 % The format of the XSelectWindow function is:
9251 % target_window=XSelectWindow(display,crop_info)
9253 % A description of each parameter follows:
9255 % o window: XSelectWindow returns the window id.
9257 % o display: Specifies a pointer to the Display structure; returned from
9260 % o crop_info: Specifies a pointer to a RectangleInfo structure. It
9261 % contains the extents of any cropping rectangle.
9264 static Window XSelectWindow(Display *display,RectangleInfo *crop_info)
9266 #define MinimumCropArea (unsigned int) 9
9293 Initialize graphic context.
9295 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
9296 assert(display != (Display *) NULL);
9297 assert(crop_info != (RectangleInfo *) NULL);
9298 root_window=XRootWindow(display,XDefaultScreen(display));
9299 context_values.background=XBlackPixel(display,XDefaultScreen(display));
9300 context_values.foreground=XWhitePixel(display,XDefaultScreen(display));
9301 context_values.function=GXinvert;
9302 context_values.plane_mask=
9303 context_values.background ^ context_values.foreground;
9304 context_values.subwindow_mode=IncludeInferiors;
9305 annotate_context=XCreateGC(display,root_window,(size_t) (GCBackground |
9306 GCForeground | GCFunction | GCSubwindowMode),&context_values);
9307 if (annotate_context == (GC) NULL)
9308 return(MagickFalse);
9310 Grab the pointer using target cursor.
9312 target_cursor=XMakeCursor(display,root_window,XDefaultColormap(display,
9313 XDefaultScreen(display)),(char * ) "white",(char * ) "black");
9314 status=XGrabPointer(display,root_window,MagickFalse,(unsigned int)
9315 (ButtonPressMask | ButtonReleaseMask | ButtonMotionMask),GrabModeSync,
9316 GrabModeAsync,root_window,target_cursor,CurrentTime);
9317 if (status != GrabSuccess)
9319 ThrowXWindowException(XServerError,"UnableToGrabMouse","");
9320 return((Window) NULL);
9326 crop_info->height=0;
9328 target_window=(Window) NULL;
9333 if ((crop_info->width*crop_info->height) >= MinimumCropArea)
9334 (void) XDrawRectangle(display,root_window,annotate_context,
9335 (int) crop_info->x,(int) crop_info->y,(unsigned int) crop_info->width-1,
9336 (unsigned int) crop_info->height-1);
9338 Allow another event.
9340 (void) XAllowEvents(display,SyncPointer,CurrentTime);
9341 (void) XWindowEvent(display,root_window,ButtonPressMask |
9342 ButtonReleaseMask | ButtonMotionMask,&event);
9343 if ((crop_info->width*crop_info->height) >= MinimumCropArea)
9344 (void) XDrawRectangle(display,root_window,annotate_context,
9345 (int) crop_info->x,(int) crop_info->y,(unsigned int) crop_info->width-1,
9346 (unsigned int) crop_info->height-1);
9351 target_window=XGetSubwindow(display,event.xbutton.subwindow,
9352 event.xbutton.x,event.xbutton.y);
9353 if (target_window == (Window) NULL)
9354 target_window=root_window;
9355 x_offset=event.xbutton.x_root;
9356 y_offset=event.xbutton.y_root;
9357 crop_info->x=(ssize_t) x_offset;
9358 crop_info->y=(ssize_t) y_offset;
9360 crop_info->height=0;
9372 Discard pending button motion events.
9374 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
9375 crop_info->x=(ssize_t) event.xmotion.x;
9376 crop_info->y=(ssize_t) event.xmotion.y;
9378 Check boundary conditions.
9380 if ((int) crop_info->x < x_offset)
9381 crop_info->width=(size_t) (x_offset-crop_info->x);
9384 crop_info->width=(size_t) (crop_info->x-x_offset);
9385 crop_info->x=(ssize_t) x_offset;
9387 if ((int) crop_info->y < y_offset)
9388 crop_info->height=(size_t) (y_offset-crop_info->y);
9391 crop_info->height=(size_t) (crop_info->y-y_offset);
9392 crop_info->y=(ssize_t) y_offset;
9398 } while ((target_window == (Window) NULL) || (presses > 0));
9399 (void) XUngrabPointer(display,CurrentTime);
9400 (void) XFreeCursor(display,target_cursor);
9401 (void) XFreeGC(display,annotate_context);
9402 if ((crop_info->width*crop_info->height) < MinimumCropArea)
9405 crop_info->height=0;
9407 if ((crop_info->width != 0) && (crop_info->height != 0))
9408 target_window=root_window;
9409 return(target_window);
9413 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9417 % X S e t C u r s o r S t a t e %
9421 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9423 % XSetCursorState() sets the cursor state to busy, otherwise the cursor are
9424 % reset to their default.
9426 % The format of the XXSetCursorState method is:
9428 % XSetCursorState(display,windows,const MagickStatusType state)
9430 % A description of each parameter follows:
9432 % o display: Specifies a connection to an X server; returned from
9435 % o windows: Specifies a pointer to a XWindows structure.
9437 % o state: An unsigned integer greater than 0 sets the cursor state
9438 % to busy, otherwise the cursor are reset to their default.
9441 MagickPrivate void XSetCursorState(Display *display,XWindows *windows,
9442 const MagickStatusType state)
9444 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
9445 assert(display != (Display *) NULL);
9446 assert(windows != (XWindows *) NULL);
9449 (void) XCheckDefineCursor(display,windows->image.id,
9450 windows->image.busy_cursor);
9451 (void) XCheckDefineCursor(display,windows->pan.id,
9452 windows->pan.busy_cursor);
9453 (void) XCheckDefineCursor(display,windows->magnify.id,
9454 windows->magnify.busy_cursor);
9455 (void) XCheckDefineCursor(display,windows->command.id,
9456 windows->command.busy_cursor);
9460 (void) XCheckDefineCursor(display,windows->image.id,
9461 windows->image.cursor);
9462 (void) XCheckDefineCursor(display,windows->pan.id,windows->pan.cursor);
9463 (void) XCheckDefineCursor(display,windows->magnify.id,
9464 windows->magnify.cursor);
9465 (void) XCheckDefineCursor(display,windows->command.id,
9466 windows->command.cursor);
9467 (void) XCheckDefineCursor(display,windows->command.id,
9468 windows->widget.cursor);
9469 (void) XWithdrawWindow(display,windows->info.id,windows->info.screen);
9471 windows->info.mapped=MagickFalse;
9475 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9479 % X S e t W i n d o w s %
9483 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9485 % XSetWindows() sets the X windows structure if the windows info is specified.
9486 % Otherwise the current windows structure is returned.
9488 % The format of the XSetWindows method is:
9490 % XWindows *XSetWindows(XWindows *windows_info)
9492 % A description of each parameter follows:
9494 % o windows_info: Initialize the Windows structure with this information.
9497 MagickPrivate XWindows *XSetWindows(XWindows *windows_info)
9500 *windows = (XWindows *) NULL;
9502 if (windows_info != (XWindows *) ~0)
9504 windows=(XWindows *) RelinquishMagickMemory(windows);
9505 windows=windows_info;
9510 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9514 % X U s e r P r e f e r e n c e s %
9518 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9520 % XUserPreferences() saves the preferences in a configuration file in the
9521 % users' home directory.
9523 % The format of the XUserPreferences method is:
9525 % void XUserPreferences(XResourceInfo *resource_info)
9527 % A description of each parameter follows:
9529 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
9532 MagickPrivate void XUserPreferences(XResourceInfo *resource_info)
9534 #if defined(X11_PREFERENCES_PATH)
9536 cache[MaxTextExtent],
9537 filename[MaxTextExtent],
9538 specifier[MaxTextExtent];
9545 preferences_database;
9548 Save user preferences to the client configuration file.
9550 assert(resource_info != (XResourceInfo *) NULL);
9551 client_name=GetClientName();
9552 preferences_database=XrmGetStringDatabase("");
9553 (void) FormatLocaleString(specifier,MaxTextExtent,"%s.backdrop",client_name);
9554 value=resource_info->backdrop ? "True" : "False";
9555 XrmPutStringResource(&preferences_database,specifier,(char *) value);
9556 (void) FormatLocaleString(specifier,MaxTextExtent,"%s.colormap",client_name);
9557 value=resource_info->colormap == SharedColormap ? "Shared" : "Private";
9558 XrmPutStringResource(&preferences_database,specifier,(char *) value);
9559 (void) FormatLocaleString(specifier,MaxTextExtent,"%s.confirmExit",
9561 value=resource_info->confirm_exit ? "True" : "False";
9562 XrmPutStringResource(&preferences_database,specifier,(char *) value);
9563 (void) FormatLocaleString(specifier,MaxTextExtent,"%s.confirmEdit",
9565 value=resource_info->confirm_edit ? "True" : "False";
9566 XrmPutStringResource(&preferences_database,specifier,(char *) value);
9567 (void) FormatLocaleString(specifier,MaxTextExtent,"%s.displayWarnings",
9569 value=resource_info->display_warnings ? "True" : "False";
9570 XrmPutStringResource(&preferences_database,specifier,(char *) value);
9571 (void) FormatLocaleString(specifier,MaxTextExtent,"%s.dither",client_name);
9572 value=resource_info->quantize_info->dither_method != NoDitherMethod ?
9574 XrmPutStringResource(&preferences_database,specifier,(char *) value);
9575 (void) FormatLocaleString(specifier,MaxTextExtent,"%s.gammaCorrect",
9577 value=resource_info->gamma_correct ? "True" : "False";
9578 XrmPutStringResource(&preferences_database,specifier,(char *) value);
9579 (void) FormatLocaleString(specifier,MaxTextExtent,"%s.undoCache",client_name);
9580 (void) FormatLocaleString(cache,MaxTextExtent,"%.20g",(double)
9581 resource_info->undo_cache);
9582 XrmPutStringResource(&preferences_database,specifier,cache);
9583 (void) FormatLocaleString(specifier,MaxTextExtent,"%s.usePixmap",client_name);
9584 value=resource_info->use_pixmap ? "True" : "False";
9585 XrmPutStringResource(&preferences_database,specifier,(char *) value);
9586 (void) FormatLocaleString(filename,MaxTextExtent,"%s%src",
9587 X11_PREFERENCES_PATH,client_name);
9588 ExpandFilename(filename);
9589 XrmPutFileDatabase(preferences_database,filename);
9594 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9598 % X V i s u a l C l a s s N a m e %
9602 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9604 % XVisualClassName() returns the visual class name as a character string.
9606 % The format of the XVisualClassName method is:
9608 % char *XVisualClassName(const int visual_class)
9610 % A description of each parameter follows:
9612 % o visual_type: XVisualClassName returns the visual class as a character
9615 % o class: Specifies the visual class.
9618 static const char *XVisualClassName(const int visual_class)
9620 switch (visual_class)
9622 case StaticGray: return("StaticGray");
9623 case GrayScale: return("GrayScale");
9624 case StaticColor: return("StaticColor");
9625 case PseudoColor: return("PseudoColor");
9626 case TrueColor: return("TrueColor");
9627 case DirectColor: return("DirectColor");
9629 return("unknown visual class");
9633 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9641 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9643 % XWarning() displays a warning reason in a Notice widget.
9645 % The format of the XWarning method is:
9647 % void XWarning(const unsigned int warning,const char *reason,
9648 % const char *description)
9650 % A description of each parameter follows:
9652 % o warning: Specifies the numeric warning category.
9654 % o reason: Specifies the reason to display before terminating the
9657 % o description: Specifies any description to the reason.
9660 MagickPrivate void XWarning(const ExceptionType magick_unused(warning),
9661 const char *reason,const char *description)
9664 text[MaxTextExtent];
9669 if (reason == (char *) NULL)
9671 (void) CopyMagickString(text,reason,MaxTextExtent);
9672 (void) ConcatenateMagickString(text,":",MaxTextExtent);
9673 windows=XSetWindows((XWindows *) ~0);
9674 XNoticeWidget(windows->display,windows,text,(char *) description);
9678 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9682 % X W i n d o w B y I D %
9686 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9688 % XWindowByID() locates a child window with a given ID. If not window with
9689 % the given name is found, 0 is returned. Only the window specified and its
9690 % subwindows are searched.
9692 % The format of the XWindowByID function is:
9694 % child=XWindowByID(display,window,id)
9696 % A description of each parameter follows:
9698 % o child: XWindowByID returns the window with the specified
9699 % id. If no windows are found, XWindowByID returns 0.
9701 % o display: Specifies a pointer to the Display structure; returned from
9704 % o id: Specifies the id of the window to locate.
9707 MagickPrivate Window XWindowByID(Display *display,const Window root_window,
9727 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
9728 assert(display != (Display *) NULL);
9729 assert(root_window != (Window) NULL);
9731 return(XSelectWindow(display,&rectangle_info));
9732 if (root_window == id)
9733 return(root_window);
9734 status=XQueryTree(display,root_window,&child,&child,&children,
9736 if (status == False)
9737 return((Window) NULL);
9738 window=(Window) NULL;
9739 for (i=0; i < (int) number_children; i++)
9742 Search each child and their children.
9744 window=XWindowByID(display,children[i],id);
9745 if (window != (Window) NULL)
9748 if (children != (Window *) NULL)
9749 (void) XFree((void *) children);
9754 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9758 % X W i n d o w B y N a m e %
9762 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9764 % XWindowByName() locates a window with a given name on a display. If no
9765 % window with the given name is found, 0 is returned. If more than one window
9766 % has the given name, the first one is returned. Only root and its children
9769 % The format of the XWindowByName function is:
9771 % window=XWindowByName(display,root_window,name)
9773 % A description of each parameter follows:
9775 % o window: XWindowByName returns the window id.
9777 % o display: Specifies a pointer to the Display structure; returned from
9780 % o root_window: Specifies the id of the root window.
9782 % o name: Specifies the name of the window to locate.
9785 MagickPrivate Window XWindowByName(Display *display,const Window root_window,
9805 assert(display != (Display *) NULL);
9806 assert(root_window != (Window) NULL);
9807 assert(name != (char *) NULL);
9808 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",name);
9809 if (XGetWMName(display,root_window,&window_name) != 0)
9810 if (LocaleCompare((char *) window_name.value,name) == 0)
9811 return(root_window);
9812 status=XQueryTree(display,root_window,&child,&child,&children,
9814 if (status == False)
9815 return((Window) NULL);
9816 window=(Window) NULL;
9817 for (i=0; i < (int) number_children; i++)
9820 Search each child and their children.
9822 window=XWindowByName(display,children[i],name);
9823 if (window != (Window) NULL)
9826 if (children != (Window *) NULL)
9827 (void) XFree((void *) children);
9832 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9836 % X W i n d o w B y P r o p e r y %
9840 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9842 % XWindowByProperty() locates a child window with a given property. If not
9843 % window with the given name is found, 0 is returned. If more than one window
9844 % has the given property, the first one is returned. Only the window
9845 % specified and its subwindows are searched.
9847 % The format of the XWindowByProperty function is:
9849 % child=XWindowByProperty(display,window,property)
9851 % A description of each parameter follows:
9853 % o child: XWindowByProperty returns the window id with the specified
9854 % property. If no windows are found, XWindowByProperty returns 0.
9856 % o display: Specifies a pointer to the Display structure; returned from
9859 % o property: Specifies the property of the window to locate.
9862 MagickPrivate Window XWindowByProperty(Display *display,const Window window,
9863 const Atom property)
9891 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
9892 assert(display != (Display *) NULL);
9893 assert(window != (Window) NULL);
9894 assert(property != (Atom) NULL);
9895 status=XQueryTree(display,window,&root,&parent,&children,&number_children);
9896 if (status == False)
9897 return((Window) NULL);
9899 child=(Window) NULL;
9900 for (i=0; (i < number_children) && (child == (Window) NULL); i++)
9902 status=XGetWindowProperty(display,children[i],property,0L,0L,MagickFalse,
9903 (Atom) AnyPropertyType,&type,&format,&number_items,&after,&data);
9905 (void) XFree((void *) data);
9906 if ((status == Success) && (type != (Atom) NULL))
9909 for (i=0; (i < number_children) && (child == (Window) NULL); i++)
9910 child=XWindowByProperty(display,children[i],property);
9911 if (children != (Window *) NULL)
9912 (void) XFree((void *) children);
9918 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9922 % X I m p o r t I m a g e %
9926 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9928 % XImportImage() reads an image from an X window.
9930 % The format of the XImportImage method is:
9932 % Image *XImportImage(const ImageInfo *image_info,XImportInfo *ximage_info,
9933 % ExceptionInfo *exception)
9935 % A description of each parameter follows:
9937 % o image_info: the image info..
9939 % o ximage_info: Specifies a pointer to an XImportInfo structure.
9941 % o exception: return any errors or warnings in this structure.
9944 MagickExport Image *XImportImage(const ImageInfo *image_info,
9945 XImportInfo *ximage_info,ExceptionInfo *exception)
9947 assert(image_info != (const ImageInfo *) NULL);
9948 assert(image_info->signature == MagickSignature);
9949 if (image_info->debug != MagickFalse)
9950 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
9951 image_info->filename);
9952 assert(ximage_info != (XImportInfo *) NULL);
9953 assert(exception != (ExceptionInfo *) NULL);
9954 assert(exception->signature == MagickSignature);
9955 return((Image *) NULL);
9959 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9963 % X R e n d e r X 1 1 %
9967 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9969 % XRenderImage() renders text on the image with an X11 font. It also returns
9970 % the bounding box of the text relative to the image.
9972 % The format of the XRenderImage method is:
9974 % MagickBooleanType XRenderImage(Image *image,DrawInfo *draw_info,
9975 % const PointInfo *offset,TypeMetric *metrics,ExceptionInfo *exception)
9977 % A description of each parameter follows:
9979 % o image: the image.
9981 % o draw_info: the draw info.
9983 % o offset: (x,y) location of text relative to image.
9985 % o metrics: bounding box of text.
9987 % o exception: return any errors or warnings in this structure.
9990 MagickPrivate MagickBooleanType XRenderImage(Image *image,
9991 const DrawInfo *draw_info,const PointInfo *offset,TypeMetric *metrics,
9992 ExceptionInfo *exception)
9997 (void) ThrowMagickException(exception,GetMagickModule(),
9998 MissingDelegateError,"DelegateLibrarySupportNotBuiltIn","'%s' (X11)",
10000 return(MagickFalse);
10005 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10009 + X C o m p o n e n t G e n e s i s %
10013 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10015 % XComponentGenesis() instantiates the X component.
10017 % The format of the XComponentGenesis method is:
10019 % MagickBooleanType XComponentGenesis(void)
10022 MagickPrivate MagickBooleanType XComponentGenesis(void)
10024 return(MagickTrue);
10028 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10032 % X G e t I m p o r t I n f o %
10036 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10038 % XGetImportInfo() initializes the XImportInfo structure.
10040 % The format of the XGetImportInfo method is:
10042 % void XGetImportInfo(XImportInfo *ximage_info)
10044 % A description of each parameter follows:
10046 % o ximage_info: Specifies a pointer to an ImageInfo structure.
10049 MagickExport void XGetImportInfo(XImportInfo *ximage_info)
10051 assert(ximage_info != (XImportInfo *) NULL);
10052 ximage_info->frame=MagickFalse;
10053 ximage_info->borders=MagickFalse;
10054 ximage_info->screen=MagickFalse;
10055 ximage_info->descend=MagickTrue;
10056 ximage_info->silent=MagickFalse;