#include "mandel.h" static void st_zoom(State *state, bool zoom_in); static void st_move_horizontal(State *state, bool move_right); static void st_move_vertical(State *state, bool move_down); void event_handle(State *state) { SDL_Event e; while (SDL_PollEvent(&e)) { switch (e.type) { case SDL_QUIT: state->running = false; break; case SDL_KEYDOWN: switch (e.key.keysym.sym) { case SDLK_r: state->iterations += 10; state->palette = color_palette_new(state->palette, state->iterations); break; case SDLK_e: state->iterations -= 10; if (state->iterations <= 0) state->iterations = 1; state->palette = color_palette_new(state->palette, state->iterations); break; case SDLK_UP: case SDLK_k: st_move_vertical(state, false); break; case SDLK_DOWN: case SDLK_j: st_move_vertical(state, true); break; case SDLK_LEFT: case SDLK_h: st_move_horizontal(state, false); break; case SDLK_RIGHT: case SDLK_l: st_move_horizontal(state, true); break; case SDLK_EQUALS: case SDLK_f: st_zoom(state, true); break; case SDLK_MINUS: case SDLK_d: st_zoom(state, false); break; case SDLK_q: state->running = false; } break; case SDL_MOUSEWHEEL: if (e.wheel.y == -1) st_zoom(state, true); else if (e.wheel.y == 1) st_zoom(state, false); break; case SDL_WINDOWEVENT: if (e.window.event == SDL_WINDOWEVENT_RESIZED) { int width; int height; SDL_QueryTexture(state->texture, NULL, NULL, &width, &height); double w_ratio = (double)width / (double)e.window.data1; double h_ratio = (double)height / (double)e.window.data2; state->real_start /= w_ratio; state->real_end /= w_ratio; state->imag_start /= h_ratio; state->imag_end /= h_ratio; SDL_DestroyTexture(state->texture); SDL_CALL(state->texture = SDL_CreateTexture( state->renderer, SDL_PIXELFORMAT_RGB888, SDL_TEXTUREACCESS_STREAMING, e.window.data1, e.window.data2 )); } break; } } } #define MANDEL_ZOOM_RATIO 30 static void st_zoom(State *state, bool zoom_in) { double factor = zoom_in ? 1 : -1; double real_change = (state->real_end - state->real_start) / MANDEL_ZOOM_RATIO; double imag_change = (state->imag_end - state->imag_start) / MANDEL_ZOOM_RATIO; state->real_start += factor * real_change; state->real_end -= factor * real_change; state->imag_start += factor * imag_change; state->imag_end -= factor * imag_change; } #define MANDEL_MOVE_RATIO 20 static void st_move_horizontal(State *state, bool move_right) { double factor = move_right ? 1 : -1; double real_change = (state->real_end - state->real_start) / MANDEL_MOVE_RATIO; state->real_start += factor * real_change; state->real_end += factor * real_change; } static void st_move_vertical(State *state, bool move_down) { double factor = move_down ? 1 : -1; double imag_change = (state->imag_end - state->imag_start) / MANDEL_MOVE_RATIO; state->imag_start += factor * imag_change; state->imag_end += factor * imag_change; }