/**************************************************************************\ * * Copyright (c) 1998-2000 Microsoft Corporation * * Module Name: * * DpContext - DDI-level device context * * Abstract: * * This is the DDI-level portion of the GpGraphics object. * * Notes: * * * * Revision History: * * 12/01/1998 andrewgo * Created it. * 03/24/1999 agodfrey * Moved it into a separate file for the preliminary DDI. * \**************************************************************************/ #ifndef _DPCONTEXT_HPP #define _DPCONTEXT_HPP // This enum specifies what we should do about // the ICM mode on the destination HDC. enum HdcIcmMode { IcmModeOff, // must turn it off IcmModeOn // must turn it on }; //-------------------------------------------------------------------------- // Represent context information for the call //-------------------------------------------------------------------------- class DpContext { public: static LONG Uniqueness; // Used with Id's DpContext * Prev; // For save/restore (push/pop) DpContext * Next; UINT Id; // For save/restore INT AntiAliasMode; GpTextRenderingHint TextRenderHint; // For AntiAlias Text and GpCompositingMode CompositingMode; GpCompositingQuality CompositingQuality; INT RenderingOriginX; // Origin for halftone/dither matrices INT RenderingOriginY; UINT TextContrast; InterpolationMode FilterType; PixelOffsetMode PixelOffset; Unit PageUnit; REAL PageScale; REAL PageMultiplierX; // combination of PageUnit and PageScale REAL PageMultiplierY; // combination of PageUnit and PageScale REAL ContainerDpiX; // The Dpi for the current container REAL ContainerDpiY; // The Dpi for the current container REAL MetafileRasterizationLimitDpi; GpMatrix WorldToPage; GpMatrix WorldToDevice; // includes container transform GpMatrix ContainerToDevice; // container transform mutable GpMatrix DeviceToWorld; // lazy inverse of WorldToDevice mutable BOOL InverseOk; // if DeviceToWorld is up to date DpClipRegion VisibleClip; // The combination of all clip regions DpRegion ContainerClip; // For container clipping. Includes the WindowClip GpRegion AppClip; // The current logical region that // defines the current clipping HDC Hdc; // If the Graphics was derived from // an 'hdc', this is the DC handle. // NOTE: We may have changed the // state in it HWND Hwnd; // Window handle if we know it HdcIcmMode IcmMode; // Icm Mode for the DC. BOOL IsEmfPlusHdc; // If it is an EMF+ metafile HDC or not BOOL IsPrinter; // Represents a printer context BOOL IsDisplay; // Is this context associated with a display? INT SaveDc; // Represents the SaveDC level if the // Hdc had a SaveDC done on it since // it was given to us ColorPalette * Palette; // Context palette or NULL for system palette EpPaletteMap * PaletteMap; // Mapping to Palette or system palette HFONT CurrentHFont; // GdiPlus has created an hfont and selected HFONT OriginalHFont; // it into the DC. Before releasing // the DC, the original font should be // reselected, and the current font // deleted. const GpFontFace *Face; // Font face of currently selected font GpMatrix FontTransform; // Transform for currently selected font INT Style; // Style for currently selected font BOOL GdiLayered; // TRUE if GDI layering is enabled // on the target. If so, GDI is // rendering to the screen is // actually redirected to a backing // store inaccessible via DCI. // GDI must be used for rendering. public: DpContext( BOOL isDisplay ); DpContext( DpContext * prev // must not be NULL ); ~DpContext(); // GetHdc() will automatically initialize (to default values) parts of the // DC. It doesn't reset *all* attributes, though! HDC GetHdc( // May return NULL if not originally a GDI surface DpBitmap *surface ); VOID ReleaseHdc( HDC hdc, DpBitmap *surface = NULL ); VOID CleanTheHdc( HDC hdc ); // ResetHdc() restores the HDC to the state in which it was given // to us: VOID ResetHdc( VOID ); VOID UpdateWorldToDeviceMatrix() { GpMatrix::ScaleMatrix( WorldToDevice, WorldToPage, PageMultiplierX, PageMultiplierY); // GillesK: // PixelOffsetModeDefault and PixelOffsetModeHighSpeed are PixelOffsetNone, if (PixelOffset == PixelOffsetModeHalf || PixelOffset == PixelOffsetModeHighQuality) { WorldToDevice.Translate(-0.5f, -0.5f, MatrixOrderAppend); } if (!ContainerToDevice.IsIdentity()) { GpMatrix::MultiplyMatrix( WorldToDevice, WorldToDevice, ContainerToDevice); } } GpStatus GetDeviceToWorld( GpMatrix* deviceToWorld ) const; VOID GetPageMultipliers( REAL * pageMultiplierX, REAL * pageMultiplierY, GpPageUnit unit = UnitDisplay, REAL scale = 1.0f ) const; VOID GetPageMultipliers() { GetPageMultipliers(&PageMultiplierX, &PageMultiplierY, PageUnit, PageScale); } // Text optimisation hdc generation GpStatus UpdateCurrentHFont( BYTE quality, const PointF & scale, INT angle, HDC hdc, BOOL sideway, BYTE charSet = 0xFF ); private: VOID DeleteCurrentHFont(); public: // successful call to SelectCurrentHFont or GetTextOutputHdc must have // matching ReleaseTextOutputHdc call GpStatus SelectCurrentHFont(HDC hdc); HDC GetTextOutputHdc( const GpFaceRealization *faceRealization, // In - Font face required GpColor color, // In - Required GdiPlus brush effect DpBitmap *surface, // In INT *angle // Out ); VOID ReleaseTextOutputHdc(HDC hdc); REAL GetDpiX() const { return ContainerDpiX; } REAL GetDpiY() const { return ContainerDpiY; } // Used only when recording a EMF or EMF+ through GpMetafile class VOID SetMetafileDownLevelRasterizationLimit( UINT metafileRasterizationLimitDpi ); // Used only when recording a EMF or EMF+ through GpMetafile class UINT GetMetafileDownLevelRasterizationLimit() const { return GpRound(MetafileRasterizationLimitDpi); } }; #endif