Dylan Smith : wordpad: Remove sized print preview page buffer.
Alexandre Julliard
julliard at winehq.org
Tue Jul 20 11:20:31 CDT 2010
Module: wine
Branch: master
Commit: 0cd3ee3d91d817010f9010b59b478084a1bae909
URL: http://source.winehq.org/git/wine.git/?a=commit;h=0cd3ee3d91d817010f9010b59b478084a1bae909
Author: Dylan Smith <dylan.ah.smith at gmail.com>
Date: Mon Jul 19 18:20:59 2010 -0400
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.
---
programs/wordpad/print.c | 140 ++++++++++++++++------------------------------
1 files changed, 48 insertions(+), 92 deletions(-)
diff --git a/programs/wordpad/print.c b/programs/wordpad/print.c
index 475d833..e77a596 100644
--- a/programs/wordpad/print.c
+++ b/programs/wordpad/print.c
@@ -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);
+
+ 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;
- StretchBlt(*hdcSized, 0, 0, bmNewWidth, bmNewHeight, hdc, 0, 0, bmWidth, bmHeight, SRCCOPY);
+ 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);
- if (!draw_margins) return;
+ 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);
}
}
More information about the wine-cvs
mailing list