Make CEDrawCtx def private; erase background when OS invalidates it.

This gets rid of what's visible behind the board when it's not
full-screen width, but causes a lot of flashing.  Better will be to
make board.c own an entire rectangle and to decide board dimensions
itself.
This commit is contained in:
ehouse 2008-09-01 15:10:28 +00:00
parent 226f1ea470
commit 9be9842e48
4 changed files with 92 additions and 52 deletions

View file

@ -24,6 +24,7 @@
#include <stdio.h> /* for sprintf, etc. */ #include <stdio.h> /* for sprintf, etc. */
#include "xptypes.h" #include "xptypes.h"
#include "cedraw.h"
#include "board.h" #include "board.h"
#include "draw.h" #include "draw.h"
#include "mempool.h" #include "mempool.h"
@ -52,7 +53,34 @@
# define TREAT_AS_CURSOR(d,f) (((f) & CELL_ISCURSOR) != 0) # define TREAT_AS_CURSOR(d,f) (((f) & CELL_ISCURSOR) != 0)
#endif #endif
struct CEDrawCtx {
DrawCtxVTable* vtable;
HWND mainWin;
CEAppGlobals* globals;
COLORREF prevBkColor;
HBRUSH brushes[CE_NUM_COLORS];
PenColorPair pens[CE_NUM_COLORS];
HFONT selPlayerFont;
HFONT playerFont;
FontCacheEntry fcEntry[N_RESIZE_FONTS];
HBITMAP rightArrow;
HBITMAP downArrow;
HBITMAP origin;
XP_U16 trayOwner;
XP_U16 miniLineHt;
XP_Bool scoreIsVertical;
XP_Bool topFocus;
XP_Bool beenCleared;
MPSLOT
};
static void ceClearToBkground( CEDrawCtx* dctx, const XP_Rect* rect ); static void ceClearToBkground( CEDrawCtx* dctx, const XP_Rect* rect );
static void ceDrawBitmapInRect( HDC hdc, const RECT* r, HBITMAP bitmap ); static void ceDrawBitmapInRect( HDC hdc, const RECT* r, HBITMAP bitmap );
@ -350,9 +378,9 @@ ceGetSizedFont( CEDrawCtx* dctx, XP_U16 height, RFIndex index,
XP_ASSERT( !!font ); XP_ASSERT( !!font );
DeleteObject( testFont ); DeleteObject( testFont );
break; break;
} else if ( trialHt == height /* first time through */ /* } else if ( trialHt == height /\* first time through *\/ */
&& testOffset > 0 ) { /* for safety */ /* && testOffset > 0 ) { /\* for safety *\/ */
trialHt += testOffset; /* trialHt += testOffset; */
} else { } else {
++trialHt; ++trialHt;
} }
@ -729,7 +757,7 @@ drawDrawTileGuts( DrawCtx* p_dctx, const XP_Rect* xprect,
InsetRect( &rt, 1, 1 ); InsetRect( &rt, 1, 1 );
Rectangle(hdc, rt.left, rt.top, rt.right, rt.bottom); /* draw frame */ Rectangle(hdc, rt.left, rt.top, rt.right, rt.bottom); /* draw frame */
InsetRect( &rt, 1, 1 ); InsetRect( &rt, 1, 1 );
ceClipToRect( hdc, &rt ); /* ceClipToRect( hdc, &rt ); */
if ( !isEmpty ) { if ( !isEmpty ) {
index = getPlayerColor(dctx->trayOwner); index = getPlayerColor(dctx->trayOwner);
@ -942,8 +970,8 @@ DRAW_FUNC_NAME(scoreBegin)( DrawCtx* p_dctx, const XP_Rect* rect,
{ {
CEDrawCtx* dctx = (CEDrawCtx*)p_dctx; CEDrawCtx* dctx = (CEDrawCtx*)p_dctx;
CEAppGlobals* globals = dctx->globals; CEAppGlobals* globals = dctx->globals;
HDC hdc = globals->hdc; XP_ASSERT( !!globals->hdc );
SetBkColor( hdc, dctx->globals->appPrefs.colors[CE_BKG_COLOR] ); SetBkColor( globals->hdc, dctx->globals->appPrefs.colors[CE_BKG_COLOR] );
dctx->scoreIsVertical = rect->height > rect->width; dctx->scoreIsVertical = rect->height > rect->width;
@ -1412,9 +1440,8 @@ ceFontsSetup( CEDrawCtx* dctx )
} /* ceFontsSetup */ } /* ceFontsSetup */
void void
ce_drawctxt_update( DrawCtx* p_dctx ) ce_draw_update( CEDrawCtx* dctx )
{ {
CEDrawCtx* dctx = (CEDrawCtx*)p_dctx;
XP_U16 i; XP_U16 i;
for ( i = 0; i < CE_NUM_COLORS; ++i ) { for ( i = 0; i < CE_NUM_COLORS; ++i ) {
@ -1425,7 +1452,14 @@ ce_drawctxt_update( DrawCtx* p_dctx )
} }
} /* ce_drawctxt_update */ } /* ce_drawctxt_update */
DrawCtx* void
ce_draw_erase( CEDrawCtx* dctx, const RECT* invalR )
{
CEAppGlobals* globals = dctx->globals;
FillRect( globals->hdc, invalR, dctx->brushes[CE_BKG_COLOR] );
}
CEDrawCtx*
ce_drawctxt_make( MPFORMAL HWND mainWin, CEAppGlobals* globals ) ce_drawctxt_make( MPFORMAL HWND mainWin, CEAppGlobals* globals )
{ {
CEDrawCtx* dctx = (CEDrawCtx*)XP_MALLOC( mpool, CEDrawCtx* dctx = (CEDrawCtx*)XP_MALLOC( mpool,
@ -1473,7 +1507,7 @@ ce_drawctxt_make( MPFORMAL HWND mainWin, CEAppGlobals* globals )
dctx->mainWin = mainWin; dctx->mainWin = mainWin;
dctx->globals = globals; dctx->globals = globals;
ce_drawctxt_update( (DrawCtx*)dctx ); ce_draw_update( dctx );
ceFontsSetup( dctx ); ceFontsSetup( dctx );
@ -1484,5 +1518,5 @@ ce_drawctxt_make( MPFORMAL HWND mainWin, CEAppGlobals* globals )
dctx->origin = LoadBitmap( globals->hInst, dctx->origin = LoadBitmap( globals->hInst,
MAKEINTRESOURCE(IDB_ORIGIN) ); MAKEINTRESOURCE(IDB_ORIGIN) );
return (DrawCtx*)dctx; return dctx;
} /* ce_drawctxt_make */ } /* ce_drawctxt_make */

32
wince/cedraw.h Normal file
View file

@ -0,0 +1,32 @@
/* -*-mode: C; fill-column: 78; c-basic-offset: 4;-*- */
/*
* Copyright 2000-2008 by Eric House (xwords@eehouse.org). All rights reserved.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef _CEDRAW_H_
#define _CEDRAW_H_
#include "cemain.h"
typedef struct CEDrawCtx CEDrawCtx;
CEDrawCtx* ce_drawctxt_make( MPFORMAL HWND mainWin, CEAppGlobals* globals );
void ce_draw_update( CEDrawCtx* dctx );
void ce_draw_erase( CEDrawCtx* dctx, const RECT* invalR );
#endif

View file

@ -51,6 +51,7 @@
#include "LocalizedStrIncludes.h" #include "LocalizedStrIncludes.h"
#include "debhacks.h" #include "debhacks.h"
#include "cesvdgms.h" #include "cesvdgms.h"
#include "cedraw.h"
#include "dbgutil.h" #include "dbgutil.h"
@ -994,7 +995,7 @@ ceLoadSavedGame( CEAppGlobals* globals )
XP_DEBUGF( "calling game_makeFromStream" ); XP_DEBUGF( "calling game_makeFromStream" );
game_makeFromStream( MEMPOOL stream, &globals->game, game_makeFromStream( MEMPOOL stream, &globals->game,
&globals->gameInfo, &globals->gameInfo,
dict, &globals->util, globals->draw, dict, &globals->util, (DrawCtx*)globals->draw,
&globals->appPrefs.cp, CE_SEND_PROC, &globals->appPrefs.cp, CE_SEND_PROC,
CE_RESET_PROC globals ); CE_RESET_PROC globals );
} }
@ -1227,7 +1228,7 @@ InitInstance(HINSTANCE hInstance, int nCmdShow)
if ( !oldGameLoaded ) { if ( !oldGameLoaded ) {
XP_U16 gameID = 0; /* good enough until I get networking going */ XP_U16 gameID = 0; /* good enough until I get networking going */
game_makeNewGame( MPPARM(mpool) &globals->game, &globals->gameInfo, game_makeNewGame( MPPARM(mpool) &globals->game, &globals->gameInfo,
&globals->util, globals->draw, gameID, &globals->util, (DrawCtx*)globals->draw, gameID,
&globals->appPrefs.cp, &globals->appPrefs.cp,
CE_SEND_PROC, CE_RESET_PROC globals ); CE_SEND_PROC, CE_RESET_PROC globals );
@ -1372,7 +1373,7 @@ ceDoHistory( CEAppGlobals* globals )
} /* ceDoHistory */ } /* ceDoHistory */
static void static void
drawInsidePaint( CEAppGlobals* globals ) drawInsidePaint( CEAppGlobals* globals, const RECT* invalR )
{ {
HDC hdc; HDC hdc;
@ -1383,6 +1384,10 @@ drawInsidePaint( CEAppGlobals* globals )
HDC prevHDC = globals->hdc; HDC prevHDC = globals->hdc;
globals->hdc = hdc; globals->hdc = hdc;
if ( !!invalR ) {
ce_draw_erase( globals->draw, invalR );
}
board_draw( globals->game.board ); board_draw( globals->game.board );
globals->hdc = prevHDC; globals->hdc = prevHDC;
@ -1494,7 +1499,7 @@ ceChooseAndOpen( CEAppGlobals* globals )
static void static void
updateForColors( CEAppGlobals* globals ) updateForColors( CEAppGlobals* globals )
{ {
ce_drawctxt_update( globals->draw ); ce_draw_update( globals->draw );
if ( !!globals->game.board ) { if ( !!globals->game.board ) {
board_invalAll( globals->game.board ); board_invalAll( globals->game.board );
} }
@ -1678,7 +1683,7 @@ freeGlobals( CEAppGlobals* globals )
MPASSIGN( mpool, globals->mpool ); MPASSIGN( mpool, globals->mpool );
draw_destroyCtxt( globals->draw ); draw_destroyCtxt( (DrawCtx*)globals->draw );
closeGame( globals ); closeGame( globals );
@ -2137,7 +2142,7 @@ WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
board_invalRect( globals->game.board, &rect ); board_invalRect( globals->game.board, &rect );
XP_ASSERT( globals->hWnd == hWnd ); XP_ASSERT( globals->hWnd == hWnd );
drawInsidePaint( globals ); drawInsidePaint( globals, &winrect );
} }
if ( !ValidateRect( hWnd, &winrect ) ) { if ( !ValidateRect( hWnd, &winrect ) ) {
logLastError( "WM_PAINT:ValidateRect" ); logLastError( "WM_PAINT:ValidateRect" );
@ -2832,7 +2837,7 @@ ce_util_trayHiddenChange( XW_UtilCtxt* uc, XW_TrayVisState XP_UNUSED(newState),
} }
#endif #endif
drawInsidePaint( globals ); drawInsidePaint( globals, NULL );
} /* ce_util_trayHiddenChange */ } /* ce_util_trayHiddenChange */
static void static void
@ -2858,7 +2863,7 @@ static void
ce_util_notifyGameOver( XW_UtilCtxt* uc ) ce_util_notifyGameOver( XW_UtilCtxt* uc )
{ {
CEAppGlobals* globals = (CEAppGlobals*)uc->closure; CEAppGlobals* globals = (CEAppGlobals*)uc->closure;
drawInsidePaint( globals ); drawInsidePaint( globals, NULL );
ceDisplayFinalScores( globals ); ceDisplayFinalScores( globals );
ceSetLeftSoftkey( globals, ID_FILE_NEWGAME ); ceSetLeftSoftkey( globals, ID_FILE_NEWGAME );

View file

@ -1,6 +1,6 @@
/* -*-mode: C; fill-column: 78; c-basic-offset: 4;-*- */ /* -*-mode: C; fill-column: 78; c-basic-offset: 4;-*- */
/* /*
* Copyright 2000-2007 by Eric House (xwords@eehouse.org). All rights reserved. * Copyright 2000-2008 by Eric House (xwords@eehouse.org). All rights reserved.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@ -108,7 +108,7 @@ typedef struct CEAppGlobals {
XP_U16 softKeyId; /* id of item now on left button */ XP_U16 softKeyId; /* id of item now on left button */
DrawCtx* draw; struct CEDrawCtx* draw;
XWGame game; XWGame game;
CurGameInfo gameInfo; CurGameInfo gameInfo;
XP_UCHAR* curGameName; /* path to storage for current game */ XP_UCHAR* curGameName; /* path to storage for current game */
@ -181,37 +181,6 @@ typedef struct _FontCacheEntry {
XP_U16 actualHt; XP_U16 actualHt;
} FontCacheEntry; } FontCacheEntry;
typedef struct CEDrawCtx {
DrawCtxVTable* vtable;
HWND mainWin;
CEAppGlobals* globals;
COLORREF prevBkColor;
HBRUSH brushes[CE_NUM_COLORS];
PenColorPair pens[CE_NUM_COLORS];
HFONT selPlayerFont;
HFONT playerFont;
FontCacheEntry fcEntry[N_RESIZE_FONTS];
HBITMAP rightArrow;
HBITMAP downArrow;
HBITMAP origin;
XP_U16 trayOwner;
XP_U16 miniLineHt;
XP_Bool scoreIsVertical;
XP_Bool topFocus;
MPSLOT
} CEDrawCtx;
DrawCtx* ce_drawctxt_make( MPFORMAL HWND mainWin, CEAppGlobals* globals );
void ce_drawctxt_update( DrawCtx* dctx );
int messageBoxChar( CEAppGlobals* globals, XP_UCHAR* str, wchar_t* title, int messageBoxChar( CEAppGlobals* globals, XP_UCHAR* str, wchar_t* title,
XP_U16 buttons ); XP_U16 buttons );
XP_Bool queryBoxChar( CEAppGlobals* globals, const XP_UCHAR* msg ); XP_Bool queryBoxChar( CEAppGlobals* globals, const XP_UCHAR* msg );