fix double free on tile16_blockset_bmp

This commit is contained in:
scawful
2024-05-30 18:05:11 -04:00
parent fb7c305f04
commit 1d6b53093e
5 changed files with 27 additions and 29 deletions

View File

@@ -263,10 +263,6 @@ void GfxGroupEditor::DrawPaletteViewer() {
DrawPaletteFromPaletteGroup(spr_aux_pal3); DrawPaletteFromPaletteGroup(spr_aux_pal3);
} }
void GfxGroupEditor::InitBlockset(gfx::Bitmap tile16_blockset) {
tile16_blockset_bmp_ = tile16_blockset;
}
} // namespace editor } // namespace editor
} // namespace app } // namespace app
} // namespace yaze } // namespace yaze

View File

@@ -7,8 +7,8 @@
#include "absl/status/status.h" #include "absl/status/status.h"
#include "absl/status/statusor.h" #include "absl/status/statusor.h"
#include "app/editor/utils/editor.h"
#include "app/editor/modules/palette_editor.h" #include "app/editor/modules/palette_editor.h"
#include "app/editor/utils/editor.h"
#include "app/gfx/bitmap.h" #include "app/gfx/bitmap.h"
#include "app/gfx/snes_palette.h" #include "app/gfx/snes_palette.h"
#include "app/gfx/snes_tile.h" #include "app/gfx/snes_tile.h"
@@ -42,7 +42,9 @@ class GfxGroupEditor : public SharedRom {
selected_spriteset_ = spriteset; selected_spriteset_ = spriteset;
} }
void InitBlockset(gfx::Bitmap tile16_blockset); void InitBlockset(gfx::Bitmap* tile16_blockset) {
tile16_blockset_bmp_ = tile16_blockset;
}
private: private:
int preview_palette_id_ = 0; int preview_palette_id_ = 0;
@@ -60,7 +62,7 @@ class GfxGroupEditor : public SharedRom {
gfx::SnesPalette palette_; gfx::SnesPalette palette_;
gfx::PaletteGroup palette_group_; gfx::PaletteGroup palette_group_;
gfx::Bitmap tile16_blockset_bmp_; gfx::Bitmap* tile16_blockset_bmp_;
std::vector<Bytes> tile16_individual_data_; std::vector<Bytes> tile16_individual_data_;
std::vector<gfx::Bitmap> tile16_individual_; std::vector<gfx::Bitmap> tile16_individual_;

View File

@@ -108,7 +108,7 @@ absl::Status Tile16Editor::UpdateBlockset() {
{ {
blockset_canvas_.DrawContextMenu(); blockset_canvas_.DrawContextMenu();
blockset_canvas_.DrawTileSelector(32); blockset_canvas_.DrawTileSelector(32);
blockset_canvas_.DrawBitmap(tile16_blockset_bmp_, 0, map_blockset_loaded_); blockset_canvas_.DrawBitmap(*tile16_blockset_bmp_, 0, map_blockset_loaded_);
blockset_canvas_.DrawGrid(); blockset_canvas_.DrawGrid();
blockset_canvas_.DrawOverlay(); blockset_canvas_.DrawOverlay();
ImGui::EndChild(); ImGui::EndChild();
@@ -123,11 +123,11 @@ absl::Status Tile16Editor::UpdateBlockset() {
notify_tile16.apply_changes(); notify_tile16.apply_changes();
if (notify_tile16.modified()) { if (notify_tile16.modified()) {
current_tile16_ = notify_tile16.get(); current_tile16_ = notify_tile16.get();
current_tile16_bmp_ = tile16_individual_[notify_tile16]; current_tile16_bmp_ = &tile16_individual_[notify_tile16];
auto ow_main_pal_group = rom()->palette_group().overworld_main; auto ow_main_pal_group = rom()->palette_group().overworld_main;
RETURN_IF_ERROR(current_tile16_bmp_.ApplyPalette( RETURN_IF_ERROR(current_tile16_bmp_->ApplyPalette(
ow_main_pal_group[current_palette_])); ow_main_pal_group[current_palette_]));
rom()->RenderBitmap(&current_tile16_bmp_); rom()->RenderBitmap(current_tile16_bmp_);
} }
} }
@@ -158,7 +158,7 @@ absl::Status Tile16Editor::DrawToCurrentTile16(ImVec2 click_position) {
int pixel_index = int pixel_index =
(start_position.y + y) * tile16_size + ((start_position.x) + x); (start_position.y + y) * tile16_size + ((start_position.x) + x);
int gfx_pixel_index = y * tile8_size + x; int gfx_pixel_index = y * tile8_size + x;
current_tile16_bmp_.WriteToPixel( current_tile16_bmp_->WriteToPixel(
pixel_index, pixel_index,
current_gfx_individual_[current_tile8_].data()[gfx_pixel_index]); current_gfx_individual_[current_tile8_].data()[gfx_pixel_index]);
} }
@@ -202,14 +202,14 @@ absl::Status Tile16Editor::UpdateTile16Edit() {
if (ImGui::BeginChild("Tile16 Editor Options", if (ImGui::BeginChild("Tile16 Editor Options",
ImVec2(ImGui::GetContentRegionAvail().x, 0x50), true)) { ImVec2(ImGui::GetContentRegionAvail().x, 0x50), true)) {
tile16_edit_canvas_.DrawBackground(); tile16_edit_canvas_.DrawBackground();
tile16_edit_canvas_.DrawContextMenu(&current_tile16_bmp_); tile16_edit_canvas_.DrawContextMenu(current_tile16_bmp_);
tile16_edit_canvas_.DrawBitmap(current_tile16_bmp_, 0, 0, 4.0f); tile16_edit_canvas_.DrawBitmap(*current_tile16_bmp_, 0, 0, 4.0f);
if (!tile8_source_canvas_.points().empty()) { if (!tile8_source_canvas_.points().empty()) {
if (tile16_edit_canvas_.DrawTilePainter( if (tile16_edit_canvas_.DrawTilePainter(
current_gfx_individual_[current_tile8_], 16, 2.0f)) { current_gfx_individual_[current_tile8_], 16, 2.0f)) {
RETURN_IF_ERROR( RETURN_IF_ERROR(
DrawToCurrentTile16(tile16_edit_canvas_.drawn_tile_position())); DrawToCurrentTile16(tile16_edit_canvas_.drawn_tile_position()));
rom()->UpdateBitmap(&current_tile16_bmp_); rom()->UpdateBitmap(current_tile16_bmp_);
} }
} }
tile16_edit_canvas_.DrawGrid(); tile16_edit_canvas_.DrawGrid();
@@ -241,9 +241,9 @@ absl::Status Tile16Editor::DrawTileEditControls() {
RETURN_IF_ERROR( RETURN_IF_ERROR(
current_gfx_bmp_.ApplyPaletteWithTransparent(palette, value)); current_gfx_bmp_.ApplyPaletteWithTransparent(palette, value));
RETURN_IF_ERROR( RETURN_IF_ERROR(
current_tile16_bmp_.ApplyPaletteWithTransparent(palette, value)); current_tile16_bmp_->ApplyPaletteWithTransparent(palette, value));
rom()->UpdateBitmap(&current_gfx_bmp_); rom()->UpdateBitmap(&current_gfx_bmp_);
rom()->UpdateBitmap(&current_tile16_bmp_); rom()->UpdateBitmap(current_tile16_bmp_);
} }
} }
@@ -353,9 +353,9 @@ absl::Status Tile16Editor::UpdateTransferTileCanvas() {
palette_ = transfer_overworld_.AreaPalette(); palette_ = transfer_overworld_.AreaPalette();
// Create the tile16 blockset image // Create the tile16 blockset image
RETURN_IF_ERROR(rom()->CreateAndRenderBitmap(0x80, 0x2000, 0x80, RETURN_IF_ERROR(rom()->CreateAndRenderBitmap(
transfer_overworld_.Tile16Blockset(), 0x80, 0x2000, 0x80, transfer_overworld_.Tile16Blockset(),
transfer_blockset_bmp_, palette_)); transfer_blockset_bmp_, palette_));
transfer_blockset_loaded_ = true; transfer_blockset_loaded_ = true;
} }

View File

@@ -44,7 +44,7 @@ class Tile16Editor : public context::GfxContext, public SharedRom {
absl::Status UpdateTransferTileCanvas(); absl::Status UpdateTransferTileCanvas();
void InitBlockset(const gfx::Bitmap& tile16_blockset_bmp, void InitBlockset(gfx::Bitmap* tile16_blockset_bmp,
gfx::Bitmap current_gfx_bmp, gfx::Bitmap current_gfx_bmp,
const std::vector<gfx::Bitmap>& tile16_individual, const std::vector<gfx::Bitmap>& tile16_individual,
uint8_t all_tiles_types[0x200]) { uint8_t all_tiles_types[0x200]) {
@@ -59,11 +59,11 @@ class Tile16Editor : public context::GfxContext, public SharedRom {
absl::Status set_tile16(int id) { absl::Status set_tile16(int id) {
current_tile16_ = id; current_tile16_ = id;
current_tile16_bmp_ = tile16_individual_[id]; current_tile16_bmp_ = &tile16_individual_[id];
auto ow_main_pal_group = rom()->palette_group().overworld_main; auto ow_main_pal_group = rom()->palette_group().overworld_main;
RETURN_IF_ERROR( RETURN_IF_ERROR(
current_tile16_bmp_.ApplyPalette(ow_main_pal_group[current_palette_])); current_tile16_bmp_->ApplyPalette(ow_main_pal_group[current_palette_]));
rom()->RenderBitmap(&current_tile16_bmp_); rom()->RenderBitmap(current_tile16_bmp_);
return absl::OkStatus(); return absl::OkStatus();
} }
@@ -97,13 +97,13 @@ class Tile16Editor : public context::GfxContext, public SharedRom {
// Tile16 blockset for selecting the tile to edit // Tile16 blockset for selecting the tile to edit
gui::Canvas blockset_canvas_{ImVec2(0x100, 0x4000), gui::Canvas blockset_canvas_{ImVec2(0x100, 0x4000),
gui::CanvasGridSize::k32x32}; gui::CanvasGridSize::k32x32};
gfx::Bitmap tile16_blockset_bmp_; gfx::Bitmap* tile16_blockset_bmp_;
// Canvas for editing the selected tile // Canvas for editing the selected tile
gui::Canvas tile16_edit_canvas_{ImVec2(0x40, 0x40), gui::Canvas tile16_edit_canvas_{ImVec2(0x40, 0x40),
gui::CanvasGridSize::k64x64}; gui::CanvasGridSize::k64x64};
gfx::Bitmap current_tile16_bmp_; gfx::Bitmap* current_tile16_bmp_;
gfx::Bitmap current_tile8_bmp_; gfx::Bitmap* current_tile8_bmp_;
// Tile8 canvas to get the tile to drawing in the tile16_edit_canvas_ // Tile8 canvas to get the tile to drawing in the tile16_edit_canvas_
gui::Canvas tile8_source_canvas_{ gui::Canvas tile8_source_canvas_{

View File

@@ -65,10 +65,10 @@ void OverworldEditor::InitializeZeml() {
absl::Status OverworldEditor::Update() { absl::Status OverworldEditor::Update() {
status_ = absl::OkStatus(); status_ = absl::OkStatus();
if (rom()->is_loaded() && !all_gfx_loaded_) { if (rom()->is_loaded() && !all_gfx_loaded_) {
tile16_editor_.InitBlockset(tile16_blockset_bmp_, current_gfx_bmp_, tile16_editor_.InitBlockset(&tile16_blockset_bmp_, current_gfx_bmp_,
tile16_individual_, tile16_individual_,
*overworld_.mutable_all_tiles_types()); *overworld_.mutable_all_tiles_types());
gfx_group_editor_.InitBlockset(tile16_blockset_bmp_); gfx_group_editor_.InitBlockset(&tile16_blockset_bmp_);
RETURN_IF_ERROR(LoadEntranceTileTypes(*rom())); RETURN_IF_ERROR(LoadEntranceTileTypes(*rom()));
all_gfx_loaded_ = true; all_gfx_loaded_ = true;
} else if (!rom()->is_loaded() && all_gfx_loaded_) { } else if (!rom()->is_loaded() && all_gfx_loaded_) {