• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2   Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization
3   dedicated to making software imaging solutions freely available.
4 
5   You may not use this file except in compliance with the License.  You may
6   obtain a copy of the License at
7 
8     https://imagemagick.org/script/license.php
9 
10   Unless required by applicable law or agreed to in writing, software
11   distributed under the License is distributed on an "AS IS" BASIS,
12   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   See the License for the specific language governing permissions and
14   limitations under the License.
15 
16   MagickCore X11 window methods.
17 */
18 #ifndef MAGICKCORE_XWINDOW_PRIVATE_H
19 #define MAGICKCORE_XWINDOW_PRIVATE_H
20 
21 #include "MagickCore/draw.h"
22 #include "MagickCore/exception.h"
23 #include "MagickCore/geometry.h"
24 #include "MagickCore/nt-base-private.h"
25 #include "MagickCore/pixel-accessor.h"
26 #include "MagickCore/quantize.h"
27 
28 #if defined(__cplusplus) || defined(c_plusplus)
29 extern "C" {
30 #endif
31 
32 #if defined(MAGICKCORE_X11_DELEGATE)
33 
34 #include <X11/Xos.h>
35 #include <X11/Xlib.h>
36 #include <X11/Xatom.h>
37 #include <X11/cursorfont.h>
38 #include <X11/keysym.h>
39 #include <X11/Xresource.h>
40 #include <X11/Xutil.h>
41 
42 #if defined(__cplusplus) || defined(c_plusplus)
43 # define klass  c_class
44 #else
45 # define klass  class
46 #endif
47 
48 #define MaxIconSize  96
49 #define MaxNumberPens  11
50 #define MaxNumberFonts  11
51 #define MaxXWindows  12
52 #undef index
53 
54 #define ThrowXWindowException(severity,tag,context) \
55 { \
56   ExceptionInfo \
57     *exception; \
58  \
59   exception=AcquireExceptionInfo(); \
60   (void) ThrowMagickException(exception,GetMagickModule(),severity, \
61     tag == (const char *) NULL ? "unknown" : tag,"'%s': %s",context, \
62     strerror(errno)); \
63   CatchException(exception); \
64   (void) DestroyExceptionInfo(exception); \
65 }
66 #define ThrowXWindowFatalException(severity,tag,context) \
67 { \
68    ThrowXWindowException(severity,tag,context); \
69   _exit(1); \
70 }
71 
72 typedef enum
73 {
74   ForegroundStencil,
75   BackgroundStencil,
76   OpaqueStencil,
77   TransparentStencil
78 } AnnotationStencil;
79 
80 typedef enum
81 {
82   UndefinedElement,
83   PointElement,
84   LineElement,
85   RectangleElement,
86   FillRectangleElement,
87   CircleElement,
88   FillCircleElement,
89   EllipseElement,
90   FillEllipseElement,
91   PolygonElement,
92   FillPolygonElement,
93   ColorElement,
94   MatteElement,
95   TextElement,
96   ImageElement
97 } ElementType;
98 
99 typedef enum
100 {
101   UndefinedColormap,
102   PrivateColormap,
103   SharedColormap
104 } XColormapType;
105 
106 typedef struct _XDrawInfo
107 {
108   int
109     x,
110     y;
111 
112   unsigned int
113     width,
114     height;
115 
116   double
117     degrees;
118 
119   AnnotationStencil
120     stencil;
121 
122   ElementType
123     element;
124 
125   Pixmap
126     stipple;
127 
128   unsigned int
129     line_width;
130 
131   XSegment
132     line_info;
133 
134   unsigned int
135     number_coordinates;
136 
137   RectangleInfo
138     rectangle_info;
139 
140   XPoint
141     *coordinate_info;
142 
143   char
144     geometry[MagickPathExtent];
145 } XDrawInfo;
146 
147 typedef enum
148 {
149   DefaultState = 0x0000,
150   EscapeState = 0x0001,
151   ExitState = 0x0002,
152   FormerImageState = 0x0004,
153   ModifierState = 0x0008,
154   MontageImageState = 0x0010,
155   NextImageState = 0x0020,
156   RetainColorsState = 0x0040,
157   SuspendTime = 50,
158   UpdateConfigurationState = 0x0080,
159   UpdateRegionState = 0x0100
160 } XState;
161 
162 typedef struct _XAnnotateInfo
163 {
164   int
165     x,
166     y;
167 
168   unsigned int
169     width,
170     height;
171 
172   double
173     degrees;
174 
175   XFontStruct
176     *font_info;
177 
178   char
179     *text;
180 
181   AnnotationStencil
182     stencil;
183 
184   char
185     geometry[MagickPathExtent];
186 
187   struct _XAnnotateInfo
188     *next,
189     *previous;
190 } XAnnotateInfo;
191 
192 typedef struct _XPixelInfo
193 {
194   ssize_t
195     colors;
196 
197   unsigned long
198     *pixels;
199 
200   XColor
201     alpha_color,  /* deprecated */
202     foreground_color,
203     background_color,
204     border_color,
205     highlight_color,
206     shadow_color,
207     depth_color,
208     trough_color,
209     box_color,
210     pen_color,
211     pen_colors[MaxNumberPens];
212 
213   GC
214     annotate_context,
215     highlight_context,
216     widget_context;
217 
218   unsigned short
219     box_index,
220     pen_index;
221 
222   XColor
223     matte_color;
224 } XPixelInfo;
225 
226 typedef struct _XResourceInfo
227 {
228   XrmDatabase
229     resource_database;
230 
231   ImageInfo
232     *image_info;
233 
234   QuantizeInfo
235     *quantize_info;
236 
237   size_t
238     colors;
239 
240   MagickBooleanType
241     close_server,
242     backdrop;
243 
244   char
245     *background_color,
246     *border_color;
247 
248   char
249     *client_name;
250 
251   XColormapType
252     colormap;
253 
254   unsigned int
255     border_width;
256 
257   size_t
258     delay;
259 
260   MagickBooleanType
261     color_recovery,
262     confirm_exit,
263     confirm_edit;
264 
265   char
266     *display_gamma;
267 
268   char
269     *font,
270     *font_name[MaxNumberFonts],
271     *foreground_color;
272 
273   MagickBooleanType
274     display_warnings,
275     gamma_correct;
276 
277   char
278     *icon_geometry;
279 
280   MagickBooleanType
281     iconic,
282     immutable;
283 
284   char
285     *image_geometry;
286 
287   char
288     *alpha_color,  /* deprecated */
289     *map_type,
290     *name;
291 
292   unsigned int
293     magnify,
294     pause;
295 
296   char
297     *pen_colors[MaxNumberPens];
298 
299   char
300     *text_font,
301     *title;
302 
303   int
304     quantum;
305 
306   unsigned int
307     update;
308 
309   MagickBooleanType
310     use_pixmap,
311     use_shared_memory;
312 
313   size_t
314     undo_cache;
315 
316   char
317     *visual_type,
318     *window_group,
319     *window_id,
320     *write_filename;
321 
322   Image
323     *copy_image;
324 
325   int
326     gravity;
327 
328   char
329     home_directory[MagickPathExtent];
330 
331   char
332     *matte_color;
333 } XResourceInfo;
334 
335 typedef struct _XWindowInfo
336 {
337   Window
338     id;
339 
340   Window
341     root;
342 
343   Visual
344     *visual;
345 
346   unsigned int
347     storage_class,
348     depth;
349 
350   XVisualInfo
351     *visual_info;
352 
353   XStandardColormap
354     *map_info;
355 
356   XPixelInfo
357     *pixel_info;
358 
359   XFontStruct
360     *font_info;
361 
362   GC
363     annotate_context,
364     highlight_context,
365     widget_context;
366 
367   Cursor
368     cursor,
369     busy_cursor;
370 
371   char
372     *name,
373     *geometry,
374     *icon_name,
375     *icon_geometry,
376     *crop_geometry;
377 
378   size_t
379     data,
380     flags;
381 
382   int
383     x,
384     y;
385 
386   unsigned int
387     width,
388     height,
389     min_width,
390     min_height,
391     width_inc,
392     height_inc,
393     border_width;
394 
395   MagickBooleanType
396     use_pixmap,
397     immutable,
398     shape,
399     shared_memory;
400 
401   int
402     screen;
403 
404   XImage
405     *ximage,
406     *matte_image;
407 
408   Pixmap
409     highlight_stipple,
410     shadow_stipple,
411     pixmap,
412     *pixmaps,
413     matte_pixmap,
414     *matte_pixmaps;
415 
416   XSetWindowAttributes
417     attributes;
418 
419   XWindowChanges
420     window_changes;
421 
422   void
423     *segment_info;
424 
425   long
426     mask;
427 
428   MagickBooleanType
429     orphan,
430     mapped,
431     stasis;
432 
433   Image
434     *image;
435 
436   MagickBooleanType
437     destroy;
438 } XWindowInfo;
439 
440 typedef struct _XWindows
441 {
442   Display
443     *display;
444 
445   XStandardColormap
446     *map_info,
447     *icon_map;
448 
449   XVisualInfo
450     *visual_info,
451     *icon_visual;
452 
453   XPixelInfo
454     *pixel_info,
455     *icon_pixel;
456 
457   XFontStruct
458     *font_info;
459 
460   XResourceInfo
461     *icon_resources;
462 
463   XClassHint
464     *class_hints;
465 
466   XWMHints
467     *manager_hints;
468 
469   XWindowInfo
470     context,
471     group_leader,
472     backdrop,
473     icon,
474     image,
475     info,
476     magnify,
477     pan,
478     command,
479     widget,
480     popup;
481 
482   Atom
483     wm_protocols,
484     wm_delete_window,
485     wm_take_focus,
486     im_protocols,
487     im_remote_command,
488     im_update_widget,
489     im_update_colormap,
490     im_former_image,
491     im_retain_colors,
492     im_next_image,
493     im_exit,
494     dnd_protocols;
495 } XWindows;
496 
497 extern MagickPrivate Cursor
498   XMakeCursor(Display *,Window,Colormap,char *,char *);
499 
500 extern MagickPrivate int
501   XCheckDefineCursor(Display *,Window,Cursor);
502 
503 extern MagickPrivate MagickBooleanType
504   XAnnotateImage(Display *,const XPixelInfo *,XAnnotateInfo *,Image *,
505     ExceptionInfo *),
506   XComponentGenesis(void),
507   XDrawImage(Display *,const XPixelInfo *,XDrawInfo *,Image *,ExceptionInfo *),
508   XGetWindowColor(Display *,XWindows *,char *,ExceptionInfo *),
509   XMagickProgressMonitor(const char *,const MagickOffsetType,
510     const MagickSizeType,void *),
511   XMakeImage(Display *,const XResourceInfo *,XWindowInfo *,Image *,unsigned int,
512     unsigned int,ExceptionInfo *),
513   XQueryColorCompliance(const char *,XColor *);
514 
515 extern MagickPrivate void
516   XBestIconSize(Display *,XWindowInfo *,Image *),
517   XBestPixel(Display *,const Colormap,XColor *,unsigned int,XColor *),
518   XCheckRefreshWindows(Display *,XWindows *),
519   XClientMessage(Display *,const Window,const Atom,const Atom,const Time),
520   XComponentTerminus(void),
521   XConfigureImageColormap(Display *,XResourceInfo *,XWindows *,Image *,
522     ExceptionInfo *),
523   XConstrainWindowPosition(Display *,XWindowInfo *),
524   XDelay(Display *,const size_t),
525   XDisplayImageInfo(Display *,const XResourceInfo *,XWindows *,Image *,Image *,
526     ExceptionInfo *),
527   XDestroyWindowColors(Display *,Window),
528   XFreeResources(Display *,XVisualInfo *,XStandardColormap *,XPixelInfo *,
529     XFontStruct *,XResourceInfo *,XWindowInfo *),
530   XFreeStandardColormap(Display *,const XVisualInfo *,XStandardColormap *,
531     XPixelInfo *),
532   XHighlightEllipse(Display *,Window,GC,const RectangleInfo *),
533   XHighlightLine(Display *,Window,GC,const XSegment *),
534   XHighlightRectangle(Display *,Window,GC,const RectangleInfo *),
535   XGetAnnotateInfo(XAnnotateInfo *),
536   XGetPixelInfo(Display *,const XVisualInfo *,const XStandardColormap *,
537     const XResourceInfo *,Image *,XPixelInfo *),
538   XGetMapInfo(const XVisualInfo *,const Colormap,XStandardColormap *),
539   XGetWindowInfo(Display *,XVisualInfo *,XStandardColormap *,XPixelInfo *,
540     XFontStruct *,XResourceInfo *,XWindowInfo *),
541   XMakeMagnifyImage(Display *,XWindows *,ExceptionInfo *),
542   XMakeStandardColormap(Display *,XVisualInfo *,XResourceInfo *,Image *,
543     XStandardColormap *,XPixelInfo *,ExceptionInfo *),
544   XMakeWindow(Display *,Window,char **,int,XClassHint *,XWMHints *,
545     XWindowInfo *),
546   XQueryPosition(Display *,const Window,int *,int *),
547   XRefreshWindow(Display *,const XWindowInfo *,const XEvent *),
548   XSetCursorState(Display *,XWindows *,const MagickStatusType),
549   XUserPreferences(XResourceInfo *),
550   XWarning(const ExceptionType,const char *,const char *);
551 
552 extern MagickPrivate Window
553   XWindowByID(Display *,const Window,const size_t),
554   XWindowByName(Display *,const Window,const char *),
555   XWindowByProperty(Display *,const Window,const Atom);
556 
557 extern MagickPrivate XFontStruct
558   *XBestFont(Display *,const XResourceInfo *,const MagickBooleanType);
559 
560 extern MagickPrivate XVisualInfo
561   *XBestVisualInfo(Display *,XStandardColormap *,XResourceInfo *);
562 
563 extern MagickPrivate XWindows
564   *XInitializeWindows(Display *,XResourceInfo *),
565   *XSetWindows(XWindows *);
566 
567 extern MagickExport char
568   *XGetResourceClass(XrmDatabase,const char *,const char *,char *),
569   *XGetResourceInstance(XrmDatabase,const char *,const char *,const char *),
570   *XGetScreenDensity(Display *);
571 
572 extern MagickExport int
573   XError(Display *,XErrorEvent *);
574 
575 extern MagickExport MagickBooleanType
576   XRemoteCommand(Display *,const char *,const char *);
577 
578 extern MagickExport void
579   DestroyXResources(void),
580   XDestroyResourceInfo(XResourceInfo *),
581   XGetResourceInfo(const ImageInfo *,XrmDatabase,const char *,XResourceInfo *),
582   XRetainWindowColors(Display *,const Window);
583 
584 extern MagickExport XrmDatabase
585   XGetResourceDatabase(Display *,const char *);
586 
XPixelIntensity(const XColor * pixel)587 static inline double XPixelIntensity(const XColor *pixel)
588 {
589   double
590     intensity;
591 
592   if ((pixel->red  == pixel->green) && (pixel->green == pixel->blue))
593     return((double) pixel->red);
594   intensity=0.212656*pixel->red+0.715158*pixel->green+0.072186*pixel->blue;
595   return(intensity);
596 }
597 
598 #endif
599 
600 extern MagickPrivate MagickBooleanType
601   XRenderImage(Image *,const DrawInfo *,const PointInfo *,TypeMetric *,
602     ExceptionInfo *);
603 
604 #if defined(__cplusplus) || defined(c_plusplus)
605 }
606 #endif
607 
608 #endif
609