xref: /reactos/win32ss/gdi/gdi32/wine/gdi_private.h (revision ba3f0743)
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 typedef struct tagWINEDC
56 {
57     HDC          hdc;
58     struct gdi_physdev NullPhysDev;
59     PHYSDEV      physDev;          /* current top of the physdev stack */
60     LONG         refcount;         /* thread refcount */
61     INT          saveLevel;
62     HFONT hFont;
63     HBRUSH hBrush;
64     HPEN hPen;
65     HPALETTE hPalette;
66 } WINEDC, DC;
67 
68 WINEDC* get_physdev_dc( PHYSDEV dev );
69 
70 /* brush.c */
71 extern BOOL get_brush_bitmap_info( HBRUSH handle, BITMAPINFO *info, void **bits, UINT *usage ) DECLSPEC_HIDDEN;
72 
73 /* dc.c */
74 extern DC *alloc_dc_ptr( WORD magic ) DECLSPEC_HIDDEN;
75 extern void free_dc_ptr( DC *dc ) DECLSPEC_HIDDEN;
76 extern DC *get_dc_ptr( HDC hdc ) DECLSPEC_HIDDEN;
77 extern void release_dc_ptr( DC *dc ) DECLSPEC_HIDDEN;
78 
79 /* dib.c */
80 extern int bitmap_info_size( const BITMAPINFO * info, WORD coloruse ) DECLSPEC_HIDDEN;
81 
82 /* enhmetafile.c */
83 extern HENHMETAFILE EMF_Create_HENHMETAFILE(ENHMETAHEADER *emh, BOOL on_disk ) DECLSPEC_HIDDEN;
84 
85 /* gdiobj.c */
86 extern HGDIOBJ alloc_gdi_handle( void *obj, WORD type, const struct gdi_obj_funcs *funcs ) DECLSPEC_HIDDEN;
87 extern void *free_gdi_handle( HGDIOBJ handle ) DECLSPEC_HIDDEN;
88 extern HGDIOBJ get_full_gdi_handle( HGDIOBJ handle ) DECLSPEC_HIDDEN;
89 extern void *GDI_GetObjPtr( HGDIOBJ, WORD ) DECLSPEC_HIDDEN;
90 extern void GDI_ReleaseObj( HGDIOBJ ) DECLSPEC_HIDDEN;
91 extern void GDI_hdc_using_object(HGDIOBJ obj, HDC hdc) DECLSPEC_HIDDEN;
92 extern void GDI_hdc_not_using_object(HGDIOBJ obj, HDC hdc) DECLSPEC_HIDDEN;
93 
94 /* metafile.c */
95 extern HMETAFILE MF_Create_HMETAFILE(METAHEADER *mh) DECLSPEC_HIDDEN;
96 extern METAHEADER *MF_CreateMetaHeaderDisk(METAHEADER *mr, LPCVOID filename, BOOL unicode ) DECLSPEC_HIDDEN;
97 
98 /* Format of comment record added by GetWinMetaFileBits */
99 #include <pshpack2.h>
100 typedef struct
101 {
102     DWORD magic;   /* WMFC */
103     WORD unk04;    /* 1 */
104     WORD unk06;    /* 0 */
105     WORD unk08;    /* 0 */
106     WORD unk0a;    /* 1 */
107     WORD checksum;
108     DWORD unk0e;   /* 0 */
109     DWORD num_chunks;
110     DWORD chunk_size;
111     DWORD remaining_size;
112     DWORD emf_size;
113     BYTE emf_data[1];
114 } emf_in_wmf_comment;
115 #include <poppack.h>
116 
117 #define WMFC_MAGIC 0x43464d57
118 /* palette.c */
119 extern HPALETTE WINAPI GDISelectPalette( HDC hdc, HPALETTE hpal, WORD wBkg) DECLSPEC_HIDDEN;
120 extern UINT WINAPI GDIRealizePalette( HDC hdc ) DECLSPEC_HIDDEN;
121 
122 #define EMR_SETLINKEDUFI        119
123 
124 #define GET_DC_PHYSDEV(dc,func) \
125     get_physdev_entry_point( (dc)->physDev, FIELD_OFFSET(struct gdi_dc_funcs,func))
126 
127 static inline PHYSDEV pop_dc_driver( DC *dc, const struct gdi_dc_funcs *funcs )
128 {
129     PHYSDEV dev, *pdev = &dc->physDev;
130     while (*pdev && (*pdev)->funcs != funcs) pdev = &(*pdev)->next;
131     if (!*pdev) return NULL;
132     dev = *pdev;
133     *pdev = dev->next;
134     return dev;
135 }
136 
137 static inline PHYSDEV find_dc_driver( DC *dc, const struct gdi_dc_funcs *funcs )
138 {
139     PHYSDEV dev;
140 
141     for (dev = dc->physDev; dev; dev = dev->next) if (dev->funcs == funcs) return dev;
142     return NULL;
143 }
144 
145 /* Undocumented value for DIB's iUsage: Indicates a mono DIB w/o pal entries */
146 #define DIB_PAL_MONO 2
147 
148 BOOL WINAPI SetVirtualResolution(HDC hdc, DWORD horz_res, DWORD vert_res, DWORD horz_size, DWORD vert_size);
149 
150 static inline int get_dib_stride( int width, int bpp )
151 {
152     return ((width * bpp + 31) >> 3) & ~3;
153 }
154 
155 static inline int get_dib_image_size( const BITMAPINFO *info )
156 {
157     return get_dib_stride( info->bmiHeader.biWidth, info->bmiHeader.biBitCount )
158         * abs( info->bmiHeader.biHeight );
159 }
160 
161 /* only for use on sanitized BITMAPINFO structures */
162 static inline int get_dib_info_size( const BITMAPINFO *info, UINT coloruse )
163 {
164     if (info->bmiHeader.biCompression == BI_BITFIELDS)
165         return sizeof(BITMAPINFOHEADER) + 3 * sizeof(DWORD);
166     if (coloruse == DIB_PAL_COLORS)
167         return sizeof(BITMAPINFOHEADER) + info->bmiHeader.biClrUsed * sizeof(WORD);
168     return FIELD_OFFSET( BITMAPINFO, bmiColors[info->bmiHeader.biClrUsed] );
169 }
170 
171 #define GdiWorldSpaceToDeviceSpace  0x204
172 BOOL APIENTRY NtGdiGetTransform( _In_ HDC hdc, _In_ DWORD iXform, _Out_ LPXFORM pxf);
173 
174 /* Special sauce for reactos */
175 #define GDIRealizePalette RealizePalette
176 #define GDISelectPalette SelectPalette
177 
178 HGDIOBJ WINAPI GdiFixUpHandle(HGDIOBJ hGdiObj);
179 #define get_full_gdi_handle GdiFixUpHandle
180 
181 extern void push_dc_driver_ros(PHYSDEV *dev, PHYSDEV physdev, const struct gdi_dc_funcs *funcs);
182 #define push_dc_driver push_dc_driver_ros
183 #if 0
184 BOOL WINAPI SetWorldTransformForMetafile(HDC hdc, const XFORM *pxform);
185 #define SetWorldTransform SetWorldTransformForMetafile
186 #endif
187 #ifdef _M_ARM
188 #define DbgRaiseAssertionFailure() __emit(0xdefc)
189 #else
190 #define DbgRaiseAssertionFailure() __int2c()
191 #endif // _M_ARM
192 
193 #undef ASSERT
194 #define ASSERT(x) if (!(x)) DbgRaiseAssertionFailure()
195 
196 #endif /* __WINE_GDI_PRIVATE_H */
197 
198