42#include "MagickCore/studio.h"
43#include "MagickCore/animate.h"
44#include "MagickCore/artifact.h"
45#include "MagickCore/blob.h"
46#include "MagickCore/cache.h"
47#include "MagickCore/client.h"
48#include "MagickCore/color.h"
49#include "MagickCore/color-private.h"
50#include "MagickCore/colormap.h"
51#include "MagickCore/composite.h"
52#include "MagickCore/constitute.h"
53#include "MagickCore/display.h"
54#include "MagickCore/distort.h"
55#include "MagickCore/exception.h"
56#include "MagickCore/exception-private.h"
57#include "MagickCore/geometry.h"
58#include "MagickCore/identify.h"
59#include "MagickCore/image.h"
60#include "MagickCore/image-private.h"
61#include "MagickCore/list.h"
62#include "MagickCore/locale_.h"
63#include "MagickCore/log.h"
64#include "MagickCore/magick.h"
65#include "MagickCore/memory_.h"
66#include "MagickCore/memory-private.h"
67#include "MagickCore/monitor.h"
68#include "MagickCore/nt-base-private.h"
69#include "MagickCore/option.h"
70#include "MagickCore/pixel-accessor.h"
71#include "MagickCore/quantize.h"
72#include "MagickCore/quantum.h"
73#include "MagickCore/quantum-private.h"
74#include "MagickCore/resource_.h"
75#include "MagickCore/resize.h"
76#include "MagickCore/statistic.h"
77#include "MagickCore/string_.h"
78#include "MagickCore/string-private.h"
79#include "MagickCore/transform.h"
80#include "MagickCore/transform-private.h"
81#include "MagickCore/token.h"
82#include "MagickCore/utility.h"
83#include "MagickCore/utility-private.h"
84#include "MagickCore/widget.h"
85#include "MagickCore/widget-private.h"
86#include "MagickCore/xwindow.h"
87#include "MagickCore/xwindow-private.h"
88#include "MagickCore/version.h"
92#if defined(MAGICKCORE_X11_DELEGATE)
93#include <X11/Xproto.h>
94#include <X11/Xlocale.h>
95#if defined(MAGICK_HAVE_POLL)
98#if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
99#if defined(MAGICKCORE_HAVE_MACHINE_PARAM_H)
100# include <machine/param.h>
104#include <X11/extensions/XShm.h>
106#if defined(MAGICKCORE_HAVE_SHAPE)
107#include <X11/extensions/shape.h>
113#define XBlueGamma(color) ClampToQuantum(blue_gamma == 1.0 ? (double) \
114 (color) : ((pow((QuantumScale*(double) (color)),1.0* \
115 MagickSafeReciprocal((double) blue_gamma))*(double) QuantumRange)))
116#define XGammaPacket(map,color) (size_t) (map->base_pixel+ \
117 ((ScaleQuantumToShort(XRedGamma((color)->red))*map->red_max/65535L)* \
119 ((ScaleQuantumToShort(XGreenGamma((color)->green))*map->green_max/65535L)* \
121 ((ScaleQuantumToShort(XBlueGamma((color)->blue))*map->blue_max/65535L)* \
123#define XGammaPixel(image,map,color) (size_t) (map->base_pixel+ \
124 ((ScaleQuantumToShort(XRedGamma(GetPixelRed(image,color)))*map->red_max/65535L)* \
126 ((ScaleQuantumToShort(XGreenGamma(GetPixelGreen(image,color)))*map->green_max/65535L)* \
128 ((ScaleQuantumToShort(XBlueGamma(GetPixelBlue(image,color)))*map->blue_max/65535L)* \
130#define XGreenGamma(color) ClampToQuantum(green_gamma == 1.0 ? (double) \
131 (color) : ((pow((QuantumScale*(double) (color)),1.0* \
132 MagickSafeReciprocal((double) green_gamma))*(double) QuantumRange)))
133#define XRedGamma(color) ClampToQuantum(red_gamma == 1.0 ? (double) \
134 (color) : ((pow((QuantumScale*(double) (color)),1.0* \
135 MagickSafeReciprocal((double) red_gamma))*(double) QuantumRange)))
136#define XStandardPixel(map,color) (size_t) (map->base_pixel+ \
137 (((color)->red*map->red_max/65535L)*map->red_mult)+ \
138 (((color)->green*map->green_max/65535L)*map->green_mult)+ \
139 (((color)->blue*map->blue_max/65535L)*map->blue_mult))
141#define AccentuateModulate ScaleCharToQuantum(80)
142#define HighlightModulate ScaleCharToQuantum(125)
143#define ShadowModulate ScaleCharToQuantum(135)
144#define DepthModulate ScaleCharToQuantum(185)
145#define TroughModulate ScaleCharToQuantum(110)
147#define XLIB_ILLEGAL_ACCESS 1
149#undef NorthWestGravity
151#undef NorthEastGravity
155#undef SouthWestGravity
157#undef SouthEastGravity
164#define XFD_SET fd_set
184typedef struct _DiversityPacket
201static MagickBooleanType
202 xerror_alert = MagickFalse;
208 *XVisualClassName(
const int);
215static MagickBooleanType
216 XMakePixmap(Display *,
const XResourceInfo *,XWindowInfo *);
219 XMakeImageLSBFirst(
const XResourceInfo *,
const XWindowInfo *,Image *,
220 XImage *,XImage *,ExceptionInfo *),
221 XMakeImageMSBFirst(
const XResourceInfo *,
const XWindowInfo *,Image *,
222 XImage *,XImage *,ExceptionInfo *);
225 XSelectWindow(Display *,RectangleInfo *);
247MagickExport
void DestroyXResources(
void)
256 *magick_windows[MaxXWindows];
262 windows=XSetWindows((XWindows *) ~0);
263 if ((windows == (XWindows *) NULL) || (windows->display == (Display *) NULL))
266 magick_windows[number_windows++]=(&windows->context);
267 magick_windows[number_windows++]=(&windows->group_leader);
268 magick_windows[number_windows++]=(&windows->backdrop);
269 magick_windows[number_windows++]=(&windows->icon);
270 magick_windows[number_windows++]=(&windows->image);
271 magick_windows[number_windows++]=(&windows->info);
272 magick_windows[number_windows++]=(&windows->magnify);
273 magick_windows[number_windows++]=(&windows->pan);
274 magick_windows[number_windows++]=(&windows->command);
275 magick_windows[number_windows++]=(&windows->widget);
276 magick_windows[number_windows++]=(&windows->popup);
277 for (i=0; i < (int) number_windows; i++)
279 if (magick_windows[i]->mapped != MagickFalse)
281 (void) XWithdrawWindow(windows->display,magick_windows[i]->id,
282 magick_windows[i]->screen);
283 magick_windows[i]->mapped=MagickFalse;
285 if (magick_windows[i]->name != (
char *) NULL)
286 magick_windows[i]->name=(
char *)
287 RelinquishMagickMemory(magick_windows[i]->name);
288 if (magick_windows[i]->icon_name != (
char *) NULL)
289 magick_windows[i]->icon_name=(
char *)
290 RelinquishMagickMemory(magick_windows[i]->icon_name);
291 if (magick_windows[i]->cursor != (Cursor) NULL)
293 (void) XFreeCursor(windows->display,magick_windows[i]->cursor);
294 magick_windows[i]->cursor=(Cursor) NULL;
296 if (magick_windows[i]->busy_cursor != (Cursor) NULL)
298 (void) XFreeCursor(windows->display,magick_windows[i]->busy_cursor);
299 magick_windows[i]->busy_cursor=(Cursor) NULL;
301 if (magick_windows[i]->highlight_stipple != (Pixmap) NULL)
303 (void) XFreePixmap(windows->display,
304 magick_windows[i]->highlight_stipple);
305 magick_windows[i]->highlight_stipple=(Pixmap) NULL;
307 if (magick_windows[i]->shadow_stipple != (Pixmap) NULL)
309 (void) XFreePixmap(windows->display,magick_windows[i]->shadow_stipple);
310 magick_windows[i]->shadow_stipple=(Pixmap) NULL;
312 if (magick_windows[i]->matte_image != (XImage *) NULL)
314 XDestroyImage(magick_windows[i]->matte_image);
315 magick_windows[i]->matte_image=(XImage *) NULL;
317 if (magick_windows[i]->ximage != (XImage *) NULL)
319 XDestroyImage(magick_windows[i]->ximage);
320 magick_windows[i]->ximage=(XImage *) NULL;
322 if (magick_windows[i]->pixmap != (Pixmap) NULL)
324 (void) XFreePixmap(windows->display,magick_windows[i]->pixmap);
325 magick_windows[i]->pixmap=(Pixmap) NULL;
327 if (magick_windows[i]->
id != (Window) NULL)
329 (void) XDestroyWindow(windows->display,magick_windows[i]->id);
330 magick_windows[i]->id=(Window) NULL;
332 if (magick_windows[i]->destroy != MagickFalse)
334 if (magick_windows[i]->image != (Image *) NULL)
336 magick_windows[i]->image=DestroyImage(magick_windows[i]->image);
337 magick_windows[i]->image=NewImageList();
339 if (magick_windows[i]->matte_pixmap != (Pixmap) NULL)
341 (void) XFreePixmap(windows->display,
342 magick_windows[i]->matte_pixmap);
343 magick_windows[i]->matte_pixmap=(Pixmap) NULL;
346 if (magick_windows[i]->segment_info != (
void *) NULL)
348#if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
352 segment_info=(XShmSegmentInfo *) magick_windows[i]->segment_info;
353 if (segment_info != (XShmSegmentInfo *) NULL)
354 if (segment_info[0].shmid >= 0)
356 if (segment_info[0].shmaddr != NULL)
357 (void) shmdt(segment_info[0].shmaddr);
358 (void) shmctl(segment_info[0].shmid,IPC_RMID,0);
359 segment_info[0].shmaddr=NULL;
360 segment_info[0].shmid=(-1);
363 magick_windows[i]->segment_info=(
void *)
364 RelinquishMagickMemory(magick_windows[i]->segment_info);
367 windows->icon_resources=(XResourceInfo *)
368 RelinquishMagickMemory(windows->icon_resources);
369 if (windows->icon_pixel != (XPixelInfo *) NULL)
371 if (windows->icon_pixel->pixels != (
unsigned long *) NULL)
372 windows->icon_pixel->pixels=(
unsigned long *)
373 RelinquishMagickMemory(windows->icon_pixel->pixels);
374 if (windows->icon_pixel->annotate_context != (GC) NULL)
375 XFreeGC(windows->display,windows->icon_pixel->annotate_context);
376 windows->icon_pixel=(XPixelInfo *)
377 RelinquishMagickMemory(windows->icon_pixel);
379 if (windows->pixel_info != (XPixelInfo *) NULL)
381 if (windows->pixel_info->pixels != (
unsigned long *) NULL)
382 windows->pixel_info->pixels=(
unsigned long *)
383 RelinquishMagickMemory(windows->pixel_info->pixels);
384 if (windows->pixel_info->annotate_context != (GC) NULL)
385 XFreeGC(windows->display,windows->pixel_info->annotate_context);
386 if (windows->pixel_info->widget_context != (GC) NULL)
387 XFreeGC(windows->display,windows->pixel_info->widget_context);
388 if (windows->pixel_info->highlight_context != (GC) NULL)
389 XFreeGC(windows->display,windows->pixel_info->highlight_context);
390 windows->pixel_info=(XPixelInfo *)
391 RelinquishMagickMemory(windows->pixel_info);
393 if (windows->font_info != (XFontStruct *) NULL)
395 XFreeFont(windows->display,windows->font_info);
396 windows->font_info=(XFontStruct *) NULL;
398 if (windows->class_hints != (XClassHint *) NULL)
400 if (windows->class_hints->res_name != (
char *) NULL)
401 windows->class_hints->res_name=DestroyString(
402 windows->class_hints->res_name);
403 if (windows->class_hints->res_class != (
char *) NULL)
404 windows->class_hints->res_class=DestroyString(
405 windows->class_hints->res_class);
406 XFree(windows->class_hints);
407 windows->class_hints=(XClassHint *) NULL;
409 if (windows->manager_hints != (XWMHints *) NULL)
411 XFree(windows->manager_hints);
412 windows->manager_hints=(XWMHints *) NULL;
414 if (windows->map_info != (XStandardColormap *) NULL)
416 XFree(windows->map_info);
417 windows->map_info=(XStandardColormap *) NULL;
419 if (windows->icon_map != (XStandardColormap *) NULL)
421 XFree(windows->icon_map);
422 windows->icon_map=(XStandardColormap *) NULL;
424 if (windows->visual_info != (XVisualInfo *) NULL)
426 XFree(windows->visual_info);
427 windows->visual_info=(XVisualInfo *) NULL;
429 if (windows->icon_visual != (XVisualInfo *) NULL)
431 XFree(windows->icon_visual);
432 windows->icon_visual=(XVisualInfo *) NULL;
469MagickPrivate MagickBooleanType XAnnotateImage(Display *display,
470 const XPixelInfo *pixel,XAnnotateInfo *annotate_info,Image *image,
471 ExceptionInfo *exception)
509 assert(display != (Display *) NULL);
510 assert(pixel != (XPixelInfo *) NULL);
511 assert(annotate_info != (XAnnotateInfo *) NULL);
512 assert(image != (Image *) NULL);
513 if (IsEventLogging() != MagickFalse)
514 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
518 root_window=XRootWindow(display,XDefaultScreen(display));
519 depth=(
unsigned int) XDefaultDepth(display,XDefaultScreen(display));
520 annotate_pixmap=XCreatePixmap(display,root_window,annotate_info->width,
521 annotate_info->height,depth);
522 if (annotate_pixmap == (Pixmap) NULL)
527 context_values.background=0;
528 context_values.foreground=(size_t) (~0);
529 context_values.font=annotate_info->font_info->fid;
530 annotate_context=XCreateGC(display,root_window,(
unsigned long)
531 (GCBackground | GCFont | GCForeground),&context_values);
532 if (annotate_context == (GC) NULL)
537 (void) XDrawImageString(display,annotate_pixmap,annotate_context,0,
538 (
int) annotate_info->font_info->ascent,annotate_info->text,
539 (
int) strlen(annotate_info->text));
540 (void) XFreeGC(display,annotate_context);
544 annotate_ximage=XGetImage(display,annotate_pixmap,0,0,annotate_info->width,
545 annotate_info->height,AllPlanes,ZPixmap);
546 if (annotate_ximage == (XImage *) NULL)
548 (void) XFreePixmap(display,annotate_pixmap);
552 annotate_image=AcquireImage((ImageInfo *) NULL,exception);
553 if (annotate_image == (Image *) NULL)
555 annotate_image->columns=annotate_info->width;
556 annotate_image->rows=annotate_info->height;
560 width=(
unsigned int) image->columns;
561 height=(
unsigned int) image->rows;
564 (void) XParseGeometry(annotate_info->geometry,&x,&y,&width,&height);
565 (void) GetOneVirtualPixelInfo(image,UndefinedVirtualPixelMethod,(ssize_t) x,
566 (ssize_t) y,&annotate_image->background_color,exception);
567 if (annotate_info->stencil == ForegroundStencil)
568 annotate_image->alpha_trait=BlendPixelTrait;
569 annotate_view=AcquireAuthenticCacheView(annotate_image,exception);
570 for (y=0; y < (int) annotate_image->rows; y++)
578 q=GetCacheViewAuthenticPixels(annotate_view,0,(ssize_t) y,
579 annotate_image->columns,1,exception);
580 if (q == (Quantum *) NULL)
582 for (x=0; x < (int) annotate_image->columns; x++)
584 SetPixelAlpha(annotate_image,OpaqueAlpha,q);
585 if (XGetPixel(annotate_ximage,x,y) == 0)
590 SetPixelRed(annotate_image,ScaleShortToQuantum(
591 pixel->box_color.red),q);
592 SetPixelGreen(annotate_image,ScaleShortToQuantum(
593 pixel->box_color.green),q);
594 SetPixelBlue(annotate_image,ScaleShortToQuantum(
595 pixel->box_color.blue),q);
596 if ((annotate_info->stencil == ForegroundStencil) ||
597 (annotate_info->stencil == OpaqueStencil))
598 SetPixelAlpha(annotate_image,TransparentAlpha,q);
605 SetPixelRed(annotate_image,ScaleShortToQuantum(
606 pixel->pen_color.red),q);
607 SetPixelGreen(annotate_image,ScaleShortToQuantum(
608 pixel->pen_color.green),q);
609 SetPixelBlue(annotate_image,ScaleShortToQuantum(
610 pixel->pen_color.blue),q);
611 if (annotate_info->stencil == BackgroundStencil)
612 SetPixelAlpha(annotate_image,TransparentAlpha,q);
614 q+=(ptrdiff_t) GetPixelChannels(annotate_image);
616 if (SyncCacheViewAuthenticPixels(annotate_view,exception) == MagickFalse)
619 annotate_view=DestroyCacheView(annotate_view);
620 XDestroyImage(annotate_ximage);
624 (void) XParseGeometry(annotate_info->geometry,&x,&y,&width,&height);
625 if ((width != (
unsigned int) annotate_image->columns) ||
626 (height != (
unsigned int) annotate_image->rows))
629 image_geometry[MagickPathExtent];
634 (void) FormatLocaleString(image_geometry,MagickPathExtent,
"%ux%u",
636 (void) TransformImage(&annotate_image,(
char *) NULL,image_geometry,
639 if (annotate_info->degrees != 0.0)
653 rotate_image=RotateImage(annotate_image,annotate_info->degrees,exception);
654 if (rotate_image == (Image *) NULL)
656 annotate_image=DestroyImage(annotate_image);
657 annotate_image=rotate_image;
661 normalized_degrees=annotate_info->degrees;
662 while (normalized_degrees < -45.0)
663 normalized_degrees+=360.0;
664 for (rotations=0; normalized_degrees > 45.0; rotations++)
665 normalized_degrees-=90.0;
666 switch (rotations % 4)
676 x-=(int) annotate_image->columns/2;
677 y+=(int) annotate_image->columns/2;
685 x=x-(int) annotate_image->columns;
693 x=x-(int) annotate_image->columns/2;
694 y=y-(int) (annotate_image->rows-(annotate_image->columns/2));
702 (void) XParseGeometry(annotate_info->geometry,&x,&y,&width,&height);
703 alpha_trait=image->alpha_trait;
704 (void) CompositeImage(image,annotate_image,
705 annotate_image->alpha_trait != UndefinedPixelTrait ? OverCompositeOp :
706 CopyCompositeOp,MagickTrue,(ssize_t) x,(ssize_t) y,exception);
707 image->alpha_trait=alpha_trait;
708 annotate_image=DestroyImage(annotate_image);
745static char **FontToList(
char *font)
760 if (font == (
char *) NULL)
761 return((
char **) NULL);
766 for (p=font; *p !=
'\0'; p++)
767 if ((*p ==
':') || (*p ==
';') || (*p ==
','))
769 fontlist=(
char **) AcquireQuantumMemory((
size_t) fonts+1UL,
sizeof(*fontlist));
770 if (fontlist == (
char **) NULL)
772 ThrowXWindowException(ResourceLimitError,
"MemoryAllocationFailed",font);
773 return((
char **) NULL);
776 for (i=0; i < (int) fonts; i++)
778 for (q=p; *q !=
'\0'; q++)
779 if ((*q ==
':') || (*q ==
';') || (*q ==
','))
781 fontlist[i]=(
char *) AcquireQuantumMemory((
size_t) (q-p)+1UL,
782 sizeof(*fontlist[i]));
783 if (fontlist[i] == (
char *) NULL)
785 ThrowXWindowException(ResourceLimitError,
"MemoryAllocationFailed",font);
786 return((
char **) NULL);
788 (void) CopyMagickString(fontlist[i],p,(
size_t) (q-p+1));
791 fontlist[i]=(
char *) NULL;
795MagickPrivate XFontStruct *XBestFont(Display *display,
796 const XResourceInfo *resource_info,
const MagickBooleanType text_font)
801 "-*-helvetica-medium-r-normal--12-*-*-*-*-*-iso8859-1",
802 "-*-arial-medium-r-normal--12-*-*-*-*-*-iso8859-1",
803 "-*-helvetica-medium-r-normal--12-*-*-*-*-*-iso8859-15",
804 "-*-arial-medium-r-normal--12-*-*-*-*-*-iso8859-15",
805 "-*-helvetica-medium-r-normal--12-*-*-*-*-*-*-*",
806 "-*-arial-medium-r-normal--12-*-*-*-*-*-*-*",
813 "-*-courier-medium-r-normal-*-12-*-*-*-*-*-iso8859-1",
814 "-*-courier-medium-r-normal-*-12-*-*-*-*-*-iso8859-15",
815 "-*-fixed-medium-r-normal-*-12-*-*-*-*-*-*-*",
829 font_info=(XFontStruct *) NULL;
830 font_name=resource_info->font;
831 if (text_font != MagickFalse)
832 font_name=resource_info->text_font;
833 if ((font_name != (
char *) NULL) && (*font_name !=
'\0'))
844 fontlist=FontToList(font_name);
845 if (fontlist != (
char **) NULL)
847 for (i=0; fontlist[i] != (
char *) NULL; i++)
849 if (font_info == (XFontStruct *) NULL)
850 font_info=XLoadQueryFont(display,fontlist[i]);
851 fontlist[i]=DestroyString(fontlist[i]);
853 fontlist=(
char **) RelinquishMagickMemory(fontlist);
855 if (font_info == (XFontStruct *) NULL)
856 ThrowXWindowException(XServerError,
"UnableToLoadFont",font_name);
862 if (text_font != MagickFalse)
864 if (XDisplayHeight(display,XDefaultScreen(display)) >= 748)
866 while (*p != (
char *) NULL)
868 if (font_info != (XFontStruct *) NULL)
870 font_info=XLoadQueryFont(display,(
char *) *p);
903MagickPrivate
void XBestIconSize(Display *display,XWindowInfo *window,
929 assert(display != (Display *) NULL);
930 assert(window != (XWindowInfo *) NULL);
931 assert(image != (Image *) NULL);
932 if (IsEventLogging() != MagickFalse)
933 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
934 window->width=MaxIconSize;
935 window->height=MaxIconSize;
936 icon_size=(XIconSize *) NULL;
938 root_window=XRootWindow(display,window->screen);
939 if (XGetIconSizes(display,root_window,&size_list,&number_sizes) != 0)
940 if ((number_sizes > 0) && (size_list != (XIconSize *) NULL))
942 if (icon_size == (XIconSize *) NULL)
947 icon_size=XAllocIconSize();
948 if (icon_size == (XIconSize *) NULL)
950 ThrowXWindowException(ResourceLimitError,
"MemoryAllocationFailed",
954 icon_size->min_width=1;
955 icon_size->max_width=MaxIconSize;
956 icon_size->min_height=1;
957 icon_size->max_height=MaxIconSize;
958 icon_size->width_inc=1;
959 icon_size->height_inc=1;
964 width=(
unsigned int) image->columns;
965 height=(
unsigned int) image->rows;
967 if (window->crop_geometry)
968 (void) XParseGeometry(window->crop_geometry,&i,&i,&width,&height);
972 scale_factor=(double) icon_size->max_width/width;
973 if (scale_factor > ((
double) icon_size->max_height/height))
974 scale_factor=(double) icon_size->max_height/height;
975 icon_width=(
unsigned int) icon_size->min_width;
976 while ((
int) icon_width < icon_size->max_width)
978 if (icon_width >= (
unsigned int) (scale_factor*width+0.5))
980 icon_width+=(
unsigned int) icon_size->width_inc;
982 icon_height=(
unsigned int) icon_size->min_height;
983 while ((
int) icon_height < icon_size->max_height)
985 if (icon_height >= (
unsigned int) (scale_factor*height+0.5))
987 icon_height+=(
unsigned int) icon_size->height_inc;
989 (void) XFree((
void *) icon_size);
990 window->width=icon_width;
991 window->height=icon_height;
1032MagickPrivate
void XBestPixel(Display *display,
const Colormap colormap,
1033 XColor *colors,
unsigned int number_colors,XColor *color)
1057 assert(display != (Display *) NULL);
1058 assert(color != (XColor *) NULL);
1059 if (IsEventLogging() != MagickFalse)
1060 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
1061 status=XAllocColor(display,colormap,color);
1062 if (status != False)
1064 query_server=colors == (XColor *) NULL ? MagickTrue : MagickFalse;
1065 if (query_server != MagickFalse)
1070 colors=(XColor *) AcquireQuantumMemory(number_colors,
sizeof(*colors));
1071 if (colors == (XColor *) NULL)
1073 ThrowXWindowException(ResourceLimitError,
"MemoryAllocationFailed",
1077 for (i=0; i < (int) number_colors; i++)
1078 colors[i].pixel=(
size_t) i;
1079 if (number_colors > 256)
1081 (void) XQueryColors(display,colormap,colors,(
int) number_colors);
1083 min_distance=3.0*((double) QuantumRange+1.0)*((
double)
1086 for (i=0; i < (int) number_colors; i++)
1088 pixel.red=colors[i].red-(double) color->red;
1089 distance=pixel.red*pixel.red;
1090 if (distance > min_distance)
1092 pixel.green=colors[i].green-(double) color->green;
1093 distance+=pixel.green*pixel.green;
1094 if (distance > min_distance)
1096 pixel.blue=colors[i].blue-(double) color->blue;
1097 distance+=pixel.blue*pixel.blue;
1098 if (distance > min_distance)
1100 min_distance=distance;
1101 color->pixel=colors[i].pixel;
1104 (void) XAllocColor(display,colormap,&colors[j]);
1105 if (query_server != MagickFalse)
1106 colors=(XColor *) RelinquishMagickMemory(colors);
1154MagickPrivate XVisualInfo *XBestVisualInfo(Display *display,
1155 XStandardColormap *map_info,XResourceInfo *resource_info)
1157#define MaxStandardColormaps 7
1158#define XVisualColormapSize(visual_info) MagickMin((unsigned long int) (\
1159 (visual_info->klass == TrueColor) || (visual_info->klass == DirectColor) ? \
1160 visual_info->red_mask | visual_info->green_mask | visual_info->blue_mask : \
1161 (unsigned long) visual_info->colormap_size),1UL << visual_info->depth)
1189 assert(display != (Display *) NULL);
1190 assert(map_info != (XStandardColormap *) NULL);
1191 assert(resource_info != (XResourceInfo *) NULL);
1192 if (IsEventLogging() != MagickFalse)
1193 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
1194 map_type=resource_info->map_type;
1195 visual_type=resource_info->visual_type;
1196 visual_mask=VisualScreenMask;
1197 visual_template.screen=XDefaultScreen(display);
1198 visual_template.depth=XDefaultDepth(display,XDefaultScreen(display));
1200 if ((resource_info->immutable != MagickFalse) && (resource_info->colors != 0))
1201 if (resource_info->colors <= (one << (
size_t) visual_template.depth))
1202 visual_mask|=VisualDepthMask;
1203 if (visual_type != (
char *) NULL)
1208 if (LocaleCompare(
"staticgray",visual_type) == 0)
1210 visual_mask|=VisualClassMask;
1211 visual_template.klass=StaticGray;
1214 if (LocaleCompare(
"grayscale",visual_type) == 0)
1216 visual_mask|=VisualClassMask;
1217 visual_template.klass=GrayScale;
1220 if (LocaleCompare(
"staticcolor",visual_type) == 0)
1222 visual_mask|=VisualClassMask;
1223 visual_template.klass=StaticColor;
1226 if (LocaleCompare(
"pseudocolor",visual_type) == 0)
1228 visual_mask|=VisualClassMask;
1229 visual_template.klass=PseudoColor;
1232 if (LocaleCompare(
"truecolor",visual_type) == 0)
1234 visual_mask|=VisualClassMask;
1235 visual_template.klass=TrueColor;
1238 if (LocaleCompare(
"directcolor",visual_type) == 0)
1240 visual_mask|=VisualClassMask;
1241 visual_template.klass=DirectColor;
1244 if (LocaleCompare(
"default",visual_type) == 0)
1246 visual_mask|=VisualIDMask;
1247 visual_template.visualid=XVisualIDFromVisual(
1248 XDefaultVisual(display,XDefaultScreen(display)));
1251 if (isdigit((
int) ((
unsigned char) *visual_type)) != 0)
1253 visual_mask|=VisualIDMask;
1254 visual_template.visualid=(size_t)
1255 strtol(visual_type,(
char **) NULL,0);
1258 ThrowXWindowException(XServerError,
1259 "UnrecognizedVisualSpecifier",visual_type);
1265 visual_list=XGetVisualInfo(display,visual_mask,&visual_template,
1267 visual_mask=VisualScreenMask | VisualIDMask;
1268 if ((number_visuals == 0) || (visual_list == (XVisualInfo *) NULL))
1273 ThrowXWindowException(XServerWarning,
"UnableToGetVisual",visual_type);
1274 visual_template.visualid=XVisualIDFromVisual(XDefaultVisual(display,
1275 XDefaultScreen(display)));
1276 visual_list=XGetVisualInfo(display,visual_mask,&visual_template,
1278 if ((number_visuals == 0) || (visual_list == (XVisualInfo *) NULL))
1279 return((XVisualInfo *) NULL);
1280 ThrowXWindowException(XServerWarning,
"UsingDefaultVisual",
1281 XVisualClassName(visual_list->klass));
1283 resource_info->color_recovery=MagickFalse;
1284 if ((map_info != (XStandardColormap *) NULL) && (map_type != (
char *) NULL))
1290 map_name[MagickPathExtent];
1308 root_window=XRootWindow(display,XDefaultScreen(display));
1311 if (LocaleCompare(map_type,
"list") != 0)
1316 (void) FormatLocaleString((
char *) map_name,MagickPathExtent,
1317 "RGB_%s_MAP",map_type);
1318 LocaleUpper(map_name);
1319 map_property=XInternAtom(display,(
char *) map_name,MagickTrue);
1320 if (map_property != (Atom) NULL)
1321 status=XGetRGBColormaps(display,root_window,&map_list,&number_maps,
1327 *colormap[MaxStandardColormaps]=
1329 "_HP_RGB_SMOOTH_MAP_LIST",
1341 for (i=0; i < MaxStandardColormaps; i++)
1343 map_property=XInternAtom(display,(
char *) colormap[i],MagickTrue);
1344 if (map_property == (Atom) NULL)
1346 status=XGetRGBColormaps(display,root_window,&map_list,&number_maps,
1348 if (status != False)
1351 resource_info->color_recovery=i == 0 ? MagickTrue : MagickFalse;
1353 if (status == False)
1355 ThrowXWindowException(XServerError,
"UnableToGetStandardColormap",
1357 return((XVisualInfo *) NULL);
1362 *map_info=map_list[0];
1363#if !defined(PRE_R4_ICCCM)
1364 visual_template.visualid=XVisualIDFromVisual(visual_list[0].visual);
1365 for (i=0; i < number_maps; i++)
1366 for (j=0; j < number_visuals; j++)
1367 if (map_list[i].visualid ==
1368 XVisualIDFromVisual(visual_list[j].visual))
1370 *map_info=map_list[i];
1371 visual_template.visualid=XVisualIDFromVisual(
1372 visual_list[j].visual);
1375 if (map_info->visualid != visual_template.visualid)
1377 ThrowXWindowException(XServerError,
1378 "UnableToMatchVisualToStandardColormap",map_type);
1379 return((XVisualInfo *) NULL);
1382 if (map_info->colormap == (Colormap) NULL)
1384 ThrowXWindowException(XServerError,
"StandardColormapIsNotInitialized",
1386 return((XVisualInfo *) NULL);
1388 (void) XFree((
void *) map_list);
1392 static const unsigned int
1409 visual_info=visual_list;
1411 for (i=1; i < number_visuals; i++)
1414 if (XVisualColormapSize(p) > XVisualColormapSize(visual_info))
1417 if (XVisualColormapSize(p) == XVisualColormapSize(visual_info))
1418 if (rank[p->klass] > rank[visual_info->klass])
1421 visual_template.visualid=XVisualIDFromVisual(visual_info->visual);
1423 (void) XFree((
void *) visual_list);
1427 visual_info=XGetVisualInfo(display,visual_mask,&visual_template,
1429 if ((number_visuals == 0) || (visual_info == (XVisualInfo *) NULL))
1430 return((XVisualInfo *) NULL);
1431 return(visual_info);
1461MagickPrivate
int XCheckDefineCursor(Display *display,Window window,
1464 assert(display != (Display *) NULL);
1465 if (IsEventLogging() != MagickFalse)
1466 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
1467 if (window == XRootWindow(display,XDefaultScreen(display)))
1469 return(XDefineCursor(display,window,cursor));
1498MagickPrivate
void XCheckRefreshWindows(Display *display,XWindows *windows)
1506 assert(display != (Display *) NULL);
1507 assert(windows != (XWindows *) NULL);
1508 if (IsEventLogging() != MagickFalse)
1509 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
1510 XDelay(display,SuspendTime);
1511 id=windows->command.id;
1512 while (XCheckTypedWindowEvent(display,
id,Expose,&event) != MagickFalse)
1513 (void) XCommandWidget(display,windows,(
char const **) NULL,&event);
1514 id=windows->image.id;
1515 while (XCheckTypedWindowEvent(display,
id,Expose,&event) != MagickFalse)
1516 XRefreshWindow(display,&windows->image,&event);
1517 XDelay(display,SuspendTime << 1);
1518 id=windows->command.id;
1519 while (XCheckTypedWindowEvent(display,
id,Expose,&event) != MagickFalse)
1520 (void) XCommandWidget(display,windows,(
char const **) NULL,&event);
1521 id=windows->image.id;
1522 while (XCheckTypedWindowEvent(display,
id,Expose,&event) != MagickFalse)
1523 XRefreshWindow(display,&windows->image,&event);
1558MagickPrivate
void XClientMessage(Display *display,
const Window window,
1559 const Atom protocol,
const Atom reason,
const Time timestamp)
1564 assert(display != (Display *) NULL);
1565 (void) memset(&client_event,0,
sizeof(client_event));
1566 client_event.type=ClientMessage;
1567 client_event.window=window;
1568 client_event.message_type=protocol;
1569 client_event.format=32;
1570 client_event.data.l[0]=(long) reason;
1571 client_event.data.l[1]=(long) timestamp;
1572 (void) XSendEvent(display,window,MagickFalse,NoEventMask,(XEvent *)
1607static Window XClientWindow(Display *display,Window target_window)
1629 assert(display != (Display *) NULL);
1630 if (IsEventLogging() != MagickFalse)
1631 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
1632 state=XInternAtom(display,
"WM_STATE",MagickTrue);
1633 if (state == (Atom) NULL)
1634 return(target_window);
1636 status=XGetWindowProperty(display,target_window,state,0L,0L,MagickFalse,
1637 (Atom) AnyPropertyType,&type,&format,&number_items,&after,&data);
1638 if ((status == Success) && (type != (Atom) NULL))
1639 return(target_window);
1640 client_window=XWindowByProperty(display,target_window,state);
1641 if (client_window == (Window) NULL)
1642 return(target_window);
1643 return(client_window);
1664MagickPrivate
void XComponentTerminus(
void)
1666 DestroyXResources();
1702MagickPrivate
void XConfigureImageColormap(Display *display,
1703 XResourceInfo *resource_info,XWindows *windows,Image *image,
1704 ExceptionInfo *exception)
1712 XSetCursorState(display,windows,MagickTrue);
1713 XCheckRefreshWindows(display,windows);
1714 XMakeStandardColormap(display,windows->visual_info,resource_info,image,
1715 windows->map_info,windows->pixel_info,exception);
1716 colormap=windows->map_info->colormap;
1717 (void) XSetWindowColormap(display,windows->image.id,colormap);
1718 (void) XSetWindowColormap(display,windows->command.id,colormap);
1719 (void) XSetWindowColormap(display,windows->widget.id,colormap);
1720 if (windows->magnify.mapped != MagickFalse)
1721 (void) XSetWindowColormap(display,windows->magnify.id,colormap);
1722 if (windows->pan.mapped != MagickFalse)
1723 (void) XSetWindowColormap(display,windows->pan.id,colormap);
1724 XSetCursorState(display,windows,MagickFalse);
1725 XClientMessage(display,windows->image.id,windows->im_protocols,
1726 windows->im_update_colormap,CurrentTime);
1755MagickPrivate
void XConstrainWindowPosition(Display *display,
1756 XWindowInfo *window_info)
1761 assert(display != (Display *) NULL);
1762 assert(window_info != (XWindowInfo *) NULL);
1763 if (IsEventLogging() != MagickFalse)
1764 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
1765 limit=XDisplayWidth(display,window_info->screen)-(int) window_info->width;
1766 if (window_info->x < 0)
1769 if (window_info->x > (
int) limit)
1770 window_info->x=(int) limit;
1771 limit=XDisplayHeight(display,window_info->screen)-(int) window_info->height;
1772 if (window_info->y < 0)
1775 if (window_info->y > limit)
1776 window_info->y=limit;
1806MagickPrivate
void XDelay(Display *display,
const size_t milliseconds)
1808 assert(display != (Display *) NULL);
1809 (void) XFlush(display);
1810 MagickDelay(milliseconds);
1836MagickExport
void XDestroyResourceInfo(XResourceInfo *resource_info)
1838 if (resource_info->image_geometry != (
char *) NULL)
1839 resource_info->image_geometry=(
char *)
1840 RelinquishMagickMemory(resource_info->image_geometry);
1841 if (resource_info->quantize_info != (QuantizeInfo *) NULL)
1842 resource_info->quantize_info=DestroyQuantizeInfo(
1843 resource_info->quantize_info);
1844 if (resource_info->client_name != (
char *) NULL)
1845 resource_info->client_name=(
char *)
1846 RelinquishMagickMemory(resource_info->client_name);
1847 if (resource_info->name != (
char *) NULL)
1848 resource_info->name=DestroyString(resource_info->name);
1849 (void) memset(resource_info,0,
sizeof(*resource_info));
1850 (void) XSetWindows((XWindows *) NULL);
1879MagickPrivate
void XDestroyWindowColors(Display *display,Window window)
1901 assert(display != (Display *) NULL);
1902 if (IsEventLogging() != MagickFalse)
1903 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
1904 property=XInternAtom(display,
"_XSETROOT_ID",MagickFalse);
1905 if (property == (Atom) NULL)
1907 ThrowXWindowException(XServerError,
"UnableToCreateProperty",
1911 status=XGetWindowProperty(display,window,property,0L,1L,MagickTrue,
1912 (Atom) AnyPropertyType,&type,&format,&length,&after,&data);
1913 if (status != Success)
1915 if ((type == XA_PIXMAP) && (format == 32) && (length == 1) && (after == 0))
1917 (void) XKillClient(display,(XID) (*((Pixmap *) data)));
1918 (void) XDeleteProperty(display,window,property);
1921 (void) XFree((
void *) data);
1959MagickPrivate
void XDisplayImageInfo(Display *display,
1960 const XResourceInfo *resource_info,XWindows *windows,Image *undo_image,
1961 Image *image,ExceptionInfo *exception)
1964 filename[MagickPathExtent],
1989 assert(display != (Display *) NULL);
1990 assert(resource_info != (XResourceInfo *) NULL);
1991 assert(windows != (XWindows *) NULL);
1992 assert(image != (Image *) NULL);
1993 if (IsEventLogging() != MagickFalse)
1994 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1996 unique_file=AcquireUniqueFileResource(filename);
1997 if (unique_file != -1)
1998 file=fdopen(unique_file,
"w");
1999 if ((unique_file == -1) || (file == (FILE *) NULL))
2001 XNoticeWidget(display,windows,
"Unable to display image info",filename);
2004 if (resource_info->gamma_correct != MagickFalse)
2005 if (resource_info->display_gamma != (
char *) NULL)
2006 (void) FormatLocaleFile(file,
"Display\n gamma: %s\n\n",
2007 resource_info->display_gamma);
2011 (void) FormatLocaleFile(file,
"X\n visual: %s\n",
2012 XVisualClassName((
int) windows->image.storage_class));
2013 (void) FormatLocaleFile(file,
" depth: %d\n",windows->image.ximage->depth);
2014 if (windows->visual_info->colormap_size != 0)
2015 (void) FormatLocaleFile(file,
" colormap size: %d\n",
2016 windows->visual_info->colormap_size);
2017 if (resource_info->colormap== SharedColormap)
2018 (void) FormatLocaleFile(file,
" colormap type: Shared\n");
2020 (
void) FormatLocaleFile(file,
" colormap type: Private\n");
2021 (void) FormatLocaleFile(file,
" geometry: %dx%d\n",
2022 windows->image.ximage->width,windows->image.ximage->height);
2023 if (windows->image.crop_geometry != (
char *) NULL)
2024 (void) FormatLocaleFile(file,
" crop geometry: %s\n",
2025 windows->image.crop_geometry);
2026 if (windows->image.pixmap == (Pixmap) NULL)
2027 (void) FormatLocaleFile(file,
" type: X Image\n");
2029 (
void) FormatLocaleFile(file,
" type: Pixmap\n");
2030 if (windows->image.shape != MagickFalse)
2031 (void) FormatLocaleFile(file,
" non-rectangular shape: True\n");
2033 (
void) FormatLocaleFile(file,
" non-rectangular shape: False\n");
2034 if (windows->image.shared_memory != MagickFalse)
2035 (void) FormatLocaleFile(file,
" shared memory: True\n");
2037 (
void) FormatLocaleFile(file,
" shared memory: False\n");
2038 (void) FormatLocaleFile(file,
"\n");
2039 if (resource_info->font != (
char *) NULL)
2040 (void) FormatLocaleFile(file,
"Font: %s\n\n",resource_info->font);
2041 if (resource_info->text_font != (
char *) NULL)
2042 (void) FormatLocaleFile(file,
"Text font: %s\n\n",resource_info->text_font);
2047 for (levels=0; undo_image != (Image *) NULL; levels++)
2049 number_pixels=undo_image->list->columns*undo_image->list->rows;
2050 bytes+=(ssize_t) (number_pixels*
sizeof(PixelInfo));
2051 undo_image=GetPreviousImageInList(undo_image);
2053 (void) FormatLocaleFile(file,
"Undo Edit Cache\n levels: %u\n",levels);
2054 (void) FormatLocaleFile(file,
" bytes: %.17gmb\n",(
double)
2055 ((bytes+(1 << 19)) >> 20));
2056 (void) FormatLocaleFile(file,
" limit: %.17gmb\n\n",(
double)
2057 resource_info->undo_cache);
2061 (void) IdentifyImage(image,file,MagickTrue,exception);
2062 (void) fclose(file);
2063 text=FileToString(filename,~0UL,exception);
2064 (void) RelinquishUniqueFileResource(filename);
2065 if (text == (
char *) NULL)
2067 XNoticeWidget(display,windows,
"MemoryAllocationFailed",
2068 "UnableToDisplayImageInfo");
2071 textlist=StringToList(text);
2072 if (textlist != (
char **) NULL)
2075 title[MagickPathExtent];
2080 (void) XWithdrawWindow(display,windows->info.id,windows->info.screen);
2081 (void) FormatLocaleString(title,MagickPathExtent,
"Image Info: %s",
2083 XTextViewWidget(display,resource_info,windows,MagickTrue,title,
2084 (
char const **) textlist);
2085 for (i=0; textlist[i] != (
char *) NULL; i++)
2086 textlist[i]=DestroyString(textlist[i]);
2087 textlist=(
char **) RelinquishMagickMemory(textlist);
2089 text=DestroyString(text);
2122static void XDitherImage(Image *image,XImage *ximage,ExceptionInfo *exception)
2124 static const short int
2127 {-16, 4, -1, 11,-14, 6, -3, 9,-15, 5, -2, 10,-13, 7, -4, 8},
2128 { 15, -5, 0,-12, 13, -7, 2,-10, 14, -6, 1,-11, 12, -8, 3, -9}
2130 dither_green[2][16]=
2132 { 11,-15, 7, -3, 8,-14, 4, -2, 10,-16, 6, -4, 9,-13, 5, -1},
2133 {-12, 14, -8, 2, -9, 13, -5, 1,-11, 15, -7, 3,-10, 12, -6, 0}
2137 { -3, 9,-13, 7, -1, 11,-15, 5, -4, 8,-14, 6, -2, 10,-16, 4},
2138 { 2,-10, 12, -8, 0,-12, 14, -6, 3, -9, 13, -7, 1,-11, 15, -5}
2174 for (i=0; i < 2; i++)
2175 for (j=0; j < 16; j++)
2177 red_map[i][j]=(
unsigned char *) AcquireCriticalMemory(256UL*
2179 green_map[i][j]=(
unsigned char *) AcquireCriticalMemory(256UL*
2180 sizeof(*green_map));
2181 blue_map[i][j]=(
unsigned char *) AcquireCriticalMemory(256UL*
2187 for (i=0; i < 2; i++)
2188 for (j=0; j < 16; j++)
2189 for (x=0; x < 256; x++)
2194 value+=dither_red[i][j];
2195 red_map[i][j][x]=(
unsigned char)
2196 ((value < 0) ? 0 : (value > 255) ? 255 : value);
2200 value+=dither_green[i][j];
2201 green_map[i][j][x]=(
unsigned char)
2202 ((value < 0) ? 0 : (value > 255) ? 255 : value);
2206 value+=(int) (dither_blue[i][j] << 1);
2207 blue_map[i][j][x]=(
unsigned char)
2208 ((value < 0) ? 0 : (value > 255) ? 255 : value);
2213 scanline_pad=(
unsigned int) (ximage->bytes_per_line-(
int)
2214 ((ximage->width*ximage->bits_per_pixel) >> 3));
2218 image_view=AcquireVirtualCacheView(image,exception);
2219 for (y=0; y < (int) image->rows; y++)
2221 p=GetCacheViewVirtualPixels(image_view,0,(ssize_t) y,image->columns,1,
2223 if (p == (
const Quantum *) NULL)
2225 for (x=0; x < (int) image->columns; x++)
2227 color.red=(double) ClampToQuantum((
double) (red_map[i][j][
2228 (
int) ScaleQuantumToChar(GetPixelRed(image,p))] << 8));
2229 color.green=(double) ClampToQuantum((
double) (green_map[i][j][
2230 (
int) ScaleQuantumToChar(GetPixelGreen(image,p))] << 8));
2231 color.blue=(double) ClampToQuantum((
double) (blue_map[i][j][
2232 (
int) ScaleQuantumToChar(GetPixelBlue(image,p))] << 8));
2233 pixel=(size_t) (((
size_t) color.red & 0xe0) |
2234 (((
size_t) color.green & 0xe0) >> 3) |
2235 (((
size_t) color.blue & 0xc0) >> 6));
2237 p+=(ptrdiff_t) GetPixelChannels(image);
2242 q+=(ptrdiff_t) scanline_pad;
2247 image_view=DestroyCacheView(image_view);
2251 for (i=0; i < 2; i++)
2252 for (j=0; j < 16; j++)
2254 green_map[i][j]=(
unsigned char *) RelinquishMagickMemory(green_map[i][j]);
2255 blue_map[i][j]=(
unsigned char *) RelinquishMagickMemory(blue_map[i][j]);
2256 red_map[i][j]=(
unsigned char *) RelinquishMagickMemory(red_map[i][j]);
2292MagickPrivate MagickBooleanType XDrawImage(Display *display,
2293 const XPixelInfo *pixel,XDrawInfo *draw_info,Image *image,
2294 ExceptionInfo *exception)
2332 assert(display != (Display *) NULL);
2333 assert(pixel != (XPixelInfo *) NULL);
2334 assert(draw_info != (XDrawInfo *) NULL);
2335 assert(image != (Image *) NULL);
2336 if (IsEventLogging() != MagickFalse)
2337 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
2341 root_window=XRootWindow(display,XDefaultScreen(display));
2342 depth=(
unsigned int) XDefaultDepth(display,XDefaultScreen(display));
2343 draw_pixmap=XCreatePixmap(display,root_window,draw_info->width,
2344 draw_info->height,depth);
2345 if (draw_pixmap == (Pixmap) NULL)
2346 return(MagickFalse);
2350 context_values.background=(size_t) (~0);
2351 context_values.foreground=0;
2352 context_values.line_width=(int) draw_info->line_width;
2353 draw_context=XCreateGC(display,root_window,(
size_t)
2354 (GCBackground | GCForeground | GCLineWidth),&context_values);
2355 if (draw_context == (GC) NULL)
2356 return(MagickFalse);
2360 (void) XFillRectangle(display,draw_pixmap,draw_context,0,0,draw_info->width,
2365 (void) XSetBackground(display,draw_context,0);
2366 (void) XSetForeground(display,draw_context,(
size_t) (~0));
2367 if (draw_info->stipple != (Pixmap) NULL)
2369 (void) XSetFillStyle(display,draw_context,FillOpaqueStippled);
2370 (void) XSetStipple(display,draw_context,draw_info->stipple);
2372 switch (draw_info->element)
2377 (void) XDrawLines(display,draw_pixmap,draw_context,
2378 draw_info->coordinate_info,(
int) draw_info->number_coordinates,
2384 (void) XDrawLine(display,draw_pixmap,draw_context,draw_info->line_info.x1,
2385 draw_info->line_info.y1,draw_info->line_info.x2,
2386 draw_info->line_info.y2);
2389 case RectangleElement:
2391 (void) XDrawRectangle(display,draw_pixmap,draw_context,
2392 (
int) draw_info->rectangle_info.x,(
int) draw_info->rectangle_info.y,
2393 (
unsigned int) draw_info->rectangle_info.width,
2394 (
unsigned int) draw_info->rectangle_info.height);
2397 case FillRectangleElement:
2399 (void) XFillRectangle(display,draw_pixmap,draw_context,
2400 (
int) draw_info->rectangle_info.x,(
int) draw_info->rectangle_info.y,
2401 (
unsigned int) draw_info->rectangle_info.width,
2402 (
unsigned int) draw_info->rectangle_info.height);
2406 case EllipseElement:
2408 (void) XDrawArc(display,draw_pixmap,draw_context,
2409 (
int) draw_info->rectangle_info.x,(
int) draw_info->rectangle_info.y,
2410 (
unsigned int) draw_info->rectangle_info.width,
2411 (
unsigned int) draw_info->rectangle_info.height,0,360*64);
2414 case FillCircleElement:
2415 case FillEllipseElement:
2417 (void) XFillArc(display,draw_pixmap,draw_context,
2418 (
int) draw_info->rectangle_info.x,(
int) draw_info->rectangle_info.y,
2419 (
unsigned int) draw_info->rectangle_info.width,
2420 (
unsigned int) draw_info->rectangle_info.height,0,360*64);
2423 case PolygonElement:
2428 coordinate_info=draw_info->coordinate_info;
2429 (void) XDrawLines(display,draw_pixmap,draw_context,coordinate_info,
2430 (
int) draw_info->number_coordinates,CoordModeOrigin);
2431 (void) XDrawLine(display,draw_pixmap,draw_context,
2432 coordinate_info[draw_info->number_coordinates-1].x,
2433 coordinate_info[draw_info->number_coordinates-1].y,
2434 coordinate_info[0].x,coordinate_info[0].y);
2437 case FillPolygonElement:
2439 (void) XFillPolygon(display,draw_pixmap,draw_context,
2440 draw_info->coordinate_info,(
int) draw_info->number_coordinates,Complex,
2445 (void) XFreeGC(display,draw_context);
2449 draw_ximage=XGetImage(display,draw_pixmap,0,0,draw_info->width,
2450 draw_info->height,AllPlanes,ZPixmap);
2451 if (draw_ximage == (XImage *) NULL)
2452 return(MagickFalse);
2453 (void) XFreePixmap(display,draw_pixmap);
2457 draw_image=AcquireImage((ImageInfo *) NULL,exception);
2458 if (draw_image == (Image *) NULL)
2459 return(MagickFalse);
2460 draw_image->columns=draw_info->width;
2461 draw_image->rows=draw_info->height;
2465 width=(
unsigned int) image->columns;
2466 height=(
unsigned int) image->rows;
2469 (void) XParseGeometry(draw_info->geometry,&x,&y,&width,&height);
2470 (void) GetOneVirtualPixelInfo(image,UndefinedVirtualPixelMethod,(ssize_t) x,
2471 (ssize_t) y,&draw_image->background_color,exception);
2472 if (SetImageStorageClass(draw_image,DirectClass,exception) == MagickFalse)
2473 return(MagickFalse);
2474 draw_image->alpha_trait=BlendPixelTrait;
2475 draw_view=AcquireAuthenticCacheView(draw_image,exception);
2476 for (y=0; y < (int) draw_image->rows; y++)
2484 q=QueueCacheViewAuthenticPixels(draw_view,0,(ssize_t) y,draw_image->columns,
2486 if (q == (Quantum *) NULL)
2488 for (x=0; x < (int) draw_image->columns; x++)
2490 if (XGetPixel(draw_ximage,x,y) == 0)
2495 SetPixelViaPixelInfo(draw_image,&draw_image->background_color,q);
2496 SetPixelAlpha(draw_image,(Quantum) (draw_info->stencil ==
2497 OpaqueStencil ? TransparentAlpha : OpaqueAlpha),q);
2504 SetPixelRed(draw_image,ScaleShortToQuantum(
2505 pixel->pen_color.red),q);
2506 SetPixelGreen(draw_image,ScaleShortToQuantum(
2507 pixel->pen_color.green),q);
2508 SetPixelBlue(draw_image,ScaleShortToQuantum(
2509 pixel->pen_color.blue),q);
2510 SetPixelAlpha(draw_image,(Quantum) (draw_info->stencil ==
2511 OpaqueStencil ? OpaqueAlpha : TransparentAlpha),q);
2513 q+=(ptrdiff_t) GetPixelChannels(draw_image);
2515 if (SyncCacheViewAuthenticPixels(draw_view,exception) == MagickFalse)
2518 draw_view=DestroyCacheView(draw_view);
2519 XDestroyImage(draw_ximage);
2523 (void) XParseGeometry(draw_info->geometry,&x,&y,&width,&height);
2524 if ((width != (
unsigned int) draw_image->columns) ||
2525 (height != (
unsigned int) draw_image->rows))
2528 image_geometry[MagickPathExtent];
2533 (void) FormatLocaleString(image_geometry,MagickPathExtent,
"%ux%u",
2535 (void) TransformImage(&draw_image,(
char *) NULL,image_geometry,
2538 if (draw_info->degrees != 0.0)
2552 rotate_image=RotateImage(draw_image,draw_info->degrees,exception);
2553 if (rotate_image == (Image *) NULL)
2554 return(MagickFalse);
2555 draw_image=DestroyImage(draw_image);
2556 draw_image=rotate_image;
2560 normalized_degrees=draw_info->degrees;
2561 while (normalized_degrees < -45.0)
2562 normalized_degrees+=360.0;
2563 for (rotations=0; normalized_degrees > 45.0; rotations++)
2564 normalized_degrees-=90.0;
2565 switch (rotations % 4)
2575 x=x-(int) draw_image->columns/2;
2576 y=y+(int) draw_image->columns/2;
2584 x=x-(int) draw_image->columns;
2592 x=x-(int) draw_image->columns/2;
2593 y=y-(int) (draw_image->rows-(draw_image->columns/2));
2601 draw_view=AcquireAuthenticCacheView(draw_image,exception);
2602 for (y=0; y < (int) draw_image->rows; y++)
2610 q=GetCacheViewAuthenticPixels(draw_view,0,(ssize_t) y,draw_image->columns,1,
2612 if (q == (Quantum *) NULL)
2614 for (x=0; x < (int) draw_image->columns; x++)
2616 if (GetPixelAlpha(image,q) != TransparentAlpha)
2617 SetPixelAlpha(draw_image,OpaqueAlpha,q);
2618 q+=(ptrdiff_t) GetPixelChannels(draw_image);
2620 if (SyncCacheViewAuthenticPixels(draw_view,exception) == MagickFalse)
2623 draw_view=DestroyCacheView(draw_view);
2624 (void) XParseGeometry(draw_info->geometry,&x,&y,&width,&height);
2625 if (draw_info->stencil == TransparentStencil)
2626 (void) CompositeImage(image,draw_image,CopyAlphaCompositeOp,MagickTrue,
2627 (ssize_t) x,(ssize_t) y,exception);
2630 alpha_trait=image->alpha_trait;
2631 (void) CompositeImage(image,draw_image,OverCompositeOp,MagickTrue,
2632 (ssize_t) x,(ssize_t) y,exception);
2633 image->alpha_trait=alpha_trait;
2635 draw_image=DestroyImage(draw_image);
2668#if defined(__cplusplus) || defined(c_plusplus)
2672MagickExport
int XError(Display *display,XErrorEvent *error)
2674 assert(display != (Display *) NULL);
2675 assert(error != (XErrorEvent *) NULL);
2676 if (IsEventLogging() != MagickFalse)
2677 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
2678 xerror_alert=MagickTrue;
2679 switch (error->request_code)
2683 if ((
int) error->error_code == BadDrawable)
2684 return(MagickFalse);
2687 case X_GetWindowAttributes:
2690 if ((
int) error->error_code == BadWindow)
2691 return(MagickFalse);
2696 if ((
int) error->error_code == BadValue)
2697 return(MagickFalse);
2704#if defined(__cplusplus) || defined(c_plusplus)
2748MagickPrivate
void XFreeResources(Display *display,XVisualInfo *visual_info,
2749 XStandardColormap *map_info,XPixelInfo *pixel,XFontStruct *font_info,
2750 XResourceInfo *resource_info,XWindowInfo *window_info)
2752 assert(display != (Display *) NULL);
2753 assert(resource_info != (XResourceInfo *) NULL);
2754 if (IsEventLogging() != MagickFalse)
2755 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
2756 if (window_info != (XWindowInfo *) NULL)
2761 if (window_info->ximage != (XImage *) NULL)
2762 XDestroyImage(window_info->ximage);
2763 if (window_info->id != (Window) NULL)
2768 if (window_info->id != XRootWindow(display,visual_info->screen))
2769 (void) XDestroyWindow(display,window_info->id);
2770 if (window_info->annotate_context != (GC) NULL)
2771 (void) XFreeGC(display,window_info->annotate_context);
2772 if (window_info->highlight_context != (GC) NULL)
2773 (void) XFreeGC(display,window_info->highlight_context);
2774 if (window_info->widget_context != (GC) NULL)
2775 (void) XFreeGC(display,window_info->widget_context);
2776 if (window_info->cursor != (Cursor) NULL)
2777 (void) XFreeCursor(display,window_info->cursor);
2778 window_info->cursor=(Cursor) NULL;
2779 if (window_info->busy_cursor != (Cursor) NULL)
2780 (void) XFreeCursor(display,window_info->busy_cursor);
2781 window_info->busy_cursor=(Cursor) NULL;
2787 if (font_info != (XFontStruct *) NULL)
2789 (void) XFreeFont(display,font_info);
2790 font_info=(XFontStruct *) NULL;
2792 if (map_info != (XStandardColormap *) NULL)
2797 if (resource_info->map_type == (
char *) NULL)
2798 (void) XFreeStandardColormap(display,visual_info,map_info,pixel);
2799 (void) XFree((
void *) map_info);
2804 if (visual_info != (XVisualInfo *) NULL)
2805 (void) XFree((
void *) visual_info);
2806 if (resource_info->close_server != MagickFalse)
2807 (void) XCloseDisplay(display);
2843MagickPrivate
void XFreeStandardColormap(Display *display,
2844 const XVisualInfo *visual_info,XStandardColormap *map_info,XPixelInfo *pixel)
2849 assert(display != (Display *) NULL);
2850 assert(visual_info != (XVisualInfo *) NULL);
2851 assert(map_info != (XStandardColormap *) NULL);
2852 if (IsEventLogging() != MagickFalse)
2853 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
2854 (void) XFlush(display);
2855 if (map_info->colormap != (Colormap) NULL)
2857 if (map_info->colormap != XDefaultColormap(display,visual_info->screen))
2858 (void) XFreeColormap(display,map_info->colormap);
2860 if (pixel != (XPixelInfo *) NULL)
2861 if ((visual_info->klass != TrueColor) &&
2862 (visual_info->klass != DirectColor))
2863 (void) XFreeColors(display,map_info->colormap,pixel->pixels,
2864 (
int) pixel->colors,0);
2866 map_info->colormap=(Colormap) NULL;
2867 if (pixel != (XPixelInfo *) NULL)
2869 if (pixel->pixels != (
unsigned long *) NULL)
2870 pixel->pixels=(
unsigned long *) RelinquishMagickMemory(pixel->pixels);
2871 pixel->pixels=(
unsigned long *) NULL;
2897MagickPrivate
void XGetAnnotateInfo(XAnnotateInfo *annotate_info)
2902 assert(annotate_info != (XAnnotateInfo *) NULL);
2903 if (IsEventLogging() != MagickFalse)
2904 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
2907 annotate_info->width=0;
2908 annotate_info->height=0;
2909 annotate_info->stencil=ForegroundStencil;
2910 annotate_info->degrees=0.0;
2911 annotate_info->font_info=(XFontStruct *) NULL;
2912 annotate_info->text=(
char *) NULL;
2913 *annotate_info->geometry=
'\0';
2914 annotate_info->previous=(XAnnotateInfo *) NULL;
2915 annotate_info->next=(XAnnotateInfo *) NULL;
2916 (void) XSupportsLocale();
2917 (void) XSetLocaleModifiers(
"");
2948MagickPrivate
void XGetMapInfo(
const XVisualInfo *visual_info,
2949 const Colormap colormap,XStandardColormap *map_info)
2954 assert(visual_info != (XVisualInfo *) NULL);
2955 assert(map_info != (XStandardColormap *) NULL);
2956 if (IsEventLogging() != MagickFalse)
2957 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
2958 map_info->colormap=colormap;
2959 map_info->red_max=visual_info->red_mask;
2960 map_info->red_mult=(size_t) (map_info->red_max != 0 ? 1 : 0);
2961 if (map_info->red_max != 0)
2962 while ((map_info->red_max & 0x01) == 0)
2964 map_info->red_max>>=1;
2965 map_info->red_mult<<=1;
2967 map_info->green_max=visual_info->green_mask;
2968 map_info->green_mult=(size_t) (map_info->green_max != 0 ? 1 : 0);
2969 if (map_info->green_max != 0)
2970 while ((map_info->green_max & 0x01) == 0)
2972 map_info->green_max>>=1;
2973 map_info->green_mult<<=1;
2975 map_info->blue_max=visual_info->blue_mask;
2976 map_info->blue_mult=(size_t) (map_info->blue_max != 0 ? 1 : 0);
2977 if (map_info->blue_max != 0)
2978 while ((map_info->blue_max & 0x01) == 0)
2980 map_info->blue_max>>=1;
2981 map_info->blue_mult<<=1;
2983 map_info->base_pixel=0;
3024MagickPrivate
void XGetPixelInfo(Display *display,
3025 const XVisualInfo *visual_info,
const XStandardColormap *map_info,
3026 const XResourceInfo *resource_info,Image *image,XPixelInfo *pixel)
3029 *PenColors[MaxNumberPens]=
3059 assert(display != (Display *) NULL);
3060 assert(visual_info != (XVisualInfo *) NULL);
3061 assert(map_info != (XStandardColormap *) NULL);
3062 assert(resource_info != (XResourceInfo *) NULL);
3063 assert(pixel != (XPixelInfo *) NULL);
3064 if (IsEventLogging() != MagickFalse)
3065 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
3067 if (image != (Image *) NULL)
3068 if (image->storage_class == PseudoClass)
3069 pixel->colors=(ssize_t) image->colors;
3070 packets=(
unsigned int)
3071 MagickMax((
int) pixel->colors,visual_info->colormap_size)+MaxNumberPens;
3072 if (pixel->pixels != (
unsigned long *) NULL)
3073 pixel->pixels=(
unsigned long *) RelinquishMagickMemory(pixel->pixels);
3074 pixel->pixels=(
unsigned long *) AcquireQuantumMemory(packets,
3075 sizeof(*pixel->pixels));
3076 if (pixel->pixels == (
unsigned long *) NULL)
3077 ThrowXWindowFatalException(ResourceLimitFatalError,
"UnableToGetPixelInfo",
3082 colormap=map_info->colormap;
3083 (void) XParseColor(display,colormap,(
char *) ForegroundColor,
3084 &pixel->foreground_color);
3085 status=XParseColor(display,colormap,resource_info->foreground_color,
3086 &pixel->foreground_color);
3087 if (status == False)
3088 ThrowXWindowException(XServerError,
"ColorIsNotKnownToServer",
3089 resource_info->foreground_color);
3090 pixel->foreground_color.pixel=
3091 XStandardPixel(map_info,&pixel->foreground_color);
3092 pixel->foreground_color.flags=(char) (DoRed | DoGreen | DoBlue);
3096 (void) XParseColor(display,colormap,
"#d6d6d6d6d6d6",&pixel->background_color);
3097 status=XParseColor(display,colormap,resource_info->background_color,
3098 &pixel->background_color);
3099 if (status == False)
3100 ThrowXWindowException(XServerError,
"ColorIsNotKnownToServer",
3101 resource_info->background_color);
3102 pixel->background_color.pixel=
3103 XStandardPixel(map_info,&pixel->background_color);
3104 pixel->background_color.flags=(char) (DoRed | DoGreen | DoBlue);
3108 (void) XParseColor(display,colormap,(
char *) BorderColor,
3109 &pixel->border_color);
3110 status=XParseColor(display,colormap,resource_info->border_color,
3111 &pixel->border_color);
3112 if (status == False)
3113 ThrowXWindowException(XServerError,
"ColorIsNotKnownToServer",
3114 resource_info->border_color);
3115 pixel->border_color.pixel=XStandardPixel(map_info,&pixel->border_color);
3116 pixel->border_color.flags=(char) (DoRed | DoGreen | DoBlue);
3120 pixel->matte_color=pixel->background_color;
3121 if (resource_info->matte_color != (
char *) NULL)
3126 status=XParseColor(display,colormap,resource_info->matte_color,
3127 &pixel->matte_color);
3128 if (status == False)
3129 ThrowXWindowException(XServerError,
"ColorIsNotKnownToServer",
3130 resource_info->matte_color);
3131 pixel->matte_color.pixel=XStandardPixel(map_info,&pixel->matte_color);
3132 pixel->matte_color.flags=(char) (DoRed | DoGreen | DoBlue);
3137 pixel->highlight_color.red=(
unsigned short) (((
double)
3138 pixel->matte_color.red*ScaleQuantumToShort(HighlightModulate))/65535L+
3139 (ScaleQuantumToShort((Quantum) (QuantumRange-HighlightModulate))));
3140 pixel->highlight_color.green=(
unsigned short) (((
double)
3141 pixel->matte_color.green*ScaleQuantumToShort(HighlightModulate))/65535L+
3142 (ScaleQuantumToShort((Quantum) (QuantumRange-HighlightModulate))));
3143 pixel->highlight_color.blue=(
unsigned short) (((
double)
3144 pixel->matte_color.blue*ScaleQuantumToShort(HighlightModulate))/65535L+
3145 (ScaleQuantumToShort((Quantum) (QuantumRange-HighlightModulate))));
3146 pixel->highlight_color.pixel=XStandardPixel(map_info,&pixel->highlight_color);
3147 pixel->highlight_color.flags=(char) (DoRed | DoGreen | DoBlue);
3151 pixel->shadow_color.red=(
unsigned short) (((
double)
3152 pixel->matte_color.red*ScaleQuantumToShort(ShadowModulate))/65535L);
3153 pixel->shadow_color.green=(
unsigned short) (((
double)
3154 pixel->matte_color.green*ScaleQuantumToShort(ShadowModulate))/65535L);
3155 pixel->shadow_color.blue=(
unsigned short) (((
double)
3156 pixel->matte_color.blue*ScaleQuantumToShort(ShadowModulate))/65535L);
3157 pixel->shadow_color.pixel=XStandardPixel(map_info,&pixel->shadow_color);
3158 pixel->shadow_color.flags=(char) (DoRed | DoGreen | DoBlue);
3162 pixel->depth_color.red=(
unsigned short) (((
double)
3163 pixel->matte_color.red*ScaleQuantumToShort(DepthModulate))/65535L);
3164 pixel->depth_color.green=(
unsigned short) (((
double)
3165 pixel->matte_color.green*ScaleQuantumToShort(DepthModulate))/65535L);
3166 pixel->depth_color.blue=(
unsigned short) (((
double)
3167 pixel->matte_color.blue*ScaleQuantumToShort(DepthModulate))/65535L);
3168 pixel->depth_color.pixel=XStandardPixel(map_info,&pixel->depth_color);
3169 pixel->depth_color.flags=(char) (DoRed | DoGreen | DoBlue);
3173 pixel->trough_color.red=(
unsigned short) (((
double)
3174 pixel->matte_color.red*ScaleQuantumToShort(TroughModulate))/65535L);
3175 pixel->trough_color.green=(
unsigned short) (((
double)
3176 pixel->matte_color.green*ScaleQuantumToShort(TroughModulate))/65535L);
3177 pixel->trough_color.blue=(
unsigned short) (((
double)
3178 pixel->matte_color.blue*ScaleQuantumToShort(TroughModulate))/65535L);
3179 pixel->trough_color.pixel=XStandardPixel(map_info,&pixel->trough_color);
3180 pixel->trough_color.flags=(char) (DoRed | DoGreen | DoBlue);
3184 for (i=0; i < MaxNumberPens; i++)
3186 (void) XParseColor(display,colormap,(
char *) PenColors[i],
3187 &pixel->pen_colors[i]);
3188 status=XParseColor(display,colormap,resource_info->pen_colors[i],
3189 &pixel->pen_colors[i]);
3190 if (status == False)
3191 ThrowXWindowException(XServerError,
"ColorIsNotKnownToServer",
3192 resource_info->pen_colors[i]);
3193 pixel->pen_colors[i].pixel=XStandardPixel(map_info,&pixel->pen_colors[i]);
3194 pixel->pen_colors[i].flags=(char) (DoRed | DoGreen | DoBlue);
3196 pixel->box_color=pixel->background_color;
3197 pixel->pen_color=pixel->foreground_color;
3200 if (image != (Image *) NULL)
3202 if ((resource_info->gamma_correct != MagickFalse) &&
3203 (image->gamma != 0.0))
3214 flags=ParseGeometry(resource_info->display_gamma,&geometry_info);
3215 if ((flags & RhoValue) != 0)
3216 red_gamma=geometry_info.rho;
3217 green_gamma=red_gamma;
3218 if ((flags & SigmaValue) != 0)
3219 green_gamma=geometry_info.sigma;
3220 blue_gamma=red_gamma;
3221 if ((flags & XiValue) != 0)
3222 blue_gamma=geometry_info.xi;
3223 red_gamma*=image->gamma;
3224 green_gamma*=image->gamma;
3225 blue_gamma*=image->gamma;
3227 if (image->storage_class == PseudoClass)
3232 for (i=0; i < (ssize_t) image->colors; i++)
3233 pixel->pixels[i]=XGammaPacket(map_info,image->colormap+i);
3234 for (i=0; i < MaxNumberPens; i++)
3235 pixel->pixels[image->colors+(
size_t) i]=pixel->pen_colors[i].pixel;
3236 pixel->colors+=MaxNumberPens;
3275MagickExport
char *XGetResourceClass(XrmDatabase database,
3276 const char *client_name,
const char *keyword,
char *resource_default)
3279 resource_class[MagickPathExtent],
3280 resource_name[MagickPathExtent];
3291 if (database == (XrmDatabase) NULL)
3292 return(resource_default);
3293 *resource_name=
'\0';
3294 *resource_class=
'\0';
3295 if (keyword != (
char *) NULL)
3304 (void) FormatLocaleString(resource_name,MagickPathExtent,
"%s.%s",
3305 client_name,keyword);
3306 c=(int) (*client_name);
3307 if ((c >= XK_a) && (c <= XK_z))
3310 if ((c >= XK_agrave) && (c <= XK_odiaeresis))
3311 c-=(XK_agrave-XK_Agrave);
3313 if ((c >= XK_oslash) && (c <= XK_thorn))
3314 c-=(XK_oslash-XK_Ooblique);
3316 if ((k >= XK_a) && (k <= XK_z))
3319 if ((k >= XK_agrave) && (k <= XK_odiaeresis))
3320 k-=(XK_agrave-XK_Agrave);
3322 if ((k >= XK_oslash) && (k <= XK_thorn))
3323 k-=(XK_oslash-XK_Ooblique);
3324 (void) FormatLocaleString(resource_class,MagickPathExtent,
"%c%s.%c%s",c,
3325 client_name+1,k,keyword+1);
3327 status=XrmGetResource(database,resource_name,resource_class,&resource_type,
3329 if (status == False)
3330 return(resource_default);
3331 return(resource_value.addr);
3364MagickExport XrmDatabase XGetResourceDatabase(Display *display,
3365 const char *client_name)
3368 filename[MagickPathExtent];
3380 if (display == (Display *) NULL)
3381 return((XrmDatabase) NULL);
3382 assert(client_name != (
char *) NULL);
3387 (void) XGetDefault(display,(
char *) client_name,
"dummy");
3388 resource_database=XrmGetDatabase(display);
3392 p=client_name+(strlen(client_name)-1);
3393 while ((p > client_name) && (*p !=
'/'))
3397 c=(int) (*client_name);
3398 if ((c >= XK_a) && (c <= XK_z))
3401 if ((c >= XK_agrave) && (c <= XK_odiaeresis))
3402 c-=(XK_agrave-XK_Agrave);
3404 if ((c >= XK_oslash) && (c <= XK_thorn))
3405 c-=(XK_oslash-XK_Ooblique);
3406#if defined(X11_APPLICATION_PATH)
3407 (void) FormatLocaleString(filename,MagickPathExtent,
"%s%c%s",
3408 X11_APPLICATION_PATH,c,client_name+1);
3409 (void) XrmCombineFileDatabase(filename,&resource_database,MagickFalse);
3411 if (XResourceManagerString(display) != (
char *) NULL)
3416 server_database=XrmGetStringDatabase(XResourceManagerString(display));
3417 XrmCombineDatabase(server_database,&resource_database,MagickFalse);
3422#if defined(X11_PREFERENCES_PATH)
3423 (void) FormatLocaleString(filename,MagickPathExtent,
"%s%src",
3424 X11_PREFERENCES_PATH,client_name);
3425 ExpandFilename(filename);
3426 (void) XrmCombineFileDatabase(filename,&resource_database,MagickFalse);
3428 return(resource_database);
3462MagickExport
void XGetResourceInfo(
const ImageInfo *image_info,
3463 XrmDatabase database,
const char *client_name,XResourceInfo *resource_info)
3472 assert(resource_info != (XResourceInfo *) NULL);
3473 if (IsEventLogging() != MagickFalse)
3474 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
3475 (void) memset(resource_info,0,
sizeof(*resource_info));
3476 resource_info->resource_database=database;
3477 resource_info->image_info=(ImageInfo *) image_info;
3478 (void) SetImageInfoProgressMonitor(resource_info->image_info,
3479 XMagickProgressMonitor,(
void *) NULL);
3480 resource_info->quantize_info=CloneQuantizeInfo((QuantizeInfo *) NULL);
3481 resource_info->close_server=MagickTrue;
3482 resource_info->client_name=AcquireString(client_name);
3483 resource_value=XGetResourceClass(database,client_name,
"backdrop",
3485 resource_info->backdrop=IsStringTrue(resource_value);
3486 resource_info->background_color=XGetResourceInstance(database,client_name,
3487 "background",(
char *)
"#d6d6d6d6d6d6");
3488 resource_info->border_color=XGetResourceInstance(database,client_name,
3489 "borderColor",BorderColor);
3490 resource_value=XGetResourceClass(database,client_name,
"borderWidth",
3492 resource_info->border_width=(
unsigned int) StringToUnsignedLong(
3494 resource_value=XGetResourceClass(database,client_name,
"colormap",
3496 resource_info->colormap=UndefinedColormap;
3497 if (LocaleCompare(
"private",resource_value) == 0)
3498 resource_info->colormap=PrivateColormap;
3499 if (LocaleCompare(
"shared",resource_value) == 0)
3500 resource_info->colormap=SharedColormap;
3501 if (resource_info->colormap == UndefinedColormap)
3502 ThrowXWindowException(OptionError,
"UnrecognizedColormapType",
3504 resource_value=XGetResourceClass(database,client_name,
3505 "colorRecovery",(
char *)
"False");
3506 resource_info->color_recovery=IsStringTrue(resource_value);
3507 resource_value=XGetResourceClass(database,client_name,
"confirmExit",
3509 resource_info->confirm_exit=IsStringTrue(resource_value);
3510 resource_value=XGetResourceClass(database,client_name,
"confirmEdit",
3512 resource_info->confirm_edit=IsStringTrue(resource_value);
3513 resource_value=XGetResourceClass(database,client_name,
"delay",(
char *)
"1");
3514 resource_info->delay=(
unsigned int) StringToUnsignedLong(resource_value);
3515 resource_info->display_gamma=XGetResourceClass(database,client_name,
3516 "displayGamma",(
char *)
"2.2");
3517 resource_value=XGetResourceClass(database,client_name,
"displayWarnings",
3519 resource_info->display_warnings=IsStringTrue(resource_value);
3520 resource_info->font=XGetResourceClass(database,client_name,
"font",
3522 resource_info->font=XGetResourceClass(database,client_name,
"fontList",
3523 resource_info->font);
3524 resource_info->font_name[0]=XGetResourceClass(database,client_name,
"font1",
3526 resource_info->font_name[1]=XGetResourceClass(database,client_name,
"font2",
3527 (
char *)
"variable");
3528 resource_info->font_name[2]=XGetResourceClass(database,client_name,
"font3",
3530 resource_info->font_name[3]=XGetResourceClass(database,client_name,
"font4",
3532 resource_info->font_name[4]=XGetResourceClass(database,client_name,
"font5",
3533 (
char *)
"7x13bold");
3534 resource_info->font_name[5]=XGetResourceClass(database,client_name,
"font6",
3535 (
char *)
"8x13bold");
3536 resource_info->font_name[6]=XGetResourceClass(database,client_name,
"font7",
3537 (
char *)
"9x15bold");
3538 resource_info->font_name[7]=XGetResourceClass(database,client_name,
"font8",
3540 resource_info->font_name[8]=XGetResourceClass(database,client_name,
"font9",
3542 resource_info->font_name[9]=XGetResourceClass(database,client_name,
"font0",
3544 resource_info->font_name[10]=XGetResourceClass(database,client_name,
"font0",
3546 resource_info->foreground_color=XGetResourceInstance(database,client_name,
3547 "foreground",ForegroundColor);
3548 resource_value=XGetResourceClass(database,client_name,
"gammaCorrect",
3550 resource_info->gamma_correct=IsStringTrue(resource_value);
3551 resource_info->image_geometry=ConstantString(XGetResourceClass(database,
3552 client_name,
"geometry",(
char *) NULL));
3553 resource_value=XGetResourceClass(database,client_name,
"gravity",
3555 resource_info->gravity=(int) ParseCommandOption(MagickGravityOptions,
3556 MagickFalse,resource_value);
3557 directory=getcwd(resource_info->home_directory,MagickPathExtent);
3559 resource_info->icon_geometry=XGetResourceClass(database,client_name,
3560 "iconGeometry",(
char *) NULL);
3561 resource_value=XGetResourceClass(database,client_name,
"iconic",
3563 resource_info->iconic=IsStringTrue(resource_value);
3564 resource_value=XGetResourceClass(database,client_name,
"immutable",
3565 LocaleCompare(client_name,
"PerlMagick") == 0 ? (
char *)
"True" :
3567 resource_info->immutable=IsStringTrue(resource_value);
3568 resource_value=XGetResourceClass(database,client_name,
"magnify",
3570 resource_info->magnify=(
unsigned int) StringToUnsignedLong(resource_value);
3571 resource_info->map_type=XGetResourceClass(database,client_name,
"map",
3573 resource_info->matte_color=XGetResourceInstance(database,client_name,
3574 "mattecolor",(
char *) NULL);
3575 resource_info->name=ConstantString(XGetResourceClass(database,client_name,
3576 "name",(
char *) NULL));
3577 resource_info->pen_colors[0]=XGetResourceClass(database,client_name,
"pen1",
3579 resource_info->pen_colors[1]=XGetResourceClass(database,client_name,
"pen2",
3581 resource_info->pen_colors[2]=XGetResourceClass(database,client_name,
"pen3",
3583 resource_info->pen_colors[3]=XGetResourceClass(database,client_name,
"pen4",
3585 resource_info->pen_colors[4]=XGetResourceClass(database,client_name,
"pen5",
3587 resource_info->pen_colors[5]=XGetResourceClass(database,client_name,
"pen6",
3589 resource_info->pen_colors[6]=XGetResourceClass(database,client_name,
"pen7",
3590 (
char *)
"magenta");
3591 resource_info->pen_colors[7]=XGetResourceClass(database,client_name,
"pen8",
3593 resource_info->pen_colors[8]=XGetResourceClass(database,client_name,
"pen9",
3595 resource_info->pen_colors[9]=XGetResourceClass(database,client_name,
"pen0",
3597 resource_info->pen_colors[10]=XGetResourceClass(database,client_name,
"pen0",
3599 resource_value=XGetResourceClass(database,client_name,
"pause",(
char *)
"0");
3600 resource_info->pause=(
unsigned int) StringToUnsignedLong(resource_value);
3601 resource_value=XGetResourceClass(database,client_name,
"quantum",(
char *)
"1");
3602 resource_info->quantum=StringToLong(resource_value);
3603 resource_info->text_font=XGetResourceClass(database,client_name,(
char *)
3604 "font",(
char *)
"fixed");
3605 resource_info->text_font=XGetResourceClass(database,client_name,
3606 "textFontList",resource_info->text_font);
3607 resource_info->title=XGetResourceClass(database,client_name,
"title",
3609 resource_value=XGetResourceClass(database,client_name,
"undoCache",
3611 resource_info->undo_cache=(
unsigned int) StringToUnsignedLong(resource_value);
3612 resource_value=XGetResourceClass(database,client_name,
"update",
3614 resource_info->update=IsStringTrue(resource_value);
3615 resource_value=XGetResourceClass(database,client_name,
"usePixmap",
3617 resource_info->use_pixmap=IsStringTrue(resource_value);
3618 resource_value=XGetResourceClass(database,client_name,
"sharedMemory",
3620 resource_info->use_shared_memory=IsStringTrue(resource_value);
3621 resource_info->visual_type=XGetResourceClass(database,client_name,
"visual",
3623 resource_info->window_group=XGetResourceClass(database,client_name,
3624 "windowGroup",(
char *) NULL);
3625 resource_info->window_id=XGetResourceClass(database,client_name,
"window",
3627 resource_info->write_filename=XGetResourceClass(database,client_name,
3628 "writeFilename",(
char *) NULL);
3629 resource_info->debug=(GetLogEventMask() & X11Event) != 0 ? MagickTrue :
3667MagickExport
char *XGetResourceInstance(XrmDatabase database,
3668 const char *client_name,
const char *keyword,
const char *resource_default)
3672 resource_name[MagickPathExtent];
3680 if (database == (XrmDatabase) NULL)
3681 return((
char *) resource_default);
3682 *resource_name=
'\0';
3683 if (keyword != (
char *) NULL)
3684 (void) FormatLocaleString(resource_name,MagickPathExtent,
"%s.%s",client_name,
3686 status=XrmGetResource(database,resource_name,
"ImageMagick",&resource_type,
3688 if (status == False)
3689 return((
char *) resource_default);
3690 return(resource_value.addr);
3720MagickExport
char *XGetScreenDensity(Display *display)
3723 density[MagickPathExtent];
3732 x_density=((((double) DisplayWidth(display,XDefaultScreen(display)))*25.4)/
3733 ((double) DisplayWidthMM(display,XDefaultScreen(display))));
3734 y_density=((((double) DisplayHeight(display,XDefaultScreen(display)))*25.4)/
3735 ((double) DisplayHeightMM(display,XDefaultScreen(display))));
3736 (void) FormatLocaleString(density,MagickPathExtent,
"%gx%g",x_density,
3738 return(GetPageGeometry(density));
3776static Window XGetSubwindow(Display *display,Window window,
int x,
int y)
3789 assert(display != (Display *) NULL);
3790 source_window=XRootWindow(display,XDefaultScreen(display));
3791 if (window == (Window) NULL)
3792 return(source_window);
3793 target_window=window;
3796 status=XTranslateCoordinates(display,source_window,window,x,y,
3797 &x_offset,&y_offset,&target_window);
3800 if (target_window == (Window) NULL)
3802 source_window=window;
3803 window=target_window;
3807 if (target_window == (Window) NULL)
3808 target_window=window;
3809 return(target_window);
3844MagickPrivate MagickBooleanType XGetWindowColor(Display *display,
3845 XWindows *windows,
char *name,ExceptionInfo *exception)
3878 assert(display != (Display *) NULL);
3879 assert(name != (
char *) NULL);
3880 if (IsEventLogging() != MagickFalse)
3881 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",name);
3883 target_window=XSelectWindow(display,&crop_info);
3884 if (target_window == (Window) NULL)
3885 return(MagickFalse);
3886 root_window=XRootWindow(display,XDefaultScreen(display));
3887 client_window=target_window;
3888 if (target_window != root_window)
3896 status=XGetGeometry(display,target_window,&root_window,&x,&x,&d,&d,&d,&d);
3897 if (status != False)
3899 client_window=XClientWindow(display,target_window);
3900 target_window=client_window;
3906 status=XGetWindowAttributes(display,target_window,&window_attributes);
3907 if ((status == False) || (window_attributes.map_state != IsViewable))
3908 return(MagickFalse);
3912 (void) XTranslateCoordinates(display,root_window,target_window,
3913 (
int) crop_info.x,(
int) crop_info.y,&x,&y,&child);
3914 ximage=XGetImage(display,target_window,x,y,1,1,AllPlanes,ZPixmap);
3915 if (ximage == (XImage *) NULL)
3916 return(MagickFalse);
3917 color.pixel=XGetPixel(ximage,0,0);
3918 XDestroyImage(ximage);
3922 (void) XQueryColor(display,window_attributes.colormap,&color);
3923 pixel.red=(double) ScaleShortToQuantum(color.red);
3924 pixel.green=(double) ScaleShortToQuantum(color.green);
3925 pixel.blue=(double) ScaleShortToQuantum(color.blue);
3926 pixel.alpha=(MagickRealType) OpaqueAlpha;
3927 (void) QueryColorname(windows->image.image,&pixel,X11Compliance,name,
3974static Image *XGetWindowImage(Display *display,
const Window window,
3975 const unsigned int borders,
const unsigned int level,ExceptionInfo *exception)
3985 struct _ColormapInfo
3989 typedef struct _WindowInfo
4025 *colormap_info = (ColormapInfo *) NULL;
4047 assert(display != (Display *) NULL);
4048 if (IsEventLogging() != MagickFalse)
4049 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
4050 status=XGetWindowAttributes(display,window,&window_attributes);
4051 if ((status == False) || (window_attributes.map_state != IsViewable))
4052 return((Image *) NULL);
4056 root_window=XRootWindow(display,XDefaultScreen(display));
4057 (void) XTranslateCoordinates(display,window,root_window,0,0,&x_offset,
4059 crop_info.x=(ssize_t) x_offset;
4060 crop_info.y=(ssize_t) y_offset;
4061 crop_info.width=(size_t) window_attributes.width;
4062 crop_info.height=(size_t) window_attributes.height;
4063 if (borders != MagickFalse)
4068 crop_info.x-=(ssize_t) window_attributes.border_width;
4069 crop_info.y-=(ssize_t) window_attributes.border_width;
4070 crop_info.width+=(size_t) (window_attributes.border_width << 1);
4071 crop_info.height+=(size_t) (window_attributes.border_width << 1);
4076 if (crop_info.x < 0)
4078 crop_info.width=(
unsigned int) ((
int) crop_info.width+crop_info.x);
4081 if (crop_info.y < 0)
4083 crop_info.height=(
unsigned int) ((
int) crop_info.height+crop_info.y);
4086 display_width=XDisplayWidth(display,XDefaultScreen(display));
4087 if ((
int) (crop_info.x+(
int) crop_info.width) > display_width)
4088 crop_info.width=(size_t) (display_width-crop_info.x);
4089 display_height=XDisplayHeight(display,XDefaultScreen(display));
4090 if ((
int) (crop_info.y+(
int) crop_info.height) > display_height)
4091 crop_info.height=(size_t) (display_height-crop_info.y);
4095 if (number_windows >= max_windows)
4101 if (window_info == (WindowInfo *) NULL)
4102 window_info=(WindowInfo *) AcquireQuantumMemory((
size_t) max_windows,
4103 sizeof(*window_info));
4105 window_info=(WindowInfo *) ResizeQuantumMemory(window_info,(
size_t)
4106 max_windows,
sizeof(*window_info));
4108 if (window_info == (WindowInfo *) NULL)
4110 ThrowXWindowException(ResourceLimitError,
"MemoryAllocationFailed",
"...");
4111 return((Image *) NULL);
4113 id=number_windows++;
4114 window_info[id].window=window;
4115 window_info[id].visual=window_attributes.visual;
4116 window_info[id].colormap=window_attributes.colormap;
4117 window_info[id].bounds.x1=(short) crop_info.x;
4118 window_info[id].bounds.y1=(short) crop_info.y;
4119 window_info[id].bounds.x2=(short) (crop_info.x+(
int) crop_info.width-1);
4120 window_info[id].bounds.y2=(short) (crop_info.y+(
int) crop_info.height-1);
4121 crop_info.x-=x_offset;
4122 crop_info.y-=y_offset;
4123 window_info[id].crop_info=crop_info;
4135 status=XQueryTree(display,window,&root_window,&window_info[
id].parent,
4136 &children,&number_children);
4137 for (i=0; i < id; i++)
4138 if ((window_info[i].window == window_info[
id].parent) &&
4139 (window_info[i].visual == window_info[
id].visual) &&
4140 (window_info[i].colormap == window_info[
id].colormap))
4142 if ((window_info[
id].bounds.x1 < window_info[i].bounds.x1) ||
4143 (window_info[
id].bounds.x2 > window_info[i].bounds.x2) ||
4144 (window_info[
id].bounds.y1 < window_info[i].bounds.y1) ||
4145 (window_info[
id].bounds.y2 > window_info[i].bounds.y2))
4154 if ((status == True) && (number_children != 0))
4156 for (i=0; i < (int) number_children; i++)
4157 (
void) XGetWindowImage(display,children[i],MagickFalse,level+1,
4159 (void) XFree((
void *) children);
4202 image=NewImageList();
4203 for (
id=0;
id < number_windows;
id++)
4208 import=((window_info[id].bounds.x2 >= window_info[0].bounds.x1) &&
4209 (window_info[id].bounds.x1 <= window_info[0].bounds.x2) &&
4210 (window_info[id].bounds.y2 >= window_info[0].bounds.y1) &&
4211 (window_info[id].bounds.y1 <= window_info[0].bounds.y2)) ?
4212 MagickTrue : MagickFalse;
4216 for (j=0; j < id; j++)
4217 if ((window_info[
id].visual == window_info[j].visual) &&
4218 (window_info[
id].colormap == window_info[j].colormap))
4220 if ((window_info[
id].bounds.x1 >= window_info[j].bounds.x1) &&
4221 (window_info[
id].bounds.x2 <= window_info[j].bounds.x2) &&
4222 (window_info[
id].bounds.y1 >= window_info[j].bounds.y1) &&
4223 (window_info[
id].bounds.y2 <= window_info[j].bounds.y2))
4226 if (
import == MagickFalse)
4231 ximage=XGetImage(display,window_info[
id].window,(
int)
4232 window_info[
id].crop_info.x,(
int) window_info[
id].crop_info.y,
4233 (
unsigned int) window_info[
id].crop_info.width,(
unsigned int)
4234 window_info[
id].crop_info.height,AllPlanes,ZPixmap);
4235 if (ximage == (XImage *) NULL)
4241 colors=(XColor *) NULL;
4242 if (window_info[
id].colormap != (Colormap) NULL)
4250 number_colors=(
unsigned int) window_info[
id].visual->map_entries;
4251 for (p=colormap_info; p != (ColormapInfo *) NULL; p=p->next)
4252 if (p->colormap == window_info[
id].colormap)
4254 if (p == (ColormapInfo *) NULL)
4259 colors=(XColor *) AcquireQuantumMemory(number_colors,
4261 if (colors == (XColor *) NULL)
4263 XDestroyImage(ximage);
4264 return((Image *) NULL);
4266 if ((window_info[
id].visual->klass != DirectColor) &&
4267 (window_info[
id].visual->klass != TrueColor))
4268 for (i=0; i < (int) number_colors; i++)
4270 colors[i].pixel=(size_t) i;
4289 red_bit=window_info[id].visual->red_mask &
4290 (~(window_info[id].visual->red_mask)+1);
4291 green_bit=window_info[id].visual->green_mask &
4292 (~(window_info[id].visual->green_mask)+1);
4293 blue_bit=window_info[id].visual->blue_mask &
4294 (~(window_info[id].visual->blue_mask)+1);
4295 for (i=0; i < (int) number_colors; i++)
4297 colors[i].pixel=(
unsigned long) (red | green | blue);
4300 if (red > window_info[
id].visual->red_mask)
4303 if (green > window_info[
id].visual->green_mask)
4306 if (blue > window_info[
id].visual->blue_mask)
4310 (void) XQueryColors(display,window_info[
id].colormap,colors,
4311 (
int) number_colors);
4315 p=(ColormapInfo *) AcquireMagickMemory(
sizeof(*p));
4316 if (p == (ColormapInfo *) NULL)
4317 return((Image *) NULL);
4318 p->colormap=window_info[id].colormap;
4320 p->next=colormap_info;
4328 composite_image=AcquireImage((ImageInfo *) NULL,exception);
4329 if (composite_image == (Image *) NULL)
4331 XDestroyImage(ximage);
4332 return((Image *) NULL);
4337 if ((window_info[
id].visual->klass != TrueColor) &&
4338 (window_info[
id].visual->klass != DirectColor))
4339 composite_image->storage_class=PseudoClass;
4340 composite_image->columns=(size_t) ximage->width;
4341 composite_image->rows=(size_t) ximage->height;
4342 composite_view=AcquireAuthenticCacheView(composite_image,exception);
4343 switch (composite_image->storage_class)
4363 red_mask=window_info[id].visual->red_mask;
4365 while ((red_mask != 0) && ((red_mask & 0x01) == 0))
4370 green_mask=window_info[id].visual->green_mask;
4372 while ((green_mask != 0) && ((green_mask & 0x01) == 0))
4377 blue_mask=window_info[id].visual->blue_mask;
4379 while ((blue_mask != 0) && ((blue_mask & 0x01) == 0))
4387 if ((number_colors != 0) &&
4388 (window_info[
id].visual->klass == DirectColor))
4389 for (y=0; y < (int) composite_image->rows; y++)
4391 q=QueueCacheViewAuthenticPixels(composite_view,0,(ssize_t) y,
4392 composite_image->columns,1,exception);
4393 if (q == (Quantum *) NULL)
4395 for (x=0; x < (int) composite_image->columns; x++)
4397 pixel=XGetPixel(ximage,x,y);
4398 index=(pixel >> red_shift) & red_mask;
4399 SetPixelRed(composite_image,
4400 ScaleShortToQuantum(colors[index].red),q);
4401 index=(pixel >> green_shift) & green_mask;
4402 SetPixelGreen(composite_image,
4403 ScaleShortToQuantum(colors[index].green),q);
4404 index=(pixel >> blue_shift) & blue_mask;
4405 SetPixelBlue(composite_image,
4406 ScaleShortToQuantum(colors[index].blue),q);
4407 q+=(ptrdiff_t) GetPixelChannels(composite_image);
4409 status=SyncCacheViewAuthenticPixels(composite_view,exception)
4410 == MagickFalse ? 0 : 1;
4411 if (status == MagickFalse)
4415 for (y=0; y < (int) composite_image->rows; y++)
4417 q=QueueCacheViewAuthenticPixels(composite_view,0,(ssize_t) y,
4418 composite_image->columns,1,exception);
4419 if (q == (Quantum *) NULL)
4421 for (x=0; x < (int) composite_image->columns; x++)
4423 pixel=XGetPixel(ximage,x,y);
4424 color=(pixel >> red_shift) & red_mask;
4426 color=(65535UL*color)/red_mask;
4427 SetPixelRed(composite_image,ScaleShortToQuantum(
4428 (
unsigned short) color),q);
4429 color=(pixel >> green_shift) & green_mask;
4430 if (green_mask != 0)
4431 color=(65535UL*color)/green_mask;
4432 SetPixelGreen(composite_image,ScaleShortToQuantum(
4433 (
unsigned short) color),q);
4434 color=(pixel >> blue_shift) & blue_mask;
4436 color=(65535UL*color)/blue_mask;
4437 SetPixelBlue(composite_image,ScaleShortToQuantum(
4438 (
unsigned short) color),q);
4439 q+=(ptrdiff_t) GetPixelChannels(composite_image);
4441 status=SyncCacheViewAuthenticPixels(composite_view,exception)
4442 == MagickFalse ? 0 : 1;
4443 if (status == MagickFalse)
4453 status=AcquireImageColormap(composite_image,number_colors,
4454 exception) == MagickFalse ? 0 : 1;
4455 if (status == MagickFalse)
4457 XDestroyImage(ximage);
4458 composite_image=DestroyImage(composite_image);
4459 return((Image *) NULL);
4461 if (colors == (XColor *) NULL)
4463 for (i=0; i < (int) composite_image->colors; i++)
4465 composite_image->colormap[colors[i].pixel].red=(double)
4466 ScaleShortToQuantum(colors[i].red);
4467 composite_image->colormap[colors[i].pixel].green=(double)
4468 ScaleShortToQuantum(colors[i].green);
4469 composite_image->colormap[colors[i].pixel].blue=(double)
4470 ScaleShortToQuantum(colors[i].blue);
4475 for (y=0; y < (int) composite_image->rows; y++)
4477 q=QueueCacheViewAuthenticPixels(composite_view,0,(ssize_t) y,
4478 composite_image->columns,1,exception);
4479 if (q == (Quantum *) NULL)
4481 for (x=0; x < (int) composite_image->columns; x++)
4483 index=(Quantum) XGetPixel(ximage,x,y);
4484 SetPixelIndex(composite_image,index,q);
4485 SetPixelViaPixelInfo(composite_image,
4486 composite_image->colormap+(ssize_t) index,q);
4487 q+=(ptrdiff_t) GetPixelChannels(composite_image);
4489 status=SyncCacheViewAuthenticPixels(composite_view,exception)
4490 == MagickFalse ? 0 : 1;
4491 if (status == MagickFalse)
4497 composite_view=DestroyCacheView(composite_view);
4498 XDestroyImage(ximage);
4499 if (image == (Image *) NULL)
4501 image=composite_image;
4507 (void) XTranslateCoordinates(display,window_info[
id].window,window,0,0,
4508 &x_offset,&y_offset,&child);
4509 x_offset-=(int) crop_info.x;
4512 y_offset-=(int) crop_info.y;
4515 (void) CompositeImage(image,composite_image,CopyCompositeOp,MagickTrue,
4516 (ssize_t) x_offset,(ssize_t) y_offset,exception);
4517 composite_image=DestroyImage(composite_image);
4522 while (colormap_info != (ColormapInfo *) NULL)
4524 next=colormap_info->next;
4525 colormap_info->colors=(XColor *) RelinquishMagickMemory(
4526 colormap_info->colors);
4527 colormap_info=(ColormapInfo *) RelinquishMagickMemory(colormap_info);
4533 window_info=(WindowInfo *) RelinquishMagickMemory(window_info);
4536 colormap_info=(ColormapInfo *) NULL;
4539 return((Image *) NULL);
4580MagickPrivate
void XGetWindowInfo(Display *display,XVisualInfo *visual_info,
4581 XStandardColormap *map_info,XPixelInfo *pixel,XFontStruct *font_info,
4582 XResourceInfo *resource_info,XWindowInfo *window)
4587 assert(display != (Display *) NULL);
4588 assert(visual_info != (XVisualInfo *) NULL);
4589 assert(map_info != (XStandardColormap *) NULL);
4590 assert(pixel != (XPixelInfo *) NULL);
4591 assert(resource_info != (XResourceInfo *) NULL);
4592 assert(window != (XWindowInfo *) NULL);
4593 if (IsEventLogging() != MagickFalse)
4594 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
4595 if (window->id != (Window) NULL)
4597 if (window->cursor != (Cursor) NULL)
4598 (void) XFreeCursor(display,window->cursor);
4599 if (window->busy_cursor != (Cursor) NULL)
4600 (void) XFreeCursor(display,window->busy_cursor);
4601 if (window->highlight_stipple != (Pixmap) NULL)
4602 (void) XFreePixmap(display,window->highlight_stipple);
4603 if (window->shadow_stipple != (Pixmap) NULL)
4604 (void) XFreePixmap(display,window->shadow_stipple);
4605 if (window->name == (
char *) NULL)
4606 window->name=AcquireString(
"");
4607 if (window->icon_name == (
char *) NULL)
4608 window->icon_name=AcquireString(
"");
4615 window->id=(Window) NULL;
4616 if (window->name == (
char *) NULL)
4617 window->name=AcquireString(
"");
4618 if (window->icon_name == (
char *) NULL)
4619 window->icon_name=AcquireString(
"");
4620 window->x=XDisplayWidth(display,visual_info->screen) >> 1;
4621 window->y=XDisplayWidth(display,visual_info->screen) >> 1;
4622 window->ximage=(XImage *) NULL;
4623 window->matte_image=(XImage *) NULL;
4624 window->pixmap=(Pixmap) NULL;
4625 window->matte_pixmap=(Pixmap) NULL;
4626 window->mapped=MagickFalse;
4627 window->stasis=MagickFalse;
4628 window->shared_memory=MagickTrue;
4629 window->segment_info=(
void *) NULL;
4630#if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
4635 if (window->segment_info == (
void *) NULL)
4636 window->segment_info=AcquireCriticalMemory(2*
sizeof(*segment_info));
4637 segment_info=(XShmSegmentInfo *) window->segment_info;
4638 segment_info[0].shmid=(-1);
4639 segment_info[0].shmaddr=(
char *) NULL;
4640 segment_info[1].shmid=(-1);
4641 segment_info[1].shmaddr=(
char *) NULL;
4648 window->screen=visual_info->screen;
4649 window->root=XRootWindow(display,visual_info->screen);
4650 window->visual=visual_info->visual;
4651 window->storage_class=(
unsigned int) visual_info->klass;
4652 window->depth=(
unsigned int) visual_info->depth;
4653 window->visual_info=visual_info;
4654 window->map_info=map_info;
4655 window->pixel_info=pixel;
4656 window->font_info=font_info;
4657 window->cursor=XCreateFontCursor(display,XC_left_ptr);
4658 window->busy_cursor=XCreateFontCursor(display,XC_watch);
4659 window->geometry=(
char *) NULL;
4660 window->icon_geometry=(
char *) NULL;
4661 if (resource_info->icon_geometry != (
char *) NULL)
4662 (void) CloneString(&window->icon_geometry,resource_info->icon_geometry);
4663 window->crop_geometry=(
char *) NULL;
4664 window->flags=(size_t) PSize;
4667 window->min_width=1;
4668 window->min_height=1;
4669 window->width_inc=1;
4670 window->height_inc=1;
4671 window->border_width=resource_info->border_width;
4672 window->annotate_context=pixel->annotate_context;
4673 window->highlight_context=pixel->highlight_context;
4674 window->widget_context=pixel->widget_context;
4675 window->shadow_stipple=(Pixmap) NULL;
4676 window->highlight_stipple=(Pixmap) NULL;
4677 window->use_pixmap=MagickTrue;
4678 window->immutable=MagickFalse;
4679 window->shape=MagickFalse;
4681 window->mask=(int) (CWBackingStore | CWBackPixel | CWBackPixmap |
4682 CWBitGravity | CWBorderPixel | CWColormap | CWCursor | CWDontPropagate |
4683 CWEventMask | CWOverrideRedirect | CWSaveUnder | CWWinGravity);
4684 window->attributes.background_pixel=pixel->background_color.pixel;
4685 window->attributes.background_pixmap=(Pixmap) NULL;
4686 window->attributes.bit_gravity=ForgetGravity;
4687 window->attributes.backing_store=WhenMapped;
4688 window->attributes.save_under=MagickTrue;
4689 window->attributes.border_pixel=pixel->border_color.pixel;
4690 window->attributes.colormap=map_info->colormap;
4691 window->attributes.cursor=window->cursor;
4692 window->attributes.do_not_propagate_mask=NoEventMask;
4693 window->attributes.event_mask=NoEventMask;
4694 window->attributes.override_redirect=MagickFalse;
4695 window->attributes.win_gravity=NorthWestGravity;
4696 window->orphan=MagickFalse;
4731MagickPrivate
void XHighlightEllipse(Display *display,Window window,
4732 GC annotate_context,
const RectangleInfo *highlight_info)
4734 assert(display != (Display *) NULL);
4735 assert(window != (Window) NULL);
4736 assert(annotate_context != (GC) NULL);
4737 assert(highlight_info != (RectangleInfo *) NULL);
4738 if (IsEventLogging() != MagickFalse)
4739 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
4740 if ((highlight_info->width < 4) || (highlight_info->height < 4))
4742 (void) XDrawArc(display,window,annotate_context,(
int) highlight_info->x,
4743 (
int) highlight_info->y,(
unsigned int) highlight_info->width-1,
4744 (
unsigned int) highlight_info->height-1,0,360*64);
4745 (void) XDrawArc(display,window,annotate_context,(
int) highlight_info->x+1,
4746 (
int) highlight_info->y+1,(
unsigned int) highlight_info->width-3,
4747 (
unsigned int) highlight_info->height-3,0,360*64);
4782MagickPrivate
void XHighlightLine(Display *display,Window window,
4783 GC annotate_context,
const XSegment *highlight_info)
4785 assert(display != (Display *) NULL);
4786 assert(window != (Window) NULL);
4787 assert(annotate_context != (GC) NULL);
4788 assert(highlight_info != (XSegment *) NULL);
4789 if (IsEventLogging() != MagickFalse)
4790 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
4791 (void) XDrawLine(display,window,annotate_context,highlight_info->x1,
4792 highlight_info->y1,highlight_info->x2,highlight_info->y2);
4827MagickPrivate
void XHighlightRectangle(Display *display,Window window,
4828 GC annotate_context,
const RectangleInfo *highlight_info)
4830 assert(display != (Display *) NULL);
4831 assert(window != (Window) NULL);
4832 assert(annotate_context != (GC) NULL);
4833 assert(highlight_info != (RectangleInfo *) NULL);
4834 if (IsEventLogging() != MagickFalse)
4835 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
4836 if ((highlight_info->width < 4) || (highlight_info->height < 4))
4838 (void) XDrawRectangle(display,window,annotate_context,(
int) highlight_info->x,
4839 (
int) highlight_info->y,(
unsigned int) highlight_info->width-1,
4840 (
unsigned int) highlight_info->height-1);
4841 (void) XDrawRectangle(display,window,annotate_context,(
int) highlight_info->x+
4842 1,(
int) highlight_info->y+1,(
unsigned int) highlight_info->width-3,
4843 (
unsigned int) highlight_info->height-3);
4873MagickExport Image *XImportImage(
const ImageInfo *image_info,
4874 XImportInfo *ximage_info,ExceptionInfo *exception)
4909 assert(image_info != (
const ImageInfo *) NULL);
4910 assert(image_info->signature == MagickCoreSignature);
4911 assert(ximage_info != (XImportInfo *) NULL);
4912 if (IsEventLogging() != MagickFalse)
4913 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
4914 image_info->filename);
4915 display=XOpenDisplay(image_info->server_name);
4916 if (display == (Display *) NULL)
4918 ThrowXWindowException(XServerError,
"UnableToOpenXServer",
4919 XDisplayName(image_info->server_name));
4920 return((Image *) NULL);
4925 (void) XSetErrorHandler(XError);
4933 root=XRootWindow(display,XDefaultScreen(display));
4934 target=(Window) NULL;
4935 if (*image_info->filename !=
'\0')
4937 if (LocaleCompare(image_info->filename,
"root") == 0)
4944 if (isdigit((
int) ((
unsigned char) *image_info->filename)) != 0)
4945 target=XWindowByID(display,root,(Window)
4946 strtol(image_info->filename,(
char **) NULL,0));
4947 if (target == (Window) NULL)
4948 target=XWindowByName(display,root,image_info->filename);
4949 if (target == (Window) NULL)
4950 ThrowXWindowException(XServerError,
"NoWindowWithSpecifiedIDExists",
4951 image_info->filename);
4957 prior_target=target;
4958 if (target == (Window) NULL)
4959 target=XSelectWindow(display,&crop_info);
4960 if (target == (Window) NULL)
4961 ThrowXWindowException(XServerError,
"UnableToReadXWindowImage",
4962 image_info->filename);
4969 status=XGetGeometry(display,target,&root,&x,&x,&d,&d,&d,&d);
4970 if (status != False)
4980 status=XQueryTree(display,target,&root,&parent,&children,&d);
4981 if ((status != False) && (children != (Window *) NULL))
4982 (void) XFree((
char *) children);
4983 if ((status == False) || (parent == (Window) NULL) ||
4991 client=XClientWindow(display,target);
4992 if (ximage_info->frame == MagickFalse)
4994 if ((ximage_info->frame == MagickFalse) &&
4995 (prior_target != MagickFalse))
4996 target=prior_target;
4999 if (ximage_info->screen != MagickFalse)
5013 status=XGetWindowAttributes(display,target,&window_attributes);
5014 if (status == False)
5016 ThrowXWindowException(XServerError,
"UnableToReadXWindowAttributes",
5017 image_info->filename);
5018 (void) XCloseDisplay(display);
5019 return((Image *) NULL);
5021 (void) XTranslateCoordinates(display,target,root,0,0,&x,&y,&child);
5022 crop_info.x=(ssize_t) x;
5023 crop_info.y=(ssize_t) y;
5024 crop_info.width=(size_t) window_attributes.width;
5025 crop_info.height=(size_t) window_attributes.height;
5026 if (ximage_info->borders != 0)
5031 crop_info.x-=window_attributes.border_width;
5032 crop_info.y-=window_attributes.border_width;
5033 crop_info.width+=(size_t) (window_attributes.border_width << 1);
5034 crop_info.height+=(size_t) (window_attributes.border_width << 1);
5042 status=XGetWMColormapWindows(display,target,&children,&number_windows);
5043 if ((status == True) && (number_windows > 0))
5045 ximage_info->descend=MagickTrue;
5046 (void) XFree ((
char *) children);
5048 colormaps=XListInstalledColormaps(display,target,&number_colormaps);
5049 if (number_colormaps > 0)
5051 if (number_colormaps > 1)
5052 ximage_info->descend=MagickTrue;
5053 (void) XFree((
char *) colormaps);
5058 if (ximage_info->silent == MagickFalse)
5059 (void) XBell(display,0);
5063 (void) XGrabServer(display);
5064 image=XGetWindowImage(display,target,ximage_info->borders,
5065 ximage_info->descend ? 1U : 0U,exception);
5066 (void) XUngrabServer(display);
5067 if (image != (Image *) NULL)
5069 (void) CopyMagickString(image->filename,image_info->filename,
5071 if ((crop_info.width != 0) && (crop_info.height != 0))
5079 crop_image=CropImage(image,&crop_info,exception);
5080 if (crop_image != (Image *) NULL)
5082 image=DestroyImage(image);
5086 status=XGetWMName(display,target,&window_name);
5089 if (*image_info->filename ==
'\0')
5090 (void) CopyMagickString(image->filename,(
char *) window_name.value,
5091 (
size_t) MagickMin(window_name.nitems+1,MagickPathExtent));
5092 (void) XFree((
void *) window_name.value);
5095 if (ximage_info->silent == MagickFalse)
5100 (void) XBell(display,0);
5101 (void) XBell(display,0);
5103 (void) XCloseDisplay(display);
5135MagickPrivate XWindows *XInitializeWindows(Display *display,
5136 XResourceInfo *resource_info)
5147 windows=(XWindows *) AcquireMagickMemory(
sizeof(*windows));
5148 if (windows == (XWindows *) NULL)
5150 ThrowXWindowFatalException(XServerFatalError,
"MemoryAllocationFailed",
5152 return((XWindows *) NULL);
5154 (void) memset(windows,0,
sizeof(*windows));
5155 windows->pixel_info=(XPixelInfo *) AcquireQuantumMemory(1,
5156 sizeof(*windows->pixel_info));
5157 windows->icon_pixel=(XPixelInfo *) AcquireQuantumMemory(1,
5158 sizeof(*windows->icon_pixel));
5159 windows->icon_resources=(XResourceInfo *) AcquireQuantumMemory(1,
5160 sizeof(*windows->icon_resources));
5161 if ((windows->pixel_info == (XPixelInfo *) NULL) ||
5162 (windows->icon_pixel == (XPixelInfo *) NULL) ||
5163 (windows->icon_resources == (XResourceInfo *) NULL))
5165 ThrowXWindowFatalException(XServerFatalError,
"MemoryAllocationFailed",
5167 return((XWindows *) NULL);
5169 (void) memset((
void *) windows->pixel_info,0,
sizeof(XPixelInfo));
5170 (void) memset((
void *) windows->icon_pixel,0,
sizeof(XPixelInfo));
5174 windows->display=display;
5175 windows->wm_protocols=XInternAtom(display,
"WM_PROTOCOLS",MagickFalse);
5176 windows->wm_delete_window=XInternAtom(display,
"WM_DELETE_WINDOW",MagickFalse);
5177 windows->wm_take_focus=XInternAtom(display,
"WM_TAKE_FOCUS",MagickFalse);
5178 windows->im_protocols=XInternAtom(display,
"IM_PROTOCOLS",MagickFalse);
5179 windows->im_remote_command=
5180 XInternAtom(display,
"IM_REMOTE_COMMAND",MagickFalse);
5181 windows->im_update_widget=XInternAtom(display,
"IM_UPDATE_WIDGET",MagickFalse);
5182 windows->im_update_colormap=
5183 XInternAtom(display,
"IM_UPDATE_COLORMAP",MagickFalse);
5184 windows->im_former_image=XInternAtom(display,
"IM_FORMER_IMAGE",MagickFalse);
5185 windows->im_next_image=XInternAtom(display,
"IM_NEXT_IMAGE",MagickFalse);
5186 windows->im_retain_colors=XInternAtom(display,
"IM_RETAIN_COLORS",MagickFalse);
5187 windows->im_exit=XInternAtom(display,
"IM_EXIT",MagickFalse);
5188 windows->dnd_protocols=XInternAtom(display,
"DndProtocol",MagickFalse);
5189#if defined(MAGICKCORE_WINDOWS_SUPPORT)
5190 (void) XSynchronize(display,MagickFalse);
5192 if ((GetLogEventMask() & X11Event) != 0)
5194 (void) XSynchronize(display,MagickTrue);
5195 (void) LogMagickEvent(X11Event,GetMagickModule(),
"Version: %s",
5196 GetMagickVersion((
size_t *) NULL));
5197 (void) LogMagickEvent(X11Event,GetMagickModule(),
"Protocols:");
5198 (void) LogMagickEvent(X11Event,GetMagickModule(),
5199 " Window Manager: 0x%lx",windows->wm_protocols);
5200 (void) LogMagickEvent(X11Event,GetMagickModule(),
5201 " delete window: 0x%lx",windows->wm_delete_window);
5202 (void) LogMagickEvent(X11Event,GetMagickModule(),
" take focus: 0x%lx",
5203 windows->wm_take_focus);
5204 (void) LogMagickEvent(X11Event,GetMagickModule(),
" ImageMagick: 0x%lx",
5205 windows->im_protocols);
5206 (void) LogMagickEvent(X11Event,GetMagickModule(),
5207 " remote command: 0x%lx",windows->im_remote_command);
5208 (void) LogMagickEvent(X11Event,GetMagickModule(),
5209 " update widget: 0x%lx",windows->im_update_widget);
5210 (void) LogMagickEvent(X11Event,GetMagickModule(),
5211 " update colormap: 0x%lx",windows->im_update_colormap);
5212 (void) LogMagickEvent(X11Event,GetMagickModule(),
5213 " former image: 0x%lx",windows->im_former_image);
5214 (void) LogMagickEvent(X11Event,GetMagickModule(),
" next image: 0x%lx",
5215 windows->im_next_image);
5216 (void) LogMagickEvent(X11Event,GetMagickModule(),
5217 " retain colors: 0x%lx",windows->im_retain_colors);
5218 (void) LogMagickEvent(X11Event,GetMagickModule(),
" exit: 0x%lx",
5220 (void) LogMagickEvent(X11Event,GetMagickModule(),
" Drag and Drop: 0x%lx",
5221 windows->dnd_protocols);
5226 windows->map_info=XAllocStandardColormap();
5227 windows->icon_map=XAllocStandardColormap();
5228 if ((windows->map_info == (XStandardColormap *) NULL) ||
5229 (windows->icon_map == (XStandardColormap *) NULL))
5230 ThrowXWindowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed",
5232 windows->map_info->colormap=(Colormap) NULL;
5233 windows->icon_map->colormap=(Colormap) NULL;
5234 windows->pixel_info->pixels=(
unsigned long *) NULL;
5235 windows->pixel_info->annotate_context=(GC) NULL;
5236 windows->pixel_info->highlight_context=(GC) NULL;
5237 windows->pixel_info->widget_context=(GC) NULL;
5238 windows->font_info=(XFontStruct *) NULL;
5239 windows->icon_pixel->annotate_context=(GC) NULL;
5240 windows->icon_pixel->pixels=(
unsigned long *) NULL;
5244 *windows->icon_resources=(*resource_info);
5245 windows->icon_resources->visual_type=(
char *)
"default";
5246 windows->icon_resources->colormap=SharedColormap;
5247 windows->visual_info=
5248 XBestVisualInfo(display,windows->map_info,resource_info);
5249 windows->icon_visual=
5250 XBestVisualInfo(display,windows->icon_map,windows->icon_resources);
5251 if ((windows->visual_info == (XVisualInfo *) NULL) ||
5252 (windows->icon_visual == (XVisualInfo *) NULL))
5253 ThrowXWindowFatalException(XServerFatalError,
"UnableToGetVisual",
5254 resource_info->visual_type);
5255 if ((GetLogEventMask() & X11Event) != 0)
5257 (void) LogMagickEvent(X11Event,GetMagickModule(),
"Visual:");
5258 (void) LogMagickEvent(X11Event,GetMagickModule(),
" visual id: 0x%lx",
5259 windows->visual_info->visualid);
5260 (void) LogMagickEvent(X11Event,GetMagickModule(),
" class: %s",
5261 XVisualClassName(windows->visual_info->klass));
5262 (void) LogMagickEvent(X11Event,GetMagickModule(),
" depth: %d planes",
5263 windows->visual_info->depth);
5264 (void) LogMagickEvent(X11Event,GetMagickModule(),
5265 " size of colormap: %d entries",windows->visual_info->colormap_size);
5266 (void) LogMagickEvent(X11Event,GetMagickModule(),
5267 " red, green, blue masks: 0x%lx 0x%lx 0x%lx",
5268 windows->visual_info->red_mask,windows->visual_info->green_mask,
5269 windows->visual_info->blue_mask);
5270 (void) LogMagickEvent(X11Event,GetMagickModule(),
5271 " significant bits in color: %d bits",
5272 windows->visual_info->bits_per_rgb);
5277 windows->class_hints=XAllocClassHint();
5278 windows->manager_hints=XAllocWMHints();
5279 if ((windows->class_hints == (XClassHint *) NULL) ||
5280 (windows->manager_hints == (XWMHints *) NULL))
5281 ThrowXWindowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed",
5286 root_window=XRootWindow(display,windows->visual_info->screen);
5287 windows->group_leader.id=(Window) NULL;
5288 if (resource_info->window_group != (
char *) NULL)
5290 if (isdigit((
int) ((
unsigned char) *resource_info->window_group)) != 0)
5291 windows->group_leader.id=XWindowByID(display,root_window,(Window)
5292 strtol((
char *) resource_info->window_group,(
char **) NULL,0));
5293 if (windows->group_leader.id == (Window) NULL)
5294 windows->group_leader.id=
5295 XWindowByName(display,root_window,resource_info->window_group);
5334MagickPrivate Cursor XMakeCursor(Display *display,Window window,
5335 Colormap colormap,
char *background_color,
char *foreground_color)
5337#define scope_height 17
5338#define scope_x_hot 8
5339#define scope_y_hot 8
5340#define scope_width 17
5342 static const unsigned char
5345 0x80, 0x03, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02,
5346 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x7f,
5347 0xfc, 0x01, 0x01, 0x00, 0x01, 0x7f, 0xfc, 0x01, 0x80, 0x02, 0x00,
5348 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02,
5349 0x00, 0x80, 0x02, 0x00, 0x80, 0x03, 0x00
5353 0xc0, 0x07, 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x06, 0x00, 0xc0, 0x06,
5354 0x00, 0xc0, 0x06, 0x00, 0xc0, 0x06, 0x00, 0xff, 0xfe, 0x01, 0x7f,
5355 0xfc, 0x01, 0x03, 0x80, 0x01, 0x7f, 0xfc, 0x01, 0xff, 0xfe, 0x01,
5356 0xc0, 0x06, 0x00, 0xc0, 0x06, 0x00, 0xc0, 0x06, 0x00, 0xc0, 0x06,
5357 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x07, 0x00
5371 assert(display != (Display *) NULL);
5372 assert(window != (Window) NULL);
5373 assert(colormap != (Colormap) NULL);
5374 assert(background_color != (
char *) NULL);
5375 assert(foreground_color != (
char *) NULL);
5376 if (IsEventLogging() != MagickFalse)
5377 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",background_color);
5378 source=XCreateBitmapFromData(display,window,(
char *) scope_bits,scope_width,
5380 mask=XCreateBitmapFromData(display,window,(
char *) scope_mask_bits,
5381 scope_width,scope_height);
5382 if ((source == (Pixmap) NULL) || (mask == (Pixmap) NULL))
5384 ThrowXWindowException(XServerError,
"UnableToCreatePixmap",
"...");
5385 return((Cursor) NULL);
5387 (void) XParseColor(display,colormap,background_color,&background);
5388 (void) XParseColor(display,colormap,foreground_color,&foreground);
5389 cursor=XCreatePixmapCursor(display,source,mask,&foreground,&background,
5390 scope_x_hot,scope_y_hot);
5391 (void) XFreePixmap(display,source);
5392 (void) XFreePixmap(display,mask);
5436MagickPrivate MagickBooleanType XMakeImage(Display *display,
5437 const XResourceInfo *resource_info,XWindowInfo *window,Image *image,
5438 unsigned int width,
unsigned int height,ExceptionInfo *exception)
5440#define CheckOverflowException(length,width,height) \
5441 (((height) != 0) && ((length)/((size_t) height) != ((size_t) width)))
5451 assert(display != (Display *) NULL);
5452 assert(resource_info != (XResourceInfo *) NULL);
5453 assert(window != (XWindowInfo *) NULL);
5455 assert(height != 0);
5456 if (IsEventLogging() != MagickFalse)
5457 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
5458 if ((window->width == 0) || (window->height == 0))
5459 return(MagickFalse);
5463 (void) XCheckDefineCursor(display,window->id,window->busy_cursor);
5464 (void) XFlush(display);
5465 depth=(int) window->depth;
5466 if (window->destroy)
5467 window->image=DestroyImage(window->image);
5468 window->image=image;
5469 window->destroy=MagickFalse;
5470 if (window->image != (Image *) NULL)
5472 if (window->crop_geometry != (
char *) NULL)
5483 window->image->page.x=0;
5484 window->image->page.y=0;
5485 (void) ParsePageGeometry(window->image,window->crop_geometry,
5486 &crop_info,exception);
5487 crop_image=CropImage(window->image,&crop_info,exception);
5488 if (crop_image != (Image *) NULL)
5490 if (window->image != image)
5491 window->image=DestroyImage(window->image);
5492 window->image=crop_image;
5493 window->destroy=MagickTrue;
5496 if ((width != (
unsigned int) window->image->columns) ||
5497 (height != (
unsigned int) window->image->rows))
5505 resize_image=NewImageList();
5506 if ((window->pixel_info->colors == 0) &&
5507 (window->image->rows > (
unsigned long) XDisplayHeight(display,window->screen)) &&
5508 (window->image->columns > (
unsigned long) XDisplayWidth(display,window->screen)))
5509 resize_image=ResizeImage(window->image,width,height,
5510 image->filter,exception);
5513 if (window->image->storage_class == PseudoClass)
5514 resize_image=SampleImage(window->image,width,height,
5517 resize_image=ThumbnailImage(window->image,width,height,
5520 if (resize_image != (Image *) NULL)
5522 if (window->image != image)
5523 window->image=DestroyImage(window->image);
5524 window->image=resize_image;
5525 window->destroy=MagickTrue;
5528 width=(
unsigned int) window->image->columns;
5529 assert((
size_t) width == window->image->columns);
5530 height=(
unsigned int) window->image->rows;
5531 assert((
size_t) height == window->image->rows);
5536 ximage=(XImage *) NULL;
5537 format=(depth == 1) ? XYBitmap : ZPixmap;
5538#if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
5539 if (window->shared_memory != MagickFalse)
5547 segment_info=(XShmSegmentInfo *) window->segment_info;
5548 segment_info[1].shmid=(-1);
5549 segment_info[1].shmaddr=(
char *) NULL;
5550 ximage=XShmCreateImage(display,window->visual,(
unsigned int) depth,format,
5551 (
char *) NULL,&segment_info[1],width,height);
5553 if (ximage == (XImage *) NULL)
5554 window->shared_memory=MagickFalse;
5557 length=(size_t) (ximage->bytes_per_line*ximage->height);
5558 if (CheckOverflowException(length,ximage->bytes_per_line,ximage->height))
5559 window->shared_memory=MagickFalse;
5561 if (window->shared_memory != MagickFalse)
5562 segment_info[1].shmid=shmget(IPC_PRIVATE,length,IPC_CREAT | 0777);
5563 if (window->shared_memory != MagickFalse)
5564 segment_info[1].shmaddr=(
char *) shmat(segment_info[1].shmid,0,0);
5565 if (segment_info[1].shmid < 0)
5566 window->shared_memory=MagickFalse;
5567 if (window->shared_memory != MagickFalse)
5568 (void) shmctl(segment_info[1].shmid,IPC_RMID,0);
5571 if (ximage != (XImage *) NULL)
5572 XDestroyImage(ximage);
5573 ximage=(XImage *) NULL;
5574 if (segment_info[1].shmaddr)
5576 (void) shmdt(segment_info[1].shmaddr);
5577 segment_info[1].shmaddr=(
char *) NULL;
5579 if (segment_info[1].shmid >= 0)
5581 (void) shmctl(segment_info[1].shmid,IPC_RMID,0);
5582 segment_info[1].shmid=(-1);
5590#if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
5591 if (window->shared_memory)
5599 (void) XSync(display,MagickFalse);
5600 xerror_alert=MagickFalse;
5601 segment_info=(XShmSegmentInfo *) window->segment_info;
5602 ximage->data=segment_info[1].shmaddr;
5603 segment_info[1].readOnly=MagickFalse;
5604 status=XShmAttach(display,&segment_info[1]);
5605 if (status != False)
5606 (void) XSync(display,MagickFalse);
5607 if ((status == False) || (xerror_alert != MagickFalse))
5609 window->shared_memory=MagickFalse;
5610 if (status != False)
5611 XShmDetach(display,&segment_info[1]);
5613 XDestroyImage(ximage);
5614 ximage=(XImage *) NULL;
5615 if (segment_info[1].shmid >= 0)
5617 if (segment_info[1].shmaddr != NULL)
5618 (void) shmdt(segment_info[1].shmaddr);
5619 (void) shmctl(segment_info[1].shmid,IPC_RMID,0);
5620 segment_info[1].shmid=(-1);
5621 segment_info[1].shmaddr=(
char *) NULL;
5626 if (window->shared_memory == MagickFalse)
5627 ximage=XCreateImage(display,window->visual,(
unsigned int) depth,format,0,
5628 (
char *) NULL,width,height,XBitmapPad(display),0);
5629 if (ximage == (XImage *) NULL)
5634 (void) XCheckDefineCursor(display,window->id,window->cursor);
5635 return(MagickFalse);
5637 if ((GetLogEventMask() & X11Event) != 0)
5639 (void) LogMagickEvent(X11Event,GetMagickModule(),
"XImage:");
5640 (void) LogMagickEvent(X11Event,GetMagickModule(),
" width, height: %dx%d",
5641 ximage->width,ximage->height);
5642 (void) LogMagickEvent(X11Event,GetMagickModule(),
" format: %d",
5644 (void) LogMagickEvent(X11Event,GetMagickModule(),
" byte order: %d",
5645 ximage->byte_order);
5646 (void) LogMagickEvent(X11Event,GetMagickModule(),
5647 " bitmap unit, bit order, pad: %d %d %d",ximage->bitmap_unit,
5648 ximage->bitmap_bit_order,ximage->bitmap_pad);
5649 (void) LogMagickEvent(X11Event,GetMagickModule(),
" depth: %d",
5651 (void) LogMagickEvent(X11Event,GetMagickModule(),
" bytes per line: %d",
5652 ximage->bytes_per_line);
5653 (void) LogMagickEvent(X11Event,GetMagickModule(),
" bits per pixel: %d",
5654 ximage->bits_per_pixel);
5655 (void) LogMagickEvent(X11Event,GetMagickModule(),
5656 " red, green, blue masks: 0x%lx 0x%lx 0x%lx",ximage->red_mask,
5657 ximage->green_mask,ximage->blue_mask);
5659 if (window->shared_memory == MagickFalse)
5661 if (ximage->format == XYBitmap)
5663 ximage->data=(
char *) AcquireQuantumMemory((
size_t)
5664 ximage->bytes_per_line,(
size_t) (ximage->depth*ximage->height));
5665 if (ximage->data != (
char *) NULL)
5666 (void) memset(ximage->data,0,(
size_t)
5667 (ximage->bytes_per_line*ximage->depth*ximage->height));
5671 ximage->data=(
char *) AcquireQuantumMemory((
size_t)
5672 ximage->bytes_per_line,(
size_t) ximage->height);
5673 if (ximage->data != (
char *) NULL)
5674 (void) memset(ximage->data,0,(
size_t)
5675 (ximage->bytes_per_line*ximage->height));
5678 if (ximage->data == (
char *) NULL)
5683 XDestroyImage(ximage);
5684 ximage=(XImage *) NULL;
5685 (void) XCheckDefineCursor(display,window->id,window->cursor);
5686 return(MagickFalse);
5688 if (window->ximage != (XImage *) NULL)
5693#if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
5694 if (window->segment_info != (XShmSegmentInfo *) NULL)
5699 segment_info=(XShmSegmentInfo *) window->segment_info;
5700 if (segment_info[0].shmid >= 0)
5702 (void) XSync(display,MagickFalse);
5703 (void) XShmDetach(display,&segment_info[0]);
5704 (void) XSync(display,MagickFalse);
5705 if (segment_info[0].shmaddr != (
char *) NULL)
5706 (void) shmdt(segment_info[0].shmaddr);
5707 (void) shmctl(segment_info[0].shmid,IPC_RMID,0);
5708 segment_info[0].shmid=(-1);
5709 segment_info[0].shmaddr=(
char *) NULL;
5710 window->ximage->data=(
char *) NULL;
5714 if (window->ximage->data != (
char *) NULL)
5715 free(window->ximage->data);
5716 window->ximage->data=(
char *) NULL;
5717 XDestroyImage(window->ximage);
5718 window->ximage=(XImage *) NULL;
5720#if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
5721 if (window->segment_info != (XShmSegmentInfo *) NULL)
5726 segment_info=(XShmSegmentInfo *) window->segment_info;
5727 segment_info[0]=segment_info[1];
5730 window->ximage=ximage;
5731 matte_image=(XImage *) NULL;
5732 if ((window->shape != MagickFalse) && (window->image != (Image *) NULL))
5733 if ((window->image->alpha_trait != UndefinedPixelTrait) &&
5734 ((
int) width <= XDisplayWidth(display,window->screen)) &&
5735 ((
int) height <= XDisplayHeight(display,window->screen)))
5740 matte_image=XCreateImage(display,window->visual,1,XYBitmap,0,
5741 (
char *) NULL,width,height,XBitmapPad(display),0);
5742 if ((GetLogEventMask() & X11Event) != 0)
5744 (void) LogMagickEvent(X11Event,GetMagickModule(),
"Matte Image:");
5745 (void) LogMagickEvent(X11Event,GetMagickModule(),
5746 " width, height: %dx%d",matte_image->width,matte_image->height);
5748 if (matte_image != (XImage *) NULL)
5753 matte_image->data=(
char *) malloc((
size_t)
5754 (matte_image->bytes_per_line*matte_image->depth*
5755 matte_image->height));
5756 if (matte_image->data == (
char *) NULL)
5758 XDestroyImage(matte_image);
5759 matte_image=(XImage *) NULL;
5763 if (window->matte_image != (XImage *) NULL)
5768 if (window->matte_image->data != (
char *) NULL)
5769 free(window->matte_image->data);
5770 window->matte_image->data=(
char *) NULL;
5771 XDestroyImage(window->matte_image);
5772 window->matte_image=(XImage *) NULL;
5774 window->matte_image=matte_image;
5775 if (window->matte_pixmap != (Pixmap) NULL)
5777 (void) XFreePixmap(display,window->matte_pixmap);
5778 window->matte_pixmap=(Pixmap) NULL;
5779#if defined(MAGICKCORE_HAVE_SHAPE)
5780 if (window->shape != MagickFalse)
5781 XShapeCombineMask(display,window->id,ShapeBounding,0,0,None,ShapeSet);
5784 window->stasis=MagickFalse;
5788 if (window->image != (Image *) NULL)
5790 if ((ximage->byte_order == LSBFirst) || ((ximage->format == XYBitmap) &&
5791 (ximage->bitmap_bit_order == LSBFirst)))
5792 XMakeImageLSBFirst(resource_info,window,window->image,ximage,
5793 matte_image,exception);
5795 XMakeImageMSBFirst(resource_info,window,window->image,ximage,
5796 matte_image,exception);
5798 if (window->matte_image != (XImage *) NULL)
5803 window->matte_pixmap=XCreatePixmap(display,window->id,width,height,1);
5804 if (window->matte_pixmap != (Pixmap) NULL)
5815 context_values.background=0;
5816 context_values.foreground=1;
5817 graphics_context=XCreateGC(display,window->matte_pixmap,
5818 (
size_t) (GCBackground | GCForeground),&context_values);
5819 (void) XPutImage(display,window->matte_pixmap,graphics_context,
5820 window->matte_image,0,0,0,0,width,height);
5821 (void) XFreeGC(display,graphics_context);
5822#if defined(MAGICKCORE_HAVE_SHAPE)
5823 if (window->shape != MagickFalse)
5824 XShapeCombineMask(display,window->id,ShapeBounding,0,0,
5825 window->matte_pixmap,ShapeSet);
5829 (void) XMakePixmap(display,resource_info,window);
5833 (void) XCheckDefineCursor(display,window->id,window->cursor);
5876static void XMakeImageLSBFirst(
const XResourceInfo *resource_info,
5877 const XWindowInfo *window,Image *image,XImage *ximage,XImage *matte_image,
5878 ExceptionInfo *exception)
5912 assert(resource_info != (XResourceInfo *) NULL);
5913 assert(window != (XWindowInfo *) NULL);
5914 assert(image != (Image *) NULL);
5915 if (IsEventLogging() != MagickFalse)
5916 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
5918 if ((window->immutable == MagickFalse) &&
5919 (image->storage_class == DirectClass) &&
5920 (image->alpha_trait != UndefinedPixelTrait))
5923 size[MagickPathExtent];
5931 image_info=AcquireImageInfo();
5932 (void) CopyMagickString(image_info->filename,
5933 resource_info->image_info->texture != (
char *) NULL ?
5934 resource_info->image_info->texture :
"pattern:checkerboard",
5936 (void) FormatLocaleString(size,MagickPathExtent,
"%.17gx%.17g",(
double)
5937 image->columns,(
double) image->rows);
5938 image_info->size=ConstantString(size);
5939 pattern=ReadImage(image_info,exception);
5940 image_info=DestroyImageInfo(image_info);
5941 if (pattern != (Image *) NULL)
5943 canvas=CloneImage(image,0,0,MagickTrue,exception);
5944 if (canvas == (Image *) NULL)
5946 (void) CompositeImage(canvas,pattern,DstOverCompositeOp,MagickTrue,
5948 pattern=DestroyImage(pattern);
5951 scanline_pad=(
unsigned int) (ximage->bytes_per_line-((ximage->width*
5952 ximage->bits_per_pixel) >> 3));
5953 map_info=window->map_info;
5954 pixels=window->pixel_info->pixels;
5955 q=(
unsigned char *) ximage->data;
5957 canvas_view=AcquireVirtualCacheView(canvas,exception);
5958 if (ximage->format == XYBitmap)
5970 background=(
unsigned char)
5971 (XPixelIntensity(&window->pixel_info->foreground_color) <
5972 XPixelIntensity(&window->pixel_info->background_color) ? 0x80 : 0x00);
5973 foreground=(
unsigned char)
5974 (XPixelIntensity(&window->pixel_info->background_color) <
5975 XPixelIntensity(&window->pixel_info->foreground_color) ? 0x80 : 0x00);
5976 polarity=(
unsigned short) ((GetPixelInfoIntensity(image,
5977 &canvas->colormap[0])) < ((
double) QuantumRange/2.0) ? 1 : 0);
5978 if (canvas->colors == 2)
5979 polarity=GetPixelInfoIntensity(image,&canvas->colormap[0]) <
5980 GetPixelInfoIntensity(image,&canvas->colormap[1]);
5981 for (y=0; y < (int) canvas->rows; y++)
5983 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,canvas->columns,1,
5985 if (p == (
const Quantum *) NULL)
5989 for (x=0; x < (int) canvas->columns; x++)
5992 if (GetPixelIndex(canvas,p) == (Quantum) polarity)
6003 p+=(ptrdiff_t) GetPixelChannels(canvas);
6007 q+=(ptrdiff_t) scanline_pad;
6011 if (window->pixel_info->colors != 0)
6012 switch (ximage->bits_per_pixel)
6022 for (y=0; y < (int) canvas->rows; y++)
6024 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6025 canvas->columns,1,exception);
6026 if (p == (
const Quantum *) NULL)
6029 for (x=0; x < (int) canvas->columns; x++)
6031 pixel=pixels[(ssize_t) GetPixelIndex(canvas,p)] & 0x0f;
6036 *q=(
unsigned char) pixel;
6042 *q|=(
unsigned char) (pixel << 2);
6048 *q|=(
unsigned char) (pixel << 4);
6054 *q|=(
unsigned char) (pixel << 6);
6060 p+=(ptrdiff_t) GetPixelChannels(canvas);
6062 q+=(ptrdiff_t) scanline_pad;
6074 for (y=0; y < (int) canvas->rows; y++)
6076 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6077 canvas->columns,1,exception);
6078 if (p == (
const Quantum *) NULL)
6081 for (x=0; x < (int) canvas->columns; x++)
6083 pixel=pixels[(ssize_t) GetPixelIndex(canvas,p)] & 0xf;
6088 *q=(
unsigned char) pixel;
6094 *q|=(
unsigned char) (pixel << 4);
6100 p+=(ptrdiff_t) GetPixelChannels(canvas);
6102 q+=(ptrdiff_t) scanline_pad;
6112 if (resource_info->color_recovery &&
6113 resource_info->quantize_info->dither_method != NoDitherMethod)
6115 XDitherImage(canvas,ximage,exception);
6118 for (y=0; y < (int) canvas->rows; y++)
6120 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6121 canvas->columns,1,exception);
6122 if (p == (
const Quantum *) NULL)
6124 for (x=0; x < (int) canvas->columns; x++)
6126 pixel=pixels[(ssize_t) GetPixelIndex(canvas,p)];
6127 *q++=(
unsigned char) pixel;
6128 p+=(ptrdiff_t) GetPixelChannels(canvas);
6130 q+=(ptrdiff_t) scanline_pad;
6145 bytes_per_pixel=(
unsigned int) (ximage->bits_per_pixel >> 3);
6146 for (y=0; y < (int) canvas->rows; y++)
6148 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6149 canvas->columns,1,exception);
6150 if (p == (
const Quantum *) NULL)
6152 for (x=0; x < (int) canvas->columns; x++)
6154 pixel=pixels[(ssize_t) GetPixelIndex(canvas,p)];
6155 for (k=0; k < (int) bytes_per_pixel; k++)
6157 *q++=(
unsigned char) (pixel & 0xff);
6160 p+=(ptrdiff_t) GetPixelChannels(canvas);
6162 q+=(ptrdiff_t) scanline_pad;
6168 switch (ximage->bits_per_pixel)
6178 for (y=0; y < (int) canvas->rows; y++)
6181 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6182 canvas->columns,1,exception);
6183 if (p == (
const Quantum *) NULL)
6185 for (x=0; x < (int) canvas->columns; x++)
6187 pixel=XGammaPixel(canvas,map_info,p);
6193 *q=(
unsigned char) pixel;
6199 *q|=(
unsigned char) (pixel << 2);
6205 *q|=(
unsigned char) (pixel << 4);
6211 *q|=(
unsigned char) (pixel << 6);
6217 p+=(ptrdiff_t) GetPixelChannels(canvas);
6219 q+=(ptrdiff_t) scanline_pad;
6231 for (y=0; y < (int) canvas->rows; y++)
6233 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6234 canvas->columns,1,exception);
6235 if (p == (
const Quantum *) NULL)
6238 for (x=0; x < (int) canvas->columns; x++)
6240 pixel=XGammaPixel(canvas,map_info,p);
6246 *q=(
unsigned char) pixel;
6252 *q|=(
unsigned char) (pixel << 4);
6258 p+=(ptrdiff_t) GetPixelChannels(canvas);
6260 q+=(ptrdiff_t) scanline_pad;
6270 if (resource_info->color_recovery &&
6271 resource_info->quantize_info->dither_method != NoDitherMethod)
6273 XDitherImage(canvas,ximage,exception);
6276 for (y=0; y < (int) canvas->rows; y++)
6278 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6279 canvas->columns,1,exception);
6280 if (p == (
const Quantum *) NULL)
6282 for (x=0; x < (int) canvas->columns; x++)
6284 pixel=XGammaPixel(canvas,map_info,p);
6285 *q++=(
unsigned char) pixel;
6286 p+=(ptrdiff_t) GetPixelChannels(canvas);
6288 q+=(ptrdiff_t) scanline_pad;
6294 if ((ximage->bits_per_pixel == 32) && (map_info->red_max == 255) &&
6295 (map_info->green_max == 255) && (map_info->blue_max == 255) &&
6296 (map_info->red_mult == 65536L) && (map_info->green_mult == 256) &&
6297 (map_info->blue_mult == 1))
6302 for (y=0; y < (int) canvas->rows; y++)
6304 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6305 canvas->columns,1,exception);
6306 if (p == (
const Quantum *) NULL)
6308 if ((red_gamma != 1.0) || (green_gamma != 1.0) ||
6309 (blue_gamma != 1.0))
6314 for (x=(
int) canvas->columns-1; x >= 0; x--)
6316 *q++=ScaleQuantumToChar(XBlueGamma(
6317 GetPixelBlue(canvas,p)));
6318 *q++=ScaleQuantumToChar(XGreenGamma(
6319 GetPixelGreen(canvas,p)));
6320 *q++=ScaleQuantumToChar(XRedGamma(
6321 GetPixelRed(canvas,p)));
6323 p+=(ptrdiff_t) GetPixelChannels(canvas);
6327 for (x=(
int) canvas->columns-1; x >= 0; x--)
6329 *q++=ScaleQuantumToChar((Quantum) GetPixelBlue(canvas,p));
6330 *q++=ScaleQuantumToChar((Quantum) GetPixelGreen(canvas,p));
6331 *q++=ScaleQuantumToChar((Quantum) GetPixelRed(canvas,p));
6333 p+=(ptrdiff_t) GetPixelChannels(canvas);
6338 if ((ximage->bits_per_pixel == 32) && (map_info->red_max == 255) &&
6339 (map_info->green_max == 255) && (map_info->blue_max == 255) &&
6340 (map_info->red_mult == 1) && (map_info->green_mult == 256) &&
6341 (map_info->blue_mult == 65536L))
6346 for (y=0; y < (int) canvas->rows; y++)
6348 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6349 canvas->columns,1,exception);
6350 if (p == (
const Quantum *) NULL)
6352 if ((red_gamma != 1.0) || (green_gamma != 1.0) ||
6353 (blue_gamma != 1.0))
6358 for (x=(
int) canvas->columns-1; x >= 0; x--)
6360 *q++=ScaleQuantumToChar(XRedGamma(
6361 GetPixelRed(canvas,p)));
6362 *q++=ScaleQuantumToChar(XGreenGamma(
6363 GetPixelGreen(canvas,p)));
6364 *q++=ScaleQuantumToChar(XBlueGamma(
6365 GetPixelBlue(canvas,p)));
6367 p+=(ptrdiff_t) GetPixelChannels(canvas);
6371 for (x=(
int) canvas->columns-1; x >= 0; x--)
6373 *q++=ScaleQuantumToChar((Quantum) GetPixelRed(canvas,p));
6374 *q++=ScaleQuantumToChar((Quantum) GetPixelGreen(canvas,p));
6375 *q++=ScaleQuantumToChar((Quantum) GetPixelBlue(canvas,p));
6377 p+=(ptrdiff_t) GetPixelChannels(canvas);
6392 bytes_per_pixel=(
unsigned int) (ximage->bits_per_pixel >> 3);
6393 for (y=0; y < (int) canvas->rows; y++)
6395 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6396 canvas->columns,1,exception);
6397 if (p == (
const Quantum *) NULL)
6399 for (x=0; x < (int) canvas->columns; x++)
6401 pixel=XGammaPixel(canvas,map_info,p);
6402 for (k=0; k < (int) bytes_per_pixel; k++)
6404 *q++=(
unsigned char) (pixel & 0xff);
6407 p+=(ptrdiff_t) GetPixelChannels(canvas);
6409 q+=(ptrdiff_t) scanline_pad;
6415 if (matte_image != (XImage *) NULL)
6420 scanline_pad=(
unsigned int) (matte_image->bytes_per_line-
6421 ((matte_image->width*matte_image->bits_per_pixel) >> 3));
6422 q=(
unsigned char *) matte_image->data;
6423 for (y=0; y < (int) canvas->rows; y++)
6425 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,canvas->columns,1,
6427 if (p == (
const Quantum *) NULL)
6431 for (x=(
int) canvas->columns-1; x >= 0; x--)
6434 if (GetPixelAlpha(canvas,p) > (QuantumRange/2))
6443 p+=(ptrdiff_t) GetPixelChannels(canvas);
6447 q+=(ptrdiff_t) scanline_pad;
6450 canvas_view=DestroyCacheView(canvas_view);
6451 if (canvas != image)
6452 canvas=DestroyImage(canvas);
6494static void XMakeImageMSBFirst(
const XResourceInfo *resource_info,
6495 const XWindowInfo *window,Image *image,XImage *ximage,XImage *matte_image,
6496 ExceptionInfo *exception)
6530 assert(resource_info != (XResourceInfo *) NULL);
6531 assert(window != (XWindowInfo *) NULL);
6532 assert(image != (Image *) NULL);
6533 if (IsEventLogging() != MagickFalse)
6534 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
6536 if ((window->immutable != MagickFalse) &&
6537 (image->storage_class == DirectClass) &&
6538 (image->alpha_trait != UndefinedPixelTrait))
6541 size[MagickPathExtent];
6549 image_info=AcquireImageInfo();
6550 (void) CopyMagickString(image_info->filename,
6551 resource_info->image_info->texture != (
char *) NULL ?
6552 resource_info->image_info->texture :
"pattern:checkerboard",
6554 (void) FormatLocaleString(size,MagickPathExtent,
"%.17gx%.17g",(
double)
6555 image->columns,(
double) image->rows);
6556 image_info->size=ConstantString(size);
6557 pattern=ReadImage(image_info,exception);
6558 image_info=DestroyImageInfo(image_info);
6559 if (pattern != (Image *) NULL)
6561 canvas=CloneImage(image,0,0,MagickTrue,exception);
6562 if (canvas == (Image *) NULL)
6564 (void) CompositeImage(canvas,pattern,DstOverCompositeOp,MagickFalse,
6566 pattern=DestroyImage(pattern);
6569 scanline_pad=(
unsigned int) (ximage->bytes_per_line-((ximage->width*
6570 ximage->bits_per_pixel) >> 3));
6571 map_info=window->map_info;
6572 pixels=window->pixel_info->pixels;
6573 q=(
unsigned char *) ximage->data;
6575 canvas_view=AcquireVirtualCacheView(canvas,exception);
6576 if (ximage->format == XYBitmap)
6588 background=(
unsigned char)
6589 (XPixelIntensity(&window->pixel_info->foreground_color) <
6590 XPixelIntensity(&window->pixel_info->background_color) ? 0x01 : 0x00);
6591 foreground=(
unsigned char)
6592 (XPixelIntensity(&window->pixel_info->background_color) <
6593 XPixelIntensity(&window->pixel_info->foreground_color) ? 0x01 : 0x00);
6594 polarity=(
unsigned short) ((GetPixelInfoIntensity(image,
6595 &canvas->colormap[0])) < ((
double) QuantumRange/2.0) ? 1 : 0);
6596 if (canvas->colors == 2)
6597 polarity=GetPixelInfoIntensity(image,&canvas->colormap[0]) <
6598 GetPixelInfoIntensity(image,&canvas->colormap[1]);
6599 for (y=0; y < (int) canvas->rows; y++)
6601 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,canvas->columns,1,
6603 if (p == (
const Quantum *) NULL)
6607 for (x=(
int) canvas->columns-1; x >= 0; x--)
6610 if (GetPixelIndex(canvas,p) == (Quantum) polarity)
6621 p+=(ptrdiff_t) GetPixelChannels(canvas);
6625 q+=(ptrdiff_t) scanline_pad;
6629 if (window->pixel_info->colors != 0)
6630 switch (ximage->bits_per_pixel)
6640 for (y=0; y < (int) canvas->rows; y++)
6642 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6643 canvas->columns,1,exception);
6644 if (p == (
const Quantum *) NULL)
6647 for (x=0; x < (int) canvas->columns; x++)
6649 pixel=pixels[(ssize_t)
6650 GetPixelIndex(canvas,p)] & 0xf;
6655 *q=(
unsigned char) (pixel << 6);
6661 *q|=(
unsigned char) (pixel << 4);
6667 *q|=(
unsigned char) (pixel << 2);
6673 *q|=(
unsigned char) pixel;
6679 p+=(ptrdiff_t) GetPixelChannels(canvas);
6681 q+=(ptrdiff_t) scanline_pad;
6693 for (y=0; y < (int) canvas->rows; y++)
6695 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6696 canvas->columns,1,exception);
6697 if (p == (
const Quantum *) NULL)
6700 for (x=0; x < (int) canvas->columns; x++)
6702 pixel=pixels[(ssize_t)
6703 GetPixelIndex(canvas,p)] & 0xf;
6708 *q=(
unsigned char) (pixel << 4);
6714 *q|=(
unsigned char) pixel;
6720 p+=(ptrdiff_t) GetPixelChannels(canvas);
6722 q+=(ptrdiff_t) scanline_pad;
6732 if ((resource_info->color_recovery != MagickFalse) &&
6733 (resource_info->quantize_info->dither_method != NoDitherMethod))
6735 XDitherImage(canvas,ximage,exception);
6738 for (y=0; y < (int) canvas->rows; y++)
6740 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6741 canvas->columns,1,exception);
6742 if (p == (
const Quantum *) NULL)
6744 for (x=0; x < (int) canvas->columns; x++)
6746 pixel=pixels[(ssize_t) GetPixelIndex(canvas,p)];
6747 *q++=(
unsigned char) pixel;
6748 p+=(ptrdiff_t) GetPixelChannels(canvas);
6750 q+=(ptrdiff_t) scanline_pad;
6763 channel[
sizeof(size_t)];
6768 bytes_per_pixel=(
unsigned int) (ximage->bits_per_pixel >> 3);
6769 for (y=0; y < (int) canvas->rows; y++)
6771 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6772 canvas->columns,1,exception);
6773 if (p == (
const Quantum *) NULL)
6775 for (x=0; x < (int) canvas->columns; x++)
6777 pixel=pixels[(ssize_t)
6778 GetPixelIndex(canvas,p)];
6779 for (k=(
int) bytes_per_pixel-1; k >= 0; k--)
6781 channel[k]=(
unsigned char) pixel;
6784 for (k=0; k < (int) bytes_per_pixel; k++)
6786 p+=(ptrdiff_t) GetPixelChannels(canvas);
6788 q+=(ptrdiff_t) scanline_pad;
6794 switch (ximage->bits_per_pixel)
6804 for (y=0; y < (int) canvas->rows; y++)
6806 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6807 canvas->columns,1,exception);
6808 if (p == (
const Quantum *) NULL)
6811 for (x=(
int) canvas->columns-1; x >= 0; x--)
6813 pixel=XGammaPixel(canvas,map_info,p);
6819 *q=(
unsigned char) (pixel << 6);
6825 *q|=(
unsigned char) (pixel << 4);
6831 *q|=(
unsigned char) (pixel << 2);
6837 *q|=(
unsigned char) pixel;
6843 p+=(ptrdiff_t) GetPixelChannels(canvas);
6845 q+=(ptrdiff_t) scanline_pad;
6857 for (y=0; y < (int) canvas->rows; y++)
6859 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6860 canvas->columns,1,exception);
6861 if (p == (
const Quantum *) NULL)
6864 for (x=(
int) canvas->columns-1; x >= 0; x--)
6866 pixel=XGammaPixel(canvas,map_info,p);
6872 *q=(
unsigned char) (pixel << 4);
6878 *q|=(
unsigned char) pixel;
6884 p+=(ptrdiff_t) GetPixelChannels(canvas);
6886 q+=(ptrdiff_t) scanline_pad;
6896 if ((resource_info->color_recovery != MagickFalse) &&
6897 (resource_info->quantize_info->dither_method != NoDitherMethod))
6899 XDitherImage(canvas,ximage,exception);
6902 for (y=0; y < (int) canvas->rows; y++)
6904 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6905 canvas->columns,1,exception);
6906 if (p == (
const Quantum *) NULL)
6908 for (x=(
int) canvas->columns-1; x >= 0; x--)
6910 pixel=XGammaPixel(canvas,map_info,p);
6911 *q++=(
unsigned char) pixel;
6912 p+=(ptrdiff_t) GetPixelChannels(canvas);
6914 q+=(ptrdiff_t) scanline_pad;
6920 if ((ximage->bits_per_pixel == 32) && (map_info->red_max == 255) &&
6921 (map_info->green_max == 255) && (map_info->blue_max == 255) &&
6922 (map_info->red_mult == 65536L) && (map_info->green_mult == 256) &&
6923 (map_info->blue_mult == 1))
6928 for (y=0; y < (int) canvas->rows; y++)
6930 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6931 canvas->columns,1,exception);
6932 if (p == (
const Quantum *) NULL)
6934 if ((red_gamma != 1.0) || (green_gamma != 1.0) ||
6935 (blue_gamma != 1.0))
6940 for (x=(
int) canvas->columns-1; x >= 0; x--)
6943 *q++=ScaleQuantumToChar(XRedGamma(
6944 GetPixelRed(canvas,p)));
6945 *q++=ScaleQuantumToChar(XGreenGamma(
6946 GetPixelGreen(canvas,p)));
6947 *q++=ScaleQuantumToChar(XBlueGamma(
6948 GetPixelBlue(canvas,p)));
6949 p+=(ptrdiff_t) GetPixelChannels(canvas);
6953 for (x=(
int) canvas->columns-1; x >= 0; x--)
6956 *q++=ScaleQuantumToChar((Quantum) GetPixelRed(canvas,p));
6957 *q++=ScaleQuantumToChar((Quantum) GetPixelGreen(canvas,p));
6958 *q++=ScaleQuantumToChar((Quantum) GetPixelBlue(canvas,p));
6959 p+=(ptrdiff_t) GetPixelChannels(canvas);
6964 if ((ximage->bits_per_pixel == 32) && (map_info->red_max == 255) &&
6965 (map_info->green_max == 255) && (map_info->blue_max == 255) &&
6966 (map_info->red_mult == 1) && (map_info->green_mult == 256) &&
6967 (map_info->blue_mult == 65536L))
6972 for (y=0; y < (int) canvas->rows; y++)
6974 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
6975 canvas->columns,1,exception);
6976 if (p == (
const Quantum *) NULL)
6978 if ((red_gamma != 1.0) || (green_gamma != 1.0) ||
6979 (blue_gamma != 1.0))
6984 for (x=(
int) canvas->columns-1; x >= 0; x--)
6987 *q++=ScaleQuantumToChar(XBlueGamma(
6988 GetPixelBlue(canvas,p)));
6989 *q++=ScaleQuantumToChar(XGreenGamma(
6990 GetPixelGreen(canvas,p)));
6991 *q++=ScaleQuantumToChar(XRedGamma(
6992 GetPixelRed(canvas,p)));
6993 p+=(ptrdiff_t) GetPixelChannels(canvas);
6997 for (x=(
int) canvas->columns-1; x >= 0; x--)
7000 *q++=ScaleQuantumToChar((Quantum) GetPixelBlue(canvas,p));
7001 *q++=ScaleQuantumToChar((Quantum) GetPixelGreen(canvas,p));
7002 *q++=ScaleQuantumToChar((Quantum) GetPixelRed(canvas,p));
7003 p+=(ptrdiff_t) GetPixelChannels(canvas);
7016 channel[
sizeof(size_t)];
7021 bytes_per_pixel=(
unsigned int) (ximage->bits_per_pixel >> 3);
7022 for (y=0; y < (int) canvas->rows; y++)
7024 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,
7025 canvas->columns,1,exception);
7026 if (p == (
const Quantum *) NULL)
7028 for (x=(
int) canvas->columns-1; x >= 0; x--)
7030 pixel=XGammaPixel(canvas,map_info,p);
7031 for (k=(
int) bytes_per_pixel-1; k >= 0; k--)
7033 channel[k]=(
unsigned char) pixel;
7036 for (k=0; k < (int) bytes_per_pixel; k++)
7038 p+=(ptrdiff_t) GetPixelChannels(canvas);
7040 q+=(ptrdiff_t) scanline_pad;
7046 if (matte_image != (XImage *) NULL)
7051 scanline_pad=(
unsigned int) (matte_image->bytes_per_line-
7052 ((matte_image->width*matte_image->bits_per_pixel) >> 3));
7053 q=(
unsigned char *) matte_image->data;
7054 for (y=0; y < (int) canvas->rows; y++)
7056 p=GetCacheViewVirtualPixels(canvas_view,0,(ssize_t) y,canvas->columns,1,
7058 if (p == (
const Quantum *) NULL)
7062 for (x=(
int) canvas->columns-1; x >= 0; x--)
7065 if (GetPixelAlpha(canvas,p) > (QuantumRange/2))
7074 p+=(ptrdiff_t) GetPixelChannels(canvas);
7078 q+=(ptrdiff_t) scanline_pad;
7081 canvas_view=DestroyCacheView(canvas_view);
7082 if (canvas != image)
7083 canvas=DestroyImage(canvas);
7114MagickPrivate
void XMakeMagnifyImage(Display *display,XWindows *windows,
7115 ExceptionInfo *exception)
7118 tuple[MagickPathExtent];
7140 previous_magnify = 0;
7160 assert(display != (Display *) NULL);
7161 assert(windows != (XWindows *) NULL);
7162 if (IsEventLogging() != MagickFalse)
7163 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
7165 for (n=1; n < (ssize_t) windows->magnify.data; n++)
7167 while ((magnify*(
unsigned int) windows->image.ximage->width) < windows->magnify.width)
7169 while ((magnify*(
unsigned int) windows->image.ximage->height) < windows->magnify.height)
7171 while (magnify > windows->magnify.width)
7173 while (magnify > windows->magnify.height)
7178 if (previous_magnify != 0)
7179 magnify=previous_magnify;
7181 if (magnify != previous_magnify)
7193 while ((1 << i) <= (
int) magnify)
7195 (void) FormatLocaleString(windows->magnify.name,MagickPathExtent,
7196 "Magnify %.17gX",(
double) i);
7197 status=XStringListToTextProperty(&windows->magnify.name,1,&window_name);
7198 if (status != False)
7200 XSetWMName(display,windows->magnify.id,&window_name);
7201 XSetWMIconName(display,windows->magnify.id,&window_name);
7202 (void) XFree((
void *) window_name.value);
7205 previous_magnify=magnify;
7206 ximage=windows->image.ximage;
7207 width=(
unsigned int) windows->magnify.ximage->width;
7208 height=(
unsigned int) windows->magnify.ximage->height;
7209 if ((windows->magnify.x < 0) ||
7210 (windows->magnify.x >= windows->image.ximage->width))
7211 windows->magnify.x=windows->image.ximage->width >> 1;
7212 x=windows->magnify.x-(int) ((width/magnify) >> 1);
7216 if (x > (ximage->width-(
int) (width/magnify)))
7217 x=ximage->width-(int) (width/magnify);
7218 if ((windows->magnify.y < 0) ||
7219 (windows->magnify.y >= windows->image.ximage->height))
7220 windows->magnify.y=windows->image.ximage->height >> 1;
7221 y=windows->magnify.y-(int) ((height/magnify) >> 1);
7225 if (y > (ximage->height-(
int) (height/magnify)))
7226 y=ximage->height-(int) (height/magnify);
7227 q=(
unsigned char *) windows->magnify.ximage->data;
7228 scanline_pad=(
unsigned int) (windows->magnify.ximage->bytes_per_line-
7229 (((
int) width*windows->magnify.ximage->bits_per_pixel) >> 3));
7230 if (ximage->bits_per_pixel < 8)
7245 pixel_info=windows->magnify.pixel_info;
7246 switch (ximage->bitmap_bit_order)
7255 if (ximage->format == XYBitmap)
7257 background=(
unsigned char)
7258 (XPixelIntensity(&pixel_info->foreground_color) <
7259 XPixelIntensity(&pixel_info->background_color) ? 0x80 : 0x00);
7260 foreground=(
unsigned char)
7261 (XPixelIntensity(&pixel_info->background_color) <
7262 XPixelIntensity(&pixel_info->foreground_color) ? 0x80 : 0x00);
7263 if (windows->magnify.depth > 1)
7264 Swap(background,foreground);
7266 for (i=0; i < (ssize_t) height; i+=magnify)
7271 for (j=0; j < magnify; j++)
7273 p=(
unsigned char *) ximage->data+y*ximage->bytes_per_line+
7274 ((x*ximage->bits_per_pixel) >> 3);
7275 p_bit=(
unsigned char) (x*ximage->bits_per_pixel) & 0x07;
7278 for (k=0; k < width; k+=magnify)
7283 for (l=0; l < magnify; l++)
7288 for (plane=0; (int) plane < ximage->bits_per_pixel; plane++)
7291 if (*p & (0x01 << (p_bit+plane)))
7304 p_bit+=ximage->bits_per_pixel;
7311 *q=
byte >> (8-q_bit);
7312 q+=(ptrdiff_t) scanline_pad;
7327 if (ximage->format == XYBitmap)
7329 background=(
unsigned char)
7330 (XPixelIntensity(&pixel_info->foreground_color) <
7331 XPixelIntensity(&pixel_info->background_color) ? 0x01 : 0x00);
7332 foreground=(
unsigned char)
7333 (XPixelIntensity(&pixel_info->background_color) <
7334 XPixelIntensity(&pixel_info->foreground_color) ? 0x01 : 0x00);
7335 if (windows->magnify.depth > 1)
7336 Swap(background,foreground);
7338 for (i=0; i < (ssize_t) height; i+=magnify)
7343 for (j=0; j < magnify; j++)
7345 p=(
unsigned char *) ximage->data+y*ximage->bytes_per_line+
7346 ((x*ximage->bits_per_pixel) >> 3);
7347 p_bit=(
unsigned char) (x*ximage->bits_per_pixel) & 0x07;
7350 for (k=0; k < width; k+=magnify)
7355 for (l=0; l < magnify; l++)
7360 for (plane=0; (int) plane < ximage->bits_per_pixel; plane++)
7363 if (*p & (0x80 >> (p_bit+plane)))
7376 p_bit+=ximage->bits_per_pixel;
7383 *q=
byte << (8-q_bit);
7384 q+=(ptrdiff_t) scanline_pad;
7394 switch (ximage->bits_per_pixel)
7402 for (i=0; i < (ssize_t) height; i+=magnify)
7407 for (j=0; j < magnify; j++)
7409 p=(
unsigned char *) ximage->data+y*ximage->bytes_per_line+
7410 ((x*ximage->bits_per_pixel) >> 3);
7411 for (k=0; k < width; k+=magnify)
7416 for (l=0; l < magnify; l++)
7420 q+=(ptrdiff_t) scanline_pad;
7435 bytes_per_pixel=(
unsigned int) ximage->bits_per_pixel >> 3;
7436 for (i=0; i < (ssize_t) height; i+=magnify)
7441 for (j=0; j < magnify; j++)
7443 p=(
unsigned char *) ximage->data+y*ximage->bytes_per_line+
7444 ((x*ximage->bits_per_pixel) >> 3);
7445 for (k=0; k < width; k+=magnify)
7450 for (l=0; l < magnify; l++)
7451 for (m=0; m < bytes_per_pixel; m++)
7453 p+=(ptrdiff_t) bytes_per_pixel;
7455 q+=(ptrdiff_t) scanline_pad;
7465 x=windows->magnify.x-(int) ((width/magnify) >> 1);
7467 x=((int) (width >> 1)-windows->magnify.x*(int) magnify);
7469 if (x > (ximage->width-(
int) (width/magnify)))
7470 x=(int) ((ximage->width-windows->magnify.x)*(
int) magnify-(
int)
7474 y=windows->magnify.y-(int) ((height/magnify) >> 1);
7476 y=((int) (height >> 1)-windows->magnify.y*(int) magnify);
7478 if (y > (ximage->height-(
int) (height/magnify)))
7479 y=(int) ((ximage->height-windows->magnify.y)*(
int) magnify-(
int)
7483 if ((x != 0) || (y != 0))
7484 (void) XFillRectangle(display,windows->magnify.pixmap,
7485 windows->magnify.annotate_context,0,0,width,height);
7486 (void) XPutImage(display,windows->magnify.pixmap,
7487 windows->magnify.annotate_context,windows->magnify.ximage,0,0,x,y,
7488 (
unsigned int) ((
int) width-x),(
unsigned int) ((
int) height-y));
7489 if ((magnify > 1) && ((magnify <= (width >> 1)) &&
7490 (magnify <= (height >> 1))))
7498 highlight_info.x=(ssize_t) windows->magnify.width >> 1;
7499 highlight_info.y=(ssize_t) windows->magnify.height >> 1;
7500 highlight_info.width=magnify;
7501 highlight_info.height=magnify;
7502 (void) XDrawRectangle(display,windows->magnify.pixmap,
7503 windows->magnify.highlight_context,(
int) highlight_info.x,
7504 (
int) highlight_info.y,(
unsigned int) highlight_info.width-1,
7505 (
unsigned int) highlight_info.height-1);
7507 (void) XDrawRectangle(display,windows->magnify.pixmap,
7508 windows->magnify.annotate_context,(
int) highlight_info.x+1,
7509 (
int) highlight_info.y+1,(
unsigned int) highlight_info.width-3,
7510 (
unsigned int) highlight_info.height-3);
7515 (void) GetOneVirtualPixelInfo(windows->image.image,TileVirtualPixelMethod,
7516 (ssize_t) windows->magnify.x,(ssize_t) windows->magnify.y,&pixel,exception);
7517 (void) FormatLocaleString(tuple,MagickPathExtent,
"%d,%d: ",
7518 windows->magnify.x,windows->magnify.y);
7519 (void) ConcatenateMagickString(tuple,
"(",MagickPathExtent);
7520 ConcatenateColorComponent(&pixel,RedPixelChannel,X11Compliance,tuple);
7521 (void) ConcatenateMagickString(tuple,
",",MagickPathExtent);
7522 ConcatenateColorComponent(&pixel,GreenPixelChannel,X11Compliance,tuple);
7523 (void) ConcatenateMagickString(tuple,
",",MagickPathExtent);
7524 ConcatenateColorComponent(&pixel,BluePixelChannel,X11Compliance,tuple);
7525 if (pixel.colorspace == CMYKColorspace)
7527 (void) ConcatenateMagickString(tuple,
",",MagickPathExtent);
7528 ConcatenateColorComponent(&pixel,BlackPixelChannel,X11Compliance,tuple);
7530 if (pixel.alpha_trait != UndefinedPixelTrait)
7532 (void) ConcatenateMagickString(tuple,
",",MagickPathExtent);
7533 ConcatenateColorComponent(&pixel,AlphaPixelChannel,X11Compliance,tuple);
7535 (void) ConcatenateMagickString(tuple,
")",MagickPathExtent);
7536 height=(
unsigned int) (windows->magnify.font_info->ascent+
7537 windows->magnify.font_info->descent);
7538 x=windows->magnify.font_info->max_bounds.width >> 1;
7539 y=windows->magnify.font_info->ascent+(int) (height >> 2);
7540 (void) XDrawImageString(display,windows->magnify.pixmap,
7541 windows->magnify.annotate_context,x,y,tuple,(
int) strlen(tuple));
7542 GetColorTuple(&pixel,MagickTrue,tuple);
7544 (void) XDrawImageString(display,windows->magnify.pixmap,
7545 windows->magnify.annotate_context,x,y,tuple,(
int) strlen(tuple));
7546 (void) QueryColorname(windows->image.image,&pixel,SVGCompliance,tuple,
7549 (void) XDrawImageString(display,windows->magnify.pixmap,
7550 windows->magnify.annotate_context,x,y,tuple,(
int) strlen(tuple));
7554 magnify_window=windows->magnify;
7557 XRefreshWindow(display,&magnify_window,(XEvent *) NULL);
7589static MagickBooleanType XMakePixmap(Display *display,
7590 const XResourceInfo *resource_info,XWindowInfo *window)
7596 assert(display != (Display *) NULL);
7597 assert(resource_info != (XResourceInfo *) NULL);
7598 assert(window != (XWindowInfo *) NULL);
7599 if (IsEventLogging() != MagickFalse)
7600 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
7601 if (window->pixmap != (Pixmap) NULL)
7606 (void) XFreePixmap(display,window->pixmap);
7607 window->pixmap=(Pixmap) NULL;
7609 if (window->use_pixmap == MagickFalse)
7610 return(MagickFalse);
7611 if (window->ximage == (XImage *) NULL)
7612 return(MagickFalse);
7616 (void) XCheckDefineCursor(display,window->id,window->busy_cursor);
7617 (void) XFlush(display);
7621 width=(
unsigned int) window->ximage->width;
7622 height=(
unsigned int) window->ximage->height;
7623 window->pixmap=XCreatePixmap(display,window->id,width,height,window->depth);
7624 if (window->pixmap == (Pixmap) NULL)
7629 (void) XCheckDefineCursor(display,window->id,window->cursor);
7630 return(MagickFalse);
7635#if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
7636 if (window->shared_memory)
7637 (void) XShmPutImage(display,window->pixmap,window->annotate_context,
7638 window->ximage,0,0,0,0,width,height,MagickTrue);
7640 if (window->shared_memory == MagickFalse)
7641 (void) XPutImage(display,window->pixmap,window->annotate_context,
7642 window->ximage,0,0,0,0,width,height);
7643 if ((GetLogEventMask() & X11Event) != 0)
7645 (void) LogMagickEvent(X11Event,GetMagickModule(),
"Pixmap:");
7646 (void) LogMagickEvent(X11Event,GetMagickModule(),
" width, height: %ux%u",
7652 (void) XCheckDefineCursor(display,window->id,window->cursor);
7696#if defined(__cplusplus) || defined(c_plusplus)
7700static inline double DiversityPixelIntensity(
7701 const DiversityPacket *pixel)
7706 intensity=0.212656*(double) pixel->red+0.715158*(
double) pixel->green+
7707 0.072186*(double) pixel->blue;
7711static int IntensityCompare(
const void *x,
const void *y)
7720 color_1=(DiversityPacket *) x;
7721 color_2=(DiversityPacket *) y;
7722 diversity=(int) (DiversityPixelIntensity(color_2)-
7723 DiversityPixelIntensity(color_1));
7727static int PopularityCompare(
const void *x,
const void *y)
7733 color_1=(DiversityPacket *) x;
7734 color_2=(DiversityPacket *) y;
7735 return((
int) color_2->count-(
int) color_1->count);
7738#if defined(__cplusplus) || defined(c_plusplus)
7742static inline Quantum ScaleXToQuantum(
const size_t x,
7745 return((Quantum) (((
double) QuantumRange*x)/scale+0.5));
7748MagickPrivate
void XMakeStandardColormap(Display *display,
7749 XVisualInfo *visual_info,XResourceInfo *resource_info,Image *image,
7750 XStandardColormap *map_info,XPixelInfo *pixel,ExceptionInfo *exception)
7773 assert(display != (Display *) NULL);
7774 assert(visual_info != (XVisualInfo *) NULL);
7775 assert(map_info != (XStandardColormap *) NULL);
7776 assert(resource_info != (XResourceInfo *) NULL);
7777 assert(pixel != (XPixelInfo *) NULL);
7778 if (IsEventLogging() != MagickFalse)
7779 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
7780 if (resource_info->map_type != (
char *) NULL)
7785 XGetPixelInfo(display,visual_info,map_info,resource_info,image,
7787 number_colors=(
unsigned int) (map_info->base_pixel+
7788 (map_info->red_max+1)*(map_info->green_max+1)*(map_info->blue_max+1));
7789 if ((map_info->red_max*map_info->green_max*map_info->blue_max) != 0)
7790 if (((image->alpha_trait & BlendPixelTrait) == 0) &&
7791 (resource_info->color_recovery == MagickFalse) &&
7792 (resource_info->quantize_info->dither_method != NoDitherMethod) &&
7793 (number_colors < MaxColormapSize))
7804 affinity_image=AcquireImage((ImageInfo *) NULL,exception);
7805 if (affinity_image == (Image *) NULL)
7806 ThrowXWindowFatalException(ResourceLimitFatalError,
7807 "UnableToDitherImage",image->filename);
7808 affinity_image->columns=number_colors;
7809 affinity_image->rows=1;
7813 q=QueueAuthenticPixels(affinity_image,0,0,affinity_image->columns,
7815 if (q != (Quantum *) NULL)
7817 for (i=0; i < (ssize_t) number_colors; i++)
7819 SetPixelRed(affinity_image,(Quantum) 0,q);
7820 if (map_info->red_max != 0)
7821 SetPixelRed(affinity_image,ScaleXToQuantum((
size_t)
7822 (i/(ssize_t) map_info->red_mult),map_info->red_max),q);
7823 SetPixelGreen(affinity_image,(Quantum) 0,q);
7824 if (map_info->green_max != 0)
7825 SetPixelGreen(affinity_image,ScaleXToQuantum((
size_t)
7826 ((i/(ssize_t) map_info->green_mult) % (ssize_t)
7827 (map_info->green_max+1)),map_info->green_max),q);
7828 SetPixelBlue(affinity_image,(Quantum) 0,q);
7829 if (map_info->blue_max != 0)
7830 SetPixelBlue(affinity_image,ScaleXToQuantum((
size_t)
7831 (i % (ssize_t) map_info->green_mult),map_info->blue_max),
7833 SetPixelAlpha(affinity_image,TransparentAlpha,q);
7834 q+=(ptrdiff_t) GetPixelChannels(affinity_image);
7836 (void) SyncAuthenticPixels(affinity_image,exception);
7837 (void) RemapImage(resource_info->quantize_info,image,
7838 affinity_image,exception);
7840 XGetPixelInfo(display,visual_info,map_info,resource_info,image,
7842 (void) SetImageStorageClass(image,DirectClass,exception);
7843 affinity_image=DestroyImage(affinity_image);
7845 if ((GetLogEventMask() & X11Event) != 0)
7847 (void) LogMagickEvent(X11Event,GetMagickModule(),
7848 "Standard Colormap:");
7849 (void) LogMagickEvent(X11Event,GetMagickModule(),
7850 " colormap id: 0x%lx",map_info->colormap);
7851 (void) LogMagickEvent(X11Event,GetMagickModule(),
7852 " red, green, blue max: %lu %lu %lu",map_info->red_max,
7853 map_info->green_max,map_info->blue_max);
7854 (void) LogMagickEvent(X11Event,GetMagickModule(),
7855 " red, green, blue mult: %lu %lu %lu",map_info->red_mult,
7856 map_info->green_mult,map_info->blue_mult);
7860 if ((visual_info->klass != DirectColor) &&
7861 (visual_info->klass != TrueColor))
7862 if ((image->storage_class == DirectClass) ||
7863 ((
int) image->colors > visual_info->colormap_size))
7871 quantize_info=(*resource_info->quantize_info);
7872 quantize_info.number_colors=(size_t) visual_info->colormap_size;
7873 (void) QuantizeImage(&quantize_info,image,exception);
7878 (void) XFreeStandardColormap(display,visual_info,map_info,pixel);
7879 colormap=XDefaultColormap(display,visual_info->screen);
7880 if (visual_info->visual != XDefaultVisual(display,visual_info->screen))
7881 colormap=XCreateColormap(display,XRootWindow(display,visual_info->screen),
7882 visual_info->visual,visual_info->klass == DirectColor ?
7883 AllocAll : AllocNone);
7884 if (colormap == (Colormap) NULL)
7885 ThrowXWindowFatalException(ResourceLimitFatalError,
"UnableToCreateColormap",
7890 XGetMapInfo(visual_info,colormap,map_info);
7891 XGetPixelInfo(display,visual_info,map_info,resource_info,image,pixel);
7895 switch (visual_info->klass)
7903 number_colors=image->colors;
7904 colors=(XColor *) AcquireQuantumMemory((
size_t)
7905 visual_info->colormap_size,
sizeof(*colors));
7906 if (colors == (XColor *) NULL)
7907 ThrowXWindowFatalException(ResourceLimitFatalError,
7908 "UnableToCreateColormap",image->filename);
7910 color.flags=(char) (DoRed | DoGreen | DoBlue);
7911 for (i=0; i < (ssize_t) image->colors; i++)
7913 color.red=ScaleQuantumToShort(XRedGamma(image->colormap[i].red));
7914 color.green=ScaleQuantumToShort(XGreenGamma(image->colormap[i].green));
7915 color.blue=ScaleQuantumToShort(XBlueGamma(image->colormap[i].blue));
7916 if (visual_info->klass != StaticColor)
7918 gray_value=(
unsigned short) XPixelIntensity(&color);
7919 color.red=gray_value;
7920 color.green=gray_value;
7921 color.blue=gray_value;
7923 status=XAllocColor(display,colormap,&color);
7924 if (status == False)
7926 colormap=XCopyColormapAndFree(display,colormap);
7927 (void) XAllocColor(display,colormap,&color);
7929 pixel->pixels[i]=color.pixel;
7943 number_colors=image->colors;
7944 colors=(XColor *) AcquireQuantumMemory((
size_t)
7945 visual_info->colormap_size,
sizeof(*colors));
7946 if (colors == (XColor *) NULL)
7947 ThrowXWindowFatalException(ResourceLimitFatalError,
7948 "UnableToCreateColormap",image->filename);
7952 (void) XAllocColor(display,colormap,&pixel->foreground_color);
7953 (void) XAllocColor(display,colormap,&pixel->background_color);
7954 (void) XAllocColor(display,colormap,&pixel->border_color);
7955 (void) XAllocColor(display,colormap,&pixel->matte_color);
7956 (void) XAllocColor(display,colormap,&pixel->highlight_color);
7957 (void) XAllocColor(display,colormap,&pixel->shadow_color);
7958 (void) XAllocColor(display,colormap,&pixel->depth_color);
7959 (void) XAllocColor(display,colormap,&pixel->trough_color);
7960 for (i=0; i < MaxNumberPens; i++)
7961 (
void) XAllocColor(display,colormap,&pixel->pen_colors[i]);
7965 colormap_type=resource_info->colormap;
7966 status=XAllocColorCells(display,colormap,MagickFalse,(
unsigned long *)
7967 NULL,0,pixel->pixels,(
unsigned int) image->colors);
7968 if (status != False)
7969 colormap_type=PrivateColormap;
7970 if (colormap_type == SharedColormap)
7993 diversity=(DiversityPacket *) AcquireQuantumMemory(image->colors,
7994 sizeof(*diversity));
7995 if (diversity == (DiversityPacket *) NULL)
7996 ThrowXWindowFatalException(ResourceLimitFatalError,
7997 "UnableToCreateColormap",image->filename);
7998 for (i=0; i < (ssize_t) image->colors; i++)
8000 diversity[i].red=ClampToQuantum(image->colormap[i].red);
8001 diversity[i].green=ClampToQuantum(image->colormap[i].green);
8002 diversity[i].blue=ClampToQuantum(image->colormap[i].blue);
8003 diversity[i].index=(
unsigned short) i;
8004 diversity[i].count=0;
8006 image_view=AcquireAuthenticCacheView(image,exception);
8007 for (y=0; y < (int) image->rows; y++)
8015 p=GetCacheViewAuthenticPixels(image_view,0,(ssize_t) y,
8016 image->columns,1,exception);
8017 if (p == (
const Quantum *) NULL)
8019 for (x=(
int) image->columns-1; x >= 0; x--)
8021 ssize_t index = (ssize_t) GetPixelIndex(image,p);
8022 if (index < image->colors)
8023 diversity[index].count++;
8024 p+=(ptrdiff_t) GetPixelChannels(image);
8027 image_view=DestroyCacheView(image_view);
8031 qsort((
void *) diversity,image->colors,
sizeof(*diversity),
8033 for (i=0; i < (ssize_t) image->colors; )
8035 diversity[i].count<<=4;
8036 i+=MagickMax((
int) (image->colors >> 4),2);
8038 diversity[image->colors-1].count<<=4;
8039 qsort((
void *) diversity,image->colors,
sizeof(*diversity),
8045 color.flags=(char) (DoRed | DoGreen | DoBlue);
8046 for (i=0; i < (ssize_t) image->colors; i++)
8048 index=diversity[i].index;
8050 ScaleQuantumToShort(XRedGamma(image->colormap[index].red));
8052 ScaleQuantumToShort(XGreenGamma(image->colormap[index].green));
8054 ScaleQuantumToShort(XBlueGamma(image->colormap[index].blue));
8055 if (visual_info->klass != PseudoColor)
8057 gray_value=(
unsigned short) XPixelIntensity(&color);
8058 color.red=gray_value;
8059 color.green=gray_value;
8060 color.blue=gray_value;
8062 status=XAllocColor(display,colormap,&color);
8063 if (status == False)
8065 pixel->pixels[index]=color.pixel;
8071 server_colors=(XColor *) AcquireQuantumMemory((
size_t)
8072 visual_info->colormap_size,
sizeof(*server_colors));
8073 if (server_colors == (XColor *) NULL)
8074 ThrowXWindowFatalException(ResourceLimitFatalError,
8075 "UnableToCreateColormap",image->filename);
8076 for (x=visual_info->colormap_size-1; x >= 0; x--)
8077 server_colors[x].pixel=(size_t) x;
8078 (void) XQueryColors(display,colormap,server_colors,
8079 (
int) MagickMin((
unsigned int) visual_info->colormap_size,256));
8083 for (; i < (ssize_t) image->colors; i++)
8085 index=diversity[i].index;
8086 color.red=ScaleQuantumToShort(
8087 XRedGamma(image->colormap[index].red));
8088 color.green=ScaleQuantumToShort(
8089 XGreenGamma(image->colormap[index].green));
8090 color.blue=ScaleQuantumToShort(
8091 XBlueGamma(image->colormap[index].blue));
8092 if (visual_info->klass != PseudoColor)
8094 gray_value=(
unsigned short) XPixelIntensity(&color);
8095 color.red=gray_value;
8096 color.green=gray_value;
8097 color.blue=gray_value;
8099 XBestPixel(display,colormap,server_colors,(
unsigned int)
8100 visual_info->colormap_size,&color);
8101 pixel->pixels[index]=color.pixel;
8104 if ((
int) image->colors < visual_info->colormap_size)
8109 retain_colors=MagickMin((
unsigned int)
8110 (visual_info->colormap_size-(
int) image->colors),256);
8111 for (i=0; i < (ssize_t) retain_colors; i++)
8112 *p++=server_colors[i];
8113 number_colors+=retain_colors;
8115 server_colors=(XColor *) RelinquishMagickMemory(server_colors);
8116 diversity=(DiversityPacket *) RelinquishMagickMemory(diversity);
8122 if (status == False)
8127 colormap=XCreateColormap(display,
8128 XRootWindow(display,visual_info->screen),visual_info->visual,
8130 if (colormap == (Colormap) NULL)
8131 ThrowXWindowFatalException(ResourceLimitFatalError,
8132 "UnableToCreateColormap",image->filename);
8133 map_info->colormap=colormap;
8134 if ((
int) image->colors < visual_info->colormap_size)
8140 retain_colors=MagickMin((
unsigned int)
8141 (visual_info->colormap_size-(
int) image->colors),256);
8142 p=colors+image->colors;
8143 for (i=0; i < (ssize_t) retain_colors; i++)
8145 p->pixel=(
unsigned long) i;
8148 (void) XQueryColors(display,
8149 XDefaultColormap(display,visual_info->screen),
8150 colors+image->colors,(
int) retain_colors);
8154 (void) XAllocColorCells(display,colormap,MagickFalse,
8155 (
unsigned long *) NULL,0,pixel->pixels,(
unsigned int)
8157 p=colors+image->colors;
8158 for (i=0; i < (ssize_t) retain_colors; i++)
8160 p->pixel=pixel->pixels[i];
8163 (void) XStoreColors(display,colormap,colors+image->colors,
8164 (
int) retain_colors);
8165 number_colors+=retain_colors;
8167 (void) XAllocColorCells(display,colormap,MagickFalse,
8168 (
unsigned long *) NULL,0,pixel->pixels,(
unsigned int)
8175 color.flags=(char) (DoRed | DoGreen | DoBlue);
8176 for (i=0; i < (ssize_t) image->colors; i++)
8178 color.red=ScaleQuantumToShort(XRedGamma(image->colormap[i].red));
8179 color.green=ScaleQuantumToShort(XGreenGamma(image->colormap[i].green));
8180 color.blue=ScaleQuantumToShort(XBlueGamma(image->colormap[i].blue));
8181 if (visual_info->klass != PseudoColor)
8183 gray_value=(
unsigned short) XPixelIntensity(&color);
8184 color.red=gray_value;
8185 color.green=gray_value;
8186 color.blue=gray_value;
8188 color.pixel=pixel->pixels[i];
8191 (void) XStoreColors(display,colormap,colors,(
int) image->colors);
8204 number_colors=(
unsigned int) ((map_info->red_max*map_info->red_mult)+
8205 (map_info->green_max*map_info->green_mult)+
8206 (map_info->blue_max*map_info->blue_mult)+1);
8207 linear_colormap=(number_colors > 4096) ||
8208 (((
int) (map_info->red_max+1) == visual_info->colormap_size) &&
8209 ((
int) (map_info->green_max+1) == visual_info->colormap_size) &&
8210 ((
int) (map_info->blue_max+1) == visual_info->colormap_size)) ?
8211 MagickTrue : MagickFalse;
8212 if (linear_colormap != MagickFalse)
8213 number_colors=(size_t) visual_info->colormap_size;
8217 colors=(XColor *) AcquireQuantumMemory(number_colors,
sizeof(*colors));
8218 if (colors == (XColor *) NULL)
8219 ThrowXWindowFatalException(ResourceLimitFatalError,
8220 "UnableToCreateColormap",image->filename);
8225 color.flags=(char) (DoRed | DoGreen | DoBlue);
8226 if (linear_colormap != MagickFalse)
8227 for (i=0; i < (ssize_t) number_colors; i++)
8229 color.blue=(
unsigned short) 0;
8230 if (map_info->blue_max != 0)
8231 color.blue=(
unsigned short) (((65535L*(i % (ssize_t)
8232 map_info->green_mult))/(ssize_t) map_info->blue_max));
8233 color.green=color.blue;
8234 color.red=color.blue;
8235 color.pixel=XStandardPixel(map_info,&color);
8239 for (i=0; i < (ssize_t) number_colors; i++)
8241 color.red=(
unsigned short) 0;
8242 if (map_info->red_max != 0)
8243 color.red=(
unsigned short) ((
size_t) ((65535L*(i/(ssize_t)
8244 map_info->red_mult))/(ssize_t) map_info->red_max));
8245 color.green=(
unsigned int) 0;
8246 if (map_info->green_max != 0)
8247 color.green=(
unsigned short) ((
size_t) ((65535L*((i/(ssize_t)
8248 map_info->green_mult) % (ssize_t) (map_info->green_max+1)))/
8249 (ssize_t) map_info->green_max));
8250 color.blue=(
unsigned short) 0;
8251 if (map_info->blue_max != 0)
8252 color.blue=(
unsigned short) ((
size_t) ((65535L*(i % (ssize_t)
8253 map_info->green_mult))/(ssize_t) map_info->blue_max));
8254 color.pixel=XStandardPixel(map_info,&color);
8257 if ((visual_info->klass == DirectColor) &&
8258 (colormap != XDefaultColormap(display,visual_info->screen)))
8259 (void) XStoreColors(display,colormap,colors,(
int) number_colors);
8261 for (i=0; i < (ssize_t) number_colors; i++)
8262 (
void) XAllocColor(display,colormap,&colors[i]);
8266 if ((visual_info->klass != DirectColor) &&
8267 (visual_info->klass != TrueColor))
8272 XBestPixel(display,colormap,colors,(
unsigned int) number_colors,
8273 &pixel->foreground_color);
8274 XBestPixel(display,colormap,colors,(
unsigned int) number_colors,
8275 &pixel->background_color);
8276 if (pixel->background_color.pixel == pixel->foreground_color.pixel)
8281 pixel->background_color.red=(~pixel->foreground_color.red);
8282 pixel->background_color.green=
8283 (~pixel->foreground_color.green);
8284 pixel->background_color.blue=
8285 (~pixel->foreground_color.blue);
8286 XBestPixel(display,colormap,colors,(
unsigned int) number_colors,
8287 &pixel->background_color);
8289 XBestPixel(display,colormap,colors,(
unsigned int) number_colors,
8290 &pixel->border_color);
8291 XBestPixel(display,colormap,colors,(
unsigned int) number_colors,
8292 &pixel->matte_color);
8293 XBestPixel(display,colormap,colors,(
unsigned int) number_colors,
8294 &pixel->highlight_color);
8295 XBestPixel(display,colormap,colors,(
unsigned int) number_colors,
8296 &pixel->shadow_color);
8297 XBestPixel(display,colormap,colors,(
unsigned int) number_colors,
8298 &pixel->depth_color);
8299 XBestPixel(display,colormap,colors,(
unsigned int) number_colors,
8300 &pixel->trough_color);
8301 for (i=0; i < MaxNumberPens; i++)
8303 XBestPixel(display,colormap,colors,(
unsigned int) number_colors,
8304 &pixel->pen_colors[i]);
8305 pixel->pixels[(ssize_t) image->colors+i]=pixel->pen_colors[i].pixel;
8307 pixel->colors=(ssize_t) (image->colors+MaxNumberPens);
8309 colors=(XColor *) RelinquishMagickMemory(colors);
8310 if ((GetLogEventMask() & X11Event) != 0)
8312 (void) LogMagickEvent(X11Event,GetMagickModule(),
"Standard Colormap:");
8313 (void) LogMagickEvent(X11Event,GetMagickModule(),
" colormap id: 0x%lx",
8314 map_info->colormap);
8315 (void) LogMagickEvent(X11Event,GetMagickModule(),
8316 " red, green, blue max: %lu %lu %lu",map_info->red_max,
8317 map_info->green_max,map_info->blue_max);
8318 (void) LogMagickEvent(X11Event,GetMagickModule(),
8319 " red, green, blue mult: %lu %lu %lu",map_info->red_mult,
8320 map_info->green_mult,map_info->blue_mult);
8361MagickPrivate
void XMakeWindow(Display *display,Window parent,
char **argv,
8362 int argc,XClassHint *class_hint,XWMHints *manager_hints,
8363 XWindowInfo *window_info)
8365#define MinWindowSize 64
8373 static XTextProperty
8386 assert(display != (Display *) NULL);
8387 assert(window_info != (XWindowInfo *) NULL);
8388 if (IsEventLogging() != MagickFalse)
8389 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
8390 size_hints=XAllocSizeHints();
8391 if (size_hints == (XSizeHints *) NULL)
8392 ThrowXWindowFatalException(XServerFatalError,
"UnableToMakeXWindow",argv[0]);
8393 size_hints->flags=(int) window_info->flags;
8394 size_hints->x=window_info->x;
8395 size_hints->y=window_info->y;
8396 size_hints->width=(int) window_info->width;
8397 size_hints->height=(int) window_info->height;
8398 if (window_info->immutable != MagickFalse)
8403 size_hints->min_width=size_hints->width;
8404 size_hints->min_height=size_hints->height;
8405 size_hints->max_width=size_hints->width;
8406 size_hints->max_height=size_hints->height;
8407 size_hints->flags|=PMinSize;
8408 size_hints->flags|=PMaxSize;
8415 size_hints->min_width=(int) window_info->min_width;
8416 size_hints->min_height=(int) window_info->min_height;
8417 size_hints->flags|=PResizeInc;
8418 size_hints->width_inc=(int) window_info->width_inc;
8419 size_hints->height_inc=(int) window_info->height_inc;
8420#if !defined(PRE_R4_ICCCM)
8421 size_hints->flags|=PBaseSize;
8422 size_hints->base_width=size_hints->width_inc;
8423 size_hints->base_height=size_hints->height_inc;
8426 gravity=NorthWestGravity;
8427 if (window_info->geometry != (
char *) NULL)
8430 default_geometry[MagickPathExtent],
8431 geometry[MagickPathExtent];
8442 (void) FormatLocaleString(default_geometry,MagickPathExtent,
"%dx%d",
8443 size_hints->width,size_hints->height);
8444 (void) CopyMagickString(geometry,window_info->geometry,MagickPathExtent);
8446 while (strlen(p) != 0)
8448 if ((isspace((
int) ((
unsigned char) *p)) == 0) && (*p !=
'%'))
8451 (
void) memmove(p,p+1,(
size_t) (MagickPathExtent-(p-geometry)));
8453 flags=XWMGeometry(display,window_info->screen,geometry,default_geometry,
8454 window_info->border_width,size_hints,&size_hints->x,&size_hints->y,
8455 &size_hints->width,&size_hints->height,&gravity);
8456 if ((flags & WidthValue) && (flags & HeightValue))
8457 size_hints->flags|=USSize;
8458 if ((flags & XValue) && (flags & YValue))
8460 size_hints->flags|=USPosition;
8461 window_info->x=size_hints->x;
8462 window_info->y=size_hints->y;
8465#if !defined(PRE_R4_ICCCM)
8466 size_hints->win_gravity=gravity;
8467 size_hints->flags|=PWinGravity;
8469 if (window_info->id == (Window) NULL)
8470 window_info->id=XCreateWindow(display,parent,window_info->x,window_info->y,
8471 (
unsigned int) size_hints->width,(
unsigned int) size_hints->height,
8472 window_info->border_width,(
int) window_info->depth,InputOutput,
8473 window_info->visual,(
unsigned long) window_info->mask,
8474 &window_info->attributes);
8489 (void) XChangeWindowAttributes(display,window_info->id,(
unsigned long)
8490 window_info->mask,&window_info->attributes);
8491 mask=ConfigureNotify;
8492 while (XCheckTypedWindowEvent(display,window_info->id,(
int) mask,&sans_event)) ;
8493 window_changes.x=window_info->x;
8494 window_changes.y=window_info->y;
8495 window_changes.width=(int) window_info->width;
8496 window_changes.height=(int) window_info->height;
8497 mask=(MagickStatusType) (CWWidth | CWHeight);
8498 if (window_info->flags & USPosition)
8500 (void) XReconfigureWMWindow(display,window_info->id,window_info->screen,
8501 mask,&window_changes);
8503 if (window_info->id == (Window) NULL)
8504 ThrowXWindowFatalException(XServerFatalError,
"UnableToCreateWindow",
8506 status=XStringListToTextProperty(&window_info->name,1,&window_name);
8507 if (status == False)
8508 ThrowXWindowFatalException(XServerFatalError,
"UnableToCreateTextProperty",
8510 status=XStringListToTextProperty(&window_info->icon_name,1,&icon_name);
8511 if (status == False)
8512 ThrowXWindowFatalException(XServerFatalError,
"UnableToCreateTextProperty",
8513 window_info->icon_name);
8514 if (window_info->icon_geometry != (
char *) NULL)
8524 size_hints->flags|=USPosition;
8525 flags=XWMGeometry(display,window_info->screen,window_info->icon_geometry,
8526 (
char *) NULL,0,size_hints,&manager_hints->icon_x,
8527 &manager_hints->icon_y,&width,&height,&gravity);
8528 if ((flags & XValue) && (flags & YValue))
8529 manager_hints->flags|=IconPositionHint;
8531 XSetWMProperties(display,window_info->id,&window_name,&icon_name,argv,argc,
8532 size_hints,manager_hints,class_hint);
8533 if (window_name.value != (
void *) NULL)
8535 (void) XFree((
void *) window_name.value);
8536 window_name.value=(
unsigned char *) NULL;
8537 window_name.nitems=0;
8539 if (icon_name.value != (
void *) NULL)
8541 (void) XFree((
void *) icon_name.value);
8542 icon_name.value=(
unsigned char *) NULL;
8545 atom_list[0]=XInternAtom(display,
"WM_DELETE_WINDOW",MagickFalse);
8546 atom_list[1]=XInternAtom(display,
"WM_TAKE_FOCUS",MagickFalse);
8547 (void) XSetWMProtocols(display,window_info->id,atom_list,2);
8548 (void) XFree((
void *) size_hints);
8549 if (window_info->shape != MagickFalse)
8551#if defined(MAGICKCORE_HAVE_SHAPE)
8561 if (XShapeQueryExtension(display,&error_base,&event_base) == 0)
8562 window_info->shape=MagickFalse;
8564 window_info->shape=MagickFalse;
8567 window_info->shape=MagickFalse;
8568 if (window_info->shared_memory != MagickFalse)
8570#if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
8574 if (XShmQueryExtension(display) == 0)
8575 window_info->shared_memory=MagickFalse;
8577 window_info->shared_memory=MagickFalse;
8580 window_info->image=NewImageList();
8581 window_info->destroy=MagickFalse;
8617static const char *GetLocaleMonitorMessage(
const char *text)
8620 message[MagickPathExtent],
8621 tag[MagickPathExtent];
8629 (void) CopyMagickString(tag,text,MagickPathExtent);
8631 if (p != (
char *) NULL)
8633 (void) FormatLocaleString(message,MagickPathExtent,
"Monitor/%s",tag);
8634 locale_message=GetLocaleMessage(message);
8635 if (locale_message == message)
8637 return(locale_message);
8640MagickPrivate MagickBooleanType XMagickProgressMonitor(
const char *tag,
8641 const MagickOffsetType quantum,
const MagickSizeType span,
8642 void *magick_unused(client_data))
8647 windows=XSetWindows((XWindows *) ~0);
8648 if (windows == (XWindows *) NULL)
8650 if (windows->info.mapped != MagickFalse)
8651 XProgressMonitorWidget(windows->display,windows,
8652 GetLocaleMonitorMessage(tag),quantum,span);
8682MagickPrivate MagickBooleanType XQueryColorCompliance(
const char *target,
8689 *display = (Display *) NULL;
8700 assert(color != (XColor *) NULL);
8704 color->flags=(char) (DoRed | DoGreen | DoBlue);
8705 if ((target == (
char *) NULL) || (*target ==
'\0'))
8706 target=
"#ffffffffffff";
8710 if (display == (Display *) NULL)
8711 display=XOpenDisplay((
char *) NULL);
8712 if (display == (Display *) NULL)
8714 ThrowXWindowException(XServerError,
"ColorIsNotKnownToServer",target);
8715 return(MagickFalse);
8717 colormap=XDefaultColormap(display,XDefaultScreen(display));
8718 status=XParseColor(display,colormap,(
char *) target,&xcolor);
8719 if (status == False)
8720 ThrowXWindowException(XServerError,
"ColorIsNotKnownToServer",target)
8723 color->red=xcolor.red;
8724 color->green=xcolor.green;
8725 color->blue=xcolor.blue;
8726 color->flags=xcolor.flags;
8728 return(status != False ? MagickTrue : MagickFalse);
8762MagickPrivate
void XQueryPosition(Display *display,
const Window window,
int *x,
8775 assert(display != (Display *) NULL);
8776 assert(window != (Window) NULL);
8777 assert(x != (
int *) NULL);
8778 assert(y != (
int *) NULL);
8779 if (IsEventLogging() != MagickFalse)
8780 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
8781 (void) XQueryPointer(display,window,&root_window,&root_window,&x_root,&y_root,
8814MagickPrivate
void XRefreshWindow(Display *display,
const XWindowInfo *window,
8815 const XEvent *event)
8825 assert(display != (Display *) NULL);
8826 assert(window != (XWindowInfo *) NULL);
8827 if (IsEventLogging() != MagickFalse)
8828 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
8829 if (window->ximage == (XImage *) NULL)
8831 if (event != (XEvent *) NULL)
8838 width=(
unsigned int) event->xexpose.width;
8839 height=(
unsigned int) event->xexpose.height;
8851 width=window->width;
8852 height=window->height;
8853 while (XCheckTypedWindowEvent(display,window->id,Expose,&sans_event)) ;
8854 if (window->matte_pixmap != (Pixmap) NULL)
8856#if defined(MAGICKCORE_HAVE_SHAPE)
8857 if (window->shape != MagickFalse)
8858 XShapeCombineMask(display,window->id,ShapeBounding,0,0,
8859 window->matte_pixmap,ShapeSet);
8866 if ((window->ximage->width-(x+window->x)) < (
int) width)
8867 width=(
unsigned int) (window->ximage->width-(x+window->x));
8868 if ((window->ximage->height-(y+window->y)) < (
int) height)
8869 height=(
unsigned int) (window->ximage->height-(y+window->y));
8873 if (window->matte_pixmap != (Pixmap) NULL)
8874 (void) XSetClipMask(display,window->annotate_context,window->matte_pixmap);
8875 if (window->pixmap != (Pixmap) NULL)
8877 if (window->depth > 1)
8878 (void) XCopyArea(display,window->pixmap,window->id,
8879 window->annotate_context,x+window->x,y+window->y,width,height,x,y);
8881 (
void) XCopyPlane(display,window->pixmap,window->id,
8882 window->highlight_context,x+window->x,y+window->y,width,height,x,y,
8887#if defined(MAGICKCORE_HAVE_SHARED_MEMORY)
8888 if (window->shared_memory)
8889 (void) XShmPutImage(display,window->id,window->annotate_context,
8890 window->ximage,x+window->x,y+window->y,x,y,width,height,MagickTrue);
8892 if (window->shared_memory == MagickFalse)
8893 (void) XPutImage(display,window->id,window->annotate_context,
8894 window->ximage,x+window->x,y+window->y,x,y,width,height);
8896 if (window->matte_pixmap != (Pixmap) NULL)
8897 (void) XSetClipMask(display,window->annotate_context,None);
8898 (void) XFlush(display);
8930MagickExport MagickBooleanType XRemoteCommand(Display *display,
8931 const char *window,
const char *filename)
8940 assert(filename != (
char *) NULL);
8941 if (IsEventLogging() != MagickFalse)
8942 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",filename);
8943 if (display == (Display *) NULL)
8944 display=XOpenDisplay((
char *) NULL);
8945 if (display == (Display *) NULL)
8947 ThrowXWindowException(XServerError,
"UnableToOpenXServer",filename);
8948 return(MagickFalse);
8950 remote_atom=XInternAtom(display,
"IM_PROTOCOLS",MagickFalse);
8951 remote_window=(Window) NULL;
8952 root_window=XRootWindow(display,XDefaultScreen(display));
8953 if (window != (
char *) NULL)
8958 if (isdigit((
int) ((
unsigned char) *window)) != 0)
8959 remote_window=XWindowByID(display,root_window,(Window)
8960 strtol((
char *) window,(
char **) NULL,0));
8961 if (remote_window == (Window) NULL)
8962 remote_window=XWindowByName(display,root_window,window);
8964 if (remote_window == (Window) NULL)
8965 remote_window=XWindowByProperty(display,root_window,remote_atom);
8966 if (remote_window == (Window) NULL)
8968 ThrowXWindowException(XServerError,
"UnableToConnectToRemoteDisplay",
8970 return(MagickFalse);
8975 remote_atom=XInternAtom(display,
"IM_REMOTE_COMMAND",MagickFalse);
8976 (void) XChangeProperty(display,remote_window,remote_atom,XA_STRING,8,
8977 PropModeReplace,(
unsigned char *) filename,(
int) strlen(filename));
8978 (void) XSync(display,MagickFalse);
9014MagickPrivate MagickBooleanType XRenderImage(Image *image,
9015 const DrawInfo *draw_info,
const PointInfo *offset,TypeMetric *metrics,
9016 ExceptionInfo *exception)
9026 *display = (Display *) NULL;
9031 static XAnnotateInfo
9040 static XResourceInfo
9046 static XStandardColormap
9052 if (display == (Display *) NULL)
9063 display=XOpenDisplay(draw_info->server_name);
9064 if (display == (Display *) NULL)
9066 ThrowXWindowException(XServerError,
"UnableToOpenXServer",
9067 draw_info->server_name);
9068 return(MagickFalse);
9073 (void) XSetErrorHandler(XError);
9074 image_info=AcquireImageInfo();
9075 client_name=GetClientName();
9076 resource_database=XGetResourceDatabase(display,client_name);
9077 XGetResourceInfo(image_info,resource_database,client_name,&resource_info);
9078 resource_info.close_server=MagickFalse;
9079 resource_info.colormap=PrivateColormap;
9080 resource_info.font=AcquireString(draw_info->font);
9081 resource_info.background_color=AcquireString(
"#ffffffffffff");
9082 resource_info.foreground_color=AcquireString(
"#000000000000");
9083 map_info=XAllocStandardColormap();
9084 visual_info=(XVisualInfo *) NULL;
9085 font_info=(XFontStruct *) NULL;
9086 pixel.pixels=(
unsigned long *) NULL;
9087 if (map_info == (XStandardColormap *) NULL)
9089 ThrowXWindowException(ResourceLimitError,
"MemoryAllocationFailed",
9091 return(MagickFalse);
9096 visual_info=XBestVisualInfo(display,map_info,&resource_info);
9097 if (visual_info == (XVisualInfo *) NULL)
9099 XFreeResources(display,visual_info,map_info,&pixel,font_info,
9100 &resource_info,(XWindowInfo *) NULL);
9101 ThrowXWindowException(XServerError,
"UnableToGetVisual",
9103 return(MagickFalse);
9105 map_info->colormap=(Colormap) NULL;
9109 XGetMapInfo(visual_info,XDefaultColormap(display,visual_info->screen),
9111 XGetPixelInfo(display,visual_info,map_info,&resource_info,(Image *) NULL,
9113 pixel.annotate_context=XDefaultGC(display,visual_info->screen);
9117 font_info=XBestFont(display,&resource_info,MagickFalse);
9118 if (font_info == (XFontStruct *) NULL)
9120 XFreeResources(display,visual_info,map_info,&pixel,font_info,
9121 &resource_info,(XWindowInfo *) NULL);
9122 ThrowXWindowException(XServerError,
"UnableToLoadFont",
9124 return(MagickFalse);
9126 cache_info=(*draw_info);
9131 XGetAnnotateInfo(&annotate_info);
9132 annotate_info.stencil=ForegroundStencil;
9133 if (cache_info.font != draw_info->font)
9138 (void) XFreeFont(display,font_info);
9139 (void) CloneString(&resource_info.font,draw_info->font);
9140 font_info=XBestFont(display,&resource_info,MagickFalse);
9141 if (font_info == (XFontStruct *) NULL)
9143 ThrowXWindowException(XServerError,
"UnableToLoadFont",
9145 return(MagickFalse);
9148 if (draw_info->debug != MagickFalse)
9149 (void) LogMagickEvent(AnnotateEvent,GetMagickModule(),
9150 "Font %s; pointsize %g",draw_info->font != (
char *) NULL ?
9151 draw_info->font :
"none",draw_info->pointsize);
9152 cache_info=(*draw_info);
9153 annotate_info.font_info=font_info;
9154 annotate_info.text=(
char *) draw_info->text;
9155 annotate_info.width=(
unsigned int) XTextWidth(font_info,draw_info->text,(
int)
9156 strlen(draw_info->text));
9157 annotate_info.height=(
unsigned int) (font_info->ascent+font_info->descent);
9158 metrics->pixels_per_em.x=(double) font_info->max_bounds.width;
9159 metrics->pixels_per_em.y=(double) font_info->ascent+font_info->descent;
9160 metrics->ascent=(double) font_info->ascent+4;
9161 metrics->descent=(double) (-font_info->descent);
9162 metrics->width=annotate_info.width/ExpandAffine(&draw_info->affine);
9163 metrics->height=(double) font_info->ascent+font_info->descent;
9164 metrics->max_advance=(double) font_info->max_bounds.width;
9165 metrics->bounds.x1=0.0;
9166 metrics->bounds.y1=metrics->descent;
9167 metrics->bounds.x2=metrics->ascent+metrics->descent;
9168 metrics->bounds.y2=metrics->ascent+metrics->descent;
9169 metrics->underline_position=(-2.0);
9170 metrics->underline_thickness=1.0;
9171 if (draw_info->render == MagickFalse)
9173 if (draw_info->fill.alpha == (
double) TransparentAlpha)
9178 width=annotate_info.width;
9179 height=annotate_info.height;
9180 if ((fabs(draw_info->affine.rx) >= MagickEpsilon) ||
9181 (fabs(draw_info->affine.ry) >= MagickEpsilon))
9183 if ((fabs(draw_info->affine.sx-draw_info->affine.sy) < MagickEpsilon) &&
9184 (fabs(draw_info->affine.rx+draw_info->affine.ry) < MagickEpsilon))
9185 annotate_info.degrees=(double) (180.0/MagickPI)*
9186 atan2(draw_info->affine.rx,draw_info->affine.sx);
9188 (void) FormatLocaleString(annotate_info.geometry,MagickPathExtent,
9189 "%.17gx%.17g%+.20g%+.20g",(
double) width,(
double) height,
9190 ceil(offset->x-0.5),ceil(offset->y-metrics->ascent-metrics->descent+
9191 draw_info->interline_spacing-0.5));
9192 pixel.pen_color.red=ScaleQuantumToShort(
9193 ClampToQuantum(draw_info->fill.red));
9194 pixel.pen_color.green=ScaleQuantumToShort(
9195 ClampToQuantum(draw_info->fill.green));
9196 pixel.pen_color.blue=ScaleQuantumToShort(
9197 ClampToQuantum(draw_info->fill.blue));
9198 status=XAnnotateImage(display,&pixel,&annotate_info,image,exception);
9201 ThrowXWindowException(ResourceLimitError,
"MemoryAllocationFailed",
9203 return(MagickFalse);
9234MagickExport
void XRetainWindowColors(Display *display,
const Window window)
9245 assert(display != (Display *) NULL);
9246 assert(window != (Window) NULL);
9247 if (IsEventLogging() != MagickFalse)
9248 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
9249 property=XInternAtom(display,
"_XSETROOT_ID",MagickFalse);
9250 if (property == (Atom) NULL)
9252 ThrowXWindowException(XServerError,
"UnableToCreateProperty",
9256 pixmap=XCreatePixmap(display,window,1,1,1);
9257 if (pixmap == (Pixmap) NULL)
9259 ThrowXWindowException(XServerError,
"UnableToCreateBitmap",
"");
9262 (void) XChangeProperty(display,window,property,XA_PIXMAP,32,PropModeReplace,
9263 (
unsigned char *) &pixmap,1);
9264 (void) XSetCloseDownMode(display,RetainPermanent);
9297static Window XSelectWindow(Display *display,RectangleInfo *crop_info)
9299#define MinimumCropArea (unsigned int) 9
9328 assert(display != (Display *) NULL);
9329 assert(crop_info != (RectangleInfo *) NULL);
9330 if (IsEventLogging() != MagickFalse)
9331 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
9332 root_window=XRootWindow(display,XDefaultScreen(display));
9333 context_values.background=XBlackPixel(display,XDefaultScreen(display));
9334 context_values.foreground=XWhitePixel(display,XDefaultScreen(display));
9335 context_values.function=GXinvert;
9336 context_values.plane_mask=
9337 context_values.background ^ context_values.foreground;
9338 context_values.subwindow_mode=IncludeInferiors;
9339 annotate_context=XCreateGC(display,root_window,(
size_t) (GCBackground |
9340 GCForeground | GCFunction | GCSubwindowMode),&context_values);
9341 if (annotate_context == (GC) NULL)
9342 return((Window) NULL);
9346 target_cursor=XMakeCursor(display,root_window,XDefaultColormap(display,
9347 XDefaultScreen(display)),(
char * )
"white",(
char * )
"black");
9348 status=XGrabPointer(display,root_window,MagickFalse,(
unsigned int)
9349 (ButtonPressMask | ButtonReleaseMask | ButtonMotionMask),GrabModeSync,
9350 GrabModeAsync,root_window,target_cursor,CurrentTime);
9351 if (status != GrabSuccess)
9353 ThrowXWindowException(XServerError,
"UnableToGrabMouse",
"");
9354 return((Window) NULL);
9360 crop_info->height=0;
9362 target_window=(Window) NULL;
9365 (void) XGrabServer(display);
9368 if ((crop_info->width*crop_info->height) >= MinimumCropArea)
9369 (void) XDrawRectangle(display,root_window,annotate_context,
9370 (
int) crop_info->x,(
int) crop_info->y,(
unsigned int) crop_info->width-1,
9371 (
unsigned int) crop_info->height-1);
9375 (void) XAllowEvents(display,SyncPointer,CurrentTime);
9376 (void) XWindowEvent(display,root_window,ButtonPressMask |
9377 ButtonReleaseMask | ButtonMotionMask,&event);
9378 if ((crop_info->width*crop_info->height) >= MinimumCropArea)
9379 (void) XDrawRectangle(display,root_window,annotate_context,
9380 (
int) crop_info->x,(
int) crop_info->y,(
unsigned int) crop_info->width-1,
9381 (
unsigned int) crop_info->height-1);
9386 target_window=XGetSubwindow(display,event.xbutton.subwindow,
9387 event.xbutton.x,event.xbutton.y);
9388 if (target_window == (Window) NULL)
9389 target_window=root_window;
9390 x_offset=
event.xbutton.x_root;
9391 y_offset=
event.xbutton.y_root;
9392 crop_info->x=(ssize_t) x_offset;
9393 crop_info->y=(ssize_t) y_offset;
9395 crop_info->height=0;
9409 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
9410 crop_info->x=(ssize_t) event.xmotion.x;
9411 crop_info->y=(ssize_t) event.xmotion.y;
9415 if ((
int) crop_info->x < x_offset)
9416 crop_info->width=(size_t) (x_offset-crop_info->x);
9419 crop_info->width=(size_t) (crop_info->x-x_offset);
9420 crop_info->x=(ssize_t) x_offset;
9422 if ((
int) crop_info->y < y_offset)
9423 crop_info->height=(size_t) (y_offset-crop_info->y);
9426 crop_info->height=(size_t) (crop_info->y-y_offset);
9427 crop_info->y=(ssize_t) y_offset;
9433 }
while ((target_window == (Window) NULL) || (presses > 0));
9434 (void) XUngrabServer(display);
9435 (void) XUngrabPointer(display,CurrentTime);
9436 (void) XFreeCursor(display,target_cursor);
9437 (void) XFreeGC(display,annotate_context);
9438 if ((crop_info->width*crop_info->height) < MinimumCropArea)
9441 crop_info->height=0;
9443 if ((crop_info->width != 0) && (crop_info->height != 0))
9444 target_window=root_window;
9445 if (event.xbutton.button == Button3)
9446 target_window=(Window) NULL;
9447 return(target_window);
9479MagickPrivate
void XSetCursorState(Display *display,XWindows *windows,
9480 const MagickStatusType state)
9482 assert(display != (Display *) NULL);
9483 assert(windows != (XWindows *) NULL);
9484 if (IsEventLogging() != MagickFalse)
9485 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
9488 (void) XCheckDefineCursor(display,windows->image.id,
9489 windows->image.busy_cursor);
9490 (void) XCheckDefineCursor(display,windows->pan.id,
9491 windows->pan.busy_cursor);
9492 (void) XCheckDefineCursor(display,windows->magnify.id,
9493 windows->magnify.busy_cursor);
9494 (void) XCheckDefineCursor(display,windows->command.id,
9495 windows->command.busy_cursor);
9499 (void) XCheckDefineCursor(display,windows->image.id,
9500 windows->image.cursor);
9501 (void) XCheckDefineCursor(display,windows->pan.id,windows->pan.cursor);
9502 (void) XCheckDefineCursor(display,windows->magnify.id,
9503 windows->magnify.cursor);
9504 (void) XCheckDefineCursor(display,windows->command.id,
9505 windows->command.cursor);
9506 (void) XCheckDefineCursor(display,windows->command.id,
9507 windows->widget.cursor);
9508 (void) XWithdrawWindow(display,windows->info.id,windows->info.screen);
9510 windows->info.mapped=MagickFalse;
9536MagickPrivate XWindows *XSetWindows(XWindows *windows_info)
9539 *windows = (XWindows *) NULL;
9541 if (windows_info != (XWindows *) ~0)
9543 windows=(XWindows *) RelinquishMagickMemory(windows);
9544 windows=windows_info;
9571MagickPrivate
void XUserPreferences(XResourceInfo *resource_info)
9573#if defined(X11_PREFERENCES_PATH)
9575 cache[MagickPathExtent],
9576 filename[MagickPathExtent],
9577 specifier[MagickPathExtent];
9584 preferences_database;
9589 assert(resource_info != (XResourceInfo *) NULL);
9590 client_name=GetClientName();
9591 preferences_database=XrmGetStringDatabase(
"");
9592 (void) FormatLocaleString(specifier,MagickPathExtent,
"%s.backdrop",client_name);
9593 value=resource_info->backdrop ?
"True" :
"False";
9594 XrmPutStringResource(&preferences_database,specifier,(
char *) value);
9595 (void) FormatLocaleString(specifier,MagickPathExtent,
"%s.colormap",client_name);
9596 value=resource_info->colormap == SharedColormap ?
"Shared" :
"Private";
9597 XrmPutStringResource(&preferences_database,specifier,(
char *) value);
9598 (void) FormatLocaleString(specifier,MagickPathExtent,
"%s.confirmExit",
9600 value=resource_info->confirm_exit ?
"True" :
"False";
9601 XrmPutStringResource(&preferences_database,specifier,(
char *) value);
9602 (void) FormatLocaleString(specifier,MagickPathExtent,
"%s.confirmEdit",
9604 value=resource_info->confirm_edit ?
"True" :
"False";
9605 XrmPutStringResource(&preferences_database,specifier,(
char *) value);
9606 (void) FormatLocaleString(specifier,MagickPathExtent,
"%s.displayWarnings",
9608 value=resource_info->display_warnings ?
"True" :
"False";
9609 XrmPutStringResource(&preferences_database,specifier,(
char *) value);
9610 (void) FormatLocaleString(specifier,MagickPathExtent,
"%s.dither",client_name);
9611 value=resource_info->quantize_info->dither_method != NoDitherMethod ?
9613 XrmPutStringResource(&preferences_database,specifier,(
char *) value);
9614 (void) FormatLocaleString(specifier,MagickPathExtent,
"%s.gammaCorrect",
9616 value=resource_info->gamma_correct ?
"True" :
"False";
9617 XrmPutStringResource(&preferences_database,specifier,(
char *) value);
9618 (void) FormatLocaleString(specifier,MagickPathExtent,
"%s.undoCache",client_name);
9619 (void) FormatLocaleString(cache,MagickPathExtent,
"%.17g",(
double)
9620 resource_info->undo_cache);
9621 XrmPutStringResource(&preferences_database,specifier,cache);
9622 (void) FormatLocaleString(specifier,MagickPathExtent,
"%s.usePixmap",client_name);
9623 value=resource_info->use_pixmap ?
"True" :
"False";
9624 XrmPutStringResource(&preferences_database,specifier,(
char *) value);
9625 (void) FormatLocaleString(filename,MagickPathExtent,
"%s%src",
9626 X11_PREFERENCES_PATH,client_name);
9627 ExpandFilename(filename);
9628 XrmPutFileDatabase(preferences_database,filename);
9657static const char *XVisualClassName(
const int visual_class)
9659 switch (visual_class)
9661 case StaticGray:
return(
"StaticGray");
9662 case GrayScale:
return(
"GrayScale");
9663 case StaticColor:
return(
"StaticColor");
9664 case PseudoColor:
return(
"PseudoColor");
9665 case TrueColor:
return(
"TrueColor");
9666 case DirectColor:
return(
"DirectColor");
9668 return(
"unknown visual class");
9699MagickPrivate
void XWarning(
const ExceptionType magick_unused(warning),
9700 const char *reason,
const char *description)
9703 text[MagickPathExtent];
9708 if (reason == (
char *) NULL)
9710 (void) CopyMagickString(text,reason,MagickPathExtent);
9711 (void) ConcatenateMagickString(text,
":",MagickPathExtent);
9712 windows=XSetWindows((XWindows *) ~0);
9713 if (windows != (XWindows *) NULL)
9714 XNoticeWidget(windows->display,windows,text,(
char *) description);
9747MagickPrivate Window XWindowByID(Display *display,
const Window root_window,
9767 assert(display != (Display *) NULL);
9768 assert(root_window != (Window) NULL);
9769 if (IsEventLogging() != MagickFalse)
9770 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
9772 return(XSelectWindow(display,&rectangle_info));
9773 if (root_window ==
id)
9774 return(root_window);
9775 status=XQueryTree(display,root_window,&child,&child,&children,
9777 if (status == False)
9778 return((Window) NULL);
9779 window=(Window) NULL;
9780 for (i=0; i < (int) number_children; i++)
9785 window=XWindowByID(display,children[i],
id);
9786 if (window != (Window) NULL)
9789 if (children != (Window *) NULL)
9790 (void) XFree((
void *) children);
9826MagickPrivate Window XWindowByName(Display *display,
const Window root_window,
9846 assert(display != (Display *) NULL);
9847 assert(root_window != (Window) NULL);
9848 assert(name != (
char *) NULL);
9849 if (IsEventLogging() != MagickFalse)
9850 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",name);
9851 if (XGetWMName(display,root_window,&window_name) != 0)
9852 if (LocaleCompare((
char *) window_name.value,name) == 0)
9853 return(root_window);
9854 status=XQueryTree(display,root_window,&child,&child,&children,
9856 if (status == False)
9857 return((Window) NULL);
9858 window=(Window) NULL;
9859 for (i=0; i < (int) number_children; i++)
9864 window=XWindowByName(display,children[i],name);
9865 if (window != (Window) NULL)
9868 if (children != (Window *) NULL)
9869 (void) XFree((
void *) children);
9904MagickPrivate Window XWindowByProperty(Display *display,
const Window window,
9905 const Atom property)
9933 assert(display != (Display *) NULL);
9934 assert(window != (Window) NULL);
9935 assert(property != (Atom) NULL);
9936 if (IsEventLogging() != MagickFalse)
9937 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
9938 status=XQueryTree(display,window,&root,&parent,&children,&number_children);
9939 if (status == False)
9940 return((Window) NULL);
9942 child=(Window) NULL;
9943 for (i=0; (i < number_children) && (child == (Window) NULL); i++)
9945 status=XGetWindowProperty(display,children[i],property,0L,0L,MagickFalse,
9946 (Atom) AnyPropertyType,&type,&format,&number_items,&after,&data);
9948 (void) XFree((
void *) data);
9949 if ((status == Success) && (type != (Atom) NULL))
9952 for (i=0; (i < number_children) && (child == (Window) NULL); i++)
9953 child=XWindowByProperty(display,children[i],property);
9954 if (children != (Window *) NULL)
9955 (void) XFree((
void *) children);
9987MagickExport Image *XImportImage(
const ImageInfo *image_info,
9988 XImportInfo *ximage_info,ExceptionInfo *exception)
9990 assert(image_info != (
const ImageInfo *) NULL);
9991 assert(image_info->signature == MagickCoreSignature);
9992 assert(ximage_info != (XImportInfo *) NULL);
9993 assert(exception != (ExceptionInfo *) NULL);
9994 assert(exception->signature == MagickCoreSignature);
9995 if (IsEventLogging() != MagickFalse)
9996 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
9997 image_info->filename);
10000 return((Image *) NULL);
10035MagickPrivate MagickBooleanType XRenderImage(Image *image,
10036 const DrawInfo *draw_info,
const PointInfo *offset,TypeMetric *metrics,
10037 ExceptionInfo *exception)
10042 (void) ThrowMagickException(exception,GetMagickModule(),
10043 MissingDelegateError,
"DelegateLibrarySupportNotBuiltIn",
"'%s' (X11)",
10045 return(MagickFalse);
10067MagickPrivate MagickBooleanType XComponentGenesis(
void)
10069 return(MagickTrue);
10094MagickExport
void XGetImportInfo(XImportInfo *ximage_info)
10096 assert(ximage_info != (XImportInfo *) NULL);
10097 ximage_info->frame=MagickFalse;
10098 ximage_info->borders=MagickFalse;
10099 ximage_info->screen=MagickFalse;
10100 ximage_info->descend=MagickTrue;
10101 ximage_info->silent=MagickFalse;