From a37f3bbd43760031e7f45fe480617bf112c0238c Mon Sep 17 00:00:00 2001 From: scawful Date: Fri, 9 Aug 2024 18:56:57 -0400 Subject: [PATCH] add core::Renderer --- src/app/core/platform/renderer.h | 82 ++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 src/app/core/platform/renderer.h diff --git a/src/app/core/platform/renderer.h b/src/app/core/platform/renderer.h new file mode 100644 index 00000000..366acc78 --- /dev/null +++ b/src/app/core/platform/renderer.h @@ -0,0 +1,82 @@ +#ifndef YAZE_APP_CORE_PLATFORM_RENDERER_H +#define YAZE_APP_CORE_PLATFORM_RENDERER_H + +#include + +#include + +#include "absl/status/status.h" +#include "app/core/common.h" +#include "app/core/utils/sdl_deleter.h" +#include "app/gfx/bitmap.h" + +namespace yaze { +namespace app { +namespace core { + +class Renderer : public ExperimentFlags { + public: + static Renderer& GetInstance() { + static Renderer instance; + return instance; + } + + absl::Status CreateRenderer(SDL_Window* window) { + renderer_ = std::unique_ptr( + SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED)); + if (renderer_ == nullptr) { + return absl::InternalError( + absl::StrFormat("SDL_CreateRenderer: %s\n", SDL_GetError())); + } + SDL_SetRenderDrawBlendMode(renderer_.get(), SDL_BLENDMODE_BLEND); + SDL_SetRenderDrawColor(renderer_.get(), 0x00, 0x00, 0x00, 0x00); + return absl::OkStatus(); + } + + auto renderer() -> SDL_Renderer* { return renderer_.get(); } + + /** + * @brief Used to render a bitmap to the screen. + */ + void RenderBitmap(gfx::Bitmap* bitmap) { + if (flags()->kLoadTexturesAsStreaming) { + bitmap->CreateTexture(renderer_.get()); + } else { + //bitmap->CreateTexture(renderer_); + } + } + + /** + * @brief Used to update a bitmap on the screen. + */ + void UpdateBitmap(gfx::Bitmap* bitmap, bool use_sdl_update = false) { + if (flags()->kLoadTexturesAsStreaming) { + bitmap->UpdateTexture(renderer_.get(), use_sdl_update); + } else { + //bitmap->UpdateTexture(renderer_); + } + } + + absl::Status CreateAndRenderBitmap(int width, int height, int depth, + const Bytes& data, gfx::Bitmap& bitmap, + gfx::SnesPalette& palette) { + bitmap.Create(width, height, depth, data); + RETURN_IF_ERROR(bitmap.ApplyPalette(palette)); + RenderBitmap(&bitmap); + return absl::OkStatus(); + } + + private: + Renderer() = default; + + std::unique_ptr renderer_; + + Renderer(const Renderer&) = delete; + Renderer& operator=(const Renderer&) = delete; +}; + +} // namespace core +} // namespace app +} // namespace yaze + +#endif \ No newline at end of file