/******************************Module*Header*******************************\ * Module Name: ldc.c * * GDI functions that are handled on the client side. * * Created: 05-Jun-1991 01:45:21 * Author: Charles Whitmer [chuckwh] * * Copyright (c) 1991-1999 Microsoft Corporation \**************************************************************************/ #include "precomp.h" #pragma hdrstop #include "wowgdip.h" #define MIRRORED_DC(pDcAttr) (pDcAttr->dwLayout & LAYOUT_RTL) BOOL MF16_RecordParms2( HDC hdc, int parm2, WORD Func); /******************************Public*Routine****************************** * GetAndSetDCDWord( HDC, UINT, UINT, UINT, UINT, UINT ) * * Gerrit van Wingerden [gerritv] * 11-9-94 Wrote It. * **************************************************************************/ DWORD GetAndSetDCDWord( HDC hdc, UINT uIndex, UINT uValue, UINT uEmr, WORD wEmr16, UINT uError ) { DWORD uRet=0; DWORD retData; // Metafile the call. if( IS_ALTDC_TYPE(hdc) && ( uEmr != EMR_MAX+1 ) ) { PLDC pldc; if (IS_METADC16_TYPE(hdc)) return(MF16_RecordParmsD(hdc,uValue,wEmr16)); DC_PLDC(hdc,pldc,uError) if (pldc->iType == LO_METADC) { if (!MF_SetD(hdc,(DWORD)uValue,uEmr)) return(uRet); } } uRet = NtGdiGetAndSetDCDword(hdc, uIndex, uValue, &retData); return (( uRet ) ? retData : uError); } /******************************Public*Routine******************************\ * SetBkMode * * Arguments: * * hdc - DC handle * iMode - new mode * * Return Value: * * Old mode value or 0 for failure * \**************************************************************************/ int META APIENTRY SetBkMode( HDC hdc, int iMode ) { int iModeOld = 0; PDC_ATTR pDcAttr; FIXUP_HANDLE(hdc); if( IS_ALTDC_TYPE(hdc) ) { PLDC pldc; if (IS_METADC16_TYPE(hdc)) return(MF16_RecordParmsD(hdc,iMode,META_SETBKMODE)); DC_PLDC(hdc,pldc,iModeOld) if (pldc->iType == LO_METADC) { if (!MF_SetD(hdc,(DWORD)iMode,EMR_SETBKMODE)) return(iModeOld); } } PSHARED_GET_VALIDATE(pDcAttr,hdc,DC_TYPE); if (pDcAttr) { iModeOld = pDcAttr->lBkMode; pDcAttr->jBkMode = (iMode == OPAQUE) ? OPAQUE : TRANSPARENT; pDcAttr->lBkMode = iMode; } else { GdiSetLastError(ERROR_INVALID_PARAMETER); } return(iModeOld); } /******************************Public*Routine******************************\ * SetPolyFillMode * * Arguments: * * hdc - DC handle * iMode - new mode * * Return Value: * * Old mode value or 0 for failure * \**************************************************************************/ int META APIENTRY SetPolyFillMode(HDC hdc,int iMode) { int iModeOld = 0; PDC_ATTR pDcAttr; FIXUP_HANDLE(hdc); if( IS_ALTDC_TYPE(hdc) ) { PLDC pldc; if (IS_METADC16_TYPE(hdc)) return(MF16_RecordParmsD(hdc,iMode,META_SETPOLYFILLMODE)); DC_PLDC(hdc,pldc,iModeOld) if (pldc->iType == LO_METADC) { if (!MF_SetD(hdc,(DWORD)iMode,EMR_SETPOLYFILLMODE)) return(iModeOld); } } PSHARED_GET_VALIDATE(pDcAttr,hdc,DC_TYPE); if (pDcAttr) { CHECK_AND_FLUSH(hdc, pDcAttr); iModeOld = pDcAttr->lFillMode; pDcAttr->jFillMode = (iMode == WINDING) ? WINDING : ALTERNATE; pDcAttr->lFillMode = iMode; } else { GdiSetLastError(ERROR_INVALID_PARAMETER); } return(iModeOld); } /******************************Public*Routine******************************\ * SetROP2 * * Arguments: * * hdc - DC handle * iMode - new mode * * Return Value: * * Old mode value or 0 for failure * \**************************************************************************/ int META APIENTRY SetROP2(HDC hdc,int iMode) { int iOldROP2 = 0; PDC_ATTR pDcAttr; FIXUP_HANDLE(hdc); if( IS_ALTDC_TYPE(hdc) ) { PLDC pldc; if (IS_METADC16_TYPE(hdc)) return(MF16_RecordParmsD(hdc,iMode,META_SETROP2)); DC_PLDC(hdc,pldc,iOldROP2) if (pldc->iType == LO_METADC) { if (!MF_SetD(hdc,(DWORD)iMode,EMR_SETROP2)) return(iOldROP2); } } PSHARED_GET_VALIDATE(pDcAttr,hdc,DC_TYPE); if (pDcAttr) { CHECK_AND_FLUSH(hdc, pDcAttr); iOldROP2 = pDcAttr->jROP2; pDcAttr->jROP2 = (BYTE)iMode; } else { GdiSetLastError(ERROR_INVALID_PARAMETER); } return(iOldROP2); } /******************************Public*Routine******************************\ * SetStretchBltMode * * Arguments: * * hdc - DC handle * iMode - new mode * * Return Value: * * Old mode value or 0 for failure * \**************************************************************************/ int META APIENTRY SetStretchBltMode(HDC hdc,int iMode) { int iModeOld = 0; PDC_ATTR pDcAttr; FIXUP_HANDLE(hdc); if( IS_ALTDC_TYPE(hdc) ) { PLDC pldc; if (IS_METADC16_TYPE(hdc)) return(MF16_RecordParmsD(hdc,iMode,META_SETSTRETCHBLTMODE)); DC_PLDC(hdc,pldc,iModeOld) if (pldc->iType == LO_METADC) { if (!MF_SetD(hdc,(DWORD)iMode,EMR_SETSTRETCHBLTMODE)) return(iModeOld); } } PSHARED_GET_VALIDATE(pDcAttr,hdc,DC_TYPE); if (pDcAttr) { iModeOld = pDcAttr->lStretchBltMode; pDcAttr->lStretchBltMode = iMode; if ((iMode <= 0) || (iMode > MAXSTRETCHBLTMODE)) { iMode = (DWORD) WHITEONBLACK; } pDcAttr->jStretchBltMode = (BYTE)iMode; } else { GdiSetLastError(ERROR_INVALID_PARAMETER); } return(iModeOld); } /******************************Public*Routine******************************\ * SetTextAlign * * Arguments: * * hdc - DC handle * iMode - new mode * * Return Value: * * Old mode value or 0 for failure * \**************************************************************************/ UINT META APIENTRY SetTextAlign(HDC hdc,UINT iMode) { int iModeOld = GDI_ERROR; PDC_ATTR pDcAttr; FIXUP_HANDLE(hdc); if( IS_ALTDC_TYPE(hdc) ) { PLDC pldc; if (IS_METADC16_TYPE(hdc)) return(MF16_RecordParmsD(hdc,iMode,META_SETTEXTALIGN)); DC_PLDC(hdc,pldc,iModeOld) if (pldc->iType == LO_METADC) { if (!MF_SetD(hdc,(DWORD)iMode,EMR_SETTEXTALIGN)) return(iModeOld); } } PSHARED_GET_VALIDATE(pDcAttr,hdc,DC_TYPE); if (pDcAttr) { iModeOld = pDcAttr->lTextAlign; pDcAttr->lTextAlign = iMode; if (MIRRORED_DC(pDcAttr) && (iMode & TA_CENTER) != TA_CENTER) { iMode = iMode ^ TA_RIGHT; } pDcAttr->flTextAlign = iMode & (TA_UPDATECP | TA_CENTER | TA_BASELINE); } else { GdiSetLastError(ERROR_INVALID_PARAMETER); } return(iModeOld); } /******************************Public*Routine******************************\ * SetRelAbs (hdc,iMode) * * Client side attribute setting routine. * * History: * 5-11-94 -by- Lingyun Wang [lingyunw] * Moved client side attr to server side * * 09-Jun-1992 -by- Eric Kutter [erick] * Wrote it. \**************************************************************************/ int APIENTRY SetRelAbs(HDC hdc,int iMode) { FIXUP_HANDLE(hdc); return((int) GetAndSetDCDWord( hdc, GASDDW_RELABS, iMode, EMR_MAX+1, EMR_MAX+1, 0 )); } /******************************Public*Routine******************************\ * SetTextCharacterExtra (hdc,dx) * * Client side attribute setting routine. * * 5-11-94 -by- Lingyun Wang [lingyunw] * Moved client side attr to server side * * Sat 08-Jun-1991 00:53:45 -by- Charles Whitmer [chuckwh] * Wrote it. \**************************************************************************/ int META APIENTRY SetTextCharacterExtra(HDC hdc,int dx) { int iRet = 0x80000000L; PDC_ATTR pDcAttr; FIXUP_HANDLE(hdc); // Validate the spacing. if (dx == 0x80000000) { GdiSetLastError(ERROR_INVALID_PARAMETER); return(iRet); } // Metafile the call for 16-bit only. // For enhanced metafiles, the extras are included in the textout records. if (IS_METADC16_TYPE(hdc)) return(MF16_RecordParms2(hdc,dx,META_SETTEXTCHAREXTRA)); PSHARED_GET_VALIDATE(pDcAttr,hdc,DC_TYPE); if (pDcAttr) { CHECK_AND_FLUSH_TEXT(hdc, pDcAttr); iRet = pDcAttr->lTextExtra; pDcAttr->lTextExtra = dx; } else { GdiSetLastError(ERROR_INVALID_PARAMETER); } return (iRet); } /******************************Public*Routine******************************\ * SetTextColor * * Arguments: * * hdc - DC handle * color - new color * * Return Value: * * Old mode value or 0 for failure * \**************************************************************************/ COLORREF META APIENTRY SetTextColor(HDC hdc,COLORREF color) { COLORREF crRet = CLR_INVALID; PDC_ATTR pdcattr; FIXUP_HANDLE(hdc); if( IS_ALTDC_TYPE(hdc) ) { PLDC pldc; if (IS_METADC16_TYPE(hdc)) return(MF16_RecordParmsD(hdc,color,META_SETTEXTCOLOR)); DC_PLDC(hdc,pldc,crRet) if (pldc->iType == LO_METADC) { CHECK_COLOR_PAGE(pldc,color); if (!MF_SetD(hdc,(DWORD)color,EMR_SETTEXTCOLOR)) return(crRet); } } PSHARED_GET_VALIDATE(pdcattr,hdc,DC_TYPE); if (pdcattr) { crRet = pdcattr->ulForegroundClr; pdcattr->ulForegroundClr = color; color &= 0x13ffffff; if (!(color & 0x01000000) && bNeedTranslateColor(pdcattr)) { COLORREF NewColor; BOOL bStatus = IcmTranslateCOLORREF(hdc, pdcattr, color, &NewColor, ICM_FORWARD); if (bStatus) { color = NewColor; } } if (pdcattr->crForegroundClr != color) { pdcattr->crForegroundClr = color; pdcattr->ulDirty_ |= (DIRTY_FILL|DIRTY_LINE|DIRTY_TEXT); } } else { GdiSetLastError(ERROR_INVALID_PARAMETER); } return(crRet); } /******************************Public*Routine******************************\ * SetBkColor * * Arguments: * * hdc - DC handle * color - new color * * Return Value: * * Old mode value or 0 for failure * \**************************************************************************/ COLORREF META APIENTRY SetBkColor(HDC hdc,COLORREF color) { COLORREF crRet = CLR_INVALID; PDC_ATTR pdcattr; FIXUP_HANDLE(hdc); if( IS_ALTDC_TYPE(hdc) ) { PLDC pldc; if (IS_METADC16_TYPE(hdc)) return(MF16_RecordParmsD(hdc,color,META_SETBKCOLOR)); DC_PLDC(hdc,pldc,crRet) if (pldc->iType == LO_METADC) { CHECK_COLOR_PAGE(pldc,color); if (!MF_SetD(hdc,(DWORD)color,EMR_SETBKCOLOR)) return(crRet); } } PSHARED_GET_VALIDATE(pdcattr,hdc,DC_TYPE); if (pdcattr) { // // set app specified color // crRet = pdcattr->ulBackgroundClr; pdcattr->ulBackgroundClr = color; color &= 0x13ffffff; // // check icm if not PALINDEX // if (!(color & 0x01000000) && bNeedTranslateColor(pdcattr)) { COLORREF NewColor; BOOL bStatus = IcmTranslateCOLORREF(hdc, pdcattr, color, &NewColor, ICM_FORWARD); if (bStatus) { color = NewColor; } } if (color != pdcattr->crBackgroundClr) { pdcattr->crBackgroundClr = color; pdcattr->ulDirty_ |= (DIRTY_FILL|DIRTY_LINE|DIRTY_BACKGROUND); } } else { GdiSetLastError(ERROR_INVALID_PARAMETER); } return(crRet); } /******************************Public*Routine******************************\ * SetDCBrushColor * * Arguments: * * hdc - DC handle * color - new color * * Return Value: * * Old mode value or 0 for failure * * History : * * Feb.16.1997 -by- Hideyuki Nagase [hideyukn] * ICM-aware version. \**************************************************************************/ COLORREF META APIENTRY SetDCBrushColor(HDC hdc,COLORREF color) { COLORREF crRet = CLR_INVALID; PDC_ATTR pdcattr; FIXUP_HANDLE(hdc); PSHARED_GET_VALIDATE(pdcattr,hdc,DC_TYPE); if (pdcattr) { if (IS_ALTDC_TYPE(hdc)) { if (!IS_METADC16_TYPE(hdc)) { PLDC pldc; DC_PLDC(hdc,pldc,crRet); if (pldc->iType == LO_METADC) { CHECK_COLOR_PAGE(pldc,color); if (pdcattr->hbrush == ghbrDCBrush) { BOOL bRet = FALSE; HBRUSH hbr = CreateSolidBrush (color); if (hbr != NULL) { // If there is an old DCbrush, delete it now if (pldc->oldSetDCBrushColorBrush) DeleteObject (pldc->oldSetDCBrushColorBrush); bRet = MF_SelectAnyObject (hdc, hbr, EMR_SELECTOBJECT); // Store the new tmp DC brush in the LDC. pldc->oldSetDCBrushColorBrush = hbr; } if (!bRet) return (CLR_INVALID); } } } } // // set app specified color // crRet = pdcattr->ulDCBrushClr; pdcattr->ulDCBrushClr = color; color &= 0x13ffffff; // // check icm if not PALINDEX // if (!(color & 0x01000000) && bNeedTranslateColor(pdcattr)) { COLORREF NewColor; BOOL bStatus = IcmTranslateCOLORREF(hdc, pdcattr, color, &NewColor, ICM_FORWARD); if (bStatus) { color = NewColor; } } if (color != pdcattr->crDCBrushClr) { pdcattr->crDCBrushClr = color; pdcattr->ulDirty_ |= DIRTY_FILL; } } else { GdiSetLastError(ERROR_INVALID_PARAMETER); } return(crRet); } /******************************Public*Routine******************************\ * GetDCBrushColor * * Arguments: * * hdc - DC handle * * Return Value: * * Old mode value or 0 for failure * \**************************************************************************/ COLORREF META APIENTRY GetDCBrushColor(HDC hdc) { COLORREF crRet = CLR_INVALID; PDC_ATTR pDcAttr; FIXUP_HANDLE(hdc); PSHARED_GET_VALIDATE(pDcAttr,hdc,DC_TYPE); if (pDcAttr) { crRet = pDcAttr->ulDCBrushClr; } else { GdiSetLastError(ERROR_INVALID_PARAMETER); } return(crRet); } /******************************Public*Routine******************************\ * SetDCPenColor * * Arguments: * * hdc - DC handle * color - new color * * Return Value: * * Old mode value or 0 for failure * * History : * * Feb.16.1997 -by- Hideyuki Nagase [hideyukn] * ICM-aware version. \**************************************************************************/ COLORREF META APIENTRY SetDCPenColor(HDC hdc,COLORREF color) { COLORREF crRet = CLR_INVALID; PDC_ATTR pdcattr; FIXUP_HANDLE(hdc); PSHARED_GET_VALIDATE(pdcattr,hdc,DC_TYPE); if (pdcattr) { if(IS_ALTDC_TYPE(hdc)) { if (!IS_METADC16_TYPE(hdc)) { PLDC pldc; DC_PLDC(hdc,pldc,crRet); if (pldc->iType == LO_METADC) { CHECK_COLOR_PAGE(pldc,color); if (pdcattr->hpen == ghbrDCPen) { BOOL bRet = FALSE; HPEN hpen = CreatePen (PS_SOLID,0,color); if (hpen != NULL) { // If there is a old temp DC pen, delete it. if (pldc->oldSetDCPenColorPen) DeleteObject(pldc->oldSetDCPenColorPen); bRet = MF_SelectAnyObject (hdc, hpen, EMR_SELECTOBJECT); // Store the new tmp pen in the LDC. pldc->oldSetDCPenColorPen = hpen; } if (!bRet) return (CLR_INVALID); } } } } // // set app specified color // crRet = pdcattr->ulDCPenClr; pdcattr->ulDCPenClr = color; color &= 0x13ffffff; // // check icm if not PALINDEX // if (!(color & 0x01000000) && bNeedTranslateColor(pdcattr)) { COLORREF NewColor; BOOL bStatus = IcmTranslateCOLORREF(hdc, pdcattr, color, &NewColor, ICM_FORWARD); if (bStatus) { color = NewColor; } } if (color != pdcattr->crDCPenClr) { pdcattr->crDCPenClr = color; pdcattr->ulDirty_ |= DIRTY_LINE; } } else { GdiSetLastError(ERROR_INVALID_PARAMETER); } return(crRet); } /******************************Public*Routine******************************\ * GetDCPenColor * * Arguments: * * hdc - DC handle * * Return Value: * * Old mode value or 0 for failure * \**************************************************************************/ COLORREF META APIENTRY GetDCPenColor(HDC hdc) { COLORREF crRet = CLR_INVALID; PDC_ATTR pDcAttr; FIXUP_HANDLE(hdc); PSHARED_GET_VALIDATE(pDcAttr,hdc,DC_TYPE); if (pDcAttr) { crRet = pDcAttr->ulDCPenClr; } else { GdiSetLastError(ERROR_INVALID_PARAMETER); } return(crRet); } /******************************Public*Routine****************************** * GetDCDWord( HDC hdc, UINT index, UINT error ) * * This routine can be used to return a DWORD of information about a DC * from the server side. The parameter index is used to specify which * one. The values for indext are define in "ntgdi.h" * * Gerrit van Wingerden [gerritv] * 11-9-94 Wrote It. * **************************************************************************/ DWORD GetDCDWord( HDC hdc, UINT index, INT error ) { DWORD uRet=0; DWORD retData; uRet = NtGdiGetDCDword(hdc, index, &retData); return (uRet ? retData : error); } /******************************Public*Routine******************************\ * GetGraphicsMode(hdc) * GetROP2(hdc) * GetBkMode(hdc) * GetPolyFillMode(hdc) * GetStretchBltMode(hdc) * GetTextAlign(hdc) * GetTextCharacterExtra(hdc) * GetTextColor(hdc) * GetBkColor(hdc) * GetRelAbs(hdc) * GetFontLanguageInfo(hdc) * * added by Lingyunw: * GetBreakExtra (hdc) * GetcBreak (hdc) * * Simple client side handlers that just retrieve data from the LDC. * * Mon 19-Oct-1992 -by- Bodin Dresevic [BodinD] * update: GetGraphicsMode * * Sat 08-Jun-1991 00:47:52 -by- Charles Whitmer [chuckwh] * Wrote them. \**************************************************************************/ #define BIDI_MASK (GCP_DIACRITIC|GCP_GLYPHSHAPE|GCP_KASHIDA|GCP_LIGATE|GCP_REORDER) DWORD APIENTRY GetFontLanguageInfo(HDC hdc) { DWORD dwRet = 0; DWORD dwRet1; FIXUP_HANDLE(hdc); #ifdef LANGPACK if (gbLpk) { int iCharSet = NtGdiGetTextCharsetInfo(hdc, NULL, 0); if ((iCharSet == ARABIC_CHARSET) || (iCharSet == HEBREW_CHARSET)) dwRet |= BIDI_MASK; } #endif dwRet1 = GetDCDWord(hdc, DDW_FONTLANGUAGEINFO, (DWORD)GCP_ERROR); if (dwRet1 != GCP_ERROR) { dwRet |= dwRet1; } else { dwRet = dwRet1; } return dwRet; } int APIENTRY GetGraphicsMode(HDC hdc) { int mode = 0; PDC_ATTR pDcAttr; FIXUP_HANDLE(hdc); PSHARED_GET_VALIDATE(pDcAttr,hdc,DC_TYPE); if (pDcAttr) { mode = pDcAttr->iGraphicsMode; } return(mode); } int APIENTRY GetROP2(HDC hdc) { int rop = 0; PDC_ATTR pDcAttr; FIXUP_HANDLE(hdc); PSHARED_GET_VALIDATE(pDcAttr,hdc,DC_TYPE); if (pDcAttr) { rop = pDcAttr->jROP2; } return(rop); } int APIENTRY GetBkMode(HDC hdc) { int mode = 0; PDC_ATTR pDcAttr; FIXUP_HANDLE(hdc); PSHARED_GET_VALIDATE(pDcAttr,hdc,DC_TYPE); if (pDcAttr) { mode = pDcAttr->lBkMode; } return(mode); } int APIENTRY GetPolyFillMode(HDC hdc) { int mode = 0; PDC_ATTR pDcAttr; PSHARED_GET_VALIDATE(pDcAttr,hdc,DC_TYPE); if (pDcAttr) { mode = pDcAttr->lFillMode; } return(mode); } int APIENTRY GetStretchBltMode(HDC hdc) { int mode = 0; PDC_ATTR pDcAttr; FIXUP_HANDLE(hdc); PSHARED_GET_VALIDATE(pDcAttr,hdc,DC_TYPE); if (pDcAttr) { mode = pDcAttr->lStretchBltMode; } return(mode); } UINT APIENTRY GetTextAlign(HDC hdc) { UINT al = GDI_ERROR; PDC_ATTR pDcAttr; FIXUP_HANDLE(hdc); PSHARED_GET_VALIDATE(pDcAttr,hdc,DC_TYPE); if (pDcAttr) { al = pDcAttr->lTextAlign; } return(al); } int APIENTRY GetTextCharacterExtra(HDC hdc) { int iExtra = 0x80000000; PDC_ATTR pDcAttr; FIXUP_HANDLE(hdc); PSHARED_GET_VALIDATE(pDcAttr,hdc,DC_TYPE); if (pDcAttr) { iExtra = pDcAttr->lTextExtra; } return(iExtra); } COLORREF APIENTRY GetTextColor(HDC hdc) { COLORREF co = CLR_INVALID; PDC_ATTR pDcAttr; FIXUP_HANDLE(hdc); PSHARED_GET_VALIDATE(pDcAttr,hdc,DC_TYPE); if (pDcAttr) { co = pDcAttr->ulForegroundClr; } return(co); } COLORREF APIENTRY GetBkColor(HDC hdc) { COLORREF co = CLR_INVALID; PDC_ATTR pDcAttr; FIXUP_HANDLE(hdc); PSHARED_GET_VALIDATE(pDcAttr,hdc,DC_TYPE); if (pDcAttr) { co = pDcAttr->ulBackgroundClr; } return(co); } int APIENTRY GetRelAbs(HDC hdc,int iMode) { iMode; FIXUP_HANDLE(hdc); return( (int) GetDCDWord( hdc, DDW_RELABS,(DWORD) 0 )); } //added for retrieve lBreakExtra from server side int GetBreakExtra (HDC hdc) { return( (int) GetDCDWord( hdc, DDW_BREAKEXTRA,(DWORD) 0 )); } //added for retrieve cBreak from server side int GetcBreak (HDC hdc) { return( (int) GetDCDWord( hdc, DDW_CBREAK,(DWORD) 0 )); } //added to retrieve hlfntNew for USER HFONT APIENTRY GetHFONT (HDC hdc) { HFONT hfnt = NULL; PDC_ATTR pDcAttr; PSHARED_GET_VALIDATE(pDcAttr,hdc,DC_TYPE); if (pDcAttr) { hfnt = (HFONT)pDcAttr->hlfntNew; } return(hfnt); } /******************************Public*Routine******************************\ * GdiIsPlayMetafileDC * * Arguments: * * hdc - DC handle * * Return Value: * * True if we are playing a metafile on DC, FALSE otherwise * * History : * Aug-31-97 -by- Samer Arafeh [SamerA] \**************************************************************************/ BOOL APIENTRY GdiIsPlayMetafileDC(HDC hdc) { PDC_ATTR pDcAttr; BOOL bRet=FALSE; FIXUP_HANDLE(hdc); PSHARED_GET_VALIDATE(pDcAttr,hdc,DC_TYPE); if (pDcAttr) { bRet = (pDcAttr->ulDirty_&DC_PLAYMETAFILE) ? TRUE : FALSE; } return(bRet); }