The reason that dragging was so slow before is that the program
was redrawing every single tile every time the mouse moved. Now
we only redraw tiles that are actually affected by the movement.
This is fast enough now that we probably don't even need to add
caches for pre-rendered tiles, (though of course, if we did that
it would be even faster).
printf("%6s %2d\n", colors[tile.color], tile.number + 1);
}
printf("%6s %2d\n", colors[tile.color], tile.number + 1);
}
-static void tile_draw(game_t *game, tile_t *tile, cairo_t *cr)
+static void tile_draw(game_t *game, tile_t *tile, cairo_t *cr, GdkRegion *region)
{
char number_string[3];
int len;
{
char number_string[3];
int len;
+ GdkRectangle rectangle;
+
+ rectangle.x = tile->x - 1;
+ rectangle.y = tile->y - 1;
+ rectangle.width = TILE_WIDTH + 2;
+ rectangle.height = TILE_HEIGHT + 2;
+ if (gdk_region_rect_in (region, &rectangle) == GDK_OVERLAP_RECTANGLE_OUT)
+ return;
len = snprintf (number_string, 3, "%d", tile->number + 1);
if (len < 0 || len >= 3)
len = snprintf (number_string, 3, "%d", tile->number + 1);
if (len < 0 || len >= 3)
-static void deck_draw(game_t *game, cairo_t *cr)
+static void deck_draw(game_t *game, cairo_t *cr, GdkRegion *region)
{
int i;
for (i = 0; i < game->deck.num_tiles; i++)
{
{
int i;
for (i = 0; i < game->deck.num_tiles; i++)
{
- tile_draw(game, &game->deck.tiles[i], cr);
+ tile_draw(game, &game->deck.tiles[i], cr, region);
-static void hand_draw(game_t *game, int player, cairo_t *cr)
+static void hand_draw(game_t *game, int player, cairo_t *cr, GdkRegion *region)
{
int i;
int gwdw = GAME_WINDOW_DEFAULT_WIDTH;
{
int i;
int gwdw = GAME_WINDOW_DEFAULT_WIDTH;
}
for (i = 0; i < game->players[player].hand.num_tiles; i++)
{
}
for (i = 0; i < game->players[player].hand.num_tiles; i++)
{
- tile_draw(game, &game->players[player].hand.tiles[i], cr);
+ tile_draw(game, &game->players[player].hand.tiles[i], cr, region);
cr = gdk_cairo_create (widget->window);
cr = gdk_cairo_create (widget->window);
+ deck_draw(game, cr, event->region);
- hand_draw(game, 0, cr);
+ hand_draw(game, 0, cr, event->region);