/******************************Module*Header*******************************\ * Module Name: dcmod.c * * * * Client side stubs for functions that modify the state of the DC in the * * server. * * * * Created: 05-Jun-1991 01:49:42 * * Author: Charles Whitmer [chuckwh] * * * * Copyright (c) 1991-1999 Microsoft Corporation * \**************************************************************************/ #include "precomp.h" #pragma hdrstop #include "winuserk.h" BOOL InitDeviceInfo(PLDC pldc, HDC hdc); VOID vComputePageXform(PLDC pldc); DWORD GetAndSetDCDWord( HDC, UINT, UINT, UINT, WORD, UINT ); #define DBG_XFORM 0 /******************************Public*Routine******************************\ * MoveToEx * * * * Client side stub. It's important to batch this call whenever we can. * * * * History: * * Thu 06-Jun-1991 23:10:01 -by- Charles Whitmer [chuckwh] * * Wrote it. * \**************************************************************************/ BOOL META WINAPI MoveToEx(HDC hdc,int x,int y,LPPOINT pptl) { BOOL bRet = FALSE; PDC_ATTR pDcAttr; FIXUP_HANDLE(hdc); if (IS_ALTDC_TYPE(hdc)) { PLDC pldc; if (IS_METADC16_TYPE(hdc)) return (MF16_RecordParms3(hdc,x,y,META_MOVETO)); DC_PLDC(hdc,pldc,bRet); if (pldc->iType == LO_METADC) { if (!MF_SetDD(hdc,(DWORD)x,(DWORD)y,EMR_MOVETOEX)) return(bRet); } } PSHARED_GET_VALIDATE(pDcAttr,hdc,DC_TYPE); if (pDcAttr) { bRet = TRUE; if (pptl != NULL) { // If the logical-space version of the current position is // invalid, then the device-space version of the current // position is guaranteed to be valid. So we can reverse // the current transform on that to compute the logical- // space version: if (pDcAttr->ulDirty_ & DIRTY_PTLCURRENT) { *((POINTL*)pptl) = pDcAttr->ptfxCurrent; pptl->x = FXTOL(pptl->x); pptl->y = FXTOL(pptl->y); bRet = DPtoLP(hdc,pptl,1); } else { *((POINTL*)pptl) = pDcAttr->ptlCurrent; } } pDcAttr->ptlCurrent.x = x; pDcAttr->ptlCurrent.y = y; // We now know the new logical-space version of the current position // (but not the device-space version). Mark it as such. We also // have to reset the style-state for styled pens. pDcAttr->ulDirty_ &= ~DIRTY_PTLCURRENT; pDcAttr->ulDirty_ |= (DIRTY_PTFXCURRENT | DIRTY_STYLESTATE); } else { GdiSetLastError(ERROR_INVALID_PARAMETER); } return(bRet); } /******************************Public*Routine******************************\ * OffsetClipRgn * * * * Client side stub. * * * * History: * * Thu 06-Jun-1991 23:10:01 -by- Charles Whitmer [chuckwh] * * Wrote it. * \**************************************************************************/ int META WINAPI OffsetClipRgn(HDC hdc,int x,int y) { int iRet = RGN_ERROR; FIXUP_HANDLE(hdc); if (IS_ALTDC_TYPE(hdc)) { PLDC pldc; if (IS_METADC16_TYPE(hdc)) return(MF16_RecordParms3(hdc,x,y,META_OFFSETCLIPRGN)); DC_PLDC(hdc,pldc,iRet); if (pldc->iType == LO_METADC) { if (!MF_OffsetClipRgn(hdc,x,y)) return(iRet); } } return(NtGdiOffsetClipRgn(hdc,x,y)); } /******************************Public*Routine******************************\ * SetMetaRgn * * Client side stub. * * History: * Tue Apr 07 17:05:37 1992 -by- Hock San Lee [hockl] * Wrote it. \**************************************************************************/ int WINAPI SetMetaRgn(HDC hdc) { int iRet = RGN_ERROR; FIXUP_HANDLE(hdc); if (IS_ALTDC_TYPE(hdc)) { PLDC pldc; DC_PLDC(hdc,pldc,iRet); if (pldc->iType == LO_METADC && !MF_SetMetaRgn(hdc)) return(iRet); } return(NtGdiSetMetaRgn(hdc)); } /******************************Public*Routine******************************\ * SelectPalette * * * * Client side stub. * * * * History: * * Thu 06-Jun-1991 23:10:01 -by- Charles Whitmer [chuckwh] * * Wrote it. * \**************************************************************************/ HPALETTE META WINAPI SelectPalette(HDC hdc,HPALETTE hpal,BOOL b) { ULONG_PTR hRet = 0; FIXUP_HANDLE(hdc); FIXUP_HANDLE(hpal); if (IS_ALTDC_TYPE(hdc)) { PLDC pldc; if (IS_METADC16_TYPE(hdc)) return ((HPALETTE)(ULONG_PTR)MF16_SelectPalette(hdc,hpal)); DC_PLDC(hdc,pldc,(HPALETTE)hRet); if (pldc->iType == LO_METADC) { if (!MF_SelectAnyObject(hdc,(HANDLE)hpal,EMR_SELECTPALETTE)) return((HPALETTE) hRet); } } return(NtUserSelectPalette(hdc,hpal,b)); } /******************************Public*Routine******************************\ * SetMapperFlags * * * * Client side stub. * * * * History: * * Thu 06-Jun-1991 23:10:01 -by- Charles Whitmer [chuckwh] * * Wrote it. * \**************************************************************************/ DWORD META WINAPI SetMapperFlags(HDC hdc,DWORD fl) { DWORD dwRet; PDC_ATTR pdcattr; FIXUP_HANDLE(hdc); PSHARED_GET_VALIDATE(pdcattr,hdc,DC_TYPE); if (pdcattr) { CHECK_AND_FLUSH_TEXT (hdc, pdcattr); if (fl & (~ASPECT_FILTERING)) { WARNING("gdisrv!GreSetMapperFlags(): unknown flag\n"); GdiSetLastError(ERROR_INVALID_PARAMETER); dwRet = GDI_ERROR; } else { dwRet = pdcattr->flFontMapper; pdcattr->flFontMapper = fl; } } else { WARNING("gdi32!SetMapperFlags(): invalid hdc\n"); GdiSetLastError(ERROR_INVALID_PARAMETER); dwRet = GDI_ERROR; } return(dwRet); } // SetMapperFlagsInternal - no metafile version. DWORD SetMapperFlagsInternal(HDC hdc,DWORD fl) { return(GetAndSetDCDWord( hdc, GASDDW_MAPPERFLAGS, fl, EMR_MAX+1, EMR_MAX+1, GDI_ERROR )); } /******************************Public*Routine******************************\ * SetSystemPaletteUse * * * * Client side stub. * * * * This function is not metafile'd. * * * * History: * * Thu 06-Jun-1991 23:10:01 -by- Charles Whitmer [chuckwh] * * Wrote it. * \**************************************************************************/ UINT META WINAPI SetSystemPaletteUse(HDC hdc,UINT iMode) { FIXUP_HANDLE(hdc); return(NtGdiSetSystemPaletteUse(hdc,iMode)); } /******************************Public*Routine******************************\ * SetTextJustification * * * * Client side stub. * * * * History: * * Thu 14-Jan-1993 03:30:27 -by- Charles Whitmer [chuckwh] * * Save a copy in the LDC for computing text extent. * * * * Thu 06-Jun-1991 23:10:01 -by- Charles Whitmer [chuckwh] * * Wrote it. * \**************************************************************************/ BOOL META WINAPI SetTextJustification(HDC hdc,int dx,int cBreak) { PDC_ATTR pdcattr; BOOL bRet = FALSE; FIXUP_HANDLE(hdc); if (IS_METADC16_TYPE(hdc)) return (MF16_RecordParms3(hdc,dx,cBreak,META_SETTEXTJUSTIFICATION)); PSHARED_GET_VALIDATE(pdcattr,hdc,DC_TYPE); if (pdcattr) { CHECK_AND_FLUSH_TEXT (hdc, pdcattr); pdcattr->lBreakExtra = dx; pdcattr->cBreak = cBreak; bRet = TRUE; } return(bRet); } /******************************Public*Routine******************************\ * SetArcDirection * * Client side stub. Batches the call. * * History: * 20-Mar-1992 -by- J. Andrew Goossen [andrewgo] * Wrote it. \**************************************************************************/ int META WINAPI SetArcDirection(HDC hdc,int iArcDirection) { FIXUP_HANDLE(hdc); return(GetAndSetDCDWord( hdc, GASDDW_ARCDIRECTION, iArcDirection, EMR_MAX+1, EMR_MAX+1, ERROR)); } /******************************Public*Routine******************************\ * SetMiterLimit * * Client side stub. Batches the call whenever it can. * * History: * 13-Sep-1991 -by- J. Andrew Goossen [andrewgo] * Wrote it. \**************************************************************************/ BOOL META WINAPI SetMiterLimit(HDC hdc,FLOAT e,PFLOAT pe) { BOOL bRet = FALSE; FIXUP_HANDLE(hdc); if (IS_ALTDC_TYPE(hdc)) { PLDC pldc; DC_PLDC(hdc,pldc,bRet); if (pldc->iType == LO_METADC && !MF_SetD(hdc,(DWORD)e,EMR_SETMITERLIMIT)) return(bRet); } return(NtGdiSetMiterLimit(hdc,FLOATARG(e),FLOATPTRARG(pe))); } /******************************Public*Routine******************************\ * SetFontXform * * Client side stub. Batches the call whenever it can. * This is an internal function. * * History: * Tue Nov 24 09:54:15 1992 -by- Hock San Lee [hockl] * * Wrote it. \**************************************************************************/ BOOL SetFontXform(HDC hdc,FLOAT exScale,FLOAT eyScale) { BOOL bRet = FALSE; FIXUP_HANDLE(hdc); // This function is called only by the metafile playback code. // If hdc is an enhanced metafile DC, we need to remember the scales // so that we can metafile it in the compatible ExtTextOut or PolyTextOut // record that follows. if (IS_ALTDC_TYPE(hdc)) { PLDC pldc; DC_PLDC(hdc,pldc,bRet); if (pldc->iType == LO_METADC && !MF_SetFontXform(hdc,exScale,eyScale)) return(bRet); } // If the dc is mirrored then do not mirror the text at play back time. if (GetLayout(hdc) & LAYOUT_RTL) { exScale = -exScale; } return(NtGdiSetFontXform(hdc,FLOATARG(exScale),FLOATARG(eyScale))); } /******************************Public*Routine******************************\ * SetBrushOrgEx * * * * Client side stub. * * * * History: * * Thu 06-Jun-1991 23:10:01 -by- Charles Whitmer [chuckwh] * * Wrote it. * \**************************************************************************/ BOOL META WINAPI SetBrushOrgEx(HDC hdc,int x,int y,LPPOINT pptl) { BOOL bRet = FALSE; PDC_ATTR pdcattr; FIXUP_HANDLE(hdc); if (IS_ALTDC_TYPE(hdc)) { PLDC pldc; DC_PLDC(hdc,pldc,bRet); if (pldc->iType == LO_METADC && !MF_SetBrushOrgEx(hdc,x,y)) return(bRet); } PSHARED_GET_VALIDATE(pdcattr,hdc,DC_TYPE); if (pdcattr != NULL) { if (pptl != (LPPOINT)NULL) { *pptl = *((LPPOINT)&pdcattr->ptlBrushOrigin); } if ( (pdcattr->ptlBrushOrigin.x != x) || (pdcattr->ptlBrushOrigin.y != y) ) { BEGIN_BATCH_HDC(hdc,pdcattr,BatchTypeSetBrushOrg,BATCHSETBRUSHORG); pdcattr->ptlBrushOrigin.x = x; pdcattr->ptlBrushOrigin.y = y; pBatch->x = x; pBatch->y = y; COMPLETE_BATCH_COMMAND(); } bRet = TRUE; } else { UNBATCHED_COMMAND: bRet = NtGdiSetBrushOrg(hdc,x,y,pptl); } return(bRet); } /******************************Public*Routine******************************\ * RealizePalette * * * * Client side stub. * * * * History: * * Thu 06-Jun-1991 23:10:01 -by- Charles Whitmer [chuckwh] * * Wrote it. * \**************************************************************************/ UINT WINAPI RealizePalette(HDC hdc) { FIXUP_HANDLE(hdc); if (IS_ALTDC_TYPE(hdc)) { UINT uRet = 0xFFFFFFFF; PLDC pldc; if (IS_METADC16_TYPE(hdc)) return((UINT) MF16_RealizePalette(hdc)); DC_PLDC(hdc,pldc,uRet); if (pldc->iType == LO_METADC) { HPALETTE hpal = (HPALETTE)GetDCObject(hdc,LO_PALETTE_TYPE); if ((pmetalink16Get(hpal) != NULL) && !MF_RealizePalette(hpal)) return(uRet); } } return(UserRealizePalette(hdc)); } /******************************Public*Routine******************************\ * GetBoundsRect * * Client side stub. * * History: * 06-Apr-1992 -by- Donald Sidoroff [donalds] * Wrote it. \**************************************************************************/ UINT WINAPI GetBoundsRect(HDC hdc, LPRECT lprc, UINT fl) { FIXUP_HANDLE(hdc); // Applications can never set DCB_WINDOWMGR return(NtGdiGetBoundsRect(hdc, lprc, fl & ~DCB_WINDOWMGR)); } UINT WINAPI GetBoundsRectAlt(HDC hdc, LPRECT lprc, UINT fl) { FIXUP_HANDLE(hdc); return(NtGdiGetBoundsRect(hdc,lprc,fl)); } /******************************Public*Routine******************************\ * SetBoundsRect * * Client side stub. * * History: * 06-Apr-1992 -by- Donald Sidoroff [donalds] * Wrote it. \**************************************************************************/ UINT WINAPI SetBoundsRect(HDC hdc, CONST RECT *lprc, UINT fl) { FIXUP_HANDLE(hdc); // Applications can never set DCB_WINDOWMGR return(NtGdiSetBoundsRect(hdc, (LPRECT)lprc, fl & ~DCB_WINDOWMGR)); } UINT WINAPI SetBoundsRectAlt(HDC hdc, CONST RECT *lprc, UINT fl) { FIXUP_HANDLE(hdc); return(NtGdiSetBoundsRect(hdc,(LPRECT)lprc,fl)); } /******************************Public*Routine******************************\ * CancelDC1() * * History: * 14-Apr-1992 -by- - by - Eric Kutter [erick] * Wrote it. \**************************************************************************/ BOOL WINAPI CancelDC(HDC hdc) { BOOL bRes = FALSE; PDC_ATTR pDcAttr; FIXUP_HANDLE(hdc); if (IS_ALTDC_TYPE(hdc) && !IS_METADC16_TYPE(hdc)) { PLDC pldc; DC_PLDC(hdc,pldc,bRes); if (pldc->fl & LDC_DOC_STARTED) { pldc->fl |= LDC_DOC_CANCELLED; } bRes = NtGdiCancelDC(hdc); } // If we are in the process of playing the metafile, stop the playback. PSHARED_GET_VALIDATE(pDcAttr,hdc,DC_TYPE); if (pDcAttr) { pDcAttr->ulDirty_ &= ~DC_PLAYMETAFILE; bRes = TRUE; } return(bRes); } /******************************Public*Function*****************************\ * SetColorAdjustment * * Set the color adjustment data for a given DC. * * History: * 07-Aug-1992 -by- Wendy Wu [wendywu] * Wrote it. \**************************************************************************/ BOOL META APIENTRY SetColorAdjustment(HDC hdc, CONST COLORADJUSTMENT * pca) { FIXUP_HANDLE(hdc); if (IS_ALTDC_TYPE(hdc)) { BOOL bRet = FALSE; PLDC pldc; DC_PLDC(hdc,pldc,bRet); if (pldc->iType == LO_METADC && !MF_SetColorAdjustment(hdc, pca)) { return(bRet); } } return(NtGdiSetColorAdjustment(hdc,(COLORADJUSTMENT*)pca)); }