Refactor bitmap update methods to remove unnecessary parameters; simplify texture updating in Renderer and Bitmap classes

This commit is contained in:
scawful
2024-11-13 09:16:16 -05:00
parent 8e8b3ed2f7
commit 7798d769a5
5 changed files with 11 additions and 30 deletions

View File

@@ -52,8 +52,8 @@ class Renderer {
/** /**
* @brief Used to update a bitmap on the screen. * @brief Used to update a bitmap on the screen.
*/ */
void UpdateBitmap(gfx::Bitmap *bitmap, bool use_sdl_update = false) { void UpdateBitmap(gfx::Bitmap *bitmap) {
bitmap->UpdateTexture(renderer_.get(), use_sdl_update); bitmap->UpdateTexture(renderer_.get());
} }
absl::Status CreateAndRenderBitmap(int width, int height, int depth, absl::Status CreateAndRenderBitmap(int width, int height, int depth,

View File

@@ -119,14 +119,14 @@ absl::Status DungeonEditor::RefreshGraphics() {
int block = rooms_[current_room_id_].blocks()[i]; int block = rooms_[current_room_id_].blocks()[i];
RETURN_IF_ERROR(graphics_bin_[block].ApplyPaletteWithTransparent( RETURN_IF_ERROR(graphics_bin_[block].ApplyPaletteWithTransparent(
current_palette_group_[current_palette_id_], 0)); current_palette_group_[current_palette_id_], 0));
Renderer::GetInstance().UpdateBitmap(&graphics_bin_[block], true); Renderer::GetInstance().UpdateBitmap(&graphics_bin_[block]);
} }
auto sprites_aux1_pal_group = rom()->palette_group().sprites_aux1; auto sprites_aux1_pal_group = rom()->palette_group().sprites_aux1;
for (int i = 9; i < 16; i++) { for (int i = 9; i < 16; i++) {
int block = rooms_[current_room_id_].blocks()[i]; int block = rooms_[current_room_id_].blocks()[i];
RETURN_IF_ERROR(graphics_bin_[block].ApplyPaletteWithTransparent( RETURN_IF_ERROR(graphics_bin_[block].ApplyPaletteWithTransparent(
sprites_aux1_pal_group[current_palette_id_], 0)); sprites_aux1_pal_group[current_palette_id_], 0));
Renderer::GetInstance().UpdateBitmap(&graphics_bin_[block], true); Renderer::GetInstance().UpdateBitmap(&graphics_bin_[block]);
} }
return absl::OkStatus(); return absl::OkStatus();
} }

View File

@@ -294,7 +294,7 @@ absl::Status GraphicsEditor::UpdateGfxTabView() {
auto draw_tile_event = [&]() { auto draw_tile_event = [&]() {
current_sheet_canvas_.DrawTileOnBitmap(tile_size_, &current_bitmap, current_sheet_canvas_.DrawTileOnBitmap(tile_size_, &current_bitmap,
current_color_); current_color_);
Renderer::GetInstance().UpdateBitmap(&current_bitmap, true); Renderer::GetInstance().UpdateBitmap(&current_bitmap);
}; };
current_sheet_canvas_.UpdateColorPainter( current_sheet_canvas_.UpdateColorPainter(
@@ -373,7 +373,7 @@ absl::Status GraphicsEditor::UpdatePaletteColumn() {
->data()[current_sheet_] ->data()[current_sheet_]
.ApplyPaletteWithTransparent(palette, edit_palette_sub_index_)); .ApplyPaletteWithTransparent(palette, edit_palette_sub_index_));
Renderer::GetInstance().UpdateBitmap( Renderer::GetInstance().UpdateBitmap(
&rom()->mutable_gfx_sheets()->data()[current_sheet_], true); &rom()->mutable_gfx_sheets()->data()[current_sheet_]);
refresh_graphics_ = false; refresh_graphics_ = false;
} }
} }

View File

@@ -307,7 +307,7 @@ void Bitmap::CreateTexture(SDL_Renderer *renderer) {
SDL_UnlockTexture(texture_.get()); SDL_UnlockTexture(texture_.get());
} }
void Bitmap::UpdateTexture(SDL_Renderer *renderer, bool use_sdl_update) { void Bitmap::UpdateTexture(SDL_Renderer *renderer) {
SDL_Surface *converted_surface = SDL_Surface *converted_surface =
SDL_ConvertSurfaceFormat(surface_.get(), SDL_PIXELFORMAT_ARGB8888, 0); SDL_ConvertSurfaceFormat(surface_.get(), SDL_PIXELFORMAT_ARGB8888, 0);
if (converted_surface) { if (converted_surface) {
@@ -319,28 +319,11 @@ void Bitmap::UpdateTexture(SDL_Renderer *renderer, bool use_sdl_update) {
SDL_LockTexture(texture_.get(), nullptr, (void **)&texture_pixels, SDL_LockTexture(texture_.get(), nullptr, (void **)&texture_pixels,
&converted_surface_->pitch); &converted_surface_->pitch);
if (use_sdl_update) { memcpy(texture_pixels, converted_surface_->pixels,
SDL_UpdateTexture(texture_.get(), nullptr, converted_surface_->pixels, converted_surface_->h * converted_surface_->pitch);
converted_surface_->pitch);
} else {
memcpy(texture_pixels, converted_surface_->pixels,
converted_surface_->h * converted_surface_->pitch);
}
SDL_UnlockTexture(texture_.get()); SDL_UnlockTexture(texture_.get());
} }
void Bitmap::CreateTexture(std::shared_ptr<SDL_Renderer> renderer) {
texture_ = std::shared_ptr<SDL_Texture>{
SDL_CreateTextureFromSurface(renderer.get(), surface_.get()),
SDL_Texture_Deleter{}};
}
void Bitmap::UpdateTexture(std::shared_ptr<SDL_Renderer> renderer) {
texture_ = std::shared_ptr<SDL_Texture>{
SDL_CreateTextureFromSurface(renderer.get(), surface_.get()),
SDL_Texture_Deleter{}};
}
absl::Status Bitmap::ApplyPalette(const SnesPalette &palette) { absl::Status Bitmap::ApplyPalette(const SnesPalette &palette) {
if (surface_ == nullptr) { if (surface_ == nullptr) {
return absl::FailedPreconditionError( return absl::FailedPreconditionError(

View File

@@ -108,14 +108,12 @@ class Bitmap {
* Converts the surface from a RGB to ARGB format. * Converts the surface from a RGB to ARGB format.
* Uses SDL_TEXTUREACCESS_STREAMING to allow for live updates. * Uses SDL_TEXTUREACCESS_STREAMING to allow for live updates.
*/ */
void CreateTexture(std::shared_ptr<SDL_Renderer> renderer); void CreateTexture(SDL_Renderer *renderer);
/** /**
* @brief Updates the underlying SDL_Texture when it already exists. * @brief Updates the underlying SDL_Texture when it already exists.
*/ */
void UpdateTexture(std::shared_ptr<SDL_Renderer> renderer); void UpdateTexture(SDL_Renderer *renderer);
void CreateTexture(SDL_Renderer *renderer);
void UpdateTexture(SDL_Renderer *renderer, bool use_sdl_update = false);
/** /**
* @brief Copy color data from the SnesPalette into the SDL_Palette * @brief Copy color data from the SnesPalette into the SDL_Palette