Sync to trunk r40610
[reactos.git] / reactos / subsystems / win32 / win32k / include / surface.h
1 #ifndef _WIN32K_SURFACE_H
2 #define _WIN32K_SURFACE_H
3
4 #include "win32.h"
5 #include "gdiobj.h"
6
7 /* GDI surface object */
8 typedef struct _SURFACE
9 {
10 BASEOBJECT BaseObject;
11
12 SURFOBJ SurfObj;
13 FLONG flHooks;
14 FLONG flFlags;
15 struct _PALETTE *ppal;
16
17 union
18 {
19 HANDLE hSecureUMPD; // if UMPD_SURFACE set
20 HANDLE hMirrorParent;// if MIRROR_SURFACE set
21 HANDLE hDDSurface; // if DIRECTDRAW_SURFACE set
22 };
23
24 SIZEL dimension; /* For SetBitmapDimension(), do NOT use
25 to get width/height of bitmap, use
26 bitmap.bmWidth/bitmap.bmHeight for
27 that */
28
29 HDC hDC; // Doc in "Undocumented Windows", page 546, seems to be supported with XP.
30 ULONG cRef; // 0x064
31 HPALETTE hpalHint;
32
33 /* For device-independent bitmaps: */
34 HANDLE hDIBSection;
35 HANDLE hSecure;
36 DWORD dwOffset;
37
38 /* reactos specific */
39 PFAST_MUTEX BitsLock; /* You need to hold this lock before you touch
40 the actual bits in the bitmap */
41 HPALETTE hDIBPalette;
42 DWORD dsBitfields[3]; // hack, should probably use palette instead
43 DWORD biClrUsed;
44 DWORD biClrImportant;
45 } SURFACE, *PSURFACE;
46
47 #define BITMAPOBJ_IS_APIBITMAP 0x1
48
49 /* Internal interface */
50
51 #define SURFACE_AllocSurface() ((PSURFACE) GDIOBJ_AllocObj(GDIObjType_SURF_TYPE))
52 #define SURFACE_AllocSurfaceWithHandle() ((PSURFACE) GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_BITMAP))
53 #define SURFACE_FreeSurface(pBMObj) GDIOBJ_FreeObj((POBJ) pBMObj, GDIObjType_SURF_TYPE)
54 #define SURFACE_FreeSurfaceByHandle(hBMObj) GDIOBJ_FreeObjByHandle((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_BITMAP)
55
56 /* NOTE: Use shared locks! */
57 #define SURFACE_LockSurface(hBMObj) \
58 ((PSURFACE) GDIOBJ_LockObj ((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_BITMAP))
59 #define SURFACE_ShareLockSurface(hBMObj) \
60 ((PSURFACE) GDIOBJ_ShareLockObj ((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_BITMAP))
61 #define SURFACE_UnlockSurface(pBMObj) \
62 GDIOBJ_UnlockObjByPtr ((POBJ)pBMObj)
63 #define SURFACE_ShareUnlockSurface(pBMObj) \
64 GDIOBJ_ShareUnlockObjByPtr ((POBJ)pBMObj)
65
66 #define SURFACE_LockBitmapBits(pBMObj) ExEnterCriticalRegionAndAcquireFastMutexUnsafe((pBMObj)->BitsLock)
67 #define SURFACE_UnlockBitmapBits(pBMObj) ExReleaseFastMutexUnsafeAndLeaveCriticalRegion((pBMObj)->BitsLock)
68
69 BOOL INTERNAL_CALL SURFACE_Cleanup(PVOID ObjectBody);
70 BOOL INTERNAL_CALL SURFACE_InitBitsLock(SURFACE *pBMObj);
71 void INTERNAL_CALL SURFACE_CleanupBitsLock(SURFACE *pBMObj);
72
73 #define GDIDEV(SurfObj) ((PDEVOBJ *)((SurfObj)->hdev))
74 #define GDIDEVFUNCS(SurfObj) ((PDEVOBJ *)((SurfObj)->hdev))->DriverFunctions
75
76 INT FASTCALL BitsPerFormat (ULONG Format);
77 ULONG FASTCALL BitmapFormat (WORD Bits, DWORD Compression);
78
79 #endif /* _WIN32K_SURFACE_H */