/* * @implemented */ BOOL WINAPI GdiFlush() { NtGdiFlush(); return TRUE; }
/* * @unimplemented */ int WINAPI SetPolyFillMode( _In_ HDC hdc, _In_ int iPolyFillMode) { INT iOldPolyFillMode; PDC_ATTR pdcattr; HANDLE_METADC(INT, SetPolyFillMode, 0, hdc, iPolyFillMode); /* Get the DC attribute */ pdcattr = GdiGetDcAttr(hdc); if (pdcattr == NULL) { SetLastError(ERROR_INVALID_PARAMETER); return 0; } if (NtCurrentTeb()->GdiTebBatch.HDC == hdc) { if (pdcattr->ulDirty_ & DC_MODE_DIRTY) { NtGdiFlush(); // Sync up pdcattr from Kernel space. pdcattr->ulDirty_ &= ~(DC_MODE_DIRTY|DC_FONTTEXT_DIRTY); } } iOldPolyFillMode = pdcattr->lFillMode; pdcattr->lFillMode = iPolyFillMode; return iOldPolyFillMode; }
/* * @implemented */ int WINAPI SetROP2( _In_ HDC hdc, _In_ int rop2) { PDC_ATTR pdcattr; INT rop2Old; HANDLE_METADC(INT, SetROP2, 0, hdc, rop2); /* Get the DC attribute */ pdcattr = GdiGetDcAttr(hdc); if (pdcattr == NULL) { SetLastError(ERROR_INVALID_PARAMETER); return 0; } if (NtCurrentTeb()->GdiTebBatch.HDC == hdc) { if (pdcattr->ulDirty_ & DC_MODE_DIRTY) { NtGdiFlush(); pdcattr->ulDirty_ &= ~DC_MODE_DIRTY; } } rop2Old = pdcattr->jROP2; pdcattr->jROP2 = (BYTE)rop2; return rop2Old; }
/* * @unimplemented */ BOOL WINAPI SetViewportExtEx(HDC hdc, int nXExtent, int nYExtent, LPSIZE lpSize) { PDC_ATTR Dc_Attr; #if 0 if (GDI_HANDLE_GET_TYPE(hdc) != GDI_OBJECT_TYPE_DC) { if (GDI_HANDLE_GET_TYPE(hdc) == GDI_OBJECT_TYPE_METADC) return MFDRV_SetViewportExtEx(); else { PLDC pLDC = GdiGetLDC(hdc); if ( !pLDC ) { SetLastError(ERROR_INVALID_HANDLE); return FALSE; } if (pLDC->iType == LDC_EMFLDC) { return EMFDRV_SetViewportExtEx(); } } } #endif if (!GdiGetHandleUserData((HGDIOBJ) hdc, GDI_OBJECT_TYPE_DC, (PVOID) &Dc_Attr)) { return FALSE; } if (lpSize) { lpSize->cx = Dc_Attr->szlViewportExt.cx; lpSize->cy = Dc_Attr->szlViewportExt.cy; } if ((Dc_Attr->szlViewportExt.cx == nXExtent) && (Dc_Attr->szlViewportExt.cy == nYExtent)) return TRUE; if ((Dc_Attr->iMapMode == MM_ISOTROPIC) || (Dc_Attr->iMapMode == MM_ANISOTROPIC)) { if (NtCurrentTeb()->GdiTebBatch.HDC == hdc) { if (Dc_Attr->ulDirty_ & DC_FONTTEXT_DIRTY) { NtGdiFlush(); // Sync up Dc_Attr from Kernel space. Dc_Attr->ulDirty_ &= ~(DC_MODE_DIRTY|DC_FONTTEXT_DIRTY); } } Dc_Attr->szlViewportExt.cx = nXExtent; Dc_Attr->szlViewportExt.cy = nYExtent; if (Dc_Attr->dwLayout & LAYOUT_RTL) NtGdiMirrorWindowOrg(hdc); Dc_Attr->flXform |= (PAGE_EXTENTS_CHANGED|INVALIDATE_ATTRIBUTES|DEVICE_TO_WORLD_INVALID); } return TRUE; }
/* * @unimplemented */ BOOL WINAPI SetWindowOrgEx(HDC hdc, int X, int Y, LPPOINT lpPoint) { #if 0 PDC_ATTR Dc_Attr; #if 0 if (GDI_HANDLE_GET_TYPE(hdc) != GDI_OBJECT_TYPE_DC) { if (GDI_HANDLE_GET_TYPE(hdc) == GDI_OBJECT_TYPE_METADC) return MFDRV_SetWindowOrgEx(); else { PLDC pLDC = GdiGetLDC(hdc); if ( !pLDC ) { SetLastError(ERROR_INVALID_HANDLE); return FALSE; } if (pLDC->iType == LDC_EMFLDC) { return EMFDRV_SetWindowOrgEx(); } } } #endif if (!GdiGetHandleUserData((HGDIOBJ) hdc, GDI_OBJECT_TYPE_DC, (PVOID) &Dc_Attr)) return FALSE; if (lpPoint) { lpPoint->x = Dc_Attr->ptlWindowOrg.x; lpPoint->y = Dc_Attr->ptlWindowOrg.y; } if ((Dc_Attr->ptlWindowOrg.x == X) && (Dc_Attr->ptlWindowOrg.y == Y)) return TRUE; if (NtCurrentTeb()->GdiTebBatch.HDC == (ULONG)hdc) { if (Dc_Attr->ulDirty_ & DC_FONTTEXT_DIRTY) { NtGdiFlush(); // Sync up Dc_Attr from Kernel space. Dc_Attr->ulDirty_ &= ~(DC_MODE_DIRTY|DC_FONTTEXT_DIRTY); } } Dc_Attr->ptlWindowOrg.x = X; Dc_Attr->lWindowOrgx = X; Dc_Attr->ptlWindowOrg.y = Y; if (Dc_Attr->dwLayout & LAYOUT_RTL) NtGdiMirrorWindowOrg(hdc); Dc_Attr->flXform |= (PAGE_XLATE_CHANGED|DEVICE_TO_WORLD_INVALID); return TRUE; #endif return NtGdiSetWindowOrgEx(hdc,X,Y,lpPoint); }
/* * @implemented * */ BOOL WINAPI OffsetWindowOrgEx(HDC hdc, int nXOffset, int nYOffset, LPPOINT lpPoint) { #if 0 PDC_ATTR Dc_Attr; #if 0 if (GDI_HANDLE_GET_TYPE(hdc) != GDI_OBJECT_TYPE_DC) { if (GDI_HANDLE_GET_TYPE(hdc) == GDI_OBJECT_TYPE_METADC) return MFDRV_OffsetWindowOrgEx(hdc, nXOffset, nYOffset, lpPoint); else { PLDC pLDC = GdiGetLDC(hdc); if ( !pLDC ) { SetLastError(ERROR_INVALID_HANDLE); return FALSE; } if (pLDC->iType == LDC_EMFLDC) { return EMFDRV_OffsetWindowOrgEx(hdc, nXOffset, nYOffset, lpPoint); } } } #endif if (!GdiGetHandleUserData((HGDIOBJ) hdc, GDI_OBJECT_TYPE_DC, (PVOID) &Dc_Attr)) return FALSE; if ( lpPoint ) { *lpPoint = (POINT)Dc_Attr->ptlWindowOrg; lpPoint->x = Dc_Attr->lWindowOrgx; } if ( nXOffset || nYOffset != nXOffset ) { if (NtCurrentTeb()->GdiTebBatch.HDC == (ULONG)hdc) { if (Dc_Attr->ulDirty_ & DC_MODE_DIRTY) { NtGdiFlush(); Dc_Attr->ulDirty_ &= ~DC_MODE_DIRTY; } } Dc_Attr->flXform |= (PAGE_XLATE_CHANGED|DEVICE_TO_WORLD_INVALID); Dc_Attr->ptlWindowOrg.x += nXOffset; Dc_Attr->ptlWindowOrg.y += nYOffset; Dc_Attr->lWindowOrgx += nXOffset; } return TRUE; #endif return NtGdiOffsetWindowOrgEx(hdc, nXOffset, nYOffset, lpPoint); }
/* * @unimplemented */ int WINAPI SetGraphicsMode( _In_ HDC hdc, _In_ int iMode) { INT iOldMode; PDC_ATTR pdcattr; /* Check parameters */ if ((iMode < GM_COMPATIBLE) || (iMode > GM_ADVANCED)) { SetLastError(ERROR_INVALID_PARAMETER); return 0; } /* Get the DC attribute */ pdcattr = GdiGetDcAttr(hdc); if (pdcattr == NULL) { SetLastError(ERROR_INVALID_PARAMETER); return 0; } /* Check for trivial case */ if (iMode == pdcattr->iGraphicsMode) return iMode; if (NtCurrentTeb()->GdiTebBatch.HDC == hdc) { if (pdcattr->ulDirty_ & DC_MODE_DIRTY) { NtGdiFlush(); // Sync up pdcattr from Kernel space. pdcattr->ulDirty_ &= ~(DC_MODE_DIRTY|DC_FONTTEXT_DIRTY); } } /* One would think that setting the graphics mode to GM_COMPATIBLE * would also reset the world transformation matrix to the unity * matrix. However, in Windows, this is not the case. This doesn't * make a lot of sense to me, but that's the way it is. */ iOldMode = pdcattr->iGraphicsMode; pdcattr->iGraphicsMode = iMode; return iOldMode; }
/* * @implemented */ int WINAPI SetROP2(HDC hdc, int fnDrawMode) { PDC_ATTR Dc_Attr; INT Old_ROP2; #if 0 // Handle something other than a normal dc object. if (GDI_HANDLE_GET_TYPE(hdc) != GDI_OBJECT_TYPE_DC) { if (GDI_HANDLE_GET_TYPE(hdc) == GDI_OBJECT_TYPE_METADC) return MFDRV_SetROP2( hdc, fnDrawMode); else { PLDC pLDC = GdiGetLDC(hdc); if ( !pLDC ) { SetLastError(ERROR_INVALID_HANDLE); return FALSE; } if (pLDC->iType == LDC_EMFLDC) { return EMFDRV_SetROP2(( hdc, fnDrawMode); } return FALSE; } } #endif if (!GdiGetHandleUserData((HGDIOBJ) hdc, GDI_OBJECT_TYPE_DC, (PVOID) &Dc_Attr)) return FALSE; if (NtCurrentTeb()->GdiTebBatch.HDC == hdc) { if (Dc_Attr->ulDirty_ & DC_MODE_DIRTY) { NtGdiFlush(); Dc_Attr->ulDirty_ &= ~DC_MODE_DIRTY; } } Old_ROP2 = Dc_Attr->jROP2; Dc_Attr->jROP2 = fnDrawMode; return Old_ROP2; }
/* * @implemented */ INT WINAPI ExtSelectClipRgn( _In_ HDC hdc, _In_ HRGN hrgn, _In_ INT iMode) { INT Ret; HRGN NewRgn = NULL; HANDLE_METADC(INT, ExtSelectClipRgn, 0, hdc, hrgn, iMode); #if 0 if ( hrgn ) { if ( GetLayout(hdc) & LAYOUT_RTL ) { if ( MirrorRgnDC(hdc, hrgn, &NewRgn) ) { if ( NewRgn ) hrgn = NewRgn; } } } #endif /* Batch handles RGN_COPY only! */ if (iMode == RGN_COPY) { #if 0 PDC_ATTR pDc_Attr; PRGN_ATTR pRgn_Attr = NULL; /* hrgn can be NULL unless the RGN_COPY mode is specified. */ if (hrgn) GdiGetHandleUserData((HGDIOBJ) hrgn, GDI_OBJECT_TYPE_REGION, (PVOID) &pRgn_Attr); if ( GdiGetHandleUserData((HGDIOBJ) hdc, GDI_OBJECT_TYPE_DC, (PVOID) &pDc_Attr) && pDc_Attr ) { PGDI_TABLE_ENTRY pEntry = GdiHandleTable + GDI_HANDLE_GET_INDEX(hdc); PTEB pTeb = NtCurrentTeb(); if ( pTeb->Win32ThreadInfo != NULL && pTeb->GdiTebBatch.HDC == hdc && !(pDc_Attr->ulDirty_ & DC_DIBSECTION) && !(pEntry->Flags & GDI_ENTRY_VALIDATE_VIS) ) { if (!hrgn || (hrgn && pRgn_Attr && pRgn_Attr->iComplexity <= SIMPLEREGION) ) { if ((pTeb->GdiTebBatch.Offset + sizeof(GDIBSEXTSELCLPRGN)) <= GDIBATCHBUFSIZE) { // FIXME: This is broken, use GdiAllocBatchCommand! PGDIBSEXTSELCLPRGN pgO = (PGDIBSEXTSELCLPRGN)(&pTeb->GdiTebBatch.Buffer[0] + pTeb->GdiTebBatch.Offset); pgO->gbHdr.Cmd = GdiBCExtSelClipRgn; pgO->gbHdr.Size = sizeof(GDIBSEXTSELCLPRGN); pgO->fnMode = iMode; if ( hrgn && pRgn_Attr ) { Ret = pRgn_Attr->iComplexity; if ( pDc_Attr->VisRectRegion.Rect.left >= pRgn_Attr->Rect.right || pDc_Attr->VisRectRegion.Rect.top >= pRgn_Attr->Rect.bottom || pDc_Attr->VisRectRegion.Rect.right <= pRgn_Attr->Rect.left || pDc_Attr->VisRectRegion.Rect.bottom <= pRgn_Attr->Rect.top ) Ret = NULLREGION; pgO->left = pRgn_Attr->Rect.left; pgO->top = pRgn_Attr->Rect.top; pgO->right = pRgn_Attr->Rect.right; pgO->bottom = pRgn_Attr->Rect.bottom; } else { Ret = pDc_Attr->VisRectRegion.Flags; pgO->fnMode |= 0x80000000; // Set no hrgn mode. } pTeb->GdiTebBatch.Offset += sizeof(GDIBSEXTSELCLPRGN); pTeb->GdiBatchCount++; if (pTeb->GdiBatchCount >= GDI_BatchLimit) NtGdiFlush(); if ( NewRgn ) DeleteObject(NewRgn); return Ret; } } } } #endif } Ret = NtGdiExtSelectClipRgn(hdc, hrgn, iMode); if ( NewRgn ) DeleteObject(NewRgn); return Ret; }
/* * @implemented */ BOOL WINAPI SetBrushOrgEx(HDC hdc, int nXOrg, int nYOrg, LPPOINT lppt) { PDC_ATTR Dc_Attr; #if 0 // Handle something other than a normal dc object. if (GDI_HANDLE_GET_TYPE(hdc) != GDI_OBJECT_TYPE_DC) { PLDC pLDC = GdiGetLDC(hdc); if ( (pLDC == NULL) || (GDI_HANDLE_GET_TYPE(hdc) == GDI_OBJECT_TYPE_METADC)) { SetLastError(ERROR_INVALID_HANDLE); return FALSE; } if (pLDC->iType == LDC_EMFLDC) { return EMFDRV_SetBrushOrg(hdc, nXOrg, nYOrg); // ReactOS only. } return FALSE; } #endif if (GdiGetHandleUserData((HGDIOBJ) hdc, GDI_OBJECT_TYPE_DC, (PVOID) &Dc_Attr)) { PTEB pTeb = NtCurrentTeb(); if (lppt) { lppt->x = Dc_Attr->ptlBrushOrigin.x; lppt->y = Dc_Attr->ptlBrushOrigin.y; } if ((nXOrg == Dc_Attr->ptlBrushOrigin.x) && (nYOrg == Dc_Attr->ptlBrushOrigin.y)) return TRUE; if(((pTeb->GdiTebBatch.HDC == NULL) || (pTeb->GdiTebBatch.HDC == hdc)) && ((pTeb->GdiTebBatch.Offset + sizeof(GDIBSSETBRHORG)) <= GDIBATCHBUFSIZE) && (!(Dc_Attr->ulDirty_ & DC_DIBSECTION)) ) { PGDIBSSETBRHORG pgSBO = (PGDIBSSETBRHORG)(&pTeb->GdiTebBatch.Buffer[0] + pTeb->GdiTebBatch.Offset); Dc_Attr->ptlBrushOrigin.x = nXOrg; Dc_Attr->ptlBrushOrigin.y = nYOrg; pgSBO->gbHdr.Cmd = GdiBCSetBrushOrg; pgSBO->gbHdr.Size = sizeof(GDIBSSETBRHORG); pgSBO->ptlBrushOrigin = Dc_Attr->ptlBrushOrigin; pTeb->GdiTebBatch.Offset += sizeof(GDIBSSETBRHORG); pTeb->GdiTebBatch.HDC = hdc; pTeb->GdiBatchCount++; DPRINT("Loading the Flush!! COUNT-> %lu\n", pTeb->GdiBatchCount); if (pTeb->GdiBatchCount >= GDI_BatchLimit) { DPRINT("Call GdiFlush!!\n"); NtGdiFlush(); DPRINT("Exit GdiFlush!!\n"); } return TRUE; } } return NtGdiSetBrushOrg(hdc,nXOrg,nYOrg,lppt); }
/* * @unimplemented */ BOOL WINAPI SetWindowExtEx( _In_ HDC hdc, _In_ INT nXExtent, _In_ INT nYExtent, _Out_opt_ LPSIZE lpSize) { PDC_ATTR pdcattr; ULONG ulType; /* Check what type of DC that is */ ulType = GDI_HANDLE_GET_TYPE(hdc); switch (ulType) { case GDILoObjType_LO_DC_TYPE: /* Handle this in the path below */ break; #if 0// FIXME: we don't support this case GDILoObjType_LO_METADC16_TYPE: return MFDRV_SetWindowExtEx(hdc, nXExtent, nYExtent, lpSize); case GDILoObjType_LO_METAFILE_TYPE: return EMFDRV_SetWindowExtEx(hdc, nXExtent, nYExtent, lpSize); #endif default: /* Other types are not allowed */ SetLastError(ERROR_INVALID_HANDLE); return FALSE; } /* Get the DC attr */ pdcattr = GdiGetDcAttr(hdc); if (!pdcattr) { /* Set the error value and return failure */ SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } if (lpSize) { lpSize->cx = pdcattr->szlWindowExt.cx; lpSize->cy = pdcattr->szlWindowExt.cy; if (pdcattr->dwLayout & LAYOUT_RTL) lpSize->cx = -lpSize->cx; } if (pdcattr->dwLayout & LAYOUT_RTL) { NtGdiMirrorWindowOrg(hdc); pdcattr->flXform |= (PAGE_EXTENTS_CHANGED|INVALIDATE_ATTRIBUTES|DEVICE_TO_WORLD_INVALID); } else if ((pdcattr->iMapMode == MM_ISOTROPIC) || (pdcattr->iMapMode == MM_ANISOTROPIC)) { if ((pdcattr->szlWindowExt.cx == nXExtent) && (pdcattr->szlWindowExt.cy == nYExtent)) return TRUE; if ((!nXExtent) || (!nYExtent)) return FALSE; if (NtCurrentTeb()->GdiTebBatch.HDC == hdc) { if (pdcattr->ulDirty_ & DC_FONTTEXT_DIRTY) { NtGdiFlush(); // Sync up Dc_Attr from Kernel space. pdcattr->ulDirty_ &= ~(DC_MODE_DIRTY|DC_FONTTEXT_DIRTY); } } pdcattr->szlWindowExt.cx = nXExtent; pdcattr->szlWindowExt.cy = nYExtent; if (pdcattr->dwLayout & LAYOUT_RTL) NtGdiMirrorWindowOrg(hdc); pdcattr->flXform |= (PAGE_EXTENTS_CHANGED|INVALIDATE_ATTRIBUTES|DEVICE_TO_WORLD_INVALID); } return TRUE; }