wordpad: Remove sized print preview page buffer.

This extra buffer only saves the result of the StretchBlt operatation,
which isn't worth doing since a BitBlt will still be needed from the buffer
to the screen. This causes noticable delay on resizing since a new sized
bitmap needs to be created, the old bitmap needs to be destroyed, and then
both a StretchBlt and a Bitblt is needed to actually repaint the window.
This commit is contained in:
Dylan Smith 2010-07-19 18:20:59 -04:00 committed by Alexandre Julliard
parent 6c9edce1a8
commit 0cd3ee3d91
1 changed files with 48 additions and 92 deletions

View File

@ -33,8 +33,6 @@ typedef struct _previewinfo
int textlength;
HDC hdc;
HDC hdc2;
HDC hdcSized;
HDC hdcSized2;
RECT window;
RECT rcPage;
SIZE bmSize;
@ -705,43 +703,44 @@ static void update_preview_sizes(HWND hwndPreview, BOOL zoomLevelUpdated)
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, BOOL draw_margins)
static void draw_margin_lines(HDC hdc, int x, int y, float ratio)
{
HBITMAP hBitmapScaled = CreateCompatibleBitmap(hdc, bmNewWidth, bmNewHeight);
HBITMAP oldbm;
HPEN hPen, oldPen;
int TopMargin = (int)((float)twips_to_pixels(lpFr->rc.top, GetDeviceCaps(hdc, LOGPIXELSX)) * ratio);
int BottomMargin = (int)((float)twips_to_pixels(lpFr->rc.bottom, GetDeviceCaps(hdc, LOGPIXELSX)) * ratio);
int LeftMargin = (int)((float)twips_to_pixels(lpFr->rc.left, GetDeviceCaps(hdc, LOGPIXELSY)) * ratio);
int RightMargin = (int)((float)twips_to_pixels(lpFr->rc.right, GetDeviceCaps(hdc, LOGPIXELSY)) * ratio);
SIZE dpi;
RECT page_margin = preview.rcPage;
if(*hdcSized) {
oldbm = SelectObject(*hdcSized, hBitmapScaled);
DeleteObject(oldbm);
} else {
*hdcSized = CreateCompatibleDC(hdc);
SelectObject(*hdcSized, hBitmapScaled);
}
dpi.cx = GetDeviceCaps(hdc, LOGPIXELSX);
dpi.cy = GetDeviceCaps(hdc, LOGPIXELSY);
StretchBlt(*hdcSized, 0, 0, bmNewWidth, bmNewHeight, hdc, 0, 0, bmWidth, bmHeight, SRCCOPY);
page_margin.left = preview.rcPage.left + margins.left;
page_margin.top = preview.rcPage.top + margins.top;
page_margin.bottom = preview.rcPage.bottom - margins.bottom;
page_margin.right = preview.rcPage.right - margins.right;
if (!draw_margins) return;
page_margin.left = (int)((float)twips_to_pixels(page_margin.left, dpi.cx) * ratio);
page_margin.top = (int)((float)twips_to_pixels(page_margin.top, dpi.cy) * ratio);
page_margin.bottom = (int)((float)twips_to_pixels(page_margin.bottom, dpi.cy) * ratio);
page_margin.right = (int)((float)twips_to_pixels(page_margin.right, dpi.cx) * ratio);
page_margin.left += x;
page_margin.top += y;
page_margin.bottom += y;
page_margin.right += x;
/* Draw margin lines */
hPen = CreatePen(PS_DOT, 1, RGB(0,0,0));
oldPen = SelectObject(*hdcSized, hPen);
oldPen = SelectObject(hdc, hPen);
MoveToEx(*hdcSized, 0, TopMargin, NULL);
LineTo(*hdcSized, bmNewWidth, TopMargin);
MoveToEx(*hdcSized, 0, BottomMargin, NULL);
LineTo(*hdcSized, bmNewWidth, BottomMargin);
MoveToEx(hdc, x, page_margin.top, NULL);
LineTo(hdc, x + preview.bmScaledSize.cx, page_margin.top);
MoveToEx(hdc, x, page_margin.bottom, NULL);
LineTo(hdc, x + preview.bmScaledSize.cx, page_margin.bottom);
MoveToEx(*hdcSized, LeftMargin, 0, NULL);
LineTo(*hdcSized, LeftMargin, bmNewHeight);
MoveToEx(*hdcSized, RightMargin, 0, NULL);
LineTo(*hdcSized, RightMargin, bmNewHeight);
MoveToEx(hdc, page_margin.left, y, NULL);
LineTo(hdc, page_margin.left, y + preview.bmScaledSize.cy);
MoveToEx(hdc, page_margin.right, y, NULL);
LineTo(hdc, page_margin.right, y + preview.bmScaledSize.cy);
SelectObject(*hdcSized, oldPen);
SelectObject(hdc, oldPen);
DeleteObject(hPen);
}
@ -750,41 +749,6 @@ static BOOL is_last_preview_page(int page)
return preview.pageEnds[page - 1] >= preview.textlength;
}
/* Update for zoom ratio changes with same page. */
static void update_scaled_preview(HWND hMainWnd)
{
FORMATRANGE fr;
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, TRUE);
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,
!is_last_preview_page(preview.page));
}
InvalidateRect(hwndPreview, NULL, FALSE);
DeleteDC(fr.hdcTarget);
}
void init_preview(HWND hMainWnd, LPWSTR wszFileName)
{
HINSTANCE hInstance = GetModuleHandleW(0);
@ -824,18 +788,6 @@ void close_preview(HWND hMainWnd)
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);
DestroyWindow(hwndPreview);
@ -896,19 +848,19 @@ static LRESULT print_preview(HWND hwndPreview)
HDC hdc;
RECT window, background;
PAINTSTRUCT ps;
POINT scrollpos;
int x, y;
hdc = BeginPaint(hwndPreview, &ps);
GetClientRect(hwndPreview, &window);
FillRect(hdc, &window, GetStockObject(GRAY_BRUSH));
scrollpos.x = GetScrollPos(hwndPreview, SB_HORZ);
scrollpos.y = GetScrollPos(hwndPreview, SB_VERT);
x = preview.spacing.cx - GetScrollPos(hwndPreview, SB_HORZ);
y = preview.spacing.cy - GetScrollPos(hwndPreview, SB_VERT);
background.left = preview.spacing.cx - 2 - scrollpos.x;
background.left = x - 2;
background.right = background.left + preview.bmScaledSize.cx + 4;
background.top = preview.spacing.cy - 2 - scrollpos.y;
background.top = y - 2;
background.bottom = background.top + preview.bmScaledSize.cy + 4;
FillRect(hdc, &background, GetStockObject(BLACK_BRUSH));
@ -921,15 +873,19 @@ static LRESULT print_preview(HWND hwndPreview)
FillRect(hdc, &background, GetStockObject(BLACK_BRUSH));
}
BitBlt(hdc, preview.spacing.cx - scrollpos.x, preview.spacing.cy - scrollpos.y,
preview.bmScaledSize.cx, preview.bmScaledSize.cy,
preview.hdcSized, 0, 0, SRCCOPY);
StretchBlt(hdc, x, y, preview.bmScaledSize.cx, preview.bmScaledSize.cy,
preview.hdc, 0, 0, preview.bmSize.cx, preview.bmSize.cy, SRCCOPY);
draw_margin_lines(hdc, x, y, preview.zoomratio);
if(preview.pages_shown > 1)
{
BitBlt(hdc, preview.spacing.cx * 2 + preview.bmScaledSize.cx - scrollpos.x,
preview.spacing.cy - scrollpos.y, preview.bmScaledSize.cx,
preview.bmScaledSize.cy, preview.hdcSized2, 0, 0, SRCCOPY);
x += preview.spacing.cx + preview.bmScaledSize.cx;
StretchBlt(hdc, x, y, preview.bmScaledSize.cx, preview.bmScaledSize.cy,
preview.hdc2, 0, 0, preview.bmSize.cx, preview.bmSize.cy, SRCCOPY);
if (!is_last_preview_page(preview.page))
draw_margin_lines(hdc, x, y, preview.zoomratio);
}
preview.window = window;
@ -1011,7 +967,7 @@ static void update_preview(HWND hMainWnd)
DeleteDC(fr.hdcTarget);
ReleaseDC(hwndPreview, hdc);
update_scaled_preview(hMainWnd);
InvalidateRect(hwndPreview, NULL, FALSE);
update_preview_buttons(hMainWnd);
update_preview_statusbar(hMainWnd);
}
@ -1103,7 +1059,7 @@ LRESULT CALLBACK preview_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
case WM_SIZE:
{
update_preview_sizes(hWnd, FALSE);
update_scaled_preview(hWnd);
InvalidateRect(hWnd, NULL, FALSE);
break;
}
@ -1216,7 +1172,7 @@ LRESULT CALLBACK preview_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
toggle_num_pages(hMainWnd);
} else {
update_preview_sizes(hWnd, TRUE);
update_scaled_preview(hMainWnd);
InvalidateRect(hWnd, NULL, FALSE);
update_preview_buttons(hMainWnd);
}
@ -1285,7 +1241,7 @@ LRESULT preview_command(HWND hWnd, WPARAM wParam)
} else {
HWND hwndPreview = GetDlgItem(hWnd, IDC_PREVIEW);
update_preview_sizes(hwndPreview, TRUE);
update_scaled_preview(hWnd);
InvalidateRect(hwndPreview, NULL, FALSE);
update_preview_buttons(hWnd);
}
}
@ -1301,7 +1257,7 @@ LRESULT preview_command(HWND hWnd, WPARAM wParam)
toggle_num_pages(hWnd);
} else {
update_preview_sizes(hwndPreview, TRUE);
update_scaled_preview(hWnd);
InvalidateRect(hwndPreview, NULL, FALSE);
update_preview_buttons(hWnd);
}
}