[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