6 const int ZOOM_LEVELS[10] = {1, 2, 3, 5, 8, 12, 20, 30};
7 const unsigned int MAX_ZOOM_LEVEL = 7;
21 int redraw_screen(struct gol_board *state, SDL_Surface *screen, struct viewport viewport);
23 int handle_mousedown(struct gol_board *state, struct viewport viewport, SDL_Event e);
25 int main(int argc, char* args[])
27 struct gol_board state = {
36 SDL_Window *window = NULL;
37 SDL_Surface *screen = NULL;
43 // The coordinates of the cell to draw in the bottom left corner of the
45 struct viewport viewport = {0, 0, 4};
49 state.live_cells = malloc(10 * sizeof(int_least32_t));
50 if (!state.live_cells) {
54 gol_vivify(&state, 10, 10);
56 if (SDL_Init(SDL_INIT_EVERYTHING) < 0) {
60 window = SDL_CreateWindow("SDL Tutorial",
61 SDL_WINDOWPOS_UNDEFINED,
62 SDL_WINDOWPOS_UNDEFINED,
70 screen = SDL_GetWindowSurface(window);
74 SDL_UpdateWindowSurface(window);
77 while (SDL_PollEvent(&e) != 0) {
78 if (e.type == SDL_QUIT) {
80 } else if (e.type == SDL_KEYDOWN) {
81 switch (e.key.keysym.sym) {
88 if (viewport.zoom_level != MAX_ZOOM_LEVEL)
89 viewport.zoom_level++;
94 if (viewport.zoom_level != 0)
95 viewport.zoom_level--;
103 } else if (e.type == SDL_MOUSEBUTTONDOWN) {
104 handle_mousedown(&state, viewport, e);
115 redraw_screen(&state, screen, viewport);
116 SDL_UpdateWindowSurface(window);
120 SDL_DestroyWindow(window);
125 int redraw_screen(struct gol_board *state, SDL_Surface *screen,
126 struct viewport viewport)
132 ppc = ZOOM_LEVELS[viewport.zoom_level];
134 SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 255, 255, 255));
136 for (i = viewport.origin_x;
137 i < (screen->w/ppc) + viewport.origin_x;
139 for (j = viewport.origin_y;
140 j < (screen->h/ppc) + viewport.origin_y;
142 if (gol_is_live(state, i, j, &is_live) && is_live) {
144 ((i - viewport.origin_x) * ppc),
145 ((j - viewport.origin_y) * ppc),
149 SDL_FillRect(screen, &rect,
150 SDL_MapRGB(screen->format, 0, 0, 0));
157 int handle_mousedown(struct gol_board *state, struct viewport viewport, SDL_Event e)
161 x = e.button.x/ZOOM_LEVELS[viewport.zoom_level] - viewport.origin_x;
162 y = e.button.y/ZOOM_LEVELS[viewport.zoom_level] - viewport.origin_y;
164 gol_is_live(state, x, y, &is_live);
166 gol_vivify(state, x, y);