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-2013 ImageMagick Studio LLC, a non-profit organization %
21 % dedicated to making software imaging solutions freely available. %
23 % You may not use this file except in compliance with the License. You may %
24 % obtain a copy of the License at %
26 % http://www.imagemagick.org/script/license.php %
28 % Unless required by applicable law or agreed to in writing, software %
29 % distributed under the License is distributed on an "AS IS" BASIS, %
30 % WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %
31 % See the License for the specific language governing permissions and %
32 % limitations under the License. %
34 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
42 #include "MagickCore/studio.h"
43 #include "MagickCore/animate.h"
44 #include "MagickCore/artifact.h"
45 #include "MagickCore/blob.h"
46 #include "MagickCore/cache.h"
47 #include "MagickCore/client.h"
48 #include "MagickCore/color.h"
49 #include "MagickCore/color-private.h"
50 #include "MagickCore/colormap.h"
51 #include "MagickCore/composite.h"
52 #include "MagickCore/constitute.h"
53 #include "MagickCore/display.h"
54 #include "MagickCore/distort.h"
55 #include "MagickCore/exception.h"
56 #include "MagickCore/exception-private.h"
57 #include "MagickCore/geometry.h"
58 #include "MagickCore/identify.h"
59 #include "MagickCore/image.h"
60 #include "MagickCore/image-private.h"
61 #include "MagickCore/list.h"
62 #include "MagickCore/locale_.h"
63 #include "MagickCore/log.h"
64 #include "MagickCore/magick.h"
65 #include "MagickCore/memory_.h"
66 #include "MagickCore/monitor.h"
67 #include "MagickCore/nt-base-private.h"
68 #include "MagickCore/option.h"
69 #include "MagickCore/pixel-accessor.h"
70 #include "MagickCore/PreRvIcccm.h"
71 #include "MagickCore/quantize.h"
72 #include "MagickCore/quantum.h"
73 #include "MagickCore/quantum-private.h"
74 #include "MagickCore/resource_.h"
75 #include "MagickCore/resize.h"
76 #include "MagickCore/statistic.h"
77 #include "MagickCore/string_.h"
78 #include "MagickCore/string-private.h"
79 #include "MagickCore/transform.h"
80 #include "MagickCore/token.h"
81 #include "MagickCore/utility.h"
82 #include "MagickCore/utility-private.h"
83 #include "MagickCore/widget.h"
84 #include "MagickCore/widget-private.h"
85 #include "MagickCore/xwindow.h"
86 #include "MagickCore/xwindow-private.h"
87 #include "MagickCore/version.h"
91 #if defined(MAGICKCORE_X11_DELEGATE)
92 #include <X11/Xproto.h>
93 #include <X11/Xlocale.h>
94 #if defined(MAGICK_HAVE_POLL)
95 # include <sys/poll.h>
97 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
98 #if defined(MAGICKCORE_HAVE_MACHINE_PARAM_H)
99 # include <machine/param.h>
103 #include <X11/extensions/XShm.h>
105 #if defined(MAGICKCORE_HAVE_SHAPE)
106 #include <X11/extensions/shape.h>
112 #define XBlueGamma(color) ClampToQuantum(blue_gamma == 1.0 ? (double) \
113 (color) : ((pow(((double) QuantumScale*(color)),1.0/(double) blue_gamma)* \
115 #define XGammaPacket(map,color) (size_t) (map->base_pixel+ \
116 ((ScaleQuantumToShort(XRedGamma((color)->red))*map->red_max/65535L)* \
118 ((ScaleQuantumToShort(XGreenGamma((color)->green))*map->green_max/65535L)* \
120 ((ScaleQuantumToShort(XBlueGamma((color)->blue))*map->blue_max/65535L)* \
122 #define XGammaPixel(image,map,color) (size_t) (map->base_pixel+ \
123 ((ScaleQuantumToShort(XRedGamma(GetPixelRed(image,color)))*map->red_max/65535L)* \
125 ((ScaleQuantumToShort(XGreenGamma(GetPixelGreen(image,color)))*map->green_max/65535L)* \
127 ((ScaleQuantumToShort(XBlueGamma(GetPixelBlue(image,color)))*map->blue_max/65535L)* \
129 #define XGreenGamma(color) ClampToQuantum(green_gamma == 1.0 ? (double) \
130 (color) : ((pow(((double) QuantumScale*(color)),1.0/(double) green_gamma)* \
132 #define XRedGamma(color) ClampToQuantum(red_gamma == 1.0 ? (double) \
133 (color) : ((pow(((double) QuantumScale*(color)),1.0/(double) red_gamma)* \
135 #define XStandardPixel(map,color) (size_t) (map->base_pixel+ \
136 (((color)->red*map->red_max/65535L)*map->red_mult)+ \
137 (((color)->green*map->green_max/65535L)*map->green_mult)+ \
138 (((color)->blue*map->blue_max/65535L)*map->blue_mult))
140 #define AccentuateModulate ScaleCharToQuantum(80)
141 #define HighlightModulate ScaleCharToQuantum(125)
142 #define ShadowModulate ScaleCharToQuantum(135)
143 #define DepthModulate ScaleCharToQuantum(185)
144 #define TroughModulate ScaleCharToQuantum(110)
146 #define XLIB_ILLEGAL_ACCESS 1
148 #undef NorthWestGravity
150 #undef NorthEastGravity
154 #undef SouthWestGravity
156 #undef SouthEastGravity
163 #define XFD_SET fd_set
167 Enumeration declarations.
181 Typedef declarations.
183 typedef struct _DiversityPacket
198 Constant declaractions.
200 static MagickBooleanType
201 xerror_alert = MagickFalse;
207 *XVisualClassName(const int);
214 static MagickBooleanType
215 XMakePixmap(Display *,const XResourceInfo *,XWindowInfo *);
218 XMakeImageLSBFirst(const XResourceInfo *,const XWindowInfo *,Image *,
219 XImage *,XImage *,ExceptionInfo *),
220 XMakeImageMSBFirst(const XResourceInfo *,const XWindowInfo *,Image *,
221 XImage *,XImage *,ExceptionInfo *);
224 XSelectWindow(Display *,RectangleInfo *);
227 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
231 % D e s t r o y X R e s o u r c e s %
235 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
237 % DestroyXResources() destroys any X resources.
239 % The format of the DestroyXResources method is:
241 % void DestroyXResources()
243 % A description of each parameter follows:
246 MagickExport void DestroyXResources(void)
255 *magick_windows[MaxXWindows];
261 windows=XSetWindows((XWindows *) ~0);
262 if ((windows == (XWindows *) NULL) || (windows->display == (Display *) NULL))
265 magick_windows[number_windows++]=(&windows->context);
266 magick_windows[number_windows++]=(&windows->group_leader);
267 magick_windows[number_windows++]=(&windows->backdrop);
268 magick_windows[number_windows++]=(&windows->icon);
269 magick_windows[number_windows++]=(&windows->image);
270 magick_windows[number_windows++]=(&windows->info);
271 magick_windows[number_windows++]=(&windows->magnify);
272 magick_windows[number_windows++]=(&windows->pan);
273 magick_windows[number_windows++]=(&windows->command);
274 magick_windows[number_windows++]=(&windows->widget);
275 magick_windows[number_windows++]=(&windows->popup);
276 magick_windows[number_windows++]=(&windows->context);
277 for (i=0; i < (int) number_windows; i++)
279 if (magick_windows[i]->mapped != MagickFalse)
281 (void) XWithdrawWindow(windows->display,magick_windows[i]->id,
282 magick_windows[i]->screen);
283 magick_windows[i]->mapped=MagickFalse;
285 if (magick_windows[i]->name != (char *) NULL)
286 magick_windows[i]->name=(char *)
287 RelinquishMagickMemory(magick_windows[i]->name);
288 if (magick_windows[i]->icon_name != (char *) NULL)
289 magick_windows[i]->icon_name=(char *)
290 RelinquishMagickMemory(magick_windows[i]->icon_name);
291 if (magick_windows[i]->cursor != (Cursor) NULL)
293 (void) XFreeCursor(windows->display,magick_windows[i]->cursor);
294 magick_windows[i]->cursor=(Cursor) NULL;
296 if (magick_windows[i]->busy_cursor != (Cursor) NULL)
298 (void) XFreeCursor(windows->display,magick_windows[i]->busy_cursor);
299 magick_windows[i]->busy_cursor=(Cursor) NULL;
301 if (magick_windows[i]->highlight_stipple != (Pixmap) NULL)
303 (void) XFreePixmap(windows->display,
304 magick_windows[i]->highlight_stipple);
305 magick_windows[i]->highlight_stipple=(Pixmap) NULL;
307 if (magick_windows[i]->shadow_stipple != (Pixmap) NULL)
309 (void) XFreePixmap(windows->display,magick_windows[i]->shadow_stipple);
310 magick_windows[i]->shadow_stipple=(Pixmap) NULL;
312 if (magick_windows[i]->ximage != (XImage *) NULL)
314 XDestroyImage(magick_windows[i]->ximage);
315 magick_windows[i]->ximage=(XImage *) NULL;
317 if (magick_windows[i]->pixmap != (Pixmap) NULL)
319 (void) XFreePixmap(windows->display,magick_windows[i]->pixmap);
320 magick_windows[i]->pixmap=(Pixmap) NULL;
322 if (magick_windows[i]->id != (Window) NULL)
324 (void) XDestroyWindow(windows->display,magick_windows[i]->id);
325 magick_windows[i]->id=(Window) NULL;
327 if (magick_windows[i]->destroy != MagickFalse)
329 if (magick_windows[i]->image != (Image *) NULL)
331 magick_windows[i]->image=DestroyImage(magick_windows[i]->image);
332 magick_windows[i]->image=NewImageList();
334 if (magick_windows[i]->matte_pixmap != (Pixmap) NULL)
336 (void) XFreePixmap(windows->display,
337 magick_windows[i]->matte_pixmap);
338 magick_windows[i]->matte_pixmap=(Pixmap) NULL;
341 if (magick_windows[i]->segment_info != (void *) NULL)
343 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
347 segment_info=(XShmSegmentInfo *) magick_windows[i]->segment_info;
348 if (segment_info != (XShmSegmentInfo *) NULL)
349 if (segment_info[0].shmid >= 0)
351 if (segment_info[0].shmaddr != NULL)
352 (void) shmdt(segment_info[0].shmaddr);
353 (void) shmctl(segment_info[0].shmid,IPC_RMID,0);
354 segment_info[0].shmaddr=NULL;
355 segment_info[0].shmid=(-1);
358 magick_windows[i]->segment_info=(void *)
359 RelinquishMagickMemory(magick_windows[i]->segment_info);
362 windows->icon_resources=(XResourceInfo *)
363 RelinquishMagickMemory(windows->icon_resources);
364 if (windows->icon_pixel != (XPixelInfo *) NULL)
366 if (windows->icon_pixel->pixels != (unsigned long *) NULL)
367 windows->icon_pixel->pixels=(unsigned long *)
368 RelinquishMagickMemory(windows->icon_pixel->pixels);
369 if (windows->icon_pixel->annotate_context != (GC) NULL)
370 XFreeGC(windows->display,windows->icon_pixel->annotate_context);
371 windows->icon_pixel=(XPixelInfo *)
372 RelinquishMagickMemory(windows->icon_pixel);
374 if (windows->pixel_info != (XPixelInfo *) NULL)
376 if (windows->pixel_info->pixels != (unsigned long *) NULL)
377 windows->pixel_info->pixels=(unsigned long *)
378 RelinquishMagickMemory(windows->pixel_info->pixels);
379 if (windows->pixel_info->annotate_context != (GC) NULL)
380 XFreeGC(windows->display,windows->pixel_info->annotate_context);
381 if (windows->pixel_info->widget_context != (GC) NULL)
382 XFreeGC(windows->display,windows->pixel_info->widget_context);
383 if (windows->pixel_info->highlight_context != (GC) NULL)
384 XFreeGC(windows->display,windows->pixel_info->highlight_context);
385 windows->pixel_info=(XPixelInfo *)
386 RelinquishMagickMemory(windows->pixel_info);
388 if (windows->font_info != (XFontStruct *) NULL)
390 XFreeFont(windows->display,windows->font_info);
391 windows->font_info=(XFontStruct *) NULL;
393 if (windows->class_hints != (XClassHint *) NULL)
395 if (windows->class_hints->res_name != (char *) NULL)
396 windows->class_hints->res_name=DestroyString(
397 windows->class_hints->res_name);
398 if (windows->class_hints->res_class != (char *) NULL)
399 windows->class_hints->res_class=DestroyString(
400 windows->class_hints->res_class);
401 XFree(windows->class_hints);
402 windows->class_hints=(XClassHint *) NULL;
404 if (windows->manager_hints != (XWMHints *) NULL)
406 XFree(windows->manager_hints);
407 windows->manager_hints=(XWMHints *) NULL;
409 if (windows->map_info != (XStandardColormap *) NULL)
411 XFree(windows->map_info);
412 windows->map_info=(XStandardColormap *) NULL;
414 if (windows->icon_map != (XStandardColormap *) NULL)
416 XFree(windows->icon_map);
417 windows->icon_map=(XStandardColormap *) NULL;
419 if (windows->visual_info != (XVisualInfo *) NULL)
421 XFree(windows->visual_info);
422 windows->visual_info=(XVisualInfo *) NULL;
424 if (windows->icon_visual != (XVisualInfo *) NULL)
426 XFree(windows->icon_visual);
427 windows->icon_visual=(XVisualInfo *) NULL;
429 (void) XSetWindows((XWindows *) NULL);
433 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
437 % X A n n o t a t e I m a g e %
441 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
443 % XAnnotateImage() annotates the image with text.
445 % The format of the XAnnotateImage method is:
447 % MagickBooleanType XAnnotateImage(Display *display,
448 % const XPixelInfo *pixel,XAnnotateInfo *annotate_info,Image *image,
449 % ExceptionInfo *exception)
451 % A description of each parameter follows:
453 % o display: Specifies a connection to an X server; returned from
456 % o pixel: Specifies a pointer to a XPixelInfo structure.
458 % o annotate_info: Specifies a pointer to a XAnnotateInfo structure.
460 % o image: the image.
462 % o exception: return any errors or warnings in this structure.
465 MagickPrivate MagickBooleanType XAnnotateImage(Display *display,
466 const XPixelInfo *pixel,XAnnotateInfo *annotate_info,Image *image,
467 ExceptionInfo *exception)
503 Initialize annotated image.
505 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
506 assert(display != (Display *) NULL);
507 assert(pixel != (XPixelInfo *) NULL);
508 assert(annotate_info != (XAnnotateInfo *) NULL);
509 assert(image != (Image *) NULL);
511 Initialize annotated pixmap.
513 root_window=XRootWindow(display,XDefaultScreen(display));
514 depth=(unsigned int) XDefaultDepth(display,XDefaultScreen(display));
515 annotate_pixmap=XCreatePixmap(display,root_window,annotate_info->width,
516 annotate_info->height,depth);
517 if (annotate_pixmap == (Pixmap) NULL)
520 Initialize graphics info.
522 context_values.background=0;
523 context_values.foreground=(size_t) (~0);
524 context_values.font=annotate_info->font_info->fid;
525 annotate_context=XCreateGC(display,root_window,(unsigned long)
526 (GCBackground | GCFont | GCForeground),&context_values);
527 if (annotate_context == (GC) NULL)
532 (void) XDrawImageString(display,annotate_pixmap,annotate_context,0,
533 (int) annotate_info->font_info->ascent,annotate_info->text,
534 (int) strlen(annotate_info->text));
535 (void) XFreeGC(display,annotate_context);
537 Initialize annotated X image.
539 annotate_ximage=XGetImage(display,annotate_pixmap,0,0,annotate_info->width,
540 annotate_info->height,AllPlanes,ZPixmap);
541 if (annotate_ximage == (XImage *) NULL)
543 (void) XFreePixmap(display,annotate_pixmap);
545 Initialize annotated image.
547 annotate_image=AcquireImage((ImageInfo *) NULL,exception);
548 if (annotate_image == (Image *) NULL)
550 annotate_image->columns=annotate_info->width;
551 annotate_image->rows=annotate_info->height;
553 Transfer annotated X image to image.
555 width=(unsigned int) image->columns;
556 height=(unsigned int) image->rows;
559 (void) XParseGeometry(annotate_info->geometry,&x,&y,&width,&height);
560 (void) GetOneVirtualPixelInfo(image,UndefinedVirtualPixelMethod,(ssize_t) x,
561 (ssize_t) y,&annotate_image->background_color,exception);
562 if (annotate_info->stencil == ForegroundStencil)
563 annotate_image->alpha_trait=BlendPixelTrait;
564 annotate_view=AcquireAuthenticCacheView(annotate_image,exception);
565 for (y=0; y < (int) annotate_image->rows; y++)
573 q=GetCacheViewAuthenticPixels(annotate_view,0,(ssize_t) y,
574 annotate_image->columns,1,exception);
575 if (q == (Quantum *) NULL)
577 for (x=0; x < (int) annotate_image->columns; x++)
579 SetPixelAlpha(annotate_image,OpaqueAlpha,q);
580 if (XGetPixel(annotate_ximage,x,y) == 0)
583 Set this pixel to the background color.
585 SetPixelRed(annotate_image,ScaleShortToQuantum(
586 pixel->box_color.red),q);
587 SetPixelGreen(annotate_image,ScaleShortToQuantum(
588 pixel->box_color.green),q);
589 SetPixelBlue(annotate_image,ScaleShortToQuantum(
590 pixel->box_color.blue),q);
591 if ((annotate_info->stencil == ForegroundStencil) ||
592 (annotate_info->stencil == OpaqueStencil))
593 SetPixelAlpha(annotate_image,TransparentAlpha,q);
598 Set this pixel to the pen color.
600 SetPixelRed(annotate_image,ScaleShortToQuantum(
601 pixel->pen_color.red),q);
602 SetPixelGreen(annotate_image,ScaleShortToQuantum(
603 pixel->pen_color.green),q);
604 SetPixelBlue(annotate_image,ScaleShortToQuantum(
605 pixel->pen_color.blue),q);
606 if (annotate_info->stencil == BackgroundStencil)
607 SetPixelAlpha(annotate_image,TransparentAlpha,q);
609 q+=GetPixelChannels(annotate_image);
611 if (SyncCacheViewAuthenticPixels(annotate_view,exception) == MagickFalse)
614 annotate_view=DestroyCacheView(annotate_view);
615 XDestroyImage(annotate_ximage);
617 Determine annotate geometry.
619 (void) XParseGeometry(annotate_info->geometry,&x,&y,&width,&height);
620 if ((width != (unsigned int) annotate_image->columns) ||
621 (height != (unsigned int) annotate_image->rows))
624 image_geometry[MaxTextExtent];
629 (void) FormatLocaleString(image_geometry,MaxTextExtent,"%ux%u",
631 (void) TransformImage(&annotate_image,(char *) NULL,image_geometry,
634 if (annotate_info->degrees != 0.0)
648 rotate_image=RotateImage(annotate_image,annotate_info->degrees,exception);
649 if (rotate_image == (Image *) NULL)
651 annotate_image=DestroyImage(annotate_image);
652 annotate_image=rotate_image;
654 Annotation is relative to the degree of rotation.
656 normalized_degrees=annotate_info->degrees;
657 while (normalized_degrees < -45.0)
658 normalized_degrees+=360.0;
659 for (rotations=0; normalized_degrees > 45.0; rotations++)
660 normalized_degrees-=90.0;
661 switch (rotations % 4)
671 x-=(int) annotate_image->columns/2;
672 y+=(int) annotate_image->columns/2;
680 x=x-(int) annotate_image->columns;
688 x=x-(int) annotate_image->columns/2;
689 y=y-(int) (annotate_image->rows-(annotate_image->columns/2));
695 Composite text onto the image.
697 (void) XParseGeometry(annotate_info->geometry,&x,&y,&width,&height);
698 alpha_trait=image->alpha_trait;
699 (void) CompositeImage(image,annotate_image,
700 annotate_image->alpha_trait == BlendPixelTrait ? OverCompositeOp :
701 CopyCompositeOp,MagickTrue,(ssize_t) x,(ssize_t) y,exception);
702 image->alpha_trait=alpha_trait;
703 annotate_image=DestroyImage(annotate_image);
708 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
712 % X B e s t F o n t %
716 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
718 % XBestFont() returns the "best" font. "Best" is defined as a font specified
719 % in the X resource database or a font such that the text width displayed
720 % with the font does not exceed the specified maximum width.
722 % The format of the XBestFont method is:
724 % XFontStruct *XBestFont(Display *display,
725 % const XResourceInfo *resource_info,const MagickBooleanType text_font)
727 % A description of each parameter follows:
729 % o font: XBestFont returns a pointer to a XFontStruct structure.
731 % o display: Specifies a connection to an X server; returned from
734 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
736 % o text_font: True is font should be mono-spaced (typewriter style).
740 static char **FontToList(char *font)
755 if (font == (char *) NULL)
756 return((char **) NULL);
758 Convert string to an ASCII list.
761 for (p=font; *p != '\0'; p++)
762 if ((*p == ':') || (*p == ';') || (*p == ','))
764 fontlist=(char **) AcquireQuantumMemory((size_t) fonts+1UL,sizeof(*fontlist));
765 if (fontlist == (char **) NULL)
767 ThrowXWindowFatalException(ResourceLimitError,"MemoryAllocationFailed",
769 return((char **) NULL);
772 for (i=0; i < (int) fonts; i++)
774 for (q=p; *q != '\0'; q++)
775 if ((*q == ':') || (*q == ';') || (*q == ','))
777 fontlist[i]=(char *) AcquireQuantumMemory((size_t) (q-p)+1UL,
778 sizeof(*fontlist[i]));
779 if (fontlist[i] == (char *) NULL)
781 ThrowXWindowFatalException(ResourceLimitError,"MemoryAllocationFailed",
783 return((char **) NULL);
785 (void) CopyMagickString(fontlist[i],p,(size_t) (q-p+1));
788 fontlist[i]=(char *) NULL;
792 MagickPrivate XFontStruct *XBestFont(Display *display,
793 const XResourceInfo *resource_info,const MagickBooleanType text_font)
798 "-*-helvetica-medium-r-normal--12-*-*-*-*-*-iso8859-1",
799 "-*-arial-medium-r-normal--12-*-*-*-*-*-iso8859-1",
800 "-*-helvetica-medium-r-normal--12-*-*-*-*-*-iso8859-15",
801 "-*-arial-medium-r-normal--12-*-*-*-*-*-iso8859-15",
802 "-*-helvetica-medium-r-normal--12-*-*-*-*-*-*-*",
803 "-*-arial-medium-r-normal--12-*-*-*-*-*-*-*",
810 "-*-courier-medium-r-normal-*-12-*-*-*-*-*-iso8859-1",
811 "-*-courier-medium-r-normal-*-12-*-*-*-*-*-iso8859-15",
812 "-*-fixed-medium-r-normal-*-12-*-*-*-*-*-*-*",
826 font_info=(XFontStruct *) NULL;
827 font_name=resource_info->font;
828 if (text_font != MagickFalse)
829 font_name=resource_info->text_font;
830 if ((font_name != (char *) NULL) && (*font_name != '\0'))
839 Load preferred font specified in the X resource database.
841 fontlist=FontToList(font_name);
842 if (fontlist != (char **) NULL)
844 for (i=0; fontlist[i] != (char *) NULL; i++)
846 if (font_info == (XFontStruct *) NULL)
847 font_info=XLoadQueryFont(display,fontlist[i]);
848 fontlist[i]=DestroyString(fontlist[i]);
850 fontlist=(char **) RelinquishMagickMemory(fontlist);
852 if (font_info == (XFontStruct *) NULL)
853 ThrowXWindowFatalException(XServerError,"UnableToLoadFont",font_name);
856 Load fonts from list of fonts until one is found.
859 if (text_font != MagickFalse)
861 if (XDisplayHeight(display,XDefaultScreen(display)) >= 748)
863 while (*p != (char *) NULL)
865 if (font_info != (XFontStruct *) NULL)
867 font_info=XLoadQueryFont(display,(char *) *p);
874 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
878 % X B e s t I c o n S i z e %
882 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
884 % XBestIconSize() returns the "best" icon size. "Best" is defined as an icon
885 % size that maintains the aspect ratio of the image. If the window manager
886 % has preferred icon sizes, one of the preferred sizes is used.
888 % The format of the XBestIconSize method is:
890 % void XBestIconSize(Display *display,XWindowInfo *window,Image *image)
892 % A description of each parameter follows:
894 % o display: Specifies a connection to an X server; returned from
897 % o image: the image.
900 MagickPrivate void XBestIconSize(Display *display,XWindowInfo *window,
924 Determine if the window manager has specified preferred icon sizes.
926 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
927 assert(display != (Display *) NULL);
928 assert(window != (XWindowInfo *) NULL);
929 assert(image != (Image *) NULL);
930 window->width=MaxIconSize;
931 window->height=MaxIconSize;
932 icon_size=(XIconSize *) NULL;
934 root_window=XRootWindow(display,window->screen);
935 if (XGetIconSizes(display,root_window,&size_list,&number_sizes) != 0)
936 if ((number_sizes > 0) && (size_list != (XIconSize *) NULL))
938 if (icon_size == (XIconSize *) NULL)
941 Window manager does not restrict icon size.
943 icon_size=XAllocIconSize();
944 if (icon_size == (XIconSize *) NULL)
946 ThrowXWindowFatalException(ResourceLimitError,
947 "MemoryAllocationFailed",image->filename);
950 icon_size->min_width=1;
951 icon_size->max_width=MaxIconSize;
952 icon_size->min_height=1;
953 icon_size->max_height=MaxIconSize;
954 icon_size->width_inc=1;
955 icon_size->height_inc=1;
958 Determine aspect ratio of image.
960 width=(unsigned int) image->columns;
961 height=(unsigned int) image->rows;
963 if (window->crop_geometry)
964 (void) XParseGeometry(window->crop_geometry,&i,&i,&width,&height);
966 Look for an icon size that maintains the aspect ratio of image.
968 scale_factor=(double) icon_size->max_width/width;
969 if (scale_factor > ((double) icon_size->max_height/height))
970 scale_factor=(double) icon_size->max_height/height;
971 icon_width=(unsigned int) icon_size->min_width;
972 while ((int) icon_width < icon_size->max_width)
974 if (icon_width >= (unsigned int) (scale_factor*width+0.5))
976 icon_width+=icon_size->width_inc;
978 icon_height=(unsigned int) icon_size->min_height;
979 while ((int) icon_height < icon_size->max_height)
981 if (icon_height >= (unsigned int) (scale_factor*height+0.5))
983 icon_height+=icon_size->height_inc;
985 (void) XFree((void *) icon_size);
986 window->width=icon_width;
987 window->height=icon_height;
991 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
995 % X B e s t P i x e l %
999 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1001 % XBestPixel() returns a pixel from an array of pixels that is closest to the
1002 % requested color. If the color array is NULL, the colors are obtained from
1005 % The format of the XBestPixel method is:
1007 % void XBestPixel(Display *display,const Colormap colormap,XColor *colors,
1008 % unsigned int number_colors,XColor *color)
1010 % A description of each parameter follows:
1012 % o pixel: XBestPixel returns the pixel value closest to the requested
1015 % o display: Specifies a connection to an X server; returned from
1018 % o colormap: Specifies the ID of the X server colormap.
1020 % o colors: Specifies an array of XColor structures.
1022 % o number_colors: Specifies the number of XColor structures in the
1023 % color definition array.
1025 % o color: Specifies the desired RGB value to find in the colors array.
1028 MagickPrivate void XBestPixel(Display *display,const Colormap colormap,
1029 XColor *colors,unsigned int number_colors,XColor *color)
1051 Find closest representation for the requested RGB color.
1053 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1054 assert(display != (Display *) NULL);
1055 assert(color != (XColor *) NULL);
1056 status=XAllocColor(display,colormap,color);
1057 if (status != False)
1059 query_server=colors == (XColor *) NULL ? MagickTrue : MagickFalse;
1060 if (query_server != MagickFalse)
1063 Read X server colormap.
1065 colors=(XColor *) AcquireQuantumMemory(number_colors,sizeof(*colors));
1066 if (colors == (XColor *) NULL)
1068 ThrowXWindowFatalException(ResourceLimitError,
1069 "MemoryAllocationFailed","...");
1072 for (i=0; i < (int) number_colors; i++)
1073 colors[i].pixel=(size_t) i;
1074 if (number_colors > 256)
1076 (void) XQueryColors(display,colormap,colors,(int) number_colors);
1078 min_distance=3.0*((double) QuantumRange+1.0)*((double)
1081 for (i=0; i < (int) number_colors; i++)
1083 pixel.red=colors[i].red-(double) color->red;
1084 distance=pixel.red*pixel.red;
1085 if (distance > min_distance)
1087 pixel.green=colors[i].green-(double) color->green;
1088 distance+=pixel.green*pixel.green;
1089 if (distance > min_distance)
1091 pixel.blue=colors[i].blue-(double) color->blue;
1092 distance+=pixel.blue*pixel.blue;
1093 if (distance > min_distance)
1095 min_distance=distance;
1096 color->pixel=colors[i].pixel;
1099 (void) XAllocColor(display,colormap,&colors[j]);
1100 if (query_server != MagickFalse)
1101 colors=(XColor *) RelinquishMagickMemory(colors);
1105 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1109 % X B e s t V i s u a l I n f o %
1113 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1115 % XBestVisualInfo() returns visual information for a visual that is the "best"
1116 % the server supports. "Best" is defined as:
1118 % 1. Restrict the visual list to those supported by the default screen.
1120 % 2. If a visual type is specified, restrict the visual list to those of
1123 % 3. If a map type is specified, choose the visual that matches the id
1124 % specified by the Standard Colormap.
1126 % 4 From the list of visuals, choose one that can display the most
1127 % simultaneous colors. If more than one visual can display the same
1128 % number of simultaneous colors, one is chosen based on a rank.
1130 % The format of the XBestVisualInfo method is:
1132 % XVisualInfo *XBestVisualInfo(Display *display,
1133 % XStandardColormap *map_info,XResourceInfo *resource_info)
1135 % A description of each parameter follows:
1137 % o visual_info: XBestVisualInfo returns a pointer to a X11 XVisualInfo
1140 % o display: Specifies a connection to an X server; returned from
1143 % o map_info: If map_type is specified, this structure is initialized
1144 % with info from the Standard Colormap.
1146 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
1150 static inline int MagickMax(const int x,const int y)
1157 static inline size_t MagickMin(const unsigned int x,
1158 const unsigned int y)
1165 MagickPrivate XVisualInfo *XBestVisualInfo(Display *display,
1166 XStandardColormap *map_info,XResourceInfo *resource_info)
1168 #define MaxStandardColormaps 7
1169 #define XVisualColormapSize(visual_info) MagickMin((unsigned int) (\
1170 (visual_info->klass == TrueColor) || (visual_info->klass == DirectColor) ? \
1171 visual_info->red_mask | visual_info->green_mask | visual_info->blue_mask : \
1172 (unsigned int) visual_info->colormap_size),1U << visual_info->depth)
1198 Restrict visual search by screen number.
1200 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1201 assert(display != (Display *) NULL);
1202 assert(map_info != (XStandardColormap *) NULL);
1203 assert(resource_info != (XResourceInfo *) NULL);
1204 map_type=resource_info->map_type;
1205 visual_type=resource_info->visual_type;
1206 visual_mask=VisualScreenMask;
1207 visual_template.screen=XDefaultScreen(display);
1208 visual_template.depth=XDefaultDepth(display,XDefaultScreen(display));
1210 if ((resource_info->immutable != MagickFalse) && (resource_info->colors != 0))
1211 if (resource_info->colors <= (one << (size_t) visual_template.depth))
1212 visual_mask|=VisualDepthMask;
1213 if (visual_type != (char *) NULL)
1216 Restrict visual search by class or visual id.
1218 if (LocaleCompare("staticgray",visual_type) == 0)
1220 visual_mask|=VisualClassMask;
1221 visual_template.klass=StaticGray;
1224 if (LocaleCompare("grayscale",visual_type) == 0)
1226 visual_mask|=VisualClassMask;
1227 visual_template.klass=GrayScale;
1230 if (LocaleCompare("staticcolor",visual_type) == 0)
1232 visual_mask|=VisualClassMask;
1233 visual_template.klass=StaticColor;
1236 if (LocaleCompare("pseudocolor",visual_type) == 0)
1238 visual_mask|=VisualClassMask;
1239 visual_template.klass=PseudoColor;
1242 if (LocaleCompare("truecolor",visual_type) == 0)
1244 visual_mask|=VisualClassMask;
1245 visual_template.klass=TrueColor;
1248 if (LocaleCompare("directcolor",visual_type) == 0)
1250 visual_mask|=VisualClassMask;
1251 visual_template.klass=DirectColor;
1254 if (LocaleCompare("default",visual_type) == 0)
1256 visual_mask|=VisualIDMask;
1257 visual_template.visualid=XVisualIDFromVisual(
1258 XDefaultVisual(display,XDefaultScreen(display)));
1261 if (isdigit((int) ((unsigned char) *visual_type)) != 0)
1263 visual_mask|=VisualIDMask;
1264 visual_template.visualid=
1265 strtol(visual_type,(char **) NULL,0);
1268 ThrowXWindowFatalException(XServerError,
1269 "UnrecognizedVisualSpecifier",visual_type);
1272 Get all visuals that meet our criteria so far.
1275 visual_list=XGetVisualInfo(display,visual_mask,&visual_template,
1277 visual_mask=VisualScreenMask | VisualIDMask;
1278 if ((number_visuals == 0) || (visual_list == (XVisualInfo *) NULL))
1281 Failed to get visual; try using the default visual.
1283 ThrowXWindowFatalException(XServerWarning,"UnableToGetVisual",
1285 visual_template.visualid=XVisualIDFromVisual(XDefaultVisual(display,
1286 XDefaultScreen(display)));
1287 visual_list=XGetVisualInfo(display,visual_mask,&visual_template,
1289 if ((number_visuals == 0) || (visual_list == (XVisualInfo *) NULL))
1290 return((XVisualInfo *) NULL);
1291 ThrowXWindowFatalException(XServerWarning,"UsingDefaultVisual",
1292 XVisualClassName(visual_list->klass));
1294 resource_info->color_recovery=MagickFalse;
1295 if ((map_info != (XStandardColormap *) NULL) && (map_type != (char *) NULL))
1301 map_name[MaxTextExtent];
1317 Choose a visual associated with a standard colormap.
1319 root_window=XRootWindow(display,XDefaultScreen(display));
1321 if (LocaleCompare(map_type,"list") != 0)
1324 User specified Standard Colormap.
1326 (void) FormatLocaleString((char *) map_name,MaxTextExtent,
1327 "RGB_%s_MAP",map_type);
1328 LocaleUpper(map_name);
1329 map_property=XInternAtom(display,(char *) map_name,MagickTrue);
1330 if (map_property != (Atom) NULL)
1331 status=XGetRGBColormaps(display,root_window,&map_list,&number_maps,
1337 *colormap[MaxStandardColormaps]=
1339 "_HP_RGB_SMOOTH_MAP_LIST",
1349 Choose a standard colormap from a list.
1351 for (i=0; i < MaxStandardColormaps; i++)
1353 map_property=XInternAtom(display,(char *) colormap[i],MagickTrue);
1354 if (map_property == (Atom) NULL)
1356 status=XGetRGBColormaps(display,root_window,&map_list,&number_maps,
1358 if (status != False)
1361 resource_info->color_recovery=i == 0 ? MagickTrue : MagickFalse;
1363 if (status == False)
1365 ThrowXWindowFatalException(XServerError,"UnableToGetStandardColormap",
1367 return((XVisualInfo *) NULL);
1370 Search all Standard Colormaps and visuals for ids that match.
1372 *map_info=map_list[0];
1373 #if !defined(PRE_R4_ICCCM)
1374 visual_template.visualid=XVisualIDFromVisual(visual_list[0].visual);
1375 for (i=0; i < number_maps; i++)
1376 for (j=0; j < number_visuals; j++)
1377 if (map_list[i].visualid ==
1378 XVisualIDFromVisual(visual_list[j].visual))
1380 *map_info=map_list[i];
1381 visual_template.visualid=XVisualIDFromVisual(
1382 visual_list[j].visual);
1385 if (map_info->visualid != visual_template.visualid)
1387 ThrowXWindowFatalException(XServerError,
1388 "UnableToMatchVisualToStandardColormap",map_type);
1389 return((XVisualInfo *) NULL);
1392 if (map_info->colormap == (Colormap) NULL)
1394 ThrowXWindowFatalException(XServerError,
1395 "StandardColormapIsNotInitialized",map_type);
1396 return((XVisualInfo *) NULL);
1398 (void) XFree((void *) map_list);
1402 static const unsigned int
1417 Pick one visual that displays the most simultaneous colors.
1419 visual_info=visual_list;
1421 for (i=1; i < number_visuals; i++)
1424 if (XVisualColormapSize(p) > XVisualColormapSize(visual_info))
1427 if (XVisualColormapSize(p) == XVisualColormapSize(visual_info))
1428 if (rank[p->klass] > rank[visual_info->klass])
1431 visual_template.visualid=XVisualIDFromVisual(visual_info->visual);
1433 (void) XFree((void *) visual_list);
1435 Retrieve only one visual by its screen & id number.
1437 visual_info=XGetVisualInfo(display,visual_mask,&visual_template,
1439 if ((number_visuals == 0) || (visual_info == (XVisualInfo *) NULL))
1440 return((XVisualInfo *) NULL);
1441 return(visual_info);
1445 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1449 % X C h e c k D e f i n e C u r s o r %
1453 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1455 % XCheckDefineCursor() prevents cursor changes on the root window.
1457 % The format of the XXCheckDefineCursor method is:
1459 % XCheckDefineCursor(display,window,cursor)
1461 % A description of each parameter follows:
1463 % o display: Specifies a connection to an X server; returned from
1466 % o window: the window.
1468 % o cursor: the cursor.
1471 MagickPrivate int XCheckDefineCursor(Display *display,Window window,
1474 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1475 assert(display != (Display *) NULL);
1476 if (window == XRootWindow(display,XDefaultScreen(display)))
1478 return(XDefineCursor(display,window,cursor));
1482 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1486 % X C h e c k R e f r e s h W i n d o w s %
1490 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1492 % XCheckRefreshWindows() checks the X server for exposure events for a
1493 % particular window and updates the areassociated with the exposure event.
1495 % The format of the XCheckRefreshWindows method is:
1497 % void XCheckRefreshWindows(Display *display,XWindows *windows)
1499 % A description of each parameter follows:
1501 % o display: Specifies a connection to an X server; returned from
1504 % o windows: Specifies a pointer to a XWindows structure.
1507 MagickPrivate void XCheckRefreshWindows(Display *display,XWindows *windows)
1515 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1516 assert(display != (Display *) NULL);
1517 assert(windows != (XWindows *) NULL);
1518 XDelay(display,SuspendTime);
1519 id=windows->command.id;
1520 while (XCheckTypedWindowEvent(display,id,Expose,&event) != MagickFalse)
1521 (void) XCommandWidget(display,windows,(char const **) NULL,&event);
1522 id=windows->image.id;
1523 while (XCheckTypedWindowEvent(display,id,Expose,&event) != MagickFalse)
1524 XRefreshWindow(display,&windows->image,&event);
1525 XDelay(display,SuspendTime << 1);
1526 id=windows->command.id;
1527 while (XCheckTypedWindowEvent(display,id,Expose,&event) != MagickFalse)
1528 (void) XCommandWidget(display,windows,(char const **) NULL,&event);
1529 id=windows->image.id;
1530 while (XCheckTypedWindowEvent(display,id,Expose,&event) != MagickFalse)
1531 XRefreshWindow(display,&windows->image,&event);
1535 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1539 % X C l i e n t M e s s a g e %
1543 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1545 % XClientMessage() sends a reason to a window with XSendEvent. The reason is
1546 % initialized with a particular protocol type and atom.
1548 % The format of the XClientMessage function is:
1550 % XClientMessage(display,window,protocol,reason,timestamp)
1552 % A description of each parameter follows:
1554 % o display: Specifies a pointer to the Display structure; returned from
1557 % o window: Specifies a pointer to a Window structure.
1559 % o protocol: Specifies an atom value.
1561 % o reason: Specifies an atom value which is the reason to send.
1563 % o timestamp: Specifies a value of type Time.
1566 MagickPrivate void XClientMessage(Display *display,const Window window,
1567 const Atom protocol,const Atom reason,const Time timestamp)
1572 assert(display != (Display *) NULL);
1573 client_event.type=ClientMessage;
1574 client_event.window=window;
1575 client_event.message_type=protocol;
1576 client_event.format=32;
1577 client_event.data.l[0]=(long) reason;
1578 client_event.data.l[1]=(long) timestamp;
1579 (void) XSendEvent(display,window,MagickFalse,NoEventMask,(XEvent *) &client_event);
1583 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1587 + X C l i e n t W i n d o w %
1591 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1593 % XClientWindow() finds a window, at or below the specified window, which has
1594 % a WM_STATE property. If such a window is found, it is returned, otherwise
1595 % the argument window is returned.
1597 % The format of the XClientWindow function is:
1599 % client_window=XClientWindow(display,target_window)
1601 % A description of each parameter follows:
1603 % o client_window: XClientWindow returns a window, at or below the specified
1604 % window, which has a WM_STATE property otherwise the argument
1605 % target_window is returned.
1607 % o display: Specifies a pointer to the Display structure; returned from
1610 % o target_window: Specifies the window to find a WM_STATE property.
1613 static Window XClientWindow(Display *display,Window target_window)
1635 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1636 assert(display != (Display *) NULL);
1637 state=XInternAtom(display,"WM_STATE",MagickTrue);
1638 if (state == (Atom) NULL)
1639 return(target_window);
1641 status=XGetWindowProperty(display,target_window,state,0L,0L,MagickFalse,
1642 (Atom) AnyPropertyType,&type,&format,&number_items,&after,&data);
1643 if ((status == Success) && (type != (Atom) NULL))
1644 return(target_window);
1645 client_window=XWindowByProperty(display,target_window,state);
1646 if (client_window == (Window) NULL)
1647 return(target_window);
1648 return(client_window);
1652 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1656 + X C o m p o n e n t T e r m i n u s %
1660 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1662 % XComponentTerminus() destroys the module component.
1664 % The format of the XComponentTerminus method is:
1666 % XComponentTerminus(void)
1669 MagickPrivate void XComponentTerminus(void)
1671 DestroyXResources();
1675 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1679 % X C o n f i g u r e I m a g e C o l o r m a p %
1683 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1685 % XConfigureImageColormap() creates a new X colormap.
1687 % The format of the XConfigureImageColormap method is:
1689 % void XConfigureImageColormap(Display *display,
1690 % XResourceInfo *resource_info,XWindows *windows,Image *image,
1691 % ExceptionInfo *exception)
1693 % A description of each parameter follows:
1695 % o display: Specifies a connection to an X server; returned from
1698 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
1700 % o windows: Specifies a pointer to a XWindows structure.
1702 % o image: the image.
1704 % o exception: return any errors or warnings in this structure.
1707 MagickPrivate void XConfigureImageColormap(Display *display,
1708 XResourceInfo *resource_info,XWindows *windows,Image *image,
1709 ExceptionInfo *exception)
1715 Make standard colormap.
1717 XSetCursorState(display,windows,MagickTrue);
1718 XCheckRefreshWindows(display,windows);
1719 XMakeStandardColormap(display,windows->visual_info,resource_info,image,
1720 windows->map_info,windows->pixel_info,exception);
1721 colormap=windows->map_info->colormap;
1722 (void) XSetWindowColormap(display,windows->image.id,colormap);
1723 (void) XSetWindowColormap(display,windows->command.id,colormap);
1724 (void) XSetWindowColormap(display,windows->widget.id,colormap);
1725 if (windows->magnify.mapped != MagickFalse)
1726 (void) XSetWindowColormap(display,windows->magnify.id,colormap);
1727 if (windows->pan.mapped != MagickFalse)
1728 (void) XSetWindowColormap(display,windows->pan.id,colormap);
1729 XSetCursorState(display,windows,MagickFalse);
1730 XClientMessage(display,windows->image.id,windows->im_protocols,
1731 windows->im_update_colormap,CurrentTime);
1735 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1739 % X C o n s t r a i n W i n d o w P o s i t i o n %
1743 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1745 % XConstrainWindowPosition() assures a window is positioned within the X
1746 % server boundaries.
1748 % The format of the XConstrainWindowPosition method is:
1750 % void XConstrainWindowPosition(Display *display,XWindowInfo *window_info)
1752 % A description of each parameter follows:
1754 % o display: Specifies a pointer to the Display structure; returned from
1757 % o window_info: Specifies a pointer to a XWindowInfo structure.
1760 MagickPrivate void XConstrainWindowPosition(Display *display,
1761 XWindowInfo *window_info)
1766 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1767 assert(display != (Display *) NULL);
1768 assert(window_info != (XWindowInfo *) NULL);
1769 limit=XDisplayWidth(display,window_info->screen)-window_info->width;
1770 if (window_info->x < 0)
1773 if (window_info->x > (int) limit)
1774 window_info->x=(int) limit;
1775 limit=XDisplayHeight(display,window_info->screen)-window_info->height;
1776 if (window_info->y < 0)
1779 if (window_info->y > limit)
1780 window_info->y=limit;
1784 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1792 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1794 % XDelay() suspends program execution for the number of milliseconds
1797 % The format of the Delay method is:
1799 % void XDelay(Display *display,const size_t milliseconds)
1801 % A description of each parameter follows:
1803 % o display: Specifies a pointer to the Display structure; returned from
1806 % o milliseconds: Specifies the number of milliseconds to delay before
1810 MagickPrivate void XDelay(Display *display,const size_t milliseconds)
1812 assert(display != (Display *) NULL);
1813 (void) XFlush(display);
1814 MagickDelay(milliseconds);
1818 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1822 % X D e s t r o y R e s o u r c e I n f o %
1826 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1828 % XDestroyResourceInfo() frees memory associated with the XResourceInfo
1831 % The format of the XDestroyResourceInfo method is:
1833 % void XDestroyResourceInfo(XResourceInfo *resource_info)
1835 % A description of each parameter follows:
1837 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
1840 MagickExport void XDestroyResourceInfo(XResourceInfo *resource_info)
1842 if (resource_info->image_geometry != (char *) NULL)
1843 resource_info->image_geometry=(char *)
1844 RelinquishMagickMemory(resource_info->image_geometry);
1845 if (resource_info->quantize_info != (QuantizeInfo *) NULL)
1846 resource_info->quantize_info=DestroyQuantizeInfo(
1847 resource_info->quantize_info);
1848 if (resource_info->client_name != (char *) NULL)
1849 resource_info->client_name=(char *)
1850 RelinquishMagickMemory(resource_info->client_name);
1851 if (resource_info->name != (char *) NULL)
1852 resource_info->name=DestroyString(resource_info->name);
1853 (void) ResetMagickMemory(resource_info,0,sizeof(*resource_info));
1857 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1861 % X D e s t r o y W i n d o w C o l o r s %
1865 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1867 % XDestroyWindowColors() frees X11 color resources previously saved on a
1868 % window by XRetainWindowColors or programs like xsetroot.
1870 % The format of the XDestroyWindowColors method is:
1872 % void XDestroyWindowColors(Display *display,Window window)
1874 % A description of each parameter follows:
1876 % o display: Specifies a connection to an X server; returned from
1879 % o window: Specifies a pointer to a Window structure.
1882 MagickPrivate void XDestroyWindowColors(Display *display,Window window)
1902 If there are previous resources on the root window, destroy them.
1904 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1905 assert(display != (Display *) NULL);
1906 property=XInternAtom(display,"_XSETROOT_ID",MagickFalse);
1907 if (property == (Atom) NULL)
1909 ThrowXWindowFatalException(XServerError,"UnableToCreateProperty",
1913 status=XGetWindowProperty(display,window,property,0L,1L,MagickTrue,
1914 (Atom) AnyPropertyType,&type,&format,&length,&after,&data);
1915 if (status != Success)
1917 if ((type == XA_PIXMAP) && (format == 32) && (length == 1) && (after == 0))
1919 (void) XKillClient(display,(XID) (*((Pixmap *) data)));
1920 (void) XDeleteProperty(display,window,property);
1923 (void) XFree((void *) data);
1927 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1931 % X D i s p l a y I m a g e I n f o %
1935 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1937 % XDisplayImageInfo() displays information about an X image.
1939 % The format of the XDisplayImageInfo method is:
1941 % void XDisplayImageInfo(Display *display,
1942 % const XResourceInfo *resource_info,XWindows *windows,Image *undo_image,
1943 % Image *image,ExceptionInfo *exception)
1945 % A description of each parameter follows:
1947 % o display: Specifies a connection to an X server; returned from
1950 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
1952 % o windows: Specifies a pointer to a XWindows structure.
1954 % o undo_image: the undo image.
1956 % o image: the image.
1958 % o exception: return any errors or warnings in this structure.
1961 MagickPrivate void XDisplayImageInfo(Display *display,
1962 const XResourceInfo *resource_info,XWindows *windows,Image *undo_image,
1963 Image *image,ExceptionInfo *exception)
1966 filename[MaxTextExtent],
1989 Write info about the X server to a file.
1991 assert(display != (Display *) NULL);
1992 assert(resource_info != (XResourceInfo *) NULL);
1993 assert(windows != (XWindows *) NULL);
1994 assert(image != (Image *) NULL);
1996 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
1998 unique_file=AcquireUniqueFileResource(filename);
1999 if (unique_file != -1)
2000 file=fdopen(unique_file,"w");
2001 if ((unique_file == -1) || (file == (FILE *) NULL))
2003 XNoticeWidget(display,windows,"Unable to display image info",filename);
2006 if (resource_info->gamma_correct != MagickFalse)
2007 if (resource_info->display_gamma != (char *) NULL)
2008 (void) FormatLocaleFile(file,"Display\n gamma: %s\n\n",
2009 resource_info->display_gamma);
2011 Write info about the X image to a file.
2013 (void) FormatLocaleFile(file,"X\n visual: %s\n",
2014 XVisualClassName((int) windows->image.storage_class));
2015 (void) FormatLocaleFile(file," depth: %d\n",windows->image.ximage->depth);
2016 if (windows->visual_info->colormap_size != 0)
2017 (void) FormatLocaleFile(file," colormap size: %d\n",
2018 windows->visual_info->colormap_size);
2019 if (resource_info->colormap== SharedColormap)
2020 (void) FormatLocaleFile(file," colormap type: Shared\n");
2022 (void) FormatLocaleFile(file," colormap type: Private\n");
2023 (void) FormatLocaleFile(file," geometry: %dx%d\n",
2024 windows->image.ximage->width,windows->image.ximage->height);
2025 if (windows->image.crop_geometry != (char *) NULL)
2026 (void) FormatLocaleFile(file," crop geometry: %s\n",
2027 windows->image.crop_geometry);
2028 if (windows->image.pixmap == (Pixmap) NULL)
2029 (void) FormatLocaleFile(file," type: X Image\n");
2031 (void) FormatLocaleFile(file," type: Pixmap\n");
2032 if (windows->image.shape != MagickFalse)
2033 (void) FormatLocaleFile(file," non-rectangular shape: True\n");
2035 (void) FormatLocaleFile(file," non-rectangular shape: False\n");
2036 if (windows->image.shared_memory != MagickFalse)
2037 (void) FormatLocaleFile(file," shared memory: True\n");
2039 (void) FormatLocaleFile(file," shared memory: False\n");
2040 (void) FormatLocaleFile(file,"\n");
2041 if (resource_info->font != (char *) NULL)
2042 (void) FormatLocaleFile(file,"Font: %s\n\n",resource_info->font);
2043 if (resource_info->text_font != (char *) NULL)
2044 (void) FormatLocaleFile(file,"Text font: %s\n\n",resource_info->text_font);
2046 Write info about the undo cache to a file.
2049 for (levels=0; undo_image != (Image *) NULL; levels++)
2051 number_pixels=undo_image->list->columns*undo_image->list->rows;
2052 bytes+=number_pixels*sizeof(PixelInfo);
2053 undo_image=GetPreviousImageInList(undo_image);
2055 (void) FormatLocaleFile(file,"Undo Edit Cache\n levels: %u\n",levels);
2056 (void) FormatLocaleFile(file," bytes: %.20gmb\n",(double)
2057 ((bytes+(1 << 19)) >> 20));
2058 (void) FormatLocaleFile(file," limit: %.20gmb\n\n",(double)
2059 resource_info->undo_cache);
2061 Write info about the image to a file.
2063 (void) IdentifyImage(image,file,MagickTrue,exception);
2064 (void) fclose(file);
2065 text=FileToString(filename,~0,exception);
2066 (void) RelinquishUniqueFileResource(filename);
2067 if (text == (char *) NULL)
2069 XNoticeWidget(display,windows,"MemoryAllocationFailed",
2070 "UnableToDisplayImageInfo");
2073 textlist=StringToList(text);
2074 if (textlist != (char **) NULL)
2077 title[MaxTextExtent];
2080 Display information about the image in the Text View widget.
2082 (void) XWithdrawWindow(display,windows->info.id,windows->info.screen);
2083 (void) FormatLocaleString(title,MaxTextExtent,"Image Info: %s",
2085 XTextViewWidget(display,resource_info,windows,MagickTrue,title,
2086 (char const **) textlist);
2087 for (i=0; textlist[i] != (char *) NULL; i++)
2088 textlist[i]=DestroyString(textlist[i]);
2089 textlist=(char **) RelinquishMagickMemory(textlist);
2091 text=DestroyString(text);
2095 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2099 + X D i t h e r I m a g e %
2103 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2105 % XDitherImage() dithers the reference image as required by the HP Color
2106 % Recovery algorithm. The color values are quantized to 3 bits of red and
2107 % green, and 2 bits of blue (3/3/2) and can be used as indices into a 8-bit X
2108 % standard colormap.
2110 % The format of the XDitherImage method is:
2112 % void XDitherImage(Image *image,XImage *ximage,ExceptionInfo *exception)
2114 % A description of each parameter follows:
2116 % o image: the image.
2118 % o ximage: Specifies a pointer to a XImage structure; returned from
2121 % o exception: return any errors or warnings in this structure.
2124 static void XDitherImage(Image *image,XImage *ximage,ExceptionInfo *exception)
2126 static const short int
2129 {-16, 4, -1, 11,-14, 6, -3, 9,-15, 5, -2, 10,-13, 7, -4, 8},
2130 { 15, -5, 0,-12, 13, -7, 2,-10, 14, -6, 1,-11, 12, -8, 3, -9}
2132 dither_green[2][16]=
2134 { 11,-15, 7, -3, 8,-14, 4, -2, 10,-16, 6, -4, 9,-13, 5, -1},
2135 {-12, 14, -8, 2, -9, 13, -5, 1,-11, 15, -7, 3,-10, 12, -6, 0}
2139 { -3, 9,-13, 7, -1, 11,-15, 5, -4, 8,-14, 6, -2, 10,-16, 4},
2140 { 2,-10, 12, -8, 0,-12, 14, -6, 3, -9, 13, -7, 1,-11, 15, -5}
2156 register const Quantum
2176 Allocate and initialize dither maps.
2178 for (i=0; i < 2; i++)
2179 for (j=0; j < 16; j++)
2181 red_map[i][j]=(unsigned char *) AcquireQuantumMemory(256UL,
2183 green_map[i][j]=(unsigned char *) AcquireQuantumMemory(256UL,
2184 sizeof(*green_map));
2185 blue_map[i][j]=(unsigned char *) AcquireQuantumMemory(256UL,
2187 if ((red_map[i][j] == (unsigned char *) NULL) ||
2188 (green_map[i][j] == (unsigned char *) NULL) ||
2189 (blue_map[i][j] == (unsigned char *) NULL))
2191 ThrowXWindowFatalException(ResourceLimitError,
2192 "MemoryAllocationFailed",image->filename);
2197 Initialize dither tables.
2199 for (i=0; i < 2; i++)
2200 for (j=0; j < 16; j++)
2201 for (x=0; x < 256; x++)
2206 value+=dither_red[i][j];
2207 red_map[i][j][x]=(unsigned char)
2208 ((value < 0) ? 0 : (value > 255) ? 255 : value);
2212 value+=dither_green[i][j];
2213 green_map[i][j][x]=(unsigned char)
2214 ((value < 0) ? 0 : (value > 255) ? 255 : value);
2218 value+=((size_t) dither_blue[i][j] << 1);
2219 blue_map[i][j][x]=(unsigned char)
2220 ((value < 0) ? 0 : (value > 255) ? 255 : value);
2225 scanline_pad=(unsigned int) (ximage->bytes_per_line-
2226 ((size_t) (ximage->width*ximage->bits_per_pixel) >> 3));
2230 image_view=AcquireVirtualCacheView(image,exception);
2231 for (y=0; y < (int) image->rows; y++)
2233 p=GetCacheViewVirtualPixels(image_view,0,(ssize_t) y,image->columns,1,
2235 if (p == (const Quantum *) NULL)
2237 for (x=0; x < (int) image->columns; x++)
2239 color.red=(double) ClampToQuantum((double) (red_map[i][j][
2240 (int) ScaleQuantumToChar(GetPixelRed(image,p))] << 8));
2241 color.green=(double) ClampToQuantum((double) (green_map[i][j][
2242 (int) ScaleQuantumToChar(GetPixelGreen(image,p))] << 8));
2243 color.blue=(double) ClampToQuantum((double) (blue_map[i][j][
2244 (int) ScaleQuantumToChar(GetPixelBlue(image,p))] << 8));
2245 pixel=(size_t) (((size_t) color.red & 0xe0) |
2246 (((size_t) color.green & 0xe0) >> 3) |
2247 (((size_t) color.blue & 0xc0) >> 6));
2249 p+=GetPixelChannels(image);
2259 image_view=DestroyCacheView(image_view);
2261 Free allocated memory.
2263 for (i=0; i < 2; i++)
2264 for (j=0; j < 16; j++)
2266 green_map[i][j]=(unsigned char *) RelinquishMagickMemory(green_map[i][j]);
2267 blue_map[i][j]=(unsigned char *) RelinquishMagickMemory(blue_map[i][j]);
2268 red_map[i][j]=(unsigned char *) RelinquishMagickMemory(red_map[i][j]);
2273 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2277 % X D r a w I m a g e %
2281 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2283 % XDrawImage() draws a line on the image.
2285 % The format of the XDrawImage method is:
2287 % MagickBooleanType XDrawImage(Display *display,const XPixelInfo *pixel,
2288 % XDrawInfo *draw_info,Image *image,ExceptionInfo *exception)
2290 % A description of each parameter follows:
2292 % o display: Specifies a connection to an X server; returned from
2295 % o pixel: Specifies a pointer to a XPixelInfo structure.
2297 % o draw_info: Specifies a pointer to a XDrawInfo structure.
2299 % o image: the image.
2301 % o exception: return any errors or warnings in this structure.
2304 MagickPrivate MagickBooleanType XDrawImage(Display *display,
2305 const XPixelInfo *pixel,XDrawInfo *draw_info,Image *image,
2306 ExceptionInfo *exception)
2342 Initialize drawd image.
2344 assert(display != (Display *) NULL);
2345 assert(pixel != (XPixelInfo *) NULL);
2346 assert(draw_info != (XDrawInfo *) NULL);
2347 assert(image != (Image *) NULL);
2348 if (image->debug != MagickFalse)
2349 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
2351 Initialize drawd pixmap.
2353 root_window=XRootWindow(display,XDefaultScreen(display));
2354 depth=(unsigned int) XDefaultDepth(display,XDefaultScreen(display));
2355 draw_pixmap=XCreatePixmap(display,root_window,draw_info->width,
2356 draw_info->height,depth);
2357 if (draw_pixmap == (Pixmap) NULL)
2358 return(MagickFalse);
2360 Initialize graphics info.
2362 context_values.background=(size_t) (~0);
2363 context_values.foreground=0;
2364 context_values.line_width=(int) draw_info->line_width;
2365 draw_context=XCreateGC(display,root_window,(size_t)
2366 (GCBackground | GCForeground | GCLineWidth),&context_values);
2367 if (draw_context == (GC) NULL)
2368 return(MagickFalse);
2372 (void) XFillRectangle(display,draw_pixmap,draw_context,0,0,draw_info->width,
2375 Draw line to pixmap.
2377 (void) XSetBackground(display,draw_context,0);
2378 (void) XSetForeground(display,draw_context,(size_t) (~0));
2379 if (draw_info->stipple != (Pixmap) NULL)
2381 (void) XSetFillStyle(display,draw_context,FillOpaqueStippled);
2382 (void) XSetStipple(display,draw_context,draw_info->stipple);
2384 switch (draw_info->element)
2389 (void) XDrawLines(display,draw_pixmap,draw_context,
2390 draw_info->coordinate_info,(int) draw_info->number_coordinates,
2396 (void) XDrawLine(display,draw_pixmap,draw_context,draw_info->line_info.x1,
2397 draw_info->line_info.y1,draw_info->line_info.x2,
2398 draw_info->line_info.y2);
2401 case RectangleElement:
2403 (void) XDrawRectangle(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);
2409 case FillRectangleElement:
2411 (void) XFillRectangle(display,draw_pixmap,draw_context,
2412 (int) draw_info->rectangle_info.x,(int) draw_info->rectangle_info.y,
2413 (unsigned int) draw_info->rectangle_info.width,
2414 (unsigned int) draw_info->rectangle_info.height);
2418 case EllipseElement:
2420 (void) XDrawArc(display,draw_pixmap,draw_context,
2421 (int) draw_info->rectangle_info.x,(int) draw_info->rectangle_info.y,
2422 (unsigned int) draw_info->rectangle_info.width,
2423 (unsigned int) draw_info->rectangle_info.height,0,360*64);
2426 case FillCircleElement:
2427 case FillEllipseElement:
2429 (void) XFillArc(display,draw_pixmap,draw_context,
2430 (int) draw_info->rectangle_info.x,(int) draw_info->rectangle_info.y,
2431 (unsigned int) draw_info->rectangle_info.width,
2432 (unsigned int) draw_info->rectangle_info.height,0,360*64);
2435 case PolygonElement:
2440 coordinate_info=draw_info->coordinate_info;
2441 (void) XDrawLines(display,draw_pixmap,draw_context,coordinate_info,
2442 (int) draw_info->number_coordinates,CoordModeOrigin);
2443 (void) XDrawLine(display,draw_pixmap,draw_context,
2444 coordinate_info[draw_info->number_coordinates-1].x,
2445 coordinate_info[draw_info->number_coordinates-1].y,
2446 coordinate_info[0].x,coordinate_info[0].y);
2449 case FillPolygonElement:
2451 (void) XFillPolygon(display,draw_pixmap,draw_context,
2452 draw_info->coordinate_info,(int) draw_info->number_coordinates,Complex,
2457 (void) XFreeGC(display,draw_context);
2461 draw_ximage=XGetImage(display,draw_pixmap,0,0,draw_info->width,
2462 draw_info->height,AllPlanes,ZPixmap);
2463 if (draw_ximage == (XImage *) NULL)
2464 return(MagickFalse);
2465 (void) XFreePixmap(display,draw_pixmap);
2467 Initialize draw image.
2469 draw_image=AcquireImage((ImageInfo *) NULL,exception);
2470 if (draw_image == (Image *) NULL)
2471 return(MagickFalse);
2472 draw_image->columns=draw_info->width;
2473 draw_image->rows=draw_info->height;
2475 Transfer drawn X image to image.
2477 width=(unsigned int) image->columns;
2478 height=(unsigned int) image->rows;
2481 (void) XParseGeometry(draw_info->geometry,&x,&y,&width,&height);
2482 (void) GetOneVirtualPixelInfo(image,UndefinedVirtualPixelMethod,(ssize_t) x,
2483 (ssize_t) y,&draw_image->background_color,exception);
2484 if (SetImageStorageClass(draw_image,DirectClass,exception) == MagickFalse)
2485 return(MagickFalse);
2486 draw_image->alpha_trait=BlendPixelTrait;
2487 draw_view=AcquireAuthenticCacheView(draw_image,exception);
2488 for (y=0; y < (int) draw_image->rows; y++)
2496 q=QueueCacheViewAuthenticPixels(draw_view,0,(ssize_t) y,draw_image->columns,
2498 if (q == (Quantum *) NULL)
2500 for (x=0; x < (int) draw_image->columns; x++)
2502 if (XGetPixel(draw_ximage,x,y) == 0)
2505 Set this pixel to the background color.
2507 SetPixelInfoPixel(draw_image,&draw_image->background_color,q);
2508 SetPixelAlpha(draw_image,(Quantum) (draw_info->stencil ==
2509 OpaqueStencil ? TransparentAlpha : OpaqueAlpha),q);
2514 Set this pixel to the pen color.
2516 SetPixelRed(draw_image,ScaleShortToQuantum(
2517 pixel->pen_color.red),q);
2518 SetPixelGreen(draw_image,ScaleShortToQuantum(
2519 pixel->pen_color.green),q);
2520 SetPixelBlue(draw_image,ScaleShortToQuantum(
2521 pixel->pen_color.blue),q);
2522 SetPixelAlpha(draw_image,(Quantum) (draw_info->stencil ==
2523 OpaqueStencil ? OpaqueAlpha : TransparentAlpha),q);
2525 q+=GetPixelChannels(draw_image);
2527 if (SyncCacheViewAuthenticPixels(draw_view,exception) == MagickFalse)
2530 draw_view=DestroyCacheView(draw_view);
2531 XDestroyImage(draw_ximage);
2533 Determine draw geometry.
2535 (void) XParseGeometry(draw_info->geometry,&x,&y,&width,&height);
2536 if ((width != (unsigned int) draw_image->columns) ||
2537 (height != (unsigned int) draw_image->rows))
2540 image_geometry[MaxTextExtent];
2545 (void) FormatLocaleString(image_geometry,MaxTextExtent,"%ux%u",
2547 (void) TransformImage(&draw_image,(char *) NULL,image_geometry,
2550 if (draw_info->degrees != 0.0)
2564 rotate_image=RotateImage(draw_image,draw_info->degrees,exception);
2565 if (rotate_image == (Image *) NULL)
2566 return(MagickFalse);
2567 draw_image=DestroyImage(draw_image);
2568 draw_image=rotate_image;
2570 Annotation is relative to the degree of rotation.
2572 normalized_degrees=draw_info->degrees;
2573 while (normalized_degrees < -45.0)
2574 normalized_degrees+=360.0;
2575 for (rotations=0; normalized_degrees > 45.0; rotations++)
2576 normalized_degrees-=90.0;
2577 switch (rotations % 4)
2587 x=x-(int) draw_image->columns/2;
2588 y=y+(int) draw_image->columns/2;
2596 x=x-(int) draw_image->columns;
2604 x=x-(int) draw_image->columns/2;
2605 y=y-(int) (draw_image->rows-(draw_image->columns/2));
2611 Composite text onto the image.
2613 draw_view=AcquireAuthenticCacheView(draw_image,exception);
2614 for (y=0; y < (int) draw_image->rows; y++)
2622 q=GetCacheViewAuthenticPixels(draw_view,0,(ssize_t) y,draw_image->columns,1,
2624 if (q == (Quantum *) NULL)
2626 for (x=0; x < (int) draw_image->columns; x++)
2628 if (GetPixelAlpha(image,q) != TransparentAlpha)
2629 SetPixelAlpha(draw_image,OpaqueAlpha,q);
2630 q+=GetPixelChannels(draw_image);
2632 if (SyncCacheViewAuthenticPixels(draw_view,exception) == MagickFalse)
2635 draw_view=DestroyCacheView(draw_view);
2636 (void) XParseGeometry(draw_info->geometry,&x,&y,&width,&height);
2637 if (draw_info->stencil == TransparentStencil)
2638 (void) CompositeImage(image,draw_image,CopyAlphaCompositeOp,MagickTrue,
2639 (ssize_t) x,(ssize_t) y,exception);
2642 alpha_trait=image->alpha_trait;
2643 (void) CompositeImage(image,draw_image,OverCompositeOp,MagickTrue,
2644 (ssize_t) x,(ssize_t) y,exception);
2645 image->alpha_trait=alpha_trait;
2647 draw_image=DestroyImage(draw_image);
2652 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2660 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2662 % XError() ignores BadWindow errors for XQueryTree and XGetWindowAttributes,
2663 % and ignores BadDrawable errors for XGetGeometry, and ignores BadValue errors
2664 % for XQueryColor. It returns MagickFalse in those cases. Otherwise it
2667 % The format of the XError function is:
2669 % int XError(display,error)
2671 % A description of each parameter follows:
2673 % o display: Specifies a pointer to the Display structure; returned from
2676 % o error: Specifies the error event.
2680 #if defined(__cplusplus) || defined(c_plusplus)
2684 MagickExport int XError(Display *display,XErrorEvent *error)
2686 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
2687 assert(display != (Display *) NULL);
2688 assert(error != (XErrorEvent *) NULL);
2689 xerror_alert=MagickTrue;
2690 switch (error->request_code)
2694 if ((int) error->error_code == BadDrawable)
2695 return(MagickFalse);
2698 case X_GetWindowAttributes:
2701 if ((int) error->error_code == BadWindow)
2702 return(MagickFalse);
2707 if ((int) error->error_code == BadValue)
2708 return(MagickFalse);
2715 #if defined(__cplusplus) || defined(c_plusplus)
2720 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2724 % X F r e e R e s o u r c e s %
2728 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2730 % XFreeResources() frees X11 resources.
2732 % The format of the XFreeResources method is:
2734 % void XFreeResources(Display *display,XVisualInfo *visual_info,
2735 % XStandardColormap *map_info,XPixelInfo *pixel,XFontStruct *font_info,
2736 % XResourceInfo *resource_info,XWindowInfo *window_info)
2737 % resource_info,window_info)
2739 % A description of each parameter follows:
2741 % o display: Specifies a connection to an X server; returned from
2744 % o visual_info: Specifies a pointer to a X11 XVisualInfo structure;
2745 % returned from XGetVisualInfo.
2747 % o map_info: If map_type is specified, this structure is initialized
2748 % with info from the Standard Colormap.
2750 % o pixel: Specifies a pointer to a XPixelInfo structure.
2752 % o font_info: Specifies a pointer to a XFontStruct structure.
2754 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
2756 % o window_info: Specifies a pointer to a X11 XWindowInfo structure.
2759 MagickPrivate void XFreeResources(Display *display,XVisualInfo *visual_info,
2760 XStandardColormap *map_info,XPixelInfo *pixel,XFontStruct *font_info,
2761 XResourceInfo *resource_info,XWindowInfo *window_info)
2763 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
2764 assert(display != (Display *) NULL);
2765 assert(resource_info != (XResourceInfo *) NULL);
2766 if (window_info != (XWindowInfo *) NULL)
2771 if (window_info->ximage != (XImage *) NULL)
2772 XDestroyImage(window_info->ximage);
2773 if (window_info->id != (Window) NULL)
2776 Free destroy window and free cursors.
2778 if (window_info->id != XRootWindow(display,visual_info->screen))
2779 (void) XDestroyWindow(display,window_info->id);
2780 if (window_info->annotate_context != (GC) NULL)
2781 (void) XFreeGC(display,window_info->annotate_context);
2782 if (window_info->highlight_context != (GC) NULL)
2783 (void) XFreeGC(display,window_info->highlight_context);
2784 if (window_info->widget_context != (GC) NULL)
2785 (void) XFreeGC(display,window_info->widget_context);
2786 if (window_info->cursor != (Cursor) NULL)
2787 (void) XFreeCursor(display,window_info->cursor);
2788 window_info->cursor=(Cursor) NULL;
2789 if (window_info->busy_cursor != (Cursor) NULL)
2790 (void) XFreeCursor(display,window_info->busy_cursor);
2791 window_info->busy_cursor=(Cursor) NULL;
2797 if (font_info != (XFontStruct *) NULL)
2799 (void) XFreeFont(display,font_info);
2800 font_info=(XFontStruct *) NULL;
2802 if (map_info != (XStandardColormap *) NULL)
2805 Free X Standard Colormap.
2807 if (resource_info->map_type == (char *) NULL)
2808 (void) XFreeStandardColormap(display,visual_info,map_info,pixel);
2809 (void) XFree((void *) map_info);
2814 if (visual_info != (XVisualInfo *) NULL)
2815 (void) XFree((void *) visual_info);
2816 if (resource_info->close_server != MagickFalse)
2817 (void) XCloseDisplay(display);
2821 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2825 % X F r e e S t a n d a r d C o l o r m a p %
2829 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2831 % XFreeStandardColormap() frees an X11 colormap.
2833 % The format of the XFreeStandardColormap method is:
2835 % void XFreeStandardColormap(Display *display,
2836 % const XVisualInfo *visual_info,XStandardColormap *map_info,
2837 % XPixelInfo *pixel)
2839 % A description of each parameter follows:
2841 % o display: Specifies a connection to an X server; returned from
2844 % o visual_info: Specifies a pointer to a X11 XVisualInfo structure;
2845 % returned from XGetVisualInfo.
2847 % o map_info: If map_type is specified, this structure is initialized
2848 % with info from the Standard Colormap.
2850 % o pixel: Specifies a pointer to a XPixelInfo structure.
2853 MagickPrivate void XFreeStandardColormap(Display *display,
2854 const XVisualInfo *visual_info,XStandardColormap *map_info,XPixelInfo *pixel)
2859 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
2860 assert(display != (Display *) NULL);
2861 assert(visual_info != (XVisualInfo *) NULL);
2862 assert(map_info != (XStandardColormap *) NULL);
2863 (void) XFlush(display);
2864 if (map_info->colormap != (Colormap) NULL)
2866 if (map_info->colormap != XDefaultColormap(display,visual_info->screen))
2867 (void) XFreeColormap(display,map_info->colormap);
2869 if (pixel != (XPixelInfo *) NULL)
2870 if ((visual_info->klass != TrueColor) &&
2871 (visual_info->klass != DirectColor))
2872 (void) XFreeColors(display,map_info->colormap,pixel->pixels,
2873 (int) pixel->colors,0);
2875 map_info->colormap=(Colormap) NULL;
2876 if (pixel != (XPixelInfo *) NULL)
2878 if (pixel->pixels != (unsigned long *) NULL)
2879 pixel->pixels=(unsigned long *) RelinquishMagickMemory(pixel->pixels);
2880 pixel->pixels=(unsigned long *) NULL;
2885 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2889 % X G e t A n n o t a t e I n f o %
2893 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2895 % XGetAnnotateInfo() initializes the AnnotateInfo structure.
2897 % The format of the XGetAnnotateInfo method is:
2899 % void XGetAnnotateInfo(XAnnotateInfo *annotate_info)
2901 % A description of each parameter follows:
2903 % o annotate_info: Specifies a pointer to a XAnnotateInfo structure.
2906 MagickPrivate void XGetAnnotateInfo(XAnnotateInfo *annotate_info)
2909 Initialize annotate structure.
2911 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
2912 assert(annotate_info != (XAnnotateInfo *) NULL);
2915 annotate_info->width=0;
2916 annotate_info->height=0;
2917 annotate_info->stencil=ForegroundStencil;
2918 annotate_info->degrees=0.0;
2919 annotate_info->font_info=(XFontStruct *) NULL;
2920 annotate_info->text=(char *) NULL;
2921 *annotate_info->geometry='\0';
2922 annotate_info->previous=(XAnnotateInfo *) NULL;
2923 annotate_info->next=(XAnnotateInfo *) NULL;
2924 (void) XSupportsLocale();
2925 (void) XSetLocaleModifiers("");
2929 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2933 % X G e t M a p I n f o %
2937 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2939 % XGetMapInfo() initializes the XStandardColormap structure.
2941 % The format of the XStandardColormap method is:
2943 % void XGetMapInfo(const XVisualInfo *visual_info,const Colormap colormap,
2944 % XStandardColormap *map_info)
2946 % A description of each parameter follows:
2948 % o colormap: Specifies the ID of the X server colormap.
2950 % o visual_info: Specifies a pointer to a X11 XVisualInfo structure;
2951 % returned from XGetVisualInfo.
2953 % o map_info: Specifies a pointer to a X11 XStandardColormap structure.
2956 MagickPrivate void XGetMapInfo(const XVisualInfo *visual_info,
2957 const Colormap colormap,XStandardColormap *map_info)
2960 Initialize map info.
2962 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
2963 assert(visual_info != (XVisualInfo *) NULL);
2964 assert(map_info != (XStandardColormap *) NULL);
2965 map_info->colormap=colormap;
2966 map_info->red_max=visual_info->red_mask;
2967 map_info->red_mult=(size_t) (map_info->red_max != 0 ? 1 : 0);
2968 if (map_info->red_max != 0)
2969 while ((map_info->red_max & 0x01) == 0)
2971 map_info->red_max>>=1;
2972 map_info->red_mult<<=1;
2974 map_info->green_max=visual_info->green_mask;
2975 map_info->green_mult=(size_t) (map_info->green_max != 0 ? 1 : 0);
2976 if (map_info->green_max != 0)
2977 while ((map_info->green_max & 0x01) == 0)
2979 map_info->green_max>>=1;
2980 map_info->green_mult<<=1;
2982 map_info->blue_max=visual_info->blue_mask;
2983 map_info->blue_mult=(size_t) (map_info->blue_max != 0 ? 1 : 0);
2984 if (map_info->blue_max != 0)
2985 while ((map_info->blue_max & 0x01) == 0)
2987 map_info->blue_max>>=1;
2988 map_info->blue_mult<<=1;
2990 map_info->base_pixel=0;
2994 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2998 % X G e t P i x e l I n f o %
3002 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3004 % XGetPixelInfo() initializes the PixelInfo structure.
3006 % The format of the XGetPixelInfo method is:
3008 % void XGetPixelInfo(Display *display,const XVisualInfo *visual_info,
3009 % const XStandardColormap *map_info,const XResourceInfo *resource_info,
3010 % Image *image,XPixelInfo *pixel)
3013 % A description of each parameter follows:
3015 % o display: Specifies a connection to an X server; returned from
3018 % o visual_info: Specifies a pointer to a X11 XVisualInfo structure;
3019 % returned from XGetVisualInfo.
3021 % o map_info: If map_type is specified, this structure is initialized
3022 % with info from the Standard Colormap.
3024 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
3026 % o image: the image.
3028 % o pixel: Specifies a pointer to a XPixelInfo structure.
3031 MagickPrivate void XGetPixelInfo(Display *display,
3032 const XVisualInfo *visual_info,const XStandardColormap *map_info,
3033 const XResourceInfo *resource_info,Image *image,XPixelInfo *pixel)
3036 *PenColors[MaxNumberPens]=
3038 "#000000000000", /* black */
3039 "#00000000ffff", /* blue */
3040 "#0000ffffffff", /* cyan */
3041 "#0000ffff0000", /* green */
3042 "#bdbdbdbdbdbd", /* gray */
3043 "#ffff00000000", /* red */
3044 "#ffff0000ffff", /* magenta */
3045 "#ffffffff0000", /* yellow */
3046 "#ffffffffffff", /* white */
3047 "#bdbdbdbdbdbd", /* gray */
3048 "#bdbdbdbdbdbd" /* gray */
3068 Initialize pixel info.
3070 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
3071 assert(display != (Display *) NULL);
3072 assert(visual_info != (XVisualInfo *) NULL);
3073 assert(map_info != (XStandardColormap *) NULL);
3074 assert(resource_info != (XResourceInfo *) NULL);
3075 assert(pixel != (XPixelInfo *) NULL);
3077 if (image != (Image *) NULL)
3078 if (image->storage_class == PseudoClass)
3079 pixel->colors=(ssize_t) image->colors;
3080 packets=(unsigned int)
3081 MagickMax((int) pixel->colors,visual_info->colormap_size)+MaxNumberPens;
3082 if (pixel->pixels != (unsigned long *) NULL)
3083 pixel->pixels=(unsigned long *) RelinquishMagickMemory(pixel->pixels);
3084 pixel->pixels=(unsigned long *) AcquireQuantumMemory(packets,
3085 sizeof(pixel->pixels));
3086 if (pixel->pixels == (unsigned long *) NULL)
3087 ThrowXWindowFatalException(ResourceLimitFatalError,"UnableToGetPixelInfo",
3090 Set foreground color.
3092 colormap=map_info->colormap;
3093 (void) XParseColor(display,colormap,(char *) ForegroundColor,
3094 &pixel->foreground_color);
3095 status=XParseColor(display,colormap,resource_info->foreground_color,
3096 &pixel->foreground_color);
3097 if (status == False)
3098 ThrowXWindowFatalException(XServerError,"ColorIsNotKnownToServer",
3099 resource_info->foreground_color);
3100 pixel->foreground_color.pixel=
3101 XStandardPixel(map_info,&pixel->foreground_color);
3102 pixel->foreground_color.flags=(char) (DoRed | DoGreen | DoBlue);
3104 Set background color.
3106 (void) XParseColor(display,colormap,"#d6d6d6d6d6d6",&pixel->background_color);
3107 status=XParseColor(display,colormap,resource_info->background_color,
3108 &pixel->background_color);
3109 if (status == False)
3110 ThrowXWindowFatalException(XServerError,"ColorIsNotKnownToServer",
3111 resource_info->background_color);
3112 pixel->background_color.pixel=
3113 XStandardPixel(map_info,&pixel->background_color);
3114 pixel->background_color.flags=(char) (DoRed | DoGreen | DoBlue);
3118 (void) XParseColor(display,colormap,(char *) BorderColor,
3119 &pixel->border_color);
3120 status=XParseColor(display,colormap,resource_info->border_color,
3121 &pixel->border_color);
3122 if (status == False)
3123 ThrowXWindowFatalException(XServerError,"ColorIsNotKnownToServer",
3124 resource_info->border_color);
3125 pixel->border_color.pixel=XStandardPixel(map_info,&pixel->border_color);
3126 pixel->border_color.flags=(char) (DoRed | DoGreen | DoBlue);
3130 pixel->matte_color=pixel->background_color;
3131 if (resource_info->matte_color != (char *) NULL)
3134 Matte color is specified as a X resource or command line argument.
3136 status=XParseColor(display,colormap,resource_info->matte_color,
3137 &pixel->matte_color);
3138 if (status == False)
3139 ThrowXWindowFatalException(XServerError,"ColorIsNotKnownToServer",
3140 resource_info->matte_color);
3141 pixel->matte_color.pixel=XStandardPixel(map_info,&pixel->matte_color);
3142 pixel->matte_color.flags=(char) (DoRed | DoGreen | DoBlue);
3145 Set highlight color.
3147 pixel->highlight_color.red=(unsigned short) ((
3148 pixel->matte_color.red*ScaleQuantumToShort(HighlightModulate))/65535L+
3149 (ScaleQuantumToShort((Quantum) (QuantumRange-HighlightModulate))));
3150 pixel->highlight_color.green=(unsigned short) ((
3151 pixel->matte_color.green*ScaleQuantumToShort(HighlightModulate))/65535L+
3152 (ScaleQuantumToShort((Quantum) (QuantumRange-HighlightModulate))));
3153 pixel->highlight_color.blue=(unsigned short) ((
3154 pixel->matte_color.blue*ScaleQuantumToShort(HighlightModulate))/65535L+
3155 (ScaleQuantumToShort((Quantum) (QuantumRange-HighlightModulate))));
3156 pixel->highlight_color.pixel=
3157 XStandardPixel(map_info,&pixel->highlight_color);
3158 pixel->highlight_color.flags=(char) (DoRed | DoGreen | DoBlue);
3162 pixel->shadow_color.red=(unsigned short) (((double)
3163 pixel->matte_color.red*ScaleQuantumToShort(ShadowModulate))/65535L);
3164 pixel->shadow_color.green=(unsigned short) (((double)
3165 pixel->matte_color.green*ScaleQuantumToShort(ShadowModulate))/65535L);
3166 pixel->shadow_color.blue=(unsigned short) (((double)
3167 pixel->matte_color.blue*ScaleQuantumToShort(ShadowModulate))/65535L);
3168 pixel->shadow_color.pixel=XStandardPixel(map_info,&pixel->shadow_color);
3169 pixel->shadow_color.flags=(char) (DoRed | DoGreen | DoBlue);
3173 pixel->depth_color.red=(unsigned short) (((double)
3174 pixel->matte_color.red*ScaleQuantumToShort(DepthModulate))/65535L);
3175 pixel->depth_color.green=(unsigned short) (((double)
3176 pixel->matte_color.green*ScaleQuantumToShort(DepthModulate))/65535L);
3177 pixel->depth_color.blue=(unsigned short) (((double)
3178 pixel->matte_color.blue*ScaleQuantumToShort(DepthModulate))/65535L);
3179 pixel->depth_color.pixel=XStandardPixel(map_info,&pixel->depth_color);
3180 pixel->depth_color.flags=(char) (DoRed | DoGreen | DoBlue);
3184 pixel->trough_color.red=(unsigned short) (((double)
3185 pixel->matte_color.red*ScaleQuantumToShort(TroughModulate))/65535L);
3186 pixel->trough_color.green=(unsigned short) (((double)
3187 pixel->matte_color.green*ScaleQuantumToShort(TroughModulate))/65535L);
3188 pixel->trough_color.blue=(unsigned short) (((double)
3189 pixel->matte_color.blue*ScaleQuantumToShort(TroughModulate))/65535L);
3190 pixel->trough_color.pixel=XStandardPixel(map_info,&pixel->trough_color);
3191 pixel->trough_color.flags=(char) (DoRed | DoGreen | DoBlue);
3195 for (i=0; i < MaxNumberPens; i++)
3197 (void) XParseColor(display,colormap,(char *) PenColors[i],
3198 &pixel->pen_colors[i]);
3199 status=XParseColor(display,colormap,resource_info->pen_colors[i],
3200 &pixel->pen_colors[i]);
3201 if (status == False)
3202 ThrowXWindowFatalException(XServerError,"ColorIsNotKnownToServer",
3203 resource_info->pen_colors[i]);
3204 pixel->pen_colors[i].pixel=XStandardPixel(map_info,&pixel->pen_colors[i]);
3205 pixel->pen_colors[i].flags=(char) (DoRed | DoGreen | DoBlue);
3207 pixel->box_color=pixel->background_color;
3208 pixel->pen_color=pixel->foreground_color;
3211 if (image != (Image *) NULL)
3213 if ((resource_info->gamma_correct != MagickFalse) &&
3214 (image->gamma != 0.0))
3223 Initialize map relative to display and image gamma.
3225 flags=ParseGeometry(resource_info->display_gamma,&geometry_info);
3226 red_gamma=geometry_info.rho;
3227 green_gamma=geometry_info.sigma;
3228 if ((flags & SigmaValue) == 0)
3229 green_gamma=red_gamma;
3230 blue_gamma=geometry_info.xi;
3231 if ((flags & XiValue) == 0)
3232 blue_gamma=red_gamma;
3233 red_gamma*=image->gamma;
3234 green_gamma*=image->gamma;
3235 blue_gamma*=image->gamma;
3237 if (image->storage_class == PseudoClass)
3240 Initialize pixel array for images of type PseudoClass.
3242 for (i=0; i < (ssize_t) image->colors; i++)
3243 pixel->pixels[i]=XGammaPacket(map_info,image->colormap+i);
3244 for (i=0; i < MaxNumberPens; i++)
3245 pixel->pixels[image->colors+i]=pixel->pen_colors[i].pixel;
3246 pixel->colors+=MaxNumberPens;
3252 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3256 % X G e t R e s o u r c e C l a s s %
3260 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3262 % XGetResourceClass() queries the X server for the specified resource name or
3263 % class. If the resource name or class is not defined in the database, the
3264 % supplied default value is returned.
3266 % The format of the XGetResourceClass method is:
3268 % char *XGetResourceClass(XrmDatabase database,const char *client_name,
3269 % const char *keyword,char *resource_default)
3271 % A description of each parameter follows:
3273 % o database: Specifies a resource database; returned from
3274 % XrmGetStringDatabase.
3276 % o client_name: Specifies the application name used to retrieve resource
3277 % info from the X server database.
3279 % o keyword: Specifies the keyword of the value being retrieved.
3281 % o resource_default: Specifies the default value to return if the query
3282 % fails to find the specified keyword/class.
3285 MagickExport char *XGetResourceClass(XrmDatabase database,
3286 const char *client_name,const char *keyword,char *resource_default)
3289 resource_class[MaxTextExtent],
3290 resource_name[MaxTextExtent];
3301 if (database == (XrmDatabase) NULL)
3302 return(resource_default);
3303 *resource_name='\0';
3304 *resource_class='\0';
3305 if (keyword != (char *) NULL)
3312 Initialize resource keyword and class.
3314 (void) FormatLocaleString(resource_name,MaxTextExtent,"%s.%s",
3315 client_name,keyword);
3316 c=(int) (*client_name);
3317 if ((c >= XK_a) && (c <= XK_z))
3320 if ((c >= XK_agrave) && (c <= XK_odiaeresis))
3321 c-=(XK_agrave-XK_Agrave);
3323 if ((c >= XK_oslash) && (c <= XK_thorn))
3324 c-=(XK_oslash-XK_Ooblique);
3326 if ((k >= XK_a) && (k <= XK_z))
3329 if ((k >= XK_agrave) && (k <= XK_odiaeresis))
3330 k-=(XK_agrave-XK_Agrave);
3332 if ((k >= XK_oslash) && (k <= XK_thorn))
3333 k-=(XK_oslash-XK_Ooblique);
3334 (void) FormatLocaleString(resource_class,MaxTextExtent,"%c%s.%c%s",c,
3335 client_name+1,k,keyword+1);
3337 status=XrmGetResource(database,resource_name,resource_class,&resource_type,
3339 if (status == False)
3340 return(resource_default);
3341 return(resource_value.addr);
3345 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3349 % X G e t R e s o u r c e D a t a b a s e %
3353 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3355 % XGetResourceDatabase() creates a new resource database and initializes it.
3357 % The format of the XGetResourceDatabase method is:
3359 % XrmDatabase XGetResourceDatabase(Display *display,
3360 % const char *client_name)
3362 % A description of each parameter follows:
3364 % o database: XGetResourceDatabase() returns the database after it is
3367 % o display: Specifies a connection to an X server; returned from
3370 % o client_name: Specifies the application name used to retrieve resource
3371 % info from the X server database.
3374 MagickExport XrmDatabase XGetResourceDatabase(Display *display,
3375 const char *client_name)
3378 filename[MaxTextExtent];
3390 if (display == (Display *) NULL)
3391 return((XrmDatabase) NULL);
3392 assert(client_name != (char *) NULL);
3394 Initialize resource database.
3397 (void) XGetDefault(display,(char *) client_name,"dummy");
3398 resource_database=XrmGetDatabase(display);
3400 Combine application database.
3402 if (client_name != (char *) NULL)
3405 Get basename of client.
3407 p=client_name+(strlen(client_name)-1);
3408 while ((p > client_name) && (*p != '/'))
3413 c=(int) (*client_name);
3414 if ((c >= XK_a) && (c <= XK_z))
3417 if ((c >= XK_agrave) && (c <= XK_odiaeresis))
3418 c-=(XK_agrave-XK_Agrave);
3420 if ((c >= XK_oslash) && (c <= XK_thorn))
3421 c-=(XK_oslash-XK_Ooblique);
3422 #if defined(X11_APPLICATION_PATH)
3423 (void) FormatLocaleString(filename,MaxTextExtent,"%s%c%s",
3424 X11_APPLICATION_PATH,c,client_name+1);
3425 (void) XrmCombineFileDatabase(filename,&resource_database,MagickFalse);
3427 if (XResourceManagerString(display) != (char *) NULL)
3430 Combine server database.
3432 server_database=XrmGetStringDatabase(XResourceManagerString(display));
3433 XrmCombineDatabase(server_database,&resource_database,MagickFalse);
3436 Merge user preferences database.
3438 #if defined(X11_PREFERENCES_PATH)
3439 (void) FormatLocaleString(filename,MaxTextExtent,"%s%src",
3440 X11_PREFERENCES_PATH,client_name);
3441 ExpandFilename(filename);
3442 (void) XrmCombineFileDatabase(filename,&resource_database,MagickFalse);
3444 return(resource_database);
3448 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3452 % X G e t R e s o u r c e I n f o %
3456 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3458 % XGetResourceInfo(image_info,) initializes the ResourceInfo structure.
3460 % The format of the XGetResourceInfo method is:
3462 % void XGetResourceInfo(const ImageInfo *image_info,XrmDatabase database,
3463 % const char *client_name,XResourceInfo *resource_info)
3465 % A description of each parameter follows:
3467 % o image_info: the image info.
3469 % o database: Specifies a resource database; returned from
3470 % XrmGetStringDatabase.
3472 % o client_name: Specifies the application name used to retrieve
3473 % resource info from the X server database.
3475 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
3478 MagickExport void XGetResourceInfo(const ImageInfo *image_info,
3479 XrmDatabase database,const char *client_name,XResourceInfo *resource_info)
3490 Initialize resource info fields.
3492 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
3493 assert(resource_info != (XResourceInfo *) NULL);
3494 (void) ResetMagickMemory(resource_info,0,sizeof(*resource_info));
3495 resource_info->resource_database=database;
3496 resource_info->image_info=(ImageInfo *) image_info;
3497 (void) SetImageInfoProgressMonitor(resource_info->image_info,
3498 XMagickProgressMonitor,(void *) NULL);
3499 resource_info->quantize_info=CloneQuantizeInfo((QuantizeInfo *) NULL);
3500 resource_info->close_server=MagickTrue;
3501 resource_info->client_name=AcquireString(client_name);
3502 resource_value=XGetResourceClass(database,client_name,"backdrop",
3504 resource_info->backdrop=IsStringTrue(resource_value);
3505 resource_info->background_color=XGetResourceInstance(database,client_name,
3506 "background",(char *) "#d6d6d6d6d6d6");
3507 resource_info->border_color=XGetResourceInstance(database,client_name,
3508 "borderColor",BorderColor);
3509 resource_value=XGetResourceClass(database,client_name,"borderWidth",
3511 resource_info->border_width=(unsigned int) StringToUnsignedLong(
3513 resource_value=XGetResourceClass(database,client_name,"colormap",
3515 resource_info->colormap=UndefinedColormap;
3516 if (LocaleCompare("private",resource_value) == 0)
3517 resource_info->colormap=PrivateColormap;
3518 if (LocaleCompare("shared",resource_value) == 0)
3519 resource_info->colormap=SharedColormap;
3520 if (resource_info->colormap == UndefinedColormap)
3521 ThrowXWindowFatalException(OptionError,"UnrecognizedColormapType",
3523 resource_value=XGetResourceClass(database,client_name,
3524 "colorRecovery",(char *) "False");
3525 resource_info->color_recovery=IsStringTrue(resource_value);
3526 resource_value=XGetResourceClass(database,client_name,"confirmExit",
3528 resource_info->confirm_exit=IsStringTrue(resource_value);
3529 resource_value=XGetResourceClass(database,client_name,"confirmEdit",
3531 resource_info->confirm_edit=IsStringTrue(resource_value);
3532 resource_value=XGetResourceClass(database,client_name,"delay",(char *) "1");
3533 resource_info->delay=(unsigned int) StringToUnsignedLong(resource_value);
3534 resource_info->display_gamma=XGetResourceClass(database,client_name,
3535 "displayGamma",(char *) "2.2");
3536 resource_value=XGetResourceClass(database,client_name,"displayWarnings",
3538 resource_info->display_warnings=IsStringTrue(resource_value);
3539 resource_info->font=XGetResourceClass(database,client_name,"font",
3541 resource_info->font=XGetResourceClass(database,client_name,"fontList",
3542 resource_info->font);
3543 resource_info->font_name[0]=XGetResourceClass(database,client_name,"font1",
3545 resource_info->font_name[1]=XGetResourceClass(database,client_name,"font2",
3546 (char *) "variable");
3547 resource_info->font_name[2]=XGetResourceClass(database,client_name,"font3",
3549 resource_info->font_name[3]=XGetResourceClass(database,client_name,"font4",
3551 resource_info->font_name[4]=XGetResourceClass(database,client_name,"font5",
3552 (char *) "7x13bold");
3553 resource_info->font_name[5]=XGetResourceClass(database,client_name,"font6",
3554 (char *) "8x13bold");
3555 resource_info->font_name[6]=XGetResourceClass(database,client_name,"font7",
3556 (char *) "9x15bold");
3557 resource_info->font_name[7]=XGetResourceClass(database,client_name,"font8",
3559 resource_info->font_name[8]=XGetResourceClass(database,client_name,"font9",
3561 resource_info->font_name[9]=XGetResourceClass(database,client_name,"font0",
3563 resource_info->font_name[10]=XGetResourceClass(database,client_name,"font0",
3565 resource_info->foreground_color=XGetResourceInstance(database,client_name,
3566 "foreground",ForegroundColor);
3567 resource_value=XGetResourceClass(database,client_name,"gammaCorrect",
3569 resource_info->gamma_correct=IsStringTrue(resource_value);
3570 resource_info->image_geometry=ConstantString(XGetResourceClass(database,
3571 client_name,"geometry",(char *) NULL));
3572 resource_value=XGetResourceClass(database,client_name,"gravity",
3574 resource_info->gravity=(GravityType) ParseCommandOption(MagickGravityOptions,
3575 MagickFalse,resource_value);
3576 directory=getcwd(resource_info->home_directory,MaxTextExtent);
3578 resource_info->icon_geometry=XGetResourceClass(database,client_name,
3579 "iconGeometry",(char *) NULL);
3580 resource_value=XGetResourceClass(database,client_name,"iconic",
3582 resource_info->iconic=IsStringTrue(resource_value);
3583 resource_value=XGetResourceClass(database,client_name,"immutable",
3584 LocaleCompare(client_name,"PerlMagick") == 0 ? (char *) "True" :
3586 resource_info->immutable=IsStringTrue(resource_value);
3587 resource_value=XGetResourceClass(database,client_name,"magnify",
3589 resource_info->magnify=(unsigned int) StringToUnsignedLong(resource_value);
3590 resource_info->map_type=XGetResourceClass(database,client_name,"map",
3592 resource_info->matte_color=XGetResourceInstance(database,client_name,
3593 "mattecolor",(char *) NULL);
3594 resource_info->name=ConstantString(XGetResourceClass(database,client_name,
3595 "name",(char *) NULL));
3596 resource_info->pen_colors[0]=XGetResourceClass(database,client_name,"pen1",
3598 resource_info->pen_colors[1]=XGetResourceClass(database,client_name,"pen2",
3600 resource_info->pen_colors[2]=XGetResourceClass(database,client_name,"pen3",
3602 resource_info->pen_colors[3]=XGetResourceClass(database,client_name,"pen4",
3604 resource_info->pen_colors[4]=XGetResourceClass(database,client_name,"pen5",
3606 resource_info->pen_colors[5]=XGetResourceClass(database,client_name,"pen6",
3608 resource_info->pen_colors[6]=XGetResourceClass(database,client_name,"pen7",
3609 (char *) "magenta");
3610 resource_info->pen_colors[7]=XGetResourceClass(database,client_name,"pen8",
3612 resource_info->pen_colors[8]=XGetResourceClass(database,client_name,"pen9",
3614 resource_info->pen_colors[9]=XGetResourceClass(database,client_name,"pen0",
3616 resource_info->pen_colors[10]=XGetResourceClass(database,client_name,"pen0",
3618 resource_value=XGetResourceClass(database,client_name,"pause",(char *) "0");
3619 resource_info->pause=(unsigned int) StringToUnsignedLong(resource_value);
3620 resource_value=XGetResourceClass(database,client_name,"quantum",(char *) "1");
3621 resource_info->quantum=StringToLong(resource_value);
3622 resource_info->text_font=XGetResourceClass(database,client_name,(char *)
3623 "font",(char *) "fixed");
3624 resource_info->text_font=XGetResourceClass(database,client_name,
3625 "textFontList",resource_info->text_font);
3626 resource_info->title=XGetResourceClass(database,client_name,"title",
3628 resource_value=XGetResourceClass(database,client_name,"undoCache",
3630 resource_info->undo_cache=(unsigned int) StringToUnsignedLong(resource_value);
3631 resource_value=XGetResourceClass(database,client_name,"update",
3633 resource_info->update=IsStringTrue(resource_value);
3634 resource_value=XGetResourceClass(database,client_name,"usePixmap",
3636 resource_info->use_pixmap=IsStringTrue(resource_value);
3637 resource_value=XGetResourceClass(database,client_name,"sharedMemory",
3639 resource_info->use_shared_memory=IsStringTrue(resource_value);
3640 resource_info->visual_type=XGetResourceClass(database,client_name,"visual",
3642 resource_info->window_group=XGetResourceClass(database,client_name,
3643 "windowGroup",(char *) NULL);
3644 resource_info->window_id=XGetResourceClass(database,client_name,"window",
3646 resource_info->write_filename=XGetResourceClass(database,client_name,
3647 "writeFilename",(char *) NULL);
3651 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3655 % X G e t R e s o u r c e I n s t a n c e %
3659 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3661 % XGetResourceInstance() queries the X server for the specified resource name.
3662 % If the resource name is not defined in the database, the supplied default
3663 % value is returned.
3665 % The format of the XGetResourceInstance method is:
3667 % char *XGetResourceInstance(XrmDatabase database,const char *client_name,
3668 % const char *keyword,const char *resource_default)
3670 % A description of each parameter follows:
3672 % o database: Specifies a resource database; returned from
3673 % XrmGetStringDatabase.
3675 % o client_name: Specifies the application name used to retrieve
3676 % resource info from the X server database.
3678 % o keyword: Specifies the keyword of the value being retrieved.
3680 % o resource_default: Specifies the default value to return if the query
3681 % fails to find the specified keyword/class.
3684 MagickExport char *XGetResourceInstance(XrmDatabase database,
3685 const char *client_name,const char *keyword,const char *resource_default)
3689 resource_name[MaxTextExtent];
3697 if (database == (XrmDatabase) NULL)
3698 return((char *) resource_default);
3699 *resource_name='\0';
3700 if (keyword != (char *) NULL)
3701 (void) FormatLocaleString(resource_name,MaxTextExtent,"%s.%s",client_name,
3703 status=XrmGetResource(database,resource_name,"ImageMagick",&resource_type,
3705 if (status == False)
3706 return((char *) resource_default);
3707 return(resource_value.addr);
3711 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3715 % X G e t S c r e e n D e n s i t y %
3719 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3721 % XGetScreenDensity() returns the density of the X server screen in
3724 % The format of the XGetScreenDensity method is:
3726 % char *XGetScreenDensity(Display *display)
3728 % A description of each parameter follows:
3730 % o density: XGetScreenDensity() returns the density of the X screen in
3733 % o display: Specifies a connection to an X server; returned from
3737 MagickExport char *XGetScreenDensity(Display *display)
3740 density[MaxTextExtent];
3747 Set density as determined by screen size.
3749 x_density=((((double) DisplayWidth(display,XDefaultScreen(display)))*25.4)/
3750 ((double) DisplayWidthMM(display,XDefaultScreen(display))));
3751 y_density=((((double) DisplayHeight(display,XDefaultScreen(display)))*25.4)/
3752 ((double) DisplayHeightMM(display,XDefaultScreen(display))));
3753 (void) FormatLocaleString(density,MaxTextExtent,"%gx%g",x_density,
3755 return(GetPageGeometry(density));
3759 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3763 + X G e t S u b w i n d o w %
3767 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3769 % XGetSubwindow() returns the subwindow of a window chosen the user with the
3770 % pointer and a button press.
3772 % The format of the XGetSubwindow method is:
3774 % Window XGetSubwindow(Display *display,Window window,int x,int y)
3776 % A description of each parameter follows:
3778 % o subwindow: XGetSubwindow() returns NULL if no subwindow is found
3779 % otherwise the subwindow is returned.
3781 % o display: Specifies a connection to an X server; returned from
3784 % o window: Specifies a pointer to a Window.
3786 % o x: the x coordinate of the pointer relative to the origin of the
3789 % o y: the y coordinate of the pointer relative to the origin of the
3793 static Window XGetSubwindow(Display *display,Window window,int x,int y)
3806 assert(display != (Display *) NULL);
3807 source_window=XRootWindow(display,XDefaultScreen(display));
3808 if (window == (Window) NULL)
3809 return(source_window);
3810 target_window=window;
3813 status=XTranslateCoordinates(display,source_window,window,x,y,
3814 &x_offset,&y_offset,&target_window);
3817 if (target_window == (Window) NULL)
3819 source_window=window;
3820 window=target_window;
3824 if (target_window == (Window) NULL)
3825 target_window=window;
3826 return(target_window);
3830 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3834 % X G e t W i n d o w C o l o r %
3838 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3840 % XGetWindowColor() returns the color of a pixel interactively chosen from the
3843 % The format of the XGetWindowColor method is:
3845 % MagickBooleanType XGetWindowColor(Display *display,XWindows *windows,
3846 % char *name,ExceptionInfo *exception)
3848 % A description of each parameter follows:
3850 % o display: Specifies a connection to an X server; returned from
3853 % o windows: Specifies a pointer to a XWindows structure.
3855 % o name: the name of the color if found in the X Color Database is
3856 % returned in this character string.
3858 % o exception: return any errors or warnings in this structure.
3861 MagickPrivate MagickBooleanType XGetWindowColor(Display *display,
3862 XWindows *windows,char *name,ExceptionInfo *exception)
3893 Choose a pixel from the X server.
3895 assert(display != (Display *) NULL);
3896 assert(name != (char *) NULL);
3897 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",name);
3899 target_window=XSelectWindow(display,&crop_info);
3900 if (target_window == (Window) NULL)
3901 return(MagickFalse);
3902 root_window=XRootWindow(display,XDefaultScreen(display));
3903 client_window=target_window;
3904 if (target_window != root_window)
3912 status=XGetGeometry(display,target_window,&root_window,&x,&x,&d,&d,&d,&d);
3913 if (status != False)
3915 client_window=XClientWindow(display,target_window);
3916 target_window=client_window;
3920 Verify window is viewable.
3922 status=XGetWindowAttributes(display,target_window,&window_attributes);
3923 if ((status == False) || (window_attributes.map_state != IsViewable))
3924 return(MagickFalse);
3928 (void) XTranslateCoordinates(display,root_window,target_window,
3929 (int) crop_info.x,(int) crop_info.y,&x,&y,&child);
3930 ximage=XGetImage(display,target_window,x,y,1,1,AllPlanes,ZPixmap);
3931 if (ximage == (XImage *) NULL)
3932 return(MagickFalse);
3933 color.pixel=XGetPixel(ximage,0,0);
3934 XDestroyImage(ximage);
3936 Match color against the color database.
3938 (void) XQueryColor(display,window_attributes.colormap,&color);
3939 pixel.red=(double) ScaleShortToQuantum(color.red);
3940 pixel.green=(double) ScaleShortToQuantum(color.green);
3941 pixel.blue=(double) ScaleShortToQuantum(color.blue);
3942 pixel.alpha=OpaqueAlpha;
3943 (void) QueryColorname(windows->image.image,&pixel,X11Compliance,name,
3949 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3953 + X G e t W i n d o w I m a g e %
3957 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3959 % XGetWindowImage() reads an image from the target X window and returns it.
3960 % XGetWindowImage() optionally descends the window hierarchy and overlays the
3961 % target image with each child image in an optimized fashion. Any child
3962 % window that have the same visual, colormap, and are contained by its parent
3965 % The format of the XGetWindowImage method is:
3967 % Image *XGetWindowImage(Display *display,const Window window,
3968 % const unsigned int borders,const unsigned int level,
3969 % ExceptionInfo *exception)
3971 % A description of each parameter follows:
3973 % o display: Specifies a connection to an X server; returned from
3976 % o window: Specifies the window to obtain the image from.
3978 % o borders: Specifies whether borders pixels are to be saved with
3981 % o level: Specifies an unsigned integer representing the level of
3982 % decent in the window hierarchy. This value must be zero or one on
3983 % the initial call to XGetWindowImage. A value of zero returns after
3984 % one call. A value of one causes the function to descend the window
3985 % hierarchy and overlay the target image with each subwindow image.
3987 % o exception: return any errors or warnings in this structure.
3990 static Image *XGetWindowImage(Display *display,const Window window,
3991 const unsigned int borders,const unsigned int level,ExceptionInfo *exception)
3993 typedef struct _ColormapInfo
4001 struct _ColormapInfo
4005 typedef struct _WindowInfo
4041 *colormap_info = (ColormapInfo *) NULL;
4061 Verify window is viewable.
4063 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
4064 assert(display != (Display *) NULL);
4065 status=XGetWindowAttributes(display,window,&window_attributes);
4066 if ((status == False) || (window_attributes.map_state != IsViewable))
4067 return((Image *) NULL);
4069 Cropping rectangle is relative to root window.
4071 root_window=XRootWindow(display,XDefaultScreen(display));
4072 (void) XTranslateCoordinates(display,window,root_window,0,0,&x_offset,
4074 crop_info.x=(ssize_t) x_offset;
4075 crop_info.y=(ssize_t) y_offset;
4076 crop_info.width=(size_t) window_attributes.width;
4077 crop_info.height=(size_t) window_attributes.height;
4078 if (borders != MagickFalse)
4081 Include border in image.
4083 crop_info.x-=(ssize_t) window_attributes.border_width;
4084 crop_info.y-=(ssize_t) window_attributes.border_width;
4085 crop_info.width+=(size_t) (window_attributes.border_width << 1);
4086 crop_info.height+=(size_t) (window_attributes.border_width << 1);
4089 Crop to root window.
4091 if (crop_info.x < 0)
4093 crop_info.width+=crop_info.x;
4096 if (crop_info.y < 0)
4098 crop_info.height+=crop_info.y;
4101 display_width=XDisplayWidth(display,XDefaultScreen(display));
4102 if ((int) (crop_info.x+crop_info.width) > display_width)
4103 crop_info.width=(size_t) (display_width-crop_info.x);
4104 display_height=XDisplayHeight(display,XDefaultScreen(display));
4105 if ((int) (crop_info.y+crop_info.height) > display_height)
4106 crop_info.height=(size_t) (display_height-crop_info.y);
4108 Initialize window info attributes.
4110 if (number_windows >= max_windows)
4113 Allocate or resize window info buffer.
4116 if (window_info == (WindowInfo *) NULL)
4117 window_info=(WindowInfo *) AcquireQuantumMemory((size_t) max_windows,
4118 sizeof(*window_info));
4120 window_info=(WindowInfo *) ResizeQuantumMemory(window_info,(size_t)
4121 max_windows,sizeof(*window_info));
4123 if (window_info == (WindowInfo *) NULL)
4125 ThrowXWindowFatalException(ResourceLimitError,
4126 "MemoryAllocationFailed","...");
4127 return((Image *) NULL);
4129 id=number_windows++;
4130 window_info[id].window=window;
4131 window_info[id].visual=window_attributes.visual;
4132 window_info[id].colormap=window_attributes.colormap;
4133 window_info[id].bounds.x1=(short) crop_info.x;
4134 window_info[id].bounds.y1=(short) crop_info.y;
4135 window_info[id].bounds.x2=(short) (crop_info.x+(int) crop_info.width-1);
4136 window_info[id].bounds.y2=(short) (crop_info.y+(int) crop_info.height-1);
4137 crop_info.x-=x_offset;
4138 crop_info.y-=y_offset;
4139 window_info[id].crop_info=crop_info;
4149 Descend the window hierarchy.
4151 status=XQueryTree(display,window,&root_window,&window_info[id].parent,
4152 &children,&number_children);
4153 for (i=0; i < id; i++)
4154 if ((window_info[i].window == window_info[id].parent) &&
4155 (window_info[i].visual == window_info[id].visual) &&
4156 (window_info[i].colormap == window_info[id].colormap))
4158 if ((window_info[id].bounds.x1 < window_info[i].bounds.x1) ||
4159 (window_info[id].bounds.x2 > window_info[i].bounds.x2) ||
4160 (window_info[id].bounds.y1 < window_info[i].bounds.y1) ||
4161 (window_info[id].bounds.y2 > window_info[i].bounds.y2))
4164 Eliminate windows not circumscribed by their parent.
4170 if ((status == True) && (number_children != 0))
4172 for (i=0; i < (int) number_children; i++)
4173 (void) XGetWindowImage(display,children[i],MagickFalse,level+1,
4175 (void) XFree((void *) children);
4216 Get X image for each window in the list.
4218 image=NewImageList();
4219 for (id=0; id < number_windows; id++)
4222 Does target window intersect top level window?
4225 ((window_info[id].bounds.x2 >= window_info[0].bounds.x1) &&
4226 (window_info[id].bounds.x1 <= window_info[0].bounds.x2) &&
4227 (window_info[id].bounds.y2 >= window_info[0].bounds.y1) &&
4228 (window_info[id].bounds.y1 <= window_info[0].bounds.y2)) ?
4229 MagickTrue : MagickFalse;
4231 Is target window contained by another window with the same colormap?
4233 for (j=0; j < id; j++)
4234 if ((window_info[id].visual == window_info[j].visual) &&
4235 (window_info[id].colormap == window_info[j].colormap))
4237 if ((window_info[id].bounds.x1 >= window_info[j].bounds.x1) &&
4238 (window_info[id].bounds.x2 <= window_info[j].bounds.x2) &&
4239 (window_info[id].bounds.y1 >= window_info[j].bounds.y1) &&
4240 (window_info[id].bounds.y2 <= window_info[j].bounds.y2))
4243 if (import == MagickFalse)
4248 ximage=XGetImage(display,window_info[id].window,(int)
4249 window_info[id].crop_info.x,(int) window_info[id].crop_info.y,
4250 (unsigned int) window_info[id].crop_info.width,(unsigned int)
4251 window_info[id].crop_info.height,AllPlanes,ZPixmap);
4252 if (ximage == (XImage *) NULL)
4255 Initialize window colormap.
4258 colors=(XColor *) NULL;
4259 if (window_info[id].colormap != (Colormap) NULL)
4265 Search colormap list for window colormap.
4267 number_colors=(unsigned int) window_info[id].visual->map_entries;
4268 for (p=colormap_info; p != (ColormapInfo *) NULL; p=p->next)
4269 if (p->colormap == window_info[id].colormap)
4271 if (p == (ColormapInfo *) NULL)
4274 Get the window colormap.
4276 colors=(XColor *) AcquireQuantumMemory(number_colors,
4278 if (colors == (XColor *) NULL)
4280 XDestroyImage(ximage);
4281 return((Image *) NULL);
4283 if ((window_info[id].visual->klass != DirectColor) &&
4284 (window_info[id].visual->klass != TrueColor))
4285 for (i=0; i < (int) number_colors; i++)
4287 colors[i].pixel=(size_t) i;
4301 DirectColor or TrueColor visual.
4306 red_bit=window_info[id].visual->red_mask &
4307 (~(window_info[id].visual->red_mask)+1);
4308 green_bit=window_info[id].visual->green_mask &
4309 (~(window_info[id].visual->green_mask)+1);
4310 blue_bit=window_info[id].visual->blue_mask &
4311 (~(window_info[id].visual->blue_mask)+1);
4312 for (i=0; i < (int) number_colors; i++)
4314 colors[i].pixel=(unsigned long) (red | green | blue);
4317 if (red > window_info[id].visual->red_mask)
4320 if (green > window_info[id].visual->green_mask)
4323 if (blue > window_info[id].visual->blue_mask)
4327 (void) XQueryColors(display,window_info[id].colormap,colors,
4328 (int) number_colors);
4330 Append colormap to colormap list.
4332 p=(ColormapInfo *) AcquireMagickMemory(sizeof(*p));
4333 if (p == (ColormapInfo *) NULL)
4334 return((Image *) NULL);
4335 p->colormap=window_info[id].colormap;
4337 p->next=colormap_info;
4343 Allocate image structure.
4345 composite_image=AcquireImage((ImageInfo *) NULL,exception);
4346 if (composite_image == (Image *) NULL)
4348 XDestroyImage(ximage);
4349 return((Image *) NULL);
4352 Convert X image to MIFF format.
4354 if ((window_info[id].visual->klass != TrueColor) &&
4355 (window_info[id].visual->klass != DirectColor))
4356 composite_image->storage_class=PseudoClass;
4357 composite_image->columns=(size_t) ximage->width;
4358 composite_image->rows=(size_t) ximage->height;
4359 composite_view=AcquireAuthenticCacheView(composite_image,exception);
4360 switch (composite_image->storage_class)
4378 Determine shift and mask for red, green, and blue.
4380 red_mask=window_info[id].visual->red_mask;
4382 while ((red_mask != 0) && ((red_mask & 0x01) == 0))
4387 green_mask=window_info[id].visual->green_mask;
4389 while ((green_mask != 0) && ((green_mask & 0x01) == 0))
4394 blue_mask=window_info[id].visual->blue_mask;
4396 while ((blue_mask != 0) && ((blue_mask & 0x01) == 0))
4402 Convert X image to DirectClass packets.
4404 if ((number_colors != 0) &&
4405 (window_info[id].visual->klass == DirectColor))
4406 for (y=0; y < (int) composite_image->rows; y++)
4408 q=QueueCacheViewAuthenticPixels(composite_view,0,(ssize_t) y,
4409 composite_image->columns,1,exception);
4410 if (q == (Quantum *) NULL)
4412 for (x=0; x < (int) composite_image->columns; x++)
4414 pixel=XGetPixel(ximage,x,y);
4415 index=(pixel >> red_shift) & red_mask;
4416 SetPixelRed(composite_image,
4417 ScaleShortToQuantum(colors[index].red),q);
4418 index=(pixel >> green_shift) & green_mask;
4419 SetPixelGreen(composite_image,
4420 ScaleShortToQuantum(colors[index].green),q);
4421 index=(pixel >> blue_shift) & blue_mask;
4422 SetPixelBlue(composite_image,
4423 ScaleShortToQuantum(colors[index].blue),q);
4424 q+=GetPixelChannels(composite_image);
4426 status=SyncCacheViewAuthenticPixels(composite_view,exception);
4427 if (status == MagickFalse)
4431 for (y=0; y < (int) composite_image->rows; y++)
4433 q=QueueCacheViewAuthenticPixels(composite_view,0,(ssize_t) y,
4434 composite_image->columns,1,exception);
4435 if (q == (Quantum *) NULL)
4437 for (x=0; x < (int) composite_image->columns; x++)
4439 pixel=XGetPixel(ximage,x,y);
4440 color=(pixel >> red_shift) & red_mask;
4441 color=(65535UL*color)/red_mask;
4442 SetPixelRed(composite_image,
4443 ScaleShortToQuantum((unsigned short) color),q);
4444 color=(pixel >> green_shift) & green_mask;
4445 color=(65535UL*color)/green_mask;
4446 SetPixelGreen(composite_image,
4447 ScaleShortToQuantum((unsigned short) color),q);
4448 color=(pixel >> blue_shift) & blue_mask;
4449 color=(65535UL*color)/blue_mask;
4450 SetPixelBlue(composite_image,
4451 ScaleShortToQuantum((unsigned short) color),q);
4452 q+=GetPixelChannels(composite_image);
4454 status=SyncCacheViewAuthenticPixels(composite_view,exception);
4455 if (status == MagickFalse)
4465 status=AcquireImageColormap(composite_image,number_colors,
4467 if (status == MagickFalse)
4469 XDestroyImage(ximage);
4470 composite_image=DestroyImage(composite_image);
4471 return((Image *) NULL);
4473 for (i=0; i < (int) composite_image->colors; i++)
4475 composite_image->colormap[colors[i].pixel].red=(double)
4476 ScaleShortToQuantum(colors[i].red);
4477 composite_image->colormap[colors[i].pixel].green=(double)
4478 ScaleShortToQuantum(colors[i].green);
4479 composite_image->colormap[colors[i].pixel].blue=(double)
4480 ScaleShortToQuantum(colors[i].blue);
4483 Convert X image to PseudoClass packets.
4485 for (y=0; y < (int) composite_image->rows; y++)
4487 q=QueueCacheViewAuthenticPixels(composite_view,0,(ssize_t) y,
4488 composite_image->columns,1,exception);
4489 if (q == (Quantum *) NULL)
4491 for (x=0; x < (int) composite_image->columns; x++)
4493 index=(Quantum) XGetPixel(ximage,x,y);
4494 SetPixelIndex(composite_image,index,q);
4495 SetPixelInfoPixel(composite_image,
4496 composite_image->colormap+(ssize_t) index,q);
4497 q+=GetPixelChannels(composite_image);
4499 status=SyncCacheViewAuthenticPixels(composite_view,exception);
4500 if (status == MagickFalse)
4506 composite_view=DestroyCacheView(composite_view);
4507 XDestroyImage(ximage);
4508 if (image == (Image *) NULL)
4510 image=composite_image;
4514 Composite any children in back-to-front order.
4516 (void) XTranslateCoordinates(display,window_info[id].window,window,0,0,
4517 &x_offset,&y_offset,&child);
4518 x_offset-=(int) crop_info.x;
4521 y_offset-=(int) crop_info.y;
4524 (void) CompositeImage(image,composite_image,CopyCompositeOp,MagickTrue,
4525 (ssize_t) x_offset,(ssize_t) y_offset,exception);
4526 composite_image=DestroyImage(composite_image);
4529 Relinquish resources.
4531 while (colormap_info != (ColormapInfo *) NULL)
4533 next=colormap_info->next;
4534 colormap_info->colors=(XColor *) RelinquishMagickMemory(
4535 colormap_info->colors);
4536 colormap_info=(ColormapInfo *) RelinquishMagickMemory(colormap_info);
4540 Relinquish resources and restore initial state.
4542 window_info=(WindowInfo *) RelinquishMagickMemory(window_info);
4545 colormap_info=(ColormapInfo *) NULL;
4548 return((Image *) NULL);
4552 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4556 % X G e t W i n d o w I n f o %
4560 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4562 % XGetWindowInfo() initializes the XWindowInfo structure.
4564 % The format of the XGetWindowInfo method is:
4566 % void XGetWindowInfo(Display *display,XVisualInfo *visual_info,
4567 % XStandardColormap *map_info,XPixelInfo *pixel,XFontStruct *font_info,
4568 % XResourceInfo *resource_info,XWindowInfo *window)
4569 % resource_info,window)
4571 % A description of each parameter follows:
4573 % o display: Specifies a connection to an X server; returned from
4576 % o visual_info: Specifies a pointer to a X11 XVisualInfo structure;
4577 % returned from XGetVisualInfo.
4579 % o map_info: If map_type is specified, this structure is initialized
4580 % with info from the Standard Colormap.
4582 % o pixel: Specifies a pointer to a XPixelInfo structure.
4584 % o font_info: Specifies a pointer to a XFontStruct structure.
4586 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
4589 MagickPrivate void XGetWindowInfo(Display *display,XVisualInfo *visual_info,
4590 XStandardColormap *map_info,XPixelInfo *pixel,XFontStruct *font_info,
4591 XResourceInfo *resource_info,XWindowInfo *window)
4594 Initialize window info.
4596 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
4597 assert(display != (Display *) NULL);
4598 assert(visual_info != (XVisualInfo *) NULL);
4599 assert(map_info != (XStandardColormap *) NULL);
4600 assert(pixel != (XPixelInfo *) NULL);
4601 assert(resource_info != (XResourceInfo *) NULL);
4602 assert(window != (XWindowInfo *) NULL);
4603 if (window->id != (Window) NULL)
4605 if (window->cursor != (Cursor) NULL)
4606 (void) XFreeCursor(display,window->cursor);
4607 if (window->busy_cursor != (Cursor) NULL)
4608 (void) XFreeCursor(display,window->busy_cursor);
4609 if (window->highlight_stipple != (Pixmap) NULL)
4610 (void) XFreePixmap(display,window->highlight_stipple);
4611 if (window->shadow_stipple != (Pixmap) NULL)
4612 (void) XFreePixmap(display,window->shadow_stipple);
4613 if (window->name == (char *) NULL)
4614 window->name=AcquireString("");
4615 if (window->icon_name == (char *) NULL)
4616 window->icon_name=AcquireString("");
4621 Initialize these attributes just once.
4623 window->id=(Window) NULL;
4624 if (window->name == (char *) NULL)
4625 window->name=AcquireString("");
4626 if (window->icon_name == (char *) NULL)
4627 window->icon_name=AcquireString("");
4628 window->x=XDisplayWidth(display,visual_info->screen) >> 1;
4629 window->y=XDisplayWidth(display,visual_info->screen) >> 1;
4630 window->ximage=(XImage *) NULL;
4631 window->matte_image=(XImage *) NULL;
4632 window->pixmap=(Pixmap) NULL;
4633 window->matte_pixmap=(Pixmap) NULL;
4634 window->mapped=MagickFalse;
4635 window->stasis=MagickFalse;
4636 window->shared_memory=MagickTrue;
4637 window->segment_info=(void *) NULL;
4638 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
4643 if (window->segment_info == (void *) NULL)
4644 window->segment_info=AcquireQuantumMemory(2,sizeof(*segment_info));
4645 segment_info=(XShmSegmentInfo *) window->segment_info;
4646 segment_info[0].shmid=(-1);
4647 segment_info[0].shmaddr=(char *) NULL;
4648 segment_info[1].shmid=(-1);
4649 segment_info[1].shmaddr=(char *) NULL;
4654 Initialize these attributes every time function is called.
4656 window->screen=visual_info->screen;
4657 window->root=XRootWindow(display,visual_info->screen);
4658 window->visual=visual_info->visual;
4659 window->storage_class=(unsigned int) visual_info->klass;
4660 window->depth=(unsigned int) visual_info->depth;
4661 window->visual_info=visual_info;
4662 window->map_info=map_info;
4663 window->pixel_info=pixel;
4664 window->font_info=font_info;
4665 window->cursor=XCreateFontCursor(display,XC_left_ptr);
4666 window->busy_cursor=XCreateFontCursor(display,XC_watch);
4667 window->geometry=(char *) NULL;
4668 window->icon_geometry=(char *) NULL;
4669 if (resource_info->icon_geometry != (char *) NULL)
4670 (void) CloneString(&window->icon_geometry,resource_info->icon_geometry);
4671 window->crop_geometry=(char *) NULL;
4672 window->flags=(size_t) PSize;
4675 window->min_width=1;
4676 window->min_height=1;
4677 window->width_inc=1;
4678 window->height_inc=1;
4679 window->border_width=resource_info->border_width;
4680 window->annotate_context=pixel->annotate_context;
4681 window->highlight_context=pixel->highlight_context;
4682 window->widget_context=pixel->widget_context;
4683 window->shadow_stipple=(Pixmap) NULL;
4684 window->highlight_stipple=(Pixmap) NULL;
4685 window->use_pixmap=MagickTrue;
4686 window->immutable=MagickFalse;
4687 window->shape=MagickFalse;
4689 window->mask=(int) (CWBackingStore | CWBackPixel | CWBackPixmap |
4690 CWBitGravity | CWBorderPixel | CWColormap | CWCursor | CWDontPropagate |
4691 CWEventMask | CWOverrideRedirect | CWSaveUnder | CWWinGravity);
4692 window->attributes.background_pixel=pixel->background_color.pixel;
4693 window->attributes.background_pixmap=(Pixmap) NULL;
4694 window->attributes.bit_gravity=ForgetGravity;
4695 window->attributes.backing_store=WhenMapped;
4696 window->attributes.save_under=MagickTrue;
4697 window->attributes.border_pixel=pixel->border_color.pixel;
4698 window->attributes.colormap=map_info->colormap;
4699 window->attributes.cursor=window->cursor;
4700 window->attributes.do_not_propagate_mask=NoEventMask;
4701 window->attributes.event_mask=NoEventMask;
4702 window->attributes.override_redirect=MagickFalse;
4703 window->attributes.win_gravity=NorthWestGravity;
4704 window->orphan=MagickFalse;
4708 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4712 % X H i g h l i g h t E l l i p s e %
4716 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4718 % XHighlightEllipse() puts a border on the X server around a region defined by
4721 % The format of the XHighlightEllipse method is:
4723 % void XHighlightEllipse(Display *display,Window window,
4724 % GC annotate_context,const RectangleInfo *highlight_info)
4726 % A description of each parameter follows:
4728 % o display: Specifies a connection to an X server; returned from
4731 % o window: Specifies a pointer to a Window structure.
4733 % o annotate_context: Specifies a pointer to a GC structure.
4735 % o highlight_info: Specifies a pointer to a RectangleInfo structure. It
4736 % contains the extents of any highlighting rectangle.
4739 MagickPrivate void XHighlightEllipse(Display *display,Window window,
4740 GC annotate_context,const RectangleInfo *highlight_info)
4742 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
4743 assert(display != (Display *) NULL);
4744 assert(window != (Window) NULL);
4745 assert(annotate_context != (GC) NULL);
4746 assert(highlight_info != (RectangleInfo *) NULL);
4747 if ((highlight_info->width < 4) || (highlight_info->height < 4))
4749 (void) XDrawArc(display,window,annotate_context,(int) highlight_info->x,
4750 (int) highlight_info->y,(unsigned int) highlight_info->width-1,
4751 (unsigned int) highlight_info->height-1,0,360*64);
4752 (void) XDrawArc(display,window,annotate_context,(int) highlight_info->x+1,
4753 (int) highlight_info->y+1,(unsigned int) highlight_info->width-3,
4754 (unsigned int) highlight_info->height-3,0,360*64);
4758 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4762 % X H i g h l i g h t L i n e %
4766 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4768 % XHighlightLine() puts a border on the X server around a region defined by
4771 % The format of the XHighlightLine method is:
4773 % void XHighlightLine(Display *display,Window window,GC annotate_context,
4774 % const XSegment *highlight_info)
4776 % A description of each parameter follows:
4778 % o display: Specifies a connection to an X server; returned from
4781 % o window: Specifies a pointer to a Window structure.
4783 % o annotate_context: Specifies a pointer to a GC structure.
4785 % o highlight_info: Specifies a pointer to a RectangleInfo structure. It
4786 % contains the extents of any highlighting rectangle.
4789 MagickPrivate void XHighlightLine(Display *display,Window window,
4790 GC annotate_context,const XSegment *highlight_info)
4792 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
4793 assert(display != (Display *) NULL);
4794 assert(window != (Window) NULL);
4795 assert(annotate_context != (GC) NULL);
4796 assert(highlight_info != (XSegment *) NULL);
4797 (void) XDrawLine(display,window,annotate_context,highlight_info->x1,
4798 highlight_info->y1,highlight_info->x2,highlight_info->y2);
4802 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4806 % X H i g h l i g h t R e c t a n g l e %
4810 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4812 % XHighlightRectangle() puts a border on the X server around a region defined
4813 % by highlight_info.
4815 % The format of the XHighlightRectangle method is:
4817 % void XHighlightRectangle(Display *display,Window window,
4818 % GC annotate_context,const RectangleInfo *highlight_info)
4820 % A description of each parameter follows:
4822 % o display: Specifies a connection to an X server; returned from
4825 % o window: Specifies a pointer to a Window structure.
4827 % o annotate_context: Specifies a pointer to a GC structure.
4829 % o highlight_info: Specifies a pointer to a RectangleInfo structure. It
4830 % contains the extents of any highlighting rectangle.
4833 MagickPrivate void XHighlightRectangle(Display *display,Window window,
4834 GC annotate_context,const RectangleInfo *highlight_info)
4836 assert(display != (Display *) NULL);
4837 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
4838 assert(window != (Window) NULL);
4839 assert(annotate_context != (GC) NULL);
4840 assert(highlight_info != (RectangleInfo *) NULL);
4841 if ((highlight_info->width < 4) || (highlight_info->height < 4))
4843 (void) XDrawRectangle(display,window,annotate_context,(int) highlight_info->x,
4844 (int) highlight_info->y,(unsigned int) highlight_info->width-1,
4845 (unsigned int) highlight_info->height-1);
4846 (void) XDrawRectangle(display,window,annotate_context,(int) highlight_info->x+
4847 1,(int) highlight_info->y+1,(unsigned int) highlight_info->width-3,
4848 (unsigned int) highlight_info->height-3);
4852 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4856 % X I m p o r t I m a g e %
4860 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4862 % XImportImage() reads an image from an X window.
4864 % The format of the XImportImage method is:
4866 % Image *XImportImage(const ImageInfo *image_info,XImportInfo *ximage_info,
4867 % ExceptionInfo *exception)
4869 % A description of each parameter follows:
4871 % o image_info: the image info.
4873 % o ximage_info: Specifies a pointer to an XImportInfo structure.
4875 % o exception: return any errors or warnings in this structure.
4878 MagickExport Image *XImportImage(const ImageInfo *image_info,
4879 XImportInfo *ximage_info,ExceptionInfo *exception)
4912 Open X server connection.
4914 assert(image_info != (const ImageInfo *) NULL);
4915 assert(image_info->signature == MagickSignature);
4916 if (image_info->debug != MagickFalse)
4917 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
4918 image_info->filename);
4919 assert(ximage_info != (XImportInfo *) NULL);
4920 display=XOpenDisplay(image_info->server_name);
4921 if (display == (Display *) NULL)
4923 ThrowXWindowFatalException(XServerError,"UnableToOpenXServer",
4924 XDisplayName(image_info->server_name));
4925 return((Image *) NULL);
4928 Set our forgiving exception handler.
4930 (void) XSetErrorHandler(XError);
4932 Select target window.
4938 root=XRootWindow(display,XDefaultScreen(display));
4939 target=(Window) NULL;
4940 if ((image_info->filename != (char *) NULL) &&
4941 (*image_info->filename != '\0'))
4943 if (LocaleCompare(image_info->filename,"root") == 0)
4948 Select window by ID or name.
4950 if (isdigit((unsigned char) *image_info->filename) != 0)
4951 target=XWindowByID(display,root,(Window)
4952 strtol(image_info->filename,(char **) NULL,0));
4953 if (target == (Window) NULL)
4954 target=XWindowByName(display,root,image_info->filename);
4955 if (target == (Window) NULL)
4956 ThrowXWindowFatalException(XServerError,
4957 "NoWindowWithSpecifiedIDExists",image_info->filename);
4961 If target window is not defined, interactively select one.
4963 prior_target=target;
4964 if (target == (Window) NULL)
4965 target=XSelectWindow(display,&crop_info);
4966 if (target == (Window) NULL)
4967 ThrowXWindowFatalException(XServerError,"UnableToReadXWindowImage",
4968 image_info->filename);
4969 client=target; /* obsolete */
4975 status=XGetGeometry(display,target,&root,&x,&x,&d,&d,&d,&d);
4976 if (status != False)
4984 Find window manager frame.
4986 status=XQueryTree(display,target,&root,&parent,&children,&d);
4987 if ((status != False) && (children != (Window *) NULL))
4988 (void) XFree((char *) children);
4989 if ((status == False) || (parent == (Window) NULL) ||
4997 client=XClientWindow(display,target);
4998 if (ximage_info->frame == MagickFalse)
5000 if ((ximage_info->frame == MagickFalse) &&
5001 (prior_target != MagickFalse))
5002 target=prior_target;
5005 if (ximage_info->screen)
5017 Obtain window image directly from screen.
5019 status=XGetWindowAttributes(display,target,&window_attributes);
5020 if (status == False)
5022 ThrowXWindowFatalException(XServerError,
5023 "UnableToReadXWindowAttributes",image_info->filename);
5024 (void) XCloseDisplay(display);
5025 return((Image *) NULL);
5027 (void) XTranslateCoordinates(display,target,root,0,0,&x,&y,&child);
5028 crop_info.x=(ssize_t) x;
5029 crop_info.y=(ssize_t) y;
5030 crop_info.width=(size_t) window_attributes.width;
5031 crop_info.height=(size_t) window_attributes.height;
5032 if (ximage_info->borders != 0)
5035 Include border in image.
5037 crop_info.x-=window_attributes.border_width;
5038 crop_info.y-=window_attributes.border_width;
5039 crop_info.width+=window_attributes.border_width << 1;
5040 crop_info.height+=window_attributes.border_width << 1;
5045 If WM_COLORMAP_WINDOWS property is set or multiple colormaps, descend.
5048 status=XGetWMColormapWindows(display,target,&children,&number_windows);
5049 if ((status == True) && (number_windows > 0))
5051 ximage_info->descend=MagickTrue;
5052 (void) XFree ((char *) children);
5054 colormaps=XListInstalledColormaps(display,target,&number_colormaps);
5055 if (number_colormaps > 0)
5057 if (number_colormaps > 1)
5058 ximage_info->descend=MagickTrue;
5059 (void) XFree((char *) colormaps);
5062 Alert the user not to alter the screen.
5064 if (ximage_info->silent == MagickFalse)
5065 (void) XBell(display,0);
5067 Get image by window id.
5069 (void) XGrabServer(display);
5070 image=XGetWindowImage(display,target,ximage_info->borders,
5071 ximage_info->descend ? 1U : 0U,exception);
5072 (void) XUngrabServer(display);
5073 if (image == (Image *) NULL)
5074 ThrowXWindowFatalException(XServerError,"UnableToReadXWindowImage",
5075 image_info->filename)
5078 (void) CopyMagickString(image->filename,image_info->filename,
5080 if ((crop_info.width != 0) && (crop_info.height != 0))
5087 Crop image as defined by the cropping rectangle.
5089 clone_image=CloneImage(image,0,0,MagickTrue,exception);
5090 if (clone_image != (Image *) NULL)
5092 crop_image=CropImage(clone_image,&crop_info,exception);
5093 if (crop_image != (Image *) NULL)
5095 image=DestroyImage(image);
5100 status=XGetWMName(display,target,&window_name);
5103 if ((image_info->filename != (char *) NULL) &&
5104 (*image_info->filename == '\0'))
5105 (void) CopyMagickString(image->filename,(char *) window_name.value,
5106 (size_t) window_name.nitems+1);
5107 (void) XFree((void *) window_name.value);
5110 if (ximage_info->silent == MagickFalse)
5113 Alert the user we're done.
5115 (void) XBell(display,0);
5116 (void) XBell(display,0);
5118 (void) XCloseDisplay(display);
5123 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5127 % X I n i t i a l i z e W i n d o w s %
5131 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5133 % XInitializeWindows() initializes the XWindows structure.
5135 % The format of the XInitializeWindows method is:
5137 % XWindows *XInitializeWindows(Display *display,
5138 % XResourceInfo *resource_info)
5140 % A description of each parameter follows:
5142 % o windows: XInitializeWindows returns a pointer to a XWindows structure.
5144 % o display: Specifies a connection to an X server; returned from
5147 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
5150 MagickPrivate XWindows *XInitializeWindows(Display *display,
5151 XResourceInfo *resource_info)
5160 Allocate windows structure.
5162 windows=(XWindows *) AcquireMagickMemory(sizeof(*windows));
5163 if (windows == (XWindows *) NULL)
5165 ThrowXWindowFatalException(XServerFatalError,"MemoryAllocationFailed",
5167 return((XWindows *) NULL);
5169 (void) ResetMagickMemory(windows,0,sizeof(*windows));
5170 windows->pixel_info=(XPixelInfo *) AcquireMagickMemory(
5171 sizeof(*windows->pixel_info));
5172 windows->icon_pixel=(XPixelInfo *) AcquireMagickMemory(
5173 sizeof(*windows->icon_pixel));
5174 windows->icon_resources=(XResourceInfo *) AcquireMagickMemory(
5175 sizeof(*windows->icon_resources));
5176 if ((windows->pixel_info == (XPixelInfo *) NULL) ||
5177 (windows->icon_pixel == (XPixelInfo *) NULL) ||
5178 (windows->icon_resources == (XResourceInfo *) NULL))
5180 ThrowXWindowFatalException(XServerFatalError,"MemoryAllocationFailed",
5182 return((XWindows *) NULL);
5185 Initialize windows structure.
5187 windows->display=display;
5188 windows->wm_protocols=XInternAtom(display,"WM_PROTOCOLS",MagickFalse);
5189 windows->wm_delete_window=XInternAtom(display,"WM_DELETE_WINDOW",MagickFalse);
5190 windows->wm_take_focus=XInternAtom(display,"WM_TAKE_FOCUS",MagickFalse);
5191 windows->im_protocols=XInternAtom(display,"IM_PROTOCOLS",MagickFalse);
5192 windows->im_remote_command=
5193 XInternAtom(display,"IM_REMOTE_COMMAND",MagickFalse);
5194 windows->im_update_widget=XInternAtom(display,"IM_UPDATE_WIDGET",MagickFalse);
5195 windows->im_update_colormap=
5196 XInternAtom(display,"IM_UPDATE_COLORMAP",MagickFalse);
5197 windows->im_former_image=XInternAtom(display,"IM_FORMER_IMAGE",MagickFalse);
5198 windows->im_next_image=XInternAtom(display,"IM_NEXT_IMAGE",MagickFalse);
5199 windows->im_retain_colors=XInternAtom(display,"IM_RETAIN_COLORS",MagickFalse);
5200 windows->im_exit=XInternAtom(display,"IM_EXIT",MagickFalse);
5201 windows->dnd_protocols=XInternAtom(display,"DndProtocol",MagickFalse);
5202 #if defined(MAGICKCORE_WINDOWS_SUPPORT)
5203 (void) XSynchronize(display,IsWindows95());
5205 if (IsEventLogging())
5207 (void) XSynchronize(display,MagickTrue);
5208 (void) LogMagickEvent(X11Event,GetMagickModule(),"Version: %s",
5209 GetMagickVersion((size_t *) NULL));
5210 (void) LogMagickEvent(X11Event,GetMagickModule(),"Protocols:");
5211 (void) LogMagickEvent(X11Event,GetMagickModule(),
5212 " Window Manager: 0x%lx",windows->wm_protocols);
5213 (void) LogMagickEvent(X11Event,GetMagickModule(),
5214 " delete window: 0x%lx",windows->wm_delete_window);
5215 (void) LogMagickEvent(X11Event,GetMagickModule()," take focus: 0x%lx",
5216 windows->wm_take_focus);
5217 (void) LogMagickEvent(X11Event,GetMagickModule()," ImageMagick: 0x%lx",
5218 windows->im_protocols);
5219 (void) LogMagickEvent(X11Event,GetMagickModule(),
5220 " remote command: 0x%lx",windows->im_remote_command);
5221 (void) LogMagickEvent(X11Event,GetMagickModule(),
5222 " update widget: 0x%lx",windows->im_update_widget);
5223 (void) LogMagickEvent(X11Event,GetMagickModule(),
5224 " update colormap: 0x%lx",windows->im_update_colormap);
5225 (void) LogMagickEvent(X11Event,GetMagickModule(),
5226 " former image: 0x%lx",windows->im_former_image);
5227 (void) LogMagickEvent(X11Event,GetMagickModule()," next image: 0x%lx",
5228 windows->im_next_image);
5229 (void) LogMagickEvent(X11Event,GetMagickModule(),
5230 " retain colors: 0x%lx",windows->im_retain_colors);
5231 (void) LogMagickEvent(X11Event,GetMagickModule()," exit: 0x%lx",
5233 (void) LogMagickEvent(X11Event,GetMagickModule()," Drag and Drop: 0x%lx",
5234 windows->dnd_protocols);
5237 Allocate standard colormap.
5239 windows->map_info=XAllocStandardColormap();
5240 windows->icon_map=XAllocStandardColormap();
5241 if ((windows->map_info == (XStandardColormap *) NULL) ||
5242 (windows->icon_map == (XStandardColormap *) NULL))
5243 ThrowXWindowFatalException(ResourceLimitFatalError,
5244 "MemoryAllocationFailed","...");
5245 windows->map_info->colormap=(Colormap) NULL;
5246 windows->icon_map->colormap=(Colormap) NULL;
5247 windows->pixel_info->pixels=(unsigned long *) NULL;
5248 windows->pixel_info->annotate_context=(GC) NULL;
5249 windows->pixel_info->highlight_context=(GC) NULL;
5250 windows->pixel_info->widget_context=(GC) NULL;
5251 windows->font_info=(XFontStruct *) NULL;
5252 windows->icon_pixel->annotate_context=(GC) NULL;
5253 windows->icon_pixel->pixels=(unsigned long *) NULL;
5257 *windows->icon_resources=(*resource_info);
5258 windows->icon_resources->visual_type=(char *) "default";
5259 windows->icon_resources->colormap=SharedColormap;
5260 windows->visual_info=
5261 XBestVisualInfo(display,windows->map_info,resource_info);
5262 windows->icon_visual=
5263 XBestVisualInfo(display,windows->icon_map,windows->icon_resources);
5264 if ((windows->visual_info == (XVisualInfo *) NULL) ||
5265 (windows->icon_visual == (XVisualInfo *) NULL))
5266 ThrowXWindowFatalException(XServerFatalError,"UnableToGetVisual",
5267 resource_info->visual_type);
5268 if (IsEventLogging())
5270 (void) LogMagickEvent(X11Event,GetMagickModule(),"Visual:");
5271 (void) LogMagickEvent(X11Event,GetMagickModule()," visual id: 0x%lx",
5272 windows->visual_info->visualid);
5273 (void) LogMagickEvent(X11Event,GetMagickModule()," class: %s",
5274 XVisualClassName(windows->visual_info->klass));
5275 (void) LogMagickEvent(X11Event,GetMagickModule()," depth: %d planes",
5276 windows->visual_info->depth);
5277 (void) LogMagickEvent(X11Event,GetMagickModule(),
5278 " size of colormap: %d entries",windows->visual_info->colormap_size);
5279 (void) LogMagickEvent(X11Event,GetMagickModule(),
5280 " red, green, blue masks: 0x%lx 0x%lx 0x%lx",
5281 windows->visual_info->red_mask,windows->visual_info->green_mask,
5282 windows->visual_info->blue_mask);
5283 (void) LogMagickEvent(X11Event,GetMagickModule(),
5284 " significant bits in color: %d bits",
5285 windows->visual_info->bits_per_rgb);
5288 Allocate class and manager hints.
5290 windows->class_hints=XAllocClassHint();
5291 windows->manager_hints=XAllocWMHints();
5292 if ((windows->class_hints == (XClassHint *) NULL) ||
5293 (windows->manager_hints == (XWMHints *) NULL))
5294 ThrowXWindowFatalException(ResourceLimitFatalError,
5295 "MemoryAllocationFailed","...");
5297 Determine group leader if we have one.
5299 root_window=XRootWindow(display,windows->visual_info->screen);
5300 windows->group_leader.id=(Window) NULL;
5301 if (resource_info->window_group != (char *) NULL)
5303 if (isdigit((unsigned char) *resource_info->window_group) != 0)
5304 windows->group_leader.id=XWindowByID(display,root_window,(Window)
5305 strtol((char *) resource_info->window_group,(char **) NULL,0));
5306 if (windows->group_leader.id == (Window) NULL)
5307 windows->group_leader.id=
5308 XWindowByName(display,root_window,resource_info->window_group);
5314 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5318 % X M a k e C u r s o r %
5322 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5324 % XMakeCursor() creates a crosshairs X11 cursor.
5326 % The format of the XMakeCursor method is:
5328 % Cursor XMakeCursor(Display *display,Window window,Colormap colormap,
5329 % char *background_color,char *foreground_color)
5331 % A description of each parameter follows:
5333 % o display: Specifies a connection to an X server; returned from
5336 % o window: Specifies the ID of the window for which the cursor is
5339 % o colormap: Specifies the ID of the colormap from which the background
5340 % and foreground color will be retrieved.
5342 % o background_color: Specifies the color to use for the cursor background.
5344 % o foreground_color: Specifies the color to use for the cursor foreground.
5347 MagickPrivate Cursor XMakeCursor(Display *display,Window window,
5348 Colormap colormap,char *background_color,char *foreground_color)
5350 #define scope_height 17
5351 #define scope_x_hot 8
5352 #define scope_y_hot 8
5353 #define scope_width 17
5355 static const unsigned char
5358 0x80, 0x03, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02,
5359 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x7f,
5360 0xfc, 0x01, 0x01, 0x00, 0x01, 0x7f, 0xfc, 0x01, 0x80, 0x02, 0x00,
5361 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02,
5362 0x00, 0x80, 0x02, 0x00, 0x80, 0x03, 0x00
5366 0xc0, 0x07, 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x06, 0x00, 0xc0, 0x06,
5367 0x00, 0xc0, 0x06, 0x00, 0xc0, 0x06, 0x00, 0xff, 0xfe, 0x01, 0x7f,
5368 0xfc, 0x01, 0x03, 0x80, 0x01, 0x7f, 0xfc, 0x01, 0xff, 0xfe, 0x01,
5369 0xc0, 0x06, 0x00, 0xc0, 0x06, 0x00, 0xc0, 0x06, 0x00, 0xc0, 0x06,
5370 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x07, 0x00
5384 assert(display != (Display *) NULL);
5385 assert(window != (Window) NULL);
5386 assert(colormap != (Colormap) NULL);
5387 assert(background_color != (char *) NULL);
5388 assert(foreground_color != (char *) NULL);
5389 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",background_color);
5390 source=XCreateBitmapFromData(display,window,(char *) scope_bits,scope_width,
5392 mask=XCreateBitmapFromData(display,window,(char *) scope_mask_bits,
5393 scope_width,scope_height);
5394 if ((source == (Pixmap) NULL) || (mask == (Pixmap) NULL))
5396 ThrowXWindowFatalException(XServerError,"UnableToCreatePixmap","...");
5397 return((Cursor) NULL);
5399 (void) XParseColor(display,colormap,background_color,&background);
5400 (void) XParseColor(display,colormap,foreground_color,&foreground);
5401 cursor=XCreatePixmapCursor(display,source,mask,&foreground,&background,
5402 scope_x_hot,scope_y_hot);
5403 (void) XFreePixmap(display,source);
5404 (void) XFreePixmap(display,mask);
5409 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5413 % X M a k e I m a g e %
5417 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5419 % XMakeImage() creates an X11 image. If the image size differs from the X11
5420 % image size, the image is first resized.
5422 % The format of the XMakeImage method is:
5424 % MagickBooleanType XMakeImage(Display *display,
5425 % const XResourceInfo *resource_info,XWindowInfo *window,Image *image,
5426 % unsigned int width,unsigned int height,ExceptionInfo *exception)
5428 % A description of each parameter follows:
5430 % o display: Specifies a connection to an X server; returned from
5433 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
5435 % o window: Specifies a pointer to a XWindowInfo structure.
5437 % o image: the image.
5439 % o width: Specifies the width in pixels of the rectangular area to
5442 % o height: Specifies the height in pixels of the rectangular area to
5445 % o exception: return any errors or warnings in this structure.
5448 MagickPrivate MagickBooleanType XMakeImage(Display *display,
5449 const XResourceInfo *resource_info,XWindowInfo *window,Image *image,
5450 unsigned int width,unsigned int height,ExceptionInfo *exception)
5452 #define CheckOverflowException(length,width,height) \
5453 (((height) != 0) && ((length)/((size_t) height) != ((size_t) width)))
5466 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
5467 assert(display != (Display *) NULL);
5468 assert(resource_info != (XResourceInfo *) NULL);
5469 assert(window != (XWindowInfo *) NULL);
5471 assert(height != 0);
5472 if ((window->width == 0) || (window->height == 0))
5473 return(MagickFalse);
5475 Apply user transforms to the image.
5477 (void) XCheckDefineCursor(display,window->id,window->busy_cursor);
5478 (void) XFlush(display);
5479 depth=(int) window->depth;
5480 if (window->destroy)
5481 window->image=DestroyImage(window->image);
5482 window->image=image;
5483 window->destroy=MagickFalse;
5484 if (window->image != (Image *) NULL)
5486 if (window->crop_geometry != (char *) NULL)
5497 window->image->page.x=0;
5498 window->image->page.y=0;
5499 (void) ParsePageGeometry(window->image,window->crop_geometry,
5500 &crop_info,exception);
5501 crop_image=CropImage(window->image,&crop_info,exception);
5502 if (crop_image != (Image *) NULL)
5504 if (window->image != image)
5505 window->image=DestroyImage(window->image);
5506 window->image=crop_image;
5507 window->destroy=MagickTrue;
5510 if ((width != (unsigned int) window->image->columns) ||
5511 (height != (unsigned int) window->image->rows))
5519 resize_image=NewImageList();
5520 if (window->pixel_info->colors != 0)
5521 resize_image=SampleImage(window->image,width,height,exception);
5523 resize_image=ThumbnailImage(window->image,width,height,exception);
5524 if (resize_image != (Image *) NULL)
5526 if (window->image != image)
5527 window->image=DestroyImage(window->image);
5528 window->image=resize_image;
5529 window->destroy=MagickTrue;
5532 width=(unsigned int) window->image->columns;
5533 assert((size_t) width == window->image->columns);
5534 height=(unsigned int) window->image->rows;
5535 assert((size_t) height == window->image->rows);
5540 ximage=(XImage *) NULL;
5541 format=(depth == 1) ? XYBitmap : ZPixmap;
5542 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
5543 if (window->shared_memory != MagickFalse)
5548 segment_info=(XShmSegmentInfo *) window->segment_info;
5549 segment_info[1].shmid=(-1);
5550 segment_info[1].shmaddr=(char *) NULL;
5551 ximage=XShmCreateImage(display,window->visual,(unsigned int) depth,format,
5552 (char *) NULL,&segment_info[1],width,height);
5553 if (ximage == (XImage *) NULL)
5554 window->shared_memory=MagickFalse;
5555 length=(size_t) ximage->bytes_per_line*ximage->height;
5556 if (CheckOverflowException(length,ximage->bytes_per_line,ximage->height))
5557 window->shared_memory=MagickFalse;
5558 if (window->shared_memory != MagickFalse)
5559 segment_info[1].shmid=shmget(IPC_PRIVATE,length,IPC_CREAT | 0777);
5560 if (window->shared_memory != MagickFalse)
5561 segment_info[1].shmaddr=(char *) shmat(segment_info[1].shmid,0,0);
5562 if (segment_info[1].shmid < 0)
5563 window->shared_memory=MagickFalse;
5564 if (window->shared_memory != MagickFalse)
5565 (void) shmctl(segment_info[1].shmid,IPC_RMID,0);
5568 if (ximage != (XImage *) NULL)
5569 XDestroyImage(ximage);
5570 ximage=(XImage *) NULL;
5571 if (segment_info[1].shmaddr)
5573 (void) shmdt(segment_info[1].shmaddr);
5574 segment_info[1].shmaddr=(char *) NULL;
5576 if (segment_info[1].shmid >= 0)
5578 (void) shmctl(segment_info[1].shmid,IPC_RMID,0);
5579 segment_info[1].shmid=(-1);
5585 Allocate X image pixel data.
5587 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
5588 if (window->shared_memory)
5596 (void) XSync(display,MagickFalse);
5597 xerror_alert=MagickFalse;
5598 segment_info=(XShmSegmentInfo *) window->segment_info;
5599 ximage->data=segment_info[1].shmaddr;
5600 segment_info[1].readOnly=MagickFalse;
5601 status=XShmAttach(display,&segment_info[1]);
5602 if (status != False)
5603 (void) XSync(display,MagickFalse);
5604 if ((status == False) || (xerror_alert != MagickFalse))
5606 window->shared_memory=MagickFalse;
5607 if (status != False)
5608 XShmDetach(display,&segment_info[1]);
5609 if (ximage != (XImage *) NULL)
5612 XDestroyImage(ximage);
5613 ximage=(XImage *) NULL;
5615 if (segment_info[1].shmid >= 0)
5617 if (segment_info[1].shmaddr != NULL)
5618 (void) shmdt(segment_info[1].shmaddr);
5619 (void) shmctl(segment_info[1].shmid,IPC_RMID,0);
5620 segment_info[1].shmid=(-1);
5621 segment_info[1].shmaddr=(char *) NULL;
5626 if (window->shared_memory == MagickFalse)
5627 ximage=XCreateImage(display,window->visual,(unsigned int) depth,format,0,
5628 (char *) NULL,width,height,XBitmapPad(display),0);
5629 if (ximage == (XImage *) NULL)
5632 Unable to create X image.
5634 (void) XCheckDefineCursor(display,window->id,window->cursor);
5635 return(MagickFalse);
5637 length=(size_t) ximage->bytes_per_line*ximage->height;
5638 if (IsEventLogging())
5640 (void) LogMagickEvent(X11Event,GetMagickModule(),"XImage:");
5641 (void) LogMagickEvent(X11Event,GetMagickModule()," width, height: %dx%d",
5642 ximage->width,ximage->height);
5643 (void) LogMagickEvent(X11Event,GetMagickModule()," format: %d",
5645 (void) LogMagickEvent(X11Event,GetMagickModule()," byte order: %d",
5646 ximage->byte_order);
5647 (void) LogMagickEvent(X11Event,GetMagickModule(),
5648 " bitmap unit, bit order, pad: %d %d %d",ximage->bitmap_unit,
5649 ximage->bitmap_bit_order,ximage->bitmap_pad);
5650 (void) LogMagickEvent(X11Event,GetMagickModule()," depth: %d",
5652 (void) LogMagickEvent(X11Event,GetMagickModule()," bytes per line: %d",
5653 ximage->bytes_per_line);
5654 (void) LogMagickEvent(X11Event,GetMagickModule()," bits per pixel: %d",
5655 ximage->bits_per_pixel);
5656 (void) LogMagickEvent(X11Event,GetMagickModule(),
5657 " red, green, blue masks: 0x%lx 0x%lx 0x%lx",ximage->red_mask,
5658 ximage->green_mask,ximage->blue_mask);
5660 if (window->shared_memory == MagickFalse)
5662 if (ximage->format != XYBitmap)
5663 ximage->data=(char *) AcquireQuantumMemory((size_t)
5664 ximage->bytes_per_line,(size_t) ximage->height);
5666 ximage->data=(char *) AcquireQuantumMemory((size_t)
5667 ximage->bytes_per_line*ximage->depth,(size_t) ximage->height);
5669 if (ximage->data == (char *) NULL)
5672 Unable to allocate pixel data.
5674 XDestroyImage(ximage);
5675 ximage=(XImage *) NULL;
5676 (void) XCheckDefineCursor(display,window->id,window->cursor);
5677 return(MagickFalse);
5679 if (window->ximage != (XImage *) NULL)
5682 Destroy previous X image.
5684 length=(size_t) window->ximage->bytes_per_line*window->ximage->height;
5685 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
5686 if (window->segment_info != (XShmSegmentInfo *) NULL)
5691 segment_info=(XShmSegmentInfo *) window->segment_info;
5692 if (segment_info[0].shmid >= 0)
5694 (void) XSync(display,MagickFalse);
5695 (void) XShmDetach(display,&segment_info[0]);
5696 (void) XSync(display,MagickFalse);
5697 if (segment_info[0].shmaddr != (char *) NULL)
5698 (void) shmdt(segment_info[0].shmaddr);
5699 (void) shmctl(segment_info[0].shmid,IPC_RMID,0);
5700 segment_info[0].shmid=(-1);
5701 segment_info[0].shmaddr=(char *) NULL;
5702 window->ximage->data=(char *) NULL;
5706 if (window->ximage->data != (char *) NULL)
5707 free(window->ximage->data);
5708 window->ximage->data=(char *) NULL;
5709 XDestroyImage(window->ximage);
5710 window->ximage=(XImage *) NULL;
5712 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
5713 if (window->segment_info != (XShmSegmentInfo *) NULL)
5718 segment_info=(XShmSegmentInfo *) window->segment_info;
5719 segment_info[0]=segment_info[1];
5722 window->ximage=ximage;
5723 matte_image=(XImage *) NULL;
5724 if ((window->shape != MagickFalse) && (window->image != (Image *) NULL))
5725 if ((window->image->alpha_trait == BlendPixelTrait) &&
5726 ((int) width <= XDisplayWidth(display,window->screen)) &&
5727 ((int) height <= XDisplayHeight(display,window->screen)))
5732 matte_image=XCreateImage(display,window->visual,1,XYBitmap,0,
5733 (char *) NULL,width,height,XBitmapPad(display),0);
5734 if (IsEventLogging())
5736 (void) LogMagickEvent(X11Event,GetMagickModule(),"Matte Image:");
5737 (void) LogMagickEvent(X11Event,GetMagickModule(),
5738 " width, height: %dx%d",matte_image->width,matte_image->height);
5740 if (matte_image != (XImage *) NULL)
5743 Allocate matte image pixel data.
5745 matte_image->data=(char *) AcquireQuantumMemory((size_t)
5746 matte_image->bytes_per_line*matte_image->depth,
5747 (size_t) matte_image->height);
5748 if (matte_image->data == (char *) NULL)
5750 XDestroyImage(matte_image);
5751 matte_image=(XImage *) NULL;
5755 if (window->matte_image != (XImage *) NULL)
5760 if (window->matte_image->data != (char *) NULL)
5761 free(window->matte_image->data);
5762 window->matte_image->data=(char *) NULL;
5763 XDestroyImage(window->matte_image);
5764 window->matte_image=(XImage *) NULL;
5766 window->matte_image=matte_image;
5767 if (window->matte_pixmap != (Pixmap) NULL)
5769 (void) XFreePixmap(display,window->matte_pixmap);
5770 window->matte_pixmap=(Pixmap) NULL;
5771 #if defined(MAGICKCORE_HAVE_SHAPE)
5772 if (window->shape != MagickFalse)
5773 XShapeCombineMask(display,window->id,ShapeBounding,0,0,None,ShapeSet);
5776 window->stasis=MagickFalse;
5778 Convert pixels to X image data.
5780 if (window->image != (Image *) NULL)
5782 if ((ximage->byte_order == LSBFirst) || ((ximage->format == XYBitmap) &&
5783 (ximage->bitmap_bit_order == LSBFirst)))
5784 XMakeImageLSBFirst(resource_info,window,window->image,ximage,
5785 matte_image,exception);
5787 XMakeImageMSBFirst(resource_info,window,window->image,ximage,
5788 matte_image,exception);
5790 if (window->matte_image != (XImage *) NULL)
5793 Create matte pixmap.
5795 window->matte_pixmap=XCreatePixmap(display,window->id,width,height,1);
5796 if (window->matte_pixmap != (Pixmap) NULL)
5805 Copy matte image to matte pixmap.
5807 context_values.background=0;
5808 context_values.foreground=1;
5809 graphics_context=XCreateGC(display,window->matte_pixmap,
5810 (size_t) (GCBackground | GCForeground),&context_values);
5811 (void) XPutImage(display,window->matte_pixmap,graphics_context,
5812 window->matte_image,0,0,0,0,width,height);
5813 (void) XFreeGC(display,graphics_context);
5814 #if defined(MAGICKCORE_HAVE_SHAPE)
5815 if (window->shape != MagickFalse)
5816 XShapeCombineMask(display,window->id,ShapeBounding,0,0,
5817 window->matte_pixmap,ShapeSet);
5821 (void) XMakePixmap(display,resource_info,window);
5825 (void) XCheckDefineCursor(display,window->id,window->cursor);
5830 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5834 + X M a k e I m a g e L S B F i r s t %
5838 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5840 % XMakeImageLSBFirst() initializes the pixel data of an X11 Image. The X image
5841 % pixels are copied in least-significant bit and byte first order. The
5842 % server's scanline pad is respected. Rather than using one or two general
5843 % cases, many special cases are found here to help speed up the image
5846 % The format of the XMakeImageLSBFirst method is:
5848 % void XMakeImageLSBFirst(Display *display,XWindows *windows,
5849 % ExceptionInfo *exception)
5851 % A description of each parameter follows:
5853 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
5855 % o window: Specifies a pointer to a XWindowInfo structure.
5857 % o image: the image.
5859 % o ximage: Specifies a pointer to a XImage structure; returned from
5862 % o matte_image: Specifies a pointer to a XImage structure; returned from
5865 % o exception: return any errors or warnings in this structure.
5868 static void XMakeImageLSBFirst(const XResourceInfo *resource_info,
5869 const XWindowInfo *window,Image *image,XImage *ximage,XImage *matte_image,
5870 ExceptionInfo *exception)
5881 register const Quantum
5887 register unsigned char
5904 assert(resource_info != (XResourceInfo *) NULL);
5905 assert(window != (XWindowInfo *) NULL);
5906 assert(image != (Image *) NULL);
5907 if (image->debug != MagickFalse)
5908 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
5910 if ((window->immutable == MagickFalse) &&
5911 (image->storage_class == DirectClass) && (image->alpha_trait == BlendPixelTrait))
5914 size[MaxTextExtent];
5922 image_info=AcquireImageInfo();
5923 (void) CopyMagickString(image_info->filename,
5924 resource_info->image_info->texture != (char *) NULL ?
5925 resource_info->image_info->texture : "pattern:checkerboard",
5927 (void) FormatLocaleString(size,MaxTextExtent,"%.20gx%.20g",(double)
5928 image->columns,(double) image->rows);
5929 image_info->size=ConstantString(size);
5930 pattern=ReadImage(image_info,exception);
5931 image_info=DestroyImageInfo(image_info);
5932 if (pattern != (Image *) NULL)
5934 canvas=CloneImage(image,0,0,MagickTrue,exception);
5935 if (canvas != (Image *) NULL)
5936 (void) CompositeImage(canvas,pattern,DstOverCompositeOp,MagickTrue,
5938 pattern=DestroyImage(pattern);
5941 scanline_pad=(unsigned int) (ximage->bytes_per_line-((ximage->width*
5942 ximage->bits_per_pixel) >> 3));
5943 map_info=window->map_info;
5944 pixels=window->pixel_info->pixels;
5945 q=(unsigned char *) ximage->data;
5947 canvas_view=AcquireVirtualCacheView(canvas,exception);
5948 if (ximage->format == XYBitmap)
5950 register unsigned short
5958 Convert canvas to big-endian bitmap.
5960 background=(unsigned char)
5961 (XPixelIntensity(&window->pixel_info->foreground_color) <
5962 XPixelIntensity(&window->pixel_info->background_color) ? 0x80 : 0x00);
5963 foreground=(unsigned char)
5964 (XPixelIntensity(&window->pixel_info->background_color) <
5965 XPixelIntensity(&window->pixel_info->foreground_color) ? 0x80 : 0x00);
5966 polarity=(unsigned short) ((GetPixelInfoIntensity(
5967 &canvas->colormap[0])) < (QuantumRange/2) ? 1 : 0);
5968 if (canvas->colors == 2)
5969 polarity=GetPixelInfoIntensity(&canvas->colormap[0]) <
5970 GetPixelInfoIntensity(&canvas->colormap[1]);
5971 for (y=0; y < (int) canvas->rows; y++)
5973 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,canvas->columns,1,
5975 if (p == (const Quantum *) NULL)
5979 for (x=0; x < (int) canvas->columns; x++)
5982 if (GetPixelIndex(canvas,p) == (Quantum) polarity)
5993 p+=GetPixelChannels(canvas);
6001 if (window->pixel_info->colors != 0)
6002 switch (ximage->bits_per_pixel)
6006 register unsigned int
6010 Convert to 2 bit color-mapped X canvas.
6012 for (y=0; y < (int) canvas->rows; y++)
6014 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6015 canvas->columns,1,exception);
6016 if (p == (const Quantum *) NULL)
6019 for (x=0; x < (int) canvas->columns; x++)
6021 pixel=pixels[(ssize_t) GetPixelIndex(canvas,p)] & 0x0f;
6026 *q=(unsigned char) pixel;
6032 *q|=(unsigned char) (pixel << 2);
6038 *q|=(unsigned char) (pixel << 4);
6044 *q|=(unsigned char) (pixel << 6);
6050 p+=GetPixelChannels(canvas);
6058 register unsigned int
6062 Convert to 4 bit color-mapped X canvas.
6064 for (y=0; y < (int) canvas->rows; y++)
6066 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6067 canvas->columns,1,exception);
6068 if (p == (const Quantum *) NULL)
6071 for (x=0; x < (int) canvas->columns; x++)
6073 pixel=pixels[(ssize_t) GetPixelIndex(canvas,p)] & 0xf;
6078 *q=(unsigned char) pixel;
6084 *q|=(unsigned char) (pixel << 4);
6090 p+=GetPixelChannels(canvas);
6100 Convert to 8 bit color-mapped X canvas.
6102 if (resource_info->color_recovery &&
6103 resource_info->quantize_info->dither_method != NoDitherMethod)
6105 XDitherImage(canvas,ximage,exception);
6108 for (y=0; y < (int) canvas->rows; y++)
6110 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6111 canvas->columns,1,exception);
6112 if (p == (const Quantum *) NULL)
6114 for (x=0; x < (int) canvas->columns; x++)
6116 pixel=pixels[(ssize_t) GetPixelIndex(canvas,p)];
6117 *q++=(unsigned char) pixel;
6118 p+=GetPixelChannels(canvas);
6129 register unsigned int
6133 channel[sizeof(size_t)];
6136 Convert to multi-byte color-mapped X canvas.
6138 bytes_per_pixel=(unsigned int) (ximage->bits_per_pixel >> 3);
6139 for (y=0; y < (int) canvas->rows; y++)
6141 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6142 canvas->columns,1,exception);
6143 if (p == (const Quantum *) NULL)
6145 for (x=0; x < (int) canvas->columns; x++)
6147 pixel=pixels[(ssize_t) GetPixelIndex(canvas,p)];
6148 for (k=0; k < (int) bytes_per_pixel; k++)
6150 channel[k]=(unsigned char) pixel;
6153 for (k=0; k < (int) bytes_per_pixel; k++)
6155 p+=GetPixelChannels(canvas);
6163 switch (ximage->bits_per_pixel)
6167 register unsigned int
6171 Convert to contiguous 2 bit continuous-tone X canvas.
6173 for (y=0; y < (int) canvas->rows; y++)
6176 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6177 canvas->columns,1,exception);
6178 if (p == (const Quantum *) NULL)
6180 for (x=0; x < (int) canvas->columns; x++)
6182 pixel=XGammaPixel(canvas,map_info,p);
6188 *q=(unsigned char) pixel;
6194 *q|=(unsigned char) (pixel << 2);
6200 *q|=(unsigned char) (pixel << 4);
6206 *q|=(unsigned char) (pixel << 6);
6212 p+=GetPixelChannels(canvas);
6220 register unsigned int
6224 Convert to contiguous 4 bit continuous-tone X canvas.
6226 for (y=0; y < (int) canvas->rows; y++)
6228 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6229 canvas->columns,1,exception);
6230 if (p == (const Quantum *) NULL)
6233 for (x=0; x < (int) canvas->columns; x++)
6235 pixel=XGammaPixel(canvas,map_info,p);
6241 *q=(unsigned char) pixel;
6247 *q|=(unsigned char) (pixel << 4);
6253 p+=GetPixelChannels(canvas);
6263 Convert to contiguous 8 bit continuous-tone X canvas.
6265 if (resource_info->color_recovery &&
6266 resource_info->quantize_info->dither_method != NoDitherMethod)
6268 XDitherImage(canvas,ximage,exception);
6271 for (y=0; y < (int) canvas->rows; y++)
6273 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6274 canvas->columns,1,exception);
6275 if (p == (const Quantum *) NULL)
6277 for (x=0; x < (int) canvas->columns; x++)
6279 pixel=XGammaPixel(canvas,map_info,p);
6280 *q++=(unsigned char) pixel;
6281 p+=GetPixelChannels(canvas);
6289 if ((ximage->bits_per_pixel == 32) && (map_info->red_max == 255) &&
6290 (map_info->green_max == 255) && (map_info->blue_max == 255) &&
6291 (map_info->red_mult == 65536L) && (map_info->green_mult == 256) &&
6292 (map_info->blue_mult == 1))
6295 Convert to 32 bit continuous-tone X canvas.
6297 for (y=0; y < (int) canvas->rows; y++)
6299 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6300 canvas->columns,1,exception);
6301 if (p == (const Quantum *) NULL)
6303 if ((red_gamma != 1.0) || (green_gamma != 1.0) ||
6304 (blue_gamma != 1.0))
6307 Gamma correct canvas.
6309 for (x=(int) canvas->columns-1; x >= 0; x--)
6311 *q++=ScaleQuantumToChar(XBlueGamma(
6312 GetPixelBlue(canvas,p)));
6313 *q++=ScaleQuantumToChar(XGreenGamma(
6314 GetPixelGreen(canvas,p)));
6315 *q++=ScaleQuantumToChar(XRedGamma(
6316 GetPixelRed(canvas,p)));
6318 p+=GetPixelChannels(canvas);
6322 for (x=(int) canvas->columns-1; x >= 0; x--)
6324 *q++=ScaleQuantumToChar((Quantum) GetPixelBlue(canvas,p));
6325 *q++=ScaleQuantumToChar((Quantum) GetPixelGreen(canvas,p));
6326 *q++=ScaleQuantumToChar((Quantum) GetPixelRed(canvas,p));
6328 p+=GetPixelChannels(canvas);
6333 if ((ximage->bits_per_pixel == 32) && (map_info->red_max == 255) &&
6334 (map_info->green_max == 255) && (map_info->blue_max == 255) &&
6335 (map_info->red_mult == 1) && (map_info->green_mult == 256) &&
6336 (map_info->blue_mult == 65536L))
6339 Convert to 32 bit continuous-tone X canvas.
6341 for (y=0; y < (int) canvas->rows; y++)
6343 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6344 canvas->columns,1,exception);
6345 if (p == (const Quantum *) NULL)
6347 if ((red_gamma != 1.0) || (green_gamma != 1.0) ||
6348 (blue_gamma != 1.0))
6351 Gamma correct canvas.
6353 for (x=(int) canvas->columns-1; x >= 0; x--)
6355 *q++=ScaleQuantumToChar(XRedGamma(
6356 GetPixelRed(canvas,p)));
6357 *q++=ScaleQuantumToChar(XGreenGamma(
6358 GetPixelGreen(canvas,p)));
6359 *q++=ScaleQuantumToChar(XBlueGamma(
6360 GetPixelBlue(canvas,p)));
6362 p+=GetPixelChannels(canvas);
6366 for (x=(int) canvas->columns-1; x >= 0; x--)
6368 *q++=ScaleQuantumToChar((Quantum) GetPixelRed(canvas,p));
6369 *q++=ScaleQuantumToChar((Quantum) GetPixelGreen(canvas,p));
6370 *q++=ScaleQuantumToChar((Quantum) GetPixelBlue(canvas,p));
6372 p+=GetPixelChannels(canvas);
6381 register unsigned int
6385 channel[sizeof(size_t)];
6388 Convert to multi-byte continuous-tone X canvas.
6390 bytes_per_pixel=(unsigned int) (ximage->bits_per_pixel >> 3);
6391 for (y=0; y < (int) canvas->rows; y++)
6393 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6394 canvas->columns,1,exception);
6395 if (p == (const Quantum *) NULL)
6397 for (x=0; x < (int) canvas->columns; x++)
6399 pixel=XGammaPixel(canvas,map_info,p);
6400 for (k=0; k < (int) bytes_per_pixel; k++)
6402 channel[k]=(unsigned char) pixel;
6405 for (k=0; k < (int) bytes_per_pixel; k++)
6407 p+=GetPixelChannels(canvas);
6415 if (matte_image != (XImage *) NULL)
6418 Initialize matte canvas.
6420 scanline_pad=(unsigned int) (matte_image->bytes_per_line-
6421 ((matte_image->width*matte_image->bits_per_pixel) >> 3));
6422 q=(unsigned char *) matte_image->data;
6423 for (y=0; y < (int) canvas->rows; y++)
6425 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,canvas->columns,1,
6427 if (p == (const Quantum *) NULL)
6431 for (x=(int) canvas->columns-1; x >= 0; x--)
6434 if (GetPixelAlpha(canvas,p) > (QuantumRange/2))
6443 p+=GetPixelChannels(canvas);
6450 canvas_view=DestroyCacheView(canvas_view);
6451 if (canvas != image)
6452 canvas=DestroyImage(canvas);
6456 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6460 + X M a k e I m a g e M S B F i r s t %
6464 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6466 % XMakeImageMSBFirst() initializes the pixel data of an X11 Image. The X
6467 % image pixels are copied in most-significant bit and byte first order. The
6468 % server's scanline pad is also respected. Rather than using one or two
6469 % general cases, many special cases are found here to help speed up the image
6472 % The format of the XMakeImageMSBFirst method is:
6474 % XMakeImageMSBFirst(resource_info,window,image,ximage,matte_image,
6475 % ExceptionInfo *exception)
6477 % A description of each parameter follows:
6479 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
6481 % o window: Specifies a pointer to a XWindowInfo structure.
6483 % o image: the image.
6485 % o ximage: Specifies a pointer to a XImage structure; returned from
6488 % o matte_image: Specifies a pointer to a XImage structure; returned from
6491 % o exception: return any errors or warnings in this structure.
6494 static void XMakeImageMSBFirst(const XResourceInfo *resource_info,
6495 const XWindowInfo *window,Image *image,XImage *ximage,XImage *matte_image,
6496 ExceptionInfo *exception)
6510 register const Quantum
6513 register unsigned char
6530 assert(resource_info != (XResourceInfo *) NULL);
6531 assert(window != (XWindowInfo *) NULL);
6532 assert(image != (Image *) NULL);
6533 if (image->debug != MagickFalse)
6534 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
6536 if ((window->immutable != MagickFalse) &&
6537 (image->storage_class == DirectClass) && (image->alpha_trait == BlendPixelTrait))
6540 size[MaxTextExtent];
6548 image_info=AcquireImageInfo();
6549 (void) CopyMagickString(image_info->filename,
6550 resource_info->image_info->texture != (char *) NULL ?
6551 resource_info->image_info->texture : "pattern:checkerboard",
6553 (void) FormatLocaleString(size,MaxTextExtent,"%.20gx%.20g",(double)
6554 image->columns,(double) image->rows);
6555 image_info->size=ConstantString(size);
6556 pattern=ReadImage(image_info,exception);
6557 image_info=DestroyImageInfo(image_info);
6558 if (pattern != (Image *) NULL)
6560 canvas=CloneImage(image,0,0,MagickTrue,exception);
6561 if (canvas != (Image *) NULL)
6562 (void) CompositeImage(canvas,pattern,DstOverCompositeOp,MagickFalse,
6564 pattern=DestroyImage(pattern);
6567 scanline_pad=(unsigned int) (ximage->bytes_per_line-((ximage->width*
6568 ximage->bits_per_pixel) >> 3));
6569 map_info=window->map_info;
6570 pixels=window->pixel_info->pixels;
6571 q=(unsigned char *) ximage->data;
6573 canvas_view=AcquireVirtualCacheView(canvas,exception);
6574 if (ximage->format == XYBitmap)
6576 register unsigned short
6584 Convert canvas to big-endian bitmap.
6586 background=(unsigned char)
6587 (XPixelIntensity(&window->pixel_info->foreground_color) <
6588 XPixelIntensity(&window->pixel_info->background_color) ? 0x01 : 0x00);
6589 foreground=(unsigned char)
6590 (XPixelIntensity(&window->pixel_info->background_color) <
6591 XPixelIntensity(&window->pixel_info->foreground_color) ? 0x01 : 0x00);
6592 polarity=(unsigned short) ((GetPixelInfoIntensity(
6593 &canvas->colormap[0])) < (QuantumRange/2) ? 1 : 0);
6594 if (canvas->colors == 2)
6595 polarity=GetPixelInfoIntensity(&canvas->colormap[0]) <
6596 GetPixelInfoIntensity(&canvas->colormap[1]);
6597 for (y=0; y < (int) canvas->rows; y++)
6599 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,canvas->columns,1,
6601 if (p == (const Quantum *) NULL)
6605 for (x=(int) canvas->columns-1; x >= 0; x--)
6608 if (GetPixelIndex(canvas,p) == (Quantum) polarity)
6619 p+=GetPixelChannels(canvas);
6627 if (window->pixel_info->colors != 0)
6628 switch (ximage->bits_per_pixel)
6632 register unsigned int
6636 Convert to 2 bit color-mapped X canvas.
6638 for (y=0; y < (int) canvas->rows; y++)
6640 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6641 canvas->columns,1,exception);
6642 if (p == (const Quantum *) NULL)
6645 for (x=0; x < (int) canvas->columns; x++)
6647 pixel=pixels[(ssize_t)
6648 GetPixelIndex(canvas,p)] & 0xf;
6653 *q=(unsigned char) (pixel << 6);
6659 *q|=(unsigned char) (pixel << 4);
6665 *q|=(unsigned char) (pixel << 2);
6671 *q|=(unsigned char) pixel;
6677 p+=GetPixelChannels(canvas);
6685 register unsigned int
6689 Convert to 4 bit color-mapped X canvas.
6691 for (y=0; y < (int) canvas->rows; y++)
6693 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6694 canvas->columns,1,exception);
6695 if (p == (const Quantum *) NULL)
6698 for (x=0; x < (int) canvas->columns; x++)
6700 pixel=pixels[(ssize_t)
6701 GetPixelIndex(canvas,p)] & 0xf;
6706 *q=(unsigned char) (pixel << 4);
6712 *q|=(unsigned char) pixel;
6718 p+=GetPixelChannels(canvas);
6728 Convert to 8 bit color-mapped X canvas.
6730 if (resource_info->color_recovery &&
6731 resource_info->quantize_info->dither_method != NoDitherMethod)
6733 XDitherImage(canvas,ximage,exception);
6736 for (y=0; y < (int) canvas->rows; y++)
6738 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6739 canvas->columns,1,exception);
6740 if (p == (const Quantum *) NULL)
6742 for (x=0; x < (int) canvas->columns; x++)
6744 pixel=pixels[(ssize_t) GetPixelIndex(canvas,p)];
6745 *q++=(unsigned char) pixel;
6746 p+=GetPixelChannels(canvas);
6757 register unsigned int
6761 channel[sizeof(size_t)];
6764 Convert to 8 bit color-mapped X canvas.
6766 bytes_per_pixel=(unsigned int) (ximage->bits_per_pixel >> 3);
6767 for (y=0; y < (int) canvas->rows; y++)
6769 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6770 canvas->columns,1,exception);
6771 if (p == (const Quantum *) NULL)
6773 for (x=0; x < (int) canvas->columns; x++)
6775 pixel=pixels[(ssize_t)
6776 GetPixelIndex(canvas,p)];
6777 for (k=(int) bytes_per_pixel-1; k >= 0; k--)
6779 channel[k]=(unsigned char) pixel;
6782 for (k=0; k < (int) bytes_per_pixel; k++)
6784 p+=GetPixelChannels(canvas);
6792 switch (ximage->bits_per_pixel)
6796 register unsigned int
6800 Convert to 4 bit continuous-tone X canvas.
6802 for (y=0; y < (int) canvas->rows; y++)
6804 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6805 canvas->columns,1,exception);
6806 if (p == (const Quantum *) NULL)
6809 for (x=(int) canvas->columns-1; x >= 0; x--)
6811 pixel=XGammaPixel(canvas,map_info,p);
6817 *q=(unsigned char) (pixel << 6);
6823 *q|=(unsigned char) (pixel << 4);
6829 *q|=(unsigned char) (pixel << 2);
6835 *q|=(unsigned char) pixel;
6841 p+=GetPixelChannels(canvas);
6849 register unsigned int
6853 Convert to 4 bit continuous-tone X canvas.
6855 for (y=0; y < (int) canvas->rows; y++)
6857 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6858 canvas->columns,1,exception);
6859 if (p == (const Quantum *) NULL)
6862 for (x=(int) canvas->columns-1; x >= 0; x--)
6864 pixel=XGammaPixel(canvas,map_info,p);
6870 *q=(unsigned char) (pixel << 4);
6876 *q|=(unsigned char) pixel;
6882 p+=GetPixelChannels(canvas);
6892 Convert to 8 bit continuous-tone X canvas.
6894 if (resource_info->color_recovery &&
6895 resource_info->quantize_info->dither_method != NoDitherMethod)
6897 XDitherImage(canvas,ximage,exception);
6900 for (y=0; y < (int) canvas->rows; y++)
6902 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6903 canvas->columns,1,exception);
6904 if (p == (const Quantum *) NULL)
6906 for (x=(int) canvas->columns-1; x >= 0; x--)
6908 pixel=XGammaPixel(canvas,map_info,p);
6909 *q++=(unsigned char) pixel;
6910 p+=GetPixelChannels(canvas);
6918 if ((ximage->bits_per_pixel == 32) && (map_info->red_max == 255) &&
6919 (map_info->green_max == 255) && (map_info->blue_max == 255) &&
6920 (map_info->red_mult == 65536L) && (map_info->green_mult == 256) &&
6921 (map_info->blue_mult == 1))
6924 Convert to 32 bit continuous-tone X canvas.
6926 for (y=0; y < (int) canvas->rows; y++)
6928 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6929 canvas->columns,1,exception);
6930 if (p == (const Quantum *) NULL)
6932 if ((red_gamma != 1.0) || (green_gamma != 1.0) ||
6933 (blue_gamma != 1.0))
6936 Gamma correct canvas.
6938 for (x=(int) canvas->columns-1; x >= 0; x--)
6941 *q++=ScaleQuantumToChar(XRedGamma(
6942 GetPixelRed(canvas,p)));
6943 *q++=ScaleQuantumToChar(XGreenGamma(
6944 GetPixelGreen(canvas,p)));
6945 *q++=ScaleQuantumToChar(XBlueGamma(
6946 GetPixelBlue(canvas,p)));
6947 p+=GetPixelChannels(canvas);
6951 for (x=(int) canvas->columns-1; x >= 0; x--)
6954 *q++=ScaleQuantumToChar((Quantum) GetPixelRed(canvas,p));
6955 *q++=ScaleQuantumToChar((Quantum) GetPixelGreen(canvas,p));
6956 *q++=ScaleQuantumToChar((Quantum) GetPixelBlue(canvas,p));
6957 p+=GetPixelChannels(canvas);
6962 if ((ximage->bits_per_pixel == 32) && (map_info->red_max == 255) &&
6963 (map_info->green_max == 255) && (map_info->blue_max == 255) &&
6964 (map_info->red_mult == 1) && (map_info->green_mult == 256) &&
6965 (map_info->blue_mult == 65536L))
6968 Convert to 32 bit continuous-tone X canvas.
6970 for (y=0; y < (int) canvas->rows; y++)
6972 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6973 canvas->columns,1,exception);
6974 if (p == (const Quantum *) NULL)
6976 if ((red_gamma != 1.0) || (green_gamma != 1.0) ||
6977 (blue_gamma != 1.0))
6980 Gamma correct canvas.
6982 for (x=(int) canvas->columns-1; x >= 0; x--)
6985 *q++=ScaleQuantumToChar(XBlueGamma(
6986 GetPixelBlue(canvas,p)));
6987 *q++=ScaleQuantumToChar(XGreenGamma(
6988 GetPixelGreen(canvas,p)));
6989 *q++=ScaleQuantumToChar(XRedGamma(
6990 GetPixelRed(canvas,p)));
6991 p+=GetPixelChannels(canvas);
6995 for (x=(int) canvas->columns-1; x >= 0; x--)
6998 *q++=ScaleQuantumToChar((Quantum) GetPixelBlue(canvas,p));
6999 *q++=ScaleQuantumToChar((Quantum) GetPixelGreen(canvas,p));
7000 *q++=ScaleQuantumToChar((Quantum) GetPixelRed(canvas,p));
7001 p+=GetPixelChannels(canvas);
7010 register unsigned int
7014 channel[sizeof(size_t)];
7017 Convert to multi-byte continuous-tone X canvas.
7019 bytes_per_pixel=(unsigned int) (ximage->bits_per_pixel >> 3);
7020 for (y=0; y < (int) canvas->rows; y++)
7022 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
7023 canvas->columns,1,exception);
7024 if (p == (const Quantum *) NULL)
7026 for (x=(int) canvas->columns-1; x >= 0; x--)
7028 pixel=XGammaPixel(canvas,map_info,p);
7029 for (k=(int) bytes_per_pixel-1; k >= 0; k--)
7031 channel[k]=(unsigned char) pixel;
7034 for (k=0; k < (int) bytes_per_pixel; k++)
7036 p+=GetPixelChannels(canvas);
7044 if (matte_image != (XImage *) NULL)
7047 Initialize matte canvas.
7049 scanline_pad=(unsigned int) (matte_image->bytes_per_line-
7050 ((matte_image->width*matte_image->bits_per_pixel) >> 3));
7051 q=(unsigned char *) matte_image->data;
7052 for (y=0; y < (int) canvas->rows; y++)
7054 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,canvas->columns,1,
7056 if (p == (const Quantum *) NULL)
7060 for (x=(int) canvas->columns-1; x >= 0; x--)
7063 if (GetPixelAlpha(canvas,p) > (QuantumRange/2))
7072 p+=GetPixelChannels(canvas);
7079 canvas_view=DestroyCacheView(canvas_view);
7080 if (canvas != image)
7081 canvas=DestroyImage(canvas);
7085 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7089 % X M a k e M a g n i f y I m a g e %
7093 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7095 % XMakeMagnifyImage() magnifies a region of an X image and displays it.
7097 % The format of the XMakeMagnifyImage method is:
7099 % void XMakeMagnifyImage(Display *display,XWindows *windows,
7100 % ExceptionInfo *exception)
7102 % A description of each parameter follows:
7104 % o display: Specifies a connection to an X server; returned from
7107 % o windows: Specifies a pointer to a XWindows structure.
7109 % o exception: return any errors or warnings in this structure.
7112 MagickPrivate void XMakeMagnifyImage(Display *display,XWindows *windows,
7113 ExceptionInfo *exception)
7116 tuple[MaxTextExtent];
7130 register unsigned char
7138 previous_magnify = 0;
7156 Check boundary conditions.
7158 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
7159 assert(display != (Display *) NULL);
7160 assert(windows != (XWindows *) NULL);
7162 for (n=1; n < (ssize_t) windows->magnify.data; n++)
7164 while ((magnify*windows->image.ximage->width) < windows->magnify.width)
7166 while ((magnify*windows->image.ximage->height) < windows->magnify.height)
7168 while (magnify > windows->magnify.width)
7170 while (magnify > windows->magnify.height)
7172 if (magnify != previous_magnify)
7181 New magnify factor: update magnify window name.
7184 while ((1 << i) <= (int) magnify)
7186 (void) FormatLocaleString(windows->magnify.name,MaxTextExtent,
7187 "Magnify %.20gX",(double) i);
7188 status=XStringListToTextProperty(&windows->magnify.name,1,&window_name);
7189 if (status != False)
7191 XSetWMName(display,windows->magnify.id,&window_name);
7192 XSetWMIconName(display,windows->magnify.id,&window_name);
7193 (void) XFree((void *) window_name.value);
7196 previous_magnify=magnify;
7197 ximage=windows->image.ximage;
7198 width=(unsigned int) windows->magnify.ximage->width;
7199 height=(unsigned int) windows->magnify.ximage->height;
7200 if ((windows->magnify.x < 0) ||
7201 (windows->magnify.x >= windows->image.ximage->width))
7202 windows->magnify.x=windows->image.ximage->width >> 1;
7203 x=windows->magnify.x-((width/magnify) >> 1);
7207 if (x > (int) (ximage->width-(width/magnify)))
7208 x=ximage->width-width/magnify;
7209 if ((windows->magnify.y < 0) ||
7210 (windows->magnify.y >= windows->image.ximage->height))
7211 windows->magnify.y=windows->image.ximage->height >> 1;
7212 y=windows->magnify.y-((height/magnify) >> 1);
7216 if (y > (int) (ximage->height-(height/magnify)))
7217 y=ximage->height-height/magnify;
7218 q=(unsigned char *) windows->magnify.ximage->data;
7219 scanline_pad=(unsigned int) (windows->magnify.ximage->bytes_per_line-
7220 ((width*windows->magnify.ximage->bits_per_pixel) >> 3));
7221 if (ximage->bits_per_pixel < 8)
7223 register unsigned char
7230 register unsigned int
7236 pixel_info=windows->magnify.pixel_info;
7237 switch (ximage->bitmap_bit_order)
7242 Magnify little-endian bitmap.
7246 if (ximage->format == XYBitmap)
7248 background=(unsigned char)
7249 (XPixelIntensity(&pixel_info->foreground_color) <
7250 XPixelIntensity(&pixel_info->background_color) ? 0x80 : 0x00);
7251 foreground=(unsigned char)
7252 (XPixelIntensity(&pixel_info->background_color) <
7253 XPixelIntensity(&pixel_info->foreground_color) ? 0x80 : 0x00);
7254 if (windows->magnify.depth > 1)
7255 Swap(background,foreground);
7257 for (i=0; i < (ssize_t) height; i+=magnify)
7260 Propogate pixel magnify rows.
7262 for (j=0; j < magnify; j++)
7264 p=(unsigned char *) ximage->data+y*ximage->bytes_per_line+
7265 ((x*ximage->bits_per_pixel) >> 3);
7266 p_bit=(unsigned char) (x*ximage->bits_per_pixel) & 0x07;
7269 for (k=0; k < width; k+=magnify)
7272 Propogate pixel magnify columns.
7274 for (l=0; l < magnify; l++)
7277 Propogate each bit plane.
7279 for (plane=0; (int) plane < ximage->bits_per_pixel; plane++)
7282 if (*p & (0x01 << (p_bit+plane)))
7295 p_bit+=ximage->bits_per_pixel;
7302 *q=byte >> (8-q_bit);
7314 Magnify big-endian bitmap.
7318 if (ximage->format == XYBitmap)
7320 background=(unsigned char)
7321 (XPixelIntensity(&pixel_info->foreground_color) <
7322 XPixelIntensity(&pixel_info->background_color) ? 0x01 : 0x00);
7323 foreground=(unsigned char)
7324 (XPixelIntensity(&pixel_info->background_color) <
7325 XPixelIntensity(&pixel_info->foreground_color) ? 0x01 : 0x00);
7326 if (windows->magnify.depth > 1)
7327 Swap(background,foreground);
7329 for (i=0; i < (ssize_t) height; i+=magnify)
7332 Propogate pixel magnify rows.
7334 for (j=0; j < magnify; j++)
7336 p=(unsigned char *) ximage->data+y*ximage->bytes_per_line+
7337 ((x*ximage->bits_per_pixel) >> 3);
7338 p_bit=(unsigned char) (x*ximage->bits_per_pixel) & 0x07;
7341 for (k=0; k < width; k+=magnify)
7344 Propogate pixel magnify columns.
7346 for (l=0; l < magnify; l++)
7349 Propogate each bit plane.
7351 for (plane=0; (int) plane < ximage->bits_per_pixel; plane++)
7354 if (*p & (0x80 >> (p_bit+plane)))
7367 p_bit+=ximage->bits_per_pixel;
7374 *q=byte << (8-q_bit);
7385 switch (ximage->bits_per_pixel)
7391 Magnify 8 bit X image.
7393 for (i=0; i < (ssize_t) height; i+=magnify)
7396 Propogate pixel magnify rows.
7398 for (j=0; j < magnify; j++)
7400 p=(unsigned char *) ximage->data+y*ximage->bytes_per_line+
7401 ((x*ximage->bits_per_pixel) >> 3);
7402 for (k=0; k < width; k+=magnify)
7405 Propogate pixel magnify columns.
7407 for (l=0; l < magnify; l++)
7419 register unsigned int
7424 Magnify multi-byte X image.
7426 bytes_per_pixel=(unsigned int) ximage->bits_per_pixel >> 3;
7427 for (i=0; i < (ssize_t) height; i+=magnify)
7430 Propogate pixel magnify rows.
7432 for (j=0; j < magnify; j++)
7434 p=(unsigned char *) ximage->data+y*ximage->bytes_per_line+
7435 ((x*ximage->bits_per_pixel) >> 3);
7436 for (k=0; k < width; k+=magnify)
7439 Propogate pixel magnify columns.
7441 for (l=0; l < magnify; l++)
7442 for (m=0; m < bytes_per_pixel; m++)
7454 Copy X image to magnify pixmap.
7456 x=windows->magnify.x-((width/magnify) >> 1);
7458 x=(int) ((width >> 1)-windows->magnify.x*magnify);
7460 if (x > (int) (ximage->width-(width/magnify)))
7461 x=(int) ((ximage->width-windows->magnify.x)*magnify-(width >> 1));
7464 y=windows->magnify.y-((height/magnify) >> 1);
7466 y=(int) ((height >> 1)-windows->magnify.y*magnify);
7468 if (y > (int) (ximage->height-(height/magnify)))
7469 y=(int) ((ximage->height-windows->magnify.y)*magnify-(height >> 1));
7472 if ((x != 0) || (y != 0))
7473 (void) XFillRectangle(display,windows->magnify.pixmap,
7474 windows->magnify.annotate_context,0,0,width,height);
7475 (void) XPutImage(display,windows->magnify.pixmap,
7476 windows->magnify.annotate_context,windows->magnify.ximage,0,0,x,y,width-x,
7478 if ((magnify > 1) && ((magnify <= (width >> 1)) &&
7479 (magnify <= (height >> 1))))
7485 Highlight center pixel.
7487 highlight_info.x=(ssize_t) windows->magnify.width >> 1;
7488 highlight_info.y=(ssize_t) windows->magnify.height >> 1;
7489 highlight_info.width=magnify;
7490 highlight_info.height=magnify;
7491 (void) XDrawRectangle(display,windows->magnify.pixmap,
7492 windows->magnify.highlight_context,(int) highlight_info.x,
7493 (int) highlight_info.y,(unsigned int) highlight_info.width-1,
7494 (unsigned int) highlight_info.height-1);
7496 (void) XDrawRectangle(display,windows->magnify.pixmap,
7497 windows->magnify.annotate_context,(int) highlight_info.x+1,
7498 (int) highlight_info.y+1,(unsigned int) highlight_info.width-3,
7499 (unsigned int) highlight_info.height-3);
7502 Show center pixel color.
7504 (void) GetOneVirtualPixelInfo(windows->image.image,TileVirtualPixelMethod,
7505 (ssize_t) windows->magnify.x,(ssize_t) windows->magnify.y,&pixel,exception);
7506 (void) FormatLocaleString(tuple,MaxTextExtent,"%d,%d: ",
7507 windows->magnify.x,windows->magnify.y);
7508 (void) ConcatenateMagickString(tuple,"(",MaxTextExtent);
7509 ConcatenateColorComponent(&pixel,RedPixelChannel,X11Compliance,tuple);
7510 (void) ConcatenateMagickString(tuple,",",MaxTextExtent);
7511 ConcatenateColorComponent(&pixel,GreenPixelChannel,X11Compliance,tuple);
7512 (void) ConcatenateMagickString(tuple,",",MaxTextExtent);
7513 ConcatenateColorComponent(&pixel,BluePixelChannel,X11Compliance,tuple);
7514 if (pixel.colorspace == CMYKColorspace)
7516 (void) ConcatenateMagickString(tuple,",",MaxTextExtent);
7517 ConcatenateColorComponent(&pixel,BlackPixelChannel,X11Compliance,tuple);
7519 if (pixel.alpha_trait == BlendPixelTrait)
7521 (void) ConcatenateMagickString(tuple,",",MaxTextExtent);
7522 ConcatenateColorComponent(&pixel,AlphaPixelChannel,X11Compliance,tuple);
7524 (void) ConcatenateMagickString(tuple,")",MaxTextExtent);
7525 height=(unsigned int) windows->magnify.font_info->ascent+
7526 windows->magnify.font_info->descent;
7527 x=windows->magnify.font_info->max_bounds.width >> 1;
7528 y=windows->magnify.font_info->ascent+(height >> 2);
7529 (void) XDrawImageString(display,windows->magnify.pixmap,
7530 windows->magnify.annotate_context,x,y,tuple,(int) strlen(tuple));
7531 GetColorTuple(&pixel,MagickTrue,tuple);
7533 (void) XDrawImageString(display,windows->magnify.pixmap,
7534 windows->magnify.annotate_context,x,y,tuple,(int) strlen(tuple));
7535 (void) QueryColorname(windows->image.image,&pixel,SVGCompliance,tuple,
7538 (void) XDrawImageString(display,windows->magnify.pixmap,
7539 windows->magnify.annotate_context,x,y,tuple,(int) strlen(tuple));
7541 Refresh magnify window.
7543 magnify_window=windows->magnify;
7546 XRefreshWindow(display,&magnify_window,(XEvent *) NULL);
7550 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7554 % X M a k e P i x m a p %
7558 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7560 % XMakePixmap() creates an X11 pixmap.
7562 % The format of the XMakePixmap method is:
7564 % void XMakeStandardColormap(Display *display,XVisualInfo *visual_info,
7565 % XResourceInfo *resource_info,Image *image,XStandardColormap *map_info,
7566 % XPixelInfo *pixel)
7568 % A description of each parameter follows:
7570 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
7572 % o display: Specifies a connection to an X server; returned from
7575 % o window: Specifies a pointer to a XWindowInfo structure.
7578 static MagickBooleanType XMakePixmap(Display *display,
7579 const XResourceInfo *resource_info,XWindowInfo *window)
7585 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
7586 assert(display != (Display *) NULL);
7587 assert(resource_info != (XResourceInfo *) NULL);
7588 assert(window != (XWindowInfo *) NULL);
7589 if (window->pixmap != (Pixmap) NULL)
7592 Destroy previous X pixmap.
7594 (void) XFreePixmap(display,window->pixmap);
7595 window->pixmap=(Pixmap) NULL;
7597 if (window->use_pixmap == MagickFalse)
7598 return(MagickFalse);
7599 if (window->ximage == (XImage *) NULL)
7600 return(MagickFalse);
7602 Display busy cursor.
7604 (void) XCheckDefineCursor(display,window->id,window->busy_cursor);
7605 (void) XFlush(display);
7609 width=(unsigned int) window->ximage->width;
7610 height=(unsigned int) window->ximage->height;
7611 window->pixmap=XCreatePixmap(display,window->id,width,height,window->depth);
7612 if (window->pixmap == (Pixmap) NULL)
7615 Unable to allocate pixmap.
7617 (void) XCheckDefineCursor(display,window->id,window->cursor);
7618 return(MagickFalse);
7621 Copy X image to pixmap.
7623 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
7624 if (window->shared_memory)
7625 (void) XShmPutImage(display,window->pixmap,window->annotate_context,
7626 window->ximage,0,0,0,0,width,height,MagickTrue);
7628 if (window->shared_memory == MagickFalse)
7629 (void) XPutImage(display,window->pixmap,window->annotate_context,
7630 window->ximage,0,0,0,0,width,height);
7631 if (IsEventLogging())
7633 (void) LogMagickEvent(X11Event,GetMagickModule(),"Pixmap:");
7634 (void) LogMagickEvent(X11Event,GetMagickModule()," width, height: %ux%u",
7640 (void) XCheckDefineCursor(display,window->id,window->cursor);
7645 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7649 % X M a k e S t a n d a r d C o l o r m a p %
7653 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7655 % XMakeStandardColormap() creates an X11 Standard Colormap.
7657 % The format of the XMakeStandardColormap method is:
7659 % void XMakeStandardColormap(Display *display,XVisualInfo *visual_info,
7660 % XResourceInfo *resource_info,Image *image,XStandardColormap *map_info,
7661 % XPixelInfo *pixel,ExceptionInfo *exception)
7663 % A description of each parameter follows:
7665 % o display: Specifies a connection to an X server; returned from
7668 % o visual_info: Specifies a pointer to a X11 XVisualInfo structure;
7669 % returned from XGetVisualInfo.
7671 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
7673 % o image: the image.
7675 % o map_info: If a Standard Colormap type is specified, this structure is
7676 % initialized with info from the Standard Colormap.
7678 % o pixel: Specifies a pointer to a XPixelInfo structure.
7680 % o exception: return any errors or warnings in this structure.
7684 #if defined(__cplusplus) || defined(c_plusplus)
7688 static inline double DiversityPixelIntensity(
7689 const DiversityPacket *pixel)
7694 intensity=0.298839f*pixel->red+0.586811f*pixel->green+0.114350f*pixel->blue;
7698 static int IntensityCompare(const void *x,const void *y)
7707 color_1=(DiversityPacket *) x;
7708 color_2=(DiversityPacket *) y;
7709 diversity=(int) (DiversityPixelIntensity(color_2)-
7710 DiversityPixelIntensity(color_1));
7714 static int PopularityCompare(const void *x,const void *y)
7720 color_1=(DiversityPacket *) x;
7721 color_2=(DiversityPacket *) y;
7722 return((int) color_2->count-(int) color_1->count);
7725 #if defined(__cplusplus) || defined(c_plusplus)
7729 static inline Quantum ScaleXToQuantum(const size_t x,
7732 return((Quantum) (((double) QuantumRange*x)/scale+0.5));
7735 MagickPrivate void XMakeStandardColormap(Display *display,
7736 XVisualInfo *visual_info,XResourceInfo *resource_info,Image *image,
7737 XStandardColormap *map_info,XPixelInfo *pixel,ExceptionInfo *exception)
7760 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
7761 assert(display != (Display *) NULL);
7762 assert(visual_info != (XVisualInfo *) NULL);
7763 assert(map_info != (XStandardColormap *) NULL);
7764 assert(resource_info != (XResourceInfo *) NULL);
7765 assert(pixel != (XPixelInfo *) NULL);
7766 if (resource_info->map_type != (char *) NULL)
7769 Standard Colormap is already defined (i.e. xstdcmap).
7771 XGetPixelInfo(display,visual_info,map_info,resource_info,image,
7773 number_colors=(unsigned int) (map_info->base_pixel+
7774 (map_info->red_max+1)*(map_info->green_max+1)*(map_info->blue_max+1));
7775 if ((map_info->red_max*map_info->green_max*map_info->blue_max) != 0)
7776 if ((image->alpha_trait != BlendPixelTrait) &&
7777 (resource_info->color_recovery == MagickFalse) &&
7778 (resource_info->quantize_info->dither_method != NoDitherMethod) &&
7779 (number_colors < MaxColormapSize))
7788 Improve image appearance with error diffusion.
7790 affinity_image=AcquireImage((ImageInfo *) NULL,exception);
7791 if (affinity_image == (Image *) NULL)
7792 ThrowXWindowFatalException(ResourceLimitFatalError,
7793 "UnableToDitherImage",image->filename);
7794 affinity_image->columns=number_colors;
7795 affinity_image->rows=1;
7797 Initialize colormap image.
7799 q=QueueAuthenticPixels(affinity_image,0,0,affinity_image->columns,
7801 if (q != (Quantum *) NULL)
7803 for (i=0; i < (ssize_t) number_colors; i++)
7805 SetPixelRed(affinity_image,0,q);
7806 if (map_info->red_max != 0)
7807 SetPixelRed(affinity_image,
7808 ScaleXToQuantum((size_t) (i/map_info->red_mult),
7809 map_info->red_max),q);
7810 SetPixelGreen(affinity_image,0,q);
7811 if (map_info->green_max != 0)
7812 SetPixelGreen(affinity_image,
7813 ScaleXToQuantum((size_t) ((i/map_info->green_mult) %
7814 (map_info->green_max+1)),map_info->green_max),q);
7815 SetPixelBlue(affinity_image,0,q);
7816 if (map_info->blue_max != 0)
7817 SetPixelBlue(affinity_image,
7818 ScaleXToQuantum((size_t) (i % map_info->green_mult),
7819 map_info->blue_max),q);
7820 SetPixelAlpha(affinity_image,
7821 TransparentAlpha,q);
7822 q+=GetPixelChannels(affinity_image);
7824 (void) SyncAuthenticPixels(affinity_image,exception);
7825 (void) RemapImage(resource_info->quantize_info,image,
7826 affinity_image,exception);
7828 XGetPixelInfo(display,visual_info,map_info,resource_info,image,
7830 (void) SetImageStorageClass(image,DirectClass,exception);
7831 affinity_image=DestroyImage(affinity_image);
7833 if (IsEventLogging())
7835 (void) LogMagickEvent(X11Event,GetMagickModule(),
7836 "Standard Colormap:");
7837 (void) LogMagickEvent(X11Event,GetMagickModule(),
7838 " colormap id: 0x%lx",map_info->colormap);
7839 (void) LogMagickEvent(X11Event,GetMagickModule(),
7840 " red, green, blue max: %lu %lu %lu",map_info->red_max,
7841 map_info->green_max,map_info->blue_max);
7842 (void) LogMagickEvent(X11Event,GetMagickModule(),
7843 " red, green, blue mult: %lu %lu %lu",map_info->red_mult,
7844 map_info->green_mult,map_info->blue_mult);
7848 if ((visual_info->klass != DirectColor) &&
7849 (visual_info->klass != TrueColor))
7850 if ((image->storage_class == DirectClass) ||
7851 ((int) image->colors > visual_info->colormap_size))
7857 Image has more colors than the visual supports.
7859 quantize_info=(*resource_info->quantize_info);
7860 quantize_info.number_colors=(size_t) visual_info->colormap_size;
7861 (void) QuantizeImage(&quantize_info,image,exception);
7864 Free previous and create new colormap.
7866 (void) XFreeStandardColormap(display,visual_info,map_info,pixel);
7867 colormap=XDefaultColormap(display,visual_info->screen);
7868 if (visual_info->visual != XDefaultVisual(display,visual_info->screen))
7869 colormap=XCreateColormap(display,XRootWindow(display,visual_info->screen),
7870 visual_info->visual,visual_info->klass == DirectColor ?
7871 AllocAll : AllocNone);
7872 if (colormap == (Colormap) NULL)
7873 ThrowXWindowFatalException(ResourceLimitFatalError,"UnableToCreateColormap",
7876 Initialize the map and pixel info structures.
7878 XGetMapInfo(visual_info,colormap,map_info);
7879 XGetPixelInfo(display,visual_info,map_info,resource_info,image,pixel);
7881 Allocating colors in server colormap is based on visual class.
7883 switch (visual_info->klass)
7889 Define Standard Colormap for StaticGray or StaticColor visual.
7891 number_colors=image->colors;
7892 colors=(XColor *) AcquireQuantumMemory((size_t)
7893 visual_info->colormap_size,sizeof(*colors));
7894 if (colors == (XColor *) NULL)
7895 ThrowXWindowFatalException(ResourceLimitFatalError,
7896 "UnableToCreateColormap",image->filename);
7898 color.flags=(char) (DoRed | DoGreen | DoBlue);
7899 for (i=0; i < (ssize_t) image->colors; i++)
7901 color.red=ScaleQuantumToShort(XRedGamma(image->colormap[i].red));
7902 color.green=ScaleQuantumToShort(XGreenGamma(image->colormap[i].green));
7903 color.blue=ScaleQuantumToShort(XBlueGamma(image->colormap[i].blue));
7904 if (visual_info->klass != StaticColor)
7906 gray_value=(unsigned short) XPixelIntensity(&color);
7907 color.red=gray_value;
7908 color.green=gray_value;
7909 color.blue=gray_value;
7911 status=XAllocColor(display,colormap,&color);
7912 if (status == False)
7914 colormap=XCopyColormapAndFree(display,colormap);
7915 (void) XAllocColor(display,colormap,&color);
7917 pixel->pixels[i]=color.pixel;
7929 Define Standard Colormap for GrayScale or PseudoColor visual.
7931 number_colors=image->colors;
7932 colors=(XColor *) AcquireQuantumMemory((size_t)
7933 visual_info->colormap_size,sizeof(*colors));
7934 if (colors == (XColor *) NULL)
7935 ThrowXWindowFatalException(ResourceLimitFatalError,
7936 "UnableToCreateColormap",image->filename);
7938 Preallocate our GUI colors.
7940 (void) XAllocColor(display,colormap,&pixel->foreground_color);
7941 (void) XAllocColor(display,colormap,&pixel->background_color);
7942 (void) XAllocColor(display,colormap,&pixel->border_color);
7943 (void) XAllocColor(display,colormap,&pixel->matte_color);
7944 (void) XAllocColor(display,colormap,&pixel->highlight_color);
7945 (void) XAllocColor(display,colormap,&pixel->shadow_color);
7946 (void) XAllocColor(display,colormap,&pixel->depth_color);
7947 (void) XAllocColor(display,colormap,&pixel->trough_color);
7948 for (i=0; i < MaxNumberPens; i++)
7949 (void) XAllocColor(display,colormap,&pixel->pen_colors[i]);
7951 Determine if image colors will "fit" into X server colormap.
7953 colormap_type=resource_info->colormap;
7954 status=XAllocColorCells(display,colormap,MagickFalse,(unsigned long *)
7955 NULL,0,pixel->pixels,(unsigned int) image->colors);
7956 if (status != False)
7957 colormap_type=PrivateColormap;
7958 if (colormap_type == SharedColormap)
7979 Define Standard colormap for shared GrayScale or PseudoColor visual.
7981 diversity=(DiversityPacket *) AcquireQuantumMemory(image->colors,
7982 sizeof(*diversity));
7983 if (diversity == (DiversityPacket *) NULL)
7984 ThrowXWindowFatalException(ResourceLimitFatalError,
7985 "UnableToCreateColormap",image->filename);
7986 for (i=0; i < (ssize_t) image->colors; i++)
7988 diversity[i].red=ClampToQuantum(image->colormap[i].red);
7989 diversity[i].green=ClampToQuantum(image->colormap[i].green);
7990 diversity[i].blue=ClampToQuantum(image->colormap[i].blue);
7991 diversity[i].index=(unsigned short) i;
7992 diversity[i].count=0;
7994 image_view=AcquireAuthenticCacheView(image,exception);
7995 for (y=0; y < (int) image->rows; y++)
8000 register const Quantum
8003 p=GetCacheViewAuthenticPixels(image_view,0,(ssize_t) y,
8004 image->columns,1,exception);
8005 if (p == (const Quantum *) NULL)
8007 for (x=(int) image->columns-1; x >= 0; x--)
8009 diversity[(ssize_t) GetPixelIndex(image,p)].count++;
8010 p+=GetPixelChannels(image);
8013 image_view=DestroyCacheView(image_view);
8015 Sort colors by decreasing intensity.
8017 qsort((void *) diversity,image->colors,sizeof(*diversity),
8019 for (i=0; i < (ssize_t) image->colors; )
8021 diversity[i].count<<=4; /* increase this colors popularity */
8022 i+=MagickMax((int) (image->colors >> 4),2);
8024 diversity[image->colors-1].count<<=4;
8025 qsort((void *) diversity,image->colors,sizeof(*diversity),
8031 color.flags=(char) (DoRed | DoGreen | DoBlue);
8032 for (i=0; i < (ssize_t) image->colors; i++)
8034 index=diversity[i].index;
8036 ScaleQuantumToShort(XRedGamma(image->colormap[index].red));
8038 ScaleQuantumToShort(XGreenGamma(image->colormap[index].green));
8040 ScaleQuantumToShort(XBlueGamma(image->colormap[index].blue));
8041 if (visual_info->klass != PseudoColor)
8043 gray_value=(unsigned short) XPixelIntensity(&color);
8044 color.red=gray_value;
8045 color.green=gray_value;
8046 color.blue=gray_value;
8048 status=XAllocColor(display,colormap,&color);
8049 if (status == False)
8051 pixel->pixels[index]=color.pixel;
8055 Read X server colormap.
8057 server_colors=(XColor *) AcquireQuantumMemory((size_t)
8058 visual_info->colormap_size,sizeof(*server_colors));
8059 if (server_colors == (XColor *) NULL)
8060 ThrowXWindowFatalException(ResourceLimitFatalError,
8061 "UnableToCreateColormap",image->filename);
8062 for (x=visual_info->colormap_size-1; x >= 0; x--)
8063 server_colors[x].pixel=(size_t) x;
8064 (void) XQueryColors(display,colormap,server_colors,
8065 (int) MagickMin((unsigned int) visual_info->colormap_size,256));
8067 Select remaining colors from X server colormap.
8069 for (; i < (ssize_t) image->colors; i++)
8071 index=diversity[i].index;
8073 ScaleQuantumToShort(XRedGamma(image->colormap[index].red));
8075 ScaleQuantumToShort(XGreenGamma(image->colormap[index].green));
8077 ScaleQuantumToShort(XBlueGamma(image->colormap[index].blue));
8078 if (visual_info->klass != PseudoColor)
8080 gray_value=(unsigned short) XPixelIntensity(&color);
8081 color.red=gray_value;
8082 color.green=gray_value;
8083 color.blue=gray_value;
8085 XBestPixel(display,colormap,server_colors,(unsigned int)
8086 visual_info->colormap_size,&color);
8087 pixel->pixels[index]=color.pixel;
8090 if ((int) image->colors < visual_info->colormap_size)
8093 Fill up colors array-- more choices for pen colors.
8095 retain_colors=MagickMin((unsigned int)
8096 (visual_info->colormap_size-image->colors),256);
8097 for (i=0; i < (ssize_t) retain_colors; i++)
8098 *p++=server_colors[i];
8099 number_colors+=retain_colors;
8101 server_colors=(XColor *) RelinquishMagickMemory(server_colors);
8102 diversity=(DiversityPacket *) RelinquishMagickMemory(diversity);
8106 Define Standard colormap for private GrayScale or PseudoColor visual.
8108 if (status == False)
8111 Not enough colormap entries in the colormap-- Create a new colormap.
8113 colormap=XCreateColormap(display,
8114 XRootWindow(display,visual_info->screen),visual_info->visual,
8116 if (colormap == (Colormap) NULL)
8117 ThrowXWindowFatalException(ResourceLimitFatalError,
8118 "UnableToCreateColormap",image->filename);
8119 map_info->colormap=colormap;
8120 if ((int) image->colors < visual_info->colormap_size)
8123 Retain colors from the default colormap to help lessens the
8124 effects of colormap flashing.
8126 retain_colors=MagickMin((unsigned int)
8127 (visual_info->colormap_size-image->colors),256);
8128 p=colors+image->colors;
8129 for (i=0; i < (ssize_t) retain_colors; i++)
8131 p->pixel=(unsigned long) i;
8134 (void) XQueryColors(display,
8135 XDefaultColormap(display,visual_info->screen),
8136 colors+image->colors,(int) retain_colors);
8138 Transfer colors from default to private colormap.
8140 (void) XAllocColorCells(display,colormap,MagickFalse,
8141 (unsigned long *) NULL,0,pixel->pixels,(unsigned int)
8143 p=colors+image->colors;
8144 for (i=0; i < (ssize_t) retain_colors; i++)
8146 p->pixel=pixel->pixels[i];
8149 (void) XStoreColors(display,colormap,colors+image->colors,
8150 (int) retain_colors);
8151 number_colors+=retain_colors;
8153 (void) XAllocColorCells(display,colormap,MagickFalse,
8154 (unsigned long *) NULL,0,pixel->pixels,(unsigned int)
8158 Store the image colormap.
8161 color.flags=(char) (DoRed | DoGreen | DoBlue);
8162 for (i=0; i < (ssize_t) image->colors; i++)
8164 color.red=ScaleQuantumToShort(XRedGamma(image->colormap[i].red));
8165 color.green=ScaleQuantumToShort(XGreenGamma(image->colormap[i].green));
8166 color.blue=ScaleQuantumToShort(XBlueGamma(image->colormap[i].blue));
8167 if (visual_info->klass != PseudoColor)
8169 gray_value=(unsigned short) XPixelIntensity(&color);
8170 color.red=gray_value;
8171 color.green=gray_value;
8172 color.blue=gray_value;
8174 color.pixel=pixel->pixels[i];
8177 (void) XStoreColors(display,colormap,colors,(int) image->colors);
8188 Define Standard Colormap for TrueColor or DirectColor visual.
8190 number_colors=(unsigned int) ((map_info->red_max*map_info->red_mult)+
8191 (map_info->green_max*map_info->green_mult)+
8192 (map_info->blue_max*map_info->blue_mult)+1);
8193 linear_colormap=(number_colors > 4096) ||
8194 (((int) (map_info->red_max+1) == visual_info->colormap_size) &&
8195 ((int) (map_info->green_max+1) == visual_info->colormap_size) &&
8196 ((int) (map_info->blue_max+1) == visual_info->colormap_size)) ?
8197 MagickTrue : MagickFalse;
8198 if (linear_colormap != MagickFalse)
8199 number_colors=(size_t) visual_info->colormap_size;
8201 Allocate color array.
8203 colors=(XColor *) AcquireQuantumMemory(number_colors,sizeof(*colors));
8204 if (colors == (XColor *) NULL)
8205 ThrowXWindowFatalException(ResourceLimitFatalError,
8206 "UnableToCreateColormap",image->filename);
8208 Initialize linear color ramp.
8211 color.flags=(char) (DoRed | DoGreen | DoBlue);
8212 if (linear_colormap != MagickFalse)
8213 for (i=0; i < (ssize_t) number_colors; i++)
8215 color.blue=(unsigned short) 0;
8216 if (map_info->blue_max != 0)
8217 color.blue=(unsigned short) ((size_t)
8218 ((65535L*(i % map_info->green_mult))/map_info->blue_max));
8219 color.green=color.blue;
8220 color.red=color.blue;
8221 color.pixel=XStandardPixel(map_info,&color);
8225 for (i=0; i < (ssize_t) number_colors; i++)
8227 color.red=(unsigned short) 0;
8228 if (map_info->red_max != 0)
8229 color.red=(unsigned short) ((size_t)
8230 ((65535L*(i/map_info->red_mult))/map_info->red_max));
8231 color.green=(unsigned int) 0;
8232 if (map_info->green_max != 0)
8233 color.green=(unsigned short) ((size_t)
8234 ((65535L*((i/map_info->green_mult) % (map_info->green_max+1)))/
8235 map_info->green_max));
8236 color.blue=(unsigned short) 0;
8237 if (map_info->blue_max != 0)
8238 color.blue=(unsigned short) ((size_t)
8239 ((65535L*(i % map_info->green_mult))/map_info->blue_max));
8240 color.pixel=XStandardPixel(map_info,&color);
8243 if ((visual_info->klass == DirectColor) &&
8244 (colormap != XDefaultColormap(display,visual_info->screen)))
8245 (void) XStoreColors(display,colormap,colors,(int) number_colors);
8247 for (i=0; i < (ssize_t) number_colors; i++)
8248 (void) XAllocColor(display,colormap,&colors[i]);
8252 if ((visual_info->klass != DirectColor) &&
8253 (visual_info->klass != TrueColor))
8256 Set foreground, background, border, etc. pixels.
8258 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8259 &pixel->foreground_color);
8260 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8261 &pixel->background_color);
8262 if (pixel->background_color.pixel == pixel->foreground_color.pixel)
8265 Foreground and background colors must differ.
8267 pixel->background_color.red=(~pixel->foreground_color.red);
8268 pixel->background_color.green=
8269 (~pixel->foreground_color.green);
8270 pixel->background_color.blue=
8271 (~pixel->foreground_color.blue);
8272 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8273 &pixel->background_color);
8275 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8276 &pixel->border_color);
8277 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8278 &pixel->matte_color);
8279 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8280 &pixel->highlight_color);
8281 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8282 &pixel->shadow_color);
8283 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8284 &pixel->depth_color);
8285 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8286 &pixel->trough_color);
8287 for (i=0; i < MaxNumberPens; i++)
8289 XBestPixel(display,colormap,colors,(unsigned int) number_colors,
8290 &pixel->pen_colors[i]);
8291 pixel->pixels[image->colors+i]=pixel->pen_colors[i].pixel;
8293 pixel->colors=(ssize_t) (image->colors+MaxNumberPens);
8295 colors=(XColor *) RelinquishMagickMemory(colors);
8296 if (IsEventLogging())
8298 (void) LogMagickEvent(X11Event,GetMagickModule(),"Standard Colormap:");
8299 (void) LogMagickEvent(X11Event,GetMagickModule()," colormap id: 0x%lx",
8300 map_info->colormap);
8301 (void) LogMagickEvent(X11Event,GetMagickModule(),
8302 " red, green, blue max: %lu %lu %lu",map_info->red_max,
8303 map_info->green_max,map_info->blue_max);
8304 (void) LogMagickEvent(X11Event,GetMagickModule(),
8305 " red, green, blue mult: %lu %lu %lu",map_info->red_mult,
8306 map_info->green_mult,map_info->blue_mult);
8311 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8315 % X M a k e W i n d o w %
8319 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8321 % XMakeWindow() creates an X11 window.
8323 % The format of the XMakeWindow method is:
8325 % void XMakeWindow(Display *display,Window parent,char **argv,int argc,
8326 % XClassHint *class_hint,XWMHints *manager_hints,
8327 % XWindowInfo *window_info)
8329 % A description of each parameter follows:
8331 % o display: Specifies a connection to an X server; returned from
8334 % o parent: Specifies the parent window_info.
8336 % o argv: Specifies the application's argument list.
8338 % o argc: Specifies the number of arguments.
8340 % o class_hint: Specifies a pointer to a X11 XClassHint structure.
8342 % o manager_hints: Specifies a pointer to a X11 XWMHints structure.
8344 % o window_info: Specifies a pointer to a X11 XWindowInfo structure.
8347 MagickPrivate void XMakeWindow(Display *display,Window parent,char **argv,
8348 int argc,XClassHint *class_hint,XWMHints *manager_hints,
8349 XWindowInfo *window_info)
8351 #define MinWindowSize 64
8359 static XTextProperty
8370 Set window info hints.
8372 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
8373 assert(display != (Display *) NULL);
8374 assert(window_info != (XWindowInfo *) NULL);
8375 size_hints=XAllocSizeHints();
8376 if (size_hints == (XSizeHints *) NULL)
8377 ThrowXWindowFatalException(XServerFatalError,"UnableToMakeXWindow",argv[0]);
8378 size_hints->flags=(int) window_info->flags;
8379 size_hints->x=window_info->x;
8380 size_hints->y=window_info->y;
8381 size_hints->width=(int) window_info->width;
8382 size_hints->height=(int) window_info->height;
8383 if (window_info->immutable != MagickFalse)
8386 Window size cannot be changed.
8388 size_hints->min_width=size_hints->width;
8389 size_hints->min_height=size_hints->height;
8390 size_hints->max_width=size_hints->width;
8391 size_hints->max_height=size_hints->height;
8392 size_hints->flags|=PMinSize;
8393 size_hints->flags|=PMaxSize;
8398 Window size can be changed.
8400 size_hints->min_width=(int) window_info->min_width;
8401 size_hints->min_height=(int) window_info->min_height;
8402 size_hints->flags|=PResizeInc;
8403 size_hints->width_inc=(int) window_info->width_inc;
8404 size_hints->height_inc=(int) window_info->height_inc;
8405 #if !defined(PRE_R4_ICCCM)
8406 size_hints->flags|=PBaseSize;
8407 size_hints->base_width=size_hints->width_inc;
8408 size_hints->base_height=size_hints->height_inc;
8411 gravity=NorthWestGravity;
8412 if (window_info->geometry != (char *) NULL)
8415 default_geometry[MaxTextExtent],
8416 geometry[MaxTextExtent];
8425 User specified geometry.
8427 (void) FormatLocaleString(default_geometry,MaxTextExtent,"%dx%d",
8428 size_hints->width,size_hints->height);
8429 (void) CopyMagickString(geometry,window_info->geometry,MaxTextExtent);
8431 while (strlen(p) != 0)
8433 if ((isspace((int) ((unsigned char) *p)) == 0) && (*p != '%'))
8436 (void) CopyMagickString(p,p+1,MaxTextExtent);
8438 flags=XWMGeometry(display,window_info->screen,geometry,default_geometry,
8439 window_info->border_width,size_hints,&size_hints->x,&size_hints->y,
8440 &size_hints->width,&size_hints->height,&gravity);
8441 if ((flags & WidthValue) && (flags & HeightValue))
8442 size_hints->flags|=USSize;
8443 if ((flags & XValue) && (flags & YValue))
8445 size_hints->flags|=USPosition;
8446 window_info->x=size_hints->x;
8447 window_info->y=size_hints->y;
8450 #if !defined(PRE_R4_ICCCM)
8451 size_hints->win_gravity=gravity;
8452 size_hints->flags|=PWinGravity;
8454 if (window_info->id == (Window) NULL)
8455 window_info->id=XCreateWindow(display,parent,window_info->x,window_info->y,
8456 (unsigned int) size_hints->width,(unsigned int) size_hints->height,
8457 window_info->border_width,(int) window_info->depth,InputOutput,
8458 window_info->visual,(unsigned long) window_info->mask,
8459 &window_info->attributes);
8472 Window already exists; change relevant attributes.
8474 (void) XChangeWindowAttributes(display,window_info->id,(unsigned long)
8475 window_info->mask,&window_info->attributes);
8476 mask=ConfigureNotify;
8477 while (XCheckTypedWindowEvent(display,window_info->id,(int) mask,&sans_event)) ;
8478 window_changes.x=window_info->x;
8479 window_changes.y=window_info->y;
8480 window_changes.width=(int) window_info->width;
8481 window_changes.height=(int) window_info->height;
8482 mask=(MagickStatusType) (CWWidth | CWHeight);
8483 if (window_info->flags & USPosition)
8485 (void) XReconfigureWMWindow(display,window_info->id,window_info->screen,
8486 mask,&window_changes);
8488 if (window_info->id == (Window) NULL)
8489 ThrowXWindowFatalException(XServerFatalError,"UnableToCreateWindow",
8491 status=XStringListToTextProperty(&window_info->name,1,&window_name);
8492 if (status == False)
8493 ThrowXWindowFatalException(XServerFatalError,"UnableToCreateTextProperty",
8495 status=XStringListToTextProperty(&window_info->icon_name,1,&icon_name);
8496 if (status == False)
8497 ThrowXWindowFatalException(XServerFatalError,"UnableToCreateTextProperty",
8498 window_info->icon_name);
8499 if (window_info->icon_geometry != (char *) NULL)
8507 User specified icon geometry.
8509 size_hints->flags|=USPosition;
8510 flags=XWMGeometry(display,window_info->screen,window_info->icon_geometry,
8511 (char *) NULL,0,size_hints,&manager_hints->icon_x,
8512 &manager_hints->icon_y,&width,&height,&gravity);
8513 if ((flags & XValue) && (flags & YValue))
8514 manager_hints->flags|=IconPositionHint;
8516 XSetWMProperties(display,window_info->id,&window_name,&icon_name,argv,argc,
8517 size_hints,manager_hints,class_hint);
8518 if (window_name.value != (void *) NULL)
8520 (void) XFree((void *) window_name.value);
8521 window_name.value=(unsigned char *) NULL;
8522 window_name.nitems=0;
8524 if (icon_name.value != (void *) NULL)
8526 (void) XFree((void *) icon_name.value);
8527 icon_name.value=(unsigned char *) NULL;
8530 atom_list[0]=XInternAtom(display,"WM_DELETE_WINDOW",MagickFalse);
8531 atom_list[1]=XInternAtom(display,"WM_TAKE_FOCUS",MagickFalse);
8532 (void) XSetWMProtocols(display,window_info->id,atom_list,2);
8533 (void) XFree((void *) size_hints);
8534 if (window_info->shape != MagickFalse)
8536 #if defined(MAGICKCORE_HAVE_SHAPE)
8542 Can we apply a non-rectangular shaping mask?
8546 if (XShapeQueryExtension(display,&error_base,&event_base) == 0)
8547 window_info->shape=MagickFalse;
8549 window_info->shape=MagickFalse;
8552 if (window_info->shared_memory)
8554 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
8556 Can we use shared memory with this window?
8558 if (XShmQueryExtension(display) == 0)
8559 window_info->shared_memory=MagickFalse;
8561 window_info->shared_memory=MagickFalse;
8564 window_info->image=NewImageList();
8565 window_info->destroy=MagickFalse;
8569 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8573 % X M a g i c k P r o g r e s s M o n i t o r %
8577 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8579 % XMagickProgressMonitor() displays the progress a task is making in
8580 % completing a task.
8582 % The format of the XMagickProgressMonitor method is:
8584 % void XMagickProgressMonitor(const char *task,
8585 % const MagickOffsetType quantum,const MagickSizeType span,
8586 % void *client_data)
8588 % A description of each parameter follows:
8590 % o task: Identifies the task in progress.
8592 % o quantum: Specifies the quantum position within the span which represents
8593 % how much progress has been made in completing a task.
8595 % o span: Specifies the span relative to completing a task.
8597 % o client_data: Pointer to any client data.
8601 static const char *GetLocaleMonitorMessage(const char *text)
8604 message[MaxTextExtent],
8613 (void) CopyMagickMemory(tag,text,MaxTextExtent);
8615 if (p != (char *) NULL)
8617 (void) FormatLocaleString(message,MaxTextExtent,"Monitor/%s",tag);
8618 locale_message=GetLocaleMessage(message);
8619 if (locale_message == message)
8621 return(locale_message);
8624 MagickPrivate MagickBooleanType XMagickProgressMonitor(const char *tag,
8625 const MagickOffsetType quantum,const MagickSizeType span,
8626 void *magick_unused(client_data))
8631 windows=XSetWindows((XWindows *) ~0);
8632 if (windows == (XWindows *) NULL)
8634 if (windows->info.mapped != MagickFalse)
8635 XProgressMonitorWidget(windows->display,windows,
8636 GetLocaleMonitorMessage(tag),quantum,span);
8641 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8645 % X Q u e r y C o l o r D a t a b a s e %
8649 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8651 % XQueryColorCompliance() looks up a RGB values for a color given in the target
8654 % The format of the XQueryColorDatabase method is:
8656 % MagickBooleanType XQueryColorCompliance(const char *target,XColor *color)
8658 % A description of each parameter follows:
8660 % o target: Specifies the color to lookup in the X color database.
8662 % o color: A pointer to an PixelInfo structure. The RGB value of the target
8663 % color is returned as this value.
8666 MagickPrivate MagickBooleanType XQueryColorCompliance(const char *target,
8673 *display = (Display *) NULL;
8682 Initialize color return value.
8684 assert(color != (XColor *) NULL);
8688 color->flags=(char) (DoRed | DoGreen | DoBlue);
8689 if ((target == (char *) NULL) || (*target == '\0'))
8690 target="#ffffffffffff";
8692 Let the X server define the color for us.
8694 if (display == (Display *) NULL)
8695 display=XOpenDisplay((char *) NULL);
8696 if (display == (Display *) NULL)
8698 ThrowXWindowFatalException(XServerError,"ColorIsNotKnownToServer",target);
8699 return(MagickFalse);
8701 colormap=XDefaultColormap(display,XDefaultScreen(display));
8702 status=XParseColor(display,colormap,(char *) target,&xcolor);
8703 if (status == False)
8704 ThrowXWindowFatalException(XServerError,"ColorIsNotKnownToServer",target)
8707 color->red=xcolor.red;
8708 color->green=xcolor.green;
8709 color->blue=xcolor.blue;
8710 color->flags=xcolor.flags;
8712 return(status != False ? MagickTrue : MagickFalse);
8716 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8720 % X Q u e r y P o s i t i o n %
8724 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8726 % XQueryPosition() gets the pointer coordinates relative to a window.
8728 % The format of the XQueryPosition method is:
8730 % void XQueryPosition(Display *display,const Window window,int *x,int *y)
8732 % A description of each parameter follows:
8734 % o display: Specifies a connection to an X server; returned from
8737 % o window: Specifies a pointer to a Window.
8739 % o x: Return the x coordinate of the pointer relative to the origin of the
8742 % o y: Return the y coordinate of the pointer relative to the origin of the
8746 MagickPrivate void XQueryPosition(Display *display,const Window window,int *x,int *y)
8758 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
8759 assert(display != (Display *) NULL);
8760 assert(window != (Window) NULL);
8761 assert(x != (int *) NULL);
8762 assert(y != (int *) NULL);
8763 (void) XQueryPointer(display,window,&root_window,&root_window,&x_root,&y_root,
8768 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8772 % X R e f r e s h W i n d o w %
8776 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8778 % XRefreshWindow() refreshes an image in a X window.
8780 % The format of the XRefreshWindow method is:
8782 % void XRefreshWindow(Display *display,const XWindowInfo *window,
8783 % const XEvent *event)
8785 % A description of each parameter follows:
8787 % o display: Specifies a connection to an X server; returned from
8790 % o window: Specifies a pointer to a XWindowInfo structure.
8792 % o event: Specifies a pointer to a XEvent structure. If it is NULL,
8793 % the entire image is refreshed.
8796 MagickPrivate void XRefreshWindow(Display *display,const XWindowInfo *window,
8797 const XEvent *event)
8807 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
8808 assert(display != (Display *) NULL);
8809 assert(window != (XWindowInfo *) NULL);
8810 if (window->ximage == (XImage *) NULL)
8812 if (event != (XEvent *) NULL)
8815 Determine geometry from expose event.
8819 width=(unsigned int) event->xexpose.width;
8820 height=(unsigned int) event->xexpose.height;
8828 Refresh entire window; discard outstanding expose events.
8832 width=window->width;
8833 height=window->height;
8834 while (XCheckTypedWindowEvent(display,window->id,Expose,&sans_event)) ;
8835 if (window->matte_pixmap != (Pixmap) NULL)
8837 #if defined(MAGICKCORE_HAVE_SHAPE)
8838 if (window->shape != MagickFalse)
8839 XShapeCombineMask(display,window->id,ShapeBounding,0,0,
8840 window->matte_pixmap,ShapeSet);
8845 Check boundary conditions.
8847 if ((window->ximage->width-(x+window->x)) < (int) width)
8848 width=(unsigned int) (window->ximage->width-(x+window->x));
8849 if ((window->ximage->height-(y+window->y)) < (int) height)
8850 height=(unsigned int) (window->ximage->height-(y+window->y));
8854 if (window->matte_pixmap != (Pixmap) NULL)
8855 (void) XSetClipMask(display,window->annotate_context,window->matte_pixmap);
8856 if (window->pixmap != (Pixmap) NULL)
8858 if (window->depth > 1)
8859 (void) XCopyArea(display,window->pixmap,window->id,
8860 window->annotate_context,x+window->x,y+window->y,width,height,x,y);
8862 (void) XCopyPlane(display,window->pixmap,window->id,
8863 window->highlight_context,x+window->x,y+window->y,width,height,x,y,
8868 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
8869 if (window->shared_memory)
8870 (void) XShmPutImage(display,window->id,window->annotate_context,
8871 window->ximage,x+window->x,y+window->y,x,y,width,height,MagickTrue);
8873 if (window->shared_memory == MagickFalse)
8874 (void) XPutImage(display,window->id,window->annotate_context,
8875 window->ximage,x+window->x,y+window->y,x,y,width,height);
8877 if (window->matte_pixmap != (Pixmap) NULL)
8878 (void) XSetClipMask(display,window->annotate_context,None);
8879 (void) XFlush(display);
8883 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8887 % X R e m o t e C o m m a n d %
8891 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8893 % XRemoteCommand() forces a remote display(1) to display the specified
8896 % The format of the XRemoteCommand method is:
8898 % MagickBooleanType XRemoteCommand(Display *display,const char *window,
8899 % const char *filename)
8901 % A description of each parameter follows:
8903 % o display: Specifies a connection to an X server; returned from
8906 % o window: Specifies the name or id of an X window.
8908 % o filename: the name of the image filename to display.
8911 MagickExport MagickBooleanType XRemoteCommand(Display *display,
8912 const char *window,const char *filename)
8921 assert(filename != (char *) NULL);
8922 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",filename);
8923 if (display == (Display *) NULL)
8924 display=XOpenDisplay((char *) NULL);
8925 if (display == (Display *) NULL)
8927 ThrowXWindowException(XServerError,"UnableToOpenXServer",filename);
8928 return(MagickFalse);
8930 remote_atom=XInternAtom(display,"IM_PROTOCOLS",MagickFalse);
8931 remote_window=(Window) NULL;
8932 root_window=XRootWindow(display,XDefaultScreen(display));
8933 if (window != (char *) NULL)
8936 Search window hierarchy and identify any clients by name or ID.
8938 if (isdigit((unsigned char) *window) != 0)
8939 remote_window=XWindowByID(display,root_window,(Window)
8940 strtol((char *) window,(char **) NULL,0));
8941 if (remote_window == (Window) NULL)
8942 remote_window=XWindowByName(display,root_window,window);
8944 if (remote_window == (Window) NULL)
8945 remote_window=XWindowByProperty(display,root_window,remote_atom);
8946 if (remote_window == (Window) NULL)
8948 ThrowXWindowException(XServerError,"UnableToConnectToRemoteDisplay",
8950 return(MagickFalse);
8953 Send remote command.
8955 remote_atom=XInternAtom(display,"IM_REMOTE_COMMAND",MagickFalse);
8956 (void) XChangeProperty(display,remote_window,remote_atom,XA_STRING,8,
8957 PropModeReplace,(unsigned char *) filename,(int) strlen(filename));
8958 (void) XSync(display,MagickFalse);
8963 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8967 % X R e t a i n W i n d o w C o l o r s %
8971 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8973 % XRetainWindowColors() sets X11 color resources on a window. This preserves
8974 % the colors associated with an image displayed on the window.
8976 % The format of the XRetainWindowColors method is:
8978 % void XRetainWindowColors(Display *display,const Window window)
8980 % A description of each parameter follows:
8982 % o display: Specifies a connection to an X server; returned from
8985 % o window: Specifies a pointer to a XWindowInfo structure.
8988 MagickExport void XRetainWindowColors(Display *display,const Window window)
8997 Put property on the window.
8999 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
9000 assert(display != (Display *) NULL);
9001 assert(window != (Window) NULL);
9002 property=XInternAtom(display,"_XSETROOT_ID",MagickFalse);
9003 if (property == (Atom) NULL)
9005 ThrowXWindowFatalException(XServerError,"UnableToCreateProperty",
9009 pixmap=XCreatePixmap(display,window,1,1,1);
9010 if (pixmap == (Pixmap) NULL)
9012 ThrowXWindowFatalException(XServerError,"UnableToCreateBitmap","");
9015 (void) XChangeProperty(display,window,property,XA_PIXMAP,32,PropModeReplace,
9016 (unsigned char *) &pixmap,1);
9017 (void) XSetCloseDownMode(display,RetainPermanent);
9021 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9025 % X S e l e c t W i n d o w %
9029 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9031 % XSelectWindow() allows a user to select a window using the mouse. If the
9032 % mouse moves, a cropping rectangle is drawn and the extents of the rectangle
9033 % is returned in the crop_info structure.
9035 % The format of the XSelectWindow function is:
9037 % target_window=XSelectWindow(display,crop_info)
9039 % A description of each parameter follows:
9041 % o window: XSelectWindow returns the window id.
9043 % o display: Specifies a pointer to the Display structure; returned from
9046 % o crop_info: Specifies a pointer to a RectangleInfo structure. It
9047 % contains the extents of any cropping rectangle.
9050 static Window XSelectWindow(Display *display,RectangleInfo *crop_info)
9052 #define MinimumCropArea (unsigned int) 9
9079 Initialize graphic context.
9081 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
9082 assert(display != (Display *) NULL);
9083 assert(crop_info != (RectangleInfo *) NULL);
9084 root_window=XRootWindow(display,XDefaultScreen(display));
9085 context_values.background=XBlackPixel(display,XDefaultScreen(display));
9086 context_values.foreground=XWhitePixel(display,XDefaultScreen(display));
9087 context_values.function=GXinvert;
9088 context_values.plane_mask=
9089 context_values.background ^ context_values.foreground;
9090 context_values.subwindow_mode=IncludeInferiors;
9091 annotate_context=XCreateGC(display,root_window,(size_t) (GCBackground |
9092 GCForeground | GCFunction | GCSubwindowMode),&context_values);
9093 if (annotate_context == (GC) NULL)
9094 return(MagickFalse);
9096 Grab the pointer using target cursor.
9098 target_cursor=XMakeCursor(display,root_window,XDefaultColormap(display,
9099 XDefaultScreen(display)),(char * ) "white",(char * ) "black");
9100 status=XGrabPointer(display,root_window,MagickFalse,(unsigned int)
9101 (ButtonPressMask | ButtonReleaseMask | ButtonMotionMask),GrabModeSync,
9102 GrabModeAsync,root_window,target_cursor,CurrentTime);
9103 if (status != GrabSuccess)
9105 ThrowXWindowFatalException(XServerError,"UnableToGrabMouse","");
9106 return((Window) NULL);
9112 crop_info->height=0;
9114 target_window=(Window) NULL;
9119 if ((crop_info->width*crop_info->height) >= MinimumCropArea)
9120 (void) XDrawRectangle(display,root_window,annotate_context,
9121 (int) crop_info->x,(int) crop_info->y,(unsigned int) crop_info->width-1,
9122 (unsigned int) crop_info->height-1);
9124 Allow another event.
9126 (void) XAllowEvents(display,SyncPointer,CurrentTime);
9127 (void) XWindowEvent(display,root_window,ButtonPressMask |
9128 ButtonReleaseMask | ButtonMotionMask,&event);
9129 if ((crop_info->width*crop_info->height) >= MinimumCropArea)
9130 (void) XDrawRectangle(display,root_window,annotate_context,
9131 (int) crop_info->x,(int) crop_info->y,(unsigned int) crop_info->width-1,
9132 (unsigned int) crop_info->height-1);
9137 target_window=XGetSubwindow(display,event.xbutton.subwindow,
9138 event.xbutton.x,event.xbutton.y);
9139 if (target_window == (Window) NULL)
9140 target_window=root_window;
9141 x_offset=event.xbutton.x_root;
9142 y_offset=event.xbutton.y_root;
9143 crop_info->x=(ssize_t) x_offset;
9144 crop_info->y=(ssize_t) y_offset;
9146 crop_info->height=0;
9158 Discard pending button motion events.
9160 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
9161 crop_info->x=(ssize_t) event.xmotion.x;
9162 crop_info->y=(ssize_t) event.xmotion.y;
9164 Check boundary conditions.
9166 if ((int) crop_info->x < x_offset)
9167 crop_info->width=(size_t) (x_offset-crop_info->x);
9170 crop_info->width=(size_t) (crop_info->x-x_offset);
9171 crop_info->x=(ssize_t) x_offset;
9173 if ((int) crop_info->y < y_offset)
9174 crop_info->height=(size_t) (y_offset-crop_info->y);
9177 crop_info->height=(size_t) (crop_info->y-y_offset);
9178 crop_info->y=(ssize_t) y_offset;
9184 } while ((target_window == (Window) NULL) || (presses > 0));
9185 (void) XUngrabPointer(display,CurrentTime);
9186 (void) XFreeCursor(display,target_cursor);
9187 (void) XFreeGC(display,annotate_context);
9188 if ((crop_info->width*crop_info->height) < MinimumCropArea)
9191 crop_info->height=0;
9193 if ((crop_info->width != 0) && (crop_info->height != 0))
9194 target_window=root_window;
9195 return(target_window);
9199 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9203 % X S e t C u r s o r S t a t e %
9207 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9209 % XSetCursorState() sets the cursor state to busy, otherwise the cursor are
9210 % reset to their default.
9212 % The format of the XXSetCursorState method is:
9214 % XSetCursorState(display,windows,const MagickStatusType state)
9216 % A description of each parameter follows:
9218 % o display: Specifies a connection to an X server; returned from
9221 % o windows: Specifies a pointer to a XWindows structure.
9223 % o state: An unsigned integer greater than 0 sets the cursor state
9224 % to busy, otherwise the cursor are reset to their default.
9227 MagickPrivate void XSetCursorState(Display *display,XWindows *windows,
9228 const MagickStatusType state)
9230 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
9231 assert(display != (Display *) NULL);
9232 assert(windows != (XWindows *) NULL);
9235 (void) XCheckDefineCursor(display,windows->image.id,
9236 windows->image.busy_cursor);
9237 (void) XCheckDefineCursor(display,windows->pan.id,
9238 windows->pan.busy_cursor);
9239 (void) XCheckDefineCursor(display,windows->magnify.id,
9240 windows->magnify.busy_cursor);
9241 (void) XCheckDefineCursor(display,windows->command.id,
9242 windows->command.busy_cursor);
9246 (void) XCheckDefineCursor(display,windows->image.id,
9247 windows->image.cursor);
9248 (void) XCheckDefineCursor(display,windows->pan.id,windows->pan.cursor);
9249 (void) XCheckDefineCursor(display,windows->magnify.id,
9250 windows->magnify.cursor);
9251 (void) XCheckDefineCursor(display,windows->command.id,
9252 windows->command.cursor);
9253 (void) XCheckDefineCursor(display,windows->command.id,
9254 windows->widget.cursor);
9255 (void) XWithdrawWindow(display,windows->info.id,windows->info.screen);
9257 windows->info.mapped=MagickFalse;
9261 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9265 % X S e t W i n d o w s %
9269 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9271 % XSetWindows() sets the X windows structure if the windows info is specified.
9272 % Otherwise the current windows structure is returned.
9274 % The format of the XSetWindows method is:
9276 % XWindows *XSetWindows(XWindows *windows_info)
9278 % A description of each parameter follows:
9280 % o windows_info: Initialize the Windows structure with this information.
9283 MagickPrivate XWindows *XSetWindows(XWindows *windows_info)
9286 *windows = (XWindows *) NULL;
9288 if (windows_info != (XWindows *) ~0)
9290 windows=(XWindows *) RelinquishMagickMemory(windows);
9291 windows=windows_info;
9296 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9300 % X U s e r P r e f e r e n c e s %
9304 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9306 % XUserPreferences() saves the preferences in a configuration file in the
9307 % users' home directory.
9309 % The format of the XUserPreferences method is:
9311 % void XUserPreferences(XResourceInfo *resource_info)
9313 % A description of each parameter follows:
9315 % o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
9318 MagickPrivate void XUserPreferences(XResourceInfo *resource_info)
9320 #if defined(X11_PREFERENCES_PATH)
9322 cache[MaxTextExtent],
9323 filename[MaxTextExtent],
9324 specifier[MaxTextExtent];
9331 preferences_database;
9334 Save user preferences to the client configuration file.
9336 assert(resource_info != (XResourceInfo *) NULL);
9337 client_name=GetClientName();
9338 preferences_database=XrmGetStringDatabase("");
9339 (void) FormatLocaleString(specifier,MaxTextExtent,"%s.backdrop",client_name);
9340 value=resource_info->backdrop ? "True" : "False";
9341 XrmPutStringResource(&preferences_database,specifier,(char *) value);
9342 (void) FormatLocaleString(specifier,MaxTextExtent,"%s.colormap",client_name);
9343 value=resource_info->colormap == SharedColormap ? "Shared" : "Private";
9344 XrmPutStringResource(&preferences_database,specifier,(char *) value);
9345 (void) FormatLocaleString(specifier,MaxTextExtent,"%s.confirmExit",
9347 value=resource_info->confirm_exit ? "True" : "False";
9348 XrmPutStringResource(&preferences_database,specifier,(char *) value);
9349 (void) FormatLocaleString(specifier,MaxTextExtent,"%s.confirmEdit",
9351 value=resource_info->confirm_edit ? "True" : "False";
9352 XrmPutStringResource(&preferences_database,specifier,(char *) value);
9353 (void) FormatLocaleString(specifier,MaxTextExtent,"%s.displayWarnings",
9355 value=resource_info->display_warnings ? "True" : "False";
9356 XrmPutStringResource(&preferences_database,specifier,(char *) value);
9357 (void) FormatLocaleString(specifier,MaxTextExtent,"%s.dither",client_name);
9358 value=resource_info->quantize_info->dither_method != NoDitherMethod ?
9360 XrmPutStringResource(&preferences_database,specifier,(char *) value);
9361 (void) FormatLocaleString(specifier,MaxTextExtent,"%s.gammaCorrect",
9363 value=resource_info->gamma_correct ? "True" : "False";
9364 XrmPutStringResource(&preferences_database,specifier,(char *) value);
9365 (void) FormatLocaleString(specifier,MaxTextExtent,"%s.undoCache",client_name);
9366 (void) FormatLocaleString(cache,MaxTextExtent,"%.20g",(double)
9367 resource_info->undo_cache);
9368 XrmPutStringResource(&preferences_database,specifier,cache);
9369 (void) FormatLocaleString(specifier,MaxTextExtent,"%s.usePixmap",client_name);
9370 value=resource_info->use_pixmap ? "True" : "False";
9371 XrmPutStringResource(&preferences_database,specifier,(char *) value);
9372 (void) FormatLocaleString(filename,MaxTextExtent,"%s%src",
9373 X11_PREFERENCES_PATH,client_name);
9374 ExpandFilename(filename);
9375 XrmPutFileDatabase(preferences_database,filename);
9380 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9384 % X V i s u a l C l a s s N a m e %
9388 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9390 % XVisualClassName() returns the visual class name as a character string.
9392 % The format of the XVisualClassName method is:
9394 % char *XVisualClassName(const int visual_class)
9396 % A description of each parameter follows:
9398 % o visual_type: XVisualClassName returns the visual class as a character
9401 % o class: Specifies the visual class.
9404 static const char *XVisualClassName(const int visual_class)
9406 switch (visual_class)
9408 case StaticGray: return("StaticGray");
9409 case GrayScale: return("GrayScale");
9410 case StaticColor: return("StaticColor");
9411 case PseudoColor: return("PseudoColor");
9412 case TrueColor: return("TrueColor");
9413 case DirectColor: return("DirectColor");
9415 return("unknown visual class");
9419 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9427 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9429 % XWarning() displays a warning reason in a Notice widget.
9431 % The format of the XWarning method is:
9433 % void XWarning(const unsigned int warning,const char *reason,
9434 % const char *description)
9436 % A description of each parameter follows:
9438 % o warning: Specifies the numeric warning category.
9440 % o reason: Specifies the reason to display before terminating the
9443 % o description: Specifies any description to the reason.
9446 MagickPrivate void XWarning(const ExceptionType magick_unused(warning),
9447 const char *reason,const char *description)
9450 text[MaxTextExtent];
9455 if (reason == (char *) NULL)
9457 (void) CopyMagickString(text,reason,MaxTextExtent);
9458 (void) ConcatenateMagickString(text,":",MaxTextExtent);
9459 windows=XSetWindows((XWindows *) ~0);
9460 XNoticeWidget(windows->display,windows,text,(char *) description);
9464 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9468 % X W i n d o w B y I D %
9472 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9474 % XWindowByID() locates a child window with a given ID. If not window with
9475 % the given name is found, 0 is returned. Only the window specified and its
9476 % subwindows are searched.
9478 % The format of the XWindowByID function is:
9480 % child=XWindowByID(display,window,id)
9482 % A description of each parameter follows:
9484 % o child: XWindowByID returns the window with the specified
9485 % id. If no windows are found, XWindowByID returns 0.
9487 % o display: Specifies a pointer to the Display structure; returned from
9490 % o id: Specifies the id of the window to locate.
9493 MagickPrivate Window XWindowByID(Display *display,const Window root_window,
9513 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
9514 assert(display != (Display *) NULL);
9515 assert(root_window != (Window) NULL);
9517 return(XSelectWindow(display,&rectangle_info));
9518 if (root_window == id)
9519 return(root_window);
9520 status=XQueryTree(display,root_window,&child,&child,&children,
9522 if (status == False)
9523 return((Window) NULL);
9524 window=(Window) NULL;
9525 for (i=0; i < (int) number_children; i++)
9528 Search each child and their children.
9530 window=XWindowByID(display,children[i],id);
9531 if (window != (Window) NULL)
9534 if (children != (Window *) NULL)
9535 (void) XFree((void *) children);
9540 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9544 % X W i n d o w B y N a m e %
9548 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9550 % XWindowByName() locates a window with a given name on a display. If no
9551 % window with the given name is found, 0 is returned. If more than one window
9552 % has the given name, the first one is returned. Only root and its children
9555 % The format of the XWindowByName function is:
9557 % window=XWindowByName(display,root_window,name)
9559 % A description of each parameter follows:
9561 % o window: XWindowByName returns the window id.
9563 % o display: Specifies a pointer to the Display structure; returned from
9566 % o root_window: Specifies the id of the root window.
9568 % o name: Specifies the name of the window to locate.
9571 MagickPrivate Window XWindowByName(Display *display,const Window root_window,
9591 assert(display != (Display *) NULL);
9592 assert(root_window != (Window) NULL);
9593 assert(name != (char *) NULL);
9594 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",name);
9595 if (XGetWMName(display,root_window,&window_name) != 0)
9596 if (LocaleCompare((char *) window_name.value,name) == 0)
9597 return(root_window);
9598 status=XQueryTree(display,root_window,&child,&child,&children,
9600 if (status == False)
9601 return((Window) NULL);
9602 window=(Window) NULL;
9603 for (i=0; i < (int) number_children; i++)
9606 Search each child and their children.
9608 window=XWindowByName(display,children[i],name);
9609 if (window != (Window) NULL)
9612 if (children != (Window *) NULL)
9613 (void) XFree((void *) children);
9618 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9622 % X W i n d o w B y P r o p e r y %
9626 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9628 % XWindowByProperty() locates a child window with a given property. If not
9629 % window with the given name is found, 0 is returned. If more than one window
9630 % has the given property, the first one is returned. Only the window
9631 % specified and its subwindows are searched.
9633 % The format of the XWindowByProperty function is:
9635 % child=XWindowByProperty(display,window,property)
9637 % A description of each parameter follows:
9639 % o child: XWindowByProperty returns the window id with the specified
9640 % property. If no windows are found, XWindowByProperty returns 0.
9642 % o display: Specifies a pointer to the Display structure; returned from
9645 % o property: Specifies the property of the window to locate.
9648 MagickPrivate Window XWindowByProperty(Display *display,const Window window,
9649 const Atom property)
9677 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
9678 assert(display != (Display *) NULL);
9679 assert(window != (Window) NULL);
9680 assert(property != (Atom) NULL);
9681 status=XQueryTree(display,window,&root,&parent,&children,&number_children);
9682 if (status == False)
9683 return((Window) NULL);
9685 child=(Window) NULL;
9686 for (i=0; (i < number_children) && (child == (Window) NULL); i++)
9688 status=XGetWindowProperty(display,children[i],property,0L,0L,MagickFalse,
9689 (Atom) AnyPropertyType,&type,&format,&number_items,&after,&data);
9691 (void) XFree((void *) data);
9692 if ((status == Success) && (type != (Atom) NULL))
9695 for (i=0; (i < number_children) && (child == (Window) NULL); i++)
9696 child=XWindowByProperty(display,children[i],property);
9697 if (children != (Window *) NULL)
9698 (void) XFree((void *) children);
9704 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9708 % X I m p o r t I m a g e %
9712 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9714 % XImportImage() reads an image from an X window.
9716 % The format of the XImportImage method is:
9718 % Image *XImportImage(const ImageInfo *image_info,XImportInfo *ximage_info,
9719 % ExceptionInfo *exception)
9721 % A description of each parameter follows:
9723 % o image_info: the image info..
9725 % o ximage_info: Specifies a pointer to an XImportInfo structure.
9727 % o exception: return any errors or warnings in this structure.
9730 MagickExport Image *XImportImage(const ImageInfo *image_info,
9731 XImportInfo *ximage_info,ExceptionInfo *exception)
9733 assert(image_info != (const ImageInfo *) NULL);
9734 assert(image_info->signature == MagickSignature);
9735 if (image_info->debug != MagickFalse)
9736 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
9737 image_info->filename);
9738 assert(ximage_info != (XImportInfo *) NULL);
9739 assert(exception != (ExceptionInfo *) NULL);
9740 assert(exception->signature == MagickSignature);
9741 return((Image *) NULL);
9746 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9750 + X C o m p o n e n t G e n e s i s %
9754 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9756 % XComponentGenesis() instantiates the X component.
9758 % The format of the XComponentGenesis method is:
9760 % MagickBooleanType XComponentGenesis(void)
9763 MagickPrivate MagickBooleanType XComponentGenesis(void)
9769 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9773 % X G e t I m p o r t I n f o %
9777 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9779 % XGetImportInfo() initializes the XImportInfo structure.
9781 % The format of the XGetImportInfo method is:
9783 % void XGetImportInfo(XImportInfo *ximage_info)
9785 % A description of each parameter follows:
9787 % o ximage_info: Specifies a pointer to an ImageInfo structure.
9790 MagickExport void XGetImportInfo(XImportInfo *ximage_info)
9792 assert(ximage_info != (XImportInfo *) NULL);
9793 ximage_info->frame=MagickFalse;
9794 ximage_info->borders=MagickFalse;
9795 ximage_info->screen=MagickFalse;
9796 ximage_info->descend=MagickTrue;
9797 ximage_info->silent=MagickFalse;