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)
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,
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
223 typedef 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
329 typedef 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
434 typedef 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
491 extern MagickPrivate Cursor
492 XMakeCursor(Display *,Window,Colormap,char *,char *);
493
494 extern MagickPrivate int
495 XCheckDefineCursor(Display *,Window,Cursor);
496
497 extern 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
509 extern 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
546 extern 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
551 extern MagickPrivate XFontStruct
552 *XBestFont(Display *,const XResourceInfo *,const MagickBooleanType);
553
554 extern MagickPrivate XVisualInfo
555 *XBestVisualInfo(Display *,XStandardColormap *,XResourceInfo *);
556
557 extern MagickPrivate XWindows
558 *XInitializeWindows(Display *,XResourceInfo *),
559 *XSetWindows(XWindows *);
560
561 extern MagickExport char
562 *XGetResourceClass(XrmDatabase,const char *,const char *,char *),
563 *XGetResourceInstance(XrmDatabase,const char *,const char *,const char *),
564 *XGetScreenDensity(Display *);
565
566 extern MagickExport int
567 XError(Display *,XErrorEvent *);
568
569 extern MagickExport MagickBooleanType
570 XRemoteCommand(Display *,const char *,const char *);
571
572 extern MagickExport void
573 DestroyXResources(void),
574 XDestroyResourceInfo(XResourceInfo *),
575 XGetResourceInfo(const ImageInfo *,XrmDatabase,const char *,XResourceInfo *),
576 XRetainWindowColors(Display *,const Window);
577
578 extern MagickExport XrmDatabase
579 XGetResourceDatabase(Display *,const char *);
580
XPixelIntensity(const XColor * pixel)581 static 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
594 extern 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