1/*
2  Copyright 1999-2016 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.
6  obtain a copy of the License at
7
8    http://www.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)
29extern "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
72typedef enum
73{
74  ForegroundStencil,
75  BackgroundStencil,
76  OpaqueStencil,
77  TransparentStencil
78} AnnotationStencil;
79
80typedef 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
99typedef enum
100{
101  UndefinedColormap,
102  PrivateColormap,
103  SharedColormap
104} XColormapType;
105
106typedef 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
147typedef 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
162typedef 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
192typedef struct _XPixelInfo
193{
194  ssize_t
195    colors;
196
197  unsigned long
198    *pixels;
199
200  XColor
201    alpha_color,
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} XPixelInfo;
222
223typedef struct _XResourceInfo
224{
225  XrmDatabase
226    resource_database;
227
228  ImageInfo
229    *image_info;
230
231  QuantizeInfo
232    *quantize_info;
233
234  size_t
235    colors;
236
237  MagickBooleanType
238    close_server,
239    backdrop;
240
241  char
242    *background_color,
243    *border_color;
244
245  char
246    *client_name;
247
248  XColormapType
249    colormap;
250
251  unsigned int
252    border_width;
253
254  size_t
255    delay;
256
257  MagickBooleanType
258    color_recovery,
259    confirm_exit,
260    confirm_edit;
261
262  char
263    *display_gamma;
264
265  char
266    *font,
267    *font_name[MaxNumberFonts],
268    *foreground_color;
269
270  MagickBooleanType
271    display_warnings,
272    gamma_correct;
273
274  char
275    *icon_geometry;
276
277  MagickBooleanType
278    iconic,
279    immutable;
280
281  char
282    *image_geometry;
283
284  char
285    *alpha_color,
286    *map_type,
287    *name;
288
289  unsigned int
290    magnify,
291    pause;
292
293  char
294    *pen_colors[MaxNumberPens];
295
296  char
297    *text_font,
298    *title;
299
300  int
301    quantum;
302
303  unsigned int
304    update;
305
306  MagickBooleanType
307    use_pixmap,
308    use_shared_memory;
309
310  size_t
311    undo_cache;
312
313  char
314    *visual_type,
315    *window_group,
316    *window_id,
317    *write_filename;
318
319  Image
320    *copy_image;
321
322  int
323    gravity;
324
325  char
326    home_directory[MagickPathExtent];
327} XResourceInfo;
328
329typedef struct _XWindowInfo
330{
331  Window
332    id;
333
334  Window
335    root;
336
337  Visual
338    *visual;
339
340  unsigned int
341    storage_class,
342    depth;
343
344  XVisualInfo
345    *visual_info;
346
347  XStandardColormap
348    *map_info;
349
350  XPixelInfo
351    *pixel_info;
352
353  XFontStruct
354    *font_info;
355
356  GC
357    annotate_context,
358    highlight_context,
359    widget_context;
360
361  Cursor
362    cursor,
363    busy_cursor;
364
365  char
366    *name,
367    *geometry,
368    *icon_name,
369    *icon_geometry,
370    *crop_geometry;
371
372  size_t
373    data,
374    flags;
375
376  int
377    x,
378    y;
379
380  unsigned int
381    width,
382    height,
383    min_width,
384    min_height,
385    width_inc,
386    height_inc,
387    border_width;
388
389  MagickBooleanType
390    use_pixmap,
391    immutable,
392    shape,
393    shared_memory;
394
395  int
396    screen;
397
398  XImage
399    *ximage,
400    *matte_image;
401
402  Pixmap
403    highlight_stipple,
404    shadow_stipple,
405    pixmap,
406    *pixmaps,
407    matte_pixmap,
408    *matte_pixmaps;
409
410  XSetWindowAttributes
411    attributes;
412
413  XWindowChanges
414    window_changes;
415
416  void
417    *segment_info;
418
419  long
420    mask;
421
422  MagickBooleanType
423    orphan,
424    mapped,
425    stasis;
426
427  Image
428    *image;
429
430  MagickBooleanType
431    destroy;
432} XWindowInfo;
433
434typedef struct _XWindows
435{
436  Display
437    *display;
438
439  XStandardColormap
440    *map_info,
441    *icon_map;
442
443  XVisualInfo
444    *visual_info,
445    *icon_visual;
446
447  XPixelInfo
448    *pixel_info,
449    *icon_pixel;
450
451  XFontStruct
452    *font_info;
453
454  XResourceInfo
455    *icon_resources;
456
457  XClassHint
458    *class_hints;
459
460  XWMHints
461    *manager_hints;
462
463  XWindowInfo
464    context,
465    group_leader,
466    backdrop,
467    icon,
468    image,
469    info,
470    magnify,
471    pan,
472    command,
473    widget,
474    popup;
475
476  Atom
477    wm_protocols,
478    wm_delete_window,
479    wm_take_focus,
480    im_protocols,
481    im_remote_command,
482    im_update_widget,
483    im_update_colormap,
484    im_former_image,
485    im_retain_colors,
486    im_next_image,
487    im_exit,
488    dnd_protocols;
489} XWindows;
490
491extern MagickPrivate Cursor
492  XMakeCursor(Display *,Window,Colormap,char *,char *);
493
494extern MagickPrivate int
495  XCheckDefineCursor(Display *,Window,Cursor);
496
497extern MagickPrivate MagickBooleanType
498  XAnnotateImage(Display *,const XPixelInfo *,XAnnotateInfo *,Image *,
499    ExceptionInfo *),
500  XComponentGenesis(void),
501  XDrawImage(Display *,const XPixelInfo *,XDrawInfo *,Image *,ExceptionInfo *),
502  XGetWindowColor(Display *,XWindows *,char *,ExceptionInfo *),
503  XMagickProgressMonitor(const char *,const MagickOffsetType,
504    const MagickSizeType,void *),
505  XMakeImage(Display *,const XResourceInfo *,XWindowInfo *,Image *,unsigned int,
506    unsigned int,ExceptionInfo *),
507  XQueryColorCompliance(const char *,XColor *);
508
509extern MagickPrivate void
510  XBestIconSize(Display *,XWindowInfo *,Image *),
511  XBestPixel(Display *,const Colormap,XColor *,unsigned int,XColor *),
512  XCheckRefreshWindows(Display *,XWindows *),
513  XClientMessage(Display *,const Window,const Atom,const Atom,const Time),
514  XComponentTerminus(void),
515  XConfigureImageColormap(Display *,XResourceInfo *,XWindows *,Image *,
516    ExceptionInfo *),
517  XConstrainWindowPosition(Display *,XWindowInfo *),
518  XDelay(Display *,const size_t),
519  XDisplayImageInfo(Display *,const XResourceInfo *,XWindows *,Image *,Image *,
520    ExceptionInfo *),
521  XDestroyWindowColors(Display *,Window),
522  XFreeResources(Display *,XVisualInfo *,XStandardColormap *,XPixelInfo *,
523    XFontStruct *,XResourceInfo *,XWindowInfo *),
524  XFreeStandardColormap(Display *,const XVisualInfo *,XStandardColormap *,
525    XPixelInfo *),
526  XHighlightEllipse(Display *,Window,GC,const RectangleInfo *),
527  XHighlightLine(Display *,Window,GC,const XSegment *),
528  XHighlightRectangle(Display *,Window,GC,const RectangleInfo *),
529  XGetAnnotateInfo(XAnnotateInfo *),
530  XGetPixelInfo(Display *,const XVisualInfo *,const XStandardColormap *,
531    const XResourceInfo *,Image *,XPixelInfo *),
532  XGetMapInfo(const XVisualInfo *,const Colormap,XStandardColormap *),
533  XGetWindowInfo(Display *,XVisualInfo *,XStandardColormap *,XPixelInfo *,
534    XFontStruct *,XResourceInfo *,XWindowInfo *),
535  XMakeMagnifyImage(Display *,XWindows *,ExceptionInfo *),
536  XMakeStandardColormap(Display *,XVisualInfo *,XResourceInfo *,Image *,
537    XStandardColormap *,XPixelInfo *,ExceptionInfo *),
538  XMakeWindow(Display *,Window,char **,int,XClassHint *,XWMHints *,
539    XWindowInfo *),
540  XQueryPosition(Display *,const Window,int *,int *),
541  XRefreshWindow(Display *,const XWindowInfo *,const XEvent *),
542  XSetCursorState(Display *,XWindows *,const MagickStatusType),
543  XUserPreferences(XResourceInfo *),
544  XWarning(const ExceptionType,const char *,const char *);
545
546extern MagickPrivate Window
547  XWindowByID(Display *,const Window,const size_t),
548  XWindowByName(Display *,const Window,const char *),
549  XWindowByProperty(Display *,const Window,const Atom);
550
551extern MagickPrivate XFontStruct
552  *XBestFont(Display *,const XResourceInfo *,const MagickBooleanType);
553
554extern MagickPrivate XVisualInfo
555  *XBestVisualInfo(Display *,XStandardColormap *,XResourceInfo *);
556
557extern MagickPrivate XWindows
558  *XInitializeWindows(Display *,XResourceInfo *),
559  *XSetWindows(XWindows *);
560
561extern MagickExport char
562  *XGetResourceClass(XrmDatabase,const char *,const char *,char *),
563  *XGetResourceInstance(XrmDatabase,const char *,const char *,const char *),
564  *XGetScreenDensity(Display *);
565
566extern MagickExport int
567  XError(Display *,XErrorEvent *);
568
569extern MagickExport MagickBooleanType
570  XRemoteCommand(Display *,const char *,const char *);
571
572extern MagickExport void
573  DestroyXResources(void),
574  XDestroyResourceInfo(XResourceInfo *),
575  XGetResourceInfo(const ImageInfo *,XrmDatabase,const char *,XResourceInfo *),
576  XRetainWindowColors(Display *,const Window);
577
578extern MagickExport XrmDatabase
579  XGetResourceDatabase(Display *,const char *);
580
581static inline double XPixelIntensity(const XColor *pixel)
582{
583  double
584    intensity;
585
586  if ((pixel->red  == pixel->green) && (pixel->green == pixel->blue))
587    return((double) pixel->red);
588  intensity=0.212656*pixel->red+0.715158*pixel->green+0.072186*pixel->blue;
589  return(intensity);
590}
591
592#endif
593
594extern MagickPrivate MagickBooleanType
595  XRenderImage(Image *,const DrawInfo *,const PointInfo *,TypeMetric *,
596    ExceptionInfo *);
597
598#if defined(__cplusplus) || defined(c_plusplus)
599}
600#endif
601
602#endif
603