Mercurial > repos > simple16
changeset 15:c8a0dbd7752c
Forgot to commit SDL code
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 27 Mar 2016 21:31:34 -0700 |
parents | 769120da2c1f |
children | ae58e7c3c328 |
files | src/system.h src/system_sdl.c |
diffstat | 2 files changed, 59 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/system.h Sun Mar 27 21:31:34 2016 -0700 @@ -0,0 +1,8 @@ +#ifndef SYSTEM_H_ +#define SYSTEM_H_ + +int system_init(int width, int height); +uint16_t *system_get_framebuffer(int *pitch); +void system_framebuffer_updated(); + +#endif //SYSTEM_H_
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/system_sdl.c Sun Mar 27 21:31:34 2016 -0700 @@ -0,0 +1,51 @@ +#include <SDL.h> +#include <stdint.h> + + +SDL_Window *window; +SDL_Renderer *renderer; +SDL_Texture *texture; + +int system_init(int width, int height) +{ + if (SDL_Init(SDL_INIT_VIDEO) < 0) { + fprintf(stderr, "Failed to init SDL: %s\n", SDL_GetError()); + return 0; + } + atexit(SDL_Quit); + SDL_CreateWindowAndRenderer(width, height, 0, &window, &renderer); + + if (!window || !renderer) { + fprintf(stderr, "Failed to create window or renderer: %s\n", SDL_GetError()); + return 0; + } + texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGB444, SDL_TEXTUREACCESS_STREAMING, 320, 240); + if (!texture) { + fprintf(stderr, "Failed to create texture: %s\n", SDL_GetError()); + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); + return 0; + } + return 1; +} + +//Should be called once per frame to get a pointer to the output buffer at the start of rendering +uint16_t *system_get_framebuffer(int *pitch) +{ + void *pixels; + if (SDL_LockTexture(texture, NULL, &pixels, pitch) < 0) { + fprintf(stderr, "Failed to lock texture: %s\n", SDL_GetError()); + return NULL; + } + return pixels; +} + +//Should be called once per frame at the competion of rendering +//The pointer returned by system_get_framebuffer should be discarded after calling this function +void system_framebuffer_updated() +{ + SDL_UnlockTexture(texture); + SDL_RenderCopy(renderer, texture, NULL, NULL); + SDL_RenderPresent(renderer); +} +