15
|
1 #include <SDL.h>
|
|
2 #include <stdint.h>
|
|
3
|
|
4
|
|
5 SDL_Window *window;
|
|
6 SDL_Renderer *renderer;
|
|
7 SDL_Texture *texture;
|
|
8
|
|
9 int system_init(int width, int height)
|
|
10 {
|
|
11 if (SDL_Init(SDL_INIT_VIDEO) < 0) {
|
|
12 fprintf(stderr, "Failed to init SDL: %s\n", SDL_GetError());
|
|
13 return 0;
|
|
14 }
|
|
15 atexit(SDL_Quit);
|
|
16 SDL_CreateWindowAndRenderer(width, height, 0, &window, &renderer);
|
|
17
|
|
18 if (!window || !renderer) {
|
|
19 fprintf(stderr, "Failed to create window or renderer: %s\n", SDL_GetError());
|
|
20 return 0;
|
|
21 }
|
|
22 texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGB444, SDL_TEXTUREACCESS_STREAMING, 320, 240);
|
|
23 if (!texture) {
|
|
24 fprintf(stderr, "Failed to create texture: %s\n", SDL_GetError());
|
|
25 SDL_DestroyRenderer(renderer);
|
|
26 SDL_DestroyWindow(window);
|
|
27 return 0;
|
|
28 }
|
|
29 return 1;
|
|
30 }
|
|
31
|
|
32 //Should be called once per frame to get a pointer to the output buffer at the start of rendering
|
|
33 uint16_t *system_get_framebuffer(int *pitch)
|
|
34 {
|
|
35 void *pixels;
|
|
36 if (SDL_LockTexture(texture, NULL, &pixels, pitch) < 0) {
|
|
37 fprintf(stderr, "Failed to lock texture: %s\n", SDL_GetError());
|
|
38 return NULL;
|
|
39 }
|
|
40 return pixels;
|
|
41 }
|
|
42
|
|
43 //Should be called once per frame at the competion of rendering
|
|
44 //The pointer returned by system_get_framebuffer should be discarded after calling this function
|
|
45 void system_framebuffer_updated()
|
|
46 {
|
|
47 SDL_UnlockTexture(texture);
|
|
48 SDL_RenderCopy(renderer, texture, NULL, NULL);
|
|
49 SDL_RenderPresent(renderer);
|
|
50 }
|
|
51
|