Progressive updates for image window of Windows console app
"Russell Lang" <[email protected]> Thu, 01 Jul 2004 12:01:32 +1000
| Newsgroups | gmane.comp.printing.ghostscript.patches |
|---|---|
| Message-ID | <40E3FD1C.28024.E425D@localhost> |
Log Message: Enable progressive updates for the image window of the MS-Windows ghostscript command line program. DETAILS: In the MS-Windows GUI executable (i.e. text window managed by ghostscript rather than using a system console window), the image window is progressively updated every second or so as each page is drawn. The console executable did not do this. The display update code is called whenever particular device drawing operations happen, and the new code triggers a window update if a change has been made to the page, sufficient time has elapsed, and there are no outstanding update requests. Russell Lang [email protected] diff -u /cvs/gs/src/dwimg.c src/dwimg.c --- /cvs/gs/src/dwimg.c Mon Jun 21 05:36:28 2004 +++ src/dwimg.c Thu Jul 01 00:58:43 2004 @@ -1,4 +1,4 @@ -/* Copyright (C) 1996-2001 Ghostgum Software Pty Ltd. All rights reserved. +/* Copyright (C) 1996-2004 Ghostgum Software Pty Ltd. All rights reserved. This software is provided AS-IS with no warranty, either express or implied. @@ -493,6 +493,7 @@ void image_sync(IMAGE *img) { + img->pending_sync = 0; if ( !IsWindow(img->hwnd) ) /* some clod closed the window */ create_window(img); diff -u /cvs/gs/src/dwimg.h src/dwimg.h --- /cvs/gs/src/dwimg.h Mon Jun 21 05:36:28 2004 +++ src/dwimg.h Thu Jul 01 01:01:59 2004 @@ -39,6 +39,8 @@ /* periodic redrawing */ SYSTEMTIME update_time; int update_interval; + int pending_sync; /* non-zero if main thread has requested DISPLAY_SYNC, */ + /* but second thread hasn't done it yet. */ /* Window scrolling stuff */ int cxClient, cyClient; diff -u /cvs/gs/src/dwmainc.c src/dwmainc.c --- /cvs/gs/src/dwmainc.c Mon Jun 21 05:36:29 2004 +++ src/dwmainc.c Thu Jul 01 01:03:55 2004 @@ -90,6 +90,7 @@ #define DISPLAY_SIZE WM_USER+103 #define DISPLAY_SYNC WM_USER+104 #define DISPLAY_PAGE WM_USER+105 +#define DISPLAY_UPDATE WM_USER+106 /* #define DISPLAY_DEBUG @@ -98,31 +99,35 @@ /* The second thread is the message loop */ static void winthread(void *arg) { + IMAGE *img; MSG msg; thread_id = GetCurrentThreadId(); hthread = GetCurrentThread(); while (!quitnow && GetMessage(&msg, (HWND)NULL, 0, 0)) { + img = (IMAGE *)msg.lParam; switch (msg.message) { case DISPLAY_OPEN: - image_open((IMAGE *)msg.lParam); + image_open(img); break; case DISPLAY_CLOSE: { - IMAGE *img = (IMAGE *)msg.lParam; HANDLE hmutex = img->hmutex; image_close(img); CloseHandle(hmutex); } break; case DISPLAY_SIZE: - image_updatesize((IMAGE *)msg.lParam); + image_updatesize(img); break; case DISPLAY_SYNC: - image_sync((IMAGE *)msg.lParam); + image_sync(img); break; case DISPLAY_PAGE: - image_page((IMAGE *)msg.lParam); + image_page(img); + break; + case DISPLAY_UPDATE: + image_poll(img); break; default: TranslateMessage(&msg); @@ -220,8 +225,12 @@ fprintf(stdout, "display_sync(0x%x, 0x%x)\n", handle, device); #endif img = image_find(handle, device); - if (img) - PostThreadMessage(thread_id, DISPLAY_SYNC, 0, (LPARAM)img); + if (img) { + if (!img->pending_sync) { + img->pending_sync = 1; + PostThreadMessage(thread_id, DISPLAY_SYNC, 0, (LPARAM)img); + } + } return 0; } @@ -241,10 +250,39 @@ int display_update(void *handle, void *device, int x, int y, int w, int h) { - /* Unneeded for polling - we are running Windows on another thread. */ - /* Eventually we will add code here which provides progressive - * update of the display during rendering. + /* This code should be similar to that in image_poll, + * but is on the main thread (not second thread) and + * so can't call image_sync directly. + * It must not post a DISPLAY_UPDATE more often that + * image_poll would call image_sync. + * We don't need to check the message queue - we are running + * image window on another thread. */ + IMAGE *img; + img = image_find(handle, device); + if (img) { + /* Update the display periodically while Ghostscript is drawing */ + SYSTEMTIME t1; + int delta; + if ((img->bmih.biWidth == 0) || (img->bmih.biHeight == 0)) + return 0; + + GetSystemTime(&t1); + delta = (t1.wSecond - img->update_time.wSecond) + + (t1.wMinute - img->update_time.wMinute) * 60 + + (t1.wHour - img->update_time.wHour) * 3600; + if (img->update_interval < 1) + img->update_interval = 1; /* seconds */ + if (delta < 0) + img->update_time = t1; + else if (delta > img->update_interval) { + /* redraw window */ + if (!img->pending_sync) { + img->pending_sync = 1; + PostThreadMessage(thread_id, DISPLAY_UPDATE, 0, (LPARAM)img); + } + } + } return 0; } _______________________________________________ gs-code-review mailing list [email protected] http://www.ghostscript.com/mailman/listinfo/gs-code-review