1 /* Copyright (C) 1989, 2000 Aladdin Enterprises. All rights reserved. 2 3 This software is provided AS-IS with no warranty, either express or 4 implied. 5 6 This software is distributed under license and may not be copied, 7 modified or distributed except as expressly authorized under the terms 8 of the license contained in the file LICENSE in this distribution. 9 10 For more information about licensing, please refer to 11 http://www.ghostscript.com/licensing/. For information on 12 commercial licensing, go to http://www.artifex.com/licensing/ or 13 contact Artifex Software, Inc., 101 Lucas Valley Road #110, 14 San Rafael, CA 94903, U.S.A., +1(415)492-9861. 15 */ 16 17 /* $Id: gdevx.h,v 1.7 2002/06/16 07:25:26 lpd Exp $ */ 18 /* Definitions for X Windows drivers */ 19 /* Requires gxdevice.h and x_.h */ 20 21 #ifndef gdevx_INCLUDED 22 # define gdevx_INCLUDED 23 24 /* Define the type of an X pixel. */ 25 typedef unsigned long x_pixel; 26 27 #include "gdevbbox.h" 28 #include "gdevxcmp.h" 29 30 /* Declare the X resource tables compiled separately in gdevxres.c. */ 31 extern XtResource gdev_x_resources[]; 32 extern const int gdev_x_resource_count; 33 extern String gdev_x_fallback_resources[]; 34 35 /* Define PostScript to X11 font name mapping */ 36 /* 37 * x11fontlist is only used within x11fontmap. 38 * The names array is managed by Xlib, so the structure is simple. 39 */ 40 typedef struct x11fontlist_s { 41 char **names; 42 int count; 43 } x11fontlist; 44 typedef struct x11fontmap_s x11fontmap; 45 struct x11fontmap_s { 46 char *ps_name; 47 char *x11_name; 48 x11fontlist std, iso; 49 x11fontmap *next; 50 }; 51 #define private_st_x11fontmap() /* in gdevxini.c */\ 52 gs_private_st_ptrs3(st_x11fontmap, x11fontmap, "x11fontmap",\ 53 x11fontmap_enum_ptrs, x11fontmap_reloc_ptrs, ps_name, x11_name, next) 54 55 /* Define the X Windows device */ 56 typedef struct gx_device_X_s { 57 gx_device_bbox_common; /* if target != 0, is image buffer */ 58 /* 59 * Normally, an X device has an image buffer iff target != 0. However, 60 * the bbox device sometimes sets target to NULL temporarily, so we need 61 * a separate flag to record whether this device is buffered. 62 */ 63 bool is_buffered; 64 bool IsPageDevice; 65 long MaxBitmap; 66 byte *buffer; /* full-window image */ 67 long buffer_size; 68 69 /* An XImage object for writing bitmap images to the screen */ 70 XImage image; 71 72 /* Global X state */ 73 Display *dpy; 74 Screen *scr; 75 XVisualInfo *vinfo; 76 Colormap cmap; 77 Window win; 78 GC gc; 79 80 /* An optional Window ID supplied as a device parameter */ 81 Window pwin; 82 83 /* A backing pixmap so X will handle exposure automatically */ 84 Pixmap bpixmap; /* 0 if useBackingPixmap is false, */ 85 /* or if it can't be allocated */ 86 int ghostview; /* flag to tell if ghostview is in control */ 87 Window mwin; /* window to receive ghostview messages */ 88 gs_matrix initial_matrix; /* the initial transformation */ 89 Atom NEXT, PAGE, DONE; /* Atoms used to talk to ghostview */ 90 struct { 91 gs_int_rect box; /* region needing updating */ 92 long area; /* total area of update */ 93 long total; /* total of individual area updates */ 94 int count; /* # of updates since flush */ 95 } update; 96 Pixmap dest; /* bpixmap if non-0, else use win */ 97 x_pixel colors_or; /* 'or' of all device colors used so far */ 98 x_pixel colors_and; /* 'and' ditto */ 99 100 /* An intermediate pixmap for the stencil case of copy_mono */ 101 struct { 102 Pixmap pixmap; 103 GC gc; 104 int raster, height; 105 } cp; 106 107 /* Structure for dealing with the halftone tile. */ 108 /* Later this might become a multi-element cache. */ 109 struct { 110 Pixmap pixmap; 111 Pixmap no_pixmap; /* kludge to get around X bug */ 112 gx_bitmap_id id; 113 int width, height, raster; 114 x_pixel fore_c, back_c; 115 } ht; 116 117 /* Cache the function and fill style from the GC */ 118 int function; 119 int fill_style; 120 Font fid; 121 122 #define X_SET_FILL_STYLE(xdev, style)\ 123 BEGIN\ 124 if (xdev->fill_style != (style))\ 125 XSetFillStyle(xdev->dpy, xdev->gc, (xdev->fill_style = (style)));\ 126 END 127 #define X_SET_FUNCTION(xdev, func)\ 128 BEGIN\ 129 if (xdev->function != (func))\ 130 XSetFunction(xdev->dpy, xdev->gc, (xdev->function = (func)));\ 131 END 132 #define X_SET_FONT(xdev, font)\ 133 BEGIN\ 134 if (xdev->fid != (font))\ 135 XSetFont(xdev->dpy, xdev->gc, (xdev->fid = (font)));\ 136 END 137 138 x_pixel back_color, fore_color; 139 140 Pixel background, foreground; 141 142 /* 143 * The color management structure is defined in gdevxcmp.h and is 144 * managed by the code in gdevxcmp.c. 145 */ 146 x11_cman_t cman; 147 148 #define NOTE_COLOR(xdev, pixel)\ 149 (xdev->colors_or |= (pixel),\ 150 xdev->colors_and &= (pixel)) 151 #define X_SET_BACK_COLOR(xdev, pixel)\ 152 BEGIN\ 153 if (xdev->back_color != (pixel)) {\ 154 xdev->back_color = (pixel);\ 155 NOTE_COLOR(xdev, pixel);\ 156 XSetBackground(xdev->dpy, xdev->gc, (pixel));\ 157 }\ 158 END 159 #define X_SET_FORE_COLOR(xdev, pixel)\ 160 BEGIN\ 161 if (xdev->fore_color != (pixel)) {\ 162 xdev->fore_color = (pixel);\ 163 NOTE_COLOR(xdev, pixel);\ 164 XSetForeground(xdev->dpy, xdev->gc, (pixel));\ 165 }\ 166 END 167 168 /* Defaults set by resources */ 169 Pixel borderColor; 170 Dimension borderWidth; 171 String geometry; 172 int maxGrayRamp, maxRGBRamp; 173 String palette; 174 String regularFonts; 175 String symbolFonts; 176 String dingbatFonts; 177 x11fontmap *regular_fonts; 178 x11fontmap *symbol_fonts; 179 x11fontmap *dingbat_fonts; 180 Boolean useXFonts, useFontExtensions, useScalableFonts, logXFonts; 181 float xResolution, yResolution; 182 183 /* Flags work around various X server problems. */ 184 Boolean useBackingPixmap; 185 Boolean useXPutImage; 186 Boolean useXSetTile; 187 188 /* 189 * Parameters for the screen update algorithms. 190 */ 191 192 /* 193 * Define whether to update after every write, for debugging. 194 * Note that one can obtain the same effect by setting any of 195 */ 196 bool AlwaysUpdate; 197 /* 198 * Define the maximum size of the temporary pixmap for copy_mono 199 * that we are willing to leave lying around in the server 200 * between uses. 201 */ 202 int MaxTempPixmap; 203 /* 204 * Define the maximum size of the temporary image created in memory 205 * for get_bits_rectangle. 206 */ 207 int MaxTempImage; 208 /* 209 * Define the maximum buffered updates before doing a screen write. 210 */ 211 int MaxBufferedTotal; /* sum of individual areas */ 212 int MaxBufferedArea; /* area of merged bounding box */ 213 int MaxBufferedCount; /* number of writes */ 214 215 /* 216 * Buffered text awaiting display. 217 */ 218 struct { 219 int item_count; 220 #define IN_TEXT(xdev) ((xdev)->text.item_count != 0) 221 int char_count; 222 gs_int_point origin; 223 int x; /* after last buffered char */ 224 #define MAX_TEXT_ITEMS 12 225 XTextItem items[MAX_TEXT_ITEMS]; 226 #define MAX_TEXT_CHARS 25 227 char chars[MAX_TEXT_CHARS]; 228 } text; 229 /* 230 * All the GC parameters are set correctly when we buffer the first 231 * character: we must call DRAW_TEXT before resetting any of them. 232 * DRAW_TEXT assumes xdev->text.{item,char}_count > 0. 233 */ 234 #define DRAW_TEXT(xdev)\ 235 XDrawText(xdev->dpy, xdev->dest, xdev->gc, xdev->text.origin.x,\ 236 xdev->text.origin.y, xdev->text.items, xdev->text.item_count) 237 238 } gx_device_X; 239 #define private_st_device_X() /* in gdevx.c */\ 240 gs_public_st_suffix_add4_final(st_device_X, gx_device_X,\ 241 "gx_device_X", device_x_enum_ptrs, device_x_reloc_ptrs,\ 242 gx_device_finalize, st_device_bbox, buffer, regular_fonts,\ 243 symbol_fonts, dingbat_fonts) 244 245 /* Send an event to the Ghostview process */ 246 void gdev_x_send_event(gx_device_X *xdev, Atom msg); 247 248 /* function to keep track of screen updates */ 249 void x_update_add(gx_device_X *, int, int, int, int); 250 void gdev_x_clear_window(gx_device_X *); 251 int x_catch_free_colors(Display *, XErrorEvent *); 252 253 /* Number used to distinguish when resolution was set from the command line */ 254 #define FAKE_RES (16*72) 255 256 /* ------ Inter-module procedures ------ */ 257 258 /* Exported by gdevxcmp.c for gdevxini.c */ 259 int gdev_x_setup_colors(gx_device_X *); 260 void gdev_x_free_colors(gx_device_X *); 261 void gdev_x_free_dynamic_colors(gx_device_X *); 262 263 /* Exported by gdevxini.c for gdevx.c */ 264 int gdev_x_open(gx_device_X *); 265 int gdev_x_close(gx_device_X *); 266 267 /* Driver procedures exported for gdevx.c */ 268 dev_proc_map_rgb_color(gdev_x_map_rgb_color); /* gdevxcmp.c */ 269 dev_proc_map_color_rgb(gdev_x_map_color_rgb); /* gdevxcmp.c */ 270 dev_proc_get_params(gdev_x_get_params); /* gdevxini.c */ 271 dev_proc_put_params(gdev_x_put_params); /* gdevxini.c */ 272 dev_proc_get_xfont_procs(gdev_x_get_xfont_procs); /* gdevxxf.c */ 273 dev_proc_finish_copydevice(gdev_x_finish_copydevice); /* gdevxini.c */ 274 275 #endif /* gdevx_INCLUDED */ 276