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 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