sim_fb.c 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. // Copyright (C) 2023 Victor Suarez Rovere <suarezvictor@gmail.com>
  2. // SPDX-License-Identifier: AGPL-3.0-only
  3. #include <SDL2/SDL.h>
  4. #include "sim_fb.h"
  5. int fb_init(unsigned width, unsigned height, int vsync, fb_handle_t *handle)
  6. {
  7. int texture_format;
  8. if(SDL_Init(SDL_INIT_VIDEO) < 0)
  9. return 0;
  10. handle->win = SDL_CreateWindow("Simulator window", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, SDL_WINDOW_SHOWN);
  11. if (!handle->win)
  12. return 0;
  13. handle->renderer = SDL_CreateRenderer(handle->win, -1, vsync ? SDL_RENDERER_ACCELERATED | SDL_RENDERER_TARGETTEXTURE | SDL_RENDERER_PRESENTVSYNC : 0);
  14. if (!handle->renderer)
  15. return 0;
  16. handle->texture = SDL_CreateTexture(handle->renderer, SDL_PIXELFORMAT_RGBA32, SDL_TEXTUREACCESS_TARGET, width, height);
  17. if (!handle->texture)
  18. return 0;
  19. return 1;
  20. }
  21. int fb_should_quit(void)
  22. {
  23. SDL_Event event;
  24. while(SDL_PollEvent(&event))
  25. {
  26. switch(event.type)
  27. {
  28. case SDL_QUIT:
  29. return 1;
  30. case SDL_KEYDOWN:
  31. if(event.key.keysym.sym == SDLK_ESCAPE)
  32. return 1;
  33. }
  34. }
  35. return 0;
  36. }
  37. void fb_update(fb_handle_t *handle, const void *buf, size_t stride_bytes)
  38. {
  39. SDL_UpdateTexture(handle->texture, NULL, buf, stride_bytes);
  40. SDL_RenderCopy(handle->renderer, handle->texture, NULL, NULL);
  41. SDL_RenderPresent(handle->renderer);
  42. }
  43. void fb_deinit(fb_handle_t *handle)
  44. {
  45. SDL_DestroyTexture(handle->texture);
  46. SDL_DestroyRenderer(handle->renderer);
  47. SDL_DestroyWindow(handle->win);
  48. handle->win = NULL;
  49. }