SURFOBJ structure (winddi.h)

The SURFOBJ structure is the user object for a surface. A device driver usually calls methods on a surface object only when the surface object represents a GDI bitmap or a device-managed surface.


typedef struct _SURFOBJ {
  DHSURF dhsurf;
  HSURF  hsurf;
  DHPDEV private_dhpdev;
  HDEV   private_hdev;
  DHPDEV dhpdev;
  HDEV   hdev;
  SIZEL  sizlBitmap;
  ULONG  cjBits;
  PVOID  pvBits;
  PVOID  pvScan0;
  LONG   lDelta;
  ULONG  iUniq;
  ULONG  iBitmapFormat;
  USHORT iType;
  USHORT fjBitmap;



Handle to a surface, provided that the surface is device-managed. Otherwise, this member is zero.


Handle to the surface.




Identifies the device's PDEV that is associated with the specified surface.


GDI's logical handle to the PDEV associated with this device.


Specifies a SIZEL structure that contains the width and height, in pixels, of the surface. The SIZEL structure is identical to the SIZE structure.


Specifies the size of the buffer pointed to by pvBits.


If the surface is a standard format bitmap, this is a pointer to the surface's pixels. For BMF_JPEG or BMF_PNG images, this is a pointer to a buffer containing the image data in a JPEG or PNG format. Otherwise, this member is NULL.


Pointer to the first scan line of the bitmap. If iBitmapFormat is BMF_JPEG or BMF_PNG, this member is NULL.


Specifies the count of bytes required to move down one scan line in the bitmap. If iBitmapFormat is BMF_JPEG or BMF_PNG, this member is NULL.


Specifies the current state of the specified surface. Every time the surface changes, this value is incremented. This enables drivers to cache source surfaces.

For a surface that should not be cached, iUniq is set to zero. This value is used in conjunction with the BMF_DONTCACHE flag of fjBitmap.


Specifies the standard format most closely matching this surface. If the iType member specifies a bitmap (STYPE_BITMAP), this member specifies its format. NT-based operating systems support a set of predefined formats, although applications can also send device-specific formats by using SetDIBitsToDevice. Supported predefined formats include the following:

Value Meaning
BMF_1BPP 1 bit per pixel.
BMF_4BPP 4 bits per pixel.
BMF_8BPP 8 bits per pixel.
BMF_16BPP 16 bits per pixel.
BMF_24BPP 24 bits per pixel.
BMF_32BPP 32 bits per pixel.
BMF_4RLE 4 bits per pixel, run length encoded.
BMF_8RLE 8 bits per pixel, run length encoded.
BMF_JPEG JPEG compressed image.
BMF_PNG PNG compressed image.


Surface type, which is one of the following:

Type Definition
STYPE_BITMAP The surface is a bitmap.
STYPE_DEVBITMAP The surface is a device format bitmap.
STYPE_DEVICE The surface is managed by the device.


If the surface is of type STYPE_BITMAP and is a standard uncompressed format bitmap, the following flags can be set. Otherwise, this member should be ignored.

Value Meaning
BMF_DONTCACHE The bitmap should not be cached by the driver because it is a transient bitmap, created by GDI, that the driver will never see again. If this flag is set, the iUniq member of this structure will be set to 0.
BMF_KMSECTION Is used by GDI only and should be ignored by the driver.
BMF_NOTSYSMEM The bitmap is not in system memory. EngModifySurface sets this flag when it moves a bitmap into video memory.
BMF_NOZEROINIT The bitmap was not zero-initialized.
BMF_TOPDOWN The first scan line represents the top of the bitmap.
BMF_WINDOW_BLT GDI sets this flag to notify the driver of a window move from one screen location to another.


When information about a particular surface is required by a driver, the driver must access the SURFOBJ. This structure allows quick access to the properties of the surface.

When a SURFOBJ structure represents a GDI bitmap, the driver must be able to determine the format of the bitmap and locate the bitmap bits.

When a SURFOBJ structure represents a device surface, the driver must be able to locate the device handle for the surface.

For more information about supporting JPEG and PNG compressed images, see DEVINFO.


Header winddi.h (include Winddi.h)