aboutsummaryrefslogtreecommitdiff
path: root/src/event.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/event.c')
-rw-r--r--src/event.c96
1 files changed, 83 insertions, 13 deletions
diff --git a/src/event.c b/src/event.c
index d0354eb..f0f0e14 100644
--- a/src/event.c
+++ b/src/event.c
@@ -1,6 +1,10 @@
#include "mandel.h"
-void event_handle(State *state)
+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;
@@ -11,46 +15,112 @@ void event_handle(State *state)
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_PLUS:
- case SDLK_p:
-
+ case SDLK_EQUALS:
+ case SDLK_f:
+ st_zoom(state, true);
break;
case SDLK_MINUS:
- case SDLK_m:
-
+ 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_MOUSEBUTTONDOWN:
+
+ 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;
+}