ReactOS  r76032
surface.h File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  _SURFACE
 

Macros

#define BMF_POOLALLOC   0x100
 
#define SURFACE_AllocSurfaceWithHandle()   ((PSURFACE) GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_BITMAP, sizeof(SURFACE)))
 
#define SURFACE_ShareLockSurface(hBMObj)   ((PSURFACE) GDIOBJ_ShareLockObj ((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_BITMAP))
 
#define SURFACE_UnlockSurface(pBMObj)   GDIOBJ_vUnlockObject ((POBJ)pBMObj)
 
#define SURFACE_ShareUnlockSurface(pBMObj)   GDIOBJ_vDereferenceObject ((POBJ)pBMObj)
 
#define GDIDEV(SurfObj)   ((PDEVOBJ *)((SurfObj)->hdev))
 
#define GDIDEVFUNCS(SurfObj)   ((PDEVOBJ *)((SurfObj)->hdev))->DriverFunctions
 
#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)
 

Typedefs

typedef struct _SURFACE SURFACE
 
typedef struct _SURFACEPSURFACE
 

Enumerations

enum  _SURFACEFLAGS {
  SHAREACCESS_SURFACE = 0x00000200, UMPD_SURFACE = 0x00040000, MIRROR_SURFACE = 0x00080000, DIRECTDRAW_SURFACE = 0x00100000,
  DRIVER_CREATED_SURFACE = 0x00200000, ENG_CREATE_DEVICE_SURFACE = 0x00400000, DDB_SURFACE = 0x00800000, LAZY_DELETE_SURFACE = 0x01000000,
  BANDING_SURFACE = 0x02000000, API_BITMAP = 0x04000000, PALETTE_SELECT_SET = 0x08000000, UNREADABLE_SURFACE = 0x10000000,
  DYNAMIC_MODE_PALETTE = 0x20000000, ABORT_SURFACE = 0x40000000, PDEV_SURFACE = 0x80000000
}
 

Functions

ULONG FASTCALL BitmapFormat (ULONG cBits, ULONG iCompression)
 
VOID NTAPI SURFACE_vCleanup (PVOID ObjectBody)
 
PSURFACE NTAPI SURFACE_AllocSurface (_In_ USHORT iType, _In_ ULONG cx, _In_ ULONG cy, _In_ ULONG iFormat, _In_ ULONG fjBitmap, _In_opt_ ULONG cjWidth, _In_opt_ ULONG cjBits, _In_opt_ PVOID pvBits)
 
FORCEINLINE VOID SURFACE_vSetPalette (_Inout_ PSURFACE psurf, _In_ PPALETTE ppal)
 

Variables

UCHAR gajBitsPerFormat []
 

Macro Definition Documentation

#define BMF_POOLALLOC   0x100

Definition at line 84 of file surface.h.

Referenced by SURFACE_vCleanup().

#define GDIDEV (   SurfObj)    ((PDEVOBJ *)((SurfObj)->hdev))

Definition at line 98 of file surface.h.

Referenced by EngMovePointer(), EngSetPointerShape(), and IntEngSetPointerShape().

#define GDIDEVFUNCS (   SurfObj)    ((PDEVOBJ *)((SurfObj)->hdev))->DriverFunctions
#define SURFACE_AllocSurfaceWithHandle ( )    ((PSURFACE) GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_BITMAP, sizeof(SURFACE)))

Definition at line 88 of file surface.h.

#define SURFACE_UnlockSurface (   pBMObj)    GDIOBJ_vUnlockObject ((POBJ)pBMObj)
#define WIDTH_BYTES_ALIGN16 (   cx,
  bpp 
)    ((((cx) * (bpp) + 15) & ~15) >> 3)
#define WIDTH_BYTES_ALIGN32 (   cx,
  bpp 
)    ((((cx) * (bpp) + 31) & ~31) >> 3)

Definition at line 104 of file surface.h.

Typedef Documentation

Enumeration Type Documentation

Enumerator
SHAREACCESS_SURFACE 
UMPD_SURFACE 
MIRROR_SURFACE 
DIRECTDRAW_SURFACE 
DRIVER_CREATED_SURFACE 
ENG_CREATE_DEVICE_SURFACE 
DDB_SURFACE 
LAZY_DELETE_SURFACE 
BANDING_SURFACE 
API_BITMAP 
PALETTE_SELECT_SET 
UNREADABLE_SURFACE 
DYNAMIC_MODE_PALETTE 
ABORT_SURFACE 
PDEV_SURFACE 

Definition at line 41 of file surface.h.

