/* * Definitions for Wine GDI drivers * * Copyright 2011 Alexandre Julliard * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef __WINE_WINE_GDI_DRIVER_H #define __WINE_WINE_GDI_DRIVER_H #include "wine/list.h" struct gdi_dc_funcs; struct opengl_funcs; typedef struct gdi_physdev { const struct gdi_dc_funcs *funcs; struct gdi_physdev *next; HDC hdc; } *PHYSDEV; struct bitblt_coords { int log_x; /* original position and size, in logical coords */ int log_y; int log_width; int log_height; int x; /* mapped position and size, in device coords */ int y; int width; int height; RECT visrect; /* rectangle clipped to the visible part, in device coords */ DWORD layout; /* DC layout */ }; struct gdi_image_bits { void *ptr; /* pointer to the bits */ BOOL is_copy; /* whether this is a copy of the bits that can be modified */ void (*free)(struct gdi_image_bits *); /* callback for freeing the bits */ void *param; /* extra parameter for callback private use */ }; struct brush_pattern { BITMAPINFO *info; /* DIB info */ struct gdi_image_bits bits; /* DIB bits */ UINT usage; /* color usage for DIB info */ }; struct gdi_dc_funcs { INT (*pAbortDoc)(PHYSDEV); BOOL (*pAbortPath)(PHYSDEV); BOOL (*pAlphaBlend)(PHYSDEV,struct bitblt_coords*,PHYSDEV,struct bitblt_coords*,BLENDFUNCTION); BOOL (*pAngleArc)(PHYSDEV,INT,INT,DWORD,FLOAT,FLOAT); BOOL (*pArc)(PHYSDEV,INT,INT,INT,INT,INT,INT,INT,INT); BOOL (*pArcTo)(PHYSDEV,INT,INT,INT,INT,INT,INT,INT,INT); BOOL (*pBeginPath)(PHYSDEV); DWORD (*pBlendImage)(PHYSDEV,BITMAPINFO*,const struct gdi_image_bits*,struct bitblt_coords*,struct bitblt_coords*,BLENDFUNCTION); BOOL (*pChord)(PHYSDEV,INT,INT,INT,INT,INT,INT,INT,INT); BOOL (*pCloseFigure)(PHYSDEV); BOOL (*pCreateCompatibleDC)(PHYSDEV,PHYSDEV*); BOOL (*pCreateDC)(PHYSDEV*,LPCWSTR,LPCWSTR,LPCWSTR,const DEVMODEW*); BOOL (*pDeleteDC)(PHYSDEV); BOOL (*pDeleteObject)(PHYSDEV,HGDIOBJ); DWORD (*pDeviceCapabilities)(LPSTR,LPCSTR,LPCSTR,WORD,LPSTR,LPDEVMODEA); BOOL (*pEllipse)(PHYSDEV,INT,INT,INT,INT); INT (*pEndDoc)(PHYSDEV); INT (*pEndPage)(PHYSDEV); BOOL (*pEndPath)(PHYSDEV); BOOL (*pEnumFonts)(PHYSDEV,LPLOGFONTW,FONTENUMPROCW,LPARAM); INT (*pEnumICMProfiles)(PHYSDEV,ICMENUMPROCW,LPARAM); INT (*pExcludeClipRect)(PHYSDEV,INT,INT,INT,INT); INT (*pExtDeviceMode)(LPSTR,HWND,LPDEVMODEA,LPSTR,LPSTR,LPDEVMODEA,LPSTR,DWORD); INT (*pExtEscape)(PHYSDEV,INT,INT,LPCVOID,INT,LPVOID); BOOL (*pExtFloodFill)(PHYSDEV,INT,INT,COLORREF,UINT); INT (*pExtSelectClipRgn)(PHYSDEV,HRGN,INT); BOOL (*pExtTextOut)(PHYSDEV,INT,INT,UINT,const RECT*,LPCWSTR,UINT,const INT*); BOOL (*pFillPath)(PHYSDEV); BOOL (*pFillRgn)(PHYSDEV,HRGN,HBRUSH); BOOL (*pFlattenPath)(PHYSDEV); BOOL (*pFontIsLinked)(PHYSDEV); BOOL (*pFrameRgn)(PHYSDEV,HRGN,HBRUSH,INT,INT); BOOL (*pGdiComment)(PHYSDEV,UINT,const BYTE*); BOOL (*pGdiRealizationInfo)(PHYSDEV,void*); UINT (*pGetBoundsRect)(PHYSDEV,RECT*,UINT); BOOL (*pGetCharABCWidths)(PHYSDEV,UINT,UINT,LPABC); BOOL (*pGetCharABCWidthsI)(PHYSDEV,UINT,UINT,WORD*,LPABC); BOOL (*pGetCharWidth)(PHYSDEV,UINT,UINT,LPINT); INT (*pGetDeviceCaps)(PHYSDEV,INT); BOOL (*pGetDeviceGammaRamp)(PHYSDEV,LPVOID); DWORD (*pGetFontData)(PHYSDEV,DWORD,DWORD,LPVOID,DWORD); DWORD (*pGetFontUnicodeRanges)(PHYSDEV,LPGLYPHSET); DWORD (*pGetGlyphIndices)(PHYSDEV,LPCWSTR,INT,LPWORD,DWORD); DWORD (*pGetGlyphOutline)(PHYSDEV,UINT,UINT,LPGLYPHMETRICS,DWORD,LPVOID,const MAT2*); BOOL (*pGetICMProfile)(PHYSDEV,LPDWORD,LPWSTR); DWORD (*pGetImage)(PHYSDEV,BITMAPINFO*,struct gdi_image_bits*,struct bitblt_coords*); DWORD (*pGetKerningPairs)(PHYSDEV,DWORD,LPKERNINGPAIR); COLORREF (*pGetNearestColor)(PHYSDEV,COLORREF); UINT (*pGetOutlineTextMetrics)(PHYSDEV,UINT,LPOUTLINETEXTMETRICW); COLORREF (*pGetPixel)(PHYSDEV,INT,INT); UINT (*pGetSystemPaletteEntries)(PHYSDEV,UINT,UINT,LPPALETTEENTRY); UINT (*pGetTextCharsetInfo)(PHYSDEV,LPFONTSIGNATURE,DWORD); BOOL (*pGetTextExtentExPoint)(PHYSDEV,LPCWSTR,INT,LPINT); BOOL (*pGetTextExtentExPointI)(PHYSDEV,const WORD*,INT,LPINT); INT (*pGetTextFace)(PHYSDEV,INT,LPWSTR); BOOL (*pGetTextMetrics)(PHYSDEV,TEXTMETRICW*); BOOL (*pGradientFill)(PHYSDEV,TRIVERTEX*,ULONG,void*,ULONG,ULONG); INT (*pIntersectClipRect)(PHYSDEV,INT,INT,INT,INT); BOOL (*pInvertRgn)(PHYSDEV,HRGN); BOOL (*pLineTo)(PHYSDEV,INT,INT); BOOL (*pModifyWorldTransform)(PHYSDEV,const XFORM*,DWORD); BOOL (*pMoveTo)(PHYSDEV,INT,INT); INT (*pOffsetClipRgn)(PHYSDEV,INT,INT); BOOL (*pOffsetViewportOrgEx)(PHYSDEV,INT,INT,POINT*); BOOL (*pOffsetWindowOrgEx)(PHYSDEV,INT,INT,POINT*); BOOL (*pPaintRgn)(PHYSDEV,HRGN); BOOL (*pPatBlt)(PHYSDEV,struct bitblt_coords*,DWORD); BOOL (*pPie)(PHYSDEV,INT,INT,INT,INT,INT,INT,INT,INT); BOOL (*pPolyBezier)(PHYSDEV,const POINT*,DWORD); BOOL (*pPolyBezierTo)(PHYSDEV,const POINT*,DWORD); BOOL (*pPolyDraw)(PHYSDEV,const POINT*,const BYTE *,DWORD); BOOL (*pPolyPolygon)(PHYSDEV,const POINT*,const INT*,UINT); BOOL (*pPolyPolyline)(PHYSDEV,const POINT*,const DWORD*,DWORD); BOOL (*pPolygon)(PHYSDEV,const POINT*,INT); BOOL (*pPolyline)(PHYSDEV,const POINT*,INT); BOOL (*pPolylineTo)(PHYSDEV,const POINT*,INT); DWORD (*pPutImage)(PHYSDEV,HRGN,BITMAPINFO*,const struct gdi_image_bits*,struct bitblt_coords*,struct bitblt_coords*,DWORD); UINT (*pRealizeDefaultPalette)(PHYSDEV); UINT (*pRealizePalette)(PHYSDEV,HPALETTE,BOOL); BOOL (*pRectangle)(PHYSDEV,INT,INT,INT,INT); HDC (*pResetDC)(PHYSDEV,const DEVMODEW*); BOOL (*pRestoreDC)(PHYSDEV,INT); BOOL (*pRoundRect)(PHYSDEV,INT,INT,INT,INT,INT,INT); INT (*pSaveDC)(PHYSDEV); BOOL (*pScaleViewportExtEx)(PHYSDEV,INT,INT,INT,INT,SIZE*); BOOL (*pScaleWindowExtEx)(PHYSDEV,INT,INT,INT,INT,SIZE*); HBITMAP (*pSelectBitmap)(PHYSDEV,HBITMAP); HBRUSH (*pSelectBrush)(PHYSDEV,HBRUSH,const struct brush_pattern*); BOOL (*pSelectClipPath)(PHYSDEV,INT); HFONT (*pSelectFont)(PHYSDEV,HFONT,UINT*); HPALETTE (*pSelectPalette)(PHYSDEV,HPALETTE,BOOL); HPEN (*pSelectPen)(PHYSDEV,HPEN,const struct brush_pattern*); INT (*pSetArcDirection)(PHYSDEV,INT); COLORREF (*pSetBkColor)(PHYSDEV,COLORREF); INT (*pSetBkMode)(PHYSDEV,INT); UINT (*pSetBoundsRect)(PHYSDEV,RECT*,UINT); COLORREF (*pSetDCBrushColor)(PHYSDEV, COLORREF); COLORREF (*pSetDCPenColor)(PHYSDEV, COLORREF); INT (*pSetDIBitsToDevice)(PHYSDEV,INT,INT,DWORD,DWORD,INT,INT,UINT,UINT,LPCVOID,BITMAPINFO*,UINT); VOID (*pSetDeviceClipping)(PHYSDEV,HRGN); BOOL (*pSetDeviceGammaRamp)(PHYSDEV,LPVOID); DWORD (*pSetLayout)(PHYSDEV,DWORD); INT (*pSetMapMode)(PHYSDEV,INT); DWORD (*pSetMapperFlags)(PHYSDEV,DWORD); COLORREF (*pSetPixel)(PHYSDEV,INT,INT,COLORREF); INT (*pSetPolyFillMode)(PHYSDEV,INT); INT (*pSetROP2)(PHYSDEV,INT); INT (*pSetRelAbs)(PHYSDEV,INT); INT (*pSetStretchBltMode)(PHYSDEV,INT); UINT (*pSetTextAlign)(PHYSDEV,UINT); INT (*pSetTextCharacterExtra)(PHYSDEV,INT); COLORREF (*pSetTextColor)(PHYSDEV,COLORREF); BOOL (*pSetTextJustification)(PHYSDEV,INT,INT); BOOL (*pSetViewportExtEx)(PHYSDEV,INT,INT,SIZE*); BOOL (*pSetViewportOrgEx)(PHYSDEV,INT,INT,POINT*); BOOL (*pSetWindowExtEx)(PHYSDEV,INT,INT,SIZE*); BOOL (*pSetWindowOrgEx)(PHYSDEV,INT,INT,POINT*); BOOL (*pSetWorldTransform)(PHYSDEV,const XFORM*); INT (*pStartDoc)(PHYSDEV,const DOCINFOW*); INT (*pStartPage)(PHYSDEV); BOOL (*pStretchBlt)(PHYSDEV,struct bitblt_coords*,PHYSDEV,struct bitblt_coords*,DWORD); INT (*pStretchDIBits)(PHYSDEV,INT,INT,INT,INT,INT,INT,INT,INT,const void*,BITMAPINFO*,UINT,DWORD); BOOL (*pStrokeAndFillPath)(PHYSDEV); BOOL (*pStrokePath)(PHYSDEV); BOOL (*pUnrealizePalette)(HPALETTE); BOOL (*pWidenPath)(PHYSDEV); struct opengl_funcs * (*wine_get_wgl_driver)(PHYSDEV,UINT); /* priority order for the driver on the stack */ UINT priority; }; /* increment this when you change the DC function table */ #define WINE_GDI_DRIVER_VERSION 46 #define GDI_PRIORITY_NULL_DRV 0 /* null driver */ #define GDI_PRIORITY_FONT_DRV 100 /* any font driver */ #define GDI_PRIORITY_GRAPHICS_DRV 200 /* any graphics driver */ #define GDI_PRIORITY_DIB_DRV 300 /* the DIB driver */ #define GDI_PRIORITY_PATH_DRV 400 /* the path driver */ static inline PHYSDEV get_physdev_entry_point( PHYSDEV dev, size_t offset ) { while (!((void **)dev->funcs)[offset / sizeof(void *)]) dev = dev->next; return dev; } #define GET_NEXT_PHYSDEV(dev,func) \ get_physdev_entry_point( (dev)->next, FIELD_OFFSET(struct gdi_dc_funcs,func)) static inline void push_dc_driver( PHYSDEV *dev, PHYSDEV physdev, const struct gdi_dc_funcs *funcs ) { while ((*dev)->funcs->priority > funcs->priority) dev = &(*dev)->next; physdev->funcs = funcs; physdev->next = *dev; physdev->hdc = (*dev)->hdc; *dev = physdev; } /* support for window surfaces */ struct window_surface; struct window_surface_funcs { void (*lock)( struct window_surface *surface ); void (*unlock)( struct window_surface *surface ); void* (*get_info)( struct window_surface *surface, BITMAPINFO *info ); RECT* (*get_bounds)( struct window_surface *surface ); void (*set_region)( struct window_surface *surface, HRGN region ); void (*flush)( struct window_surface *surface ); void (*destroy)( struct window_surface *surface ); }; struct window_surface { const struct window_surface_funcs *funcs; /* driver-specific implementations */ struct list entry; /* entry in global list managed by user32 */ LONG ref; /* reference count */ RECT rect; /* constant, no locking needed */ /* driver-specific fields here */ }; static inline ULONG window_surface_add_ref( struct window_surface *surface ) { return InterlockedIncrement( &surface->ref ); } static inline ULONG window_surface_release( struct window_surface *surface ) { ULONG ret = InterlockedDecrement( &surface->ref ); if (!ret) surface->funcs->destroy( surface ); return ret; } /* the DC hook support is only exported on Win16, the 32-bit version is a Wine extension */ #define DCHC_INVALIDVISRGN 0x0001 #define DCHC_DELETEDC 0x0002 #define DCHF_INVALIDATEVISRGN 0x0001 #define DCHF_VALIDATEVISRGN 0x0002 #define DCHF_RESETDC 0x0004 /* Wine extension */ typedef BOOL (CALLBACK *DCHOOKPROC)(HDC,WORD,DWORD_PTR,LPARAM); WINGDIAPI DWORD_PTR WINAPI GetDCHook(HDC,DCHOOKPROC*); WINGDIAPI BOOL WINAPI SetDCHook(HDC,DCHOOKPROC,DWORD_PTR); WINGDIAPI WORD WINAPI SetHookFlags(HDC,WORD); extern void CDECL __wine_make_gdi_object_system( HGDIOBJ handle, BOOL set ); extern void CDECL __wine_set_visible_region( HDC hdc, HRGN hrgn, const RECT *vis_rect, const RECT *device_rect, struct window_surface *surface ); extern HMODULE CDECL __wine_get_driver_module( HDC hdc ); extern struct opengl_funcs * CDECL __wine_get_wgl_driver( HDC hdc, UINT version ); #endif /* __WINE_WINE_GDI_DRIVER_H */