diff --git a/src/CanvasComponents/BrushStrokeCanvasComponent.cpp b/src/CanvasComponents/BrushStrokeCanvasComponent.cpp index d800ca7..6a824a0 100644 --- a/src/CanvasComponents/BrushStrokeCanvasComponent.cpp +++ b/src/CanvasComponents/BrushStrokeCanvasComponent.cpp @@ -56,7 +56,7 @@ void BrushStrokeCanvasComponent::draw(SkCanvas* canvas, const DrawData& drawData unsigned mipmapLevel = compContainer ? compContainer->get_mipmap_level(drawData) : 0; - if(mipmapLevel == 0 || drawData.dontUseDrawProgCache) // check dontUseDrawProgCache, to make sure that SVG screenshots dont use LOD + if(mipmapLevel == 0 || drawData.takingScreenshot) // check takingScreenshot, to make sure that screenshots dont use LOD canvas->drawPath(*brushPath, paint); else canvas->drawPath(*brushPathLOD[mipmapLevel - 1], paint); diff --git a/src/DrawData.hpp b/src/DrawData.hpp index 0242a0b..9e1988d 100644 --- a/src/DrawData.hpp +++ b/src/DrawData.hpp @@ -12,10 +12,11 @@ struct DrawData { DrawCamera cam; ResourceManager* rMan; MainProgram* main; + bool takingScreenshot = false; bool isSVGRender = false; - bool dontUseDrawProgCache = false; bool clampDrawBetween = true; bool drawGrids = true; + bool transparentBackground = false; WorldScalar clampDrawMinimum; WorldScalar mipMapLevelOne; WorldScalar mipMapLevelTwo; diff --git a/src/DrawingProgram/DrawingProgram.cpp b/src/DrawingProgram/DrawingProgram.cpp index ef6d9f0..581504b 100644 --- a/src/DrawingProgram/DrawingProgram.cpp +++ b/src/DrawingProgram/DrawingProgram.cpp @@ -586,7 +586,7 @@ void DrawingProgram::get_used_resources(std::unordered_setsaveLayer(nullptr, nullptr); @@ -597,23 +597,20 @@ void DrawingProgram::draw(SkCanvas* canvas, const DrawData& drawData) { canvas->restore(); canvas->restore(); - if(!drawData.main->takingScreenshot) { - for(auto& droppedDownFile : droppedDownloadingFiles) - static_cast(droppedDownFile.comp->obj->get_comp()).draw_download_progress_bar(canvas, drawData, droppedDownFile.downData->progress); + for(auto& droppedDownFile : droppedDownloadingFiles) + static_cast(droppedDownFile.comp->obj->get_comp()).draw_download_progress_bar(canvas, drawData, droppedDownFile.downData->progress); - for(auto& c : updateableComponents) { - if(c->obj->get_comp().get_type() == CanvasComponentType::IMAGE) { - auto& img = static_cast(c->obj->get_comp()); - float progress = drawData.main->world->rMan.get_resource_retrieval_progress(img.d.imageID); - img.draw_download_progress_bar(canvas, drawData, progress); - } + for(auto& c : updateableComponents) { + if(c->obj->get_comp().get_type() == CanvasComponentType::IMAGE) { + auto& img = static_cast(c->obj->get_comp()); + float progress = drawData.main->world->rMan.get_resource_retrieval_progress(img.d.imageID); + img.draw_download_progress_bar(canvas, drawData, progress); } } selection.draw_gui(canvas, drawData); + drawTool->draw(canvas, drawData); } - - drawTool->draw(canvas, drawData); } Vector4f* DrawingProgram::get_foreground_color_ptr() { diff --git a/src/DrawingProgram/Tools/EyeDropperTool.cpp b/src/DrawingProgram/Tools/EyeDropperTool.cpp index 7ced036..615c48e 100644 --- a/src/DrawingProgram/Tools/EyeDropperTool.cpp +++ b/src/DrawingProgram/Tools/EyeDropperTool.cpp @@ -64,9 +64,9 @@ void EyeDropperTool::tool_update() { int yPos = std::clamp(drawP.world.main.input.mouse.pos.y(), 0, drawP.world.main.window.size.y() - 1); eyeDropperCanvas->save(); - drawP.world.drawData.dontUseDrawProgCache = true; - drawP.world.main.draw(eyeDropperCanvas); - drawP.world.drawData.dontUseDrawProgCache = false; + DrawData d = drawP.world.drawData; + d.takingScreenshot = true; + drawP.world.main.draw(eyeDropperCanvas, drawP.world.main.world, d); eyeDropperCanvas->restore(); //drawP.world.main.window.ctx->flush(); diff --git a/src/DrawingProgram/Tools/ScreenshotTool.cpp b/src/DrawingProgram/Tools/ScreenshotTool.cpp index bd4dc5d..bc886b1 100644 --- a/src/DrawingProgram/Tools/ScreenshotTool.cpp +++ b/src/DrawingProgram/Tools/ScreenshotTool.cpp @@ -240,7 +240,6 @@ void ScreenshotTool::take_screenshot_svg(SkCanvas* canvas, bool transparentBackg Vector2f canvasSize{controls.rectX2 - controls.rectX1, controls.rectY2 - controls.rectY1}; - DrawData d = drawP.world.drawData; WorldVec topLeft = controls.coords.from_space({secRectX1, secRectY1}); WorldVec topRight = controls.coords.from_space({secRectX2, secRectY1}); WorldVec bottomLeft = controls.coords.from_space({secRectX1, secRectY2}); @@ -254,23 +253,15 @@ void ScreenshotTool::take_screenshot_svg(SkCanvas* canvas, bool transparentBackg vectorZoom.y() = distY / WorldScalar(canvasSize.y() * 0.5); WorldScalar newInverseScale = (vectorZoom.x() + vectorZoom.y()) * WorldScalar(0.5); - drawP.world.drawData.cam.set_based_on_properties(drawP.world, topLeft, newInverseScale, controls.coords.rotation); - drawP.world.drawData.cam.set_viewing_area(canvasSize); - drawP.world.drawData.refresh_draw_optimizing_values(); - - bool oldDrawGrids = drawP.world.drawData.drawGrids; - drawP.world.main.takingScreenshot = true; - drawP.world.main.transparentBackground = transparentBackground; - drawP.world.drawData.drawGrids = false; - drawP.world.drawData.dontUseDrawProgCache = true; - drawP.world.drawData.isSVGRender = true; - - drawP.world.main.draw(canvas); - drawP.world.drawData.isSVGRender = false; - drawP.world.main.takingScreenshot = false; - drawP.world.main.transparentBackground = false; - drawP.world.drawData.drawGrids = oldDrawGrids; - drawP.world.drawData = d; + DrawData screenshotDrawData = drawP.world.drawData; + screenshotDrawData.cam.set_based_on_properties(drawP.world, topLeft, newInverseScale, controls.coords.rotation); + screenshotDrawData.cam.set_viewing_area(canvasSize); + screenshotDrawData.takingScreenshot = true; + screenshotDrawData.transparentBackground = transparentBackground; + screenshotDrawData.drawGrids = false; + screenshotDrawData.isSVGRender = true; + screenshotDrawData.refresh_draw_optimizing_values(); + drawP.world.main.draw(canvas, drawP.world.main.world, screenshotDrawData); } void ScreenshotTool::take_screenshot_area_hw(const sk_sp& surface, SkCanvas* canvas, void* fullImgRawData, const Vector2i& fullImageSize, const Vector2i& sectionImagePos, const Vector2i& sectionImageSize, const Vector2i& canvasSize, bool transparentBackground) { @@ -281,7 +272,6 @@ void ScreenshotTool::take_screenshot_area_hw(const sk_sp& surface, Sk float secRectY1 = controls.rectY1 + (controls.rectY2 - controls.rectY1) * (sectionImagePos.y() / (double)fullImageSize.y()); float secRectY2 = controls.rectY1 + (controls.rectY2 - controls.rectY1) * ((sectionImagePos.y() + canvasSize.y()) / (double)fullImageSize.y()); - DrawData d = drawP.world.drawData; WorldVec topLeft = controls.coords.from_space({secRectX1, secRectY1}); WorldVec topRight = controls.coords.from_space({secRectX2, secRectY1}); WorldVec bottomLeft = controls.coords.from_space({secRectX1, secRectY2}); @@ -295,21 +285,14 @@ void ScreenshotTool::take_screenshot_area_hw(const sk_sp& surface, Sk vectorZoom.y() = distY / WorldScalar(canvasSize.y() * 0.5); WorldScalar newInverseScale = (vectorZoom.x() + vectorZoom.y()) * WorldScalar(0.5); - drawP.world.drawData.cam.set_based_on_properties(drawP.world, topLeft, newInverseScale, controls.coords.rotation); - drawP.world.drawData.cam.set_viewing_area(sectionImageSize.cast()); - drawP.world.drawData.refresh_draw_optimizing_values(); - - bool oldDrawGrids = drawP.world.drawData.drawGrids; - drawP.world.main.takingScreenshot = true; - drawP.world.main.transparentBackground = transparentBackground; - drawP.world.drawData.drawGrids = controls.displayGrid; - drawP.world.drawData.dontUseDrawProgCache = true; - - drawP.world.main.draw(canvas); - drawP.world.main.takingScreenshot = false; - drawP.world.main.transparentBackground = false; - drawP.world.drawData.drawGrids = oldDrawGrids; - drawP.world.drawData = d; + DrawData screenshotDrawData = drawP.world.drawData; + screenshotDrawData.cam.set_based_on_properties(drawP.world, topLeft, newInverseScale, controls.coords.rotation); + screenshotDrawData.cam.set_viewing_area(sectionImageSize.cast()); + screenshotDrawData.takingScreenshot = true; + screenshotDrawData.transparentBackground = transparentBackground; + screenshotDrawData.drawGrids = controls.displayGrid; + screenshotDrawData.refresh_draw_optimizing_values(); + drawP.world.main.draw(canvas, drawP.world.main.world, screenshotDrawData); 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(); @@ -478,42 +461,40 @@ bool ScreenshotTool::prevent_undo_or_redo() { } void ScreenshotTool::draw(SkCanvas* canvas, const DrawData& drawData) { - if(!drawData.main->takingScreenshot) { - if(controls.selectionMode == 0) { - SkPaint paint1; - paint1.setColor4f({0.0f, 0.0f, 0.0f, 0.3f}); - canvas->drawPaint(paint1); - } - else { - canvas->save(); - controls.coords.transform_sk_canvas(canvas, drawData); - float x1 = std::min(controls.rectX1, controls.rectX2); - float x2 = std::max(controls.rectX1, controls.rectX2); - float y1 = std::min(controls.rectY1, controls.rectY2); - float y2 = std::max(controls.rectY1, controls.rectY2); - SkPoint p1{x1, y1}; - SkPoint p2{x2, y2}; - SkPathBuilder path1B; - path1B.addRect(SkRect::MakeLTRB(p1.x(), p1.y(), p2.x(), p2.y())); - path1B.setFillType(SkPathFillType::kInverseWinding); - SkPath path1 = path1B.detach(); - SkPaint paint1; - paint1.setColor4f({0.0f, 0.0f, 0.0f, 0.3f}); - canvas->drawPath(path1, paint1); + if(controls.selectionMode == 0) { + SkPaint paint1; + paint1.setColor4f({0.0f, 0.0f, 0.0f, 0.3f}); + canvas->drawPaint(paint1); + } + else { + canvas->save(); + controls.coords.transform_sk_canvas(canvas, drawData); + float x1 = std::min(controls.rectX1, controls.rectX2); + float x2 = std::max(controls.rectX1, controls.rectX2); + float y1 = std::min(controls.rectY1, controls.rectY2); + float y2 = std::max(controls.rectY1, controls.rectY2); + SkPoint p1{x1, y1}; + SkPoint p2{x2, y2}; + SkPathBuilder path1B; + path1B.addRect(SkRect::MakeLTRB(p1.x(), p1.y(), p2.x(), p2.y())); + path1B.setFillType(SkPathFillType::kInverseWinding); + SkPath path1 = path1B.detach(); + SkPaint paint1; + paint1.setColor4f({0.0f, 0.0f, 0.0f, 0.3f}); + canvas->drawPath(path1, paint1); - path1.setFillType(SkPathFillType::kWinding); - SkPaint paint2; - paint2.setColor4f({1.0f, 1.0f, 1.0f, 0.9f}); - paint2.setStyle(SkPaint::kStroke_Style); - canvas->drawPath(path1, paint2); + path1.setFillType(SkPathFillType::kWinding); + SkPaint paint2; + paint2.setColor4f({1.0f, 1.0f, 1.0f, 0.9f}); + paint2.setStyle(SkPaint::kStroke_Style); + canvas->drawPath(path1, paint2); - canvas->restore(); + canvas->restore(); - if(controls.selectionMode == 2) { - paint2.setStyle(SkPaint::kFill_Style); - for(auto& circ : controls.circles) - drawP.draw_drag_circle(canvas, circ.pos, {0.1f, 0.9f, 0.9f, 1.0f}, drawData, 1.0f); - } + if(controls.selectionMode == 2) { + paint2.setStyle(SkPaint::kFill_Style); + for(auto& circ : controls.circles) + drawP.draw_drag_circle(canvas, circ.pos, {0.1f, 0.9f, 0.9f, 1.0f}, drawData, 1.0f); } } } diff --git a/src/MainProgram.cpp b/src/MainProgram.cpp index c514b5c..5e1d7ca 100755 --- a/src/MainProgram.cpp +++ b/src/MainProgram.cpp @@ -285,10 +285,11 @@ float MainProgram::get_scale_and_density_factor_gui() { return window.scale * window.density; } -void MainProgram::draw(SkCanvas* canvas) { - canvas->clear(transparentBackground ? SkColor4f{0.0f, 0.0f, 0.0f, 0.0f} : world->canvasTheme.get_back_color()); - world->draw(canvas); - toolbar.draw(canvas); +void MainProgram::draw(SkCanvas* canvas, std::shared_ptr worldToDraw, const DrawData& drawData) { + canvas->clear(drawData.transparentBackground ? SkColor4f{0.0f, 0.0f, 0.0f, 0.0f} : worldToDraw->canvasTheme.get_back_color()); + worldToDraw->draw(canvas, drawData); + if(!drawData.takingScreenshot) + toolbar.draw(canvas); } sk_sp MainProgram::create_native_surface(Vector2i resolution, bool isMSAA) { diff --git a/src/MainProgram.hpp b/src/MainProgram.hpp index 797b279..45a2817 100644 --- a/src/MainProgram.hpp +++ b/src/MainProgram.hpp @@ -85,7 +85,7 @@ class MainProgram { MainProgram(); void update(); - void draw(SkCanvas* canvas); + void draw(SkCanvas* canvas, std::shared_ptr worldToDraw, const DrawData& drawData); sk_sp create_native_surface(Vector2i resolution, bool isMSAA); bool setToQuit = false; @@ -112,8 +112,6 @@ class MainProgram { std::filesystem::path documentsPath; bool drawGui = true; - bool takingScreenshot = false; - bool transparentBackground = false; Vector3f defaultCanvasBackgroundColor = DEFAULT_CANVAS_BACKGROUND_COLOR; diff --git a/src/ResourceDisplay/ImageResourceDisplay.cpp b/src/ResourceDisplay/ImageResourceDisplay.cpp index 939d528..1a3ae92 100644 --- a/src/ResourceDisplay/ImageResourceDisplay.cpp +++ b/src/ResourceDisplay/ImageResourceDisplay.cpp @@ -204,7 +204,7 @@ void ImageResourceDisplay::draw(SkCanvas* canvas, const DrawData& drawData, cons unsigned mipmapLevel = get_exact_mipmap_level_for_dimensions({imRectPixelSize.width(), imRectPixelSize.height()}); auto& frame = frames[frameIndex]; unsigned closestMipmapLevel = get_best_allocated_mipmap_level(mipmapLevel); - if(drawData.main->takingScreenshot) { + if(drawData.takingScreenshot) { if(closestMipmapLevel == mipmapLevel) { if(closestMipmapLevel == get_smallest_mipmap_level()) canvas->drawImageRect(frame.smallestMipmapLevel, imRect, {SkFilterMode::kLinear, SkMipmapMode::kLinear}); diff --git a/src/Toolbar.cpp b/src/Toolbar.cpp index 8dcc884..36cb0e5 100644 --- a/src/Toolbar.cpp +++ b/src/Toolbar.cpp @@ -2298,10 +2298,8 @@ void Toolbar::end_gui() { } void Toolbar::draw(SkCanvas* canvas) { - if(!main.takingScreenshot) { - canvas->save(); - canvas->scale(final_gui_scale(), final_gui_scale()); - gui.draw(canvas); - canvas->restore(); - } + canvas->save(); + canvas->scale(final_gui_scale(), final_gui_scale()); + gui.draw(canvas); + canvas->restore(); } diff --git a/src/World.cpp b/src/World.cpp index 06f6991..476bd2a 100644 --- a/src/World.cpp +++ b/src/World.cpp @@ -544,17 +544,16 @@ void World::list_debug_test_update() { } #endif -void World::draw(SkCanvas* canvas) { - drawData.refresh_draw_optimizing_values(); +void World::draw(SkCanvas* canvas, const DrawData& calledDrawData) { if(!clientStillConnecting) { - if(drawData.drawGrids) - gridMan.draw_back(canvas, drawData); - drawProg.draw(canvas, drawData); - if(drawData.drawGrids) { - gridMan.draw_front(canvas, drawData); - gridMan.draw_coordinates(canvas, drawData); + if(calledDrawData.drawGrids) + gridMan.draw_back(canvas, calledDrawData); + drawProg.draw(canvas, calledDrawData); + if(calledDrawData.drawGrids) { + gridMan.draw_front(canvas, calledDrawData); + gridMan.draw_coordinates(canvas, calledDrawData); } - if(!main.takingScreenshot) - draw_other_player_cursors(canvas, drawData); + if(!drawData.takingScreenshot) + draw_other_player_cursors(canvas, calledDrawData); } } diff --git a/src/World.hpp b/src/World.hpp index d00a84d..c59c267 100644 --- a/src/World.hpp +++ b/src/World.hpp @@ -68,7 +68,7 @@ class World { void unfocus_update(); void on_switch_out(); - void draw(SkCanvas* canvas); + void draw(SkCanvas* canvas, const DrawData& calledDrawData); void early_destroy(); bool clientStillConnecting = false; diff --git a/src/WorldGrid.cpp b/src/WorldGrid.cpp index ef00021..ef5c436 100644 --- a/src/WorldGrid.cpp +++ b/src/WorldGrid.cpp @@ -336,7 +336,7 @@ void WorldGrid::draw(GridManager& gMan, SkCanvas* canvas, const DrawData& drawDa canvas->rotate(-drawData.cam.c.rotation * 180.0 / std::numbers::pi); canvas->drawPaint(linePaint); canvas->restore(); - if(showCoordinates && drawData.cam.c.rotation == 0.0 && !drawData.main->takingScreenshot) { + if(showCoordinates && drawData.cam.c.rotation == 0.0 && !drawData.takingScreenshot) { coordinatesWillBeDrawn = true; WorldVec worldWindowEndPos = drawData.cam.c.pos + drawData.cam.c.dir_from_space(drawData.cam.viewingArea); coordinatesAxisOnBounds = bounds.has_value() && !bounds.value().fully_contains_aabb(SCollision::AABB(drawData.cam.c.pos, worldWindowEndPos)); diff --git a/src/main.cpp b/src/main.cpp index ccd5148..ff640b2 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -589,7 +589,7 @@ SDL_AppResult SDL_AppIterate(void *appstate) { mS.m->input.text.lastAcceptingTextInputVal = mS.m->input.text.get_accepting_input(); mS.intermediateCanvas->save(); - mS.m->draw(mS.intermediateCanvas); + mS.m->draw(mS.intermediateCanvas, mS.m->world, mS.m->world->drawData); mS.intermediateCanvas->restore(); #ifdef USE_BACKEND_VULKAN