42 {
43 //#define HOOK_BITBLT 0x00000001
44 //#define HOOK_STRETCHBLT 0x00000002
45 //#define HOOK_PLGBLT 0x00000004
46 //#define HOOK_TEXTOUT 0x00000008
47 //#define HOOK_PAINT 0x00000010
48 //#define HOOK_STROKEPATH 0x00000020
49 //#define HOOK_FILLPATH 0x00000040
50 //#define HOOK_STROKEANDFILLPATH 0x00000080
51 //#define HOOK_LINETO 0x00000100
52  SHAREACCESS_SURFACE = 0x00000200,
53 //#define HOOK_COPYBITS 0x00000400
54 //#define REDIRECTION_SURFACE 0x00000800 // ?
55 //#define HOOK_MOVEPANNING 0x00000800
56 //#define HOOK_SYNCHRONIZE 0x00001000
57 //#define HOOK_STRETCHBLTROP 0x00002000
58 //#define HOOK_SYNCHRONIZEACCESS 0x00004000
59 //#define USE_DEVLOCK_SURFACE 0x00004000
60 //#define HOOK_TRANSPARENTBLT 0x00008000
61 //#define HOOK_ALPHABLEND 0x00010000
62 //#define HOOK_GRADIENTFILL 0x00020000
63 //#if (NTDDI_VERSION < 0x06000000)
64 // #define HOOK_FLAGS 0x0003B5FF
65 //#else
66 // #define HOOK_FLAGS 0x0003B5EF
67 //#endif
68  UMPD_SURFACE = 0x00040000,
69  MIRROR_SURFACE = 0x00080000,
70  DIRECTDRAW_SURFACE = 0x00100000,
71  DRIVER_CREATED_SURFACE = 0x00200000,
72  ENG_CREATE_DEVICE_SURFACE = 0x00400000,
73  DDB_SURFACE = 0x00800000,
74  LAZY_DELETE_SURFACE = 0x01000000,
75  BANDING_SURFACE = 0x02000000,
76  API_BITMAP = 0x04000000,
77  PALETTE_SELECT_SET = 0x08000000,
78  UNREADABLE_SURFACE = 0x10000000,
79  DYNAMIC_MODE_PALETTE = 0x20000000,
80  ABORT_SURFACE = 0x40000000,
81  PDEV_SURFACE = 0x80000000
82 };

Function Documentation

ULONG FASTCALL BitmapFormat ( ULONG  cBits,
ULONG  iCompression 
)

Definition at line 39 of file surface.c.

Referenced by DIB_CreateDIBSection(), GreCreateBitmap(), IntCreateDIBitmap(), IntSetDIBits(), NtGdiCreateBitmap(), NtGdiDdDDICreateDCFromMemory(), NtGdiSetDIBitsToDeviceInternal(), and NtGdiStretchDIBitsInternal().

40 {
41  switch (iCompression)
42  {
43  case BI_RGB:
44  /* Fall through */
45  case BI_BITFIELDS:
46  if (cBits <= 1) return BMF_1BPP;
47  if (cBits <= 4) return BMF_4BPP;
48  if (cBits <= 8) return BMF_8BPP;
49  if (cBits <= 16) return BMF_16BPP;
50  if (cBits <= 24) return BMF_24BPP;
51  if (cBits <= 32) return BMF_32BPP;
52  return 0;
53 
54  case BI_RLE4:
55  return BMF_4RLE;
56 
57  case BI_RLE8:
58  return BMF_8RLE;
59 
60  default:
61  return 0;
62  }
63 }
#define BMF_24BPP
Definition: winddi.h:359
#define BMF_32BPP
Definition: winddi.h:360
#define BMF_8RLE
Definition: winddi.h:362
#define BI_BITFIELDS
Definition: mmreg.h:505
Definition: xlate.c:8
#define BMF_4RLE
Definition: winddi.h:361
#define BMF_16BPP
Definition: winddi.h:358
Definition: xlate.c:9
Definition: xlate.c:10
#define BI_RLE4
Definition: precomp.h:36
#define BI_RLE8
Definition: wingdi.h:35
#define BI_RGB
Definition: precomp.h:35
PSURFACE NTAPI SURFACE_AllocSurface ( _In_ USHORT  iType,
_In_ ULONG  cx,
_In_ ULONG  cy,
_In_ ULONG  iFormat,
_In_ ULONG  fjBitmap,
_In_opt_ ULONG  cjWidth,
_In_opt_ ULONG  cjBits,
_In_opt_ PVOID  pvBits 
)

Definition at line 116 of file surface.c.

