|
|
/**************************************************************************\
* * Copyright (c) 1998-2000 Microsoft Corporation * * Module Name: * * DpBitmap * * Notes: * * Abstract: * * This is a DDI-level surface. Its name should really be 'surface'. * Unlike many other DDI objects, there isn't a one-to-one mapping between * a DpBitmap and a GpBitmap. Rather, this is like a GDI surface - it * represents any rectangular area to which one can draw. * * Created: * * 12/01/1998 andrewgo * Created it. * 03/24/1999 agodfrey * Moved into separate file. * \**************************************************************************/
#ifndef _DPBITMAP_HPP
#define _DPBITMAP_HPP
// DpTransparency:
// Characterizes the alpha values in a surface. Perf optimizations can
// take advantage of this knowledge.
enum DpTransparency { TransparencyUnknown, // We know nothing about the alpha values
TransparencyComplex, // We have alpha values between 0 and 1
TransparencySimple, // All alpha values are either 0 or 1
TransparencyOpaque, // All alpha values are 1
TransparencyNearConstant, // we have near constant alpha
TransparencyNoAlpha // All pixels are opaque because the surface doesn't
// support alpha.
};
// Define PixelFormatID in terms of the PixelFormat enum
typedef PixelFormat PixelFormatID;
// Passthrough compressed bitmaps to driver
class DpCompressedData { public: DpCompressedData() { format = 0; bufferSize = 0; buffer = NULL; }
~DpCompressedData() { ASSERT(buffer == NULL); }
public: INT format; UINT bufferSize; VOID* buffer; };
//--------------------------------------------------------------------------
// Represent surface information
//--------------------------------------------------------------------------
class EpScanBitmap; struct ImageInfo;
class DpBitmap { private: // We now use an ObjectTag to determine if the object is valid
// instead of using a BOOL. This is much more robust and helps
// with debugging. It also enables us to version our objects
// more easily with a version number in the ObjectTag.
ObjectTag Tag; // Keep this as the 1st value in the object!
protected: VOID SetValid(BOOL valid) { Tag = valid ? ObjectTagDpBitmap : ObjectTagInvalid; }
public: enum CreationType { GDI, GDIDIBSECTION, GPBITMAP, D3D };
INT Width; INT Height; PixelFormatID PixelFormat; // bits per pixel, pre/post multiplied alpha, etc.
INT NumBytes; // Number of bytes
REAL DpiX; // actual horizontal resolution in dots per inch
REAL DpiY; // actual vertical resolution in dots per inch
UINT Uniqueness; // Incremented every time it's drawn on
DpTransparency SurfaceTransparency;
BYTE MinAlpha; BYTE MaxAlpha;
// The following is true only for RGB format bitmaps:
ColorPalette* PaletteTable; // These masks are no longer used for determining the pixel format
// Use the PixelFormat member above instead.
// In fact, there's never been any garantee that these fields were
// set up correctly anyway. They should be removed soon.
INT RedMask; INT GreenMask; INT BlueMask; INT AlphaMask;
LPDIRECTDRAWSURFACE DdrawSurface; IDirectDrawSurface7 * DdrawSurface7; BOOL IsDisplay; // Is this bitmap associated with a display?
CreationType Type;
// short lived, so don't include statically
DpCompressedData *CompressedData;
public: BOOL IsDesktopSurface() const { return (this == Globals::DesktopSurface); }
BOOL IsValid() const { ASSERT((Tag == ObjectTagDpBitmap) || (Tag == ObjectTagInvalid)); #if DBG
if (Tag == ObjectTagInvalid) { WARNING1("Invalid DpBitmap"); } #endif
return (Tag == ObjectTagDpBitmap); }
public: // GDI+ INTERNAL
VOID *Bits; // Points to surface bits
VOID *CompBits; INT Delta; // Stride in bytes
// Private data for the software rasterizer.
EpScan *Scan;
public: // GDI+ INTERNAL
DpBitmap(HDC hdc = NULL) { SetValid(TRUE); // set to valid state
if ((hdc == NULL) || ((DpiX = (REAL)GetDeviceCaps(hdc, LOGPIXELSX)) <= 0.0f) || ((DpiY = (REAL)GetDeviceCaps(hdc, LOGPIXELSY)) <= 0.0f)) { // Assume this is a display surface with the display DPI for now
IsDisplay = TRUE; DpiX = Globals::DesktopDpiX; DpiY = Globals::DesktopDpiY; } else { IsDisplay = (GetDeviceCaps(hdc, TECHNOLOGY) == DT_RASDISPLAY); }
Scan = NULL; DdrawSurface = NULL; DdrawSurface7 = NULL; PaletteTable = NULL; CompressedData = NULL;
SurfaceTransparency = TransparencyUnknown; } ~DpBitmap();
VOID InitializeForMetafile(GpDevice *device) { InitializeForGdiBitmap(device, 0, 0); }
VOID InitializeForGdiBitmap( GpDevice *device, INT width, INT height ); VOID InitializeForGdiScreen( GpDevice *device, INT width, INT height ); BOOL InitializeForD3D( HDC hdc, INT *width, INT *height, DpDriver** driver ); BOOL InitializeForD3D( IDirectDrawSurface7* surface, INT *width, INT *height, DpDriver** driver ); BOOL InitializeForDibsection( HDC hdc, HBITMAP hbitmap, GpDevice *device, DIBSECTION *dib, INT *width, INT *height, DpDriver **driver ); VOID InitializeForGdipBitmap( INT width, INT height, ImageInfo * imageInfo, EpScanBitmap * scanBitmap, BOOL isDisplay );
BOOL InitializeForPrinter(GpPrinterDevice *device, INT width, INT height);
BOOL StandardFormat(); PixelFormatID GetPixelFormatFromBitDepth(INT bits);
// Flush any pending rendering to this surface:
VOID Flush(GpFlushIntention intention);
REAL GetDpiX() const { return DpiX; } REAL GetDpiY() const { return DpiY; } };
#endif
|