/* * @implemented */ BOOL WINAPI PtInRegion(IN HRGN hrgn, int x, int y) { PRGN_ATTR pRgn_Attr; // HACKFIX //if (!GdiGetHandleUserData((HGDIOBJ) hrgn, GDI_OBJECT_TYPE_REGION, (PVOID) &pRgn_Attr)) return NtGdiPtInRegion(hrgn,x,y); if ( pRgn_Attr->iComplexity == NULLREGION) return FALSE; if ( pRgn_Attr->iComplexity != SIMPLEREGION) return NtGdiPtInRegion(hrgn,x,y); return INRECT( pRgn_Attr->Rect, x, y); }
BOOL APIENTRY NtGdiPtVisible(HDC hDC, int X, int Y) { HRGN rgn; DC *dc; if(!(dc = DC_LockDc(hDC))) { EngSetLastError(ERROR_INVALID_HANDLE); return FALSE; } rgn = dc->rosdc.hGCClipRgn; DC_UnlockDc(dc); return (rgn ? NtGdiPtInRegion(rgn, X, Y) : FALSE); }
BOOL APIENTRY NtGdiExtFloodFill( HDC hDC, INT XStart, INT YStart, COLORREF Color, UINT FillType) { PDC dc; PDC_ATTR pdcattr; SURFACE *psurf = NULL; EXLATEOBJ exlo; BOOL Ret = FALSE; RECTL DestRect; POINTL Pt; ULONG ConvColor; dc = DC_LockDc(hDC); if (!dc) { EngSetLastError(ERROR_INVALID_HANDLE); return FALSE; } if (dc->dctype == DC_TYPE_INFO) { DC_UnlockDc(dc); /* Yes, Windows really returns TRUE in this case */ return TRUE; } pdcattr = dc->pdcattr; if (pdcattr->ulDirty_ & (DIRTY_FILL | DC_BRUSH_DIRTY)) DC_vUpdateFillBrush(dc); if (pdcattr->ulDirty_ & (DIRTY_LINE | DC_PEN_DIRTY)) DC_vUpdateLineBrush(dc); Pt.x = XStart; Pt.y = YStart; IntLPtoDP(dc, (LPPOINT)&Pt, 1); Ret = NtGdiPtInRegion(dc->rosdc.hGCClipRgn, Pt.x, Pt.y); if (Ret) IntGdiGetRgnBox(dc->rosdc.hGCClipRgn,(LPRECT)&DestRect); else goto cleanup; DC_vPrepareDCsForBlit(dc, DestRect, NULL, DestRect); psurf = dc->dclevel.pSurface; if (!psurf) { Ret = FALSE; goto cleanup; } EXLATEOBJ_vInitialize(&exlo, &gpalRGB, psurf->ppal, 0, 0xffffff, 0); /* Only solid fills supported for now * How to support pattern brushes and non standard surfaces (not offering dib functions): * Version a (most likely slow): call DrvPatBlt for every pixel * Version b: create a flood mask and let MaskBlt blit a masked brush */ ConvColor = XLATEOBJ_iXlate(&exlo.xlo, Color); Ret = DIB_XXBPP_FloodFillSolid(&psurf->SurfObj, &dc->eboFill.BrushObject, &DestRect, &Pt, ConvColor, FillType); EXLATEOBJ_vCleanup(&exlo); cleanup: DC_vFinishBlit(dc, NULL); DC_UnlockDc(dc); return Ret; }