Referenced by EngCreateBitmap(), EngCreateDeviceBitmap(), EngCreateDeviceSurface(), GreCreateBitmapEx(), IntEngMaskBlt(), NtGdiCreateBitmap(), NtGdiDdDDICreateDCFromMemory(), NtGdiGetPixel(), and UserDrawIconEx().

125 {
126  ULONG cBitsPixel, cjBits, cjObject;
127  PSURFACE psurf;
128  SURFOBJ *pso;
129  PVOID pvSection;
130 
131  NT_ASSERT(!pvBits || (iType == STYPE_BITMAP));
132  NT_ASSERT((iFormat <= BMF_32BPP) || (cjBufSize != 0));
133  NT_ASSERT((LONG)cy > 0);
134 
135  /* Verify format */
136  if ((iFormat < BMF_1BPP) || (iFormat > BMF_PNG))
137  {
138  DPRINT1("Invalid bitmap format: %lu\n", iFormat);
139  return NULL;
140  }
141 
142  /* Get bits per pixel from the format */
143  cBitsPixel = gajBitsPerFormat[iFormat];
144 
145  /* Are bits and a width in bytes given? */
146  if (pvBits && cjWidth)
147  {
148  /* Align the width (Windows compatibility, drivers expect that) */
149  cjWidth = WIDTH_BYTES_ALIGN32((cjWidth << 3) / cBitsPixel, cBitsPixel);
150  }
151  else
152  {
153  /* Calculate width from the bitmap width in pixels */
154  cjWidth = WIDTH_BYTES_ALIGN32(cx, cBitsPixel);
155  }
156 
157  /* Is this an uncompressed format? */
158  if (iFormat <= BMF_32BPP)
159  {
160  /* Calculate the correct bitmap size in bytes */
161  if (!NT_SUCCESS(RtlULongMult(cjWidth, cy, &cjBits)))
162  {
163  DPRINT1("Overflow calculating size: cjWidth %lu, cy %lu\n",
164  cjWidth, cy);
165  return NULL;
166  }
167 
168  /* Did we get a buffer and size? */
169  if ((pvBits != NULL) && (cjBufSize != 0))
170  {
171  /* Make sure the buffer is large enough */
172  if (cjBufSize < cjBits)
173  {
174  DPRINT1("Buffer is too small, required: %lu, got %lu\n",
175  cjBits, cjBufSize);
176  return NULL;
177  }
178  }
179  }
180  else
181  {
182  /* Compressed format, use the provided size */
183  NT_ASSERT(cjBufSize != 0);
184  cjBits = cjBufSize;
185  }
186 
187  /* Check if we need an extra large object */
188  if ((iType == STYPE_BITMAP) && (pvBits == NULL) &&
189  !(fjBitmap & BMF_USERMEM) && !(fjBitmap & BMF_KMSECTION))
190  {
191  /* Allocate an object large enough to hold the bits */
192  cjObject = sizeof(SURFACE) + cjBits;
193  }
194  else
195  {
196  /* Otherwise just allocate the SURFACE structure */
197  cjObject = sizeof(SURFACE);
198  }
199 
200  /* Check for arithmetic overflow */
201  if (cjObject < sizeof(SURFACE))
202  {
203  /* Fail! */
204  DPRINT1("Overflow calculating cjObject: cjBits %lu\n", cjBits);
205  return NULL;
206  }
207 
208  /* Allocate a SURFACE object */
210  if (!psurf)
211  {
212  return NULL;
213  }
214 
215  /* Initialize the basic fields */
216  pso = &psurf->SurfObj;
217  pso->hsurf = psurf->BaseObject.hHmgr;
218  pso->sizlBitmap.cx = cx;
219  pso->sizlBitmap.cy = cy;
220  pso->iBitmapFormat = iFormat;
221  pso->iType = iType;
222  pso->fjBitmap = (USHORT)fjBitmap;
224  pso->cjBits = cjBits;
225 
226  /* Check if we need a bitmap buffer */
227  if (iType == STYPE_BITMAP)
228  {
229  /* Check if we got one or if we need to allocate one */
230  if (pvBits != NULL)
231  {
232  /* Use the caller provided buffer */
233  pso->pvBits = pvBits;
234  }
235  else if (fjBitmap & BMF_USERMEM)
236  {
237  /* User mode memory was requested */
238  pso->pvBits = EngAllocUserMem(cjBits, 0);
239 
240  /* Check for failure */
241  if (!pso->pvBits)
242  {
244  return NULL;
245  }
246  }
247  else if (fjBitmap & BMF_KMSECTION)
248  {
249  /* Use a kernel mode section */
250  pso->pvBits = EngAllocSectionMem(&pvSection,
251  (fjBitmap & BMF_NOZEROINIT) ?
252  0 : FL_ZERO_MEMORY,
253  cjBits, TAG_DIB);
254 
255  /* Check for failure */
256  if (!pso->pvBits)
257  {
259  return NULL;
260  }
261 
262  /* Free the section already, but keep the mapping */
263  EngFreeSectionMem(pvSection, NULL);
264  }
265  else
266  {
267  /* Buffer is after the object */
268  pso->pvBits = psurf + 1;
269 
270  /* Zero the buffer, except requested otherwise */
271  if (!(fjBitmap & BMF_NOZEROINIT))
272  {
273  RtlZeroMemory(pso->pvBits, cjBits);
274  }
275  }
276 
277  /* Set pvScan0 and lDelta */
278  if (fjBitmap & BMF_TOPDOWN)
279  {
280  /* Topdown is the normal way */
281  pso->pvScan0 = pso->pvBits;
282  pso->lDelta = cjWidth;
283  }
284  else
285  {
286  /* Inversed bitmap (bottom up) */
287  pso->pvScan0 = ((PCHAR)pso->pvBits + pso->cjBits - cjWidth);
288  pso->lDelta = -(LONG)cjWidth;
289  }
290  }
291  else
292  {
293  /* There are no bitmap bits */
294  pso->pvScan0 = pso->pvBits = NULL;
295  pso->lDelta = 0;
296  }
297 
298  /* Assign a default palette and increment its reference count */
300 
301  return psurf;
302 }
DWORD *typedef PVOID
Definition: winlogon.h:52
SIZEL sizlBitmap
Definition: winddi.h:1209
LONG lDelta
Definition: winddi.h:1213
#define BMF_32BPP
Definition: winddi.h:360
#define WIDTH_BYTES_ALIGN32(cx, bpp)
Definition: swimpl.c:26
#define STYPE_BITMAP
Definition: winddi.h:1175
_In_ ULONG iType
Definition: winddi.h:3748
USHORT iType
Definition: winddi.h:1216
#define BMF_TOPDOWN
Definition: winddi.h:1180
ULONG iBitmapFormat
Definition: winddi.h:1215
ULONG iUniq
Definition: winddi.h:1214
Definition: xlate.c:8
ULONG cjBits
Definition: winddi.h:1210
#define BMF_PNG
Definition: winddi.h:364
long LONG
Definition: pedump.c:60
SURFOBJ SurfObj
Definition: surface.h:8
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:570
HGDIOBJ hHmgr(VOID)
Definition: baseobj.hpp:95
HSURF hsurf
Definition: winddi.h:1206
smooth NULL
Definition: ftsmooth.c:557
LONG cx
Definition: windef.h:347
#define PCHAR
Definition: match.c:90
#define BMF_USERMEM
Definition: winddi.h:1183
_In_ HANDLE _In_ SURFOBJ * pso
Definition: winddi.h:3664
BASEOBJECT BaseObject
Definition: surface.h:6
VOID NTAPI GDIOBJ_vDeleteObject(POBJ pobj)
Definition: gdiobj.c:1106
BOOL APIENTRY EngFreeSectionMem(_In_opt_ PVOID pvSection, _In_opt_ PVOID pvMappedBase)
Definition: mapping.c:246
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:24
#define BMF_NOZEROINIT
Definition: winddi.h:1181
#define LONG
Definition: msvc.h:36
FORCEINLINE VOID SURFACE_vSetPalette(_Inout_ PSURFACE psurf, _In_ PPALETTE ppal)
Definition: surface.h:129
#define FL_ZERO_MEMORY
Definition: polytest.cpp:58
#define GDI_OBJECT_TYPE_BITMAP
Definition: gdi.h:48
_In_ SIZEL _In_ ULONG iFormat
Definition: winddi.h:3467
USHORT fjBitmap
Definition: winddi.h:1217
#define InterlockedIncrement
Definition: armddk.h:53
unsigned short USHORT
Definition: pedump.c:61
POBJ NTAPI GDIOBJ_AllocObjWithHandle(ULONG ObjectType, ULONG cjSize)
Definition: gdiobj.c:1483
struct _SURFACE SURFACE
PPALETTE appalSurfaceDefault[11]
Definition: palette.c:18
#define DPRINT1
Definition: precomp.h:8
_Out_opt_ int * cx
Definition: commctrl.h:570
PVOID pvBits
Definition: winddi.h:1211
unsigned int ULONG
Definition: retypes.h:1
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:261
LONG giUniqueSurface
Definition: surface.c:18
LONG cy
Definition: windef.h:348
struct _SURFACE * PSURFACE
UCHAR gajBitsPerFormat[11]
Definition: surface.c:21
#define BMF_KMSECTION
Definition: winddi.h:1184
PVOID pvScan0
Definition: winddi.h:1212
#define TAG_DIB
Definition: tags.h:17
#define NT_ASSERT
Definition: rtlfuncs.h:3312
VOID NTAPI SURFACE_vCleanup ( PVOID  ObjectBody)

