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-2018 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 % https://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/memory-private.h"
67 #include "MagickCore/monitor.h"
68 #include "MagickCore/nt-base-private.h"
69 #include "MagickCore/option.h"
70 #include "MagickCore/pixel-accessor.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/transform-private.h"
81 #include "MagickCore/token.h"
82 #include "MagickCore/utility.h"
83 #include "MagickCore/utility-private.h"
84 #include "MagickCore/widget.h"
85 #include "MagickCore/widget-private.h"
86 #include "MagickCore/xwindow.h"
87 #include "MagickCore/xwindow-private.h"
88 #include "MagickCore/version.h"
92 #if defined(MAGICKCORE_X11_DELEGATE)
93 #include <X11/Xproto.h>
94 #include <X11/Xlocale.h>
95 #if defined(MAGICK_HAVE_POLL)
96 # include <sys/poll.h>
98 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
99 #if defined(MAGICKCORE_HAVE_MACHINE_PARAM_H)
100 # include <machine/param.h>
104 #include <X11/extensions/XShm.h>
106 #if defined(MAGICKCORE_HAVE_SHAPE)
107 #include <X11/extensions/shape.h>
113 #define XBlueGamma(color) ClampToQuantum(blue_gamma == 1.0 ? (double) \
114 (color) : ((pow(((double) QuantumScale*(color)),1.0/(double) blue_gamma)* \
116 #define XGammaPacket(map,color) (size_t) (map->base_pixel+ \
117 ((ScaleQuantumToShort(XRedGamma((color)->red))*map->red_max/65535L)* \
119 ((ScaleQuantumToShort(XGreenGamma((color)->green))*map->green_max/65535L)* \
121 ((ScaleQuantumToShort(XBlueGamma((color)->blue))*map->blue_max/65535L)* \
123 #define XGammaPixel(image,map,color) (size_t) (map->base_pixel+ \
124 ((ScaleQuantumToShort(XRedGamma(GetPixelRed(image,color)))*map->red_max/65535L)* \
126 ((ScaleQuantumToShort(XGreenGamma(GetPixelGreen(image,color)))*map->green_max/65535L)* \
128 ((ScaleQuantumToShort(XBlueGamma(GetPixelBlue(image,color)))*map->blue_max/65535L)* \
130 #define XGreenGamma(color) ClampToQuantum(green_gamma == 1.0 ? (double) \
131 (color) : ((pow(((double) QuantumScale*(color)),1.0/(double) green_gamma)* \
133 #define XRedGamma(color) ClampToQuantum(red_gamma == 1.0 ? (double) \
134 (color) : ((pow(((double) QuantumScale*(color)),1.0/(double) red_gamma)* \
136 #define XStandardPixel(map,color) (size_t) (map->base_pixel+ \
137 (((color)->red*map->red_max/65535L)*map->red_mult)+ \
138 (((color)->green*map->green_max/65535L)*map->green_mult)+ \
139 (((color)->blue*map->blue_max/65535L)*map->blue_mult))
141 #define AccentuateModulate ScaleCharToQuantum(80)
142 #define HighlightModulate ScaleCharToQuantum(125)
143 #define ShadowModulate ScaleCharToQuantum(135)
144 #define DepthModulate ScaleCharToQuantum(185)
145 #define TroughModulate ScaleCharToQuantum(110)
147 #define XLIB_ILLEGAL_ACCESS 1
149 #undef NorthWestGravity
151 #undef NorthEastGravity
155 #undef SouthWestGravity
157 #undef SouthEastGravity
164 #define XFD_SET fd_set
168 Enumeration declarations.
182 Typedef declarations.
184 typedef struct _DiversityPacket
199 Constant declaractions.
201 static MagickBooleanType
202 xerror_alert = MagickFalse;
208 *XVisualClassName(const int);
215 static MagickBooleanType
216 XMakePixmap(Display *,const XResourceInfo *,XWindowInfo *);
219 XMakeImageLSBFirst(const XResourceInfo *,const XWindowInfo *,Image *,
220 XImage *,XImage *,ExceptionInfo *),
221 XMakeImageMSBFirst(const XResourceInfo *,const XWindowInfo *,Image *,
222 XImage *,XImage *,ExceptionInfo *);
225 XSelectWindow(Display *,RectangleInfo *);
228 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
232 % D e s t r o y X R e s o u r c e s %
236 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
238 % DestroyXResources() destroys any X resources.
240 % The format of the DestroyXResources method is:
242 % void DestroyXResources()
244 % A description of each parameter follows:
247 MagickExport void DestroyXResources(void)
256 *magick_windows[MaxXWindows];
262 windows=XSetWindows((XWindows *) ~0);
263 if ((windows == (XWindows *) NULL) || (windows->display == (Display *) NULL))
266 magick_windows[number_windows++]=(&windows->context);
267 magick_windows[number_windows++]=(&windows->group_leader);
268 magick_windows[number_windows++]=(&windows->backdrop);
269 magick_windows[number_windows++]=(&windows->icon);
270 magick_windows[number_windows++]=(&windows->image);
271 magick_windows[number_windows++]=(&windows->info);
272 magick_windows[number_windows++]=(&windows->magnify);
273 magick_windows[number_windows++]=(&windows->pan);
274 magick_windows[number_windows++]=(&windows->command);
275 magick_windows[number_windows++]=(&windows->widget);
276 magick_windows[number_windows++]=(&windows->popup);
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[MagickPathExtent];
629 (void) FormatLocaleString(image_geometry,MagickPathExtent,"%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 != UndefinedPixelTrait ? 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.
1147 MagickPrivate XVisualInfo *XBestVisualInfo(Display *display,
1148 XStandardColormap *map_info,XResourceInfo *resource_info)
1150 #define MaxStandardColormaps 7
1151 #define XVisualColormapSize(visual_info) MagickMin((unsigned int) (\
1152 (visual_info->klass == TrueColor) || (visual_info->klass == DirectColor) ? \
1153 visual_info->red_mask | visual_info->green_mask | visual_info->blue_mask : \
1154 (unsigned long) visual_info->colormap_size),1UL << visual_info->depth)
1180 Restrict visual search by screen number.
1182 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1183 assert(display != (Display *) NULL);
1184 assert(map_info != (XStandardColormap *) NULL);
1185 assert(resource_info != (XResourceInfo *) NULL);
1186 map_type=resource_info->map_type;
1187 visual_type=resource_info->visual_type;
1188 visual_mask=VisualScreenMask;
1189 visual_template.screen=XDefaultScreen(display);
1190 visual_template.depth=XDefaultDepth(display,XDefaultScreen(display));
1192 if ((resource_info->immutable != MagickFalse) && (resource_info->colors != 0))
1193 if (resource_info->colors <= (one << (size_t) visual_template.depth))
1194 visual_mask|=VisualDepthMask;
1195 if (visual_type != (char *) NULL)
1198 Restrict visual search by class or visual id.
1200 if (LocaleCompare("staticgray",visual_type) == 0)
1202 visual_mask|=VisualClassMask;
1203 visual_template.klass=StaticGray;
1206 if (LocaleCompare("grayscale",visual_type) == 0)
1208 visual_mask|=VisualClassMask;
1209 visual_template.klass=GrayScale;
1212 if (LocaleCompare("staticcolor",visual_type) == 0)
1214 visual_mask|=VisualClassMask;
1215 visual_template.klass=StaticColor;
1218 if (LocaleCompare("pseudocolor",visual_type) == 0)
1220 visual_mask|=VisualClassMask;
1221 visual_template.klass=PseudoColor;
1224 if (LocaleCompare("truecolor",visual_type) == 0)
1226 visual_mask|=VisualClassMask;
1227 visual_template.klass=TrueColor;
1230 if (LocaleCompare("directcolor",visual_type) == 0)
1232 visual_mask|=VisualClassMask;
1233 visual_template.klass=DirectColor;
1236 if (LocaleCompare("default",visual_type) == 0)
1238 visual_mask|=VisualIDMask;
1239 visual_template.visualid=XVisualIDFromVisual(
1240 XDefaultVisual(display,XDefaultScreen(display)));
1243 if (isdigit((int) ((unsigned char) *visual_type)) != 0)
1245 visual_mask|=VisualIDMask;
1246 visual_template.visualid=
1247 strtol(visual_type,(char **) NULL,0);
1250 ThrowXWindowException(XServerError,
1251 "UnrecognizedVisualSpecifier",visual_type);
1254 Get all visuals that meet our criteria so far.
1257 visual_list=XGetVisualInfo(display,visual_mask,&visual_template,
1259 visual_mask=VisualScreenMask | VisualIDMask;
1260 if ((number_visuals == 0) || (visual_list == (XVisualInfo *) NULL))
1263 Failed to get visual; try using the default visual.
1265 ThrowXWindowException(XServerWarning,"UnableToGetVisual",visual_type);
1266 visual_template.visualid=XVisualIDFromVisual(XDefaultVisual(display,
1267 XDefaultScreen(display)));
1268 visual_list=XGetVisualInfo(display,visual_mask,&visual_template,
1270 if ((number_visuals == 0) || (visual_list == (XVisualInfo *) NULL))
1271 return((XVisualInfo *) NULL);
1272 ThrowXWindowException(XServerWarning,"UsingDefaultVisual",
1273 XVisualClassName(visual_list->klass));
1275 resource_info->color_recovery=MagickFalse;
1276 if ((map_info != (XStandardColormap *) NULL) && (map_type != (char *) NULL))
1282 map_name[MagickPathExtent];
1298 Choose a visual associated with a standard colormap.
1300 root_window=XRootWindow(display,XDefaultScreen(display));
1303 if (LocaleCompare(map_type,"list") != 0)
1306 User specified Standard Colormap.
1308 (void) FormatLocaleString((char *) map_name,MagickPathExtent,
1309 "RGB_%s_MAP",map_type);
1310 LocaleUpper(map_name);
1311 map_property=XInternAtom(display,(char *) map_name,MagickTrue);
1312 if (map_property != (Atom) NULL)
1313 status=XGetRGBColormaps(display,root_window,&map_list,&number_maps,
1319 *colormap[MaxStandardColormaps]=
1321 "_HP_RGB_SMOOTH_MAP_LIST",
1331 Choose a standard colormap from a list.
1333 for (i=0; i < MaxStandardColormaps; i++)
1335 map_property=XInternAtom(display,(char *) colormap[i],MagickTrue);
1336 if (map_property == (Atom) NULL)
1338 status=XGetRGBColormaps(display,root_window,&map_list,&number_maps,
1340 if (status != False)
1343 resource_info->color_recovery=i == 0 ? MagickTrue : MagickFalse;
1345 if (status == False)
1347 ThrowXWindowException(XServerError,"UnableToGetStandardColormap",
1349 return((XVisualInfo *) NULL);
1352 Search all Standard Colormaps and visuals for ids that match.
1354 *map_info=map_list[0];
1355 #if !defined(PRE_R4_ICCCM)
1356 visual_template.visualid=XVisualIDFromVisual(visual_list[0].visual);
1357 for (i=0; i < number_maps; i++)
1358 for (j=0; j < number_visuals; j++)
1359 if (map_list[i].visualid ==
1360 XVisualIDFromVisual(visual_list[j].visual))
1362 *map_info=map_list[i];
1363 visual_template.visualid=XVisualIDFromVisual(
1364 visual_list[j].visual);
1367 if (map_info->visualid != visual_template.visualid)
1369 ThrowXWindowException(XServerError,
1370 "UnableToMatchVisualToStandardColormap",map_type);
1371 return((XVisualInfo *) NULL);
1374 if (map_info->colormap == (Colormap) NULL)
1376 ThrowXWindowException(XServerError,"StandardColormapIsNotInitialized",
1378 return((XVisualInfo *) NULL);
1380 (void) XFree((void *) map_list);
1384 static const unsigned int
1399 Pick one visual that displays the most simultaneous colors.
1401 visual_info=visual_list;
1403 for (i=1; i < number_visuals; i++)
1406 if (XVisualColormapSize(p) > XVisualColormapSize(visual_info))
1409 if (XVisualColormapSize(p) == XVisualColormapSize(visual_info))
1410 if (rank[p->klass] > rank[visual_info->klass])
1413 visual_template.visualid=XVisualIDFromVisual(visual_info->visual);
1415 (void) XFree((void *) visual_list);
1417 Retrieve only one visual by its screen & id number.
1419 visual_info=XGetVisualInfo(display,visual_mask,&visual_template,
1421 if ((number_visuals == 0) || (visual_info == (XVisualInfo *) NULL))
1422 return((XVisualInfo *) NULL);
1423 return(visual_info);
1427 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1431 % X C h e c k D e f i n e C u r s o r %
1435 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1437 % XCheckDefineCursor() prevents cursor changes on the root window.
1439 % The format of the XXCheckDefineCursor method is:
1441 % XCheckDefineCursor(display,window,cursor)
1443 % A description of each parameter follows:
1445 % o display: Specifies a connection to an X server; returned from
1448 % o window: the window.
1450 % o cursor: the cursor.
1453 MagickPrivate int XCheckDefineCursor(Display *display,Window window,
1456 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1457 assert(display != (Display *) NULL);
1458 if (window == XRootWindow(display,XDefaultScreen(display)))
1460 return(XDefineCursor(display,window,cursor));
1464 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1468 % X C h e c k R e f r e s h W i n d o w s %
1472 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1474 % XCheckRefreshWindows() checks the X server for exposure events for a
1475 % particular window and updates the areassociated with the exposure event.
1477 % The format of the XCheckRefreshWindows method is:
1479 % void XCheckRefreshWindows(Display *display,XWindows *windows)
1481 % A description of each parameter follows:
1483 % o display: Specifies a connection to an X server; returned from
1486 % o windows: Specifies a pointer to a XWindows structure.
1489 MagickPrivate void XCheckRefreshWindows(Display *display,XWindows *windows)
1497 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1498 assert(display != (Display *) NULL);
1499 assert(windows != (XWindows *) NULL);
1500 XDelay(display,SuspendTime);
1501 id=windows->command.id;
1502 while (XCheckTypedWindowEvent(display,id,Expose,&event) != MagickFalse)
1503 (void) XCommandWidget(display,windows,(char const **) NULL,&event);
1504 id=windows->image.id;
1505 while (XCheckTypedWindowEvent(display,id,Expose,&event) != MagickFalse)
1506 XRefreshWindow(display,&windows->image,&event);
1507 XDelay(display,SuspendTime << 1);
1508 id=windows->command.id;
1509 while (XCheckTypedWindowEvent(display,id,Expose,&event) != MagickFalse)
1510 (void) XCommandWidget(display,windows,(char const **) NULL,&event);
1511 id=windows->image.id;
1512 while (XCheckTypedWindowEvent(display,id,Expose,&event) != MagickFalse)
1513 XRefreshWindow(display,&windows->image,&event);
1517 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1521 % X C l i e n t M e s s a g e %
1525 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1527 % XClientMessage() sends a reason to a window with XSendEvent. The reason is
1528 % initialized with a particular protocol type and atom.
1530 % The format of the XClientMessage function is:
1532 % XClientMessage(display,window,protocol,reason,timestamp)
1534 % A description of each parameter follows:
1536 % o display: Specifies a pointer to the Display structure; returned from
1539 % o window: Specifies a pointer to a Window structure.
1541 % o protocol: Specifies an atom value.
1543 % o reason: Specifies an atom value which is the reason to send.
1545 % o timestamp: Specifies a value of type Time.
1548 MagickPrivate void XClientMessage(Display *display,const Window window,
1549 const Atom protocol,const Atom reason,const Time timestamp)
1554 assert(display != (Display *) NULL);
1555 (void) memset(&client_event,0,sizeof(client_event));
1556 client_event.type=ClientMessage;
1557 client_event.window=window;
1558 client_event.message_type=protocol;
1559 client_event.format=32;
1560 client_event.data.l[0]=(long) reason;
1561 client_event.data.l[1]=(long) timestamp;
1562 (void) XSendEvent(display,window,MagickFalse,NoEventMask,(XEvent *)
1567 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1571 + X C l i e n t W i n d o w %
1575 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1577 % XClientWindow() finds a window, at or below the specified window, which has
1578 % a WM_STATE property. If such a window is found, it is returned, otherwise
1579 % the argument window is returned.
1581 % The format of the XClientWindow function is:
1583 % client_window=XClientWindow(display,target_window)
1585 % A description of each parameter follows:
1587 % o client_window: XClientWindow returns a window, at or below the specified
1588 % window, which has a WM_STATE property otherwise the argument
1589 % target_window is returned.
1591 % o display: Specifies a pointer to the Display structure; returned from
1594 % o target_window: Specifies the window to find a WM_STATE property.
1597 static Window XClientWindow(Display *display,Window target_window)
1619 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1620 assert(display != (Display *) NULL);
1621 state=XInternAtom(display,"WM_STATE",MagickTrue);
1622 if (state == (Atom) NULL)
1623 return(target_window);
1625 status=XGetWindowProperty(display,target_window,state,0L,0L,MagickFalse,
1626 (Atom) AnyPropertyType,&type,&format,&number_items,&after,&data);
1627 if ((status == Success) && (type != (Atom) NULL))
1628 return(target_window);
1629 client_window=XWindowByProperty(display,target_window,state);
1630 if (client_window == (Window) NULL)
1631 return(target_window);
1632 return(client_window);
1636 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1640 + X C o m p o n e n t T e r m i n u s %
1644 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1646 % XComponentTerminus() destroys the module component.
1648 % The format of the XComponentTerminus method is:
1650 % XComponentTerminus(void)
1653 MagickPrivate void XComponentTerminus(void)
1655 DestroyXResources();
1659 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1663 % X C o n f i g u r e I m a g e C o l o r m a p %
1667 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1669 % XConfigureImageColormap() creates a new X colormap.
1671 % The format of the XConfigureImageColormap method is:
1673 % void XConfigureImageColormap(Display *display,
1674 % XResourceInfo *resource_info,XWindows *windows,Image *image,
1675 % ExceptionInfo *exception)
1677 % A description of each parameter follows:
1679 % o display: Specifies a connection to an X server; returned from
1682 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
1684 % o windows: Specifies a pointer to a XWindows structure.
1686 % o image: the image.
1688 % o exception: return any errors or warnings in this structure.
1691 MagickPrivate void XConfigureImageColormap(Display *display,
1692 XResourceInfo *resource_info,XWindows *windows,Image *image,
1693 ExceptionInfo *exception)
1699 Make standard colormap.
1701 XSetCursorState(display,windows,MagickTrue);
1702 XCheckRefreshWindows(display,windows);
1703 XMakeStandardColormap(display,windows->visual_info,resource_info,image,
1704 windows->map_info,windows->pixel_info,exception);
1705 colormap=windows->map_info->colormap;
1706 (void) XSetWindowColormap(display,windows->image.id,colormap);
1707 (void) XSetWindowColormap(display,windows->command.id,colormap);
1708 (void) XSetWindowColormap(display,windows->widget.id,colormap);
1709 if (windows->magnify.mapped != MagickFalse)
1710 (void) XSetWindowColormap(display,windows->magnify.id,colormap);
1711 if (windows->pan.mapped != MagickFalse)
1712 (void) XSetWindowColormap(display,windows->pan.id,colormap);
1713 XSetCursorState(display,windows,MagickFalse);
1714 XClientMessage(display,windows->image.id,windows->im_protocols,
1715 windows->im_update_colormap,CurrentTime);
1719 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1723 % X C o n s t r a i n W i n d o w P o s i t i o n %
1727 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1729 % XConstrainWindowPosition() assures a window is positioned within the X
1730 % server boundaries.
1732 % The format of the XConstrainWindowPosition method is:
1734 % void XConstrainWindowPosition(Display *display,XWindowInfo *window_info)
1736 % A description of each parameter follows:
1738 % o display: Specifies a pointer to the Display structure; returned from
1741 % o window_info: Specifies a pointer to a XWindowInfo structure.
1744 MagickPrivate void XConstrainWindowPosition(Display *display,
1745 XWindowInfo *window_info)
1750 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1751 assert(display != (Display *) NULL);
1752 assert(window_info != (XWindowInfo *) NULL);
1753 limit=XDisplayWidth(display,window_info->screen)-window_info->width;
1754 if (window_info->x < 0)
1757 if (window_info->x > (int) limit)
1758 window_info->x=(int) limit;
1759 limit=XDisplayHeight(display,window_info->screen)-window_info->height;
1760 if (window_info->y < 0)
1763 if (window_info->y > limit)
1764 window_info->y=limit;
1768 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1776 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1778 % XDelay() suspends program execution for the number of milliseconds
1781 % The format of the Delay method is:
1783 % void XDelay(Display *display,const size_t milliseconds)
1785 % A description of each parameter follows:
1787 % o display: Specifies a pointer to the Display structure; returned from
1790 % o milliseconds: Specifies the number of milliseconds to delay before
1794 MagickPrivate void XDelay(Display *display,const size_t milliseconds)
1796 assert(display != (Display *) NULL);
1797 (void) XFlush(display);
1798 MagickDelay(milliseconds);
1802 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1806 % X D e s t r o y R e s o u r c e I n f o %
1810 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1812 % XDestroyResourceInfo() frees memory associated with the XResourceInfo
1815 % The format of the XDestroyResourceInfo method is:
1817 % void XDestroyResourceInfo(XResourceInfo *resource_info)
1819 % A description of each parameter follows:
1821 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
1824 MagickExport void XDestroyResourceInfo(XResourceInfo *resource_info)
1826 if (resource_info->image_geometry != (char *) NULL)
1827 resource_info->image_geometry=(char *)
1828 RelinquishMagickMemory(resource_info->image_geometry);
1829 if (resource_info->quantize_info != (QuantizeInfo *) NULL)
1830 resource_info->quantize_info=DestroyQuantizeInfo(
1831 resource_info->quantize_info);
1832 if (resource_info->client_name != (char *) NULL)
1833 resource_info->client_name=(char *)
1834 RelinquishMagickMemory(resource_info->client_name);
1835 if (resource_info->name != (char *) NULL)
1836 resource_info->name=DestroyString(resource_info->name);
1837 (void) memset(resource_info,0,sizeof(*resource_info));
1841 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1845 % X D e s t r o y W i n d o w C o l o r s %
1849 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1851 % XDestroyWindowColors() frees X11 color resources previously saved on a
1852 % window by XRetainWindowColors or programs like xsetroot.
1854 % The format of the XDestroyWindowColors method is:
1856 % void XDestroyWindowColors(Display *display,Window window)
1858 % A description of each parameter follows:
1860 % o display: Specifies a connection to an X server; returned from
1863 % o window: Specifies a pointer to a Window structure.
1866 MagickPrivate void XDestroyWindowColors(Display *display,Window window)
1886 If there are previous resources on the root window, destroy them.
1888 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1889 assert(display != (Display *) NULL);
1890 property=XInternAtom(display,"_XSETROOT_ID",MagickFalse);
1891 if (property == (Atom) NULL)
1893 ThrowXWindowException(XServerError,"UnableToCreateProperty",
1897 status=XGetWindowProperty(display,window,property,0L,1L,MagickTrue,
1898 (Atom) AnyPropertyType,&type,&format,&length,&after,&data);
1899 if (status != Success)
1901 if ((type == XA_PIXMAP) && (format == 32) && (length == 1) && (after == 0))
1903 (void) XKillClient(display,(XID) (*((Pixmap *) data)));
1904 (void) XDeleteProperty(display,window,property);
1907 (void) XFree((void *) data);
1911 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1915 % X D i s p l a y I m a g e I n f o %
1919 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1921 % XDisplayImageInfo() displays information about an X image.
1923 % The format of the XDisplayImageInfo method is:
1925 % void XDisplayImageInfo(Display *display,
1926 % const XResourceInfo *resource_info,XWindows *windows,Image *undo_image,
1927 % Image *image,ExceptionInfo *exception)
1929 % A description of each parameter follows:
1931 % o display: Specifies a connection to an X server; returned from
1934 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
1936 % o windows: Specifies a pointer to a XWindows structure.
1938 % o undo_image: the undo image.
1940 % o image: the image.
1942 % o exception: return any errors or warnings in this structure.
1945 MagickPrivate void XDisplayImageInfo(Display *display,
1946 const XResourceInfo *resource_info,XWindows *windows,Image *undo_image,
1947 Image *image,ExceptionInfo *exception)
1950 filename[MagickPathExtent],
1973 Write info about the X server to a file.
1975 assert(display != (Display *) NULL);
1976 assert(resource_info != (XResourceInfo *) NULL);
1977 assert(windows != (XWindows *) NULL);
1978 assert(image != (Image *) NULL);
1980 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
1982 unique_file=AcquireUniqueFileResource(filename);
1983 if (unique_file != -1)
1984 file=fdopen(unique_file,"w");
1985 if ((unique_file == -1) || (file == (FILE *) NULL))
1987 XNoticeWidget(display,windows,"Unable to display image info",filename);
1990 if (resource_info->gamma_correct != MagickFalse)
1991 if (resource_info->display_gamma != (char *) NULL)
1992 (void) FormatLocaleFile(file,"Display\n gamma: %s\n\n",
1993 resource_info->display_gamma);
1995 Write info about the X image to a file.
1997 (void) FormatLocaleFile(file,"X\n visual: %s\n",
1998 XVisualClassName((int) windows->image.storage_class));
1999 (void) FormatLocaleFile(file," depth: %d\n",windows->image.ximage->depth);
2000 if (windows->visual_info->colormap_size != 0)
2001 (void) FormatLocaleFile(file," colormap size: %d\n",
2002 windows->visual_info->colormap_size);
2003 if (resource_info->colormap== SharedColormap)
2004 (void) FormatLocaleFile(file," colormap type: Shared\n");
2006 (void) FormatLocaleFile(file," colormap type: Private\n");
2007 (void) FormatLocaleFile(file," geometry: %dx%d\n",
2008 windows->image.ximage->width,windows->image.ximage->height);
2009 if (windows->image.crop_geometry != (char *) NULL)
2010 (void) FormatLocaleFile(file," crop geometry: %s\n",
2011 windows->image.crop_geometry);
2012 if (windows->image.pixmap == (Pixmap) NULL)
2013 (void) FormatLocaleFile(file," type: X Image\n");
2015 (void) FormatLocaleFile(file," type: Pixmap\n");
2016 if (windows->image.shape != MagickFalse)
2017 (void) FormatLocaleFile(file," non-rectangular shape: True\n");
2019 (void) FormatLocaleFile(file," non-rectangular shape: False\n");
2020 if (windows->image.shared_memory != MagickFalse)
2021 (void) FormatLocaleFile(file," shared memory: True\n");
2023 (void) FormatLocaleFile(file," shared memory: False\n");
2024 (void) FormatLocaleFile(file,"\n");
2025 if (resource_info->font != (char *) NULL)
2026 (void) FormatLocaleFile(file,"Font: %s\n\n",resource_info->font);
2027 if (resource_info->text_font != (char *) NULL)
2028 (void) FormatLocaleFile(file,"Text font: %s\n\n",resource_info->text_font);
2030 Write info about the undo cache to a file.
2033 for (levels=0; undo_image != (Image *) NULL; levels++)
2035 number_pixels=undo_image->list->columns*undo_image->list->rows;
2036 bytes+=number_pixels*sizeof(PixelInfo);
2037 undo_image=GetPreviousImageInList(undo_image);
2039 (void) FormatLocaleFile(file,"Undo Edit Cache\n levels: %u\n",levels);
2040 (void) FormatLocaleFile(file," bytes: %.20gmb\n",(double)
2041 ((bytes+(1 << 19)) >> 20));
2042 (void) FormatLocaleFile(file," limit: %.20gmb\n\n",(double)
2043 resource_info->undo_cache);
2045 Write info about the image to a file.
2047 (void) IdentifyImage(image,file,MagickTrue,exception);
2048 (void) fclose(file);
2049 text=FileToString(filename,~0UL,exception);
2050 (void) RelinquishUniqueFileResource(filename);
2051 if (text == (char *) NULL)
2053 XNoticeWidget(display,windows,"MemoryAllocationFailed",
2054 "UnableToDisplayImageInfo");
2057 textlist=StringToList(text);
2058 if (textlist != (char **) NULL)
2061 title[MagickPathExtent];
2064 Display information about the image in the Text View widget.
2066 (void) XWithdrawWindow(display,windows->info.id,windows->info.screen);
2067 (void) FormatLocaleString(title,MagickPathExtent,"Image Info: %s",
2069 XTextViewWidget(display,resource_info,windows,MagickTrue,title,
2070 (char const **) textlist);
2071 for (i=0; textlist[i] != (char *) NULL; i++)
2072 textlist[i]=DestroyString(textlist[i]);
2073 textlist=(char **) RelinquishMagickMemory(textlist);
2075 text=DestroyString(text);
2079 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2083 + X D i t h e r I m a g e %
2087 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2089 % XDitherImage() dithers the reference image as required by the HP Color
2090 % Recovery algorithm. The color values are quantized to 3 bits of red and
2091 % green, and 2 bits of blue (3/3/2) and can be used as indices into a 8-bit X
2092 % standard colormap.
2094 % The format of the XDitherImage method is:
2096 % void XDitherImage(Image *image,XImage *ximage,ExceptionInfo *exception)
2098 % A description of each parameter follows:
2100 % o image: the image.
2102 % o ximage: Specifies a pointer to a XImage structure; returned from
2105 % o exception: return any errors or warnings in this structure.
2108 static void XDitherImage(Image *image,XImage *ximage,ExceptionInfo *exception)
2110 static const short int
2113 {-16, 4, -1, 11,-14, 6, -3, 9,-15, 5, -2, 10,-13, 7, -4, 8},
2114 { 15, -5, 0,-12, 13, -7, 2,-10, 14, -6, 1,-11, 12, -8, 3, -9}
2116 dither_green[2][16]=
2118 { 11,-15, 7, -3, 8,-14, 4, -2, 10,-16, 6, -4, 9,-13, 5, -1},
2119 {-12, 14, -8, 2, -9, 13, -5, 1,-11, 15, -7, 3,-10, 12, -6, 0}
2123 { -3, 9,-13, 7, -1, 11,-15, 5, -4, 8,-14, 6, -2, 10,-16, 4},
2124 { 2,-10, 12, -8, 0,-12, 14, -6, 3, -9, 13, -7, 1,-11, 15, -5}
2140 register const Quantum
2160 Allocate and initialize dither maps.
2162 for (i=0; i < 2; i++)
2163 for (j=0; j < 16; j++)
2165 red_map[i][j]=(unsigned char *) AcquireCriticalMemory(256UL*
2167 green_map[i][j]=(unsigned char *) AcquireCriticalMemory(256UL*
2168 sizeof(*green_map));
2169 blue_map[i][j]=(unsigned char *) AcquireCriticalMemory(256UL*
2173 Initialize dither tables.
2175 for (i=0; i < 2; i++)
2176 for (j=0; j < 16; j++)
2177 for (x=0; x < 256; x++)
2182 value+=dither_red[i][j];
2183 red_map[i][j][x]=(unsigned char)
2184 ((value < 0) ? 0 : (value > 255) ? 255 : value);
2188 value+=dither_green[i][j];
2189 green_map[i][j][x]=(unsigned char)
2190 ((value < 0) ? 0 : (value > 255) ? 255 : value);
2194 value+=((size_t) dither_blue[i][j] << 1);
2195 blue_map[i][j][x]=(unsigned char)
2196 ((value < 0) ? 0 : (value > 255) ? 255 : value);
2201 scanline_pad=(unsigned int) (ximage->bytes_per_line-
2202 ((size_t) (ximage->width*ximage->bits_per_pixel) >> 3));
2206 image_view=AcquireVirtualCacheView(image,exception);
2207 for (y=0; y < (int) image->rows; y++)
2209 p=GetCacheViewVirtualPixels(image_view,0,(ssize_t) y,image->columns,1,
2211 if (p == (const Quantum *) NULL)
2213 for (x=0; x < (int) image->columns; x++)
2215 color.red=(double) ClampToQuantum((double) (red_map[i][j][
2216 (int) ScaleQuantumToChar(GetPixelRed(image,p))] << 8));
2217 color.green=(double) ClampToQuantum((double) (green_map[i][j][
2218 (int) ScaleQuantumToChar(GetPixelGreen(image,p))] << 8));
2219 color.blue=(double) ClampToQuantum((double) (blue_map[i][j][
2220 (int) ScaleQuantumToChar(GetPixelBlue(image,p))] << 8));
2221 pixel=(size_t) (((size_t) color.red & 0xe0) |
2222 (((size_t) color.green & 0xe0) >> 3) |
2223 (((size_t) color.blue & 0xc0) >> 6));
2225 p+=GetPixelChannels(image);
2235 image_view=DestroyCacheView(image_view);
2237 Free allocated memory.
2239 for (i=0; i < 2; i++)
2240 for (j=0; j < 16; j++)
2242 green_map[i][j]=(unsigned char *) RelinquishMagickMemory(green_map[i][j]);
2243 blue_map[i][j]=(unsigned char *) RelinquishMagickMemory(blue_map[i][j]);
2244 red_map[i][j]=(unsigned char *) RelinquishMagickMemory(red_map[i][j]);
2249 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2253 % X D r a w I m a g e %
2257 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2259 % XDrawImage() draws a line on the image.
2261 % The format of the XDrawImage method is:
2263 % MagickBooleanType XDrawImage(Display *display,const XPixelInfo *pixel,
2264 % XDrawInfo *draw_info,Image *image,ExceptionInfo *exception)
2266 % A description of each parameter follows:
2268 % o display: Specifies a connection to an X server; returned from
2271 % o pixel: Specifies a pointer to a XPixelInfo structure.
2273 % o draw_info: Specifies a pointer to a XDrawInfo structure.
2275 % o image: the image.
2277 % o exception: return any errors or warnings in this structure.
2280 MagickPrivate MagickBooleanType XDrawImage(Display *display,
2281 const XPixelInfo *pixel,XDrawInfo *draw_info,Image *image,
2282 ExceptionInfo *exception)
2318 Initialize drawd image.
2320 assert(display != (Display *) NULL);
2321 assert(pixel != (XPixelInfo *) NULL);
2322 assert(draw_info != (XDrawInfo *) NULL);
2323 assert(image != (Image *) NULL);
2324 if (image->debug != MagickFalse)
2325 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
2327 Initialize drawd pixmap.
2329 root_window=XRootWindow(display,XDefaultScreen(display));
2330 depth=(unsigned int) XDefaultDepth(display,XDefaultScreen(display));
2331 draw_pixmap=XCreatePixmap(display,root_window,draw_info->width,
2332 draw_info->height,depth);
2333 if (draw_pixmap == (Pixmap) NULL)
2334 return(MagickFalse);
2336 Initialize graphics info.
2338 context_values.background=(size_t) (~0);
2339 context_values.foreground=0;
2340 context_values.line_width=(int) draw_info->line_width;
2341 draw_context=XCreateGC(display,root_window,(size_t)
2342 (GCBackground | GCForeground | GCLineWidth),&context_values);
2343 if (draw_context == (GC) NULL)
2344 return(MagickFalse);
2348 (void) XFillRectangle(display,draw_pixmap,draw_context,0,0,draw_info->width,
2351 Draw line to pixmap.
2353 (void) XSetBackground(display,draw_context,0);
2354 (void) XSetForeground(display,draw_context,(size_t) (~0));
2355 if (draw_info->stipple != (Pixmap) NULL)
2357 (void) XSetFillStyle(display,draw_context,FillOpaqueStippled);
2358 (void) XSetStipple(display,draw_context,draw_info->stipple);
2360 switch (draw_info->element)
2365 (void) XDrawLines(display,draw_pixmap,draw_context,
2366 draw_info->coordinate_info,(int) draw_info->number_coordinates,
2372 (void) XDrawLine(display,draw_pixmap,draw_context,draw_info->line_info.x1,
2373 draw_info->line_info.y1,draw_info->line_info.x2,
2374 draw_info->line_info.y2);
2377 case RectangleElement:
2379 (void) XDrawRectangle(display,draw_pixmap,draw_context,
2380 (int) draw_info->rectangle_info.x,(int) draw_info->rectangle_info.y,
2381 (unsigned int) draw_info->rectangle_info.width,
2382 (unsigned int) draw_info->rectangle_info.height);
2385 case FillRectangleElement:
2387 (void) XFillRectangle(display,draw_pixmap,draw_context,
2388 (int) draw_info->rectangle_info.x,(int) draw_info->rectangle_info.y,
2389 (unsigned int) draw_info->rectangle_info.width,
2390 (unsigned int) draw_info->rectangle_info.height);
2394 case EllipseElement:
2396 (void) XDrawArc(display,draw_pixmap,draw_context,
2397 (int) draw_info->rectangle_info.x,(int) draw_info->rectangle_info.y,
2398 (unsigned int) draw_info->rectangle_info.width,
2399 (unsigned int) draw_info->rectangle_info.height,0,360*64);
2402 case FillCircleElement:
2403 case FillEllipseElement:
2405 (void) XFillArc(display,draw_pixmap,draw_context,
2406 (int) draw_info->rectangle_info.x,(int) draw_info->rectangle_info.y,
2407 (unsigned int) draw_info->rectangle_info.width,
2408 (unsigned int) draw_info->rectangle_info.height,0,360*64);
2411 case PolygonElement:
2416 coordinate_info=draw_info->coordinate_info;
2417 (void) XDrawLines(display,draw_pixmap,draw_context,coordinate_info,
2418 (int) draw_info->number_coordinates,CoordModeOrigin);
2419 (void) XDrawLine(display,draw_pixmap,draw_context,
2420 coordinate_info[draw_info->number_coordinates-1].x,
2421 coordinate_info[draw_info->number_coordinates-1].y,
2422 coordinate_info[0].x,coordinate_info[0].y);
2425 case FillPolygonElement:
2427 (void) XFillPolygon(display,draw_pixmap,draw_context,
2428 draw_info->coordinate_info,(int) draw_info->number_coordinates,Complex,
2433 (void) XFreeGC(display,draw_context);
2437 draw_ximage=XGetImage(display,draw_pixmap,0,0,draw_info->width,
2438 draw_info->height,AllPlanes,ZPixmap);
2439 if (draw_ximage == (XImage *) NULL)
2440 return(MagickFalse);
2441 (void) XFreePixmap(display,draw_pixmap);
2443 Initialize draw image.
2445 draw_image=AcquireImage((ImageInfo *) NULL,exception);
2446 if (draw_image == (Image *) NULL)
2447 return(MagickFalse);
2448 draw_image->columns=draw_info->width;
2449 draw_image->rows=draw_info->height;
2451 Transfer drawn X image to image.
2453 width=(unsigned int) image->columns;
2454 height=(unsigned int) image->rows;
2457 (void) XParseGeometry(draw_info->geometry,&x,&y,&width,&height);
2458 (void) GetOneVirtualPixelInfo(image,UndefinedVirtualPixelMethod,(ssize_t) x,
2459 (ssize_t) y,&draw_image->background_color,exception);
2460 if (SetImageStorageClass(draw_image,DirectClass,exception) == MagickFalse)
2461 return(MagickFalse);
2462 draw_image->alpha_trait=BlendPixelTrait;
2463 draw_view=AcquireAuthenticCacheView(draw_image,exception);
2464 for (y=0; y < (int) draw_image->rows; y++)
2472 q=QueueCacheViewAuthenticPixels(draw_view,0,(ssize_t) y,draw_image->columns,
2474 if (q == (Quantum *) NULL)
2476 for (x=0; x < (int) draw_image->columns; x++)
2478 if (XGetPixel(draw_ximage,x,y) == 0)
2481 Set this pixel to the background color.
2483 SetPixelViaPixelInfo(draw_image,&draw_image->background_color,q);
2484 SetPixelAlpha(draw_image,(Quantum) (draw_info->stencil ==
2485 OpaqueStencil ? TransparentAlpha : OpaqueAlpha),q);
2490 Set this pixel to the pen color.
2492 SetPixelRed(draw_image,ScaleShortToQuantum(
2493 pixel->pen_color.red),q);
2494 SetPixelGreen(draw_image,ScaleShortToQuantum(
2495 pixel->pen_color.green),q);
2496 SetPixelBlue(draw_image,ScaleShortToQuantum(
2497 pixel->pen_color.blue),q);
2498 SetPixelAlpha(draw_image,(Quantum) (draw_info->stencil ==
2499 OpaqueStencil ? OpaqueAlpha : TransparentAlpha),q);
2501 q+=GetPixelChannels(draw_image);
2503 if (SyncCacheViewAuthenticPixels(draw_view,exception) == MagickFalse)
2506 draw_view=DestroyCacheView(draw_view);
2507 XDestroyImage(draw_ximage);
2509 Determine draw geometry.
2511 (void) XParseGeometry(draw_info->geometry,&x,&y,&width,&height);
2512 if ((width != (unsigned int) draw_image->columns) ||
2513 (height != (unsigned int) draw_image->rows))
2516 image_geometry[MagickPathExtent];
2521 (void) FormatLocaleString(image_geometry,MagickPathExtent,"%ux%u",
2523 (void) TransformImage(&draw_image,(char *) NULL,image_geometry,
2526 if (draw_info->degrees != 0.0)
2540 rotate_image=RotateImage(draw_image,draw_info->degrees,exception);
2541 if (rotate_image == (Image *) NULL)
2542 return(MagickFalse);
2543 draw_image=DestroyImage(draw_image);
2544 draw_image=rotate_image;
2546 Annotation is relative to the degree of rotation.
2548 normalized_degrees=draw_info->degrees;
2549 while (normalized_degrees < -45.0)
2550 normalized_degrees+=360.0;
2551 for (rotations=0; normalized_degrees > 45.0; rotations++)
2552 normalized_degrees-=90.0;
2553 switch (rotations % 4)
2563 x=x-(int) draw_image->columns/2;
2564 y=y+(int) draw_image->columns/2;
2572 x=x-(int) draw_image->columns;
2580 x=x-(int) draw_image->columns/2;
2581 y=y-(int) (draw_image->rows-(draw_image->columns/2));
2587 Composite text onto the image.
2589 draw_view=AcquireAuthenticCacheView(draw_image,exception);
2590 for (y=0; y < (int) draw_image->rows; y++)
2598 q=GetCacheViewAuthenticPixels(draw_view,0,(ssize_t) y,draw_image->columns,1,
2600 if (q == (Quantum *) NULL)
2602 for (x=0; x < (int) draw_image->columns; x++)
2604 if (GetPixelAlpha(image,q) != TransparentAlpha)
2605 SetPixelAlpha(draw_image,OpaqueAlpha,q);
2606 q+=GetPixelChannels(draw_image);
2608 if (SyncCacheViewAuthenticPixels(draw_view,exception) == MagickFalse)
2611 draw_view=DestroyCacheView(draw_view);
2612 (void) XParseGeometry(draw_info->geometry,&x,&y,&width,&height);
2613 if (draw_info->stencil == TransparentStencil)
2614 (void) CompositeImage(image,draw_image,CopyAlphaCompositeOp,MagickTrue,
2615 (ssize_t) x,(ssize_t) y,exception);
2618 alpha_trait=image->alpha_trait;
2619 (void) CompositeImage(image,draw_image,OverCompositeOp,MagickTrue,
2620 (ssize_t) x,(ssize_t) y,exception);
2621 image->alpha_trait=alpha_trait;
2623 draw_image=DestroyImage(draw_image);
2628 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2636 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2638 % XError() ignores BadWindow errors for XQueryTree and XGetWindowAttributes,
2639 % and ignores BadDrawable errors for XGetGeometry, and ignores BadValue errors
2640 % for XQueryColor. It returns MagickFalse in those cases. Otherwise it
2643 % The format of the XError function is:
2645 % int XError(display,error)
2647 % A description of each parameter follows:
2649 % o display: Specifies a pointer to the Display structure; returned from
2652 % o error: Specifies the error event.
2656 #if defined(__cplusplus) || defined(c_plusplus)
2660 MagickExport int XError(Display *display,XErrorEvent *error)
2662 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
2663 assert(display != (Display *) NULL);
2664 assert(error != (XErrorEvent *) NULL);
2665 xerror_alert=MagickTrue;
2666 switch (error->request_code)
2670 if ((int) error->error_code == BadDrawable)
2671 return(MagickFalse);
2674 case X_GetWindowAttributes:
2677 if ((int) error->error_code == BadWindow)
2678 return(MagickFalse);
2683 if ((int) error->error_code == BadValue)
2684 return(MagickFalse);
2691 #if defined(__cplusplus) || defined(c_plusplus)
2696 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2700 % X F r e e R e s o u r c e s %
2704 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2706 % XFreeResources() frees X11 resources.
2708 % The format of the XFreeResources method is:
2710 % void XFreeResources(Display *display,XVisualInfo *visual_info,
2711 % XStandardColormap *map_info,XPixelInfo *pixel,XFontStruct *font_info,
2712 % XResourceInfo *resource_info,XWindowInfo *window_info)
2713 % resource_info,window_info)
2715 % A description of each parameter follows:
2717 % o display: Specifies a connection to an X server; returned from
2720 % o visual_info: Specifies a pointer to a X11 XVisualInfo structure;
2721 % returned from XGetVisualInfo.
2723 % o map_info: If map_type is specified, this structure is initialized
2724 % with info from the Standard Colormap.
2726 % o pixel: Specifies a pointer to a XPixelInfo structure.
2728 % o font_info: Specifies a pointer to a XFontStruct structure.
2730 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
2732 % o window_info: Specifies a pointer to a X11 XWindowInfo structure.
2735 MagickPrivate void XFreeResources(Display *display,XVisualInfo *visual_info,
2736 XStandardColormap *map_info,XPixelInfo *pixel,XFontStruct *font_info,
2737 XResourceInfo *resource_info,XWindowInfo *window_info)
2739 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
2740 assert(display != (Display *) NULL);
2741 assert(resource_info != (XResourceInfo *) NULL);
2742 if (window_info != (XWindowInfo *) NULL)
2747 if (window_info->ximage != (XImage *) NULL)
2748 XDestroyImage(window_info->ximage);
2749 if (window_info->id != (Window) NULL)
2752 Free destroy window and free cursors.
2754 if (window_info->id != XRootWindow(display,visual_info->screen))
2755 (void) XDestroyWindow(display,window_info->id);
2756 if (window_info->annotate_context != (GC) NULL)
2757 (void) XFreeGC(display,window_info->annotate_context);
2758 if (window_info->highlight_context != (GC) NULL)
2759 (void) XFreeGC(display,window_info->highlight_context);
2760 if (window_info->widget_context != (GC) NULL)
2761 (void) XFreeGC(display,window_info->widget_context);
2762 if (window_info->cursor != (Cursor) NULL)
2763 (void) XFreeCursor(display,window_info->cursor);
2764 window_info->cursor=(Cursor) NULL;
2765 if (window_info->busy_cursor != (Cursor) NULL)
2766 (void) XFreeCursor(display,window_info->busy_cursor);
2767 window_info->busy_cursor=(Cursor) NULL;
2773 if (font_info != (XFontStruct *) NULL)
2775 (void) XFreeFont(display,font_info);
2776 font_info=(XFontStruct *) NULL;
2778 if (map_info != (XStandardColormap *) NULL)
2781 Free X Standard Colormap.
2783 if (resource_info->map_type == (char *) NULL)
2784 (void) XFreeStandardColormap(display,visual_info,map_info,pixel);
2785 (void) XFree((void *) map_info);
2790 if (visual_info != (XVisualInfo *) NULL)
2791 (void) XFree((void *) visual_info);
2792 if (resource_info->close_server != MagickFalse)
2793 (void) XCloseDisplay(display);
2797 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2801 % X F r e e S t a n d a r d C o l o r m a p %
2805 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2807 % XFreeStandardColormap() frees an X11 colormap.
2809 % The format of the XFreeStandardColormap method is:
2811 % void XFreeStandardColormap(Display *display,
2812 % const XVisualInfo *visual_info,XStandardColormap *map_info,
2813 % XPixelInfo *pixel)
2815 % A description of each parameter follows:
2817 % o display: Specifies a connection to an X server; returned from
2820 % o visual_info: Specifies a pointer to a X11 XVisualInfo structure;
2821 % returned from XGetVisualInfo.
2823 % o map_info: If map_type is specified, this structure is initialized
2824 % with info from the Standard Colormap.
2826 % o pixel: Specifies a pointer to a XPixelInfo structure.
2829 MagickPrivate void XFreeStandardColormap(Display *display,
2830 const XVisualInfo *visual_info,XStandardColormap *map_info,XPixelInfo *pixel)
2835 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
2836 assert(display != (Display *) NULL);
2837 assert(visual_info != (XVisualInfo *) NULL);
2838 assert(map_info != (XStandardColormap *) NULL);
2839 (void) XFlush(display);
2840 if (map_info->colormap != (Colormap) NULL)
2842 if (map_info->colormap != XDefaultColormap(display,visual_info->screen))
2843 (void) XFreeColormap(display,map_info->colormap);
2845 if (pixel != (XPixelInfo *) NULL)
2846 if ((visual_info->klass != TrueColor) &&
2847 (visual_info->klass != DirectColor))
2848 (void) XFreeColors(display,map_info->colormap,pixel->pixels,
2849 (int) pixel->colors,0);
2851 map_info->colormap=(Colormap) NULL;
2852 if (pixel != (XPixelInfo *) NULL)
2854 if (pixel->pixels != (unsigned long *) NULL)
2855 pixel->pixels=(unsigned long *) RelinquishMagickMemory(pixel->pixels);
2856 pixel->pixels=(unsigned long *) NULL;
2861 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2865 % X G e t A n n o t a t e I n f o %
2869 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2871 % XGetAnnotateInfo() initializes the AnnotateInfo structure.
2873 % The format of the XGetAnnotateInfo method is:
2875 % void XGetAnnotateInfo(XAnnotateInfo *annotate_info)
2877 % A description of each parameter follows:
2879 % o annotate_info: Specifies a pointer to a XAnnotateInfo structure.
2882 MagickPrivate void XGetAnnotateInfo(XAnnotateInfo *annotate_info)
2885 Initialize annotate structure.
2887 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
2888 assert(annotate_info != (XAnnotateInfo *) NULL);
2891 annotate_info->width=0;
2892 annotate_info->height=0;
2893 annotate_info->stencil=ForegroundStencil;
2894 annotate_info->degrees=0.0;
2895 annotate_info->font_info=(XFontStruct *) NULL;
2896 annotate_info->text=(char *) NULL;
2897 *annotate_info->geometry='\0';
2898 annotate_info->previous=(XAnnotateInfo *) NULL;
2899 annotate_info->next=(XAnnotateInfo *) NULL;
2900 (void) XSupportsLocale();
2901 (void) XSetLocaleModifiers("");
2905 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2909 % X G e t M a p I n f o %
2913 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2915 % XGetMapInfo() initializes the XStandardColormap structure.
2917 % The format of the XStandardColormap method is:
2919 % void XGetMapInfo(const XVisualInfo *visual_info,const Colormap colormap,
2920 % XStandardColormap *map_info)
2922 % A description of each parameter follows:
2924 % o colormap: Specifies the ID of the X server colormap.
2926 % o visual_info: Specifies a pointer to a X11 XVisualInfo structure;
2927 % returned from XGetVisualInfo.
2929 % o map_info: Specifies a pointer to a X11 XStandardColormap structure.
2932 MagickPrivate void XGetMapInfo(const XVisualInfo *visual_info,
2933 const Colormap colormap,XStandardColormap *map_info)
2936 Initialize map info.
2938 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
2939 assert(visual_info != (XVisualInfo *) NULL);
2940 assert(map_info != (XStandardColormap *) NULL);
2941 map_info->colormap=colormap;
2942 map_info->red_max=visual_info->red_mask;
2943 map_info->red_mult=(size_t) (map_info->red_max != 0 ? 1 : 0);
2944 if (map_info->red_max != 0)
2945 while ((map_info->red_max & 0x01) == 0)
2947 map_info->red_max>>=1;
2948 map_info->red_mult<<=1;
2950 map_info->green_max=visual_info->green_mask;
2951 map_info->green_mult=(size_t) (map_info->green_max != 0 ? 1 : 0);
2952 if (map_info->green_max != 0)
2953 while ((map_info->green_max & 0x01) == 0)
2955 map_info->green_max>>=1;
2956 map_info->green_mult<<=1;
2958 map_info->blue_max=visual_info->blue_mask;
2959 map_info->blue_mult=(size_t) (map_info->blue_max != 0 ? 1 : 0);
2960 if (map_info->blue_max != 0)
2961 while ((map_info->blue_max & 0x01) == 0)
2963 map_info->blue_max>>=1;
2964 map_info->blue_mult<<=1;
2966 map_info->base_pixel=0;
2970 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2974 % X G e t P i x e l I n f o %
2978 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2980 % XGetPixelInfo() initializes the PixelInfo structure.
2982 % The format of the XGetPixelInfo method is:
2984 % void XGetPixelInfo(Display *display,const XVisualInfo *visual_info,
2985 % const XStandardColormap *map_info,const XResourceInfo *resource_info,
2986 % Image *image,XPixelInfo *pixel)
2989 % A description of each parameter follows:
2991 % o display: Specifies a connection to an X server; returned from
2994 % o visual_info: Specifies a pointer to a X11 XVisualInfo structure;
2995 % returned from XGetVisualInfo.
2997 % o map_info: If map_type is specified, this structure is initialized
2998 % with info from the Standard Colormap.
3000 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
3002 % o image: the image.
3004 % o pixel: Specifies a pointer to a XPixelInfo structure.
3007 MagickPrivate void XGetPixelInfo(Display *display,
3008 const XVisualInfo *visual_info,const XStandardColormap *map_info,
3009 const XResourceInfo *resource_info,Image *image,XPixelInfo *pixel)
3012 *PenColors[MaxNumberPens]=
3014 "#000000000000", /* black */
3015 "#00000000ffff", /* blue */
3016 "#0000ffffffff", /* cyan */
3017 "#0000ffff0000", /* green */
3018 "#bdbdbdbdbdbd", /* gray */
3019 "#ffff00000000", /* red */
3020 "#ffff0000ffff", /* magenta */
3021 "#ffffffff0000", /* yellow */
3022 "#ffffffffffff", /* white */
3023 "#bdbdbdbdbdbd", /* gray */
3024 "#bdbdbdbdbdbd" /* gray */
3044 Initialize pixel info.
3046 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
3047 assert(display != (Display *) NULL);
3048 assert(visual_info != (XVisualInfo *) NULL);
3049 assert(map_info != (XStandardColormap *) NULL);
3050 assert(resource_info != (XResourceInfo *) NULL);
3051 assert(pixel != (XPixelInfo *) NULL);
3053 if (image != (Image *) NULL)
3054 if (image->storage_class == PseudoClass)
3055 pixel->colors=(ssize_t) image->colors;
3056 packets=(unsigned int)
3057 MagickMax((int) pixel->colors,visual_info->colormap_size)+MaxNumberPens;
3058 if (pixel->pixels != (unsigned long *) NULL)
3059 pixel->pixels=(unsigned long *) RelinquishMagickMemory(pixel->pixels);
3060 pixel->pixels=(unsigned long *) AcquireQuantumMemory(packets,
3061 sizeof(*pixel->pixels));
3062 if (pixel->pixels == (unsigned long *) NULL)
3063 ThrowXWindowFatalException(ResourceLimitFatalError,"UnableToGetPixelInfo",
3066 Set foreground color.
3068 colormap=map_info->colormap;
3069 (void) XParseColor(display,colormap,(char *) ForegroundColor,
3070 &pixel->foreground_color);
3071 status=XParseColor(display,colormap,resource_info->foreground_color,
3072 &pixel->foreground_color);
3073 if (status == False)
3074 ThrowXWindowException(XServerError,"ColorIsNotKnownToServer",
3075 resource_info->foreground_color);
3076 pixel->foreground_color.pixel=
3077 XStandardPixel(map_info,&pixel->foreground_color);
3078 pixel->foreground_color.flags=(char) (DoRed | DoGreen | DoBlue);
3080 Set background color.
3082 (void) XParseColor(display,colormap,"#d6d6d6d6d6d6",&pixel->background_color);
3083 status=XParseColor(display,colormap,resource_info->background_color,
3084 &pixel->background_color);
3085 if (status == False)
3086 ThrowXWindowException(XServerError,"ColorIsNotKnownToServer",
3087 resource_info->background_color);
3088 pixel->background_color.pixel=
3089 XStandardPixel(map_info,&pixel->background_color);
3090 pixel->background_color.flags=(char) (DoRed | DoGreen | DoBlue);
3094 (void) XParseColor(display,colormap,(char *) BorderColor,
3095 &pixel->border_color);
3096 status=XParseColor(display,colormap,resource_info->border_color,
3097 &pixel->border_color);
3098 if (status == False)
3099 ThrowXWindowException(XServerError,"ColorIsNotKnownToServer",
3100 resource_info->border_color);
3101 pixel->border_color.pixel=XStandardPixel(map_info,&pixel->border_color);
3102 pixel->border_color.flags=(char) (DoRed | DoGreen | DoBlue);
3106 pixel->matte_color=pixel->background_color;
3107 if (resource_info->matte_color != (char *) NULL)
3110 Matte color is specified as a X resource or command line argument.
3112 status=XParseColor(display,colormap,resource_info->matte_color,
3113 &pixel->matte_color);
3114 if (status == False)
3115 ThrowXWindowException(XServerError,"ColorIsNotKnownToServer",
3116 resource_info->matte_color);
3117 pixel->matte_color.pixel=XStandardPixel(map_info,&pixel->matte_color);
3118 pixel->matte_color.flags=(char) (DoRed | DoGreen | DoBlue);
3121 Set highlight color.
3123 pixel->highlight_color.red=(unsigned short) (((double)
3124 pixel->matte_color.red*ScaleQuantumToShort(HighlightModulate))/65535L+
3125 (ScaleQuantumToShort((Quantum) (QuantumRange-HighlightModulate))));
3126 pixel->highlight_color.green=(unsigned short) (((double)
3127 pixel->matte_color.green*ScaleQuantumToShort(HighlightModulate))/65535L+
3128 (ScaleQuantumToShort((Quantum) (QuantumRange-HighlightModulate))));
3129 pixel->highlight_color.blue=(unsigned short) (((double)
3130 pixel->matte_color.blue*ScaleQuantumToShort(HighlightModulate))/65535L+
3131 (ScaleQuantumToShort((Quantum) (QuantumRange-HighlightModulate))));
3132 pixel->highlight_color.pixel=XStandardPixel(map_info,&pixel->highlight_color);
3133 pixel->highlight_color.flags=(char) (DoRed | DoGreen | DoBlue);
3137 pixel->shadow_color.red=(unsigned short) (((double)
3138 pixel->matte_color.red*ScaleQuantumToShort(ShadowModulate))/65535L);
3139 pixel->shadow_color.green=(unsigned short) (((double)
3140 pixel->matte_color.green*ScaleQuantumToShort(ShadowModulate))/65535L);
3141 pixel->shadow_color.blue=(unsigned short) (((double)
3142 pixel->matte_color.blue*ScaleQuantumToShort(ShadowModulate))/65535L);
3143 pixel->shadow_color.pixel=XStandardPixel(map_info,&pixel->shadow_color);
3144 pixel->shadow_color.flags=(char) (DoRed | DoGreen | DoBlue);
3148 pixel->depth_color.red=(unsigned short) (((double)
3149 pixel->matte_color.red*ScaleQuantumToShort(DepthModulate))/65535L);
3150 pixel->depth_color.green=(unsigned short) (((double)
3151 pixel->matte_color.green*ScaleQuantumToShort(DepthModulate))/65535L);
3152 pixel->depth_color.blue=(unsigned short) (((double)
3153 pixel->matte_color.blue*ScaleQuantumToShort(DepthModulate))/65535L);
3154 pixel->depth_color.pixel=XStandardPixel(map_info,&pixel->depth_color);
3155 pixel->depth_color.flags=(char) (DoRed | DoGreen | DoBlue);
3159 pixel->trough_color.red=(unsigned short) (((double)
3160 pixel->matte_color.red*ScaleQuantumToShort(TroughModulate))/65535L);
3161 pixel->trough_color.green=(unsigned short) (((double)
3162 pixel->matte_color.green*ScaleQuantumToShort(TroughModulate))/65535L);
3163 pixel->trough_color.blue=(unsigned short) (((double)
3164 pixel->matte_color.blue*ScaleQuantumToShort(TroughModulate))/65535L);
3165 pixel->trough_color.pixel=XStandardPixel(map_info,&pixel->trough_color);
3166 pixel->trough_color.flags=(char) (DoRed | DoGreen | DoBlue);
3170 for (i=0; i < MaxNumberPens; i++)
3172 (void) XParseColor(display,colormap,(char *) PenColors[i],
3173 &pixel->pen_colors[i]);
3174 status=XParseColor(display,colormap,resource_info->pen_colors[i],
3175 &pixel->pen_colors[i]);
3176 if (status == False)
3177 ThrowXWindowException(XServerError,"ColorIsNotKnownToServer",
3178 resource_info->pen_colors[i]);
3179 pixel->pen_colors[i].pixel=XStandardPixel(map_info,&pixel->pen_colors[i]);
3180 pixel->pen_colors[i].flags=(char) (DoRed | DoGreen | DoBlue);
3182 pixel->box_color=pixel->background_color;
3183 pixel->pen_color=pixel->foreground_color;
3186 if (image != (Image *) NULL)
3188 if ((resource_info->gamma_correct != MagickFalse) &&
3189 (image->gamma != 0.0))
3198 Initialize map relative to display and image gamma.
3200 flags=ParseGeometry(resource_info->display_gamma,&geometry_info);
3201 red_gamma=geometry_info.rho;
3202 green_gamma=geometry_info.sigma;
3203 if ((flags & SigmaValue) == 0)
3204 green_gamma=red_gamma;
3205 blue_gamma=geometry_info.xi;
3206 if ((flags & XiValue) == 0)
3207 blue_gamma=red_gamma;
3208 red_gamma*=image->gamma;
3209 green_gamma*=image->gamma;
3210 blue_gamma*=image->gamma;
3212 if (image->storage_class == PseudoClass)
3215 Initialize pixel array for images of type PseudoClass.
3217 for (i=0; i < (ssize_t) image->colors; i++)
3218 pixel->pixels[i]=XGammaPacket(map_info,image->colormap+i);
3219 for (i=0; i < MaxNumberPens; i++)
3220 pixel->pixels[image->colors+i]=pixel->pen_colors[i].pixel;
3221 pixel->colors+=MaxNumberPens;
3227 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3231 % X G e t R e s o u r c e C l a s s %
3235 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3237 % XGetResourceClass() queries the X server for the specified resource name or
3238 % class. If the resource name or class is not defined in the database, the
3239 % supplied default value is returned.
3241 % The format of the XGetResourceClass method is:
3243 % char *XGetResourceClass(XrmDatabase database,const char *client_name,
3244 % const char *keyword,char *resource_default)
3246 % A description of each parameter follows:
3248 % o database: Specifies a resource database; returned from
3249 % XrmGetStringDatabase.
3251 % o client_name: Specifies the application name used to retrieve resource
3252 % info from the X server database.
3254 % o keyword: Specifies the keyword of the value being retrieved.
3256 % o resource_default: Specifies the default value to return if the query
3257 % fails to find the specified keyword/class.
3260 MagickExport char *XGetResourceClass(XrmDatabase database,
3261 const char *client_name,const char *keyword,char *resource_default)
3264 resource_class[MagickPathExtent],
3265 resource_name[MagickPathExtent];
3276 if (database == (XrmDatabase) NULL)
3277 return(resource_default);
3278 *resource_name='\0';
3279 *resource_class='\0';
3280 if (keyword != (char *) NULL)
3287 Initialize resource keyword and class.
3289 (void) FormatLocaleString(resource_name,MagickPathExtent,"%s.%s",
3290 client_name,keyword);
3291 c=(int) (*client_name);
3292 if ((c >= XK_a) && (c <= XK_z))
3295 if ((c >= XK_agrave) && (c <= XK_odiaeresis))
3296 c-=(XK_agrave-XK_Agrave);
3298 if ((c >= XK_oslash) && (c <= XK_thorn))
3299 c-=(XK_oslash-XK_Ooblique);
3301 if ((k >= XK_a) && (k <= XK_z))
3304 if ((k >= XK_agrave) && (k <= XK_odiaeresis))
3305 k-=(XK_agrave-XK_Agrave);
3307 if ((k >= XK_oslash) && (k <= XK_thorn))
3308 k-=(XK_oslash-XK_Ooblique);
3309 (void) FormatLocaleString(resource_class,MagickPathExtent,"%c%s.%c%s",c,
3310 client_name+1,k,keyword+1);
3312 status=XrmGetResource(database,resource_name,resource_class,&resource_type,
3314 if (status == False)
3315 return(resource_default);
3316 return(resource_value.addr);
3320 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3324 % X G e t R e s o u r c e D a t a b a s e %
3328 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3330 % XGetResourceDatabase() creates a new resource database and initializes it.
3332 % The format of the XGetResourceDatabase method is:
3334 % XrmDatabase XGetResourceDatabase(Display *display,
3335 % const char *client_name)
3337 % A description of each parameter follows:
3339 % o database: XGetResourceDatabase() returns the database after it is
3342 % o display: Specifies a connection to an X server; returned from
3345 % o client_name: Specifies the application name used to retrieve resource
3346 % info from the X server database.
3349 MagickExport XrmDatabase XGetResourceDatabase(Display *display,
3350 const char *client_name)
3353 filename[MagickPathExtent];
3365 if (display == (Display *) NULL)
3366 return((XrmDatabase) NULL);
3367 assert(client_name != (char *) NULL);
3369 Initialize resource database.
3372 (void) XGetDefault(display,(char *) client_name,"dummy");
3373 resource_database=XrmGetDatabase(display);
3375 Combine application database.
3377 p=client_name+(strlen(client_name)-1);
3378 while ((p > client_name) && (*p != '/'))
3382 c=(int) (*client_name);
3383 if ((c >= XK_a) && (c <= XK_z))
3386 if ((c >= XK_agrave) && (c <= XK_odiaeresis))
3387 c-=(XK_agrave-XK_Agrave);
3389 if ((c >= XK_oslash) && (c <= XK_thorn))
3390 c-=(XK_oslash-XK_Ooblique);
3391 #if defined(X11_APPLICATION_PATH)
3392 (void) FormatLocaleString(filename,MagickPathExtent,"%s%c%s",
3393 X11_APPLICATION_PATH,c,client_name+1);
3394 (void) XrmCombineFileDatabase(filename,&resource_database,MagickFalse);
3396 if (XResourceManagerString(display) != (char *) NULL)
3399 Combine server database.
3401 server_database=XrmGetStringDatabase(XResourceManagerString(display));
3402 XrmCombineDatabase(server_database,&resource_database,MagickFalse);
3405 Merge user preferences database.
3407 #if defined(X11_PREFERENCES_PATH)
3408 (void) FormatLocaleString(filename,MagickPathExtent,"%s%src",
3409 X11_PREFERENCES_PATH,client_name);
3410 ExpandFilename(filename);
3411 (void) XrmCombineFileDatabase(filename,&resource_database,MagickFalse);
3413 return(resource_database);
3417 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3421 % X G e t R e s o u r c e I n f o %
3425 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3427 % XGetResourceInfo(image_info,) initializes the ResourceInfo structure.
3429 % The format of the XGetResourceInfo method is:
3431 % void XGetResourceInfo(const ImageInfo *image_info,XrmDatabase database,
3432 % const char *client_name,XResourceInfo *resource_info)
3434 % A description of each parameter follows:
3436 % o image_info: the image info.
3438 % o database: Specifies a resource database; returned from
3439 % XrmGetStringDatabase.
3441 % o client_name: Specifies the application name used to retrieve
3442 % resource info from the X server database.
3444 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
3447 MagickExport void XGetResourceInfo(const ImageInfo *image_info,
3448 XrmDatabase database,const char *client_name,XResourceInfo *resource_info)
3459 Initialize resource info fields.
3461 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
3462 assert(resource_info != (XResourceInfo *) NULL);
3463 (void) memset(resource_info,0,sizeof(*resource_info));
3464 resource_info->resource_database=database;
3465 resource_info->image_info=(ImageInfo *) image_info;
3466 (void) SetImageInfoProgressMonitor(resource_info->image_info,
3467 XMagickProgressMonitor,(void *) NULL);
3468 resource_info->quantize_info=CloneQuantizeInfo((QuantizeInfo *) NULL);
3469 resource_info->close_server=MagickTrue;
3470 resource_info->client_name=AcquireString(client_name);
3471 resource_value=XGetResourceClass(database,client_name,"backdrop",
3473 resource_info->backdrop=IsStringTrue(resource_value);
3474 resource_info->background_color=XGetResourceInstance(database,client_name,
3475 "background",(char *) "#d6d6d6d6d6d6");
3476 resource_info->border_color=XGetResourceInstance(database,client_name,
3477 "borderColor",BorderColor);
3478 resource_value=XGetResourceClass(database,client_name,"borderWidth",
3480 resource_info->border_width=(unsigned int) StringToUnsignedLong(
3482 resource_value=XGetResourceClass(database,client_name,"colormap",
3484 resource_info->colormap=UndefinedColormap;
3485 if (LocaleCompare("private",resource_value) == 0)
3486 resource_info->colormap=PrivateColormap;
3487 if (LocaleCompare("shared",resource_value) == 0)
3488 resource_info->colormap=SharedColormap;
3489 if (resource_info->colormap == UndefinedColormap)
3490 ThrowXWindowException(OptionError,"UnrecognizedColormapType",
3492 resource_value=XGetResourceClass(database,client_name,
3493 "colorRecovery",(char *) "False");
3494 resource_info->color_recovery=IsStringTrue(resource_value);
3495 resource_value=XGetResourceClass(database,client_name,"confirmExit",
3497 resource_info->confirm_exit=IsStringTrue(resource_value);
3498 resource_value=XGetResourceClass(database,client_name,"confirmEdit",
3500 resource_info->confirm_edit=IsStringTrue(resource_value);
3501 resource_value=XGetResourceClass(database,client_name,"delay",(char *) "1");
3502 resource_info->delay=(unsigned int) StringToUnsignedLong(resource_value);
3503 resource_info->display_gamma=XGetResourceClass(database,client_name,
3504 "displayGamma",(char *) "2.2");
3505 resource_value=XGetResourceClass(database,client_name,"displayWarnings",
3507 resource_info->display_warnings=IsStringTrue(resource_value);
3508 resource_info->font=XGetResourceClass(database,client_name,"font",
3510 resource_info->font=XGetResourceClass(database,client_name,"fontList",
3511 resource_info->font);
3512 resource_info->font_name[0]=XGetResourceClass(database,client_name,"font1",
3514 resource_info->font_name[1]=XGetResourceClass(database,client_name,"font2",
3515 (char *) "variable");
3516 resource_info->font_name[2]=XGetResourceClass(database,client_name,"font3",
3518 resource_info->font_name[3]=XGetResourceClass(database,client_name,"font4",
3520 resource_info->font_name[4]=XGetResourceClass(database,client_name,"font5",
3521 (char *) "7x13bold");
3522 resource_info->font_name[5]=XGetResourceClass(database,client_name,"font6",
3523 (char *) "8x13bold");
3524 resource_info->font_name[6]=XGetResourceClass(database,client_name,"font7",
3525 (char *) "9x15bold");
3526 resource_info->font_name[7]=XGetResourceClass(database,client_name,"font8",
3528 resource_info->font_name[8]=XGetResourceClass(database,client_name,"font9",
3530 resource_info->font_name[9]=XGetResourceClass(database,client_name,"font0",
3532 resource_info->font_name[10]=XGetResourceClass(database,client_name,"font0",
3534 resource_info->foreground_color=XGetResourceInstance(database,client_name,
3535 "foreground",ForegroundColor);
3536 resource_value=XGetResourceClass(database,client_name,"gammaCorrect",
3538 resource_info->gamma_correct=IsStringTrue(resource_value);
3539 resource_info->image_geometry=ConstantString(XGetResourceClass(database,
3540 client_name,"geometry",(char *) NULL));
3541 resource_value=XGetResourceClass(database,client_name,"gravity",
3543 resource_info->gravity=(GravityType) ParseCommandOption(MagickGravityOptions,
3544 MagickFalse,resource_value);
3545 directory=getcwd(resource_info->home_directory,MagickPathExtent);
3547 resource_info->icon_geometry=XGetResourceClass(database,client_name,
3548 "iconGeometry",(char *) NULL);
3549 resource_value=XGetResourceClass(database,client_name,"iconic",
3551 resource_info->iconic=IsStringTrue(resource_value);
3552 resource_value=XGetResourceClass(database,client_name,"immutable",
3553 LocaleCompare(client_name,"PerlMagick") == 0 ? (char *) "True" :
3555 resource_info->immutable=IsStringTrue(resource_value);
3556 resource_value=XGetResourceClass(database,client_name,"magnify",
3558 resource_info->magnify=(unsigned int) StringToUnsignedLong(resource_value);
3559 resource_info->map_type=XGetResourceClass(database,client_name,"map",
3561 resource_info->matte_color=XGetResourceInstance(database,client_name,
3562 "mattecolor",(char *) NULL);
3563 resource_info->name=ConstantString(XGetResourceClass(database,client_name,
3564 "name",(char *) NULL));
3565 resource_info->pen_colors[0]=XGetResourceClass(database,client_name,"pen1",
3567 resource_info->pen_colors[1]=XGetResourceClass(database,client_name,"pen2",
3569 resource_info->pen_colors[2]=XGetResourceClass(database,client_name,"pen3",
3571 resource_info->pen_colors[3]=XGetResourceClass(database,client_name,"pen4",
3573 resource_info->pen_colors[4]=XGetResourceClass(database,client_name,"pen5",
3575 resource_info->pen_colors[5]=XGetResourceClass(database,client_name,"pen6",
3577 resource_info->pen_colors[6]=XGetResourceClass(database,client_name,"pen7",
3578 (char *) "magenta");
3579 resource_info->pen_colors[7]=XGetResourceClass(database,client_name,"pen8",
3581 resource_info->pen_colors[8]=XGetResourceClass(database,client_name,"pen9",
3583 resource_info->pen_colors[9]=XGetResourceClass(database,client_name,"pen0",
3585 resource_info->pen_colors[10]=XGetResourceClass(database,client_name,"pen0",
3587 resource_value=XGetResourceClass(database,client_name,"pause",(char *) "0");
3588 resource_info->pause=(unsigned int) StringToUnsignedLong(resource_value);
3589 resource_value=XGetResourceClass(database,client_name,"quantum",(char *) "1");
3590 resource_info->quantum=StringToLong(resource_value);
3591 resource_info->text_font=XGetResourceClass(database,client_name,(char *)
3592 "font",(char *) "fixed");
3593 resource_info->text_font=XGetResourceClass(database,client_name,
3594 "textFontList",resource_info->text_font);
3595 resource_info->title=XGetResourceClass(database,client_name,"title",
3597 resource_value=XGetResourceClass(database,client_name,"undoCache",
3599 resource_info->undo_cache=(unsigned int) StringToUnsignedLong(resource_value);
3600 resource_value=XGetResourceClass(database,client_name,"update",
3602 resource_info->update=IsStringTrue(resource_value);
3603 resource_value=XGetResourceClass(database,client_name,"usePixmap",
3605 resource_info->use_pixmap=IsStringTrue(resource_value);
3606 resource_value=XGetResourceClass(database,client_name,"sharedMemory",
3608 resource_info->use_shared_memory=IsStringTrue(resource_value);
3609 resource_info->visual_type=XGetResourceClass(database,client_name,"visual",
3611 resource_info->window_group=XGetResourceClass(database,client_name,
3612 "windowGroup",(char *) NULL);
3613 resource_info->window_id=XGetResourceClass(database,client_name,"window",
3615 resource_info->write_filename=XGetResourceClass(database,client_name,
3616 "writeFilename",(char *) NULL);
3620 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3624 % X G e t R e s o u r c e I n s t a n c e %
3628 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3630 % XGetResourceInstance() queries the X server for the specified resource name.
3631 % If the resource name is not defined in the database, the supplied default
3632 % value is returned.
3634 % The format of the XGetResourceInstance method is:
3636 % char *XGetResourceInstance(XrmDatabase database,const char *client_name,
3637 % const char *keyword,const char *resource_default)
3639 % A description of each parameter follows:
3641 % o database: Specifies a resource database; returned from
3642 % XrmGetStringDatabase.
3644 % o client_name: Specifies the application name used to retrieve
3645 % resource info from the X server database.
3647 % o keyword: Specifies the keyword of the value being retrieved.
3649 % o resource_default: Specifies the default value to return if the query
3650 % fails to find the specified keyword/class.
3653 MagickExport char *XGetResourceInstance(XrmDatabase database,
3654 const char *client_name,const char *keyword,const char *resource_default)
3658 resource_name[MagickPathExtent];
3666 if (database == (XrmDatabase) NULL)
3667 return((char *) resource_default);
3668 *resource_name='\0';
3669 if (keyword != (char *) NULL)
3670 (void) FormatLocaleString(resource_name,MagickPathExtent,"%s.%s",client_name,
3672 status=XrmGetResource(database,resource_name,"ImageMagick",&resource_type,
3674 if (status == False)
3675 return((char *) resource_default);
3676 return(resource_value.addr);
3680 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3684 % X G e t S c r e e n D e n s i t y %
3688 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3690 % XGetScreenDensity() returns the density of the X server screen in
3693 % The format of the XGetScreenDensity method is:
3695 % char *XGetScreenDensity(Display *display)
3697 % A description of each parameter follows:
3699 % o density: XGetScreenDensity() returns the density of the X screen in
3702 % o display: Specifies a connection to an X server; returned from
3706 MagickExport char *XGetScreenDensity(Display *display)
3709 density[MagickPathExtent];
3716 Set density as determined by screen size.
3718 x_density=((((double) DisplayWidth(display,XDefaultScreen(display)))*25.4)/
3719 ((double) DisplayWidthMM(display,XDefaultScreen(display))));
3720 y_density=((((double) DisplayHeight(display,XDefaultScreen(display)))*25.4)/
3721 ((double) DisplayHeightMM(display,XDefaultScreen(display))));
3722 (void) FormatLocaleString(density,MagickPathExtent,"%gx%g",x_density,
3724 return(GetPageGeometry(density));
3728 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3732 + X G e t S u b w i n d o w %
3736 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3738 % XGetSubwindow() returns the subwindow of a window chosen the user with the
3739 % pointer and a button press.
3741 % The format of the XGetSubwindow method is:
3743 % Window XGetSubwindow(Display *display,Window window,int x,int y)
3745 % A description of each parameter follows:
3747 % o subwindow: XGetSubwindow() returns NULL if no subwindow is found
3748 % otherwise the subwindow is returned.
3750 % o display: Specifies a connection to an X server; returned from
3753 % o window: Specifies a pointer to a Window.
3755 % o x: the x coordinate of the pointer relative to the origin of the
3758 % o y: the y coordinate of the pointer relative to the origin of the
3762 static Window XGetSubwindow(Display *display,Window window,int x,int y)
3775 assert(display != (Display *) NULL);
3776 source_window=XRootWindow(display,XDefaultScreen(display));
3777 if (window == (Window) NULL)
3778 return(source_window);
3779 target_window=window;
3782 status=XTranslateCoordinates(display,source_window,window,x,y,
3783 &x_offset,&y_offset,&target_window);
3786 if (target_window == (Window) NULL)
3788 source_window=window;
3789 window=target_window;
3793 if (target_window == (Window) NULL)
3794 target_window=window;
3795 return(target_window);
3799 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3803 % X G e t W i n d o w C o l o r %
3807 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3809 % XGetWindowColor() returns the color of a pixel interactively chosen from the
3812 % The format of the XGetWindowColor method is:
3814 % MagickBooleanType XGetWindowColor(Display *display,XWindows *windows,
3815 % char *name,ExceptionInfo *exception)
3817 % A description of each parameter follows:
3819 % o display: Specifies a connection to an X server; returned from
3822 % o windows: Specifies a pointer to a XWindows structure.
3824 % o name: the name of the color if found in the X Color Database is
3825 % returned in this character string.
3827 % o exception: return any errors or warnings in this structure.
3830 MagickPrivate MagickBooleanType XGetWindowColor(Display *display,
3831 XWindows *windows,char *name,ExceptionInfo *exception)
3862 Choose a pixel from the X server.
3864 assert(display != (Display *) NULL);
3865 assert(name != (char *) NULL);
3866 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",name);
3868 target_window=XSelectWindow(display,&crop_info);
3869 if (target_window == (Window) NULL)
3870 return(MagickFalse);
3871 root_window=XRootWindow(display,XDefaultScreen(display));
3872 client_window=target_window;
3873 if (target_window != root_window)
3881 status=XGetGeometry(display,target_window,&root_window,&x,&x,&d,&d,&d,&d);
3882 if (status != False)
3884 client_window=XClientWindow(display,target_window);
3885 target_window=client_window;
3889 Verify window is viewable.
3891 status=XGetWindowAttributes(display,target_window,&window_attributes);
3892 if ((status == False) || (window_attributes.map_state != IsViewable))
3893 return(MagickFalse);
3897 (void) XTranslateCoordinates(display,root_window,target_window,
3898 (int) crop_info.x,(int) crop_info.y,&x,&y,&child);
3899 ximage=XGetImage(display,target_window,x,y,1,1,AllPlanes,ZPixmap);
3900 if (ximage == (XImage *) NULL)
3901 return(MagickFalse);
3902 color.pixel=XGetPixel(ximage,0,0);
3903 XDestroyImage(ximage);
3905 Match color against the color database.
3907 (void) XQueryColor(display,window_attributes.colormap,&color);
3908 pixel.red=(double) ScaleShortToQuantum(color.red);
3909 pixel.green=(double) ScaleShortToQuantum(color.green);
3910 pixel.blue=(double) ScaleShortToQuantum(color.blue);
3911 pixel.alpha=(MagickRealType) OpaqueAlpha;
3912 (void) QueryColorname(windows->image.image,&pixel,X11Compliance,name,
3918 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3922 + X G e t W i n d o w I m a g e %
3926 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3928 % XGetWindowImage() reads an image from the target X window and returns it.
3929 % XGetWindowImage() optionally descends the window hierarchy and overlays the
3930 % target image with each child image in an optimized fashion. Any child
3931 % window that have the same visual, colormap, and are contained by its parent
3934 % The format of the XGetWindowImage method is:
3936 % Image *XGetWindowImage(Display *display,const Window window,
3937 % const unsigned int borders,const unsigned int level,
3938 % ExceptionInfo *exception)
3940 % A description of each parameter follows:
3942 % o display: Specifies a connection to an X server; returned from
3945 % o window: Specifies the window to obtain the image from.
3947 % o borders: Specifies whether borders pixels are to be saved with
3950 % o level: Specifies an unsigned integer representing the level of
3951 % decent in the window hierarchy. This value must be zero or one on
3952 % the initial call to XGetWindowImage. A value of zero returns after
3953 % one call. A value of one causes the function to descend the window
3954 % hierarchy and overlay the target image with each subwindow image.
3956 % o exception: return any errors or warnings in this structure.
3959 static Image *XGetWindowImage(Display *display,const Window window,
3960 const unsigned int borders,const unsigned int level,ExceptionInfo *exception)
3962 typedef struct _ColormapInfo
3970 struct _ColormapInfo
3974 typedef struct _WindowInfo
4010 *colormap_info = (ColormapInfo *) NULL;
4030 Verify window is viewable.
4032 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
4033 assert(display != (Display *) NULL);
4034 status=XGetWindowAttributes(display,window,&window_attributes);
4035 if ((status == False) || (window_attributes.map_state != IsViewable))
4036 return((Image *) NULL);
4038 Cropping rectangle is relative to root window.
4040 root_window=XRootWindow(display,XDefaultScreen(display));
4041 (void) XTranslateCoordinates(display,window,root_window,0,0,&x_offset,
4043 crop_info.x=(ssize_t) x_offset;
4044 crop_info.y=(ssize_t) y_offset;
4045 crop_info.width=(size_t) window_attributes.width;
4046 crop_info.height=(size_t) window_attributes.height;
4047 if (borders != MagickFalse)
4050 Include border in image.
4052 crop_info.x-=(ssize_t) window_attributes.border_width;
4053 crop_info.y-=(ssize_t) window_attributes.border_width;
4054 crop_info.width+=(size_t) (window_attributes.border_width << 1);
4055 crop_info.height+=(size_t) (window_attributes.border_width << 1);
4058 Crop to root window.
4060 if (crop_info.x < 0)
4062 crop_info.width+=crop_info.x;
4065 if (crop_info.y < 0)
4067 crop_info.height+=crop_info.y;
4070 display_width=XDisplayWidth(display,XDefaultScreen(display));
4071 if ((int) (crop_info.x+crop_info.width) > display_width)
4072 crop_info.width=(size_t) (display_width-crop_info.x);
4073 display_height=XDisplayHeight(display,XDefaultScreen(display));
4074 if ((int) (crop_info.y+crop_info.height) > display_height)
4075 crop_info.height=(size_t) (display_height-crop_info.y);
4077 Initialize window info attributes.
4079 if (number_windows >= max_windows)
4082 Allocate or resize window info buffer.
4085 if (window_info == (WindowInfo *) NULL)
4086 window_info=(WindowInfo *) AcquireQuantumMemory((size_t) max_windows,
4087 sizeof(*window_info));
4089 window_info=(WindowInfo *) ResizeQuantumMemory(window_info,(size_t)
4090 max_windows,sizeof(*window_info));
4092 if (window_info == (WindowInfo *) NULL)
4094 ThrowXWindowException(ResourceLimitError,"MemoryAllocationFailed","...");
4095 return((Image *) NULL);
4097 id=number_windows++;
4098 window_info[id].window=window;
4099 window_info[id].visual=window_attributes.visual;
4100 window_info[id].colormap=window_attributes.colormap;
4101 window_info[id].bounds.x1=(short) crop_info.x;
4102 window_info[id].bounds.y1=(short) crop_info.y;
4103 window_info[id].bounds.x2=(short) (crop_info.x+(int) crop_info.width-1);
4104 window_info[id].bounds.y2=(short) (crop_info.y+(int) crop_info.height-1);
4105 crop_info.x-=x_offset;
4106 crop_info.y-=y_offset;
4107 window_info[id].crop_info=crop_info;
4117 Descend the window hierarchy.
4119 status=XQueryTree(display,window,&root_window,&window_info[id].parent,
4120 &children,&number_children);
4121 for (i=0; i < id; i++)
4122 if ((window_info[i].window == window_info[id].parent) &&
4123 (window_info[i].visual == window_info[id].visual) &&
4124 (window_info[i].colormap == window_info[id].colormap))
4126 if ((window_info[id].bounds.x1 < window_info[i].bounds.x1) ||
4127 (window_info[id].bounds.x2 > window_info[i].bounds.x2) ||
4128 (window_info[id].bounds.y1 < window_info[i].bounds.y1) ||
4129 (window_info[id].bounds.y2 > window_info[i].bounds.y2))
4132 Eliminate windows not circumscribed by their parent.
4138 if ((status == True) && (number_children != 0))
4140 for (i=0; i < (int) number_children; i++)
4141 (void) XGetWindowImage(display,children[i],MagickFalse,level+1,
4143 (void) XFree((void *) children);
4184 Get X image for each window in the list.
4186 image=NewImageList();
4187 for (id=0; id < number_windows; id++)
4190 Does target window intersect top level window?
4192 import=((window_info[id].bounds.x2 >= window_info[0].bounds.x1) &&
4193 (window_info[id].bounds.x1 <= window_info[0].bounds.x2) &&
4194 (window_info[id].bounds.y2 >= window_info[0].bounds.y1) &&
4195 (window_info[id].bounds.y1 <= window_info[0].bounds.y2)) ?
4196 MagickTrue : MagickFalse;
4198 Is target window contained by another window with the same colormap?
4200 for (j=0; j < id; j++)
4201 if ((window_info[id].visual == window_info[j].visual) &&
4202 (window_info[id].colormap == window_info[j].colormap))
4204 if ((window_info[id].bounds.x1 >= window_info[j].bounds.x1) &&
4205 (window_info[id].bounds.x2 <= window_info[j].bounds.x2) &&
4206 (window_info[id].bounds.y1 >= window_info[j].bounds.y1) &&
4207 (window_info[id].bounds.y2 <= window_info[j].bounds.y2))
4210 if (import == MagickFalse)
4215 ximage=XGetImage(display,window_info[id].window,(int)
4216 window_info[id].crop_info.x,(int) window_info[id].crop_info.y,
4217 (unsigned int) window_info[id].crop_info.width,(unsigned int)
4218 window_info[id].crop_info.height,AllPlanes,ZPixmap);
4219 if (ximage == (XImage *) NULL)
4222 Initialize window colormap.
4225 colors=(XColor *) NULL;
4226 if (window_info[id].colormap != (Colormap) NULL)
4232 Search colormap list for window colormap.
4234 number_colors=(unsigned int) window_info[id].visual->map_entries;
4235 for (p=colormap_info; p != (ColormapInfo *) NULL; p=p->next)
4236 if (p->colormap == window_info[id].colormap)
4238 if (p == (ColormapInfo *) NULL)
4241 Get the window colormap.
4243 colors=(XColor *) AcquireQuantumMemory(number_colors,
4245 if (colors == (XColor *) NULL)
4247 XDestroyImage(ximage);
4248 return((Image *) NULL);
4250 if ((window_info[id].visual->klass != DirectColor) &&
4251 (window_info[id].visual->klass != TrueColor))
4252 for (i=0; i < (int) number_colors; i++)
4254 colors[i].pixel=(size_t) i;
4268 DirectColor or TrueColor visual.
4273 red_bit=window_info[id].visual->red_mask &
4274 (~(window_info[id].visual->red_mask)+1);
4275 green_bit=window_info[id].visual->green_mask &
4276 (~(window_info[id].visual->green_mask)+1);
4277 blue_bit=window_info[id].visual->blue_mask &
4278 (~(window_info[id].visual->blue_mask)+1);
4279 for (i=0; i < (int) number_colors; i++)
4281 colors[i].pixel=(unsigned long) (red | green | blue);
4284 if (red > window_info[id].visual->red_mask)
4287 if (green > window_info[id].visual->green_mask)
4290 if (blue > window_info[id].visual->blue_mask)
4294 (void) XQueryColors(display,window_info[id].colormap,colors,
4295 (int) number_colors);
4297 Append colormap to colormap list.
4299 p=(ColormapInfo *) AcquireMagickMemory(sizeof(*p));
4300 if (p == (ColormapInfo *) NULL)
4301 return((Image *) NULL);
4302 p->colormap=window_info[id].colormap;
4304 p->next=colormap_info;
4310 Allocate image structure.
4312 composite_image=AcquireImage((ImageInfo *) NULL,exception);
4313 if (composite_image == (Image *) NULL)
4315 XDestroyImage(ximage);
4316 return((Image *) NULL);
4319 Convert X image to MIFF format.
4321 if ((window_info[id].visual->klass != TrueColor) &&
4322 (window_info[id].visual->klass != DirectColor))
4323 composite_image->storage_class=PseudoClass;
4324 composite_image->columns=(size_t) ximage->width;
4325 composite_image->rows=(size_t) ximage->height;
4326 composite_view=AcquireAuthenticCacheView(composite_image,exception);
4327 switch (composite_image->storage_class)
4345 Determine shift and mask for red, green, and blue.
4347 red_mask=window_info[id].visual->red_mask;
4349 while ((red_mask != 0) && ((red_mask & 0x01) == 0))
4354 green_mask=window_info[id].visual->green_mask;
4356 while ((green_mask != 0) && ((green_mask & 0x01) == 0))
4361 blue_mask=window_info[id].visual->blue_mask;
4363 while ((blue_mask != 0) && ((blue_mask & 0x01) == 0))
4369 Convert X image to DirectClass packets.
4371 if ((number_colors != 0) &&
4372 (window_info[id].visual->klass == DirectColor))
4373 for (y=0; y < (int) composite_image->rows; y++)
4375 q=QueueCacheViewAuthenticPixels(composite_view,0,(ssize_t) y,
4376 composite_image->columns,1,exception);
4377 if (q == (Quantum *) NULL)
4379 for (x=0; x < (int) composite_image->columns; x++)
4381 pixel=XGetPixel(ximage,x,y);
4382 index=(pixel >> red_shift) & red_mask;
4383 SetPixelRed(composite_image,
4384 ScaleShortToQuantum(colors[index].red),q);
4385 index=(pixel >> green_shift) & green_mask;
4386 SetPixelGreen(composite_image,
4387 ScaleShortToQuantum(colors[index].green),q);
4388 index=(pixel >> blue_shift) & blue_mask;
4389 SetPixelBlue(composite_image,
4390 ScaleShortToQuantum(colors[index].blue),q);
4391 q+=GetPixelChannels(composite_image);
4393 status=SyncCacheViewAuthenticPixels(composite_view,exception);
4394 if (status == MagickFalse)
4398 for (y=0; y < (int) composite_image->rows; y++)
4400 q=QueueCacheViewAuthenticPixels(composite_view,0,(ssize_t) y,
4401 composite_image->columns,1,exception);
4402 if (q == (Quantum *) NULL)
4404 for (x=0; x < (int) composite_image->columns; x++)
4406 pixel=XGetPixel(ximage,x,y);
4407 color=(pixel >> red_shift) & red_mask;
4409 color=(65535UL*color)/red_mask;
4410 SetPixelRed(composite_image,ScaleShortToQuantum(
4411 (unsigned short) color),q);
4412 color=(pixel >> green_shift) & green_mask;
4413 if (green_mask != 0)
4414 color=(65535UL*color)/green_mask;
4415 SetPixelGreen(composite_image,ScaleShortToQuantum(
4416 (unsigned short) color),q);
4417 color=(pixel >> blue_shift) & blue_mask;
4419 color=(65535UL*color)/blue_mask;
4420 SetPixelBlue(composite_image,ScaleShortToQuantum(
4421 (unsigned short) color),q);
4422 q+=GetPixelChannels(composite_image);
4424 status=SyncCacheViewAuthenticPixels(composite_view,exception);
4425 if (status == MagickFalse)
4435 status=AcquireImageColormap(composite_image,number_colors,
4437 if (status == MagickFalse)
4439 XDestroyImage(ximage);
4440 composite_image=DestroyImage(composite_image);
4441 return((Image *) NULL);
4443 for (i=0; i < (int) composite_image->colors; i++)
4445 composite_image->colormap[colors[i].pixel].red=(double)
4446 ScaleShortToQuantum(colors[i].red);
4447 composite_image->colormap[colors[i].pixel].green=(double)
4448 ScaleShortToQuantum(colors[i].green);
4449 composite_image->colormap[colors[i].pixel].blue=(double)
4450 ScaleShortToQuantum(colors[i].blue);
4453 Convert X image to PseudoClass packets.
4455 for (y=0; y < (int) composite_image->rows; y++)
4457 q=QueueCacheViewAuthenticPixels(composite_view,0,(ssize_t) y,
4458 composite_image->columns,1,exception);
4459 if (q == (Quantum *) NULL)
4461 for (x=0; x < (int) composite_image->columns; x++)
4463 index=(Quantum) XGetPixel(ximage,x,y);
4464 SetPixelIndex(composite_image,index,q);
4465 SetPixelViaPixelInfo(composite_image,
4466 composite_image->colormap+(ssize_t) index,q);
4467 q+=GetPixelChannels(composite_image);
4469 status=SyncCacheViewAuthenticPixels(composite_view,exception);
4470 if (status == MagickFalse)
4476 composite_view=DestroyCacheView(composite_view);
4477 XDestroyImage(ximage);
4478 if (image == (Image *) NULL)
4480 image=composite_image;
4484 Composite any children in back-to-front order.
4486 (void) XTranslateCoordinates(display,window_info[id].window,window,0,0,
4487 &x_offset,&y_offset,&child);
4488 x_offset-=(int) crop_info.x;
4491 y_offset-=(int) crop_info.y;
4494 (void) CompositeImage(image,composite_image,CopyCompositeOp,MagickTrue,
4495 (ssize_t) x_offset,(ssize_t) y_offset,exception);
4496 composite_image=DestroyImage(composite_image);
4499 Relinquish resources.
4501 while (colormap_info != (ColormapInfo *) NULL)
4503 next=colormap_info->next;
4504 colormap_info->colors=(XColor *) RelinquishMagickMemory(
4505 colormap_info->colors);
4506 colormap_info=(ColormapInfo *) RelinquishMagickMemory(colormap_info);
4510 Relinquish resources and restore initial state.
4512 window_info=(WindowInfo *) RelinquishMagickMemory(window_info);
4515 colormap_info=(ColormapInfo *) NULL;
4518 return((Image *) NULL);
4522 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4526 % X G e t W i n d o w I n f o %
4530 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4532 % XGetWindowInfo() initializes the XWindowInfo structure.
4534 % The format of the XGetWindowInfo method is:
4536 % void XGetWindowInfo(Display *display,XVisualInfo *visual_info,
4537 % XStandardColormap *map_info,XPixelInfo *pixel,XFontStruct *font_info,
4538 % XResourceInfo *resource_info,XWindowInfo *window)
4539 % resource_info,window)
4541 % A description of each parameter follows:
4543 % o display: Specifies a connection to an X server; returned from
4546 % o visual_info: Specifies a pointer to a X11 XVisualInfo structure;
4547 % returned from XGetVisualInfo.
4549 % o map_info: If map_type is specified, this structure is initialized
4550 % with info from the Standard Colormap.
4552 % o pixel: Specifies a pointer to a XPixelInfo structure.
4554 % o font_info: Specifies a pointer to a XFontStruct structure.
4556 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
4559 MagickPrivate void XGetWindowInfo(Display *display,XVisualInfo *visual_info,
4560 XStandardColormap *map_info,XPixelInfo *pixel,XFontStruct *font_info,
4561 XResourceInfo *resource_info,XWindowInfo *window)
4564 Initialize window info.
4566 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
4567 assert(display != (Display *) NULL);
4568 assert(visual_info != (XVisualInfo *) NULL);
4569 assert(map_info != (XStandardColormap *) NULL);
4570 assert(pixel != (XPixelInfo *) NULL);
4571 assert(resource_info != (XResourceInfo *) NULL);
4572 assert(window != (XWindowInfo *) NULL);
4573 if (window->id != (Window) NULL)
4575 if (window->cursor != (Cursor) NULL)
4576 (void) XFreeCursor(display,window->cursor);
4577 if (window->busy_cursor != (Cursor) NULL)
4578 (void) XFreeCursor(display,window->busy_cursor);
4579 if (window->highlight_stipple != (Pixmap) NULL)
4580 (void) XFreePixmap(display,window->highlight_stipple);
4581 if (window->shadow_stipple != (Pixmap) NULL)
4582 (void) XFreePixmap(display,window->shadow_stipple);
4583 if (window->name == (char *) NULL)
4584 window->name=AcquireString("");
4585 if (window->icon_name == (char *) NULL)
4586 window->icon_name=AcquireString("");
4591 Initialize these attributes just once.
4593 window->id=(Window) NULL;
4594 if (window->name == (char *) NULL)
4595 window->name=AcquireString("");
4596 if (window->icon_name == (char *) NULL)
4597 window->icon_name=AcquireString("");
4598 window->x=XDisplayWidth(display,visual_info->screen) >> 1;
4599 window->y=XDisplayWidth(display,visual_info->screen) >> 1;
4600 window->ximage=(XImage *) NULL;
4601 window->matte_image=(XImage *) NULL;
4602 window->pixmap=(Pixmap) NULL;
4603 window->matte_pixmap=(Pixmap) NULL;
4604 window->mapped=MagickFalse;
4605 window->stasis=MagickFalse;
4606 window->shared_memory=MagickTrue;
4607 window->segment_info=(void *) NULL;
4608 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
4613 if (window->segment_info == (void *) NULL)
4614 window->segment_info=AcquireCriticalMemory(2*sizeof(*segment_info));
4615 segment_info=(XShmSegmentInfo *) window->segment_info;
4616 segment_info[0].shmid=(-1);
4617 segment_info[0].shmaddr=(char *) NULL;
4618 segment_info[1].shmid=(-1);
4619 segment_info[1].shmaddr=(char *) NULL;
4624 Initialize these attributes every time function is called.
4626 window->screen=visual_info->screen;
4627 window->root=XRootWindow(display,visual_info->screen);
4628 window->visual=visual_info->visual;
4629 window->storage_class=(unsigned int) visual_info->klass;
4630 window->depth=(unsigned int) visual_info->depth;
4631 window->visual_info=visual_info;
4632 window->map_info=map_info;
4633 window->pixel_info=pixel;
4634 window->font_info=font_info;
4635 window->cursor=XCreateFontCursor(display,XC_left_ptr);
4636 window->busy_cursor=XCreateFontCursor(display,XC_watch);
4637 window->geometry=(char *) NULL;
4638 window->icon_geometry=(char *) NULL;
4639 if (resource_info->icon_geometry != (char *) NULL)
4640 (void) CloneString(&window->icon_geometry,resource_info->icon_geometry);
4641 window->crop_geometry=(char *) NULL;
4642 window->flags=(size_t) PSize;
4645 window->min_width=1;
4646 window->min_height=1;
4647 window->width_inc=1;
4648 window->height_inc=1;
4649 window->border_width=resource_info->border_width;
4650 window->annotate_context=pixel->annotate_context;
4651 window->highlight_context=pixel->highlight_context;
4652 window->widget_context=pixel->widget_context;
4653 window->shadow_stipple=(Pixmap) NULL;
4654 window->highlight_stipple=(Pixmap) NULL;
4655 window->use_pixmap=MagickTrue;
4656 window->immutable=MagickFalse;
4657 window->shape=MagickFalse;
4659 window->mask=(int) (CWBackingStore | CWBackPixel | CWBackPixmap |
4660 CWBitGravity | CWBorderPixel | CWColormap | CWCursor | CWDontPropagate |
4661 CWEventMask | CWOverrideRedirect | CWSaveUnder | CWWinGravity);
4662 window->attributes.background_pixel=pixel->background_color.pixel;
4663 window->attributes.background_pixmap=(Pixmap) NULL;
4664 window->attributes.bit_gravity=ForgetGravity;
4665 window->attributes.backing_store=WhenMapped;
4666 window->attributes.save_under=MagickTrue;
4667 window->attributes.border_pixel=pixel->border_color.pixel;
4668 window->attributes.colormap=map_info->colormap;
4669 window->attributes.cursor=window->cursor;
4670 window->attributes.do_not_propagate_mask=NoEventMask;
4671 window->attributes.event_mask=NoEventMask;
4672 window->attributes.override_redirect=MagickFalse;
4673 window->attributes.win_gravity=NorthWestGravity;
4674 window->orphan=MagickFalse;
4678 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4682 % X H i g h l i g h t E l l i p s e %
4686 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4688 % XHighlightEllipse() puts a border on the X server around a region defined by
4691 % The format of the XHighlightEllipse method is:
4693 % void XHighlightEllipse(Display *display,Window window,
4694 % GC annotate_context,const RectangleInfo *highlight_info)
4696 % A description of each parameter follows:
4698 % o display: Specifies a connection to an X server; returned from
4701 % o window: Specifies a pointer to a Window structure.
4703 % o annotate_context: Specifies a pointer to a GC structure.
4705 % o highlight_info: Specifies a pointer to a RectangleInfo structure. It
4706 % contains the extents of any highlighting rectangle.
4709 MagickPrivate void XHighlightEllipse(Display *display,Window window,
4710 GC annotate_context,const RectangleInfo *highlight_info)
4712 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
4713 assert(display != (Display *) NULL);
4714 assert(window != (Window) NULL);
4715 assert(annotate_context != (GC) NULL);
4716 assert(highlight_info != (RectangleInfo *) NULL);
4717 if ((highlight_info->width < 4) || (highlight_info->height < 4))
4719 (void) XDrawArc(display,window,annotate_context,(int) highlight_info->x,
4720 (int) highlight_info->y,(unsigned int) highlight_info->width-1,
4721 (unsigned int) highlight_info->height-1,0,360*64);
4722 (void) XDrawArc(display,window,annotate_context,(int) highlight_info->x+1,
4723 (int) highlight_info->y+1,(unsigned int) highlight_info->width-3,
4724 (unsigned int) highlight_info->height-3,0,360*64);
4728 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4732 % X H i g h l i g h t L i n e %
4736 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4738 % XHighlightLine() puts a border on the X server around a region defined by
4741 % The format of the XHighlightLine method is:
4743 % void XHighlightLine(Display *display,Window window,GC annotate_context,
4744 % const XSegment *highlight_info)
4746 % A description of each parameter follows:
4748 % o display: Specifies a connection to an X server; returned from
4751 % o window: Specifies a pointer to a Window structure.
4753 % o annotate_context: Specifies a pointer to a GC structure.
4755 % o highlight_info: Specifies a pointer to a RectangleInfo structure. It
4756 % contains the extents of any highlighting rectangle.
4759 MagickPrivate void XHighlightLine(Display *display,Window window,
4760 GC annotate_context,const XSegment *highlight_info)
4762 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
4763 assert(display != (Display *) NULL);
4764 assert(window != (Window) NULL);
4765 assert(annotate_context != (GC) NULL);
4766 assert(highlight_info != (XSegment *) NULL);
4767 (void) XDrawLine(display,window,annotate_context,highlight_info->x1,
4768 highlight_info->y1,highlight_info->x2,highlight_info->y2);
4772 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4776 % X H i g h l i g h t R e c t a n g l e %
4780 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4782 % XHighlightRectangle() puts a border on the X server around a region defined
4783 % by highlight_info.
4785 % The format of the XHighlightRectangle method is:
4787 % void XHighlightRectangle(Display *display,Window window,
4788 % GC annotate_context,const RectangleInfo *highlight_info)
4790 % A description of each parameter follows:
4792 % o display: Specifies a connection to an X server; returned from
4795 % o window: Specifies a pointer to a Window structure.
4797 % o annotate_context: Specifies a pointer to a GC structure.
4799 % o highlight_info: Specifies a pointer to a RectangleInfo structure. It
4800 % contains the extents of any highlighting rectangle.
4803 MagickPrivate void XHighlightRectangle(Display *display,Window window,
4804 GC annotate_context,const RectangleInfo *highlight_info)
4806 assert(display != (Display *) NULL);
4807 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
4808 assert(window != (Window) NULL);
4809 assert(annotate_context != (GC) NULL);
4810 assert(highlight_info != (RectangleInfo *) NULL);
4811 if ((highlight_info->width < 4) || (highlight_info->height < 4))
4813 (void) XDrawRectangle(display,window,annotate_context,(int) highlight_info->x,
4814 (int) highlight_info->y,(unsigned int) highlight_info->width-1,
4815 (unsigned int) highlight_info->height-1);
4816 (void) XDrawRectangle(display,window,annotate_context,(int) highlight_info->x+
4817 1,(int) highlight_info->y+1,(unsigned int) highlight_info->width-3,
4818 (unsigned int) highlight_info->height-3);
4822 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4826 % X I m p o r t I m a g e %
4830 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4832 % XImportImage() reads an image from an X window.
4834 % The format of the XImportImage method is:
4836 % Image *XImportImage(const ImageInfo *image_info,XImportInfo *ximage_info,
4837 % ExceptionInfo *exception)
4839 % A description of each parameter follows:
4841 % o image_info: the image info.
4843 % o ximage_info: Specifies a pointer to an XImportInfo structure.
4845 % o exception: return any errors or warnings in this structure.
4848 MagickExport Image *XImportImage(const ImageInfo *image_info,
4849 XImportInfo *ximage_info,ExceptionInfo *exception)
4882 Open X server connection.
4884 assert(image_info != (const ImageInfo *) NULL);
4885 assert(image_info->signature == MagickCoreSignature);
4886 if (image_info->debug != MagickFalse)
4887 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
4888 image_info->filename);
4889 assert(ximage_info != (XImportInfo *) NULL);
4890 display=XOpenDisplay(image_info->server_name);
4891 if (display == (Display *) NULL)
4893 ThrowXWindowException(XServerError,"UnableToOpenXServer",
4894 XDisplayName(image_info->server_name));
4895 return((Image *) NULL);
4898 Set our forgiving exception handler.
4900 (void) XSetErrorHandler(XError);
4902 Select target window.
4908 root=XRootWindow(display,XDefaultScreen(display));
4909 target=(Window) NULL;
4910 if (*image_info->filename != '\0')
4912 if (LocaleCompare(image_info->filename,"root") == 0)
4917 Select window by ID or name.
4919 if (isdigit((int) ((unsigned char) *image_info->filename)) != 0)
4920 target=XWindowByID(display,root,(Window)
4921 strtol(image_info->filename,(char **) NULL,0));
4922 if (target == (Window) NULL)
4923 target=XWindowByName(display,root,image_info->filename);
4924 if (target == (Window) NULL)
4925 ThrowXWindowException(XServerError,"NoWindowWithSpecifiedIDExists",
4926 image_info->filename);
4930 If target window is not defined, interactively select one.
4932 prior_target=target;
4933 if (target == (Window) NULL)
4934 target=XSelectWindow(display,&crop_info);
4935 if (target == (Window) NULL)
4936 ThrowXWindowException(XServerError,"UnableToReadXWindowImage",
4937 image_info->filename);
4938 client=target; /* obsolete */
4944 status=XGetGeometry(display,target,&root,&x,&x,&d,&d,&d,&d);
4945 if (status != False)
4953 Find window manager frame.
4955 status=XQueryTree(display,target,&root,&parent,&children,&d);
4956 if ((status != False) && (children != (Window *) NULL))
4957 (void) XFree((char *) children);
4958 if ((status == False) || (parent == (Window) NULL) ||
4966 client=XClientWindow(display,target);
4967 if (ximage_info->frame == MagickFalse)
4969 if ((ximage_info->frame == MagickFalse) &&
4970 (prior_target != MagickFalse))
4971 target=prior_target;
4974 if (ximage_info->screen)
4986 Obtain window image directly from screen.
4988 status=XGetWindowAttributes(display,target,&window_attributes);
4989 if (status == False)
4991 ThrowXWindowException(XServerError,"UnableToReadXWindowAttributes",
4992 image_info->filename);
4993 (void) XCloseDisplay(display);
4994 return((Image *) NULL);
4996 (void) XTranslateCoordinates(display,target,root,0,0,&x,&y,&child);
4997 crop_info.x=(ssize_t) x;
4998 crop_info.y=(ssize_t) y;
4999 crop_info.width=(size_t) window_attributes.width;
5000 crop_info.height=(size_t) window_attributes.height;
5001 if (ximage_info->borders != 0)
5004 Include border in image.
5006 crop_info.x-=window_attributes.border_width;
5007 crop_info.y-=window_attributes.border_width;
5008 crop_info.width+=window_attributes.border_width << 1;
5009 crop_info.height+=window_attributes.border_width << 1;
5014 If WM_COLORMAP_WINDOWS property is set or multiple colormaps, descend.
5017 status=XGetWMColormapWindows(display,target,&children,&number_windows);
5018 if ((status == True) && (number_windows > 0))
5020 ximage_info->descend=MagickTrue;
5021 (void) XFree ((char *) children);
5023 colormaps=XListInstalledColormaps(display,target,&number_colormaps);
5024 if (number_colormaps > 0)
5026 if (number_colormaps > 1)
5027 ximage_info->descend=MagickTrue;
5028 (void) XFree((char *) colormaps);
5031 Alert the user not to alter the screen.
5033 if (ximage_info->silent == MagickFalse)
5034 (void) XBell(display,0);
5036 Get image by window id.
5038 (void) XGrabServer(display);
5039 image=XGetWindowImage(display,target,ximage_info->borders,
5040 ximage_info->descend ? 1U : 0U,exception);
5041 (void) XUngrabServer(display);
5042 if (image == (Image *) NULL)
5043 ThrowXWindowException(XServerError,"UnableToReadXWindowImage",
5044 image_info->filename)
5047 (void) CopyMagickString(image->filename,image_info->filename,
5049 if ((crop_info.width != 0) && (crop_info.height != 0))
5056 Crop image as defined by the cropping rectangle.
5058 clone_image=CloneImage(image,0,0,MagickTrue,exception);
5059 if (clone_image != (Image *) NULL)
5061 crop_image=CropImage(clone_image,&crop_info,exception);
5062 if (crop_image != (Image *) NULL)
5064 image=DestroyImage(image);
5069 status=XGetWMName(display,target,&window_name);
5072 if (*image_info->filename == '\0')
5073 (void) CopyMagickString(image->filename,(char *) window_name.value,
5074 (size_t) window_name.nitems+1);
5075 (void) XFree((void *) window_name.value);
5078 if (ximage_info->silent == MagickFalse)
5081 Alert the user we're done.
5083 (void) XBell(display,0);
5084 (void) XBell(display,0);
5086 (void) XCloseDisplay(display);
5091 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5095 % X I n i t i a l i z e W i n d o w s %
5099 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5101 % XInitializeWindows() initializes the XWindows structure.
5103 % The format of the XInitializeWindows method is:
5105 % XWindows *XInitializeWindows(Display *display,
5106 % XResourceInfo *resource_info)
5108 % A description of each parameter follows:
5110 % o windows: XInitializeWindows returns a pointer to a XWindows structure.
5112 % o display: Specifies a connection to an X server; returned from
5115 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
5118 MagickPrivate XWindows *XInitializeWindows(Display *display,
5119 XResourceInfo *resource_info)
5128 Allocate windows structure.
5130 windows=(XWindows *) AcquireMagickMemory(sizeof(*windows));
5131 if (windows == (XWindows *) NULL)
5133 ThrowXWindowFatalException(XServerFatalError,"MemoryAllocationFailed",
5135 return((XWindows *) NULL);
5137 (void) memset(windows,0,sizeof(*windows));
5138 windows->pixel_info=(XPixelInfo *) AcquireMagickMemory(
5139 sizeof(*windows->pixel_info));
5140 windows->icon_pixel=(XPixelInfo *) AcquireMagickMemory(
5141 sizeof(*windows->icon_pixel));
5142 windows->icon_resources=(XResourceInfo *) AcquireMagickMemory(
5143 sizeof(*windows->icon_resources));
5144 if ((windows->pixel_info == (XPixelInfo *) NULL) ||
5145 (windows->icon_pixel == (XPixelInfo *) NULL) ||
5146 (windows->icon_resources == (XResourceInfo *) NULL))
5148 ThrowXWindowFatalException(XServerFatalError,"MemoryAllocationFailed",
5150 return((XWindows *) NULL);
5153 Initialize windows structure.
5155 windows->display=display;
5156 windows->wm_protocols=XInternAtom(display,"WM_PROTOCOLS",MagickFalse);
5157 windows->wm_delete_window=XInternAtom(display,"WM_DELETE_WINDOW",MagickFalse);
5158 windows->wm_take_focus=XInternAtom(display,"WM_TAKE_FOCUS",MagickFalse);
5159 windows->im_protocols=XInternAtom(display,"IM_PROTOCOLS",MagickFalse);
5160 windows->im_remote_command=
5161 XInternAtom(display,"IM_REMOTE_COMMAND",MagickFalse);
5162 windows->im_update_widget=XInternAtom(display,"IM_UPDATE_WIDGET",MagickFalse);
5163 windows->im_update_colormap=
5164 XInternAtom(display,"IM_UPDATE_COLORMAP",MagickFalse);
5165 windows->im_former_image=XInternAtom(display,"IM_FORMER_IMAGE",MagickFalse);
5166 windows->im_next_image=XInternAtom(display,"IM_NEXT_IMAGE",MagickFalse);
5167 windows->im_retain_colors=XInternAtom(display,"IM_RETAIN_COLORS",MagickFalse);
5168 windows->im_exit=XInternAtom(display,"IM_EXIT",MagickFalse);
5169 windows->dnd_protocols=XInternAtom(display,"DndProtocol",MagickFalse);
5170 #if defined(MAGICKCORE_WINDOWS_SUPPORT)
5171 (void) XSynchronize(display,IsWindows95());
5173 if (IsEventLogging())
5175 (void) XSynchronize(display,MagickTrue);
5176 (void) LogMagickEvent(X11Event,GetMagickModule(),"Version: %s",
5177 GetMagickVersion((size_t *) NULL));
5178 (void) LogMagickEvent(X11Event,GetMagickModule(),"Protocols:");
5179 (void) LogMagickEvent(X11Event,GetMagickModule(),
5180 " Window Manager: 0x%lx",windows->wm_protocols);
5181 (void) LogMagickEvent(X11Event,GetMagickModule(),
5182 " delete window: 0x%lx",windows->wm_delete_window);
5183 (void) LogMagickEvent(X11Event,GetMagickModule()," take focus: 0x%lx",
5184 windows->wm_take_focus);
5185 (void) LogMagickEvent(X11Event,GetMagickModule()," ImageMagick: 0x%lx",
5186 windows->im_protocols);
5187 (void) LogMagickEvent(X11Event,GetMagickModule(),
5188 " remote command: 0x%lx",windows->im_remote_command);
5189 (void) LogMagickEvent(X11Event,GetMagickModule(),
5190 " update widget: 0x%lx",windows->im_update_widget);
5191 (void) LogMagickEvent(X11Event,GetMagickModule(),
5192 " update colormap: 0x%lx",windows->im_update_colormap);
5193 (void) LogMagickEvent(X11Event,GetMagickModule(),
5194 " former image: 0x%lx",windows->im_former_image);
5195 (void) LogMagickEvent(X11Event,GetMagickModule()," next image: 0x%lx",
5196 windows->im_next_image);
5197 (void) LogMagickEvent(X11Event,GetMagickModule(),
5198 " retain colors: 0x%lx",windows->im_retain_colors);
5199 (void) LogMagickEvent(X11Event,GetMagickModule()," exit: 0x%lx",
5201 (void) LogMagickEvent(X11Event,GetMagickModule()," Drag and Drop: 0x%lx",
5202 windows->dnd_protocols);
5205 Allocate standard colormap.
5207 windows->map_info=XAllocStandardColormap();
5208 windows->icon_map=XAllocStandardColormap();
5209 if ((windows->map_info == (XStandardColormap *) NULL) ||
5210 (windows->icon_map == (XStandardColormap *) NULL))
5211 ThrowXWindowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed",
5213 windows->map_info->colormap=(Colormap) NULL;
5214 windows->icon_map->colormap=(Colormap) NULL;
5215 windows->pixel_info->pixels=(unsigned long *) NULL;
5216 windows->pixel_info->annotate_context=(GC) NULL;
5217 windows->pixel_info->highlight_context=(GC) NULL;
5218 windows->pixel_info->widget_context=(GC) NULL;
5219 windows->font_info=(XFontStruct *) NULL;
5220 windows->icon_pixel->annotate_context=(GC) NULL;
5221 windows->icon_pixel->pixels=(unsigned long *) NULL;
5225 *windows->icon_resources=(*resource_info);
5226 windows->icon_resources->visual_type=(char *) "default";
5227 windows->icon_resources->colormap=SharedColormap;
5228 windows->visual_info=
5229 XBestVisualInfo(display,windows->map_info,resource_info);
5230 windows->icon_visual=
5231 XBestVisualInfo(display,windows->icon_map,windows->icon_resources);
5232 if ((windows->visual_info == (XVisualInfo *) NULL) ||
5233 (windows->icon_visual == (XVisualInfo *) NULL))
5234 ThrowXWindowFatalException(XServerFatalError,"UnableToGetVisual",
5235 resource_info->visual_type);
5236 if (IsEventLogging())
5238 (void) LogMagickEvent(X11Event,GetMagickModule(),"Visual:");
5239 (void) LogMagickEvent(X11Event,GetMagickModule()," visual id: 0x%lx",
5240 windows->visual_info->visualid);
5241 (void) LogMagickEvent(X11Event,GetMagickModule()," class: %s",
5242 XVisualClassName(windows->visual_info->klass));
5243 (void) LogMagickEvent(X11Event,GetMagickModule()," depth: %d planes",
5244 windows->visual_info->depth);
5245 (void) LogMagickEvent(X11Event,GetMagickModule(),
5246 " size of colormap: %d entries",windows->visual_info->colormap_size);
5247 (void) LogMagickEvent(X11Event,GetMagickModule(),
5248 " red, green, blue masks: 0x%lx 0x%lx 0x%lx",
5249 windows->visual_info->red_mask,windows->visual_info->green_mask,
5250 windows->visual_info->blue_mask);
5251 (void) LogMagickEvent(X11Event,GetMagickModule(),
5252 " significant bits in color: %d bits",
5253 windows->visual_info->bits_per_rgb);
5256 Allocate class and manager hints.
5258 windows->class_hints=XAllocClassHint();
5259 windows->manager_hints=XAllocWMHints();
5260 if ((windows->class_hints == (XClassHint *) NULL) ||
5261 (windows->manager_hints == (XWMHints *) NULL))
5262 ThrowXWindowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed",
5265 Determine group leader if we have one.
5267 root_window=XRootWindow(display,windows->visual_info->screen);
5268 windows->group_leader.id=(Window) NULL;
5269 if (resource_info->window_group != (char *) NULL)
5271 if (isdigit((int) ((unsigned char) *resource_info->window_group)) != 0)
5272 windows->group_leader.id=XWindowByID(display,root_window,(Window)
5273 strtol((char *) resource_info->window_group,(char **) NULL,0));
5274 if (windows->group_leader.id == (Window) NULL)
5275 windows->group_leader.id=
5276 XWindowByName(display,root_window,resource_info->window_group);
5282 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5286 % X M a k e C u r s o r %
5290 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5292 % XMakeCursor() creates a crosshairs X11 cursor.
5294 % The format of the XMakeCursor method is:
5296 % Cursor XMakeCursor(Display *display,Window window,Colormap colormap,
5297 % char *background_color,char *foreground_color)
5299 % A description of each parameter follows:
5301 % o display: Specifies a connection to an X server; returned from
5304 % o window: Specifies the ID of the window for which the cursor is
5307 % o colormap: Specifies the ID of the colormap from which the background
5308 % and foreground color will be retrieved.
5310 % o background_color: Specifies the color to use for the cursor background.
5312 % o foreground_color: Specifies the color to use for the cursor foreground.
5315 MagickPrivate Cursor XMakeCursor(Display *display,Window window,
5316 Colormap colormap,char *background_color,char *foreground_color)
5318 #define scope_height 17
5319 #define scope_x_hot 8
5320 #define scope_y_hot 8
5321 #define scope_width 17
5323 static const unsigned char
5326 0x80, 0x03, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02,
5327 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x7f,
5328 0xfc, 0x01, 0x01, 0x00, 0x01, 0x7f, 0xfc, 0x01, 0x80, 0x02, 0x00,
5329 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02,
5330 0x00, 0x80, 0x02, 0x00, 0x80, 0x03, 0x00
5334 0xc0, 0x07, 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x06, 0x00, 0xc0, 0x06,
5335 0x00, 0xc0, 0x06, 0x00, 0xc0, 0x06, 0x00, 0xff, 0xfe, 0x01, 0x7f,
5336 0xfc, 0x01, 0x03, 0x80, 0x01, 0x7f, 0xfc, 0x01, 0xff, 0xfe, 0x01,
5337 0xc0, 0x06, 0x00, 0xc0, 0x06, 0x00, 0xc0, 0x06, 0x00, 0xc0, 0x06,
5338 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x07, 0x00
5352 assert(display != (Display *) NULL);
5353 assert(window != (Window) NULL);
5354 assert(colormap != (Colormap) NULL);
5355 assert(background_color != (char *) NULL);
5356 assert(foreground_color != (char *) NULL);
5357 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",background_color);
5358 source=XCreateBitmapFromData(display,window,(char *) scope_bits,scope_width,
5360 mask=XCreateBitmapFromData(display,window,(char *) scope_mask_bits,
5361 scope_width,scope_height);
5362 if ((source == (Pixmap) NULL) || (mask == (Pixmap) NULL))
5364 ThrowXWindowException(XServerError,"UnableToCreatePixmap","...");
5365 return((Cursor) NULL);
5367 (void) XParseColor(display,colormap,background_color,&background);
5368 (void) XParseColor(display,colormap,foreground_color,&foreground);
5369 cursor=XCreatePixmapCursor(display,source,mask,&foreground,&background,
5370 scope_x_hot,scope_y_hot);
5371 (void) XFreePixmap(display,source);
5372 (void) XFreePixmap(display,mask);
5377 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5381 % X M a k e I m a g e %
5385 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5387 % XMakeImage() creates an X11 image. If the image size differs from the X11
5388 % image size, the image is first resized.
5390 % The format of the XMakeImage method is:
5392 % MagickBooleanType XMakeImage(Display *display,
5393 % const XResourceInfo *resource_info,XWindowInfo *window,Image *image,
5394 % unsigned int width,unsigned int height,ExceptionInfo *exception)
5396 % A description of each parameter follows:
5398 % o display: Specifies a connection to an X server; returned from
5401 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
5403 % o window: Specifies a pointer to a XWindowInfo structure.
5405 % o image: the image.
5407 % o width: Specifies the width in pixels of the rectangular area to
5410 % o height: Specifies the height in pixels of the rectangular area to
5413 % o exception: return any errors or warnings in this structure.
5416 MagickPrivate MagickBooleanType XMakeImage(Display *display,
5417 const XResourceInfo *resource_info,XWindowInfo *window,Image *image,
5418 unsigned int width,unsigned int height,ExceptionInfo *exception)
5420 #define CheckOverflowException(length,width,height) \
5421 (((height) != 0) && ((length)/((size_t) height) != ((size_t) width)))
5434 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
5435 assert(display != (Display *) NULL);
5436 assert(resource_info != (XResourceInfo *) NULL);
5437 assert(window != (XWindowInfo *) NULL);
5439 assert(height != 0);
5440 if ((window->width == 0) || (window->height == 0))
5441 return(MagickFalse);
5443 Apply user transforms to the image.
5445 (void) XCheckDefineCursor(display,window->id,window->busy_cursor);
5446 (void) XFlush(display);
5447 depth=(int) window->depth;
5448 if (window->destroy)
5449 window->image=DestroyImage(window->image);
5450 window->image=image;
5451 window->destroy=MagickFalse;
5452 if (window->image != (Image *) NULL)
5454 if (window->crop_geometry != (char *) NULL)
5465 window->image->page.x=0;
5466 window->image->page.y=0;
5467 (void) ParsePageGeometry(window->image,window->crop_geometry,
5468 &crop_info,exception);
5469 crop_image=CropImage(window->image,&crop_info,exception);
5470 if (crop_image != (Image *) NULL)
5472 if (window->image != image)
5473 window->image=DestroyImage(window->image);
5474 window->image=crop_image;
5475 window->destroy=MagickTrue;
5478 if ((width != (unsigned int) window->image->columns) ||
5479 (height != (unsigned int) window->image->rows))
5487 resize_image=NewImageList();
5488 if ((window->pixel_info->colors == 0) &&
5489 (window->image->rows > (unsigned long) XDisplayHeight(display,window->screen)) &&
5490 (window->image->columns > (unsigned long) XDisplayWidth(display,window->screen)))
5491 resize_image=ResizeImage(window->image,width,height,
5492 image->filter,exception);
5495 if (window->image->storage_class == PseudoClass)
5496 resize_image=SampleImage(window->image,width,height,
5499 resize_image=ThumbnailImage(window->image,width,height,
5502 if (resize_image != (Image *) NULL)
5504 if (window->image != image)
5505 window->image=DestroyImage(window->image);
5506 window->image=resize_image;
5507 window->destroy=MagickTrue;
5510 width=(unsigned int) window->image->columns;
5511 assert((size_t) width == window->image->columns);
5512 height=(unsigned int) window->image->rows;
5513 assert((size_t) height == window->image->rows);
5518 ximage=(XImage *) NULL;
5519 format=(depth == 1) ? XYBitmap : ZPixmap;
5520 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
5521 if (window->shared_memory != MagickFalse)
5526 segment_info=(XShmSegmentInfo *) window->segment_info;
5527 segment_info[1].shmid=(-1);
5528 segment_info[1].shmaddr=(char *) NULL;
5529 ximage=XShmCreateImage(display,window->visual,(unsigned int) depth,format,
5530 (char *) NULL,&segment_info[1],width,height);
5531 if (ximage == (XImage *) NULL)
5532 window->shared_memory=MagickFalse;
5535 length=(size_t) ximage->bytes_per_line*ximage->height;
5536 if (CheckOverflowException(length,ximage->bytes_per_line,ximage->height))
5537 window->shared_memory=MagickFalse;
5539 if (window->shared_memory != MagickFalse)
5540 segment_info[1].shmid=shmget(IPC_PRIVATE,length,IPC_CREAT | 0777);
5541 if (window->shared_memory != MagickFalse)
5542 segment_info[1].shmaddr=(char *) shmat(segment_info[1].shmid,0,0);
5543 if (segment_info[1].shmid < 0)
5544 window->shared_memory=MagickFalse;
5545 if (window->shared_memory != MagickFalse)
5546 (void) shmctl(segment_info[1].shmid,IPC_RMID,0);
5549 if (ximage != (XImage *) NULL)
5550 XDestroyImage(ximage);
5551 ximage=(XImage *) NULL;
5552 if (segment_info[1].shmaddr)
5554 (void) shmdt(segment_info[1].shmaddr);
5555 segment_info[1].shmaddr=(char *) NULL;
5557 if (segment_info[1].shmid >= 0)
5559 (void) shmctl(segment_info[1].shmid,IPC_RMID,0);
5560 segment_info[1].shmid=(-1);
5566 Allocate X image pixel data.
5568 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
5569 if (window->shared_memory)
5577 (void) XSync(display,MagickFalse);
5578 xerror_alert=MagickFalse;
5579 segment_info=(XShmSegmentInfo *) window->segment_info;
5580 ximage->data=segment_info[1].shmaddr;
5581 segment_info[1].readOnly=MagickFalse;
5582 status=XShmAttach(display,&segment_info[1]);
5583 if (status != False)
5584 (void) XSync(display,MagickFalse);
5585 if ((status == False) || (xerror_alert != MagickFalse))
5587 window->shared_memory=MagickFalse;
5588 if (status != False)
5589 XShmDetach(display,&segment_info[1]);
5591 XDestroyImage(ximage);
5592 ximage=(XImage *) NULL;
5593 if (segment_info[1].shmid >= 0)
5595 if (segment_info[1].shmaddr != NULL)
5596 (void) shmdt(segment_info[1].shmaddr);
5597 (void) shmctl(segment_info[1].shmid,IPC_RMID,0);
5598 segment_info[1].shmid=(-1);
5599 segment_info[1].shmaddr=(char *) NULL;
5604 if (window->shared_memory == MagickFalse)
5605 ximage=XCreateImage(display,window->visual,(unsigned int) depth,format,0,
5606 (char *) NULL,width,height,XBitmapPad(display),0);
5607 if (ximage == (XImage *) NULL)
5610 Unable to create X image.
5612 (void) XCheckDefineCursor(display,window->id,window->cursor);
5613 return(MagickFalse);
5615 length=(size_t) ximage->bytes_per_line*ximage->height;
5616 if (IsEventLogging())
5618 (void) LogMagickEvent(X11Event,GetMagickModule(),"XImage:");
5619 (void) LogMagickEvent(X11Event,GetMagickModule()," width, height: %dx%d",
5620 ximage->width,ximage->height);
5621 (void) LogMagickEvent(X11Event,GetMagickModule()," format: %d",
5623 (void) LogMagickEvent(X11Event,GetMagickModule()," byte order: %d",
5624 ximage->byte_order);
5625 (void) LogMagickEvent(X11Event,GetMagickModule(),
5626 " bitmap unit, bit order, pad: %d %d %d",ximage->bitmap_unit,
5627 ximage->bitmap_bit_order,ximage->bitmap_pad);
5628 (void) LogMagickEvent(X11Event,GetMagickModule()," depth: %d",
5630 (void) LogMagickEvent(X11Event,GetMagickModule()," bytes per line: %d",
5631 ximage->bytes_per_line);
5632 (void) LogMagickEvent(X11Event,GetMagickModule()," bits per pixel: %d",
5633 ximage->bits_per_pixel);
5634 (void) LogMagickEvent(X11Event,GetMagickModule(),
5635 " red, green, blue masks: 0x%lx 0x%lx 0x%lx",ximage->red_mask,
5636 ximage->green_mask,ximage->blue_mask);
5638 if (window->shared_memory == MagickFalse)
5640 if (ximage->format == XYBitmap)
5642 ximage->data=(char *) AcquireQuantumMemory((size_t)
5643 ximage->bytes_per_line,(size_t) ximage->depth*ximage->height);
5644 if (ximage->data != (char *) NULL)
5645 (void) memset(ximage->data,0,(size_t)
5646 ximage->bytes_per_line*ximage->depth*ximage->height);
5650 ximage->data=(char *) AcquireQuantumMemory((size_t)
5651 ximage->bytes_per_line,(size_t) ximage->height);
5652 if (ximage->data != (char *) NULL)
5653 (void) memset(ximage->data,0,(size_t)
5654 ximage->bytes_per_line*ximage->height);
5657 if (ximage->data == (char *) NULL)
5660 Unable to allocate pixel data.
5662 XDestroyImage(ximage);
5663 ximage=(XImage *) NULL;
5664 (void) XCheckDefineCursor(display,window->id,window->cursor);
5665 return(MagickFalse);
5667 if (window->ximage != (XImage *) NULL)
5670 Destroy previous X image.
5672 length=(size_t) window->ximage->bytes_per_line*window->ximage->height;
5673 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
5674 if (window->segment_info != (XShmSegmentInfo *) NULL)
5679 segment_info=(XShmSegmentInfo *) window->segment_info;
5680 if (segment_info[0].shmid >= 0)
5682 (void) XSync(display,MagickFalse);
5683 (void) XShmDetach(display,&segment_info[0]);
5684 (void) XSync(display,MagickFalse);
5685 if (segment_info[0].shmaddr != (char *) NULL)
5686 (void) shmdt(segment_info[0].shmaddr);
5687 (void) shmctl(segment_info[0].shmid,IPC_RMID,0);
5688 segment_info[0].shmid=(-1);
5689 segment_info[0].shmaddr=(char *) NULL;
5690 window->ximage->data=(char *) NULL;
5694 if (window->ximage->data != (char *) NULL)
5695 free(window->ximage->data);
5696 window->ximage->data=(char *) NULL;
5697 XDestroyImage(window->ximage);
5698 window->ximage=(XImage *) NULL;
5700 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
5701 if (window->segment_info != (XShmSegmentInfo *) NULL)
5706 segment_info=(XShmSegmentInfo *) window->segment_info;
5707 segment_info[0]=segment_info[1];
5710 window->ximage=ximage;
5711 matte_image=(XImage *) NULL;
5712 if ((window->shape != MagickFalse) && (window->image != (Image *) NULL))
5713 if ((window->image->alpha_trait != UndefinedPixelTrait) &&
5714 ((int) width <= XDisplayWidth(display,window->screen)) &&
5715 ((int) height <= XDisplayHeight(display,window->screen)))
5720 matte_image=XCreateImage(display,window->visual,1,XYBitmap,0,
5721 (char *) NULL,width,height,XBitmapPad(display),0);
5722 if (IsEventLogging())
5724 (void) LogMagickEvent(X11Event,GetMagickModule(),"Matte Image:");
5725 (void) LogMagickEvent(X11Event,GetMagickModule(),
5726 " width, height: %dx%d",matte_image->width,matte_image->height);
5728 if (matte_image != (XImage *) NULL)
5731 Allocate matte image pixel data.
5733 matte_image->data=(char *) malloc((size_t)
5734 matte_image->bytes_per_line*matte_image->depth*
5735 matte_image->height);
5736 if (matte_image->data == (char *) NULL)
5738 XDestroyImage(matte_image);
5739 matte_image=(XImage *) NULL;
5743 if (window->matte_image != (XImage *) NULL)
5748 if (window->matte_image->data != (char *) NULL)
5749 free(window->matte_image->data);
5750 window->matte_image->data=(char *) NULL;
5751 XDestroyImage(window->matte_image);
5752 window->matte_image=(XImage *) NULL;
5754 window->matte_image=matte_image;
5755 if (window->matte_pixmap != (Pixmap) NULL)
5757 (void) XFreePixmap(display,window->matte_pixmap);
5758 window->matte_pixmap=(Pixmap) NULL;
5759 #if defined(MAGICKCORE_HAVE_SHAPE)
5760 if (window->shape != MagickFalse)
5761 XShapeCombineMask(display,window->id,ShapeBounding,0,0,None,ShapeSet);
5764 window->stasis=MagickFalse;
5766 Convert pixels to X image data.
5768 if (window->image != (Image *) NULL)
5770 if ((ximage->byte_order == LSBFirst) || ((ximage->format == XYBitmap) &&
5771 (ximage->bitmap_bit_order == LSBFirst)))
5772 XMakeImageLSBFirst(resource_info,window,window->image,ximage,
5773 matte_image,exception);
5775 XMakeImageMSBFirst(resource_info,window,window->image,ximage,
5776 matte_image,exception);
5778 if (window->matte_image != (XImage *) NULL)
5781 Create matte pixmap.
5783 window->matte_pixmap=XCreatePixmap(display,window->id,width,height,1);
5784 if (window->matte_pixmap != (Pixmap) NULL)
5793 Copy matte image to matte pixmap.
5795 context_values.background=0;
5796 context_values.foreground=1;
5797 graphics_context=XCreateGC(display,window->matte_pixmap,
5798 (size_t) (GCBackground | GCForeground),&context_values);
5799 (void) XPutImage(display,window->matte_pixmap,graphics_context,
5800 window->matte_image,0,0,0,0,width,height);
5801 (void) XFreeGC(display,graphics_context);
5802 #if defined(MAGICKCORE_HAVE_SHAPE)
5803 if (window->shape != MagickFalse)
5804 XShapeCombineMask(display,window->id,ShapeBounding,0,0,
5805 window->matte_pixmap,ShapeSet);
5809 (void) XMakePixmap(display,resource_info,window);
5813 (void) XCheckDefineCursor(display,window->id,window->cursor);
5818 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5822 + X M a k e I m a g e L S B F i r s t %
5826 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5828 % XMakeImageLSBFirst() initializes the pixel data of an X11 Image. The X image
5829 % pixels are copied in least-significant bit and byte first order. The
5830 % server's scanline pad is respected. Rather than using one or two general
5831 % cases, many special cases are found here to help speed up the image
5834 % The format of the XMakeImageLSBFirst method is:
5836 % void XMakeImageLSBFirst(Display *display,XWindows *windows,
5837 % ExceptionInfo *exception)
5839 % A description of each parameter follows:
5841 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
5843 % o window: Specifies a pointer to a XWindowInfo structure.
5845 % o image: the image.
5847 % o ximage: Specifies a pointer to a XImage structure; returned from
5850 % o matte_image: Specifies a pointer to a XImage structure; returned from
5853 % o exception: return any errors or warnings in this structure.
5856 static void XMakeImageLSBFirst(const XResourceInfo *resource_info,
5857 const XWindowInfo *window,Image *image,XImage *ximage,XImage *matte_image,
5858 ExceptionInfo *exception)
5869 register const Quantum
5875 register unsigned char
5892 assert(resource_info != (XResourceInfo *) NULL);
5893 assert(window != (XWindowInfo *) NULL);
5894 assert(image != (Image *) NULL);
5895 if (image->debug != MagickFalse)
5896 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
5898 if ((window->immutable == MagickFalse) &&
5899 (image->storage_class == DirectClass) && (image->alpha_trait != UndefinedPixelTrait))
5902 size[MagickPathExtent];
5910 image_info=AcquireImageInfo();
5911 (void) CopyMagickString(image_info->filename,
5912 resource_info->image_info->texture != (char *) NULL ?
5913 resource_info->image_info->texture : "pattern:checkerboard",
5915 (void) FormatLocaleString(size,MagickPathExtent,"%.20gx%.20g",(double)
5916 image->columns,(double) image->rows);
5917 image_info->size=ConstantString(size);
5918 pattern=ReadImage(image_info,exception);
5919 image_info=DestroyImageInfo(image_info);
5920 if (pattern != (Image *) NULL)
5922 canvas=CloneImage(image,0,0,MagickTrue,exception);
5923 if (canvas != (Image *) NULL)
5924 (void) CompositeImage(canvas,pattern,DstOverCompositeOp,MagickTrue,
5926 pattern=DestroyImage(pattern);
5929 scanline_pad=(unsigned int) (ximage->bytes_per_line-((ximage->width*
5930 ximage->bits_per_pixel) >> 3));
5931 map_info=window->map_info;
5932 pixels=window->pixel_info->pixels;
5933 q=(unsigned char *) ximage->data;
5935 canvas_view=AcquireVirtualCacheView(canvas,exception);
5936 if (ximage->format == XYBitmap)
5938 register unsigned short
5946 Convert canvas to big-endian bitmap.
5948 background=(unsigned char)
5949 (XPixelIntensity(&window->pixel_info->foreground_color) <
5950 XPixelIntensity(&window->pixel_info->background_color) ? 0x80 : 0x00);
5951 foreground=(unsigned char)
5952 (XPixelIntensity(&window->pixel_info->background_color) <
5953 XPixelIntensity(&window->pixel_info->foreground_color) ? 0x80 : 0x00);
5954 polarity=(unsigned short) ((GetPixelInfoIntensity(image,
5955 &canvas->colormap[0])) < (QuantumRange/2.0) ? 1 : 0);
5956 if (canvas->colors == 2)
5957 polarity=GetPixelInfoIntensity(image,&canvas->colormap[0]) <
5958 GetPixelInfoIntensity(image,&canvas->colormap[1]);
5959 for (y=0; y < (int) canvas->rows; y++)
5961 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,canvas->columns,1,
5963 if (p == (const Quantum *) NULL)
5967 for (x=0; x < (int) canvas->columns; x++)
5970 if (GetPixelIndex(canvas,p) == (Quantum) polarity)
5981 p+=GetPixelChannels(canvas);
5989 if (window->pixel_info->colors != 0)
5990 switch (ximage->bits_per_pixel)
5994 register unsigned int
5998 Convert to 2 bit color-mapped X canvas.
6000 for (y=0; y < (int) canvas->rows; y++)
6002 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6003 canvas->columns,1,exception);
6004 if (p == (const Quantum *) NULL)
6007 for (x=0; x < (int) canvas->columns; x++)
6009 pixel=pixels[(ssize_t) GetPixelIndex(canvas,p)] & 0x0f;
6014 *q=(unsigned char) pixel;
6020 *q|=(unsigned char) (pixel << 2);
6026 *q|=(unsigned char) (pixel << 4);
6032 *q|=(unsigned char) (pixel << 6);
6038 p+=GetPixelChannels(canvas);
6046 register unsigned int
6050 Convert to 4 bit color-mapped X canvas.
6052 for (y=0; y < (int) canvas->rows; y++)
6054 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6055 canvas->columns,1,exception);
6056 if (p == (const Quantum *) NULL)
6059 for (x=0; x < (int) canvas->columns; x++)
6061 pixel=pixels[(ssize_t) GetPixelIndex(canvas,p)] & 0xf;
6066 *q=(unsigned char) pixel;
6072 *q|=(unsigned char) (pixel << 4);
6078 p+=GetPixelChannels(canvas);
6088 Convert to 8 bit color-mapped X canvas.
6090 if (resource_info->color_recovery &&
6091 resource_info->quantize_info->dither_method != NoDitherMethod)
6093 XDitherImage(canvas,ximage,exception);
6096 for (y=0; y < (int) canvas->rows; y++)
6098 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6099 canvas->columns,1,exception);
6100 if (p == (const Quantum *) NULL)
6102 for (x=0; x < (int) canvas->columns; x++)
6104 pixel=pixels[(ssize_t) GetPixelIndex(canvas,p)];
6105 *q++=(unsigned char) pixel;
6106 p+=GetPixelChannels(canvas);
6117 register unsigned int
6121 Convert to multi-byte color-mapped X canvas.
6123 bytes_per_pixel=(unsigned int) (ximage->bits_per_pixel >> 3);
6124 for (y=0; y < (int) canvas->rows; y++)
6126 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6127 canvas->columns,1,exception);
6128 if (p == (const Quantum *) NULL)
6130 for (x=0; x < (int) canvas->columns; x++)
6132 pixel=pixels[(ssize_t) GetPixelIndex(canvas,p)];
6133 for (k=0; k < (int) bytes_per_pixel; k++)
6135 *q++=(unsigned char) (pixel & 0xff);
6138 p+=GetPixelChannels(canvas);
6146 switch (ximage->bits_per_pixel)
6150 register unsigned int
6154 Convert to contiguous 2 bit continuous-tone X canvas.
6156 for (y=0; y < (int) canvas->rows; y++)
6159 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6160 canvas->columns,1,exception);
6161 if (p == (const Quantum *) NULL)
6163 for (x=0; x < (int) canvas->columns; x++)
6165 pixel=XGammaPixel(canvas,map_info,p);
6171 *q=(unsigned char) pixel;
6177 *q|=(unsigned char) (pixel << 2);
6183 *q|=(unsigned char) (pixel << 4);
6189 *q|=(unsigned char) (pixel << 6);
6195 p+=GetPixelChannels(canvas);
6203 register unsigned int
6207 Convert to contiguous 4 bit continuous-tone X canvas.
6209 for (y=0; y < (int) canvas->rows; y++)
6211 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6212 canvas->columns,1,exception);
6213 if (p == (const Quantum *) NULL)
6216 for (x=0; x < (int) canvas->columns; x++)
6218 pixel=XGammaPixel(canvas,map_info,p);
6224 *q=(unsigned char) pixel;
6230 *q|=(unsigned char) (pixel << 4);
6236 p+=GetPixelChannels(canvas);
6246 Convert to contiguous 8 bit continuous-tone X canvas.
6248 if (resource_info->color_recovery &&
6249 resource_info->quantize_info->dither_method != NoDitherMethod)
6251 XDitherImage(canvas,ximage,exception);
6254 for (y=0; y < (int) canvas->rows; y++)
6256 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6257 canvas->columns,1,exception);
6258 if (p == (const Quantum *) NULL)
6260 for (x=0; x < (int) canvas->columns; x++)
6262 pixel=XGammaPixel(canvas,map_info,p);
6263 *q++=(unsigned char) pixel;
6264 p+=GetPixelChannels(canvas);
6272 if ((ximage->bits_per_pixel == 32) && (map_info->red_max == 255) &&
6273 (map_info->green_max == 255) && (map_info->blue_max == 255) &&
6274 (map_info->red_mult == 65536L) && (map_info->green_mult == 256) &&
6275 (map_info->blue_mult == 1))
6278 Convert to 32 bit continuous-tone X canvas.
6280 for (y=0; y < (int) canvas->rows; y++)
6282 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6283 canvas->columns,1,exception);
6284 if (p == (const Quantum *) NULL)
6286 if ((red_gamma != 1.0) || (green_gamma != 1.0) ||
6287 (blue_gamma != 1.0))
6290 Gamma correct canvas.
6292 for (x=(int) canvas->columns-1; x >= 0; x--)
6294 *q++=ScaleQuantumToChar(XBlueGamma(
6295 GetPixelBlue(canvas,p)));
6296 *q++=ScaleQuantumToChar(XGreenGamma(
6297 GetPixelGreen(canvas,p)));
6298 *q++=ScaleQuantumToChar(XRedGamma(
6299 GetPixelRed(canvas,p)));
6301 p+=GetPixelChannels(canvas);
6305 for (x=(int) canvas->columns-1; x >= 0; x--)
6307 *q++=ScaleQuantumToChar((Quantum) GetPixelBlue(canvas,p));
6308 *q++=ScaleQuantumToChar((Quantum) GetPixelGreen(canvas,p));
6309 *q++=ScaleQuantumToChar((Quantum) GetPixelRed(canvas,p));
6311 p+=GetPixelChannels(canvas);
6316 if ((ximage->bits_per_pixel == 32) && (map_info->red_max == 255) &&
6317 (map_info->green_max == 255) && (map_info->blue_max == 255) &&
6318 (map_info->red_mult == 1) && (map_info->green_mult == 256) &&
6319 (map_info->blue_mult == 65536L))
6322 Convert to 32 bit continuous-tone X canvas.
6324 for (y=0; y < (int) canvas->rows; y++)
6326 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6327 canvas->columns,1,exception);
6328 if (p == (const Quantum *) NULL)
6330 if ((red_gamma != 1.0) || (green_gamma != 1.0) ||
6331 (blue_gamma != 1.0))
6334 Gamma correct canvas.
6336 for (x=(int) canvas->columns-1; x >= 0; x--)
6338 *q++=ScaleQuantumToChar(XRedGamma(
6339 GetPixelRed(canvas,p)));
6340 *q++=ScaleQuantumToChar(XGreenGamma(
6341 GetPixelGreen(canvas,p)));
6342 *q++=ScaleQuantumToChar(XBlueGamma(
6343 GetPixelBlue(canvas,p)));
6345 p+=GetPixelChannels(canvas);
6349 for (x=(int) canvas->columns-1; x >= 0; x--)
6351 *q++=ScaleQuantumToChar((Quantum) GetPixelRed(canvas,p));
6352 *q++=ScaleQuantumToChar((Quantum) GetPixelGreen(canvas,p));
6353 *q++=ScaleQuantumToChar((Quantum) GetPixelBlue(canvas,p));
6355 p+=GetPixelChannels(canvas);
6364 register unsigned int
6368 Convert to multi-byte continuous-tone X canvas.
6370 bytes_per_pixel=(unsigned int) (ximage->bits_per_pixel >> 3);
6371 for (y=0; y < (int) canvas->rows; y++)
6373 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6374 canvas->columns,1,exception);
6375 if (p == (const Quantum *) NULL)
6377 for (x=0; x < (int) canvas->columns; x++)
6379 pixel=XGammaPixel(canvas,map_info,p);
6380 for (k=0; k < (int) bytes_per_pixel; k++)
6382 *q++=(unsigned char) (pixel & 0xff);
6385 p+=GetPixelChannels(canvas);
6393 if (matte_image != (XImage *) NULL)
6396 Initialize matte canvas.
6398 scanline_pad=(unsigned int) (matte_image->bytes_per_line-
6399 ((matte_image->width*matte_image->bits_per_pixel) >> 3));
6400 q=(unsigned char *) matte_image->data;
6401 for (y=0; y < (int) canvas->rows; y++)
6403 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,canvas->columns,1,
6405 if (p == (const Quantum *) NULL)
6409 for (x=(int) canvas->columns-1; x >= 0; x--)
6412 if (GetPixelAlpha(canvas,p) > (QuantumRange/2))
6421 p+=GetPixelChannels(canvas);
6428 canvas_view=DestroyCacheView(canvas_view);
6429 if (canvas != image)
6430 canvas=DestroyImage(canvas);
6434 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6438 + X M a k e I m a g e M S B F i r s t %
6442 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6444 % XMakeImageMSBFirst() initializes the pixel data of an X11 Image. The X
6445 % image pixels are copied in most-significant bit and byte first order. The
6446 % server's scanline pad is also respected. Rather than using one or two
6447 % general cases, many special cases are found here to help speed up the image
6450 % The format of the XMakeImageMSBFirst method is:
6452 % XMakeImageMSBFirst(resource_info,window,image,ximage,matte_image,
6453 % ExceptionInfo *exception)
6455 % A description of each parameter follows:
6457 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
6459 % o window: Specifies a pointer to a XWindowInfo structure.
6461 % o image: the image.
6463 % o ximage: Specifies a pointer to a XImage structure; returned from
6466 % o matte_image: Specifies a pointer to a XImage structure; returned from
6469 % o exception: return any errors or warnings in this structure.
6472 static void XMakeImageMSBFirst(const XResourceInfo *resource_info,
6473 const XWindowInfo *window,Image *image,XImage *ximage,XImage *matte_image,
6474 ExceptionInfo *exception)
6488 register const Quantum
6491 register unsigned char
6508 assert(resource_info != (XResourceInfo *) NULL);
6509 assert(window != (XWindowInfo *) NULL);
6510 assert(image != (Image *) NULL);
6511 if (image->debug != MagickFalse)
6512 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
6514 if ((window->immutable != MagickFalse) &&
6515 (image->storage_class == DirectClass) &&
6516 (image->alpha_trait != UndefinedPixelTrait))
6519 size[MagickPathExtent];
6527 image_info=AcquireImageInfo();
6528 (void) CopyMagickString(image_info->filename,
6529 resource_info->image_info->texture != (char *) NULL ?
6530 resource_info->image_info->texture : "pattern:checkerboard",
6532 (void) FormatLocaleString(size,MagickPathExtent,"%.20gx%.20g",(double)
6533 image->columns,(double) image->rows);
6534 image_info->size=ConstantString(size);
6535 pattern=ReadImage(image_info,exception);
6536 image_info=DestroyImageInfo(image_info);
6537 if (pattern != (Image *) NULL)
6539 canvas=CloneImage(image,0,0,MagickTrue,exception);
6540 if (canvas != (Image *) NULL)
6541 (void) CompositeImage(canvas,pattern,DstOverCompositeOp,MagickFalse,
6543 pattern=DestroyImage(pattern);
6546 scanline_pad=(unsigned int) (ximage->bytes_per_line-((ximage->width*
6547 ximage->bits_per_pixel) >> 3));
6548 map_info=window->map_info;
6549 pixels=window->pixel_info->pixels;
6550 q=(unsigned char *) ximage->data;
6552 canvas_view=AcquireVirtualCacheView(canvas,exception);
6553 if (ximage->format == XYBitmap)
6555 register unsigned short
6563 Convert canvas to big-endian bitmap.
6565 background=(unsigned char)
6566 (XPixelIntensity(&window->pixel_info->foreground_color) <
6567 XPixelIntensity(&window->pixel_info->background_color) ? 0x01 : 0x00);
6568 foreground=(unsigned char)
6569 (XPixelIntensity(&window->pixel_info->background_color) <
6570 XPixelIntensity(&window->pixel_info->foreground_color) ? 0x01 : 0x00);
6571 polarity=(unsigned short) ((GetPixelInfoIntensity(image,
6572 &canvas->colormap[0])) < (QuantumRange/2.0) ? 1 : 0);
6573 if (canvas->colors == 2)
6574 polarity=GetPixelInfoIntensity(image,&canvas->colormap[0]) <
6575 GetPixelInfoIntensity(image,&canvas->colormap[1]);
6576 for (y=0; y < (int) canvas->rows; y++)
6578 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,canvas->columns,1,
6580 if (p == (const Quantum *) NULL)
6584 for (x=(int) canvas->columns-1; x >= 0; x--)
6587 if (GetPixelIndex(canvas,p) == (Quantum) polarity)
6598 p+=GetPixelChannels(canvas);
6606 if (window->pixel_info->colors != 0)
6607 switch (ximage->bits_per_pixel)
6611 register unsigned int
6615 Convert to 2 bit color-mapped X canvas.
6617 for (y=0; y < (int) canvas->rows; y++)
6619 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6620 canvas->columns,1,exception);
6621 if (p == (const Quantum *) NULL)
6624 for (x=0; x < (int) canvas->columns; x++)
6626 pixel=pixels[(ssize_t)
6627 GetPixelIndex(canvas,p)] & 0xf;
6632 *q=(unsigned char) (pixel << 6);
6638 *q|=(unsigned char) (pixel << 4);
6644 *q|=(unsigned char) (pixel << 2);
6650 *q|=(unsigned char) pixel;
6656 p+=GetPixelChannels(canvas);
6664 register unsigned int
6668 Convert to 4 bit color-mapped X canvas.
6670 for (y=0; y < (int) canvas->rows; y++)
6672 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6673 canvas->columns,1,exception);
6674 if (p == (const Quantum *) NULL)
6677 for (x=0; x < (int) canvas->columns; x++)
6679 pixel=pixels[(ssize_t)
6680 GetPixelIndex(canvas,p)] & 0xf;
6685 *q=(unsigned char) (pixel << 4);
6691 *q|=(unsigned char) pixel;
6697 p+=GetPixelChannels(canvas);
6707 Convert to 8 bit color-mapped X canvas.
6709 if (resource_info->color_recovery &&
6710 resource_info->quantize_info->dither_method != NoDitherMethod)
6712 XDitherImage(canvas,ximage,exception);
6715 for (y=0; y < (int) canvas->rows; y++)
6717 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6718 canvas->columns,1,exception);
6719 if (p == (const Quantum *) NULL)
6721 for (x=0; x < (int) canvas->columns; x++)
6723 pixel=pixels[(ssize_t) GetPixelIndex(canvas,p)];
6724 *q++=(unsigned char) pixel;
6725 p+=GetPixelChannels(canvas);
6736 register unsigned int
6740 channel[sizeof(size_t)];
6743 Convert to 8 bit color-mapped X canvas.
6745 bytes_per_pixel=(unsigned int) (ximage->bits_per_pixel >> 3);
6746 for (y=0; y < (int) canvas->rows; y++)
6748 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6749 canvas->columns,1,exception);
6750 if (p == (const Quantum *) NULL)
6752 for (x=0; x < (int) canvas->columns; x++)
6754 pixel=pixels[(ssize_t)
6755 GetPixelIndex(canvas,p)];
6756 for (k=(int) bytes_per_pixel-1; k >= 0; k--)
6758 channel[k]=(unsigned char) pixel;
6761 for (k=0; k < (int) bytes_per_pixel; k++)
6763 p+=GetPixelChannels(canvas);
6771 switch (ximage->bits_per_pixel)
6775 register unsigned int
6779 Convert to 4 bit continuous-tone X canvas.
6781 for (y=0; y < (int) canvas->rows; y++)
6783 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6784 canvas->columns,1,exception);
6785 if (p == (const Quantum *) NULL)
6788 for (x=(int) canvas->columns-1; x >= 0; x--)
6790 pixel=XGammaPixel(canvas,map_info,p);
6796 *q=(unsigned char) (pixel << 6);
6802 *q|=(unsigned char) (pixel << 4);
6808 *q|=(unsigned char) (pixel << 2);
6814 *q|=(unsigned char) pixel;
6820 p+=GetPixelChannels(canvas);
6828 register unsigned int
6832 Convert to 4 bit continuous-tone X canvas.
6834 for (y=0; y < (int) canvas->rows; y++)
6836 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6837 canvas->columns,1,exception);
6838 if (p == (const Quantum *) NULL)
6841 for (x=(int) canvas->columns-1; x >= 0; x--)
6843 pixel=XGammaPixel(canvas,map_info,p);
6849 *q=(unsigned char) (pixel << 4);
6855 *q|=(unsigned char) pixel;
6861 p+=GetPixelChannels(canvas);
6871 Convert to 8 bit continuous-tone X canvas.
6873 if (resource_info->color_recovery &&
6874 resource_info->quantize_info->dither_method != NoDitherMethod)
6876 XDitherImage(canvas,ximage,exception);
6879 for (y=0; y < (int) canvas->rows; y++)
6881 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6882 canvas->columns,1,exception);
6883 if (p == (const Quantum *) NULL)
6885 for (x=(int) canvas->columns-1; x >= 0; x--)
6887 pixel=XGammaPixel(canvas,map_info,p);
6888 *q++=(unsigned char) pixel;
6889 p+=GetPixelChannels(canvas);
6897 if ((ximage->bits_per_pixel == 32) && (map_info->red_max == 255) &&
6898 (map_info->green_max == 255) && (map_info->blue_max == 255) &&
6899 (map_info->red_mult == 65536L) && (map_info->green_mult == 256) &&
6900 (map_info->blue_mult == 1))
6903 Convert to 32 bit continuous-tone X canvas.
6905 for (y=0; y < (int) canvas->rows; y++)
6907 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6908 canvas->columns,1,exception);
6909 if (p == (const Quantum *) NULL)
6911 if ((red_gamma != 1.0) || (green_gamma != 1.0) ||
6912 (blue_gamma != 1.0))
6915 Gamma correct canvas.
6917 for (x=(int) canvas->columns-1; x >= 0; x--)
6920 *q++=ScaleQuantumToChar(XRedGamma(
6921 GetPixelRed(canvas,p)));
6922 *q++=ScaleQuantumToChar(XGreenGamma(
6923 GetPixelGreen(canvas,p)));
6924 *q++=ScaleQuantumToChar(XBlueGamma(
6925 GetPixelBlue(canvas,p)));
6926 p+=GetPixelChannels(canvas);
6930 for (x=(int) canvas->columns-1; x >= 0; x--)
6933 *q++=ScaleQuantumToChar((Quantum) GetPixelRed(canvas,p));
6934 *q++=ScaleQuantumToChar((Quantum) GetPixelGreen(canvas,p));
6935 *q++=ScaleQuantumToChar((Quantum) GetPixelBlue(canvas,p));
6936 p+=GetPixelChannels(canvas);
6941 if ((ximage->bits_per_pixel == 32) && (map_info->red_max == 255) &&
6942 (map_info->green_max == 255) && (map_info->blue_max == 255) &&
6943 (map_info->red_mult == 1) && (map_info->green_mult == 256) &&
6944 (map_info->blue_mult == 65536L))
6947 Convert to 32 bit continuous-tone X canvas.
6949 for (y=0; y < (int) canvas->rows; y++)
6951 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6952 canvas->columns,1,exception);
6953 if (p == (const Quantum *) NULL)
6955 if ((red_gamma != 1.0) || (green_gamma != 1.0) ||
6956 (blue_gamma != 1.0))
6959 Gamma correct canvas.
6961 for (x=(int) canvas->columns-1; x >= 0; x--)
6964 *q++=ScaleQuantumToChar(XBlueGamma(
6965 GetPixelBlue(canvas,p)));
6966 *q++=ScaleQuantumToChar(XGreenGamma(
6967 GetPixelGreen(canvas,p)));
6968 *q++=ScaleQuantumToChar(XRedGamma(
6969 GetPixelRed(canvas,p)));
6970 p+=GetPixelChannels(canvas);
6974 for (x=(int) canvas->columns-1; x >= 0; x--)
6977 *q++=ScaleQuantumToChar((Quantum) GetPixelBlue(canvas,p));
6978 *q++=ScaleQuantumToChar((Quantum) GetPixelGreen(canvas,p));
6979 *q++=ScaleQuantumToChar((Quantum) GetPixelRed(canvas,p));
6980 p+=GetPixelChannels(canvas);
6989 register unsigned int
6993 channel[sizeof(size_t)];
6996 Convert to multi-byte continuous-tone X canvas.
6998 bytes_per_pixel=(unsigned int) (ximage->bits_per_pixel >> 3);
6999 for (y=0; y < (int) canvas->rows; y++)
7001 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
7002 canvas->columns,1,exception);
7003 if (p == (const Quantum *) NULL)
7005 for (x=(int) canvas->columns-1; x >= 0; x--)
7007 pixel=XGammaPixel(canvas,map_info,p);
7008 for (k=(int) bytes_per_pixel-1; k >= 0; k--)
7010 channel[k]=(unsigned char) pixel;
7013 for (k=0; k < (int) bytes_per_pixel; k++)
7015 p+=GetPixelChannels(canvas);
7023 if (matte_image != (XImage *) NULL)
7026 Initialize matte canvas.
7028 scanline_pad=(unsigned int) (matte_image->bytes_per_line-
7029 ((matte_image->width*matte_image->bits_per_pixel) >> 3));
7030 q=(unsigned char *) matte_image->data;
7031 for (y=0; y < (int) canvas->rows; y++)
7033 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,canvas->columns,1,
7035 if (p == (const Quantum *) NULL)
7039 for (x=(int) canvas->columns-1; x >= 0; x--)
7042 if (GetPixelAlpha(canvas,p) > (QuantumRange/2))
7051 p+=GetPixelChannels(canvas);
7058 canvas_view=DestroyCacheView(canvas_view);
7059 if (canvas != image)
7060 canvas=DestroyImage(canvas);
7064 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7068 % X M a k e M a g n i f y I m a g e %
7072 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7074 % XMakeMagnifyImage() magnifies a region of an X image and displays it.
7076 % The format of the XMakeMagnifyImage method is:
7078 % void XMakeMagnifyImage(Display *display,XWindows *windows,
7079 % ExceptionInfo *exception)
7081 % A description of each parameter follows:
7083 % o display: Specifies a connection to an X server; returned from
7086 % o windows: Specifies a pointer to a XWindows structure.
7088 % o exception: return any errors or warnings in this structure.
7091 MagickPrivate void XMakeMagnifyImage(Display *display,XWindows *windows,
7092 ExceptionInfo *exception)
7095 tuple[MagickPathExtent];
7109 register unsigned char
7117 previous_magnify = 0;
7135 Check boundary conditions.
7137 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
7138 assert(display != (Display *) NULL);
7139 assert(windows != (XWindows *) NULL);
7141 for (n=1; n < (ssize_t) windows->magnify.data; n++)
7143 while ((magnify*windows->image.ximage->width) < windows->magnify.width)
7145 while ((magnify*windows->image.ximage->height) < windows->magnify.height)
7147 while (magnify > windows->magnify.width)
7149 while (magnify > windows->magnify.height)
7153 if (magnify != previous_magnify)
7162 New magnify factor: update magnify window name.
7165 while ((1 << i) <= (int) magnify)
7167 (void) FormatLocaleString(windows->magnify.name,MagickPathExtent,
7168 "Magnify %.20gX",(double) i);
7169 status=XStringListToTextProperty(&windows->magnify.name,1,&window_name);
7170 if (status != False)
7172 XSetWMName(display,windows->magnify.id,&window_name);
7173 XSetWMIconName(display,windows->magnify.id,&window_name);
7174 (void) XFree((void *) window_name.value);
7177 previous_magnify=magnify;
7178 ximage=windows->image.ximage;
7179 width=(unsigned int) windows->magnify.ximage->width;
7180 height=(unsigned int) windows->magnify.ximage->height;
7181 if ((windows->magnify.x < 0) ||
7182 (windows->magnify.x >= windows->image.ximage->width))
7183 windows->magnify.x=windows->image.ximage->width >> 1;
7184 x=windows->magnify.x-((width/magnify) >> 1);
7188 if (x > (int) (ximage->width-(width/magnify)))
7189 x=ximage->width-width/magnify;
7190 if ((windows->magnify.y < 0) ||
7191 (windows->magnify.y >= windows->image.ximage->height))
7192 windows->magnify.y=windows->image.ximage->height >> 1;
7193 y=windows->magnify.y-((height/magnify) >> 1);
7197 if (y > (int) (ximage->height-(height/magnify)))
7198 y=ximage->height-height/magnify;
7199 q=(unsigned char *) windows->magnify.ximage->data;
7200 scanline_pad=(unsigned int) (windows->magnify.ximage->bytes_per_line-
7201 ((width*windows->magnify.ximage->bits_per_pixel) >> 3));
7202 if (ximage->bits_per_pixel < 8)
7204 register unsigned char
7211 register unsigned int
7217 pixel_info=windows->magnify.pixel_info;
7218 switch (ximage->bitmap_bit_order)
7223 Magnify little-endian bitmap.
7227 if (ximage->format == XYBitmap)
7229 background=(unsigned char)
7230 (XPixelIntensity(&pixel_info->foreground_color) <
7231 XPixelIntensity(&pixel_info->background_color) ? 0x80 : 0x00);
7232 foreground=(unsigned char)
7233 (XPixelIntensity(&pixel_info->background_color) <
7234 XPixelIntensity(&pixel_info->foreground_color) ? 0x80 : 0x00);
7235 if (windows->magnify.depth > 1)
7236 Swap(background,foreground);
7238 for (i=0; i < (ssize_t) height; i+=magnify)
7241 Propogate pixel magnify rows.
7243 for (j=0; j < magnify; j++)
7245 p=(unsigned char *) ximage->data+y*ximage->bytes_per_line+
7246 ((x*ximage->bits_per_pixel) >> 3);
7247 p_bit=(unsigned char) (x*ximage->bits_per_pixel) & 0x07;
7250 for (k=0; k < width; k+=magnify)
7253 Propogate pixel magnify columns.
7255 for (l=0; l < magnify; l++)
7258 Propogate each bit plane.
7260 for (plane=0; (int) plane < ximage->bits_per_pixel; plane++)
7263 if (*p & (0x01 << (p_bit+plane)))
7276 p_bit+=ximage->bits_per_pixel;
7283 *q=byte >> (8-q_bit);
7295 Magnify big-endian bitmap.
7299 if (ximage->format == XYBitmap)
7301 background=(unsigned char)
7302 (XPixelIntensity(&pixel_info->foreground_color) <
7303 XPixelIntensity(&pixel_info->background_color) ? 0x01 : 0x00);
7304 foreground=(unsigned char)
7305 (XPixelIntensity(&pixel_info->background_color) <
7306 XPixelIntensity(&pixel_info->foreground_color) ? 0x01 : 0x00);
7307 if (windows->magnify.depth > 1)
7308 Swap(background,foreground);
7310 for (i=0; i < (ssize_t) height; i+=magnify)
7313 Propogate pixel magnify rows.
7315 for (j=0; j < magnify; j++)
7317 p=(unsigned char *) ximage->data+y*ximage->bytes_per_line+
7318 ((x*ximage->bits_per_pixel) >> 3);
7319 p_bit=(unsigned char) (x*ximage->bits_per_pixel) & 0x07;
7322 for (k=0; k < width; k+=magnify)
7325 Propogate pixel magnify columns.
7327 for (l=0; l < magnify; l++)
7330 Propogate each bit plane.
7332 for (plane=0; (int) plane < ximage->bits_per_pixel; plane++)
7335 if (*p & (0x80 >> (p_bit+plane)))
7348 p_bit+=ximage->bits_per_pixel;
7355 *q=byte << (8-q_bit);
7366 switch (ximage->bits_per_pixel)
7372 Magnify 8 bit X image.
7374 for (i=0; i < (ssize_t) height; i+=magnify)
7377 Propogate pixel magnify rows.
7379 for (j=0; j < magnify; j++)
7381 p=(unsigned char *) ximage->data+y*ximage->bytes_per_line+
7382 ((x*ximage->bits_per_pixel) >> 3);
7383 for (k=0; k < width; k+=magnify)
7386 Propogate pixel magnify columns.
7388 for (l=0; l < magnify; l++)
7400 register unsigned int
7405 Magnify multi-byte X image.
7407 bytes_per_pixel=(unsigned int) ximage->bits_per_pixel >> 3;
7408 for (i=0; i < (ssize_t) height; i+=magnify)
7411 Propogate pixel magnify rows.
7413 for (j=0; j < magnify; j++)
7415 p=(unsigned char *) ximage->data+y*ximage->bytes_per_line+
7416 ((x*ximage->bits_per_pixel) >> 3);
7417 for (k=0; k < width; k+=magnify)
7420 Propogate pixel magnify columns.
7422 for (l=0; l < magnify; l++)
7423 for (m=0; m < bytes_per_pixel; m++)
7435 Copy X image to magnify pixmap.
7437 x=windows->magnify.x-((width/magnify) >> 1);
7439 x=(int) ((width >> 1)-windows->magnify.x*magnify);
7441 if (x > (int) (ximage->width-(width/magnify)))
7442 x=(int) ((ximage->width-windows->magnify.x)*magnify-(width >> 1));
7445 y=windows->magnify.y-((height/magnify) >> 1);
7447 y=(int) ((height >> 1)-windows->magnify.y*magnify);
7449 if (y > (int) (ximage->height-(height/magnify)))
7450 y=(int) ((ximage->height-windows->magnify.y)*magnify-(height >> 1));
7453 if ((x != 0) || (y != 0))
7454 (void) XFillRectangle(display,windows->magnify.pixmap,
7455 windows->magnify.annotate_context,0,0,width,height);
7456 (void) XPutImage(display,windows->magnify.pixmap,
7457 windows->magnify.annotate_context,windows->magnify.ximage,0,0,x,y,width-x,
7459 if ((magnify > 1) && ((magnify <= (width >> 1)) &&
7460 (magnify <= (height >> 1))))
7466 Highlight center pixel.
7468 highlight_info.x=(ssize_t) windows->magnify.width >> 1;
7469 highlight_info.y=(ssize_t) windows->magnify.height >> 1;
7470 highlight_info.width=magnify;
7471 highlight_info.height=magnify;
7472 (void) XDrawRectangle(display,windows->magnify.pixmap,
7473 windows->magnify.highlight_context,(int) highlight_info.x,
7474 (int) highlight_info.y,(unsigned int) highlight_info.width-1,
7475 (unsigned int) highlight_info.height-1);
7477 (void) XDrawRectangle(display,windows->magnify.pixmap,
7478 windows->magnify.annotate_context,(int) highlight_info.x+1,
7479 (int) highlight_info.y+1,(unsigned int) highlight_info.width-3,
7480 (unsigned int) highlight_info.height-3);
7483 Show center pixel color.
7485 (void) GetOneVirtualPixelInfo(windows->image.image,TileVirtualPixelMethod,
7486 (ssize_t) windows->magnify.x,(ssize_t) windows->magnify.y,&pixel,exception);
7487 (void) FormatLocaleString(tuple,MagickPathExtent,"%d,%d: ",
7488 windows->magnify.x,windows->magnify.y);
7489 (void) ConcatenateMagickString(tuple,"(",MagickPathExtent);
7490 ConcatenateColorComponent(&pixel,RedPixelChannel,X11Compliance,tuple);
7491 (void) ConcatenateMagickString(tuple,",",MagickPathExtent);
7492 ConcatenateColorComponent(&pixel,GreenPixelChannel,X11Compliance,tuple);
7493 (void) ConcatenateMagickString(tuple,",",MagickPathExtent);
7494 ConcatenateColorComponent(&pixel,BluePixelChannel,X11Compliance,tuple);
7495 if (pixel.colorspace == CMYKColorspace)
7497 (void) ConcatenateMagickString(tuple,",",MagickPathExtent);
7498 ConcatenateColorComponent(&pixel,BlackPixelChannel,X11Compliance,tuple);
7500 if (pixel.alpha_trait != UndefinedPixelTrait)
7502 (void) ConcatenateMagickString(tuple,",",MagickPathExtent);
7503 ConcatenateColorComponent(&pixel,AlphaPixelChannel,X11Compliance,tuple);
7505 (void) ConcatenateMagickString(tuple,")",MagickPathExtent);
7506 height=(unsigned int) windows->magnify.font_info->ascent+
7507 windows->magnify.font_info->descent;
7508 x=windows->magnify.font_info->max_bounds.width >> 1;
7509 y=windows->magnify.font_info->ascent+(height >> 2);
7510 (void) XDrawImageString(display,windows->magnify.pixmap,
7511 windows->magnify.annotate_context,x,y,tuple,(int) strlen(tuple));
7512 GetColorTuple(&pixel,MagickTrue,tuple);
7514 (void) XDrawImageString(display,windows->magnify.pixmap,
7515 windows->magnify.annotate_context,x,y,tuple,(int) strlen(tuple));
7516 (void) QueryColorname(windows->image.image,&pixel,SVGCompliance,tuple,
7519 (void) XDrawImageString(display,windows->magnify.pixmap,
7520 windows->magnify.annotate_context,x,y,tuple,(int) strlen(tuple));
7522 Refresh magnify window.
7524 magnify_window=windows->magnify;
7527 XRefreshWindow(display,&magnify_window,(XEvent *) NULL);
7531 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7535 % X M a k e P i x m a p %
7539 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7541 % XMakePixmap() creates an X11 pixmap.
7543 % The format of the XMakePixmap method is:
7545 % void XMakeStandardColormap(Display *display,XVisualInfo *visual_info,
7546 % XResourceInfo *resource_info,Image *image,XStandardColormap *map_info,
7547 % XPixelInfo *pixel)
7549 % A description of each parameter follows:
7551 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
7553 % o display: Specifies a connection to an X server; returned from
7556 % o window: Specifies a pointer to a XWindowInfo structure.
7559 static MagickBooleanType XMakePixmap(Display *display,
7560 const XResourceInfo *resource_info,XWindowInfo *window)
7566 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
7567 assert(display != (Display *) NULL);
7568 assert(resource_info != (XResourceInfo *) NULL);
7569 assert(window != (XWindowInfo *) NULL);
7570 if (window->pixmap != (Pixmap) NULL)
7573 Destroy previous X pixmap.
7575 (void) XFreePixmap(display,window->pixmap);
7576 window->pixmap=(Pixmap) NULL;
7578 if (window->use_pixmap == MagickFalse)
7579 return(MagickFalse);
7580 if (window->ximage == (XImage *) NULL)
7581 return(MagickFalse);
7583 Display busy cursor.
7585 (void) XCheckDefineCursor(display,window->id,window->busy_cursor);
7586 (void) XFlush(display);
7590 width=(unsigned int) window->ximage->width;
7591 height=(unsigned int) window->ximage->height;
7592 window->pixmap=XCreatePixmap(display,window->id,width,height,window->depth);
7593 if (window->pixmap == (Pixmap) NULL)
7596 Unable to allocate pixmap.
7598 (void) XCheckDefineCursor(display,window->id,window->cursor);
7599 return(MagickFalse);
7602 Copy X image to pixmap.
7604 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
7605 if (window->shared_memory)
7606 (void) XShmPutImage(display,window->pixmap,window->annotate_context,
7607 window->ximage,0,0,0,0,width,height,MagickTrue);
7609 if (window->shared_memory == MagickFalse)
7610 (void) XPutImage(display,window->pixmap,window->annotate_context,
7611 window->ximage,0,0,0,0,width,height);
7612 if (IsEventLogging())
7614 (void) LogMagickEvent(X11Event,GetMagickModule(),"Pixmap:");
7615 (void) LogMagickEvent(X11Event,GetMagickModule()," width, height: %ux%u",
7621 (void) XCheckDefineCursor(display,window->id,window->cursor);
7626 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7630 % X M a k e S t a n d a r d C o l o r m a p %
7634 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7636 % XMakeStandardColormap() creates an X11 Standard Colormap.
7638 % The format of the XMakeStandardColormap method is:
7640 % void XMakeStandardColormap(Display *display,XVisualInfo *visual_info,
7641 % XResourceInfo *resource_info,Image *image,XStandardColormap *map_info,
7642 % XPixelInfo *pixel,ExceptionInfo *exception)
7644 % A description of each parameter follows:
7646 % o display: Specifies a connection to an X server; returned from
7649 % o visual_info: Specifies a pointer to a X11 XVisualInfo structure;
7650 % returned from XGetVisualInfo.
7652 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
7654 % o image: the image.
7656 % o map_info: If a Standard Colormap type is specified, this structure is
7657 % initialized with info from the Standard Colormap.
7659 % o pixel: Specifies a pointer to a XPixelInfo structure.
7661 % o exception: return any errors or warnings in this structure.
7665 #if defined(__cplusplus) || defined(c_plusplus)
7669 static inline double DiversityPixelIntensity(
7670 const DiversityPacket *pixel)
7675 intensity=0.212656*pixel->red+0.715158*pixel->green+0.072186*pixel->blue;
7679 static int IntensityCompare(const void *x,const void *y)
7688 color_1=(DiversityPacket *) x;
7689 color_2=(DiversityPacket *) y;
7690 diversity=(int) (DiversityPixelIntensity(color_2)-
7691 DiversityPixelIntensity(color_1));
7695 static int PopularityCompare(const void *x,const void *y)
7701 color_1=(DiversityPacket *) x;
7702 color_2=(DiversityPacket *) y;
7703 return((int) color_2->count-(int) color_1->count);
7706 #if defined(__cplusplus) || defined(c_plusplus)
7710 static inline Quantum ScaleXToQuantum(const size_t x,
7713 return((Quantum) (((double) QuantumRange*x)/scale+0.5));
7716 MagickPrivate void XMakeStandardColormap(Display *display,
7717 XVisualInfo *visual_info,XResourceInfo *resource_info,Image *image,
7718 XStandardColormap *map_info,XPixelInfo *pixel,ExceptionInfo *exception)
7741 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
7742 assert(display != (Display *) NULL);
7743 assert(visual_info != (XVisualInfo *) NULL);
7744 assert(map_info != (XStandardColormap *) NULL);
7745 assert(resource_info != (XResourceInfo *) NULL);
7746 assert(pixel != (XPixelInfo *) NULL);
7747 if (resource_info->map_type != (char *) NULL)
7750 Standard Colormap is already defined (i.e. xstdcmap).
7752 XGetPixelInfo(display,visual_info,map_info,resource_info,image,
7754 number_colors=(unsigned int) (map_info->base_pixel+
7755 (map_info->red_max+1)*(map_info->green_max+1)*(map_info->blue_max+1));
7756 if ((map_info->red_max*map_info->green_max*map_info->blue_max) != 0)
7757 if ((image->alpha_trait == UndefinedPixelTrait) &&
7758 (resource_info->color_recovery == MagickFalse) &&
7759 (resource_info->quantize_info->dither_method != NoDitherMethod) &&
7760 (number_colors < MaxColormapSize))
7769 Improve image appearance with error diffusion.
7771 affinity_image=AcquireImage((ImageInfo *) NULL,exception);
7772 if (affinity_image == (Image *) NULL)
7773 ThrowXWindowFatalException(ResourceLimitFatalError,
7774 "UnableToDitherImage",image->filename);
7775 affinity_image->columns=number_colors;
7776 affinity_image->rows=1;
7778 Initialize colormap image.
7780 q=QueueAuthenticPixels(affinity_image,0,0,affinity_image->columns,
7782 if (q != (Quantum *) NULL)
7784 for (i=0; i < (ssize_t) number_colors; i++)
7786 SetPixelRed(affinity_image,0,q);
7787 if (map_info->red_max != 0)
7788 SetPixelRed(affinity_image,ScaleXToQuantum((size_t)
7789 (i/map_info->red_mult),map_info->red_max),q);
7790 SetPixelGreen(affinity_image,0,q);
7791 if (map_info->green_max != 0)
7792 SetPixelGreen(affinity_image,ScaleXToQuantum((size_t)
7793 ((i/map_info->green_mult) % (map_info->green_max+1)),
7794 map_info->green_max),q);
7795 SetPixelBlue(affinity_image,0,q);
7796 if (map_info->blue_max != 0)
7797 SetPixelBlue(affinity_image,ScaleXToQuantum((size_t)
7798 (i % map_info->green_mult),map_info->blue_max),q);
7799 SetPixelAlpha(affinity_image,
7800 TransparentAlpha,q);
7801 q+=GetPixelChannels(affinity_image);
7803 (void) SyncAuthenticPixels(affinity_image,exception);
7804 (void) RemapImage(resource_info->quantize_info,image,
7805 affinity_image,exception);
7807 XGetPixelInfo(display,visual_info,map_info,resource_info,image,
7809 (void) SetImageStorageClass(image,DirectClass,exception);
7810 affinity_image=DestroyImage(affinity_image);
7812 if (IsEventLogging())
7814 (void) LogMagickEvent(X11Event,GetMagickModule(),
7815 "Standard Colormap:");
7816 (void) LogMagickEvent(X11Event,GetMagickModule(),
7817 " colormap id: 0x%lx",map_info->colormap);
7818 (void) LogMagickEvent(X11Event,GetMagickModule(),
7819 " red, green, blue max: %lu %lu %lu",map_info->red_max,
7820 map_info->green_max,map_info->blue_max);
7821 (void) LogMagickEvent(X11Event,GetMagickModule(),
7822 " red, green, blue mult: %lu %lu %lu",map_info->red_mult,
7823 map_info->green_mult,map_info->blue_mult);
7827 if ((visual_info->klass != DirectColor) &&
7828 (visual_info->klass != TrueColor))
7829 if ((image->storage_class == DirectClass) ||
7830 ((int) image->colors > visual_info->colormap_size))
7836 Image has more colors than the visual supports.
7838 quantize_info=(*resource_info->quantize_info);
7839 quantize_info.number_colors=(size_t) visual_info->colormap_size;
7840 (void) QuantizeImage(&quantize_info,image,exception);
7843 Free previous and create new colormap.
7845 (void) XFreeStandardColormap(display,visual_info,map_info,pixel);
7846 colormap=XDefaultColormap(display,visual_info->screen);
7847 if (visual_info->visual != XDefaultVisual(display,visual_info->screen))
7848 colormap=XCreateColormap(display,XRootWindow(display,visual_info->screen),
7849 visual_info->visual,visual_info->klass == DirectColor ?
7850 AllocAll : AllocNone);
7851 if (colormap == (Colormap) NULL)
7852 ThrowXWindowFatalException(ResourceLimitFatalError,"UnableToCreateColormap",
7855 Initialize the map and pixel info structures.
7857 XGetMapInfo(visual_info,colormap,map_info);
7858 XGetPixelInfo(display,visual_info,map_info,resource_info,image,pixel);
7860 Allocating colors in server colormap is based on visual class.
7862 switch (visual_info->klass)
7868 Define Standard Colormap for StaticGray or StaticColor visual.
7870 number_colors=image->colors;
7871 colors=(XColor *) AcquireQuantumMemory((size_t)
7872 visual_info->colormap_size,sizeof(*colors));
7873 if (colors == (XColor *) NULL)
7874 ThrowXWindowFatalException(ResourceLimitFatalError,
7875 "UnableToCreateColormap",image->filename);
7877 color.flags=(char) (DoRed | DoGreen | DoBlue);
7878 for (i=0; i < (ssize_t) image->colors; i++)
7880 color.red=ScaleQuantumToShort(XRedGamma(image->colormap[i].red));
7881 color.green=ScaleQuantumToShort(XGreenGamma(image->colormap[i].green));
7882 color.blue=ScaleQuantumToShort(XBlueGamma(image->colormap[i].blue));
7883 if (visual_info->klass != StaticColor)
7885 gray_value=(unsigned short) XPixelIntensity(&color);
7886 color.red=gray_value;
7887 color.green=gray_value;
7888 color.blue=gray_value;
7890 status=XAllocColor(display,colormap,&color);
7891 if (status == False)
7893 colormap=XCopyColormapAndFree(display,colormap);
7894 (void) XAllocColor(display,colormap,&color);
7896 pixel->pixels[i]=color.pixel;
7908 Define Standard Colormap for GrayScale or PseudoColor visual.
7910 number_colors=image->colors;
7911 colors=(XColor *) AcquireQuantumMemory((size_t)
7912 visual_info->colormap_size,sizeof(*colors));
7913 if (colors == (XColor *) NULL)
7914 ThrowXWindowFatalException(ResourceLimitFatalError,
7915 "UnableToCreateColormap",image->filename);
7917 Preallocate our GUI colors.
7919 (void) XAllocColor(display,colormap,&pixel->foreground_color);
7920 (void) XAllocColor(display,colormap,&pixel->background_color);
7921 (void) XAllocColor(display,colormap,&pixel->border_color);
7922 (void) XAllocColor(display,colormap,&pixel->matte_color);
7923 (void) XAllocColor(display,colormap,&pixel->highlight_color);
7924 (void) XAllocColor(display,colormap,&pixel->shadow_color);
7925 (void) XAllocColor(display,colormap,&pixel->depth_color);
7926 (void) XAllocColor(display,colormap,&pixel->trough_color);
7927 for (i=0; i < MaxNumberPens; i++)
7928 (void) XAllocColor(display,colormap,&pixel->pen_colors[i]);
7930 Determine if image colors will "fit" into X server colormap.
7932 colormap_type=resource_info->colormap;
7933 status=XAllocColorCells(display,colormap,MagickFalse,(unsigned long *)
7934 NULL,0,pixel->pixels,(unsigned int) image->colors);
7935 if (status != False)
7936 colormap_type=PrivateColormap;
7937 if (colormap_type == SharedColormap)
7958 Define Standard colormap for shared GrayScale or PseudoColor visual.
7960 diversity=(DiversityPacket *) AcquireQuantumMemory(image->colors,
7961 sizeof(*diversity));
7962 if (diversity == (DiversityPacket *) NULL)
7963 ThrowXWindowFatalException(ResourceLimitFatalError,
7964 "UnableToCreateColormap",image->filename);
7965 for (i=0; i < (ssize_t) image->colors; i++)
7967 diversity[i].red=ClampToQuantum(image->colormap[i].red);
7968 diversity[i].green=ClampToQuantum(image->colormap[i].green);
7969 diversity[i].blue=ClampToQuantum(image->colormap[i].blue);
7970 diversity[i].index=(unsigned short) i;
7971 diversity[i].count=0;
7973 image_view=AcquireAuthenticCacheView(image,exception);
7974 for (y=0; y < (int) image->rows; y++)
7979 register const Quantum
7982 p=GetCacheViewAuthenticPixels(image_view,0,(ssize_t) y,
7983 image->columns,1,exception);
7984 if (p == (const Quantum *) NULL)
7986 for (x=(int) image->columns-1; x >= 0; x--)
7988 diversity[(ssize_t) GetPixelIndex(image,p)].count++;
7989 p+=GetPixelChannels(image);
7992 image_view=DestroyCacheView(image_view);
7994 Sort colors by decreasing intensity.
7996 qsort((void *) diversity,image->colors,sizeof(*diversity),
7998 for (i=0; i < (ssize_t) image->colors; )
8000 diversity[i].count<<=4; /* increase this colors popularity */
8001 i+=MagickMax((int) (image->colors >> 4),2);
8003 diversity[image->colors-1].count<<=4;
8004 qsort((void *) diversity,image->colors,sizeof(*diversity),
8010 color.flags=(char) (DoRed | DoGreen | DoBlue);
8011 for (i=0; i < (ssize_t) image->colors; i++)
8013 index=diversity[i].index;
8015 ScaleQuantumToShort(XRedGamma(image->colormap[index].red));
8017 ScaleQuantumToShort(XGreenGamma(image->colormap[index].green));
8019 ScaleQuantumToShort(XBlueGamma(image->colormap[index].blue));
8020 if (visual_info->klass != PseudoColor)
8022 gray_value=(unsigned short) XPixelIntensity(&color);
8023 color.red=gray_value;
8024 color.green=gray_value;
8025 color.blue=gray_value;
8027 status=XAllocColor(display,colormap,&color);
8028 if (status == False)
8030 pixel->pixels[index]=color.pixel;
8034 Read X server colormap.
8036 server_colors=(XColor *) AcquireQuantumMemory((size_t)
8037 visual_info->colormap_size,sizeof(*server_colors));
8038 if (server_colors == (XColor *) NULL)
8039 ThrowXWindowFatalException(ResourceLimitFatalError,
8040 "UnableToCreateColormap",image->filename);
8041 for (x=visual_info->colormap_size-1; x >= 0; x--)
8042 server_colors[x].pixel=(size_t) x;
8043 (void) XQueryColors(display,colormap,server_colors,
8044 (int) MagickMin((unsigned int) visual_info->colormap_size,256));
8046 Select remaining colors from X server colormap.
8048 for (; i < (ssize_t) image->colors; i++)
8050 index=diversity[i].index;
8051 color.red=ScaleQuantumToShort(
8052 XRedGamma(image->colormap[index].red));
8053 color.green=ScaleQuantumToShort(
8054 XGreenGamma(image->colormap[index].green));
8055 color.blue=ScaleQuantumToShort(
8056 XBlueGamma(image->colormap[index].blue));
8057 if (visual_info->klass != PseudoColor)
8059 gray_value=(unsigned short) XPixelIntensity(&color);
8060 color.red=gray_value;
8061 color.green=gray_value;
8062 color.blue=gray_value;
8064 XBestPixel(display,colormap,server_colors,(unsigned int)
8065 visual_info->colormap_size,&color);
8066 pixel->pixels[index]=color.pixel;
8069 if ((int) image->colors < visual_info->colormap_size)
8072 Fill up colors array-- more choices for pen colors.
8074 retain_colors=MagickMin((unsigned int)
8075 (visual_info->colormap_size-image->colors),256);
8076 for (i=0; i < (ssize_t) retain_colors; i++)
8077 *p++=server_colors[i];
8078 number_colors+=retain_colors;
8080 server_colors=(XColor *) RelinquishMagickMemory(server_colors);
8081 diversity=(DiversityPacket *) RelinquishMagickMemory(diversity);
8085 Define Standard colormap for private GrayScale or PseudoColor visual.
8087 if (status == False)
8090 Not enough colormap entries in the colormap-- Create a new colormap.
8092 colormap=XCreateColormap(display,
8093 XRootWindow(display,visual_info->screen),visual_info->visual,
8095 if (colormap == (Colormap) NULL)
8096 ThrowXWindowFatalException(ResourceLimitFatalError,
8097 "UnableToCreateColormap",image->filename);
8098 map_info->colormap=colormap;
8099 if ((int) image->colors < visual_info->colormap_size)
8102 Retain colors from the default colormap to help lessens the
8103 effects of colormap flashing.
8105 retain_colors=MagickMin((unsigned int)
8106 (visual_info->colormap_size-image->colors),256);
8107 p=colors+image->colors;
8108 for (i=0; i < (ssize_t) retain_colors; i++)
8110 p->pixel=(unsigned long) i;
8113 (void) XQueryColors(display,
8114 XDefaultColormap(display,visual_info->screen),
8115 colors+image->colors,(int) retain_colors);
8117 Transfer colors from default to private colormap.
8119 (void) XAllocColorCells(display,colormap,MagickFalse,
8120 (unsigned long *) NULL,0,pixel->pixels,(unsigned int)
8122 p=colors+image->colors;
8123 for (i=0; i < (ssize_t) retain_colors; i++)
8125 p->pixel=pixel->pixels[i];
8128 (void) XStoreColors(display,colormap,colors+image->colors,
8129 (int) retain_colors);
8130 number_colors+=retain_colors;
8132 (void) XAllocColorCells(display,colormap,MagickFalse,
8133 (unsigned long *) NULL,0,pixel->pixels,(unsigned int)
8137 Store the image colormap.
8140 color.flags=(char) (DoRed | DoGreen | DoBlue);
8141 for (i=0; i < (ssize_t) image->colors; i++)
8143 color.red=ScaleQuantumToShort(XRedGamma(image->colormap[i].red));
8144 color.green=ScaleQuantumToShort(XGreenGamma(image->colormap[i].green));
8145 color.blue=ScaleQuantumToShort(XBlueGamma(image->colormap[i].blue));
8146 if (visual_info->klass != PseudoColor)
8148 gray_value=(unsigned short) XPixelIntensity(&color);
8149 color.red=gray_value;
8150 color.green=gray_value;
8151 color.blue=gray_value;
8153 color.pixel=pixel->pixels[i];
8156 (void) XStoreColors(display,colormap,colors,(int) image->colors);
8167 Define Standard Colormap for TrueColor or DirectColor visual.
8169 number_colors=(unsigned int) ((map_info->red_max*map_info->red_mult)+
8170 (map_info->green_max*map_info->green_mult)+
8171 (map_info->blue_max*map_info->blue_mult)+1);
8172 linear_colormap=(number_colors > 4096) ||
8173 (((int) (map_info->red_max+1) == visual_info->colormap_size) &&
8174 ((int) (map_info->green_max+1) == visual_info->colormap_size) &&
8175 ((int) (map_info->blue_max+1) == visual_info->colormap_size)) ?
8176 MagickTrue : MagickFalse;
8177 if (linear_colormap != MagickFalse)
8178 number_colors=(size_t) visual_info->colormap_size;
8180 Allocate color array.
8182 colors=(XColor *) AcquireQuantumMemory(number_colors,sizeof(*colors));
8183 if (colors == (XColor *) NULL)
8184 ThrowXWindowFatalException(ResourceLimitFatalError,
8185 "UnableToCreateColormap",image->filename);
8187 Initialize linear color ramp.
8190 color.flags=(char) (DoRed | DoGreen | DoBlue);
8191 if (linear_colormap != MagickFalse)
8192 for (i=0; i < (ssize_t) number_colors; i++)
8194 color.blue=(unsigned short) 0;
8195 if (map_info->blue_max != 0)
8196 color.blue=(unsigned short) ((size_t)
8197 ((65535L*(i % map_info->green_mult))/map_info->blue_max));
8198 color.green=color.blue;
8199 color.red=color.blue;
8200 color.pixel=XStandardPixel(map_info,&color);
8204 for (i=0; i < (ssize_t) number_colors; i++)
8206 color.red=(unsigned short) 0;
8207 if (map_info->red_max != 0)
8208 color.red=(unsigned short) ((size_t)
8209 ((65535L*(i/map_info->red_mult))/map_info->red_max));
8210 color.green=(unsigned int) 0;
8211 if (map_info->green_max != 0)
8212 color.green=(unsigned short) ((size_t)
8213 ((65535L*((i/map_info->green_mult) % (map_info->green_max+1)))/
8214 map_info->green_max));
8215 color.blue=(unsigned short) 0;
8216 if (map_info->blue_max != 0)
8217 color.blue=(unsigned short) ((size_t)
8218 ((65535L*(i % map_info->green_mult))/map_info->blue_max));
8219 color.pixel=XStandardPixel(map_info,&color);
8222 if ((visual_info->klass == DirectColor) &&
8223 (colormap != XDefaultColormap(display,visual_info->screen)))
8224 (void) XStoreColors(display,colormap,colors,(int) number_colors);
8226 for (i=0; i < (ssize_t) number_colors; i++)
8227 (void) XAllocColor(display,colormap,&colors[i]);
8231 if ((visual_info->klass != DirectColor) &&
8232 (visual_info->klass != TrueColor))
8235 Set foreground, background, border, etc. pixels.
8237 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8238 &pixel->foreground_color);
8239 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8240 &pixel->background_color);
8241 if (pixel->background_color.pixel == pixel->foreground_color.pixel)
8244 Foreground and background colors must differ.
8246 pixel->background_color.red=(~pixel->foreground_color.red);
8247 pixel->background_color.green=
8248 (~pixel->foreground_color.green);
8249 pixel->background_color.blue=
8250 (~pixel->foreground_color.blue);
8251 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8252 &pixel->background_color);
8254 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8255 &pixel->border_color);
8256 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8257 &pixel->matte_color);
8258 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8259 &pixel->highlight_color);
8260 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8261 &pixel->shadow_color);
8262 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8263 &pixel->depth_color);
8264 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8265 &pixel->trough_color);
8266 for (i=0; i < MaxNumberPens; i++)
8268 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8269 &pixel->pen_colors[i]);
8270 pixel->pixels[image->colors+i]=pixel->pen_colors[i].pixel;
8272 pixel->colors=(ssize_t) (image->colors+MaxNumberPens);
8274 colors=(XColor *) RelinquishMagickMemory(colors);
8275 if (IsEventLogging())
8277 (void) LogMagickEvent(X11Event,GetMagickModule(),"Standard Colormap:");
8278 (void) LogMagickEvent(X11Event,GetMagickModule()," colormap id: 0x%lx",
8279 map_info->colormap);
8280 (void) LogMagickEvent(X11Event,GetMagickModule(),
8281 " red, green, blue max: %lu %lu %lu",map_info->red_max,
8282 map_info->green_max,map_info->blue_max);
8283 (void) LogMagickEvent(X11Event,GetMagickModule(),
8284 " red, green, blue mult: %lu %lu %lu",map_info->red_mult,
8285 map_info->green_mult,map_info->blue_mult);
8290 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8294 % X M a k e W i n d o w %
8298 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8300 % XMakeWindow() creates an X11 window.
8302 % The format of the XMakeWindow method is:
8304 % void XMakeWindow(Display *display,Window parent,char **argv,int argc,
8305 % XClassHint *class_hint,XWMHints *manager_hints,
8306 % XWindowInfo *window_info)
8308 % A description of each parameter follows:
8310 % o display: Specifies a connection to an X server; returned from
8313 % o parent: Specifies the parent window_info.
8315 % o argv: Specifies the application's argument list.
8317 % o argc: Specifies the number of arguments.
8319 % o class_hint: Specifies a pointer to a X11 XClassHint structure.
8321 % o manager_hints: Specifies a pointer to a X11 XWMHints structure.
8323 % o window_info: Specifies a pointer to a X11 XWindowInfo structure.
8326 MagickPrivate void XMakeWindow(Display *display,Window parent,char **argv,
8327 int argc,XClassHint *class_hint,XWMHints *manager_hints,
8328 XWindowInfo *window_info)
8330 #define MinWindowSize 64
8338 static XTextProperty
8349 Set window info hints.
8351 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
8352 assert(display != (Display *) NULL);
8353 assert(window_info != (XWindowInfo *) NULL);
8354 size_hints=XAllocSizeHints();
8355 if (size_hints == (XSizeHints *) NULL)
8356 ThrowXWindowFatalException(XServerFatalError,"UnableToMakeXWindow",argv[0]);
8357 size_hints->flags=(int) window_info->flags;
8358 size_hints->x=window_info->x;
8359 size_hints->y=window_info->y;
8360 size_hints->width=(int) window_info->width;
8361 size_hints->height=(int) window_info->height;
8362 if (window_info->immutable != MagickFalse)
8365 Window size cannot be changed.
8367 size_hints->min_width=size_hints->width;
8368 size_hints->min_height=size_hints->height;
8369 size_hints->max_width=size_hints->width;
8370 size_hints->max_height=size_hints->height;
8371 size_hints->flags|=PMinSize;
8372 size_hints->flags|=PMaxSize;
8377 Window size can be changed.
8379 size_hints->min_width=(int) window_info->min_width;
8380 size_hints->min_height=(int) window_info->min_height;
8381 size_hints->flags|=PResizeInc;
8382 size_hints->width_inc=(int) window_info->width_inc;
8383 size_hints->height_inc=(int) window_info->height_inc;
8384 #if !defined(PRE_R4_ICCCM)
8385 size_hints->flags|=PBaseSize;
8386 size_hints->base_width=size_hints->width_inc;
8387 size_hints->base_height=size_hints->height_inc;
8390 gravity=NorthWestGravity;
8391 if (window_info->geometry != (char *) NULL)
8394 default_geometry[MagickPathExtent],
8395 geometry[MagickPathExtent];
8404 User specified geometry.
8406 (void) FormatLocaleString(default_geometry,MagickPathExtent,"%dx%d",
8407 size_hints->width,size_hints->height);
8408 (void) CopyMagickString(geometry,window_info->geometry,MagickPathExtent);
8410 while (strlen(p) != 0)
8412 if ((isspace((int) ((unsigned char) *p)) == 0) && (*p != '%'))
8415 (void) memmove(p,p+1,MagickPathExtent-(p-geometry));
8417 flags=XWMGeometry(display,window_info->screen,geometry,default_geometry,
8418 window_info->border_width,size_hints,&size_hints->x,&size_hints->y,
8419 &size_hints->width,&size_hints->height,&gravity);
8420 if ((flags & WidthValue) && (flags & HeightValue))
8421 size_hints->flags|=USSize;
8422 if ((flags & XValue) && (flags & YValue))
8424 size_hints->flags|=USPosition;
8425 window_info->x=size_hints->x;
8426 window_info->y=size_hints->y;
8429 #if !defined(PRE_R4_ICCCM)
8430 size_hints->win_gravity=gravity;
8431 size_hints->flags|=PWinGravity;
8433 if (window_info->id == (Window) NULL)
8434 window_info->id=XCreateWindow(display,parent,window_info->x,window_info->y,
8435 (unsigned int) size_hints->width,(unsigned int) size_hints->height,
8436 window_info->border_width,(int) window_info->depth,InputOutput,
8437 window_info->visual,(unsigned long) window_info->mask,
8438 &window_info->attributes);
8451 Window already exists; change relevant attributes.
8453 (void) XChangeWindowAttributes(display,window_info->id,(unsigned long)
8454 window_info->mask,&window_info->attributes);
8455 mask=ConfigureNotify;
8456 while (XCheckTypedWindowEvent(display,window_info->id,(int) mask,&sans_event)) ;
8457 window_changes.x=window_info->x;
8458 window_changes.y=window_info->y;
8459 window_changes.width=(int) window_info->width;
8460 window_changes.height=(int) window_info->height;
8461 mask=(MagickStatusType) (CWWidth | CWHeight);
8462 if (window_info->flags & USPosition)
8464 (void) XReconfigureWMWindow(display,window_info->id,window_info->screen,
8465 mask,&window_changes);
8467 if (window_info->id == (Window) NULL)
8468 ThrowXWindowFatalException(XServerFatalError,"UnableToCreateWindow",
8470 status=XStringListToTextProperty(&window_info->name,1,&window_name);
8471 if (status == False)
8472 ThrowXWindowFatalException(XServerFatalError,"UnableToCreateTextProperty",
8474 status=XStringListToTextProperty(&window_info->icon_name,1,&icon_name);
8475 if (status == False)
8476 ThrowXWindowFatalException(XServerFatalError,"UnableToCreateTextProperty",
8477 window_info->icon_name);
8478 if (window_info->icon_geometry != (char *) NULL)
8486 User specified icon geometry.
8488 size_hints->flags|=USPosition;
8489 flags=XWMGeometry(display,window_info->screen,window_info->icon_geometry,
8490 (char *) NULL,0,size_hints,&manager_hints->icon_x,
8491 &manager_hints->icon_y,&width,&height,&gravity);
8492 if ((flags & XValue) && (flags & YValue))
8493 manager_hints->flags|=IconPositionHint;
8495 XSetWMProperties(display,window_info->id,&window_name,&icon_name,argv,argc,
8496 size_hints,manager_hints,class_hint);
8497 if (window_name.value != (void *) NULL)
8499 (void) XFree((void *) window_name.value);
8500 window_name.value=(unsigned char *) NULL;
8501 window_name.nitems=0;
8503 if (icon_name.value != (void *) NULL)
8505 (void) XFree((void *) icon_name.value);
8506 icon_name.value=(unsigned char *) NULL;
8509 atom_list[0]=XInternAtom(display,"WM_DELETE_WINDOW",MagickFalse);
8510 atom_list[1]=XInternAtom(display,"WM_TAKE_FOCUS",MagickFalse);
8511 (void) XSetWMProtocols(display,window_info->id,atom_list,2);
8512 (void) XFree((void *) size_hints);
8513 if (window_info->shape != MagickFalse)
8515 #if defined(MAGICKCORE_HAVE_SHAPE)
8521 Can we apply a non-rectangular shaping mask?
8525 if (XShapeQueryExtension(display,&error_base,&event_base) == 0)
8526 window_info->shape=MagickFalse;
8528 window_info->shape=MagickFalse;
8531 if (window_info->shared_memory)
8533 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
8535 Can we use shared memory with this window?
8537 if (XShmQueryExtension(display) == 0)
8538 window_info->shared_memory=MagickFalse;
8540 window_info->shared_memory=MagickFalse;
8543 window_info->image=NewImageList();
8544 window_info->destroy=MagickFalse;
8548 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8552 % X M a g i c k P r o g r e s s M o n i t o r %
8556 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8558 % XMagickProgressMonitor() displays the progress a task is making in
8559 % completing a task.
8561 % The format of the XMagickProgressMonitor method is:
8563 % void XMagickProgressMonitor(const char *task,
8564 % const MagickOffsetType quantum,const MagickSizeType span,
8565 % void *client_data)
8567 % A description of each parameter follows:
8569 % o task: Identifies the task in progress.
8571 % o quantum: Specifies the quantum position within the span which represents
8572 % how much progress has been made in completing a task.
8574 % o span: Specifies the span relative to completing a task.
8576 % o client_data: Pointer to any client data.
8580 static const char *GetLocaleMonitorMessage(const char *text)
8583 message[MagickPathExtent],
8584 tag[MagickPathExtent];
8592 (void) CopyMagickString(tag,text,MagickPathExtent);
8594 if (p != (char *) NULL)
8596 (void) FormatLocaleString(message,MagickPathExtent,"Monitor/%s",tag);
8597 locale_message=GetLocaleMessage(message);
8598 if (locale_message == message)
8600 return(locale_message);
8603 MagickPrivate MagickBooleanType XMagickProgressMonitor(const char *tag,
8604 const MagickOffsetType quantum,const MagickSizeType span,
8605 void *magick_unused(client_data))
8610 windows=XSetWindows((XWindows *) ~0);
8611 if (windows == (XWindows *) NULL)
8613 if (windows->info.mapped != MagickFalse)
8614 XProgressMonitorWidget(windows->display,windows,
8615 GetLocaleMonitorMessage(tag),quantum,span);
8620 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8624 % X Q u e r y C o l o r D a t a b a s e %
8628 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8630 % XQueryColorCompliance() looks up a RGB values for a color given in the target
8633 % The format of the XQueryColorDatabase method is:
8635 % MagickBooleanType XQueryColorCompliance(const char *target,XColor *color)
8637 % A description of each parameter follows:
8639 % o target: Specifies the color to lookup in the X color database.
8641 % o color: A pointer to an PixelInfo structure. The RGB value of the target
8642 % color is returned as this value.
8645 MagickPrivate MagickBooleanType XQueryColorCompliance(const char *target,
8652 *display = (Display *) NULL;
8661 Initialize color return value.
8663 assert(color != (XColor *) NULL);
8667 color->flags=(char) (DoRed | DoGreen | DoBlue);
8668 if ((target == (char *) NULL) || (*target == '\0'))
8669 target="#ffffffffffff";
8671 Let the X server define the color for us.
8673 if (display == (Display *) NULL)
8674 display=XOpenDisplay((char *) NULL);
8675 if (display == (Display *) NULL)
8677 ThrowXWindowException(XServerError,"ColorIsNotKnownToServer",target);
8678 return(MagickFalse);
8680 colormap=XDefaultColormap(display,XDefaultScreen(display));
8681 status=XParseColor(display,colormap,(char *) target,&xcolor);
8682 if (status == False)
8683 ThrowXWindowException(XServerError,"ColorIsNotKnownToServer",target)
8686 color->red=xcolor.red;
8687 color->green=xcolor.green;
8688 color->blue=xcolor.blue;
8689 color->flags=xcolor.flags;
8691 return(status != False ? MagickTrue : MagickFalse);
8695 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8699 % X Q u e r y P o s i t i o n %
8703 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8705 % XQueryPosition() gets the pointer coordinates relative to a window.
8707 % The format of the XQueryPosition method is:
8709 % void XQueryPosition(Display *display,const Window window,int *x,int *y)
8711 % A description of each parameter follows:
8713 % o display: Specifies a connection to an X server; returned from
8716 % o window: Specifies a pointer to a Window.
8718 % o x: Return the x coordinate of the pointer relative to the origin of the
8721 % o y: Return the y coordinate of the pointer relative to the origin of the
8725 MagickPrivate void XQueryPosition(Display *display,const Window window,int *x,
8738 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
8739 assert(display != (Display *) NULL);
8740 assert(window != (Window) NULL);
8741 assert(x != (int *) NULL);
8742 assert(y != (int *) NULL);
8743 (void) XQueryPointer(display,window,&root_window,&root_window,&x_root,&y_root,
8748 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8752 % X R e f r e s h W i n d o w %
8756 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8758 % XRefreshWindow() refreshes an image in a X window.
8760 % The format of the XRefreshWindow method is:
8762 % void XRefreshWindow(Display *display,const XWindowInfo *window,
8763 % const XEvent *event)
8765 % A description of each parameter follows:
8767 % o display: Specifies a connection to an X server; returned from
8770 % o window: Specifies a pointer to a XWindowInfo structure.
8772 % o event: Specifies a pointer to a XEvent structure. If it is NULL,
8773 % the entire image is refreshed.
8776 MagickPrivate void XRefreshWindow(Display *display,const XWindowInfo *window,
8777 const XEvent *event)
8787 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
8788 assert(display != (Display *) NULL);
8789 assert(window != (XWindowInfo *) NULL);
8790 if (window->ximage == (XImage *) NULL)
8792 if (event != (XEvent *) NULL)
8795 Determine geometry from expose event.
8799 width=(unsigned int) event->xexpose.width;
8800 height=(unsigned int) event->xexpose.height;
8808 Refresh entire window; discard outstanding expose events.
8812 width=window->width;
8813 height=window->height;
8814 while (XCheckTypedWindowEvent(display,window->id,Expose,&sans_event)) ;
8815 if (window->matte_pixmap != (Pixmap) NULL)
8817 #if defined(MAGICKCORE_HAVE_SHAPE)
8818 if (window->shape != MagickFalse)
8819 XShapeCombineMask(display,window->id,ShapeBounding,0,0,
8820 window->matte_pixmap,ShapeSet);
8825 Check boundary conditions.
8827 if ((window->ximage->width-(x+window->x)) < (int) width)
8828 width=(unsigned int) (window->ximage->width-(x+window->x));
8829 if ((window->ximage->height-(y+window->y)) < (int) height)
8830 height=(unsigned int) (window->ximage->height-(y+window->y));
8834 if (window->matte_pixmap != (Pixmap) NULL)
8835 (void) XSetClipMask(display,window->annotate_context,window->matte_pixmap);
8836 if (window->pixmap != (Pixmap) NULL)
8838 if (window->depth > 1)
8839 (void) XCopyArea(display,window->pixmap,window->id,
8840 window->annotate_context,x+window->x,y+window->y,width,height,x,y);
8842 (void) XCopyPlane(display,window->pixmap,window->id,
8843 window->highlight_context,x+window->x,y+window->y,width,height,x,y,
8848 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
8849 if (window->shared_memory)
8850 (void) XShmPutImage(display,window->id,window->annotate_context,
8851 window->ximage,x+window->x,y+window->y,x,y,width,height,MagickTrue);
8853 if (window->shared_memory == MagickFalse)
8854 (void) XPutImage(display,window->id,window->annotate_context,
8855 window->ximage,x+window->x,y+window->y,x,y,width,height);
8857 if (window->matte_pixmap != (Pixmap) NULL)
8858 (void) XSetClipMask(display,window->annotate_context,None);
8859 (void) XFlush(display);
8863 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8867 % X R e m o t e C o m m a n d %
8871 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8873 % XRemoteCommand() forces a remote display(1) to display the specified
8876 % The format of the XRemoteCommand method is:
8878 % MagickBooleanType XRemoteCommand(Display *display,const char *window,
8879 % const char *filename)
8881 % A description of each parameter follows:
8883 % o display: Specifies a connection to an X server; returned from
8886 % o window: Specifies the name or id of an X window.
8888 % o filename: the name of the image filename to display.
8891 MagickExport MagickBooleanType XRemoteCommand(Display *display,
8892 const char *window,const char *filename)
8901 assert(filename != (char *) NULL);
8902 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",filename);
8903 if (display == (Display *) NULL)
8904 display=XOpenDisplay((char *) NULL);
8905 if (display == (Display *) NULL)
8907 ThrowXWindowException(XServerError,"UnableToOpenXServer",filename);
8908 return(MagickFalse);
8910 remote_atom=XInternAtom(display,"IM_PROTOCOLS",MagickFalse);
8911 remote_window=(Window) NULL;
8912 root_window=XRootWindow(display,XDefaultScreen(display));
8913 if (window != (char *) NULL)
8916 Search window hierarchy and identify any clients by name or ID.
8918 if (isdigit((int) ((unsigned char) *window)) != 0)
8919 remote_window=XWindowByID(display,root_window,(Window)
8920 strtol((char *) window,(char **) NULL,0));
8921 if (remote_window == (Window) NULL)
8922 remote_window=XWindowByName(display,root_window,window);
8924 if (remote_window == (Window) NULL)
8925 remote_window=XWindowByProperty(display,root_window,remote_atom);
8926 if (remote_window == (Window) NULL)
8928 ThrowXWindowException(XServerError,"UnableToConnectToRemoteDisplay",
8930 return(MagickFalse);
8933 Send remote command.
8935 remote_atom=XInternAtom(display,"IM_REMOTE_COMMAND",MagickFalse);
8936 (void) XChangeProperty(display,remote_window,remote_atom,XA_STRING,8,
8937 PropModeReplace,(unsigned char *) filename,(int) strlen(filename));
8938 (void) XSync(display,MagickFalse);
8943 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8947 % X R e n d e r I m a g e %
8951 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8953 % XRenderImage() renders text on the image with an X11 font. It also returns
8954 % the bounding box of the text relative to the image.
8956 % The format of the XRenderImage method is:
8958 % MagickBooleanType XRenderImage(Image *image,DrawInfo *draw_info,
8959 % const PointInfo *offset,TypeMetric *metrics,ExceptionInfo *exception)
8961 % A description of each parameter follows:
8963 % o image: the image.
8965 % o draw_info: the draw info.
8967 % o offset: (x,y) location of text relative to image.
8969 % o metrics: bounding box of text.
8971 % o exception: return any errors or warnings in this structure.
8974 MagickPrivate MagickBooleanType XRenderImage(Image *image,
8975 const DrawInfo *draw_info,const PointInfo *offset,TypeMetric *metrics,
8976 ExceptionInfo *exception)
9019 Open X server connection.
9021 display=XOpenDisplay(draw_info->server_name);
9022 if (display == (Display *) NULL)
9024 ThrowXWindowException(XServerError,"UnableToOpenXServer",
9025 draw_info->server_name);
9026 return(MagickFalse);
9029 Get user defaults from X resource database.
9031 (void) XSetErrorHandler(XError);
9032 image_info=AcquireImageInfo();
9033 client_name=GetClientName();
9034 resource_database=XGetResourceDatabase(display,client_name);
9035 XGetResourceInfo(image_info,resource_database,client_name,&resource_info);
9036 resource_info.close_server=MagickFalse;
9037 resource_info.colormap=PrivateColormap;
9038 resource_info.font=AcquireString(draw_info->font);
9039 resource_info.background_color=AcquireString("#ffffffffffff");
9040 resource_info.foreground_color=AcquireString("#000000000000");
9041 map_info=XAllocStandardColormap();
9042 visual_info=(XVisualInfo *) NULL;
9043 font_info=(XFontStruct *) NULL;
9044 pixel.pixels=(unsigned long *) NULL;
9045 if (map_info == (XStandardColormap *) NULL)
9047 ThrowXWindowException(ResourceLimitError,"MemoryAllocationFailed",
9049 return(MagickFalse);
9052 Initialize visual info.
9054 visual_info=XBestVisualInfo(display,map_info,&resource_info);
9055 if (visual_info == (XVisualInfo *) NULL)
9057 XFreeResources(display,visual_info,map_info,&pixel,font_info,
9058 &resource_info,(XWindowInfo *) NULL);
9059 ThrowXWindowException(XServerError,"UnableToGetVisual",image->filename);
9060 return(MagickFalse);
9062 map_info->colormap=(Colormap) NULL;
9064 Initialize Standard Colormap info.
9066 XGetMapInfo(visual_info,XDefaultColormap(display,visual_info->screen),
9068 XGetPixelInfo(display,visual_info,map_info,&resource_info,(Image *) NULL,
9070 pixel.annotate_context=XDefaultGC(display,visual_info->screen);
9072 Initialize font info.
9074 font_info=XBestFont(display,&resource_info,MagickFalse);
9075 if (font_info == (XFontStruct *) NULL)
9077 XFreeResources(display,visual_info,map_info,&pixel,font_info,
9078 &resource_info,(XWindowInfo *) NULL);
9079 ThrowXWindowException(XServerError,"UnableToLoadFont",draw_info->font);
9080 return(MagickFalse);
9082 cache_info=(*draw_info);
9084 Initialize annotate info.
9086 XGetAnnotateInfo(&annotate_info);
9087 annotate_info.stencil=ForegroundStencil;
9088 if (cache_info.font != draw_info->font)
9091 Type name has changed.
9093 (void) XFreeFont(display,font_info);
9094 (void) CloneString(&resource_info.font,draw_info->font);
9095 font_info=XBestFont(display,&resource_info,MagickFalse);
9096 if (font_info == (XFontStruct *) NULL)
9098 ThrowXWindowException(XServerError,"UnableToLoadFont",
9100 return(MagickFalse);
9103 if (image->debug != MagickFalse)
9104 (void) LogMagickEvent(AnnotateEvent,GetMagickModule(),
9105 "Font %s; pointsize %g",draw_info->font != (char *) NULL ?
9106 draw_info->font : "none",draw_info->pointsize);
9107 cache_info=(*draw_info);
9108 annotate_info.font_info=font_info;
9109 annotate_info.text=(char *) draw_info->text;
9110 annotate_info.width=(unsigned int) XTextWidth(font_info,draw_info->text,(int)
9111 strlen(draw_info->text));
9112 annotate_info.height=(unsigned int) font_info->ascent+font_info->descent;
9113 metrics->pixels_per_em.x=(double) font_info->max_bounds.width;
9114 metrics->pixels_per_em.y=(double) font_info->ascent+font_info->descent;
9115 metrics->ascent=(double) font_info->ascent+4;
9116 metrics->descent=(double) (-font_info->descent);
9117 metrics->width=annotate_info.width/ExpandAffine(&draw_info->affine);
9118 metrics->height=(double) font_info->ascent+font_info->descent;
9119 metrics->max_advance=(double) font_info->max_bounds.width;
9120 metrics->bounds.x1=0.0;
9121 metrics->bounds.y1=metrics->descent;
9122 metrics->bounds.x2=metrics->ascent+metrics->descent;
9123 metrics->bounds.y2=metrics->ascent+metrics->descent;
9124 metrics->underline_position=(-2.0);
9125 metrics->underline_thickness=1.0;
9126 if (draw_info->render == MagickFalse)
9128 if (draw_info->fill.alpha == TransparentAlpha)
9133 width=annotate_info.width;
9134 height=annotate_info.height;
9135 if ((fabs(draw_info->affine.rx) >= MagickEpsilon) ||
9136 (fabs(draw_info->affine.ry) >= MagickEpsilon))
9138 if ((fabs(draw_info->affine.sx-draw_info->affine.sy) < MagickEpsilon) &&
9139 (fabs(draw_info->affine.rx+draw_info->affine.ry) < MagickEpsilon))
9140 annotate_info.degrees=(double) (180.0/MagickPI)*
9141 atan2(draw_info->affine.rx,draw_info->affine.sx);
9143 (void) FormatLocaleString(annotate_info.geometry,MagickPathExtent,
9144 "%.20gx%.20g%+.20g%+.20g",(double) width,(double) height,
9145 ceil(offset->x-0.5),ceil(offset->y-metrics->ascent-metrics->descent+
9146 draw_info->interline_spacing-0.5));
9147 pixel.pen_color.red=ScaleQuantumToShort(
9148 ClampToQuantum(draw_info->fill.red));
9149 pixel.pen_color.green=ScaleQuantumToShort(
9150 ClampToQuantum(draw_info->fill.green));
9151 pixel.pen_color.blue=ScaleQuantumToShort(
9152 ClampToQuantum(draw_info->fill.blue));
9153 status=XAnnotateImage(display,&pixel,&annotate_info,image,exception);
9156 ThrowXWindowException(ResourceLimitError,"MemoryAllocationFailed",
9158 return(MagickFalse);
9164 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9168 % X R e t a i n W i n d o w C o l o r s %
9172 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9174 % XRetainWindowColors() sets X11 color resources on a window. This preserves
9175 % the colors associated with an image displayed on the window.
9177 % The format of the XRetainWindowColors method is:
9179 % void XRetainWindowColors(Display *display,const Window window)
9181 % A description of each parameter follows:
9183 % o display: Specifies a connection to an X server; returned from
9186 % o window: Specifies a pointer to a XWindowInfo structure.
9189 MagickExport void XRetainWindowColors(Display *display,const Window window)
9198 Put property on the window.
9200 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
9201 assert(display != (Display *) NULL);
9202 assert(window != (Window) NULL);
9203 property=XInternAtom(display,"_XSETROOT_ID",MagickFalse);
9204 if (property == (Atom) NULL)
9206 ThrowXWindowException(XServerError,"UnableToCreateProperty",
9210 pixmap=XCreatePixmap(display,window,1,1,1);
9211 if (pixmap == (Pixmap) NULL)
9213 ThrowXWindowException(XServerError,"UnableToCreateBitmap","");
9216 (void) XChangeProperty(display,window,property,XA_PIXMAP,32,PropModeReplace,
9217 (unsigned char *) &pixmap,1);
9218 (void) XSetCloseDownMode(display,RetainPermanent);
9222 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9226 % X S e l e c t W i n d o w %
9230 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9232 % XSelectWindow() allows a user to select a window using the mouse. If the
9233 % mouse moves, a cropping rectangle is drawn and the extents of the rectangle
9234 % is returned in the crop_info structure.
9236 % The format of the XSelectWindow function is:
9238 % target_window=XSelectWindow(display,crop_info)
9240 % A description of each parameter follows:
9242 % o window: XSelectWindow returns the window id.
9244 % o display: Specifies a pointer to the Display structure; returned from
9247 % o crop_info: Specifies a pointer to a RectangleInfo structure. It
9248 % contains the extents of any cropping rectangle.
9251 static Window XSelectWindow(Display *display,RectangleInfo *crop_info)
9253 #define MinimumCropArea (unsigned int) 9
9280 Initialize graphic context.
9282 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
9283 assert(display != (Display *) NULL);
9284 assert(crop_info != (RectangleInfo *) NULL);
9285 root_window=XRootWindow(display,XDefaultScreen(display));
9286 context_values.background=XBlackPixel(display,XDefaultScreen(display));
9287 context_values.foreground=XWhitePixel(display,XDefaultScreen(display));
9288 context_values.function=GXinvert;
9289 context_values.plane_mask=
9290 context_values.background ^ context_values.foreground;
9291 context_values.subwindow_mode=IncludeInferiors;
9292 annotate_context=XCreateGC(display,root_window,(size_t) (GCBackground |
9293 GCForeground | GCFunction | GCSubwindowMode),&context_values);
9294 if (annotate_context == (GC) NULL)
9295 return(MagickFalse);
9297 Grab the pointer using target cursor.
9299 target_cursor=XMakeCursor(display,root_window,XDefaultColormap(display,
9300 XDefaultScreen(display)),(char * ) "white",(char * ) "black");
9301 status=XGrabPointer(display,root_window,MagickFalse,(unsigned int)
9302 (ButtonPressMask | ButtonReleaseMask | ButtonMotionMask),GrabModeSync,
9303 GrabModeAsync,root_window,target_cursor,CurrentTime);
9304 if (status != GrabSuccess)
9306 ThrowXWindowException(XServerError,"UnableToGrabMouse","");
9307 return((Window) NULL);
9313 crop_info->height=0;
9315 target_window=(Window) NULL;
9320 if ((crop_info->width*crop_info->height) >= MinimumCropArea)
9321 (void) XDrawRectangle(display,root_window,annotate_context,
9322 (int) crop_info->x,(int) crop_info->y,(unsigned int) crop_info->width-1,
9323 (unsigned int) crop_info->height-1);
9325 Allow another event.
9327 (void) XAllowEvents(display,SyncPointer,CurrentTime);
9328 (void) XWindowEvent(display,root_window,ButtonPressMask |
9329 ButtonReleaseMask | ButtonMotionMask,&event);
9330 if ((crop_info->width*crop_info->height) >= MinimumCropArea)
9331 (void) XDrawRectangle(display,root_window,annotate_context,
9332 (int) crop_info->x,(int) crop_info->y,(unsigned int) crop_info->width-1,
9333 (unsigned int) crop_info->height-1);
9338 target_window=XGetSubwindow(display,event.xbutton.subwindow,
9339 event.xbutton.x,event.xbutton.y);
9340 if (target_window == (Window) NULL)
9341 target_window=root_window;
9342 x_offset=event.xbutton.x_root;
9343 y_offset=event.xbutton.y_root;
9344 crop_info->x=(ssize_t) x_offset;
9345 crop_info->y=(ssize_t) y_offset;
9347 crop_info->height=0;
9359 Discard pending button motion events.
9361 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
9362 crop_info->x=(ssize_t) event.xmotion.x;
9363 crop_info->y=(ssize_t) event.xmotion.y;
9365 Check boundary conditions.
9367 if ((int) crop_info->x < x_offset)
9368 crop_info->width=(size_t) (x_offset-crop_info->x);
9371 crop_info->width=(size_t) (crop_info->x-x_offset);
9372 crop_info->x=(ssize_t) x_offset;
9374 if ((int) crop_info->y < y_offset)
9375 crop_info->height=(size_t) (y_offset-crop_info->y);
9378 crop_info->height=(size_t) (crop_info->y-y_offset);
9379 crop_info->y=(ssize_t) y_offset;
9385 } while ((target_window == (Window) NULL) || (presses > 0));
9386 (void) XUngrabPointer(display,CurrentTime);
9387 (void) XFreeCursor(display,target_cursor);
9388 (void) XFreeGC(display,annotate_context);
9389 if ((crop_info->width*crop_info->height) < MinimumCropArea)
9392 crop_info->height=0;
9394 if ((crop_info->width != 0) && (crop_info->height != 0))
9395 target_window=root_window;
9396 return(target_window);
9400 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9404 % X S e t C u r s o r S t a t e %
9408 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9410 % XSetCursorState() sets the cursor state to busy, otherwise the cursor are
9411 % reset to their default.
9413 % The format of the XXSetCursorState method is:
9415 % XSetCursorState(display,windows,const MagickStatusType state)
9417 % A description of each parameter follows:
9419 % o display: Specifies a connection to an X server; returned from
9422 % o windows: Specifies a pointer to a XWindows structure.
9424 % o state: An unsigned integer greater than 0 sets the cursor state
9425 % to busy, otherwise the cursor are reset to their default.
9428 MagickPrivate void XSetCursorState(Display *display,XWindows *windows,
9429 const MagickStatusType state)
9431 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
9432 assert(display != (Display *) NULL);
9433 assert(windows != (XWindows *) NULL);
9436 (void) XCheckDefineCursor(display,windows->image.id,
9437 windows->image.busy_cursor);
9438 (void) XCheckDefineCursor(display,windows->pan.id,
9439 windows->pan.busy_cursor);
9440 (void) XCheckDefineCursor(display,windows->magnify.id,
9441 windows->magnify.busy_cursor);
9442 (void) XCheckDefineCursor(display,windows->command.id,
9443 windows->command.busy_cursor);
9447 (void) XCheckDefineCursor(display,windows->image.id,
9448 windows->image.cursor);
9449 (void) XCheckDefineCursor(display,windows->pan.id,windows->pan.cursor);
9450 (void) XCheckDefineCursor(display,windows->magnify.id,
9451 windows->magnify.cursor);
9452 (void) XCheckDefineCursor(display,windows->command.id,
9453 windows->command.cursor);
9454 (void) XCheckDefineCursor(display,windows->command.id,
9455 windows->widget.cursor);
9456 (void) XWithdrawWindow(display,windows->info.id,windows->info.screen);
9458 windows->info.mapped=MagickFalse;
9462 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9466 % X S e t W i n d o w s %
9470 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9472 % XSetWindows() sets the X windows structure if the windows info is specified.
9473 % Otherwise the current windows structure is returned.
9475 % The format of the XSetWindows method is:
9477 % XWindows *XSetWindows(XWindows *windows_info)
9479 % A description of each parameter follows:
9481 % o windows_info: Initialize the Windows structure with this information.
9484 MagickPrivate XWindows *XSetWindows(XWindows *windows_info)
9487 *windows = (XWindows *) NULL;
9489 if (windows_info != (XWindows *) ~0)
9491 windows=(XWindows *) RelinquishMagickMemory(windows);
9492 windows=windows_info;
9497 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9501 % X U s e r P r e f e r e n c e s %
9505 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9507 % XUserPreferences() saves the preferences in a configuration file in the
9508 % users' home directory.
9510 % The format of the XUserPreferences method is:
9512 % void XUserPreferences(XResourceInfo *resource_info)
9514 % A description of each parameter follows:
9516 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
9519 MagickPrivate void XUserPreferences(XResourceInfo *resource_info)
9521 #if defined(X11_PREFERENCES_PATH)
9523 cache[MagickPathExtent],
9524 filename[MagickPathExtent],
9525 specifier[MagickPathExtent];
9532 preferences_database;
9535 Save user preferences to the client configuration file.
9537 assert(resource_info != (XResourceInfo *) NULL);
9538 client_name=GetClientName();
9539 preferences_database=XrmGetStringDatabase("");
9540 (void) FormatLocaleString(specifier,MagickPathExtent,"%s.backdrop",client_name);
9541 value=resource_info->backdrop ? "True" : "False";
9542 XrmPutStringResource(&preferences_database,specifier,(char *) value);
9543 (void) FormatLocaleString(specifier,MagickPathExtent,"%s.colormap",client_name);
9544 value=resource_info->colormap == SharedColormap ? "Shared" : "Private";
9545 XrmPutStringResource(&preferences_database,specifier,(char *) value);
9546 (void) FormatLocaleString(specifier,MagickPathExtent,"%s.confirmExit",
9548 value=resource_info->confirm_exit ? "True" : "False";
9549 XrmPutStringResource(&preferences_database,specifier,(char *) value);
9550 (void) FormatLocaleString(specifier,MagickPathExtent,"%s.confirmEdit",
9552 value=resource_info->confirm_edit ? "True" : "False";
9553 XrmPutStringResource(&preferences_database,specifier,(char *) value);
9554 (void) FormatLocaleString(specifier,MagickPathExtent,"%s.displayWarnings",
9556 value=resource_info->display_warnings ? "True" : "False";
9557 XrmPutStringResource(&preferences_database,specifier,(char *) value);
9558 (void) FormatLocaleString(specifier,MagickPathExtent,"%s.dither",client_name);
9559 value=resource_info->quantize_info->dither_method != NoDitherMethod ?
9561 XrmPutStringResource(&preferences_database,specifier,(char *) value);
9562 (void) FormatLocaleString(specifier,MagickPathExtent,"%s.gammaCorrect",
9564 value=resource_info->gamma_correct ? "True" : "False";
9565 XrmPutStringResource(&preferences_database,specifier,(char *) value);
9566 (void) FormatLocaleString(specifier,MagickPathExtent,"%s.undoCache",client_name);
9567 (void) FormatLocaleString(cache,MagickPathExtent,"%.20g",(double)
9568 resource_info->undo_cache);
9569 XrmPutStringResource(&preferences_database,specifier,cache);
9570 (void) FormatLocaleString(specifier,MagickPathExtent,"%s.usePixmap",client_name);
9571 value=resource_info->use_pixmap ? "True" : "False";
9572 XrmPutStringResource(&preferences_database,specifier,(char *) value);
9573 (void) FormatLocaleString(filename,MagickPathExtent,"%s%src",
9574 X11_PREFERENCES_PATH,client_name);
9575 ExpandFilename(filename);
9576 XrmPutFileDatabase(preferences_database,filename);
9581 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9585 % X V i s u a l C l a s s N a m e %
9589 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9591 % XVisualClassName() returns the visual class name as a character string.
9593 % The format of the XVisualClassName method is:
9595 % char *XVisualClassName(const int visual_class)
9597 % A description of each parameter follows:
9599 % o visual_type: XVisualClassName returns the visual class as a character
9602 % o class: Specifies the visual class.
9605 static const char *XVisualClassName(const int visual_class)
9607 switch (visual_class)
9609 case StaticGray: return("StaticGray");
9610 case GrayScale: return("GrayScale");
9611 case StaticColor: return("StaticColor");
9612 case PseudoColor: return("PseudoColor");
9613 case TrueColor: return("TrueColor");
9614 case DirectColor: return("DirectColor");
9616 return("unknown visual class");
9620 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9628 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9630 % XWarning() displays a warning reason in a Notice widget.
9632 % The format of the XWarning method is:
9634 % void XWarning(const unsigned int warning,const char *reason,
9635 % const char *description)
9637 % A description of each parameter follows:
9639 % o warning: Specifies the numeric warning category.
9641 % o reason: Specifies the reason to display before terminating the
9644 % o description: Specifies any description to the reason.
9647 MagickPrivate void XWarning(const ExceptionType magick_unused(warning),
9648 const char *reason,const char *description)
9651 text[MagickPathExtent];
9656 if (reason == (char *) NULL)
9658 (void) CopyMagickString(text,reason,MagickPathExtent);
9659 (void) ConcatenateMagickString(text,":",MagickPathExtent);
9660 windows=XSetWindows((XWindows *) ~0);
9661 XNoticeWidget(windows->display,windows,text,(char *) description);
9665 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9669 % X W i n d o w B y I D %
9673 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9675 % XWindowByID() locates a child window with a given ID. If not window with
9676 % the given name is found, 0 is returned. Only the window specified and its
9677 % subwindows are searched.
9679 % The format of the XWindowByID function is:
9681 % child=XWindowByID(display,window,id)
9683 % A description of each parameter follows:
9685 % o child: XWindowByID returns the window with the specified
9686 % id. If no windows are found, XWindowByID returns 0.
9688 % o display: Specifies a pointer to the Display structure; returned from
9691 % o id: Specifies the id of the window to locate.
9694 MagickPrivate Window XWindowByID(Display *display,const Window root_window,
9714 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
9715 assert(display != (Display *) NULL);
9716 assert(root_window != (Window) NULL);
9718 return(XSelectWindow(display,&rectangle_info));
9719 if (root_window == id)
9720 return(root_window);
9721 status=XQueryTree(display,root_window,&child,&child,&children,
9723 if (status == False)
9724 return((Window) NULL);
9725 window=(Window) NULL;
9726 for (i=0; i < (int) number_children; i++)
9729 Search each child and their children.
9731 window=XWindowByID(display,children[i],id);
9732 if (window != (Window) NULL)
9735 if (children != (Window *) NULL)
9736 (void) XFree((void *) children);
9741 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9745 % X W i n d o w B y N a m e %
9749 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9751 % XWindowByName() locates a window with a given name on a display. If no
9752 % window with the given name is found, 0 is returned. If more than one window
9753 % has the given name, the first one is returned. Only root and its children
9756 % The format of the XWindowByName function is:
9758 % window=XWindowByName(display,root_window,name)
9760 % A description of each parameter follows:
9762 % o window: XWindowByName returns the window id.
9764 % o display: Specifies a pointer to the Display structure; returned from
9767 % o root_window: Specifies the id of the root window.
9769 % o name: Specifies the name of the window to locate.
9772 MagickPrivate Window XWindowByName(Display *display,const Window root_window,
9792 assert(display != (Display *) NULL);
9793 assert(root_window != (Window) NULL);
9794 assert(name != (char *) NULL);
9795 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",name);
9796 if (XGetWMName(display,root_window,&window_name) != 0)
9797 if (LocaleCompare((char *) window_name.value,name) == 0)
9798 return(root_window);
9799 status=XQueryTree(display,root_window,&child,&child,&children,
9801 if (status == False)
9802 return((Window) NULL);
9803 window=(Window) NULL;
9804 for (i=0; i < (int) number_children; i++)
9807 Search each child and their children.
9809 window=XWindowByName(display,children[i],name);
9810 if (window != (Window) NULL)
9813 if (children != (Window *) NULL)
9814 (void) XFree((void *) children);
9819 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9823 % X W i n d o w B y P r o p e r y %
9827 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9829 % XWindowByProperty() locates a child window with a given property. If not
9830 % window with the given name is found, 0 is returned. If more than one window
9831 % has the given property, the first one is returned. Only the window
9832 % specified and its subwindows are searched.
9834 % The format of the XWindowByProperty function is:
9836 % child=XWindowByProperty(display,window,property)
9838 % A description of each parameter follows:
9840 % o child: XWindowByProperty returns the window id with the specified
9841 % property. If no windows are found, XWindowByProperty returns 0.
9843 % o display: Specifies a pointer to the Display structure; returned from
9846 % o property: Specifies the property of the window to locate.
9849 MagickPrivate Window XWindowByProperty(Display *display,const Window window,
9850 const Atom property)
9878 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
9879 assert(display != (Display *) NULL);
9880 assert(window != (Window) NULL);
9881 assert(property != (Atom) NULL);
9882 status=XQueryTree(display,window,&root,&parent,&children,&number_children);
9883 if (status == False)
9884 return((Window) NULL);
9886 child=(Window) NULL;
9887 for (i=0; (i < number_children) && (child == (Window) NULL); i++)
9889 status=XGetWindowProperty(display,children[i],property,0L,0L,MagickFalse,
9890 (Atom) AnyPropertyType,&type,&format,&number_items,&after,&data);
9892 (void) XFree((void *) data);
9893 if ((status == Success) && (type != (Atom) NULL))
9896 for (i=0; (i < number_children) && (child == (Window) NULL); i++)
9897 child=XWindowByProperty(display,children[i],property);
9898 if (children != (Window *) NULL)
9899 (void) XFree((void *) children);
9905 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9909 % X I m p o r t I m a g e %
9913 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9915 % XImportImage() reads an image from an X window.
9917 % The format of the XImportImage method is:
9919 % Image *XImportImage(const ImageInfo *image_info,XImportInfo *ximage_info,
9920 % ExceptionInfo *exception)
9922 % A description of each parameter follows:
9924 % o image_info: the image info..
9926 % o ximage_info: Specifies a pointer to an XImportInfo structure.
9928 % o exception: return any errors or warnings in this structure.
9931 MagickExport Image *XImportImage(const ImageInfo *image_info,
9932 XImportInfo *ximage_info,ExceptionInfo *exception)
9934 assert(image_info != (const ImageInfo *) NULL);
9935 assert(image_info->signature == MagickCoreSignature);
9936 if (image_info->debug != MagickFalse)
9937 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
9938 image_info->filename);
9939 assert(ximage_info != (XImportInfo *) NULL);
9940 assert(exception != (ExceptionInfo *) NULL);
9941 assert(exception->signature == MagickCoreSignature);
9943 return((Image *) NULL);
9947 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9951 % X R e n d e r X 1 1 %
9955 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9957 % XRenderImage() renders text on the image with an X11 font. It also returns
9958 % the bounding box of the text relative to the image.
9960 % The format of the XRenderImage method is:
9962 % MagickBooleanType XRenderImage(Image *image,DrawInfo *draw_info,
9963 % const PointInfo *offset,TypeMetric *metrics,ExceptionInfo *exception)
9965 % A description of each parameter follows:
9967 % o image: the image.
9969 % o draw_info: the draw info.
9971 % o offset: (x,y) location of text relative to image.
9973 % o metrics: bounding box of text.
9975 % o exception: return any errors or warnings in this structure.
9978 MagickPrivate MagickBooleanType XRenderImage(Image *image,
9979 const DrawInfo *draw_info,const PointInfo *offset,TypeMetric *metrics,
9980 ExceptionInfo *exception)
9985 (void) ThrowMagickException(exception,GetMagickModule(),
9986 MissingDelegateError,"DelegateLibrarySupportNotBuiltIn","'%s' (X11)",
9988 return(MagickFalse);
9993 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9997 + X C o m p o n e n t G e n e s i s %
10001 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10003 % XComponentGenesis() instantiates the X component.
10005 % The format of the XComponentGenesis method is:
10007 % MagickBooleanType XComponentGenesis(void)
10010 MagickPrivate MagickBooleanType XComponentGenesis(void)
10012 return(MagickTrue);
10016 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10020 % X G e t I m p o r t I n f o %
10024 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10026 % XGetImportInfo() initializes the XImportInfo structure.
10028 % The format of the XGetImportInfo method is:
10030 % void XGetImportInfo(XImportInfo *ximage_info)
10032 % A description of each parameter follows:
10034 % o ximage_info: Specifies a pointer to an ImageInfo structure.
10037 MagickExport void XGetImportInfo(XImportInfo *ximage_info)
10039 assert(ximage_info != (XImportInfo *) NULL);
10040 ximage_info->frame=MagickFalse;
10041 ximage_info->borders=MagickFalse;
10042 ximage_info->screen=MagickFalse;
10043 ximage_info->descend=MagickTrue;
10044 ximage_info->silent=MagickFalse;