1 /* 2 * GDI definitions 3 * 4 * Copyright 1993 Alexandre Julliard 5 * 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2.1 of the License, or (at your option) any later version. 10 * 11 * This library is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with this library; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 19 */ 20 21 #ifndef __WINE_GDI_PRIVATE_H 22 #define __WINE_GDI_PRIVATE_H 23 24 #include <limits.h> 25 #include <math.h> 26 #include "windef.h" 27 #include "winbase.h" 28 #include "wingdi.h" 29 #include <wine/gdi_driver.h> 30 31 /* Metafile defines */ 32 #define META_EOF 0x0000 33 /* values of mtType in METAHEADER. Note however that the disk image of a disk 34 based metafile has mtType == 1 */ 35 #define METAFILE_MEMORY 1 36 #define METAFILE_DISK 2 37 #define MFHEADERSIZE (sizeof(METAHEADER)) 38 #define MFVERSION 0x300 39 40 typedef struct { 41 EMR emr; 42 INT nBreakExtra; 43 INT nBreakCount; 44 } EMRSETTEXTJUSTIFICATION, *PEMRSETTEXTJUSTIFICATION; 45 46 struct gdi_obj_funcs 47 { 48 HGDIOBJ (*pSelectObject)( HGDIOBJ handle, HDC hdc ); 49 INT (*pGetObjectA)( HGDIOBJ handle, INT count, LPVOID buffer ); 50 INT (*pGetObjectW)( HGDIOBJ handle, INT count, LPVOID buffer ); 51 BOOL (*pUnrealizeObject)( HGDIOBJ handle ); 52 BOOL (*pDeleteObject)( HGDIOBJ handle ); 53 }; 54 55 /* DC_ATTR LCD Types */ 56 #define LDC_LDC 0x00000001 57 #define LDC_EMFLDC 0x00000002 58 59 typedef struct tagWINEDC 60 { 61 HDC hdc; 62 ULONG Flags; 63 INT iType; 64 union { 65 PVOID pvEmfDC; /* Pointer to ENHMETAFILE structure */ 66 PHYSDEV physDev; /* current top of the physdev stack */ 67 }; 68 LPWSTR pwszPort; 69 ABORTPROC pAbortProc; 70 DWORD CallBackTick; 71 HANDLE hPrinter; 72 PDEVMODEW pdm; 73 PVOID pUMPDev; 74 PVOID pUMdhpdev; 75 ULONG DevCaps[36]; 76 HBRUSH hBrush; 77 HPEN hPen; 78 //// 79 struct gdi_physdev NullPhysDev; 80 LONG refcount; /* thread refcount */ 81 INT saveLevel; 82 HFONT hFont; 83 HPALETTE hPalette; 84 } WINEDC, DC; 85 86 WINEDC* get_physdev_dc( PHYSDEV dev ); 87 88 /* brush.c */ 89 extern BOOL get_brush_bitmap_info( HBRUSH handle, BITMAPINFO *info, void **bits, UINT *usage ) DECLSPEC_HIDDEN; 90 91 /* dc.c */ 92 extern DC *alloc_dc_ptr( WORD magic ) DECLSPEC_HIDDEN; 93 extern void free_dc_ptr( DC *dc ) DECLSPEC_HIDDEN; 94 extern DC *get_dc_ptr( HDC hdc ) DECLSPEC_HIDDEN; 95 extern void release_dc_ptr( DC *dc ) DECLSPEC_HIDDEN; 96 97 /* dib.c */ 98 extern int bitmap_info_size( const BITMAPINFO * info, WORD coloruse ) DECLSPEC_HIDDEN; 99 100 /* enhmetafile.c */ 101 extern HENHMETAFILE EMF_Create_HENHMETAFILE(ENHMETAHEADER *emh, BOOL on_disk ) DECLSPEC_HIDDEN; 102 103 /* gdiobj.c */ 104 extern HGDIOBJ alloc_gdi_handle( void *obj, WORD type, const struct gdi_obj_funcs *funcs ) DECLSPEC_HIDDEN; 105 extern void *free_gdi_handle( HGDIOBJ handle ) DECLSPEC_HIDDEN; 106 extern HGDIOBJ get_full_gdi_handle( HGDIOBJ handle ) DECLSPEC_HIDDEN; 107 extern void *GDI_GetObjPtr( HGDIOBJ, WORD ) DECLSPEC_HIDDEN; 108 extern void GDI_ReleaseObj( HGDIOBJ ) DECLSPEC_HIDDEN; 109 extern void GDI_hdc_using_object(HGDIOBJ obj, HDC hdc) DECLSPEC_HIDDEN; 110 extern void GDI_hdc_not_using_object(HGDIOBJ obj, HDC hdc) DECLSPEC_HIDDEN; 111 112 /* metafile.c */ 113 extern HMETAFILE MF_Create_HMETAFILE(METAHEADER *mh) DECLSPEC_HIDDEN; 114 extern METAHEADER *MF_CreateMetaHeaderDisk(METAHEADER *mr, LPCVOID filename, BOOL unicode ) DECLSPEC_HIDDEN; 115 116 /* Format of comment record added by GetWinMetaFileBits */ 117 #include <pshpack2.h> 118 typedef struct 119 { 120 DWORD magic; /* WMFC */ 121 WORD unk04; /* 1 */ 122 WORD unk06; /* 0 */ 123 WORD unk08; /* 0 */ 124 WORD unk0a; /* 1 */ 125 WORD checksum; 126 DWORD unk0e; /* 0 */ 127 DWORD num_chunks; 128 DWORD chunk_size; 129 DWORD remaining_size; 130 DWORD emf_size; 131 BYTE emf_data[1]; 132 } emf_in_wmf_comment; 133 #include <poppack.h> 134 135 #define WMFC_MAGIC 0x43464d57 136 /* palette.c */ 137 extern HPALETTE WINAPI GDISelectPalette( HDC hdc, HPALETTE hpal, WORD wBkg) DECLSPEC_HIDDEN; 138 extern UINT WINAPI GDIRealizePalette( HDC hdc ) DECLSPEC_HIDDEN; 139 140 #define EMR_SETLINKEDUFI 119 141 142 #define GET_DC_PHYSDEV(dc,func) \ 143 get_physdev_entry_point( (dc)->physDev, FIELD_OFFSET(struct gdi_dc_funcs,func)) 144 145 static inline PHYSDEV pop_dc_driver( DC *dc, const struct gdi_dc_funcs *funcs ) 146 { 147 PHYSDEV dev, *pdev = &dc->physDev; 148 while (*pdev && (*pdev)->funcs != funcs) pdev = &(*pdev)->next; 149 if (!*pdev) return NULL; 150 dev = *pdev; 151 *pdev = dev->next; 152 return dev; 153 } 154 155 static inline PHYSDEV find_dc_driver( DC *dc, const struct gdi_dc_funcs *funcs ) 156 { 157 PHYSDEV dev; 158 159 for (dev = dc->physDev; dev; dev = dev->next) if (dev->funcs == funcs) return dev; 160 return NULL; 161 } 162 163 /* Undocumented value for DIB's iUsage: Indicates a mono DIB w/o pal entries */ 164 #define DIB_PAL_MONO 2 165 166 BOOL WINAPI SetVirtualResolution(HDC hdc, DWORD horz_res, DWORD vert_res, DWORD horz_size, DWORD vert_size); 167 168 static inline int get_dib_stride( int width, int bpp ) 169 { 170 return ((width * bpp + 31) >> 3) & ~3; 171 } 172 173 static inline int get_dib_image_size( const BITMAPINFO *info ) 174 { 175 return get_dib_stride( info->bmiHeader.biWidth, info->bmiHeader.biBitCount ) 176 * abs( info->bmiHeader.biHeight ); 177 } 178 179 /* only for use on sanitized BITMAPINFO structures */ 180 static inline int get_dib_info_size( const BITMAPINFO *info, UINT coloruse ) 181 { 182 if (info->bmiHeader.biCompression == BI_BITFIELDS) 183 return sizeof(BITMAPINFOHEADER) + 3 * sizeof(DWORD); 184 if (coloruse == DIB_PAL_COLORS) 185 return sizeof(BITMAPINFOHEADER) + info->bmiHeader.biClrUsed * sizeof(WORD); 186 return FIELD_OFFSET( BITMAPINFO, bmiColors[info->bmiHeader.biClrUsed] ); 187 } 188 189 #define GdiWorldSpaceToDeviceSpace 0x204 190 BOOL APIENTRY NtGdiGetTransform( _In_ HDC hdc, _In_ DWORD iXform, _Out_ LPXFORM pxf); 191 192 /* Special sauce for reactos */ 193 #define GDIRealizePalette RealizePalette 194 #define GDISelectPalette SelectPalette 195 196 HGDIOBJ WINAPI GdiFixUpHandle(HGDIOBJ hGdiObj); 197 #define get_full_gdi_handle GdiFixUpHandle 198 199 extern void push_dc_driver_ros(PHYSDEV *dev, PHYSDEV physdev, const struct gdi_dc_funcs *funcs); 200 #define push_dc_driver push_dc_driver_ros 201 #if 0 202 BOOL WINAPI SetWorldTransformForMetafile(HDC hdc, const XFORM *pxform); 203 #define SetWorldTransform SetWorldTransformForMetafile 204 #endif 205 #ifdef _M_ARM 206 #define DbgRaiseAssertionFailure() __emit(0xdefc) 207 #else 208 #define DbgRaiseAssertionFailure() __int2c() 209 #endif // _M_ARM 210 211 #undef ASSERT 212 #define ASSERT(x) if (!(x)) DbgRaiseAssertionFailure() 213 214 #endif /* __WINE_GDI_PRIVATE_H */ 215 216