2 * X11 graphics driver initialisation functions
4 * Copyright 1996 Alexandre Julliard
15 #include "debugtools.h"
20 DEFAULT_DEBUG_CHANNEL(x11drv);
22 const DC_FUNCTIONS *X11DRV_DC_Funcs = NULL; /* hack */
24 BITMAP_DRIVER X11DRV_BITMAP_Driver =
28 X11DRV_DIB_DeleteDIBSection,
29 X11DRV_DIB_SetDIBColorTable,
30 X11DRV_DIB_GetDIBColorTable,
35 PALETTE_DRIVER X11DRV_PALETTE_Driver =
37 X11DRV_PALETTE_SetMapping,
38 X11DRV_PALETTE_UpdateMapping,
43 Display *gdi_display; /* display to use for all GDI functions */
46 /* a few dynamic device caps */
47 static int log_pixels_x; /* pixels per logical inch in x direction */
48 static int log_pixels_y; /* pixels per logical inch in y direction */
49 static int horz_size; /* horz. size of screen in millimeters */
50 static int vert_size; /* vert. size of screen in millimeters */
51 static int palette_size;
54 /**********************************************************************
55 * X11DRV_GDI_Initialize
57 BOOL X11DRV_GDI_Initialize( Display *display )
59 Screen *screen = DefaultScreenOfDisplay(display);
61 gdi_display = display;
62 BITMAP_Driver = &X11DRV_BITMAP_Driver;
63 PALETTE_Driver = &X11DRV_PALETTE_Driver;
65 palette_size = X11DRV_PALETTE_Init();
67 if (!X11DRV_BITMAP_Init()) return FALSE;
69 /* Initialize fonts and text caps */
71 log_pixels_x = MulDiv( WidthOfScreen(screen), 254, WidthMMOfScreen(screen) * 10 );
72 log_pixels_y = MulDiv( HeightOfScreen(screen), 254, HeightMMOfScreen(screen) * 10 );
73 text_caps = X11DRV_FONT_Init( &log_pixels_x, &log_pixels_y );
74 horz_size = MulDiv( screen_width, 254, log_pixels_x * 10 );
75 vert_size = MulDiv( screen_height, 254, log_pixels_y * 10 );
79 /**********************************************************************
82 void X11DRV_GDI_Finalize(void)
84 X11DRV_PALETTE_Cleanup();
85 XCloseDisplay( gdi_display );
89 /**********************************************************************
92 BOOL X11DRV_CreateDC( DC *dc, LPCSTR driver, LPCSTR device,
93 LPCSTR output, const DEVMODEA* initData )
95 X11DRV_PDEVICE *physDev;
97 if (!X11DRV_DC_Funcs) X11DRV_DC_Funcs = dc->funcs; /* hack */
99 dc->physDev = physDev = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
102 ERR("Can't allocate physDev\n");
106 if (dc->flags & DC_MEMORY)
108 BITMAPOBJ *bmp = (BITMAPOBJ *) GDI_GetObjPtr( dc->hBitmap, BITMAP_MAGIC );
111 HeapFree( GetProcessHeap(), 0, physDev );
114 if (!bmp->physBitmap) X11DRV_CreateBitmap( dc->hBitmap );
115 physDev->drawable = (Pixmap)bmp->physBitmap;
116 physDev->gc = TSXCreateGC( gdi_display, physDev->drawable, 0, NULL );
117 dc->bitsPerPixel = bmp->bitmap.bmBitsPixel;
118 dc->totalExtent.left = 0;
119 dc->totalExtent.top = 0;
120 dc->totalExtent.right = bmp->bitmap.bmWidth;
121 dc->totalExtent.bottom = bmp->bitmap.bmHeight;
122 GDI_ReleaseObj( dc->hBitmap );
126 physDev->drawable = root_window;
127 physDev->gc = TSXCreateGC( gdi_display, physDev->drawable, 0, NULL );
128 dc->bitsPerPixel = screen_depth;
129 dc->totalExtent.left = 0;
130 dc->totalExtent.top = 0;
131 dc->totalExtent.right = screen_width;
132 dc->totalExtent.bottom = screen_height;
135 physDev->current_pf = 0;
136 physDev->used_visuals = 0;
138 if (!(dc->hVisRgn = CreateRectRgnIndirect( &dc->totalExtent )))
140 TSXFreeGC( gdi_display, physDev->gc );
141 HeapFree( GetProcessHeap(), 0, physDev );
146 XSetGraphicsExposures( gdi_display, physDev->gc, False );
147 XSetSubwindowMode( gdi_display, physDev->gc, IncludeInferiors );
148 XFlush( gdi_display );
154 /**********************************************************************
157 BOOL X11DRV_DeleteDC( DC *dc )
159 X11DRV_PDEVICE *physDev = (X11DRV_PDEVICE *)dc->physDev;
161 XFreeGC( gdi_display, physDev->gc );
162 while (physDev->used_visuals-- > 0)
163 XFree(physDev->visuals[physDev->used_visuals]);
165 HeapFree( GetProcessHeap(), 0, physDev );
171 /***********************************************************************
172 * GetDeviceCaps (X11DRV.@)
174 INT X11DRV_GetDeviceCaps( DC *dc, INT cap )
181 return DT_RASDISPLAY;
189 return screen_height;
203 /* MSDN: Number of entries in the device's color table, if the device has
204 * a color depth of no more than 8 bits per pixel.For devices with greater
205 * color depths, -1 is returned. */
206 return (screen_depth > 8) ? -1 : (1 << screen_depth);
208 return sizeof(X11DRV_PDEVICE);
210 return (CC_CIRCLES | CC_PIE | CC_CHORD | CC_ELLIPSES | CC_WIDE |
211 CC_STYLED | CC_WIDESTYLED | CC_INTERIORS | CC_ROUNDRECT);
213 return (LC_POLYLINE | LC_MARKER | LC_POLYMARKER | LC_WIDE |
214 LC_STYLED | LC_WIDESTYLED | LC_INTERIORS);
216 return (PC_POLYGON | PC_RECTANGLE | PC_WINDPOLYGON | PC_SCANLINE |
217 PC_WIDE | PC_STYLED | PC_WIDESTYLED | PC_INTERIORS);
223 return (RC_BITBLT | RC_BANDING | RC_SCALING | RC_BITMAP64 | RC_DI_BITMAP |
224 RC_DIBTODEV | RC_BIGFONT | RC_STRETCHBLT | RC_STRETCHDIB | RC_DEVBITS |
225 (palette_size ? RC_PALETTE : 0));
236 FIXME("(%04x): CAPS1 is unimplemented, will return 0\n", dc->hSelf );
237 /* please see wingdi.h for the possible bit-flag values that need
238 to be returned. also, see
239 http://msdn.microsoft.com/library/ddkdoc/win95ddk/graphcnt_1m0p.htm */
247 case PHYSICALOFFSETX:
248 case PHYSICALOFFSETY:
257 FIXME("(%04x): unsupported capability %d, will return 0\n", dc->hSelf, cap );
263 /**********************************************************************
264 * ExtEscape (X11DRV.@)
266 INT X11DRV_ExtEscape( DC *dc, INT escape, INT in_count, LPCVOID in_data,
267 INT out_count, LPVOID out_data )
271 case QUERYESCSUPPORT:
274 switch (*(INT *)in_data)
277 return DD_HAL_VERSION;
285 const DCICMD *lpCmd = in_data;
286 if (lpCmd->dwVersion != DD_VERSION) break;
287 return X11DRV_DCICommand(in_count, lpCmd, out_data);