wordpad: Update bitmaps outside of WM_PAINT.

This avoids having to delete the device context and the bitmap selected
into it just to update the bitmap, since it was setting preview.hdc to
NULL to indicate that these bitmaps needed to be updated. This patch
also helps make WM_PAINT messages get processed faster by moving this out
of the code for handling WM_PAINT.
This commit is contained in:
Dylan Smith 2010-02-22 03:18:18 -05:00 committed by Alexandre Julliard
parent a75bf390d7
commit 7a9f72863d
1 changed files with 110 additions and 69 deletions

View File

@ -578,21 +578,52 @@ static void update_preview_sizes(HWND hwndPreview, BOOL zoomLevelUpdated)
update_preview_scrollbars(hwndPreview, &window); update_preview_scrollbars(hwndPreview, &window);
} }
static void draw_preview_page(HDC hdc, HDC* hdcSized, FORMATRANGE* lpFr, float ratio, int bmNewWidth, int bmNewHeight, int bmWidth, int bmHeight);
/* Update for zoom ratio changes with same page. */ /* Update for zoom ratio changes with same page. */
static void update_scaled_preview(HWND hMainWnd) static void update_scaled_preview(HWND hMainWnd)
{ {
HWND hwndPreview = GetDlgItem(hMainWnd, IDC_PREVIEW); FORMATRANGE fr;
preview.window.right = 0; HWND hwndPreview;
/* This may occur on WM_CREATE before update_preview is called
* because a WM_SIZE message is generated from updating the
* scrollbars. */
if (!preview.hdc) return;
hwndPreview = GetDlgItem(hMainWnd, IDC_PREVIEW);
fr.hdcTarget = make_dc();
fr.rc = fr.rcPage = preview.rcPage;
fr.rc.left += margins.left;
fr.rc.top += margins.top;
fr.rc.bottom -= margins.bottom;
fr.rc.right -= margins.right;
draw_preview_page(preview.hdc, &preview.hdcSized, &fr, preview.zoomratio,
preview.bmScaledSize.cx, preview.bmScaledSize.cy,
preview.bmSize.cx, preview.bmSize.cy);
if(preview.pages_shown > 1)
{
draw_preview_page(preview.hdc2, &preview.hdcSized2, &fr, preview.zoomratio,
preview.bmScaledSize.cx, preview.bmScaledSize.cy,
preview.bmSize.cx, preview.bmSize.cy);
}
InvalidateRect(hwndPreview, NULL, TRUE); InvalidateRect(hwndPreview, NULL, TRUE);
DeleteDC(fr.hdcTarget);
} }
static void update_preview(HWND hMainWnd);
LRESULT CALLBACK preview_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) LRESULT CALLBACK preview_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{ {
switch(msg) switch(msg)
{ {
case WM_CREATE: case WM_CREATE:
{ {
HWND hEditorWnd = GetDlgItem(GetParent(hWnd), IDC_EDITOR); HWND hMainWnd = GetParent(hWnd);
HWND hEditorWnd = GetDlgItem(hMainWnd, IDC_EDITOR);
FORMATRANGE fr; FORMATRANGE fr;
GETTEXTLENGTHEX gt = {GTL_DEFAULT, 1200}; GETTEXTLENGTHEX gt = {GTL_DEFAULT, 1200};
HDC hdc = GetDC(hWnd); HDC hdc = GetDC(hWnd);
@ -617,6 +648,7 @@ LRESULT CALLBACK preview_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
ReleaseDC(hWnd, hdc); ReleaseDC(hWnd, hdc);
update_preview_sizes(hWnd, TRUE); update_preview_sizes(hWnd, TRUE);
update_preview(hMainWnd);
break; break;
} }
@ -716,6 +748,30 @@ void close_preview(HWND hMainWnd)
HeapFree(GetProcessHeap(), 0, preview.pageEnds); HeapFree(GetProcessHeap(), 0, preview.pageEnds);
preview.pageEnds = NULL; preview.pageEnds = NULL;
preview.pageCapacity = 0; preview.pageCapacity = 0;
if(preview.hdc) {
HBITMAP oldbm = GetCurrentObject(preview.hdc, OBJ_BITMAP);
DeleteDC(preview.hdc);
DeleteObject(oldbm);
preview.hdc = NULL;
}
if(preview.hdc2) {
HBITMAP oldbm = GetCurrentObject(preview.hdc2, OBJ_BITMAP);
DeleteDC(preview.hdc2);
DeleteObject(oldbm);
preview.hdc2 = NULL;
}
if(preview.hdcSized) {
HBITMAP oldbm = GetCurrentObject(preview.hdcSized, OBJ_BITMAP);
DeleteDC(preview.hdcSized);
DeleteObject(oldbm);
preview.hdcSized = NULL;
}
if(preview.hdcSized2) {
HBITMAP oldbm = GetCurrentObject(preview.hdcSized2, OBJ_BITMAP);
DeleteDC(preview.hdcSized2);
DeleteObject(oldbm);
preview.hdcSized2 = NULL;
}
preview_bar_show(hMainWnd, FALSE); preview_bar_show(hMainWnd, FALSE);
DestroyWindow(hwndPreview); DestroyWindow(hwndPreview);
@ -926,63 +982,14 @@ static void update_preview_buttons(HWND hMainWnd)
LRESULT print_preview(HWND hwndPreview) LRESULT print_preview(HWND hwndPreview)
{ {
FORMATRANGE fr;
HDC hdc; HDC hdc;
RECT window, background; RECT window, background;
PAINTSTRUCT ps; PAINTSTRUCT ps;
HWND hMainWnd = GetParent(hwndPreview);
POINT scrollpos; POINT scrollpos;
hdc = BeginPaint(hwndPreview, &ps); hdc = BeginPaint(hwndPreview, &ps);
GetClientRect(hwndPreview, &window); GetClientRect(hwndPreview, &window);
fr.hdcTarget = make_dc();
fr.rc = fr.rcPage = preview.rcPage;
fr.rc.left += margins.left;
fr.rc.top += margins.top;
fr.rc.bottom -= margins.bottom;
fr.rc.right -= margins.right;
if(!preview.hdc)
{
GETTEXTLENGTHEX gt;
RECT paper;
HWND hEditorWnd = GetDlgItem(hMainWnd, IDC_EDITOR);
HBITMAP hBitmapCapture;
gt.flags = GTL_DEFAULT;
gt.codepage = 1200;
fr.chrg.cpMin = 0;
fr.chrg.cpMax = SendMessageW(hEditorWnd, EM_GETTEXTLENGTHEX, (WPARAM)&gt, 0);
paper.left = 0;
paper.right = preview.bmSize.cx;
paper.top = 0;
paper.bottom = preview.bmSize.cy;
fr.hdc = preview.hdc = CreateCompatibleDC(hdc);
hBitmapCapture = CreateCompatibleBitmap(hdc, preview.bmSize.cx, preview.bmSize.cy);
SelectObject(fr.hdc, hBitmapCapture);
draw_preview(hEditorWnd, &fr, &paper, preview.page);
if(preview.pages_shown > 1)
{
if (!preview.hdc2)
{
preview.hdc2 = CreateCompatibleDC(hdc);
hBitmapCapture = CreateCompatibleBitmap(hdc,
preview.bmSize.cx,
preview.bmSize.cy);
SelectObject(preview.hdc2, hBitmapCapture);
}
fr.hdc = preview.hdc2;
draw_preview(hEditorWnd, &fr, &fr.rcPage, preview.page + 1);
}
update_preview_buttons(hMainWnd);
}
FillRect(hdc, &window, GetStockObject(GRAY_BRUSH)); FillRect(hdc, &window, GetStockObject(GRAY_BRUSH));
scrollpos.x = GetScrollPos(hwndPreview, SB_HORZ); scrollpos.x = GetScrollPos(hwndPreview, SB_HORZ);
@ -1003,20 +1010,6 @@ LRESULT print_preview(HWND hwndPreview)
FillRect(hdc, &background, GetStockObject(BLACK_BRUSH)); FillRect(hdc, &background, GetStockObject(BLACK_BRUSH));
} }
if(window.right != preview.window.right || window.bottom != preview.window.bottom)
{
draw_preview_page(preview.hdc, &preview.hdcSized, &fr, preview.zoomratio,
preview.bmScaledSize.cx, preview.bmScaledSize.cy,
preview.bmSize.cx, preview.bmSize.cy);
if(preview.pages_shown > 1)
{
draw_preview_page(preview.hdc2, &preview.hdcSized2, &fr, preview.zoomratio,
preview.bmScaledSize.cx, preview.bmScaledSize.cy,
preview.bmSize.cx, preview.bmSize.cy);
}
}
BitBlt(hdc, preview.spacing.cx - scrollpos.x, preview.spacing.cy - scrollpos.y, BitBlt(hdc, preview.spacing.cx - scrollpos.x, preview.spacing.cy - scrollpos.y,
preview.bmScaledSize.cx, preview.bmScaledSize.cy, preview.bmScaledSize.cx, preview.bmScaledSize.cy,
preview.hdcSized, 0, 0, SRCCOPY); preview.hdcSized, 0, 0, SRCCOPY);
@ -1028,7 +1021,6 @@ LRESULT print_preview(HWND hwndPreview)
preview.bmScaledSize.cy, preview.hdcSized2, 0, 0, SRCCOPY); preview.bmScaledSize.cy, preview.hdcSized2, 0, 0, SRCCOPY);
} }
DeleteDC(fr.hdcTarget);
preview.window = window; preview.window = window;
EndPaint(hwndPreview, &ps); EndPaint(hwndPreview, &ps);
@ -1039,10 +1031,59 @@ LRESULT print_preview(HWND hwndPreview)
/* Update for page changes. */ /* Update for page changes. */
static void update_preview(HWND hMainWnd) static void update_preview(HWND hMainWnd)
{ {
DeleteDC(preview.hdc); GETTEXTLENGTHEX gt;
preview.hdc = 0; RECT paper;
HWND hEditorWnd = GetDlgItem(hMainWnd, IDC_EDITOR);
HWND hwndPreview = GetDlgItem(hMainWnd, IDC_PREVIEW);
HBITMAP hBitmapCapture;
FORMATRANGE fr;
HDC hdc = GetDC(hwndPreview);
fr.hdcTarget = make_dc();
fr.rc = fr.rcPage = preview.rcPage;
fr.rc.left += margins.left;
fr.rc.top += margins.top;
fr.rc.bottom -= margins.bottom;
fr.rc.right -= margins.right;
gt.flags = GTL_DEFAULT;
gt.codepage = 1200;
fr.chrg.cpMin = 0;
fr.chrg.cpMax = SendMessageW(hEditorWnd, EM_GETTEXTLENGTHEX, (WPARAM)&gt, 0);
paper.left = 0;
paper.right = preview.bmSize.cx;
paper.top = 0;
paper.bottom = preview.bmSize.cy;
if (!preview.hdc) {
preview.hdc = CreateCompatibleDC(hdc);
hBitmapCapture = CreateCompatibleBitmap(hdc, preview.bmSize.cx, preview.bmSize.cy);
SelectObject(preview.hdc, hBitmapCapture);
}
fr.hdc = preview.hdc;
draw_preview(hEditorWnd, &fr, &paper, preview.page);
if(preview.pages_shown > 1)
{
if (!preview.hdc2)
{
preview.hdc2 = CreateCompatibleDC(hdc);
hBitmapCapture = CreateCompatibleBitmap(hdc,
preview.bmSize.cx,
preview.bmSize.cy);
SelectObject(preview.hdc2, hBitmapCapture);
}
fr.hdc = preview.hdc2;
draw_preview(hEditorWnd, &fr, &fr.rcPage, preview.page + 1);
}
DeleteDC(fr.hdcTarget);
ReleaseDC(hwndPreview, hdc);
update_scaled_preview(hMainWnd); update_scaled_preview(hMainWnd);
update_preview_buttons(hMainWnd);
} }
static void toggle_num_pages(HWND hMainWnd) static void toggle_num_pages(HWND hMainWnd)