/******************************Module*Header*******************************\ * Module Name: brushobj.hxx * * Creates physical realizations of logical brushes. * * Created: 07-Dec-1990 13:14:23 * Author: waltm moore [waltm] * * Copyright (c) 1990-1999 Microsoft Corporation \**************************************************************************/ #ifndef _BRUSHOBJ_HXX // // Forward reference to needed classes // class EBRUSHOBJ; /******************************Class***************************************\ * XEBRUSHOBJ * * Basic Pen/Brush User Object. * * History: * 8-Sep-1992 -by- Paul Butzi * Changed the basic hierarchy to something sensible. * * Wed 3-Feb-1992 -by- J. Andrew Goossen [andrewgo] * added extended pen support. * * 22-Feb-1992 -by- Patrick Haluptzok patrickh * Wrote it. \**************************************************************************/ class XEBRUSHOBJ { protected: PBRUSHPEN pbp; // Pointer to the logical brush public: XEBRUSHOBJ() {} ~XEBRUSHOBJ() {} PBRUSH pbrush() { return(pbp.pbr); } HBRUSH hbrush() { return((HBRUSH)pbp.pbr->hGet()); } BOOL bValid() { return(pbp.pbr != PBRUSHNULL); } HBITMAP hbmPattern() { return(pbp.pbr->hbmPattern()); } HBITMAP hbmClient() { return(pbp.pbr->hbmClient()); } FLONG flAttrs() { return(pbp.pbr->flAttrs()); } ULONG ulStyle() { return(pbp.pbr->ulStyle()); } ULONG crColor() { return(pbp.pbr->crColor()); } COLORREF clrPen() { return(pbp.pbr->crColor()); } BOOL bIsPen() { return(pbp.pbr->bIsPen()); } BOOL bIsNull() { return(pbp.pbr->bIsNull()); } BOOL bIsGlobal() { return(pbp.pbr->bIsGlobal()); } BOOL bPalColors() { return(pbp.pbr->bPalColors()); } BOOL bPalIndices() { return(pbp.pbr->bPalIndices()); } BOOL bNeedFore() { return(pbp.pbr->bNeedFore()); } BOOL bNeedBack() { return(pbp.pbr->bNeedBack()); } BOOL bIsMasking() { return(pbp.pbr->bIsMasking()); } BOOL bCanDither() { return(pbp.pbr->bCanDither()); } VOID vEnableDither() { pbp.pbr->vEnableDither(); } VOID vDisableDither() { pbp.pbr->vDisableDither(); } ULONG iUsage() {return(pbp.pbr->iUsage());} VOID iUsage(ULONG ul) {pbp.pbr->iUsage(ul);} // Pen attributes: PFLOAT_LONG pstyle() { return(pbp.ppen->pstyle()); } ULONG cstyle() { return(pbp.ppen->cstyle()); } LONG lWidthPen() { return(pbp.ppen->lWidthPen()); } FLOATL l_eWidthPen() { return(pbp.ppen->l_eWidthPen()); } ULONG iEndCap() { return((ULONG) pbp.ppen->iEndCap()); } ULONG iJoin() { return((ULONG) pbp.ppen->iJoin()); } FLONG flStylePen() { return(pbp.ppen->flStylePen()); } BOOL bIsGeometric() { return(pbp.ppen->bIsGeometric()); } BOOL bIsCosmetic() { return(pbp.ppen->bIsCosmetic()); } BOOL bIsAlternate() { return(pbp.ppen->bIsAlternate()); } BOOL bIsUserStyled() { return(pbp.ppen->bIsUserStyled()); } BOOL bIsInsideFrame() { return(pbp.ppen->bIsInsideFrame()); } BOOL bIsOldStylePen() { return(pbp.ppen->bIsOldStylePen()); } BOOL bIsDefaultStyle() { return(pbp.ppen->bIsDefaultStyle()); } LONG lBrushStyle() { return(pbp.ppen->lBrushStyle());} ULONG_PTR lHatch() { return(pbp.ppen->lHatch());} // Set pen attributes: VOID vSetDefaultStyle() { pbp.ppen->vSetDefaultStyle(); } VOID vSetInsideFrame() { pbp.ppen->vSetInsideFrame(); } VOID vSetPen() { pbp.ppen->vSetPen(); } VOID vSetOldStylePen() { pbp.ppen->vSetOldStylePen(); } LONG lWidthPen(LONG l) { return(pbp.ppen->lWidthPen(l)); } FLOATL l_eWidthPen(FLOATL e){ return(pbp.ppen->l_eWidthPen(e)); } FLONG flStylePen(FLONG fl) { return(pbp.ppen->flStylePen(fl)); } ULONG iEndCap(ULONG ii) { return(pbp.ppen->iEndCap(ii)); } ULONG iJoin(ULONG ii) { return(pbp.ppen->iJoin(ii)); } ULONG cstyle(ULONG c) { return(pbp.ppen->cstyle(c)); } PFLOAT_LONG pstyle(PFLOAT_LONG pel) { return(pbp.ppen->pstyle(pel)); } LONG lBrushStyle (LONG l) {return(pbp.ppen->lBrushStyle(l));} ULONG_PTR lHatch (ULONG_PTR l) {return(pbp.ppen->lHatch(l));} }; /******************************Class***************************************\ * EBRUSHOBJ * * Finds/creates a physical realization of the given logical brush. * * History: * 8-Sep-1992 -by- Paul Butzi * Changed the basic hierarchy to something sensible. * * Wed 3-Feb-1992 -by- J. Andrew Goossen [andrewgo] * added extended pen support. * * 22-Feb-1992 -by- Patrick Haluptzok patrickh * Wrote it. \**************************************************************************/ class BBRUSHOBJ : public _BRUSHOBJ /* bbo */ { protected: COLORREF crRealize; // Desired Color to use in Realized brush. COLORREF crPaletteColor; // Quantaized Color after through the DC palette. public: BBRUSHOBJ() { pvRbrush = (PVOID) NULL; flColorType = 0; crPaletteColor = 0xffffffff; } COLORREF crRealized() { return(crRealize); } COLORREF crRealized(COLORREF clr) { return(crRealize = clr); } COLORREF crDCPalColor() { return(crPaletteColor); } COLORREF crDCPalColor(COLORREF clr) { return(crPaletteColor = clr); } }; class EBRUSHOBJ : public BBRUSHOBJ /* ebo */ { protected: // The following fields are required to realize the brush. We have to // keep pointers to the passed in objects in case we have to // realize and cache the brush when the driver calls us. PENGBRUSH pengbrush1; // pointer to engine's realization ULONG _ulSurfPalTime; // Surface palette time realization is for. ULONG _ulDCPalTime; // DC palette time realization is for. COLORREF crCurrentText1; // Current Text Color of Dest. COLORREF crCurrentBack1; // Current Background Color of Dest. COLORADJUSTMENT *pca; // Color adjustment for halftone brushes. HANDLE _hcmXform; // ICM transform handle LONG _lIcmMode; // ICM Mode from DC // The following fields are taken from the passed SURFOBJ, and DCOBJ. // We could keep pointers to those objects but we really don't want to do that // at this time SURFACE *psoTarg1; // Target surface XEPALOBJ palSurf1; // Target surface's palette XEPALOBJ palDC1; // Target DC's palette XEPALOBJ palMeta1; // Meta surface's palette ULONG _iMetaFormat; // Meta surface's dither format // In multi monitor system, Meta surface is not // same as target surface. Target surface (psoTarg1) // will be related with real target device in DDML. // Logical brush associated with this ebrushobj PBRUSH _pbrush; // useful fields cached from logical brush FLONG flAttrs; // flags ULONG _ulUnique; // brush uniqueness BOOL _bCanDither; // cache of original solid color before icm color translation COLORREF crRealizeOrignal; // set if IS_ICM_HOST(_lIcmMode) // The methods allowed for the brush object public: EBRUSHOBJ() { pengbrush1 = (PENGBRUSH) NULL; pvRbrush = (PVOID) NULL; flColorType = 0; _ulSurfPalTime = 0; _ulDCPalTime = 0; } ~EBRUSHOBJ() { vNuke(); } VOID vInit() { pengbrush1 = (PENGBRUSH) NULL; pvRbrush = (PVOID) NULL; flColorType = 0; } VOID vNuke(); VOID vInitBrush(PDC,PBRUSH, XEPALOBJ, XEPALOBJ, SURFACE*, BOOL = TRUE); VOID EBRUSHOBJ::vInitBrushSolidColor(PBRUSH, COLORREF, XEPALOBJ, XEPALOBJ, SURFACE *, BOOL = TRUE); ULONG ulSurfPalTime() { return(_ulSurfPalTime); } ULONG ulDCPalTime() { return(_ulDCPalTime); } ULONG ulSurfPalTime(ULONG ul) { return(_ulSurfPalTime = ul); } ULONG ulDCPalTime(ULONG ul) { return(_ulDCPalTime = ul); } ULONG ulUnique() { return(_ulUnique); } VOID vInvalidateUniqueness() { _ulUnique--; } SURFACE *psoTarg() { return((SURFACE *) psoTarg1); } SURFACE *psoTarg(SURFACE *pSurf) { return(psoTarg1 = pSurf);} XEPALOBJ palSurf() { return(palSurf1); } XEPALOBJ palSurf(XEPALOBJ ppal) { return(palSurf1 = ppal); } XEPALOBJ palDC() { return(palDC1); } XEPALOBJ palMeta() { return(palMeta1); } ULONG iMetaFormat() { return(_iMetaFormat); } PENGBRUSH pengbrush() { return(pengbrush1); } PENGBRUSH pengbrush(PENGBRUSH peng) { return(pengbrush1 = peng); } COLORREF crCurrentText() { return(crCurrentText1); } COLORREF crCurrentBack() { return(crCurrentBack1); } COLORREF crOrignal() { return(IS_ICM_HOST(_lIcmMode) ? crRealizeOrignal : crRealize); } COLORADJUSTMENT *pColorAdjustment() { return(pca); } VOID pColorAdjustment(COLORADJUSTMENT *pca_) { pca = pca_; } // MIX mixBest(jROP2, jBkMode) computes the correct mix mode to // be passed down to the driver, based on the DC's current ROP2 and // BkMode setting. // // Only when the brush is a hatched brush, and the background mode // is transparent, should the foreground mix (low byte of the mix) // ever be different from the background mix (next byte of the mix), // otherwise the call will inevitably get punted to the BltLinker/ // Stinker, which will do more work than it needs to: MIX mixBest(BYTE jROP2, BYTE jBkMode) { // jROP2 is pulled from the DC's shared attribute cache, which // since it's mapped writable into the application's address // space, can be overwritten by the application. Consequently, // we must do some validation here to ensure that we don't give // the driver a bogus MIX value. This is required because many // drivers do table look-ups based on the value. jROP2 = ((jROP2 - 1) & 0xf) + 1; // Note that this method can only be applied to a true EBRUSHOBJ // that has flAttrs set (as opposed to a BRUSHOBJ constructued // on the stack, for example): if ((jBkMode == TRANSPARENT) && (flAttrs & BR_IS_MASKING)) { return(((MIX) R2_NOP << 8) | jROP2); } else { return(((MIX) jROP2 << 8) | jROP2); } } BOOL bIsNull() { return(flAttrs & BR_IS_NULL); } PBRUSH pbrush() { return _pbrush; } BOOL bIsInsideFrame() { return(flAttrs & BR_IS_INSIDEFRAME); } BOOL bIsOldStylePen() { return(flAttrs & BR_IS_OLDSTYLEPEN); } BOOL bIsDefaultStyle() { return(flAttrs & BR_IS_DEFAULTSTYLE); } BOOL bIsSolid() { return(flAttrs & BR_IS_SOLID); } BOOL bIsMasking() { return(flAttrs & BR_IS_MASKING); } BOOL bIsMonochrome() { return(flAttrs & BR_IS_MONOCHROME); } BOOL bCareAboutFg() { return(flAttrs & BR_NEED_FG_CLR); } BOOL bCareAboutBg() { return(flAttrs & BR_NEED_BK_CLR); } HANDLE hcmXform() { return(_hcmXform); } VOID hcmXform(HANDLE h) { _hcmXform = h; } LONG lIcmMode() { return(_lIcmMode); } VOID lIcmMode(LONG l) { _lIcmMode = l; } BOOL bIsAppsICM() { return(IS_ICM_OUTSIDEDC(_lIcmMode)); } BOOL bIsHostICM() { return(IS_ICM_HOST(_lIcmMode)); } BOOL bIsDeviceICM() { return(IS_ICM_DEVICE(_lIcmMode)); } BOOL bIsCMYKColor() { return(bIsHostICM() && (_hcmXform != NULL) && (IS_CMYK_COLOR(_lIcmMode))); } BOOL bDeviceCalibrate() { return(IS_ICM_DEVICE_CALIBRATE(_lIcmMode)); } }; /*********************************Class************************************\ * BRUSHSELOBJ * * Class used for selecting, saving, restoring logical brushes in a DC. * * History: * 22-Feb-1992 -by- Patrick Haluptzok patrickh * Derive it off XEBRUSHOBJ. \**************************************************************************/ class BRUSHSELOBJ : public XEBRUSHOBJ /* bso */ { public: BRUSHSELOBJ(HBRUSH hbrush) { pbp.pbr = (BRUSH *)HmgShareCheckLock((HOBJ)hbrush, BRUSH_TYPE); } ~BRUSHSELOBJ() { if (pbp.pbr != PBRUSHNULL) { DEC_SHARE_REF_CNT(pbp.pbr); } } VOID vAltCheckLock(HBRUSH hbrush) { pbp.pbr = (BRUSH *)HmgShareCheckLock((HOBJ)hbrush, BRUSH_TYPE); } BOOL bReset(COLORREF cr, BOOL bPen); VOID vGlobal() { pbp.pbr->flAttrs(pbp.pbr->flAttrs() | BR_IS_GLOBAL | BR_IS_FIXEDSTOCK); } }; /*********************************Class************************************\ * BRUSHSELOBJAPI * * Class used for holding logical brushes from the API level. * We take an exclusive lock to prevent other threads from calling this * API. * History: * 05-Dec-2000 -by- Pravin Santiago pravins * Derive it off XEBRUSHOBJ. \**************************************************************************/ class BRUSHSELOBJAPI : public XEBRUSHOBJ /* bso */ { public: BRUSHSELOBJAPI(HBRUSH hbrush) { pbp.pbr = (BRUSH *)HmgLock((HOBJ)hbrush, BRUSH_TYPE); } ~BRUSHSELOBJAPI() { if (pbp.pbr != PBRUSHNULL) { DEC_EXCLUSIVE_REF_CNT(pbp.pbr); } } }; /*********************************Class************************************\ * BRUSHMEMOBJ * * Allocates RAM for a logical brush. * * History: * Wed 3-Feb-1992 -by- J. Andrew Goossen [andrewgo] * added extended pen support. * * Tue 21-May-1991 -by- Patrick Haluptzok [patrickh] * lot's of changes, additions. * * Wed 05-Dec-1990 18:02:17 -by- Walt Moore [waltm] * Added this nifty comment block for initial version. \**************************************************************************/ class BRUSHMEMOBJ : public XEBRUSHOBJ /* brmo */ { private: BOOL bKeep; // Keep object PBRUSH pbrAllocBrush(BOOL); // Allocates actual brush memory public: // Various constructors for the different type brushes BRUSHMEMOBJ() {pbp.pbr = (PBRUSH) NULL; bKeep = FALSE;} BRUSHMEMOBJ(COLORREF, ULONG, BOOL, BOOL); BRUSHMEMOBJ(HBITMAP hbmClone, HBITMAP hbmClient, BOOL bMono, FLONG flDIB, FLONG flType, BOOL bPen); ~BRUSHMEMOBJ() { if (pbp.pbr != PBRUSHNULL) { DEC_SHARE_REF_CNT(pbp.pbr); // // We always unlock it and then delete it if it's not a keeper. // This is so we clean up any cloned bitmaps or cached brushes. // if (!bKeep) bDeleteBrush(hbrush(),FALSE); pbp.pbr = PBRUSHNULL; } return; } VOID vKeepIt() { bKeep = TRUE; } VOID vGlobal() { pbp.pbr->flAttrs(pbp.pbr->flAttrs() | BR_IS_GLOBAL | BR_IS_FIXEDSTOCK); HmgSetOwner((HOBJ)hbrush(), OBJECT_OWNER_PUBLIC, BRUSH_TYPE); HmgMarkUndeletable((HOBJ) hbrush(), BRUSH_TYPE); } }; #define _BRUSHOBJ_HXX #endif