Author: khornicek
Date: Mon Apr 21 18:27:40 2014
New Revision: 62856
URL:
http://svn.reactos.org/svn/reactos?rev=62856&view=rev
Log:
[SYSDM]
- use alpha blend when drawing the ros logo on the general page
- misc code cleanup
CORE-8071
Added:
trunk/reactos/dll/cpl/sysdm/resources/rosbitmap_mask.bmp (with props)
Modified:
trunk/reactos/dll/cpl/sysdm/general.c
trunk/reactos/dll/cpl/sysdm/resource.h
trunk/reactos/dll/cpl/sysdm/resources/rosbitmap.bmp
trunk/reactos/dll/cpl/sysdm/sysdm.rc
Modified: trunk/reactos/dll/cpl/sysdm/general.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/cpl/sysdm/general.c?re…
==============================================================================
--- trunk/reactos/dll/cpl/sysdm/general.c [iso-8859-1] (original)
+++ trunk/reactos/dll/cpl/sysdm/general.c [iso-8859-1] Mon Apr 21 18:27:40 2014
@@ -22,12 +22,14 @@
HBITMAP hBitmap;
INT cxSource;
INT cySource;
+ INT iPLanes;
+ INT iBits;
} IMGINFO, *PIMGINFO;
PIMGINFO pImgInfo = NULL;
-
-void
-ShowLastWin32Error(HWND hWndOwner)
+BLENDFUNCTION BlendFunc = {AC_SRC_OVER, 0, 255, AC_SRC_ALPHA};
+
+VOID ShowLastWin32Error(HWND hWndOwner)
{
LPTSTR lpMsg;
DWORD LastError;
@@ -53,39 +55,86 @@
}
-static VOID
-InitImageInfo(PIMGINFO ImgInfo)
-{
- BITMAP bitmap;
-
- ZeroMemory(ImgInfo, sizeof(*ImgInfo));
-
- ImgInfo->hBitmap = LoadImage(hApplet,
- MAKEINTRESOURCE(IDB_ROSBMP),
- IMAGE_BITMAP,
- 0,
- 0,
- LR_DEFAULTCOLOR);
-
- if (ImgInfo->hBitmap != NULL)
- {
- GetObject(ImgInfo->hBitmap, sizeof(BITMAP), &bitmap);
-
- ImgInfo->cxSource = bitmap.bmWidth;
- ImgInfo->cySource = bitmap.bmHeight;
- }
+static VOID InitLogo(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)LoadImage(hApplet, MAKEINTRESOURCE(IDB_ROSBMP), IMAGE_BITMAP, 0, 0,
LR_DEFAULTCOLOR);
+ hMask = (HBITMAP)LoadImage(hApplet, MAKEINTRESOURCE(IDB_ROSMASK), IMAGE_BITMAP, 0, 0,
LR_DEFAULTCOLOR);
+
+ if (hLogo != NULL && hMask != NULL)
+ {
+ GetObject(hLogo, sizeof(BITMAP), &logoBitmap);
+ GetObject(hMask, sizeof(BITMAP), &maskBitmap);
+
+ if(logoBitmap.bmHeight != maskBitmap.bmHeight || logoBitmap.bmWidth !=
maskBitmap.bmWidth)
+ return;
+
+ pImgInfo->cxSource = logoBitmap.bmWidth;
+ pImgInfo->cySource = logoBitmap.bmHeight;
+
+ 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;
+
+ hAlphaLogo = CreateDIBSection(hDC, &bmpi, DIB_RGB_COLORS, (PVOID*)&pBits,
0, 0);
+
+ if(!hAlphaLogo)
+ return;
+
+ 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;
+
+ DeleteObject(hLogo);
+ DeleteObject(hMask);
+ DeleteDC(hDCLogo);
+ DeleteDC(hDCMask);
+
}
LRESULT CALLBACK RosImageProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static UINT timerid = 0, top = 0, offset;
- static HBITMAP hBitmap2;
- RECT r;
- NONCLIENTMETRICS ncm;
- HFONT hfont;
- BITMAP bitmap;
- HDC dc, sdc;
- TCHAR devtext[2048];
+ static HBITMAP hCreditsBitmap;
+
switch (uMsg)
{
case WM_LBUTTONDBLCLK:
@@ -93,51 +142,65 @@
{
if (timerid == 0)
{
- top = 0; // Set top
-
- // Build new bitmap
- GetObject(pImgInfo->hBitmap, sizeof(BITMAP), &bitmap);
- dc = CreateCompatibleDC(GetDC(NULL));
- if (dc == NULL)
- {
+ HDC hCreditsDC, hLogoDC;
+ HFONT hFont;
+ NONCLIENTMETRICS ncm;
+ RECT rcCredits;
+ TCHAR szCredits[2048];
+ INT iDevsHeight;
+
+ top = 0;
+ offset = 0;
+ hCreditsDC = CreateCompatibleDC(GetDC(NULL));
+ hLogoDC = CreateCompatibleDC(hCreditsDC);
+
+ if (hCreditsDC == NULL || hLogoDC == NULL)
break;
- }
- sdc = CreateCompatibleDC(dc);
- if (sdc == NULL)
- {
- DeleteDC(dc);
- break;
- }
+
+ SetRect(&rcCredits, 0, 0, 0, 0);
+
ncm.cbSize = sizeof(NONCLIENTMETRICS);
SystemParametersInfo(SPI_GETNONCLIENTMETRICS,
sizeof(NONCLIENTMETRICS), &ncm, 0);
- hfont = CreateFontIndirect(&ncm.lfMessageFont);
- SelectObject(dc, hfont);
- SetRect(&r, 0, 0, 0, 0);
- LoadString(hApplet, IDS_DEVS, devtext, sizeof(devtext) /
sizeof(TCHAR));
- DrawText(dc, devtext, -1, &r, DT_CALCRECT);
- hBitmap2 = CreateBitmap(pImgInfo->cxSource, (2 *
pImgInfo->cySource) + (r.bottom + 1 - r.top), bitmap.bmPlanes, bitmap.bmBitsPixel,
NULL);
- SelectObject(sdc, pImgInfo->hBitmap);
- SelectObject(dc, hBitmap2);
- offset = 0;
- BitBlt(dc, 0, offset, bitmap.bmWidth, bitmap.bmHeight, sdc, 0, 0,
SRCCOPY);
- offset += bitmap.bmHeight;
-
- SetRect(&r, 0, offset, bitmap.bmWidth, offset + (r.bottom -
r.top) + 1);
- FillRect(dc, &r, GetSysColorBrush(COLOR_3DFACE));
- SetBkMode(dc, TRANSPARENT);
- OffsetRect(&r, 1, 1);
- SetTextColor(dc, GetSysColor(COLOR_BTNSHADOW));
- DrawText(dc, devtext, -1, &r, DT_CENTER);
- OffsetRect(&r, -1, -1);
- SetTextColor(dc, GetSysColor(COLOR_WINDOWTEXT));
- DrawText(dc, devtext, -1, &r, DT_CENTER);
- offset += r.bottom - r.top;
-
- BitBlt(dc, 0, offset, bitmap.bmWidth, bitmap.bmHeight, sdc, 0, 0,
SRCCOPY);
- offset += bitmap.bmHeight;
- DeleteDC(sdc);
- DeleteDC(dc);
+ hFont = CreateFontIndirect(&ncm.lfMessageFont);
+ SelectObject(hCreditsDC, hFont);
+
+ LoadString(hApplet, IDS_DEVS, szCredits, sizeof(szCredits) /
sizeof(TCHAR));
+ DrawText(hCreditsDC, szCredits, -1, &rcCredits, DT_CALCRECT);
+
+ iDevsHeight = rcCredits.bottom - rcCredits.top;
+
+ hCreditsBitmap = CreateBitmap(pImgInfo->cxSource, (2 *
pImgInfo->cySource) + iDevsHeight + 1, pImgInfo->iPLanes, pImgInfo->iBits,
NULL);
+
+ if(!hCreditsBitmap)
+ break;
+
+ SelectObject(hLogoDC, pImgInfo->hBitmap);
+ SelectObject(hCreditsDC, hCreditsBitmap);
+
+ offset += pImgInfo->cySource;
+
+ SetRect(&rcCredits, 0, 0, pImgInfo->cxSource, (2 *
pImgInfo->cySource) + iDevsHeight + 1);
+ FillRect(hCreditsDC, &rcCredits,
GetSysColorBrush(COLOR_3DFACE));
+
+ SetRect(&rcCredits, 0, offset, pImgInfo->cxSource, offset +
iDevsHeight + 1);
+ SetBkMode(hCreditsDC, TRANSPARENT);
+
+ OffsetRect(&rcCredits, 1, 1);
+ SetTextColor(hCreditsDC, GetSysColor(COLOR_BTNSHADOW));
+ DrawText(hCreditsDC, szCredits, -1, &rcCredits, DT_CENTER);
+
+ OffsetRect(&rcCredits, -1, -1);
+ SetTextColor(hCreditsDC, GetSysColor(COLOR_WINDOWTEXT));
+ DrawText(hCreditsDC, szCredits, -1, &rcCredits, DT_CENTER);
+
+ offset += iDevsHeight;
+
+ AlphaBlend(hCreditsDC, 0, 0, pImgInfo->cxSource,
pImgInfo->cySource, hLogoDC, 0, 0, pImgInfo->cxSource, pImgInfo->cySource,
BlendFunc);
+ AlphaBlend(hCreditsDC, 0, offset, pImgInfo->cxSource,
pImgInfo->cySource, hLogoDC, 0, 0, pImgInfo->cxSource, pImgInfo->cySource,
BlendFunc);
+
+ DeleteDC(hLogoDC);
+ DeleteDC(hCreditsDC);
timerid = SetTimer(hwnd, 1, ANIM_TIME, NULL);
}
@@ -146,22 +209,40 @@
case WM_LBUTTONDOWN:
if (timerid)
{
+ RECT rcCredits;
+ HDC hDC = GetDC(hwnd);
+
+ GetClientRect(hwnd, &rcCredits);
+ SetRect(&rcCredits, 0, 0, rcCredits.right, pImgInfo->cySource);
+ FillRect(hDC, &rcCredits, GetSysColorBrush(COLOR_3DFACE));
+
KillTimer(hwnd, timerid);
+ DeleteObject(hCreditsBitmap);
+ InvalidateRect(hwnd, NULL, FALSE);
+
top = 0;
timerid = 0;
- DeleteObject(hBitmap2);
- InvalidateRect(hwnd, NULL, FALSE);
}
break;
case WM_TIMER:
top += ANIM_STEP;
- if (top > offset - pImgInfo->cySource)
- {
+
+ if (top > offset)
+ {
+ RECT rcCredits;
+ HDC hDC = GetDC(hwnd);
+
+ GetClientRect(hwnd, &rcCredits);
+ SetRect(&rcCredits, 0, 0, rcCredits.right, pImgInfo->cySource);
+ FillRect(hDC, &rcCredits, GetSysColorBrush(COLOR_3DFACE));
+
KillTimer(hwnd, timerid);
+ DeleteObject(hCreditsBitmap);
+
top = 0;
timerid = 0;
- DeleteObject(hBitmap2);
- }
+ }
+
InvalidateRect(hwnd, NULL, FALSE);
break;
case WM_PAINT:
@@ -169,15 +250,10 @@
PAINTSTRUCT PS;
HDC hdcMem, hdc;
LONG left;
- if (wParam != 0)
- {
- hdc = (HDC)wParam;
- }
- else
- {
- hdc = BeginPaint(hwnd,&PS);
- }
- GetClientRect(hwnd,&PS.rcPaint);
+
+ hdc = wParam != 0 ? (HDC)wParam : BeginPaint(hwnd, &PS);
+
+ GetClientRect(hwnd, &PS.rcPaint);
/* Position image in center of dialog */
left = (PS.rcPaint.right - pImgInfo->cxSource) / 2;
@@ -185,16 +261,17 @@
if (hdcMem != NULL)
{
- SelectObject(hdcMem, timerid ? hBitmap2 : pImgInfo->hBitmap);
- BitBlt(hdc,
- left,
- PS.rcPaint.top,
- PS.rcPaint.right - PS.rcPaint.left,
- PS.rcPaint.top + pImgInfo->cySource,
- hdcMem,
- 0,
- top,
- SRCCOPY);
+ if(timerid != 0)
+ {
+ SelectObject(hdcMem, hCreditsBitmap);
+ BitBlt(hdc, left, PS.rcPaint.top, PS.rcPaint.right - PS.rcPaint.left,
PS.rcPaint.top + pImgInfo->cySource, hdcMem, 0, top, SRCCOPY);
+ }
+ else
+ {
+ SelectObject(hdcMem, pImgInfo->hBitmap);
+ AlphaBlend(hdc, left, PS.rcPaint.top, pImgInfo->cxSource,
pImgInfo->cySource, hdcMem, 0, 0, pImgInfo->cxSource, pImgInfo->cySource,
BlendFunc);
+ }
+
DeleteDC(hdcMem);
}
@@ -521,7 +598,7 @@
return FALSE;
}
- InitImageInfo(pImgInfo);
+ InitLogo(hwndDlg);
SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_ROSIMG), GWL_WNDPROC,
(LONG)RosImageProc);
GetSystemInformation(hwndDlg);
break;
Modified: trunk/reactos/dll/cpl/sysdm/resource.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/cpl/sysdm/resource.h?r…
==============================================================================
--- trunk/reactos/dll/cpl/sysdm/resource.h [iso-8859-1] (original)
+++ trunk/reactos/dll/cpl/sysdm/resource.h [iso-8859-1] Mon Apr 21 18:27:40 2014
@@ -10,6 +10,7 @@
#define IDI_DOWN 2501
#define IDB_ROSBMP 55
+#define IDB_ROSMASK 56
#define IDS_CPLSYSTEMNAME 60
#define IDS_CPLSYSTEMDESCRIPTION 61
Modified: trunk/reactos/dll/cpl/sysdm/resources/rosbitmap.bmp
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/cpl/sysdm/resources/ro…
==============================================================================
Binary files - no diff available.
Added: trunk/reactos/dll/cpl/sysdm/resources/rosbitmap_mask.bmp
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/cpl/sysdm/resources/ro…
==============================================================================
Binary file - no diff available.
Propchange: trunk/reactos/dll/cpl/sysdm/resources/rosbitmap_mask.bmp
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Modified: trunk/reactos/dll/cpl/sysdm/sysdm.rc
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/cpl/sysdm/sysdm.rc?rev…
==============================================================================
--- trunk/reactos/dll/cpl/sysdm/sysdm.rc [iso-8859-1] (original)
+++ trunk/reactos/dll/cpl/sysdm/sysdm.rc [iso-8859-1] Mon Apr 21 18:27:40 2014
@@ -19,6 +19,7 @@
IDI_UP ICON "resources/up.ico"
IDI_DOWN ICON "resources/down.ico"
IDB_ROSBMP BITMAP "resources/rosbitmap.bmp"
+IDB_ROSMASK BITMAP "resources/rosbitmap_mask.bmp"
RC_LICENSE RTDATA "resources/gpl.txt"