42 #include "magick/studio.h"
43 #include "magick/animate.h"
44 #include "magick/artifact.h"
45 #include "magick/blob.h"
46 #include "magick/cache.h"
47 #include "magick/client.h"
48 #include "magick/color.h"
49 #include "magick/color-private.h"
50 #include "magick/colormap.h"
51 #include "magick/composite.h"
52 #include "magick/display.h"
53 #include "magick/distort.h"
54 #include "magick/exception.h"
55 #include "magick/exception-private.h"
56 #include "magick/geometry.h"
57 #include "magick/identify.h"
58 #include "magick/image.h"
59 #include "magick/image-private.h"
60 #include "magick/list.h"
61 #include "magick/locale_.h"
62 #include "magick/log.h"
63 #include "magick/magick.h"
64 #include "magick/memory_.h"
65 #include "magick/memory-private.h"
66 #include "magick/monitor.h"
67 #include "magick/nt-base-private.h"
68 #include "magick/option.h"
69 #include "magick/quantize.h"
70 #include "magick/quantum.h"
71 #include "magick/quantum-private.h"
72 #include "magick/resource_.h"
73 #include "magick/resize.h"
74 #include "magick/statistic.h"
75 #include "magick/string_.h"
76 #include "magick/string-private.h"
77 #include "magick/token.h"
78 #include "magick/transform.h"
79 #include "magick/utility.h"
80 #include "magick/widget.h"
81 #include "magick/xwindow.h"
82 #include "magick/xwindow-private.h"
83 #include "magick/version.h"
87 #if defined(MAGICKCORE_X11_DELEGATE)
88 #include <X11/Xproto.h>
89 #include <X11/Xlocale.h>
90 #if defined(MAGICK_HAVE_POLL)
91 # include <sys/poll.h>
93 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
94 #if defined(MAGICKCORE_HAVE_MACHINE_PARAM_H)
95 # include <machine/param.h>
99 #include <X11/extensions/XShm.h>
101 #if defined(MAGICKCORE_HAVE_SHAPE)
102 #include <X11/extensions/shape.h>
108 #define XBlueGamma(color) ClampToQuantum(blue_gamma == 1.0 ? (double) \
109 (color) : ((pow(((double) QuantumScale*(color)),1.0* \
110 PerceptibleReciprocal((double) blue_gamma))*QuantumRange)))
111 #define XGammaPixel(map,color) (size_t) (map->base_pixel+ \
112 ((ScaleQuantumToShort(XRedGamma((color)->red))*map->red_max/65535L)* \
114 ((ScaleQuantumToShort(XGreenGamma((color)->green))*map->green_max/65535L)* \
116 ((ScaleQuantumToShort(XBlueGamma((color)->blue))*map->blue_max/65535L)* \
118 #define XGreenGamma(color) ClampToQuantum(green_gamma == 1.0 ? (double) \
119 (color) : ((pow(((double) QuantumScale*(color)),1.0* \
120 PerceptibleReciprocal((double) green_gamma))*QuantumRange)))
121 #define XRedGamma(color) ClampToQuantum(red_gamma == 1.0 ? (double) \
122 (color) : ((pow(((double) QuantumScale*(color)),1.0* \
123 PerceptibleReciprocal((double) red_gamma))*QuantumRange)))
124 #define XStandardPixel(map,color) (size_t) (map->base_pixel+ \
125 (((color)->red*map->red_max/65535L)*map->red_mult)+ \
126 (((color)->green*map->green_max/65535L)*map->green_mult)+ \
127 (((color)->blue*map->blue_max/65535L)*map->blue_mult))
129 #define AccentuateModulate ScaleCharToQuantum(80)
130 #define HighlightModulate ScaleCharToQuantum(125)
131 #define ShadowModulate ScaleCharToQuantum(135)
132 #define DepthModulate ScaleCharToQuantum(185)
133 #define TroughModulate ScaleCharToQuantum(110)
135 #define XLIB_ILLEGAL_ACCESS 1
137 #undef NorthWestGravity
139 #undef NorthEastGravity
143 #undef SouthWestGravity
145 #undef SouthEastGravity
152 #define XFD_SET fd_set
172 typedef struct _DiversityPacket
189 static MagickBooleanType
190 xerror_alert = MagickFalse;
196 *XVisualClassName(
const int);
198 static MagickRealType
203 static MagickBooleanType
204 XMakePixmap(Display *,
const XResourceInfo *,XWindowInfo *);
207 XMakeImageLSBFirst(
const XResourceInfo *,
const XWindowInfo *,
Image *,
209 XMakeImageMSBFirst(
const XResourceInfo *,
const XWindowInfo *,
Image *,
235 MagickExport
void DestroyXResources(
void)
244 *magick_windows[MaxXWindows];
250 windows=XSetWindows((XWindows *) ~0);
251 if ((windows == (XWindows *) NULL) || (windows->display == (Display *) NULL))
254 magick_windows[number_windows++]=(&windows->context);
255 magick_windows[number_windows++]=(&windows->group_leader);
256 magick_windows[number_windows++]=(&windows->backdrop);
257 magick_windows[number_windows++]=(&windows->icon);
258 magick_windows[number_windows++]=(&windows->image);
259 magick_windows[number_windows++]=(&windows->info);
260 magick_windows[number_windows++]=(&windows->magnify);
261 magick_windows[number_windows++]=(&windows->pan);
262 magick_windows[number_windows++]=(&windows->command);
263 magick_windows[number_windows++]=(&windows->widget);
264 magick_windows[number_windows++]=(&windows->popup);
265 for (i=0; i < (int) number_windows; i++)
267 if (magick_windows[i]->mapped != MagickFalse)
269 (void) XWithdrawWindow(windows->display,magick_windows[i]->id,
270 magick_windows[i]->screen);
271 magick_windows[i]->mapped=MagickFalse;
273 if (magick_windows[i]->name != (
char *) NULL)
274 magick_windows[i]->name=(
char *)
275 RelinquishMagickMemory(magick_windows[i]->name);
276 if (magick_windows[i]->icon_name != (
char *) NULL)
277 magick_windows[i]->icon_name=(
char *)
278 RelinquishMagickMemory(magick_windows[i]->icon_name);
279 if (magick_windows[i]->cursor != (Cursor) NULL)
281 (void) XFreeCursor(windows->display,magick_windows[i]->cursor);
282 magick_windows[i]->cursor=(Cursor) NULL;
284 if (magick_windows[i]->busy_cursor != (Cursor) NULL)
286 (void) XFreeCursor(windows->display,magick_windows[i]->busy_cursor);
287 magick_windows[i]->busy_cursor=(Cursor) NULL;
289 if (magick_windows[i]->highlight_stipple != (Pixmap) NULL)
291 (void) XFreePixmap(windows->display,
292 magick_windows[i]->highlight_stipple);
293 magick_windows[i]->highlight_stipple=(Pixmap) NULL;
295 if (magick_windows[i]->shadow_stipple != (Pixmap) NULL)
297 (void) XFreePixmap(windows->display,magick_windows[i]->shadow_stipple);
298 magick_windows[i]->shadow_stipple=(Pixmap) NULL;
300 if (magick_windows[i]->matte_image != (XImage *) NULL)
302 XDestroyImage(magick_windows[i]->matte_image);
303 magick_windows[i]->matte_image=(XImage *) NULL;
305 if (magick_windows[i]->ximage != (XImage *) NULL)
307 XDestroyImage(magick_windows[i]->ximage);
308 magick_windows[i]->ximage=(XImage *) NULL;
310 if (magick_windows[i]->pixmap != (Pixmap) NULL)
312 (void) XFreePixmap(windows->display,magick_windows[i]->pixmap);
313 magick_windows[i]->pixmap=(Pixmap) NULL;
315 if (magick_windows[i]->
id != (Window) NULL)
317 (void) XDestroyWindow(windows->display,magick_windows[i]->id);
318 magick_windows[i]->id=(Window) NULL;
320 if (magick_windows[i]->destroy != MagickFalse)
322 if (magick_windows[i]->image != (
Image *) NULL)
324 magick_windows[i]->image=DestroyImage(magick_windows[i]->image);
325 magick_windows[i]->image=NewImageList();
327 if (magick_windows[i]->matte_pixmap != (Pixmap) NULL)
329 (void) XFreePixmap(windows->display,
330 magick_windows[i]->matte_pixmap);
331 magick_windows[i]->matte_pixmap=(Pixmap) NULL;
334 if (magick_windows[i]->segment_info != (
void *) NULL)
336 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
340 segment_info=(XShmSegmentInfo *) magick_windows[i]->segment_info;
341 if (segment_info != (XShmSegmentInfo *) NULL)
342 if (segment_info[0].shmid >= 0)
344 if (segment_info[0].shmaddr != NULL)
345 (void) shmdt(segment_info[0].shmaddr);
346 (void) shmctl(segment_info[0].shmid,IPC_RMID,0);
347 segment_info[0].shmaddr=NULL;
348 segment_info[0].shmid=(-1);
351 magick_windows[i]->segment_info=(
void *) RelinquishMagickMemory(
352 magick_windows[i]->segment_info);
355 windows->icon_resources=(XResourceInfo *)
356 RelinquishMagickMemory(windows->icon_resources);
357 if (windows->icon_pixel != (XPixelInfo *) NULL)
359 if (windows->icon_pixel->pixels != (
unsigned long *) NULL)
360 windows->icon_pixel->pixels=(
unsigned long *)
361 RelinquishMagickMemory(windows->icon_pixel->pixels);
362 if (windows->icon_pixel->annotate_context != (GC) NULL)
363 XFreeGC(windows->display,windows->icon_pixel->annotate_context);
364 windows->icon_pixel=(XPixelInfo *)
365 RelinquishMagickMemory(windows->icon_pixel);
367 if (windows->pixel_info != (XPixelInfo *) NULL)
369 if (windows->pixel_info->pixels != (
unsigned long *) NULL)
370 windows->pixel_info->pixels=(
unsigned long *)
371 RelinquishMagickMemory(windows->pixel_info->pixels);
372 if (windows->pixel_info->annotate_context != (GC) NULL)
373 XFreeGC(windows->display,windows->pixel_info->annotate_context);
374 if (windows->pixel_info->widget_context != (GC) NULL)
375 XFreeGC(windows->display,windows->pixel_info->widget_context);
376 if (windows->pixel_info->highlight_context != (GC) NULL)
377 XFreeGC(windows->display,windows->pixel_info->highlight_context);
378 windows->pixel_info=(XPixelInfo *)
379 RelinquishMagickMemory(windows->pixel_info);
381 if (windows->font_info != (XFontStruct *) NULL)
383 XFreeFont(windows->display,windows->font_info);
384 windows->font_info=(XFontStruct *) NULL;
386 if (windows->class_hints != (XClassHint *) NULL)
388 if (windows->class_hints->res_name != (
char *) NULL)
389 windows->class_hints->res_name=DestroyString(
390 windows->class_hints->res_name);
391 if (windows->class_hints->res_class != (
char *) NULL)
392 windows->class_hints->res_class=DestroyString(
393 windows->class_hints->res_class);
394 XFree(windows->class_hints);
395 windows->class_hints=(XClassHint *) NULL;
397 if (windows->manager_hints != (XWMHints *) NULL)
399 XFree(windows->manager_hints);
400 windows->manager_hints=(XWMHints *) NULL;
402 if (windows->map_info != (XStandardColormap *) NULL)
404 XFree(windows->map_info);
405 windows->map_info=(XStandardColormap *) NULL;
407 if (windows->icon_map != (XStandardColormap *) NULL)
409 XFree(windows->icon_map);
410 windows->icon_map=(XStandardColormap *) NULL;
412 if (windows->visual_info != (XVisualInfo *) NULL)
414 XFree(windows->visual_info);
415 windows->visual_info=(XVisualInfo *) NULL;
417 if (windows->icon_visual != (XVisualInfo *) NULL)
419 XFree(windows->icon_visual);
420 windows->icon_visual=(XVisualInfo *) NULL;
422 (void) XSetWindows((XWindows *) NULL);
455 MagickExport MagickBooleanType XAnnotateImage(Display *display,
456 const XPixelInfo *pixel,XAnnotateInfo *annotate_info,
Image *image)
497 assert(display != (Display *) NULL);
498 assert(pixel != (XPixelInfo *) NULL);
499 assert(annotate_info != (XAnnotateInfo *) NULL);
500 assert(image != (
Image *) NULL);
501 if (IsEventLogging() != MagickFalse)
502 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
506 root_window=XRootWindow(display,XDefaultScreen(display));
507 depth=(
unsigned int) XDefaultDepth(display,XDefaultScreen(display));
508 annotate_pixmap=XCreatePixmap(display,root_window,annotate_info->width,
509 annotate_info->height,depth);
510 if (annotate_pixmap == (Pixmap) NULL)
515 context_values.background=0;
516 context_values.foreground=(size_t) (~0);
517 context_values.font=annotate_info->font_info->fid;
518 annotate_context=XCreateGC(display,root_window,(
unsigned long)
519 (GCBackground | GCFont | GCForeground),&context_values);
520 if (annotate_context == (GC) NULL)
525 (void) XDrawImageString(display,annotate_pixmap,annotate_context,0,
526 (
int) annotate_info->font_info->ascent,annotate_info->text,
527 (int) strlen(annotate_info->text));
528 (void) XFreeGC(display,annotate_context);
532 annotate_ximage=XGetImage(display,annotate_pixmap,0,0,annotate_info->width,
533 annotate_info->height,AllPlanes,ZPixmap);
534 if (annotate_ximage == (XImage *) NULL)
536 (void) XFreePixmap(display,annotate_pixmap);
540 annotate_image=AcquireImage((
ImageInfo *) NULL);
541 if (annotate_image == (
Image *) NULL)
543 annotate_image->columns=annotate_info->width;
544 annotate_image->rows=annotate_info->height;
548 width=(
unsigned int) image->columns;
549 height=(
unsigned int) image->rows;
552 (void) XParseGeometry(annotate_info->geometry,&x,&y,&width,&height);
553 (void) GetOneVirtualPixel(image,(ssize_t) x,(ssize_t) y,
554 &annotate_image->background_color,&image->exception);
555 if (annotate_info->stencil == ForegroundStencil)
556 annotate_image->matte=MagickTrue;
557 exception=(&image->exception);
558 annotate_view=AcquireAuthenticCacheView(annotate_image,exception);
559 for (y=0; y < (int) annotate_image->rows; y++)
567 q=GetCacheViewAuthenticPixels(annotate_view,0,(ssize_t) y,
568 annotate_image->columns,1,exception);
571 for (x=0; x < (int) annotate_image->columns; x++)
573 SetPixelOpacity(q,OpaqueOpacity);
574 if (XGetPixel(annotate_ximage,x,y) == 0)
579 SetPixelRed(q,ScaleShortToQuantum(pixel->box_color.red));
580 SetPixelGreen(q,ScaleShortToQuantum(pixel->box_color.green));
581 SetPixelBlue(q,ScaleShortToQuantum(pixel->box_color.blue));
582 if ((annotate_info->stencil == ForegroundStencil) ||
583 (annotate_info->stencil == OpaqueStencil))
584 SetPixelOpacity(q,TransparentOpacity);
591 SetPixelRed(q,ScaleShortToQuantum(pixel->pen_color.red));
592 SetPixelGreen(q,ScaleShortToQuantum(pixel->pen_color.green));
593 SetPixelBlue(q,ScaleShortToQuantum(pixel->pen_color.blue));
594 if (annotate_info->stencil == BackgroundStencil)
595 SetPixelOpacity(q,TransparentOpacity);
599 if (SyncCacheViewAuthenticPixels(annotate_view,exception) == MagickFalse)
602 annotate_view=DestroyCacheView(annotate_view);
603 XDestroyImage(annotate_ximage);
607 (void) XParseGeometry(annotate_info->geometry,&x,&y,&width,&height);
608 if ((width != (
unsigned int) annotate_image->columns) ||
609 (height != (
unsigned int) annotate_image->rows))
612 image_geometry[MaxTextExtent];
617 (void) FormatLocaleString(image_geometry,MaxTextExtent,
"%ux%u",
619 (void) TransformImage(&annotate_image,(
char *) NULL,image_geometry);
621 if (annotate_info->degrees != 0.0)
636 RotateImage(annotate_image,annotate_info->degrees,&image->exception);
637 if (rotate_image == (
Image *) NULL)
639 annotate_image=DestroyImage(annotate_image);
640 annotate_image=rotate_image;
644 normalized_degrees=annotate_info->degrees;
645 while (normalized_degrees < -45.0)
646 normalized_degrees+=360.0;
647 for (rotations=0; normalized_degrees > 45.0; rotations++)
648 normalized_degrees-=90.0;
649 switch (rotations % 4)
659 x-=(int) annotate_image->columns/2;
660 y+=(
int) annotate_image->columns/2;
668 x=x-(int) annotate_image->columns;
676 x=x-(int) annotate_image->columns/2;
677 y=y-(
int) (annotate_image->rows-(annotate_image->columns/2));
685 (void) XParseGeometry(annotate_info->geometry,&x,&y,&width,&height);
687 (void) CompositeImage(image,annotate_image->matte != MagickFalse ?
688 OverCompositeOp : CopyCompositeOp,annotate_image,(ssize_t) x,(ssize_t) y);
690 annotate_image=DestroyImage(annotate_image);
727 static char **FontToList(
char *font)
742 if (font == (
char *) NULL)
743 return((
char **) NULL);
748 for (p=font; *p !=
'\0'; p++)
749 if ((*p ==
':') || (*p ==
';') || (*p ==
','))
751 fontlist=(
char **) AcquireQuantumMemory((
size_t) fonts+1UL,
sizeof(*fontlist));
752 if (fontlist == (
char **) NULL)
753 ThrowXWindowFatalException(ResourceLimitError,
"MemoryAllocationFailed",
756 for (i=0; i < (int) fonts; i++)
758 for (q=p; *q !=
'\0'; q++)
759 if ((*q ==
':') || (*q ==
';') || (*q ==
','))
761 fontlist[i]=(
char *) AcquireQuantumMemory((
size_t) (q-p)+1UL,
762 sizeof(*fontlist[i]));
763 if (fontlist[i] == (
char *) NULL)
764 ThrowXWindowFatalException(ResourceLimitError,
"MemoryAllocationFailed",
766 (void) CopyMagickString(fontlist[i],p,(
size_t) (q-p+1));
769 fontlist[i]=(
char *) NULL;
773 MagickExport XFontStruct *XBestFont(Display *display,
774 const XResourceInfo *resource_info,
const MagickBooleanType text_font)
779 "-*-helvetica-medium-r-normal--12-*-*-*-*-*-iso8859-1",
780 "-*-arial-medium-r-normal--12-*-*-*-*-*-iso8859-1",
781 "-*-helvetica-medium-r-normal--12-*-*-*-*-*-iso8859-15",
782 "-*-arial-medium-r-normal--12-*-*-*-*-*-iso8859-15",
783 "-*-helvetica-medium-r-normal--12-*-*-*-*-*-*-*",
784 "-*-arial-medium-r-normal--12-*-*-*-*-*-*-*",
791 "-*-courier-medium-r-normal-*-12-*-*-*-*-*-iso8859-1",
792 "-*-courier-medium-r-normal-*-12-*-*-*-*-*-iso8859-15",
793 "-*-fixed-medium-r-normal-*-12-*-*-*-*-*-*-*",
807 font_info=(XFontStruct *) NULL;
808 font_name=resource_info->font;
809 if (text_font != MagickFalse)
810 font_name=resource_info->text_font;
811 if ((font_name != (
char *) NULL) && (*font_name !=
'\0'))
822 fontlist=FontToList(font_name);
823 if (fontlist != (
char **) NULL)
825 for (i=0; fontlist[i] != (
char *) NULL; i++)
827 if (font_info == (XFontStruct *) NULL)
828 font_info=XLoadQueryFont(display,fontlist[i]);
829 fontlist[i]=DestroyString(fontlist[i]);
831 fontlist=(
char **) RelinquishMagickMemory(fontlist);
833 if (font_info == (XFontStruct *) NULL)
834 ThrowXWindowException(XServerError,
"UnableToLoadFont",font_name);
840 if (text_font != MagickFalse)
842 if (XDisplayHeight(display,XDefaultScreen(display)) >= 748)
844 while (*p != (
char *) NULL)
846 if (font_info != (XFontStruct *) NULL)
848 font_info=XLoadQueryFont(display,(
char *) *p);
881 MagickExport
void XBestIconSize(Display *display,XWindowInfo *window,
907 assert(display != (Display *) NULL);
908 assert(window != (XWindowInfo *) NULL);
909 assert(image != (
Image *) NULL);
910 if (IsEventLogging() != MagickFalse)
911 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
912 window->width=MaxIconSize;
913 window->height=MaxIconSize;
914 icon_size=(XIconSize *) NULL;
916 root_window=XRootWindow(display,window->screen);
917 if (XGetIconSizes(display,root_window,&size_list,&number_sizes) != 0)
918 if ((number_sizes > 0) && (size_list != (XIconSize *) NULL))
920 if (icon_size == (XIconSize *) NULL)
925 icon_size=XAllocIconSize();
926 if (icon_size == (XIconSize *) NULL)
927 ThrowXWindowFatalException(ResourceLimitError,
928 "MemoryAllocationFailed",image->filename);
929 icon_size->min_width=1;
930 icon_size->max_width=MaxIconSize;
931 icon_size->min_height=1;
932 icon_size->max_height=MaxIconSize;
933 icon_size->width_inc=1;
934 icon_size->height_inc=1;
939 width=(
unsigned int) image->columns;
940 height=(
unsigned int) image->rows;
942 if (window->crop_geometry)
943 (void) XParseGeometry(window->crop_geometry,&i,&i,&width,&height);
947 scale_factor=(MagickRealType) icon_size->max_width/width;
948 if (scale_factor > ((MagickRealType) icon_size->max_height/height))
949 scale_factor=(MagickRealType) icon_size->max_height/height;
950 icon_width=(
unsigned int) icon_size->min_width;
951 while ((
int) icon_width < icon_size->max_width)
953 if (icon_width >= (
unsigned int) (scale_factor*width+0.5))
955 icon_width+=icon_size->width_inc;
957 icon_height=(
unsigned int) icon_size->min_height;
958 while ((
int) icon_height < icon_size->max_height)
960 if (icon_height >= (
unsigned int) (scale_factor*height+0.5))
962 icon_height+=icon_size->height_inc;
964 (void) XFree((
void *) icon_size);
965 window->width=icon_width;
966 window->height=icon_height;
1007 MagickExport
void XBestPixel(Display *display,
const Colormap colormap,
1008 XColor *colors,
unsigned int number_colors,XColor *color)
1032 assert(display != (Display *) NULL);
1033 assert(color != (XColor *) NULL);
1034 if (IsEventLogging() != MagickFalse)
1035 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
1036 status=XAllocColor(display,colormap,color);
1037 if (status != False)
1039 query_server=colors == (XColor *) NULL ? MagickTrue : MagickFalse;
1040 if (query_server != MagickFalse)
1045 colors=(XColor *) AcquireQuantumMemory(number_colors,
sizeof(*colors));
1046 if (colors == (XColor *) NULL)
1047 ThrowXWindowFatalException(ResourceLimitError,
1048 "MemoryAllocationFailed",
"...");
1049 for (i=0; i < (int) number_colors; i++)
1050 colors[i].pixel=(
size_t) i;
1051 if (number_colors > 256)
1053 (void) XQueryColors(display,colormap,colors,(
int) number_colors);
1055 min_distance=3.0*((MagickRealType) QuantumRange+1.0)*((MagickRealType)
1058 for (i=0; i < (int) number_colors; i++)
1060 pixel.red=colors[i].red-(MagickRealType) color->red;
1061 distance=pixel.red*pixel.red;
1062 if (distance > min_distance)
1064 pixel.green=colors[i].green-(MagickRealType) color->green;
1065 distance+=pixel.green*pixel.green;
1066 if (distance > min_distance)
1068 pixel.blue=colors[i].blue-(MagickRealType) color->blue;
1069 distance+=pixel.blue*pixel.blue;
1070 if (distance > min_distance)
1072 min_distance=distance;
1073 color->pixel=colors[i].pixel;
1076 (void) XAllocColor(display,colormap,&colors[j]);
1077 if (query_server != MagickFalse)
1078 colors=(XColor *) RelinquishMagickMemory(colors);
1126 MagickExport XVisualInfo *XBestVisualInfo(Display *display,
1127 XStandardColormap *map_info,XResourceInfo *resource_info)
1129 #define MaxStandardColormaps 7
1130 #define XVisualColormapSize(visual_info) MagickMin((unsigned int) (\
1131 (visual_info->klass == TrueColor) || (visual_info->klass == DirectColor) ? \
1132 visual_info->red_mask | visual_info->green_mask | visual_info->blue_mask : \
1133 (unsigned long) visual_info->colormap_size),1UL << visual_info->depth)
1161 assert(display != (Display *) NULL);
1162 assert(map_info != (XStandardColormap *) NULL);
1163 assert(resource_info != (XResourceInfo *) NULL);
1164 if (IsEventLogging() != MagickFalse)
1165 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
1166 map_type=resource_info->map_type;
1167 visual_type=resource_info->visual_type;
1168 visual_mask=VisualScreenMask;
1169 visual_template.screen=XDefaultScreen(display);
1170 visual_template.depth=XDefaultDepth(display,XDefaultScreen(display));
1172 if ((resource_info->immutable != MagickFalse) && (resource_info->colors != 0))
1173 if (resource_info->colors <= (one << (
size_t) visual_template.depth))
1174 visual_mask|=VisualDepthMask;
1175 if (visual_type != (
char *) NULL)
1180 if (LocaleCompare(
"staticgray",visual_type) == 0)
1182 visual_mask|=VisualClassMask;
1183 visual_template.klass=StaticGray;
1186 if (LocaleCompare(
"grayscale",visual_type) == 0)
1188 visual_mask|=VisualClassMask;
1189 visual_template.klass=GrayScale;
1192 if (LocaleCompare(
"staticcolor",visual_type) == 0)
1194 visual_mask|=VisualClassMask;
1195 visual_template.klass=StaticColor;
1198 if (LocaleCompare(
"pseudocolor",visual_type) == 0)
1200 visual_mask|=VisualClassMask;
1201 visual_template.klass=PseudoColor;
1204 if (LocaleCompare(
"truecolor",visual_type) == 0)
1206 visual_mask|=VisualClassMask;
1207 visual_template.klass=TrueColor;
1210 if (LocaleCompare(
"directcolor",visual_type) == 0)
1212 visual_mask|=VisualClassMask;
1213 visual_template.klass=DirectColor;
1216 if (LocaleCompare(
"default",visual_type) == 0)
1218 visual_mask|=VisualIDMask;
1219 visual_template.visualid=XVisualIDFromVisual(
1220 XDefaultVisual(display,XDefaultScreen(display)));
1223 if (isdigit((
int) ((
unsigned char) *visual_type)) != 0)
1225 visual_mask|=VisualIDMask;
1226 visual_template.visualid=
1227 strtol(visual_type,(
char **) NULL,0);
1230 ThrowXWindowException(XServerError,
1231 "UnrecognizedVisualSpecifier",visual_type);
1237 visual_list=XGetVisualInfo(display,visual_mask,&visual_template,
1239 visual_mask=VisualScreenMask | VisualIDMask;
1240 if ((number_visuals == 0) || (visual_list == (XVisualInfo *) NULL))
1245 ThrowXWindowException(XServerWarning,
"UnableToGetVisual",visual_type);
1246 visual_template.visualid=XVisualIDFromVisual(XDefaultVisual(display,
1247 XDefaultScreen(display)));
1248 visual_list=XGetVisualInfo(display,visual_mask,&visual_template,
1250 if ((number_visuals == 0) || (visual_list == (XVisualInfo *) NULL))
1251 return((XVisualInfo *) NULL);
1252 ThrowXWindowException(XServerWarning,
"UsingDefaultVisual",
1253 XVisualClassName(visual_list->klass));
1255 resource_info->color_recovery=MagickFalse;
1256 if ((map_info != (XStandardColormap *) NULL) && (map_type != (
char *) NULL))
1262 map_name[MaxTextExtent];
1280 map_list=(XStandardColormap *) NULL;
1281 root_window=XRootWindow(display,XDefaultScreen(display));
1284 if (LocaleCompare(map_type,
"list") != 0)
1289 (void) FormatLocaleString((
char *) map_name,MaxTextExtent,
1290 "RGB_%s_MAP",map_type);
1291 LocaleUpper(map_name);
1292 map_property=XInternAtom(display,(
char *) map_name,MagickTrue);
1293 if (map_property != (Atom) NULL)
1294 status=XGetRGBColormaps(display,root_window,&map_list,&number_maps,
1300 *colormap[MaxStandardColormaps]=
1302 "_HP_RGB_SMOOTH_MAP_LIST",
1314 for (i=0; i < MaxStandardColormaps; i++)
1316 map_property=XInternAtom(display,(
char *) colormap[i],MagickTrue);
1317 if (map_property == (Atom) NULL)
1319 status=XGetRGBColormaps(display,root_window,&map_list,&number_maps,
1321 if (status != False)
1324 resource_info->color_recovery=i == 0 ? MagickTrue : MagickFalse;
1326 if (status == False)
1327 ThrowXWindowFatalException(XServerError,
"UnableToGetStandardColormap",
1332 *map_info=map_list[0];
1333 #if !defined(PRE_R4_ICCCM)
1334 visual_template.visualid=XVisualIDFromVisual(visual_list[0].visual);
1335 for (i=0; i < number_maps; i++)
1336 for (j=0; j < number_visuals; j++)
1337 if (map_list[i].visualid ==
1338 XVisualIDFromVisual(visual_list[j].visual))
1340 *map_info=map_list[i];
1341 visual_template.visualid=XVisualIDFromVisual(
1342 visual_list[j].visual);
1345 if (map_info->visualid != visual_template.visualid)
1346 ThrowXWindowFatalException(XServerError,
1347 "UnableToMatchVisualToStandardColormap",map_type);
1349 if (map_info->colormap == (Colormap) NULL)
1350 ThrowXWindowFatalException(XServerError,
1351 "StandardColormapIsNotInitialized",map_type);
1352 (void) XFree((
void *) map_list);
1356 static const unsigned int
1373 visual_info=visual_list;
1375 for (i=1; i < number_visuals; i++)
1378 if (XVisualColormapSize(p) > XVisualColormapSize(visual_info))
1381 if (XVisualColormapSize(p) == XVisualColormapSize(visual_info))
1382 if (rank[p->klass] > rank[visual_info->klass])
1385 visual_template.visualid=XVisualIDFromVisual(visual_info->visual);
1387 (void) XFree((
void *) visual_list);
1391 visual_info=XGetVisualInfo(display,visual_mask,&visual_template,
1393 if ((number_visuals == 0) || (visual_info == (XVisualInfo *) NULL))
1394 return((XVisualInfo *) NULL);
1395 return(visual_info);
1425 MagickExport
int XCheckDefineCursor(Display *display,Window window,
1428 assert(display != (Display *) NULL);
1429 if (IsEventLogging() != MagickFalse)
1430 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
1431 if (window == XRootWindow(display,XDefaultScreen(display)))
1433 return(XDefineCursor(display,window,cursor));
1462 MagickExport
void XCheckRefreshWindows(Display *display,XWindows *windows)
1470 assert(display != (Display *) NULL);
1471 assert(windows != (XWindows *) NULL);
1472 if (IsEventLogging() != MagickFalse)
1473 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
1474 XDelay(display,SuspendTime);
1475 id=windows->command.id;
1476 while (XCheckTypedWindowEvent(display,
id,Expose,&event) != MagickFalse)
1477 (void) XCommandWidget(display,windows,(
char const **) NULL,&event);
1478 id=windows->image.id;
1479 while (XCheckTypedWindowEvent(display,
id,Expose,&event) != MagickFalse)
1480 XRefreshWindow(display,&windows->image,&event);
1481 XDelay(display,SuspendTime << 1);
1482 id=windows->command.id;
1483 while (XCheckTypedWindowEvent(display,
id,Expose,&event) != MagickFalse)
1484 (void) XCommandWidget(display,windows,(
char const **) NULL,&event);
1485 id=windows->image.id;
1486 while (XCheckTypedWindowEvent(display,
id,Expose,&event) != MagickFalse)
1487 XRefreshWindow(display,&windows->image,&event);
1522 MagickExport
void XClientMessage(Display *display,
const Window window,
1523 const Atom protocol,
const Atom reason,
const Time timestamp)
1528 assert(display != (Display *) NULL);
1529 (void) memset(&client_event,0,
sizeof(client_event));
1530 client_event.type=ClientMessage;
1531 client_event.window=window;
1532 client_event.message_type=protocol;
1533 client_event.format=32;
1534 client_event.data.l[0]=(long) reason;
1535 client_event.data.l[1]=(long) timestamp;
1536 (void) XSendEvent(display,window,MagickFalse,NoEventMask,(XEvent *) &client_event);
1570 static Window XClientWindow(Display *display,Window target_window)
1592 assert(display != (Display *) NULL);
1593 if (IsEventLogging() != MagickFalse)
1594 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
1595 state=XInternAtom(display,
"WM_STATE",MagickTrue);
1596 if (state == (Atom) NULL)
1597 return(target_window);
1599 status=XGetWindowProperty(display,target_window,state,0L,0L,MagickFalse,
1600 (Atom) AnyPropertyType,&type,&format,&number_items,&after,&data);
1601 if ((status == Success) && (type != (Atom) NULL))
1602 return(target_window);
1603 client_window=XWindowByProperty(display,target_window,state);
1604 if (client_window == (Window) NULL)
1605 return(target_window);
1606 return(client_window);
1627 MagickExport
void XComponentTerminus(
void)
1629 DestroyXResources();
1662 MagickExport
void XConfigureImageColormap(Display *display,
1663 XResourceInfo *resource_info,XWindows *windows,
Image *image)
1671 XSetCursorState(display,windows,MagickTrue);
1672 XCheckRefreshWindows(display,windows);
1673 XMakeStandardColormap(display,windows->visual_info,resource_info,image,
1674 windows->map_info,windows->pixel_info);
1675 colormap=windows->map_info->colormap;
1676 (void) XSetWindowColormap(display,windows->image.id,colormap);
1677 (void) XSetWindowColormap(display,windows->command.id,colormap);
1678 (void) XSetWindowColormap(display,windows->widget.id,colormap);
1679 if (windows->magnify.mapped != MagickFalse)
1680 (void) XSetWindowColormap(display,windows->magnify.id,colormap);
1681 if (windows->pan.mapped != MagickFalse)
1682 (void) XSetWindowColormap(display,windows->pan.id,colormap);
1683 XSetCursorState(display,windows,MagickFalse);
1684 XClientMessage(display,windows->image.id,windows->im_protocols,
1685 windows->im_update_colormap,CurrentTime);
1714 MagickExport
void XConstrainWindowPosition(Display *display,
1715 XWindowInfo *window_info)
1720 assert(display != (Display *) NULL);
1721 assert(window_info != (XWindowInfo *) NULL);
1722 if (IsEventLogging() != MagickFalse)
1723 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
1724 limit=XDisplayWidth(display,window_info->screen)-window_info->width;
1725 if (window_info->x < 0)
1728 if (window_info->x > (
int) limit)
1729 window_info->x=(int) limit;
1730 limit=XDisplayHeight(display,window_info->screen)-window_info->height;
1731 if (window_info->y < 0)
1734 if (window_info->y > limit)
1735 window_info->y=limit;
1765 MagickExport
void XDelay(Display *display,
const size_t milliseconds)
1767 assert(display != (Display *) NULL);
1768 (void) XFlush(display);
1769 MagickDelay(milliseconds);
1795 MagickExport
void XDestroyResourceInfo(XResourceInfo *resource_info)
1797 if (resource_info->image_geometry != (
char *) NULL)
1798 resource_info->image_geometry=(
char *)
1799 RelinquishMagickMemory(resource_info->image_geometry);
1800 if (resource_info->quantize_info != (
QuantizeInfo *) NULL)
1801 resource_info->quantize_info=DestroyQuantizeInfo(
1802 resource_info->quantize_info);
1803 if (resource_info->client_name != (
char *) NULL)
1804 resource_info->client_name=(
char *)
1805 RelinquishMagickMemory(resource_info->client_name);
1806 if (resource_info->name != (
char *) NULL)
1807 resource_info->name=DestroyString(resource_info->name);
1808 (void) memset(resource_info,0,
sizeof(*resource_info));
1837 MagickExport
void XDestroyWindowColors(Display *display,Window window)
1859 assert(display != (Display *) NULL);
1860 if (IsEventLogging() != MagickFalse)
1861 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
1862 property=XInternAtom(display,
"_XSETROOT_ID",MagickFalse);
1863 if (property == (Atom) NULL)
1864 ThrowXWindowFatalException(XServerError,
"UnableToCreateProperty",
1866 status=XGetWindowProperty(display,window,property,0L,1L,MagickTrue,
1867 (Atom) AnyPropertyType,&type,&format,&length,&after,&data);
1868 if (status != Success)
1870 if ((type == XA_PIXMAP) && (format == 32) && (length == 1) && (after == 0))
1872 (void) XKillClient(display,(XID) (*((Pixmap *) data)));
1873 (void) XDeleteProperty(display,window,property);
1876 (void) XFree((
void *) data);
1912 MagickExport
void XDisplayImageInfo(Display *display,
1913 const XResourceInfo *resource_info,XWindows *windows,
Image *undo_image,
1917 filename[MaxTextExtent],
1942 assert(display != (Display *) NULL);
1943 assert(resource_info != (XResourceInfo *) NULL);
1944 assert(windows != (XWindows *) NULL);
1945 assert(image != (
Image *) NULL);
1946 if (IsEventLogging() != MagickFalse)
1947 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1949 unique_file=AcquireUniqueFileResource(filename);
1950 if (unique_file != -1)
1951 file=fdopen(unique_file,
"w");
1952 if ((unique_file == -1) || (file == (FILE *) NULL))
1954 XNoticeWidget(display,windows,
"Unable to display image info",filename);
1957 if (resource_info->gamma_correct != MagickFalse)
1958 if (resource_info->display_gamma != (
char *) NULL)
1959 (void) FormatLocaleFile(file,
"Display\n gamma: %s\n\n",
1960 resource_info->display_gamma);
1964 (void) FormatLocaleFile(file,
"X\n visual: %s\n",
1965 XVisualClassName((
int) windows->image.storage_class));
1966 (void) FormatLocaleFile(file,
" depth: %d\n",windows->image.ximage->depth);
1967 if (windows->visual_info->colormap_size != 0)
1968 (void) FormatLocaleFile(file,
" colormap size: %d\n",
1969 windows->visual_info->colormap_size);
1970 if (resource_info->colormap== SharedColormap)
1971 (void) FormatLocaleFile(file,
" colormap type: Shared\n");
1973 (
void) FormatLocaleFile(file,
" colormap type: Private\n");
1974 (void) FormatLocaleFile(file,
" geometry: %dx%d\n",
1975 windows->image.ximage->width,windows->image.ximage->height);
1976 if (windows->image.crop_geometry != (
char *) NULL)
1977 (
void) FormatLocaleFile(file,
" crop geometry: %s\n",
1978 windows->image.crop_geometry);
1979 if (windows->image.pixmap == (Pixmap) NULL)
1980 (void) FormatLocaleFile(file,
" type: X Image\n");
1982 (
void) FormatLocaleFile(file,
" type: Pixmap\n");
1983 if (windows->image.shape != MagickFalse)
1984 (void) FormatLocaleFile(file,
" non-rectangular shape: True\n");
1986 (
void) FormatLocaleFile(file,
" non-rectangular shape: False\n");
1987 if (windows->image.shared_memory != MagickFalse)
1988 (void) FormatLocaleFile(file,
" shared memory: True\n");
1990 (
void) FormatLocaleFile(file,
" shared memory: False\n");
1991 (void) FormatLocaleFile(file,
"\n");
1992 if (resource_info->font != (
char *) NULL)
1993 (
void) FormatLocaleFile(file,
"Font: %s\n\n",resource_info->font);
1994 if (resource_info->text_font != (
char *) NULL)
1995 (void) FormatLocaleFile(file,
"Text font: %s\n\n",resource_info->text_font);
2000 for (levels=0; undo_image != (
Image *) NULL; levels++)
2002 number_pixels=undo_image->list->columns*undo_image->list->rows;
2004 undo_image=GetPreviousImageInList(undo_image);
2006 (void) FormatLocaleFile(file,
"Undo Edit Cache\n levels: %u\n",levels);
2007 (void) FormatLocaleFile(file,
" bytes: %.20gmb\n",(
double)
2008 ((bytes+(1 << 19)) >> 20));
2009 (void) FormatLocaleFile(file,
" limit: %.20gmb\n\n",(
double)
2010 resource_info->undo_cache);
2014 (void) IdentifyImage(image,file,MagickTrue);
2015 (void) fclose(file);
2016 text=FileToString(filename,~0UL,&image->exception);
2017 (void) RelinquishUniqueFileResource(filename);
2018 if (text == (
char *) NULL)
2020 XNoticeWidget(display,windows,
"MemoryAllocationFailed",
2021 "UnableToDisplayImageInfo");
2024 textlist=StringToList(text);
2025 if (textlist != (
char **) NULL)
2028 title[MaxTextExtent];
2033 (void) XWithdrawWindow(display,windows->info.id,windows->info.screen);
2034 (void) FormatLocaleString(title,MaxTextExtent,
"Image Info: %s",
2036 XTextViewWidget(display,resource_info,windows,MagickTrue,title,
2037 (
char const **) textlist);
2038 for (i=0; textlist[i] != (
char *) NULL; i++)
2039 textlist[i]=DestroyString(textlist[i]);
2040 textlist=(
char **) RelinquishMagickMemory(textlist);
2042 text=DestroyString(text);
2073 static void XDitherImage(
Image *image,XImage *ximage)
2075 static const short int
2078 {-16, 4, -1, 11,-14, 6, -3, 9,-15, 5, -2, 10,-13, 7, -4, 8},
2079 { 15, -5, 0,-12, 13, -7, 2,-10, 14, -6, 1,-11, 12, -8, 3, -9}
2081 dither_green[2][16]=
2083 { 11,-15, 7, -3, 8,-14, 4, -2, 10,-16, 6, -4, 9,-13, 5, -1},
2084 {-12, 14, -8, 2, -9, 13, -5, 1,-11, 15, -7, 3,-10, 12, -6, 0}
2088 { -3, 9,-13, 7, -1, 11,-15, 5, -4, 8,-14, 6, -2, 10,-16, 4},
2089 { 2,-10, 12, -8, 0,-12, 14, -6, 3, -9, 13, -7, 1,-11, 15, -5}
2127 for (i=0; i < 2; i++)
2128 for (j=0; j < 16; j++)
2130 red_map[i][j]=(
unsigned char *) AcquireCriticalMemory(256UL*
2132 green_map[i][j]=(
unsigned char *) AcquireCriticalMemory(256UL*
2133 sizeof(*green_map));
2134 blue_map[i][j]=(
unsigned char *) AcquireCriticalMemory(256UL*
2140 for (i=0; i < 2; i++)
2141 for (j=0; j < 16; j++)
2142 for (x=0; x < 256; x++)
2147 value+=dither_red[i][j];
2148 red_map[i][j][x]=(
unsigned char)
2149 ((value < 0) ? 0 : (value > 255) ? 255 : value);
2153 value+=dither_green[i][j];
2154 green_map[i][j][x]=(
unsigned char)
2155 ((value < 0) ? 0 : (value > 255) ? 255 : value);
2159 value+=((size_t) dither_blue[i][j] << 1);
2160 blue_map[i][j][x]=(
unsigned char)
2161 ((value < 0) ? 0 : (value > 255) ? 255 : value);
2166 scanline_pad=(
unsigned int) (ximage->bytes_per_line-
2167 ((
size_t) (ximage->width*ximage->bits_per_pixel) >> 3));
2171 image_view=AcquireVirtualCacheView(image,&image->exception);
2172 for (y=0; y < (int) image->rows; y++)
2174 p=GetCacheViewVirtualPixels(image_view,0,(ssize_t) y,image->columns,1,
2178 for (x=0; x < (int) image->columns; x++)
2180 color.red=ClampToQuantum((MagickRealType) (red_map[i][j][(
int)
2181 ScaleQuantumToChar(GetPixelRed(p))] << 8));
2182 color.green=ClampToQuantum((MagickRealType) (green_map[i][j][(
int)
2183 ScaleQuantumToChar(GetPixelGreen(p))] << 8));
2184 color.blue=ClampToQuantum((MagickRealType) (blue_map[i][j][(
int)
2185 ScaleQuantumToChar(GetPixelBlue(p))] << 8));
2186 pixel=(size_t) (((
size_t) color.red & 0xe0) |
2187 (((size_t) color.green & 0xe0) >> 3) |
2188 (((
size_t) color.blue & 0xc0) >> 6));
2200 image_view=DestroyCacheView(image_view);
2204 for (i=0; i < 2; i++)
2205 for (j=0; j < 16; j++)
2207 green_map[i][j]=(
unsigned char *) RelinquishMagickMemory(green_map[i][j]);
2208 blue_map[i][j]=(
unsigned char *) RelinquishMagickMemory(blue_map[i][j]);
2209 red_map[i][j]=(
unsigned char *) RelinquishMagickMemory(red_map[i][j]);
2242 MagickExport MagickBooleanType XDrawImage(Display *display,
2243 const XPixelInfo *pixel,XDrawInfo *draw_info,
Image *image)
2284 assert(display != (Display *) NULL);
2285 assert(pixel != (XPixelInfo *) NULL);
2286 assert(draw_info != (XDrawInfo *) NULL);
2287 assert(image != (
Image *) NULL);
2288 if (IsEventLogging() != MagickFalse)
2289 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
2293 root_window=XRootWindow(display,XDefaultScreen(display));
2294 depth=(
unsigned int) XDefaultDepth(display,XDefaultScreen(display));
2295 draw_pixmap=XCreatePixmap(display,root_window,draw_info->width,
2296 draw_info->height,depth);
2297 if (draw_pixmap == (Pixmap) NULL)
2298 return(MagickFalse);
2302 context_values.background=(size_t) (~0);
2303 context_values.foreground=0;
2304 context_values.line_width=(int) draw_info->line_width;
2305 draw_context=XCreateGC(display,root_window,(
size_t)
2306 (GCBackground | GCForeground | GCLineWidth),&context_values);
2307 if (draw_context == (GC) NULL)
2308 return(MagickFalse);
2312 (void) XFillRectangle(display,draw_pixmap,draw_context,0,0,draw_info->width,
2317 (void) XSetBackground(display,draw_context,0);
2318 (void) XSetForeground(display,draw_context,(
size_t) (~0));
2319 if (draw_info->stipple != (Pixmap) NULL)
2321 (void) XSetFillStyle(display,draw_context,FillOpaqueStippled);
2322 (void) XSetStipple(display,draw_context,draw_info->stipple);
2324 switch (draw_info->element)
2329 (void) XDrawLines(display,draw_pixmap,draw_context,
2330 draw_info->coordinate_info,(
int) draw_info->number_coordinates,
2336 (void) XDrawLine(display,draw_pixmap,draw_context,draw_info->line_info.x1,
2337 draw_info->line_info.y1,draw_info->line_info.x2,
2338 draw_info->line_info.y2);
2341 case RectangleElement:
2343 (void) XDrawRectangle(display,draw_pixmap,draw_context,
2344 (
int) draw_info->rectangle_info.x,(int) draw_info->rectangle_info.y,
2345 (
unsigned int) draw_info->rectangle_info.width,
2346 (
unsigned int) draw_info->rectangle_info.height);
2349 case FillRectangleElement:
2351 (void) XFillRectangle(display,draw_pixmap,draw_context,
2352 (
int) draw_info->rectangle_info.x,(int) draw_info->rectangle_info.y,
2353 (
unsigned int) draw_info->rectangle_info.width,
2354 (
unsigned int) draw_info->rectangle_info.height);
2358 case EllipseElement:
2360 (void) XDrawArc(display,draw_pixmap,draw_context,
2361 (
int) draw_info->rectangle_info.x,(int) draw_info->rectangle_info.y,
2362 (
unsigned int) draw_info->rectangle_info.width,
2363 (
unsigned int) draw_info->rectangle_info.height,0,360*64);
2366 case FillCircleElement:
2367 case FillEllipseElement:
2369 (void) XFillArc(display,draw_pixmap,draw_context,
2370 (
int) draw_info->rectangle_info.x,(int) draw_info->rectangle_info.y,
2371 (
unsigned int) draw_info->rectangle_info.width,
2372 (
unsigned int) draw_info->rectangle_info.height,0,360*64);
2375 case PolygonElement:
2380 coordinate_info=draw_info->coordinate_info;
2381 (void) XDrawLines(display,draw_pixmap,draw_context,coordinate_info,
2382 (
int) draw_info->number_coordinates,CoordModeOrigin);
2383 (void) XDrawLine(display,draw_pixmap,draw_context,
2384 coordinate_info[draw_info->number_coordinates-1].x,
2385 coordinate_info[draw_info->number_coordinates-1].y,
2386 coordinate_info[0].x,coordinate_info[0].y);
2389 case FillPolygonElement:
2391 (void) XFillPolygon(display,draw_pixmap,draw_context,
2392 draw_info->coordinate_info,(
int) draw_info->number_coordinates,Complex,
2397 (void) XFreeGC(display,draw_context);
2401 draw_ximage=XGetImage(display,draw_pixmap,0,0,draw_info->width,
2402 draw_info->height,AllPlanes,ZPixmap);
2403 if (draw_ximage == (XImage *) NULL)
2404 return(MagickFalse);
2405 (void) XFreePixmap(display,draw_pixmap);
2409 draw_image=AcquireImage((
ImageInfo *) NULL);
2410 if (draw_image == (
Image *) NULL)
2411 return(MagickFalse);
2412 draw_image->columns=draw_info->width;
2413 draw_image->rows=draw_info->height;
2417 width=(
unsigned int) image->columns;
2418 height=(
unsigned int) image->rows;
2421 (void) XParseGeometry(draw_info->geometry,&x,&y,&width,&height);
2422 (void) GetOneVirtualPixel(image,(ssize_t) x,(ssize_t) y,
2423 &draw_image->background_color,&image->exception);
2424 if (SetImageStorageClass(draw_image,DirectClass) == MagickFalse)
2425 return(MagickFalse);
2426 draw_image->matte=MagickTrue;
2427 exception=(&image->exception);
2428 draw_view=AcquireAuthenticCacheView(draw_image,exception);
2429 for (y=0; y < (int) draw_image->rows; y++)
2437 q=QueueCacheViewAuthenticPixels(draw_view,0,(ssize_t) y,draw_image->columns,
2441 for (x=0; x < (int) draw_image->columns; x++)
2443 if (XGetPixel(draw_ximage,x,y) == 0)
2448 *q=draw_image->background_color;
2449 q->opacity=(Quantum) (draw_info->stencil == OpaqueStencil ?
2450 TransparentOpacity : OpaqueOpacity);
2457 SetPixelRed(q,ScaleShortToQuantum(pixel->pen_color.red));
2458 SetPixelGreen(q,ScaleShortToQuantum(pixel->pen_color.green));
2459 SetPixelBlue(q,ScaleShortToQuantum(pixel->pen_color.blue));
2460 SetPixelOpacity(q,(Quantum) (draw_info->stencil ==
2461 OpaqueStencil ? OpaqueOpacity : TransparentOpacity));
2465 if (SyncCacheViewAuthenticPixels(draw_view,exception) == MagickFalse)
2468 draw_view=DestroyCacheView(draw_view);
2469 XDestroyImage(draw_ximage);
2473 (void) XParseGeometry(draw_info->geometry,&x,&y,&width,&height);
2474 if ((width != (
unsigned int) draw_image->columns) ||
2475 (height != (
unsigned int) draw_image->rows))
2478 image_geometry[MaxTextExtent];
2483 (void) FormatLocaleString(image_geometry,MaxTextExtent,
"%ux%u",
2485 (void) TransformImage(&draw_image,(
char *) NULL,image_geometry);
2487 if (draw_info->degrees != 0.0)
2501 rotate_image=RotateImage(draw_image,draw_info->degrees,&image->exception);
2502 if (rotate_image == (
Image *) NULL)
2503 return(MagickFalse);
2504 draw_image=DestroyImage(draw_image);
2505 draw_image=rotate_image;
2509 normalized_degrees=draw_info->degrees;
2510 while (normalized_degrees < -45.0)
2511 normalized_degrees+=360.0;
2512 for (rotations=0; normalized_degrees > 45.0; rotations++)
2513 normalized_degrees-=90.0;
2514 switch (rotations % 4)
2524 x=x-(int) draw_image->columns/2;
2525 y=y+(
int) draw_image->columns/2;
2533 x=x-(int) draw_image->columns;
2541 x=x-(int) draw_image->columns/2;
2542 y=y-(
int) (draw_image->rows-(draw_image->columns/2));
2550 draw_view=AcquireAuthenticCacheView(draw_image,exception);
2551 for (y=0; y < (int) draw_image->rows; y++)
2559 q=GetCacheViewAuthenticPixels(draw_view,0,(ssize_t) y,draw_image->columns,1,
2563 for (x=0; x < (int) draw_image->columns; x++)
2565 if (q->opacity != (Quantum) TransparentOpacity)
2566 SetPixelOpacity(q,OpaqueOpacity);
2569 if (SyncCacheViewAuthenticPixels(draw_view,exception) == MagickFalse)
2572 draw_view=DestroyCacheView(draw_view);
2573 (void) XParseGeometry(draw_info->geometry,&x,&y,&width,&height);
2574 if (draw_info->stencil == TransparentStencil)
2575 (void) CompositeImage(image,CopyOpacityCompositeOp,draw_image,(ssize_t) x,
2580 (void) CompositeImage(image,OverCompositeOp,draw_image,(ssize_t) x,
2584 draw_image=DestroyImage(draw_image);
2617 #if defined(__cplusplus) || defined(c_plusplus)
2621 MagickExport
int XError(Display *display,XErrorEvent *error)
2623 assert(display != (Display *) NULL);
2624 assert(error != (XErrorEvent *) NULL);
2625 if (IsEventLogging() != MagickFalse)
2626 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
2628 xerror_alert=MagickTrue;
2629 switch (error->request_code)
2633 if ((
int) error->error_code == BadDrawable)
2634 return(MagickFalse);
2637 case X_GetWindowAttributes:
2640 if ((
int) error->error_code == BadWindow)
2641 return(MagickFalse);
2646 if ((
int) error->error_code == BadValue)
2647 return(MagickFalse);
2654 #if defined(__cplusplus) || defined(c_plusplus)
2698 MagickExport
void XFreeResources(Display *display,XVisualInfo *visual_info,
2699 XStandardColormap *map_info,XPixelInfo *pixel,XFontStruct *font_info,
2700 XResourceInfo *resource_info,XWindowInfo *window_info)
2702 assert(display != (Display *) NULL);
2703 assert(resource_info != (XResourceInfo *) NULL);
2704 if (IsEventLogging() != MagickFalse)
2705 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
2706 if (window_info != (XWindowInfo *) NULL)
2711 if (window_info->ximage != (XImage *) NULL)
2712 XDestroyImage(window_info->ximage);
2713 if (window_info->id != (Window) NULL)
2718 if (window_info->id != XRootWindow(display,visual_info->screen))
2719 (
void) XDestroyWindow(display,window_info->id);
2720 if (window_info->annotate_context != (GC) NULL)
2721 (void) XFreeGC(display,window_info->annotate_context);
2722 if (window_info->highlight_context != (GC) NULL)
2723 (
void) XFreeGC(display,window_info->highlight_context);
2724 if (window_info->widget_context != (GC) NULL)
2725 (void) XFreeGC(display,window_info->widget_context);
2726 if (window_info->cursor != (Cursor) NULL)
2727 (
void) XFreeCursor(display,window_info->cursor);
2728 window_info->cursor=(Cursor) NULL;
2729 if (window_info->busy_cursor != (Cursor) NULL)
2730 (
void) XFreeCursor(display,window_info->busy_cursor);
2731 window_info->busy_cursor=(Cursor) NULL;
2737 if (font_info != (XFontStruct *) NULL)
2739 (void) XFreeFont(display,font_info);
2740 font_info=(XFontStruct *) NULL;
2742 if (map_info != (XStandardColormap *) NULL)
2747 if (resource_info->map_type == (
char *) NULL)
2748 (
void) XFreeStandardColormap(display,visual_info,map_info,pixel);
2749 (void) XFree((
void *) map_info);
2754 if (visual_info != (XVisualInfo *) NULL)
2755 (
void) XFree((
void *) visual_info);
2756 if (resource_info->close_server != MagickFalse)
2757 (void) XCloseDisplay(display);
2793 MagickExport
void XFreeStandardColormap(Display *display,
2794 const XVisualInfo *visual_info,XStandardColormap *map_info,XPixelInfo *pixel)
2799 assert(display != (Display *) NULL);
2800 assert(visual_info != (XVisualInfo *) NULL);
2801 assert(map_info != (XStandardColormap *) NULL);
2802 if (IsEventLogging() != MagickFalse)
2803 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
2804 (void) XFlush(display);
2805 if (map_info->colormap != (Colormap) NULL)
2807 if (map_info->colormap != XDefaultColormap(display,visual_info->screen))
2808 (
void) XFreeColormap(display,map_info->colormap);
2810 if (pixel != (XPixelInfo *) NULL)
2811 if ((visual_info->klass != TrueColor) &&
2812 (visual_info->klass != DirectColor))
2813 (void) XFreeColors(display,map_info->colormap,pixel->pixels,
2814 (
int) pixel->colors,0);
2816 map_info->colormap=(Colormap) NULL;
2817 if (pixel != (XPixelInfo *) NULL)
2819 if (pixel->pixels != (
unsigned long *) NULL)
2820 pixel->pixels=(
unsigned long *) RelinquishMagickMemory(pixel->pixels);
2821 pixel->pixels=(
unsigned long *) NULL;
2847 MagickExport
void XGetAnnotateInfo(XAnnotateInfo *annotate_info)
2852 assert(annotate_info != (XAnnotateInfo *) NULL);
2853 if (IsEventLogging() != MagickFalse)
2854 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
2857 annotate_info->width=0;
2858 annotate_info->height=0;
2859 annotate_info->stencil=ForegroundStencil;
2860 annotate_info->degrees=0.0;
2861 annotate_info->font_info=(XFontStruct *) NULL;
2862 annotate_info->text=(
char *) NULL;
2863 *annotate_info->geometry=
'\0';
2864 annotate_info->previous=(XAnnotateInfo *) NULL;
2865 annotate_info->next=(XAnnotateInfo *) NULL;
2866 (void) XSupportsLocale();
2867 (void) XSetLocaleModifiers(
"");
2898 MagickExport
void XGetMapInfo(
const XVisualInfo *visual_info,
2899 const Colormap colormap,XStandardColormap *map_info)
2904 assert(visual_info != (XVisualInfo *) NULL);
2905 assert(map_info != (XStandardColormap *) NULL);
2906 if (IsEventLogging() != MagickFalse)
2907 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
2908 map_info->colormap=colormap;
2909 map_info->red_max=visual_info->red_mask;
2910 map_info->red_mult=(size_t) (map_info->red_max != 0 ? 1 : 0);
2911 if (map_info->red_max != 0)
2912 while ((map_info->red_max & 0x01) == 0)
2914 map_info->red_max>>=1;
2915 map_info->red_mult<<=1;
2917 map_info->green_max=visual_info->green_mask;
2918 map_info->green_mult=(size_t) (map_info->green_max != 0 ? 1 : 0);
2919 if (map_info->green_max != 0)
2920 while ((map_info->green_max & 0x01) == 0)
2922 map_info->green_max>>=1;
2923 map_info->green_mult<<=1;
2925 map_info->blue_max=visual_info->blue_mask;
2926 map_info->blue_mult=(size_t) (map_info->blue_max != 0 ? 1 : 0);
2927 if (map_info->blue_max != 0)
2928 while ((map_info->blue_max & 0x01) == 0)
2930 map_info->blue_max>>=1;
2931 map_info->blue_mult<<=1;
2933 map_info->base_pixel=0;
2974 MagickExport
void XGetPixelPacket(Display *display,
2975 const XVisualInfo *visual_info,
const XStandardColormap *map_info,
2976 const XResourceInfo *resource_info,
Image *image,XPixelInfo *pixel)
2979 *PenColors[MaxNumberPens]=
3009 assert(display != (Display *) NULL);
3010 assert(visual_info != (XVisualInfo *) NULL);
3011 assert(map_info != (XStandardColormap *) NULL);
3012 assert(resource_info != (XResourceInfo *) NULL);
3013 assert(pixel != (XPixelInfo *) NULL);
3014 if (IsEventLogging() != MagickFalse)
3015 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
3017 if (image != (
Image *) NULL)
3018 if (image->storage_class == PseudoClass)
3019 pixel->colors=(ssize_t) image->colors;
3020 packets=(
unsigned int)
3021 MagickMax((
int) pixel->colors,visual_info->colormap_size)+MaxNumberPens;
3022 if (pixel->pixels != (
unsigned long *) NULL)
3023 pixel->pixels=(
unsigned long *) RelinquishMagickMemory(pixel->pixels);
3024 pixel->pixels=(
unsigned long *) AcquireQuantumMemory(packets,
3025 sizeof(*pixel->pixels));
3026 if (pixel->pixels == (
unsigned long *) NULL)
3027 ThrowXWindowFatalException(ResourceLimitFatalError,
"UnableToGetPixelInfo",
3032 colormap=map_info->colormap;
3033 (void) XParseColor(display,colormap,(
char *) ForegroundColor,
3034 &pixel->foreground_color);
3035 status=XParseColor(display,colormap,resource_info->foreground_color,
3036 &pixel->foreground_color);
3037 if (status == False)
3038 ThrowXWindowException(XServerError,
"ColorIsNotKnownToServer",
3039 resource_info->foreground_color);
3040 pixel->foreground_color.pixel=
3041 XStandardPixel(map_info,&pixel->foreground_color);
3042 pixel->foreground_color.flags=(char) (DoRed | DoGreen | DoBlue);
3046 (void) XParseColor(display,colormap,
"#d6d6d6d6d6d6",&pixel->background_color);
3047 status=XParseColor(display,colormap,resource_info->background_color,
3048 &pixel->background_color);
3049 if (status == False)
3050 ThrowXWindowException(XServerError,
"ColorIsNotKnownToServer",
3051 resource_info->background_color);
3052 pixel->background_color.pixel=
3053 XStandardPixel(map_info,&pixel->background_color);
3054 pixel->background_color.flags=(char) (DoRed | DoGreen | DoBlue);
3058 (void) XParseColor(display,colormap,(
char *) BorderColor,
3059 &pixel->border_color);
3060 status=XParseColor(display,colormap,resource_info->border_color,
3061 &pixel->border_color);
3062 if (status == False)
3063 ThrowXWindowException(XServerError,
"ColorIsNotKnownToServer",
3064 resource_info->border_color);
3065 pixel->border_color.pixel=XStandardPixel(map_info,&pixel->border_color);
3066 pixel->border_color.flags=(char) (DoRed | DoGreen | DoBlue);
3070 pixel->matte_color=pixel->background_color;
3071 if (resource_info->matte_color != (
char *) NULL)
3076 status=XParseColor(display,colormap,resource_info->matte_color,
3077 &pixel->matte_color);
3078 if (status == False)
3079 ThrowXWindowException(XServerError,
"ColorIsNotKnownToServer",
3080 resource_info->matte_color);
3081 pixel->matte_color.pixel=XStandardPixel(map_info,&pixel->matte_color);
3082 pixel->matte_color.flags=(char) (DoRed | DoGreen | DoBlue);
3087 pixel->highlight_color.red=(
unsigned short) (((MagickRealType)
3088 pixel->matte_color.red*ScaleQuantumToShort(HighlightModulate))/65535L+
3089 (ScaleQuantumToShort((Quantum) (QuantumRange-HighlightModulate))));
3090 pixel->highlight_color.green=(
unsigned short) (((MagickRealType)
3091 pixel->matte_color.green*ScaleQuantumToShort(HighlightModulate))/65535L+
3092 (ScaleQuantumToShort((Quantum) (QuantumRange-HighlightModulate))));
3093 pixel->highlight_color.blue=(
unsigned short) (((MagickRealType)
3094 pixel->matte_color.blue*ScaleQuantumToShort(HighlightModulate))/65535L+
3095 (ScaleQuantumToShort((Quantum) (QuantumRange-HighlightModulate))));
3096 pixel->highlight_color.pixel=
3097 XStandardPixel(map_info,&pixel->highlight_color);
3098 pixel->highlight_color.flags=(char) (DoRed | DoGreen | DoBlue);
3102 pixel->shadow_color.red=(
unsigned short) (((MagickRealType)
3103 pixel->matte_color.red*ScaleQuantumToShort(ShadowModulate))/65535L);
3104 pixel->shadow_color.green=(
unsigned short) (((MagickRealType)
3105 pixel->matte_color.green*ScaleQuantumToShort(ShadowModulate))/65535L);
3106 pixel->shadow_color.blue=(
unsigned short) (((MagickRealType)
3107 pixel->matte_color.blue*ScaleQuantumToShort(ShadowModulate))/65535L);
3108 pixel->shadow_color.pixel=XStandardPixel(map_info,&pixel->shadow_color);
3109 pixel->shadow_color.flags=(char) (DoRed | DoGreen | DoBlue);
3113 pixel->depth_color.red=(
unsigned short) (((MagickRealType)
3114 pixel->matte_color.red*ScaleQuantumToShort(DepthModulate))/65535L);
3115 pixel->depth_color.green=(
unsigned short) (((MagickRealType)
3116 pixel->matte_color.green*ScaleQuantumToShort(DepthModulate))/65535L);
3117 pixel->depth_color.blue=(
unsigned short) (((MagickRealType)
3118 pixel->matte_color.blue*ScaleQuantumToShort(DepthModulate))/65535L);
3119 pixel->depth_color.pixel=XStandardPixel(map_info,&pixel->depth_color);
3120 pixel->depth_color.flags=(char) (DoRed | DoGreen | DoBlue);
3124 pixel->trough_color.red=(
unsigned short) (((MagickRealType)
3125 pixel->matte_color.red*ScaleQuantumToShort(TroughModulate))/65535L);
3126 pixel->trough_color.green=(
unsigned short) (((MagickRealType)
3127 pixel->matte_color.green*ScaleQuantumToShort(TroughModulate))/65535L);
3128 pixel->trough_color.blue=(
unsigned short) (((MagickRealType)
3129 pixel->matte_color.blue*ScaleQuantumToShort(TroughModulate))/65535L);
3130 pixel->trough_color.pixel=XStandardPixel(map_info,&pixel->trough_color);
3131 pixel->trough_color.flags=(char) (DoRed | DoGreen | DoBlue);
3135 for (i=0; i < MaxNumberPens; i++)
3137 (void) XParseColor(display,colormap,(
char *) PenColors[i],
3138 &pixel->pen_colors[i]);
3139 status=XParseColor(display,colormap,resource_info->pen_colors[i],
3140 &pixel->pen_colors[i]);
3141 if (status == False)
3142 ThrowXWindowException(XServerError,
"ColorIsNotKnownToServer",
3143 resource_info->pen_colors[i]);
3144 pixel->pen_colors[i].pixel=XStandardPixel(map_info,&pixel->pen_colors[i]);
3145 pixel->pen_colors[i].flags=(char) (DoRed | DoGreen | DoBlue);
3147 pixel->box_color=pixel->background_color;
3148 pixel->pen_color=pixel->foreground_color;
3151 if (image != (
Image *) NULL)
3153 if ((resource_info->gamma_correct != MagickFalse) &&
3154 (image->gamma != 0.0))
3165 flags=ParseGeometry(resource_info->display_gamma,&geometry_info);
3166 if ((flags & RhoValue) != 0)
3167 red_gamma=geometry_info.rho;
3168 green_gamma=red_gamma;
3169 if ((flags & SigmaValue) != 0)
3170 green_gamma=geometry_info.sigma;
3171 blue_gamma=red_gamma;
3172 if ((flags & XiValue) != 0)
3173 blue_gamma=geometry_info.xi;
3174 red_gamma*=image->gamma;
3175 green_gamma*=image->gamma;
3176 blue_gamma*=image->gamma;
3178 if (image->storage_class == PseudoClass)
3183 for (i=0; i < (ssize_t) image->colors; i++)
3184 pixel->pixels[i]=XGammaPixel(map_info,image->colormap+i);
3185 for (i=0; i < MaxNumberPens; i++)
3186 pixel->pixels[image->colors+i]=pixel->pen_colors[i].pixel;
3187 pixel->colors+=MaxNumberPens;
3226 MagickExport
char *XGetResourceClass(XrmDatabase database,
3227 const char *client_name,
const char *keyword,
char *resource_default)
3230 resource_class[MaxTextExtent],
3231 resource_name[MaxTextExtent];
3242 if (database == (XrmDatabase) NULL)
3243 return(resource_default);
3244 *resource_name=
'\0';
3245 *resource_class=
'\0';
3246 if (keyword != (
char *) NULL)
3255 (void) FormatLocaleString(resource_name,MaxTextExtent,
"%s.%s",
3256 client_name,keyword);
3257 c=(int) (*client_name);
3258 if ((c >= XK_a) && (c <= XK_z))
3261 if ((c >= XK_agrave) && (c <= XK_odiaeresis))
3262 c-=(XK_agrave-XK_Agrave);
3264 if ((c >= XK_oslash) && (c <= XK_thorn))
3265 c-=(XK_oslash-XK_Ooblique);
3267 if ((k >= XK_a) && (k <= XK_z))
3270 if ((k >= XK_agrave) && (k <= XK_odiaeresis))
3271 k-=(XK_agrave-XK_Agrave);
3273 if ((k >= XK_oslash) && (k <= XK_thorn))
3274 k-=(XK_oslash-XK_Ooblique);
3275 (void) FormatLocaleString(resource_class,MaxTextExtent,
"%c%s.%c%s",c,
3276 client_name+1,k,keyword+1);
3278 status=XrmGetResource(database,resource_name,resource_class,&resource_type,
3280 if (status == False)
3281 return(resource_default);
3282 return(resource_value.addr);
3315 MagickExport XrmDatabase XGetResourceDatabase(Display *display,
3316 const char *client_name)
3319 filename[MaxTextExtent];
3331 if (display == (Display *) NULL)
3332 return((XrmDatabase) NULL);
3333 assert(client_name != (
char *) NULL);
3338 (void) XGetDefault(display,(
char *) client_name,
"dummy");
3339 resource_database=XrmGetDatabase(display);
3343 p=client_name+(strlen(client_name)-1);
3344 while ((p > client_name) && (*p !=
'/'))
3348 c=(int) (*client_name);
3349 if ((c >= XK_a) && (c <= XK_z))
3352 if ((c >= XK_agrave) && (c <= XK_odiaeresis))
3353 c-=(XK_agrave-XK_Agrave);
3355 if ((c >= XK_oslash) && (c <= XK_thorn))
3356 c-=(XK_oslash-XK_Ooblique);
3357 #if defined(X11_APPLICATION_PATH)
3358 (void) FormatLocaleString(filename,MaxTextExtent,
"%s%c%s",
3359 X11_APPLICATION_PATH,c,client_name+1);
3360 (void) XrmCombineFileDatabase(filename,&resource_database,MagickFalse);
3362 if (XResourceManagerString(display) != (
char *) NULL)
3367 server_database=XrmGetStringDatabase(XResourceManagerString(display));
3368 XrmCombineDatabase(server_database,&resource_database,MagickFalse);
3373 #if defined(X11_PREFERENCES_PATH)
3374 (void) FormatLocaleString(filename,MaxTextExtent,
"%s%src",
3375 X11_PREFERENCES_PATH,client_name);
3376 ExpandFilename(filename);
3377 (void) XrmCombineFileDatabase(filename,&resource_database,MagickFalse);
3379 return(resource_database);
3413 MagickExport
void XGetResourceInfo(
const ImageInfo *image_info,
3414 XrmDatabase database,
const char *client_name,XResourceInfo *resource_info)
3423 assert(resource_info != (XResourceInfo *) NULL);
3424 if (IsEventLogging() != MagickFalse)
3425 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
3426 (void) memset(resource_info,0,
sizeof(*resource_info));
3427 resource_info->resource_database=database;
3428 resource_info->image_info=(
ImageInfo *) image_info;
3429 (void) SetImageInfoProgressMonitor(resource_info->image_info,
3430 XMagickProgressMonitor,(
void *) NULL);
3431 resource_info->quantize_info=CloneQuantizeInfo((
QuantizeInfo *) NULL);
3432 resource_info->close_server=MagickTrue;
3433 resource_info->client_name=AcquireString(client_name);
3434 resource_value=XGetResourceClass(database,client_name,
"backdrop",
3436 resource_info->backdrop=IsMagickTrue(resource_value);
3437 resource_info->background_color=XGetResourceInstance(database,client_name,
3438 "background",(
char *)
"#d6d6d6d6d6d6");
3439 resource_info->border_color=XGetResourceInstance(database,client_name,
3440 "borderColor",BorderColor);
3441 resource_value=XGetResourceClass(database,client_name,
"borderWidth",
3443 resource_info->border_width=(
unsigned int) StringToUnsignedLong(
3445 resource_value=XGetResourceClass(database,client_name,
"colormap",
3447 resource_info->colormap=UndefinedColormap;
3448 if (LocaleCompare(
"private",resource_value) == 0)
3449 resource_info->colormap=PrivateColormap;
3450 if (LocaleCompare(
"shared",resource_value) == 0)
3451 resource_info->colormap=SharedColormap;
3452 if (resource_info->colormap == UndefinedColormap)
3453 ThrowXWindowException(OptionError,
"UnrecognizedColormapType",
3455 resource_value=XGetResourceClass(database,client_name,
3456 "colorRecovery",(
char *)
"False");
3457 resource_info->color_recovery=IsMagickTrue(resource_value);
3458 resource_value=XGetResourceClass(database,client_name,
"confirmExit",
3460 resource_info->confirm_exit=IsMagickTrue(resource_value);
3461 resource_value=XGetResourceClass(database,client_name,
"confirmEdit",
3463 resource_info->confirm_edit=IsMagickTrue(resource_value);
3464 resource_value=XGetResourceClass(database,client_name,
"delay",(
char *)
"1");
3465 resource_info->delay=(
unsigned int) StringToUnsignedLong(resource_value);
3466 resource_info->display_gamma=XGetResourceClass(database,client_name,
3467 "displayGamma",(
char *)
"2.2");
3468 resource_value=XGetResourceClass(database,client_name,
"displayWarnings",
3470 resource_info->display_warnings=IsMagickTrue(resource_value);
3471 resource_info->font=XGetResourceClass(database,client_name,
"font",
3473 resource_info->font=XGetResourceClass(database,client_name,
"fontList",
3474 resource_info->font);
3475 resource_info->font_name[0]=XGetResourceClass(database,client_name,
"font1",
3477 resource_info->font_name[1]=XGetResourceClass(database,client_name,
"font2",
3478 (
char *)
"variable");
3479 resource_info->font_name[2]=XGetResourceClass(database,client_name,
"font3",
3481 resource_info->font_name[3]=XGetResourceClass(database,client_name,
"font4",
3483 resource_info->font_name[4]=XGetResourceClass(database,client_name,
"font5",
3484 (
char *)
"7x13bold");
3485 resource_info->font_name[5]=XGetResourceClass(database,client_name,
"font6",
3486 (
char *)
"8x13bold");
3487 resource_info->font_name[6]=XGetResourceClass(database,client_name,
"font7",
3488 (
char *)
"9x15bold");
3489 resource_info->font_name[7]=XGetResourceClass(database,client_name,
"font8",
3491 resource_info->font_name[8]=XGetResourceClass(database,client_name,
"font9",
3493 resource_info->font_name[9]=XGetResourceClass(database,client_name,
"font0",
3495 resource_info->font_name[10]=XGetResourceClass(database,client_name,
"font0",
3497 resource_info->foreground_color=XGetResourceInstance(database,client_name,
3498 "foreground",ForegroundColor);
3499 resource_value=XGetResourceClass(database,client_name,
"gammaCorrect",
3501 resource_info->gamma_correct=IsMagickTrue(resource_value);
3502 resource_info->image_geometry=ConstantString(XGetResourceClass(database,
3503 client_name,
"geometry",(
char *) NULL));
3504 resource_value=XGetResourceClass(database,client_name,
"gravity",
3506 resource_info->gravity=(GravityType) ParseCommandOption(MagickGravityOptions,
3507 MagickFalse,resource_value);
3508 directory=getcwd(resource_info->home_directory,MaxTextExtent);
3510 resource_info->icon_geometry=XGetResourceClass(database,client_name,
3511 "iconGeometry",(
char *) NULL);
3512 resource_value=XGetResourceClass(database,client_name,
"iconic",
3514 resource_info->iconic=IsMagickTrue(resource_value);
3515 resource_value=XGetResourceClass(database,client_name,
"immutable",
3516 LocaleCompare(client_name,
"PerlMagick") == 0 ? (
char *)
"True" :
3518 resource_info->immutable=IsMagickTrue(resource_value);
3519 resource_value=XGetResourceClass(database,client_name,
"magnify",
3521 resource_info->magnify=(
unsigned int) StringToUnsignedLong(resource_value);
3522 resource_info->map_type=XGetResourceClass(database,client_name,
"map",
3524 resource_info->matte_color=XGetResourceInstance(database,client_name,
3525 "mattecolor",(
char *) NULL);
3526 resource_info->name=ConstantString(XGetResourceClass(database,client_name,
3527 "name",(
char *) NULL));
3528 resource_info->pen_colors[0]=XGetResourceClass(database,client_name,
"pen1",
3530 resource_info->pen_colors[1]=XGetResourceClass(database,client_name,
"pen2",
3532 resource_info->pen_colors[2]=XGetResourceClass(database,client_name,
"pen3",
3534 resource_info->pen_colors[3]=XGetResourceClass(database,client_name,
"pen4",
3536 resource_info->pen_colors[4]=XGetResourceClass(database,client_name,
"pen5",
3538 resource_info->pen_colors[5]=XGetResourceClass(database,client_name,
"pen6",
3540 resource_info->pen_colors[6]=XGetResourceClass(database,client_name,
"pen7",
3541 (
char *)
"magenta");
3542 resource_info->pen_colors[7]=XGetResourceClass(database,client_name,
"pen8",
3544 resource_info->pen_colors[8]=XGetResourceClass(database,client_name,
"pen9",
3546 resource_info->pen_colors[9]=XGetResourceClass(database,client_name,
"pen0",
3548 resource_info->pen_colors[10]=XGetResourceClass(database,client_name,
"pen0",
3550 resource_value=XGetResourceClass(database,client_name,
"pause",(
char *)
"0");
3551 resource_info->pause=(
unsigned int) StringToUnsignedLong(resource_value);
3552 resource_value=XGetResourceClass(database,client_name,
"quantum",(
char *)
"1");
3553 resource_info->quantum=StringToLong(resource_value);
3554 resource_info->text_font=XGetResourceClass(database,client_name,(
char *)
3555 "font",(
char *)
"fixed");
3556 resource_info->text_font=XGetResourceClass(database,client_name,
3557 "textFontList",resource_info->text_font);
3558 resource_info->title=XGetResourceClass(database,client_name,
"title",
3560 resource_value=XGetResourceClass(database,client_name,
"undoCache",
3562 resource_info->undo_cache=(
unsigned int) StringToUnsignedLong(resource_value);
3563 resource_value=XGetResourceClass(database,client_name,
"update",
3565 resource_info->update=IsMagickTrue(resource_value);
3566 resource_value=XGetResourceClass(database,client_name,
"usePixmap",
3568 resource_info->use_pixmap=IsMagickTrue(resource_value);
3569 resource_value=XGetResourceClass(database,client_name,
"sharedMemory",
3571 resource_info->use_shared_memory=IsMagickTrue(resource_value);
3572 resource_info->visual_type=XGetResourceClass(database,client_name,
"visual",
3574 resource_info->window_group=XGetResourceClass(database,client_name,
3575 "windowGroup",(
char *) NULL);
3576 resource_info->window_id=XGetResourceClass(database,client_name,
"window",
3578 resource_info->write_filename=XGetResourceClass(database,client_name,
3579 "writeFilename",(
char *) NULL);
3580 resource_info->debug=(GetLogEventMask() & X11Event) != 0 ? MagickTrue :
3618 MagickExport
char *XGetResourceInstance(XrmDatabase database,
3619 const char *client_name,
const char *keyword,
const char *resource_default)
3623 resource_name[MaxTextExtent];
3631 if (database == (XrmDatabase) NULL)
3632 return((
char *) resource_default);
3633 *resource_name=
'\0';
3634 if (keyword != (
char *) NULL)
3635 (void) FormatLocaleString(resource_name,MaxTextExtent,
"%s.%s",client_name,
3637 status=XrmGetResource(database,resource_name,
"ImageMagick",&resource_type,
3639 if (status == False)
3640 return((
char *) resource_default);
3641 return(resource_value.addr);
3671 MagickExport
char *XGetScreenDensity(Display *display)
3674 density[MaxTextExtent];
3683 x_density=((((double) DisplayWidth(display,XDefaultScreen(display)))*25.4)/
3684 ((double) DisplayWidthMM(display,XDefaultScreen(display))));
3685 y_density=((((double) DisplayHeight(display,XDefaultScreen(display)))*25.4)/
3686 ((double) DisplayHeightMM(display,XDefaultScreen(display))));
3687 (void) FormatLocaleString(density,MaxTextExtent,
"%gx%g",x_density,
3689 return(GetPageGeometry(density));
3727 static Window XGetSubwindow(Display *display,Window window,
int x,
int y)
3740 assert(display != (Display *) NULL);
3741 source_window=XRootWindow(display,XDefaultScreen(display));
3742 if (window == (Window) NULL)
3743 return(source_window);
3744 target_window=window;
3747 status=XTranslateCoordinates(display,source_window,window,x,y,
3748 &x_offset,&y_offset,&target_window);
3751 if (target_window == (Window) NULL)
3753 source_window=window;
3754 window=target_window;
3758 if (target_window == (Window) NULL)
3759 target_window=window;
3760 return(target_window);
3793 MagickExport MagickBooleanType XGetWindowColor(Display *display,
3794 XWindows *windows,
char *name)
3827 assert(display != (Display *) NULL);
3828 assert(name != (
char *) NULL);
3829 if (IsEventLogging() != MagickFalse)
3830 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",name);
3832 target_window=XSelectWindow(display,&crop_info);
3833 if (target_window == (Window) NULL)
3834 return(MagickFalse);
3835 root_window=XRootWindow(display,XDefaultScreen(display));
3836 client_window=target_window;
3837 if (target_window != root_window)
3845 status=XGetGeometry(display,target_window,&root_window,&x,&x,&d,&d,&d,&d);
3846 if (status != False)
3848 client_window=XClientWindow(display,target_window);
3849 target_window=client_window;
3855 status=XGetWindowAttributes(display,target_window,&window_attributes);
3856 if ((status == False) || (window_attributes.map_state != IsViewable))
3857 return(MagickFalse);
3861 (void) XTranslateCoordinates(display,root_window,target_window,
3862 (
int) crop_info.x,(int) crop_info.y,&x,&y,&child);
3863 ximage=XGetImage(display,target_window,x,y,1,1,AllPlanes,ZPixmap);
3864 if (ximage == (XImage *) NULL)
3865 return(MagickFalse);
3866 color.pixel=XGetPixel(ximage,0,0);
3867 XDestroyImage(ximage);
3871 (void) XQueryColor(display,window_attributes.colormap,&color);
3872 pixel.red=ScaleShortToQuantum(color.red);
3873 pixel.green=ScaleShortToQuantum(color.green);
3874 pixel.blue=ScaleShortToQuantum(color.blue);
3875 pixel.opacity=OpaqueOpacity;
3876 (void) QueryColorname(windows->image.image,&pixel,X11Compliance,name,
3877 &windows->image.image->exception);
3920 static Image *XGetWindowImage(Display *display,
const Window window,
3921 const unsigned int borders,
const unsigned int level)
3935 typedef struct _WindowInfo
3996 assert(display != (Display *) NULL);
3997 if (IsEventLogging() != MagickFalse)
3998 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
3999 status=XGetWindowAttributes(display,window,&window_attributes);
4000 if ((status == False) || (window_attributes.map_state != IsViewable))
4001 return((
Image *) NULL);
4005 root_window=XRootWindow(display,XDefaultScreen(display));
4006 (void) XTranslateCoordinates(display,window,root_window,0,0,&x_offset,
4008 crop_info.x=(ssize_t) x_offset;
4009 crop_info.y=(ssize_t) y_offset;
4010 crop_info.width=(size_t) window_attributes.width;
4011 crop_info.height=(
size_t) window_attributes.height;
4012 if (borders != MagickFalse)
4017 crop_info.x-=(ssize_t) window_attributes.border_width;
4018 crop_info.y-=(ssize_t) window_attributes.border_width;
4019 crop_info.width+=(size_t) (window_attributes.border_width << 1);
4020 crop_info.height+=(size_t) (window_attributes.border_width << 1);
4025 if (crop_info.x < 0)
4027 crop_info.width+=crop_info.x;
4030 if (crop_info.y < 0)
4032 crop_info.height+=crop_info.y;
4035 display_width=XDisplayWidth(display,XDefaultScreen(display));
4036 if ((
int) (crop_info.x+crop_info.width) > display_width)
4037 crop_info.width=(size_t) (display_width-crop_info.x);
4038 display_height=XDisplayHeight(display,XDefaultScreen(display));
4039 if ((
int) (crop_info.y+crop_info.height) > display_height)
4040 crop_info.height=(size_t) (display_height-crop_info.y);
4044 if (number_windows >= max_windows)
4050 if (window_info == (WindowInfo *) NULL)
4051 window_info=(WindowInfo *) AcquireQuantumMemory((
size_t) max_windows,
4052 sizeof(*window_info));
4054 window_info=(WindowInfo *) ResizeQuantumMemory(window_info,(
size_t)
4055 max_windows,
sizeof(*window_info));
4057 if (window_info == (WindowInfo *) NULL)
4058 ThrowXWindowFatalException(ResourceLimitError,
4059 "MemoryAllocationFailed",
"...");
4060 id=number_windows++;
4061 window_info[id].window=window;
4062 window_info[id].visual=window_attributes.visual;
4063 window_info[id].colormap=window_attributes.colormap;
4064 window_info[id].bounds.x1=(short) crop_info.x;
4065 window_info[
id].bounds.y1=(
short) crop_info.y;
4066 window_info[id].bounds.x2=(short) (crop_info.x+(
int) crop_info.width-1);
4067 window_info[id].bounds.y2=(short) (crop_info.y+(
int) crop_info.height-1);
4068 crop_info.x-=x_offset;
4069 crop_info.y-=y_offset;
4070 window_info[id].crop_info=crop_info;
4082 status=XQueryTree(display,window,&root_window,&window_info[
id].parent,
4083 &children,&number_children);
4084 for (i=0; i < id; i++)
4085 if ((window_info[i].window == window_info[
id].parent) &&
4086 (window_info[i].visual == window_info[
id].visual) &&
4087 (window_info[i].colormap == window_info[
id].colormap))
4089 if ((window_info[
id].bounds.x1 < window_info[i].bounds.x1) ||
4090 (window_info[
id].bounds.x2 > window_info[i].bounds.x2) ||
4091 (window_info[
id].bounds.y1 < window_info[i].bounds.y1) ||
4092 (window_info[
id].bounds.y2 > window_info[i].bounds.y2))
4101 if ((status == True) && (number_children != 0))
4103 for (i=0; i < (int) number_children; i++)
4104 (
void) XGetWindowImage(display,children[i],MagickFalse,level+1);
4105 (void) XFree((
void *) children);
4151 image=NewImageList();
4152 for (
id=0;
id < number_windows;
id++)
4157 import=((window_info[id].bounds.x2 >= window_info[0].bounds.x1) &&
4158 (window_info[
id].bounds.x1 <= window_info[0].bounds.x2) &&
4159 (window_info[id].bounds.y2 >= window_info[0].bounds.y1) &&
4160 (window_info[
id].bounds.y1 <= window_info[0].bounds.y2)) ?
4161 MagickTrue : MagickFalse;
4165 for (j=0; j < id; j++)
4166 if ((window_info[
id].visual == window_info[j].visual) &&
4167 (window_info[id].colormap == window_info[j].colormap))
4169 if ((window_info[
id].bounds.x1 >= window_info[j].bounds.x1) &&
4170 (window_info[id].bounds.x2 <= window_info[j].bounds.x2) &&
4171 (window_info[
id].bounds.y1 >= window_info[j].bounds.y1) &&
4172 (window_info[id].bounds.y2 <= window_info[j].bounds.y2))
4175 if (
import == MagickFalse)
4180 ximage=XGetImage(display,window_info[
id].window,(
int)
4181 window_info[
id].crop_info.x,(
int) window_info[
id].crop_info.y,
4182 (
unsigned int) window_info[
id].crop_info.width,(
unsigned int)
4183 window_info[
id].crop_info.height,AllPlanes,ZPixmap);
4184 if (ximage == (XImage *) NULL)
4190 colors=(XColor *) NULL;
4191 if (window_info[
id].colormap != (Colormap) NULL)
4199 number_colors=(
unsigned int) window_info[
id].visual->map_entries;
4200 for (p=colormap_info; p != (
ColormapInfo *) NULL; p=p->next)
4201 if (p->colormap == window_info[
id].colormap)
4208 colors=(XColor *) AcquireQuantumMemory(number_colors,
4210 if (colors == (XColor *) NULL)
4212 XDestroyImage(ximage);
4213 return((
Image *) NULL);
4215 if ((window_info[
id].visual->klass != DirectColor) &&
4216 (window_info[
id].visual->klass != TrueColor))
4217 for (i=0; i < (int) number_colors; i++)
4219 colors[i].pixel=(size_t) i;
4238 red_bit=window_info[id].visual->red_mask &
4239 (~(window_info[id].visual->red_mask)+1);
4240 green_bit=window_info[id].visual->green_mask &
4241 (~(window_info[id].visual->green_mask)+1);
4242 blue_bit=window_info[id].visual->blue_mask &
4243 (~(window_info[id].visual->blue_mask)+1);
4244 for (i=0; i < (int) number_colors; i++)
4246 colors[i].pixel=(
unsigned long) (red | green | blue);
4249 if (red > window_info[
id].visual->red_mask)
4252 if (green > window_info[
id].visual->green_mask)
4255 if (blue > window_info[
id].visual->blue_mask)
4259 (void) XQueryColors(display,window_info[
id].colormap,colors,
4260 (
int) number_colors);
4266 return((
Image *) NULL);
4267 p->colormap=window_info[id].colormap;
4269 p->next=colormap_info;
4277 composite_image=AcquireImage((
ImageInfo *) NULL);
4278 if (composite_image == (
Image *) NULL)
4280 XDestroyImage(ximage);
4281 return((
Image *) NULL);
4286 if ((window_info[
id].visual->klass != TrueColor) &&
4287 (window_info[
id].visual->klass != DirectColor))
4288 composite_image->storage_class=PseudoClass;
4289 composite_image->columns=(size_t) ximage->width;
4290 composite_image->rows=(
size_t) ximage->height;
4291 exception=(&composite_image->exception);
4292 composite_view=AcquireAuthenticCacheView(composite_image,exception);
4293 switch (composite_image->storage_class)
4313 red_mask=window_info[id].visual->red_mask;
4315 while ((red_mask != 0) && ((red_mask & 0x01) == 0))
4320 green_mask=window_info[id].visual->green_mask;
4322 while ((green_mask != 0) && ((green_mask & 0x01) == 0))
4327 blue_mask=window_info[id].visual->blue_mask;
4329 while ((blue_mask != 0) && ((blue_mask & 0x01) == 0))
4337 if ((number_colors != 0) &&
4338 (window_info[
id].visual->klass == DirectColor))
4339 for (y=0; y < (int) composite_image->rows; y++)
4341 q=QueueCacheViewAuthenticPixels(composite_view,0,(ssize_t) y,
4342 composite_image->columns,1,exception);
4345 for (x=0; x < (int) composite_image->columns; x++)
4347 pixel=XGetPixel(ximage,x,y);
4348 index=(pixel >> red_shift) & red_mask;
4349 SetPixelRed(q,ScaleShortToQuantum(
4350 colors[index].red));
4351 index=(pixel >> green_shift) & green_mask;
4352 SetPixelGreen(q,ScaleShortToQuantum(
4353 colors[index].green));
4354 index=(pixel >> blue_shift) & blue_mask;
4355 SetPixelBlue(q,ScaleShortToQuantum(
4356 colors[index].blue));
4359 if (SyncCacheViewAuthenticPixels(composite_view,exception) == MagickFalse)
4363 for (y=0; y < (int) composite_image->rows; y++)
4365 q=QueueCacheViewAuthenticPixels(composite_view,0,(ssize_t) y,
4366 composite_image->columns,1,exception);
4369 for (x=0; x < (int) composite_image->columns; x++)
4371 pixel=XGetPixel(ximage,x,y);
4372 color=(pixel >> red_shift) & red_mask;
4374 color=(65535UL*color)/red_mask;
4375 SetPixelRed(q,ScaleShortToQuantum((
unsigned short)
4377 color=(pixel >> green_shift) & green_mask;
4378 if (green_mask != 0)
4379 color=(65535UL*color)/green_mask;
4380 SetPixelGreen(q,ScaleShortToQuantum((
unsigned short)
4382 color=(pixel >> blue_shift) & blue_mask;
4384 color=(65535UL*color)/blue_mask;
4385 SetPixelBlue(q,ScaleShortToQuantum((
unsigned short)
4389 if (SyncCacheViewAuthenticPixels(composite_view,exception) == MagickFalse)
4399 if (AcquireImageColormap(composite_image,number_colors) == MagickFalse)
4401 XDestroyImage(ximage);
4402 composite_image=DestroyImage(composite_image);
4403 return((
Image *) NULL);
4405 if (colors == (XColor *) NULL)
4407 for (i=0; i < (int) composite_image->colors; i++)
4409 composite_image->colormap[colors[i].pixel].red=
4410 ScaleShortToQuantum(colors[i].red);
4411 composite_image->colormap[colors[i].pixel].green=
4412 ScaleShortToQuantum(colors[i].green);
4413 composite_image->colormap[colors[i].pixel].blue=
4414 ScaleShortToQuantum(colors[i].blue);
4419 for (y=0; y < (int) composite_image->rows; y++)
4421 q=QueueCacheViewAuthenticPixels(composite_view,0,(ssize_t) y,
4422 composite_image->columns,1,exception);
4425 indexes=GetCacheViewAuthenticIndexQueue(composite_view);
4426 for (x=0; x < (int) composite_image->columns; x++)
4428 index=(IndexPacket) XGetPixel(ximage,x,y);
4429 SetPixelIndex(indexes+x,index);
4430 SetPixelRGBO(q,composite_image->colormap+(ssize_t)
4434 if (SyncCacheViewAuthenticPixels(composite_view,exception) == MagickFalse)
4440 composite_view=DestroyCacheView(composite_view);
4441 XDestroyImage(ximage);
4442 if (image == (
Image *) NULL)
4444 image=composite_image;
4450 (void) XTranslateCoordinates(display,window_info[
id].window,window,0,0,
4451 &x_offset,&y_offset,&child);
4452 x_offset-=(int) crop_info.x;
4455 y_offset-=(int) crop_info.y;
4458 (void) CompositeImage(image,CopyCompositeOp,composite_image,(ssize_t)
4459 x_offset,(ssize_t) y_offset);
4460 composite_image=DestroyImage(composite_image);
4467 next=colormap_info->next;
4468 colormap_info->colors=(XColor *)
4469 RelinquishMagickMemory(colormap_info->colors);
4470 colormap_info=(
ColormapInfo *) RelinquishMagickMemory(colormap_info);
4476 window_info=(WindowInfo *) RelinquishMagickMemory(window_info);
4482 return((
Image *) NULL);
4523 MagickExport
void XGetWindowInfo(Display *display,XVisualInfo *visual_info,
4524 XStandardColormap *map_info,XPixelInfo *pixel,XFontStruct *font_info,
4525 XResourceInfo *resource_info,XWindowInfo *window)
4530 assert(display != (Display *) NULL);
4531 assert(visual_info != (XVisualInfo *) NULL);
4532 assert(map_info != (XStandardColormap *) NULL);
4533 assert(pixel != (XPixelInfo *) NULL);
4534 assert(resource_info != (XResourceInfo *) NULL);
4535 assert(window != (XWindowInfo *) NULL);
4536 if (IsEventLogging() != MagickFalse)
4537 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
4538 if (window->id != (Window) NULL)
4540 if (window->cursor != (Cursor) NULL)
4541 (
void) XFreeCursor(display,window->cursor);
4542 if (window->busy_cursor != (Cursor) NULL)
4543 (void) XFreeCursor(display,window->busy_cursor);
4544 if (window->highlight_stipple != (Pixmap) NULL)
4545 (
void) XFreePixmap(display,window->highlight_stipple);
4546 if (window->shadow_stipple != (Pixmap) NULL)
4547 (void) XFreePixmap(display,window->shadow_stipple);
4548 if (window->name == (
char *) NULL)
4549 window->name=AcquireString(
"");
4550 if (window->icon_name == (
char *) NULL)
4551 window->icon_name=AcquireString(
"");
4558 window->id=(Window) NULL;
4559 if (window->name == (
char *) NULL)
4560 window->name=AcquireString(
"");
4561 if (window->icon_name == (
char *) NULL)
4562 window->icon_name=AcquireString(
"");
4563 window->x=XDisplayWidth(display,visual_info->screen) >> 1;
4564 window->y=XDisplayWidth(display,visual_info->screen) >> 1;
4565 window->ximage=(XImage *) NULL;
4566 window->matte_image=(XImage *) NULL;
4567 window->pixmap=(Pixmap) NULL;
4568 window->matte_pixmap=(Pixmap) NULL;
4569 window->mapped=MagickFalse;
4570 window->stasis=MagickFalse;
4571 window->shared_memory=MagickTrue;
4572 window->segment_info=(
void *) NULL;
4573 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
4578 if (window->segment_info == (
void *) NULL)
4579 window->segment_info=AcquireCriticalMemory(2*
sizeof(*segment_info));
4580 segment_info=(XShmSegmentInfo *) window->segment_info;
4581 segment_info[0].shmid=(-1);
4582 segment_info[0].shmaddr=(
char *) NULL;
4583 segment_info[1].shmid=(-1);
4584 segment_info[1].shmaddr=(
char *) NULL;
4591 window->screen=visual_info->screen;
4592 window->root=XRootWindow(display,visual_info->screen);
4593 window->visual=visual_info->visual;
4594 window->storage_class=(
unsigned int) visual_info->klass;
4595 window->depth=(
unsigned int) visual_info->depth;
4596 window->visual_info=visual_info;
4597 window->map_info=map_info;
4598 window->pixel_info=pixel;
4599 window->font_info=font_info;
4600 window->cursor=XCreateFontCursor(display,XC_left_ptr);
4601 window->busy_cursor=XCreateFontCursor(display,XC_watch);
4602 window->geometry=(
char *) NULL;
4603 window->icon_geometry=(
char *) NULL;
4604 if (resource_info->icon_geometry != (
char *) NULL)
4605 (
void) CloneString(&window->icon_geometry,resource_info->icon_geometry);
4606 window->crop_geometry=(
char *) NULL;
4607 window->flags=(size_t) PSize;
4610 window->min_width=1;
4611 window->min_height=1;
4612 window->width_inc=1;
4613 window->height_inc=1;
4614 window->border_width=resource_info->border_width;
4615 window->annotate_context=pixel->annotate_context;
4616 window->highlight_context=pixel->highlight_context;
4617 window->widget_context=pixel->widget_context;
4618 window->shadow_stipple=(Pixmap) NULL;
4619 window->highlight_stipple=(Pixmap) NULL;
4620 window->use_pixmap=MagickTrue;
4621 window->immutable=MagickFalse;
4622 window->shape=MagickFalse;
4624 window->mask=(int) (CWBackingStore | CWBackPixel | CWBackPixmap |
4625 CWBitGravity | CWBorderPixel | CWColormap | CWCursor | CWDontPropagate |
4626 CWEventMask | CWOverrideRedirect | CWSaveUnder | CWWinGravity);
4627 window->attributes.background_pixel=pixel->background_color.pixel;
4628 window->attributes.background_pixmap=(Pixmap) NULL;
4629 window->attributes.bit_gravity=ForgetGravity;
4630 window->attributes.backing_store=WhenMapped;
4631 window->attributes.save_under=MagickTrue;
4632 window->attributes.border_pixel=pixel->border_color.pixel;
4633 window->attributes.colormap=map_info->colormap;
4634 window->attributes.cursor=window->cursor;
4635 window->attributes.do_not_propagate_mask=NoEventMask;
4636 window->attributes.event_mask=NoEventMask;
4637 window->attributes.override_redirect=MagickFalse;
4638 window->attributes.win_gravity=NorthWestGravity;
4639 window->orphan=MagickFalse;
4674 MagickExport
void XHighlightEllipse(Display *display,Window window,
4677 assert(display != (Display *) NULL);
4678 assert(window != (Window) NULL);
4679 assert(annotate_context != (GC) NULL);
4681 if (IsEventLogging() != MagickFalse)
4682 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
4683 if ((highlight_info->width < 4) || (highlight_info->height < 4))
4685 (void) XDrawArc(display,window,annotate_context,(
int) highlight_info->x,
4686 (int) highlight_info->y,(
unsigned int) highlight_info->width-1,
4687 (
unsigned int) highlight_info->height-1,0,360*64);
4688 (void) XDrawArc(display,window,annotate_context,(
int) highlight_info->x+1,
4689 (int) highlight_info->y+1,(
unsigned int) highlight_info->width-3,
4690 (
unsigned int) highlight_info->height-3,0,360*64);
4725 MagickExport
void XHighlightLine(Display *display,Window window,
4726 GC annotate_context,
const XSegment *highlight_info)
4728 assert(display != (Display *) NULL);
4729 assert(window != (Window) NULL);
4730 assert(annotate_context != (GC) NULL);
4731 assert(highlight_info != (XSegment *) NULL);
4732 if (IsEventLogging() != MagickFalse)
4733 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
4734 (void) XDrawLine(display,window,annotate_context,highlight_info->x1,
4735 highlight_info->y1,highlight_info->x2,highlight_info->y2);
4770 MagickExport
void XHighlightRectangle(Display *display,Window window,
4773 assert(display != (Display *) NULL);
4774 assert(window != (Window) NULL);
4775 assert(annotate_context != (GC) NULL);
4777 if (IsEventLogging() != MagickFalse)
4778 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
4779 if ((highlight_info->width < 4) || (highlight_info->height < 4))
4781 (void) XDrawRectangle(display,window,annotate_context,(
int) highlight_info->x,
4782 (int) highlight_info->y,(
unsigned int) highlight_info->width-1,
4783 (
unsigned int) highlight_info->height-1);
4784 (void) XDrawRectangle(display,window,annotate_context,(
int) highlight_info->x+
4785 1,(int) highlight_info->y+1,(
unsigned int) highlight_info->width-3,
4786 (
unsigned int) highlight_info->height-3);
4849 assert(image_info != (
const ImageInfo *) NULL);
4850 assert(image_info->signature == MagickCoreSignature);
4852 if (IsEventLogging() != MagickFalse)
4853 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
4854 image_info->filename);
4855 display=XOpenDisplay(image_info->server_name);
4856 if (display == (Display *) NULL)
4857 ThrowXWindowFatalException(XServerError,
"UnableToOpenXServer",
4858 XDisplayName(image_info->server_name));
4862 (void) XSetErrorHandler(XError);
4870 root=XRootWindow(display,XDefaultScreen(display));
4871 target=(Window) NULL;
4872 if (*image_info->filename !=
'\0')
4874 if (LocaleCompare(image_info->filename,
"root") == 0)
4881 if (isdigit((
int) ((
unsigned char) *image_info->filename)) != 0)
4882 target=XWindowByID(display,root,(Window)
4883 strtol(image_info->filename,(
char **) NULL,0));
4884 if (target == (Window) NULL)
4885 target=XWindowByName(display,root,image_info->filename);
4886 if (target == (Window) NULL)
4887 ThrowXWindowException(XServerError,
"NoWindowWithSpecifiedIDExists",
4888 image_info->filename);
4894 prior_target=target;
4895 if (target == (Window) NULL)
4896 target=XSelectWindow(display,&crop_info);
4897 if (target == (Window) NULL)
4898 ThrowXWindowException(XServerError,
"UnableToReadXWindowImage",
4899 image_info->filename);
4906 status=XGetGeometry(display,target,&root,&x,&x,&d,&d,&d,&d);
4907 if (status != False)
4917 status=XQueryTree(display,target,&root,&parent,&children,&d);
4918 if ((status != False) && (children != (Window *) NULL))
4919 (void) XFree((
char *) children);
4920 if ((status == False) || (parent == (Window) NULL) ||
4928 client=XClientWindow(display,target);
4929 if (ximage_info->frame == MagickFalse)
4931 if ((ximage_info->frame == MagickFalse) &&
4932 (prior_target != MagickFalse))
4933 target=prior_target;
4936 if (ximage_info->screen != MagickFalse)
4950 status=XGetWindowAttributes(display,target,&window_attributes);
4951 if (status == False)
4953 (void) XCloseDisplay(display);
4954 ThrowXWindowFatalException(XServerError,
4955 "UnableToReadXWindowAttributes",image_info->filename);
4957 (void) XTranslateCoordinates(display,target,root,0,0,&x,&y,&child);
4958 crop_info.x=(ssize_t) x;
4959 crop_info.y=(ssize_t) y;
4960 crop_info.width=(size_t) window_attributes.width;
4961 crop_info.height=(
size_t) window_attributes.height;
4962 if (ximage_info->borders != 0)
4967 crop_info.x-=window_attributes.border_width;
4968 crop_info.y-=window_attributes.border_width;
4969 crop_info.width+=window_attributes.border_width << 1;
4970 crop_info.height+=window_attributes.border_width << 1;
4978 status=XGetWMColormapWindows(display,target,&children,&number_windows);
4979 if ((status == True) && (number_windows > 0))
4981 ximage_info->descend=MagickTrue;
4982 (void) XFree ((
char *) children);
4984 colormaps=XListInstalledColormaps(display,target,&number_colormaps);
4985 if (number_colormaps > 0)
4987 if (number_colormaps > 1)
4988 ximage_info->descend=MagickTrue;
4989 (void) XFree((
char *) colormaps);
4994 if (ximage_info->silent == MagickFalse)
4995 (void) XBell(display,0);
4999 (void) XGrabServer(display);
5000 image=XGetWindowImage(display,target,ximage_info->borders,
5001 ximage_info->descend ? 1U : 0U);
5002 (void) XUngrabServer(display);
5003 if (image == (
Image *) NULL)
5004 ThrowXWindowException(XServerError,
"UnableToReadXWindowImage",
5005 image_info->filename)
5008 (void) CopyMagickString(image->filename,image_info->filename,
5010 if ((crop_info.width != 0) && (crop_info.height != 0))
5018 crop_image=CropImage(image,&crop_info,&image->exception);
5019 if (crop_image != (
Image *) NULL)
5021 image=DestroyImage(image);
5025 status=XGetWMName(display,target,&window_name);
5028 if (*image_info->filename ==
'\0')
5029 (void) CopyMagickString(image->filename,(
char *) window_name.value,
5030 (size_t) window_name.nitems+1);
5031 (void) XFree((
void *) window_name.value);
5034 if (ximage_info->silent == MagickFalse)
5039 (void) XBell(display,0);
5040 (void) XBell(display,0);
5042 (void) XCloseDisplay(display);
5074 MagickExport XWindows *XInitializeWindows(Display *display,
5075 XResourceInfo *resource_info)
5086 windows=(XWindows *) AcquireMagickMemory(
sizeof(*windows));
5087 if (windows == (XWindows *) NULL)
5088 ThrowXWindowFatalException(XServerFatalError,
"MemoryAllocationFailed",
5090 (void) memset(windows,0,
sizeof(*windows));
5091 windows->pixel_info=(XPixelInfo *) AcquireQuantumMemory(1,
5092 sizeof(*windows->pixel_info));
5093 windows->icon_pixel=(XPixelInfo *) AcquireQuantumMemory(1,
5094 sizeof(*windows->icon_pixel));
5095 windows->icon_resources=(XResourceInfo *) AcquireQuantumMemory(1,
5096 sizeof(*windows->icon_resources));
5097 if ((windows->pixel_info == (XPixelInfo *) NULL) ||
5098 (windows->icon_pixel == (XPixelInfo *) NULL) ||
5099 (windows->icon_resources == (XResourceInfo *) NULL))
5100 ThrowXWindowFatalException(XServerFatalError,
"MemoryAllocationFailed",
5105 windows->display=display;
5106 windows->wm_protocols=XInternAtom(display,
"WM_PROTOCOLS",MagickFalse);
5107 windows->wm_delete_window=XInternAtom(display,
"WM_DELETE_WINDOW",MagickFalse);
5108 windows->wm_take_focus=XInternAtom(display,
"WM_TAKE_FOCUS",MagickFalse);
5109 windows->im_protocols=XInternAtom(display,
"IM_PROTOCOLS",MagickFalse);
5110 windows->im_remote_command=
5111 XInternAtom(display,
"IM_REMOTE_COMMAND",MagickFalse);
5112 windows->im_update_widget=XInternAtom(display,
"IM_UPDATE_WIDGET",MagickFalse);
5113 windows->im_update_colormap=
5114 XInternAtom(display,
"IM_UPDATE_COLORMAP",MagickFalse);
5115 windows->im_former_image=XInternAtom(display,
"IM_FORMER_IMAGE",MagickFalse);
5116 windows->im_next_image=XInternAtom(display,
"IM_NEXT_IMAGE",MagickFalse);
5117 windows->im_retain_colors=XInternAtom(display,
"IM_RETAIN_COLORS",MagickFalse);
5118 windows->im_exit=XInternAtom(display,
"IM_EXIT",MagickFalse);
5119 windows->dnd_protocols=XInternAtom(display,
"DndProtocol",MagickFalse);
5120 #if defined(MAGICKCORE_WINDOWS_SUPPORT)
5121 (void) XSynchronize(display,MagickFalse);
5123 if ((GetLogEventMask() & X11Event) != 0)
5125 (void) XSynchronize(display,MagickTrue);
5126 (void) LogMagickEvent(X11Event,GetMagickModule(),
"Version: %s",
5127 GetMagickVersion((
size_t *) NULL));
5128 (void) LogMagickEvent(X11Event,GetMagickModule(),
"Protocols:");
5129 (void) LogMagickEvent(X11Event,GetMagickModule(),
5130 " Window Manager: 0x%lx",windows->wm_protocols);
5131 (void) LogMagickEvent(X11Event,GetMagickModule(),
5132 " delete window: 0x%lx",windows->wm_delete_window);
5133 (void) LogMagickEvent(X11Event,GetMagickModule(),
" take focus: 0x%lx",
5134 windows->wm_take_focus);
5135 (void) LogMagickEvent(X11Event,GetMagickModule(),
" ImageMagick: 0x%lx",
5136 windows->im_protocols);
5137 (void) LogMagickEvent(X11Event,GetMagickModule(),
5138 " remote command: 0x%lx",windows->im_remote_command);
5139 (void) LogMagickEvent(X11Event,GetMagickModule(),
5140 " update widget: 0x%lx",windows->im_update_widget);
5141 (void) LogMagickEvent(X11Event,GetMagickModule(),
5142 " update colormap: 0x%lx",windows->im_update_colormap);
5143 (void) LogMagickEvent(X11Event,GetMagickModule(),
5144 " former image: 0x%lx",windows->im_former_image);
5145 (void) LogMagickEvent(X11Event,GetMagickModule(),
" next image: 0x%lx",
5146 windows->im_next_image);
5147 (void) LogMagickEvent(X11Event,GetMagickModule(),
5148 " retain colors: 0x%lx",windows->im_retain_colors);
5149 (void) LogMagickEvent(X11Event,GetMagickModule(),
" exit: 0x%lx",
5151 (void) LogMagickEvent(X11Event,GetMagickModule(),
" Drag and Drop: 0x%lx",
5152 windows->dnd_protocols);
5157 windows->map_info=XAllocStandardColormap();
5158 windows->icon_map=XAllocStandardColormap();
5159 if ((windows->map_info == (XStandardColormap *) NULL) ||
5160 (windows->icon_map == (XStandardColormap *) NULL))
5161 ThrowXWindowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed",
5163 windows->map_info->colormap=(Colormap) NULL;
5164 windows->icon_map->colormap=(Colormap) NULL;
5165 windows->pixel_info->pixels=(
unsigned long *) NULL;
5166 windows->pixel_info->annotate_context=(GC) NULL;
5167 windows->pixel_info->highlight_context=(GC) NULL;
5168 windows->pixel_info->widget_context=(GC) NULL;
5169 windows->font_info=(XFontStruct *) NULL;
5170 windows->icon_pixel->annotate_context=(GC) NULL;
5171 windows->icon_pixel->pixels=(
unsigned long *) NULL;
5175 *windows->icon_resources=(*resource_info);
5176 windows->icon_resources->visual_type=(
char *)
"default";
5177 windows->icon_resources->colormap=SharedColormap;
5178 windows->visual_info=
5179 XBestVisualInfo(display,windows->map_info,resource_info);
5180 windows->icon_visual=
5181 XBestVisualInfo(display,windows->icon_map,windows->icon_resources);
5182 if ((windows->visual_info == (XVisualInfo *) NULL) ||
5183 (windows->icon_visual == (XVisualInfo *) NULL))
5184 ThrowXWindowFatalException(XServerFatalError,
"UnableToGetVisual",
5185 resource_info->visual_type);
5186 if ((GetLogEventMask() & X11Event) != 0)
5188 (void) LogMagickEvent(X11Event,GetMagickModule(),
"Visual:");
5189 (void) LogMagickEvent(X11Event,GetMagickModule(),
" visual id: 0x%lx",
5190 windows->visual_info->visualid);
5191 (void) LogMagickEvent(X11Event,GetMagickModule(),
" class: %s",
5192 XVisualClassName(windows->visual_info->klass));
5193 (void) LogMagickEvent(X11Event,GetMagickModule(),
" depth: %d planes",
5194 windows->visual_info->depth);
5195 (void) LogMagickEvent(X11Event,GetMagickModule(),
5196 " size of colormap: %d entries",windows->visual_info->colormap_size);
5197 (void) LogMagickEvent(X11Event,GetMagickModule(),
5198 " red, green, blue masks: 0x%lx 0x%lx 0x%lx",
5199 windows->visual_info->red_mask,windows->visual_info->green_mask,
5200 windows->visual_info->blue_mask);
5201 (void) LogMagickEvent(X11Event,GetMagickModule(),
5202 " significant bits in color: %d bits",
5203 windows->visual_info->bits_per_rgb);
5208 windows->class_hints=XAllocClassHint();
5209 windows->manager_hints=XAllocWMHints();
5210 if ((windows->class_hints == (XClassHint *) NULL) ||
5211 (windows->manager_hints == (XWMHints *) NULL))
5212 ThrowXWindowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed",
5217 root_window=XRootWindow(display,windows->visual_info->screen);
5218 windows->group_leader.id=(Window) NULL;
5219 if (resource_info->window_group != (
char *) NULL)
5221 if (isdigit((
int) ((
unsigned char) *resource_info->window_group)) != 0)
5222 windows->group_leader.id=XWindowByID(display,root_window,(Window)
5223 strtol((
char *) resource_info->window_group,(
char **) NULL,0));
5224 if (windows->group_leader.id == (Window) NULL)
5225 windows->group_leader.id=
5226 XWindowByName(display,root_window,resource_info->window_group);
5265 MagickExport Cursor XMakeCursor(Display *display,Window window,
5266 Colormap colormap,
char *background_color,
char *foreground_color)
5268 #define scope_height 17
5269 #define scope_x_hot 8
5270 #define scope_y_hot 8
5271 #define scope_width 17
5273 static const unsigned char
5276 0x80, 0x03, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02,
5277 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x7f,
5278 0xfc, 0x01, 0x01, 0x00, 0x01, 0x7f, 0xfc, 0x01, 0x80, 0x02, 0x00,
5279 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02,
5280 0x00, 0x80, 0x02, 0x00, 0x80, 0x03, 0x00
5284 0xc0, 0x07, 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x06, 0x00, 0xc0, 0x06,
5285 0x00, 0xc0, 0x06, 0x00, 0xc0, 0x06, 0x00, 0xff, 0xfe, 0x01, 0x7f,
5286 0xfc, 0x01, 0x03, 0x80, 0x01, 0x7f, 0xfc, 0x01, 0xff, 0xfe, 0x01,
5287 0xc0, 0x06, 0x00, 0xc0, 0x06, 0x00, 0xc0, 0x06, 0x00, 0xc0, 0x06,
5288 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x07, 0x00
5302 assert(display != (Display *) NULL);
5303 assert(window != (Window) NULL);
5304 assert(colormap != (Colormap) NULL);
5305 assert(background_color != (
char *) NULL);
5306 assert(foreground_color != (
char *) NULL);
5307 if (IsEventLogging() != MagickFalse)
5308 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",background_color);
5309 source=XCreateBitmapFromData(display,window,(
char *) scope_bits,scope_width,
5311 mask=XCreateBitmapFromData(display,window,(
char *) scope_mask_bits,
5312 scope_width,scope_height);
5313 if ((source == (Pixmap) NULL) || (mask == (Pixmap) NULL))
5314 ThrowXWindowFatalException(XServerError,
"UnableToCreatePixmap",
"...");
5315 (void) XParseColor(display,colormap,background_color,&background);
5316 (void) XParseColor(display,colormap,foreground_color,&foreground);
5317 cursor=XCreatePixmapCursor(display,source,mask,&foreground,&background,
5318 scope_x_hot,scope_y_hot);
5319 (void) XFreePixmap(display,source);
5320 (void) XFreePixmap(display,mask);
5362 MagickExport MagickBooleanType XMakeImage(Display *display,
5363 const XResourceInfo *resource_info,XWindowInfo *window,
Image *image,
5364 unsigned int width,
unsigned int height)
5366 #define CheckOverflowException(length,width,height) \
5367 (((height) != 0) && ((length)/((size_t) height) != ((size_t) width)))
5377 assert(display != (Display *) NULL);
5378 assert(resource_info != (XResourceInfo *) NULL);
5379 assert(window != (XWindowInfo *) NULL);
5381 assert(height != 0);
5382 if (IsEventLogging() != MagickFalse)
5383 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
5384 if ((window->width == 0) || (window->height == 0))
5385 return(MagickFalse);
5389 (void) XCheckDefineCursor(display,window->id,window->busy_cursor);
5390 (void) XFlush(display);
5391 depth=(int) window->depth;
5392 if (window->destroy)
5393 window->image=DestroyImage(window->image);
5394 window->image=image;
5395 window->destroy=MagickFalse;
5396 if (window->image != (
Image *) NULL)
5398 if (window->crop_geometry != (
char *) NULL)
5409 window->image->page.x=0;
5410 window->image->page.y=0;
5411 (void) ParsePageGeometry(window->image,window->crop_geometry,
5412 &crop_info,&image->exception);
5413 crop_image=CropImage(window->image,&crop_info,&image->exception);
5414 if (crop_image != (
Image *) NULL)
5416 if (window->image != image)
5417 window->image=DestroyImage(window->image);
5418 window->image=crop_image;
5419 window->destroy=MagickTrue;
5422 if ((width != (
unsigned int) window->image->columns) ||
5423 (height != (
unsigned int) window->image->rows))
5431 resize_image=NewImageList();
5432 if ((window->pixel_info->colors == 0) &&
5433 (window->image->rows > (
unsigned long) XDisplayHeight(display,window->screen)) &&
5434 (window->image->columns > (
unsigned long) XDisplayWidth(display,window->screen)))
5435 resize_image=ResizeImage(window->image,width,height,
5436 image->filter,image->blur,&image->exception);
5439 if (window->image->storage_class == PseudoClass)
5440 resize_image=SampleImage(window->image,width,height,
5443 resize_image=ThumbnailImage(window->image,width,height,
5446 if (resize_image != (
Image *) NULL)
5448 if (window->image != image)
5449 window->image=DestroyImage(window->image);
5450 window->image=resize_image;
5451 window->destroy=MagickTrue;
5454 width=(
unsigned int) window->image->columns;
5455 assert((
size_t) width == window->image->columns);
5456 height=(
unsigned int) window->image->rows;
5457 assert((
size_t) height == window->image->rows);
5462 ximage=(XImage *) NULL;
5463 format=(depth == 1) ? XYBitmap : ZPixmap;
5464 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
5465 if (window->shared_memory != MagickFalse)
5473 segment_info=(XShmSegmentInfo *) window->segment_info;
5474 segment_info[1].shmid=(-1);
5475 segment_info[1].shmaddr=(
char *) NULL;
5476 ximage=XShmCreateImage(display,window->visual,(
unsigned int) depth,format,
5477 (
char *) NULL,&segment_info[1],width,height);
5479 if (ximage == (XImage *) NULL)
5480 window->shared_memory=MagickFalse;
5483 length=(size_t) ximage->bytes_per_line*ximage->height;
5484 if (CheckOverflowException(length,ximage->bytes_per_line,ximage->height))
5485 window->shared_memory=MagickFalse;
5487 if (window->shared_memory != MagickFalse)
5488 segment_info[1].shmid=shmget(IPC_PRIVATE,length,IPC_CREAT | 0777);
5489 if (window->shared_memory != MagickFalse)
5490 segment_info[1].shmaddr=(
char *) shmat(segment_info[1].shmid,0,0);
5491 if (segment_info[1].shmid < 0)
5492 window->shared_memory=MagickFalse;
5493 if (window->shared_memory != MagickFalse)
5494 (void) shmctl(segment_info[1].shmid,IPC_RMID,0);
5497 if (ximage != (XImage *) NULL)
5498 XDestroyImage(ximage);
5499 ximage=(XImage *) NULL;
5500 if (segment_info[1].shmaddr)
5502 (void) shmdt(segment_info[1].shmaddr);
5503 segment_info[1].shmaddr=(
char *) NULL;
5505 if (segment_info[1].shmid >= 0)
5507 (void) shmctl(segment_info[1].shmid,IPC_RMID,0);
5508 segment_info[1].shmid=(-1);
5516 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
5517 if (window->shared_memory)
5525 (void) XSync(display,MagickFalse);
5526 xerror_alert=MagickFalse;
5527 segment_info=(XShmSegmentInfo *) window->segment_info;
5528 ximage->data=segment_info[1].shmaddr;
5529 segment_info[1].readOnly=MagickFalse;
5530 status=XShmAttach(display,&segment_info[1]);
5531 if (status != False)
5532 (void) XSync(display,MagickFalse);
5533 if ((status == False) || (xerror_alert != MagickFalse))
5535 window->shared_memory=MagickFalse;
5536 if (status != False)
5537 XShmDetach(display,&segment_info[1]);
5539 XDestroyImage(ximage);
5540 ximage=(XImage *) NULL;
5541 if (segment_info[1].shmid >= 0)
5543 if (segment_info[1].shmaddr != NULL)
5544 (void) shmdt(segment_info[1].shmaddr);
5545 (void) shmctl(segment_info[1].shmid,IPC_RMID,0);
5546 segment_info[1].shmid=(-1);
5547 segment_info[1].shmaddr=(
char *) NULL;
5552 if (window->shared_memory == MagickFalse)
5553 ximage=XCreateImage(display,window->visual,(
unsigned int) depth,format,0,
5554 (
char *) NULL,width,height,XBitmapPad(display),0);
5555 if (ximage == (XImage *) NULL)
5560 (void) XCheckDefineCursor(display,window->id,window->cursor);
5561 return(MagickFalse);
5563 if ((GetLogEventMask() & X11Event) != 0)
5565 (void) LogMagickEvent(X11Event,GetMagickModule(),
"XImage:");
5566 (void) LogMagickEvent(X11Event,GetMagickModule(),
" width, height: %dx%d",
5567 ximage->width,ximage->height);
5568 (void) LogMagickEvent(X11Event,GetMagickModule(),
" format: %d",
5570 (void) LogMagickEvent(X11Event,GetMagickModule(),
" byte order: %d",
5571 ximage->byte_order);
5572 (void) LogMagickEvent(X11Event,GetMagickModule(),
5573 " bitmap unit, bit order, pad: %d %d %d",ximage->bitmap_unit,
5574 ximage->bitmap_bit_order,ximage->bitmap_pad);
5575 (void) LogMagickEvent(X11Event,GetMagickModule(),
" depth: %d",
5577 (void) LogMagickEvent(X11Event,GetMagickModule(),
" bytes per line: %d",
5578 ximage->bytes_per_line);
5579 (void) LogMagickEvent(X11Event,GetMagickModule(),
" bits per pixel: %d",
5580 ximage->bits_per_pixel);
5581 (void) LogMagickEvent(X11Event,GetMagickModule(),
5582 " red, green, blue masks: 0x%lx 0x%lx 0x%lx",ximage->red_mask,
5583 ximage->green_mask,ximage->blue_mask);
5585 if (window->shared_memory == MagickFalse)
5587 if (ximage->format == XYBitmap)
5589 ximage->data=(
char *) AcquireQuantumMemory((
size_t)
5590 ximage->bytes_per_line,(size_t) ximage->depth*ximage->height);
5591 if (ximage->data != (
char *) NULL)
5592 (
void) memset(ximage->data,0,(
size_t)
5593 ximage->bytes_per_line*ximage->depth*ximage->height);
5597 ximage->data=(
char *) AcquireQuantumMemory((
size_t)
5598 ximage->bytes_per_line,(size_t) ximage->height);
5599 if (ximage->data != (
char *) NULL)
5600 (
void) memset(ximage->data,0,(
size_t)
5601 ximage->bytes_per_line*ximage->height);
5604 if (ximage->data == (
char *) NULL)
5609 XDestroyImage(ximage);
5610 ximage=(XImage *) NULL;
5611 (void) XCheckDefineCursor(display,window->id,window->cursor);
5612 return(MagickFalse);
5614 if (window->ximage != (XImage *) NULL)
5619 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
5620 if (window->segment_info != (XShmSegmentInfo *) NULL)
5625 segment_info=(XShmSegmentInfo *) window->segment_info;
5626 if (segment_info[0].shmid >= 0)
5628 (void) XSync(display,MagickFalse);
5629 (void) XShmDetach(display,&segment_info[0]);
5630 (void) XSync(display,MagickFalse);
5631 if (segment_info[0].shmaddr != (
char *) NULL)
5632 (
void) shmdt(segment_info[0].shmaddr);
5633 (void) shmctl(segment_info[0].shmid,IPC_RMID,0);
5634 segment_info[0].shmid=(-1);
5635 segment_info[0].shmaddr=(
char *) NULL;
5636 window->ximage->data=(
char *) NULL;
5640 if (window->ximage->data != (
char *) NULL)
5641 free(window->ximage->data);
5642 window->ximage->data=(
char *) NULL;
5643 XDestroyImage(window->ximage);
5644 window->ximage=(XImage *) NULL;
5646 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
5647 if (window->segment_info != (XShmSegmentInfo *) NULL)
5652 segment_info=(XShmSegmentInfo *) window->segment_info;
5653 segment_info[0]=segment_info[1];
5656 window->ximage=ximage;
5657 matte_image=(XImage *) NULL;
5658 if ((window->shape != MagickFalse) && (window->image != (
Image *) NULL))
5659 if ((window->image->matte != MagickFalse) &&
5660 ((int) width <= XDisplayWidth(display,window->screen)) &&
5661 ((
int) height <= XDisplayHeight(display,window->screen)))
5666 matte_image=XCreateImage(display,window->visual,1,XYBitmap,0,
5667 (
char *) NULL,width,height,XBitmapPad(display),0);
5668 if ((GetLogEventMask() & X11Event) != 0)
5670 (void) LogMagickEvent(X11Event,GetMagickModule(),
"Matte Image:");
5671 (void) LogMagickEvent(X11Event,GetMagickModule(),
5672 " width, height: %dx%d",matte_image->width,matte_image->height);
5674 if (matte_image != (XImage *) NULL)
5679 matte_image->data=(
char *) malloc((
size_t)
5680 matte_image->bytes_per_line*matte_image->depth*
5681 matte_image->height);
5682 if (matte_image->data == (
char *) NULL)
5684 XDestroyImage(matte_image);
5685 matte_image=(XImage *) NULL;
5689 if (window->matte_image != (XImage *) NULL)
5694 if (window->matte_image->data != (
char *) NULL)
5695 free(window->matte_image->data);
5696 window->matte_image->data=(
char *) NULL;
5697 XDestroyImage(window->matte_image);
5698 window->matte_image=(XImage *) NULL;
5700 window->matte_image=matte_image;
5701 if (window->matte_pixmap != (Pixmap) NULL)
5703 (void) XFreePixmap(display,window->matte_pixmap);
5704 window->matte_pixmap=(Pixmap) NULL;
5705 #if defined(MAGICKCORE_HAVE_SHAPE)
5706 if (window->shape != MagickFalse)
5707 XShapeCombineMask(display,window->id,ShapeBounding,0,0,None,ShapeSet);
5710 window->stasis=MagickFalse;
5714 if (window->image != (
Image *) NULL)
5716 if ((ximage->byte_order == LSBFirst) || ((ximage->format == XYBitmap) &&
5717 (ximage->bitmap_bit_order == LSBFirst)))
5718 XMakeImageLSBFirst(resource_info,window,window->image,ximage,
5721 XMakeImageMSBFirst(resource_info,window,window->image,ximage,
5724 if (window->matte_image != (XImage *) NULL)
5729 window->matte_pixmap=XCreatePixmap(display,window->id,width,height,1);
5730 if (window->matte_pixmap != (Pixmap) NULL)
5741 context_values.background=1;
5742 context_values.foreground=0;
5743 graphics_context=XCreateGC(display,window->matte_pixmap,
5744 (
size_t) (GCBackground | GCForeground),&context_values);
5745 (void) XPutImage(display,window->matte_pixmap,graphics_context,
5746 window->matte_image,0,0,0,0,width,height);
5747 (void) XFreeGC(display,graphics_context);
5748 #if defined(MAGICKCORE_HAVE_SHAPE)
5749 if (window->shape != MagickFalse)
5750 XShapeCombineMask(display,window->id,ShapeBounding,0,0,
5751 window->matte_pixmap,ShapeSet);
5755 (void) XMakePixmap(display,resource_info,window);
5759 (void) XCheckDefineCursor(display,window->id,window->cursor);
5799 static void XMakeImageLSBFirst(
const XResourceInfo *resource_info,
5800 const XWindowInfo *window,
Image *image,XImage *ximage,XImage *matte_image)
5837 assert(resource_info != (XResourceInfo *) NULL);
5838 assert(window != (XWindowInfo *) NULL);
5839 assert(image != (
Image *) NULL);
5840 if (IsEventLogging() != MagickFalse)
5841 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
5843 if ((window->immutable == MagickFalse) &&
5844 (image->storage_class == DirectClass) && (image->matte != MagickFalse))
5847 size[MaxTextExtent];
5855 image_info=AcquireImageInfo();
5856 (void) CopyMagickString(image_info->filename,
5857 resource_info->image_info->texture != (
char *) NULL ?
5858 resource_info->image_info->texture :
"pattern:checkerboard",
5860 (void) FormatLocaleString(size,MaxTextExtent,
"%.20gx%.20g",(
double)
5861 image->columns,(double) image->rows);
5862 image_info->size=ConstantString(size);
5863 pattern=ReadImage(image_info,&image->exception);
5864 image_info=DestroyImageInfo(image_info);
5865 if (pattern != (
Image *) NULL)
5867 canvas=CloneImage(image,0,0,MagickTrue,&image->exception);
5868 if (canvas == (
Image *) NULL)
5870 (void) CompositeImage(canvas,DstOverCompositeOp,pattern,0,0);
5871 pattern=DestroyImage(pattern);
5874 scanline_pad=(
unsigned int) (ximage->bytes_per_line-((ximage->width*
5875 ximage->bits_per_pixel) >> 3));
5876 map_info=window->map_info;
5877 pixels=window->pixel_info->pixels;
5878 q=(
unsigned char *) ximage->data;
5880 canvas_view=AcquireVirtualCacheView(canvas,&canvas->exception);
5881 if (ximage->format == XYBitmap)
5893 background=(
unsigned char)
5894 (XPixelIntensity(&window->pixel_info->foreground_color) <
5895 XPixelIntensity(&window->pixel_info->background_color) ? 0x80 : 0x00);
5896 foreground=(
unsigned char)
5897 (XPixelIntensity(&window->pixel_info->background_color) <
5898 XPixelIntensity(&window->pixel_info->foreground_color) ? 0x80 : 0x00);
5899 polarity=(
unsigned short) ((GetPixelIntensity(image,
5900 &canvas->colormap[0])) < (QuantumRange/2.0) ? 1 : 0);
5901 if (canvas->colors == 2)
5902 polarity=GetPixelIntensity(canvas,&canvas->colormap[0]) <
5903 GetPixelIntensity(canvas,&canvas->colormap[1]);
5904 for (y=0; y < (int) canvas->rows; y++)
5906 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,canvas->columns,1,
5907 &canvas->exception);
5910 indexes=GetCacheViewVirtualIndexQueue(canvas_view);
5913 for (x=0; x < (int) canvas->columns; x++)
5916 if (GetPixelIndex(indexes+x) == (IndexPacket) polarity)
5934 if (window->pixel_info->colors != 0)
5935 switch (ximage->bits_per_pixel)
5945 for (y=0; y < (int) canvas->rows; y++)
5947 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
5948 canvas->columns,1,&canvas->exception);
5951 indexes=GetCacheViewVirtualIndexQueue(canvas_view);
5953 for (x=0; x < (int) canvas->columns; x++)
5955 pixel=pixels[(ssize_t) GetPixelIndex(indexes+x)] & 0x0f;
5960 *q=(
unsigned char) pixel;
5966 *q|=(
unsigned char) (pixel << 2);
5972 *q|=(
unsigned char) (pixel << 4);
5978 *q|=(
unsigned char) (pixel << 6);
5997 for (y=0; y < (int) canvas->rows; y++)
5999 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6000 canvas->columns,1,&canvas->exception);
6003 indexes=GetCacheViewVirtualIndexQueue(canvas_view);
6005 for (x=0; x < (int) canvas->columns; x++)
6007 pixel=pixels[(ssize_t) GetPixelIndex(indexes+x)] & 0xf;
6012 *q=(
unsigned char) pixel;
6018 *q|=(
unsigned char) (pixel << 4);
6035 if ((resource_info->color_recovery != MagickFalse) &&
6036 (resource_info->quantize_info->dither != MagickFalse))
6038 XDitherImage(canvas,ximage);
6041 for (y=0; y < (int) canvas->rows; y++)
6043 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6044 canvas->columns,1,&canvas->exception);
6047 indexes=GetCacheViewVirtualIndexQueue(canvas_view);
6048 for (x=0; x < (int) canvas->columns; x++)
6050 pixel=pixels[(ssize_t) GetPixelIndex(indexes+x)];
6051 *q++=(
unsigned char) pixel;
6068 bytes_per_pixel=(
unsigned int) (ximage->bits_per_pixel >> 3);
6069 for (y=0; y < (int) canvas->rows; y++)
6071 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6072 canvas->columns,1,&canvas->exception);
6075 indexes=GetCacheViewVirtualIndexQueue(canvas_view);
6076 for (x=0; x < (int) canvas->columns; x++)
6078 pixel=pixels[(ssize_t) GetPixelIndex(indexes+x)];
6079 for (k=0; k < (int) bytes_per_pixel; k++)
6081 *q++=(
unsigned char) (pixel & 0xff);
6091 switch (ximage->bits_per_pixel)
6101 for (y=0; y < (int) canvas->rows; y++)
6104 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6105 canvas->columns,1,&canvas->exception);
6108 for (x=0; x < (int) canvas->columns; x++)
6110 pixel=XGammaPixel(map_info,p);
6116 *q=(
unsigned char) pixel;
6122 *q|=(
unsigned char) (pixel << 2);
6128 *q|=(
unsigned char) (pixel << 4);
6134 *q|=(
unsigned char) (pixel << 6);
6154 for (y=0; y < (int) canvas->rows; y++)
6156 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6157 canvas->columns,1,&canvas->exception);
6161 for (x=0; x < (int) canvas->columns; x++)
6163 pixel=XGammaPixel(map_info,p);
6169 *q=(
unsigned char) pixel;
6175 *q|=(
unsigned char) (pixel << 4);
6193 if ((resource_info->color_recovery != MagickFalse) &&
6194 (resource_info->quantize_info->dither != MagickFalse))
6196 XDitherImage(canvas,ximage);
6199 for (y=0; y < (int) canvas->rows; y++)
6201 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6202 canvas->columns,1,&canvas->exception);
6205 for (x=0; x < (int) canvas->columns; x++)
6207 pixel=XGammaPixel(map_info,p);
6208 *q++=(
unsigned char) pixel;
6217 if ((ximage->bits_per_pixel == 32) && (map_info->red_max == 255) &&
6218 (map_info->green_max == 255) && (map_info->blue_max == 255) &&
6219 (map_info->red_mult == 65536L) && (map_info->green_mult == 256) &&
6220 (map_info->blue_mult == 1))
6225 for (y=0; y < (int) canvas->rows; y++)
6227 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6228 canvas->columns,1,&canvas->exception);
6231 if ((red_gamma != 1.0) || (green_gamma != 1.0) ||
6232 (blue_gamma != 1.0))
6237 for (x=(
int) canvas->columns-1; x >= 0; x--)
6239 *q++=ScaleQuantumToChar(XBlueGamma(GetPixelBlue(p)));
6240 *q++=ScaleQuantumToChar(XGreenGamma(GetPixelGreen(p)));
6241 *q++=ScaleQuantumToChar(XRedGamma(GetPixelRed(p)));
6247 for (x=(
int) canvas->columns-1; x >= 0; x--)
6249 *q++=ScaleQuantumToChar((Quantum) GetPixelBlue(p));
6250 *q++=ScaleQuantumToChar((Quantum) GetPixelGreen(p));
6251 *q++=ScaleQuantumToChar((Quantum) GetPixelRed(p));
6258 if ((ximage->bits_per_pixel == 32) && (map_info->red_max == 255) &&
6259 (map_info->green_max == 255) && (map_info->blue_max == 255) &&
6260 (map_info->red_mult == 1) && (map_info->green_mult == 256) &&
6261 (map_info->blue_mult == 65536L))
6266 for (y=0; y < (int) canvas->rows; y++)
6268 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6269 canvas->columns,1,&canvas->exception);
6272 if ((red_gamma != 1.0) || (green_gamma != 1.0) ||
6273 (blue_gamma != 1.0))
6278 for (x=(
int) canvas->columns-1; x >= 0; x--)
6280 *q++=ScaleQuantumToChar(XRedGamma(GetPixelRed(p)));
6281 *q++=ScaleQuantumToChar(XGreenGamma(GetPixelGreen(p)));
6282 *q++=ScaleQuantumToChar(XBlueGamma(GetPixelBlue(p)));
6288 for (x=(
int) canvas->columns-1; x >= 0; x--)
6290 *q++=ScaleQuantumToChar((Quantum) GetPixelRed(p));
6291 *q++=ScaleQuantumToChar((Quantum) GetPixelGreen(p));
6292 *q++=ScaleQuantumToChar((Quantum) GetPixelBlue(p));
6309 bytes_per_pixel=(
unsigned int) (ximage->bits_per_pixel >> 3);
6310 for (y=0; y < (int) canvas->rows; y++)
6312 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6313 canvas->columns,1,&canvas->exception);
6316 for (x=0; x < (int) canvas->columns; x++)
6318 pixel=XGammaPixel(map_info,p);
6319 for (k=0; k < (int) bytes_per_pixel; k++)
6321 *q++=(
unsigned char) (pixel & 0xff);
6332 if (matte_image != (XImage *) NULL)
6337 scanline_pad=(
unsigned int) (matte_image->bytes_per_line-
6338 ((matte_image->width*matte_image->bits_per_pixel) >> 3));
6339 q=(
unsigned char *) matte_image->data;
6340 for (y=0; y < (int) canvas->rows; y++)
6342 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,canvas->columns,1,
6343 &canvas->exception);
6348 for (x=(
int) canvas->columns-1; x >= 0; x--)
6351 if (GetPixelOpacity(p) > (QuantumRange/2))
6367 canvas_view=DestroyCacheView(canvas_view);
6368 if (canvas != image)
6369 canvas=DestroyImage(canvas);
6408 static void XMakeImageMSBFirst(
const XResourceInfo *resource_info,
6409 const XWindowInfo *window,
Image *image,XImage *ximage,XImage *matte_image)
6446 assert(resource_info != (XResourceInfo *) NULL);
6447 assert(window != (XWindowInfo *) NULL);
6448 assert(image != (
Image *) NULL);
6449 if (IsEventLogging() != MagickFalse)
6450 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
6452 if ((window->immutable != MagickFalse) &&
6453 (image->storage_class == DirectClass) && (image->matte != MagickFalse))
6456 size[MaxTextExtent];
6464 image_info=AcquireImageInfo();
6465 (void) CopyMagickString(image_info->filename,
6466 resource_info->image_info->texture != (
char *) NULL ?
6467 resource_info->image_info->texture :
"pattern:checkerboard",
6469 (void) FormatLocaleString(size,MaxTextExtent,
"%.20gx%.20g",(
double)
6470 image->columns,(double) image->rows);
6471 image_info->size=ConstantString(size);
6472 pattern=ReadImage(image_info,&image->exception);
6473 image_info=DestroyImageInfo(image_info);
6474 if (pattern != (
Image *) NULL)
6476 canvas=CloneImage(image,0,0,MagickTrue,&image->exception);
6477 if (canvas == (
Image *) NULL)
6479 (void) CompositeImage(canvas,DstOverCompositeOp,pattern,0,0);
6480 pattern=DestroyImage(pattern);
6483 scanline_pad=(
unsigned int) (ximage->bytes_per_line-
6484 ((ximage->width*ximage->bits_per_pixel) >> 3));
6485 map_info=window->map_info;
6486 pixels=window->pixel_info->pixels;
6487 q=(
unsigned char *) ximage->data;
6489 canvas_view=AcquireVirtualCacheView(canvas,&canvas->exception);
6490 if (ximage->format == XYBitmap)
6502 background=(
unsigned char)
6503 (XPixelIntensity(&window->pixel_info->foreground_color) <
6504 XPixelIntensity(&window->pixel_info->background_color) ? 0x01 : 0x00);
6505 foreground=(
unsigned char)
6506 (XPixelIntensity(&window->pixel_info->background_color) <
6507 XPixelIntensity(&window->pixel_info->foreground_color) ? 0x01 : 0x00);
6508 polarity=(
unsigned short) ((GetPixelIntensity(image,
6509 &canvas->colormap[0])) < (QuantumRange/2.0) ? 1 : 0);
6510 if (canvas->colors == 2)
6511 polarity=GetPixelIntensity(canvas,&canvas->colormap[0]) <
6512 GetPixelIntensity(canvas,&canvas->colormap[1]);
6513 for (y=0; y < (int) canvas->rows; y++)
6515 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,canvas->columns,1,
6516 &canvas->exception);
6519 indexes=GetCacheViewVirtualIndexQueue(canvas_view);
6522 for (x=(
int) canvas->columns-1; x >= 0; x--)
6525 if (GetPixelIndex(indexes+x) == (IndexPacket) polarity)
6543 if (window->pixel_info->colors != 0)
6544 switch (ximage->bits_per_pixel)
6554 for (y=0; y < (int) canvas->rows; y++)
6556 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6557 canvas->columns,1,&canvas->exception);
6560 indexes=GetCacheViewVirtualIndexQueue(canvas_view);
6562 for (x=0; x < (int) canvas->columns; x++)
6564 pixel=pixels[(ssize_t) GetPixelIndex(indexes+x)] & 0xf;
6569 *q=(
unsigned char) (pixel << 6);
6575 *q|=(
unsigned char) (pixel << 4);
6581 *q|=(
unsigned char) (pixel << 2);
6587 *q|=(
unsigned char) pixel;
6606 for (y=0; y < (int) canvas->rows; y++)
6608 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6609 canvas->columns,1,&canvas->exception);
6612 indexes=GetCacheViewVirtualIndexQueue(canvas_view);
6614 for (x=0; x < (int) canvas->columns; x++)
6616 pixel=pixels[(ssize_t) GetPixelIndex(indexes+x)] & 0xf;
6621 *q=(
unsigned char) (pixel << 4);
6627 *q|=(
unsigned char) pixel;
6644 if (resource_info->color_recovery &&
6645 resource_info->quantize_info->dither)
6647 XDitherImage(canvas,ximage);
6650 for (y=0; y < (int) canvas->rows; y++)
6652 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6653 canvas->columns,1,&canvas->exception);
6656 indexes=GetCacheViewVirtualIndexQueue(canvas_view);
6657 for (x=0; x < (int) canvas->columns; x++)
6659 pixel=pixels[(ssize_t) GetPixelIndex(indexes+x)];
6660 *q++=(
unsigned char) pixel;
6675 channel[
sizeof(size_t)];
6680 bytes_per_pixel=(
unsigned int) (ximage->bits_per_pixel >> 3);
6681 for (y=0; y < (int) canvas->rows; y++)
6683 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6684 canvas->columns,1,&canvas->exception);
6687 indexes=GetCacheViewVirtualIndexQueue(canvas_view);
6688 for (x=0; x < (int) canvas->columns; x++)
6690 pixel=pixels[(ssize_t) GetPixelIndex(indexes+x)];
6691 for (k=(
int) bytes_per_pixel-1; k >= 0; k--)
6693 channel[k]=(
unsigned char) pixel;
6696 for (k=0; k < (int) bytes_per_pixel; k++)
6705 switch (ximage->bits_per_pixel)
6715 for (y=0; y < (int) canvas->rows; y++)
6717 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6718 canvas->columns,1,&canvas->exception);
6722 for (x=(
int) canvas->columns-1; x >= 0; x--)
6724 pixel=XGammaPixel(map_info,p);
6730 *q=(
unsigned char) (pixel << 6);
6736 *q|=(
unsigned char) (pixel << 4);
6742 *q|=(
unsigned char) (pixel << 2);
6748 *q|=(
unsigned char) pixel;
6768 for (y=0; y < (int) canvas->rows; y++)
6770 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6771 canvas->columns,1,&canvas->exception);
6775 for (x=(
int) canvas->columns-1; x >= 0; x--)
6777 pixel=XGammaPixel(map_info,p);
6783 *q=(
unsigned char) (pixel << 4);
6789 *q|=(
unsigned char) pixel;
6807 if (resource_info->color_recovery &&
6808 resource_info->quantize_info->dither)
6810 XDitherImage(canvas,ximage);
6813 for (y=0; y < (int) canvas->rows; y++)
6815 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6816 canvas->columns,1,&canvas->exception);
6819 for (x=(
int) canvas->columns-1; x >= 0; x--)
6821 pixel=XGammaPixel(map_info,p);
6822 *q++=(
unsigned char) pixel;
6831 if ((ximage->bits_per_pixel == 32) && (map_info->red_max == 255) &&
6832 (map_info->green_max == 255) && (map_info->blue_max == 255) &&
6833 (map_info->red_mult == 65536L) && (map_info->green_mult == 256) &&
6834 (map_info->blue_mult == 1))
6839 for (y=0; y < (int) canvas->rows; y++)
6841 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6842 canvas->columns,1,&canvas->exception);
6845 if ((red_gamma != 1.0) || (green_gamma != 1.0) ||
6846 (blue_gamma != 1.0))
6851 for (x=(
int) canvas->columns-1; x >= 0; x--)
6854 *q++=ScaleQuantumToChar(XRedGamma(GetPixelRed(p)));
6855 *q++=ScaleQuantumToChar(XGreenGamma(GetPixelGreen(p)));
6856 *q++=ScaleQuantumToChar(XBlueGamma(GetPixelBlue(p)));
6861 for (x=(
int) canvas->columns-1; x >= 0; x--)
6864 *q++=ScaleQuantumToChar((Quantum) GetPixelRed(p));
6865 *q++=ScaleQuantumToChar((Quantum) GetPixelGreen(p));
6866 *q++=ScaleQuantumToChar((Quantum) GetPixelBlue(p));
6872 if ((ximage->bits_per_pixel == 32) && (map_info->red_max == 255) &&
6873 (map_info->green_max == 255) && (map_info->blue_max == 255) &&
6874 (map_info->red_mult == 1) && (map_info->green_mult == 256) &&
6875 (map_info->blue_mult == 65536L))
6880 for (y=0; y < (int) canvas->rows; y++)
6882 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6883 canvas->columns,1,&canvas->exception);
6886 if ((red_gamma != 1.0) || (green_gamma != 1.0) ||
6887 (blue_gamma != 1.0))
6892 for (x=(
int) canvas->columns-1; x >= 0; x--)
6895 *q++=ScaleQuantumToChar(XBlueGamma(GetPixelBlue(p)));
6896 *q++=ScaleQuantumToChar(XGreenGamma(GetPixelGreen(p)));
6897 *q++=ScaleQuantumToChar(XRedGamma(GetPixelRed(p)));
6902 for (x=(
int) canvas->columns-1; x >= 0; x--)
6905 *q++=ScaleQuantumToChar((Quantum) GetPixelBlue(p));
6906 *q++=ScaleQuantumToChar((Quantum) GetPixelGreen(p));
6907 *q++=ScaleQuantumToChar((Quantum) GetPixelRed(p));
6923 bytes_per_pixel=(
unsigned int) (ximage->bits_per_pixel >> 3);
6924 for (y=0; y < (int) canvas->rows; y++)
6926 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6927 canvas->columns,1,&canvas->exception);
6930 for (x=(
int) canvas->columns-1; x >= 0; x--)
6932 pixel=XGammaPixel(map_info,p);
6933 for (k=(
int) bytes_per_pixel-1; k >= 0; k--)
6935 *q++=(
unsigned char) (pixel & 0xff);
6946 if (matte_image != (XImage *) NULL)
6951 scanline_pad=(
unsigned int) (matte_image->bytes_per_line-
6952 ((matte_image->width*matte_image->bits_per_pixel) >> 3));
6953 q=(
unsigned char *) matte_image->data;
6954 for (y=0; y < (int) canvas->rows; y++)
6956 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,canvas->columns,1,
6957 &canvas->exception);
6962 for (x=(
int) canvas->columns-1; x >= 0; x--)
6965 if (GetPixelOpacity(p) > (QuantumRange/2))
6981 canvas_view=DestroyCacheView(canvas_view);
6982 if (canvas != image)
6983 canvas=DestroyImage(canvas);
7011 MagickExport
void XMakeMagnifyImage(Display *display,XWindows *windows)
7014 tuple[MaxTextExtent];
7036 previous_magnify = 0;
7056 assert(display != (Display *) NULL);
7057 assert(windows != (XWindows *) NULL);
7058 if (IsEventLogging() != MagickFalse)
7059 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
7061 for (n=1; n < (ssize_t) windows->magnify.data; n++)
7063 while ((magnify*windows->image.ximage->width) < windows->magnify.width)
7065 while ((magnify*windows->image.ximage->height) < windows->magnify.height)
7067 while (magnify > windows->magnify.width)
7069 while (magnify > windows->magnify.height)
7074 if (previous_magnify != 0)
7075 magnify=previous_magnify;
7077 if (magnify != previous_magnify)
7089 while ((1 << i) <= (int) magnify)
7091 (void) FormatLocaleString(windows->magnify.name,MaxTextExtent,
7092 "Magnify %.20gX",(
double) i);
7093 status=XStringListToTextProperty(&windows->magnify.name,1,&window_name);
7094 if (status != False)
7096 XSetWMName(display,windows->magnify.id,&window_name);
7097 XSetWMIconName(display,windows->magnify.id,&window_name);
7098 (void) XFree((
void *) window_name.value);
7101 previous_magnify=magnify;
7102 ximage=windows->image.ximage;
7103 width=(
unsigned int) windows->magnify.ximage->width;
7104 height=(
unsigned int) windows->magnify.ximage->height;
7105 if ((windows->magnify.x < 0) ||
7106 (windows->magnify.x >= windows->image.ximage->width))
7107 windows->magnify.x=windows->image.ximage->width >> 1;
7108 x=windows->magnify.x-((width/magnify) >> 1);
7112 if (x > (
int) (ximage->width-(width/magnify)))
7113 x=ximage->width-width/magnify;
7114 if ((windows->magnify.y < 0) ||
7115 (windows->magnify.y >= windows->image.ximage->height))
7116 windows->magnify.y=windows->image.ximage->height >> 1;
7117 y=windows->magnify.y-((height/magnify) >> 1);
7121 if (y > (
int) (ximage->height-(height/magnify)))
7122 y=ximage->height-height/magnify;
7123 q=(
unsigned char *) windows->magnify.ximage->data;
7124 scanline_pad=(
unsigned int) (windows->magnify.ximage->bytes_per_line-
7125 ((width*windows->magnify.ximage->bits_per_pixel) >> 3));
7126 if (ximage->bits_per_pixel < 8)
7141 pixel_info=windows->magnify.pixel_info;
7142 switch (ximage->bitmap_bit_order)
7151 if (ximage->format == XYBitmap)
7153 background=(
unsigned char)
7154 (XPixelIntensity(&pixel_info->foreground_color) <
7155 XPixelIntensity(&pixel_info->background_color) ? 0x80 : 0x00);
7156 foreground=(
unsigned char)
7157 (XPixelIntensity(&pixel_info->background_color) <
7158 XPixelIntensity(&pixel_info->foreground_color) ? 0x80 : 0x00);
7159 if (windows->magnify.depth > 1)
7160 Swap(background,foreground);
7162 for (i=0; i < (ssize_t) height; i+=magnify)
7167 for (j=0; j < magnify; j++)
7169 p=(
unsigned char *) ximage->data+y*ximage->bytes_per_line+
7170 ((x*ximage->bits_per_pixel) >> 3);
7171 p_bit=(
unsigned char) (x*ximage->bits_per_pixel) & 0x07;
7174 for (k=0; k < width; k+=magnify)
7179 for (l=0; l < magnify; l++)
7184 for (plane=0; (int) plane < ximage->bits_per_pixel; plane++)
7187 if (*p & (0x01 << (p_bit+plane)))
7200 p_bit+=ximage->bits_per_pixel;
7207 *q=byte >> (8-q_bit);
7223 if (ximage->format == XYBitmap)
7225 background=(
unsigned char)
7226 (XPixelIntensity(&pixel_info->foreground_color) <
7227 XPixelIntensity(&pixel_info->background_color) ? 0x01 : 0x00);
7228 foreground=(
unsigned char)
7229 (XPixelIntensity(&pixel_info->background_color) <
7230 XPixelIntensity(&pixel_info->foreground_color) ? 0x01 : 0x00);
7231 if (windows->magnify.depth > 1)
7232 Swap(background,foreground);
7234 for (i=0; i < (ssize_t) height; i+=magnify)
7239 for (j=0; j < magnify; j++)
7241 p=(
unsigned char *) ximage->data+y*ximage->bytes_per_line+
7242 ((x*ximage->bits_per_pixel) >> 3);
7243 p_bit=(
unsigned char) (x*ximage->bits_per_pixel) & 0x07;
7246 for (k=0; k < width; k+=magnify)
7251 for (l=0; l < magnify; l++)
7256 for (plane=0; (int) plane < ximage->bits_per_pixel; plane++)
7259 if (*p & (0x80 >> (p_bit+plane)))
7272 p_bit+=ximage->bits_per_pixel;
7279 *q=byte << (8-q_bit);
7290 switch (ximage->bits_per_pixel)
7298 for (i=0; i < (ssize_t) height; i+=magnify)
7303 for (j=0; j < magnify; j++)
7305 p=(
unsigned char *) ximage->data+y*ximage->bytes_per_line+
7306 ((x*ximage->bits_per_pixel) >> 3);
7307 for (k=0; k < width; k+=magnify)
7312 for (l=0; l < magnify; l++)
7331 bytes_per_pixel=(
unsigned int) ximage->bits_per_pixel >> 3;
7332 for (i=0; i < (ssize_t) height; i+=magnify)
7337 for (j=0; j < magnify; j++)
7339 p=(
unsigned char *) ximage->data+y*ximage->bytes_per_line+
7340 ((x*ximage->bits_per_pixel) >> 3);
7341 for (k=0; k < width; k+=magnify)
7346 for (l=0; l < magnify; l++)
7347 for (m=0; m < bytes_per_pixel; m++)
7361 x=windows->magnify.x-((width/magnify) >> 1);
7363 x=(int) ((width >> 1)-windows->magnify.x*magnify);
7365 if (x > (
int) (ximage->width-(width/magnify)))
7366 x=(
int) ((ximage->width-windows->magnify.x)*magnify-(width >> 1));
7369 y=windows->magnify.y-((height/magnify) >> 1);
7371 y=(int) ((height >> 1)-windows->magnify.y*magnify);
7373 if (y > (
int) (ximage->height-(height/magnify)))
7374 y=(
int) ((ximage->height-windows->magnify.y)*magnify-(height >> 1));
7377 if ((x != 0) || (y != 0))
7378 (void) XFillRectangle(display,windows->magnify.pixmap,
7379 windows->magnify.annotate_context,0,0,width,height);
7380 (void) XPutImage(display,windows->magnify.pixmap,
7381 windows->magnify.annotate_context,windows->magnify.ximage,0,0,x,y,width-x,
7383 if ((magnify > 1) && ((magnify <= (width >> 1)) &&
7384 (magnify <= (height >> 1))))
7392 highlight_info.x=(ssize_t) windows->magnify.width >> 1;
7393 highlight_info.y=(ssize_t) windows->magnify.height >> 1;
7394 highlight_info.width=magnify;
7395 highlight_info.height=magnify;
7396 (void) XDrawRectangle(display,windows->magnify.pixmap,
7397 windows->magnify.highlight_context,(
int) highlight_info.x,
7398 (int) highlight_info.y,(
unsigned int) highlight_info.width-1,
7399 (
unsigned int) highlight_info.height-1);
7401 (void) XDrawRectangle(display,windows->magnify.pixmap,
7402 windows->magnify.annotate_context,(
int) highlight_info.x+1,
7403 (int) highlight_info.y+1,(
unsigned int) highlight_info.width-3,
7404 (
unsigned int) highlight_info.height-3);
7409 (void) GetOneVirtualMagickPixel(windows->image.image,(ssize_t)
7410 windows->magnify.x,(ssize_t) windows->magnify.y,&pixel,
7411 &windows->image.image->exception);
7412 (void) FormatLocaleString(tuple,MaxTextExtent,
"%d,%d: ",
7413 windows->magnify.x,windows->magnify.y);
7414 (void) ConcatenateMagickString(tuple,
"(",MaxTextExtent);
7415 ConcatenateColorComponent(&pixel,RedChannel,X11Compliance,tuple);
7416 (void) ConcatenateMagickString(tuple,
",",MaxTextExtent);
7417 ConcatenateColorComponent(&pixel,GreenChannel,X11Compliance,tuple);
7418 (void) ConcatenateMagickString(tuple,
",",MaxTextExtent);
7419 ConcatenateColorComponent(&pixel,BlueChannel,X11Compliance,tuple);
7420 if (pixel.colorspace == CMYKColorspace)
7422 (void) ConcatenateMagickString(tuple,
",",MaxTextExtent);
7423 ConcatenateColorComponent(&pixel,IndexChannel,X11Compliance,tuple);
7425 if (pixel.matte != MagickFalse)
7427 (void) ConcatenateMagickString(tuple,
",",MaxTextExtent);
7428 ConcatenateColorComponent(&pixel,OpacityChannel,X11Compliance,tuple);
7430 (void) ConcatenateMagickString(tuple,
")",MaxTextExtent);
7431 height=(
unsigned int) windows->magnify.font_info->ascent+
7432 windows->magnify.font_info->descent;
7433 x=windows->magnify.font_info->max_bounds.width >> 1;
7434 y=windows->magnify.font_info->ascent+(height >> 2);
7435 (void) XDrawImageString(display,windows->magnify.pixmap,
7436 windows->magnify.annotate_context,x,y,tuple,(
int) strlen(tuple));
7437 GetColorTuple(&pixel,MagickTrue,tuple);
7439 (void) XDrawImageString(display,windows->magnify.pixmap,
7440 windows->magnify.annotate_context,x,y,tuple,(
int) strlen(tuple));
7441 (void) QueryMagickColorname(windows->image.image,&pixel,SVGCompliance,tuple,
7442 &windows->image.image->exception);
7444 (void) XDrawImageString(display,windows->magnify.pixmap,
7445 windows->magnify.annotate_context,x,y,tuple,(
int) strlen(tuple));
7449 magnify_window=windows->magnify;
7452 XRefreshWindow(display,&magnify_window,(XEvent *) NULL);
7484 static MagickBooleanType XMakePixmap(Display *display,
7485 const XResourceInfo *resource_info,XWindowInfo *window)
7491 assert(display != (Display *) NULL);
7492 assert(resource_info != (XResourceInfo *) NULL);
7493 assert(window != (XWindowInfo *) NULL);
7494 if (IsEventLogging() != MagickFalse)
7495 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
7496 (void) resource_info;
7497 if (window->pixmap != (Pixmap) NULL)
7502 (void) XFreePixmap(display,window->pixmap);
7503 window->pixmap=(Pixmap) NULL;
7505 if (window->use_pixmap == MagickFalse)
7506 return(MagickFalse);
7507 if (window->ximage == (XImage *) NULL)
7508 return(MagickFalse);
7512 (void) XCheckDefineCursor(display,window->id,window->busy_cursor);
7513 (void) XFlush(display);
7517 width=(
unsigned int) window->ximage->width;
7518 height=(
unsigned int) window->ximage->height;
7519 window->pixmap=XCreatePixmap(display,window->id,width,height,window->depth);
7520 if (window->pixmap == (Pixmap) NULL)
7525 (void) XCheckDefineCursor(display,window->id,window->cursor);
7526 return(MagickFalse);
7531 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
7532 if (window->shared_memory)
7533 (void) XShmPutImage(display,window->pixmap,window->annotate_context,
7534 window->ximage,0,0,0,0,width,height,MagickTrue);
7536 if (window->shared_memory == MagickFalse)
7537 (void) XPutImage(display,window->pixmap,window->annotate_context,
7538 window->ximage,0,0,0,0,width,height);
7539 if ((GetLogEventMask() & X11Event) != 0)
7541 (void) LogMagickEvent(X11Event,GetMagickModule(),
"Pixmap:");
7542 (void) LogMagickEvent(X11Event,GetMagickModule(),
" width, height: %ux%u",
7548 (void) XCheckDefineCursor(display,window->id,window->cursor);
7589 #if defined(__cplusplus) || defined(c_plusplus)
7593 static inline MagickRealType DiversityPixelIntensity(
7594 const DiversityPacket *pixel)
7599 intensity=0.298839*pixel->red+0.586811*pixel->green+0.114350*pixel->blue;
7603 static int IntensityCompare(
const void *x,
const void *y)
7612 color_1=(DiversityPacket *) x;
7613 color_2=(DiversityPacket *) y;
7614 diversity=(int) (DiversityPixelIntensity(color_2)-
7615 DiversityPixelIntensity(color_1));
7619 static int PopularityCompare(
const void *x,
const void *y)
7625 color_1=(DiversityPacket *) x;
7626 color_2=(DiversityPacket *) y;
7627 return((
int) color_2->count-(int) color_1->count);
7630 #if defined(__cplusplus) || defined(c_plusplus)
7634 static inline Quantum ScaleXToQuantum(
const size_t x,
7637 return((Quantum) (((MagickRealType) QuantumRange*x)/scale+0.5));
7640 MagickExport
void XMakeStandardColormap(Display *display,
7641 XVisualInfo *visual_info,XResourceInfo *resource_info,
Image *image,
7642 XStandardColormap *map_info,XPixelInfo *pixel)
7671 assert(display != (Display *) NULL);
7672 assert(visual_info != (XVisualInfo *) NULL);
7673 assert(map_info != (XStandardColormap *) NULL);
7674 assert(resource_info != (XResourceInfo *) NULL);
7675 assert(pixel != (XPixelInfo *) NULL);
7676 if (IsEventLogging() != MagickFalse)
7677 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
7678 exception=(&image->exception);
7679 if (resource_info->map_type != (
char *) NULL)
7684 XGetPixelPacket(display,visual_info,map_info,resource_info,image,
7686 number_colors=(
unsigned int) (map_info->base_pixel+
7687 (map_info->red_max+1)*(map_info->green_max+1)*(map_info->blue_max+1));
7688 if ((map_info->red_max*map_info->green_max*map_info->blue_max) != 0)
7689 if ((image->matte == MagickFalse) &&
7690 (resource_info->color_recovery == MagickFalse) &&
7691 resource_info->quantize_info->dither &&
7692 (number_colors < MaxColormapSize))
7703 affinity_image=AcquireImage((
ImageInfo *) NULL);
7704 if (affinity_image == (
Image *) NULL)
7705 ThrowXWindowFatalException(ResourceLimitFatalError,
7706 "UnableToDitherImage",image->filename);
7707 affinity_image->columns=number_colors;
7708 affinity_image->rows=1;
7712 q=QueueAuthenticPixels(affinity_image,0,0,affinity_image->columns,
7716 for (i=0; i < (ssize_t) number_colors; i++)
7719 if (map_info->red_max != 0)
7720 SetPixelRed(q,ScaleXToQuantum((
size_t) (i/
7721 map_info->red_mult),map_info->red_max));
7723 if (map_info->green_max != 0)
7724 SetPixelGreen(q,ScaleXToQuantum((
size_t) ((i/
7725 map_info->green_mult) % (map_info->green_max+1)),
7726 map_info->green_max));
7728 if (map_info->blue_max != 0)
7729 SetPixelBlue(q,ScaleXToQuantum((
size_t) (i %
7730 map_info->green_mult),map_info->blue_max));
7731 SetPixelOpacity(q,TransparentOpacity);
7734 (void) SyncAuthenticPixels(affinity_image,exception);
7735 (void) RemapImage(resource_info->quantize_info,image,
7738 XGetPixelPacket(display,visual_info,map_info,resource_info,image,
7740 (void) SetImageStorageClass(image,DirectClass);
7741 affinity_image=DestroyImage(affinity_image);
7743 if ((GetLogEventMask() & X11Event) != 0)
7745 (void) LogMagickEvent(X11Event,GetMagickModule(),
7746 "Standard Colormap:");
7747 (void) LogMagickEvent(X11Event,GetMagickModule(),
7748 " colormap id: 0x%lx",map_info->colormap);
7749 (void) LogMagickEvent(X11Event,GetMagickModule(),
7750 " red, green, blue max: %lu %lu %lu",map_info->red_max,
7751 map_info->green_max,map_info->blue_max);
7752 (void) LogMagickEvent(X11Event,GetMagickModule(),
7753 " red, green, blue mult: %lu %lu %lu",map_info->red_mult,
7754 map_info->green_mult,map_info->blue_mult);
7758 if ((visual_info->klass != DirectColor) &&
7759 (visual_info->klass != TrueColor))
7760 if ((image->storage_class == DirectClass) ||
7761 ((int) image->colors > visual_info->colormap_size))
7769 quantize_info=(*resource_info->quantize_info);
7770 quantize_info.number_colors=(size_t) visual_info->colormap_size;
7771 (
void) QuantizeImage(&quantize_info,image);
7776 (void) XFreeStandardColormap(display,visual_info,map_info,pixel);
7777 colormap=XDefaultColormap(display,visual_info->screen);
7778 if (visual_info->visual != XDefaultVisual(display,visual_info->screen))
7779 colormap=XCreateColormap(display,XRootWindow(display,visual_info->screen),
7780 visual_info->visual,visual_info->klass == DirectColor ?
7781 AllocAll : AllocNone);
7782 if (colormap == (Colormap) NULL)
7783 ThrowXWindowFatalException(ResourceLimitFatalError,
"UnableToCreateColormap",
7788 XGetMapInfo(visual_info,colormap,map_info);
7789 XGetPixelPacket(display,visual_info,map_info,resource_info,image,pixel);
7793 switch (visual_info->klass)
7801 number_colors=image->colors;
7802 colors=(XColor *) AcquireQuantumMemory((
size_t)
7803 visual_info->colormap_size,
sizeof(*colors));
7804 if (colors == (XColor *) NULL)
7805 ThrowXWindowFatalException(ResourceLimitFatalError,
7806 "UnableToCreateColormap",image->filename);
7808 color.flags=(char) (DoRed | DoGreen | DoBlue);
7809 for (i=0; i < (ssize_t) image->colors; i++)
7811 color.red=ScaleQuantumToShort(XRedGamma(image->colormap[i].red));
7812 color.green=ScaleQuantumToShort(XGreenGamma(image->colormap[i].green));
7813 color.blue=ScaleQuantumToShort(XBlueGamma(image->colormap[i].blue));
7814 if (visual_info->klass != StaticColor)
7816 gray_value=(
unsigned short) XPixelIntensity(&color);
7817 color.red=gray_value;
7818 color.green=gray_value;
7819 color.blue=gray_value;
7821 status=XAllocColor(display,colormap,&color);
7822 if (status == False)
7824 colormap=XCopyColormapAndFree(display,colormap);
7825 (void) XAllocColor(display,colormap,&color);
7827 pixel->pixels[i]=color.pixel;
7841 number_colors=image->colors;
7842 colors=(XColor *) AcquireQuantumMemory((
size_t)
7843 visual_info->colormap_size,
sizeof(*colors));
7844 if (colors == (XColor *) NULL)
7845 ThrowXWindowFatalException(ResourceLimitFatalError,
7846 "UnableToCreateColormap",image->filename);
7850 (void) XAllocColor(display,colormap,&pixel->foreground_color);
7851 (void) XAllocColor(display,colormap,&pixel->background_color);
7852 (void) XAllocColor(display,colormap,&pixel->border_color);
7853 (void) XAllocColor(display,colormap,&pixel->matte_color);
7854 (void) XAllocColor(display,colormap,&pixel->highlight_color);
7855 (void) XAllocColor(display,colormap,&pixel->shadow_color);
7856 (void) XAllocColor(display,colormap,&pixel->depth_color);
7857 (void) XAllocColor(display,colormap,&pixel->trough_color);
7858 for (i=0; i < MaxNumberPens; i++)
7859 (
void) XAllocColor(display,colormap,&pixel->pen_colors[i]);
7863 colormap_type=resource_info->colormap;
7864 status=XAllocColorCells(display,colormap,MagickFalse,(
unsigned long *)
7865 NULL,0,pixel->pixels,(
unsigned int) image->colors);
7866 if (status != False)
7867 colormap_type=PrivateColormap;
7868 if (colormap_type == SharedColormap)
7891 diversity=(DiversityPacket *) AcquireQuantumMemory(image->colors,
7892 sizeof(*diversity));
7893 if (diversity == (DiversityPacket *) NULL)
7894 ThrowXWindowFatalException(ResourceLimitFatalError,
7895 "UnableToCreateColormap",image->filename);
7896 for (i=0; i < (ssize_t) image->colors; i++)
7898 diversity[i].red=image->colormap[i].red;
7899 diversity[i].green=image->colormap[i].green;
7900 diversity[i].blue=image->colormap[i].blue;
7901 diversity[i].index=(
unsigned short) i;
7902 diversity[i].count=0;
7904 image_view=AcquireAuthenticCacheView(image,exception);
7905 for (y=0; y < (int) image->rows; y++)
7913 p=GetCacheViewAuthenticPixels(image_view,0,(ssize_t) y,
7914 image->columns,1,exception);
7917 indexes=GetCacheViewAuthenticIndexQueue(image_view);
7918 for (x=(
int) image->columns-1; x >= 0; x--)
7919 diversity[(ssize_t) GetPixelIndex(indexes+x)].count++;
7921 image_view=DestroyCacheView(image_view);
7925 qsort((
void *) diversity,image->colors,
sizeof(*diversity),
7927 for (i=0; i < (ssize_t) image->colors; )
7929 diversity[i].count<<=4;
7930 i+=MagickMax((
int) (image->colors >> 4),2);
7932 diversity[image->colors-1].count<<=4;
7933 qsort((
void *) diversity,image->colors,
sizeof(*diversity),
7939 color.flags=(char) (DoRed | DoGreen | DoBlue);
7940 for (i=0; i < (ssize_t) image->colors; i++)
7942 index=diversity[i].index;
7944 ScaleQuantumToShort(XRedGamma(image->colormap[index].red));
7946 ScaleQuantumToShort(XGreenGamma(image->colormap[index].green));
7948 ScaleQuantumToShort(XBlueGamma(image->colormap[index].blue));
7949 if (visual_info->klass != PseudoColor)
7951 gray_value=(
unsigned short) XPixelIntensity(&color);
7952 color.red=gray_value;
7953 color.green=gray_value;
7954 color.blue=gray_value;
7956 status=XAllocColor(display,colormap,&color);
7957 if (status == False)
7959 pixel->pixels[index]=color.pixel;
7965 server_colors=(XColor *) AcquireQuantumMemory((
size_t)
7966 visual_info->colormap_size,
sizeof(*server_colors));
7967 if (server_colors == (XColor *) NULL)
7968 ThrowXWindowFatalException(ResourceLimitFatalError,
7969 "UnableToCreateColormap",image->filename);
7970 for (x=visual_info->colormap_size-1; x >= 0; x--)
7971 server_colors[x].pixel=(size_t) x;
7972 (void) XQueryColors(display,colormap,server_colors,
7973 (
int) MagickMin((
unsigned int) visual_info->colormap_size,256));
7977 for (; i < (ssize_t) image->colors; i++)
7979 index=diversity[i].index;
7981 ScaleQuantumToShort(XRedGamma(image->colormap[index].red));
7983 ScaleQuantumToShort(XGreenGamma(image->colormap[index].green));
7985 ScaleQuantumToShort(XBlueGamma(image->colormap[index].blue));
7986 if (visual_info->klass != PseudoColor)
7988 gray_value=(
unsigned short) XPixelIntensity(&color);
7989 color.red=gray_value;
7990 color.green=gray_value;
7991 color.blue=gray_value;
7993 XBestPixel(display,colormap,server_colors,(
unsigned int)
7994 visual_info->colormap_size,&color);
7995 pixel->pixels[index]=color.pixel;
7998 if ((
int) image->colors < visual_info->colormap_size)
8003 retain_colors=MagickMin((
unsigned int)
8004 (visual_info->colormap_size-image->colors),256);
8005 for (i=0; i < (ssize_t) retain_colors; i++)
8006 *p++=server_colors[i];
8007 number_colors+=retain_colors;
8009 server_colors=(XColor *) RelinquishMagickMemory(server_colors);
8010 diversity=(DiversityPacket *) RelinquishMagickMemory(diversity);
8016 if (status == False)
8021 colormap=XCreateColormap(display,
8022 XRootWindow(display,visual_info->screen),visual_info->visual,
8024 if (colormap == (Colormap) NULL)
8025 ThrowXWindowFatalException(ResourceLimitFatalError,
8026 "UnableToCreateColormap",image->filename);
8027 map_info->colormap=colormap;
8028 if ((
int) image->colors < visual_info->colormap_size)
8034 retain_colors=MagickMin((
unsigned int)
8035 (visual_info->colormap_size-image->colors),256);
8036 p=colors+image->colors;
8037 for (i=0; i < (ssize_t) retain_colors; i++)
8039 p->pixel=(
unsigned long) i;
8042 (void) XQueryColors(display,
8043 XDefaultColormap(display,visual_info->screen),
8044 colors+image->colors,(int) retain_colors);
8048 (void) XAllocColorCells(display,colormap,MagickFalse,
8049 (
unsigned long *) NULL,0,pixel->pixels,(
unsigned int)
8051 p=colors+image->colors;
8052 for (i=0; i < (ssize_t) retain_colors; i++)
8054 p->pixel=pixel->pixels[i];
8057 (void) XStoreColors(display,colormap,colors+image->colors,
8058 (
int) retain_colors);
8059 number_colors+=retain_colors;
8061 (void) XAllocColorCells(display,colormap,MagickFalse,
8062 (
unsigned long *) NULL,0,pixel->pixels,(
unsigned int)
8069 color.flags=(char) (DoRed | DoGreen | DoBlue);
8070 for (i=0; i < (ssize_t) image->colors; i++)
8072 color.red=ScaleQuantumToShort(XRedGamma(image->colormap[i].red));
8073 color.green=ScaleQuantumToShort(XGreenGamma(image->colormap[i].green));
8074 color.blue=ScaleQuantumToShort(XBlueGamma(image->colormap[i].blue));
8075 if (visual_info->klass != PseudoColor)
8077 gray_value=(
unsigned short) XPixelIntensity(&color);
8078 color.red=gray_value;
8079 color.green=gray_value;
8080 color.blue=gray_value;
8082 color.pixel=pixel->pixels[i];
8085 (void) XStoreColors(display,colormap,colors,(
int) image->colors);
8098 number_colors=(
unsigned int) ((map_info->red_max*map_info->red_mult)+
8099 (map_info->green_max*map_info->green_mult)+
8100 (map_info->blue_max*map_info->blue_mult)+1);
8101 linear_colormap=(number_colors > 4096) ||
8102 (((
int) (map_info->red_max+1) == visual_info->colormap_size) &&
8103 ((int) (map_info->green_max+1) == visual_info->colormap_size) &&
8104 ((
int) (map_info->blue_max+1) == visual_info->colormap_size)) ?
8105 MagickTrue : MagickFalse;
8106 if (linear_colormap != MagickFalse)
8107 number_colors=(size_t) visual_info->colormap_size;
8111 colors=(XColor *) AcquireQuantumMemory(number_colors,
sizeof(*colors));
8112 if (colors == (XColor *) NULL)
8113 ThrowXWindowFatalException(ResourceLimitFatalError,
8114 "UnableToCreateColormap",image->filename);
8119 color.flags=(char) (DoRed | DoGreen | DoBlue);
8120 if (linear_colormap != MagickFalse)
8121 for (i=0; i < (ssize_t) number_colors; i++)
8123 color.blue=(
unsigned short) 0;
8124 if (map_info->blue_max != 0)
8125 color.blue=(
unsigned short) ((
size_t)
8126 ((65535L*(i % map_info->green_mult))/map_info->blue_max));
8127 color.green=color.blue;
8128 color.red=color.blue;
8129 color.pixel=XStandardPixel(map_info,&color);
8133 for (i=0; i < (ssize_t) number_colors; i++)
8135 color.red=(
unsigned short) 0;
8136 if (map_info->red_max != 0)
8137 color.red=(
unsigned short) ((
size_t)
8138 ((65535L*(i/map_info->red_mult))/map_info->red_max));
8139 color.green=(
unsigned int) 0;
8140 if (map_info->green_max != 0)
8141 color.green=(
unsigned short) ((
size_t)
8142 ((65535L*((i/map_info->green_mult) % (map_info->green_max+1)))/
8143 map_info->green_max));
8144 color.blue=(
unsigned short) 0;
8145 if (map_info->blue_max != 0)
8146 color.blue=(
unsigned short) ((
size_t)
8147 ((65535L*(i % map_info->green_mult))/map_info->blue_max));
8148 color.pixel=XStandardPixel(map_info,&color);
8151 if ((visual_info->klass == DirectColor) &&
8152 (colormap != XDefaultColormap(display,visual_info->screen)))
8153 (void) XStoreColors(display,colormap,colors,(
int) number_colors);
8155 for (i=0; i < (ssize_t) number_colors; i++)
8156 (
void) XAllocColor(display,colormap,&colors[i]);
8160 if ((visual_info->klass != DirectColor) &&
8161 (visual_info->klass != TrueColor))
8166 XBestPixel(display,colormap,colors,(
unsigned int) number_colors,
8167 &pixel->foreground_color);
8168 XBestPixel(display,colormap,colors,(
unsigned int) number_colors,
8169 &pixel->background_color);
8170 if (pixel->background_color.pixel == pixel->foreground_color.pixel)
8175 pixel->background_color.red=(~pixel->foreground_color.red);
8176 pixel->background_color.green=
8177 (~pixel->foreground_color.green);
8178 pixel->background_color.blue=
8179 (~pixel->foreground_color.blue);
8180 XBestPixel(display,colormap,colors,(
unsigned int) number_colors,
8181 &pixel->background_color);
8183 XBestPixel(display,colormap,colors,(
unsigned int) number_colors,
8184 &pixel->border_color);
8185 XBestPixel(display,colormap,colors,(
unsigned int) number_colors,
8186 &pixel->matte_color);
8187 XBestPixel(display,colormap,colors,(
unsigned int) number_colors,
8188 &pixel->highlight_color);
8189 XBestPixel(display,colormap,colors,(
unsigned int) number_colors,
8190 &pixel->shadow_color);
8191 XBestPixel(display,colormap,colors,(
unsigned int) number_colors,
8192 &pixel->depth_color);
8193 XBestPixel(display,colormap,colors,(
unsigned int) number_colors,
8194 &pixel->trough_color);
8195 for (i=0; i < MaxNumberPens; i++)
8197 XBestPixel(display,colormap,colors,(
unsigned int) number_colors,
8198 &pixel->pen_colors[i]);
8199 pixel->pixels[image->colors+i]=pixel->pen_colors[i].pixel;
8201 pixel->colors=(ssize_t) (image->colors+MaxNumberPens);
8203 colors=(XColor *) RelinquishMagickMemory(colors);
8204 if ((GetLogEventMask() & X11Event) != 0)
8206 (void) LogMagickEvent(X11Event,GetMagickModule(),
"Standard Colormap:");
8207 (void) LogMagickEvent(X11Event,GetMagickModule(),
" colormap id: 0x%lx",
8208 map_info->colormap);
8209 (void) LogMagickEvent(X11Event,GetMagickModule(),
8210 " red, green, blue max: %lu %lu %lu",map_info->red_max,
8211 map_info->green_max,map_info->blue_max);
8212 (void) LogMagickEvent(X11Event,GetMagickModule(),
8213 " red, green, blue mult: %lu %lu %lu",map_info->red_mult,
8214 map_info->green_mult,map_info->blue_mult);
8255 MagickExport
void XMakeWindow(Display *display,Window parent,
char **argv,
8256 int argc,XClassHint *class_hint,XWMHints *manager_hints,
8257 XWindowInfo *window_info)
8259 #define MinWindowSize 64
8267 static XTextProperty
8280 assert(display != (Display *) NULL);
8281 assert(window_info != (XWindowInfo *) NULL);
8282 if (IsEventLogging() != MagickFalse)
8283 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
8284 size_hints=XAllocSizeHints();
8285 if (size_hints == (XSizeHints *) NULL)
8286 ThrowXWindowFatalException(XServerFatalError,
"UnableToMakeXWindow",argv[0]);
8287 size_hints->flags=(int) window_info->flags;
8288 size_hints->x=window_info->x;
8289 size_hints->y=window_info->y;
8290 size_hints->width=(
int) window_info->width;
8291 size_hints->height=(int) window_info->height;
8292 if (window_info->immutable != MagickFalse)
8297 size_hints->min_width=size_hints->width;
8298 size_hints->min_height=size_hints->height;
8299 size_hints->max_width=size_hints->width;
8300 size_hints->max_height=size_hints->height;
8301 size_hints->flags|=PMinSize;
8302 size_hints->flags|=PMaxSize;
8309 size_hints->min_width=(int) window_info->min_width;
8310 size_hints->min_height=(
int) window_info->min_height;
8311 size_hints->flags|=PResizeInc;
8312 size_hints->width_inc=(int) window_info->width_inc;
8313 size_hints->height_inc=(
int) window_info->height_inc;
8314 #if !defined(PRE_R4_ICCCM)
8315 size_hints->flags|=PBaseSize;
8316 size_hints->base_width=size_hints->width_inc;
8317 size_hints->base_height=size_hints->height_inc;
8320 gravity=NorthWestGravity;
8321 if (window_info->geometry != (
char *) NULL)
8324 default_geometry[MaxTextExtent],
8325 geometry[MaxTextExtent];
8336 (void) FormatLocaleString(default_geometry,MaxTextExtent,
"%dx%d",
8337 size_hints->width,size_hints->height);
8338 (void) CopyMagickString(geometry,window_info->geometry,MaxTextExtent);
8340 while (strlen(p) != 0)
8342 if ((isspace((
int) ((
unsigned char) *p)) == 0) && (*p !=
'%'))
8345 (
void) memmove(p,p+1,MaxTextExtent-(p-geometry));
8347 flags=XWMGeometry(display,window_info->screen,geometry,default_geometry,
8348 window_info->border_width,size_hints,&size_hints->x,&size_hints->y,
8349 &size_hints->width,&size_hints->height,&gravity);
8350 if ((flags & WidthValue) && (flags & HeightValue))
8351 size_hints->flags|=USSize;
8352 if ((flags & XValue) && (flags & YValue))
8354 size_hints->flags|=USPosition;
8355 window_info->x=size_hints->x;
8356 window_info->y=size_hints->y;
8359 #if !defined(PRE_R4_ICCCM)
8360 size_hints->win_gravity=gravity;
8361 size_hints->flags|=PWinGravity;
8363 if (window_info->id == (Window) NULL)
8364 window_info->id=XCreateWindow(display,parent,window_info->x,window_info->y,
8365 (
unsigned int) size_hints->width,(
unsigned int) size_hints->height,
8366 window_info->border_width,(
int) window_info->depth,InputOutput,
8367 window_info->visual,(
unsigned long) window_info->mask,
8368 &window_info->attributes);
8383 (void) XChangeWindowAttributes(display,window_info->id,(
unsigned long)
8384 window_info->mask,&window_info->attributes);
8385 mask=ConfigureNotify;
8386 while (XCheckTypedWindowEvent(display,window_info->id,(
int) mask,&sans_event)) ;
8387 window_changes.x=window_info->x;
8388 window_changes.y=window_info->y;
8389 window_changes.width=(int) window_info->width;
8390 window_changes.height=(
int) window_info->height;
8391 mask=(MagickStatusType) (CWWidth | CWHeight);
8392 if (window_info->flags & USPosition)
8394 (void) XReconfigureWMWindow(display,window_info->id,window_info->screen,
8395 mask,&window_changes);
8397 if (window_info->id == (Window) NULL)
8398 ThrowXWindowFatalException(XServerFatalError,
"UnableToCreateWindow",
8400 status=XStringListToTextProperty(&window_info->name,1,&window_name);
8401 if (status == False)
8402 ThrowXWindowFatalException(XServerFatalError,
"UnableToCreateTextProperty",
8404 status=XStringListToTextProperty(&window_info->icon_name,1,&icon_name);
8405 if (status == False)
8406 ThrowXWindowFatalException(XServerFatalError,
"UnableToCreateTextProperty",
8407 window_info->icon_name);
8408 if (window_info->icon_geometry != (
char *) NULL)
8418 size_hints->flags|=USPosition;
8419 flags=XWMGeometry(display,window_info->screen,window_info->icon_geometry,
8420 (
char *) NULL,0,size_hints,&manager_hints->icon_x,
8421 &manager_hints->icon_y,&width,&height,&gravity);
8422 if ((flags & XValue) && (flags & YValue))
8423 manager_hints->flags|=IconPositionHint;
8425 XSetWMProperties(display,window_info->id,&window_name,&icon_name,argv,argc,
8426 size_hints,manager_hints,class_hint);
8427 if (window_name.value != (
void *) NULL)
8429 (void) XFree((
void *) window_name.value);
8430 window_name.value=(
unsigned char *) NULL;
8431 window_name.nitems=0;
8433 if (icon_name.value != (
void *) NULL)
8435 (void) XFree((
void *) icon_name.value);
8436 icon_name.value=(
unsigned char *) NULL;
8439 atom_list[0]=XInternAtom(display,
"WM_DELETE_WINDOW",MagickFalse);
8440 atom_list[1]=XInternAtom(display,
"WM_TAKE_FOCUS",MagickFalse);
8441 (void) XSetWMProtocols(display,window_info->id,atom_list,2);
8442 (void) XFree((
void *) size_hints);
8443 if (window_info->shape != MagickFalse)
8445 #if defined(MAGICKCORE_HAVE_SHAPE)
8455 if (XShapeQueryExtension(display,&error_base,&event_base) == 0)
8456 window_info->shape=MagickFalse;
8458 window_info->shape=MagickFalse;
8461 window_info->shape=MagickFalse;
8462 if (window_info->shared_memory != MagickFalse)
8464 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
8468 if (XShmQueryExtension(display) == 0)
8469 window_info->shared_memory=MagickFalse;
8471 window_info->shared_memory=MagickFalse;
8474 window_info->image=NewImageList();
8475 window_info->destroy=MagickFalse;
8511 static const char *GetLocaleMonitorMessage(
const char *text)
8514 message[MaxTextExtent],
8523 (void) CopyMagickString(tag,text,MaxTextExtent);
8525 if (p != (
char *) NULL)
8527 (void) FormatLocaleString(message,MaxTextExtent,
"Monitor/%s",tag);
8528 locale_message=GetLocaleMessage(message);
8529 if (locale_message == message)
8531 return(locale_message);
8534 MagickExport MagickBooleanType XMagickProgressMonitor(
const char *tag,
8535 const MagickOffsetType quantum,
const MagickSizeType span,
8536 void *magick_unused(client_data))
8541 magick_unreferenced(client_data);
8543 windows=XSetWindows((XWindows *) ~0);
8544 if (windows == (XWindows *) NULL)
8546 if (windows->info.mapped != MagickFalse)
8547 XProgressMonitorWidget(windows->display,windows,
8548 GetLocaleMonitorMessage(tag),quantum,span);
8578 MagickExport MagickBooleanType XQueryColorDatabase(
const char *target,
8585 *display = (Display *) NULL;
8596 assert(color != (XColor *) NULL);
8600 color->flags=(char) (DoRed | DoGreen | DoBlue);
8601 if ((target == (
char *) NULL) || (*target ==
'\0'))
8602 target=
"#ffffffffffff";
8606 if (display == (Display *) NULL)
8607 display=XOpenDisplay((
char *) NULL);
8608 if (display == (Display *) NULL)
8609 ThrowXWindowFatalException(XServerError,
"ColorIsNotKnownToServer",target);
8610 colormap=XDefaultColormap(display,XDefaultScreen(display));
8611 status=XParseColor(display,colormap,(
char *) target,&xcolor);
8612 if (status == False)
8613 ThrowXWindowException(XServerError,
"ColorIsNotKnownToServer",target)
8616 color->red=xcolor.red;
8617 color->green=xcolor.green;
8618 color->blue=xcolor.blue;
8619 color->flags=xcolor.flags;
8621 return(status != False ? MagickTrue : MagickFalse);
8655 MagickExport
void XQueryPosition(Display *display,
const Window window,
int *x,
int *y)
8667 assert(display != (Display *) NULL);
8668 assert(window != (Window) NULL);
8669 assert(x != (
int *) NULL);
8670 assert(y != (
int *) NULL);
8671 if (IsEventLogging() != MagickFalse)
8672 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
8673 (void) XQueryPointer(display,window,&root_window,&root_window,&x_root,&y_root,
8706 MagickExport
void XRefreshWindow(Display *display,
const XWindowInfo *window,
8707 const XEvent *event)
8717 assert(display != (Display *) NULL);
8718 assert(window != (XWindowInfo *) NULL);
8719 if (IsEventLogging() != MagickFalse)
8720 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
8721 if (window->ximage == (XImage *) NULL)
8723 if (event != (XEvent *) NULL)
8730 width=(
unsigned int) event->xexpose.width;
8731 height=(
unsigned int)
event->xexpose.height;
8743 width=window->width;
8744 height=window->height;
8745 while (XCheckTypedWindowEvent(display,window->id,Expose,&sans_event)) ;
8746 if (window->matte_pixmap != (Pixmap) NULL)
8748 #if defined(MAGICKCORE_HAVE_SHAPE)
8749 if (window->shape != MagickFalse)
8750 XShapeCombineMask(display,window->id,ShapeBounding,0,0,
8751 window->matte_pixmap,ShapeSet);
8758 if ((window->ximage->width-(x+window->x)) < (
int) width)
8759 width=(
unsigned int) (window->ximage->width-(x+window->x));
8760 if ((window->ximage->height-(y+window->y)) < (int) height)
8761 height=(
unsigned int) (window->ximage->height-(y+window->y));
8765 if (window->matte_pixmap != (Pixmap) NULL)
8766 (
void) XSetClipMask(display,window->annotate_context,window->matte_pixmap);
8767 if (window->pixmap != (Pixmap) NULL)
8769 if (window->depth > 1)
8770 (void) XCopyArea(display,window->pixmap,window->id,
8771 window->annotate_context,x+window->x,y+window->y,width,height,x,y);
8773 (
void) XCopyPlane(display,window->pixmap,window->id,
8774 window->highlight_context,x+window->x,y+window->y,width,height,x,y,
8779 #if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
8780 if (window->shared_memory)
8781 (void) XShmPutImage(display,window->id,window->annotate_context,
8782 window->ximage,x+window->x,y+window->y,x,y,width,height,MagickTrue);
8784 if (window->shared_memory == MagickFalse)
8785 (void) XPutImage(display,window->id,window->annotate_context,
8786 window->ximage,x+window->x,y+window->y,x,y,width,height);
8788 if (window->matte_pixmap != (Pixmap) NULL)
8789 (
void) XSetClipMask(display,window->annotate_context,None);
8790 (void) XFlush(display);
8822 MagickExport MagickBooleanType XRemoteCommand(Display *display,
8823 const char *window,
const char *filename)
8832 assert(filename != (
char *) NULL);
8833 if (IsEventLogging() != MagickFalse)
8834 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",filename);
8835 if (display == (Display *) NULL)
8836 display=XOpenDisplay((
char *) NULL);
8837 if (display == (Display *) NULL)
8839 ThrowXWindowException(XServerError,
"UnableToOpenXServer",filename);
8840 return(MagickFalse);
8842 remote_atom=XInternAtom(display,
"IM_PROTOCOLS",MagickFalse);
8843 remote_window=(Window) NULL;
8844 root_window=XRootWindow(display,XDefaultScreen(display));
8845 if (window != (
char *) NULL)
8850 if (isdigit((
int) ((
unsigned char) *window)) != 0)
8851 remote_window=XWindowByID(display,root_window,(Window)
8852 strtol((
char *) window,(
char **) NULL,0));
8853 if (remote_window == (Window) NULL)
8854 remote_window=XWindowByName(display,root_window,window);
8856 if (remote_window == (Window) NULL)
8857 remote_window=XWindowByProperty(display,root_window,remote_atom);
8858 if (remote_window == (Window) NULL)
8860 ThrowXWindowException(XServerError,
"UnableToConnectToRemoteDisplay",
8862 return(MagickFalse);
8867 remote_atom=XInternAtom(display,
"IM_REMOTE_COMMAND",MagickFalse);
8868 (void) XChangeProperty(display,remote_window,remote_atom,XA_STRING,8,
8869 PropModeReplace,(
unsigned char *) filename,(int) strlen(filename));
8870 (void) XSync(display,MagickFalse);
8904 MagickPrivate MagickBooleanType XRenderImage(
Image *image,
8914 *display = (Display *) NULL;
8950 display=XOpenDisplay(draw_info->server_name);
8951 if (display == (Display *) NULL)
8953 ThrowXWindowException(XServerError,
"UnableToOpenXServer",
8954 draw_info->server_name);
8955 return(MagickFalse);
8960 (void) XSetErrorHandler(XError);
8961 image_info=AcquireImageInfo();
8962 client_name=GetClientName();
8963 resource_database=XGetResourceDatabase(display,client_name);
8964 XGetResourceInfo(image_info,resource_database,client_name,&resource_info);
8965 resource_info.close_server=MagickFalse;
8966 resource_info.colormap=PrivateColormap;
8967 resource_info.font=AcquireString(draw_info->font);
8968 resource_info.background_color=AcquireString(
"#ffffffffffff");
8969 resource_info.foreground_color=AcquireString(
"#000000000000");
8970 map_info=XAllocStandardColormap();
8971 visual_info=(XVisualInfo *) NULL;
8972 font_info=(XFontStruct *) NULL;
8973 pixel.pixels=(
unsigned long *) NULL;
8974 if (map_info == (XStandardColormap *) NULL)
8976 ThrowXWindowException(ResourceLimitError,
"MemoryAllocationFailed",
8978 return(MagickFalse);
8983 visual_info=XBestVisualInfo(display,map_info,&resource_info);
8984 if (visual_info == (XVisualInfo *) NULL)
8986 XFreeResources(display,visual_info,map_info,&pixel,font_info,
8987 &resource_info,(XWindowInfo *) NULL);
8988 ThrowXWindowException(XServerError,
"UnableToGetVisual",image->filename);
8989 return(MagickFalse);
8991 map_info->colormap=(Colormap) NULL;
8995 XGetMapInfo(visual_info,XDefaultColormap(display,visual_info->screen),
8997 XGetPixelPacket(display,visual_info,map_info,&resource_info,(
Image *) NULL,
8999 pixel.annotate_context=XDefaultGC(display,visual_info->screen);
9003 font_info=XBestFont(display,&resource_info,MagickFalse);
9004 if (font_info == (XFontStruct *) NULL)
9006 XFreeResources(display,visual_info,map_info,&pixel,font_info,
9007 &resource_info,(XWindowInfo *) NULL);
9008 ThrowXWindowException(XServerError,
"UnableToLoadFont",draw_info->font);
9009 return(MagickFalse);
9011 cache_info=(*draw_info);
9015 XGetAnnotateInfo(&annotate_info);
9016 annotate_info.stencil=ForegroundStencil;
9017 if (cache_info.font != draw_info->font)
9022 (void) XFreeFont(display,font_info);
9023 (void) CloneString(&resource_info.font,draw_info->font);
9024 font_info=XBestFont(display,&resource_info,MagickFalse);
9025 if (font_info == (XFontStruct *) NULL)
9027 ThrowXWindowException(XServerError,
"UnableToLoadFont",
9029 return(MagickFalse);
9032 if (draw_info->debug != MagickFalse)
9033 (void) LogMagickEvent(AnnotateEvent,GetMagickModule(),
9034 "Font %s; pointsize %g",draw_info->font != (
char *) NULL ?
9035 draw_info->font :
"none",draw_info->pointsize);
9036 cache_info=(*draw_info);
9037 annotate_info.font_info=font_info;
9038 annotate_info.text=(
char *) draw_info->text;
9039 annotate_info.width=(
unsigned int) XTextWidth(font_info,draw_info->text,(
int)
9040 strlen(draw_info->text));
9041 annotate_info.height=(
unsigned int) font_info->ascent+font_info->descent;
9042 metrics->pixels_per_em.x=(
double) font_info->max_bounds.width;
9043 metrics->pixels_per_em.y=(double) font_info->ascent+font_info->descent;
9044 metrics->ascent=(
double) font_info->ascent+4;
9045 metrics->descent=(double) (-font_info->descent);
9046 metrics->width=annotate_info.width/ExpandAffine(&draw_info->affine);
9047 metrics->height=font_info->ascent+font_info->descent;
9048 metrics->max_advance=(double) font_info->max_bounds.width;
9049 metrics->bounds.x1=0.0;
9050 metrics->bounds.y1=metrics->descent;
9051 metrics->bounds.x2=metrics->ascent+metrics->descent;
9052 metrics->bounds.y2=metrics->ascent+metrics->descent;
9053 metrics->underline_position=(-2.0);
9054 metrics->underline_thickness=1.0;
9055 if (draw_info->render == MagickFalse)
9057 if (draw_info->fill.opacity == TransparentOpacity)
9062 width=annotate_info.width;
9063 height=annotate_info.height;
9064 if ((draw_info->affine.rx != 0.0) || (draw_info->affine.ry != 0.0))
9066 if (((draw_info->affine.sx-draw_info->affine.sy) == 0.0) &&
9067 ((draw_info->affine.rx+draw_info->affine.ry) == 0.0))
9068 annotate_info.degrees=(180.0/MagickPI)*
9069 atan2(draw_info->affine.rx,draw_info->affine.sx);
9071 (void) FormatLocaleString(annotate_info.geometry,MaxTextExtent,
9072 "%.20gx%.20g%+.20g%+.20g",(
double) width,(double) height,
9073 ceil(offset->x-0.5),ceil(offset->y-metrics->ascent-metrics->descent+
9074 draw_info->interline_spacing-0.5));
9075 pixel.pen_color.red=ScaleQuantumToShort(draw_info->fill.red);
9076 pixel.pen_color.green=ScaleQuantumToShort(draw_info->fill.green);
9077 pixel.pen_color.blue=ScaleQuantumToShort(draw_info->fill.blue);
9078 status=XAnnotateImage(display,&pixel,&annotate_info,image);
9081 ThrowXWindowException(ResourceLimitError,
"MemoryAllocationFailed",
9083 return(MagickFalse);
9114 MagickExport
void XRetainWindowColors(Display *display,
const Window window)
9125 assert(display != (Display *) NULL);
9126 assert(window != (Window) NULL);
9127 if (IsEventLogging() != MagickFalse)
9128 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
9129 property=XInternAtom(display,
"_XSETROOT_ID",MagickFalse);
9130 if (property == (Atom) NULL)
9131 ThrowXWindowFatalException(XServerError,
"UnableToCreateProperty",
9133 pixmap=XCreatePixmap(display,window,1,1,1);
9134 if (pixmap == (Pixmap) NULL)
9135 ThrowXWindowFatalException(XServerError,
"UnableToCreateBitmap",
"");
9136 (void) XChangeProperty(display,window,property,XA_PIXMAP,32,PropModeReplace,
9137 (
unsigned char *) &pixmap,1);
9138 (void) XSetCloseDownMode(display,RetainPermanent);
9171 static Window XSelectWindow(Display *display,
RectangleInfo *crop_info)
9173 #define MinimumCropArea (unsigned int) 9
9202 assert(display != (Display *) NULL);
9204 if (IsEventLogging() != MagickFalse)
9205 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
9206 root_window=XRootWindow(display,XDefaultScreen(display));
9207 context_values.background=XBlackPixel(display,XDefaultScreen(display));
9208 context_values.foreground=XWhitePixel(display,XDefaultScreen(display));
9209 context_values.function=GXinvert;
9210 context_values.plane_mask=
9211 context_values.background ^ context_values.foreground;
9212 context_values.subwindow_mode=IncludeInferiors;
9213 annotate_context=XCreateGC(display,root_window,(
size_t) (GCBackground |
9214 GCForeground | GCFunction | GCSubwindowMode),&context_values);
9215 if (annotate_context == (GC) NULL)
9216 return(MagickFalse);
9220 target_cursor=XMakeCursor(display,root_window,XDefaultColormap(display,
9221 XDefaultScreen(display)),(
char * )
"white",(
char * )
"black");
9222 status=XGrabPointer(display,root_window,MagickFalse,(
unsigned int)
9223 (ButtonPressMask | ButtonReleaseMask | ButtonMotionMask),GrabModeSync,
9224 GrabModeAsync,root_window,target_cursor,CurrentTime);
9225 if (status != GrabSuccess)
9226 ThrowXWindowFatalException(XServerError,
"UnableToGrabMouse",
"");
9231 crop_info->height=0;
9233 target_window=(Window) NULL;
9236 (void) XGrabServer(display);
9239 if ((crop_info->width*crop_info->height) >= MinimumCropArea)
9240 (
void) XDrawRectangle(display,root_window,annotate_context,
9241 (
int) crop_info->x,(
int) crop_info->y,(
unsigned int) crop_info->width-1,
9242 (
unsigned int) crop_info->height-1);
9246 (void) XAllowEvents(display,SyncPointer,CurrentTime);
9247 (void) XWindowEvent(display,root_window,ButtonPressMask |
9248 ButtonReleaseMask | ButtonMotionMask,&event);
9249 if ((crop_info->width*crop_info->height) >= MinimumCropArea)
9250 (
void) XDrawRectangle(display,root_window,annotate_context,
9251 (
int) crop_info->x,(
int) crop_info->y,(
unsigned int) crop_info->width-1,
9252 (
unsigned int) crop_info->height-1);
9257 target_window=XGetSubwindow(display,event.xbutton.subwindow,
9258 event.xbutton.x,event.xbutton.y);
9259 if (target_window == (Window) NULL)
9260 target_window=root_window;
9261 x_offset=
event.xbutton.x_root;
9262 y_offset=
event.xbutton.y_root;
9263 crop_info->x=(ssize_t) x_offset;
9264 crop_info->y=(ssize_t) y_offset;
9266 crop_info->height=0;
9280 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
9281 crop_info->x=(ssize_t) event.xmotion.x;
9282 crop_info->y=(ssize_t)
event.xmotion.y;
9286 if ((
int) crop_info->x < x_offset)
9287 crop_info->width=(
size_t) (x_offset-crop_info->x);
9290 crop_info->width=(size_t) (crop_info->x-x_offset);
9291 crop_info->x=(ssize_t) x_offset;
9293 if ((
int) crop_info->y < y_offset)
9294 crop_info->height=(
size_t) (y_offset-crop_info->y);
9297 crop_info->height=(size_t) (crop_info->y-y_offset);
9298 crop_info->y=(ssize_t) y_offset;
9304 }
while ((target_window == (Window) NULL) || (presses > 0));
9305 (void) XUngrabServer(display);
9306 (void) XUngrabPointer(display,CurrentTime);
9307 (void) XFreeCursor(display,target_cursor);
9308 (void) XFreeGC(display,annotate_context);
9309 if ((crop_info->width*crop_info->height) < MinimumCropArea)
9312 crop_info->height=0;
9314 if ((crop_info->width != 0) && (crop_info->height != 0))
9315 target_window=root_window;
9316 return(target_window);
9348 MagickExport
void XSetCursorState(Display *display,XWindows *windows,
9349 const MagickStatusType state)
9351 assert(display != (Display *) NULL);
9352 assert(windows != (XWindows *) NULL);
9353 if (IsEventLogging() != MagickFalse)
9354 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
9357 (void) XCheckDefineCursor(display,windows->image.id,
9358 windows->image.busy_cursor);
9359 (void) XCheckDefineCursor(display,windows->pan.id,
9360 windows->pan.busy_cursor);
9361 (void) XCheckDefineCursor(display,windows->magnify.id,
9362 windows->magnify.busy_cursor);
9363 (void) XCheckDefineCursor(display,windows->command.id,
9364 windows->command.busy_cursor);
9368 (void) XCheckDefineCursor(display,windows->image.id,
9369 windows->image.cursor);
9370 (void) XCheckDefineCursor(display,windows->pan.id,windows->pan.cursor);
9371 (void) XCheckDefineCursor(display,windows->magnify.id,
9372 windows->magnify.cursor);
9373 (void) XCheckDefineCursor(display,windows->command.id,
9374 windows->command.cursor);
9375 (void) XCheckDefineCursor(display,windows->command.id,
9376 windows->widget.cursor);
9377 (void) XWithdrawWindow(display,windows->info.id,windows->info.screen);
9379 windows->info.mapped=MagickFalse;
9405 MagickExport XWindows *XSetWindows(XWindows *windows_info)
9408 *windows = (XWindows *) NULL;
9410 if (windows_info != (XWindows *) ~0)
9412 windows=(XWindows *) RelinquishMagickMemory(windows);
9413 windows=windows_info;
9440 MagickExport
void XUserPreferences(XResourceInfo *resource_info)
9442 #if defined(X11_PREFERENCES_PATH)
9444 cache[MaxTextExtent],
9445 filename[MaxTextExtent],
9446 specifier[MaxTextExtent];
9453 preferences_database;
9458 assert(resource_info != (XResourceInfo *) NULL);
9459 client_name=GetClientName();
9460 preferences_database=XrmGetStringDatabase(
"");
9461 (void) FormatLocaleString(specifier,MaxTextExtent,
"%s.backdrop",client_name);
9462 value=resource_info->backdrop ?
"True" :
"False";
9463 XrmPutStringResource(&preferences_database,specifier,(
char *) value);
9464 (void) FormatLocaleString(specifier,MaxTextExtent,
"%s.colormap",client_name);
9465 value=resource_info->colormap == SharedColormap ?
"Shared" :
"Private";
9466 XrmPutStringResource(&preferences_database,specifier,(
char *) value);
9467 (void) FormatLocaleString(specifier,MaxTextExtent,
"%s.confirmExit",
9469 value=resource_info->confirm_exit ?
"True" :
"False";
9470 XrmPutStringResource(&preferences_database,specifier,(
char *) value);
9471 (void) FormatLocaleString(specifier,MaxTextExtent,
"%s.confirmEdit",
9473 value=resource_info->confirm_edit ?
"True" :
"False";
9474 XrmPutStringResource(&preferences_database,specifier,(
char *) value);
9475 (void) FormatLocaleString(specifier,MaxTextExtent,
"%s.displayWarnings",
9477 value=resource_info->display_warnings ?
"True" :
"False";
9478 XrmPutStringResource(&preferences_database,specifier,(
char *) value);
9479 (void) FormatLocaleString(specifier,MaxTextExtent,
"%s.dither",client_name);
9480 value=resource_info->quantize_info->dither ?
"True" :
"False";
9481 XrmPutStringResource(&preferences_database,specifier,(
char *) value);
9482 (void) FormatLocaleString(specifier,MaxTextExtent,
"%s.gammaCorrect",
9484 value=resource_info->gamma_correct ?
"True" :
"False";
9485 XrmPutStringResource(&preferences_database,specifier,(
char *) value);
9486 (void) FormatLocaleString(specifier,MaxTextExtent,
"%s.undoCache",client_name);
9487 (void) FormatLocaleString(cache,MaxTextExtent,
"%.20g",(
double)
9488 resource_info->undo_cache);
9489 XrmPutStringResource(&preferences_database,specifier,cache);
9490 (void) FormatLocaleString(specifier,MaxTextExtent,
"%s.usePixmap",client_name);
9491 value=resource_info->use_pixmap ?
"True" :
"False";
9492 XrmPutStringResource(&preferences_database,specifier,(
char *) value);
9493 (void) FormatLocaleString(filename,MaxTextExtent,
"%s%src",
9494 X11_PREFERENCES_PATH,client_name);
9495 ExpandFilename(filename);
9496 XrmPutFileDatabase(preferences_database,filename);
9525 static const char *XVisualClassName(
const int visual_class)
9527 switch (visual_class)
9529 case StaticGray:
return(
"StaticGray");
9530 case GrayScale:
return(
"GrayScale");
9531 case StaticColor:
return(
"StaticColor");
9532 case PseudoColor:
return(
"PseudoColor");
9533 case TrueColor:
return(
"TrueColor");
9534 case DirectColor:
return(
"DirectColor");
9536 return(
"unknown visual class");
9567 MagickExport
void XWarning(
const ExceptionType magick_unused(warning),
9568 const char *reason,
const char *description)
9571 text[MaxTextExtent];
9576 magick_unreferenced(warning);
9578 if (reason == (
char *) NULL)
9580 (void) CopyMagickString(text,reason,MaxTextExtent);
9581 (void) ConcatenateMagickString(text,
":",MaxTextExtent);
9582 windows=XSetWindows((XWindows *) ~0);
9583 XNoticeWidget(windows->display,windows,text,(
char *) description);
9616 MagickExport Window XWindowByID(Display *display,
const Window root_window,
9636 assert(display != (Display *) NULL);
9637 assert(root_window != (Window) NULL);
9638 if (IsEventLogging() != MagickFalse)
9639 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
9641 return(XSelectWindow(display,&rectangle_info));
9642 if (root_window ==
id)
9643 return(root_window);
9644 status=XQueryTree(display,root_window,&child,&child,&children,
9646 if (status == False)
9647 return((Window) NULL);
9648 window=(Window) NULL;
9649 for (i=0; i < (int) number_children; i++)
9654 window=XWindowByID(display,children[i],
id);
9655 if (window != (Window) NULL)
9658 if (children != (Window *) NULL)
9659 (void) XFree((
void *) children);
9695 MagickExport Window XWindowByName(Display *display,
const Window root_window,
9715 assert(display != (Display *) NULL);
9716 assert(root_window != (Window) NULL);
9717 assert(name != (
char *) NULL);
9718 if (IsEventLogging() != MagickFalse)
9719 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",name);
9720 if (XGetWMName(display,root_window,&window_name) != 0)
9721 if (LocaleCompare((
char *) window_name.value,name) == 0)
9722 return(root_window);
9723 status=XQueryTree(display,root_window,&child,&child,&children,
9725 if (status == False)
9726 return((Window) NULL);
9727 window=(Window) NULL;
9728 for (i=0; i < (int) number_children; i++)
9733 window=XWindowByName(display,children[i],name);
9734 if (window != (Window) NULL)
9737 if (children != (Window *) NULL)
9738 (void) XFree((
void *) children);
9773 MagickExport Window XWindowByProperty(Display *display,
const Window window,
9774 const Atom property)
9802 assert(display != (Display *) NULL);
9803 assert(window != (Window) NULL);
9804 assert(property != (Atom) NULL);
9805 if (IsEventLogging() != MagickFalse)
9806 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
9807 status=XQueryTree(display,window,&root,&parent,&children,&number_children);
9808 if (status == False)
9809 return((Window) NULL);
9811 child=(Window) NULL;
9812 for (i=0; (i < number_children) && (child == (Window) NULL); i++)
9814 status=XGetWindowProperty(display,children[i],property,0L,0L,MagickFalse,
9815 (Atom) AnyPropertyType,&type,&format,&number_items,&after,&data);
9817 (void) XFree((
void *) data);
9818 if ((status == Success) && (type != (Atom) NULL))
9821 for (i=0; (i < number_children) && (child == (Window) NULL); i++)
9822 child=XWindowByProperty(display,children[i],property);
9823 if (children != (Window *) NULL)
9824 (
void) XFree((
void *) children);
9856 assert(image_info != (
const ImageInfo *) NULL);
9857 assert(image_info->signature == MagickCoreSignature);
9859 if (IsEventLogging() != MagickFalse)
9860 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
9861 image_info->filename);
9863 return((
Image *) NULL);
9896 MagickPrivate MagickBooleanType XRenderImage(
Image *image,
9902 (void) ThrowMagickException(&image->exception,GetMagickModule(),
9903 MissingDelegateError,
"DelegateLibrarySupportNotBuiltIn",
"`%s' (X11)",
9905 return(MagickFalse);
9927 MagickExport MagickBooleanType XComponentGenesis(
void)
9954 MagickExport
void XGetImportInfo(
XImportInfo *ximage_info)
9957 ximage_info->frame=MagickFalse;
9958 ximage_info->borders=MagickFalse;
9959 ximage_info->screen=MagickFalse;
9960 ximage_info->descend=MagickTrue;
9961 ximage_info->silent=MagickFalse;