[ros-diffs] [rharabien] 53031: [WIN32K] - Make UserDrawCaption much more simple and compatible with Windows. It supports now icon given in parameter places text and icon in valid position. Fixes Start button i...
rharabien at svn.reactos.org
rharabien at svn.reactos.org
Tue Aug 2 16:22:40 UTC 2011
Author: rharabien
Date: Tue Aug 2 16:22:39 2011
New Revision: 53031
URL: http://svn.reactos.org/svn/reactos?rev=53031&view=rev
Log:
[WIN32K]
- Make UserDrawCaption much more simple and compatible with Windows. It supports now icon given in parameter places text and icon in valid position. Fixes Start button icon in explorer_new.
- Uncomment two function in win32k. I used one of them in UserDrawCaptionText and seems to work
- Add debug print to NtGdiPatBlt
Modified:
trunk/reactos/subsystems/win32/win32k/ntuser/painting.c
trunk/reactos/subsystems/win32/win32k/objects/bitblt.c
trunk/reactos/subsystems/win32/win32k/objects/text.c
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/painting.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/painting.c?rev=53031&r1=53030&r2=53031&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/painting.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/painting.c [iso-8859-1] Tue Aug 2 16:22:39 2011
@@ -1579,110 +1579,78 @@
END_CLEANUP;
}
-
-BOOL
-UserDrawSysMenuButton(
- PWND pWnd,
- HDC hDc,
- RECTL *lpRc,
- BOOL Down)
-{
- HICON hIcon;
- PCURICON_OBJECT pIcon;
-
- ASSERT(pWnd && lpRc);
-
- /* Get the icon to draw. We don't care about WM_GETICON here. */
-
- hIcon = pWnd->pcls->hIconSm;
-
- if(!hIcon)
- {
- DPRINT("Wnd class has no small icon.\n");
- hIcon = pWnd->pcls->hIcon;
- }
-
- if(!hIcon)
- {
- DPRINT("Wnd class hasn't any icon.\n");
- //FIXME: Draw "winlogo" icon.
- return FALSE;
- }
-
- if(!(pIcon = UserGetCurIconObject(hIcon)))
- {
- DPRINT1("UserGetCurIconObject() failed!\n");
- return FALSE;
- }
-
- return UserDrawIconEx(hDc, lpRc->left, lpRc->top, pIcon,
- UserGetSystemMetrics(SM_CXSMICON),
- UserGetSystemMetrics(SM_CYSMICON),
- 0, NULL, DI_NORMAL);
-}
-
BOOL
UserDrawCaptionText(
HDC hDc,
const PUNICODE_STRING Text,
const RECTL *lpRc,
- UINT uFlags)
-{
- HFONT hOldFont = NULL, hFont = NULL;
+ UINT uFlags,
+ HFONT hFont)
+{
+ HFONT hOldFont = NULL;
COLORREF OldTextColor;
NONCLIENTMETRICSW nclm;
NTSTATUS Status;
- #ifndef NDEBUG
+ BOOLEAN bDeleteFont = FALSE;
+ SIZE Size;
+#ifndef NDEBUG
INT i;
- DPRINT("%s:", __FUNCTION__);
+ DPRINT(""); // print filename and line no.
for(i = 0; i < Text->Length/sizeof(WCHAR); i++)
DbgPrint("%C", Text->Buffer[i]);
DbgPrint(", %d\n", Text->Length/sizeof(WCHAR));
- #endif
+#endif
nclm.cbSize = sizeof(nclm);
if(!UserSystemParametersInfo(SPI_GETNONCLIENTMETRICS,
sizeof(NONCLIENTMETRICS), &nclm, 0))
{
- DPRINT1("%s: UserSystemParametersInfo() failed!\n", __FUNCTION__);
+ DPRINT1("UserSystemParametersInfo() failed!\n");
return FALSE;
}
+ if (!hFont)
+ {
+ if(uFlags & DC_SMALLCAP)
+ Status = TextIntCreateFontIndirect(&nclm.lfSmCaptionFont, &hFont);
+ else
+ Status = TextIntCreateFontIndirect(&nclm.lfCaptionFont, &hFont);
+
+ if(!NT_SUCCESS(Status))
+ {
+ DPRINT1("TextIntCreateFontIndirect() failed! Status: 0x%x\n", Status);
+ return FALSE;
+ }
+
+ bDeleteFont = TRUE;
+ }
+
IntGdiSetBkMode(hDc, TRANSPARENT);
-
- if(uFlags & DC_SMALLCAP)
- Status = TextIntCreateFontIndirect(&nclm.lfSmCaptionFont, &hFont);
- else Status = TextIntCreateFontIndirect(&nclm.lfCaptionFont, &hFont);
-
- if(!NT_SUCCESS(Status))
- {
- DPRINT1("%s: TextIntCreateFontIndirect() failed! Status: 0x%x\n",
- __FUNCTION__, Status);
- return FALSE;
- }
hOldFont = NtGdiSelectFont(hDc, hFont);
if(!hOldFont)
{
- DPRINT1("%s: SelectFont() failed!\n", __FUNCTION__);
- GreDeleteObject(hFont);
- return FALSE;
+ DPRINT1("SelectFont() failed!\n");
+ /* Don't fail */
}
if(uFlags & DC_INBUTTON)
OldTextColor = IntGdiSetTextColor(hDc, IntGetSysColor(COLOR_BTNTEXT));
- else OldTextColor = IntGdiSetTextColor(hDc, IntGetSysColor(uFlags & DC_ACTIVE
+ else
+ OldTextColor = IntGdiSetTextColor(hDc, IntGetSysColor(uFlags & DC_ACTIVE
? COLOR_CAPTIONTEXT : COLOR_INACTIVECAPTIONTEXT));
//FIXME: If string doesn't fit to rc, truncate it and add ellipsis.
-
- GreExtTextOutW(hDc, lpRc->left,
- lpRc->top, 0, NULL, Text->Buffer,
- Text->Length/sizeof(WCHAR), NULL, 0);
+ GreGetTextExtentW(hDc, Text->Buffer, Text->Length/sizeof(WCHAR), &Size, 0);
+ GreExtTextOutW(hDc,
+ lpRc->left, (lpRc->top + lpRc->bottom)/2 - Size.cy/2,
+ 0, NULL, Text->Buffer, Text->Length/sizeof(WCHAR), NULL, 0);
IntGdiSetTextColor(hDc, OldTextColor);
- NtGdiSelectFont(hDc, hOldFont);
- GreDeleteObject(hFont);
+ if (hOldFont)
+ NtGdiSelectFont(hDc, hOldFont);
+ if (bDeleteFont)
+ GreDeleteObject(hFont);
return TRUE;
}
@@ -1693,51 +1661,17 @@
RECTL *lpRc,
HFONT hFont,
HICON hIcon,
- const PUNICODE_STRING str,
+ const PUNICODE_STRING Str,
UINT uFlags)
{
BOOL Ret = FALSE;
- HBITMAP hMemBmp = NULL, hOldBmp = NULL;
- HBRUSH hOldBrush = NULL;
- HDC hMemDc = NULL;
- ULONG Height;
- UINT VCenter = 0, Padding = 0;
- RECTL r = *lpRc;
- LONG ButtonWidth, IconWidth;
+ HBRUSH hBgBrush, hOldBrush = NULL;
+ RECTL Rect = *lpRc;
BOOL HasIcon;
- //ASSERT(pWnd != NULL);
-
RECTL_vMakeWellOrdered(lpRc);
- hMemBmp = NtGdiCreateCompatibleBitmap(hDc,
- lpRc->right - lpRc->left,
- lpRc->bottom - lpRc->top);
-
- if(!hMemBmp)
- {
- DPRINT1("%s: NtGdiCreateCompatibleBitmap() failed!\n", __FUNCTION__);
- return FALSE;
- }
-
- hMemDc = NtGdiCreateCompatibleDC(hDc);
- if(!hMemDc)
- {
- DPRINT1("%s: NtGdiCreateCompatibleDC() failed!\n", __FUNCTION__);
- goto cleanup;
- }
-
- hOldBmp = NtGdiSelectBitmap(hMemDc, hMemBmp);
- if(!hOldBmp)
- {
- DPRINT1("%s: NtGdiSelectBitmap() failed!\n", __FUNCTION__);
- goto cleanup;
- }
-
- Height = UserGetSystemMetrics(SM_CYCAPTION) - 1;
- VCenter = (lpRc->bottom - lpRc->top) / 2;
- Padding = VCenter - (Height / 2);
-
- if ((!hIcon) && (pWnd != NULL))
+
+ if (!hIcon && pWnd != NULL)
{
HasIcon = (uFlags & DC_ICON) && (pWnd->style & WS_SYSMENU)
&& !(uFlags & DC_SMALLCAP) && !(pWnd->ExStyle & WS_EX_DLGMODALFRAME)
@@ -1746,203 +1680,114 @@
else
HasIcon = (hIcon != 0);
- IconWidth = UserGetSystemMetrics(SM_CXSIZE) + Padding;
-
- r.left = Padding;
- r.right = r.left + (lpRc->right - lpRc->left);
- r.top = Padding;
- r.bottom = r.top + (Height / 2);
-
// Draw the caption background
- if(uFlags & DC_INBUTTON)
- {
- hOldBrush = NtGdiSelectBrush(hMemDc,
- IntGetSysColorBrush(COLOR_3DFACE));
+ if((uFlags & DC_GRADIENT) && !(uFlags & DC_INBUTTON))
+ {
+ static GRADIENT_RECT gcap = {0, 1};
+ TRIVERTEX Vertices[2];
+ COLORREF Colors[2];
+
+ Colors[0] = IntGetSysColor((uFlags & DC_ACTIVE) ?
+ COLOR_ACTIVECAPTION : COLOR_INACTIVECAPTION);
+
+ Colors[1] = IntGetSysColor((uFlags & DC_ACTIVE) ?
+ COLOR_GRADIENTACTIVECAPTION : COLOR_GRADIENTINACTIVECAPTION);
+
+ Vertices[0].x = Rect.left;
+ Vertices[0].y = Rect.top;
+ Vertices[0].Red = (WORD)Colors[0]<<8;
+ Vertices[0].Green = (WORD)Colors[0] & 0xFF00;
+ Vertices[0].Blue = (WORD)(Colors[0]>>8) & 0xFF00;
+ Vertices[0].Alpha = 0;
+
+ Vertices[1].x = Rect.right;
+ Vertices[1].y = Rect.bottom;
+ Vertices[1].Red = (WORD)Colors[1]<<8;
+ Vertices[1].Green = (WORD)Colors[1] & 0xFF00;
+ Vertices[1].Blue = (WORD)(Colors[1]>>8) & 0xFF00;
+ Vertices[1].Alpha = 0;
+
+ if(!GreGradientFill(hDc, Vertices, 2, &gcap, 1, GRADIENT_FILL_RECT_H))
+ {
+ DPRINT1("GreGradientFill() failed!\n");
+ goto cleanup;
+ }
+ }
+ else
+ {
+ if(uFlags & DC_INBUTTON)
+ hBgBrush = IntGetSysColorBrush(COLOR_3DFACE);
+ else if(uFlags & DC_ACTIVE)
+ hBgBrush = IntGetSysColorBrush(COLOR_ACTIVECAPTION);
+ else
+ hBgBrush = IntGetSysColorBrush(COLOR_INACTIVECAPTION);
+
+ hOldBrush = NtGdiSelectBrush(hDc, hBgBrush);
if(!hOldBrush)
{
- DPRINT1("%s: NtGdiSelectBrush() failed!\n", __FUNCTION__);
+ DPRINT1("NtGdiSelectBrush() failed!\n");
goto cleanup;
}
- if(!NtGdiPatBlt(hMemDc, 0, 0,
- lpRc->right - lpRc->left,
- lpRc->bottom - lpRc->top,
+ if(!NtGdiPatBlt(hDc, Rect.left, Rect.top,
+ Rect.right - Rect.left,
+ Rect.bottom - Rect.top,
PATCOPY))
{
- DPRINT1("%s: NtGdiPatBlt() failed!\n", __FUNCTION__);
+ DPRINT1("NtGdiPatBlt() failed!\n");
goto cleanup;
}
-
- if(HasIcon) r.left+=IconWidth;
- }
- else
- {
- r.right = (lpRc->right - lpRc->left);
- if(uFlags & DC_SMALLCAP)
- ButtonWidth = UserGetSystemMetrics(SM_CXSMSIZE) - 2;
- else ButtonWidth = UserGetSystemMetrics(SM_CXSIZE) - 2;
-
- hOldBrush = NtGdiSelectBrush(hMemDc,
- IntGetSysColorBrush(uFlags & DC_ACTIVE ?
- COLOR_ACTIVECAPTION : COLOR_INACTIVECAPTION));
-
- if(!hOldBrush)
- {
- DPRINT1("%s: NtGdiSelectBrush() failed!\n", __FUNCTION__);
- goto cleanup;
- }
-
- if(HasIcon && (uFlags & DC_GRADIENT))
- {
- NtGdiPatBlt(hMemDc, 0, 0,
- IconWidth+1,
- lpRc->bottom - lpRc->top,
- PATCOPY);
- r.left+=IconWidth;
- }
- else
- {
- NtGdiPatBlt(hMemDc, 0, 0,
- lpRc->right - lpRc->left,
- lpRc->bottom - lpRc->top,
- PATCOPY);
- }
-
- if(uFlags & DC_GRADIENT)
- {
- static GRADIENT_RECT gcap = {0, 1};
- TRIVERTEX vert[2];
- COLORREF Colors[2];
-
- if (pWnd != NULL)
- {
- if(pWnd->style & WS_SYSMENU)
- {
- r.right -= 3 + ButtonWidth;
- if(!(uFlags & DC_SMALLCAP))
- {
- if(pWnd->style & (WS_MAXIMIZEBOX | WS_MINIMIZEBOX))
- r.right -= 2 + 2 * ButtonWidth;
- else r.right -= 2;
- r.right -= 2;
- }
-
- //Draw buttons background
- if(!NtGdiSelectBrush(hMemDc,
- IntGetSysColorBrush(uFlags & DC_ACTIVE ?
- COLOR_GRADIENTACTIVECAPTION:COLOR_GRADIENTINACTIVECAPTION)))
- {
- DPRINT1("%s: NtGdiSelectBrush() failed!\n", __FUNCTION__);
- goto cleanup;
- }
-
- NtGdiPatBlt(hMemDc,
- r.right,
- 0,
- lpRc->right - lpRc->left - r.right,
- lpRc->bottom - lpRc->top,
- PATCOPY);
- }
- }
-
- Colors[0] = IntGetSysColor((uFlags & DC_ACTIVE) ?
- COLOR_ACTIVECAPTION : COLOR_INACTIVECAPTION);
-
- Colors[1] = IntGetSysColor((uFlags & DC_ACTIVE) ?
- COLOR_GRADIENTACTIVECAPTION : COLOR_GRADIENTINACTIVECAPTION);
-
- vert[0].x = r.left;
- vert[0].y = 0;
- vert[0].Red = (WORD)Colors[0]<<8;
- vert[0].Green = (WORD)Colors[0] & 0xFF00;
- vert[0].Blue = (WORD)(Colors[0]>>8) & 0xFF00;
- vert[0].Alpha = 0;
-
- vert[1].x = r.right;
- vert[1].y = lpRc->bottom - lpRc->top;
- vert[1].Red = (WORD)Colors[1]<<8;
- vert[1].Green = (WORD)Colors[1] & 0xFF00;
- vert[1].Blue = (WORD)(Colors[1]>>8) & 0xFF00;
- vert[1].Alpha = 0;
-
- if(!GreGradientFill(hMemDc, vert, 2, &gcap,
- 1, GRADIENT_FILL_RECT_H))
- {
- DPRINT1("%s: IntGdiGradientFill() failed!\n", __FUNCTION__);
- }
-
- } //if(uFlags & DC_GRADIENT)
- }
-
- if(HasIcon)
- {
- r.top ++;
- r.left -= --IconWidth;
- /* FIXME: Draw the Icon when pWnd == NULL but hIcon is valid */
- if (pWnd != NULL)
- UserDrawSysMenuButton(pWnd, hMemDc, &r, FALSE);
-
- r.left += IconWidth;
- r.top --;
- }
-
- r.top ++;
- r.left += 2;
-
- r.bottom = r.top + Height;
+ }
+
+ /* Draw icon */
+ if (HasIcon)
+ {
+ PCURICON_OBJECT pIcon = NULL;
+
+ if (!hIcon && pWnd)
+ {
+ hIcon = pWnd->pcls->hIconSm; // FIXME: Windows does not do that
+ if(!hIcon)
+ hIcon = pWnd->pcls->hIcon;
+ }
+
+ if (hIcon)
+ pIcon = UserGetCurIconObject(hIcon);
+
+ if (pIcon)
+ {
+ LONG cx = UserGetSystemMetrics(SM_CXSMICON);
+ LONG cy = UserGetSystemMetrics(SM_CYSMICON);
+ LONG x = Rect.left - cx/2 + 1 + (Rect.bottom - Rect.left)/2;
+ LONG y = (Rect.top + Rect.bottom)/2 - cy/2; // center
+ UserDrawIconEx(hDc, x, y, pIcon, cx, cy, 0, NULL, DI_NORMAL);
+ }
+ }
+
+ if (hIcon)
+ Rect.left += Rect.bottom - Rect.top;
if((uFlags & DC_TEXT))
{
- if(!(uFlags & DC_GRADIENT))
- {
- r.right = (lpRc->right - lpRc->left);
-
- if(uFlags & DC_SMALLCAP)
- ButtonWidth = UserGetSystemMetrics(SM_CXSMSIZE) - 2;
- else ButtonWidth = UserGetSystemMetrics(SM_CXSIZE) - 2;
-
- if ((pWnd != NULL) && (pWnd->style & WS_SYSMENU))
- {
- r.right -= 3 + ButtonWidth;
- if(! (uFlags & DC_SMALLCAP))
- {
- if(pWnd->style & (WS_MAXIMIZEBOX | WS_MINIMIZEBOX))
- r.right -= 2 + 2 * ButtonWidth;
- else r.right -= 2;
- r.right -= 2;
- }
- }
- }
-
- /* FIXME: hFont isn't handled */
- if (str)
- UserDrawCaptionText(hMemDc, str, &r, uFlags);
- else if (pWnd != NULL)
+ Rect.left += 2;
+
+ if (Str)
+ UserDrawCaptionText(hDc, Str, &Rect, uFlags, hFont);
+ else if (pWnd != NULL) // FIXME: Windows does not do that
{
UNICODE_STRING ustr;
ustr.Buffer = pWnd->strName.Buffer;
ustr.Length = pWnd->strName.Length;
ustr.MaximumLength = pWnd->strName.MaximumLength;
- UserDrawCaptionText(hMemDc, &ustr, &r, uFlags);
- }
- }
-
- if(!NtGdiBitBlt(hDc, lpRc->left, lpRc->top,
- lpRc->right - lpRc->left, lpRc->bottom - lpRc->top,
- hMemDc, 0, 0, SRCCOPY, 0, 0))
- {
- DPRINT1("%s: NtGdiBitBlt() failed!\n", __FUNCTION__);
- goto cleanup;
+ UserDrawCaptionText(hDc, &ustr, &Rect, uFlags, hFont);
+ }
}
Ret = TRUE;
cleanup:
- if (hOldBrush) NtGdiSelectBrush(hMemDc, hOldBrush);
- if (hOldBmp) NtGdiSelectBitmap(hMemDc, hOldBmp);
- if (hMemBmp) GreDeleteObject(hMemBmp);
- if (hMemDc) NtGdiDeleteObjectApp(hMemDc);
+ if (hOldBrush) NtGdiSelectBrush(hDc, hOldBrush);
return Ret;
}
Modified: trunk/reactos/subsystems/win32/win32k/objects/bitblt.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/objects/bitblt.c?rev=53031&r1=53030&r2=53031&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/objects/bitblt.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/objects/bitblt.c [iso-8859-1] Tue Aug 2 16:22:39 2011
@@ -903,6 +903,7 @@
if (dc->dctype == DC_TYPE_INFO)
{
DC_UnlockDc(dc);
+ DPRINT1("NtGdiPatBlt on info DC!\n");
/* Yes, Windows really returns TRUE in this case */
return TRUE;
}
Modified: trunk/reactos/subsystems/win32/win32k/objects/text.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/objects/text.c?rev=53031&r1=53030&r2=53031&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/objects/text.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/objects/text.c [iso-8859-1] Tue Aug 2 16:22:39 2011
@@ -15,7 +15,6 @@
/** Functions *****************************************************************/
-#if 0
/*
flOpts :
GetTextExtentPoint32W = 0
@@ -135,7 +134,6 @@
DC_UnlockDc(pdc);
return Result;
}
-#endif
DWORD
APIENTRY
More information about the Ros-diffs
mailing list