From f0f289d785fa87c1142f4f786499b79729a184b3 Mon Sep 17 00:00:00 2001 From: Yousef Khadadeh Date: Sun, 16 Nov 2025 16:49:47 +0300 Subject: [PATCH] Fixed segmentation fault when copying textbox --- src/DrawComponents/DrawBrushStroke.cpp | 4 ++-- src/DrawComponents/DrawBrushStroke.hpp | 4 ++-- src/DrawComponents/DrawComponent.hpp | 4 ++-- src/DrawComponents/DrawEllipse.cpp | 4 ++-- src/DrawComponents/DrawEllipse.hpp | 4 ++-- src/DrawComponents/DrawImage.cpp | 4 ++-- src/DrawComponents/DrawImage.hpp | 4 ++-- src/DrawComponents/DrawRectangle.cpp | 4 ++-- src/DrawComponents/DrawRectangle.hpp | 4 ++-- src/DrawComponents/DrawTextBox.cpp | 6 ++++-- src/DrawComponents/DrawTextBox.hpp | 4 ++-- src/DrawingProgram/DrawingProgramSelection.cpp | 4 ++-- src/Server/MainServer.cpp | 2 +- 13 files changed, 27 insertions(+), 25 deletions(-) diff --git a/src/DrawComponents/DrawBrushStroke.cpp b/src/DrawComponents/DrawBrushStroke.cpp index a412c99..3d1b74b 100644 --- a/src/DrawComponents/DrawBrushStroke.cpp +++ b/src/DrawComponents/DrawBrushStroke.cpp @@ -37,14 +37,14 @@ DrawComponentType DrawBrushStroke::get_type() const { #ifndef IS_SERVER -std::shared_ptr DrawBrushStroke::copy() const { +std::shared_ptr DrawBrushStroke::copy(DrawingProgram& drawP) const { auto a = std::make_shared(); a->d = d; a->coords = coords; return a; } -std::shared_ptr DrawBrushStroke::deep_copy() const { +std::shared_ptr DrawBrushStroke::deep_copy(DrawingProgram& drawP) const { auto a = std::make_shared(); a->d = d; a->coords = coords; diff --git a/src/DrawComponents/DrawBrushStroke.hpp b/src/DrawComponents/DrawBrushStroke.hpp index 8a8bf4c..910888c 100644 --- a/src/DrawComponents/DrawBrushStroke.hpp +++ b/src/DrawComponents/DrawBrushStroke.hpp @@ -36,8 +36,8 @@ class DrawBrushStroke : public DrawComponent { std::shared_ptr d = std::make_shared(); // It's a pointer here since brush strokes cant be edited #ifndef IS_SERVER - virtual std::shared_ptr copy() const override; - virtual std::shared_ptr deep_copy() const override; + virtual std::shared_ptr copy(DrawingProgram& drawP) const override; + virtual std::shared_ptr deep_copy(DrawingProgram& drawP) const override; virtual void draw(SkCanvas* canvas, const DrawData& drawData) override; virtual void initialize_draw_data(DrawingProgram& drawP) override; diff --git a/src/DrawComponents/DrawComponent.hpp b/src/DrawComponents/DrawComponent.hpp index 1c8cf87..34bf034 100644 --- a/src/DrawComponents/DrawComponent.hpp +++ b/src/DrawComponents/DrawComponent.hpp @@ -100,8 +100,8 @@ class DrawComponent { void calculate_world_bounds(); virtual SCollision::AABB get_obj_coord_bounds() const = 0; - virtual std::shared_ptr copy() const = 0; - virtual std::shared_ptr deep_copy() const = 0; + virtual std::shared_ptr copy(DrawingProgram& drawP) const = 0; + virtual std::shared_ptr deep_copy(DrawingProgram& drawP) const = 0; virtual void draw(SkCanvas* canvas, const DrawData& drawData) = 0; void commit_update(DrawingProgram& drawP, bool invalidateCache = true); // invalidateCache = false version should be thread safe diff --git a/src/DrawComponents/DrawEllipse.cpp b/src/DrawComponents/DrawEllipse.cpp index 0a9c833..00709a0 100644 --- a/src/DrawComponents/DrawEllipse.cpp +++ b/src/DrawComponents/DrawEllipse.cpp @@ -27,14 +27,14 @@ void DrawEllipse::load_file(cereal::PortableBinaryInputArchive& a, VersionNumber } #ifndef IS_SERVER -std::shared_ptr DrawEllipse::copy() const { +std::shared_ptr DrawEllipse::copy(DrawingProgram& drawP) const { auto a = std::make_shared(); a->d = d; a->coords = coords; return a; } -std::shared_ptr DrawEllipse::deep_copy() const { +std::shared_ptr DrawEllipse::deep_copy(DrawingProgram& drawP) const { auto a = std::make_shared(); a->d = d; a->coords = coords; diff --git a/src/DrawComponents/DrawEllipse.hpp b/src/DrawComponents/DrawEllipse.hpp index aff09c6..b06dde4 100644 --- a/src/DrawComponents/DrawEllipse.hpp +++ b/src/DrawComponents/DrawEllipse.hpp @@ -27,8 +27,8 @@ class DrawEllipse : public DrawComponent { } d; #ifndef IS_SERVER - virtual std::shared_ptr copy() const override; - virtual std::shared_ptr deep_copy() const override; + virtual std::shared_ptr copy(DrawingProgram& drawP) const override; + virtual std::shared_ptr deep_copy(DrawingProgram& drawP) const override; virtual void draw(SkCanvas* canvas, const DrawData& drawData) override; virtual void initialize_draw_data(DrawingProgram& drawP) override; diff --git a/src/DrawComponents/DrawImage.cpp b/src/DrawComponents/DrawImage.cpp index a83f529..fd38f79 100644 --- a/src/DrawComponents/DrawImage.cpp +++ b/src/DrawComponents/DrawImage.cpp @@ -43,14 +43,14 @@ void DrawImage::remap_resource_ids(std::unordered_map DrawImage::copy() const { +std::shared_ptr DrawImage::copy(DrawingProgram& drawP) const { auto a = std::make_shared(); a->d = d; a->coords = coords; return a; } -std::shared_ptr DrawImage::deep_copy() const { +std::shared_ptr DrawImage::deep_copy(DrawingProgram& drawP) const { auto a = std::make_shared(); a->d = d; a->coords = coords; diff --git a/src/DrawComponents/DrawImage.hpp b/src/DrawComponents/DrawImage.hpp index 0265409..8429845 100644 --- a/src/DrawComponents/DrawImage.hpp +++ b/src/DrawComponents/DrawImage.hpp @@ -28,8 +28,8 @@ class DrawImage : public DrawComponent { } d; #ifndef IS_SERVER - virtual std::shared_ptr copy() const override; - virtual std::shared_ptr deep_copy() const override; + virtual std::shared_ptr copy(DrawingProgram& drawP) const override; + virtual std::shared_ptr deep_copy(DrawingProgram& drawP) const override; virtual void draw(SkCanvas* canvas, const DrawData& drawData) override; virtual void initialize_draw_data(DrawingProgram& drawP) override; diff --git a/src/DrawComponents/DrawRectangle.cpp b/src/DrawComponents/DrawRectangle.cpp index cde63e0..bde543e 100644 --- a/src/DrawComponents/DrawRectangle.cpp +++ b/src/DrawComponents/DrawRectangle.cpp @@ -30,14 +30,14 @@ void DrawRectangle::load_file(cereal::PortableBinaryInputArchive& a, VersionNumb } #ifndef IS_SERVER -std::shared_ptr DrawRectangle::copy() const { +std::shared_ptr DrawRectangle::copy(DrawingProgram& drawP) const { auto a = std::make_shared(); a->d = d; a->coords = coords; return a; } -std::shared_ptr DrawRectangle::deep_copy() const { +std::shared_ptr DrawRectangle::deep_copy(DrawingProgram& drawP) const { auto a = std::make_shared(); a->d = d; a->coords = coords; diff --git a/src/DrawComponents/DrawRectangle.hpp b/src/DrawComponents/DrawRectangle.hpp index 9f4bbbc..32d5aff 100644 --- a/src/DrawComponents/DrawRectangle.hpp +++ b/src/DrawComponents/DrawRectangle.hpp @@ -28,8 +28,8 @@ class DrawRectangle : public DrawComponent { } d; #ifndef IS_SERVER - virtual std::shared_ptr copy() const override; - virtual std::shared_ptr deep_copy() const override; + virtual std::shared_ptr copy(DrawingProgram& drawP) const override; + virtual std::shared_ptr deep_copy(DrawingProgram& drawP) const override; virtual void draw(SkCanvas* canvas, const DrawData& drawData) override; virtual void initialize_draw_data(DrawingProgram& drawP) override; diff --git a/src/DrawComponents/DrawTextBox.cpp b/src/DrawComponents/DrawTextBox.cpp index 5443501..8f99d8b 100644 --- a/src/DrawComponents/DrawTextBox.cpp +++ b/src/DrawComponents/DrawTextBox.cpp @@ -61,20 +61,22 @@ void DrawTextBox::load_file(cereal::PortableBinaryInputArchive& a, VersionNumber } #ifndef IS_SERVER -std::shared_ptr DrawTextBox::copy() const { +std::shared_ptr DrawTextBox::copy(DrawingProgram& drawP) const { auto a = std::make_shared(); a->d = d; a->coords = coords; a->textBox->set_rich_text_data(textBox->get_rich_text_data()); + a->init_text_box(drawP); return a; } -std::shared_ptr DrawTextBox::deep_copy() const { +std::shared_ptr DrawTextBox::deep_copy(DrawingProgram& drawP) const { auto a = std::make_shared(); a->d = d; a->coords = coords; a->textBox->set_rich_text_data(textBox->get_rich_text_data()); a->collisionTree = collisionTree; + a->init_text_box(drawP); return a; } diff --git a/src/DrawComponents/DrawTextBox.hpp b/src/DrawComponents/DrawTextBox.hpp index 17454d0..7cd7f68 100644 --- a/src/DrawComponents/DrawTextBox.hpp +++ b/src/DrawComponents/DrawTextBox.hpp @@ -29,8 +29,8 @@ class DrawTextBox : public DrawComponent { } d; #ifndef IS_SERVER - virtual std::shared_ptr copy() const override; - virtual std::shared_ptr deep_copy() const override; + virtual std::shared_ptr copy(DrawingProgram& drawP) const override; + virtual std::shared_ptr deep_copy(DrawingProgram& drawP) const override; virtual void draw(SkCanvas* canvas, const DrawData& drawData) override; virtual void initialize_draw_data(DrawingProgram& drawP) override; diff --git a/src/DrawingProgram/DrawingProgramSelection.cpp b/src/DrawingProgram/DrawingProgramSelection.cpp index ae6c4e06..a468161 100644 --- a/src/DrawingProgram/DrawingProgramSelection.cpp +++ b/src/DrawingProgram/DrawingProgramSelection.cpp @@ -271,7 +271,7 @@ void DrawingProgramSelection::selection_to_clipboard() { }); clipboard.components.clear(); for(auto& c : compVecSort) - clipboard.components.emplace_back(c->obj->deep_copy()); + clipboard.components.emplace_back(c->obj->deep_copy(drawP)); clipboard.pos = initialSelectionAABB.center(); clipboard.inverseScale = drawP.world.drawData.cam.c.inverseScale; drawP.world.rMan.copy_resource_set_to_map(resourceSet, clipboard.resources); @@ -417,7 +417,7 @@ void DrawingProgramSelection::paste_clipboard() { for(auto& r : clipboard.resources) resourceRemapIDs[r.first] = drawP.world.rMan.add_resource(r.second); for(auto& c : clipboard.components) - placedComponents.emplace_back(c->deep_copy()); + placedComponents.emplace_back(c->deep_copy(drawP)); drawP.addToCompCacheOnInsert = false; auto compListInserted = drawP.components.client_insert_ordered_vector_items(allPlacement, placedComponents); parallel_loop_container(compListInserted, [&](auto& c) { diff --git a/src/Server/MainServer.cpp b/src/Server/MainServer.cpp index 37bf269..9e21555 100644 --- a/src/Server/MainServer.cpp +++ b/src/Server/MainServer.cpp @@ -26,7 +26,7 @@ MainServer::MainServer(World& initWorld, const std::string& serverLocalID): world(initWorld) { for(auto& c : world.drawProg.components.client_list()) { - data.components.emplace_back(c->obj->copy()); + data.components.emplace_back(c->obj->copy(world.drawProg)); data.components.back()->id = c->obj->id; data.idToComponentMap.emplace(data.components.back()->id, data.components.back()); }