/*++ Copyright (c) 2000 Microsoft Corporation Module Name: gstate.cpp Abstract: PCL XL Graphics state manager Environment: Windows Whistler Revision History: 08/23/99 Created it. --*/ #include "xlpdev.h" #include "xldebug.h" #include "pclxle.h" #include "xlgstate.h" // // XLLine // // // Default setting of LineAttrs // const LINEATTRS gLineAttrs = { LA_GEOMETRIC, // fl JOIN_ROUND, // iJoin ENDCAP_ROUND, // iEndCap {FLOATL_IEEE_0_0F}, // elWidth FLOATL_IEEE_0_0F, // eMiterLimit 0, // cstyle (FLOAT_LONG*) NULL, // pstyle {FLOATL_IEEE_0_0F} // elStyleState }; const LINEATTRS *pgLineAttrs = &gLineAttrs; XLLine:: XLLine( VOID): /*++ Routine Description: XLLine constructor Arguments: Return Value: Note: --*/ m_dwGenFlags(0), m_LineAttrs(gLineAttrs) { #if DBG SetDbgLevel(GSTATEDBG); #endif XL_VERBOSE(("XLLine::CTor\n")); } XLLine:: ~XLLine( VOID) /*++ Routine Description: XLLine destructor Arguments: Return Value: Note: --*/ { XL_VERBOSE(("XLLine::DTor\n")); if ( NULL != m_LineAttrs.pstyle) { // // Free memory // MemFree(m_LineAttrs.pstyle); } } #if DBG VOID XLLine:: SetDbgLevel( DWORD dwLevel) /*++ Routine Description: Arguments: Return Value: Note: --*/ { m_dbglevel = dwLevel; } #endif VOID XLLine:: ResetLine( VOID) /*++ Routine Description: Arguments: Return Value: Note: --*/ { m_LineAttrs = gLineAttrs; } DWORD XLLine:: GetDifferentAttribute( IN LINEATTRS *plineattrs) /*++ Routine Description: Arguments: Return Value: Note: --*/ { DWORD dwRet; XL_VERBOSE(("XLLine::GetDifferentAttribute\n")); dwRet = XLLINE_NONE; if (NULL == plineattrs) { XL_ERR(("XLLine::GetDifferentAttribute: plineattrs == NULL.\n")); return dwRet; } if ( m_LineAttrs.fl != plineattrs->fl ) dwRet |= XLLINE_LINETYPE; if ( m_LineAttrs.iJoin != plineattrs->iJoin ) dwRet |= XLLINE_JOIN; if ( m_LineAttrs.iEndCap != plineattrs->iEndCap ) dwRet |= XLLINE_ENDCAP; if ( m_LineAttrs.elWidth.l != plineattrs->elWidth.l) dwRet |= XLLINE_WIDTH; if ( m_LineAttrs.eMiterLimit != plineattrs->eMiterLimit ) dwRet |= XLLINE_MITERLIMIT; if ( m_LineAttrs.cstyle != plineattrs->cstyle || plineattrs->cstyle != 0 && memcmp(m_LineAttrs.pstyle, plineattrs->pstyle, sizeof(FLOAT_LONG) * m_LineAttrs.cstyle) || m_LineAttrs.elStyleState.l != plineattrs->elStyleState.l ) dwRet |= XLLINE_STYLE; XL_VERBOSE(("XLLine::GetDifferentAttribute returns %08x.\n", dwRet)); return dwRet; } HRESULT XLLine:: SetLineType( IN XLLineType LineType ) /*++ Routine Description: Arguments: Return Value: None --*/ { XL_VERBOSE(("XLLine::SetLineType\n")); m_LineAttrs.fl = (FLONG)LineType; return S_OK; } HRESULT XLLine:: SetLineJoin( IN XLLineJoin LineJoin ) /*++ Routine Description: Arguments: Return Value: None --*/ { XL_VERBOSE(("XLLine::SetLineJoin\n")); m_LineAttrs.iJoin = (ULONG)LineJoin; return S_OK; } HRESULT XLLine:: SetLineEndCap( IN XLLineEndCap LineEndCap ) /*++ Routine Description: Arguments: Return Value: None --*/ { XL_VERBOSE(("XLLine::SetLineEndCap\n")); m_LineAttrs.iEndCap = (ULONG)LineEndCap; return S_OK; } HRESULT XLLine:: SetLineWidth( IN FLOAT_LONG elWidth ) /*++ Routine Description: Arguments: Return Value: Note: --*/ { XL_VERBOSE(("XLLine::SetLineWidth\n")); m_LineAttrs.elWidth = elWidth; return S_OK; } HRESULT XLLine:: SetMiterLimit( IN FLOATL eMiterLimit ) /*++ Routine Description: Arguments: Return Value: None --*/ { XL_VERBOSE(("XLLine::SetMiterLimit\n")); m_LineAttrs.eMiterLimit = eMiterLimit; return S_OK; } HRESULT XLLine:: SetLineStyle( IN ULONG ulCStyle, IN PFLOAT_LONG pStyle, IN FLOAT_LONG elStyleState ) /*++ Routine Description: Arguments: Return Value: None --*/ { XL_VERBOSE(("XLLine::SetLineStyle\n")); m_LineAttrs.elStyleState = elStyleState; // // Error check // Make sure the pointer is valid. // Make sure the the ulCStyle is valid, not ZERO. // if ( NULL == pStyle || 0 == ulCStyle ) { XL_VERBOSE(("XLLine::SetLineStyle: pStyle == NULL.\n")); if (NULL != m_LineAttrs.pstyle) { MemFree(m_LineAttrs.pstyle); } m_LineAttrs.pstyle = NULL; m_LineAttrs.cstyle = 0; return S_OK; } if ( m_LineAttrs.cstyle > 0 && NULL != m_LineAttrs.pstyle) { // // Free memory and reset. // MemFree(m_LineAttrs.pstyle); m_LineAttrs.pstyle = NULL; m_LineAttrs.cstyle = 0; } m_LineAttrs.pstyle = (PFLOAT_LONG) MemAlloc(ulCStyle * sizeof(FLOAT_LONG)); if ( NULL == m_LineAttrs.pstyle ) { m_LineAttrs.cstyle = 0; XL_ERR(("XLLine::SetLineStyle: Out of memory.\n")); return E_OUTOFMEMORY; } m_LineAttrs.cstyle = ulCStyle; memcpy( m_LineAttrs.pstyle, pStyle, ulCStyle * sizeof(FLOAT_LONG)); return S_OK; } // // Common Brush // Brush:: Brush( VOID) /*++ Routine Description: Arguments: Return Value: Note: --*/ { #if DBG SetDbgLevel(GSTATEDBG); #endif m_Brush.dwSig = BRUSH_SIGNATURE; m_Brush.BrushType = kNotInitialized; XL_VERBOSE(("Brush:: Ctor\n")); } Brush:: ~Brush( IN VOID) /*++ Routine Description: Arguments: Return Value: Note: --*/ { XL_VERBOSE(("Brush:: Dtor\n")); } #if DBG VOID Brush:: SetDbgLevel( DWORD dwLevel) /*++ Routine Description: Arguments: Return Value: Note: --*/ { m_dbglevel = dwLevel; } #endif VOID Brush:: ResetBrush( VOID) /*++ Routine Description: Arguments: Return Value: Note: --*/ { m_Brush.BrushType = kNotInitialized; } HRESULT Brush:: CheckCurrentBrush( IN BRUSHOBJ *pbo) /*+++ Routine Description This function checks if the current selected brush is same as the one specified in the parameter. Note pbo->iSolidColor == NOT_SOLID_COLOR { iHatch < HS_DDI_MAX CMNBRUSH (solid color, hatch pattern) --> kBrushTypeHatch iHatch >= HS_DDI_MAX CMNBRUSH pattern Brush --> kBrushTypePattern } pbo->iSolidColor != NOT_SOLID_COLOR { Solid color, solid pattern fill --> kBrushTypeSolid } List of members to check pbo->iSolidColor (Solid color ID or NOT_SOLID_COLOR) lHatch (HS_XXX or >= HS_MAX_ID) dwColor (BRUSHOBJ_ulGetBrushColor(pbo)) psoPattern bitmap Return value S_FALSE if the specified brush is different from the current selected. S_OK if the specified brush is same as the curren one. ---*/ { HRESULT lrRet; XL_VERBOSE(("Brush::CheckCurrentBrush\n")); // // Error check: parameter // if (NULL == pbo && m_Brush.BrushType != kNoBrush || m_Brush.BrushType == kNotInitialized ) { XL_VERBOSE(("Brush::CheckCurrentBrush: Set NULL Brush (pbo==NULL)\n")); return S_FALSE; } lrRet = S_OK; switch ( m_Brush.BrushType ) { case kNoBrush: if (pbo != NULL) lrRet = S_FALSE; XL_VERBOSE(("Brush::CheckCurrentBrush: kNoBrush:%d\n", lrRet)); break; case kBrushTypeSolid: // // 1. Check the brush type. // 2. Check solid color. // if ( pbo->iSolidColor != m_Brush.ulSolidColor || BRUSHOBJ_ulGetBrushColor(pbo) != m_Brush.dwColor ) lrRet = S_FALSE; XL_VERBOSE(("Brush::CheckCurrentBrush: kBrushTyepSolid:%d\n", lrRet)); break; case kBrushTypeHatch: // // 1. Check the brush type. // 2. Check hatch type. // 3. Check color. // if (pbo->iSolidColor == NOT_SOLID_COLOR) { XLBRUSH *pBrush = (XLBRUSH*)BRUSHOBJ_pvGetRbrush(pbo); ULONG ulHatch = 0; if (NULL != pBrush) { if (pBrush->dwSig != XLBRUSH_SIG) { lrRet = E_UNEXPECTED; XL_ERR(("Brush::CheckCurrentBrush: BRUSHOBJ_pvGetRbrush returned invalid BRUSH.\n")); break; } ulHatch = pBrush->dwHatch; if ( NOT_SOLID_COLOR != m_Brush.ulSolidColor || ulHatch != m_Brush.ulHatch || pbo->iSolidColor != m_Brush.ulSolidColor || pBrush->dwColor != m_Brush.dwColor ) { lrRet = S_FALSE; } } else { // // GDI requests to set solid color or NULL brush. // XL_ERR(("Brush::CheckCurrentBrush: BRUSHOBJ_pvGetRbrush returned NULL.\n")); lrRet = S_FALSE; } XL_VERBOSE(("Brush::CheckCurrentBrush: kBrushTypeHatch:ID(%d),%d\n", ulHatch, lrRet)); } else lrRet = S_FALSE; break; case kBrushTypePattern: // // 1. Check brush type. // 2. Check pattern brush. // if (pbo->iSolidColor == NOT_SOLID_COLOR) { XLBRUSH *pBrush = (XLBRUSH*)BRUSHOBJ_pvGetRbrush(pbo); if (NULL != pBrush) { if (pBrush->dwSig != XLBRUSH_SIG) { lrRet = E_UNEXPECTED; XL_ERR(("Brush::CheckCurrentBrush: BRUSHOBJ_pvGetRbrush returned invalid BRUSH.\n")); break; } if ( NOT_SOLID_COLOR == m_Brush.ulSolidColor || m_Brush.dwPatternBrushID != pBrush->dwPatternID) { lrRet = S_FALSE; } } else { // // GDI requests to set solid color or NULL brush. // lrRet = S_FALSE; } } else { lrRet = S_FALSE; } XL_VERBOSE(("Brush::CheckCurrentBrush: kBrushTypePattern:%d\n", lrRet)); break; } return lrRet; } HRESULT Brush:: SetBrush( IN CMNBRUSH *pBrush) /*+++ Routine Description This function sets if the current selected brush is same as the one specified in the parameter. ---*/ { HRESULT lrRet; XL_VERBOSE(("Brush::SetBrush\n")); // // Error check: Parameter // if ( NULL == pBrush ) { XL_ERR(("Brush::SetBrush: pBrush is NULL.\n")); return E_UNEXPECTED; } m_Brush.BrushType = pBrush->BrushType; m_Brush.ulSolidColor = pBrush->ulSolidColor; m_Brush.ulHatch = pBrush->ulHatch; m_Brush.dwCEntries = pBrush->dwCEntries; m_Brush.dwColor = pBrush->dwColor; m_Brush.dwPatternBrushID = pBrush->dwPatternBrushID; return S_OK; } // // XLClip // XLClip:: XLClip( VOID): /*++ Routine Description: Arguments: Return Value: Note: --*/ m_ClipType(kNoClip) { #if DBG SetDbgLevel(GSTATEDBG); #endif m_XLClip.dwSig = CLIP_SIGNATURE; XL_VERBOSE(("XLClip:: Ctor\n")); } XLClip:: ~XLClip( VOID) /*++ Routine Description: Arguments: Return Value: Note: --*/ { XL_VERBOSE(("XLClip:: Dtor\n")); } #if DBG VOID XLClip:: SetDbgLevel( DWORD dwLevel) /*++ Routine Description: Arguments: Return Value: Note: --*/ { m_dbglevel = dwLevel; } #endif HRESULT XLClip:: ClearClip( VOID) /*++ Routine Description: Arguments: Return Value: Note: --*/ { XL_VERBOSE(("XLClip::ClearClip\n")); m_ClipType = kNoClip; return S_OK; } HRESULT XLClip:: CheckClip( IN CLIPOBJ *pco) /*++ Routine Description: Arguments: Return Value: Note: --*/ { HRESULT lrRet = S_OK; XL_VERBOSE(("XLClip::CheckClip\n")); // // Error check: Parameter // if (!pco) { // // It is not necessary to clip if pco is NULL. // XL_VERBOSE(("XLClip::CheckClip: pco == NULL.\n")); if (kNoClip != m_ClipType) lrRet = S_FALSE; } else { switch (pco->iDComplexity) { case DC_TRIVIAL: if ( m_ClipType != kNoClip ) lrRet = S_FALSE; XL_VERBOSE(("XLClip::Type: DC_TRIVIAL:%d\n", lrRet)); break; case DC_RECT: if ( m_ClipType != kClipTypeRectangle || m_XLClip.rclClipRect.left != pco->rclBounds.left || m_XLClip.rclClipRect.right != pco->rclBounds.right || m_XLClip.rclClipRect.top != pco->rclBounds.top || m_XLClip.rclClipRect.bottom != pco->rclBounds.bottom ) lrRet = S_FALSE; XL_VERBOSE(("XLClip::Type: DC_RECT:%d\n", lrRet)); break; case DC_COMPLEX: #if 0 // It seems like we can't rely on iUniq. // Always sends complex clip path. if ( m_ClipType != kClipTypeComplex || m_XLClip.ulUniq == 0 || pco->iUniq == 0 || m_XLClip.ulUniq != pco->iUniq ) lrRet = S_FALSE; #else lrRet = S_FALSE; #endif XL_VERBOSE(("XLClip::Type: DC_COMPLEX\n", lrRet)); break; default: if ( m_ClipType != kNoClip ) lrRet = S_FALSE; XL_VERBOSE(("XLClip::Type: DC_TRIVIAL:%d\n", lrRet)); } } return lrRet; } HRESULT XLClip:: SetClip( IN CLIPOBJ *pco) /*++ Routine Description: Arguments: Return Value: Note: --*/ { HRESULT lrRet; XL_VERBOSE(("XLClip::SetClip\n")); // // Error check: Parameter // if (!pco) { // // It is not necessary to clip if pco is NULL. // XL_VERBOSE(("XLClip::SetClip: pco == NULL.\n")); return E_UNEXPECTED; } switch (pco->iDComplexity) { case DC_TRIVIAL: XL_VERBOSE(("XLClip::SetClip Type: DC_TRIVIAL\n")); m_ClipType = kNoClip; lrRet = S_OK; break; case DC_RECT: XL_VERBOSE(("XLClip::SetClip Type: DC_RECT\n")); m_ClipType = kClipTypeRectangle; m_XLClip.rclClipRect.left = pco->rclBounds.left; m_XLClip.rclClipRect.right = pco->rclBounds.right; m_XLClip.rclClipRect.top = pco->rclBounds.top; m_XLClip.rclClipRect.bottom = pco->rclBounds.bottom; lrRet = S_OK; break; case DC_COMPLEX: XL_VERBOSE(("XLClip::SetClip Type: DC_COMPLEX\n")); m_ClipType = kClipTypeComplex; m_XLClip.ulUniq = pco->iUniq; lrRet = S_OK; break; default: XL_ERR(("XLClip::SetClip: Unexpected iDCompelxity\n")); m_ClipType = kNoClip; lrRet = E_UNEXPECTED; } return lrRet; } // // XLRop // XLRop:: XLRop( VOID): /*++ Routine Description: Arguments: Return Value: Note: --*/ m_rop3(0xCC) // SRCCPY { #if DBG SetDbgLevel(GSTATEDBG); #endif XL_VERBOSE(("XLRop:: Ctor\n")); } XLRop:: ~XLRop( VOID) /*++ Routine Description: Arguments: Return Value: Note: --*/ { XL_VERBOSE(("XLRop:: Dtor\n")); } #if DBG VOID XLRop:: SetDbgLevel( DWORD dwLevel) /*++ Routine Description: Arguments: Return Value: Note: --*/ { m_dbglevel = dwLevel; } #endif HRESULT XLRop:: CheckROP3( IN ROP3 rop3 ) /*++ Routine Description: Arguments: Return Value: Note: --*/ { HRESULT lrRet; XL_VERBOSE(("XLRop::CheckROP3\n")); if (rop3 != m_rop3) lrRet = S_FALSE; else lrRet = S_OK; return lrRet; } HRESULT XLRop:: SetROP3( IN ROP3 rop3 ) /*++ Routine Description: Arguments: Return Value: Note: --*/ { XL_VERBOSE(("XLRop::SetROP3\n")); m_rop3 = rop3; return S_OK; } XLFont:: XLFont( VOID) /*++ Routine Description: Arguments: Return Value: Note: --*/ { #if DBG SetDbgLevel(GSTATEDBG); #endif XL_VERBOSE(("XLFont::CTor\n")); ResetFont(); } XLFont:: ~XLFont( VOID) /*++ Routine Description: Arguments: Return Value: Note: --*/ { XL_VERBOSE(("XLFont::DTor\n")); } #if DBG VOID XLFont:: SetDbgLevel( DWORD dwLevel) /*++ Routine Description: Arguments: Return Value: Note: --*/ { m_dbglevel = dwLevel; } #endif VOID XLFont:: ResetFont( VOID) /*++ Routine Description: Arguments: Return Value: Note: --*/ { m_XLFontType = kFontNone; m_aubFontName[0] = (BYTE) NULL; m_dwFontHeight = 0; m_dwFontWidth = 0; m_dwFontSymbolSet = 0; m_dwFontSimulation = 0; } HRESULT XLFont:: CheckCurrentFont( FontType XLFontType, PBYTE pPCLXLFontName, DWORD dwFontHeight, DWORD dwFontWidth, DWORD dwFontSymbolSet, DWORD dwFontSimulation) /*++ Routine Description: Arguments: Return Value: Note: --*/ { HRESULT lrRet = S_OK; XL_VERBOSE(("XLFont::CheckCurrentFont\n")); switch (XLFontType) { case kFontNone: lrRet = S_FALSE; break; case kFontTypeDevice: ASSERT((pPCLXLFontName)); if (m_XLFontType == kFontTypeDevice || strcmp((CHAR*)pPCLXLFontName, (CHAR*)m_aubFontName) || dwFontHeight != m_dwFontHeight || dwFontWidth != m_dwFontWidth || dwFontSymbolSet != m_dwFontSymbolSet) lrRet = S_FALSE; break; case kFontTypeTTBitmap: ASSERT((pPCLXLFontName)); if (m_XLFontType == kFontTypeTTBitmap || strcmp((CHAR*)pPCLXLFontName, (CHAR*)m_aubFontName)) lrRet = S_FALSE; break; case kFontTypeTTOutline: ASSERT((pPCLXLFontName)); if (m_XLFontType == kFontTypeTTOutline || strcmp((CHAR*)pPCLXLFontName, (CHAR*)m_aubFontName) || dwFontHeight != m_dwFontHeight || dwFontWidth != m_dwFontWidth || dwFontSymbolSet != m_dwFontSymbolSet || dwFontSimulation != m_dwFontSimulation ) lrRet = S_FALSE; break; default: XL_ERR(("XLFont::CheckCurrentFont: Invalid font type.\n")); lrRet = E_UNEXPECTED; break; } return lrRet; } HRESULT XLFont:: SetFont( FontType XLFontType, PBYTE pPCLXLFontName, DWORD dwFontHeight, DWORD dwFontWidth, DWORD dwFontSymbolSet, DWORD dwFontSimulation) /*++ Routine Description: Set font in GState. Arguments: XLFontType - FontType enum, Font type (Device/TTBitmap/TTOutline) pPCLXLFontName - XL font name (base name + attributes) dwFontHeight - Font height dwFontWidth - Font width dwFontSymbolSet - Font's symbol set dwFontSimulation - Font attributes (Bold/Italic) Return Value: Note: --*/ { HRESULT lrRet; XL_VERBOSE(("XLFont::SetFont\n")); switch (XLFontType) { case kFontTypeDevice: case kFontTypeTTOutline: case kFontTypeTTBitmap: ASSERT(pPCLXLFontName); m_XLFontType = XLFontType; CopyMemory(m_aubFontName, pPCLXLFontName, PCLXL_FONTNAME_SIZE); m_aubFontName[PCLXL_FONTNAME_SIZE] = NULL; m_dwFontHeight = dwFontHeight; m_dwFontWidth = dwFontWidth; m_dwFontSymbolSet = dwFontSymbolSet; m_dwFontSimulation = dwFontSimulation; lrRet = S_OK; break; default: XL_ERR(("XLFont::CheckCurrentFont: Invalid font type.\n")); lrRet = E_UNEXPECTED; break; } return lrRet; } HRESULT XLFont:: GetFontName( PBYTE paubFontName) /*++ Routine Description: Returns current selected font base name. Arguments: Return Value: Note: --*/ { XL_VERBOSE(("XLFont::GetFontName\n")); if (NULL == paubFontName) { XL_ERR(("GetFontName: Invalid fontname pointer\n")); return E_UNEXPECTED; } // // Assumption: paubFontName is an array of 16 + 1 bytes. // CopyMemory(paubFontName, m_aubFontName, PCLXL_FONTNAME_SIZE); paubFontName[PCLXL_FONTNAME_SIZE] = NULL; return S_OK; } FontType XLFont:: GetFontType(VOID) /*++ Routine Description: Returns current font's type. Arguments: Return Value: Note: --*/ { XL_VERBOSE(("XLFont::GetFontType\n")); return m_XLFontType; } DWORD XLFont:: GetFontHeight(VOID) /*++ Routine Description: Returns current font's height. Arguments: Return Value: Note: --*/ { XL_VERBOSE(("XLFont::GetFontHeight\n")); return m_dwFontHeight; } DWORD XLFont:: GetFontWidth(VOID) /*++ Routine Description: Arguments: Return Value: Note: --*/ { XL_VERBOSE(("XLFont::GetFontWidth\n")); return m_dwFontWidth; } DWORD XLFont:: GetFontSymbolSet(VOID) /*++ Routine Description: Return font symbol set. Arguments: Return Value: Note: --*/ { XL_VERBOSE(("XLFont::GetFontSymbolSet\n")); return m_dwFontSymbolSet; } DWORD XLFont:: GetFontSimulation(VOID) /*++ Routine Description: Return current font simulation. Arguments: Return Value: Note: --*/ { XL_VERBOSE(("XLFont::GetFontSimulation\n")); return m_dwFontSimulation; } // // XLTxMode // XLTxMode:: XLTxMode() :m_SourceTxMode(eNotSet), m_PaintTxMode(eNotSet) { #if DBG SetDbgLevel(GSTATEDBG); #endif XL_VERBOSE(("XLTxMode::CTor\n")); } XLTxMode:: ~XLTxMode() { XL_VERBOSE(("XLTxMode::DTor\n")); } HRESULT XLTxMode:: SetSourceTxMode( TxMode SrcTxMode) { XL_VERBOSE(("XLTxMode::SetSourceTxMode\n")); m_SourceTxMode = SrcTxMode; return S_OK; } HRESULT XLTxMode:: SetPaintTxMode( TxMode PaintTxMode) { XL_VERBOSE(("XLTxMode::SetPaintTxMode\n")); m_PaintTxMode = PaintTxMode; return S_OK; } TxMode XLTxMode:: GetSourceTxMode() { XL_VERBOSE(("XLTxMode::GetSourceTxMode\n")); return m_SourceTxMode; } TxMode XLTxMode:: GetPaintTxMode() { XL_VERBOSE(("XLTxMode::GetPaintTxMode\n")); return m_PaintTxMode; } #if DBG VOID XLTxMode:: SetDbgLevel( DWORD dwLevel) /*++ Routine Description: Arguments: Return Value: Note: --*/ { m_dbglevel = dwLevel; } #endif // // XLGState // VOID XLGState:: ResetGState( VOID) /*++ Routine Description: Reset Graphics State. Arguments: Return Value: Note: ROP3 is set to SRCPY(0xCC) --*/ { XLLine *pXLine = this; pXLine->ResetLine(); XLBrush *pXBrush = this; pXBrush->ResetBrush(); XLPen *pXPen = this; pXPen->ResetBrush(); XLClip *pXClip = this; pXClip->ClearClip(); // // Set CC (SrcCopy) // XLRop *pXRop = this; pXRop->SetROP3(0xCC); XLFont *pXFont = this; pXFont->ResetFont(); XLTxMode *pXLTxMode = this; pXLTxMode->SetSourceTxMode(eNotSet); pXLTxMode->SetPaintTxMode(eNotSet); } #if DBG VOID XLGState:: SetAllDbgLevel( DWORD dwLevel) /*++ Routine Description: Set debug level in all classes. Arguments: Return Value: Note: --*/ { XLLine *pXLine = this; pXLine->SetDbgLevel(dwLevel); XLBrush *pXBrush = this; pXBrush->SetDbgLevel(dwLevel); XLPen *pXPen = this; pXPen->SetDbgLevel(dwLevel); XLClip *pXClip = this; pXClip->SetDbgLevel(dwLevel); XLRop *pXRop = this; pXRop->SetDbgLevel(dwLevel); XLFont *pXFont = this; pXFont->SetDbgLevel(dwLevel); XLTxMode *pTxMode = this; pTxMode->SetDbgLevel(dwLevel); } #endif