Miscellaneous fixes from James Harvey's PalmOS porting work:

- fixed numerous memory leaks (not Palm-specific)
 - corrected a couple of 32-bit-int assumptions (vital for Palm but
   generally a good thing anyway)
 - lifted a few function pointer types into explicit typedefs
   (neutral for me but convenient for the source-munging Perl
   scripts he uses to deal with Palm code segment rules)
 - lifted a few function-level static arrays into global static
   arrays (neutral for me but apparently works round a Palm tools
   bug)
 - a couple more presets in Rectangles (so that Palm, or any other
   slow platform which can't handle the larger sizes easily, can
   still have some variety available)
 - in Solo, arranged a means of sharing scratch space between calls
   to nsolve to prevent a lot of redundant malloc/frees (gives a 10%
   speed increase even on existing platforms)

[originally from svn r5897]
This commit is contained in:
Simon Tatham
2005-06-01 17:47:56 +00:00
parent ad3abd9867
commit 50edaa578b
15 changed files with 237 additions and 174 deletions

32
rect.c
View File

@ -98,9 +98,14 @@ static int game_fetch_preset(int i, char **name, game_params **params)
switch (i) {
case 0: w = 7, h = 7; break;
case 1: w = 11, h = 11; break;
case 2: w = 15, h = 15; break;
case 3: w = 19, h = 19; break;
case 1: w = 9, h = 9; break;
case 2: w = 11, h = 11; break;
case 3: w = 13, h = 13; break;
case 4: w = 15, h = 15; break;
#ifndef SLOW_SYSTEM
case 5: w = 17, h = 17; break;
case 6: w = 19, h = 19; break;
#endif
default: return FALSE;
}
@ -212,9 +217,9 @@ static game_params *custom_params(config_item *cfg)
static char *validate_params(game_params *params)
{
if (params->w <= 0 && params->h <= 0)
if (params->w <= 0 || params->h <= 0)
return "Width and height must both be greater than zero";
if (params->w < 2 && params->h < 2)
if (params->w*params->h < 2)
return "Grid area must be greater than one";
if (params->expandfactor < 0.0F)
return "Expansion factor may not be negative";
@ -2277,16 +2282,15 @@ static game_state *make_move(game_state *from, game_ui *ui, game_drawstate *ds,
* Drawing routines.
*/
#define CORRECT 65536
#define CORRECT (1L<<16)
#define COLOUR(k) ( (k)==1 ? COL_LINE : COL_DRAG )
#define MAX(x,y) ( (x)>(y) ? (x) : (y) )
#define MAX4(x,y,z,w) ( MAX(MAX(x,y),MAX(z,w)) )
#define MAX4(x,y,z,w) ( max(max(x,y),max(z,w)) )
struct game_drawstate {
int started;
int w, h;
unsigned int *visible;
unsigned long *visible;
};
static void game_size(game_params *params, int *x, int *y)
@ -2333,7 +2337,7 @@ static game_drawstate *game_new_drawstate(game_state *state)
ds->started = FALSE;
ds->w = state->w;
ds->h = state->h;
ds->visible = snewn(ds->w * ds->h, unsigned int);
ds->visible = snewn(ds->w * ds->h, unsigned long);
for (i = 0; i < ds->w * ds->h; i++)
ds->visible[i] = 0xFFFF;
@ -2459,7 +2463,7 @@ static void game_redraw(frontend *fe, game_drawstate *ds, game_state *oldstate,
for (x = 0; x < state->w; x++)
for (y = 0; y < state->h; y++) {
unsigned int c = 0;
unsigned long c = 0;
if (HRANGE(state,x,y))
c |= index(state,hedge,x,y);
@ -2475,12 +2479,14 @@ static void game_redraw(frontend *fe, game_drawstate *ds, game_state *oldstate,
if (y+1 < state->h)
c |= index(state,corners,x,y+1) << 12;
if (x+1 < state->w && y+1 < state->h)
c |= index(state,corners,x+1,y+1) << 14;
/* cast to prevent 2<<14 sign-extending on promotion to long */
c |= (unsigned long)index(state,corners,x+1,y+1) << 14;
if (index(state, correct, x, y) && !flashtime)
c |= CORRECT;
if (index(ds,ds->visible,x,y) != c) {
draw_tile(fe, state, x, y, hedge, vedge, corners, c & CORRECT);
draw_tile(fe, state, x, y, hedge, vedge, corners,
(c & CORRECT) ? 1 : 0);
index(ds,ds->visible,x,y) = c;
}
}