WindowsXP-SP1/windows/advcore/gdiplus/ddkinc/dpdriver.hpp
2020-09-30 16:53:49 +02:00

300 lines
8.0 KiB
C++

/**************************************************************************\
*
* Copyright (c) 1998-2000 Microsoft Corporation
*
* Module Name:
*
* DpDriver
*
* Abstract:
*
* Represents the driver interface that a driver will implement.
* Unfortunately, in this version, the meaning is a bit confused -
* the member functions are not pure virtual - rather, they implement
* the software rasterizer.
*
* The plan is that the software rasterizer will look just like another
* driver - DpDriver will be abstract, and the software rasterizer will
* derive a class from DpDriver.
*
* Notes:
*
*
*
* Created:
*
* 12/01/1998 andrewgo
* Created it.
* 03/24/1999 agodfrey
* Moved into separate file.
*
\**************************************************************************/
#ifndef _DPDRIVER_HPP
#define _DPDRIVER_HPP
// Private data, used by GDI+.
struct DpDriverInternal;
#define DriverDrawImageFlags DWORD
#define DriverDrawImageCachedBackground 0x00000001
#define DriverDrawImageFirstImageBand 0x00000002
#define DriverDrawImageLastImageBand 0x00000004
//--------------------------------------------------------------------------
// Base driver class
//--------------------------------------------------------------------------
class DpDriver
{
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!
struct DpDriverInternal * Internal;
protected:
VOID SetValid(BOOL valid)
{
Tag = valid ? ObjectTagDpDriver : ObjectTagInvalid;
}
public:
BOOL IsLockable; // TRUE if any surfaces with this
// driver interface are opaque, meaning
// that Lock() may not be called
GpDevice *Device; // Associated device
public:
DpDriver();
DpDriver(GpDevice *device)
{
SetValid(TRUE); // set to valid state
IsLockable = TRUE;
Device = device;
Internal = NULL;
}
virtual ~DpDriver();
BOOL IsValid() const
{
ASSERT((Tag == ObjectTagDpDriver) || (Tag == ObjectTagInvalid));
#if DBG
if (Tag == ObjectTagInvalid)
{
WARNING1("Invalid DpDriver");
}
#endif
return (Tag == ObjectTagDpDriver);
}
virtual VOID
DesktopChangeNotification()
{
// do nothing
}
virtual VOID
UpdateSurfacePixelFormat(DpBitmap *surface)
{
// do nothing.
// used primarily by the multimon driver to update the pixel format
// for the meta surface.
}
virtual VOID
PaletteChangeNotification()
{
// do nothing
}
virtual VOID
Flush(
GpDevice *device,
DpBitmap *surface,
GpFlushIntention intention)
{
surface->Flush(intention);
}
virtual VOID
SetupClipping(
HDC hdc,
DpContext * context,
const GpRect * drawBounds,
BOOL & isClip,
BOOL & usePathClipping,
BOOL forceClipping
);
virtual VOID
RestoreClipping(
HDC hdc,
BOOL isClip,
BOOL usePathClipping
);
virtual GpStatus
StrokePath(
DpContext * context,
DpBitmap * surface,
const GpRect * drawBounds,
const DpPath * path,
const DpPen * pen
);
virtual GpStatus
FillRects(
DpContext * context,
DpBitmap * surface,
const GpRect * drawBounds,
INT numRects, // NOTE: You must check for empty
const GpRectF * rects, // rectangles!
const DpBrush * brush
);
virtual GpStatus
FillPath(
DpContext * context,
DpBitmap * surface,
const GpRect * drawBounds,
const DpPath * path,
const DpBrush * brush
);
virtual GpStatus
FillRegion(
DpContext *context,
DpBitmap *surface,
const GpRect *drawBounds,
const DpRegion *region,
const DpBrush *brush
);
virtual GpStatus
SolidText(
DpContext* context,
DpBitmap* surface,
const GpRect* drawBounds,
GpColor color,
const GpGlyphPos *glyphPos,
INT count,
GpTextRenderingHint textMode,
BOOL rightToLeft
);
virtual GpStatus
GdiText(
HDC hdc,
INT angle, // In tenths of a degree
const UINT16 *glyphs,
const PointF *glyphOrigins,
INT glyphCount,
BOOL rightToLeft,
UINT16 blankGlyph = 0
);
virtual GpStatus
BrushText(
DpContext* context,
DpBitmap* surface,
const GpRect* drawBounds,
const DpBrush* brush,
const GpGlyphPos *glyphPos,
INT count,
GpTextRenderingHint textMode
);
virtual GpStatus
DrawGlyphs(
DrawGlyphData *drawGlyphData
);
virtual GpStatus
DrawImage(
DpContext * context,
DpBitmap * srcSurface,
DpBitmap * dstSurface,
const GpRect * drawBounds,
const DpImageAttributes * imgAttributes,
INT numPoints,
const GpPointF * dstPoints,
const GpRectF * srcRect,
DriverDrawImageFlags flags
);
// Draw the CachedBitmap on the destination bitmap.
virtual GpStatus
DrawCachedBitmap(
DpContext *context,
DpCachedBitmap *src,
DpBitmap *dst,
INT x, INT y // where to put it on the destination.
);
virtual GpStatus
MoveBits(
DpContext *context,
DpBitmap *surface,
const GpRect *drawBounds,
const GpRect *dstRect, // Device coordinates
const GpPoint *srcPoint // Device coordinates
);
//--------------------------------------------------------------------------
// Low-level driver functions
//--------------------------------------------------------------------------
// !!! We will inevitably be adding more functions in the next version,
// which would mean that they would have to be added to the end
// of the VTable?
// !!! Extend the following to represent low-level D3D token primitives
//--------------------------------------------------------------------------
// Direct access functions - Required if IsLockable
//--------------------------------------------------------------------------
// Lock can return FALSE only in the case of catastrophic failure
// !!! What do we do about transitional surfaces?
virtual GpStatus
Lock(
DpBitmap *surface,
const GpRect *drawBounds,
INT *stride, // [OUT] - Returned stride
VOID **bits // [OUT] - Returned pointer to bits
);
virtual VOID
Unlock(
DpBitmap *surface
);
protected:
GpStatus
SolidStrokePathOnePixel(
DpContext *context,
DpBitmap *surface,
const GpRect *drawBounds,
const DpPath *path,
const DpPen *pen,
BOOL drawLast
);
};
#endif