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-2017 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://www.imagemagick.org/script/license.php %
28 % Unless required by applicable law or agreed to in writing, software %
29 % distributed under the License is distributed on an "AS IS" BASIS, %
30 % WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %
31 % See the License for the specific language governing permissions and %
32 % limitations under the License. %
34 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
42 #include "MagickCore/studio.h"
43 #include "MagickCore/animate.h"
44 #include "MagickCore/artifact.h"
45 #include "MagickCore/blob.h"
46 #include "MagickCore/cache.h"
47 #include "MagickCore/client.h"
48 #include "MagickCore/color.h"
49 #include "MagickCore/color-private.h"
50 #include "MagickCore/colormap.h"
51 #include "MagickCore/composite.h"
52 #include "MagickCore/constitute.h"
53 #include "MagickCore/display.h"
54 #include "MagickCore/distort.h"
55 #include "MagickCore/exception.h"
56 #include "MagickCore/exception-private.h"
57 #include "MagickCore/geometry.h"
58 #include "MagickCore/identify.h"
59 #include "MagickCore/image.h"
60 #include "MagickCore/image-private.h"
61 #include "MagickCore/list.h"
62 #include "MagickCore/locale_.h"
63 #include "MagickCore/log.h"
64 #include "MagickCore/magick.h"
65 #include "MagickCore/memory_.h"
66 #include "MagickCore/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 client_event.type=ClientMessage;
1556 client_event.window=window;
1557 client_event.message_type=protocol;
1558 client_event.format=32;
1559 client_event.data.l[0]=(long) reason;
1560 client_event.data.l[1]=(long) timestamp;
1561 (void) XSendEvent(display,window,MagickFalse,NoEventMask,(XEvent *) &client_event);
1565 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1569 + X C l i e n t W i n d o w %
1573 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1575 % XClientWindow() finds a window, at or below the specified window, which has
1576 % a WM_STATE property. If such a window is found, it is returned, otherwise
1577 % the argument window is returned.
1579 % The format of the XClientWindow function is:
1581 % client_window=XClientWindow(display,target_window)
1583 % A description of each parameter follows:
1585 % o client_window: XClientWindow returns a window, at or below the specified
1586 % window, which has a WM_STATE property otherwise the argument
1587 % target_window is returned.
1589 % o display: Specifies a pointer to the Display structure; returned from
1592 % o target_window: Specifies the window to find a WM_STATE property.
1595 static Window XClientWindow(Display *display,Window target_window)
1617 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1618 assert(display != (Display *) NULL);
1619 state=XInternAtom(display,"WM_STATE",MagickTrue);
1620 if (state == (Atom) NULL)
1621 return(target_window);
1623 status=XGetWindowProperty(display,target_window,state,0L,0L,MagickFalse,
1624 (Atom) AnyPropertyType,&type,&format,&number_items,&after,&data);
1625 if ((status == Success) && (type != (Atom) NULL))
1626 return(target_window);
1627 client_window=XWindowByProperty(display,target_window,state);
1628 if (client_window == (Window) NULL)
1629 return(target_window);
1630 return(client_window);
1634 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1638 + X C o m p o n e n t T e r m i n u s %
1642 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1644 % XComponentTerminus() destroys the module component.
1646 % The format of the XComponentTerminus method is:
1648 % XComponentTerminus(void)
1651 MagickPrivate void XComponentTerminus(void)
1653 DestroyXResources();
1657 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1661 % X C o n f i g u r e I m a g e C o l o r m a p %
1665 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1667 % XConfigureImageColormap() creates a new X colormap.
1669 % The format of the XConfigureImageColormap method is:
1671 % void XConfigureImageColormap(Display *display,
1672 % XResourceInfo *resource_info,XWindows *windows,Image *image,
1673 % ExceptionInfo *exception)
1675 % A description of each parameter follows:
1677 % o display: Specifies a connection to an X server; returned from
1680 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
1682 % o windows: Specifies a pointer to a XWindows structure.
1684 % o image: the image.
1686 % o exception: return any errors or warnings in this structure.
1689 MagickPrivate void XConfigureImageColormap(Display *display,
1690 XResourceInfo *resource_info,XWindows *windows,Image *image,
1691 ExceptionInfo *exception)
1697 Make standard colormap.
1699 XSetCursorState(display,windows,MagickTrue);
1700 XCheckRefreshWindows(display,windows);
1701 XMakeStandardColormap(display,windows->visual_info,resource_info,image,
1702 windows->map_info,windows->pixel_info,exception);
1703 colormap=windows->map_info->colormap;
1704 (void) XSetWindowColormap(display,windows->image.id,colormap);
1705 (void) XSetWindowColormap(display,windows->command.id,colormap);
1706 (void) XSetWindowColormap(display,windows->widget.id,colormap);
1707 if (windows->magnify.mapped != MagickFalse)
1708 (void) XSetWindowColormap(display,windows->magnify.id,colormap);
1709 if (windows->pan.mapped != MagickFalse)
1710 (void) XSetWindowColormap(display,windows->pan.id,colormap);
1711 XSetCursorState(display,windows,MagickFalse);
1712 XClientMessage(display,windows->image.id,windows->im_protocols,
1713 windows->im_update_colormap,CurrentTime);
1717 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1721 % X C o n s t r a i n W i n d o w P o s i t i o n %
1725 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1727 % XConstrainWindowPosition() assures a window is positioned within the X
1728 % server boundaries.
1730 % The format of the XConstrainWindowPosition method is:
1732 % void XConstrainWindowPosition(Display *display,XWindowInfo *window_info)
1734 % A description of each parameter follows:
1736 % o display: Specifies a pointer to the Display structure; returned from
1739 % o window_info: Specifies a pointer to a XWindowInfo structure.
1742 MagickPrivate void XConstrainWindowPosition(Display *display,
1743 XWindowInfo *window_info)
1748 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1749 assert(display != (Display *) NULL);
1750 assert(window_info != (XWindowInfo *) NULL);
1751 limit=XDisplayWidth(display,window_info->screen)-window_info->width;
1752 if (window_info->x < 0)
1755 if (window_info->x > (int) limit)
1756 window_info->x=(int) limit;
1757 limit=XDisplayHeight(display,window_info->screen)-window_info->height;
1758 if (window_info->y < 0)
1761 if (window_info->y > limit)
1762 window_info->y=limit;
1766 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1774 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1776 % XDelay() suspends program execution for the number of milliseconds
1779 % The format of the Delay method is:
1781 % void XDelay(Display *display,const size_t milliseconds)
1783 % A description of each parameter follows:
1785 % o display: Specifies a pointer to the Display structure; returned from
1788 % o milliseconds: Specifies the number of milliseconds to delay before
1792 MagickPrivate void XDelay(Display *display,const size_t milliseconds)
1794 assert(display != (Display *) NULL);
1795 (void) XFlush(display);
1796 MagickDelay(milliseconds);
1800 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1804 % X D e s t r o y R e s o u r c e I n f o %
1808 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1810 % XDestroyResourceInfo() frees memory associated with the XResourceInfo
1813 % The format of the XDestroyResourceInfo method is:
1815 % void XDestroyResourceInfo(XResourceInfo *resource_info)
1817 % A description of each parameter follows:
1819 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
1822 MagickExport void XDestroyResourceInfo(XResourceInfo *resource_info)
1824 if (resource_info->image_geometry != (char *) NULL)
1825 resource_info->image_geometry=(char *)
1826 RelinquishMagickMemory(resource_info->image_geometry);
1827 if (resource_info->quantize_info != (QuantizeInfo *) NULL)
1828 resource_info->quantize_info=DestroyQuantizeInfo(
1829 resource_info->quantize_info);
1830 if (resource_info->client_name != (char *) NULL)
1831 resource_info->client_name=(char *)
1832 RelinquishMagickMemory(resource_info->client_name);
1833 if (resource_info->name != (char *) NULL)
1834 resource_info->name=DestroyString(resource_info->name);
1835 (void) ResetMagickMemory(resource_info,0,sizeof(*resource_info));
1839 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1843 % X D e s t r o y W i n d o w C o l o r s %
1847 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1849 % XDestroyWindowColors() frees X11 color resources previously saved on a
1850 % window by XRetainWindowColors or programs like xsetroot.
1852 % The format of the XDestroyWindowColors method is:
1854 % void XDestroyWindowColors(Display *display,Window window)
1856 % A description of each parameter follows:
1858 % o display: Specifies a connection to an X server; returned from
1861 % o window: Specifies a pointer to a Window structure.
1864 MagickPrivate void XDestroyWindowColors(Display *display,Window window)
1884 If there are previous resources on the root window, destroy them.
1886 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1887 assert(display != (Display *) NULL);
1888 property=XInternAtom(display,"_XSETROOT_ID",MagickFalse);
1889 if (property == (Atom) NULL)
1891 ThrowXWindowException(XServerError,"UnableToCreateProperty",
1895 status=XGetWindowProperty(display,window,property,0L,1L,MagickTrue,
1896 (Atom) AnyPropertyType,&type,&format,&length,&after,&data);
1897 if (status != Success)
1899 if ((type == XA_PIXMAP) && (format == 32) && (length == 1) && (after == 0))
1901 (void) XKillClient(display,(XID) (*((Pixmap *) data)));
1902 (void) XDeleteProperty(display,window,property);
1905 (void) XFree((void *) data);
1909 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1913 % X D i s p l a y I m a g e I n f o %
1917 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1919 % XDisplayImageInfo() displays information about an X image.
1921 % The format of the XDisplayImageInfo method is:
1923 % void XDisplayImageInfo(Display *display,
1924 % const XResourceInfo *resource_info,XWindows *windows,Image *undo_image,
1925 % Image *image,ExceptionInfo *exception)
1927 % A description of each parameter follows:
1929 % o display: Specifies a connection to an X server; returned from
1932 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
1934 % o windows: Specifies a pointer to a XWindows structure.
1936 % o undo_image: the undo image.
1938 % o image: the image.
1940 % o exception: return any errors or warnings in this structure.
1943 MagickPrivate void XDisplayImageInfo(Display *display,
1944 const XResourceInfo *resource_info,XWindows *windows,Image *undo_image,
1945 Image *image,ExceptionInfo *exception)
1948 filename[MagickPathExtent],
1971 Write info about the X server to a file.
1973 assert(display != (Display *) NULL);
1974 assert(resource_info != (XResourceInfo *) NULL);
1975 assert(windows != (XWindows *) NULL);
1976 assert(image != (Image *) NULL);
1978 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
1980 unique_file=AcquireUniqueFileResource(filename);
1981 if (unique_file != -1)
1982 file=fdopen(unique_file,"w");
1983 if ((unique_file == -1) || (file == (FILE *) NULL))
1985 XNoticeWidget(display,windows,"Unable to display image info",filename);
1988 if (resource_info->gamma_correct != MagickFalse)
1989 if (resource_info->display_gamma != (char *) NULL)
1990 (void) FormatLocaleFile(file,"Display\n gamma: %s\n\n",
1991 resource_info->display_gamma);
1993 Write info about the X image to a file.
1995 (void) FormatLocaleFile(file,"X\n visual: %s\n",
1996 XVisualClassName((int) windows->image.storage_class));
1997 (void) FormatLocaleFile(file," depth: %d\n",windows->image.ximage->depth);
1998 if (windows->visual_info->colormap_size != 0)
1999 (void) FormatLocaleFile(file," colormap size: %d\n",
2000 windows->visual_info->colormap_size);
2001 if (resource_info->colormap== SharedColormap)
2002 (void) FormatLocaleFile(file," colormap type: Shared\n");
2004 (void) FormatLocaleFile(file," colormap type: Private\n");
2005 (void) FormatLocaleFile(file," geometry: %dx%d\n",
2006 windows->image.ximage->width,windows->image.ximage->height);
2007 if (windows->image.crop_geometry != (char *) NULL)
2008 (void) FormatLocaleFile(file," crop geometry: %s\n",
2009 windows->image.crop_geometry);
2010 if (windows->image.pixmap == (Pixmap) NULL)
2011 (void) FormatLocaleFile(file," type: X Image\n");
2013 (void) FormatLocaleFile(file," type: Pixmap\n");
2014 if (windows->image.shape != MagickFalse)
2015 (void) FormatLocaleFile(file," non-rectangular shape: True\n");
2017 (void) FormatLocaleFile(file," non-rectangular shape: False\n");
2018 if (windows->image.shared_memory != MagickFalse)
2019 (void) FormatLocaleFile(file," shared memory: True\n");
2021 (void) FormatLocaleFile(file," shared memory: False\n");
2022 (void) FormatLocaleFile(file,"\n");
2023 if (resource_info->font != (char *) NULL)
2024 (void) FormatLocaleFile(file,"Font: %s\n\n",resource_info->font);
2025 if (resource_info->text_font != (char *) NULL)
2026 (void) FormatLocaleFile(file,"Text font: %s\n\n",resource_info->text_font);
2028 Write info about the undo cache to a file.
2031 for (levels=0; undo_image != (Image *) NULL; levels++)
2033 number_pixels=undo_image->list->columns*undo_image->list->rows;
2034 bytes+=number_pixels*sizeof(PixelInfo);
2035 undo_image=GetPreviousImageInList(undo_image);
2037 (void) FormatLocaleFile(file,"Undo Edit Cache\n levels: %u\n",levels);
2038 (void) FormatLocaleFile(file," bytes: %.20gmb\n",(double)
2039 ((bytes+(1 << 19)) >> 20));
2040 (void) FormatLocaleFile(file," limit: %.20gmb\n\n",(double)
2041 resource_info->undo_cache);
2043 Write info about the image to a file.
2045 (void) IdentifyImage(image,file,MagickTrue,exception);
2046 (void) fclose(file);
2047 text=FileToString(filename,~0UL,exception);
2048 (void) RelinquishUniqueFileResource(filename);
2049 if (text == (char *) NULL)
2051 XNoticeWidget(display,windows,"MemoryAllocationFailed",
2052 "UnableToDisplayImageInfo");
2055 textlist=StringToList(text);
2056 if (textlist != (char **) NULL)
2059 title[MagickPathExtent];
2062 Display information about the image in the Text View widget.
2064 (void) XWithdrawWindow(display,windows->info.id,windows->info.screen);
2065 (void) FormatLocaleString(title,MagickPathExtent,"Image Info: %s",
2067 XTextViewWidget(display,resource_info,windows,MagickTrue,title,
2068 (char const **) textlist);
2069 for (i=0; textlist[i] != (char *) NULL; i++)
2070 textlist[i]=DestroyString(textlist[i]);
2071 textlist=(char **) RelinquishMagickMemory(textlist);
2073 text=DestroyString(text);
2077 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2081 + X D i t h e r I m a g e %
2085 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2087 % XDitherImage() dithers the reference image as required by the HP Color
2088 % Recovery algorithm. The color values are quantized to 3 bits of red and
2089 % green, and 2 bits of blue (3/3/2) and can be used as indices into a 8-bit X
2090 % standard colormap.
2092 % The format of the XDitherImage method is:
2094 % void XDitherImage(Image *image,XImage *ximage,ExceptionInfo *exception)
2096 % A description of each parameter follows:
2098 % o image: the image.
2100 % o ximage: Specifies a pointer to a XImage structure; returned from
2103 % o exception: return any errors or warnings in this structure.
2106 static void XDitherImage(Image *image,XImage *ximage,ExceptionInfo *exception)
2108 static const short int
2111 {-16, 4, -1, 11,-14, 6, -3, 9,-15, 5, -2, 10,-13, 7, -4, 8},
2112 { 15, -5, 0,-12, 13, -7, 2,-10, 14, -6, 1,-11, 12, -8, 3, -9}
2114 dither_green[2][16]=
2116 { 11,-15, 7, -3, 8,-14, 4, -2, 10,-16, 6, -4, 9,-13, 5, -1},
2117 {-12, 14, -8, 2, -9, 13, -5, 1,-11, 15, -7, 3,-10, 12, -6, 0}
2121 { -3, 9,-13, 7, -1, 11,-15, 5, -4, 8,-14, 6, -2, 10,-16, 4},
2122 { 2,-10, 12, -8, 0,-12, 14, -6, 3, -9, 13, -7, 1,-11, 15, -5}
2138 register const Quantum
2158 Allocate and initialize dither maps.
2160 for (i=0; i < 2; i++)
2161 for (j=0; j < 16; j++)
2163 red_map[i][j]=(unsigned char *) AcquireCriticalMemory(256UL*
2165 green_map[i][j]=(unsigned char *) AcquireCriticalMemory(256UL*
2166 sizeof(*green_map));
2167 blue_map[i][j]=(unsigned char *) AcquireCriticalMemory(256UL*
2171 Initialize dither tables.
2173 for (i=0; i < 2; i++)
2174 for (j=0; j < 16; j++)
2175 for (x=0; x < 256; x++)
2180 value+=dither_red[i][j];
2181 red_map[i][j][x]=(unsigned char)
2182 ((value < 0) ? 0 : (value > 255) ? 255 : value);
2186 value+=dither_green[i][j];
2187 green_map[i][j][x]=(unsigned char)
2188 ((value < 0) ? 0 : (value > 255) ? 255 : value);
2192 value+=((size_t) dither_blue[i][j] << 1);
2193 blue_map[i][j][x]=(unsigned char)
2194 ((value < 0) ? 0 : (value > 255) ? 255 : value);
2199 scanline_pad=(unsigned int) (ximage->bytes_per_line-
2200 ((size_t) (ximage->width*ximage->bits_per_pixel) >> 3));
2204 image_view=AcquireVirtualCacheView(image,exception);
2205 for (y=0; y < (int) image->rows; y++)
2207 p=GetCacheViewVirtualPixels(image_view,0,(ssize_t) y,image->columns,1,
2209 if (p == (const Quantum *) NULL)
2211 for (x=0; x < (int) image->columns; x++)
2213 color.red=(double) ClampToQuantum((double) (red_map[i][j][
2214 (int) ScaleQuantumToChar(GetPixelRed(image,p))] << 8));
2215 color.green=(double) ClampToQuantum((double) (green_map[i][j][
2216 (int) ScaleQuantumToChar(GetPixelGreen(image,p))] << 8));
2217 color.blue=(double) ClampToQuantum((double) (blue_map[i][j][
2218 (int) ScaleQuantumToChar(GetPixelBlue(image,p))] << 8));
2219 pixel=(size_t) (((size_t) color.red & 0xe0) |
2220 (((size_t) color.green & 0xe0) >> 3) |
2221 (((size_t) color.blue & 0xc0) >> 6));
2223 p+=GetPixelChannels(image);
2233 image_view=DestroyCacheView(image_view);
2235 Free allocated memory.
2237 for (i=0; i < 2; i++)
2238 for (j=0; j < 16; j++)
2240 green_map[i][j]=(unsigned char *) RelinquishMagickMemory(green_map[i][j]);
2241 blue_map[i][j]=(unsigned char *) RelinquishMagickMemory(blue_map[i][j]);
2242 red_map[i][j]=(unsigned char *) RelinquishMagickMemory(red_map[i][j]);
2247 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2251 % X D r a w I m a g e %
2255 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2257 % XDrawImage() draws a line on the image.
2259 % The format of the XDrawImage method is:
2261 % MagickBooleanType XDrawImage(Display *display,const XPixelInfo *pixel,
2262 % XDrawInfo *draw_info,Image *image,ExceptionInfo *exception)
2264 % A description of each parameter follows:
2266 % o display: Specifies a connection to an X server; returned from
2269 % o pixel: Specifies a pointer to a XPixelInfo structure.
2271 % o draw_info: Specifies a pointer to a XDrawInfo structure.
2273 % o image: the image.
2275 % o exception: return any errors or warnings in this structure.
2278 MagickPrivate MagickBooleanType XDrawImage(Display *display,
2279 const XPixelInfo *pixel,XDrawInfo *draw_info,Image *image,
2280 ExceptionInfo *exception)
2316 Initialize drawd image.
2318 assert(display != (Display *) NULL);
2319 assert(pixel != (XPixelInfo *) NULL);
2320 assert(draw_info != (XDrawInfo *) NULL);
2321 assert(image != (Image *) NULL);
2322 if (image->debug != MagickFalse)
2323 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
2325 Initialize drawd pixmap.
2327 root_window=XRootWindow(display,XDefaultScreen(display));
2328 depth=(unsigned int) XDefaultDepth(display,XDefaultScreen(display));
2329 draw_pixmap=XCreatePixmap(display,root_window,draw_info->width,
2330 draw_info->height,depth);
2331 if (draw_pixmap == (Pixmap) NULL)
2332 return(MagickFalse);
2334 Initialize graphics info.
2336 context_values.background=(size_t) (~0);
2337 context_values.foreground=0;
2338 context_values.line_width=(int) draw_info->line_width;
2339 draw_context=XCreateGC(display,root_window,(size_t)
2340 (GCBackground | GCForeground | GCLineWidth),&context_values);
2341 if (draw_context == (GC) NULL)
2342 return(MagickFalse);
2346 (void) XFillRectangle(display,draw_pixmap,draw_context,0,0,draw_info->width,
2349 Draw line to pixmap.
2351 (void) XSetBackground(display,draw_context,0);
2352 (void) XSetForeground(display,draw_context,(size_t) (~0));
2353 if (draw_info->stipple != (Pixmap) NULL)
2355 (void) XSetFillStyle(display,draw_context,FillOpaqueStippled);
2356 (void) XSetStipple(display,draw_context,draw_info->stipple);
2358 switch (draw_info->element)
2363 (void) XDrawLines(display,draw_pixmap,draw_context,
2364 draw_info->coordinate_info,(int) draw_info->number_coordinates,
2370 (void) XDrawLine(display,draw_pixmap,draw_context,draw_info->line_info.x1,
2371 draw_info->line_info.y1,draw_info->line_info.x2,
2372 draw_info->line_info.y2);
2375 case RectangleElement:
2377 (void) XDrawRectangle(display,draw_pixmap,draw_context,
2378 (int) draw_info->rectangle_info.x,(int) draw_info->rectangle_info.y,
2379 (unsigned int) draw_info->rectangle_info.width,
2380 (unsigned int) draw_info->rectangle_info.height);
2383 case FillRectangleElement:
2385 (void) XFillRectangle(display,draw_pixmap,draw_context,
2386 (int) draw_info->rectangle_info.x,(int) draw_info->rectangle_info.y,
2387 (unsigned int) draw_info->rectangle_info.width,
2388 (unsigned int) draw_info->rectangle_info.height);
2392 case EllipseElement:
2394 (void) XDrawArc(display,draw_pixmap,draw_context,
2395 (int) draw_info->rectangle_info.x,(int) draw_info->rectangle_info.y,
2396 (unsigned int) draw_info->rectangle_info.width,
2397 (unsigned int) draw_info->rectangle_info.height,0,360*64);
2400 case FillCircleElement:
2401 case FillEllipseElement:
2403 (void) XFillArc(display,draw_pixmap,draw_context,
2404 (int) draw_info->rectangle_info.x,(int) draw_info->rectangle_info.y,
2405 (unsigned int) draw_info->rectangle_info.width,
2406 (unsigned int) draw_info->rectangle_info.height,0,360*64);
2409 case PolygonElement:
2414 coordinate_info=draw_info->coordinate_info;
2415 (void) XDrawLines(display,draw_pixmap,draw_context,coordinate_info,
2416 (int) draw_info->number_coordinates,CoordModeOrigin);
2417 (void) XDrawLine(display,draw_pixmap,draw_context,
2418 coordinate_info[draw_info->number_coordinates-1].x,
2419 coordinate_info[draw_info->number_coordinates-1].y,
2420 coordinate_info[0].x,coordinate_info[0].y);
2423 case FillPolygonElement:
2425 (void) XFillPolygon(display,draw_pixmap,draw_context,
2426 draw_info->coordinate_info,(int) draw_info->number_coordinates,Complex,
2431 (void) XFreeGC(display,draw_context);
2435 draw_ximage=XGetImage(display,draw_pixmap,0,0,draw_info->width,
2436 draw_info->height,AllPlanes,ZPixmap);
2437 if (draw_ximage == (XImage *) NULL)
2438 return(MagickFalse);
2439 (void) XFreePixmap(display,draw_pixmap);
2441 Initialize draw image.
2443 draw_image=AcquireImage((ImageInfo *) NULL,exception);
2444 if (draw_image == (Image *) NULL)
2445 return(MagickFalse);
2446 draw_image->columns=draw_info->width;
2447 draw_image->rows=draw_info->height;
2449 Transfer drawn X image to image.
2451 width=(unsigned int) image->columns;
2452 height=(unsigned int) image->rows;
2455 (void) XParseGeometry(draw_info->geometry,&x,&y,&width,&height);
2456 (void) GetOneVirtualPixelInfo(image,UndefinedVirtualPixelMethod,(ssize_t) x,
2457 (ssize_t) y,&draw_image->background_color,exception);
2458 if (SetImageStorageClass(draw_image,DirectClass,exception) == MagickFalse)
2459 return(MagickFalse);
2460 draw_image->alpha_trait=BlendPixelTrait;
2461 draw_view=AcquireAuthenticCacheView(draw_image,exception);
2462 for (y=0; y < (int) draw_image->rows; y++)
2470 q=QueueCacheViewAuthenticPixels(draw_view,0,(ssize_t) y,draw_image->columns,
2472 if (q == (Quantum *) NULL)
2474 for (x=0; x < (int) draw_image->columns; x++)
2476 if (XGetPixel(draw_ximage,x,y) == 0)
2479 Set this pixel to the background color.
2481 SetPixelViaPixelInfo(draw_image,&draw_image->background_color,q);
2482 SetPixelAlpha(draw_image,(Quantum) (draw_info->stencil ==
2483 OpaqueStencil ? TransparentAlpha : OpaqueAlpha),q);
2488 Set this pixel to the pen color.
2490 SetPixelRed(draw_image,ScaleShortToQuantum(
2491 pixel->pen_color.red),q);
2492 SetPixelGreen(draw_image,ScaleShortToQuantum(
2493 pixel->pen_color.green),q);
2494 SetPixelBlue(draw_image,ScaleShortToQuantum(
2495 pixel->pen_color.blue),q);
2496 SetPixelAlpha(draw_image,(Quantum) (draw_info->stencil ==
2497 OpaqueStencil ? OpaqueAlpha : TransparentAlpha),q);
2499 q+=GetPixelChannels(draw_image);
2501 if (SyncCacheViewAuthenticPixels(draw_view,exception) == MagickFalse)
2504 draw_view=DestroyCacheView(draw_view);
2505 XDestroyImage(draw_ximage);
2507 Determine draw geometry.
2509 (void) XParseGeometry(draw_info->geometry,&x,&y,&width,&height);
2510 if ((width != (unsigned int) draw_image->columns) ||
2511 (height != (unsigned int) draw_image->rows))
2514 image_geometry[MagickPathExtent];
2519 (void) FormatLocaleString(image_geometry,MagickPathExtent,"%ux%u",
2521 (void) TransformImage(&draw_image,(char *) NULL,image_geometry,
2524 if (draw_info->degrees != 0.0)
2538 rotate_image=RotateImage(draw_image,draw_info->degrees,exception);
2539 if (rotate_image == (Image *) NULL)
2540 return(MagickFalse);
2541 draw_image=DestroyImage(draw_image);
2542 draw_image=rotate_image;
2544 Annotation is relative to the degree of rotation.
2546 normalized_degrees=draw_info->degrees;
2547 while (normalized_degrees < -45.0)
2548 normalized_degrees+=360.0;
2549 for (rotations=0; normalized_degrees > 45.0; rotations++)
2550 normalized_degrees-=90.0;
2551 switch (rotations % 4)
2561 x=x-(int) draw_image->columns/2;
2562 y=y+(int) draw_image->columns/2;
2570 x=x-(int) draw_image->columns;
2578 x=x-(int) draw_image->columns/2;
2579 y=y-(int) (draw_image->rows-(draw_image->columns/2));
2585 Composite text onto the image.
2587 draw_view=AcquireAuthenticCacheView(draw_image,exception);
2588 for (y=0; y < (int) draw_image->rows; y++)
2596 q=GetCacheViewAuthenticPixels(draw_view,0,(ssize_t) y,draw_image->columns,1,
2598 if (q == (Quantum *) NULL)
2600 for (x=0; x < (int) draw_image->columns; x++)
2602 if (GetPixelAlpha(image,q) != TransparentAlpha)
2603 SetPixelAlpha(draw_image,OpaqueAlpha,q);
2604 q+=GetPixelChannels(draw_image);
2606 if (SyncCacheViewAuthenticPixels(draw_view,exception) == MagickFalse)
2609 draw_view=DestroyCacheView(draw_view);
2610 (void) XParseGeometry(draw_info->geometry,&x,&y,&width,&height);
2611 if (draw_info->stencil == TransparentStencil)
2612 (void) CompositeImage(image,draw_image,CopyAlphaCompositeOp,MagickTrue,
2613 (ssize_t) x,(ssize_t) y,exception);
2616 alpha_trait=image->alpha_trait;
2617 (void) CompositeImage(image,draw_image,OverCompositeOp,MagickTrue,
2618 (ssize_t) x,(ssize_t) y,exception);
2619 image->alpha_trait=alpha_trait;
2621 draw_image=DestroyImage(draw_image);
2626 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2634 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2636 % XError() ignores BadWindow errors for XQueryTree and XGetWindowAttributes,
2637 % and ignores BadDrawable errors for XGetGeometry, and ignores BadValue errors
2638 % for XQueryColor. It returns MagickFalse in those cases. Otherwise it
2641 % The format of the XError function is:
2643 % int XError(display,error)
2645 % A description of each parameter follows:
2647 % o display: Specifies a pointer to the Display structure; returned from
2650 % o error: Specifies the error event.
2654 #if defined(__cplusplus) || defined(c_plusplus)
2658 MagickExport int XError(Display *display,XErrorEvent *error)
2660 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
2661 assert(display != (Display *) NULL);
2662 assert(error != (XErrorEvent *) NULL);
2663 xerror_alert=MagickTrue;
2664 switch (error->request_code)
2668 if ((int) error->error_code == BadDrawable)
2669 return(MagickFalse);
2672 case X_GetWindowAttributes:
2675 if ((int) error->error_code == BadWindow)
2676 return(MagickFalse);
2681 if ((int) error->error_code == BadValue)
2682 return(MagickFalse);
2689 #if defined(__cplusplus) || defined(c_plusplus)
2694 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2698 % X F r e e R e s o u r c e s %
2702 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2704 % XFreeResources() frees X11 resources.
2706 % The format of the XFreeResources method is:
2708 % void XFreeResources(Display *display,XVisualInfo *visual_info,
2709 % XStandardColormap *map_info,XPixelInfo *pixel,XFontStruct *font_info,
2710 % XResourceInfo *resource_info,XWindowInfo *window_info)
2711 % resource_info,window_info)
2713 % A description of each parameter follows:
2715 % o display: Specifies a connection to an X server; returned from
2718 % o visual_info: Specifies a pointer to a X11 XVisualInfo structure;
2719 % returned from XGetVisualInfo.
2721 % o map_info: If map_type is specified, this structure is initialized
2722 % with info from the Standard Colormap.
2724 % o pixel: Specifies a pointer to a XPixelInfo structure.
2726 % o font_info: Specifies a pointer to a XFontStruct structure.
2728 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
2730 % o window_info: Specifies a pointer to a X11 XWindowInfo structure.
2733 MagickPrivate void XFreeResources(Display *display,XVisualInfo *visual_info,
2734 XStandardColormap *map_info,XPixelInfo *pixel,XFontStruct *font_info,
2735 XResourceInfo *resource_info,XWindowInfo *window_info)
2737 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
2738 assert(display != (Display *) NULL);
2739 assert(resource_info != (XResourceInfo *) NULL);
2740 if (window_info != (XWindowInfo *) NULL)
2745 if (window_info->ximage != (XImage *) NULL)
2746 XDestroyImage(window_info->ximage);
2747 if (window_info->id != (Window) NULL)
2750 Free destroy window and free cursors.
2752 if (window_info->id != XRootWindow(display,visual_info->screen))
2753 (void) XDestroyWindow(display,window_info->id);
2754 if (window_info->annotate_context != (GC) NULL)
2755 (void) XFreeGC(display,window_info->annotate_context);
2756 if (window_info->highlight_context != (GC) NULL)
2757 (void) XFreeGC(display,window_info->highlight_context);
2758 if (window_info->widget_context != (GC) NULL)
2759 (void) XFreeGC(display,window_info->widget_context);
2760 if (window_info->cursor != (Cursor) NULL)
2761 (void) XFreeCursor(display,window_info->cursor);
2762 window_info->cursor=(Cursor) NULL;
2763 if (window_info->busy_cursor != (Cursor) NULL)
2764 (void) XFreeCursor(display,window_info->busy_cursor);
2765 window_info->busy_cursor=(Cursor) NULL;
2771 if (font_info != (XFontStruct *) NULL)
2773 (void) XFreeFont(display,font_info);
2774 font_info=(XFontStruct *) NULL;
2776 if (map_info != (XStandardColormap *) NULL)
2779 Free X Standard Colormap.
2781 if (resource_info->map_type == (char *) NULL)
2782 (void) XFreeStandardColormap(display,visual_info,map_info,pixel);
2783 (void) XFree((void *) map_info);
2788 if (visual_info != (XVisualInfo *) NULL)
2789 (void) XFree((void *) visual_info);
2790 if (resource_info->close_server != MagickFalse)
2791 (void) XCloseDisplay(display);
2795 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2799 % X F r e e S t a n d a r d C o l o r m a p %
2803 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2805 % XFreeStandardColormap() frees an X11 colormap.
2807 % The format of the XFreeStandardColormap method is:
2809 % void XFreeStandardColormap(Display *display,
2810 % const XVisualInfo *visual_info,XStandardColormap *map_info,
2811 % XPixelInfo *pixel)
2813 % A description of each parameter follows:
2815 % o display: Specifies a connection to an X server; returned from
2818 % o visual_info: Specifies a pointer to a X11 XVisualInfo structure;
2819 % returned from XGetVisualInfo.
2821 % o map_info: If map_type is specified, this structure is initialized
2822 % with info from the Standard Colormap.
2824 % o pixel: Specifies a pointer to a XPixelInfo structure.
2827 MagickPrivate void XFreeStandardColormap(Display *display,
2828 const XVisualInfo *visual_info,XStandardColormap *map_info,XPixelInfo *pixel)
2833 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
2834 assert(display != (Display *) NULL);
2835 assert(visual_info != (XVisualInfo *) NULL);
2836 assert(map_info != (XStandardColormap *) NULL);
2837 (void) XFlush(display);
2838 if (map_info->colormap != (Colormap) NULL)
2840 if (map_info->colormap != XDefaultColormap(display,visual_info->screen))
2841 (void) XFreeColormap(display,map_info->colormap);
2843 if (pixel != (XPixelInfo *) NULL)
2844 if ((visual_info->klass != TrueColor) &&
2845 (visual_info->klass != DirectColor))
2846 (void) XFreeColors(display,map_info->colormap,pixel->pixels,
2847 (int) pixel->colors,0);
2849 map_info->colormap=(Colormap) NULL;
2850 if (pixel != (XPixelInfo *) NULL)
2852 if (pixel->pixels != (unsigned long *) NULL)
2853 pixel->pixels=(unsigned long *) RelinquishMagickMemory(pixel->pixels);
2854 pixel->pixels=(unsigned long *) NULL;
2859 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2863 % X G e t A n n o t a t e I n f o %
2867 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2869 % XGetAnnotateInfo() initializes the AnnotateInfo structure.
2871 % The format of the XGetAnnotateInfo method is:
2873 % void XGetAnnotateInfo(XAnnotateInfo *annotate_info)
2875 % A description of each parameter follows:
2877 % o annotate_info: Specifies a pointer to a XAnnotateInfo structure.
2880 MagickPrivate void XGetAnnotateInfo(XAnnotateInfo *annotate_info)
2883 Initialize annotate structure.
2885 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
2886 assert(annotate_info != (XAnnotateInfo *) NULL);
2889 annotate_info->width=0;
2890 annotate_info->height=0;
2891 annotate_info->stencil=ForegroundStencil;
2892 annotate_info->degrees=0.0;
2893 annotate_info->font_info=(XFontStruct *) NULL;
2894 annotate_info->text=(char *) NULL;
2895 *annotate_info->geometry='\0';
2896 annotate_info->previous=(XAnnotateInfo *) NULL;
2897 annotate_info->next=(XAnnotateInfo *) NULL;
2898 (void) XSupportsLocale();
2899 (void) XSetLocaleModifiers("");
2903 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2907 % X G e t M a p I n f o %
2911 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2913 % XGetMapInfo() initializes the XStandardColormap structure.
2915 % The format of the XStandardColormap method is:
2917 % void XGetMapInfo(const XVisualInfo *visual_info,const Colormap colormap,
2918 % XStandardColormap *map_info)
2920 % A description of each parameter follows:
2922 % o colormap: Specifies the ID of the X server colormap.
2924 % o visual_info: Specifies a pointer to a X11 XVisualInfo structure;
2925 % returned from XGetVisualInfo.
2927 % o map_info: Specifies a pointer to a X11 XStandardColormap structure.
2930 MagickPrivate void XGetMapInfo(const XVisualInfo *visual_info,
2931 const Colormap colormap,XStandardColormap *map_info)
2934 Initialize map info.
2936 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
2937 assert(visual_info != (XVisualInfo *) NULL);
2938 assert(map_info != (XStandardColormap *) NULL);
2939 map_info->colormap=colormap;
2940 map_info->red_max=visual_info->red_mask;
2941 map_info->red_mult=(size_t) (map_info->red_max != 0 ? 1 : 0);
2942 if (map_info->red_max != 0)
2943 while ((map_info->red_max & 0x01) == 0)
2945 map_info->red_max>>=1;
2946 map_info->red_mult<<=1;
2948 map_info->green_max=visual_info->green_mask;
2949 map_info->green_mult=(size_t) (map_info->green_max != 0 ? 1 : 0);
2950 if (map_info->green_max != 0)
2951 while ((map_info->green_max & 0x01) == 0)
2953 map_info->green_max>>=1;
2954 map_info->green_mult<<=1;
2956 map_info->blue_max=visual_info->blue_mask;
2957 map_info->blue_mult=(size_t) (map_info->blue_max != 0 ? 1 : 0);
2958 if (map_info->blue_max != 0)
2959 while ((map_info->blue_max & 0x01) == 0)
2961 map_info->blue_max>>=1;
2962 map_info->blue_mult<<=1;
2964 map_info->base_pixel=0;
2968 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2972 % X G e t P i x e l I n f o %
2976 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2978 % XGetPixelInfo() initializes the PixelInfo structure.
2980 % The format of the XGetPixelInfo method is:
2982 % void XGetPixelInfo(Display *display,const XVisualInfo *visual_info,
2983 % const XStandardColormap *map_info,const XResourceInfo *resource_info,
2984 % Image *image,XPixelInfo *pixel)
2987 % A description of each parameter follows:
2989 % o display: Specifies a connection to an X server; returned from
2992 % o visual_info: Specifies a pointer to a X11 XVisualInfo structure;
2993 % returned from XGetVisualInfo.
2995 % o map_info: If map_type is specified, this structure is initialized
2996 % with info from the Standard Colormap.
2998 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
3000 % o image: the image.
3002 % o pixel: Specifies a pointer to a XPixelInfo structure.
3005 MagickPrivate void XGetPixelInfo(Display *display,
3006 const XVisualInfo *visual_info,const XStandardColormap *map_info,
3007 const XResourceInfo *resource_info,Image *image,XPixelInfo *pixel)
3010 *PenColors[MaxNumberPens]=
3012 "#000000000000", /* black */
3013 "#00000000ffff", /* blue */
3014 "#0000ffffffff", /* cyan */
3015 "#0000ffff0000", /* green */
3016 "#bdbdbdbdbdbd", /* gray */
3017 "#ffff00000000", /* red */
3018 "#ffff0000ffff", /* magenta */
3019 "#ffffffff0000", /* yellow */
3020 "#ffffffffffff", /* white */
3021 "#bdbdbdbdbdbd", /* gray */
3022 "#bdbdbdbdbdbd" /* gray */
3042 Initialize pixel info.
3044 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
3045 assert(display != (Display *) NULL);
3046 assert(visual_info != (XVisualInfo *) NULL);
3047 assert(map_info != (XStandardColormap *) NULL);
3048 assert(resource_info != (XResourceInfo *) NULL);
3049 assert(pixel != (XPixelInfo *) NULL);
3051 if (image != (Image *) NULL)
3052 if (image->storage_class == PseudoClass)
3053 pixel->colors=(ssize_t) image->colors;
3054 packets=(unsigned int)
3055 MagickMax((int) pixel->colors,visual_info->colormap_size)+MaxNumberPens;
3056 if (pixel->pixels != (unsigned long *) NULL)
3057 pixel->pixels=(unsigned long *) RelinquishMagickMemory(pixel->pixels);
3058 pixel->pixels=(unsigned long *) AcquireQuantumMemory(packets,
3059 sizeof(*pixel->pixels));
3060 if (pixel->pixels == (unsigned long *) NULL)
3061 ThrowXWindowFatalException(ResourceLimitFatalError,"UnableToGetPixelInfo",
3064 Set foreground color.
3066 colormap=map_info->colormap;
3067 (void) XParseColor(display,colormap,(char *) ForegroundColor,
3068 &pixel->foreground_color);
3069 status=XParseColor(display,colormap,resource_info->foreground_color,
3070 &pixel->foreground_color);
3071 if (status == False)
3072 ThrowXWindowException(XServerError,"ColorIsNotKnownToServer",
3073 resource_info->foreground_color);
3074 pixel->foreground_color.pixel=
3075 XStandardPixel(map_info,&pixel->foreground_color);
3076 pixel->foreground_color.flags=(char) (DoRed | DoGreen | DoBlue);
3078 Set background color.
3080 (void) XParseColor(display,colormap,"#d6d6d6d6d6d6",&pixel->background_color);
3081 status=XParseColor(display,colormap,resource_info->background_color,
3082 &pixel->background_color);
3083 if (status == False)
3084 ThrowXWindowException(XServerError,"ColorIsNotKnownToServer",
3085 resource_info->background_color);
3086 pixel->background_color.pixel=
3087 XStandardPixel(map_info,&pixel->background_color);
3088 pixel->background_color.flags=(char) (DoRed | DoGreen | DoBlue);
3092 (void) XParseColor(display,colormap,(char *) BorderColor,
3093 &pixel->border_color);
3094 status=XParseColor(display,colormap,resource_info->border_color,
3095 &pixel->border_color);
3096 if (status == False)
3097 ThrowXWindowException(XServerError,"ColorIsNotKnownToServer",
3098 resource_info->border_color);
3099 pixel->border_color.pixel=XStandardPixel(map_info,&pixel->border_color);
3100 pixel->border_color.flags=(char) (DoRed | DoGreen | DoBlue);
3104 pixel->matte_color=pixel->background_color;
3105 if (resource_info->matte_color != (char *) NULL)
3108 Matte color is specified as a X resource or command line argument.
3110 status=XParseColor(display,colormap,resource_info->matte_color,
3111 &pixel->matte_color);
3112 if (status == False)
3113 ThrowXWindowException(XServerError,"ColorIsNotKnownToServer",
3114 resource_info->matte_color);
3115 pixel->matte_color.pixel=XStandardPixel(map_info,&pixel->matte_color);
3116 pixel->matte_color.flags=(char) (DoRed | DoGreen | DoBlue);
3119 Set highlight color.
3121 pixel->highlight_color.red=(unsigned short) (((double)
3122 pixel->matte_color.red*ScaleQuantumToShort(HighlightModulate))/65535L+
3123 (ScaleQuantumToShort((Quantum) (QuantumRange-HighlightModulate))));
3124 pixel->highlight_color.green=(unsigned short) (((double)
3125 pixel->matte_color.green*ScaleQuantumToShort(HighlightModulate))/65535L+
3126 (ScaleQuantumToShort((Quantum) (QuantumRange-HighlightModulate))));
3127 pixel->highlight_color.blue=(unsigned short) (((double)
3128 pixel->matte_color.blue*ScaleQuantumToShort(HighlightModulate))/65535L+
3129 (ScaleQuantumToShort((Quantum) (QuantumRange-HighlightModulate))));
3130 pixel->highlight_color.pixel=XStandardPixel(map_info,&pixel->highlight_color);
3131 pixel->highlight_color.flags=(char) (DoRed | DoGreen | DoBlue);
3135 pixel->shadow_color.red=(unsigned short) (((double)
3136 pixel->matte_color.red*ScaleQuantumToShort(ShadowModulate))/65535L);
3137 pixel->shadow_color.green=(unsigned short) (((double)
3138 pixel->matte_color.green*ScaleQuantumToShort(ShadowModulate))/65535L);
3139 pixel->shadow_color.blue=(unsigned short) (((double)
3140 pixel->matte_color.blue*ScaleQuantumToShort(ShadowModulate))/65535L);
3141 pixel->shadow_color.pixel=XStandardPixel(map_info,&pixel->shadow_color);
3142 pixel->shadow_color.flags=(char) (DoRed | DoGreen | DoBlue);
3146 pixel->depth_color.red=(unsigned short) (((double)
3147 pixel->matte_color.red*ScaleQuantumToShort(DepthModulate))/65535L);
3148 pixel->depth_color.green=(unsigned short) (((double)
3149 pixel->matte_color.green*ScaleQuantumToShort(DepthModulate))/65535L);
3150 pixel->depth_color.blue=(unsigned short) (((double)
3151 pixel->matte_color.blue*ScaleQuantumToShort(DepthModulate))/65535L);
3152 pixel->depth_color.pixel=XStandardPixel(map_info,&pixel->depth_color);
3153 pixel->depth_color.flags=(char) (DoRed | DoGreen | DoBlue);
3157 pixel->trough_color.red=(unsigned short) (((double)
3158 pixel->matte_color.red*ScaleQuantumToShort(TroughModulate))/65535L);
3159 pixel->trough_color.green=(unsigned short) (((double)
3160 pixel->matte_color.green*ScaleQuantumToShort(TroughModulate))/65535L);
3161 pixel->trough_color.blue=(unsigned short) (((double)
3162 pixel->matte_color.blue*ScaleQuantumToShort(TroughModulate))/65535L);
3163 pixel->trough_color.pixel=XStandardPixel(map_info,&pixel->trough_color);
3164 pixel->trough_color.flags=(char) (DoRed | DoGreen | DoBlue);
3168 for (i=0; i < MaxNumberPens; i++)
3170 (void) XParseColor(display,colormap,(char *) PenColors[i],
3171 &pixel->pen_colors[i]);
3172 status=XParseColor(display,colormap,resource_info->pen_colors[i],
3173 &pixel->pen_colors[i]);
3174 if (status == False)
3175 ThrowXWindowException(XServerError,"ColorIsNotKnownToServer",
3176 resource_info->pen_colors[i]);
3177 pixel->pen_colors[i].pixel=XStandardPixel(map_info,&pixel->pen_colors[i]);
3178 pixel->pen_colors[i].flags=(char) (DoRed | DoGreen | DoBlue);
3180 pixel->box_color=pixel->background_color;
3181 pixel->pen_color=pixel->foreground_color;
3184 if (image != (Image *) NULL)
3186 if ((resource_info->gamma_correct != MagickFalse) &&
3187 (image->gamma != 0.0))
3196 Initialize map relative to display and image gamma.
3198 flags=ParseGeometry(resource_info->display_gamma,&geometry_info);
3199 red_gamma=geometry_info.rho;
3200 green_gamma=geometry_info.sigma;
3201 if ((flags & SigmaValue) == 0)
3202 green_gamma=red_gamma;
3203 blue_gamma=geometry_info.xi;
3204 if ((flags & XiValue) == 0)
3205 blue_gamma=red_gamma;
3206 red_gamma*=image->gamma;
3207 green_gamma*=image->gamma;
3208 blue_gamma*=image->gamma;
3210 if (image->storage_class == PseudoClass)
3213 Initialize pixel array for images of type PseudoClass.
3215 for (i=0; i < (ssize_t) image->colors; i++)
3216 pixel->pixels[i]=XGammaPacket(map_info,image->colormap+i);
3217 for (i=0; i < MaxNumberPens; i++)
3218 pixel->pixels[image->colors+i]=pixel->pen_colors[i].pixel;
3219 pixel->colors+=MaxNumberPens;
3225 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3229 % X G e t R e s o u r c e C l a s s %
3233 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3235 % XGetResourceClass() queries the X server for the specified resource name or
3236 % class. If the resource name or class is not defined in the database, the
3237 % supplied default value is returned.
3239 % The format of the XGetResourceClass method is:
3241 % char *XGetResourceClass(XrmDatabase database,const char *client_name,
3242 % const char *keyword,char *resource_default)
3244 % A description of each parameter follows:
3246 % o database: Specifies a resource database; returned from
3247 % XrmGetStringDatabase.
3249 % o client_name: Specifies the application name used to retrieve resource
3250 % info from the X server database.
3252 % o keyword: Specifies the keyword of the value being retrieved.
3254 % o resource_default: Specifies the default value to return if the query
3255 % fails to find the specified keyword/class.
3258 MagickExport char *XGetResourceClass(XrmDatabase database,
3259 const char *client_name,const char *keyword,char *resource_default)
3262 resource_class[MagickPathExtent],
3263 resource_name[MagickPathExtent];
3274 if (database == (XrmDatabase) NULL)
3275 return(resource_default);
3276 *resource_name='\0';
3277 *resource_class='\0';
3278 if (keyword != (char *) NULL)
3285 Initialize resource keyword and class.
3287 (void) FormatLocaleString(resource_name,MagickPathExtent,"%s.%s",
3288 client_name,keyword);
3289 c=(int) (*client_name);
3290 if ((c >= XK_a) && (c <= XK_z))
3293 if ((c >= XK_agrave) && (c <= XK_odiaeresis))
3294 c-=(XK_agrave-XK_Agrave);
3296 if ((c >= XK_oslash) && (c <= XK_thorn))
3297 c-=(XK_oslash-XK_Ooblique);
3299 if ((k >= XK_a) && (k <= XK_z))
3302 if ((k >= XK_agrave) && (k <= XK_odiaeresis))
3303 k-=(XK_agrave-XK_Agrave);
3305 if ((k >= XK_oslash) && (k <= XK_thorn))
3306 k-=(XK_oslash-XK_Ooblique);
3307 (void) FormatLocaleString(resource_class,MagickPathExtent,"%c%s.%c%s",c,
3308 client_name+1,k,keyword+1);
3310 status=XrmGetResource(database,resource_name,resource_class,&resource_type,
3312 if (status == False)
3313 return(resource_default);
3314 return(resource_value.addr);
3318 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3322 % X G e t R e s o u r c e D a t a b a s e %
3326 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3328 % XGetResourceDatabase() creates a new resource database and initializes it.
3330 % The format of the XGetResourceDatabase method is:
3332 % XrmDatabase XGetResourceDatabase(Display *display,
3333 % const char *client_name)
3335 % A description of each parameter follows:
3337 % o database: XGetResourceDatabase() returns the database after it is
3340 % o display: Specifies a connection to an X server; returned from
3343 % o client_name: Specifies the application name used to retrieve resource
3344 % info from the X server database.
3347 MagickExport XrmDatabase XGetResourceDatabase(Display *display,
3348 const char *client_name)
3351 filename[MagickPathExtent];
3363 if (display == (Display *) NULL)
3364 return((XrmDatabase) NULL);
3365 assert(client_name != (char *) NULL);
3367 Initialize resource database.
3370 (void) XGetDefault(display,(char *) client_name,"dummy");
3371 resource_database=XrmGetDatabase(display);
3373 Combine application database.
3375 if (client_name != (char *) NULL)
3378 Get basename of client.
3380 p=client_name+(strlen(client_name)-1);
3381 while ((p > client_name) && (*p != '/'))
3386 c=(int) (*client_name);
3387 if ((c >= XK_a) && (c <= XK_z))
3390 if ((c >= XK_agrave) && (c <= XK_odiaeresis))
3391 c-=(XK_agrave-XK_Agrave);
3393 if ((c >= XK_oslash) && (c <= XK_thorn))
3394 c-=(XK_oslash-XK_Ooblique);
3395 #if defined(X11_APPLICATION_PATH)
3396 (void) FormatLocaleString(filename,MagickPathExtent,"%s%c%s",
3397 X11_APPLICATION_PATH,c,client_name+1);
3398 (void) XrmCombineFileDatabase(filename,&resource_database,MagickFalse);
3400 if (XResourceManagerString(display) != (char *) NULL)
3403 Combine server database.
3405 server_database=XrmGetStringDatabase(XResourceManagerString(display));
3406 XrmCombineDatabase(server_database,&resource_database,MagickFalse);
3409 Merge user preferences database.
3411 #if defined(X11_PREFERENCES_PATH)
3412 (void) FormatLocaleString(filename,MagickPathExtent,"%s%src",
3413 X11_PREFERENCES_PATH,client_name);
3414 ExpandFilename(filename);
3415 (void) XrmCombineFileDatabase(filename,&resource_database,MagickFalse);
3417 return(resource_database);
3421 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3425 % X G e t R e s o u r c e I n f o %
3429 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3431 % XGetResourceInfo(image_info,) initializes the ResourceInfo structure.
3433 % The format of the XGetResourceInfo method is:
3435 % void XGetResourceInfo(const ImageInfo *image_info,XrmDatabase database,
3436 % const char *client_name,XResourceInfo *resource_info)
3438 % A description of each parameter follows:
3440 % o image_info: the image info.
3442 % o database: Specifies a resource database; returned from
3443 % XrmGetStringDatabase.
3445 % o client_name: Specifies the application name used to retrieve
3446 % resource info from the X server database.
3448 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
3451 MagickExport void XGetResourceInfo(const ImageInfo *image_info,
3452 XrmDatabase database,const char *client_name,XResourceInfo *resource_info)
3463 Initialize resource info fields.
3465 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
3466 assert(resource_info != (XResourceInfo *) NULL);
3467 (void) ResetMagickMemory(resource_info,0,sizeof(*resource_info));
3468 resource_info->resource_database=database;
3469 resource_info->image_info=(ImageInfo *) image_info;
3470 (void) SetImageInfoProgressMonitor(resource_info->image_info,
3471 XMagickProgressMonitor,(void *) NULL);
3472 resource_info->quantize_info=CloneQuantizeInfo((QuantizeInfo *) NULL);
3473 resource_info->close_server=MagickTrue;
3474 resource_info->client_name=AcquireString(client_name);
3475 resource_value=XGetResourceClass(database,client_name,"backdrop",
3477 resource_info->backdrop=IsStringTrue(resource_value);
3478 resource_info->background_color=XGetResourceInstance(database,client_name,
3479 "background",(char *) "#d6d6d6d6d6d6");
3480 resource_info->border_color=XGetResourceInstance(database,client_name,
3481 "borderColor",BorderColor);
3482 resource_value=XGetResourceClass(database,client_name,"borderWidth",
3484 resource_info->border_width=(unsigned int) StringToUnsignedLong(
3486 resource_value=XGetResourceClass(database,client_name,"colormap",
3488 resource_info->colormap=UndefinedColormap;
3489 if (LocaleCompare("private",resource_value) == 0)
3490 resource_info->colormap=PrivateColormap;
3491 if (LocaleCompare("shared",resource_value) == 0)
3492 resource_info->colormap=SharedColormap;
3493 if (resource_info->colormap == UndefinedColormap)
3494 ThrowXWindowException(OptionError,"UnrecognizedColormapType",
3496 resource_value=XGetResourceClass(database,client_name,
3497 "colorRecovery",(char *) "False");
3498 resource_info->color_recovery=IsStringTrue(resource_value);
3499 resource_value=XGetResourceClass(database,client_name,"confirmExit",
3501 resource_info->confirm_exit=IsStringTrue(resource_value);
3502 resource_value=XGetResourceClass(database,client_name,"confirmEdit",
3504 resource_info->confirm_edit=IsStringTrue(resource_value);
3505 resource_value=XGetResourceClass(database,client_name,"delay",(char *) "1");
3506 resource_info->delay=(unsigned int) StringToUnsignedLong(resource_value);
3507 resource_info->display_gamma=XGetResourceClass(database,client_name,
3508 "displayGamma",(char *) "2.2");
3509 resource_value=XGetResourceClass(database,client_name,"displayWarnings",
3511 resource_info->display_warnings=IsStringTrue(resource_value);
3512 resource_info->font=XGetResourceClass(database,client_name,"font",
3514 resource_info->font=XGetResourceClass(database,client_name,"fontList",
3515 resource_info->font);
3516 resource_info->font_name[0]=XGetResourceClass(database,client_name,"font1",
3518 resource_info->font_name[1]=XGetResourceClass(database,client_name,"font2",
3519 (char *) "variable");
3520 resource_info->font_name[2]=XGetResourceClass(database,client_name,"font3",
3522 resource_info->font_name[3]=XGetResourceClass(database,client_name,"font4",
3524 resource_info->font_name[4]=XGetResourceClass(database,client_name,"font5",
3525 (char *) "7x13bold");
3526 resource_info->font_name[5]=XGetResourceClass(database,client_name,"font6",
3527 (char *) "8x13bold");
3528 resource_info->font_name[6]=XGetResourceClass(database,client_name,"font7",
3529 (char *) "9x15bold");
3530 resource_info->font_name[7]=XGetResourceClass(database,client_name,"font8",
3532 resource_info->font_name[8]=XGetResourceClass(database,client_name,"font9",
3534 resource_info->font_name[9]=XGetResourceClass(database,client_name,"font0",
3536 resource_info->font_name[10]=XGetResourceClass(database,client_name,"font0",
3538 resource_info->foreground_color=XGetResourceInstance(database,client_name,
3539 "foreground",ForegroundColor);
3540 resource_value=XGetResourceClass(database,client_name,"gammaCorrect",
3542 resource_info->gamma_correct=IsStringTrue(resource_value);
3543 resource_info->image_geometry=ConstantString(XGetResourceClass(database,
3544 client_name,"geometry",(char *) NULL));
3545 resource_value=XGetResourceClass(database,client_name,"gravity",
3547 resource_info->gravity=(GravityType) ParseCommandOption(MagickGravityOptions,
3548 MagickFalse,resource_value);
3549 directory=getcwd(resource_info->home_directory,MagickPathExtent);
3551 resource_info->icon_geometry=XGetResourceClass(database,client_name,
3552 "iconGeometry",(char *) NULL);
3553 resource_value=XGetResourceClass(database,client_name,"iconic",
3555 resource_info->iconic=IsStringTrue(resource_value);
3556 resource_value=XGetResourceClass(database,client_name,"immutable",
3557 LocaleCompare(client_name,"PerlMagick") == 0 ? (char *) "True" :
3559 resource_info->immutable=IsStringTrue(resource_value);
3560 resource_value=XGetResourceClass(database,client_name,"magnify",
3562 resource_info->magnify=(unsigned int) StringToUnsignedLong(resource_value);
3563 resource_info->map_type=XGetResourceClass(database,client_name,"map",
3565 resource_info->matte_color=XGetResourceInstance(database,client_name,
3566 "mattecolor",(char *) NULL);
3567 resource_info->name=ConstantString(XGetResourceClass(database,client_name,
3568 "name",(char *) NULL));
3569 resource_info->pen_colors[0]=XGetResourceClass(database,client_name,"pen1",
3571 resource_info->pen_colors[1]=XGetResourceClass(database,client_name,"pen2",
3573 resource_info->pen_colors[2]=XGetResourceClass(database,client_name,"pen3",
3575 resource_info->pen_colors[3]=XGetResourceClass(database,client_name,"pen4",
3577 resource_info->pen_colors[4]=XGetResourceClass(database,client_name,"pen5",
3579 resource_info->pen_colors[5]=XGetResourceClass(database,client_name,"pen6",
3581 resource_info->pen_colors[6]=XGetResourceClass(database,client_name,"pen7",
3582 (char *) "magenta");
3583 resource_info->pen_colors[7]=XGetResourceClass(database,client_name,"pen8",
3585 resource_info->pen_colors[8]=XGetResourceClass(database,client_name,"pen9",
3587 resource_info->pen_colors[9]=XGetResourceClass(database,client_name,"pen0",
3589 resource_info->pen_colors[10]=XGetResourceClass(database,client_name,"pen0",
3591 resource_value=XGetResourceClass(database,client_name,"pause",(char *) "0");
3592 resource_info->pause=(unsigned int) StringToUnsignedLong(resource_value);
3593 resource_value=XGetResourceClass(database,client_name,"quantum",(char *) "1");
3594 resource_info->quantum=StringToLong(resource_value);
3595 resource_info->text_font=XGetResourceClass(database,client_name,(char *)
3596 "font",(char *) "fixed");
3597 resource_info->text_font=XGetResourceClass(database,client_name,
3598 "textFontList",resource_info->text_font);
3599 resource_info->title=XGetResourceClass(database,client_name,"title",
3601 resource_value=XGetResourceClass(database,client_name,"undoCache",
3603 resource_info->undo_cache=(unsigned int) StringToUnsignedLong(resource_value);
3604 resource_value=XGetResourceClass(database,client_name,"update",
3606 resource_info->update=IsStringTrue(resource_value);
3607 resource_value=XGetResourceClass(database,client_name,"usePixmap",
3609 resource_info->use_pixmap=IsStringTrue(resource_value);
3610 resource_value=XGetResourceClass(database,client_name,"sharedMemory",
3612 resource_info->use_shared_memory=IsStringTrue(resource_value);
3613 resource_info->visual_type=XGetResourceClass(database,client_name,"visual",
3615 resource_info->window_group=XGetResourceClass(database,client_name,
3616 "windowGroup",(char *) NULL);
3617 resource_info->window_id=XGetResourceClass(database,client_name,"window",
3619 resource_info->write_filename=XGetResourceClass(database,client_name,
3620 "writeFilename",(char *) NULL);
3624 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3628 % X G e t R e s o u r c e I n s t a n c e %
3632 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3634 % XGetResourceInstance() queries the X server for the specified resource name.
3635 % If the resource name is not defined in the database, the supplied default
3636 % value is returned.
3638 % The format of the XGetResourceInstance method is:
3640 % char *XGetResourceInstance(XrmDatabase database,const char *client_name,
3641 % const char *keyword,const char *resource_default)
3643 % A description of each parameter follows:
3645 % o database: Specifies a resource database; returned from
3646 % XrmGetStringDatabase.
3648 % o client_name: Specifies the application name used to retrieve
3649 % resource info from the X server database.
3651 % o keyword: Specifies the keyword of the value being retrieved.
3653 % o resource_default: Specifies the default value to return if the query
3654 % fails to find the specified keyword/class.
3657 MagickExport char *XGetResourceInstance(XrmDatabase database,
3658 const char *client_name,const char *keyword,const char *resource_default)
3662 resource_name[MagickPathExtent];
3670 if (database == (XrmDatabase) NULL)
3671 return((char *) resource_default);
3672 *resource_name='\0';
3673 if (keyword != (char *) NULL)
3674 (void) FormatLocaleString(resource_name,MagickPathExtent,"%s.%s",client_name,
3676 status=XrmGetResource(database,resource_name,"ImageMagick",&resource_type,
3678 if (status == False)
3679 return((char *) resource_default);
3680 return(resource_value.addr);
3684 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3688 % X G e t S c r e e n D e n s i t y %
3692 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3694 % XGetScreenDensity() returns the density of the X server screen in
3697 % The format of the XGetScreenDensity method is:
3699 % char *XGetScreenDensity(Display *display)
3701 % A description of each parameter follows:
3703 % o density: XGetScreenDensity() returns the density of the X screen in
3706 % o display: Specifies a connection to an X server; returned from
3710 MagickExport char *XGetScreenDensity(Display *display)
3713 density[MagickPathExtent];
3720 Set density as determined by screen size.
3722 x_density=((((double) DisplayWidth(display,XDefaultScreen(display)))*25.4)/
3723 ((double) DisplayWidthMM(display,XDefaultScreen(display))));
3724 y_density=((((double) DisplayHeight(display,XDefaultScreen(display)))*25.4)/
3725 ((double) DisplayHeightMM(display,XDefaultScreen(display))));
3726 (void) FormatLocaleString(density,MagickPathExtent,"%gx%g",x_density,
3728 return(GetPageGeometry(density));
3732 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3736 + X G e t S u b w i n d o w %
3740 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3742 % XGetSubwindow() returns the subwindow of a window chosen the user with the
3743 % pointer and a button press.
3745 % The format of the XGetSubwindow method is:
3747 % Window XGetSubwindow(Display *display,Window window,int x,int y)
3749 % A description of each parameter follows:
3751 % o subwindow: XGetSubwindow() returns NULL if no subwindow is found
3752 % otherwise the subwindow is returned.
3754 % o display: Specifies a connection to an X server; returned from
3757 % o window: Specifies a pointer to a Window.
3759 % o x: the x coordinate of the pointer relative to the origin of the
3762 % o y: the y coordinate of the pointer relative to the origin of the
3766 static Window XGetSubwindow(Display *display,Window window,int x,int y)
3779 assert(display != (Display *) NULL);
3780 source_window=XRootWindow(display,XDefaultScreen(display));
3781 if (window == (Window) NULL)
3782 return(source_window);
3783 target_window=window;
3786 status=XTranslateCoordinates(display,source_window,window,x,y,
3787 &x_offset,&y_offset,&target_window);
3790 if (target_window == (Window) NULL)
3792 source_window=window;
3793 window=target_window;
3797 if (target_window == (Window) NULL)
3798 target_window=window;
3799 return(target_window);
3803 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3807 % X G e t W i n d o w C o l o r %
3811 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3813 % XGetWindowColor() returns the color of a pixel interactively chosen from the
3816 % The format of the XGetWindowColor method is:
3818 % MagickBooleanType XGetWindowColor(Display *display,XWindows *windows,
3819 % char *name,ExceptionInfo *exception)
3821 % A description of each parameter follows:
3823 % o display: Specifies a connection to an X server; returned from
3826 % o windows: Specifies a pointer to a XWindows structure.
3828 % o name: the name of the color if found in the X Color Database is
3829 % returned in this character string.
3831 % o exception: return any errors or warnings in this structure.
3834 MagickPrivate MagickBooleanType XGetWindowColor(Display *display,
3835 XWindows *windows,char *name,ExceptionInfo *exception)
3866 Choose a pixel from the X server.
3868 assert(display != (Display *) NULL);
3869 assert(name != (char *) NULL);
3870 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",name);
3872 target_window=XSelectWindow(display,&crop_info);
3873 if (target_window == (Window) NULL)
3874 return(MagickFalse);
3875 root_window=XRootWindow(display,XDefaultScreen(display));
3876 client_window=target_window;
3877 if (target_window != root_window)
3885 status=XGetGeometry(display,target_window,&root_window,&x,&x,&d,&d,&d,&d);
3886 if (status != False)
3888 client_window=XClientWindow(display,target_window);
3889 target_window=client_window;
3893 Verify window is viewable.
3895 status=XGetWindowAttributes(display,target_window,&window_attributes);
3896 if ((status == False) || (window_attributes.map_state != IsViewable))
3897 return(MagickFalse);
3901 (void) XTranslateCoordinates(display,root_window,target_window,
3902 (int) crop_info.x,(int) crop_info.y,&x,&y,&child);
3903 ximage=XGetImage(display,target_window,x,y,1,1,AllPlanes,ZPixmap);
3904 if (ximage == (XImage *) NULL)
3905 return(MagickFalse);
3906 color.pixel=XGetPixel(ximage,0,0);
3907 XDestroyImage(ximage);
3909 Match color against the color database.
3911 (void) XQueryColor(display,window_attributes.colormap,&color);
3912 pixel.red=(double) ScaleShortToQuantum(color.red);
3913 pixel.green=(double) ScaleShortToQuantum(color.green);
3914 pixel.blue=(double) ScaleShortToQuantum(color.blue);
3915 pixel.alpha=OpaqueAlpha;
3916 (void) QueryColorname(windows->image.image,&pixel,X11Compliance,name,
3922 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3926 + X G e t W i n d o w I m a g e %
3930 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3932 % XGetWindowImage() reads an image from the target X window and returns it.
3933 % XGetWindowImage() optionally descends the window hierarchy and overlays the
3934 % target image with each child image in an optimized fashion. Any child
3935 % window that have the same visual, colormap, and are contained by its parent
3938 % The format of the XGetWindowImage method is:
3940 % Image *XGetWindowImage(Display *display,const Window window,
3941 % const unsigned int borders,const unsigned int level,
3942 % ExceptionInfo *exception)
3944 % A description of each parameter follows:
3946 % o display: Specifies a connection to an X server; returned from
3949 % o window: Specifies the window to obtain the image from.
3951 % o borders: Specifies whether borders pixels are to be saved with
3954 % o level: Specifies an unsigned integer representing the level of
3955 % decent in the window hierarchy. This value must be zero or one on
3956 % the initial call to XGetWindowImage. A value of zero returns after
3957 % one call. A value of one causes the function to descend the window
3958 % hierarchy and overlay the target image with each subwindow image.
3960 % o exception: return any errors or warnings in this structure.
3963 static Image *XGetWindowImage(Display *display,const Window window,
3964 const unsigned int borders,const unsigned int level,ExceptionInfo *exception)
3966 typedef struct _ColormapInfo
3974 struct _ColormapInfo
3978 typedef struct _WindowInfo
4014 *colormap_info = (ColormapInfo *) NULL;
4034 Verify window is viewable.
4036 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
4037 assert(display != (Display *) NULL);
4038 status=XGetWindowAttributes(display,window,&window_attributes);
4039 if ((status == False) || (window_attributes.map_state != IsViewable))
4040 return((Image *) NULL);
4042 Cropping rectangle is relative to root window.
4044 root_window=XRootWindow(display,XDefaultScreen(display));
4045 (void) XTranslateCoordinates(display,window,root_window,0,0,&x_offset,
4047 crop_info.x=(ssize_t) x_offset;
4048 crop_info.y=(ssize_t) y_offset;
4049 crop_info.width=(size_t) window_attributes.width;
4050 crop_info.height=(size_t) window_attributes.height;
4051 if (borders != MagickFalse)
4054 Include border in image.
4056 crop_info.x-=(ssize_t) window_attributes.border_width;
4057 crop_info.y-=(ssize_t) window_attributes.border_width;
4058 crop_info.width+=(size_t) (window_attributes.border_width << 1);
4059 crop_info.height+=(size_t) (window_attributes.border_width << 1);
4062 Crop to root window.
4064 if (crop_info.x < 0)
4066 crop_info.width+=crop_info.x;
4069 if (crop_info.y < 0)
4071 crop_info.height+=crop_info.y;
4074 display_width=XDisplayWidth(display,XDefaultScreen(display));
4075 if ((int) (crop_info.x+crop_info.width) > display_width)
4076 crop_info.width=(size_t) (display_width-crop_info.x);
4077 display_height=XDisplayHeight(display,XDefaultScreen(display));
4078 if ((int) (crop_info.y+crop_info.height) > display_height)
4079 crop_info.height=(size_t) (display_height-crop_info.y);
4081 Initialize window info attributes.
4083 if (number_windows >= max_windows)
4086 Allocate or resize window info buffer.
4089 if (window_info == (WindowInfo *) NULL)
4090 window_info=(WindowInfo *) AcquireQuantumMemory((size_t) max_windows,
4091 sizeof(*window_info));
4093 window_info=(WindowInfo *) ResizeQuantumMemory(window_info,(size_t)
4094 max_windows,sizeof(*window_info));
4096 if (window_info == (WindowInfo *) NULL)
4098 ThrowXWindowException(ResourceLimitError,"MemoryAllocationFailed","...");
4099 return((Image *) NULL);
4101 id=number_windows++;
4102 window_info[id].window=window;
4103 window_info[id].visual=window_attributes.visual;
4104 window_info[id].colormap=window_attributes.colormap;
4105 window_info[id].bounds.x1=(short) crop_info.x;
4106 window_info[id].bounds.y1=(short) crop_info.y;
4107 window_info[id].bounds.x2=(short) (crop_info.x+(int) crop_info.width-1);
4108 window_info[id].bounds.y2=(short) (crop_info.y+(int) crop_info.height-1);
4109 crop_info.x-=x_offset;
4110 crop_info.y-=y_offset;
4111 window_info[id].crop_info=crop_info;
4121 Descend the window hierarchy.
4123 status=XQueryTree(display,window,&root_window,&window_info[id].parent,
4124 &children,&number_children);
4125 for (i=0; i < id; i++)
4126 if ((window_info[i].window == window_info[id].parent) &&
4127 (window_info[i].visual == window_info[id].visual) &&
4128 (window_info[i].colormap == window_info[id].colormap))
4130 if ((window_info[id].bounds.x1 < window_info[i].bounds.x1) ||
4131 (window_info[id].bounds.x2 > window_info[i].bounds.x2) ||
4132 (window_info[id].bounds.y1 < window_info[i].bounds.y1) ||
4133 (window_info[id].bounds.y2 > window_info[i].bounds.y2))
4136 Eliminate windows not circumscribed by their parent.
4142 if ((status == True) && (number_children != 0))
4144 for (i=0; i < (int) number_children; i++)
4145 (void) XGetWindowImage(display,children[i],MagickFalse,level+1,
4147 (void) XFree((void *) children);
4188 Get X image for each window in the list.
4190 image=NewImageList();
4191 for (id=0; id < number_windows; id++)
4194 Does target window intersect top level window?
4196 import=((window_info[id].bounds.x2 >= window_info[0].bounds.x1) &&
4197 (window_info[id].bounds.x1 <= window_info[0].bounds.x2) &&
4198 (window_info[id].bounds.y2 >= window_info[0].bounds.y1) &&
4199 (window_info[id].bounds.y1 <= window_info[0].bounds.y2)) ?
4200 MagickTrue : MagickFalse;
4202 Is target window contained by another window with the same colormap?
4204 for (j=0; j < id; j++)
4205 if ((window_info[id].visual == window_info[j].visual) &&
4206 (window_info[id].colormap == window_info[j].colormap))
4208 if ((window_info[id].bounds.x1 >= window_info[j].bounds.x1) &&
4209 (window_info[id].bounds.x2 <= window_info[j].bounds.x2) &&
4210 (window_info[id].bounds.y1 >= window_info[j].bounds.y1) &&
4211 (window_info[id].bounds.y2 <= window_info[j].bounds.y2))
4214 if (import == MagickFalse)
4219 ximage=XGetImage(display,window_info[id].window,(int)
4220 window_info[id].crop_info.x,(int) window_info[id].crop_info.y,
4221 (unsigned int) window_info[id].crop_info.width,(unsigned int)
4222 window_info[id].crop_info.height,AllPlanes,ZPixmap);
4223 if (ximage == (XImage *) NULL)
4226 Initialize window colormap.
4229 colors=(XColor *) NULL;
4230 if (window_info[id].colormap != (Colormap) NULL)
4236 Search colormap list for window colormap.
4238 number_colors=(unsigned int) window_info[id].visual->map_entries;
4239 for (p=colormap_info; p != (ColormapInfo *) NULL; p=p->next)
4240 if (p->colormap == window_info[id].colormap)
4242 if (p == (ColormapInfo *) NULL)
4245 Get the window colormap.
4247 colors=(XColor *) AcquireQuantumMemory(number_colors,
4249 if (colors == (XColor *) NULL)
4251 XDestroyImage(ximage);
4252 return((Image *) NULL);
4254 if ((window_info[id].visual->klass != DirectColor) &&
4255 (window_info[id].visual->klass != TrueColor))
4256 for (i=0; i < (int) number_colors; i++)
4258 colors[i].pixel=(size_t) i;
4272 DirectColor or TrueColor visual.
4277 red_bit=window_info[id].visual->red_mask &
4278 (~(window_info[id].visual->red_mask)+1);
4279 green_bit=window_info[id].visual->green_mask &
4280 (~(window_info[id].visual->green_mask)+1);
4281 blue_bit=window_info[id].visual->blue_mask &
4282 (~(window_info[id].visual->blue_mask)+1);
4283 for (i=0; i < (int) number_colors; i++)
4285 colors[i].pixel=(unsigned long) (red | green | blue);
4288 if (red > window_info[id].visual->red_mask)
4291 if (green > window_info[id].visual->green_mask)
4294 if (blue > window_info[id].visual->blue_mask)
4298 (void) XQueryColors(display,window_info[id].colormap,colors,
4299 (int) number_colors);
4301 Append colormap to colormap list.
4303 p=(ColormapInfo *) AcquireMagickMemory(sizeof(*p));
4304 if (p == (ColormapInfo *) NULL)
4305 return((Image *) NULL);
4306 p->colormap=window_info[id].colormap;
4308 p->next=colormap_info;
4314 Allocate image structure.
4316 composite_image=AcquireImage((ImageInfo *) NULL,exception);
4317 if (composite_image == (Image *) NULL)
4319 XDestroyImage(ximage);
4320 return((Image *) NULL);
4323 Convert X image to MIFF format.
4325 if ((window_info[id].visual->klass != TrueColor) &&
4326 (window_info[id].visual->klass != DirectColor))
4327 composite_image->storage_class=PseudoClass;
4328 composite_image->columns=(size_t) ximage->width;
4329 composite_image->rows=(size_t) ximage->height;
4330 composite_view=AcquireAuthenticCacheView(composite_image,exception);
4331 switch (composite_image->storage_class)
4349 Determine shift and mask for red, green, and blue.
4351 red_mask=window_info[id].visual->red_mask;
4353 while ((red_mask != 0) && ((red_mask & 0x01) == 0))
4358 green_mask=window_info[id].visual->green_mask;
4360 while ((green_mask != 0) && ((green_mask & 0x01) == 0))
4365 blue_mask=window_info[id].visual->blue_mask;
4367 while ((blue_mask != 0) && ((blue_mask & 0x01) == 0))
4373 Convert X image to DirectClass packets.
4375 if ((number_colors != 0) &&
4376 (window_info[id].visual->klass == DirectColor))
4377 for (y=0; y < (int) composite_image->rows; y++)
4379 q=QueueCacheViewAuthenticPixels(composite_view,0,(ssize_t) y,
4380 composite_image->columns,1,exception);
4381 if (q == (Quantum *) NULL)
4383 for (x=0; x < (int) composite_image->columns; x++)
4385 pixel=XGetPixel(ximage,x,y);
4386 index=(pixel >> red_shift) & red_mask;
4387 SetPixelRed(composite_image,
4388 ScaleShortToQuantum(colors[index].red),q);
4389 index=(pixel >> green_shift) & green_mask;
4390 SetPixelGreen(composite_image,
4391 ScaleShortToQuantum(colors[index].green),q);
4392 index=(pixel >> blue_shift) & blue_mask;
4393 SetPixelBlue(composite_image,
4394 ScaleShortToQuantum(colors[index].blue),q);
4395 q+=GetPixelChannels(composite_image);
4397 status=SyncCacheViewAuthenticPixels(composite_view,exception);
4398 if (status == MagickFalse)
4402 for (y=0; y < (int) composite_image->rows; y++)
4404 q=QueueCacheViewAuthenticPixels(composite_view,0,(ssize_t) y,
4405 composite_image->columns,1,exception);
4406 if (q == (Quantum *) NULL)
4408 for (x=0; x < (int) composite_image->columns; x++)
4410 pixel=XGetPixel(ximage,x,y);
4411 color=(pixel >> red_shift) & red_mask;
4413 color=(65535UL*color)/red_mask;
4414 SetPixelRed(composite_image,ScaleShortToQuantum(
4415 (unsigned short) color),q);
4416 color=(pixel >> green_shift) & green_mask;
4417 if (green_mask != 0)
4418 color=(65535UL*color)/green_mask;
4419 SetPixelGreen(composite_image,ScaleShortToQuantum(
4420 (unsigned short) color),q);
4421 color=(pixel >> blue_shift) & blue_mask;
4423 color=(65535UL*color)/blue_mask;
4424 SetPixelBlue(composite_image,ScaleShortToQuantum(
4425 (unsigned short) color),q);
4426 q+=GetPixelChannels(composite_image);
4428 status=SyncCacheViewAuthenticPixels(composite_view,exception);
4429 if (status == MagickFalse)
4439 status=AcquireImageColormap(composite_image,number_colors,
4441 if (status == MagickFalse)
4443 XDestroyImage(ximage);
4444 composite_image=DestroyImage(composite_image);
4445 return((Image *) NULL);
4447 for (i=0; i < (int) composite_image->colors; i++)
4449 composite_image->colormap[colors[i].pixel].red=(double)
4450 ScaleShortToQuantum(colors[i].red);
4451 composite_image->colormap[colors[i].pixel].green=(double)
4452 ScaleShortToQuantum(colors[i].green);
4453 composite_image->colormap[colors[i].pixel].blue=(double)
4454 ScaleShortToQuantum(colors[i].blue);
4457 Convert X image to PseudoClass packets.
4459 for (y=0; y < (int) composite_image->rows; y++)
4461 q=QueueCacheViewAuthenticPixels(composite_view,0,(ssize_t) y,
4462 composite_image->columns,1,exception);
4463 if (q == (Quantum *) NULL)
4465 for (x=0; x < (int) composite_image->columns; x++)
4467 index=(Quantum) XGetPixel(ximage,x,y);
4468 SetPixelIndex(composite_image,index,q);
4469 SetPixelViaPixelInfo(composite_image,
4470 composite_image->colormap+(ssize_t) index,q);
4471 q+=GetPixelChannels(composite_image);
4473 status=SyncCacheViewAuthenticPixels(composite_view,exception);
4474 if (status == MagickFalse)
4480 composite_view=DestroyCacheView(composite_view);
4481 XDestroyImage(ximage);
4482 if (image == (Image *) NULL)
4484 image=composite_image;
4488 Composite any children in back-to-front order.
4490 (void) XTranslateCoordinates(display,window_info[id].window,window,0,0,
4491 &x_offset,&y_offset,&child);
4492 x_offset-=(int) crop_info.x;
4495 y_offset-=(int) crop_info.y;
4498 (void) CompositeImage(image,composite_image,CopyCompositeOp,MagickTrue,
4499 (ssize_t) x_offset,(ssize_t) y_offset,exception);
4500 composite_image=DestroyImage(composite_image);
4503 Relinquish resources.
4505 while (colormap_info != (ColormapInfo *) NULL)
4507 next=colormap_info->next;
4508 colormap_info->colors=(XColor *) RelinquishMagickMemory(
4509 colormap_info->colors);
4510 colormap_info=(ColormapInfo *) RelinquishMagickMemory(colormap_info);
4514 Relinquish resources and restore initial state.
4516 window_info=(WindowInfo *) RelinquishMagickMemory(window_info);
4519 colormap_info=(ColormapInfo *) NULL;
4522 return((Image *) NULL);
4526 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4530 % X G e t W i n d o w I n f o %
4534 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4536 % XGetWindowInfo() initializes the XWindowInfo structure.
4538 % The format of the XGetWindowInfo method is:
4540 % void XGetWindowInfo(Display *display,XVisualInfo *visual_info,
4541 % XStandardColormap *map_info,XPixelInfo *pixel,XFontStruct *font_info,
4542 % XResourceInfo *resource_info,XWindowInfo *window)
4543 % resource_info,window)
4545 % A description of each parameter follows:
4547 % o display: Specifies a connection to an X server; returned from
4550 % o visual_info: Specifies a pointer to a X11 XVisualInfo structure;
4551 % returned from XGetVisualInfo.
4553 % o map_info: If map_type is specified, this structure is initialized
4554 % with info from the Standard Colormap.
4556 % o pixel: Specifies a pointer to a XPixelInfo structure.
4558 % o font_info: Specifies a pointer to a XFontStruct structure.
4560 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
4563 MagickPrivate void XGetWindowInfo(Display *display,XVisualInfo *visual_info,
4564 XStandardColormap *map_info,XPixelInfo *pixel,XFontStruct *font_info,
4565 XResourceInfo *resource_info,XWindowInfo *window)
4568 Initialize window info.
4570 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
4571 assert(display != (Display *) NULL);
4572 assert(visual_info != (XVisualInfo *) NULL);
4573 assert(map_info != (XStandardColormap *) NULL);
4574 assert(pixel != (XPixelInfo *) NULL);
4575 assert(resource_info != (XResourceInfo *) NULL);
4576 assert(window != (XWindowInfo *) NULL);
4577 if (window->id != (Window) NULL)
4579 if (window->cursor != (Cursor) NULL)
4580 (void) XFreeCursor(display,window->cursor);
4581 if (window->busy_cursor != (Cursor) NULL)
4582 (void) XFreeCursor(display,window->busy_cursor);
4583 if (window->highlight_stipple != (Pixmap) NULL)
4584 (void) XFreePixmap(display,window->highlight_stipple);
4585 if (window->shadow_stipple != (Pixmap) NULL)
4586 (void) XFreePixmap(display,window->shadow_stipple);
4587 if (window->name == (char *) NULL)
4588 window->name=AcquireString("");
4589 if (window->icon_name == (char *) NULL)
4590 window->icon_name=AcquireString("");
4595 Initialize these attributes just once.
4597 window->id=(Window) NULL;
4598 if (window->name == (char *) NULL)
4599 window->name=AcquireString("");
4600 if (window->icon_name == (char *) NULL)
4601 window->icon_name=AcquireString("");
4602 window->x=XDisplayWidth(display,visual_info->screen) >> 1;
4603 window->y=XDisplayWidth(display,visual_info->screen) >> 1;
4604 window->ximage=(XImage *) NULL;
4605 window->matte_image=(XImage *) NULL;
4606 window->pixmap=(Pixmap) NULL;
4607 window->matte_pixmap=(Pixmap) NULL;
4608 window->mapped=MagickFalse;
4609 window->stasis=MagickFalse;
4610 window->shared_memory=MagickTrue;
4611 window->segment_info=(void *) NULL;
4612 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
4617 if (window->segment_info == (void *) NULL)
4618 window->segment_info=AcquireCriticalMemory(2*sizeof(*segment_info));
4619 segment_info=(XShmSegmentInfo *) window->segment_info;
4620 segment_info[0].shmid=(-1);
4621 segment_info[0].shmaddr=(char *) NULL;
4622 segment_info[1].shmid=(-1);
4623 segment_info[1].shmaddr=(char *) NULL;
4628 Initialize these attributes every time function is called.
4630 window->screen=visual_info->screen;
4631 window->root=XRootWindow(display,visual_info->screen);
4632 window->visual=visual_info->visual;
4633 window->storage_class=(unsigned int) visual_info->klass;
4634 window->depth=(unsigned int) visual_info->depth;
4635 window->visual_info=visual_info;
4636 window->map_info=map_info;
4637 window->pixel_info=pixel;
4638 window->font_info=font_info;
4639 window->cursor=XCreateFontCursor(display,XC_left_ptr);
4640 window->busy_cursor=XCreateFontCursor(display,XC_watch);
4641 window->geometry=(char *) NULL;
4642 window->icon_geometry=(char *) NULL;
4643 if (resource_info->icon_geometry != (char *) NULL)
4644 (void) CloneString(&window->icon_geometry,resource_info->icon_geometry);
4645 window->crop_geometry=(char *) NULL;
4646 window->flags=(size_t) PSize;
4649 window->min_width=1;
4650 window->min_height=1;
4651 window->width_inc=1;
4652 window->height_inc=1;
4653 window->border_width=resource_info->border_width;
4654 window->annotate_context=pixel->annotate_context;
4655 window->highlight_context=pixel->highlight_context;
4656 window->widget_context=pixel->widget_context;
4657 window->shadow_stipple=(Pixmap) NULL;
4658 window->highlight_stipple=(Pixmap) NULL;
4659 window->use_pixmap=MagickTrue;
4660 window->immutable=MagickFalse;
4661 window->shape=MagickFalse;
4663 window->mask=(int) (CWBackingStore | CWBackPixel | CWBackPixmap |
4664 CWBitGravity | CWBorderPixel | CWColormap | CWCursor | CWDontPropagate |
4665 CWEventMask | CWOverrideRedirect | CWSaveUnder | CWWinGravity);
4666 window->attributes.background_pixel=pixel->background_color.pixel;
4667 window->attributes.background_pixmap=(Pixmap) NULL;
4668 window->attributes.bit_gravity=ForgetGravity;
4669 window->attributes.backing_store=WhenMapped;
4670 window->attributes.save_under=MagickTrue;
4671 window->attributes.border_pixel=pixel->border_color.pixel;
4672 window->attributes.colormap=map_info->colormap;
4673 window->attributes.cursor=window->cursor;
4674 window->attributes.do_not_propagate_mask=NoEventMask;
4675 window->attributes.event_mask=NoEventMask;
4676 window->attributes.override_redirect=MagickFalse;
4677 window->attributes.win_gravity=NorthWestGravity;
4678 window->orphan=MagickFalse;
4682 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4686 % X H i g h l i g h t E l l i p s e %
4690 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4692 % XHighlightEllipse() puts a border on the X server around a region defined by
4695 % The format of the XHighlightEllipse method is:
4697 % void XHighlightEllipse(Display *display,Window window,
4698 % GC annotate_context,const RectangleInfo *highlight_info)
4700 % A description of each parameter follows:
4702 % o display: Specifies a connection to an X server; returned from
4705 % o window: Specifies a pointer to a Window structure.
4707 % o annotate_context: Specifies a pointer to a GC structure.
4709 % o highlight_info: Specifies a pointer to a RectangleInfo structure. It
4710 % contains the extents of any highlighting rectangle.
4713 MagickPrivate void XHighlightEllipse(Display *display,Window window,
4714 GC annotate_context,const RectangleInfo *highlight_info)
4716 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
4717 assert(display != (Display *) NULL);
4718 assert(window != (Window) NULL);
4719 assert(annotate_context != (GC) NULL);
4720 assert(highlight_info != (RectangleInfo *) NULL);
4721 if ((highlight_info->width < 4) || (highlight_info->height < 4))
4723 (void) XDrawArc(display,window,annotate_context,(int) highlight_info->x,
4724 (int) highlight_info->y,(unsigned int) highlight_info->width-1,
4725 (unsigned int) highlight_info->height-1,0,360*64);
4726 (void) XDrawArc(display,window,annotate_context,(int) highlight_info->x+1,
4727 (int) highlight_info->y+1,(unsigned int) highlight_info->width-3,
4728 (unsigned int) highlight_info->height-3,0,360*64);
4732 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4736 % X H i g h l i g h t L i n e %
4740 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4742 % XHighlightLine() puts a border on the X server around a region defined by
4745 % The format of the XHighlightLine method is:
4747 % void XHighlightLine(Display *display,Window window,GC annotate_context,
4748 % const XSegment *highlight_info)
4750 % A description of each parameter follows:
4752 % o display: Specifies a connection to an X server; returned from
4755 % o window: Specifies a pointer to a Window structure.
4757 % o annotate_context: Specifies a pointer to a GC structure.
4759 % o highlight_info: Specifies a pointer to a RectangleInfo structure. It
4760 % contains the extents of any highlighting rectangle.
4763 MagickPrivate void XHighlightLine(Display *display,Window window,
4764 GC annotate_context,const XSegment *highlight_info)
4766 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
4767 assert(display != (Display *) NULL);
4768 assert(window != (Window) NULL);
4769 assert(annotate_context != (GC) NULL);
4770 assert(highlight_info != (XSegment *) NULL);
4771 (void) XDrawLine(display,window,annotate_context,highlight_info->x1,
4772 highlight_info->y1,highlight_info->x2,highlight_info->y2);
4776 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4780 % X H i g h l i g h t R e c t a n g l e %
4784 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4786 % XHighlightRectangle() puts a border on the X server around a region defined
4787 % by highlight_info.
4789 % The format of the XHighlightRectangle method is:
4791 % void XHighlightRectangle(Display *display,Window window,
4792 % GC annotate_context,const RectangleInfo *highlight_info)
4794 % A description of each parameter follows:
4796 % o display: Specifies a connection to an X server; returned from
4799 % o window: Specifies a pointer to a Window structure.
4801 % o annotate_context: Specifies a pointer to a GC structure.
4803 % o highlight_info: Specifies a pointer to a RectangleInfo structure. It
4804 % contains the extents of any highlighting rectangle.
4807 MagickPrivate void XHighlightRectangle(Display *display,Window window,
4808 GC annotate_context,const RectangleInfo *highlight_info)
4810 assert(display != (Display *) NULL);
4811 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
4812 assert(window != (Window) NULL);
4813 assert(annotate_context != (GC) NULL);
4814 assert(highlight_info != (RectangleInfo *) NULL);
4815 if ((highlight_info->width < 4) || (highlight_info->height < 4))
4817 (void) XDrawRectangle(display,window,annotate_context,(int) highlight_info->x,
4818 (int) highlight_info->y,(unsigned int) highlight_info->width-1,
4819 (unsigned int) highlight_info->height-1);
4820 (void) XDrawRectangle(display,window,annotate_context,(int) highlight_info->x+
4821 1,(int) highlight_info->y+1,(unsigned int) highlight_info->width-3,
4822 (unsigned int) highlight_info->height-3);
4826 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4830 % X I m p o r t I m a g e %
4834 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4836 % XImportImage() reads an image from an X window.
4838 % The format of the XImportImage method is:
4840 % Image *XImportImage(const ImageInfo *image_info,XImportInfo *ximage_info,
4841 % ExceptionInfo *exception)
4843 % A description of each parameter follows:
4845 % o image_info: the image info.
4847 % o ximage_info: Specifies a pointer to an XImportInfo structure.
4849 % o exception: return any errors or warnings in this structure.
4852 MagickExport Image *XImportImage(const ImageInfo *image_info,
4853 XImportInfo *ximage_info,ExceptionInfo *exception)
4886 Open X server connection.
4888 assert(image_info != (const ImageInfo *) NULL);
4889 assert(image_info->signature == MagickCoreSignature);
4890 if (image_info->debug != MagickFalse)
4891 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
4892 image_info->filename);
4893 assert(ximage_info != (XImportInfo *) NULL);
4894 display=XOpenDisplay(image_info->server_name);
4895 if (display == (Display *) NULL)
4897 ThrowXWindowException(XServerError,"UnableToOpenXServer",
4898 XDisplayName(image_info->server_name));
4899 return((Image *) NULL);
4902 Set our forgiving exception handler.
4904 (void) XSetErrorHandler(XError);
4906 Select target window.
4912 root=XRootWindow(display,XDefaultScreen(display));
4913 target=(Window) NULL;
4914 if (*image_info->filename != '\0')
4916 if (LocaleCompare(image_info->filename,"root") == 0)
4921 Select window by ID or name.
4923 if (isdigit((int) ((unsigned char) *image_info->filename)) != 0)
4924 target=XWindowByID(display,root,(Window)
4925 strtol(image_info->filename,(char **) NULL,0));
4926 if (target == (Window) NULL)
4927 target=XWindowByName(display,root,image_info->filename);
4928 if (target == (Window) NULL)
4929 ThrowXWindowException(XServerError,"NoWindowWithSpecifiedIDExists",
4930 image_info->filename);
4934 If target window is not defined, interactively select one.
4936 prior_target=target;
4937 if (target == (Window) NULL)
4938 target=XSelectWindow(display,&crop_info);
4939 if (target == (Window) NULL)
4940 ThrowXWindowException(XServerError,"UnableToReadXWindowImage",
4941 image_info->filename);
4942 client=target; /* obsolete */
4948 status=XGetGeometry(display,target,&root,&x,&x,&d,&d,&d,&d);
4949 if (status != False)
4957 Find window manager frame.
4959 status=XQueryTree(display,target,&root,&parent,&children,&d);
4960 if ((status != False) && (children != (Window *) NULL))
4961 (void) XFree((char *) children);
4962 if ((status == False) || (parent == (Window) NULL) ||
4970 client=XClientWindow(display,target);
4971 if (ximage_info->frame == MagickFalse)
4973 if ((ximage_info->frame == MagickFalse) &&
4974 (prior_target != MagickFalse))
4975 target=prior_target;
4978 if (ximage_info->screen)
4990 Obtain window image directly from screen.
4992 status=XGetWindowAttributes(display,target,&window_attributes);
4993 if (status == False)
4995 ThrowXWindowException(XServerError,"UnableToReadXWindowAttributes",
4996 image_info->filename);
4997 (void) XCloseDisplay(display);
4998 return((Image *) NULL);
5000 (void) XTranslateCoordinates(display,target,root,0,0,&x,&y,&child);
5001 crop_info.x=(ssize_t) x;
5002 crop_info.y=(ssize_t) y;
5003 crop_info.width=(size_t) window_attributes.width;
5004 crop_info.height=(size_t) window_attributes.height;
5005 if (ximage_info->borders != 0)
5008 Include border in image.
5010 crop_info.x-=window_attributes.border_width;
5011 crop_info.y-=window_attributes.border_width;
5012 crop_info.width+=window_attributes.border_width << 1;
5013 crop_info.height+=window_attributes.border_width << 1;
5018 If WM_COLORMAP_WINDOWS property is set or multiple colormaps, descend.
5021 status=XGetWMColormapWindows(display,target,&children,&number_windows);
5022 if ((status == True) && (number_windows > 0))
5024 ximage_info->descend=MagickTrue;
5025 (void) XFree ((char *) children);
5027 colormaps=XListInstalledColormaps(display,target,&number_colormaps);
5028 if (number_colormaps > 0)
5030 if (number_colormaps > 1)
5031 ximage_info->descend=MagickTrue;
5032 (void) XFree((char *) colormaps);
5035 Alert the user not to alter the screen.
5037 if (ximage_info->silent == MagickFalse)
5038 (void) XBell(display,0);
5040 Get image by window id.
5042 (void) XGrabServer(display);
5043 image=XGetWindowImage(display,target,ximage_info->borders,
5044 ximage_info->descend ? 1U : 0U,exception);
5045 (void) XUngrabServer(display);
5046 if (image == (Image *) NULL)
5047 ThrowXWindowException(XServerError,"UnableToReadXWindowImage",
5048 image_info->filename)
5051 (void) CopyMagickString(image->filename,image_info->filename,
5053 if ((crop_info.width != 0) && (crop_info.height != 0))
5060 Crop image as defined by the cropping rectangle.
5062 clone_image=CloneImage(image,0,0,MagickTrue,exception);
5063 if (clone_image != (Image *) NULL)
5065 crop_image=CropImage(clone_image,&crop_info,exception);
5066 if (crop_image != (Image *) NULL)
5068 image=DestroyImage(image);
5073 status=XGetWMName(display,target,&window_name);
5076 if (*image_info->filename == '\0')
5077 (void) CopyMagickString(image->filename,(char *) window_name.value,
5078 (size_t) window_name.nitems+1);
5079 (void) XFree((void *) window_name.value);
5082 if (ximage_info->silent == MagickFalse)
5085 Alert the user we're done.
5087 (void) XBell(display,0);
5088 (void) XBell(display,0);
5090 (void) XCloseDisplay(display);
5095 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5099 % X I n i t i a l i z e W i n d o w s %
5103 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5105 % XInitializeWindows() initializes the XWindows structure.
5107 % The format of the XInitializeWindows method is:
5109 % XWindows *XInitializeWindows(Display *display,
5110 % XResourceInfo *resource_info)
5112 % A description of each parameter follows:
5114 % o windows: XInitializeWindows returns a pointer to a XWindows structure.
5116 % o display: Specifies a connection to an X server; returned from
5119 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
5122 MagickPrivate XWindows *XInitializeWindows(Display *display,
5123 XResourceInfo *resource_info)
5132 Allocate windows structure.
5134 windows=(XWindows *) AcquireMagickMemory(sizeof(*windows));
5135 if (windows == (XWindows *) NULL)
5137 ThrowXWindowFatalException(XServerFatalError,"MemoryAllocationFailed",
5139 return((XWindows *) NULL);
5141 (void) ResetMagickMemory(windows,0,sizeof(*windows));
5142 windows->pixel_info=(XPixelInfo *) AcquireMagickMemory(
5143 sizeof(*windows->pixel_info));
5144 windows->icon_pixel=(XPixelInfo *) AcquireMagickMemory(
5145 sizeof(*windows->icon_pixel));
5146 windows->icon_resources=(XResourceInfo *) AcquireMagickMemory(
5147 sizeof(*windows->icon_resources));
5148 if ((windows->pixel_info == (XPixelInfo *) NULL) ||
5149 (windows->icon_pixel == (XPixelInfo *) NULL) ||
5150 (windows->icon_resources == (XResourceInfo *) NULL))
5152 ThrowXWindowFatalException(XServerFatalError,"MemoryAllocationFailed",
5154 return((XWindows *) NULL);
5157 Initialize windows structure.
5159 windows->display=display;
5160 windows->wm_protocols=XInternAtom(display,"WM_PROTOCOLS",MagickFalse);
5161 windows->wm_delete_window=XInternAtom(display,"WM_DELETE_WINDOW",MagickFalse);
5162 windows->wm_take_focus=XInternAtom(display,"WM_TAKE_FOCUS",MagickFalse);
5163 windows->im_protocols=XInternAtom(display,"IM_PROTOCOLS",MagickFalse);
5164 windows->im_remote_command=
5165 XInternAtom(display,"IM_REMOTE_COMMAND",MagickFalse);
5166 windows->im_update_widget=XInternAtom(display,"IM_UPDATE_WIDGET",MagickFalse);
5167 windows->im_update_colormap=
5168 XInternAtom(display,"IM_UPDATE_COLORMAP",MagickFalse);
5169 windows->im_former_image=XInternAtom(display,"IM_FORMER_IMAGE",MagickFalse);
5170 windows->im_next_image=XInternAtom(display,"IM_NEXT_IMAGE",MagickFalse);
5171 windows->im_retain_colors=XInternAtom(display,"IM_RETAIN_COLORS",MagickFalse);
5172 windows->im_exit=XInternAtom(display,"IM_EXIT",MagickFalse);
5173 windows->dnd_protocols=XInternAtom(display,"DndProtocol",MagickFalse);
5174 #if defined(MAGICKCORE_WINDOWS_SUPPORT)
5175 (void) XSynchronize(display,IsWindows95());
5177 if (IsEventLogging())
5179 (void) XSynchronize(display,MagickTrue);
5180 (void) LogMagickEvent(X11Event,GetMagickModule(),"Version: %s",
5181 GetMagickVersion((size_t *) NULL));
5182 (void) LogMagickEvent(X11Event,GetMagickModule(),"Protocols:");
5183 (void) LogMagickEvent(X11Event,GetMagickModule(),
5184 " Window Manager: 0x%lx",windows->wm_protocols);
5185 (void) LogMagickEvent(X11Event,GetMagickModule(),
5186 " delete window: 0x%lx",windows->wm_delete_window);
5187 (void) LogMagickEvent(X11Event,GetMagickModule()," take focus: 0x%lx",
5188 windows->wm_take_focus);
5189 (void) LogMagickEvent(X11Event,GetMagickModule()," ImageMagick: 0x%lx",
5190 windows->im_protocols);
5191 (void) LogMagickEvent(X11Event,GetMagickModule(),
5192 " remote command: 0x%lx",windows->im_remote_command);
5193 (void) LogMagickEvent(X11Event,GetMagickModule(),
5194 " update widget: 0x%lx",windows->im_update_widget);
5195 (void) LogMagickEvent(X11Event,GetMagickModule(),
5196 " update colormap: 0x%lx",windows->im_update_colormap);
5197 (void) LogMagickEvent(X11Event,GetMagickModule(),
5198 " former image: 0x%lx",windows->im_former_image);
5199 (void) LogMagickEvent(X11Event,GetMagickModule()," next image: 0x%lx",
5200 windows->im_next_image);
5201 (void) LogMagickEvent(X11Event,GetMagickModule(),
5202 " retain colors: 0x%lx",windows->im_retain_colors);
5203 (void) LogMagickEvent(X11Event,GetMagickModule()," exit: 0x%lx",
5205 (void) LogMagickEvent(X11Event,GetMagickModule()," Drag and Drop: 0x%lx",
5206 windows->dnd_protocols);
5209 Allocate standard colormap.
5211 windows->map_info=XAllocStandardColormap();
5212 windows->icon_map=XAllocStandardColormap();
5213 if ((windows->map_info == (XStandardColormap *) NULL) ||
5214 (windows->icon_map == (XStandardColormap *) NULL))
5215 ThrowXWindowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed",
5217 windows->map_info->colormap=(Colormap) NULL;
5218 windows->icon_map->colormap=(Colormap) NULL;
5219 windows->pixel_info->pixels=(unsigned long *) NULL;
5220 windows->pixel_info->annotate_context=(GC) NULL;
5221 windows->pixel_info->highlight_context=(GC) NULL;
5222 windows->pixel_info->widget_context=(GC) NULL;
5223 windows->font_info=(XFontStruct *) NULL;
5224 windows->icon_pixel->annotate_context=(GC) NULL;
5225 windows->icon_pixel->pixels=(unsigned long *) NULL;
5229 *windows->icon_resources=(*resource_info);
5230 windows->icon_resources->visual_type=(char *) "default";
5231 windows->icon_resources->colormap=SharedColormap;
5232 windows->visual_info=
5233 XBestVisualInfo(display,windows->map_info,resource_info);
5234 windows->icon_visual=
5235 XBestVisualInfo(display,windows->icon_map,windows->icon_resources);
5236 if ((windows->visual_info == (XVisualInfo *) NULL) ||
5237 (windows->icon_visual == (XVisualInfo *) NULL))
5238 ThrowXWindowFatalException(XServerFatalError,"UnableToGetVisual",
5239 resource_info->visual_type);
5240 if (IsEventLogging())
5242 (void) LogMagickEvent(X11Event,GetMagickModule(),"Visual:");
5243 (void) LogMagickEvent(X11Event,GetMagickModule()," visual id: 0x%lx",
5244 windows->visual_info->visualid);
5245 (void) LogMagickEvent(X11Event,GetMagickModule()," class: %s",
5246 XVisualClassName(windows->visual_info->klass));
5247 (void) LogMagickEvent(X11Event,GetMagickModule()," depth: %d planes",
5248 windows->visual_info->depth);
5249 (void) LogMagickEvent(X11Event,GetMagickModule(),
5250 " size of colormap: %d entries",windows->visual_info->colormap_size);
5251 (void) LogMagickEvent(X11Event,GetMagickModule(),
5252 " red, green, blue masks: 0x%lx 0x%lx 0x%lx",
5253 windows->visual_info->red_mask,windows->visual_info->green_mask,
5254 windows->visual_info->blue_mask);
5255 (void) LogMagickEvent(X11Event,GetMagickModule(),
5256 " significant bits in color: %d bits",
5257 windows->visual_info->bits_per_rgb);
5260 Allocate class and manager hints.
5262 windows->class_hints=XAllocClassHint();
5263 windows->manager_hints=XAllocWMHints();
5264 if ((windows->class_hints == (XClassHint *) NULL) ||
5265 (windows->manager_hints == (XWMHints *) NULL))
5266 ThrowXWindowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed",
5269 Determine group leader if we have one.
5271 root_window=XRootWindow(display,windows->visual_info->screen);
5272 windows->group_leader.id=(Window) NULL;
5273 if (resource_info->window_group != (char *) NULL)
5275 if (isdigit((int) ((unsigned char) *resource_info->window_group)) != 0)
5276 windows->group_leader.id=XWindowByID(display,root_window,(Window)
5277 strtol((char *) resource_info->window_group,(char **) NULL,0));
5278 if (windows->group_leader.id == (Window) NULL)
5279 windows->group_leader.id=
5280 XWindowByName(display,root_window,resource_info->window_group);
5286 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5290 % X M a k e C u r s o r %
5294 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5296 % XMakeCursor() creates a crosshairs X11 cursor.
5298 % The format of the XMakeCursor method is:
5300 % Cursor XMakeCursor(Display *display,Window window,Colormap colormap,
5301 % char *background_color,char *foreground_color)
5303 % A description of each parameter follows:
5305 % o display: Specifies a connection to an X server; returned from
5308 % o window: Specifies the ID of the window for which the cursor is
5311 % o colormap: Specifies the ID of the colormap from which the background
5312 % and foreground color will be retrieved.
5314 % o background_color: Specifies the color to use for the cursor background.
5316 % o foreground_color: Specifies the color to use for the cursor foreground.
5319 MagickPrivate Cursor XMakeCursor(Display *display,Window window,
5320 Colormap colormap,char *background_color,char *foreground_color)
5322 #define scope_height 17
5323 #define scope_x_hot 8
5324 #define scope_y_hot 8
5325 #define scope_width 17
5327 static const unsigned char
5330 0x80, 0x03, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02,
5331 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x7f,
5332 0xfc, 0x01, 0x01, 0x00, 0x01, 0x7f, 0xfc, 0x01, 0x80, 0x02, 0x00,
5333 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02,
5334 0x00, 0x80, 0x02, 0x00, 0x80, 0x03, 0x00
5338 0xc0, 0x07, 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x06, 0x00, 0xc0, 0x06,
5339 0x00, 0xc0, 0x06, 0x00, 0xc0, 0x06, 0x00, 0xff, 0xfe, 0x01, 0x7f,
5340 0xfc, 0x01, 0x03, 0x80, 0x01, 0x7f, 0xfc, 0x01, 0xff, 0xfe, 0x01,
5341 0xc0, 0x06, 0x00, 0xc0, 0x06, 0x00, 0xc0, 0x06, 0x00, 0xc0, 0x06,
5342 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x07, 0x00
5356 assert(display != (Display *) NULL);
5357 assert(window != (Window) NULL);
5358 assert(colormap != (Colormap) NULL);
5359 assert(background_color != (char *) NULL);
5360 assert(foreground_color != (char *) NULL);
5361 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",background_color);
5362 source=XCreateBitmapFromData(display,window,(char *) scope_bits,scope_width,
5364 mask=XCreateBitmapFromData(display,window,(char *) scope_mask_bits,
5365 scope_width,scope_height);
5366 if ((source == (Pixmap) NULL) || (mask == (Pixmap) NULL))
5368 ThrowXWindowException(XServerError,"UnableToCreatePixmap","...");
5369 return((Cursor) NULL);
5371 (void) XParseColor(display,colormap,background_color,&background);
5372 (void) XParseColor(display,colormap,foreground_color,&foreground);
5373 cursor=XCreatePixmapCursor(display,source,mask,&foreground,&background,
5374 scope_x_hot,scope_y_hot);
5375 (void) XFreePixmap(display,source);
5376 (void) XFreePixmap(display,mask);
5381 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5385 % X M a k e I m a g e %
5389 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5391 % XMakeImage() creates an X11 image. If the image size differs from the X11
5392 % image size, the image is first resized.
5394 % The format of the XMakeImage method is:
5396 % MagickBooleanType XMakeImage(Display *display,
5397 % const XResourceInfo *resource_info,XWindowInfo *window,Image *image,
5398 % unsigned int width,unsigned int height,ExceptionInfo *exception)
5400 % A description of each parameter follows:
5402 % o display: Specifies a connection to an X server; returned from
5405 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
5407 % o window: Specifies a pointer to a XWindowInfo structure.
5409 % o image: the image.
5411 % o width: Specifies the width in pixels of the rectangular area to
5414 % o height: Specifies the height in pixels of the rectangular area to
5417 % o exception: return any errors or warnings in this structure.
5420 MagickPrivate MagickBooleanType XMakeImage(Display *display,
5421 const XResourceInfo *resource_info,XWindowInfo *window,Image *image,
5422 unsigned int width,unsigned int height,ExceptionInfo *exception)
5424 #define CheckOverflowException(length,width,height) \
5425 (((height) != 0) && ((length)/((size_t) height) != ((size_t) width)))
5438 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
5439 assert(display != (Display *) NULL);
5440 assert(resource_info != (XResourceInfo *) NULL);
5441 assert(window != (XWindowInfo *) NULL);
5443 assert(height != 0);
5444 if ((window->width == 0) || (window->height == 0))
5445 return(MagickFalse);
5447 Apply user transforms to the image.
5449 (void) XCheckDefineCursor(display,window->id,window->busy_cursor);
5450 (void) XFlush(display);
5451 depth=(int) window->depth;
5452 if (window->destroy)
5453 window->image=DestroyImage(window->image);
5454 window->image=image;
5455 window->destroy=MagickFalse;
5456 if (window->image != (Image *) NULL)
5458 if (window->crop_geometry != (char *) NULL)
5469 window->image->page.x=0;
5470 window->image->page.y=0;
5471 (void) ParsePageGeometry(window->image,window->crop_geometry,
5472 &crop_info,exception);
5473 crop_image=CropImage(window->image,&crop_info,exception);
5474 if (crop_image != (Image *) NULL)
5476 if (window->image != image)
5477 window->image=DestroyImage(window->image);
5478 window->image=crop_image;
5479 window->destroy=MagickTrue;
5482 if ((width != (unsigned int) window->image->columns) ||
5483 (height != (unsigned int) window->image->rows))
5491 resize_image=NewImageList();
5492 if ((window->pixel_info->colors == 0) &&
5493 (window->image->rows > (unsigned long) XDisplayHeight(display,window->screen)) &&
5494 (window->image->columns > (unsigned long) XDisplayWidth(display,window->screen)))
5495 resize_image=ResizeImage(window->image,width,height,
5496 image->filter,exception);
5499 if (window->image->storage_class == PseudoClass)
5500 resize_image=SampleImage(window->image,width,height,
5503 resize_image=ThumbnailImage(window->image,width,height,
5506 if (resize_image != (Image *) NULL)
5508 if (window->image != image)
5509 window->image=DestroyImage(window->image);
5510 window->image=resize_image;
5511 window->destroy=MagickTrue;
5514 width=(unsigned int) window->image->columns;
5515 assert((size_t) width == window->image->columns);
5516 height=(unsigned int) window->image->rows;
5517 assert((size_t) height == window->image->rows);
5522 ximage=(XImage *) NULL;
5523 format=(depth == 1) ? XYBitmap : ZPixmap;
5524 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
5525 if (window->shared_memory != MagickFalse)
5530 segment_info=(XShmSegmentInfo *) window->segment_info;
5531 segment_info[1].shmid=(-1);
5532 segment_info[1].shmaddr=(char *) NULL;
5533 ximage=XShmCreateImage(display,window->visual,(unsigned int) depth,format,
5534 (char *) NULL,&segment_info[1],width,height);
5535 if (ximage == (XImage *) NULL)
5536 window->shared_memory=MagickFalse;
5539 length=(size_t) ximage->bytes_per_line*ximage->height;
5540 if (CheckOverflowException(length,ximage->bytes_per_line,ximage->height))
5541 window->shared_memory=MagickFalse;
5543 if (window->shared_memory != MagickFalse)
5544 segment_info[1].shmid=shmget(IPC_PRIVATE,length,IPC_CREAT | 0777);
5545 if (window->shared_memory != MagickFalse)
5546 segment_info[1].shmaddr=(char *) shmat(segment_info[1].shmid,0,0);
5547 if (segment_info[1].shmid < 0)
5548 window->shared_memory=MagickFalse;
5549 if (window->shared_memory != MagickFalse)
5550 (void) shmctl(segment_info[1].shmid,IPC_RMID,0);
5553 if (ximage != (XImage *) NULL)
5554 XDestroyImage(ximage);
5555 ximage=(XImage *) NULL;
5556 if (segment_info[1].shmaddr)
5558 (void) shmdt(segment_info[1].shmaddr);
5559 segment_info[1].shmaddr=(char *) NULL;
5561 if (segment_info[1].shmid >= 0)
5563 (void) shmctl(segment_info[1].shmid,IPC_RMID,0);
5564 segment_info[1].shmid=(-1);
5570 Allocate X image pixel data.
5572 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
5573 if (window->shared_memory)
5581 (void) XSync(display,MagickFalse);
5582 xerror_alert=MagickFalse;
5583 segment_info=(XShmSegmentInfo *) window->segment_info;
5584 ximage->data=segment_info[1].shmaddr;
5585 segment_info[1].readOnly=MagickFalse;
5586 status=XShmAttach(display,&segment_info[1]);
5587 if (status != False)
5588 (void) XSync(display,MagickFalse);
5589 if ((status == False) || (xerror_alert != MagickFalse))
5591 window->shared_memory=MagickFalse;
5592 if (status != False)
5593 XShmDetach(display,&segment_info[1]);
5595 XDestroyImage(ximage);
5596 ximage=(XImage *) NULL;
5597 if (segment_info[1].shmid >= 0)
5599 if (segment_info[1].shmaddr != NULL)
5600 (void) shmdt(segment_info[1].shmaddr);
5601 (void) shmctl(segment_info[1].shmid,IPC_RMID,0);
5602 segment_info[1].shmid=(-1);
5603 segment_info[1].shmaddr=(char *) NULL;
5608 if (window->shared_memory == MagickFalse)
5609 ximage=XCreateImage(display,window->visual,(unsigned int) depth,format,0,
5610 (char *) NULL,width,height,XBitmapPad(display),0);
5611 if (ximage == (XImage *) NULL)
5614 Unable to create X image.
5616 (void) XCheckDefineCursor(display,window->id,window->cursor);
5617 return(MagickFalse);
5619 length=(size_t) ximage->bytes_per_line*ximage->height;
5620 if (IsEventLogging())
5622 (void) LogMagickEvent(X11Event,GetMagickModule(),"XImage:");
5623 (void) LogMagickEvent(X11Event,GetMagickModule()," width, height: %dx%d",
5624 ximage->width,ximage->height);
5625 (void) LogMagickEvent(X11Event,GetMagickModule()," format: %d",
5627 (void) LogMagickEvent(X11Event,GetMagickModule()," byte order: %d",
5628 ximage->byte_order);
5629 (void) LogMagickEvent(X11Event,GetMagickModule(),
5630 " bitmap unit, bit order, pad: %d %d %d",ximage->bitmap_unit,
5631 ximage->bitmap_bit_order,ximage->bitmap_pad);
5632 (void) LogMagickEvent(X11Event,GetMagickModule()," depth: %d",
5634 (void) LogMagickEvent(X11Event,GetMagickModule()," bytes per line: %d",
5635 ximage->bytes_per_line);
5636 (void) LogMagickEvent(X11Event,GetMagickModule()," bits per pixel: %d",
5637 ximage->bits_per_pixel);
5638 (void) LogMagickEvent(X11Event,GetMagickModule(),
5639 " red, green, blue masks: 0x%lx 0x%lx 0x%lx",ximage->red_mask,
5640 ximage->green_mask,ximage->blue_mask);
5642 if (window->shared_memory == MagickFalse)
5644 if (ximage->format != XYBitmap)
5645 ximage->data=(char *) malloc((size_t) ximage->bytes_per_line*
5648 ximage->data=(char *) malloc((size_t) ximage->bytes_per_line*
5649 ximage->depth*ximage->height);
5651 if (ximage->data == (char *) NULL)
5654 Unable to allocate pixel data.
5656 XDestroyImage(ximage);
5657 ximage=(XImage *) NULL;
5658 (void) XCheckDefineCursor(display,window->id,window->cursor);
5659 return(MagickFalse);
5661 if (window->ximage != (XImage *) NULL)
5664 Destroy previous X image.
5666 length=(size_t) window->ximage->bytes_per_line*window->ximage->height;
5667 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
5668 if (window->segment_info != (XShmSegmentInfo *) NULL)
5673 segment_info=(XShmSegmentInfo *) window->segment_info;
5674 if (segment_info[0].shmid >= 0)
5676 (void) XSync(display,MagickFalse);
5677 (void) XShmDetach(display,&segment_info[0]);
5678 (void) XSync(display,MagickFalse);
5679 if (segment_info[0].shmaddr != (char *) NULL)
5680 (void) shmdt(segment_info[0].shmaddr);
5681 (void) shmctl(segment_info[0].shmid,IPC_RMID,0);
5682 segment_info[0].shmid=(-1);
5683 segment_info[0].shmaddr=(char *) NULL;
5684 window->ximage->data=(char *) NULL;
5688 if (window->ximage->data != (char *) NULL)
5689 free(window->ximage->data);
5690 window->ximage->data=(char *) NULL;
5691 XDestroyImage(window->ximage);
5692 window->ximage=(XImage *) NULL;
5694 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
5695 if (window->segment_info != (XShmSegmentInfo *) NULL)
5700 segment_info=(XShmSegmentInfo *) window->segment_info;
5701 segment_info[0]=segment_info[1];
5704 window->ximage=ximage;
5705 matte_image=(XImage *) NULL;
5706 if ((window->shape != MagickFalse) && (window->image != (Image *) NULL))
5707 if ((window->image->alpha_trait != UndefinedPixelTrait) &&
5708 ((int) width <= XDisplayWidth(display,window->screen)) &&
5709 ((int) height <= XDisplayHeight(display,window->screen)))
5714 matte_image=XCreateImage(display,window->visual,1,XYBitmap,0,
5715 (char *) NULL,width,height,XBitmapPad(display),0);
5716 if (IsEventLogging())
5718 (void) LogMagickEvent(X11Event,GetMagickModule(),"Matte Image:");
5719 (void) LogMagickEvent(X11Event,GetMagickModule(),
5720 " width, height: %dx%d",matte_image->width,matte_image->height);
5722 if (matte_image != (XImage *) NULL)
5725 Allocate matte image pixel data.
5727 matte_image->data=(char *) malloc((size_t)
5728 matte_image->bytes_per_line*matte_image->depth*
5729 matte_image->height);
5730 if (matte_image->data == (char *) NULL)
5732 XDestroyImage(matte_image);
5733 matte_image=(XImage *) NULL;
5737 if (window->matte_image != (XImage *) NULL)
5742 if (window->matte_image->data != (char *) NULL)
5743 free(window->matte_image->data);
5744 window->matte_image->data=(char *) NULL;
5745 XDestroyImage(window->matte_image);
5746 window->matte_image=(XImage *) NULL;
5748 window->matte_image=matte_image;
5749 if (window->matte_pixmap != (Pixmap) NULL)
5751 (void) XFreePixmap(display,window->matte_pixmap);
5752 window->matte_pixmap=(Pixmap) NULL;
5753 #if defined(MAGICKCORE_HAVE_SHAPE)
5754 if (window->shape != MagickFalse)
5755 XShapeCombineMask(display,window->id,ShapeBounding,0,0,None,ShapeSet);
5758 window->stasis=MagickFalse;
5760 Convert pixels to X image data.
5762 if (window->image != (Image *) NULL)
5764 if ((ximage->byte_order == LSBFirst) || ((ximage->format == XYBitmap) &&
5765 (ximage->bitmap_bit_order == LSBFirst)))
5766 XMakeImageLSBFirst(resource_info,window,window->image,ximage,
5767 matte_image,exception);
5769 XMakeImageMSBFirst(resource_info,window,window->image,ximage,
5770 matte_image,exception);
5772 if (window->matte_image != (XImage *) NULL)
5775 Create matte pixmap.
5777 window->matte_pixmap=XCreatePixmap(display,window->id,width,height,1);
5778 if (window->matte_pixmap != (Pixmap) NULL)
5787 Copy matte image to matte pixmap.
5789 context_values.background=0;
5790 context_values.foreground=1;
5791 graphics_context=XCreateGC(display,window->matte_pixmap,
5792 (size_t) (GCBackground | GCForeground),&context_values);
5793 (void) XPutImage(display,window->matte_pixmap,graphics_context,
5794 window->matte_image,0,0,0,0,width,height);
5795 (void) XFreeGC(display,graphics_context);
5796 #if defined(MAGICKCORE_HAVE_SHAPE)
5797 if (window->shape != MagickFalse)
5798 XShapeCombineMask(display,window->id,ShapeBounding,0,0,
5799 window->matte_pixmap,ShapeSet);
5803 (void) XMakePixmap(display,resource_info,window);
5807 (void) XCheckDefineCursor(display,window->id,window->cursor);
5812 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5816 + X M a k e I m a g e L S B F i r s t %
5820 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5822 % XMakeImageLSBFirst() initializes the pixel data of an X11 Image. The X image
5823 % pixels are copied in least-significant bit and byte first order. The
5824 % server's scanline pad is respected. Rather than using one or two general
5825 % cases, many special cases are found here to help speed up the image
5828 % The format of the XMakeImageLSBFirst method is:
5830 % void XMakeImageLSBFirst(Display *display,XWindows *windows,
5831 % ExceptionInfo *exception)
5833 % A description of each parameter follows:
5835 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
5837 % o window: Specifies a pointer to a XWindowInfo structure.
5839 % o image: the image.
5841 % o ximage: Specifies a pointer to a XImage structure; returned from
5844 % o matte_image: Specifies a pointer to a XImage structure; returned from
5847 % o exception: return any errors or warnings in this structure.
5850 static void XMakeImageLSBFirst(const XResourceInfo *resource_info,
5851 const XWindowInfo *window,Image *image,XImage *ximage,XImage *matte_image,
5852 ExceptionInfo *exception)
5863 register const Quantum
5869 register unsigned char
5886 assert(resource_info != (XResourceInfo *) NULL);
5887 assert(window != (XWindowInfo *) NULL);
5888 assert(image != (Image *) NULL);
5889 if (image->debug != MagickFalse)
5890 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
5892 if ((window->immutable == MagickFalse) &&
5893 (image->storage_class == DirectClass) && (image->alpha_trait != UndefinedPixelTrait))
5896 size[MagickPathExtent];
5904 image_info=AcquireImageInfo();
5905 (void) CopyMagickString(image_info->filename,
5906 resource_info->image_info->texture != (char *) NULL ?
5907 resource_info->image_info->texture : "pattern:checkerboard",
5909 (void) FormatLocaleString(size,MagickPathExtent,"%.20gx%.20g",(double)
5910 image->columns,(double) image->rows);
5911 image_info->size=ConstantString(size);
5912 pattern=ReadImage(image_info,exception);
5913 image_info=DestroyImageInfo(image_info);
5914 if (pattern != (Image *) NULL)
5916 canvas=CloneImage(image,0,0,MagickTrue,exception);
5917 if (canvas != (Image *) NULL)
5918 (void) CompositeImage(canvas,pattern,DstOverCompositeOp,MagickTrue,
5920 pattern=DestroyImage(pattern);
5923 scanline_pad=(unsigned int) (ximage->bytes_per_line-((ximage->width*
5924 ximage->bits_per_pixel) >> 3));
5925 map_info=window->map_info;
5926 pixels=window->pixel_info->pixels;
5927 q=(unsigned char *) ximage->data;
5929 canvas_view=AcquireVirtualCacheView(canvas,exception);
5930 if (ximage->format == XYBitmap)
5932 register unsigned short
5940 Convert canvas to big-endian bitmap.
5942 background=(unsigned char)
5943 (XPixelIntensity(&window->pixel_info->foreground_color) <
5944 XPixelIntensity(&window->pixel_info->background_color) ? 0x80 : 0x00);
5945 foreground=(unsigned char)
5946 (XPixelIntensity(&window->pixel_info->background_color) <
5947 XPixelIntensity(&window->pixel_info->foreground_color) ? 0x80 : 0x00);
5948 polarity=(unsigned short) ((GetPixelInfoIntensity(image,
5949 &canvas->colormap[0])) < (QuantumRange/2.0) ? 1 : 0);
5950 if (canvas->colors == 2)
5951 polarity=GetPixelInfoIntensity(image,&canvas->colormap[0]) <
5952 GetPixelInfoIntensity(image,&canvas->colormap[1]);
5953 for (y=0; y < (int) canvas->rows; y++)
5955 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,canvas->columns,1,
5957 if (p == (const Quantum *) NULL)
5961 for (x=0; x < (int) canvas->columns; x++)
5964 if (GetPixelIndex(canvas,p) == (Quantum) polarity)
5975 p+=GetPixelChannels(canvas);
5983 if (window->pixel_info->colors != 0)
5984 switch (ximage->bits_per_pixel)
5988 register unsigned int
5992 Convert to 2 bit color-mapped X canvas.
5994 for (y=0; y < (int) canvas->rows; y++)
5996 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
5997 canvas->columns,1,exception);
5998 if (p == (const Quantum *) NULL)
6001 for (x=0; x < (int) canvas->columns; x++)
6003 pixel=pixels[(ssize_t) GetPixelIndex(canvas,p)] & 0x0f;
6008 *q=(unsigned char) pixel;
6014 *q|=(unsigned char) (pixel << 2);
6020 *q|=(unsigned char) (pixel << 4);
6026 *q|=(unsigned char) (pixel << 6);
6032 p+=GetPixelChannels(canvas);
6040 register unsigned int
6044 Convert to 4 bit color-mapped X canvas.
6046 for (y=0; y < (int) canvas->rows; y++)
6048 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6049 canvas->columns,1,exception);
6050 if (p == (const Quantum *) NULL)
6053 for (x=0; x < (int) canvas->columns; x++)
6055 pixel=pixels[(ssize_t) GetPixelIndex(canvas,p)] & 0xf;
6060 *q=(unsigned char) pixel;
6066 *q|=(unsigned char) (pixel << 4);
6072 p+=GetPixelChannels(canvas);
6082 Convert to 8 bit color-mapped X canvas.
6084 if (resource_info->color_recovery &&
6085 resource_info->quantize_info->dither_method != NoDitherMethod)
6087 XDitherImage(canvas,ximage,exception);
6090 for (y=0; y < (int) canvas->rows; y++)
6092 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6093 canvas->columns,1,exception);
6094 if (p == (const Quantum *) NULL)
6096 for (x=0; x < (int) canvas->columns; x++)
6098 pixel=pixels[(ssize_t) GetPixelIndex(canvas,p)];
6099 *q++=(unsigned char) pixel;
6100 p+=GetPixelChannels(canvas);
6111 register unsigned int
6115 Convert to multi-byte color-mapped X canvas.
6117 bytes_per_pixel=(unsigned int) (ximage->bits_per_pixel >> 3);
6118 for (y=0; y < (int) canvas->rows; y++)
6120 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6121 canvas->columns,1,exception);
6122 if (p == (const Quantum *) NULL)
6124 for (x=0; x < (int) canvas->columns; x++)
6126 pixel=pixels[(ssize_t) GetPixelIndex(canvas,p)];
6127 for (k=0; k < (int) bytes_per_pixel; k++)
6129 *q++=(unsigned char) (pixel & 0xff);
6132 p+=GetPixelChannels(canvas);
6140 switch (ximage->bits_per_pixel)
6144 register unsigned int
6148 Convert to contiguous 2 bit continuous-tone X canvas.
6150 for (y=0; y < (int) canvas->rows; y++)
6153 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6154 canvas->columns,1,exception);
6155 if (p == (const Quantum *) NULL)
6157 for (x=0; x < (int) canvas->columns; x++)
6159 pixel=XGammaPixel(canvas,map_info,p);
6165 *q=(unsigned char) pixel;
6171 *q|=(unsigned char) (pixel << 2);
6177 *q|=(unsigned char) (pixel << 4);
6183 *q|=(unsigned char) (pixel << 6);
6189 p+=GetPixelChannels(canvas);
6197 register unsigned int
6201 Convert to contiguous 4 bit continuous-tone X canvas.
6203 for (y=0; y < (int) canvas->rows; y++)
6205 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6206 canvas->columns,1,exception);
6207 if (p == (const Quantum *) NULL)
6210 for (x=0; x < (int) canvas->columns; x++)
6212 pixel=XGammaPixel(canvas,map_info,p);
6218 *q=(unsigned char) pixel;
6224 *q|=(unsigned char) (pixel << 4);
6230 p+=GetPixelChannels(canvas);
6240 Convert to contiguous 8 bit continuous-tone X canvas.
6242 if (resource_info->color_recovery &&
6243 resource_info->quantize_info->dither_method != NoDitherMethod)
6245 XDitherImage(canvas,ximage,exception);
6248 for (y=0; y < (int) canvas->rows; y++)
6250 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6251 canvas->columns,1,exception);
6252 if (p == (const Quantum *) NULL)
6254 for (x=0; x < (int) canvas->columns; x++)
6256 pixel=XGammaPixel(canvas,map_info,p);
6257 *q++=(unsigned char) pixel;
6258 p+=GetPixelChannels(canvas);
6266 if ((ximage->bits_per_pixel == 32) && (map_info->red_max == 255) &&
6267 (map_info->green_max == 255) && (map_info->blue_max == 255) &&
6268 (map_info->red_mult == 65536L) && (map_info->green_mult == 256) &&
6269 (map_info->blue_mult == 1))
6272 Convert to 32 bit continuous-tone X canvas.
6274 for (y=0; y < (int) canvas->rows; y++)
6276 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6277 canvas->columns,1,exception);
6278 if (p == (const Quantum *) NULL)
6280 if ((red_gamma != 1.0) || (green_gamma != 1.0) ||
6281 (blue_gamma != 1.0))
6284 Gamma correct canvas.
6286 for (x=(int) canvas->columns-1; x >= 0; x--)
6288 *q++=ScaleQuantumToChar(XBlueGamma(
6289 GetPixelBlue(canvas,p)));
6290 *q++=ScaleQuantumToChar(XGreenGamma(
6291 GetPixelGreen(canvas,p)));
6292 *q++=ScaleQuantumToChar(XRedGamma(
6293 GetPixelRed(canvas,p)));
6295 p+=GetPixelChannels(canvas);
6299 for (x=(int) canvas->columns-1; x >= 0; x--)
6301 *q++=ScaleQuantumToChar((Quantum) GetPixelBlue(canvas,p));
6302 *q++=ScaleQuantumToChar((Quantum) GetPixelGreen(canvas,p));
6303 *q++=ScaleQuantumToChar((Quantum) GetPixelRed(canvas,p));
6305 p+=GetPixelChannels(canvas);
6310 if ((ximage->bits_per_pixel == 32) && (map_info->red_max == 255) &&
6311 (map_info->green_max == 255) && (map_info->blue_max == 255) &&
6312 (map_info->red_mult == 1) && (map_info->green_mult == 256) &&
6313 (map_info->blue_mult == 65536L))
6316 Convert to 32 bit continuous-tone X canvas.
6318 for (y=0; y < (int) canvas->rows; y++)
6320 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6321 canvas->columns,1,exception);
6322 if (p == (const Quantum *) NULL)
6324 if ((red_gamma != 1.0) || (green_gamma != 1.0) ||
6325 (blue_gamma != 1.0))
6328 Gamma correct canvas.
6330 for (x=(int) canvas->columns-1; x >= 0; x--)
6332 *q++=ScaleQuantumToChar(XRedGamma(
6333 GetPixelRed(canvas,p)));
6334 *q++=ScaleQuantumToChar(XGreenGamma(
6335 GetPixelGreen(canvas,p)));
6336 *q++=ScaleQuantumToChar(XBlueGamma(
6337 GetPixelBlue(canvas,p)));
6339 p+=GetPixelChannels(canvas);
6343 for (x=(int) canvas->columns-1; x >= 0; x--)
6345 *q++=ScaleQuantumToChar((Quantum) GetPixelRed(canvas,p));
6346 *q++=ScaleQuantumToChar((Quantum) GetPixelGreen(canvas,p));
6347 *q++=ScaleQuantumToChar((Quantum) GetPixelBlue(canvas,p));
6349 p+=GetPixelChannels(canvas);
6358 register unsigned int
6362 Convert to multi-byte continuous-tone X canvas.
6364 bytes_per_pixel=(unsigned int) (ximage->bits_per_pixel >> 3);
6365 for (y=0; y < (int) canvas->rows; y++)
6367 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6368 canvas->columns,1,exception);
6369 if (p == (const Quantum *) NULL)
6371 for (x=0; x < (int) canvas->columns; x++)
6373 pixel=XGammaPixel(canvas,map_info,p);
6374 for (k=0; k < (int) bytes_per_pixel; k++)
6376 *q++=(unsigned char) (pixel & 0xff);
6379 p+=GetPixelChannels(canvas);
6387 if (matte_image != (XImage *) NULL)
6390 Initialize matte canvas.
6392 scanline_pad=(unsigned int) (matte_image->bytes_per_line-
6393 ((matte_image->width*matte_image->bits_per_pixel) >> 3));
6394 q=(unsigned char *) matte_image->data;
6395 for (y=0; y < (int) canvas->rows; y++)
6397 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,canvas->columns,1,
6399 if (p == (const Quantum *) NULL)
6403 for (x=(int) canvas->columns-1; x >= 0; x--)
6406 if (GetPixelAlpha(canvas,p) > (QuantumRange/2))
6415 p+=GetPixelChannels(canvas);
6422 canvas_view=DestroyCacheView(canvas_view);
6423 if (canvas != image)
6424 canvas=DestroyImage(canvas);
6428 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6432 + X M a k e I m a g e M S B F i r s t %
6436 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6438 % XMakeImageMSBFirst() initializes the pixel data of an X11 Image. The X
6439 % image pixels are copied in most-significant bit and byte first order. The
6440 % server's scanline pad is also respected. Rather than using one or two
6441 % general cases, many special cases are found here to help speed up the image
6444 % The format of the XMakeImageMSBFirst method is:
6446 % XMakeImageMSBFirst(resource_info,window,image,ximage,matte_image,
6447 % ExceptionInfo *exception)
6449 % A description of each parameter follows:
6451 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
6453 % o window: Specifies a pointer to a XWindowInfo structure.
6455 % o image: the image.
6457 % o ximage: Specifies a pointer to a XImage structure; returned from
6460 % o matte_image: Specifies a pointer to a XImage structure; returned from
6463 % o exception: return any errors or warnings in this structure.
6466 static void XMakeImageMSBFirst(const XResourceInfo *resource_info,
6467 const XWindowInfo *window,Image *image,XImage *ximage,XImage *matte_image,
6468 ExceptionInfo *exception)
6482 register const Quantum
6485 register unsigned char
6502 assert(resource_info != (XResourceInfo *) NULL);
6503 assert(window != (XWindowInfo *) NULL);
6504 assert(image != (Image *) NULL);
6505 if (image->debug != MagickFalse)
6506 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
6508 if ((window->immutable != MagickFalse) &&
6509 (image->storage_class == DirectClass) &&
6510 (image->alpha_trait != UndefinedPixelTrait))
6513 size[MagickPathExtent];
6521 image_info=AcquireImageInfo();
6522 (void) CopyMagickString(image_info->filename,
6523 resource_info->image_info->texture != (char *) NULL ?
6524 resource_info->image_info->texture : "pattern:checkerboard",
6526 (void) FormatLocaleString(size,MagickPathExtent,"%.20gx%.20g",(double)
6527 image->columns,(double) image->rows);
6528 image_info->size=ConstantString(size);
6529 pattern=ReadImage(image_info,exception);
6530 image_info=DestroyImageInfo(image_info);
6531 if (pattern != (Image *) NULL)
6533 canvas=CloneImage(image,0,0,MagickTrue,exception);
6534 if (canvas != (Image *) NULL)
6535 (void) CompositeImage(canvas,pattern,DstOverCompositeOp,MagickFalse,
6537 pattern=DestroyImage(pattern);
6540 scanline_pad=(unsigned int) (ximage->bytes_per_line-((ximage->width*
6541 ximage->bits_per_pixel) >> 3));
6542 map_info=window->map_info;
6543 pixels=window->pixel_info->pixels;
6544 q=(unsigned char *) ximage->data;
6546 canvas_view=AcquireVirtualCacheView(canvas,exception);
6547 if (ximage->format == XYBitmap)
6549 register unsigned short
6557 Convert canvas to big-endian bitmap.
6559 background=(unsigned char)
6560 (XPixelIntensity(&window->pixel_info->foreground_color) <
6561 XPixelIntensity(&window->pixel_info->background_color) ? 0x01 : 0x00);
6562 foreground=(unsigned char)
6563 (XPixelIntensity(&window->pixel_info->background_color) <
6564 XPixelIntensity(&window->pixel_info->foreground_color) ? 0x01 : 0x00);
6565 polarity=(unsigned short) ((GetPixelInfoIntensity(image,
6566 &canvas->colormap[0])) < (QuantumRange/2.0) ? 1 : 0);
6567 if (canvas->colors == 2)
6568 polarity=GetPixelInfoIntensity(image,&canvas->colormap[0]) <
6569 GetPixelInfoIntensity(image,&canvas->colormap[1]);
6570 for (y=0; y < (int) canvas->rows; y++)
6572 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,canvas->columns,1,
6574 if (p == (const Quantum *) NULL)
6578 for (x=(int) canvas->columns-1; x >= 0; x--)
6581 if (GetPixelIndex(canvas,p) == (Quantum) polarity)
6592 p+=GetPixelChannels(canvas);
6600 if (window->pixel_info->colors != 0)
6601 switch (ximage->bits_per_pixel)
6605 register unsigned int
6609 Convert to 2 bit color-mapped X canvas.
6611 for (y=0; y < (int) canvas->rows; y++)
6613 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6614 canvas->columns,1,exception);
6615 if (p == (const Quantum *) NULL)
6618 for (x=0; x < (int) canvas->columns; x++)
6620 pixel=pixels[(ssize_t)
6621 GetPixelIndex(canvas,p)] & 0xf;
6626 *q=(unsigned char) (pixel << 6);
6632 *q|=(unsigned char) (pixel << 4);
6638 *q|=(unsigned char) (pixel << 2);
6644 *q|=(unsigned char) pixel;
6650 p+=GetPixelChannels(canvas);
6658 register unsigned int
6662 Convert to 4 bit color-mapped X canvas.
6664 for (y=0; y < (int) canvas->rows; y++)
6666 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6667 canvas->columns,1,exception);
6668 if (p == (const Quantum *) NULL)
6671 for (x=0; x < (int) canvas->columns; x++)
6673 pixel=pixels[(ssize_t)
6674 GetPixelIndex(canvas,p)] & 0xf;
6679 *q=(unsigned char) (pixel << 4);
6685 *q|=(unsigned char) pixel;
6691 p+=GetPixelChannels(canvas);
6701 Convert to 8 bit color-mapped X canvas.
6703 if (resource_info->color_recovery &&
6704 resource_info->quantize_info->dither_method != NoDitherMethod)
6706 XDitherImage(canvas,ximage,exception);
6709 for (y=0; y < (int) canvas->rows; y++)
6711 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6712 canvas->columns,1,exception);
6713 if (p == (const Quantum *) NULL)
6715 for (x=0; x < (int) canvas->columns; x++)
6717 pixel=pixels[(ssize_t) GetPixelIndex(canvas,p)];
6718 *q++=(unsigned char) pixel;
6719 p+=GetPixelChannels(canvas);
6730 register unsigned int
6734 channel[sizeof(size_t)];
6737 Convert to 8 bit color-mapped X canvas.
6739 bytes_per_pixel=(unsigned int) (ximage->bits_per_pixel >> 3);
6740 for (y=0; y < (int) canvas->rows; y++)
6742 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6743 canvas->columns,1,exception);
6744 if (p == (const Quantum *) NULL)
6746 for (x=0; x < (int) canvas->columns; x++)
6748 pixel=pixels[(ssize_t)
6749 GetPixelIndex(canvas,p)];
6750 for (k=(int) bytes_per_pixel-1; k >= 0; k--)
6752 channel[k]=(unsigned char) pixel;
6755 for (k=0; k < (int) bytes_per_pixel; k++)
6757 p+=GetPixelChannels(canvas);
6765 switch (ximage->bits_per_pixel)
6769 register unsigned int
6773 Convert to 4 bit continuous-tone X canvas.
6775 for (y=0; y < (int) canvas->rows; y++)
6777 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6778 canvas->columns,1,exception);
6779 if (p == (const Quantum *) NULL)
6782 for (x=(int) canvas->columns-1; x >= 0; x--)
6784 pixel=XGammaPixel(canvas,map_info,p);
6790 *q=(unsigned char) (pixel << 6);
6796 *q|=(unsigned char) (pixel << 4);
6802 *q|=(unsigned char) (pixel << 2);
6808 *q|=(unsigned char) pixel;
6814 p+=GetPixelChannels(canvas);
6822 register unsigned int
6826 Convert to 4 bit continuous-tone X canvas.
6828 for (y=0; y < (int) canvas->rows; y++)
6830 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6831 canvas->columns,1,exception);
6832 if (p == (const Quantum *) NULL)
6835 for (x=(int) canvas->columns-1; x >= 0; x--)
6837 pixel=XGammaPixel(canvas,map_info,p);
6843 *q=(unsigned char) (pixel << 4);
6849 *q|=(unsigned char) pixel;
6855 p+=GetPixelChannels(canvas);
6865 Convert to 8 bit continuous-tone X canvas.
6867 if (resource_info->color_recovery &&
6868 resource_info->quantize_info->dither_method != NoDitherMethod)
6870 XDitherImage(canvas,ximage,exception);
6873 for (y=0; y < (int) canvas->rows; y++)
6875 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6876 canvas->columns,1,exception);
6877 if (p == (const Quantum *) NULL)
6879 for (x=(int) canvas->columns-1; x >= 0; x--)
6881 pixel=XGammaPixel(canvas,map_info,p);
6882 *q++=(unsigned char) pixel;
6883 p+=GetPixelChannels(canvas);
6891 if ((ximage->bits_per_pixel == 32) && (map_info->red_max == 255) &&
6892 (map_info->green_max == 255) && (map_info->blue_max == 255) &&
6893 (map_info->red_mult == 65536L) && (map_info->green_mult == 256) &&
6894 (map_info->blue_mult == 1))
6897 Convert to 32 bit continuous-tone X canvas.
6899 for (y=0; y < (int) canvas->rows; y++)
6901 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6902 canvas->columns,1,exception);
6903 if (p == (const Quantum *) NULL)
6905 if ((red_gamma != 1.0) || (green_gamma != 1.0) ||
6906 (blue_gamma != 1.0))
6909 Gamma correct canvas.
6911 for (x=(int) canvas->columns-1; x >= 0; x--)
6914 *q++=ScaleQuantumToChar(XRedGamma(
6915 GetPixelRed(canvas,p)));
6916 *q++=ScaleQuantumToChar(XGreenGamma(
6917 GetPixelGreen(canvas,p)));
6918 *q++=ScaleQuantumToChar(XBlueGamma(
6919 GetPixelBlue(canvas,p)));
6920 p+=GetPixelChannels(canvas);
6924 for (x=(int) canvas->columns-1; x >= 0; x--)
6927 *q++=ScaleQuantumToChar((Quantum) GetPixelRed(canvas,p));
6928 *q++=ScaleQuantumToChar((Quantum) GetPixelGreen(canvas,p));
6929 *q++=ScaleQuantumToChar((Quantum) GetPixelBlue(canvas,p));
6930 p+=GetPixelChannels(canvas);
6935 if ((ximage->bits_per_pixel == 32) && (map_info->red_max == 255) &&
6936 (map_info->green_max == 255) && (map_info->blue_max == 255) &&
6937 (map_info->red_mult == 1) && (map_info->green_mult == 256) &&
6938 (map_info->blue_mult == 65536L))
6941 Convert to 32 bit continuous-tone X canvas.
6943 for (y=0; y < (int) canvas->rows; y++)
6945 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6946 canvas->columns,1,exception);
6947 if (p == (const Quantum *) NULL)
6949 if ((red_gamma != 1.0) || (green_gamma != 1.0) ||
6950 (blue_gamma != 1.0))
6953 Gamma correct canvas.
6955 for (x=(int) canvas->columns-1; x >= 0; x--)
6958 *q++=ScaleQuantumToChar(XBlueGamma(
6959 GetPixelBlue(canvas,p)));
6960 *q++=ScaleQuantumToChar(XGreenGamma(
6961 GetPixelGreen(canvas,p)));
6962 *q++=ScaleQuantumToChar(XRedGamma(
6963 GetPixelRed(canvas,p)));
6964 p+=GetPixelChannels(canvas);
6968 for (x=(int) canvas->columns-1; x >= 0; x--)
6971 *q++=ScaleQuantumToChar((Quantum) GetPixelBlue(canvas,p));
6972 *q++=ScaleQuantumToChar((Quantum) GetPixelGreen(canvas,p));
6973 *q++=ScaleQuantumToChar((Quantum) GetPixelRed(canvas,p));
6974 p+=GetPixelChannels(canvas);
6983 register unsigned int
6987 channel[sizeof(size_t)];
6990 Convert to multi-byte continuous-tone X canvas.
6992 bytes_per_pixel=(unsigned int) (ximage->bits_per_pixel >> 3);
6993 for (y=0; y < (int) canvas->rows; y++)
6995 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6996 canvas->columns,1,exception);
6997 if (p == (const Quantum *) NULL)
6999 for (x=(int) canvas->columns-1; x >= 0; x--)
7001 pixel=XGammaPixel(canvas,map_info,p);
7002 for (k=(int) bytes_per_pixel-1; k >= 0; k--)
7004 channel[k]=(unsigned char) pixel;
7007 for (k=0; k < (int) bytes_per_pixel; k++)
7009 p+=GetPixelChannels(canvas);
7017 if (matte_image != (XImage *) NULL)
7020 Initialize matte canvas.
7022 scanline_pad=(unsigned int) (matte_image->bytes_per_line-
7023 ((matte_image->width*matte_image->bits_per_pixel) >> 3));
7024 q=(unsigned char *) matte_image->data;
7025 for (y=0; y < (int) canvas->rows; y++)
7027 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,canvas->columns,1,
7029 if (p == (const Quantum *) NULL)
7033 for (x=(int) canvas->columns-1; x >= 0; x--)
7036 if (GetPixelAlpha(canvas,p) > (QuantumRange/2))
7045 p+=GetPixelChannels(canvas);
7052 canvas_view=DestroyCacheView(canvas_view);
7053 if (canvas != image)
7054 canvas=DestroyImage(canvas);
7058 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7062 % X M a k e M a g n i f y I m a g e %
7066 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7068 % XMakeMagnifyImage() magnifies a region of an X image and displays it.
7070 % The format of the XMakeMagnifyImage method is:
7072 % void XMakeMagnifyImage(Display *display,XWindows *windows,
7073 % ExceptionInfo *exception)
7075 % A description of each parameter follows:
7077 % o display: Specifies a connection to an X server; returned from
7080 % o windows: Specifies a pointer to a XWindows structure.
7082 % o exception: return any errors or warnings in this structure.
7085 MagickPrivate void XMakeMagnifyImage(Display *display,XWindows *windows,
7086 ExceptionInfo *exception)
7089 tuple[MagickPathExtent];
7103 register unsigned char
7111 previous_magnify = 0;
7129 Check boundary conditions.
7131 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
7132 assert(display != (Display *) NULL);
7133 assert(windows != (XWindows *) NULL);
7135 for (n=1; n < (ssize_t) windows->magnify.data; n++)
7137 while ((magnify*windows->image.ximage->width) < windows->magnify.width)
7139 while ((magnify*windows->image.ximage->height) < windows->magnify.height)
7141 while (magnify > windows->magnify.width)
7143 while (magnify > windows->magnify.height)
7147 if (magnify != previous_magnify)
7156 New magnify factor: update magnify window name.
7159 while ((1 << i) <= (int) magnify)
7161 (void) FormatLocaleString(windows->magnify.name,MagickPathExtent,
7162 "Magnify %.20gX",(double) i);
7163 status=XStringListToTextProperty(&windows->magnify.name,1,&window_name);
7164 if (status != False)
7166 XSetWMName(display,windows->magnify.id,&window_name);
7167 XSetWMIconName(display,windows->magnify.id,&window_name);
7168 (void) XFree((void *) window_name.value);
7171 previous_magnify=magnify;
7172 ximage=windows->image.ximage;
7173 width=(unsigned int) windows->magnify.ximage->width;
7174 height=(unsigned int) windows->magnify.ximage->height;
7175 if ((windows->magnify.x < 0) ||
7176 (windows->magnify.x >= windows->image.ximage->width))
7177 windows->magnify.x=windows->image.ximage->width >> 1;
7178 x=windows->magnify.x-((width/magnify) >> 1);
7182 if (x > (int) (ximage->width-(width/magnify)))
7183 x=ximage->width-width/magnify;
7184 if ((windows->magnify.y < 0) ||
7185 (windows->magnify.y >= windows->image.ximage->height))
7186 windows->magnify.y=windows->image.ximage->height >> 1;
7187 y=windows->magnify.y-((height/magnify) >> 1);
7191 if (y > (int) (ximage->height-(height/magnify)))
7192 y=ximage->height-height/magnify;
7193 q=(unsigned char *) windows->magnify.ximage->data;
7194 scanline_pad=(unsigned int) (windows->magnify.ximage->bytes_per_line-
7195 ((width*windows->magnify.ximage->bits_per_pixel) >> 3));
7196 if (ximage->bits_per_pixel < 8)
7198 register unsigned char
7205 register unsigned int
7211 pixel_info=windows->magnify.pixel_info;
7212 switch (ximage->bitmap_bit_order)
7217 Magnify little-endian bitmap.
7221 if (ximage->format == XYBitmap)
7223 background=(unsigned char)
7224 (XPixelIntensity(&pixel_info->foreground_color) <
7225 XPixelIntensity(&pixel_info->background_color) ? 0x80 : 0x00);
7226 foreground=(unsigned char)
7227 (XPixelIntensity(&pixel_info->background_color) <
7228 XPixelIntensity(&pixel_info->foreground_color) ? 0x80 : 0x00);
7229 if (windows->magnify.depth > 1)
7230 Swap(background,foreground);
7232 for (i=0; i < (ssize_t) height; i+=magnify)
7235 Propogate pixel magnify rows.
7237 for (j=0; j < magnify; j++)
7239 p=(unsigned char *) ximage->data+y*ximage->bytes_per_line+
7240 ((x*ximage->bits_per_pixel) >> 3);
7241 p_bit=(unsigned char) (x*ximage->bits_per_pixel) & 0x07;
7244 for (k=0; k < width; k+=magnify)
7247 Propogate pixel magnify columns.
7249 for (l=0; l < magnify; l++)
7252 Propogate each bit plane.
7254 for (plane=0; (int) plane < ximage->bits_per_pixel; plane++)
7257 if (*p & (0x01 << (p_bit+plane)))
7270 p_bit+=ximage->bits_per_pixel;
7277 *q=byte >> (8-q_bit);
7289 Magnify big-endian bitmap.
7293 if (ximage->format == XYBitmap)
7295 background=(unsigned char)
7296 (XPixelIntensity(&pixel_info->foreground_color) <
7297 XPixelIntensity(&pixel_info->background_color) ? 0x01 : 0x00);
7298 foreground=(unsigned char)
7299 (XPixelIntensity(&pixel_info->background_color) <
7300 XPixelIntensity(&pixel_info->foreground_color) ? 0x01 : 0x00);
7301 if (windows->magnify.depth > 1)
7302 Swap(background,foreground);
7304 for (i=0; i < (ssize_t) height; i+=magnify)
7307 Propogate pixel magnify rows.
7309 for (j=0; j < magnify; j++)
7311 p=(unsigned char *) ximage->data+y*ximage->bytes_per_line+
7312 ((x*ximage->bits_per_pixel) >> 3);
7313 p_bit=(unsigned char) (x*ximage->bits_per_pixel) & 0x07;
7316 for (k=0; k < width; k+=magnify)
7319 Propogate pixel magnify columns.
7321 for (l=0; l < magnify; l++)
7324 Propogate each bit plane.
7326 for (plane=0; (int) plane < ximage->bits_per_pixel; plane++)
7329 if (*p & (0x80 >> (p_bit+plane)))
7342 p_bit+=ximage->bits_per_pixel;
7349 *q=byte << (8-q_bit);
7360 switch (ximage->bits_per_pixel)
7366 Magnify 8 bit X image.
7368 for (i=0; i < (ssize_t) height; i+=magnify)
7371 Propogate pixel magnify rows.
7373 for (j=0; j < magnify; j++)
7375 p=(unsigned char *) ximage->data+y*ximage->bytes_per_line+
7376 ((x*ximage->bits_per_pixel) >> 3);
7377 for (k=0; k < width; k+=magnify)
7380 Propogate pixel magnify columns.
7382 for (l=0; l < magnify; l++)
7394 register unsigned int
7399 Magnify multi-byte X image.
7401 bytes_per_pixel=(unsigned int) ximage->bits_per_pixel >> 3;
7402 for (i=0; i < (ssize_t) height; i+=magnify)
7405 Propogate pixel magnify rows.
7407 for (j=0; j < magnify; j++)
7409 p=(unsigned char *) ximage->data+y*ximage->bytes_per_line+
7410 ((x*ximage->bits_per_pixel) >> 3);
7411 for (k=0; k < width; k+=magnify)
7414 Propogate pixel magnify columns.
7416 for (l=0; l < magnify; l++)
7417 for (m=0; m < bytes_per_pixel; m++)
7429 Copy X image to magnify pixmap.
7431 x=windows->magnify.x-((width/magnify) >> 1);
7433 x=(int) ((width >> 1)-windows->magnify.x*magnify);
7435 if (x > (int) (ximage->width-(width/magnify)))
7436 x=(int) ((ximage->width-windows->magnify.x)*magnify-(width >> 1));
7439 y=windows->magnify.y-((height/magnify) >> 1);
7441 y=(int) ((height >> 1)-windows->magnify.y*magnify);
7443 if (y > (int) (ximage->height-(height/magnify)))
7444 y=(int) ((ximage->height-windows->magnify.y)*magnify-(height >> 1));
7447 if ((x != 0) || (y != 0))
7448 (void) XFillRectangle(display,windows->magnify.pixmap,
7449 windows->magnify.annotate_context,0,0,width,height);
7450 (void) XPutImage(display,windows->magnify.pixmap,
7451 windows->magnify.annotate_context,windows->magnify.ximage,0,0,x,y,width-x,
7453 if ((magnify > 1) && ((magnify <= (width >> 1)) &&
7454 (magnify <= (height >> 1))))
7460 Highlight center pixel.
7462 highlight_info.x=(ssize_t) windows->magnify.width >> 1;
7463 highlight_info.y=(ssize_t) windows->magnify.height >> 1;
7464 highlight_info.width=magnify;
7465 highlight_info.height=magnify;
7466 (void) XDrawRectangle(display,windows->magnify.pixmap,
7467 windows->magnify.highlight_context,(int) highlight_info.x,
7468 (int) highlight_info.y,(unsigned int) highlight_info.width-1,
7469 (unsigned int) highlight_info.height-1);
7471 (void) XDrawRectangle(display,windows->magnify.pixmap,
7472 windows->magnify.annotate_context,(int) highlight_info.x+1,
7473 (int) highlight_info.y+1,(unsigned int) highlight_info.width-3,
7474 (unsigned int) highlight_info.height-3);
7477 Show center pixel color.
7479 (void) GetOneVirtualPixelInfo(windows->image.image,TileVirtualPixelMethod,
7480 (ssize_t) windows->magnify.x,(ssize_t) windows->magnify.y,&pixel,exception);
7481 (void) FormatLocaleString(tuple,MagickPathExtent,"%d,%d: ",
7482 windows->magnify.x,windows->magnify.y);
7483 (void) ConcatenateMagickString(tuple,"(",MagickPathExtent);
7484 ConcatenateColorComponent(&pixel,RedPixelChannel,X11Compliance,tuple);
7485 (void) ConcatenateMagickString(tuple,",",MagickPathExtent);
7486 ConcatenateColorComponent(&pixel,GreenPixelChannel,X11Compliance,tuple);
7487 (void) ConcatenateMagickString(tuple,",",MagickPathExtent);
7488 ConcatenateColorComponent(&pixel,BluePixelChannel,X11Compliance,tuple);
7489 if (pixel.colorspace == CMYKColorspace)
7491 (void) ConcatenateMagickString(tuple,",",MagickPathExtent);
7492 ConcatenateColorComponent(&pixel,BlackPixelChannel,X11Compliance,tuple);
7494 if (pixel.alpha_trait != UndefinedPixelTrait)
7496 (void) ConcatenateMagickString(tuple,",",MagickPathExtent);
7497 ConcatenateColorComponent(&pixel,AlphaPixelChannel,X11Compliance,tuple);
7499 (void) ConcatenateMagickString(tuple,")",MagickPathExtent);
7500 height=(unsigned int) windows->magnify.font_info->ascent+
7501 windows->magnify.font_info->descent;
7502 x=windows->magnify.font_info->max_bounds.width >> 1;
7503 y=windows->magnify.font_info->ascent+(height >> 2);
7504 (void) XDrawImageString(display,windows->magnify.pixmap,
7505 windows->magnify.annotate_context,x,y,tuple,(int) strlen(tuple));
7506 GetColorTuple(&pixel,MagickTrue,tuple);
7508 (void) XDrawImageString(display,windows->magnify.pixmap,
7509 windows->magnify.annotate_context,x,y,tuple,(int) strlen(tuple));
7510 (void) QueryColorname(windows->image.image,&pixel,SVGCompliance,tuple,
7513 (void) XDrawImageString(display,windows->magnify.pixmap,
7514 windows->magnify.annotate_context,x,y,tuple,(int) strlen(tuple));
7516 Refresh magnify window.
7518 magnify_window=windows->magnify;
7521 XRefreshWindow(display,&magnify_window,(XEvent *) NULL);
7525 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7529 % X M a k e P i x m a p %
7533 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7535 % XMakePixmap() creates an X11 pixmap.
7537 % The format of the XMakePixmap method is:
7539 % void XMakeStandardColormap(Display *display,XVisualInfo *visual_info,
7540 % XResourceInfo *resource_info,Image *image,XStandardColormap *map_info,
7541 % XPixelInfo *pixel)
7543 % A description of each parameter follows:
7545 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
7547 % o display: Specifies a connection to an X server; returned from
7550 % o window: Specifies a pointer to a XWindowInfo structure.
7553 static MagickBooleanType XMakePixmap(Display *display,
7554 const XResourceInfo *resource_info,XWindowInfo *window)
7560 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
7561 assert(display != (Display *) NULL);
7562 assert(resource_info != (XResourceInfo *) NULL);
7563 assert(window != (XWindowInfo *) NULL);
7564 if (window->pixmap != (Pixmap) NULL)
7567 Destroy previous X pixmap.
7569 (void) XFreePixmap(display,window->pixmap);
7570 window->pixmap=(Pixmap) NULL;
7572 if (window->use_pixmap == MagickFalse)
7573 return(MagickFalse);
7574 if (window->ximage == (XImage *) NULL)
7575 return(MagickFalse);
7577 Display busy cursor.
7579 (void) XCheckDefineCursor(display,window->id,window->busy_cursor);
7580 (void) XFlush(display);
7584 width=(unsigned int) window->ximage->width;
7585 height=(unsigned int) window->ximage->height;
7586 window->pixmap=XCreatePixmap(display,window->id,width,height,window->depth);
7587 if (window->pixmap == (Pixmap) NULL)
7590 Unable to allocate pixmap.
7592 (void) XCheckDefineCursor(display,window->id,window->cursor);
7593 return(MagickFalse);
7596 Copy X image to pixmap.
7598 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
7599 if (window->shared_memory)
7600 (void) XShmPutImage(display,window->pixmap,window->annotate_context,
7601 window->ximage,0,0,0,0,width,height,MagickTrue);
7603 if (window->shared_memory == MagickFalse)
7604 (void) XPutImage(display,window->pixmap,window->annotate_context,
7605 window->ximage,0,0,0,0,width,height);
7606 if (IsEventLogging())
7608 (void) LogMagickEvent(X11Event,GetMagickModule(),"Pixmap:");
7609 (void) LogMagickEvent(X11Event,GetMagickModule()," width, height: %ux%u",
7615 (void) XCheckDefineCursor(display,window->id,window->cursor);
7620 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7624 % X M a k e S t a n d a r d C o l o r m a p %
7628 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7630 % XMakeStandardColormap() creates an X11 Standard Colormap.
7632 % The format of the XMakeStandardColormap method is:
7634 % void XMakeStandardColormap(Display *display,XVisualInfo *visual_info,
7635 % XResourceInfo *resource_info,Image *image,XStandardColormap *map_info,
7636 % XPixelInfo *pixel,ExceptionInfo *exception)
7638 % A description of each parameter follows:
7640 % o display: Specifies a connection to an X server; returned from
7643 % o visual_info: Specifies a pointer to a X11 XVisualInfo structure;
7644 % returned from XGetVisualInfo.
7646 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
7648 % o image: the image.
7650 % o map_info: If a Standard Colormap type is specified, this structure is
7651 % initialized with info from the Standard Colormap.
7653 % o pixel: Specifies a pointer to a XPixelInfo structure.
7655 % o exception: return any errors or warnings in this structure.
7659 #if defined(__cplusplus) || defined(c_plusplus)
7663 static inline double DiversityPixelIntensity(
7664 const DiversityPacket *pixel)
7669 intensity=0.212656*pixel->red+0.715158*pixel->green+0.072186*pixel->blue;
7673 static int IntensityCompare(const void *x,const void *y)
7682 color_1=(DiversityPacket *) x;
7683 color_2=(DiversityPacket *) y;
7684 diversity=(int) (DiversityPixelIntensity(color_2)-
7685 DiversityPixelIntensity(color_1));
7689 static int PopularityCompare(const void *x,const void *y)
7695 color_1=(DiversityPacket *) x;
7696 color_2=(DiversityPacket *) y;
7697 return((int) color_2->count-(int) color_1->count);
7700 #if defined(__cplusplus) || defined(c_plusplus)
7704 static inline Quantum ScaleXToQuantum(const size_t x,
7707 return((Quantum) (((double) QuantumRange*x)/scale+0.5));
7710 MagickPrivate void XMakeStandardColormap(Display *display,
7711 XVisualInfo *visual_info,XResourceInfo *resource_info,Image *image,
7712 XStandardColormap *map_info,XPixelInfo *pixel,ExceptionInfo *exception)
7735 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
7736 assert(display != (Display *) NULL);
7737 assert(visual_info != (XVisualInfo *) NULL);
7738 assert(map_info != (XStandardColormap *) NULL);
7739 assert(resource_info != (XResourceInfo *) NULL);
7740 assert(pixel != (XPixelInfo *) NULL);
7741 if (resource_info->map_type != (char *) NULL)
7744 Standard Colormap is already defined (i.e. xstdcmap).
7746 XGetPixelInfo(display,visual_info,map_info,resource_info,image,
7748 number_colors=(unsigned int) (map_info->base_pixel+
7749 (map_info->red_max+1)*(map_info->green_max+1)*(map_info->blue_max+1));
7750 if ((map_info->red_max*map_info->green_max*map_info->blue_max) != 0)
7751 if ((image->alpha_trait == UndefinedPixelTrait) &&
7752 (resource_info->color_recovery == MagickFalse) &&
7753 (resource_info->quantize_info->dither_method != NoDitherMethod) &&
7754 (number_colors < MaxColormapSize))
7763 Improve image appearance with error diffusion.
7765 affinity_image=AcquireImage((ImageInfo *) NULL,exception);
7766 if (affinity_image == (Image *) NULL)
7767 ThrowXWindowFatalException(ResourceLimitFatalError,
7768 "UnableToDitherImage",image->filename);
7769 affinity_image->columns=number_colors;
7770 affinity_image->rows=1;
7772 Initialize colormap image.
7774 q=QueueAuthenticPixels(affinity_image,0,0,affinity_image->columns,
7776 if (q != (Quantum *) NULL)
7778 for (i=0; i < (ssize_t) number_colors; i++)
7780 SetPixelRed(affinity_image,0,q);
7781 if (map_info->red_max != 0)
7782 SetPixelRed(affinity_image,ScaleXToQuantum((size_t)
7783 (i/map_info->red_mult),map_info->red_max),q);
7784 SetPixelGreen(affinity_image,0,q);
7785 if (map_info->green_max != 0)
7786 SetPixelGreen(affinity_image,ScaleXToQuantum((size_t)
7787 ((i/map_info->green_mult) % (map_info->green_max+1)),
7788 map_info->green_max),q);
7789 SetPixelBlue(affinity_image,0,q);
7790 if (map_info->blue_max != 0)
7791 SetPixelBlue(affinity_image,ScaleXToQuantum((size_t)
7792 (i % map_info->green_mult),map_info->blue_max),q);
7793 SetPixelAlpha(affinity_image,
7794 TransparentAlpha,q);
7795 q+=GetPixelChannels(affinity_image);
7797 (void) SyncAuthenticPixels(affinity_image,exception);
7798 (void) RemapImage(resource_info->quantize_info,image,
7799 affinity_image,exception);
7801 XGetPixelInfo(display,visual_info,map_info,resource_info,image,
7803 (void) SetImageStorageClass(image,DirectClass,exception);
7804 affinity_image=DestroyImage(affinity_image);
7806 if (IsEventLogging())
7808 (void) LogMagickEvent(X11Event,GetMagickModule(),
7809 "Standard Colormap:");
7810 (void) LogMagickEvent(X11Event,GetMagickModule(),
7811 " colormap id: 0x%lx",map_info->colormap);
7812 (void) LogMagickEvent(X11Event,GetMagickModule(),
7813 " red, green, blue max: %lu %lu %lu",map_info->red_max,
7814 map_info->green_max,map_info->blue_max);
7815 (void) LogMagickEvent(X11Event,GetMagickModule(),
7816 " red, green, blue mult: %lu %lu %lu",map_info->red_mult,
7817 map_info->green_mult,map_info->blue_mult);
7821 if ((visual_info->klass != DirectColor) &&
7822 (visual_info->klass != TrueColor))
7823 if ((image->storage_class == DirectClass) ||
7824 ((int) image->colors > visual_info->colormap_size))
7830 Image has more colors than the visual supports.
7832 quantize_info=(*resource_info->quantize_info);
7833 quantize_info.number_colors=(size_t) visual_info->colormap_size;
7834 (void) QuantizeImage(&quantize_info,image,exception);
7837 Free previous and create new colormap.
7839 (void) XFreeStandardColormap(display,visual_info,map_info,pixel);
7840 colormap=XDefaultColormap(display,visual_info->screen);
7841 if (visual_info->visual != XDefaultVisual(display,visual_info->screen))
7842 colormap=XCreateColormap(display,XRootWindow(display,visual_info->screen),
7843 visual_info->visual,visual_info->klass == DirectColor ?
7844 AllocAll : AllocNone);
7845 if (colormap == (Colormap) NULL)
7846 ThrowXWindowFatalException(ResourceLimitFatalError,"UnableToCreateColormap",
7849 Initialize the map and pixel info structures.
7851 XGetMapInfo(visual_info,colormap,map_info);
7852 XGetPixelInfo(display,visual_info,map_info,resource_info,image,pixel);
7854 Allocating colors in server colormap is based on visual class.
7856 switch (visual_info->klass)
7862 Define Standard Colormap for StaticGray or StaticColor visual.
7864 number_colors=image->colors;
7865 colors=(XColor *) AcquireQuantumMemory((size_t)
7866 visual_info->colormap_size,sizeof(*colors));
7867 if (colors == (XColor *) NULL)
7868 ThrowXWindowFatalException(ResourceLimitFatalError,
7869 "UnableToCreateColormap",image->filename);
7871 color.flags=(char) (DoRed | DoGreen | DoBlue);
7872 for (i=0; i < (ssize_t) image->colors; i++)
7874 color.red=ScaleQuantumToShort(XRedGamma(image->colormap[i].red));
7875 color.green=ScaleQuantumToShort(XGreenGamma(image->colormap[i].green));
7876 color.blue=ScaleQuantumToShort(XBlueGamma(image->colormap[i].blue));
7877 if (visual_info->klass != StaticColor)
7879 gray_value=(unsigned short) XPixelIntensity(&color);
7880 color.red=gray_value;
7881 color.green=gray_value;
7882 color.blue=gray_value;
7884 status=XAllocColor(display,colormap,&color);
7885 if (status == False)
7887 colormap=XCopyColormapAndFree(display,colormap);
7888 (void) XAllocColor(display,colormap,&color);
7890 pixel->pixels[i]=color.pixel;
7902 Define Standard Colormap for GrayScale or PseudoColor visual.
7904 number_colors=image->colors;
7905 colors=(XColor *) AcquireQuantumMemory((size_t)
7906 visual_info->colormap_size,sizeof(*colors));
7907 if (colors == (XColor *) NULL)
7908 ThrowXWindowFatalException(ResourceLimitFatalError,
7909 "UnableToCreateColormap",image->filename);
7911 Preallocate our GUI colors.
7913 (void) XAllocColor(display,colormap,&pixel->foreground_color);
7914 (void) XAllocColor(display,colormap,&pixel->background_color);
7915 (void) XAllocColor(display,colormap,&pixel->border_color);
7916 (void) XAllocColor(display,colormap,&pixel->matte_color);
7917 (void) XAllocColor(display,colormap,&pixel->highlight_color);
7918 (void) XAllocColor(display,colormap,&pixel->shadow_color);
7919 (void) XAllocColor(display,colormap,&pixel->depth_color);
7920 (void) XAllocColor(display,colormap,&pixel->trough_color);
7921 for (i=0; i < MaxNumberPens; i++)
7922 (void) XAllocColor(display,colormap,&pixel->pen_colors[i]);
7924 Determine if image colors will "fit" into X server colormap.
7926 colormap_type=resource_info->colormap;
7927 status=XAllocColorCells(display,colormap,MagickFalse,(unsigned long *)
7928 NULL,0,pixel->pixels,(unsigned int) image->colors);
7929 if (status != False)
7930 colormap_type=PrivateColormap;
7931 if (colormap_type == SharedColormap)
7952 Define Standard colormap for shared GrayScale or PseudoColor visual.
7954 diversity=(DiversityPacket *) AcquireQuantumMemory(image->colors,
7955 sizeof(*diversity));
7956 if (diversity == (DiversityPacket *) NULL)
7957 ThrowXWindowFatalException(ResourceLimitFatalError,
7958 "UnableToCreateColormap",image->filename);
7959 for (i=0; i < (ssize_t) image->colors; i++)
7961 diversity[i].red=ClampToQuantum(image->colormap[i].red);
7962 diversity[i].green=ClampToQuantum(image->colormap[i].green);
7963 diversity[i].blue=ClampToQuantum(image->colormap[i].blue);
7964 diversity[i].index=(unsigned short) i;
7965 diversity[i].count=0;
7967 image_view=AcquireAuthenticCacheView(image,exception);
7968 for (y=0; y < (int) image->rows; y++)
7973 register const Quantum
7976 p=GetCacheViewAuthenticPixels(image_view,0,(ssize_t) y,
7977 image->columns,1,exception);
7978 if (p == (const Quantum *) NULL)
7980 for (x=(int) image->columns-1; x >= 0; x--)
7982 diversity[(ssize_t) GetPixelIndex(image,p)].count++;
7983 p+=GetPixelChannels(image);
7986 image_view=DestroyCacheView(image_view);
7988 Sort colors by decreasing intensity.
7990 qsort((void *) diversity,image->colors,sizeof(*diversity),
7992 for (i=0; i < (ssize_t) image->colors; )
7994 diversity[i].count<<=4; /* increase this colors popularity */
7995 i+=MagickMax((int) (image->colors >> 4),2);
7997 diversity[image->colors-1].count<<=4;
7998 qsort((void *) diversity,image->colors,sizeof(*diversity),
8004 color.flags=(char) (DoRed | DoGreen | DoBlue);
8005 for (i=0; i < (ssize_t) image->colors; i++)
8007 index=diversity[i].index;
8009 ScaleQuantumToShort(XRedGamma(image->colormap[index].red));
8011 ScaleQuantumToShort(XGreenGamma(image->colormap[index].green));
8013 ScaleQuantumToShort(XBlueGamma(image->colormap[index].blue));
8014 if (visual_info->klass != PseudoColor)
8016 gray_value=(unsigned short) XPixelIntensity(&color);
8017 color.red=gray_value;
8018 color.green=gray_value;
8019 color.blue=gray_value;
8021 status=XAllocColor(display,colormap,&color);
8022 if (status == False)
8024 pixel->pixels[index]=color.pixel;
8028 Read X server colormap.
8030 server_colors=(XColor *) AcquireQuantumMemory((size_t)
8031 visual_info->colormap_size,sizeof(*server_colors));
8032 if (server_colors == (XColor *) NULL)
8033 ThrowXWindowFatalException(ResourceLimitFatalError,
8034 "UnableToCreateColormap",image->filename);
8035 for (x=visual_info->colormap_size-1; x >= 0; x--)
8036 server_colors[x].pixel=(size_t) x;
8037 (void) XQueryColors(display,colormap,server_colors,
8038 (int) MagickMin((unsigned int) visual_info->colormap_size,256));
8040 Select remaining colors from X server colormap.
8042 for (; i < (ssize_t) image->colors; i++)
8044 index=diversity[i].index;
8045 color.red=ScaleQuantumToShort(
8046 XRedGamma(image->colormap[index].red));
8047 color.green=ScaleQuantumToShort(
8048 XGreenGamma(image->colormap[index].green));
8049 color.blue=ScaleQuantumToShort(
8050 XBlueGamma(image->colormap[index].blue));
8051 if (visual_info->klass != PseudoColor)
8053 gray_value=(unsigned short) XPixelIntensity(&color);
8054 color.red=gray_value;
8055 color.green=gray_value;
8056 color.blue=gray_value;
8058 XBestPixel(display,colormap,server_colors,(unsigned int)
8059 visual_info->colormap_size,&color);
8060 pixel->pixels[index]=color.pixel;
8063 if ((int) image->colors < visual_info->colormap_size)
8066 Fill up colors array-- more choices for pen colors.
8068 retain_colors=MagickMin((unsigned int)
8069 (visual_info->colormap_size-image->colors),256);
8070 for (i=0; i < (ssize_t) retain_colors; i++)
8071 *p++=server_colors[i];
8072 number_colors+=retain_colors;
8074 server_colors=(XColor *) RelinquishMagickMemory(server_colors);
8075 diversity=(DiversityPacket *) RelinquishMagickMemory(diversity);
8079 Define Standard colormap for private GrayScale or PseudoColor visual.
8081 if (status == False)
8084 Not enough colormap entries in the colormap-- Create a new colormap.
8086 colormap=XCreateColormap(display,
8087 XRootWindow(display,visual_info->screen),visual_info->visual,
8089 if (colormap == (Colormap) NULL)
8090 ThrowXWindowFatalException(ResourceLimitFatalError,
8091 "UnableToCreateColormap",image->filename);
8092 map_info->colormap=colormap;
8093 if ((int) image->colors < visual_info->colormap_size)
8096 Retain colors from the default colormap to help lessens the
8097 effects of colormap flashing.
8099 retain_colors=MagickMin((unsigned int)
8100 (visual_info->colormap_size-image->colors),256);
8101 p=colors+image->colors;
8102 for (i=0; i < (ssize_t) retain_colors; i++)
8104 p->pixel=(unsigned long) i;
8107 (void) XQueryColors(display,
8108 XDefaultColormap(display,visual_info->screen),
8109 colors+image->colors,(int) retain_colors);
8111 Transfer colors from default to private colormap.
8113 (void) XAllocColorCells(display,colormap,MagickFalse,
8114 (unsigned long *) NULL,0,pixel->pixels,(unsigned int)
8116 p=colors+image->colors;
8117 for (i=0; i < (ssize_t) retain_colors; i++)
8119 p->pixel=pixel->pixels[i];
8122 (void) XStoreColors(display,colormap,colors+image->colors,
8123 (int) retain_colors);
8124 number_colors+=retain_colors;
8126 (void) XAllocColorCells(display,colormap,MagickFalse,
8127 (unsigned long *) NULL,0,pixel->pixels,(unsigned int)
8131 Store the image colormap.
8134 color.flags=(char) (DoRed | DoGreen | DoBlue);
8135 for (i=0; i < (ssize_t) image->colors; i++)
8137 color.red=ScaleQuantumToShort(XRedGamma(image->colormap[i].red));
8138 color.green=ScaleQuantumToShort(XGreenGamma(image->colormap[i].green));
8139 color.blue=ScaleQuantumToShort(XBlueGamma(image->colormap[i].blue));
8140 if (visual_info->klass != PseudoColor)
8142 gray_value=(unsigned short) XPixelIntensity(&color);
8143 color.red=gray_value;
8144 color.green=gray_value;
8145 color.blue=gray_value;
8147 color.pixel=pixel->pixels[i];
8150 (void) XStoreColors(display,colormap,colors,(int) image->colors);
8161 Define Standard Colormap for TrueColor or DirectColor visual.
8163 number_colors=(unsigned int) ((map_info->red_max*map_info->red_mult)+
8164 (map_info->green_max*map_info->green_mult)+
8165 (map_info->blue_max*map_info->blue_mult)+1);
8166 linear_colormap=(number_colors > 4096) ||
8167 (((int) (map_info->red_max+1) == visual_info->colormap_size) &&
8168 ((int) (map_info->green_max+1) == visual_info->colormap_size) &&
8169 ((int) (map_info->blue_max+1) == visual_info->colormap_size)) ?
8170 MagickTrue : MagickFalse;
8171 if (linear_colormap != MagickFalse)
8172 number_colors=(size_t) visual_info->colormap_size;
8174 Allocate color array.
8176 colors=(XColor *) AcquireQuantumMemory(number_colors,sizeof(*colors));
8177 if (colors == (XColor *) NULL)
8178 ThrowXWindowFatalException(ResourceLimitFatalError,
8179 "UnableToCreateColormap",image->filename);
8181 Initialize linear color ramp.
8184 color.flags=(char) (DoRed | DoGreen | DoBlue);
8185 if (linear_colormap != MagickFalse)
8186 for (i=0; i < (ssize_t) number_colors; i++)
8188 color.blue=(unsigned short) 0;
8189 if (map_info->blue_max != 0)
8190 color.blue=(unsigned short) ((size_t)
8191 ((65535L*(i % map_info->green_mult))/map_info->blue_max));
8192 color.green=color.blue;
8193 color.red=color.blue;
8194 color.pixel=XStandardPixel(map_info,&color);
8198 for (i=0; i < (ssize_t) number_colors; i++)
8200 color.red=(unsigned short) 0;
8201 if (map_info->red_max != 0)
8202 color.red=(unsigned short) ((size_t)
8203 ((65535L*(i/map_info->red_mult))/map_info->red_max));
8204 color.green=(unsigned int) 0;
8205 if (map_info->green_max != 0)
8206 color.green=(unsigned short) ((size_t)
8207 ((65535L*((i/map_info->green_mult) % (map_info->green_max+1)))/
8208 map_info->green_max));
8209 color.blue=(unsigned short) 0;
8210 if (map_info->blue_max != 0)
8211 color.blue=(unsigned short) ((size_t)
8212 ((65535L*(i % map_info->green_mult))/map_info->blue_max));
8213 color.pixel=XStandardPixel(map_info,&color);
8216 if ((visual_info->klass == DirectColor) &&
8217 (colormap != XDefaultColormap(display,visual_info->screen)))
8218 (void) XStoreColors(display,colormap,colors,(int) number_colors);
8220 for (i=0; i < (ssize_t) number_colors; i++)
8221 (void) XAllocColor(display,colormap,&colors[i]);
8225 if ((visual_info->klass != DirectColor) &&
8226 (visual_info->klass != TrueColor))
8229 Set foreground, background, border, etc. pixels.
8231 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8232 &pixel->foreground_color);
8233 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8234 &pixel->background_color);
8235 if (pixel->background_color.pixel == pixel->foreground_color.pixel)
8238 Foreground and background colors must differ.
8240 pixel->background_color.red=(~pixel->foreground_color.red);
8241 pixel->background_color.green=
8242 (~pixel->foreground_color.green);
8243 pixel->background_color.blue=
8244 (~pixel->foreground_color.blue);
8245 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8246 &pixel->background_color);
8248 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8249 &pixel->border_color);
8250 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8251 &pixel->matte_color);
8252 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8253 &pixel->highlight_color);
8254 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8255 &pixel->shadow_color);
8256 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8257 &pixel->depth_color);
8258 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8259 &pixel->trough_color);
8260 for (i=0; i < MaxNumberPens; i++)
8262 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8263 &pixel->pen_colors[i]);
8264 pixel->pixels[image->colors+i]=pixel->pen_colors[i].pixel;
8266 pixel->colors=(ssize_t) (image->colors+MaxNumberPens);
8268 colors=(XColor *) RelinquishMagickMemory(colors);
8269 if (IsEventLogging())
8271 (void) LogMagickEvent(X11Event,GetMagickModule(),"Standard Colormap:");
8272 (void) LogMagickEvent(X11Event,GetMagickModule()," colormap id: 0x%lx",
8273 map_info->colormap);
8274 (void) LogMagickEvent(X11Event,GetMagickModule(),
8275 " red, green, blue max: %lu %lu %lu",map_info->red_max,
8276 map_info->green_max,map_info->blue_max);
8277 (void) LogMagickEvent(X11Event,GetMagickModule(),
8278 " red, green, blue mult: %lu %lu %lu",map_info->red_mult,
8279 map_info->green_mult,map_info->blue_mult);
8284 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8288 % X M a k e W i n d o w %
8292 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8294 % XMakeWindow() creates an X11 window.
8296 % The format of the XMakeWindow method is:
8298 % void XMakeWindow(Display *display,Window parent,char **argv,int argc,
8299 % XClassHint *class_hint,XWMHints *manager_hints,
8300 % XWindowInfo *window_info)
8302 % A description of each parameter follows:
8304 % o display: Specifies a connection to an X server; returned from
8307 % o parent: Specifies the parent window_info.
8309 % o argv: Specifies the application's argument list.
8311 % o argc: Specifies the number of arguments.
8313 % o class_hint: Specifies a pointer to a X11 XClassHint structure.
8315 % o manager_hints: Specifies a pointer to a X11 XWMHints structure.
8317 % o window_info: Specifies a pointer to a X11 XWindowInfo structure.
8320 MagickPrivate void XMakeWindow(Display *display,Window parent,char **argv,
8321 int argc,XClassHint *class_hint,XWMHints *manager_hints,
8322 XWindowInfo *window_info)
8324 #define MinWindowSize 64
8332 static XTextProperty
8343 Set window info hints.
8345 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
8346 assert(display != (Display *) NULL);
8347 assert(window_info != (XWindowInfo *) NULL);
8348 size_hints=XAllocSizeHints();
8349 if (size_hints == (XSizeHints *) NULL)
8350 ThrowXWindowFatalException(XServerFatalError,"UnableToMakeXWindow",argv[0]);
8351 size_hints->flags=(int) window_info->flags;
8352 size_hints->x=window_info->x;
8353 size_hints->y=window_info->y;
8354 size_hints->width=(int) window_info->width;
8355 size_hints->height=(int) window_info->height;
8356 if (window_info->immutable != MagickFalse)
8359 Window size cannot be changed.
8361 size_hints->min_width=size_hints->width;
8362 size_hints->min_height=size_hints->height;
8363 size_hints->max_width=size_hints->width;
8364 size_hints->max_height=size_hints->height;
8365 size_hints->flags|=PMinSize;
8366 size_hints->flags|=PMaxSize;
8371 Window size can be changed.
8373 size_hints->min_width=(int) window_info->min_width;
8374 size_hints->min_height=(int) window_info->min_height;
8375 size_hints->flags|=PResizeInc;
8376 size_hints->width_inc=(int) window_info->width_inc;
8377 size_hints->height_inc=(int) window_info->height_inc;
8378 #if !defined(PRE_R4_ICCCM)
8379 size_hints->flags|=PBaseSize;
8380 size_hints->base_width=size_hints->width_inc;
8381 size_hints->base_height=size_hints->height_inc;
8384 gravity=NorthWestGravity;
8385 if (window_info->geometry != (char *) NULL)
8388 default_geometry[MagickPathExtent],
8389 geometry[MagickPathExtent];
8398 User specified geometry.
8400 (void) FormatLocaleString(default_geometry,MagickPathExtent,"%dx%d",
8401 size_hints->width,size_hints->height);
8402 (void) CopyMagickString(geometry,window_info->geometry,MagickPathExtent);
8404 while (strlen(p) != 0)
8406 if ((isspace((int) ((unsigned char) *p)) == 0) && (*p != '%'))
8409 (void) CopyMagickString(p,p+1,MagickPathExtent-(p-geometry));
8411 flags=XWMGeometry(display,window_info->screen,geometry,default_geometry,
8412 window_info->border_width,size_hints,&size_hints->x,&size_hints->y,
8413 &size_hints->width,&size_hints->height,&gravity);
8414 if ((flags & WidthValue) && (flags & HeightValue))
8415 size_hints->flags|=USSize;
8416 if ((flags & XValue) && (flags & YValue))
8418 size_hints->flags|=USPosition;
8419 window_info->x=size_hints->x;
8420 window_info->y=size_hints->y;
8423 #if !defined(PRE_R4_ICCCM)
8424 size_hints->win_gravity=gravity;
8425 size_hints->flags|=PWinGravity;
8427 if (window_info->id == (Window) NULL)
8428 window_info->id=XCreateWindow(display,parent,window_info->x,window_info->y,
8429 (unsigned int) size_hints->width,(unsigned int) size_hints->height,
8430 window_info->border_width,(int) window_info->depth,InputOutput,
8431 window_info->visual,(unsigned long) window_info->mask,
8432 &window_info->attributes);
8445 Window already exists; change relevant attributes.
8447 (void) XChangeWindowAttributes(display,window_info->id,(unsigned long)
8448 window_info->mask,&window_info->attributes);
8449 mask=ConfigureNotify;
8450 while (XCheckTypedWindowEvent(display,window_info->id,(int) mask,&sans_event)) ;
8451 window_changes.x=window_info->x;
8452 window_changes.y=window_info->y;
8453 window_changes.width=(int) window_info->width;
8454 window_changes.height=(int) window_info->height;
8455 mask=(MagickStatusType) (CWWidth | CWHeight);
8456 if (window_info->flags & USPosition)
8458 (void) XReconfigureWMWindow(display,window_info->id,window_info->screen,
8459 mask,&window_changes);
8461 if (window_info->id == (Window) NULL)
8462 ThrowXWindowFatalException(XServerFatalError,"UnableToCreateWindow",
8464 status=XStringListToTextProperty(&window_info->name,1,&window_name);
8465 if (status == False)
8466 ThrowXWindowFatalException(XServerFatalError,"UnableToCreateTextProperty",
8468 status=XStringListToTextProperty(&window_info->icon_name,1,&icon_name);
8469 if (status == False)
8470 ThrowXWindowFatalException(XServerFatalError,"UnableToCreateTextProperty",
8471 window_info->icon_name);
8472 if (window_info->icon_geometry != (char *) NULL)
8480 User specified icon geometry.
8482 size_hints->flags|=USPosition;
8483 flags=XWMGeometry(display,window_info->screen,window_info->icon_geometry,
8484 (char *) NULL,0,size_hints,&manager_hints->icon_x,
8485 &manager_hints->icon_y,&width,&height,&gravity);
8486 if ((flags & XValue) && (flags & YValue))
8487 manager_hints->flags|=IconPositionHint;
8489 XSetWMProperties(display,window_info->id,&window_name,&icon_name,argv,argc,
8490 size_hints,manager_hints,class_hint);
8491 if (window_name.value != (void *) NULL)
8493 (void) XFree((void *) window_name.value);
8494 window_name.value=(unsigned char *) NULL;
8495 window_name.nitems=0;
8497 if (icon_name.value != (void *) NULL)
8499 (void) XFree((void *) icon_name.value);
8500 icon_name.value=(unsigned char *) NULL;
8503 atom_list[0]=XInternAtom(display,"WM_DELETE_WINDOW",MagickFalse);
8504 atom_list[1]=XInternAtom(display,"WM_TAKE_FOCUS",MagickFalse);
8505 (void) XSetWMProtocols(display,window_info->id,atom_list,2);
8506 (void) XFree((void *) size_hints);
8507 if (window_info->shape != MagickFalse)
8509 #if defined(MAGICKCORE_HAVE_SHAPE)
8515 Can we apply a non-rectangular shaping mask?
8519 if (XShapeQueryExtension(display,&error_base,&event_base) == 0)
8520 window_info->shape=MagickFalse;
8522 window_info->shape=MagickFalse;
8525 if (window_info->shared_memory)
8527 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
8529 Can we use shared memory with this window?
8531 if (XShmQueryExtension(display) == 0)
8532 window_info->shared_memory=MagickFalse;
8534 window_info->shared_memory=MagickFalse;
8537 window_info->image=NewImageList();
8538 window_info->destroy=MagickFalse;
8542 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8546 % X M a g i c k P r o g r e s s M o n i t o r %
8550 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8552 % XMagickProgressMonitor() displays the progress a task is making in
8553 % completing a task.
8555 % The format of the XMagickProgressMonitor method is:
8557 % void XMagickProgressMonitor(const char *task,
8558 % const MagickOffsetType quantum,const MagickSizeType span,
8559 % void *client_data)
8561 % A description of each parameter follows:
8563 % o task: Identifies the task in progress.
8565 % o quantum: Specifies the quantum position within the span which represents
8566 % how much progress has been made in completing a task.
8568 % o span: Specifies the span relative to completing a task.
8570 % o client_data: Pointer to any client data.
8574 static const char *GetLocaleMonitorMessage(const char *text)
8577 message[MagickPathExtent],
8578 tag[MagickPathExtent];
8586 (void) CopyMagickString(tag,text,MagickPathExtent);
8588 if (p != (char *) NULL)
8590 (void) FormatLocaleString(message,MagickPathExtent,"Monitor/%s",tag);
8591 locale_message=GetLocaleMessage(message);
8592 if (locale_message == message)
8594 return(locale_message);
8597 MagickPrivate MagickBooleanType XMagickProgressMonitor(const char *tag,
8598 const MagickOffsetType quantum,const MagickSizeType span,
8599 void *magick_unused(client_data))
8604 windows=XSetWindows((XWindows *) ~0);
8605 if (windows == (XWindows *) NULL)
8607 if (windows->info.mapped != MagickFalse)
8608 XProgressMonitorWidget(windows->display,windows,
8609 GetLocaleMonitorMessage(tag),quantum,span);
8614 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8618 % X Q u e r y C o l o r D a t a b a s e %
8622 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8624 % XQueryColorCompliance() looks up a RGB values for a color given in the target
8627 % The format of the XQueryColorDatabase method is:
8629 % MagickBooleanType XQueryColorCompliance(const char *target,XColor *color)
8631 % A description of each parameter follows:
8633 % o target: Specifies the color to lookup in the X color database.
8635 % o color: A pointer to an PixelInfo structure. The RGB value of the target
8636 % color is returned as this value.
8639 MagickPrivate MagickBooleanType XQueryColorCompliance(const char *target,
8646 *display = (Display *) NULL;
8655 Initialize color return value.
8657 assert(color != (XColor *) NULL);
8661 color->flags=(char) (DoRed | DoGreen | DoBlue);
8662 if ((target == (char *) NULL) || (*target == '\0'))
8663 target="#ffffffffffff";
8665 Let the X server define the color for us.
8667 if (display == (Display *) NULL)
8668 display=XOpenDisplay((char *) NULL);
8669 if (display == (Display *) NULL)
8671 ThrowXWindowException(XServerError,"ColorIsNotKnownToServer",target);
8672 return(MagickFalse);
8674 colormap=XDefaultColormap(display,XDefaultScreen(display));
8675 status=XParseColor(display,colormap,(char *) target,&xcolor);
8676 if (status == False)
8677 ThrowXWindowException(XServerError,"ColorIsNotKnownToServer",target)
8680 color->red=xcolor.red;
8681 color->green=xcolor.green;
8682 color->blue=xcolor.blue;
8683 color->flags=xcolor.flags;
8685 return(status != False ? MagickTrue : MagickFalse);
8689 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8693 % X Q u e r y P o s i t i o n %
8697 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8699 % XQueryPosition() gets the pointer coordinates relative to a window.
8701 % The format of the XQueryPosition method is:
8703 % void XQueryPosition(Display *display,const Window window,int *x,int *y)
8705 % A description of each parameter follows:
8707 % o display: Specifies a connection to an X server; returned from
8710 % o window: Specifies a pointer to a Window.
8712 % o x: Return the x coordinate of the pointer relative to the origin of the
8715 % o y: Return the y coordinate of the pointer relative to the origin of the
8719 MagickPrivate void XQueryPosition(Display *display,const Window window,int *x,
8732 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
8733 assert(display != (Display *) NULL);
8734 assert(window != (Window) NULL);
8735 assert(x != (int *) NULL);
8736 assert(y != (int *) NULL);
8737 (void) XQueryPointer(display,window,&root_window,&root_window,&x_root,&y_root,
8742 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8746 % X R e f r e s h W i n d o w %
8750 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8752 % XRefreshWindow() refreshes an image in a X window.
8754 % The format of the XRefreshWindow method is:
8756 % void XRefreshWindow(Display *display,const XWindowInfo *window,
8757 % const XEvent *event)
8759 % A description of each parameter follows:
8761 % o display: Specifies a connection to an X server; returned from
8764 % o window: Specifies a pointer to a XWindowInfo structure.
8766 % o event: Specifies a pointer to a XEvent structure. If it is NULL,
8767 % the entire image is refreshed.
8770 MagickPrivate void XRefreshWindow(Display *display,const XWindowInfo *window,
8771 const XEvent *event)
8781 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
8782 assert(display != (Display *) NULL);
8783 assert(window != (XWindowInfo *) NULL);
8784 if (window->ximage == (XImage *) NULL)
8786 if (event != (XEvent *) NULL)
8789 Determine geometry from expose event.
8793 width=(unsigned int) event->xexpose.width;
8794 height=(unsigned int) event->xexpose.height;
8802 Refresh entire window; discard outstanding expose events.
8806 width=window->width;
8807 height=window->height;
8808 while (XCheckTypedWindowEvent(display,window->id,Expose,&sans_event)) ;
8809 if (window->matte_pixmap != (Pixmap) NULL)
8811 #if defined(MAGICKCORE_HAVE_SHAPE)
8812 if (window->shape != MagickFalse)
8813 XShapeCombineMask(display,window->id,ShapeBounding,0,0,
8814 window->matte_pixmap,ShapeSet);
8819 Check boundary conditions.
8821 if ((window->ximage->width-(x+window->x)) < (int) width)
8822 width=(unsigned int) (window->ximage->width-(x+window->x));
8823 if ((window->ximage->height-(y+window->y)) < (int) height)
8824 height=(unsigned int) (window->ximage->height-(y+window->y));
8828 if (window->matte_pixmap != (Pixmap) NULL)
8829 (void) XSetClipMask(display,window->annotate_context,window->matte_pixmap);
8830 if (window->pixmap != (Pixmap) NULL)
8832 if (window->depth > 1)
8833 (void) XCopyArea(display,window->pixmap,window->id,
8834 window->annotate_context,x+window->x,y+window->y,width,height,x,y);
8836 (void) XCopyPlane(display,window->pixmap,window->id,
8837 window->highlight_context,x+window->x,y+window->y,width,height,x,y,
8842 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
8843 if (window->shared_memory)
8844 (void) XShmPutImage(display,window->id,window->annotate_context,
8845 window->ximage,x+window->x,y+window->y,x,y,width,height,MagickTrue);
8847 if (window->shared_memory == MagickFalse)
8848 (void) XPutImage(display,window->id,window->annotate_context,
8849 window->ximage,x+window->x,y+window->y,x,y,width,height);
8851 if (window->matte_pixmap != (Pixmap) NULL)
8852 (void) XSetClipMask(display,window->annotate_context,None);
8853 (void) XFlush(display);
8857 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8861 % X R e m o t e C o m m a n d %
8865 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8867 % XRemoteCommand() forces a remote display(1) to display the specified
8870 % The format of the XRemoteCommand method is:
8872 % MagickBooleanType XRemoteCommand(Display *display,const char *window,
8873 % const char *filename)
8875 % A description of each parameter follows:
8877 % o display: Specifies a connection to an X server; returned from
8880 % o window: Specifies the name or id of an X window.
8882 % o filename: the name of the image filename to display.
8885 MagickExport MagickBooleanType XRemoteCommand(Display *display,
8886 const char *window,const char *filename)
8895 assert(filename != (char *) NULL);
8896 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",filename);
8897 if (display == (Display *) NULL)
8898 display=XOpenDisplay((char *) NULL);
8899 if (display == (Display *) NULL)
8901 ThrowXWindowException(XServerError,"UnableToOpenXServer",filename);
8902 return(MagickFalse);
8904 remote_atom=XInternAtom(display,"IM_PROTOCOLS",MagickFalse);
8905 remote_window=(Window) NULL;
8906 root_window=XRootWindow(display,XDefaultScreen(display));
8907 if (window != (char *) NULL)
8910 Search window hierarchy and identify any clients by name or ID.
8912 if (isdigit((int) ((unsigned char) *window)) != 0)
8913 remote_window=XWindowByID(display,root_window,(Window)
8914 strtol((char *) window,(char **) NULL,0));
8915 if (remote_window == (Window) NULL)
8916 remote_window=XWindowByName(display,root_window,window);
8918 if (remote_window == (Window) NULL)
8919 remote_window=XWindowByProperty(display,root_window,remote_atom);
8920 if (remote_window == (Window) NULL)
8922 ThrowXWindowException(XServerError,"UnableToConnectToRemoteDisplay",
8924 return(MagickFalse);
8927 Send remote command.
8929 remote_atom=XInternAtom(display,"IM_REMOTE_COMMAND",MagickFalse);
8930 (void) XChangeProperty(display,remote_window,remote_atom,XA_STRING,8,
8931 PropModeReplace,(unsigned char *) filename,(int) strlen(filename));
8932 (void) XSync(display,MagickFalse);
8937 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8941 % X R e n d e r I m a g e %
8945 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8947 % XRenderImage() renders text on the image with an X11 font. It also returns
8948 % the bounding box of the text relative to the image.
8950 % The format of the XRenderImage method is:
8952 % MagickBooleanType XRenderImage(Image *image,DrawInfo *draw_info,
8953 % const PointInfo *offset,TypeMetric *metrics,ExceptionInfo *exception)
8955 % A description of each parameter follows:
8957 % o image: the image.
8959 % o draw_info: the draw info.
8961 % o offset: (x,y) location of text relative to image.
8963 % o metrics: bounding box of text.
8965 % o exception: return any errors or warnings in this structure.
8968 MagickPrivate MagickBooleanType XRenderImage(Image *image,
8969 const DrawInfo *draw_info,const PointInfo *offset,TypeMetric *metrics,
8970 ExceptionInfo *exception)
9013 Open X server connection.
9015 display=XOpenDisplay(draw_info->server_name);
9016 if (display == (Display *) NULL)
9018 ThrowXWindowException(XServerError,"UnableToOpenXServer",
9019 draw_info->server_name);
9020 return(MagickFalse);
9023 Get user defaults from X resource database.
9025 (void) XSetErrorHandler(XError);
9026 image_info=AcquireImageInfo();
9027 client_name=GetClientName();
9028 resource_database=XGetResourceDatabase(display,client_name);
9029 XGetResourceInfo(image_info,resource_database,client_name,&resource_info);
9030 resource_info.close_server=MagickFalse;
9031 resource_info.colormap=PrivateColormap;
9032 resource_info.font=AcquireString(draw_info->font);
9033 resource_info.background_color=AcquireString("#ffffffffffff");
9034 resource_info.foreground_color=AcquireString("#000000000000");
9035 map_info=XAllocStandardColormap();
9036 visual_info=(XVisualInfo *) NULL;
9037 font_info=(XFontStruct *) NULL;
9038 pixel.pixels=(unsigned long *) NULL;
9039 if (map_info == (XStandardColormap *) NULL)
9041 ThrowXWindowException(ResourceLimitError,"MemoryAllocationFailed",
9043 return(MagickFalse);
9046 Initialize visual info.
9048 visual_info=XBestVisualInfo(display,map_info,&resource_info);
9049 if (visual_info == (XVisualInfo *) NULL)
9051 XFreeResources(display,visual_info,map_info,&pixel,font_info,
9052 &resource_info,(XWindowInfo *) NULL);
9053 ThrowXWindowException(XServerError,"UnableToGetVisual",image->filename);
9054 return(MagickFalse);
9056 map_info->colormap=(Colormap) NULL;
9058 Initialize Standard Colormap info.
9060 XGetMapInfo(visual_info,XDefaultColormap(display,visual_info->screen),
9062 XGetPixelInfo(display,visual_info,map_info,&resource_info,(Image *) NULL,
9064 pixel.annotate_context=XDefaultGC(display,visual_info->screen);
9066 Initialize font info.
9068 font_info=XBestFont(display,&resource_info,MagickFalse);
9069 if (font_info == (XFontStruct *) NULL)
9071 XFreeResources(display,visual_info,map_info,&pixel,font_info,
9072 &resource_info,(XWindowInfo *) NULL);
9073 ThrowXWindowException(XServerError,"UnableToLoadFont",draw_info->font);
9074 return(MagickFalse);
9076 cache_info=(*draw_info);
9078 Initialize annotate info.
9080 XGetAnnotateInfo(&annotate_info);
9081 annotate_info.stencil=ForegroundStencil;
9082 if (cache_info.font != draw_info->font)
9085 Type name has changed.
9087 (void) XFreeFont(display,font_info);
9088 (void) CloneString(&resource_info.font,draw_info->font);
9089 font_info=XBestFont(display,&resource_info,MagickFalse);
9090 if (font_info == (XFontStruct *) NULL)
9092 ThrowXWindowException(XServerError,"UnableToLoadFont",
9094 return(MagickFalse);
9097 if (image->debug != MagickFalse)
9098 (void) LogMagickEvent(AnnotateEvent,GetMagickModule(),
9099 "Font %s; pointsize %g",draw_info->font != (char *) NULL ?
9100 draw_info->font : "none",draw_info->pointsize);
9101 cache_info=(*draw_info);
9102 annotate_info.font_info=font_info;
9103 annotate_info.text=(char *) draw_info->text;
9104 annotate_info.width=(unsigned int) XTextWidth(font_info,draw_info->text,(int)
9105 strlen(draw_info->text));
9106 annotate_info.height=(unsigned int) font_info->ascent+font_info->descent;
9107 metrics->pixels_per_em.x=(double) font_info->max_bounds.width;
9108 metrics->pixels_per_em.y=(double) font_info->ascent+font_info->descent;
9109 metrics->ascent=(double) font_info->ascent+4;
9110 metrics->descent=(double) (-font_info->descent);
9111 metrics->width=annotate_info.width/ExpandAffine(&draw_info->affine);
9112 metrics->height=font_info->ascent+font_info->descent;
9113 metrics->max_advance=(double) font_info->max_bounds.width;
9114 metrics->bounds.x1=0.0;
9115 metrics->bounds.y1=metrics->descent;
9116 metrics->bounds.x2=metrics->ascent+metrics->descent;
9117 metrics->bounds.y2=metrics->ascent+metrics->descent;
9118 metrics->underline_position=(-2.0);
9119 metrics->underline_thickness=1.0;
9120 if (draw_info->render == MagickFalse)
9122 if (draw_info->fill.alpha == TransparentAlpha)
9127 width=annotate_info.width;
9128 height=annotate_info.height;
9129 if ((fabs(draw_info->affine.rx) >= MagickEpsilon) ||
9130 (fabs(draw_info->affine.ry) >= MagickEpsilon))
9132 if ((fabs(draw_info->affine.sx-draw_info->affine.sy) < MagickEpsilon) &&
9133 (fabs(draw_info->affine.rx+draw_info->affine.ry) < MagickEpsilon))
9134 annotate_info.degrees=(double) (180.0/MagickPI)*
9135 atan2(draw_info->affine.rx,draw_info->affine.sx);
9137 (void) FormatLocaleString(annotate_info.geometry,MagickPathExtent,
9138 "%.20gx%.20g%+.20g%+.20g",(double) width,(double) height,
9139 ceil(offset->x-0.5),ceil(offset->y-metrics->ascent-metrics->descent+
9140 draw_info->interline_spacing-0.5));
9141 pixel.pen_color.red=ScaleQuantumToShort(draw_info->fill.red);
9142 pixel.pen_color.green=ScaleQuantumToShort(draw_info->fill.green);
9143 pixel.pen_color.blue=ScaleQuantumToShort(draw_info->fill.blue);
9144 status=XAnnotateImage(display,&pixel,&annotate_info,image,exception);
9147 ThrowXWindowException(ResourceLimitError,"MemoryAllocationFailed",
9149 return(MagickFalse);
9155 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9159 % X R e t a i n W i n d o w C o l o r s %
9163 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9165 % XRetainWindowColors() sets X11 color resources on a window. This preserves
9166 % the colors associated with an image displayed on the window.
9168 % The format of the XRetainWindowColors method is:
9170 % void XRetainWindowColors(Display *display,const Window window)
9172 % A description of each parameter follows:
9174 % o display: Specifies a connection to an X server; returned from
9177 % o window: Specifies a pointer to a XWindowInfo structure.
9180 MagickExport void XRetainWindowColors(Display *display,const Window window)
9189 Put property on the window.
9191 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
9192 assert(display != (Display *) NULL);
9193 assert(window != (Window) NULL);
9194 property=XInternAtom(display,"_XSETROOT_ID",MagickFalse);
9195 if (property == (Atom) NULL)
9197 ThrowXWindowException(XServerError,"UnableToCreateProperty",
9201 pixmap=XCreatePixmap(display,window,1,1,1);
9202 if (pixmap == (Pixmap) NULL)
9204 ThrowXWindowException(XServerError,"UnableToCreateBitmap","");
9207 (void) XChangeProperty(display,window,property,XA_PIXMAP,32,PropModeReplace,
9208 (unsigned char *) &pixmap,1);
9209 (void) XSetCloseDownMode(display,RetainPermanent);
9213 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9217 % X S e l e c t W i n d o w %
9221 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9223 % XSelectWindow() allows a user to select a window using the mouse. If the
9224 % mouse moves, a cropping rectangle is drawn and the extents of the rectangle
9225 % is returned in the crop_info structure.
9227 % The format of the XSelectWindow function is:
9229 % target_window=XSelectWindow(display,crop_info)
9231 % A description of each parameter follows:
9233 % o window: XSelectWindow returns the window id.
9235 % o display: Specifies a pointer to the Display structure; returned from
9238 % o crop_info: Specifies a pointer to a RectangleInfo structure. It
9239 % contains the extents of any cropping rectangle.
9242 static Window XSelectWindow(Display *display,RectangleInfo *crop_info)
9244 #define MinimumCropArea (unsigned int) 9
9271 Initialize graphic context.
9273 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
9274 assert(display != (Display *) NULL);
9275 assert(crop_info != (RectangleInfo *) NULL);
9276 root_window=XRootWindow(display,XDefaultScreen(display));
9277 context_values.background=XBlackPixel(display,XDefaultScreen(display));
9278 context_values.foreground=XWhitePixel(display,XDefaultScreen(display));
9279 context_values.function=GXinvert;
9280 context_values.plane_mask=
9281 context_values.background ^ context_values.foreground;
9282 context_values.subwindow_mode=IncludeInferiors;
9283 annotate_context=XCreateGC(display,root_window,(size_t) (GCBackground |
9284 GCForeground | GCFunction | GCSubwindowMode),&context_values);
9285 if (annotate_context == (GC) NULL)
9286 return(MagickFalse);
9288 Grab the pointer using target cursor.
9290 target_cursor=XMakeCursor(display,root_window,XDefaultColormap(display,
9291 XDefaultScreen(display)),(char * ) "white",(char * ) "black");
9292 status=XGrabPointer(display,root_window,MagickFalse,(unsigned int)
9293 (ButtonPressMask | ButtonReleaseMask | ButtonMotionMask),GrabModeSync,
9294 GrabModeAsync,root_window,target_cursor,CurrentTime);
9295 if (status != GrabSuccess)
9297 ThrowXWindowException(XServerError,"UnableToGrabMouse","");
9298 return((Window) NULL);
9304 crop_info->height=0;
9306 target_window=(Window) NULL;
9311 if ((crop_info->width*crop_info->height) >= MinimumCropArea)
9312 (void) XDrawRectangle(display,root_window,annotate_context,
9313 (int) crop_info->x,(int) crop_info->y,(unsigned int) crop_info->width-1,
9314 (unsigned int) crop_info->height-1);
9316 Allow another event.
9318 (void) XAllowEvents(display,SyncPointer,CurrentTime);
9319 (void) XWindowEvent(display,root_window,ButtonPressMask |
9320 ButtonReleaseMask | ButtonMotionMask,&event);
9321 if ((crop_info->width*crop_info->height) >= MinimumCropArea)
9322 (void) XDrawRectangle(display,root_window,annotate_context,
9323 (int) crop_info->x,(int) crop_info->y,(unsigned int) crop_info->width-1,
9324 (unsigned int) crop_info->height-1);
9329 target_window=XGetSubwindow(display,event.xbutton.subwindow,
9330 event.xbutton.x,event.xbutton.y);
9331 if (target_window == (Window) NULL)
9332 target_window=root_window;
9333 x_offset=event.xbutton.x_root;
9334 y_offset=event.xbutton.y_root;
9335 crop_info->x=(ssize_t) x_offset;
9336 crop_info->y=(ssize_t) y_offset;
9338 crop_info->height=0;
9350 Discard pending button motion events.
9352 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
9353 crop_info->x=(ssize_t) event.xmotion.x;
9354 crop_info->y=(ssize_t) event.xmotion.y;
9356 Check boundary conditions.
9358 if ((int) crop_info->x < x_offset)
9359 crop_info->width=(size_t) (x_offset-crop_info->x);
9362 crop_info->width=(size_t) (crop_info->x-x_offset);
9363 crop_info->x=(ssize_t) x_offset;
9365 if ((int) crop_info->y < y_offset)
9366 crop_info->height=(size_t) (y_offset-crop_info->y);
9369 crop_info->height=(size_t) (crop_info->y-y_offset);
9370 crop_info->y=(ssize_t) y_offset;
9376 } while ((target_window == (Window) NULL) || (presses > 0));
9377 (void) XUngrabPointer(display,CurrentTime);
9378 (void) XFreeCursor(display,target_cursor);
9379 (void) XFreeGC(display,annotate_context);
9380 if ((crop_info->width*crop_info->height) < MinimumCropArea)
9383 crop_info->height=0;
9385 if ((crop_info->width != 0) && (crop_info->height != 0))
9386 target_window=root_window;
9387 return(target_window);
9391 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9395 % X S e t C u r s o r S t a t e %
9399 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9401 % XSetCursorState() sets the cursor state to busy, otherwise the cursor are
9402 % reset to their default.
9404 % The format of the XXSetCursorState method is:
9406 % XSetCursorState(display,windows,const MagickStatusType state)
9408 % A description of each parameter follows:
9410 % o display: Specifies a connection to an X server; returned from
9413 % o windows: Specifies a pointer to a XWindows structure.
9415 % o state: An unsigned integer greater than 0 sets the cursor state
9416 % to busy, otherwise the cursor are reset to their default.
9419 MagickPrivate void XSetCursorState(Display *display,XWindows *windows,
9420 const MagickStatusType state)
9422 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
9423 assert(display != (Display *) NULL);
9424 assert(windows != (XWindows *) NULL);
9427 (void) XCheckDefineCursor(display,windows->image.id,
9428 windows->image.busy_cursor);
9429 (void) XCheckDefineCursor(display,windows->pan.id,
9430 windows->pan.busy_cursor);
9431 (void) XCheckDefineCursor(display,windows->magnify.id,
9432 windows->magnify.busy_cursor);
9433 (void) XCheckDefineCursor(display,windows->command.id,
9434 windows->command.busy_cursor);
9438 (void) XCheckDefineCursor(display,windows->image.id,
9439 windows->image.cursor);
9440 (void) XCheckDefineCursor(display,windows->pan.id,windows->pan.cursor);
9441 (void) XCheckDefineCursor(display,windows->magnify.id,
9442 windows->magnify.cursor);
9443 (void) XCheckDefineCursor(display,windows->command.id,
9444 windows->command.cursor);
9445 (void) XCheckDefineCursor(display,windows->command.id,
9446 windows->widget.cursor);
9447 (void) XWithdrawWindow(display,windows->info.id,windows->info.screen);
9449 windows->info.mapped=MagickFalse;
9453 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9457 % X S e t W i n d o w s %
9461 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9463 % XSetWindows() sets the X windows structure if the windows info is specified.
9464 % Otherwise the current windows structure is returned.
9466 % The format of the XSetWindows method is:
9468 % XWindows *XSetWindows(XWindows *windows_info)
9470 % A description of each parameter follows:
9472 % o windows_info: Initialize the Windows structure with this information.
9475 MagickPrivate XWindows *XSetWindows(XWindows *windows_info)
9478 *windows = (XWindows *) NULL;
9480 if (windows_info != (XWindows *) ~0)
9482 windows=(XWindows *) RelinquishMagickMemory(windows);
9483 windows=windows_info;
9488 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9492 % X U s e r P r e f e r e n c e s %
9496 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9498 % XUserPreferences() saves the preferences in a configuration file in the
9499 % users' home directory.
9501 % The format of the XUserPreferences method is:
9503 % void XUserPreferences(XResourceInfo *resource_info)
9505 % A description of each parameter follows:
9507 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
9510 MagickPrivate void XUserPreferences(XResourceInfo *resource_info)
9512 #if defined(X11_PREFERENCES_PATH)
9514 cache[MagickPathExtent],
9515 filename[MagickPathExtent],
9516 specifier[MagickPathExtent];
9523 preferences_database;
9526 Save user preferences to the client configuration file.
9528 assert(resource_info != (XResourceInfo *) NULL);
9529 client_name=GetClientName();
9530 preferences_database=XrmGetStringDatabase("");
9531 (void) FormatLocaleString(specifier,MagickPathExtent,"%s.backdrop",client_name);
9532 value=resource_info->backdrop ? "True" : "False";
9533 XrmPutStringResource(&preferences_database,specifier,(char *) value);
9534 (void) FormatLocaleString(specifier,MagickPathExtent,"%s.colormap",client_name);
9535 value=resource_info->colormap == SharedColormap ? "Shared" : "Private";
9536 XrmPutStringResource(&preferences_database,specifier,(char *) value);
9537 (void) FormatLocaleString(specifier,MagickPathExtent,"%s.confirmExit",
9539 value=resource_info->confirm_exit ? "True" : "False";
9540 XrmPutStringResource(&preferences_database,specifier,(char *) value);
9541 (void) FormatLocaleString(specifier,MagickPathExtent,"%s.confirmEdit",
9543 value=resource_info->confirm_edit ? "True" : "False";
9544 XrmPutStringResource(&preferences_database,specifier,(char *) value);
9545 (void) FormatLocaleString(specifier,MagickPathExtent,"%s.displayWarnings",
9547 value=resource_info->display_warnings ? "True" : "False";
9548 XrmPutStringResource(&preferences_database,specifier,(char *) value);
9549 (void) FormatLocaleString(specifier,MagickPathExtent,"%s.dither",client_name);
9550 value=resource_info->quantize_info->dither_method != NoDitherMethod ?
9552 XrmPutStringResource(&preferences_database,specifier,(char *) value);
9553 (void) FormatLocaleString(specifier,MagickPathExtent,"%s.gammaCorrect",
9555 value=resource_info->gamma_correct ? "True" : "False";
9556 XrmPutStringResource(&preferences_database,specifier,(char *) value);
9557 (void) FormatLocaleString(specifier,MagickPathExtent,"%s.undoCache",client_name);
9558 (void) FormatLocaleString(cache,MagickPathExtent,"%.20g",(double)
9559 resource_info->undo_cache);
9560 XrmPutStringResource(&preferences_database,specifier,cache);
9561 (void) FormatLocaleString(specifier,MagickPathExtent,"%s.usePixmap",client_name);
9562 value=resource_info->use_pixmap ? "True" : "False";
9563 XrmPutStringResource(&preferences_database,specifier,(char *) value);
9564 (void) FormatLocaleString(filename,MagickPathExtent,"%s%src",
9565 X11_PREFERENCES_PATH,client_name);
9566 ExpandFilename(filename);
9567 XrmPutFileDatabase(preferences_database,filename);
9572 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9576 % X V i s u a l C l a s s N a m e %
9580 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9582 % XVisualClassName() returns the visual class name as a character string.
9584 % The format of the XVisualClassName method is:
9586 % char *XVisualClassName(const int visual_class)
9588 % A description of each parameter follows:
9590 % o visual_type: XVisualClassName returns the visual class as a character
9593 % o class: Specifies the visual class.
9596 static const char *XVisualClassName(const int visual_class)
9598 switch (visual_class)
9600 case StaticGray: return("StaticGray");
9601 case GrayScale: return("GrayScale");
9602 case StaticColor: return("StaticColor");
9603 case PseudoColor: return("PseudoColor");
9604 case TrueColor: return("TrueColor");
9605 case DirectColor: return("DirectColor");
9607 return("unknown visual class");
9611 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9619 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9621 % XWarning() displays a warning reason in a Notice widget.
9623 % The format of the XWarning method is:
9625 % void XWarning(const unsigned int warning,const char *reason,
9626 % const char *description)
9628 % A description of each parameter follows:
9630 % o warning: Specifies the numeric warning category.
9632 % o reason: Specifies the reason to display before terminating the
9635 % o description: Specifies any description to the reason.
9638 MagickPrivate void XWarning(const ExceptionType magick_unused(warning),
9639 const char *reason,const char *description)
9642 text[MagickPathExtent];
9647 if (reason == (char *) NULL)
9649 (void) CopyMagickString(text,reason,MagickPathExtent);
9650 (void) ConcatenateMagickString(text,":",MagickPathExtent);
9651 windows=XSetWindows((XWindows *) ~0);
9652 XNoticeWidget(windows->display,windows,text,(char *) description);
9656 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9660 % X W i n d o w B y I D %
9664 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9666 % XWindowByID() locates a child window with a given ID. If not window with
9667 % the given name is found, 0 is returned. Only the window specified and its
9668 % subwindows are searched.
9670 % The format of the XWindowByID function is:
9672 % child=XWindowByID(display,window,id)
9674 % A description of each parameter follows:
9676 % o child: XWindowByID returns the window with the specified
9677 % id. If no windows are found, XWindowByID returns 0.
9679 % o display: Specifies a pointer to the Display structure; returned from
9682 % o id: Specifies the id of the window to locate.
9685 MagickPrivate Window XWindowByID(Display *display,const Window root_window,
9705 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
9706 assert(display != (Display *) NULL);
9707 assert(root_window != (Window) NULL);
9709 return(XSelectWindow(display,&rectangle_info));
9710 if (root_window == id)
9711 return(root_window);
9712 status=XQueryTree(display,root_window,&child,&child,&children,
9714 if (status == False)
9715 return((Window) NULL);
9716 window=(Window) NULL;
9717 for (i=0; i < (int) number_children; i++)
9720 Search each child and their children.
9722 window=XWindowByID(display,children[i],id);
9723 if (window != (Window) NULL)
9726 if (children != (Window *) NULL)
9727 (void) XFree((void *) children);
9732 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9736 % X W i n d o w B y N a m e %
9740 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9742 % XWindowByName() locates a window with a given name on a display. If no
9743 % window with the given name is found, 0 is returned. If more than one window
9744 % has the given name, the first one is returned. Only root and its children
9747 % The format of the XWindowByName function is:
9749 % window=XWindowByName(display,root_window,name)
9751 % A description of each parameter follows:
9753 % o window: XWindowByName returns the window id.
9755 % o display: Specifies a pointer to the Display structure; returned from
9758 % o root_window: Specifies the id of the root window.
9760 % o name: Specifies the name of the window to locate.
9763 MagickPrivate Window XWindowByName(Display *display,const Window root_window,
9783 assert(display != (Display *) NULL);
9784 assert(root_window != (Window) NULL);
9785 assert(name != (char *) NULL);
9786 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",name);
9787 if (XGetWMName(display,root_window,&window_name) != 0)
9788 if (LocaleCompare((char *) window_name.value,name) == 0)
9789 return(root_window);
9790 status=XQueryTree(display,root_window,&child,&child,&children,
9792 if (status == False)
9793 return((Window) NULL);
9794 window=(Window) NULL;
9795 for (i=0; i < (int) number_children; i++)
9798 Search each child and their children.
9800 window=XWindowByName(display,children[i],name);
9801 if (window != (Window) NULL)
9804 if (children != (Window *) NULL)
9805 (void) XFree((void *) children);
9810 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9814 % X W i n d o w B y P r o p e r y %
9818 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9820 % XWindowByProperty() locates a child window with a given property. If not
9821 % window with the given name is found, 0 is returned. If more than one window
9822 % has the given property, the first one is returned. Only the window
9823 % specified and its subwindows are searched.
9825 % The format of the XWindowByProperty function is:
9827 % child=XWindowByProperty(display,window,property)
9829 % A description of each parameter follows:
9831 % o child: XWindowByProperty returns the window id with the specified
9832 % property. If no windows are found, XWindowByProperty returns 0.
9834 % o display: Specifies a pointer to the Display structure; returned from
9837 % o property: Specifies the property of the window to locate.
9840 MagickPrivate Window XWindowByProperty(Display *display,const Window window,
9841 const Atom property)
9869 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
9870 assert(display != (Display *) NULL);
9871 assert(window != (Window) NULL);
9872 assert(property != (Atom) NULL);
9873 status=XQueryTree(display,window,&root,&parent,&children,&number_children);
9874 if (status == False)
9875 return((Window) NULL);
9877 child=(Window) NULL;
9878 for (i=0; (i < number_children) && (child == (Window) NULL); i++)
9880 status=XGetWindowProperty(display,children[i],property,0L,0L,MagickFalse,
9881 (Atom) AnyPropertyType,&type,&format,&number_items,&after,&data);
9883 (void) XFree((void *) data);
9884 if ((status == Success) && (type != (Atom) NULL))
9887 for (i=0; (i < number_children) && (child == (Window) NULL); i++)
9888 child=XWindowByProperty(display,children[i],property);
9889 if (children != (Window *) NULL)
9890 (void) XFree((void *) children);
9896 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9900 % X I m p o r t I m a g e %
9904 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9906 % XImportImage() reads an image from an X window.
9908 % The format of the XImportImage method is:
9910 % Image *XImportImage(const ImageInfo *image_info,XImportInfo *ximage_info,
9911 % ExceptionInfo *exception)
9913 % A description of each parameter follows:
9915 % o image_info: the image info..
9917 % o ximage_info: Specifies a pointer to an XImportInfo structure.
9919 % o exception: return any errors or warnings in this structure.
9922 MagickExport Image *XImportImage(const ImageInfo *image_info,
9923 XImportInfo *ximage_info,ExceptionInfo *exception)
9925 assert(image_info != (const ImageInfo *) NULL);
9926 assert(image_info->signature == MagickCoreSignature);
9927 if (image_info->debug != MagickFalse)
9928 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
9929 image_info->filename);
9930 assert(ximage_info != (XImportInfo *) NULL);
9931 assert(exception != (ExceptionInfo *) NULL);
9932 assert(exception->signature == MagickCoreSignature);
9933 return((Image *) NULL);
9937 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9941 % X R e n d e r X 1 1 %
9945 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9947 % XRenderImage() renders text on the image with an X11 font. It also returns
9948 % the bounding box of the text relative to the image.
9950 % The format of the XRenderImage method is:
9952 % MagickBooleanType XRenderImage(Image *image,DrawInfo *draw_info,
9953 % const PointInfo *offset,TypeMetric *metrics,ExceptionInfo *exception)
9955 % A description of each parameter follows:
9957 % o image: the image.
9959 % o draw_info: the draw info.
9961 % o offset: (x,y) location of text relative to image.
9963 % o metrics: bounding box of text.
9965 % o exception: return any errors or warnings in this structure.
9968 MagickPrivate MagickBooleanType XRenderImage(Image *image,
9969 const DrawInfo *draw_info,const PointInfo *offset,TypeMetric *metrics,
9970 ExceptionInfo *exception)
9975 (void) ThrowMagickException(exception,GetMagickModule(),
9976 MissingDelegateError,"DelegateLibrarySupportNotBuiltIn","'%s' (X11)",
9978 return(MagickFalse);
9983 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9987 + X C o m p o n e n t G e n e s i s %
9991 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9993 % XComponentGenesis() instantiates the X component.
9995 % The format of the XComponentGenesis method is:
9997 % MagickBooleanType XComponentGenesis(void)
10000 MagickPrivate MagickBooleanType XComponentGenesis(void)
10002 return(MagickTrue);
10006 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10010 % X G e t I m p o r t I n f o %
10014 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10016 % XGetImportInfo() initializes the XImportInfo structure.
10018 % The format of the XGetImportInfo method is:
10020 % void XGetImportInfo(XImportInfo *ximage_info)
10022 % A description of each parameter follows:
10024 % o ximage_info: Specifies a pointer to an ImageInfo structure.
10027 MagickExport void XGetImportInfo(XImportInfo *ximage_info)
10029 assert(ximage_info != (XImportInfo *) NULL);
10030 ximage_info->frame=MagickFalse;
10031 ximage_info->borders=MagickFalse;
10032 ximage_info->screen=MagickFalse;
10033 ximage_info->descend=MagickTrue;
10034 ximage_info->silent=MagickFalse;