/**************************************************************************\ * * 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