#include "win32.h"
#include "gdiobj.h"
+#define PDEV_SURFACE 0x80000000
+
/* GDI surface object */
typedef struct _SURFACE
{
- BASEOBJECT BaseObject;
+ BASEOBJECT BaseObject;
- SURFOBJ SurfObj;
- FLONG flHooks;
- FLONG flFlags;
- struct _PALETTE *ppal;
+ SURFOBJ SurfObj;
+ //XDCOBJ * pdcoAA;
+ FLONG flags;
+ struct _PALETTE *ppal;
+ //UINT unk_050;
- union
- {
- HANDLE hSecureUMPD; // if UMPD_SURFACE set
- HANDLE hMirrorParent;// if MIRROR_SURFACE set
- HANDLE hDDSurface; // if DIRECTDRAW_SURFACE set
- };
+ union
+ {
+ HANDLE hSecureUMPD; // if UMPD_SURFACE set
+ HANDLE hMirrorParent;// if MIRROR_SURFACE set
+ HANDLE hDDSurface; // if DIRECTDRAW_SURFACE set
+ };
- SIZEL dimension; /* For SetBitmapDimension(), do NOT use
+ SIZEL sizlDim; /* For SetBitmapDimension(), do NOT use
to get width/height of bitmap, use
bitmap.bmWidth/bitmap.bmHeight for
that */
-
- HDC hDC; // Doc in "Undocumented Windows", page 546, seems to be supported with XP.
- ULONG cRef; // 0x064
- HPALETTE hpalHint;
- /* For device-independent bitmaps: */
- HANDLE hDIBSection;
- HANDLE hSecure;
- DWORD dwOffset;
+ HDC hdc; // Doc in "Undocumented Windows", page 546, seems to be supported with XP.
+ ULONG cRef;
+ HPALETTE hpalHint;
+
+ /* For device-independent bitmaps: */
+ HANDLE hDIBSection;
+ HANDLE hSecure;
+ DWORD dwOffset;
+ //UINT unk_078;
/* reactos specific */
- PFAST_MUTEX BitsLock; /* You need to hold this lock before you touch
- the actual bits in the bitmap */
- HPALETTE hDIBPalette;
- DWORD dsBitfields[3]; // hack, should probably use palette instead
- DWORD biClrUsed;
- DWORD biClrImportant;
+ DWORD biClrImportant;
} SURFACE, *PSURFACE;
-#define BITMAPOBJ_IS_APIBITMAP 0x1
+// flags field:
+//#define HOOK_BITBLT 0x00000001
+//#define HOOK_STRETCHBLT 0x00000002
+//#define HOOK_PLGBLT 0x00000004
+//#define HOOK_TEXTOUT 0x00000008
+//#define HOOK_PAINT 0x00000010
+//#define HOOK_STROKEPATH 0x00000020
+//#define HOOK_FILLPATH 0x00000040
+//#define HOOK_STROKEANDFILLPATH 0x00000080
+//#define HOOK_LINETO 0x00000100
+//#define SHAREACCESS_SURFACE 0x00000200
+//#define HOOK_COPYBITS 0x00000400
+//#define REDIRECTION_SURFACE 0x00000800 // ?
+//#define HOOK_MOVEPANNING 0x00000800
+//#define HOOK_SYNCHRONIZE 0x00001000
+//#define HOOK_STRETCHBLTROP 0x00002000
+//#define HOOK_SYNCHRONIZEACCESS 0x00004000
+//#define USE_DEVLOCK_SURFACE 0x00004000
+//#define HOOK_TRANSPARENTBLT 0x00008000
+//#define HOOK_ALPHABLEND 0x00010000
+//#define HOOK_GRADIENTFILL 0x00020000
+//#if (NTDDI_VERSION < 0x06000000)
+// #define HOOK_FLAGS 0x0003B5FF
+//#else
+// #define HOOK_FLAGS 0x0003B5EF
+//#endif
+#define UMPD_SURFACE 0x00040000
+#define MIRROR_SURFACE 0x00080000
+#define DIRECTDRAW_SURFACE 0x00100000
+#define DRIVER_CREATED_SURFACE 0x00200000
+#define ENG_CREATE_DEVICE_SURFACE 0x00400000
+#define DDB_SURFACE 0x00800000
+#define LAZY_DELETE_SURFACE 0x01000000
+#define BANDING_SURFACE 0x02000000
+#define API_BITMAP 0x04000000
+#define PALETTE_SELECT_SET 0x08000000
+#define UNREADABLE_SURFACE 0x10000000
+#define DYNAMIC_MODE_PALETTE 0x20000000
+#define ABORT_SURFACE 0x40000000
+#define PDEV_SURFACE 0x80000000
+
+
+#define BMF_DONT_FREE 0x100
+#define BMF_RLE_HACK 0x200
+
/* Internal interface */
-#define SURFACE_AllocSurface() ((PSURFACE) GDIOBJ_AllocObj(GDIObjType_SURF_TYPE))
#define SURFACE_AllocSurfaceWithHandle() ((PSURFACE) GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_BITMAP))
#define SURFACE_FreeSurface(pBMObj) GDIOBJ_FreeObj((POBJ) pBMObj, GDIObjType_SURF_TYPE)
#define SURFACE_FreeSurfaceByHandle(hBMObj) GDIOBJ_FreeObjByHandle((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_BITMAP)
#define SURFACE_ShareUnlockSurface(pBMObj) \
GDIOBJ_ShareUnlockObjByPtr ((POBJ)pBMObj)
-#define SURFACE_LockBitmapBits(pBMObj) ExEnterCriticalRegionAndAcquireFastMutexUnsafe((pBMObj)->BitsLock)
-#define SURFACE_UnlockBitmapBits(pBMObj) ExReleaseFastMutexUnsafeAndLeaveCriticalRegion((pBMObj)->BitsLock)
-
BOOL INTERNAL_CALL SURFACE_Cleanup(PVOID ObjectBody);
-BOOL INTERNAL_CALL SURFACE_InitBitsLock(SURFACE *pBMObj);
-void INTERNAL_CALL SURFACE_CleanupBitsLock(SURFACE *pBMObj);
+
+PSURFACE
+NTAPI
+SURFACE_AllocSurface(
+ IN ULONG iType,
+ IN ULONG cx,
+ IN ULONG cy,
+ IN ULONG iFormat);
+
+BOOL
+NTAPI
+SURFACE_bSetBitmapBits(
+ IN PSURFACE psurf,
+ IN USHORT fjBitmap,
+ IN ULONG ulWidth,
+ IN PVOID pvBits OPTIONAL);
#define GDIDEV(SurfObj) ((PDEVOBJ *)((SurfObj)->hdev))
#define GDIDEVFUNCS(SurfObj) ((PDEVOBJ *)((SurfObj)->hdev))->DriverFunctions
-INT FASTCALL BitsPerFormat (ULONG Format);
ULONG FASTCALL BitmapFormat (WORD Bits, DWORD Compression);
+extern UCHAR gajBitsPerFormat[];
+#define BitsPerFormat(Format) gajBitsPerFormat[Format]
+
+#define WIDTH_BYTES_ALIGN32(cx, bpp) ((((cx) * (bpp) + 31) & ~31) >> 3)
+#define WIDTH_BYTES_ALIGN16(cx, bpp) ((((cx) * (bpp) + 15) & ~15) >> 3)
+