Author: jimtabor
Date: Tue Dec 13 17:27:37 2016
New Revision: 73450
URL:
http://svn.reactos.org/svn/reactos?rev=73450&view=rev
Log:
[User32]
- Sync/Port wine UI code for drawing.
Modified:
trunk/reactos/win32ss/user/user32/windows/draw.c
Modified: trunk/reactos/win32ss/user/user32/windows/draw.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/user32/window…
==============================================================================
--- trunk/reactos/win32ss/user/user32/windows/draw.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/user/user32/windows/draw.c [iso-8859-1] Tue Dec 13 17:27:37
2016
@@ -136,7 +136,7 @@
|| (uType & BDR_OUTER) == BDR_OUTER)
&& !(uFlags & (BF_FLAT|BF_MONO)) );
int add = (LTRBInnerMono[uType & (BDR_INNER|BDR_OUTER)] != -1 ? 1 : 0)
- + (LTRBOuterMono[uType & (BDR_INNER|BDR_OUTER)] != -1 ? 1 : 0);
+ + (LTRBOuterMono[uType & (BDR_INNER|BDR_OUTER)] != -1 ? 1 : 0);
/* Init some vars */
OuterPen = InnerPen = (HPEN)GetStockObject(NULL_PEN);
@@ -181,10 +181,8 @@
}
}
- if(InnerI != -1)
- InnerPen = GetStockObject(DC_PEN);
- if(OuterI != -1)
- OuterPen = GetStockObject(DC_PEN);
+ if(InnerI != -1) InnerPen = GetStockObject(DC_PEN);
+ if(OuterI != -1) OuterPen = GetStockObject(DC_PEN);
MoveToEx(hdc, 0, 0, &SavePoint);
@@ -246,9 +244,9 @@
{
case BF_DIAGONAL_ENDBOTTOMLEFT:
case (BF_DIAGONAL|BF_BOTTOM):
- case BF_DIAGONAL:
- case (BF_DIAGONAL|BF_LEFT):
- MoveToEx(hdc, spx-1, spy, NULL);
+ case BF_DIAGONAL:
+ case (BF_DIAGONAL|BF_LEFT):
+ MoveToEx(hdc, spx-1, spy, NULL);
LineTo(hdc, epx, epy-1);
Points[0].x = spx-add;
Points[0].y = spy;
@@ -272,10 +270,10 @@
break;
case (BF_DIAGONAL|BF_BOTTOM|BF_RIGHT|BF_TOP):
- case (BF_DIAGONAL|BF_BOTTOM|BF_RIGHT|BF_TOP|BF_LEFT):
- case BF_DIAGONAL_ENDTOPRIGHT:
- case (BF_DIAGONAL|BF_RIGHT|BF_TOP|BF_LEFT):
- MoveToEx(hdc, spx+1, spy, NULL);
+ case (BF_DIAGONAL|BF_BOTTOM|BF_RIGHT|BF_TOP|BF_LEFT):
+ case BF_DIAGONAL_ENDTOPRIGHT:
+ case (BF_DIAGONAL|BF_RIGHT|BF_TOP|BF_LEFT):
+ MoveToEx(hdc, spx+1, spy, NULL);
LineTo(hdc, epx, epy+1);
Points[0].x = epx-1;
Points[0].y = epy+1+add;
@@ -301,9 +299,9 @@
break;
case (BF_DIAGONAL|BF_TOP):
- case (BF_DIAGONAL|BF_BOTTOM|BF_TOP):
- case (BF_DIAGONAL|BF_BOTTOM|BF_TOP|BF_LEFT):
- MoveToEx(hdc, spx+1, spy-1, NULL);
+ case (BF_DIAGONAL|BF_BOTTOM|BF_TOP):
+ case (BF_DIAGONAL|BF_BOTTOM|BF_TOP|BF_LEFT):
+ MoveToEx(hdc, spx+1, spy-1, NULL);
LineTo(hdc, epx, epy);
Points[0].x = epx-1;
Points[0].y = epy+1;
@@ -316,9 +314,9 @@
break;
case (BF_DIAGONAL|BF_RIGHT):
- case (BF_DIAGONAL|BF_RIGHT|BF_LEFT):
- case (BF_DIAGONAL|BF_RIGHT|BF_LEFT|BF_BOTTOM):
- MoveToEx(hdc, spx, spy, NULL);
+ case (BF_DIAGONAL|BF_RIGHT|BF_LEFT):
+ case (BF_DIAGONAL|BF_RIGHT|BF_LEFT|BF_BOTTOM):
+ MoveToEx(hdc, spx, spy, NULL);
LineTo(hdc, epx-1, epy+1);
Points[0].x = spx;
Points[0].y = spy;
@@ -347,14 +345,10 @@
/* Adjust rectangle if asked */
if(uFlags & BF_ADJUST)
{
- if(uFlags & BF_LEFT)
- rc->left += add;
- if(uFlags & BF_RIGHT)
- rc->right -= add;
- if(uFlags & BF_TOP)
- rc->top += add;
- if(uFlags & BF_BOTTOM)
- rc->bottom -= add;
+ if(uFlags & BF_LEFT) rc->left += add;
+ if(uFlags & BF_RIGHT) rc->right -= add;
+ if(uFlags & BF_TOP) rc->top += add;
+ if(uFlags & BF_BOTTOM) rc->bottom -= add;
}
/* Cleanup */
@@ -368,6 +362,7 @@
/* Same as DrawEdge invoked without BF_DIAGONAL
*
* 23-Nov-1997: Changed by Bertho Stultiens
+ * The width parameter sets the width of each outer and inner edge.
*
* Well, I started testing this and found out that there are a few things
* that weren't quite as win95. The following rewrite should reproduce
@@ -434,25 +429,18 @@
* 21 = COLOR_3DDKSHADOW
* 22 = COLOR_3DLIGHT
*/
-static BOOL IntDrawRectEdge(HDC hdc, LPRECT rc, UINT uType, UINT uFlags)
+static BOOL IntDrawRectEdge(HDC hdc, LPRECT rc, UINT uType, UINT uFlags, UINT width)
{
signed char LTInnerI, LTOuterI;
signed char RBInnerI, RBOuterI;
- HPEN LTInnerPen, LTOuterPen;
- HPEN RBInnerPen, RBOuterPen;
- RECT InnerRect = *rc;
- POINT SavePoint;
- HPEN SavePen;
- int LBpenplus = 0;
- int LTpenplus = 0;
- int RTpenplus = 0;
- int RBpenplus = 0;
+ HBRUSH lti_brush, lto_brush, rbi_brush, rbo_brush;
+ RECT InnerRect = *rc, fill_rect;
+ int lbi_offset = 0, lti_offset = 0, rti_offset = 0, rbi_offset = 0;
BOOL retval = !( ((uType & BDR_INNER) == BDR_INNER
- || (uType & BDR_OUTER) == BDR_OUTER)
- && !(uFlags & (BF_FLAT|BF_MONO)) );
- /* Init some vars */
- LTInnerPen = LTOuterPen = RBInnerPen = RBOuterPen = (HPEN)GetStockObject(NULL_PEN);
- SavePen = (HPEN)SelectObject(hdc, LTInnerPen);
+ || (uType & BDR_OUTER) == BDR_OUTER)
+ && !(uFlags & (BF_FLAT|BF_MONO)) );
+
+ lti_brush = lto_brush = rbi_brush = rbo_brush = GetStockObject(NULL_BRUSH);
/* Determine the colors of the edges */
if(uFlags & BF_MONO)
@@ -472,8 +460,7 @@
* otherwise.
* Dennis Björklund, 10 June, 99
*/
- if( LTInnerI != -1 )
- LTInnerI = RBInnerI = COLOR_BTNFACE;
+ if( LTInnerI != -1 ) LTInnerI = RBInnerI = COLOR_BTNFACE;
}
else if(uFlags & BF_SOFT)
{
@@ -490,103 +477,88 @@
RBOuterI = RBOuterNormal[uType & (BDR_INNER|BDR_OUTER)];
}
- if((uFlags & BF_BOTTOMLEFT) == BF_BOTTOMLEFT)
- LBpenplus = 1;
- if((uFlags & BF_TOPRIGHT) == BF_TOPRIGHT)
- RTpenplus = 1;
- if((uFlags & BF_BOTTOMRIGHT) == BF_BOTTOMRIGHT)
- RBpenplus = 1;
- if((uFlags & BF_TOPLEFT) == BF_TOPLEFT)
- LTpenplus = 1;
-
- if(LTInnerI != -1)
- LTInnerPen = GetStockObject(DC_PEN);
- if(LTOuterI != -1)
- LTOuterPen = GetStockObject(DC_PEN);
- if(RBInnerI != -1)
- RBInnerPen = GetStockObject(DC_PEN);
- if(RBOuterI != -1)
- RBOuterPen = GetStockObject(DC_PEN);
- if((uFlags & BF_MIDDLE) && retval)
- {
- FillRect(hdc, &InnerRect, GetSysColorBrush(uFlags & BF_MONO ?
- COLOR_WINDOW : COLOR_BTNFACE));
- }
- MoveToEx(hdc, 0, 0, &SavePoint);
+ if((uFlags & BF_BOTTOMLEFT) == BF_BOTTOMLEFT) lbi_offset = width;
+ if((uFlags & BF_TOPRIGHT) == BF_TOPRIGHT) rti_offset = width;
+ if((uFlags & BF_BOTTOMRIGHT) == BF_BOTTOMRIGHT) rbi_offset = width;
+ if((uFlags & BF_TOPLEFT) == BF_TOPLEFT) lti_offset = width;
+
+ if(LTInnerI != -1) lti_brush = GetSysColorBrush(LTInnerI);
+ if(LTOuterI != -1) lto_brush = GetSysColorBrush(LTOuterI);
+ if(RBInnerI != -1) rbi_brush = GetSysColorBrush(RBInnerI);
+ if(RBOuterI != -1) rbo_brush = GetSysColorBrush(RBOuterI);
/* Draw the outer edge */
- SelectObject(hdc, LTOuterPen);
- SetDCPenColor(hdc, GetSysColor(LTOuterI));
if(uFlags & BF_TOP)
{
- MoveToEx(hdc, InnerRect.left, InnerRect.top, NULL);
- LineTo(hdc, InnerRect.right, InnerRect.top);
+ fill_rect = InnerRect;
+ fill_rect.bottom = fill_rect.top + width;
+ FillRect( hdc, &fill_rect, lto_brush );
}
if(uFlags & BF_LEFT)
{
- MoveToEx(hdc, InnerRect.left, InnerRect.top, NULL);
- LineTo(hdc, InnerRect.left, InnerRect.bottom);
- }
- SelectObject(hdc, RBOuterPen);
- SetDCPenColor(hdc, GetSysColor(RBOuterI));
+ fill_rect = InnerRect;
+ fill_rect.right = fill_rect.left + width;
+ FillRect( hdc, &fill_rect, lto_brush );
+ }
if(uFlags & BF_BOTTOM)
{
- MoveToEx(hdc, InnerRect.left, InnerRect.bottom-1, NULL);
- LineTo(hdc, InnerRect.right, InnerRect.bottom-1);
+ fill_rect = InnerRect;
+ fill_rect.top = fill_rect.bottom - width;
+ FillRect( hdc, &fill_rect, rbo_brush );
}
if(uFlags & BF_RIGHT)
{
- MoveToEx(hdc, InnerRect.right-1, InnerRect.top, NULL);
- LineTo(hdc, InnerRect.right-1, InnerRect.bottom);
+ fill_rect = InnerRect;
+ fill_rect.left = fill_rect.right - width;
+ FillRect( hdc, &fill_rect, rbo_brush );
}
/* Draw the inner edge */
- SelectObject(hdc, LTInnerPen);
- SetDCPenColor(hdc, GetSysColor(LTInnerI));
if(uFlags & BF_TOP)
{
- MoveToEx(hdc, InnerRect.left+LTpenplus, InnerRect.top+1, NULL);
- LineTo(hdc, InnerRect.right-RTpenplus, InnerRect.top+1);
+ SetRect( &fill_rect, InnerRect.left + lti_offset, InnerRect.top + width,
+ InnerRect.right - rti_offset, InnerRect.top + 2 * width );
+ FillRect( hdc, &fill_rect, lti_brush );
}
if(uFlags & BF_LEFT)
{
- MoveToEx(hdc, InnerRect.left+1, InnerRect.top+LTpenplus, NULL);
- LineTo(hdc, InnerRect.left+1, InnerRect.bottom-LBpenplus);
- }
- SelectObject(hdc, RBInnerPen);
- SetDCPenColor(hdc, GetSysColor(RBInnerI));
+ SetRect( &fill_rect, InnerRect.left + width, InnerRect.top + lti_offset,
+ InnerRect.left + 2 * width, InnerRect.bottom - lbi_offset );
+ FillRect( hdc, &fill_rect, lti_brush );
+ }
if(uFlags & BF_BOTTOM)
{
- MoveToEx(hdc, InnerRect.left+LBpenplus, InnerRect.bottom-2, NULL);
- LineTo(hdc, InnerRect.right-RBpenplus, InnerRect.bottom-2);
+ SetRect( &fill_rect, InnerRect.left + lbi_offset, InnerRect.bottom - 2 *
width,
+ InnerRect.right - rbi_offset, InnerRect.bottom - width );
+ FillRect( hdc, &fill_rect, rbi_brush );
}
if(uFlags & BF_RIGHT)
{
- MoveToEx(hdc, InnerRect.right-2, InnerRect.top+RTpenplus, NULL);
- LineTo(hdc, InnerRect.right-2, InnerRect.bottom-RBpenplus);
+ SetRect( &fill_rect, InnerRect.right - 2 * width, InnerRect.top +
rti_offset,
+ InnerRect.right - width, InnerRect.bottom - rbi_offset );
+ FillRect( hdc, &fill_rect, rbi_brush );
}
if( ((uFlags & BF_MIDDLE) && retval) || (uFlags & BF_ADJUST) )
{
- int add = (LTRBInnerMono[uType & (BDR_INNER|BDR_OUTER)] != -1 ? 1 : 0)
- + (LTRBOuterMono[uType & (BDR_INNER|BDR_OUTER)] != -1 ? 1 :
0);
-
- if(uFlags & BF_LEFT)
- InnerRect.left += add;
- if(uFlags & BF_RIGHT)
- InnerRect.right -= add;
- if(uFlags & BF_TOP)
- InnerRect.top += add;
- if(uFlags & BF_BOTTOM)
- InnerRect.bottom -= add;
-
- if(uFlags & BF_ADJUST)
- *rc = InnerRect;
- }
-
- /* Cleanup */
- SelectObject(hdc, SavePen);
- MoveToEx(hdc, SavePoint.x, SavePoint.y, NULL);
+ int add = (LTRBInnerMono[uType & (BDR_INNER|BDR_OUTER)] != -1 ? width : 0)
+ + (LTRBOuterMono[uType & (BDR_INNER|BDR_OUTER)] != -1 ? width : 0);
+
+ if(uFlags & BF_LEFT) InnerRect.left += add;
+ if(uFlags & BF_RIGHT) InnerRect.right -= add;
+ if(uFlags & BF_TOP) InnerRect.top += add;
+ if(uFlags & BF_BOTTOM) InnerRect.bottom -= add;
+
+ if((uFlags & BF_MIDDLE) && retval)
+ {
+ FillRect(hdc, &InnerRect, GetSysColorBrush(uFlags & BF_MONO ?
+ COLOR_WINDOW : COLOR_BTNFACE));
+ }
+
+ if(uFlags & BF_ADJUST)
+ *rc = InnerRect;
+ }
+
return retval;
}
@@ -659,9 +631,9 @@
if(uFlags & DFCS_CHECKED)
{
if(uFlags & DFCS_MONO)
- IntDrawRectEdge(dc, &myr, edge, BF_MONO|BF_RECT|BF_ADJUST);
+ IntDrawRectEdge(dc, &myr, edge, BF_MONO|BF_RECT|BF_ADJUST, 1);
else
- IntDrawRectEdge(dc, &myr, edge,
(uFlags&DFCS_FLAT)|BF_RECT|BF_SOFT|BF_ADJUST);
+ IntDrawRectEdge(dc, &myr, edge,
(uFlags&DFCS_FLAT)|BF_RECT|BF_SOFT|BF_ADJUST, 1);
UITOOLS_DrawCheckedRect( dc, &myr );
}
@@ -669,23 +641,18 @@
{
if(uFlags & DFCS_MONO)
{
- IntDrawRectEdge(dc, &myr, edge, BF_MONO|BF_RECT|BF_ADJUST);
+ IntDrawRectEdge(dc, &myr, edge, BF_MONO|BF_RECT|BF_ADJUST, 1);
FillRect(dc, &myr, GetSysColorBrush(COLOR_BTNFACE));
}
else
{
- IntDrawRectEdge(dc, r, edge, (uFlags&DFCS_FLAT) | BF_MIDDLE | BF_RECT |
BF_SOFT);
+ IntDrawRectEdge(dc, r, edge, (uFlags&DFCS_FLAT) | BF_MIDDLE | BF_RECT |
BF_SOFT, 1);
}
}
/* Adjust rectangle if asked */
if(uFlags & DFCS_ADJUSTRECT)
- {
- r->left += 2;
- r->right -= 2;
- r->top += 2;
- r->bottom -= 2;
- }
+ InflateRect(r, -2, -2);
return TRUE;
}
@@ -830,9 +797,10 @@
Symbol = '2';
break;
default:
+ WARN("Invalid caption; flags=0x%04x\n", uFlags);
return FALSE;
}
- IntDrawRectEdge(dc,r,(uFlags&DFCS_PUSHED) ? EDGE_SUNKEN : EDGE_RAISED, BF_RECT |
BF_MIDDLE | BF_SOFT);
+ IntDrawRectEdge(dc,r,(uFlags&DFCS_PUSHED) ? EDGE_SUNKEN : EDGE_RAISED, BF_RECT |
BF_MIDDLE | BF_SOFT, 1);
ZeroMemory(&lf, sizeof(LOGFONTW));
UITOOLS_MakeSquareRect(r, &myr);
myr.left += 1;
@@ -932,9 +900,10 @@
DeleteObject(hFont);
return TRUE;
default:
+ WARN("Invalid scroll; flags=0x%04x\n", uFlags);
return FALSE;
}
- IntDrawRectEdge(dc, r, (uFlags & DFCS_PUSHED) ? EDGE_SUNKEN : EDGE_RAISED,
(uFlags&DFCS_FLAT) | BF_MIDDLE | BF_RECT);
+ IntDrawRectEdge(dc, r, (uFlags & DFCS_PUSHED) ? EDGE_SUNKEN : EDGE_RAISED,
(uFlags&DFCS_FLAT) | BF_MIDDLE | BF_RECT, 1);
ZeroMemory(&lf, sizeof(LOGFONTW));
UITOOLS_MakeSquareRect(r, &myr);
myr.left += 1;
@@ -1004,9 +973,7 @@
break;
default:
-/*
- DbgPrint("Invalid menu; flags=0x%04x\n", uFlags);
-*/
+ WARN("Invalid menu; flags=0x%04x\n", uFlags);
return FALSE;
}
/* acquire ressources only if valid menu */
@@ -1290,16 +1257,11 @@
return FALSE;
}
- if(!cx)
- cx = s.cx;
- if(!cy)
- cy = s.cy;
- }
-
- rc.left = x;
- rc.top = y;
- rc.right = x + cx;
- rc.bottom = y + cy;
+ if(!cx) cx = s.cx;
+ if(!cy) cy = s.cy;
+ }
+
+ SetRect(&rc, x, y, x + cx, y + cy);
if(flags & DSS_RIGHT) /* This one is not documented in the win32.hlp file */
dtflags |= DT_RIGHT;
@@ -1329,33 +1291,25 @@
/* From here on we must use "goto cleanup" when something goes wrong */
hbm = CreateBitmap(cx, cy, 1, 1, NULL);
- if(!hbm)
- goto cleanup;
+ if(!hbm) goto cleanup;
memdc = CreateCompatibleDC(hdc);
- if(!memdc)
- goto cleanup;
+ if(!memdc) goto cleanup;
hbmsave = (HBITMAP)SelectObject(memdc, hbm);
- if(!hbmsave)
- goto cleanup;
- rc.left = rc.top = 0;
- rc.right = cx;
- rc.bottom = cy;
- if(!FillRect(memdc, &rc, (HBRUSH)GetStockObject(WHITE_BRUSH)))
- goto cleanup;
+ if(!hbmsave) goto cleanup;
+ SetRect(&rc, 0, 0, cx, cy);
+ if(!FillRect(memdc, &rc, (HBRUSH)GetStockObject(WHITE_BRUSH))) goto cleanup;
SetBkColor(memdc, RGB(255, 255, 255));
SetTextColor(memdc, RGB(0, 0, 0));
hfsave = (HFONT)SelectObject(memdc, GetCurrentObject(hdc, OBJ_FONT));
+ SetLayout( memdc, GetLayout( hdc ));
/* DST_COMPLEX may draw text as well,
* so we must be sure that correct font is selected
*/
- if(!hfsave && (opcode <= DST_PREFIXTEXT))
- goto cleanup;
+ if(!hfsave && (opcode <= DST_PREFIXTEXT)) goto cleanup;
tmp = PAINTING_DrawStateJam(memdc, opcode, func, lp, len, &rc, dtflags,
unicode);
- if(hfsave)
- SelectObject(memdc, hfsave);
- if(!tmp)
- goto cleanup;
+ if(hfsave) SelectObject(memdc, hfsave);
+ if(!tmp) goto cleanup;
/* This state cause the image to be dithered */
if(flags & DSS_UNION)
@@ -1375,21 +1329,17 @@
/* Draw light or dark shadow */
if (flags & (DSS_DISABLED|DSS_DEFAULT))
{
- if(!hbrtmp)
- goto cleanup;
+ if(!hbrtmp) goto cleanup;
hbsave = (HBRUSH)SelectObject(hdc, hbrtmp);
- if(!hbsave)
- goto cleanup;
- if(!BitBlt(hdc, x+1, y+1, cx, cy, memdc, 0, 0, 0x00B8074A))
- goto cleanup;
+ if(!hbsave) goto cleanup;
+ if(!BitBlt(hdc, x+1, y+1, cx, cy, memdc, 0, 0, 0x00B8074A)) goto cleanup;
SelectObject(hdc, hbsave);
}
if (flags & DSS_DISABLED)
{
hbr = hbrtmp = GetSysColorBrush(COLOR_3DSHADOW);
- if(!hbrtmp)
- goto cleanup;
+ if(!hbrtmp) goto cleanup;
}
else if (!hbr)
{
@@ -1398,8 +1348,7 @@
hbsave = (HBRUSH)SelectObject(hdc, hbr);
- if(!BitBlt(hdc, x, y, cx, cy, memdc, 0, 0, 0x00B8074A))
- goto cleanup;
+ if(!BitBlt(hdc, x, y, cx, cy, memdc, 0, 0, 0x00B8074A)) goto cleanup;
retval = TRUE; /* We succeeded */
@@ -1407,14 +1356,10 @@
SetTextColor(hdc, fg);
SetBkColor(hdc, bg);
- if(hbsave)
- SelectObject(hdc, hbsave);
- if(hbmsave)
- SelectObject(memdc, hbmsave);
- if(hbm)
- DeleteObject(hbm);
- if(memdc)
- DeleteDC(memdc);
+ if(hbsave) SelectObject(hdc, hbsave);
+ if(hbmsave) SelectObject(memdc, hbmsave);
+ if(hbm) DeleteObject(hbm);
+ if(memdc) DeleteDC(memdc);
return retval;
}
@@ -1482,7 +1427,7 @@
if (flags & BF_DIAGONAL)
return IntDrawDiagEdge(hDC, rc, edge, flags);
else
- return IntDrawRectEdge(hDC, rc, edge, flags);
+ return IntDrawRectEdge(hDC, rc, edge, flags, 1);
}
/*
@@ -1524,7 +1469,7 @@
HBRUSH oldbrush;
RECT r = *lprc;
- if ((r.right <= r.left) || (r.bottom <= r.top)) return 0;
+ if (IsRectEmpty(&r)) return 0;
if (!(oldbrush = SelectObject(hDC, hbr))) return 0;
PatBlt(hDC, r.left, r.top, 1, r.bottom - r.top, PATCOPY);