Author: hbelusca
Date: Sat Jul  8 00:04:21 2017
New Revision: 75303

URL: http://svn.reactos.org/svn/reactos?rev=75303&view=rev
Log:
[USERINIT]: Paint the ReactOS logo transparently (with alpha channel), much 
like it's done in dll/cpl/sysdm/general.c . CORE-13527 #resolve
This also fixes the drawing mismatch problem reported at CORE-11323 #resolve
Finally, add a standard comctl32 manifest.

Added:
    branches/setup_improvements/base/system/userinit/res/rosbitmap.bmp
      - copied unchanged from r75302, 
branches/setup_improvements/dll/cpl/sysdm/resources/rosbitmap.bmp
    branches/setup_improvements/base/system/userinit/res/rosbitmap_mask.bmp
      - copied unchanged from r75302, 
branches/setup_improvements/dll/cpl/sysdm/resources/rosbitmap_mask.bmp
    branches/setup_improvements/base/system/userinit/res/rosbitmap_old.bmp
      - copied unchanged from r75302, 
branches/setup_improvements/base/system/userinit/res/rosbitmap.bmp
Modified:
    branches/setup_improvements/base/system/userinit/livecd.c
    branches/setup_improvements/base/system/userinit/resource.h
    branches/setup_improvements/base/system/userinit/userinit.h
    branches/setup_improvements/base/system/userinit/userinit.rc

Modified: branches/setup_improvements/base/system/userinit/livecd.c
URL: 
http://svn.reactos.org/svn/reactos/branches/setup_improvements/base/system/userinit/livecd.c?rev=75303&r1=75302&r2=75303&view=diff
==============================================================================
--- branches/setup_improvements/base/system/userinit/livecd.c   [iso-8859-1] 
(original)
+++ branches/setup_improvements/base/system/userinit/livecd.c   [iso-8859-1] 
Sat Jul  8 00:04:21 2017
@@ -11,27 +11,80 @@
 HWND hLocaleList;
 BOOL bSpain = FALSE;
 
+/*
+ * Taken and adapted from dll/cpl/sysdm/general.c
+ */
 static VOID
-InitImageInfo(PIMGINFO ImgInfo)
-{
-    BITMAP bitmap;
-
-    ZeroMemory(ImgInfo, sizeof(*ImgInfo));
-
-    ImgInfo->hBitmap = LoadImageW(hInstance,
-                                  MAKEINTRESOURCEW(IDB_ROSLOGO),
-                                  IMAGE_BITMAP,
-                                  0,
-                                  0,
-                                  LR_DEFAULTCOLOR);
-
-    if (ImgInfo->hBitmap != NULL)
-    {
-        GetObject(ImgInfo->hBitmap, sizeof(bitmap), &bitmap);
-
-        ImgInfo->cxSource = bitmap.bmWidth;
-        ImgInfo->cySource = bitmap.bmHeight;
-    }
+InitLogo(PIMGINFO pImgInfo, HWND hwndDlg)
+{
+    BITMAP logoBitmap;
+    BITMAP maskBitmap;
+    BITMAPINFO bmpi;
+    HDC hDC = GetDC(hwndDlg);
+    HDC hDCLogo = CreateCompatibleDC(NULL);
+    HDC hDCMask = CreateCompatibleDC(NULL);
+    HBITMAP hMask, hLogo, hAlphaLogo = NULL;
+    COLORREF *pBits;
+    INT line, column;
+
+    ZeroMemory(pImgInfo, sizeof(*pImgInfo));
+    ZeroMemory(&bmpi, sizeof(bmpi));
+
+    hLogo = (HBITMAP)LoadImageW(hInstance, MAKEINTRESOURCEW(IDB_ROSLOGO), 
IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);
+    hMask = (HBITMAP)LoadImageW(hInstance, MAKEINTRESOURCEW(IDB_ROSMASK), 
IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);
+
+    if (hLogo != NULL && hMask != NULL)
+    {
+        GetObject(hLogo, sizeof(logoBitmap), &logoBitmap);
+        GetObject(hMask, sizeof(maskBitmap), &maskBitmap);
+
+        if (logoBitmap.bmHeight != maskBitmap.bmHeight || logoBitmap.bmWidth 
!= maskBitmap.bmWidth)
+            goto Cleanup;
+
+        bmpi.bmiHeader.biSize = sizeof(BITMAPINFO);
+        bmpi.bmiHeader.biWidth = logoBitmap.bmWidth;
+        bmpi.bmiHeader.biHeight = logoBitmap.bmHeight;
+        bmpi.bmiHeader.biPlanes = 1;
+        bmpi.bmiHeader.biBitCount = 32;
+        bmpi.bmiHeader.biCompression = BI_RGB;
+        bmpi.bmiHeader.biSizeImage = 4 * logoBitmap.bmWidth * 
logoBitmap.bmHeight;
+
+        /* Create a premultiplied bitmap */
+        hAlphaLogo = CreateDIBSection(hDC, &bmpi, DIB_RGB_COLORS, 
(PVOID*)&pBits, 0, 0);
+        if (!hAlphaLogo)
+            goto Cleanup;
+
+        SelectObject(hDCLogo, hLogo);
+        SelectObject(hDCMask, hMask);
+
+        for (line = logoBitmap.bmHeight - 1; line >= 0; line--)
+        {
+            for (column = 0; column < logoBitmap.bmWidth; column++)
+            {
+                COLORREF alpha = GetPixel(hDCMask, column, line) & 0xFF;
+                COLORREF Color = GetPixel(hDCLogo, column, line);
+                DWORD r, g, b;
+
+                r = GetRValue(Color) * alpha / 255;
+                g = GetGValue(Color) * alpha / 255;
+                b = GetBValue(Color) * alpha / 255;
+
+                *pBits++ = b | g << 8 | r << 16 | alpha << 24;
+            }
+        }
+
+        pImgInfo->hBitmap = hAlphaLogo;
+        pImgInfo->cxSource = logoBitmap.bmWidth;
+        pImgInfo->cySource = logoBitmap.bmHeight;
+        pImgInfo->iBits = logoBitmap.bmBitsPixel;
+        pImgInfo->iPlanes = logoBitmap.bmPlanes;
+    }
+
+Cleanup:
+    DeleteObject(hMask);
+    DeleteObject(hLogo);
+    DeleteDC(hDCMask);
+    DeleteDC(hDCLogo);
 }
 
 
@@ -521,16 +574,19 @@
         hdcMem = CreateCompatibleDC(lpDrawItem->hDC);
         if (hdcMem != NULL)
         {
+            static BLENDFUNCTION BlendFunc = {AC_SRC_OVER, 0, 255, 
AC_SRC_ALPHA};
+
             SelectObject(hdcMem, pState->ImageInfo.hBitmap);
-            BitBlt(lpDrawItem->hDC,
-                   left,
-                   lpDrawItem->rcItem.top,
-                   lpDrawItem->rcItem.right - lpDrawItem->rcItem.left,
-                   lpDrawItem->rcItem.bottom - lpDrawItem->rcItem.top,
-                   hdcMem,
-                   0,
-                   0,
-                   SRCCOPY);
+            GdiAlphaBlend(lpDrawItem->hDC,
+                          left,
+                          lpDrawItem->rcItem.top,
+                          pState->ImageInfo.cxSource,
+                          pState->ImageInfo.cySource,
+                          hdcMem,
+                          0, 0,
+                          pState->ImageInfo.cxSource,
+                          pState->ImageInfo.cySource,
+                          BlendFunc);
             DeleteDC(hdcMem);
         }
     }
