From cfe28d694ec00aa8f8c5a389f860d9d5cc225874 Mon Sep 17 00:00:00 2001 From: wj32 Date: Tue, 8 Nov 2011 05:57:40 +0000 Subject: [PATCH] * bump to 2.24 * added PhxfFillMemoryUlong * added GC_STYLE_FADEOUT to graph control * experimenting with graph appearance git-svn-id: svn://svn.code.sf.net/p/processhacker/code@4812 21ef857c-d57f-4fe0-8362-d861dc6d29cd --- 2.x/trunk/CHANGELOG.txt | 4 + 2.x/trunk/ProcessHacker/include/phappres.h | 4 +- 2.x/trunk/ProcessHacker/sysinfo.c | 28 ++-- 2.x/trunk/phlib/basesupx.c | 95 ++++++++++++ 2.x/trunk/phlib/graph.c | 169 ++++++++++++++++++++- 2.x/trunk/phlib/include/graph.h | 8 + 2.x/trunk/phlib/include/phbase.h | 9 ++ 7 files changed, 294 insertions(+), 23 deletions(-) diff --git a/2.x/trunk/CHANGELOG.txt b/2.x/trunk/CHANGELOG.txt index 3e7f3f341..9ca0bea8b 100644 --- a/2.x/trunk/CHANGELOG.txt +++ b/2.x/trunk/CHANGELOG.txt @@ -1,5 +1,9 @@ Process Hacker +2.24 + * NEW/IMPROVED: + * FIXED: + 2.23 * NEW/IMPROVED: * Added display of token capabilities, user/device claims diff --git a/2.x/trunk/ProcessHacker/include/phappres.h b/2.x/trunk/ProcessHacker/include/phappres.h index d1c75d3ef..0ca679e74 100644 --- a/2.x/trunk/ProcessHacker/include/phappres.h +++ b/2.x/trunk/ProcessHacker/include/phappres.h @@ -1,4 +1,4 @@ #define PHAPP_VERSION_MAJOR 2 -#define PHAPP_VERSION_MINOR 23 +#define PHAPP_VERSION_MINOR 24 #define PHAPP_VERSION_REVISION 0 -#define PHAPP_VERSION_STRING "2.23" +#define PHAPP_VERSION_STRING "2.24" diff --git a/2.x/trunk/ProcessHacker/sysinfo.c b/2.x/trunk/ProcessHacker/sysinfo.c index 5f75465ff..1a54a8c23 100644 --- a/2.x/trunk/ProcessHacker/sysinfo.c +++ b/2.x/trunk/ProcessHacker/sysinfo.c @@ -417,7 +417,7 @@ INT_PTR CALLBACK PhpSysInfoDlgProc( CpuGraphHandle = CreateWindow( PH_GRAPH_CLASSNAME, NULL, - WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS, + WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS | WS_BORDER | GC_STYLE_FADEOUT, 0, 0, 3, @@ -433,7 +433,7 @@ INT_PTR CALLBACK PhpSysInfoDlgProc( IoGraphHandle = CreateWindow( PH_GRAPH_CLASSNAME, NULL, - WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS, + WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS | WS_BORDER | GC_STYLE_FADEOUT, 0, 0, 3, @@ -449,7 +449,7 @@ INT_PTR CALLBACK PhpSysInfoDlgProc( PhysicalGraphHandle = CreateWindow( PH_GRAPH_CLASSNAME, NULL, - WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS, + WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS | WS_BORDER | GC_STYLE_FADEOUT, 0, 0, 3, @@ -526,6 +526,8 @@ INT_PTR CALLBACK PhpSysInfoDlgProc( PostQuitMessage(0); } break; + case WM_CTLCOLORDLG: + return (LONG_PTR)GetSysColorBrush(COLOR_WINDOW); case WM_SHOWWINDOW: { RECT margin; @@ -749,10 +751,10 @@ INT_PTR CALLBACK PhpSysInfoDlgProc( } drawInfo->Flags = PH_GRAPH_USE_GRID | PH_GRAPH_USE_LINE_2; - drawInfo->LineColor1 = PhCsColorCpuKernel; - drawInfo->LineColor2 = PhCsColorCpuUser; - drawInfo->LineBackColor1 = PhHalveColorBrightness(PhCsColorCpuKernel); - drawInfo->LineBackColor2 = PhHalveColorBrightness(PhCsColorCpuUser); + drawInfo->LineColor1 = PhHalveColorBrightness(PhCsColorCpuKernel); + drawInfo->LineColor2 = PhHalveColorBrightness(PhCsColorCpuUser); + drawInfo->LineBackColor1 = PhMakeColorBrighter(PhCsColorCpuKernel, 125); + drawInfo->LineBackColor2 = PhMakeColorBrighter(PhCsColorCpuUser, 125); PhGraphStateGetDrawInfo( &CpuGraphState, @@ -793,10 +795,10 @@ INT_PTR CALLBACK PhpSysInfoDlgProc( } drawInfo->Flags = PH_GRAPH_USE_GRID | PH_GRAPH_USE_LINE_2; - drawInfo->LineColor1 = PhCsColorIoReadOther; - drawInfo->LineColor2 = PhCsColorIoWrite; - drawInfo->LineBackColor1 = PhHalveColorBrightness(PhCsColorIoReadOther); - drawInfo->LineBackColor2 = PhHalveColorBrightness(PhCsColorIoWrite); + drawInfo->LineColor1 = PhHalveColorBrightness(PhCsColorIoReadOther); + drawInfo->LineColor2 = PhHalveColorBrightness(PhCsColorIoWrite); + drawInfo->LineBackColor1 = PhMakeColorBrighter(PhCsColorIoReadOther, 125); + drawInfo->LineBackColor2 = PhMakeColorBrighter(PhCsColorIoWrite, 125); PhGraphStateGetDrawInfo( &IoGraphState, @@ -873,8 +875,8 @@ INT_PTR CALLBACK PhpSysInfoDlgProc( } drawInfo->Flags = PH_GRAPH_USE_GRID; - drawInfo->LineColor1 = PhCsColorPhysical; - drawInfo->LineBackColor1 = PhHalveColorBrightness(PhCsColorPhysical); + drawInfo->LineColor1 = PhHalveColorBrightness(PhCsColorPhysical); + drawInfo->LineBackColor1 = PhMakeColorBrighter(PhCsColorPhysical, 125); PhGraphStateGetDrawInfo( &PhysicalGraphState, diff --git a/2.x/trunk/phlib/basesupx.c b/2.x/trunk/phlib/basesupx.c index 430093def..b80a179b0 100644 --- a/2.x/trunk/phlib/basesupx.c +++ b/2.x/trunk/phlib/basesupx.c @@ -272,6 +272,101 @@ unsigned short __cdecl ph_chksum(unsigned long sum, unsigned short *buf, unsigne #endif +VOID FASTCALL PhxpfFillMemoryUlongFallback( + __inout PULONG Memory, + __in ULONG Value, + __in ULONG Count + ) +{ + if (Count != 0) + { + do + { + *Memory++ = Value; + } while (--Count != 0); + } +} + +/** + * Fills a memory block with a ULONG pattern. + * + * \param Memory The memory block. The block must be + * 4 byte aligned. + * \param Value The ULONG pattern. + * \param Count The number of elements. + */ +PHLIBAPI +VOID +FASTCALL +PhxfFillMemoryUlong( + __inout PULONG Memory, + __in ULONG Value, + __in ULONG Count + ) +{ + __m128i pattern; + ULONG count; + + if (!USER_SHARED_DATA->ProcessorFeatures[PF_XMMI64_INSTRUCTIONS_AVAILABLE]) + { + PhxpfFillMemoryUlongFallback(Memory, Value, Count); + return; + } + + if ((ULONG_PTR)Memory & 0xf) + { + switch ((ULONG_PTR)Memory & 0xf) + { + case 0x4: + if (Count >= 1) + { + *Memory++ = Value; + Count--; + } + __fallthrough; + case 0x8: + if (Count >= 1) + { + *Memory++ = Value; + Count--; + } + __fallthrough; + case 0xc: + if (Count >= 1) + { + *Memory++ = Value; + Count--; + } + break; + } + } + + pattern = _mm_set1_epi32(Value); + count = Count / 4; + + if (count != 0) + { + do + { + _mm_store_si128((__m128i *)Memory, pattern); + Memory += 4; + } while (--count != 0); + } + + switch (Count & 0x3) + { + case 0x3: + *Memory++ = Value; + __fallthrough; + case 0x2: + *Memory++ = Value; + __fallthrough; + case 0x1: + *Memory++ = Value; + break; + } +} + VOID FASTCALL PhxpfAddInt32Fallback( __inout PLONG A, __in PLONG B, diff --git a/2.x/trunk/phlib/graph.c b/2.x/trunk/phlib/graph.c index e7c1f8dd2..82ff1002b 100644 --- a/2.x/trunk/phlib/graph.c +++ b/2.x/trunk/phlib/graph.c @@ -29,6 +29,7 @@ typedef struct _PHP_GRAPH_CONTEXT { HWND Handle; + ULONG Style; PH_GRAPH_DRAW_INFO DrawInfo; HDC BufferedContext; @@ -37,6 +38,12 @@ typedef struct _PHP_GRAPH_CONTEXT PVOID BufferedBits; RECT BufferedContextRect; + HDC FadeOutContext; + HBITMAP FadeOutOldBitmap; + HBITMAP FadeOutBitmap; + PVOID FadeOutBits; + RECT FadeOutContextRect; + HWND TooltipHandle; WNDPROC TooltipOldWndProc; BOOLEAN TooltipVisible; @@ -400,7 +407,6 @@ FORCEINLINE VOID PhpGetGraphPoint( * \li \a Step is fixed at 2. * \li If \ref PH_GRAPH_USE_LINE_2 is specified in \a Flags, \ref PH_GRAPH_OVERLAY_LINE_2 * is never used. - * \li \a BackColor is fixed at RGB(0, 0, 0). */ VOID PhDrawGraphDirect( __in HDC hdc, @@ -457,7 +463,14 @@ VOID PhDrawGraphDirect( lineColor2 = COLORREF_TO_BITS(DrawInfo->LineColor2); lineBackColor2 = COLORREF_TO_BITS(DrawInfo->LineBackColor2); - memset(bits, 0, numberOfPixels * 4); + if (DrawInfo->BackColor == 0) + { + memset(bits, 0, numberOfPixels * 4); + } + else + { + PhxfFillMemoryUlong(bits, COLORREF_TO_BITS(DrawInfo->BackColor), numberOfPixels); + } x = width - 1; intermediate = FALSE; @@ -635,7 +648,7 @@ VOID PhDrawGraphDirect( gridYCounter = 0; // Draw the horizontal grid line. - for (i = x; i < numberOfPixels; i += gridXIncrement) + for (i = x + gridXIncrement; i < numberOfPixels; i += gridXIncrement) { bits[i] = gridColor; } @@ -745,7 +758,7 @@ VOID PhpCreateGraphContext( context->DrawInfo.Height = 3; context->DrawInfo.Flags = PH_GRAPH_USE_GRID; context->DrawInfo.Step = 2; - context->DrawInfo.BackColor = RGB(0x00, 0x00, 0x00); + context->DrawInfo.BackColor = RGB(0xef, 0xef, 0xef); context->DrawInfo.LineDataCount = 0; context->DrawInfo.LineData1 = NULL; context->DrawInfo.LineData2 = NULL; @@ -753,9 +766,9 @@ VOID PhpCreateGraphContext( context->DrawInfo.LineColor2 = RGB(0xff, 0x00, 0x00); context->DrawInfo.LineBackColor1 = RGB(0x00, 0x77, 0x00); context->DrawInfo.LineBackColor2 = RGB(0x77, 0x00, 0x00); - context->DrawInfo.GridColor = RGB(0x00, 0x77, 0x00); - context->DrawInfo.GridWidth = 12; - context->DrawInfo.GridHeight = 12; + context->DrawInfo.GridColor = RGB(0xaf, 0xaf, 0xaf); + context->DrawInfo.GridWidth = 20; + context->DrawInfo.GridHeight = 40; context->DrawInfo.GridStart = 0; context->DrawInfo.TextColor = RGB(0x00, 0xff, 0x00); context->DrawInfo.TextBoxColor = RGB(0x00, 0x22, 0x00); @@ -824,12 +837,81 @@ static VOID PhpCreateBufferedContext( header.biHeight = Context->BufferedContextRect.bottom; header.biPlanes = 1; header.biBitCount = 32; + Context->BufferedBitmap = CreateDIBSection(hdc, (BITMAPINFO *)&header, DIB_RGB_COLORS, &Context->BufferedBits, NULL, 0); ReleaseDC(Context->Handle, hdc); Context->BufferedOldBitmap = SelectObject(Context->BufferedContext, Context->BufferedBitmap); } +static VOID PhpDeleteFadeOutContext( + __in PPHP_GRAPH_CONTEXT Context + ) +{ + if (Context->FadeOutContext) + { + SelectObject(Context->FadeOutContext, Context->FadeOutOldBitmap); + DeleteObject(Context->FadeOutBitmap); + DeleteDC(Context->FadeOutContext); + + Context->FadeOutContext = NULL; + Context->FadeOutBitmap = NULL; + Context->FadeOutBits = NULL; + } +} + +static VOID PhpCreateFadeOutContext( + __in PPHP_GRAPH_CONTEXT Context + ) +{ + HDC hdc; + BITMAPINFOHEADER header; + ULONG i; + ULONG j; + ULONG height; + COLORREF backColor; + ULONG currentAlpha; + ULONG currentColor; + + PhpDeleteFadeOutContext(Context); + + GetClientRect(Context->Handle, &Context->FadeOutContextRect); + Context->FadeOutContextRect.right = GC_FADEOUT_WIDTH; + + hdc = GetDC(Context->Handle); + Context->FadeOutContext = CreateCompatibleDC(hdc); + + memset(&header, 0, sizeof(BITMAPINFOHEADER)); + header.biSize = sizeof(BITMAPINFOHEADER); + header.biWidth = Context->FadeOutContextRect.right; + header.biHeight = Context->FadeOutContextRect.bottom; + header.biPlanes = 1; + header.biBitCount = 32; + + Context->FadeOutBitmap = CreateDIBSection(hdc, (BITMAPINFO *)&header, DIB_RGB_COLORS, &Context->FadeOutBits, NULL, 0); + + ReleaseDC(Context->Handle, hdc); + Context->FadeOutOldBitmap = SelectObject(Context->FadeOutContext, Context->FadeOutBitmap); + + height = Context->FadeOutContextRect.bottom; + backColor = GetSysColor(COLOR_WINDOW); + + for (i = 0; i < GC_FADEOUT_WIDTH; i++) + { + currentAlpha = 255 - (ULONG)((FLOAT)(i * i) / (GC_FADEOUT_WIDTH * GC_FADEOUT_WIDTH) * 255); + currentColor = + ((backColor & 0xff) * currentAlpha / 255) + + ((((backColor >> 8) & 0xff) * currentAlpha / 255) << 8) + + ((((backColor >> 16) & 0xff) * currentAlpha / 255) << 16) + + (currentAlpha << 24); + + for (j = i; j < height * GC_FADEOUT_WIDTH; j += GC_FADEOUT_WIDTH) + { + ((PULONG)Context->FadeOutBits)[j] = currentColor; + } + } +} + static VOID PhpUpdateTooltip( __in PPHP_GRAPH_CONTEXT Context ) @@ -971,7 +1053,10 @@ LRESULT CALLBACK PhpGraphWndProc( { case WM_CREATE: { + CREATESTRUCT *createStruct = (CREATESTRUCT *)lParam; + context->Handle = hwnd; + context->Style = createStruct->style; } break; case WM_DESTROY: @@ -979,6 +1064,7 @@ LRESULT CALLBACK PhpGraphWndProc( if (context->TooltipHandle) DestroyWindow(context->TooltipHandle); + PhpDeleteFadeOutContext(context); PhpDeleteBufferedContext(context); PhpFreeGraphContext(context); SetWindowLongPtr(hwnd, 0, (LONG_PTR)NULL); @@ -988,6 +1074,10 @@ LRESULT CALLBACK PhpGraphWndProc( { // Force a re-create of the buffered context. PhpCreateBufferedContext(context); + + if (context->Style & GC_STYLE_FADEOUT) + PhpCreateFadeOutContext(context); + SendMessage(hwnd, GCM_DRAW, 0, 0); } break; @@ -1009,9 +1099,46 @@ LRESULT CALLBACK PhpGraphWndProc( EndPaint(hwnd, &paintStruct); } } - break; + return 0; case WM_ERASEBKGND: return 1; + case WM_NCPAINT: + { + HRGN updateRegion; + + updateRegion = (HRGN)wParam; + + if (updateRegion == (HRGN)1) // HRGN_FULL + updateRegion = NULL; + + // Themed border + if (context->Style & WS_BORDER) + { + HDC hdc; + ULONG flags; + RECT rect; + + // Note the use of undocumented flags below. GetDCEx doesn't work without these. + + flags = DCX_WINDOW | DCX_LOCKWINDOWUPDATE | 0x10000; + + if (updateRegion) + flags |= DCX_INTERSECTRGN | 0x40000; + + if (hdc = GetDCEx(hwnd, updateRegion, flags)) + { + GetClientRect(hwnd, &rect); + rect.right += 2; + rect.bottom += 2; + SetDCBrushColor(hdc, RGB(0x8f, 0x8f, 0x8f)); + FrameRect(hdc, &rect, GetStockObject(DC_BRUSH)); + + ReleaseDC(hwnd, hdc); + return 0; + } + } + } + break; case WM_NOTIFY: { LPNMHDR header = (LPNMHDR)lParam; @@ -1139,6 +1266,32 @@ LRESULT CALLBACK PhpGraphWndProc( if (context->BufferedBits) PhDrawGraphDirect(context->BufferedContext, context->BufferedBits, &context->DrawInfo); + + if (context->Style & GC_STYLE_FADEOUT) + { + BLENDFUNCTION blendFunction; + + if (!context->FadeOutContext) + PhpCreateFadeOutContext(context); + + blendFunction.BlendOp = AC_SRC_OVER; + blendFunction.BlendFlags = 0; + blendFunction.SourceConstantAlpha = 255; + blendFunction.AlphaFormat = AC_SRC_ALPHA; + GdiAlphaBlend( + context->BufferedContext, + 0, + 0, + GC_FADEOUT_WIDTH, + context->FadeOutContextRect.bottom, + context->FadeOutContext, + 0, + 0, + GC_FADEOUT_WIDTH, + context->FadeOutContextRect.bottom, + blendFunction + ); + } } return TRUE; case GCM_MOVEGRID: diff --git a/2.x/trunk/phlib/include/graph.h b/2.x/trunk/phlib/include/graph.h index aa2b21199..f8a601884 100644 --- a/2.x/trunk/phlib/include/graph.h +++ b/2.x/trunk/phlib/include/graph.h @@ -75,6 +75,14 @@ VOID PhSetGraphText( __in ULONG Align ); +// Configuration + +#define GC_FADEOUT_WIDTH 100 + +// Styles + +#define GC_STYLE_FADEOUT 0x1 + // Messages #define GCM_GETDRAWINFO (WM_APP + 1301) diff --git a/2.x/trunk/phlib/include/phbase.h b/2.x/trunk/phlib/include/phbase.h index feeacc6ad..1a63f0080 100644 --- a/2.x/trunk/phlib/include/phbase.h +++ b/2.x/trunk/phlib/include/phbase.h @@ -3291,6 +3291,15 @@ PhaSubstring( // basesupx (extra) +PHLIBAPI +VOID +FASTCALL +PhxfFillMemoryUlong( + __inout PULONG Memory, + __in ULONG Value, + __in ULONG Count + ); + PHLIBAPI VOID FASTCALL