From 5041d517acd3a463cb6122bf57793140bbcbc738 Mon Sep 17 00:00:00 2001 From: Patrice Mandin Date: Sat, 30 Sep 2017 18:07:02 +0200 Subject: [PATCH] atari:gem: Avoid querying window workarea at draw time (can be slow). Do it only when window created, moved or resized. --- src/video/gem/SDL_gemevents.c | 14 +++++++------- src/video/gem/SDL_gemvideo.c | 30 ++++++++++++++++++------------ src/video/gem/SDL_gemvideo.h | 8 +++++++- 3 files changed, 32 insertions(+), 20 deletions(-) diff --git a/src/video/gem/SDL_gemevents.c b/src/video/gem/SDL_gemevents.c index e11ec65d1..52272e33b 100644 --- a/src/video/gem/SDL_gemevents.c +++ b/src/video/gem/SDL_gemevents.c @@ -188,7 +188,6 @@ void GEM_PumpEvents(_THIS) static int do_messages(_THIS, short *message, short latest_msg_id) { int quit; - short x2,y2,w2,h2; quit = 0; switch (message[0]) { @@ -202,6 +201,7 @@ static int do_messages(_THIS, short *message, short latest_msg_id) break; case WM_MOVED: wind_set(message[3],WF_CURRXYWH,message[4],message[5],message[6],message[7]); + wind_get (message[3], WF_WORKXYWH, &GEM_work_x, &GEM_work_y, &GEM_work_w, &GEM_work_h); break; case WM_TOPPED: wind_set(message[3],WF_TOP,message[4],0,0,0); @@ -219,7 +219,7 @@ static int do_messages(_THIS, short *message, short latest_msg_id) break; case WM_ICONIFY: case WM_ALLICONIFY: - wind_set(message[3],WF_ICONIFY,message[4],message[5],message[6],message[7]); + wind_set (message[3],WF_ICONIFY,message[4],message[5],message[6],message[7]); /* If we're active, make ourselves inactive */ if ( SDL_GetAppState() & SDL_APPACTIVE ) { /* Send an internal deactivate event */ @@ -235,7 +235,7 @@ static int do_messages(_THIS, short *message, short latest_msg_id) } break; case WM_UNICONIFY: - wind_set(message[3],WF_UNICONIFY,message[4],message[5],message[6],message[7]); + wind_set (message[3],WF_UNICONIFY,message[4],message[5],message[6],message[7]); /* If we're not active, make ourselves active */ if ( !(SDL_GetAppState() & SDL_APPACTIVE) ) { /* Send an internal activate event */ @@ -251,10 +251,10 @@ static int do_messages(_THIS, short *message, short latest_msg_id) break; case WM_SIZED: wind_set (message[3], WF_CURRXYWH, message[4], message[5], message[6], message[7]); - wind_get (message[3], WF_WORKXYWH, &x2, &y2, &w2, &h2); + wind_get (message[3], WF_WORKXYWH, &GEM_work_x, &GEM_work_y, &GEM_work_w, &GEM_work_h); GEM_win_fulled = SDL_FALSE; /* Cancel maximized flag */ GEM_lock_redraw = SDL_TRUE; /* Prevent redraw till buffers resized */ - SDL_PrivateResize(w2, h2); + SDL_PrivateResize(GEM_work_w, GEM_work_h); break; case WM_FULLED: { @@ -271,9 +271,9 @@ static int do_messages(_THIS, short *message, short latest_msg_id) GEM_win_fulled = SDL_TRUE; } wind_set (message[3], WF_CURRXYWH, x, y, w, h); - wind_get (message[3], WF_WORKXYWH, &x2, &y2, &w2, &h2); + wind_get (message[3], WF_WORKXYWH, &GEM_work_x, &GEM_work_y, &GEM_work_w, &GEM_work_h); GEM_lock_redraw = SDL_TRUE; /* Prevent redraw till buffers resized */ - SDL_PrivateResize(w2, h2); + SDL_PrivateResize(GEM_work_w, GEM_work_h); } break; case WM_BOTTOMED: diff --git a/src/video/gem/SDL_gemvideo.c b/src/video/gem/SDL_gemvideo.c index 4332b6307..0504c4d00 100644 --- a/src/video/gem/SDL_gemvideo.c +++ b/src/video/gem/SDL_gemvideo.c @@ -349,6 +349,11 @@ int GEM_VideoInit(_THIS, SDL_PixelFormat *vformat) return 1; } + GEM_work_x = GEM_desk_x; + GEM_work_y = GEM_desk_y; + GEM_work_w = GEM_desk_w; + GEM_work_h = GEM_desk_h; + /* Read bit depth */ vq_extnd(VDI_handle, 1, work_out); VDI_bpp = work_out[4]; @@ -793,6 +798,7 @@ SDL_Surface *GEM_SetVideoMode(_THIS, SDL_Surface *current, } } + wind_get (GEM_handle, WF_WORKXYWH, &GEM_work_x,&GEM_work_y,&GEM_work_w,&GEM_work_h); GEM_fullscreen = SDL_FALSE; } @@ -933,16 +939,12 @@ static void GEM_UpdateRectsFullscreen(_THIS, int numrects, SDL_Rect *rects) static void GEM_UpdateRectsWindowed(_THIS, int numrects, SDL_Rect *rects) { - short pxy[4], wind_pxy[4]; + short pxy[4]; int i; - if (wind_get(GEM_handle, WF_WORKXYWH, &wind_pxy[0], &wind_pxy[1], &wind_pxy[2], &wind_pxy[3])==0) { - return; - } - for ( i=0; ihidden->screensize) #define VDI_dst_mfdb (this->hidden->dst_mfdb) -#define GEM_ap_id (this->hidden->ap_id) +#define GEM_ap_id (this->hidden->ap_id) #define GEM_desk_x (this->hidden->desk_x) #define GEM_desk_y (this->hidden->desk_y) #define GEM_desk_w (this->hidden->desk_w) #define GEM_desk_h (this->hidden->desk_h) #define GEM_handle (this->hidden->win_handle) #define GEM_win_type (this->hidden->window_type) +#define GEM_work_x (this->hidden->work_x) +#define GEM_work_y (this->hidden->work_y) +#define GEM_work_w (this->hidden->work_w) +#define GEM_work_h (this->hidden->work_h) #define GEM_title_name (this->hidden->title_name) #define GEM_icon_name (this->hidden->icon_name) #define GEM_refresh_name (this->hidden->refresh_name)