@@ -754,7 +810,7 @@
 RunLiveCD(
     PSTATE pState)
 {
-    InitImageInfo(&pState->ImageInfo);
+    InitLogo(&pState->ImageInfo, NULL);
 
     while (pState->NextPage != DONE)
     {

Modified: branches/setup_improvements/base/system/userinit/resource.h
URL: 
http://svn.reactos.org/svn/reactos/branches/setup_improvements/base/system/userinit/resource.h?rev=75303&r1=75302&r2=75303&view=diff
==============================================================================
--- branches/setup_improvements/base/system/userinit/resource.h [iso-8859-1] 
(original)
+++ branches/setup_improvements/base/system/userinit/resource.h [iso-8859-1] 
Sat Jul  8 00:04:21 2017
@@ -4,6 +4,7 @@
 
 /* Bitmaps */
 #define IDB_ROSLOGO          100
+#define IDB_ROSMASK          101
 
 #define IDC_STATIC -1
 

Modified: branches/setup_improvements/base/system/userinit/userinit.h
URL: 
http://svn.reactos.org/svn/reactos/branches/setup_improvements/base/system/userinit/userinit.h?rev=75303&r1=75302&r2=75303&view=diff
==============================================================================
--- branches/setup_improvements/base/system/userinit/userinit.h [iso-8859-1] 
(original)
+++ branches/setup_improvements/base/system/userinit/userinit.h [iso-8859-1] 
Sat Jul  8 00:04:21 2017
@@ -48,6 +48,8 @@
     HBITMAP hBitmap;
     INT cxSource;
     INT cySource;
+    INT iPlanes;
+    INT iBits;
 } IMGINFO, *PIMGINFO;
 
 typedef struct

Modified: branches/setup_improvements/base/system/userinit/userinit.rc
URL: 
http://svn.reactos.org/svn/reactos/branches/setup_improvements/base/system/userinit/userinit.rc?rev=75303&r1=75302&r2=75303&view=diff
==============================================================================
--- branches/setup_improvements/base/system/userinit/userinit.rc        
[iso-8859-1] (original)
+++ branches/setup_improvements/base/system/userinit/userinit.rc        
[iso-8859-1] Sat Jul  8 00:04:21 2017
@@ -3,14 +3,16 @@
 
 #include "resource.h"
 
-#define REACTOS_STR_FILE_DESCRIPTION  "Userinit Logon Application"
-#define REACTOS_STR_INTERNAL_NAME     "userinit"
-#define REACTOS_STR_ORIGINAL_FILENAME "userinit.dll"
+#define REACTOS_STR_FILE_DESCRIPTION    "Userinit Logon Application"
+#define REACTOS_STR_INTERNAL_NAME       "userinit"
+#define REACTOS_STR_ORIGINAL_FILENAME   "userinit.exe"
 #include <reactos/version.rc>
+
+#include <reactos/manifest_exe.rc>
 
 /* Bitmaps */
 IDB_ROSLOGO BITMAP "res/rosbitmap.bmp"
-
+IDB_ROSMASK BITMAP "res/rosbitmap_mask.bmp"
 
 /* UTF-8 */
 #pragma code_page(65001)


Reply via email to