Definition at line 67 of file surface.c.

68 {
69  PSURFACE psurf = (PSURFACE)ObjectBody;
70  PVOID pvBits = psurf->SurfObj.pvBits;
71 
72  /* Check if the surface has bits */
73  if (pvBits)
74  {
75  /* Only bitmaps can have bits */
76  ASSERT(psurf->SurfObj.iType == STYPE_BITMAP);
77 
78  /* Check if it is a DIB section */
79  if (psurf->hDIBSection)
80  {
81  /* Unmap the section view */
82  EngUnmapSectionView(pvBits, psurf->dwOffset, psurf->hSecure);
83  }
84  else if (psurf->SurfObj.fjBitmap & BMF_USERMEM)
85  {
86  /* Bitmap was allocated from usermode memory */
87  EngFreeUserMem(pvBits);
88  }
89  else if (psurf->SurfObj.fjBitmap & BMF_KMSECTION)
90  {
91  /* Bitmap was allocated from a kernel section */
92  if (!EngFreeSectionMem(NULL, pvBits))
93  {
94  DPRINT1("EngFreeSectionMem failed for %p!\n", pvBits);
95  // Should we BugCheck here?
96  ASSERT(FALSE);
97  }
98  }
99  else if (psurf->SurfObj.fjBitmap & BMF_POOLALLOC)
100  {
101  /* Free a pool allocation */
102  EngFreeMem(pvBits);
103  }
104  }
105 
106  /* Free palette */
107  if(psurf->ppal)
108  {
110  }
111 }
DWORD *typedef PVOID
Definition: winlogon.h:52
#define STYPE_BITMAP
Definition: winddi.h:1175
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel)?(CompletionRoutine!=NULL):TRUE)
#define EngFreeMem
Definition: polytest.cpp:56
USHORT iType
Definition: winddi.h:1216
struct _PALETTE *const ppal
Definition: surface.h:11
#define FALSE
Definition: types.h:117
SURFOBJ SurfObj
Definition: surface.h:8
smooth NULL
Definition: ftsmooth.c:557
ENGAPI VOID APIENTRY EngFreeUserMem(_Pre_notnull_ __drv_freesMem(UserMem) PVOID pv)
#define BMF_USERMEM
Definition: winddi.h:1183
BOOL APIENTRY EngFreeSectionMem(_In_opt_ PVOID pvSection, _In_opt_ PVOID pvMappedBase)
Definition: mapping.c:246
HANDLE hSecure
Definition: surface.h:32
#define BMF_POOLALLOC
Definition: surface.h:84
VOID NTAPI EngUnmapSectionView(_In_ PVOID pvBits, _In_ ULONG cjOffset, _In_ HANDLE hSecure)
Definition: mapping.c:71
USHORT fjBitmap
Definition: winddi.h:1217
DWORD dwOffset
Definition: surface.h:33
#define PALETTE_ShareUnlockPalette(ppal)
Definition: palette.h:59
HANDLE hDIBSection
Definition: surface.h:31
#define DPRINT1
Definition: precomp.h:8
PVOID pvBits
Definition: winddi.h:1211
struct _SURFACE * PSURFACE
#define BMF_KMSECTION
Definition: winddi.h:1184
FORCEINLINE VOID SURFACE_vSetPalette ( _Inout_ PSURFACE  psurf,
_In_ PPALETTE  ppal 
)

Definition at line 129 of file surface.h.

Referenced by BITMAP_CopyBitmap(), DIB_CreateDIBSection(), EngAssociateSurface(), EngModifySurface(), IntCreateCompatibleBitmap(), IntCreateDIBitmap(), and SURFACE_AllocSurface().

132 {
133  if (psurf->ppal)
134  GDIOBJ_vDereferenceObject((POBJ)psurf->ppal);
135  if (ppal)
137  *(PVOID*)&psurf->ppal = ppal;
138 }
DWORD *typedef PVOID
Definition: winlogon.h:52
VOID NTAPI GDIOBJ_vDereferenceObject(POBJ pobj)
Definition: gdiobj.c:626
VOID NTAPI GDIOBJ_vReferenceObjectByPointer(POBJ pobj)
Definition: gdiobj.c:729

Variable Documentation