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


Reply via email to