diff options
Diffstat (limited to 'sdl.cpp')
| -rw-r--r-- | sdl.cpp | 142 | 
1 files changed, 142 insertions, 0 deletions
| @@ -0,0 +1,142 @@ +#include <iostream> +#include <SDL.h> +#include "mandel.h" + +using namespace std; + + +#if 1 +int main() { +	if (SDL_Init(SDL_INIT_VIDEO) < 0) { +		cerr << "SDL init error: " << SDL_GetError() << endl; +		return 1; +	} + +	SDL_Window *window = SDL_CreateWindow("Mandel", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 960, 640, SDL_WINDOW_SHOWN); +	if (!window) { +		cerr << "SDL window creation error: " << SDL_GetError() << endl; +		return 1; +	} + +	int w, h; +	SDL_GetWindowSize(window, &w, &h); +	Mandel *ctx = mandel_init(w, h); +	Params par = mandel_default_params(); +	uint8_t *imgdata = new uint8_t[3 * w * h]; +	mandel_render(imgdata, ctx, &par); + +	SDL_Surface *mandelsurf = SDL_CreateRGBSurfaceFrom(imgdata, w, h, 24, 3 * w, 0x0000000ff, 0x0000ff00, 0x00ff0000, 0); + +	SDL_Surface *winsurf = SDL_GetWindowSurface(window); + +	SDL_BlitSurface(mandelsurf, nullptr, winsurf, nullptr); + +	SDL_UpdateWindowSurface(window); + +	while (true) { +		const double min_img_size = min(par.imgw, mandel_imgh(ctx, &par)); +		const double scroll_dist = min_img_size * 0.1; + +		bool need_redraw = false; + +		SDL_Event e; +		if (SDL_WaitEvent(&e) == 0) { +			cerr << "SDL event wait error: " << SDL_GetError() << endl; +			break; +		} + +		switch (e.type) { +			case SDL_QUIT: +				break; + +			case SDL_KEYDOWN: +				switch (e.key.keysym.sym) { +					case SDLK_UP: +						par.cy += scroll_dist; +						need_redraw = true; +						break; + +					case SDLK_DOWN: +						par.cy -= scroll_dist; +						need_redraw = true; +						break; + +					case SDLK_RIGHT: +						par.cx += scroll_dist; +						need_redraw = true; +						break; + +					case SDLK_LEFT: +						par.cx -= scroll_dist; +						need_redraw = true; +						break; + +					case SDLK_KP_PLUS: +					case SDLK_PLUS: +					case SDLK_EQUALS: +						par.imgw *= 0.8; +						need_redraw = true; +						break; + +					case SDLK_KP_MINUS: +					case SDLK_MINUS: +						par.imgw *= 1.25; +						need_redraw = true; +						break; + +					case SDLK_PAGEUP: +						par.maxit += 128; +						need_redraw = true; +						break; + +					case SDLK_PAGEDOWN: +						if (par.maxit > 256) { +							par.maxit -= 128; +							need_redraw = true; +						} +						break; + +					case SDLK_q: +						goto cleanup; +				} +				break; + +			case SDL_WINDOWEVENT: +				switch (e.window.event) { +					case SDL_WINDOWEVENT_FOCUS_GAINED: +						SDL_UpdateWindowSurface(window); +						break; + +					case SDL_WINDOWEVENT_SIZE_CHANGED: +						mandel_free(ctx); +						delete[] imgdata; +						SDL_FreeSurface(mandelsurf); + +						winsurf = SDL_GetWindowSurface(window); +						SDL_GetWindowSize(window, &w, &h); +						mandelsurf = SDL_CreateRGBSurfaceFrom(imgdata, w, h, 24, 3 * w, 0x0000000ff, 0x0000ff00, 0x00ff0000, 0); +						ctx = mandel_init(w, h); +						imgdata = new uint8_t[3 * w * h]; +						need_redraw = true; +						break; +				} +				break; +		} + +		if (need_redraw) { +			SDL_GetWindowSize(window, &w, &h); +			mandel_render(imgdata, ctx, &par); + +			if (SDL_MUSTLOCK(winsurf)) SDL_LockSurface(winsurf); +			SDL_BlitSurface(mandelsurf, nullptr, winsurf, nullptr); +			if (SDL_MUSTLOCK(winsurf)) SDL_UnlockSurface(winsurf); + +			SDL_UpdateWindowSurface(window); +		} +	} + +cleanup: +	SDL_DestroyWindow(window); +	SDL_Quit(); +} +#endif | 
