300 lines
8.0 KiB
C++
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
|