Author: jimtabor Date: Thu Dec 22 17:34:58 2016 New Revision: 73476
URL: http://svn.reactos.org/svn/reactos?rev=73476&view=rev Log: [Win32SS] - Implement DC Bounds support. It's close to what wine does and passes thousands of tests. Still WIP. See CORE-11582.
Modified: trunk/reactos/win32ss/gdi/gdi32/objects/dc.c trunk/reactos/win32ss/gdi/ntgdi/bitblt.c trunk/reactos/win32ss/gdi/ntgdi/coord.h trunk/reactos/win32ss/gdi/ntgdi/dc.h trunk/reactos/win32ss/gdi/ntgdi/dcutil.c trunk/reactos/win32ss/gdi/ntgdi/dibobj.c trunk/reactos/win32ss/gdi/ntgdi/fillshap.c trunk/reactos/win32ss/gdi/ntgdi/freetype.c trunk/reactos/win32ss/gdi/ntgdi/line.c trunk/reactos/win32ss/gdi/ntgdi/pen.h trunk/reactos/win32ss/include/ntgdityp.h
Modified: trunk/reactos/win32ss/gdi/gdi32/objects/dc.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/gdi32/objects/d... ============================================================================== --- trunk/reactos/win32ss/gdi/gdi32/objects/dc.c [iso-8859-1] (original) +++ trunk/reactos/win32ss/gdi/gdi32/objects/dc.c [iso-8859-1] Thu Dec 22 17:34:58 2016 @@ -800,7 +800,7 @@ UINT flags ) { - return NtGdiGetBoundsRect(hdc,lprcBounds,flags & DCB_RESET); + return NtGdiGetBoundsRect(hdc,lprcBounds,flags & ~DCB_WINDOWMGR); }
@@ -814,7 +814,7 @@ UINT flags) { /* FIXME add check for validate the flags */ - return NtGdiSetBoundsRect(hdc, (LPRECT)prc, flags); + return NtGdiSetBoundsRect(hdc, (LPRECT)prc, flags & ~DCB_WINDOWMGR); }
Modified: trunk/reactos/win32ss/gdi/ntgdi/bitblt.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/ntgdi/bitblt.c?... ============================================================================== --- trunk/reactos/win32ss/gdi/ntgdi/bitblt.c [iso-8859-1] (original) +++ trunk/reactos/win32ss/gdi/ntgdi/bitblt.c [iso-8859-1] Thu Dec 22 17:34:58 2016 @@ -77,6 +77,11 @@ DestRect.top += DCDest->ptlDCOrig.y; DestRect.right += DCDest->ptlDCOrig.x; DestRect.bottom += DCDest->ptlDCOrig.y; + + if (DCDest->fs & (DC_ACCUM_APP|DC_ACCUM_WMGR)) + { + IntUpdateBoundsRect(DCDest, &DestRect); + }
SourceRect.left = XOriginSrc; SourceRect.top = YOriginSrc; @@ -262,6 +267,11 @@ rcSrc.right += DCSrc->ptlDCOrig.x; rcSrc.bottom += DCSrc->ptlDCOrig.y;
+ if (DCDest->fs & (DC_ACCUM_APP|DC_ACCUM_WMGR)) + { + IntUpdateBoundsRect(DCDest, &rcDest); + } + /* Prepare for blit */ DC_vPrepareDCsForBlit(DCDest, &rcDest, DCSrc, &rcSrc);
@@ -419,6 +429,11 @@ DestRect.top += DCDest->ptlDCOrig.y; DestRect.right += DCDest->ptlDCOrig.x; DestRect.bottom += DCDest->ptlDCOrig.y; + + if (DCDest->fs & (DC_ACCUM_APP|DC_ACCUM_WMGR)) + { + IntUpdateBoundsRect(DCDest, &DestRect); + }
SourcePoint.x = nXSrc; SourcePoint.y = nYSrc; @@ -619,6 +634,11 @@ DestRect.right += DCDest->ptlDCOrig.x; DestRect.bottom += DCDest->ptlDCOrig.y;
+ if (DCDest->fs & (DC_ACCUM_APP|DC_ACCUM_WMGR)) + { + IntUpdateBoundsRect(DCDest, &DestRect); + } + SourceRect.left = XOriginSrc; SourceRect.top = YOriginSrc; SourceRect.right = XOriginSrc+WidthSrc; @@ -807,6 +827,12 @@ DestRect.top += pdc->ptlDCOrig.y; DestRect.right += pdc->ptlDCOrig.x; DestRect.bottom += pdc->ptlDCOrig.y; + + if (pdc->fs & (DC_ACCUM_APP|DC_ACCUM_WMGR)) + { + IntUpdateBoundsRect(pdc, &DestRect); + } + #ifdef _USE_DIBLIB_ BrushOrigin.x = pbrush->ptOrigin.x + pdc->ptlDCOrig.x + XLeft; BrushOrigin.y = pbrush->ptOrigin.y + pdc->ptlDCOrig.y + YLeft; @@ -1058,6 +1084,13 @@ return FALSE; }
+ if (pdc->fs & (DC_ACCUM_APP|DC_ACCUM_WMGR)) + { + RECTL rcrgn; + REGION_GetRgnBox(prgnClip, &rcrgn); + IntUpdateBoundsRect(pdc, &rcrgn); + } + /* Prepare the DC */ DC_vPrepareDCsForBlit(pdc, &prgnClip->rdh.rcBound, NULL, NULL);
@@ -1137,6 +1170,13 @@ return FALSE; }
+ if (pdc->fs & (DC_ACCUM_APP|DC_ACCUM_WMGR)) + { + RECTL rcrgn; + REGION_GetRgnBox(prgnClip, &rcrgn); + IntUpdateBoundsRect(pdc, &rcrgn); + } + IntEngInitClipObj(&xcoClip); IntEngUpdateClipRegion(&xcoClip, prgnClip->rdh.nCount, @@ -1349,6 +1389,22 @@ /* Fail! */ DC_UnlockDc(pdc); return -1; + } + + if (pdc->fs & (DC_ACCUM_APP|DC_ACCUM_WMGR)) + { + RECTL rcDst; + + RECTL_vSetRect(&rcDst, x, y, x+1, y+1); + + IntLPtoDP(pdc, (LPPOINT)&rcDst, 2); + + rcDst.left += pdc->ptlDCOrig.x; + rcDst.top += pdc->ptlDCOrig.y; + rcDst.right += pdc->ptlDCOrig.x; + rcDst.bottom += pdc->ptlDCOrig.y; + + IntUpdateBoundsRect(pdc, &rcDst); }
/* Translate the color to the target format */
Modified: trunk/reactos/win32ss/gdi/ntgdi/coord.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/ntgdi/coord.h?r... ============================================================================== --- trunk/reactos/win32ss/gdi/ntgdi/coord.h [iso-8859-1] (original) +++ trunk/reactos/win32ss/gdi/ntgdi/coord.h [iso-8859-1] Thu Dec 22 17:34:58 2016 @@ -4,10 +4,16 @@ #define MIN_COORD (INT_MIN / 16) #define MAX_COORD (INT_MAX / 16)
-#define IntLPtoDP(pdc, ppt, count) DC_vXformWorldToDevice(pdc, count, (PPOINTL)(ppt), (PPOINTL)(ppt)); -#define CoordLPtoDP(pdc, ppt) DC_vXformWorldToDevice(pdc, 1, (PPOINTL)(ppt), (PPOINTL)(ppt)); -#define IntDPtoLP(pdc, ppt, count) DC_vXformDeviceToWorld(pdc, count, (PPOINTL)(ppt), (PPOINTL)(ppt)); -#define CoordDPtoLP(pdc, ppt) DC_vXformDeviceToWorld(pdc, 1, (PPOINTL)(ppt), (PPOINTL)(ppt)); +#define IntLPtoDP(pdc, ppt, count) \ + DC_vUpdateWorldToDevice(pdc); \ + DC_vXformWorldToDevice(pdc, count, (PPOINTL)(ppt), (PPOINTL)(ppt)); +#define CoordLPtoDP(pdc, ppt) \ + DC_vXformWorldToDevice(pdc, 1, (PPOINTL)(ppt), (PPOINTL)(ppt)); +#define IntDPtoLP(pdc, ppt, count) \ + DC_vUpdateDeviceToWorld(pdc); \ + DC_vXformDeviceToWorld(pdc, count, (PPOINTL)(ppt), (PPOINTL)(ppt)); +#define CoordDPtoLP(pdc, ppt) \ + DC_vXformDeviceToWorld(pdc, 1, (PPOINTL)(ppt), (PPOINTL)(ppt));
#define XForm2MatrixS(m, x) XFormToMatrix(m, (XFORML*)x) #define MatrixS2XForm(x, m) MatrixToXForm((XFORML*)x, m)
Modified: trunk/reactos/win32ss/gdi/ntgdi/dc.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/ntgdi/dc.h?rev=... ============================================================================== --- trunk/reactos/win32ss/gdi/ntgdi/dc.h [iso-8859-1] (original) +++ trunk/reactos/win32ss/gdi/ntgdi/dc.h [iso-8859-1] Thu Dec 22 17:34:58 2016 @@ -2,9 +2,6 @@ #define __WIN32K_DC_H
/* Constants ******************************************************************/ - -/* Get/SetBounds/Rect support. */ -#define DCB_WINDOWMGR 0x8000 /* Queries the Windows bounding rectangle instead of the application's */
/* flFontState */ enum _FONT_STATE @@ -207,6 +204,7 @@ HDC FASTCALL IntGdiCreateDisplayDC(HDEV hDev, ULONG DcType, BOOL EmptyDC); BOOL FASTCALL IntGdiCleanDC(HDC hDC); VOID FASTCALL IntvGetDeviceCaps(PPDEVOBJ, PDEVCAPS); +VOID FASTCALL IntUpdateBoundsRect(PDC,PRECTL);
BOOL NTAPI GreSetDCOwner(HDC hdc, ULONG ulOwner); HDC APIENTRY GreCreateCompatibleDC(HDC hdc, BOOL bAltDc);
Modified: trunk/reactos/win32ss/gdi/ntgdi/dcutil.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/ntgdi/dcutil.c?... ============================================================================== --- trunk/reactos/win32ss/gdi/ntgdi/dcutil.c [iso-8859-1] (original) +++ trunk/reactos/win32ss/gdi/ntgdi/dcutil.c [iso-8859-1] Thu Dec 22 17:34:58 2016 @@ -189,8 +189,8 @@ }
DC_vUpdateTextBrush(pdc); -// DC_vUpdateLineBrush(pdc); -// DC_vUpdateFillBrush(pdc); + DC_vUpdateLineBrush(pdc); + DC_vUpdateFillBrush(pdc);
DC_UnlockDc(pdc);
@@ -652,6 +652,20 @@ return Ret; }
+VOID +FASTCALL +IntUpdateBoundsRect(PDC pdc, PRECTL pRect) +{ + if (pdc->fs & DC_ACCUM_APP) + { + RECTL_bUnionRect(&pdc->erclBoundsApp, &pdc->erclBoundsApp, pRect); + } + if (pdc->fs & DC_ACCUM_WMGR) + { + RECTL_bUnionRect(&pdc->erclBounds, &pdc->erclBounds, pRect); + } +} + DWORD APIENTRY NtGdiGetBoundsRect( @@ -661,19 +675,49 @@ { DWORD ret; PDC pdc; + RECT rc;
/* Lock the DC */ if (!(pdc = DC_LockDc(hdc))) return 0;
- /* Get the return value */ - ret = pdc->fs & DC_ACCUM_APP ? DCB_ENABLE : DCB_DISABLE; - ret |= RECTL_bIsEmptyRect(&pdc->erclBoundsApp) ? DCB_RESET : DCB_SET; + if (!(flags & DCB_WINDOWMGR)) + { + rc = pdc->erclBoundsApp; + + if (RECTL_bIsEmptyRect(&rc)) + { + rc.left = rc.top = rc.right = rc.bottom = 0; + ret = DCB_RESET; + } + else + { + RECTL rcRgn; + if (pdc->fs & DC_FLAG_DIRTY_RAO) CLIPPING_UpdateGCRegion(pdc); + if(!REGION_GetRgnBox(pdc->prgnRao, &rcRgn)) + { + REGION_GetRgnBox(pdc->prgnVis, &rcRgn); + } + rc.left = max( rc.left, 0 ); + rc.top = max( rc.top, 0 ); + rc.right = min( rc.right, rcRgn.right - rcRgn.left ); + rc.bottom = min( rc.bottom, rcRgn.bottom - rcRgn.top ); + DPRINT1("Rao dc %p r %d b %d\n",pdc,rcRgn.right - rcRgn.left, rcRgn.bottom - rcRgn.top); + DPRINT1("rc l %d t %d\n",rc.left,rc.top); + DPRINT1(" r %d b %d\n",rc.right,rc.bottom); + ret = DCB_SET; + } + IntDPtoLP( pdc, &rc, 2 ); + DPRINT1("rc1 l %d t %d\n",rc.left,rc.top); + DPRINT1(" r %d b %d\n",rc.right,rc.bottom); + } + else + rc = pdc->erclBounds;
/* Copy the rect to the caller */ _SEH2_TRY { ProbeForWrite(prc, sizeof(RECT), 1); - *prc = pdc->erclBoundsApp; + *prc = rc; } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { @@ -683,13 +727,21 @@
if (flags & DCB_RESET) { - RECTL_vSetEmptyRect(&pdc->erclBoundsApp); + if (!(flags & DCB_WINDOWMGR)) + { + pdc->erclBoundsApp.left = pdc->erclBoundsApp.top = INT_MAX; + pdc->erclBoundsApp.right = pdc->erclBoundsApp.bottom = INT_MIN; + } + else + { + pdc->erclBounds.left = pdc->erclBounds.top = INT_MAX; + pdc->erclBounds.right = pdc->erclBounds.bottom = INT_MIN; + } }
DC_UnlockDc(pdc); return ret; } -
DWORD APIENTRY @@ -709,12 +761,23 @@ if (!(pdc = DC_LockDc(hdc))) return 0;
/* Get the return value */ - ret = pdc->fs & DC_ACCUM_APP ? DCB_ENABLE : DCB_DISABLE; - ret |= RECTL_bIsEmptyRect(&pdc->erclBoundsApp) ? DCB_RESET : DCB_SET; + ret = DCB_RESET; /* we don't have device-specific bounds */ + ret = (pdc->fs & (DC_ACCUM_APP|DC_ACCUM_WMGR) ? DCB_ENABLE : DCB_DISABLE) | + (RECTL_bIsEmptyRect(&pdc->erclBoundsApp) ? ret & DCB_SET : DCB_SET ); + ret |= (flags & DCB_WINDOWMGR);
if (flags & DCB_RESET) { - RECTL_vSetEmptyRect(&pdc->erclBoundsApp); + if (!(flags & DCB_WINDOWMGR)) + { + pdc->erclBoundsApp.left = pdc->erclBoundsApp.top = INT_MAX; + pdc->erclBoundsApp.right = pdc->erclBoundsApp.bottom = INT_MIN; + } + else + { + pdc->erclBounds.left = pdc->erclBounds.top = INT_MAX; + pdc->erclBounds.right = pdc->erclBounds.bottom = INT_MIN; + } }
if (flags & DCB_ACCUMULATE && prc != NULL) @@ -733,11 +796,30 @@ _SEH2_END;
RECTL_vMakeWellOrdered(&rcl); - RECTL_bUnionRect(&pdc->erclBoundsApp, &pdc->erclBoundsApp, &rcl); - } - - if (flags & DCB_ENABLE) pdc->fs |= DC_ACCUM_APP; - if (flags & DCB_DISABLE) pdc->fs &= ~DC_ACCUM_APP; + + if (!(flags & DCB_WINDOWMGR)) + { + IntLPtoDP( pdc, (POINT *)&rcl, 2 ); + RECTL_bUnionRect(&pdc->erclBoundsApp, &pdc->erclBoundsApp, &rcl); + } + else + RECTL_bUnionRect(&pdc->erclBounds, &pdc->erclBounds, &rcl); + } + + if (flags & DCB_ENABLE) + { + if (!(flags & DCB_WINDOWMGR)) + pdc->fs |= DC_ACCUM_APP; + else + pdc->fs |= DC_ACCUM_WMGR; + } + if (flags & DCB_DISABLE) + { + if (!(flags & DCB_WINDOWMGR)) + pdc->fs &= ~DC_ACCUM_APP; + else + pdc->fs &= ~DC_ACCUM_WMGR; + } DC_UnlockDc(pdc); return ret; }
Modified: trunk/reactos/win32ss/gdi/ntgdi/dibobj.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/ntgdi/dibobj.c?... ============================================================================== --- trunk/reactos/win32ss/gdi/ntgdi/dibobj.c [iso-8859-1] (original) +++ trunk/reactos/win32ss/gdi/ntgdi/dibobj.c [iso-8859-1] Thu Dec 22 17:34:58 2016 @@ -558,6 +558,11 @@ rcDest.right = rcDest.left + Width; rcDest.bottom = rcDest.top + Height; rcDest.top += StartScan; + + if (pDC->fs & (DC_ACCUM_APP|DC_ACCUM_WMGR)) + { + IntUpdateBoundsRect(pDC, &rcDest); + }
ptSource.x = XSrc; ptSource.y = YSrc; @@ -1256,6 +1261,11 @@ IntLPtoDP(pdc, (POINTL*)&rcDst, 2); RECTL_vOffsetRect(&rcDst, pdc->ptlDCOrig.x, pdc->ptlDCOrig.y);
+ if (pdc->fs & (DC_ACCUM_APP|DC_ACCUM_WMGR)) + { + IntUpdateBoundsRect(pdc, &rcDst); + } + hbmTmp = GreCreateBitmapEx(pbmi->bmiHeader.biWidth, abs(pbmi->bmiHeader.biHeight), 0,
Modified: trunk/reactos/win32ss/gdi/ntgdi/fillshap.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/ntgdi/fillshap.... ============================================================================== --- trunk/reactos/win32ss/gdi/ntgdi/fillshap.c [iso-8859-1] (original) +++ trunk/reactos/win32ss/gdi/ntgdi/fillshap.c [iso-8859-1] Thu Dec 22 17:34:58 2016 @@ -580,6 +580,11 @@ DestRect.top += dc->ptlDCOrig.y; DestRect.bottom += dc->ptlDCOrig.y;
+ if (dc->fs & (DC_ACCUM_APP|DC_ACCUM_WMGR)) + { + IntUpdateBoundsRect(dc, &DestRect); + } + /* In GM_COMPATIBLE, don't include bottom and right edges */ if (pdcattr->iGraphicsMode == GM_COMPATIBLE) { @@ -978,6 +983,11 @@
ptlDitherOrg.x += pdc->ptlDCOrig.x; ptlDitherOrg.y += pdc->ptlDCOrig.y; + + if (pdc->fs & (DC_ACCUM_APP|DC_ACCUM_WMGR)) + { + IntUpdateBoundsRect(pdc, &rclExtent); + }
DC_vPrepareDCsForBlit(pdc, &rclExtent, NULL, NULL);
@@ -1146,6 +1156,11 @@ RECTL_vSetRect(&DestRect, 0, 0, psurf->SurfObj.sizlBitmap.cx, psurf->SurfObj.sizlBitmap.cy); }
+ if (dc->fs & (DC_ACCUM_APP|DC_ACCUM_WMGR)) + { + IntUpdateBoundsRect(dc, &DestRect); + } + EXLATEOBJ_vInitialize(&exlo, &gpalRGB, psurf->ppal, 0, 0xffffff, 0);
/* Only solid fills supported for now
Modified: trunk/reactos/win32ss/gdi/ntgdi/freetype.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/ntgdi/freetype.... ============================================================================== --- trunk/reactos/win32ss/gdi/ntgdi/freetype.c [iso-8859-1] (original) +++ trunk/reactos/win32ss/gdi/ntgdi/freetype.c [iso-8859-1] Thu Dec 22 17:34:58 2016 @@ -3446,6 +3446,11 @@ DestRect.right += dc->ptlDCOrig.x; DestRect.bottom += dc->ptlDCOrig.y;
+ if (dc->fs & (DC_ACCUM_APP|DC_ACCUM_WMGR)) + { + IntUpdateBoundsRect(dc, &DestRect); + } + DC_vPrepareDCsForBlit(dc, &DestRect, NULL, NULL);
if (pdcattr->ulDirty_ & DIRTY_BACKGROUND) @@ -3722,6 +3727,10 @@ DestRect.top = TextTop + yoff - ((fixAscender + 32) >> 6); DestRect.bottom = TextTop + yoff + ((32 - fixDescender) >> 6); MouseSafetyOnDrawStart(dc->ppdev, DestRect.left, DestRect.top, DestRect.right, DestRect.bottom); + if (dc->fs & (DC_ACCUM_APP|DC_ACCUM_WMGR)) + { + IntUpdateBoundsRect(dc, &DestRect); + } IntEngBitBlt( &psurf->SurfObj, NULL,
Modified: trunk/reactos/win32ss/gdi/ntgdi/line.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/ntgdi/line.c?re... ============================================================================== --- trunk/reactos/win32ss/gdi/ntgdi/line.c [iso-8859-1] (original) +++ trunk/reactos/win32ss/gdi/ntgdi/line.c [iso-8859-1] Thu Dec 22 17:34:58 2016 @@ -12,6 +12,67 @@ #include <debug.h>
// Some code from the WINE project source (www.winehq.com) + +VOID FASTCALL +AddPenLinesBounds(PDC dc, int count, POINT *points) +{ + DWORD join, endcap; + RECTL bounds, rect; + LONG lWidth; + PBRUSH pbrLine; + + /* Get BRUSH from current pen. */ + pbrLine = dc->dclevel.pbrLine; + ASSERT(pbrLine); + + lWidth = pbrLine->lWidth; + + // Setup bounds + bounds.left = bounds.top = INT_MAX; + bounds.right = bounds.bottom = INT_MIN; + + if (((pbrLine->ulPenStyle & PS_TYPE_MASK) & PS_GEOMETRIC) || lWidth > 1) + { + /* Windows uses some heuristics to estimate the distance from the point that will be painted */ + lWidth = lWidth + 2; + endcap = (PS_ENDCAP_MASK & pbrLine->ulPenStyle); + join = (PS_JOIN_MASK & pbrLine->ulPenStyle); + if (join == PS_JOIN_MITER) + { + lWidth *= 5; + if (endcap == PS_ENDCAP_SQUARE) lWidth = (lWidth * 3 + 1) / 2; + } + else + { + if (endcap == PS_ENDCAP_SQUARE) lWidth -= lWidth / 4; + else lWidth = (lWidth + 1) / 2; + } + } + + while (count-- > 0) + { + rect.left = points->x - lWidth; + rect.top = points->y - lWidth; + rect.right = points->x + lWidth + 1; + rect.bottom = points->y + lWidth + 1; + RECTL_bUnionRect(&bounds, &bounds, &rect); + points++; + } + + DPRINT1("APLB dc %p l %d t %d\n",dc,rect.left,rect.top); + DPRINT1(" r %d b %d\n",rect.right,rect.bottom); + + { + RECTL rcRgn; + if (dc->fs & DC_FLAG_DIRTY_RAO) CLIPPING_UpdateGCRegion(dc); + if (REGION_GetRgnBox(dc->prgnRao, &rcRgn)) + { + if (RECTL_bIntersectRect( &rcRgn, &rcRgn, &bounds )) IntUpdateBoundsRect(dc, &rcRgn); + } + else + IntUpdateBoundsRect(dc, &bounds); + } +}
// Should use Fx in Point // @@ -131,6 +192,13 @@ pbrLine = dc->dclevel.pbrLine; ASSERT(pbrLine);
+ if (dc->fs & (DC_ACCUM_APP|DC_ACCUM_WMGR)) + { + DPRINT1("Bounds dc %p l %d t %d\n",dc,Bounds.left,Bounds.top); + DPRINT1(" r %d b %d\n",Bounds.right,Bounds.bottom); + AddPenLinesBounds(dc, 2, Points); + } + if (!(pbrLine->flAttrs & BR_IS_NULL)) { Ret = IntEngLineTo(&psurf->SurfObj, @@ -258,6 +326,11 @@ { Points[i].x += dc->ptlDCOrig.x; Points[i].y += dc->ptlDCOrig.y; + } + + if (dc->fs & (DC_ACCUM_APP|DC_ACCUM_WMGR)) + { + AddPenLinesBounds(dc, Count, Points); }
Ret = IntEngPolyline(&psurf->SurfObj,
Modified: trunk/reactos/win32ss/gdi/ntgdi/pen.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/ntgdi/pen.h?rev... ============================================================================== --- trunk/reactos/win32ss/gdi/ntgdi/pen.h [iso-8859-1] (original) +++ trunk/reactos/win32ss/gdi/ntgdi/pen.h [iso-8859-1] Thu Dec 22 17:34:58 2016 @@ -27,3 +27,5 @@ _In_ PPEN pPen, _In_ INT Count, _Out_ PLOGPEN Buffer); + +VOID FASTCALL AddPenLinesBounds(PDC,int,POINT *);
Modified: trunk/reactos/win32ss/include/ntgdityp.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/include/ntgdityp.h?... ============================================================================== --- trunk/reactos/win32ss/include/ntgdityp.h [iso-8859-1] (original) +++ trunk/reactos/win32ss/include/ntgdityp.h [iso-8859-1] Thu Dec 22 17:34:58 2016 @@ -231,6 +231,8 @@ /* New color use parameter. See support.microsoft.com/kb/kbview/108497 */ #define DIB_PAL_INDICES 2
+/* Get/SetBounds/Rect support. */ +#define DCB_WINDOWMGR 0x8000 /* Queries the Windows bounding rectangle instead of the application's */
/* TYPES *********************************************************************/