https://git.reactos.org/?p=reactos.git;a=commitdiff;h=c83ac7600db761020804b…
commit c83ac7600db761020804b2ca1cd5a788d0b1c741
Author: Stanislav Motylkov <x86corez(a)gmail.com>
AuthorDate: Wed Oct 24 19:16:22 2018 +0300
Commit: Hermès BÉLUSCA - MAÏTO <hermes.belusca-maito(a)reactos.org>
CommitDate: Wed Oct 24 23:05:00 2018 +0200
[SHIMGVW] Fix image flickering when rendering animations
---
dll/win32/shimgvw/shimgvw.c | 29 +++++++++++++++++++++++++----
1 file changed, 25 insertions(+), 4 deletions(-)
diff --git a/dll/win32/shimgvw/shimgvw.c b/dll/win32/shimgvw/shimgvw.c
index 683e9b3c7e..c65410b2fd 100644
--- a/dll/win32/shimgvw/shimgvw.c
+++ b/dll/win32/shimgvw/shimgvw.c
@@ -587,8 +587,10 @@ ImageView_DrawImage(HWND hwnd)
UINT ImageWidth, ImageHeight;
INT ZoomedWidth, ZoomedHeight, x, y;
PAINTSTRUCT ps;
- RECT rect;
+ RECT rect, margin;
HDC hdc;
+ HBRUSH white;
+ HGDIOBJ hbrOld;
hdc = BeginPaint(hwnd, &ps);
if (!hdc)
@@ -609,14 +611,31 @@ ImageView_DrawImage(HWND hwnd)
if (GetClientRect(hwnd, &rect))
{
- FillRect(hdc, &rect, (HBRUSH)GetStockObject(WHITE_BRUSH));
-
ZoomedWidth = (ImageWidth * ZoomPercents) / 100;
ZoomedHeight = (ImageHeight * ZoomPercents) / 100;
x = (rect.right - ZoomedWidth) / 2;
y = (rect.bottom - ZoomedHeight) / 2;
+ white = GetStockObject(WHITE_BRUSH);
+ // Fill top part
+ margin = rect;
+ margin.bottom = y - 1;
+ FillRect(hdc, &margin, white);
+ // Fill bottom part
+ margin.top = y + ZoomedHeight + 1;
+ margin.bottom = rect.bottom;
+ FillRect(hdc, &margin, white);
+ // Fill left part
+ margin.top = y - 1;
+ margin.bottom = y + ZoomedHeight + 1;
+ margin.right = x - 1;
+ FillRect(hdc, &margin, white);
+ // Fill right part
+ margin.left = x + ZoomedWidth + 1;
+ margin.right = rect.right;
+ FillRect(hdc, &margin, white);
+
DPRINT("x = %d, y = %d, ImageWidth = %u, ImageHeight = %u\n");
DPRINT("rect.right = %ld, rect.bottom = %ld\n", rect.right,
rect.bottom);
DPRINT("ZoomPercents = %d, ZoomedWidth = %d, ZoomedHeight = %d\n",
@@ -633,7 +652,9 @@ ImageView_DrawImage(HWND hwnd)
GdipSetSmoothingMode(graphics, SmoothingModeHighQuality);
}
+ hbrOld = SelectObject(hdc, GetStockObject(NULL_BRUSH));
Rectangle(hdc, x - 1, y - 1, x + ZoomedWidth + 1, y + ZoomedHeight + 1);
+ SelectObject(hdc, hbrOld);
GdipDrawImageRectI(graphics, image, x, y, ZoomedWidth, ZoomedHeight);
}
GdipDeleteGraphics(graphics);
@@ -749,7 +770,7 @@ static void ImageView_OnTimer(HWND hwnd)
DWORD dwDelay;
KillTimer(hwnd, ANIME_TIMER_ID);
- InvalidateRect(hwnd, NULL, TRUE);
+ InvalidateRect(hwnd, NULL, FALSE);
if (Anime_Step(&dwDelay))
{