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)
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((QuantumScale*(double) (color)),1.0* \
110 PerceptibleReciprocal((double) blue_gamma))*(double) 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((QuantumScale*(double) (color)),1.0* \
120 PerceptibleReciprocal((double) green_gamma))*(double) QuantumRange)))
121#define XRedGamma(color) ClampToQuantum(red_gamma == 1.0 ? (double) \
122 (color) : ((pow(((double) QuantumScale*(double) (color)),1.0* \
123 PerceptibleReciprocal((double) red_gamma))*(double) 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
172typedef struct _DiversityPacket
189static MagickBooleanType
190 xerror_alert = MagickFalse;
196 *XVisualClassName(
const int);
203static MagickBooleanType
204 XMakePixmap(Display *,
const XResourceInfo *,XWindowInfo *);
207 XMakeImageLSBFirst(
const XResourceInfo *,
const XWindowInfo *,
Image *,
209 XMakeImageMSBFirst(
const XResourceInfo *,
const XWindowInfo *,
Image *,
235MagickExport
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;
454MagickExport MagickBooleanType XAnnotateImage(Display *display,
455 const XPixelInfo *pixel,XAnnotateInfo *annotate_info,
Image *image)
496 assert(display != (Display *) NULL);
497 assert(pixel != (XPixelInfo *) NULL);
498 assert(annotate_info != (XAnnotateInfo *) NULL);
499 assert(image != (
Image *) NULL);
500 if (IsEventLogging() != MagickFalse)
501 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
505 root_window=XRootWindow(display,XDefaultScreen(display));
506 depth=(
unsigned int) XDefaultDepth(display,XDefaultScreen(display));
507 annotate_pixmap=XCreatePixmap(display,root_window,annotate_info->width,
508 annotate_info->height,depth);
509 if (annotate_pixmap == (Pixmap) NULL)
514 context_values.background=0;
515 context_values.foreground=(size_t) (~0);
516 context_values.font=annotate_info->font_info->fid;
517 annotate_context=XCreateGC(display,root_window,(
unsigned long)
518 (GCBackground | GCFont | GCForeground),&context_values);
519 if (annotate_context == (GC) NULL)
524 (void) XDrawImageString(display,annotate_pixmap,annotate_context,0,
525 (
int) annotate_info->font_info->ascent,annotate_info->text,
526 (
int) strlen(annotate_info->text));
527 (void) XFreeGC(display,annotate_context);
531 annotate_ximage=XGetImage(display,annotate_pixmap,0,0,annotate_info->width,
532 annotate_info->height,AllPlanes,ZPixmap);
533 if (annotate_ximage == (XImage *) NULL)
535 (void) XFreePixmap(display,annotate_pixmap);
539 annotate_image=AcquireImage((
ImageInfo *) NULL);
540 if (annotate_image == (
Image *) NULL)
542 annotate_image->columns=annotate_info->width;
543 annotate_image->rows=annotate_info->height;
547 width=(
unsigned int) image->columns;
548 height=(
unsigned int) image->rows;
551 (void) XParseGeometry(annotate_info->geometry,&x,&y,&width,&height);
552 (void) GetOneVirtualPixel(image,(ssize_t) x,(ssize_t) y,
553 &annotate_image->background_color,&image->exception);
554 if (annotate_info->stencil == ForegroundStencil)
555 annotate_image->matte=MagickTrue;
556 exception=(&image->exception);
557 annotate_view=AcquireAuthenticCacheView(annotate_image,exception);
558 for (y=0; y < (int) annotate_image->rows; y++)
566 q=GetCacheViewAuthenticPixels(annotate_view,0,(ssize_t) y,
567 annotate_image->columns,1,exception);
570 for (x=0; x < (int) annotate_image->columns; x++)
572 SetPixelOpacity(q,OpaqueOpacity);
573 if (XGetPixel(annotate_ximage,x,y) == 0)
578 SetPixelRed(q,ScaleShortToQuantum(pixel->box_color.red));
579 SetPixelGreen(q,ScaleShortToQuantum(pixel->box_color.green));
580 SetPixelBlue(q,ScaleShortToQuantum(pixel->box_color.blue));
581 if ((annotate_info->stencil == ForegroundStencil) ||
582 (annotate_info->stencil == OpaqueStencil))
583 SetPixelOpacity(q,TransparentOpacity);
590 SetPixelRed(q,ScaleShortToQuantum(pixel->pen_color.red));
591 SetPixelGreen(q,ScaleShortToQuantum(pixel->pen_color.green));
592 SetPixelBlue(q,ScaleShortToQuantum(pixel->pen_color.blue));
593 if (annotate_info->stencil == BackgroundStencil)
594 SetPixelOpacity(q,TransparentOpacity);
598 if (SyncCacheViewAuthenticPixels(annotate_view,exception) == MagickFalse)
601 annotate_view=DestroyCacheView(annotate_view);
602 XDestroyImage(annotate_ximage);
606 (void) XParseGeometry(annotate_info->geometry,&x,&y,&width,&height);
607 if ((width != (
unsigned int) annotate_image->columns) ||
608 (height != (
unsigned int) annotate_image->rows))
611 image_geometry[MaxTextExtent];
616 (void) FormatLocaleString(image_geometry,MaxTextExtent,
"%ux%u",
618 (void) TransformImage(&annotate_image,(
char *) NULL,image_geometry);
620 if (annotate_info->degrees != 0.0)
635 RotateImage(annotate_image,annotate_info->degrees,&image->exception);
636 if (rotate_image == (
Image *) NULL)
638 annotate_image=DestroyImage(annotate_image);
639 annotate_image=rotate_image;
643 normalized_degrees=annotate_info->degrees;
644 while (normalized_degrees < -45.0)
645 normalized_degrees+=360.0;
646 for (rotations=0; normalized_degrees > 45.0; rotations++)
647 normalized_degrees-=90.0;
648 switch (rotations % 4)
658 x-=(int) annotate_image->columns/2;
659 y+=(int) annotate_image->columns/2;
667 x=x-(int) annotate_image->columns;
675 x=x-(int) annotate_image->columns/2;
676 y=y-(int) (annotate_image->rows-(annotate_image->columns/2));
684 (void) XParseGeometry(annotate_info->geometry,&x,&y,&width,&height);
686 (void) CompositeImage(image,annotate_image->matte != MagickFalse ?
687 OverCompositeOp : CopyCompositeOp,annotate_image,(ssize_t) x,(ssize_t) y);
689 annotate_image=DestroyImage(annotate_image);
726static char **FontToList(
char *font)
741 if (font == (
char *) NULL)
742 return((
char **) NULL);
747 for (p=font; *p !=
'\0'; p++)
748 if ((*p ==
':') || (*p ==
';') || (*p ==
','))
750 fontlist=(
char **) AcquireQuantumMemory((
size_t) fonts+1UL,
sizeof(*fontlist));
751 if (fontlist == (
char **) NULL)
752 ThrowXWindowFatalException(ResourceLimitError,
"MemoryAllocationFailed",
755 for (i=0; i < (int) fonts; i++)
757 for (q=p; *q !=
'\0'; q++)
758 if ((*q ==
':') || (*q ==
';') || (*q ==
','))
760 fontlist[i]=(
char *) AcquireQuantumMemory((
size_t) (q-p)+1UL,
761 sizeof(*fontlist[i]));
762 if (fontlist[i] == (
char *) NULL)
763 ThrowXWindowFatalException(ResourceLimitError,
"MemoryAllocationFailed",
765 (void) CopyMagickString(fontlist[i],p,(
size_t) (q-p+1));
768 fontlist[i]=(
char *) NULL;
772MagickExport XFontStruct *XBestFont(Display *display,
773 const XResourceInfo *resource_info,
const MagickBooleanType text_font)
778 "-*-helvetica-medium-r-normal--12-*-*-*-*-*-iso8859-1",
779 "-*-arial-medium-r-normal--12-*-*-*-*-*-iso8859-1",
780 "-*-helvetica-medium-r-normal--12-*-*-*-*-*-iso8859-15",
781 "-*-arial-medium-r-normal--12-*-*-*-*-*-iso8859-15",
782 "-*-helvetica-medium-r-normal--12-*-*-*-*-*-*-*",
783 "-*-arial-medium-r-normal--12-*-*-*-*-*-*-*",
790 "-*-courier-medium-r-normal-*-12-*-*-*-*-*-iso8859-1",
791 "-*-courier-medium-r-normal-*-12-*-*-*-*-*-iso8859-15",
792 "-*-fixed-medium-r-normal-*-12-*-*-*-*-*-*-*",
806 font_info=(XFontStruct *) NULL;
807 font_name=resource_info->font;
808 if (text_font != MagickFalse)
809 font_name=resource_info->text_font;
810 if ((font_name != (
char *) NULL) && (*font_name !=
'\0'))
821 fontlist=FontToList(font_name);
822 if (fontlist != (
char **) NULL)
824 for (i=0; fontlist[i] != (
char *) NULL; i++)
826 if (font_info == (XFontStruct *) NULL)
827 font_info=XLoadQueryFont(display,fontlist[i]);
828 fontlist[i]=DestroyString(fontlist[i]);
830 fontlist=(
char **) RelinquishMagickMemory(fontlist);
832 if (font_info == (XFontStruct *) NULL)
833 ThrowXWindowException(XServerError,
"UnableToLoadFont",font_name);
839 if (text_font != MagickFalse)
841 if (XDisplayHeight(display,XDefaultScreen(display)) >= 748)
843 while (*p != (
char *) NULL)
845 if (font_info != (XFontStruct *) NULL)
847 font_info=XLoadQueryFont(display,(
char *) *p);
880MagickExport
void XBestIconSize(Display *display,XWindowInfo *window,
906 assert(display != (Display *) NULL);
907 assert(window != (XWindowInfo *) NULL);
908 assert(image != (
Image *) NULL);
909 if (IsEventLogging() != MagickFalse)
910 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
911 window->width=MaxIconSize;
912 window->height=MaxIconSize;
913 icon_size=(XIconSize *) NULL;
915 root_window=XRootWindow(display,window->screen);
916 if (XGetIconSizes(display,root_window,&size_list,&number_sizes) != 0)
917 if ((number_sizes > 0) && (size_list != (XIconSize *) NULL))
919 if (icon_size == (XIconSize *) NULL)
924 icon_size=XAllocIconSize();
925 if (icon_size == (XIconSize *) NULL)
926 ThrowXWindowFatalException(ResourceLimitError,
927 "MemoryAllocationFailed",image->filename);
928 icon_size->min_width=1;
929 icon_size->max_width=MaxIconSize;
930 icon_size->min_height=1;
931 icon_size->max_height=MaxIconSize;
932 icon_size->width_inc=1;
933 icon_size->height_inc=1;
938 width=(
unsigned int) image->columns;
939 height=(
unsigned int) image->rows;
941 if (window->crop_geometry)
942 (void) XParseGeometry(window->crop_geometry,&i,&i,&width,&height);
946 scale_factor=(MagickRealType) icon_size->max_width/width;
947 if (scale_factor > ((MagickRealType) icon_size->max_height/height))
948 scale_factor=(MagickRealType) icon_size->max_height/height;
949 icon_width=(
unsigned int) icon_size->min_width;
950 while ((
int) icon_width < icon_size->max_width)
952 if (icon_width >= (
unsigned int) (scale_factor*width+0.5))
954 icon_width+=icon_size->width_inc;
956 icon_height=(
unsigned int) icon_size->min_height;
957 while ((
int) icon_height < icon_size->max_height)
959 if (icon_height >= (
unsigned int) (scale_factor*height+0.5))
961 icon_height+=icon_size->height_inc;
963 (void) XFree((
void *) icon_size);
964 window->width=icon_width;
965 window->height=icon_height;
1006MagickExport
void XBestPixel(Display *display,
const Colormap colormap,
1007 XColor *colors,
unsigned int number_colors,XColor *color)
1031 assert(display != (Display *) NULL);
1032 assert(color != (XColor *) NULL);
1033 if (IsEventLogging() != MagickFalse)
1034 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
1035 status=XAllocColor(display,colormap,color);
1036 if (status != False)
1038 query_server=colors == (XColor *) NULL ? MagickTrue : MagickFalse;
1039 if (query_server != MagickFalse)
1044 colors=(XColor *) AcquireQuantumMemory(number_colors,
sizeof(*colors));
1045 if (colors == (XColor *) NULL)
1046 ThrowXWindowFatalException(ResourceLimitError,
1047 "MemoryAllocationFailed",
"...");
1048 for (i=0; i < (int) number_colors; i++)
1049 colors[i].pixel=(
size_t) i;
1050 if (number_colors > 256)
1052 (void) XQueryColors(display,colormap,colors,(
int) number_colors);
1054 min_distance=3.0*((MagickRealType) QuantumRange+1.0)*((MagickRealType)
1057 for (i=0; i < (int) number_colors; i++)
1059 pixel.red=colors[i].red-(MagickRealType) color->red;
1060 distance=pixel.red*pixel.red;
1061 if (distance > min_distance)
1063 pixel.green=colors[i].green-(MagickRealType) color->green;
1064 distance+=pixel.green*pixel.green;
1065 if (distance > min_distance)
1067 pixel.blue=colors[i].blue-(MagickRealType) color->blue;
1068 distance+=pixel.blue*pixel.blue;
1069 if (distance > min_distance)
1071 min_distance=distance;
1072 color->pixel=colors[i].pixel;
1075 (void) XAllocColor(display,colormap,&colors[j]);
1076 if (query_server != MagickFalse)
1077 colors=(XColor *) RelinquishMagickMemory(colors);
1125MagickExport XVisualInfo *XBestVisualInfo(Display *display,
1126 XStandardColormap *map_info,XResourceInfo *resource_info)
1128#define MaxStandardColormaps 7
1129#define XVisualColormapSize(visual_info) MagickMin((unsigned int) (\
1130 (visual_info->klass == TrueColor) || (visual_info->klass == DirectColor) ? \
1131 visual_info->red_mask | visual_info->green_mask | visual_info->blue_mask : \
1132 (unsigned long) visual_info->colormap_size),1UL << visual_info->depth)
1160 assert(display != (Display *) NULL);
1161 assert(map_info != (XStandardColormap *) NULL);
1162 assert(resource_info != (XResourceInfo *) NULL);
1163 if (IsEventLogging() != MagickFalse)
1164 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
1165 map_type=resource_info->map_type;
1166 visual_type=resource_info->visual_type;
1167 visual_mask=VisualScreenMask;
1168 visual_template.screen=XDefaultScreen(display);
1169 visual_template.depth=XDefaultDepth(display,XDefaultScreen(display));
1171 if ((resource_info->immutable != MagickFalse) && (resource_info->colors != 0))
1172 if (resource_info->colors <= (one << (
size_t) visual_template.depth))
1173 visual_mask|=VisualDepthMask;
1174 if (visual_type != (
char *) NULL)
1179 if (LocaleCompare(
"staticgray",visual_type) == 0)
1181 visual_mask|=VisualClassMask;
1182 visual_template.klass=StaticGray;
1185 if (LocaleCompare(
"grayscale",visual_type) == 0)
1187 visual_mask|=VisualClassMask;
1188 visual_template.klass=GrayScale;
1191 if (LocaleCompare(
"staticcolor",visual_type) == 0)
1193 visual_mask|=VisualClassMask;
1194 visual_template.klass=StaticColor;
1197 if (LocaleCompare(
"pseudocolor",visual_type) == 0)
1199 visual_mask|=VisualClassMask;
1200 visual_template.klass=PseudoColor;
1203 if (LocaleCompare(
"truecolor",visual_type) == 0)
1205 visual_mask|=VisualClassMask;
1206 visual_template.klass=TrueColor;
1209 if (LocaleCompare(
"directcolor",visual_type) == 0)
1211 visual_mask|=VisualClassMask;
1212 visual_template.klass=DirectColor;
1215 if (LocaleCompare(
"default",visual_type) == 0)
1217 visual_mask|=VisualIDMask;
1218 visual_template.visualid=XVisualIDFromVisual(
1219 XDefaultVisual(display,XDefaultScreen(display)));
1222 if (isdigit((
int) ((
unsigned char) *visual_type)) != 0)
1224 visual_mask|=VisualIDMask;
1225 visual_template.visualid=
1226 strtol(visual_type,(
char **) NULL,0);
1229 ThrowXWindowException(XServerError,
1230 "UnrecognizedVisualSpecifier",visual_type);
1236 visual_list=XGetVisualInfo(display,visual_mask,&visual_template,
1238 visual_mask=VisualScreenMask | VisualIDMask;
1239 if ((number_visuals == 0) || (visual_list == (XVisualInfo *) NULL))
1244 ThrowXWindowException(XServerWarning,
"UnableToGetVisual",visual_type);
1245 visual_template.visualid=XVisualIDFromVisual(XDefaultVisual(display,
1246 XDefaultScreen(display)));
1247 visual_list=XGetVisualInfo(display,visual_mask,&visual_template,
1249 if ((number_visuals == 0) || (visual_list == (XVisualInfo *) NULL))
1250 return((XVisualInfo *) NULL);
1251 ThrowXWindowException(XServerWarning,
"UsingDefaultVisual",
1252 XVisualClassName(visual_list->klass));
1254 resource_info->color_recovery=MagickFalse;
1255 if ((map_info != (XStandardColormap *) NULL) && (map_type != (
char *) NULL))
1261 map_name[MaxTextExtent];
1279 map_list=(XStandardColormap *) NULL;
1280 root_window=XRootWindow(display,XDefaultScreen(display));
1283 if (LocaleCompare(map_type,
"list") != 0)
1288 (void) FormatLocaleString((
char *) map_name,MaxTextExtent,
1289 "RGB_%s_MAP",map_type);
1290 LocaleUpper(map_name);
1291 map_property=XInternAtom(display,(
char *) map_name,MagickTrue);
1292 if (map_property != (Atom) NULL)
1293 status=XGetRGBColormaps(display,root_window,&map_list,&number_maps,
1299 *colormap[MaxStandardColormaps]=
1301 "_HP_RGB_SMOOTH_MAP_LIST",
1313 for (i=0; i < MaxStandardColormaps; i++)
1315 map_property=XInternAtom(display,(
char *) colormap[i],MagickTrue);
1316 if (map_property == (Atom) NULL)
1318 status=XGetRGBColormaps(display,root_window,&map_list,&number_maps,
1320 if (status != False)
1323 resource_info->color_recovery=i == 0 ? MagickTrue : MagickFalse;
1325 if (status == False)
1326 ThrowXWindowFatalException(XServerError,
"UnableToGetStandardColormap",
1331 *map_info=map_list[0];
1332#if !defined(PRE_R4_ICCCM)
1333 visual_template.visualid=XVisualIDFromVisual(visual_list[0].visual);
1334 for (i=0; i < number_maps; i++)
1335 for (j=0; j < number_visuals; j++)
1336 if (map_list[i].visualid ==
1337 XVisualIDFromVisual(visual_list[j].visual))
1339 *map_info=map_list[i];
1340 visual_template.visualid=XVisualIDFromVisual(
1341 visual_list[j].visual);
1344 if (map_info->visualid != visual_template.visualid)
1345 ThrowXWindowFatalException(XServerError,
1346 "UnableToMatchVisualToStandardColormap",map_type);
1348 if (map_info->colormap == (Colormap) NULL)
1349 ThrowXWindowFatalException(XServerError,
1350 "StandardColormapIsNotInitialized",map_type);
1351 (void) XFree((
void *) map_list);
1355 static const unsigned int
1372 visual_info=visual_list;
1374 for (i=1; i < number_visuals; i++)
1377 if (XVisualColormapSize(p) > XVisualColormapSize(visual_info))
1380 if (XVisualColormapSize(p) == XVisualColormapSize(visual_info))
1381 if (rank[p->klass] > rank[visual_info->klass])
1384 visual_template.visualid=XVisualIDFromVisual(visual_info->visual);
1386 (void) XFree((
void *) visual_list);
1390 visual_info=XGetVisualInfo(display,visual_mask,&visual_template,
1392 if ((number_visuals == 0) || (visual_info == (XVisualInfo *) NULL))
1393 return((XVisualInfo *) NULL);
1394 return(visual_info);
1424MagickExport
int XCheckDefineCursor(Display *display,Window window,
1427 assert(display != (Display *) NULL);
1428 if (IsEventLogging() != MagickFalse)
1429 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
1430 if (window == XRootWindow(display,XDefaultScreen(display)))
1432 return(XDefineCursor(display,window,cursor));
1461MagickExport
void XCheckRefreshWindows(Display *display,XWindows *windows)
1469 assert(display != (Display *) NULL);
1470 assert(windows != (XWindows *) NULL);
1471 if (IsEventLogging() != MagickFalse)
1472 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
1473 XDelay(display,SuspendTime);
1474 id=windows->command.id;
1475 while (XCheckTypedWindowEvent(display,
id,Expose,&event) != MagickFalse)
1476 (void) XCommandWidget(display,windows,(
char const **) NULL,&event);
1477 id=windows->image.id;
1478 while (XCheckTypedWindowEvent(display,
id,Expose,&event) != MagickFalse)
1479 XRefreshWindow(display,&windows->image,&event);
1480 XDelay(display,SuspendTime << 1);
1481 id=windows->command.id;
1482 while (XCheckTypedWindowEvent(display,
id,Expose,&event) != MagickFalse)
1483 (void) XCommandWidget(display,windows,(
char const **) NULL,&event);
1484 id=windows->image.id;
1485 while (XCheckTypedWindowEvent(display,
id,Expose,&event) != MagickFalse)
1486 XRefreshWindow(display,&windows->image,&event);
1521MagickExport
void XClientMessage(Display *display,
const Window window,
1522 const Atom protocol,
const Atom reason,
const Time timestamp)
1527 assert(display != (Display *) NULL);
1528 (void) memset(&client_event,0,
sizeof(client_event));
1529 client_event.type=ClientMessage;
1530 client_event.window=window;
1531 client_event.message_type=protocol;
1532 client_event.format=32;
1533 client_event.data.l[0]=(long) reason;
1534 client_event.data.l[1]=(long) timestamp;
1535 (void) XSendEvent(display,window,MagickFalse,NoEventMask,(XEvent *) &client_event);
1569static Window XClientWindow(Display *display,Window target_window)
1591 assert(display != (Display *) NULL);
1592 if (IsEventLogging() != MagickFalse)
1593 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
1594 state=XInternAtom(display,
"WM_STATE",MagickTrue);
1595 if (state == (Atom) NULL)
1596 return(target_window);
1598 status=XGetWindowProperty(display,target_window,state,0L,0L,MagickFalse,
1599 (Atom) AnyPropertyType,&type,&format,&number_items,&after,&data);
1600 if ((status == Success) && (type != (Atom) NULL))
1601 return(target_window);
1602 client_window=XWindowByProperty(display,target_window,state);
1603 if (client_window == (Window) NULL)
1604 return(target_window);
1605 return(client_window);
1626MagickExport
void XComponentTerminus(
void)
1628 DestroyXResources();
1661MagickExport
void XConfigureImageColormap(Display *display,
1662 XResourceInfo *resource_info,XWindows *windows,
Image *image)
1670 XSetCursorState(display,windows,MagickTrue);
1671 XCheckRefreshWindows(display,windows);
1672 XMakeStandardColormap(display,windows->visual_info,resource_info,image,
1673 windows->map_info,windows->pixel_info);
1674 colormap=windows->map_info->colormap;
1675 (void) XSetWindowColormap(display,windows->image.id,colormap);
1676 (void) XSetWindowColormap(display,windows->command.id,colormap);
1677 (void) XSetWindowColormap(display,windows->widget.id,colormap);
1678 if (windows->magnify.mapped != MagickFalse)
1679 (void) XSetWindowColormap(display,windows->magnify.id,colormap);
1680 if (windows->pan.mapped != MagickFalse)
1681 (void) XSetWindowColormap(display,windows->pan.id,colormap);
1682 XSetCursorState(display,windows,MagickFalse);
1683 XClientMessage(display,windows->image.id,windows->im_protocols,
1684 windows->im_update_colormap,CurrentTime);
1713MagickExport
void XConstrainWindowPosition(Display *display,
1714 XWindowInfo *window_info)
1719 assert(display != (Display *) NULL);
1720 assert(window_info != (XWindowInfo *) NULL);
1721 if (IsEventLogging() != MagickFalse)
1722 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
1723 limit=XDisplayWidth(display,window_info->screen)-window_info->width;
1724 if (window_info->x < 0)
1727 if (window_info->x > (
int) limit)
1728 window_info->x=(int) limit;
1729 limit=XDisplayHeight(display,window_info->screen)-window_info->height;
1730 if (window_info->y < 0)
1733 if (window_info->y > limit)
1734 window_info->y=limit;
1764MagickExport
void XDelay(Display *display,
const size_t milliseconds)
1766 assert(display != (Display *) NULL);
1767 (void) XFlush(display);
1768 MagickDelay(milliseconds);
1794MagickExport
void XDestroyResourceInfo(XResourceInfo *resource_info)
1796 if (resource_info->image_geometry != (
char *) NULL)
1797 resource_info->image_geometry=(
char *)
1798 RelinquishMagickMemory(resource_info->image_geometry);
1799 if (resource_info->quantize_info != (
QuantizeInfo *) NULL)
1800 resource_info->quantize_info=DestroyQuantizeInfo(
1801 resource_info->quantize_info);
1802 if (resource_info->client_name != (
char *) NULL)
1803 resource_info->client_name=(
char *)
1804 RelinquishMagickMemory(resource_info->client_name);
1805 if (resource_info->name != (
char *) NULL)
1806 resource_info->name=DestroyString(resource_info->name);
1807 (void) memset(resource_info,0,
sizeof(*resource_info));
1808 (void) XSetWindows((XWindows *) NULL);
1837MagickExport
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);
1912MagickExport
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);
2073static 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));
2195 q+=(ptrdiff_t) scanline_pad;
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]);
2242MagickExport 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)
2621MagickExport
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)
2698MagickExport
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);
2793MagickExport
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;
2847MagickExport
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(
"");
2898MagickExport
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;
2974MagickExport
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;
3226MagickExport
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);
3315MagickExport 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);
3413MagickExport
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 :
3618MagickExport
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);
3671MagickExport
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));
3727static 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);
3793MagickExport 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);
3920static 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);
4523MagickExport
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;
4674MagickExport
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);
4725MagickExport
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);
4770MagickExport
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)
5005 (void) CopyMagickString(image->filename,image_info->filename,
5007 if ((crop_info.width != 0) && (crop_info.height != 0))
5015 crop_image=CropImage(image,&crop_info,&image->exception);
5016 if (crop_image != (
Image *) NULL)
5018 image=DestroyImage(image);
5022 status=XGetWMName(display,target,&window_name);
5025 if (*image_info->filename ==
'\0')
5026 (void) CopyMagickString(image->filename,(
char *) window_name.value,
5027 (
size_t) window_name.nitems+1);
5028 (void) XFree((
void *) window_name.value);
5031 if (ximage_info->silent == MagickFalse)
5036 (void) XBell(display,0);
5037 (void) XBell(display,0);
5039 (void) XCloseDisplay(display);
5071MagickExport XWindows *XInitializeWindows(Display *display,
5072 XResourceInfo *resource_info)
5083 windows=(XWindows *) AcquireMagickMemory(
sizeof(*windows));
5084 if (windows == (XWindows *) NULL)
5085 ThrowXWindowFatalException(XServerFatalError,
"MemoryAllocationFailed",
5087 (void) memset(windows,0,
sizeof(*windows));
5088 windows->pixel_info=(XPixelInfo *) AcquireQuantumMemory(1,
5089 sizeof(*windows->pixel_info));
5090 windows->icon_pixel=(XPixelInfo *) AcquireQuantumMemory(1,
5091 sizeof(*windows->icon_pixel));
5092 windows->icon_resources=(XResourceInfo *) AcquireQuantumMemory(1,
5093 sizeof(*windows->icon_resources));
5094 if ((windows->pixel_info == (XPixelInfo *) NULL) ||
5095 (windows->icon_pixel == (XPixelInfo *) NULL) ||
5096 (windows->icon_resources == (XResourceInfo *) NULL))
5097 ThrowXWindowFatalException(XServerFatalError,
"MemoryAllocationFailed",
5099 (void) memset((
void *) windows->pixel_info,0,
sizeof(XPixelInfo));
5100 (void) memset((
void *) windows->icon_pixel,0,
sizeof(XPixelInfo));
5104 windows->display=display;
5105 windows->wm_protocols=XInternAtom(display,
"WM_PROTOCOLS",MagickFalse);
5106 windows->wm_delete_window=XInternAtom(display,
"WM_DELETE_WINDOW",MagickFalse);
5107 windows->wm_take_focus=XInternAtom(display,
"WM_TAKE_FOCUS",MagickFalse);
5108 windows->im_protocols=XInternAtom(display,
"IM_PROTOCOLS",MagickFalse);
5109 windows->im_remote_command=
5110 XInternAtom(display,
"IM_REMOTE_COMMAND",MagickFalse);
5111 windows->im_update_widget=XInternAtom(display,
"IM_UPDATE_WIDGET",MagickFalse);
5112 windows->im_update_colormap=
5113 XInternAtom(display,
"IM_UPDATE_COLORMAP",MagickFalse);
5114 windows->im_former_image=XInternAtom(display,
"IM_FORMER_IMAGE",MagickFalse);
5115 windows->im_next_image=XInternAtom(display,
"IM_NEXT_IMAGE",MagickFalse);
5116 windows->im_retain_colors=XInternAtom(display,
"IM_RETAIN_COLORS",MagickFalse);
5117 windows->im_exit=XInternAtom(display,
"IM_EXIT",MagickFalse);
5118 windows->dnd_protocols=XInternAtom(display,
"DndProtocol",MagickFalse);
5119#if defined(MAGICKCORE_WINDOWS_SUPPORT)
5120 (void) XSynchronize(display,MagickFalse);
5122 if ((GetLogEventMask() & X11Event) != 0)
5124 (void) XSynchronize(display,MagickTrue);
5125 (void) LogMagickEvent(X11Event,GetMagickModule(),
"Version: %s",
5126 GetMagickVersion((
size_t *) NULL));
5127 (void) LogMagickEvent(X11Event,GetMagickModule(),
"Protocols:");
5128 (void) LogMagickEvent(X11Event,GetMagickModule(),
5129 " Window Manager: 0x%lx",windows->wm_protocols);
5130 (void) LogMagickEvent(X11Event,GetMagickModule(),
5131 " delete window: 0x%lx",windows->wm_delete_window);
5132 (void) LogMagickEvent(X11Event,GetMagickModule(),
" take focus: 0x%lx",
5133 windows->wm_take_focus);
5134 (void) LogMagickEvent(X11Event,GetMagickModule(),
" ImageMagick: 0x%lx",
5135 windows->im_protocols);
5136 (void) LogMagickEvent(X11Event,GetMagickModule(),
5137 " remote command: 0x%lx",windows->im_remote_command);
5138 (void) LogMagickEvent(X11Event,GetMagickModule(),
5139 " update widget: 0x%lx",windows->im_update_widget);
5140 (void) LogMagickEvent(X11Event,GetMagickModule(),
5141 " update colormap: 0x%lx",windows->im_update_colormap);
5142 (void) LogMagickEvent(X11Event,GetMagickModule(),
5143 " former image: 0x%lx",windows->im_former_image);
5144 (void) LogMagickEvent(X11Event,GetMagickModule(),
" next image: 0x%lx",
5145 windows->im_next_image);
5146 (void) LogMagickEvent(X11Event,GetMagickModule(),
5147 " retain colors: 0x%lx",windows->im_retain_colors);
5148 (void) LogMagickEvent(X11Event,GetMagickModule(),
" exit: 0x%lx",
5150 (void) LogMagickEvent(X11Event,GetMagickModule(),
" Drag and Drop: 0x%lx",
5151 windows->dnd_protocols);
5156 windows->map_info=XAllocStandardColormap();
5157 windows->icon_map=XAllocStandardColormap();
5158 if ((windows->map_info == (XStandardColormap *) NULL) ||
5159 (windows->icon_map == (XStandardColormap *) NULL))
5160 ThrowXWindowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed",
5162 windows->map_info->colormap=(Colormap) NULL;
5163 windows->icon_map->colormap=(Colormap) NULL;
5164 windows->pixel_info->pixels=(
unsigned long *) NULL;
5165 windows->pixel_info->annotate_context=(GC) NULL;
5166 windows->pixel_info->highlight_context=(GC) NULL;
5167 windows->pixel_info->widget_context=(GC) NULL;
5168 windows->font_info=(XFontStruct *) NULL;
5169 windows->icon_pixel->annotate_context=(GC) NULL;
5170 windows->icon_pixel->pixels=(
unsigned long *) NULL;
5174 *windows->icon_resources=(*resource_info);
5175 windows->icon_resources->visual_type=(
char *)
"default";
5176 windows->icon_resources->colormap=SharedColormap;
5177 windows->visual_info=
5178 XBestVisualInfo(display,windows->map_info,resource_info);
5179 windows->icon_visual=
5180 XBestVisualInfo(display,windows->icon_map,windows->icon_resources);
5181 if ((windows->visual_info == (XVisualInfo *) NULL) ||
5182 (windows->icon_visual == (XVisualInfo *) NULL))
5183 ThrowXWindowFatalException(XServerFatalError,
"UnableToGetVisual",
5184 resource_info->visual_type);
5185 if ((GetLogEventMask() & X11Event) != 0)
5187 (void) LogMagickEvent(X11Event,GetMagickModule(),
"Visual:");
5188 (void) LogMagickEvent(X11Event,GetMagickModule(),
" visual id: 0x%lx",
5189 windows->visual_info->visualid);
5190 (void) LogMagickEvent(X11Event,GetMagickModule(),
" class: %s",
5191 XVisualClassName(windows->visual_info->klass));
5192 (void) LogMagickEvent(X11Event,GetMagickModule(),
" depth: %d planes",
5193 windows->visual_info->depth);
5194 (void) LogMagickEvent(X11Event,GetMagickModule(),
5195 " size of colormap: %d entries",windows->visual_info->colormap_size);
5196 (void) LogMagickEvent(X11Event,GetMagickModule(),
5197 " red, green, blue masks: 0x%lx 0x%lx 0x%lx",
5198 windows->visual_info->red_mask,windows->visual_info->green_mask,
5199 windows->visual_info->blue_mask);
5200 (void) LogMagickEvent(X11Event,GetMagickModule(),
5201 " significant bits in color: %d bits",
5202 windows->visual_info->bits_per_rgb);
5207 windows->class_hints=XAllocClassHint();
5208 windows->manager_hints=XAllocWMHints();
5209 if ((windows->class_hints == (XClassHint *) NULL) ||
5210 (windows->manager_hints == (XWMHints *) NULL))
5211 ThrowXWindowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed",
5216 root_window=XRootWindow(display,windows->visual_info->screen);
5217 windows->group_leader.id=(Window) NULL;
5218 if (resource_info->window_group != (
char *) NULL)
5220 if (isdigit((
int) ((
unsigned char) *resource_info->window_group)) != 0)
5221 windows->group_leader.id=XWindowByID(display,root_window,(Window)
5222 strtol((
char *) resource_info->window_group,(
char **) NULL,0));
5223 if (windows->group_leader.id == (Window) NULL)
5224 windows->group_leader.id=
5225 XWindowByName(display,root_window,resource_info->window_group);
5264MagickExport Cursor XMakeCursor(Display *display,Window window,
5265 Colormap colormap,
char *background_color,
char *foreground_color)
5267#define scope_height 17
5268#define scope_x_hot 8
5269#define scope_y_hot 8
5270#define scope_width 17
5272 static const unsigned char
5275 0x80, 0x03, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02,
5276 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x7f,
5277 0xfc, 0x01, 0x01, 0x00, 0x01, 0x7f, 0xfc, 0x01, 0x80, 0x02, 0x00,
5278 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02,
5279 0x00, 0x80, 0x02, 0x00, 0x80, 0x03, 0x00
5283 0xc0, 0x07, 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x06, 0x00, 0xc0, 0x06,
5284 0x00, 0xc0, 0x06, 0x00, 0xc0, 0x06, 0x00, 0xff, 0xfe, 0x01, 0x7f,
5285 0xfc, 0x01, 0x03, 0x80, 0x01, 0x7f, 0xfc, 0x01, 0xff, 0xfe, 0x01,
5286 0xc0, 0x06, 0x00, 0xc0, 0x06, 0x00, 0xc0, 0x06, 0x00, 0xc0, 0x06,
5287 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x07, 0x00
5301 assert(display != (Display *) NULL);
5302 assert(window != (Window) NULL);
5303 assert(colormap != (Colormap) NULL);
5304 assert(background_color != (
char *) NULL);
5305 assert(foreground_color != (
char *) NULL);
5306 if (IsEventLogging() != MagickFalse)
5307 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",background_color);
5308 source=XCreateBitmapFromData(display,window,(
char *) scope_bits,scope_width,
5310 mask=XCreateBitmapFromData(display,window,(
char *) scope_mask_bits,
5311 scope_width,scope_height);
5312 if ((source == (Pixmap) NULL) || (mask == (Pixmap) NULL))
5313 ThrowXWindowFatalException(XServerError,
"UnableToCreatePixmap",
"...");
5314 (void) XParseColor(display,colormap,background_color,&background);
5315 (void) XParseColor(display,colormap,foreground_color,&foreground);
5316 cursor=XCreatePixmapCursor(display,source,mask,&foreground,&background,
5317 scope_x_hot,scope_y_hot);
5318 (void) XFreePixmap(display,source);
5319 (void) XFreePixmap(display,mask);
5361MagickExport MagickBooleanType XMakeImage(Display *display,
5362 const XResourceInfo *resource_info,XWindowInfo *window,
Image *image,
5363 unsigned int width,
unsigned int height)
5365#define CheckOverflowException(length,width,height) \
5366 (((height) != 0) && ((length)/((size_t) height) != ((size_t) width)))
5376 assert(display != (Display *) NULL);
5377 assert(resource_info != (XResourceInfo *) NULL);
5378 assert(window != (XWindowInfo *) NULL);
5380 assert(height != 0);
5381 if (IsEventLogging() != MagickFalse)
5382 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
5383 if ((window->width == 0) || (window->height == 0))
5384 return(MagickFalse);
5388 (void) XCheckDefineCursor(display,window->id,window->busy_cursor);
5389 (void) XFlush(display);
5390 depth=(int) window->depth;
5391 if (window->destroy)
5392 window->image=DestroyImage(window->image);
5393 window->image=image;
5394 window->destroy=MagickFalse;
5395 if (window->image != (
Image *) NULL)
5397 if (window->crop_geometry != (
char *) NULL)
5408 window->image->page.x=0;
5409 window->image->page.y=0;
5410 (void) ParsePageGeometry(window->image,window->crop_geometry,
5411 &crop_info,&image->exception);
5412 crop_image=CropImage(window->image,&crop_info,&image->exception);
5413 if (crop_image != (
Image *) NULL)
5415 if (window->image != image)
5416 window->image=DestroyImage(window->image);
5417 window->image=crop_image;
5418 window->destroy=MagickTrue;
5421 if ((width != (
unsigned int) window->image->columns) ||
5422 (height != (
unsigned int) window->image->rows))
5430 resize_image=NewImageList();
5431 if ((window->pixel_info->colors == 0) &&
5432 (window->image->rows > (
unsigned long) XDisplayHeight(display,window->screen)) &&
5433 (window->image->columns > (
unsigned long) XDisplayWidth(display,window->screen)))
5434 resize_image=ResizeImage(window->image,width,height,
5435 image->filter,image->blur,&image->exception);
5438 if (window->image->storage_class == PseudoClass)
5439 resize_image=SampleImage(window->image,width,height,
5442 resize_image=ThumbnailImage(window->image,width,height,
5445 if (resize_image != (
Image *) NULL)
5447 if (window->image != image)
5448 window->image=DestroyImage(window->image);
5449 window->image=resize_image;
5450 window->destroy=MagickTrue;
5453 width=(
unsigned int) window->image->columns;
5454 assert((
size_t) width == window->image->columns);
5455 height=(
unsigned int) window->image->rows;
5456 assert((
size_t) height == window->image->rows);
5461 ximage=(XImage *) NULL;
5462 format=(depth == 1) ? XYBitmap : ZPixmap;
5463#if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
5464 if (window->shared_memory != MagickFalse)
5472 segment_info=(XShmSegmentInfo *) window->segment_info;
5473 segment_info[1].shmid=(-1);
5474 segment_info[1].shmaddr=(
char *) NULL;
5475 ximage=XShmCreateImage(display,window->visual,(
unsigned int) depth,format,
5476 (
char *) NULL,&segment_info[1],width,height);
5478 if (ximage == (XImage *) NULL)
5479 window->shared_memory=MagickFalse;
5482 length=(size_t) ximage->bytes_per_line*ximage->height;
5483 if (CheckOverflowException(length,ximage->bytes_per_line,ximage->height))
5484 window->shared_memory=MagickFalse;
5486 if (window->shared_memory != MagickFalse)
5487 segment_info[1].shmid=shmget(IPC_PRIVATE,length,IPC_CREAT | 0777);
5488 if (window->shared_memory != MagickFalse)
5489 segment_info[1].shmaddr=(
char *) shmat(segment_info[1].shmid,0,0);
5490 if (segment_info[1].shmid < 0)
5491 window->shared_memory=MagickFalse;
5492 if (window->shared_memory != MagickFalse)
5493 (void) shmctl(segment_info[1].shmid,IPC_RMID,0);
5496 if (ximage != (XImage *) NULL)
5497 XDestroyImage(ximage);
5498 ximage=(XImage *) NULL;
5499 if (segment_info[1].shmaddr)
5501 (void) shmdt(segment_info[1].shmaddr);
5502 segment_info[1].shmaddr=(
char *) NULL;
5504 if (segment_info[1].shmid >= 0)
5506 (void) shmctl(segment_info[1].shmid,IPC_RMID,0);
5507 segment_info[1].shmid=(-1);
5515#if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
5516 if (window->shared_memory)
5524 (void) XSync(display,MagickFalse);
5525 xerror_alert=MagickFalse;
5526 segment_info=(XShmSegmentInfo *) window->segment_info;
5527 ximage->data=segment_info[1].shmaddr;
5528 segment_info[1].readOnly=MagickFalse;
5529 status=XShmAttach(display,&segment_info[1]);
5530 if (status != False)
5531 (void) XSync(display,MagickFalse);
5532 if ((status == False) || (xerror_alert != MagickFalse))
5534 window->shared_memory=MagickFalse;
5535 if (status != False)
5536 XShmDetach(display,&segment_info[1]);
5538 XDestroyImage(ximage);
5539 ximage=(XImage *) NULL;
5540 if (segment_info[1].shmid >= 0)
5542 if (segment_info[1].shmaddr != NULL)
5543 (void) shmdt(segment_info[1].shmaddr);
5544 (void) shmctl(segment_info[1].shmid,IPC_RMID,0);
5545 segment_info[1].shmid=(-1);
5546 segment_info[1].shmaddr=(
char *) NULL;
5551 if (window->shared_memory == MagickFalse)
5552 ximage=XCreateImage(display,window->visual,(
unsigned int) depth,format,0,
5553 (
char *) NULL,width,height,XBitmapPad(display),0);
5554 if (ximage == (XImage *) NULL)
5559 (void) XCheckDefineCursor(display,window->id,window->cursor);
5560 return(MagickFalse);
5562 if ((GetLogEventMask() & X11Event) != 0)
5564 (void) LogMagickEvent(X11Event,GetMagickModule(),
"XImage:");
5565 (void) LogMagickEvent(X11Event,GetMagickModule(),
" width, height: %dx%d",
5566 ximage->width,ximage->height);
5567 (void) LogMagickEvent(X11Event,GetMagickModule(),
" format: %d",
5569 (void) LogMagickEvent(X11Event,GetMagickModule(),
" byte order: %d",
5570 ximage->byte_order);
5571 (void) LogMagickEvent(X11Event,GetMagickModule(),
5572 " bitmap unit, bit order, pad: %d %d %d",ximage->bitmap_unit,
5573 ximage->bitmap_bit_order,ximage->bitmap_pad);
5574 (void) LogMagickEvent(X11Event,GetMagickModule(),
" depth: %d",
5576 (void) LogMagickEvent(X11Event,GetMagickModule(),
" bytes per line: %d",
5577 ximage->bytes_per_line);
5578 (void) LogMagickEvent(X11Event,GetMagickModule(),
" bits per pixel: %d",
5579 ximage->bits_per_pixel);
5580 (void) LogMagickEvent(X11Event,GetMagickModule(),
5581 " red, green, blue masks: 0x%lx 0x%lx 0x%lx",ximage->red_mask,
5582 ximage->green_mask,ximage->blue_mask);
5584 if (window->shared_memory == MagickFalse)
5586 if (ximage->format == XYBitmap)
5588 ximage->data=(
char *) AcquireQuantumMemory((
size_t)
5589 ximage->bytes_per_line,(
size_t) ximage->depth*ximage->height);
5590 if (ximage->data != (
char *) NULL)
5591 (void) memset(ximage->data,0,(
size_t)
5592 ximage->bytes_per_line*ximage->depth*ximage->height);
5596 ximage->data=(
char *) AcquireQuantumMemory((
size_t)
5597 ximage->bytes_per_line,(
size_t) ximage->height);
5598 if (ximage->data != (
char *) NULL)
5599 (void) memset(ximage->data,0,(
size_t)
5600 ximage->bytes_per_line*ximage->height);
5603 if (ximage->data == (
char *) NULL)
5608 XDestroyImage(ximage);
5609 ximage=(XImage *) NULL;
5610 (void) XCheckDefineCursor(display,window->id,window->cursor);
5611 return(MagickFalse);
5613 if (window->ximage != (XImage *) NULL)
5618#if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
5619 if (window->segment_info != (XShmSegmentInfo *) NULL)
5624 segment_info=(XShmSegmentInfo *) window->segment_info;
5625 if (segment_info[0].shmid >= 0)
5627 (void) XSync(display,MagickFalse);
5628 (void) XShmDetach(display,&segment_info[0]);
5629 (void) XSync(display,MagickFalse);
5630 if (segment_info[0].shmaddr != (
char *) NULL)
5631 (void) shmdt(segment_info[0].shmaddr);
5632 (void) shmctl(segment_info[0].shmid,IPC_RMID,0);
5633 segment_info[0].shmid=(-1);
5634 segment_info[0].shmaddr=(
char *) NULL;
5635 window->ximage->data=(
char *) NULL;
5639 if (window->ximage->data != (
char *) NULL)
5640 free(window->ximage->data);
5641 window->ximage->data=(
char *) NULL;
5642 XDestroyImage(window->ximage);
5643 window->ximage=(XImage *) NULL;
5645#if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
5646 if (window->segment_info != (XShmSegmentInfo *) NULL)
5651 segment_info=(XShmSegmentInfo *) window->segment_info;
5652 segment_info[0]=segment_info[1];
5655 window->ximage=ximage;
5656 matte_image=(XImage *) NULL;
5657 if ((window->shape != MagickFalse) && (window->image != (
Image *) NULL))
5658 if ((window->image->matte != MagickFalse) &&
5659 ((
int) width <= XDisplayWidth(display,window->screen)) &&
5660 ((
int) height <= XDisplayHeight(display,window->screen)))
5665 matte_image=XCreateImage(display,window->visual,1,XYBitmap,0,
5666 (
char *) NULL,width,height,XBitmapPad(display),0);
5667 if ((GetLogEventMask() & X11Event) != 0)
5669 (void) LogMagickEvent(X11Event,GetMagickModule(),
"Matte Image:");
5670 (void) LogMagickEvent(X11Event,GetMagickModule(),
5671 " width, height: %dx%d",matte_image->width,matte_image->height);
5673 if (matte_image != (XImage *) NULL)
5678 matte_image->data=(
char *) malloc((
size_t)
5679 matte_image->bytes_per_line*matte_image->depth*
5680 matte_image->height);
5681 if (matte_image->data == (
char *) NULL)
5683 XDestroyImage(matte_image);
5684 matte_image=(XImage *) NULL;
5688 if (window->matte_image != (XImage *) NULL)
5693 if (window->matte_image->data != (
char *) NULL)
5694 free(window->matte_image->data);
5695 window->matte_image->data=(
char *) NULL;
5696 XDestroyImage(window->matte_image);
5697 window->matte_image=(XImage *) NULL;
5699 window->matte_image=matte_image;
5700 if (window->matte_pixmap != (Pixmap) NULL)
5702 (void) XFreePixmap(display,window->matte_pixmap);
5703 window->matte_pixmap=(Pixmap) NULL;
5704#if defined(MAGICKCORE_HAVE_SHAPE)
5705 if (window->shape != MagickFalse)
5706 XShapeCombineMask(display,window->id,ShapeBounding,0,0,None,ShapeSet);
5709 window->stasis=MagickFalse;
5713 if (window->image != (
Image *) NULL)
5715 if ((ximage->byte_order == LSBFirst) || ((ximage->format == XYBitmap) &&
5716 (ximage->bitmap_bit_order == LSBFirst)))
5717 XMakeImageLSBFirst(resource_info,window,window->image,ximage,
5720 XMakeImageMSBFirst(resource_info,window,window->image,ximage,
5723 if (window->matte_image != (XImage *) NULL)
5728 window->matte_pixmap=XCreatePixmap(display,window->id,width,height,1);
5729 if (window->matte_pixmap != (Pixmap) NULL)
5740 context_values.background=1;
5741 context_values.foreground=0;
5742 graphics_context=XCreateGC(display,window->matte_pixmap,
5743 (
size_t) (GCBackground | GCForeground),&context_values);
5744 (void) XPutImage(display,window->matte_pixmap,graphics_context,
5745 window->matte_image,0,0,0,0,width,height);
5746 (void) XFreeGC(display,graphics_context);
5747#if defined(MAGICKCORE_HAVE_SHAPE)
5748 if (window->shape != MagickFalse)
5749 XShapeCombineMask(display,window->id,ShapeBounding,0,0,
5750 window->matte_pixmap,ShapeSet);
5754 (void) XMakePixmap(display,resource_info,window);
5758 (void) XCheckDefineCursor(display,window->id,window->cursor);
5798static void XMakeImageLSBFirst(
const XResourceInfo *resource_info,
5799 const XWindowInfo *window,
Image *image,XImage *ximage,XImage *matte_image)
5836 assert(resource_info != (XResourceInfo *) NULL);
5837 assert(window != (XWindowInfo *) NULL);
5838 assert(image != (
Image *) NULL);
5839 if (IsEventLogging() != MagickFalse)
5840 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
5842 if ((window->immutable == MagickFalse) &&
5843 (image->storage_class == DirectClass) && (image->matte != MagickFalse))
5846 size[MaxTextExtent];
5854 image_info=AcquireImageInfo();
5855 (void) CopyMagickString(image_info->filename,
5856 resource_info->image_info->texture != (
char *) NULL ?
5857 resource_info->image_info->texture :
"pattern:checkerboard",
5859 (void) FormatLocaleString(size,MaxTextExtent,
"%.20gx%.20g",(
double)
5860 image->columns,(
double) image->rows);
5861 image_info->size=ConstantString(size);
5862 pattern=ReadImage(image_info,&image->exception);
5863 image_info=DestroyImageInfo(image_info);
5864 if (pattern != (
Image *) NULL)
5866 canvas=CloneImage(image,0,0,MagickTrue,&image->exception);
5867 if (canvas == (
Image *) NULL)
5869 (void) CompositeImage(canvas,DstOverCompositeOp,pattern,0,0);
5870 pattern=DestroyImage(pattern);
5873 scanline_pad=(
unsigned int) (ximage->bytes_per_line-((ximage->width*
5874 ximage->bits_per_pixel) >> 3));
5875 map_info=window->map_info;
5876 pixels=window->pixel_info->pixels;
5877 q=(
unsigned char *) ximage->data;
5879 canvas_view=AcquireVirtualCacheView(canvas,&canvas->exception);
5880 if (ximage->format == XYBitmap)
5892 background=(
unsigned char)
5893 (XPixelIntensity(&window->pixel_info->foreground_color) <
5894 XPixelIntensity(&window->pixel_info->background_color) ? 0x80 : 0x00);
5895 foreground=(
unsigned char)
5896 (XPixelIntensity(&window->pixel_info->background_color) <
5897 XPixelIntensity(&window->pixel_info->foreground_color) ? 0x80 : 0x00);
5898 polarity=(
unsigned short) ((GetPixelIntensity(image,
5899 &canvas->colormap[0])) < ((
double) QuantumRange/2.0) ? 1 : 0);
5900 if (canvas->colors == 2)
5901 polarity=GetPixelIntensity(canvas,&canvas->colormap[0]) <
5902 GetPixelIntensity(canvas,&canvas->colormap[1]);
5903 for (y=0; y < (int) canvas->rows; y++)
5905 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,canvas->columns,1,
5906 &canvas->exception);
5909 indexes=GetCacheViewVirtualIndexQueue(canvas_view);
5912 for (x=0; x < (int) canvas->columns; x++)
5915 if (GetPixelIndex(indexes+x) == (IndexPacket) polarity)
5929 q+=(ptrdiff_t) scanline_pad;
5933 if (window->pixel_info->colors != 0)
5934 switch (ximage->bits_per_pixel)
5944 for (y=0; y < (int) canvas->rows; y++)
5946 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
5947 canvas->columns,1,&canvas->exception);
5950 indexes=GetCacheViewVirtualIndexQueue(canvas_view);
5952 for (x=0; x < (int) canvas->columns; x++)
5954 pixel=pixels[(ssize_t) GetPixelIndex(indexes+x)] & 0x0f;
5959 *q=(
unsigned char) pixel;
5965 *q|=(
unsigned char) (pixel << 2);
5971 *q|=(
unsigned char) (pixel << 4);
5977 *q|=(
unsigned char) (pixel << 6);
5984 q+=(ptrdiff_t) scanline_pad;
5996 for (y=0; y < (int) canvas->rows; y++)
5998 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
5999 canvas->columns,1,&canvas->exception);
6002 indexes=GetCacheViewVirtualIndexQueue(canvas_view);
6004 for (x=0; x < (int) canvas->columns; x++)
6006 pixel=pixels[(ssize_t) GetPixelIndex(indexes+x)] & 0xf;
6011 *q=(
unsigned char) pixel;
6017 *q|=(
unsigned char) (pixel << 4);
6024 q+=(ptrdiff_t) scanline_pad;
6034 if ((resource_info->color_recovery != MagickFalse) &&
6035 (resource_info->quantize_info->dither != MagickFalse))
6037 XDitherImage(canvas,ximage);
6040 for (y=0; y < (int) canvas->rows; y++)
6042 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6043 canvas->columns,1,&canvas->exception);
6046 indexes=GetCacheViewVirtualIndexQueue(canvas_view);
6047 for (x=0; x < (int) canvas->columns; x++)
6049 pixel=pixels[(ssize_t) GetPixelIndex(indexes+x)];
6050 *q++=(
unsigned char) pixel;
6052 q+=(ptrdiff_t) scanline_pad;
6067 bytes_per_pixel=(
unsigned int) (ximage->bits_per_pixel >> 3);
6068 for (y=0; y < (int) canvas->rows; y++)
6070 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6071 canvas->columns,1,&canvas->exception);
6074 indexes=GetCacheViewVirtualIndexQueue(canvas_view);
6075 for (x=0; x < (int) canvas->columns; x++)
6077 pixel=pixels[(ssize_t) GetPixelIndex(indexes+x)];
6078 for (k=0; k < (int) bytes_per_pixel; k++)
6080 *q++=(
unsigned char) (pixel & 0xff);
6084 q+=(ptrdiff_t) scanline_pad;
6090 switch (ximage->bits_per_pixel)
6100 for (y=0; y < (int) canvas->rows; y++)
6103 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6104 canvas->columns,1,&canvas->exception);
6107 for (x=0; x < (int) canvas->columns; x++)
6109 pixel=XGammaPixel(map_info,p);
6115 *q=(
unsigned char) pixel;
6121 *q|=(
unsigned char) (pixel << 2);
6127 *q|=(
unsigned char) (pixel << 4);
6133 *q|=(
unsigned char) (pixel << 6);
6141 q+=(ptrdiff_t) scanline_pad;
6153 for (y=0; y < (int) canvas->rows; y++)
6155 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6156 canvas->columns,1,&canvas->exception);
6160 for (x=0; x < (int) canvas->columns; x++)
6162 pixel=XGammaPixel(map_info,p);
6168 *q=(
unsigned char) pixel;
6174 *q|=(
unsigned char) (pixel << 4);
6182 q+=(ptrdiff_t) scanline_pad;
6192 if ((resource_info->color_recovery != MagickFalse) &&
6193 (resource_info->quantize_info->dither != MagickFalse))
6195 XDitherImage(canvas,ximage);
6198 for (y=0; y < (int) canvas->rows; y++)
6200 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6201 canvas->columns,1,&canvas->exception);
6204 for (x=0; x < (int) canvas->columns; x++)
6206 pixel=XGammaPixel(map_info,p);
6207 *q++=(
unsigned char) pixel;
6210 q+=(ptrdiff_t) scanline_pad;
6216 if ((ximage->bits_per_pixel == 32) && (map_info->red_max == 255) &&
6217 (map_info->green_max == 255) && (map_info->blue_max == 255) &&
6218 (map_info->red_mult == 65536L) && (map_info->green_mult == 256) &&
6219 (map_info->blue_mult == 1))
6224 for (y=0; y < (int) canvas->rows; y++)
6226 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6227 canvas->columns,1,&canvas->exception);
6230 if ((red_gamma != 1.0) || (green_gamma != 1.0) ||
6231 (blue_gamma != 1.0))
6236 for (x=(
int) canvas->columns-1; x >= 0; x--)
6238 *q++=ScaleQuantumToChar(XBlueGamma(GetPixelBlue(p)));
6239 *q++=ScaleQuantumToChar(XGreenGamma(GetPixelGreen(p)));
6240 *q++=ScaleQuantumToChar(XRedGamma(GetPixelRed(p)));
6246 for (x=(
int) canvas->columns-1; x >= 0; x--)
6248 *q++=ScaleQuantumToChar((Quantum) GetPixelBlue(p));
6249 *q++=ScaleQuantumToChar((Quantum) GetPixelGreen(p));
6250 *q++=ScaleQuantumToChar((Quantum) GetPixelRed(p));
6257 if ((ximage->bits_per_pixel == 32) && (map_info->red_max == 255) &&
6258 (map_info->green_max == 255) && (map_info->blue_max == 255) &&
6259 (map_info->red_mult == 1) && (map_info->green_mult == 256) &&
6260 (map_info->blue_mult == 65536L))
6265 for (y=0; y < (int) canvas->rows; y++)
6267 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6268 canvas->columns,1,&canvas->exception);
6271 if ((red_gamma != 1.0) || (green_gamma != 1.0) ||
6272 (blue_gamma != 1.0))
6277 for (x=(
int) canvas->columns-1; x >= 0; x--)
6279 *q++=ScaleQuantumToChar(XRedGamma(GetPixelRed(p)));
6280 *q++=ScaleQuantumToChar(XGreenGamma(GetPixelGreen(p)));
6281 *q++=ScaleQuantumToChar(XBlueGamma(GetPixelBlue(p)));
6287 for (x=(
int) canvas->columns-1; x >= 0; x--)
6289 *q++=ScaleQuantumToChar((Quantum) GetPixelRed(p));
6290 *q++=ScaleQuantumToChar((Quantum) GetPixelGreen(p));
6291 *q++=ScaleQuantumToChar((Quantum) GetPixelBlue(p));
6308 bytes_per_pixel=(
unsigned int) (ximage->bits_per_pixel >> 3);
6309 for (y=0; y < (int) canvas->rows; y++)
6311 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6312 canvas->columns,1,&canvas->exception);
6315 for (x=0; x < (int) canvas->columns; x++)
6317 pixel=XGammaPixel(map_info,p);
6318 for (k=0; k < (int) bytes_per_pixel; k++)
6320 *q++=(
unsigned char) (pixel & 0xff);
6325 q+=(ptrdiff_t) scanline_pad;
6331 if (matte_image != (XImage *) NULL)
6336 scanline_pad=(
unsigned int) (matte_image->bytes_per_line-
6337 ((matte_image->width*matte_image->bits_per_pixel) >> 3));
6338 q=(
unsigned char *) matte_image->data;
6339 for (y=0; y < (int) canvas->rows; y++)
6341 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,canvas->columns,1,
6342 &canvas->exception);
6347 for (x=(
int) canvas->columns-1; x >= 0; x--)
6350 if (GetPixelOpacity(p) > (QuantumRange/2))
6363 q+=(ptrdiff_t) scanline_pad;
6366 canvas_view=DestroyCacheView(canvas_view);
6367 if (canvas != image)
6368 canvas=DestroyImage(canvas);
6407static void XMakeImageMSBFirst(
const XResourceInfo *resource_info,
6408 const XWindowInfo *window,
Image *image,XImage *ximage,XImage *matte_image)
6445 assert(resource_info != (XResourceInfo *) NULL);
6446 assert(window != (XWindowInfo *) NULL);
6447 assert(image != (
Image *) NULL);
6448 if (IsEventLogging() != MagickFalse)
6449 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
6451 if ((window->immutable != MagickFalse) &&
6452 (image->storage_class == DirectClass) && (image->matte != MagickFalse))
6455 size[MaxTextExtent];
6463 image_info=AcquireImageInfo();
6464 (void) CopyMagickString(image_info->filename,
6465 resource_info->image_info->texture != (
char *) NULL ?
6466 resource_info->image_info->texture :
"pattern:checkerboard",
6468 (void) FormatLocaleString(size,MaxTextExtent,
"%.20gx%.20g",(
double)
6469 image->columns,(
double) image->rows);
6470 image_info->size=ConstantString(size);
6471 pattern=ReadImage(image_info,&image->exception);
6472 image_info=DestroyImageInfo(image_info);
6473 if (pattern != (
Image *) NULL)
6475 canvas=CloneImage(image,0,0,MagickTrue,&image->exception);
6476 if (canvas == (
Image *) NULL)
6478 (void) CompositeImage(canvas,DstOverCompositeOp,pattern,0,0);
6479 pattern=DestroyImage(pattern);
6482 scanline_pad=(
unsigned int) (ximage->bytes_per_line-
6483 ((ximage->width*ximage->bits_per_pixel) >> 3));
6484 map_info=window->map_info;
6485 pixels=window->pixel_info->pixels;
6486 q=(
unsigned char *) ximage->data;
6488 canvas_view=AcquireVirtualCacheView(canvas,&canvas->exception);
6489 if (ximage->format == XYBitmap)
6501 background=(
unsigned char)
6502 (XPixelIntensity(&window->pixel_info->foreground_color) <
6503 XPixelIntensity(&window->pixel_info->background_color) ? 0x01 : 0x00);
6504 foreground=(
unsigned char)
6505 (XPixelIntensity(&window->pixel_info->background_color) <
6506 XPixelIntensity(&window->pixel_info->foreground_color) ? 0x01 : 0x00);
6507 polarity=(
unsigned short) ((GetPixelIntensity(image,
6508 &canvas->colormap[0])) < ((
double) QuantumRange/2.0) ? 1 : 0);
6509 if (canvas->colors == 2)
6510 polarity=GetPixelIntensity(canvas,&canvas->colormap[0]) <
6511 GetPixelIntensity(canvas,&canvas->colormap[1]);
6512 for (y=0; y < (int) canvas->rows; y++)
6514 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,canvas->columns,1,
6515 &canvas->exception);
6518 indexes=GetCacheViewVirtualIndexQueue(canvas_view);
6521 for (x=(
int) canvas->columns-1; x >= 0; x--)
6524 if (GetPixelIndex(indexes+x) == (IndexPacket) polarity)
6538 q+=(ptrdiff_t) scanline_pad;
6542 if (window->pixel_info->colors != 0)
6543 switch (ximage->bits_per_pixel)
6553 for (y=0; y < (int) canvas->rows; y++)
6555 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6556 canvas->columns,1,&canvas->exception);
6559 indexes=GetCacheViewVirtualIndexQueue(canvas_view);
6561 for (x=0; x < (int) canvas->columns; x++)
6563 pixel=pixels[(ssize_t) GetPixelIndex(indexes+x)] & 0xf;
6568 *q=(
unsigned char) (pixel << 6);
6574 *q|=(
unsigned char) (pixel << 4);
6580 *q|=(
unsigned char) (pixel << 2);
6586 *q|=(
unsigned char) pixel;
6593 q+=(ptrdiff_t) scanline_pad;
6605 for (y=0; y < (int) canvas->rows; y++)
6607 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6608 canvas->columns,1,&canvas->exception);
6611 indexes=GetCacheViewVirtualIndexQueue(canvas_view);
6613 for (x=0; x < (int) canvas->columns; x++)
6615 pixel=pixels[(ssize_t) GetPixelIndex(indexes+x)] & 0xf;
6620 *q=(
unsigned char) (pixel << 4);
6626 *q|=(
unsigned char) pixel;
6633 q+=(ptrdiff_t) scanline_pad;
6643 if (resource_info->color_recovery &&
6644 resource_info->quantize_info->dither)
6646 XDitherImage(canvas,ximage);
6649 for (y=0; y < (int) canvas->rows; y++)
6651 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6652 canvas->columns,1,&canvas->exception);
6655 indexes=GetCacheViewVirtualIndexQueue(canvas_view);
6656 for (x=0; x < (int) canvas->columns; x++)
6658 pixel=pixels[(ssize_t) GetPixelIndex(indexes+x)];
6659 *q++=(
unsigned char) pixel;
6661 q+=(ptrdiff_t) scanline_pad;
6674 channel[
sizeof(size_t)];
6679 bytes_per_pixel=(
unsigned int) (ximage->bits_per_pixel >> 3);
6680 for (y=0; y < (int) canvas->rows; y++)
6682 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6683 canvas->columns,1,&canvas->exception);
6686 indexes=GetCacheViewVirtualIndexQueue(canvas_view);
6687 for (x=0; x < (int) canvas->columns; x++)
6689 pixel=pixels[(ssize_t) GetPixelIndex(indexes+x)];
6690 for (k=(
int) bytes_per_pixel-1; k >= 0; k--)
6692 channel[k]=(
unsigned char) pixel;
6695 for (k=0; k < (int) bytes_per_pixel; k++)
6698 q+=(ptrdiff_t) scanline_pad;
6704 switch (ximage->bits_per_pixel)
6714 for (y=0; y < (int) canvas->rows; y++)
6716 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6717 canvas->columns,1,&canvas->exception);
6721 for (x=(
int) canvas->columns-1; x >= 0; x--)
6723 pixel=XGammaPixel(map_info,p);
6729 *q=(
unsigned char) (pixel << 6);
6735 *q|=(
unsigned char) (pixel << 4);
6741 *q|=(
unsigned char) (pixel << 2);
6747 *q|=(
unsigned char) pixel;
6755 q+=(ptrdiff_t) scanline_pad;
6767 for (y=0; y < (int) canvas->rows; y++)
6769 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6770 canvas->columns,1,&canvas->exception);
6774 for (x=(
int) canvas->columns-1; x >= 0; x--)
6776 pixel=XGammaPixel(map_info,p);
6782 *q=(
unsigned char) (pixel << 4);
6788 *q|=(
unsigned char) pixel;
6796 q+=(ptrdiff_t) scanline_pad;
6806 if (resource_info->color_recovery &&
6807 resource_info->quantize_info->dither)
6809 XDitherImage(canvas,ximage);
6812 for (y=0; y < (int) canvas->rows; y++)
6814 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6815 canvas->columns,1,&canvas->exception);
6818 for (x=(
int) canvas->columns-1; x >= 0; x--)
6820 pixel=XGammaPixel(map_info,p);
6821 *q++=(
unsigned char) pixel;
6824 q+=(ptrdiff_t) scanline_pad;
6830 if ((ximage->bits_per_pixel == 32) && (map_info->red_max == 255) &&
6831 (map_info->green_max == 255) && (map_info->blue_max == 255) &&
6832 (map_info->red_mult == 65536L) && (map_info->green_mult == 256) &&
6833 (map_info->blue_mult == 1))
6838 for (y=0; y < (int) canvas->rows; y++)
6840 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6841 canvas->columns,1,&canvas->exception);
6844 if ((red_gamma != 1.0) || (green_gamma != 1.0) ||
6845 (blue_gamma != 1.0))
6850 for (x=(
int) canvas->columns-1; x >= 0; x--)
6853 *q++=ScaleQuantumToChar(XRedGamma(GetPixelRed(p)));
6854 *q++=ScaleQuantumToChar(XGreenGamma(GetPixelGreen(p)));
6855 *q++=ScaleQuantumToChar(XBlueGamma(GetPixelBlue(p)));
6860 for (x=(
int) canvas->columns-1; x >= 0; x--)
6863 *q++=ScaleQuantumToChar((Quantum) GetPixelRed(p));
6864 *q++=ScaleQuantumToChar((Quantum) GetPixelGreen(p));
6865 *q++=ScaleQuantumToChar((Quantum) GetPixelBlue(p));
6871 if ((ximage->bits_per_pixel == 32) && (map_info->red_max == 255) &&
6872 (map_info->green_max == 255) && (map_info->blue_max == 255) &&
6873 (map_info->red_mult == 1) && (map_info->green_mult == 256) &&
6874 (map_info->blue_mult == 65536L))
6879 for (y=0; y < (int) canvas->rows; y++)
6881 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6882 canvas->columns,1,&canvas->exception);
6885 if ((red_gamma != 1.0) || (green_gamma != 1.0) ||
6886 (blue_gamma != 1.0))
6891 for (x=(
int) canvas->columns-1; x >= 0; x--)
6894 *q++=ScaleQuantumToChar(XBlueGamma(GetPixelBlue(p)));
6895 *q++=ScaleQuantumToChar(XGreenGamma(GetPixelGreen(p)));
6896 *q++=ScaleQuantumToChar(XRedGamma(GetPixelRed(p)));
6901 for (x=(
int) canvas->columns-1; x >= 0; x--)
6904 *q++=ScaleQuantumToChar((Quantum) GetPixelBlue(p));
6905 *q++=ScaleQuantumToChar((Quantum) GetPixelGreen(p));
6906 *q++=ScaleQuantumToChar((Quantum) GetPixelRed(p));
6922 bytes_per_pixel=(
unsigned int) (ximage->bits_per_pixel >> 3);
6923 for (y=0; y < (int) canvas->rows; y++)
6925 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6926 canvas->columns,1,&canvas->exception);
6929 for (x=(
int) canvas->columns-1; x >= 0; x--)
6931 pixel=XGammaPixel(map_info,p);
6932 for (k=(
int) bytes_per_pixel-1; k >= 0; k--)
6934 *q++=(
unsigned char) (pixel & 0xff);
6939 q+=(ptrdiff_t) scanline_pad;
6945 if (matte_image != (XImage *) NULL)
6950 scanline_pad=(
unsigned int) (matte_image->bytes_per_line-
6951 ((matte_image->width*matte_image->bits_per_pixel) >> 3));
6952 q=(
unsigned char *) matte_image->data;
6953 for (y=0; y < (int) canvas->rows; y++)
6955 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,canvas->columns,1,
6956 &canvas->exception);
6961 for (x=(
int) canvas->columns-1; x >= 0; x--)
6964 if (GetPixelOpacity(p) > (QuantumRange/2))
6977 q+=(ptrdiff_t) scanline_pad;
6980 canvas_view=DestroyCacheView(canvas_view);
6981 if (canvas != image)
6982 canvas=DestroyImage(canvas);
7010MagickExport
void XMakeMagnifyImage(Display *display,XWindows *windows)
7013 tuple[MaxTextExtent];
7035 previous_magnify = 0;
7055 assert(display != (Display *) NULL);
7056 assert(windows != (XWindows *) NULL);
7057 if (IsEventLogging() != MagickFalse)
7058 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
7060 for (n=1; n < (ssize_t) windows->magnify.data; n++)
7062 while ((magnify*windows->image.ximage->width) < windows->magnify.width)
7064 while ((magnify*windows->image.ximage->height) < windows->magnify.height)
7066 while (magnify > windows->magnify.width)
7068 while (magnify > windows->magnify.height)
7073 if (previous_magnify != 0)
7074 magnify=previous_magnify;
7076 if (magnify != previous_magnify)
7088 while ((1 << i) <= (
int) magnify)
7090 (void) FormatLocaleString(windows->magnify.name,MaxTextExtent,
7091 "Magnify %.20gX",(
double) i);
7092 status=XStringListToTextProperty(&windows->magnify.name,1,&window_name);
7093 if (status != False)
7095 XSetWMName(display,windows->magnify.id,&window_name);
7096 XSetWMIconName(display,windows->magnify.id,&window_name);
7097 (void) XFree((
void *) window_name.value);
7100 previous_magnify=magnify;
7101 ximage=windows->image.ximage;
7102 width=(
unsigned int) windows->magnify.ximage->width;
7103 height=(
unsigned int) windows->magnify.ximage->height;
7104 if ((windows->magnify.x < 0) ||
7105 (windows->magnify.x >= windows->image.ximage->width))
7106 windows->magnify.x=windows->image.ximage->width >> 1;
7107 x=windows->magnify.x-((width/magnify) >> 1);
7111 if (x > (
int) (ximage->width-(width/magnify)))
7112 x=ximage->width-width/magnify;
7113 if ((windows->magnify.y < 0) ||
7114 (windows->magnify.y >= windows->image.ximage->height))
7115 windows->magnify.y=windows->image.ximage->height >> 1;
7116 y=windows->magnify.y-((height/magnify) >> 1);
7120 if (y > (
int) (ximage->height-(height/magnify)))
7121 y=ximage->height-height/magnify;
7122 q=(
unsigned char *) windows->magnify.ximage->data;
7123 scanline_pad=(
unsigned int) (windows->magnify.ximage->bytes_per_line-
7124 ((width*windows->magnify.ximage->bits_per_pixel) >> 3));
7125 if (ximage->bits_per_pixel < 8)
7140 pixel_info=windows->magnify.pixel_info;
7141 switch (ximage->bitmap_bit_order)
7150 if (ximage->format == XYBitmap)
7152 background=(
unsigned char)
7153 (XPixelIntensity(&pixel_info->foreground_color) <
7154 XPixelIntensity(&pixel_info->background_color) ? 0x80 : 0x00);
7155 foreground=(
unsigned char)
7156 (XPixelIntensity(&pixel_info->background_color) <
7157 XPixelIntensity(&pixel_info->foreground_color) ? 0x80 : 0x00);
7158 if (windows->magnify.depth > 1)
7159 Swap(background,foreground);
7161 for (i=0; i < (ssize_t) height; i+=magnify)
7166 for (j=0; j < magnify; j++)
7168 p=(
unsigned char *) ximage->data+y*ximage->bytes_per_line+
7169 ((x*ximage->bits_per_pixel) >> 3);
7170 p_bit=(
unsigned char) (x*ximage->bits_per_pixel) & 0x07;
7173 for (k=0; k < width; k+=magnify)
7178 for (l=0; l < magnify; l++)
7183 for (plane=0; (int) plane < ximage->bits_per_pixel; plane++)
7186 if (*p & (0x01 << (p_bit+plane)))
7199 p_bit+=ximage->bits_per_pixel;
7206 *q=
byte >> (8-q_bit);
7207 q+=(ptrdiff_t) scanline_pad;
7222 if (ximage->format == XYBitmap)
7224 background=(
unsigned char)
7225 (XPixelIntensity(&pixel_info->foreground_color) <
7226 XPixelIntensity(&pixel_info->background_color) ? 0x01 : 0x00);
7227 foreground=(
unsigned char)
7228 (XPixelIntensity(&pixel_info->background_color) <
7229 XPixelIntensity(&pixel_info->foreground_color) ? 0x01 : 0x00);
7230 if (windows->magnify.depth > 1)
7231 Swap(background,foreground);
7233 for (i=0; i < (ssize_t) height; i+=magnify)
7238 for (j=0; j < magnify; j++)
7240 p=(
unsigned char *) ximage->data+y*ximage->bytes_per_line+
7241 ((x*ximage->bits_per_pixel) >> 3);
7242 p_bit=(
unsigned char) (x*ximage->bits_per_pixel) & 0x07;
7245 for (k=0; k < width; k+=magnify)
7250 for (l=0; l < magnify; l++)
7255 for (plane=0; (int) plane < ximage->bits_per_pixel; plane++)
7258 if (*p & (0x80 >> (p_bit+plane)))
7271 p_bit+=ximage->bits_per_pixel;
7278 *q=
byte << (8-q_bit);
7279 q+=(ptrdiff_t) scanline_pad;
7289 switch (ximage->bits_per_pixel)
7297 for (i=0; i < (ssize_t) height; i+=magnify)
7302 for (j=0; j < magnify; j++)
7304 p=(
unsigned char *) ximage->data+y*ximage->bytes_per_line+
7305 ((x*ximage->bits_per_pixel) >> 3);
7306 for (k=0; k < width; k+=magnify)
7311 for (l=0; l < magnify; l++)
7315 q+=(ptrdiff_t) scanline_pad;
7330 bytes_per_pixel=(
unsigned int) ximage->bits_per_pixel >> 3;
7331 for (i=0; i < (ssize_t) height; i+=magnify)
7336 for (j=0; j < magnify; j++)
7338 p=(
unsigned char *) ximage->data+y*ximage->bytes_per_line+
7339 ((x*ximage->bits_per_pixel) >> 3);
7340 for (k=0; k < width; k+=magnify)
7345 for (l=0; l < magnify; l++)
7346 for (m=0; m < bytes_per_pixel; m++)
7348 p+=(ptrdiff_t) bytes_per_pixel;
7350 q+=(ptrdiff_t) scanline_pad;
7360 x=windows->magnify.x-((width/magnify) >> 1);
7362 x=(int) ((width >> 1)-windows->magnify.x*magnify);
7364 if (x > (
int) (ximage->width-(width/magnify)))
7365 x=(int) ((ximage->width-windows->magnify.x)*magnify-(width >> 1));
7368 y=windows->magnify.y-((height/magnify) >> 1);
7370 y=(int) ((height >> 1)-windows->magnify.y*magnify);
7372 if (y > (
int) (ximage->height-(height/magnify)))
7373 y=(int) ((ximage->height-windows->magnify.y)*magnify-(height >> 1));
7376 if ((x != 0) || (y != 0))
7377 (void) XFillRectangle(display,windows->magnify.pixmap,
7378 windows->magnify.annotate_context,0,0,width,height);
7379 (void) XPutImage(display,windows->magnify.pixmap,
7380 windows->magnify.annotate_context,windows->magnify.ximage,0,0,x,y,width-x,
7382 if ((magnify > 1) && ((magnify <= (width >> 1)) &&
7383 (magnify <= (height >> 1))))
7391 highlight_info.x=(ssize_t) windows->magnify.width >> 1;
7392 highlight_info.y=(ssize_t) windows->magnify.height >> 1;
7393 highlight_info.width=magnify;
7394 highlight_info.height=magnify;
7395 (void) XDrawRectangle(display,windows->magnify.pixmap,
7396 windows->magnify.highlight_context,(
int) highlight_info.x,
7397 (
int) highlight_info.y,(
unsigned int) highlight_info.width-1,
7398 (
unsigned int) highlight_info.height-1);
7400 (void) XDrawRectangle(display,windows->magnify.pixmap,
7401 windows->magnify.annotate_context,(
int) highlight_info.x+1,
7402 (
int) highlight_info.y+1,(
unsigned int) highlight_info.width-3,
7403 (
unsigned int) highlight_info.height-3);
7408 (void) GetOneVirtualMagickPixel(windows->image.image,(ssize_t)
7409 windows->magnify.x,(ssize_t) windows->magnify.y,&pixel,
7410 &windows->image.image->exception);
7411 (void) FormatLocaleString(tuple,MaxTextExtent,
"%d,%d: ",
7412 windows->magnify.x,windows->magnify.y);
7413 (void) ConcatenateMagickString(tuple,
"(",MaxTextExtent);
7414 ConcatenateColorComponent(&pixel,RedChannel,X11Compliance,tuple);
7415 (void) ConcatenateMagickString(tuple,
",",MaxTextExtent);
7416 ConcatenateColorComponent(&pixel,GreenChannel,X11Compliance,tuple);
7417 (void) ConcatenateMagickString(tuple,
",",MaxTextExtent);
7418 ConcatenateColorComponent(&pixel,BlueChannel,X11Compliance,tuple);
7419 if (pixel.colorspace == CMYKColorspace)
7421 (void) ConcatenateMagickString(tuple,
",",MaxTextExtent);
7422 ConcatenateColorComponent(&pixel,IndexChannel,X11Compliance,tuple);
7424 if (pixel.matte != MagickFalse)
7426 (void) ConcatenateMagickString(tuple,
",",MaxTextExtent);
7427 ConcatenateColorComponent(&pixel,OpacityChannel,X11Compliance,tuple);
7429 (void) ConcatenateMagickString(tuple,
")",MaxTextExtent);
7430 height=(
unsigned int) windows->magnify.font_info->ascent+
7431 windows->magnify.font_info->descent;
7432 x=windows->magnify.font_info->max_bounds.width >> 1;
7433 y=windows->magnify.font_info->ascent+(height >> 2);
7434 (void) XDrawImageString(display,windows->magnify.pixmap,
7435 windows->magnify.annotate_context,x,y,tuple,(
int) strlen(tuple));
7436 GetColorTuple(&pixel,MagickTrue,tuple);
7438 (void) XDrawImageString(display,windows->magnify.pixmap,
7439 windows->magnify.annotate_context,x,y,tuple,(
int) strlen(tuple));
7440 (void) QueryMagickColorname(windows->image.image,&pixel,SVGCompliance,tuple,
7441 &windows->image.image->exception);
7443 (void) XDrawImageString(display,windows->magnify.pixmap,
7444 windows->magnify.annotate_context,x,y,tuple,(
int) strlen(tuple));
7448 magnify_window=windows->magnify;
7451 XRefreshWindow(display,&magnify_window,(XEvent *) NULL);
7483static MagickBooleanType XMakePixmap(Display *display,
7484 const XResourceInfo *resource_info,XWindowInfo *window)
7490 assert(display != (Display *) NULL);
7491 assert(resource_info != (XResourceInfo *) NULL);
7492 assert(window != (XWindowInfo *) NULL);
7493 if (IsEventLogging() != MagickFalse)
7494 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
7495 (void) resource_info;
7496 if (window->pixmap != (Pixmap) NULL)
7501 (void) XFreePixmap(display,window->pixmap);
7502 window->pixmap=(Pixmap) NULL;
7504 if (window->use_pixmap == MagickFalse)
7505 return(MagickFalse);
7506 if (window->ximage == (XImage *) NULL)
7507 return(MagickFalse);
7511 (void) XCheckDefineCursor(display,window->id,window->busy_cursor);
7512 (void) XFlush(display);
7516 width=(
unsigned int) window->ximage->width;
7517 height=(
unsigned int) window->ximage->height;
7518 window->pixmap=XCreatePixmap(display,window->id,width,height,window->depth);
7519 if (window->pixmap == (Pixmap) NULL)
7524 (void) XCheckDefineCursor(display,window->id,window->cursor);
7525 return(MagickFalse);
7530#if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
7531 if (window->shared_memory)
7532 (void) XShmPutImage(display,window->pixmap,window->annotate_context,
7533 window->ximage,0,0,0,0,width,height,MagickTrue);
7535 if (window->shared_memory == MagickFalse)
7536 (void) XPutImage(display,window->pixmap,window->annotate_context,
7537 window->ximage,0,0,0,0,width,height);
7538 if ((GetLogEventMask() & X11Event) != 0)
7540 (void) LogMagickEvent(X11Event,GetMagickModule(),
"Pixmap:");
7541 (void) LogMagickEvent(X11Event,GetMagickModule(),
" width, height: %ux%u",
7547 (void) XCheckDefineCursor(display,window->id,window->cursor);
7588#if defined(__cplusplus) || defined(c_plusplus)
7592static inline MagickRealType DiversityPixelIntensity(
7593 const DiversityPacket *pixel)
7598 intensity=0.298839*(double) pixel->red+0.586811*(
double) pixel->green+
7599 0.114350*(double) pixel->blue;
7603static 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));
7619static 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)
7634static inline Quantum ScaleXToQuantum(
const size_t x,
7637 return((Quantum) (((MagickRealType) QuantumRange*x)/scale+0.5));
7640MagickExport
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);
8255MagickExport
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;
8511static 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);
8534MagickExport 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);
8578MagickExport 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);
8655MagickExport
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,
8706MagickExport
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);
8822MagickExport 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);
8904MagickPrivate MagickBooleanType XRenderImage(
Image *image,
8915 *display = (Display *) NULL;
8920 static XAnnotateInfo
8929 static XResourceInfo
8935 static XStandardColormap
8941 if (display == (Display *) NULL)
8952 display=XOpenDisplay(draw_info->server_name);
8953 if (display == (Display *) NULL)
8955 ThrowXWindowException(XServerError,
"UnableToOpenXServer",
8956 draw_info->server_name);
8957 return(MagickFalse);
8962 (void) XSetErrorHandler(XError);
8963 image_info=AcquireImageInfo();
8964 client_name=GetClientName();
8965 resource_database=XGetResourceDatabase(display,client_name);
8966 XGetResourceInfo(image_info,resource_database,client_name,&resource_info);
8967 resource_info.close_server=MagickFalse;
8968 resource_info.colormap=PrivateColormap;
8969 resource_info.font=AcquireString(draw_info->font);
8970 resource_info.background_color=AcquireString(
"#ffffffffffff");
8971 resource_info.foreground_color=AcquireString(
"#000000000000");
8972 map_info=XAllocStandardColormap();
8973 visual_info=(XVisualInfo *) NULL;
8974 font_info=(XFontStruct *) NULL;
8975 pixel.pixels=(
unsigned long *) NULL;
8976 if (map_info == (XStandardColormap *) NULL)
8978 ThrowXWindowException(ResourceLimitError,
"MemoryAllocationFailed",
8980 return(MagickFalse);
8985 visual_info=XBestVisualInfo(display,map_info,&resource_info);
8986 if (visual_info == (XVisualInfo *) NULL)
8988 XFreeResources(display,visual_info,map_info,&pixel,font_info,
8989 &resource_info,(XWindowInfo *) NULL);
8990 ThrowXWindowException(XServerError,
"UnableToGetVisual",
8992 return(MagickFalse);
8994 map_info->colormap=(Colormap) NULL;
8998 XGetMapInfo(visual_info,XDefaultColormap(display,visual_info->screen),
9000 XGetPixelPacket(display,visual_info,map_info,&resource_info,
9001 (
Image *) NULL,&pixel);
9002 pixel.annotate_context=XDefaultGC(display,visual_info->screen);
9006 font_info=XBestFont(display,&resource_info,MagickFalse);
9007 if (font_info == (XFontStruct *) NULL)
9009 XFreeResources(display,visual_info,map_info,&pixel,font_info,
9010 &resource_info,(XWindowInfo *) NULL);
9011 ThrowXWindowException(XServerError,
"UnableToLoadFont",
9013 return(MagickFalse);
9015 cache_info=(*draw_info);
9020 XGetAnnotateInfo(&annotate_info);
9021 annotate_info.stencil=ForegroundStencil;
9022 if (cache_info.font != draw_info->font)
9027 (void) XFreeFont(display,font_info);
9028 (void) CloneString(&resource_info.font,draw_info->font);
9029 font_info=XBestFont(display,&resource_info,MagickFalse);
9030 if (font_info == (XFontStruct *) NULL)
9032 ThrowXWindowException(XServerError,
"UnableToLoadFont",
9034 return(MagickFalse);
9037 if (draw_info->debug != MagickFalse)
9038 (void) LogMagickEvent(AnnotateEvent,GetMagickModule(),
9039 "Font %s; pointsize %g",draw_info->font != (
char *) NULL ?
9040 draw_info->font :
"none",draw_info->pointsize);
9041 cache_info=(*draw_info);
9042 annotate_info.font_info=font_info;
9043 annotate_info.text=(
char *) draw_info->text;
9044 annotate_info.width=(
unsigned int) XTextWidth(font_info,draw_info->text,(
int)
9045 strlen(draw_info->text));
9046 annotate_info.height=(
unsigned int) font_info->ascent+font_info->descent;
9047 metrics->pixels_per_em.x=(double) font_info->max_bounds.width;
9048 metrics->pixels_per_em.y=(double) font_info->ascent+font_info->descent;
9049 metrics->ascent=(double) font_info->ascent+4;
9050 metrics->descent=(double) (-font_info->descent);
9051 metrics->width=annotate_info.width/ExpandAffine(&draw_info->affine);
9052 metrics->height=font_info->ascent+font_info->descent;
9053 metrics->max_advance=(double) font_info->max_bounds.width;
9054 metrics->bounds.x1=0.0;
9055 metrics->bounds.y1=metrics->descent;
9056 metrics->bounds.x2=metrics->ascent+metrics->descent;
9057 metrics->bounds.y2=metrics->ascent+metrics->descent;
9058 metrics->underline_position=(-2.0);
9059 metrics->underline_thickness=1.0;
9060 if (draw_info->render == MagickFalse)
9062 if (draw_info->fill.opacity == TransparentOpacity)
9067 width=annotate_info.width;
9068 height=annotate_info.height;
9069 if ((draw_info->affine.rx != 0.0) || (draw_info->affine.ry != 0.0))
9071 if (((draw_info->affine.sx-draw_info->affine.sy) == 0.0) &&
9072 ((draw_info->affine.rx+draw_info->affine.ry) == 0.0))
9073 annotate_info.degrees=(180.0/MagickPI)*
9074 atan2(draw_info->affine.rx,draw_info->affine.sx);
9076 (void) FormatLocaleString(annotate_info.geometry,MaxTextExtent,
9077 "%.20gx%.20g%+.20g%+.20g",(
double) width,(
double) height,
9078 ceil(offset->x-0.5),ceil(offset->y-metrics->ascent-metrics->descent+
9079 draw_info->interline_spacing-0.5));
9080 pixel.pen_color.red=ScaleQuantumToShort(draw_info->fill.red);
9081 pixel.pen_color.green=ScaleQuantumToShort(draw_info->fill.green);
9082 pixel.pen_color.blue=ScaleQuantumToShort(draw_info->fill.blue);
9083 status=XAnnotateImage(display,&pixel,&annotate_info,image);
9086 ThrowXWindowException(ResourceLimitError,
"MemoryAllocationFailed",
9088 return(MagickFalse);
9119MagickExport
void XRetainWindowColors(Display *display,
const Window window)
9130 assert(display != (Display *) NULL);
9131 assert(window != (Window) NULL);
9132 if (IsEventLogging() != MagickFalse)
9133 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
9134 property=XInternAtom(display,
"_XSETROOT_ID",MagickFalse);
9135 if (property == (Atom) NULL)
9136 ThrowXWindowFatalException(XServerError,
"UnableToCreateProperty",
9138 pixmap=XCreatePixmap(display,window,1,1,1);
9139 if (pixmap == (Pixmap) NULL)
9140 ThrowXWindowFatalException(XServerError,
"UnableToCreateBitmap",
"");
9141 (void) XChangeProperty(display,window,property,XA_PIXMAP,32,PropModeReplace,
9142 (
unsigned char *) &pixmap,1);
9143 (void) XSetCloseDownMode(display,RetainPermanent);
9176static Window XSelectWindow(Display *display,
RectangleInfo *crop_info)
9178#define MinimumCropArea (unsigned int) 9
9207 assert(display != (Display *) NULL);
9209 if (IsEventLogging() != MagickFalse)
9210 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
9211 root_window=XRootWindow(display,XDefaultScreen(display));
9212 context_values.background=XBlackPixel(display,XDefaultScreen(display));
9213 context_values.foreground=XWhitePixel(display,XDefaultScreen(display));
9214 context_values.function=GXinvert;
9215 context_values.plane_mask=
9216 context_values.background ^ context_values.foreground;
9217 context_values.subwindow_mode=IncludeInferiors;
9218 annotate_context=XCreateGC(display,root_window,(
size_t) (GCBackground |
9219 GCForeground | GCFunction | GCSubwindowMode),&context_values);
9220 if (annotate_context == (GC) NULL)
9221 return((Window) NULL);
9225 target_cursor=XMakeCursor(display,root_window,XDefaultColormap(display,
9226 XDefaultScreen(display)),(
char * )
"white",(
char * )
"black");
9227 status=XGrabPointer(display,root_window,MagickFalse,(
unsigned int)
9228 (ButtonPressMask | ButtonReleaseMask | ButtonMotionMask),GrabModeSync,
9229 GrabModeAsync,root_window,target_cursor,CurrentTime);
9230 if (status != GrabSuccess)
9231 ThrowXWindowFatalException(XServerError,
"UnableToGrabMouse",
"");
9236 crop_info->height=0;
9238 target_window=(Window) NULL;
9241 (void) XGrabServer(display);
9244 if ((crop_info->width*crop_info->height) >= MinimumCropArea)
9245 (void) XDrawRectangle(display,root_window,annotate_context,
9246 (
int) crop_info->x,(
int) crop_info->y,(
unsigned int) crop_info->width-1,
9247 (
unsigned int) crop_info->height-1);
9251 (void) XAllowEvents(display,SyncPointer,CurrentTime);
9252 (void) XWindowEvent(display,root_window,ButtonPressMask |
9253 ButtonReleaseMask | ButtonMotionMask,&event);
9254 if ((crop_info->width*crop_info->height) >= MinimumCropArea)
9255 (void) XDrawRectangle(display,root_window,annotate_context,
9256 (
int) crop_info->x,(
int) crop_info->y,(
unsigned int) crop_info->width-1,
9257 (
unsigned int) crop_info->height-1);
9262 target_window=XGetSubwindow(display,event.xbutton.subwindow,
9263 event.xbutton.x,event.xbutton.y);
9264 if (target_window == (Window) NULL)
9265 target_window=root_window;
9266 x_offset=
event.xbutton.x_root;
9267 y_offset=
event.xbutton.y_root;
9268 crop_info->x=(ssize_t) x_offset;
9269 crop_info->y=(ssize_t) y_offset;
9271 crop_info->height=0;
9285 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
9286 crop_info->x=(ssize_t) event.xmotion.x;
9287 crop_info->y=(ssize_t) event.xmotion.y;
9291 if ((
int) crop_info->x < x_offset)
9292 crop_info->width=(size_t) (x_offset-crop_info->x);
9295 crop_info->width=(size_t) (crop_info->x-x_offset);
9296 crop_info->x=(ssize_t) x_offset;
9298 if ((
int) crop_info->y < y_offset)
9299 crop_info->height=(size_t) (y_offset-crop_info->y);
9302 crop_info->height=(size_t) (crop_info->y-y_offset);
9303 crop_info->y=(ssize_t) y_offset;
9309 }
while ((target_window == (Window) NULL) || (presses > 0));
9310 (void) XUngrabServer(display);
9311 (void) XUngrabPointer(display,CurrentTime);
9312 (void) XFreeCursor(display,target_cursor);
9313 (void) XFreeGC(display,annotate_context);
9314 if ((crop_info->width*crop_info->height) < MinimumCropArea)
9317 crop_info->height=0;
9319 if ((crop_info->width != 0) && (crop_info->height != 0))
9320 target_window=root_window;
9321 if (event.xbutton.button == Button3)
9322 target_window=(Window) NULL;
9323 return(target_window);
9355MagickExport
void XSetCursorState(Display *display,XWindows *windows,
9356 const MagickStatusType state)
9358 assert(display != (Display *) NULL);
9359 assert(windows != (XWindows *) NULL);
9360 if (IsEventLogging() != MagickFalse)
9361 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
9364 (void) XCheckDefineCursor(display,windows->image.id,
9365 windows->image.busy_cursor);
9366 (void) XCheckDefineCursor(display,windows->pan.id,
9367 windows->pan.busy_cursor);
9368 (void) XCheckDefineCursor(display,windows->magnify.id,
9369 windows->magnify.busy_cursor);
9370 (void) XCheckDefineCursor(display,windows->command.id,
9371 windows->command.busy_cursor);
9375 (void) XCheckDefineCursor(display,windows->image.id,
9376 windows->image.cursor);
9377 (void) XCheckDefineCursor(display,windows->pan.id,windows->pan.cursor);
9378 (void) XCheckDefineCursor(display,windows->magnify.id,
9379 windows->magnify.cursor);
9380 (void) XCheckDefineCursor(display,windows->command.id,
9381 windows->command.cursor);
9382 (void) XCheckDefineCursor(display,windows->command.id,
9383 windows->widget.cursor);
9384 (void) XWithdrawWindow(display,windows->info.id,windows->info.screen);
9386 windows->info.mapped=MagickFalse;
9412MagickExport XWindows *XSetWindows(XWindows *windows_info)
9415 *windows = (XWindows *) NULL;
9417 if (windows_info != (XWindows *) ~0)
9419 windows=(XWindows *) RelinquishMagickMemory(windows);
9420 windows=windows_info;
9447MagickExport
void XUserPreferences(XResourceInfo *resource_info)
9449#if defined(X11_PREFERENCES_PATH)
9451 cache[MaxTextExtent],
9452 filename[MaxTextExtent],
9453 specifier[MaxTextExtent];
9460 preferences_database;
9465 assert(resource_info != (XResourceInfo *) NULL);
9466 client_name=GetClientName();
9467 preferences_database=XrmGetStringDatabase(
"");
9468 (void) FormatLocaleString(specifier,MaxTextExtent,
"%s.backdrop",client_name);
9469 value=resource_info->backdrop ?
"True" :
"False";
9470 XrmPutStringResource(&preferences_database,specifier,(
char *) value);
9471 (void) FormatLocaleString(specifier,MaxTextExtent,
"%s.colormap",client_name);
9472 value=resource_info->colormap == SharedColormap ?
"Shared" :
"Private";
9473 XrmPutStringResource(&preferences_database,specifier,(
char *) value);
9474 (void) FormatLocaleString(specifier,MaxTextExtent,
"%s.confirmExit",
9476 value=resource_info->confirm_exit ?
"True" :
"False";
9477 XrmPutStringResource(&preferences_database,specifier,(
char *) value);
9478 (void) FormatLocaleString(specifier,MaxTextExtent,
"%s.confirmEdit",
9480 value=resource_info->confirm_edit ?
"True" :
"False";
9481 XrmPutStringResource(&preferences_database,specifier,(
char *) value);
9482 (void) FormatLocaleString(specifier,MaxTextExtent,
"%s.displayWarnings",
9484 value=resource_info->display_warnings ?
"True" :
"False";
9485 XrmPutStringResource(&preferences_database,specifier,(
char *) value);
9486 (void) FormatLocaleString(specifier,MaxTextExtent,
"%s.dither",client_name);
9487 value=resource_info->quantize_info->dither ?
"True" :
"False";
9488 XrmPutStringResource(&preferences_database,specifier,(
char *) value);
9489 (void) FormatLocaleString(specifier,MaxTextExtent,
"%s.gammaCorrect",
9491 value=resource_info->gamma_correct ?
"True" :
"False";
9492 XrmPutStringResource(&preferences_database,specifier,(
char *) value);
9493 (void) FormatLocaleString(specifier,MaxTextExtent,
"%s.undoCache",client_name);
9494 (void) FormatLocaleString(cache,MaxTextExtent,
"%.20g",(
double)
9495 resource_info->undo_cache);
9496 XrmPutStringResource(&preferences_database,specifier,cache);
9497 (void) FormatLocaleString(specifier,MaxTextExtent,
"%s.usePixmap",client_name);
9498 value=resource_info->use_pixmap ?
"True" :
"False";
9499 XrmPutStringResource(&preferences_database,specifier,(
char *) value);
9500 (void) FormatLocaleString(filename,MaxTextExtent,
"%s%src",
9501 X11_PREFERENCES_PATH,client_name);
9502 ExpandFilename(filename);
9503 XrmPutFileDatabase(preferences_database,filename);
9532static const char *XVisualClassName(
const int visual_class)
9534 switch (visual_class)
9536 case StaticGray:
return(
"StaticGray");
9537 case GrayScale:
return(
"GrayScale");
9538 case StaticColor:
return(
"StaticColor");
9539 case PseudoColor:
return(
"PseudoColor");
9540 case TrueColor:
return(
"TrueColor");
9541 case DirectColor:
return(
"DirectColor");
9543 return(
"unknown visual class");
9574MagickExport
void XWarning(
const ExceptionType magick_unused(warning),
9575 const char *reason,
const char *description)
9578 text[MaxTextExtent];
9583 magick_unreferenced(warning);
9585 if (reason == (
char *) NULL)
9587 (void) CopyMagickString(text,reason,MaxTextExtent);
9588 (void) ConcatenateMagickString(text,
":",MaxTextExtent);
9589 windows=XSetWindows((XWindows *) ~0);
9590 XNoticeWidget(windows->display,windows,text,(
char *) description);
9623MagickExport Window XWindowByID(Display *display,
const Window root_window,
9643 assert(display != (Display *) NULL);
9644 assert(root_window != (Window) NULL);
9645 if (IsEventLogging() != MagickFalse)
9646 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
9648 return(XSelectWindow(display,&rectangle_info));
9649 if (root_window ==
id)
9650 return(root_window);
9651 status=XQueryTree(display,root_window,&child,&child,&children,
9653 if (status == False)
9654 return((Window) NULL);
9655 window=(Window) NULL;
9656 for (i=0; i < (int) number_children; i++)
9661 window=XWindowByID(display,children[i],
id);
9662 if (window != (Window) NULL)
9665 if (children != (Window *) NULL)
9666 (void) XFree((
void *) children);
9702MagickExport Window XWindowByName(Display *display,
const Window root_window,
9722 assert(display != (Display *) NULL);
9723 assert(root_window != (Window) NULL);
9724 assert(name != (
char *) NULL);
9725 if (IsEventLogging() != MagickFalse)
9726 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",name);
9727 if (XGetWMName(display,root_window,&window_name) != 0)
9728 if (LocaleCompare((
char *) window_name.value,name) == 0)
9729 return(root_window);
9730 status=XQueryTree(display,root_window,&child,&child,&children,
9732 if (status == False)
9733 return((Window) NULL);
9734 window=(Window) NULL;
9735 for (i=0; i < (int) number_children; i++)
9740 window=XWindowByName(display,children[i],name);
9741 if (window != (Window) NULL)
9744 if (children != (Window *) NULL)
9745 (void) XFree((
void *) children);
9780MagickExport Window XWindowByProperty(Display *display,
const Window window,
9781 const Atom property)
9809 assert(display != (Display *) NULL);
9810 assert(window != (Window) NULL);
9811 assert(property != (Atom) NULL);
9812 if (IsEventLogging() != MagickFalse)
9813 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
9814 status=XQueryTree(display,window,&root,&parent,&children,&number_children);
9815 if (status == False)
9816 return((Window) NULL);
9818 child=(Window) NULL;
9819 for (i=0; (i < number_children) && (child == (Window) NULL); i++)
9821 status=XGetWindowProperty(display,children[i],property,0L,0L,MagickFalse,
9822 (Atom) AnyPropertyType,&type,&format,&number_items,&after,&data);
9824 (void) XFree((
void *) data);
9825 if ((status == Success) && (type != (Atom) NULL))
9828 for (i=0; (i < number_children) && (child == (Window) NULL); i++)
9829 child=XWindowByProperty(display,children[i],property);
9830 if (children != (Window *) NULL)
9831 (void) XFree((
void *) children);
9863 assert(image_info != (
const ImageInfo *) NULL);
9864 assert(image_info->signature == MagickCoreSignature);
9866 if (IsEventLogging() != MagickFalse)
9867 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
9868 image_info->filename);
9870 return((
Image *) NULL);
9903MagickPrivate MagickBooleanType XRenderImage(
Image *image,
9909 (void) ThrowMagickException(&image->exception,GetMagickModule(),
9910 MissingDelegateError,
"DelegateLibrarySupportNotBuiltIn",
"`%s' (X11)",
9912 return(MagickFalse);
9934MagickExport MagickBooleanType XComponentGenesis(
void)
9961MagickExport
void XGetImportInfo(
XImportInfo *ximage_info)
9964 ximage_info->frame=MagickFalse;
9965 ximage_info->borders=MagickFalse;
9966 ximage_info->screen=MagickFalse;
9967 ximage_info->descend=MagickTrue;
9968 ximage_info->silent=MagickFalse;