From 91603e1fc18e3291e36e396e98c23719b9fa134e Mon Sep 17 00:00:00 2001 From: Yousef Khadadeh Date: Thu, 7 Aug 2025 12:44:31 +0300 Subject: [PATCH] Can now display SVGs, also fixed bad function call bug when taking screenshot --- CMakeLists.txt | 1 + src/DrawCamera.cpp | 22 ----------- src/DrawCamera.hpp | 2 - src/DrawingProgram/DrawingProgramCache.cpp | 1 - src/DrawingProgram/ScreenshotTool.cpp | 2 - src/ResourceDisplay/SvgResourceDisplay.cpp | 43 ++++++++++++++++++++++ src/ResourceDisplay/SvgResourceDisplay.hpp | 19 ++++++++++ src/ResourceManager.cpp | 7 ++++ src/Toolbar.cpp | 1 - 9 files changed, 70 insertions(+), 28 deletions(-) create mode 100644 src/ResourceDisplay/SvgResourceDisplay.cpp create mode 100644 src/ResourceDisplay/SvgResourceDisplay.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index be92abd..9f8489a 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,6 +40,7 @@ set(sources "src/main.cpp" "src/FileHelpers.cpp" "src/BookmarkManager.cpp" "src/ResourceDisplay/ResourceDisplay.cpp" + "src/ResourceDisplay/SvgResourceDisplay.cpp" "src/ResourceDisplay/ImageResourceDisplay.cpp" "src/ResourceDisplay/FileResourceDisplay.cpp" "src/Server/MainServer.cpp" diff --git a/src/DrawCamera.cpp b/src/DrawCamera.cpp index 5df5882..232374c 100755 --- a/src/DrawCamera.cpp +++ b/src/DrawCamera.cpp @@ -15,9 +15,6 @@ void DrawCamera::set_based_on_properties(World& w, const WorldVec& newPos, const c.pos = newPos; c.set_rotation(newRotate); - if(changed) - changed(); - set_viewing_area(w.main.window.size.cast()); } @@ -26,17 +23,12 @@ void DrawCamera::set_based_on_center(World& w, const WorldVec& newPos, const Wor c.set_rotation(newRotate); c.pos = newPos - c.dir_from_space(w.main.window.size.cast() * 0.5f); - if(changed) - changed(); - set_viewing_area(w.main.window.size.cast()); } void DrawCamera::set_viewing_area(Vector2f viewingAreaNew) { if(viewingArea != viewingAreaNew) { viewingArea = viewingAreaNew; - if(changed) - changed(); } float maxDim = std::max(viewingAreaNew.x(), viewingAreaNew.y()); WorldScalar a = WorldScalar(maxDim * 0.708f) * c.inverseScale; @@ -109,8 +101,6 @@ void DrawCamera::update_main(World& w) { smoothMove.occurring = false; } - if(changed) - changed(); } else { bool middleClickDown = w.main.input.mouse.middleDown || w.main.input.pen.buttons[w.main.toolbar.tabletOptions.middleClickButton].held; @@ -119,8 +109,6 @@ void DrawCamera::update_main(World& w) { startZoomMousePos = w.get_mouse_world_pos(); startZoomVal = c.inverseScale; startZoomCameraPos = c.pos; - if(changed) - changed(); } isMiddleClickZooming = newIsMiddleClickZooming; if(isMiddleClickZooming) { @@ -133,13 +121,9 @@ void DrawCamera::update_main(World& w) { WorldScalar mX = c.inverseScale / startZoomVal; c.pos = startZoomMousePos + mVec * mX; } - if(changed) - changed(); } else if(middleClickDown) { c.pos -= c.dir_from_space(w.main.input.mouse.move); - if(changed) - changed(); } if(w.main.input.mouse.scrollAmount.y() && !w.main.toolbar.io->hoverObstructed) { // Ignore the value of scrollAmount, since that leads to problems on macOS @@ -155,18 +139,12 @@ void DrawCamera::update_main(World& w) { WorldVec mVec = c.pos - w.get_mouse_world_pos(); c.pos = w.get_mouse_world_pos() + mVec / zoomFactor; } - if(changed) - changed(); } if(w.main.input.key(InputManager::KEY_CAMERA_ROTATE_COUNTERCLOCKWISE).held && !w.main.input.text.get_accepting_input()) { c.rotate_about(c.from_space(w.main.window.size.cast() * 0.5f), -w.main.deltaTime); - if(changed) - changed(); } if(w.main.input.key(InputManager::KEY_CAMERA_ROTATE_CLOCKWISE).held && !w.main.input.text.get_accepting_input()) { c.rotate_about(c.from_space(w.main.window.size.cast() * 0.5f), w.main.deltaTime); - if(changed) - changed(); } } diff --git a/src/DrawCamera.hpp b/src/DrawCamera.hpp index 1fb9de7..2848e89 100644 --- a/src/DrawCamera.hpp +++ b/src/DrawCamera.hpp @@ -19,8 +19,6 @@ class DrawCamera { Vector2f viewingArea{-1, -1}; SCollision::AABB viewingAreaGenerousCollider; - std::function changed; - void set_viewing_area(Vector2f viewingAreaNew); void smooth_move_to(World& w, const CoordSpaceHelper& c, Vector2f windowSize, bool instantJump = false); void set_based_on_properties(World& w, const WorldVec& newPos, const WorldScalar& newZoom, double newRotate); diff --git a/src/DrawingProgram/DrawingProgramCache.cpp b/src/DrawingProgram/DrawingProgramCache.cpp index 82f0740..55e3bc8 100644 --- a/src/DrawingProgram/DrawingProgramCache.cpp +++ b/src/DrawingProgram/DrawingProgramCache.cpp @@ -327,7 +327,6 @@ void DrawingProgramCache::refresh_draw_cache(const std::shared_ptrcoords; - cacheDrawData.cam.changed = nullptr; cacheDrawData.cam.set_viewing_area(bvhNode->resolution.cast()); cacheDrawData.refresh_draw_optimizing_values(); diff --git a/src/DrawingProgram/ScreenshotTool.cpp b/src/DrawingProgram/ScreenshotTool.cpp index a832c13..9646db8 100644 --- a/src/DrawingProgram/ScreenshotTool.cpp +++ b/src/DrawingProgram/ScreenshotTool.cpp @@ -78,7 +78,6 @@ void ScreenshotTool::gui_toolbox() { setExtensionFilter = {"WebP", "webp"}; t.open_file_selector("Export", {setExtensionFilter}, [setExtensionFilter, w = make_weak_ptr(drawP.world.main.world)](const std::filesystem::path& p, const auto& e) { auto world = w.lock(); - // NOTE: CHANGE THIS if(world && world->drawProg.drawTool->get_type() == DrawingProgramToolType::SCREENSHOT) { ScreenshotTool* screenshotTool = static_cast(world->drawProg.drawTool.get()); screenshotTool->controls.screenshotSavePath = force_extension_on_path(p, setExtensionFilter.extensions); @@ -202,7 +201,6 @@ void ScreenshotTool::take_screenshot_area_hw(const sk_sp& surface, Sk drawP.world.main.transparentBackground = false; drawP.world.main.grid.gridType = oldGridType; drawP.world.drawData = d; - drawP.world.drawData.cam.changed(); SkImageInfo aaImgInfo = SkImageInfo::Make(sectionImageSize.x(), sectionImageSize.y(), kRGBA_8888_SkColorType, kPremul_SkAlphaType); void* fullImgRawDataStartPt = (uint8_t*)fullImgRawData + 4 * (size_t)sectionImagePos.x() + 4 * (size_t)fullImageSize.x() * (size_t)sectionImagePos.y(); diff --git a/src/ResourceDisplay/SvgResourceDisplay.cpp b/src/ResourceDisplay/SvgResourceDisplay.cpp new file mode 100644 index 0000000..2c1065b --- /dev/null +++ b/src/ResourceDisplay/SvgResourceDisplay.cpp @@ -0,0 +1,43 @@ +#include "SvgResourceDisplay.hpp" +#include "../MainProgram.hpp" +#include +#include +#include + +bool SvgResourceDisplay::update_draw() const { + return mustUpdateDraw; +} + +void SvgResourceDisplay::update(World& w) { + mustUpdateDraw = false; +} + +bool SvgResourceDisplay::load(const std::string& fileName, const std::string& fileData) { + SkMemoryStream strm(fileData.c_str(), fileData.size()); + svgDom = SkSVGDOM::Builder().make(strm); + + mustUpdateDraw = true; + + if(!svgDom) + return false; + + svgRootSize = svgDom->containerSize(); + + return true; +} + +void SvgResourceDisplay::draw(SkCanvas* canvas, const DrawData& drawData, const SkRect& imRect) { + canvas->save(); + canvas->translate(imRect.x(), imRect.y()); + canvas->scale(imRect.width() / svgRootSize.width(), imRect.height() / svgRootSize.height()); + svgDom->render(canvas); + canvas->restore(); +} + +Vector2f SvgResourceDisplay::get_dimensions() const { + return {svgRootSize.width(), svgRootSize.height()}; +} + +float SvgResourceDisplay::get_dimension_scale() const { + return 0.3f; +} diff --git a/src/ResourceDisplay/SvgResourceDisplay.hpp b/src/ResourceDisplay/SvgResourceDisplay.hpp new file mode 100644 index 0000000..1e7acaf --- /dev/null +++ b/src/ResourceDisplay/SvgResourceDisplay.hpp @@ -0,0 +1,19 @@ +#pragma once +#include "ResourceDisplay.hpp" +#include +#include +#include + +class SvgResourceDisplay : public ResourceDisplay { + public: + virtual void update(World& w) override; + virtual bool load(const std::string& fileName, const std::string& fileData) override; + virtual bool update_draw() const override; + virtual void draw(SkCanvas* canvas, const DrawData& drawData, const SkRect& imRect) override; + virtual Vector2f get_dimensions() const override; + virtual float get_dimension_scale() const override; + private: + sk_sp svgDom; + bool mustUpdateDraw = false; + SkSize svgRootSize; +}; diff --git a/src/ResourceManager.cpp b/src/ResourceManager.cpp index 0fda459..9be611a 100644 --- a/src/ResourceManager.cpp +++ b/src/ResourceManager.cpp @@ -1,6 +1,7 @@ #include "ResourceManager.hpp" #include "Helpers/Networking/NetLibrary.hpp" #include +#include "ResourceDisplay/SvgResourceDisplay.hpp" #include "Server/CommandList.hpp" #include "ResourceDisplay/ImageResourceDisplay.hpp" #include "ResourceDisplay/FileResourceDisplay.hpp" @@ -121,6 +122,12 @@ std::shared_ptr ResourceManager::get_display_data(const ServerC return imgResource; } + auto svgResource(std::make_shared()); + if(svgResource->load(resourceIt->second.name, *resourceIt->second.data)) { + displays[fileID] = svgResource; + return svgResource; + } + auto fileResource(std::make_shared()); fileResource->load(resourceIt->second.name, *resourceIt->second.data); displays[fileID] = fileResource; diff --git a/src/Toolbar.cpp b/src/Toolbar.cpp index b622d13..ef13051 100644 --- a/src/Toolbar.cpp +++ b/src/Toolbar.cpp @@ -370,7 +370,6 @@ void Toolbar::paint_popup() { }); if(newRotationAngle != main.world->drawData.cam.c.rotation) { main.world->drawData.cam.c.rotate_about(main.world->drawData.cam.c.from_space(main.window.size.cast() * 0.5f), newRotationAngle - main.world->drawData.cam.c.rotation); - main.world->drawData.cam.changed(); } } }