From db6dffb4ee99ebb1760b7c739e741d803b5a73a9 Mon Sep 17 00:00:00 2001 From: Yousef Khadadeh Date: Fri, 17 Apr 2026 19:32:49 +0300 Subject: [PATCH] Added draw function to screens --- src/DrawingProgram/Tools/ScreenshotTool.cpp | 4 ++-- src/MainProgram.cpp | 11 ++++++++--- src/MainProgram.hpp | 3 ++- src/Screens/DrawingProgramScreen.cpp | 4 ++++ src/Screens/DrawingProgramScreen.hpp | 1 + src/Screens/FileSelectScreen.cpp | 19 +++++++++++++++++++ src/Screens/FileSelectScreen.hpp | 8 +++++--- src/Screens/Screen.cpp | 2 +- src/Screens/Screen.hpp | 1 + src/main.cpp | 6 +++--- 10 files changed, 46 insertions(+), 13 deletions(-) diff --git a/src/DrawingProgram/Tools/ScreenshotTool.cpp b/src/DrawingProgram/Tools/ScreenshotTool.cpp index 950c007..0591846 100644 --- a/src/DrawingProgram/Tools/ScreenshotTool.cpp +++ b/src/DrawingProgram/Tools/ScreenshotTool.cpp @@ -424,7 +424,7 @@ void ScreenshotTool::take_screenshot_svg(SkCanvas* canvas, bool transparentBackg screenshotDrawData.drawGrids = false; screenshotDrawData.isSVGRender = true; screenshotDrawData.refresh_draw_optimizing_values(); - drawP.world.main.draw(canvas, drawP.world.main.world, screenshotDrawData); + drawP.world.main.draw_world(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) { @@ -455,7 +455,7 @@ void ScreenshotTool::take_screenshot_area_hw(const sk_sp& surface, Sk screenshotDrawData.transparentBackground = transparentBackground; screenshotDrawData.drawGrids = controls.displayGrid; screenshotDrawData.refresh_draw_optimizing_values(); - drawP.world.main.draw(canvas, drawP.world.main.world, screenshotDrawData); + drawP.world.main.draw_world(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(); diff --git a/src/MainProgram.cpp b/src/MainProgram.cpp index 88eb2f7..26754cf 100755 --- a/src/MainProgram.cpp +++ b/src/MainProgram.cpp @@ -1,5 +1,6 @@ #include "MainProgram.hpp" #include "CustomEvents.hpp" +#include "Screens/FileSelectScreen.hpp" #include "VersionConstants.hpp" #include #include @@ -20,6 +21,7 @@ #include #include #include "Screens/DrawingProgramScreen.hpp" +#include "Screens/FileSelectScreen.hpp" #include #ifdef USE_SKIA_BACKEND_GRAPHITE @@ -216,13 +218,16 @@ void MainProgram::refresh_draw_surfaces() { } } -void MainProgram::draw(SkCanvas* canvas, std::shared_ptr worldToDraw, const DrawData& drawData) { +void MainProgram::draw_world(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()); DrawData drawDataCopy = drawData; drawDataCopy.skiaAA = conf.antialiasing == GlobalConfig::AntiAliasing::SKIA; worldToDraw->draw(canvas, drawDataCopy); - if(!drawData.takingScreenshot) - g.draw(canvas, drawDataCopy.skiaAA); +} + +void MainProgram::draw(SkCanvas* canvas) { + screen->draw(canvas); + g.draw(canvas, conf.antialiasing == GlobalConfig::AntiAliasing::SKIA); } sk_sp MainProgram::create_native_surface(Vector2i resolution, bool isMSAA) { diff --git a/src/MainProgram.hpp b/src/MainProgram.hpp index e0b01c3..f107692 100644 --- a/src/MainProgram.hpp +++ b/src/MainProgram.hpp @@ -92,7 +92,8 @@ class MainProgram { MainProgram(); void update(); - void draw(SkCanvas* canvas, std::shared_ptr worldToDraw, const DrawData& drawData); + void draw_world(SkCanvas* canvas, std::shared_ptr worldToDraw, const DrawData& drawData); + void draw(SkCanvas* canvas); sk_sp create_native_surface(Vector2i resolution, bool isMSAA); bool setToQuit = false; diff --git a/src/Screens/DrawingProgramScreen.cpp b/src/Screens/DrawingProgramScreen.cpp index b33517a..4bafa0e 100644 --- a/src/Screens/DrawingProgramScreen.cpp +++ b/src/Screens/DrawingProgramScreen.cpp @@ -11,6 +11,10 @@ void DrawingProgramScreen::update() { main.world->focus_update(); } +void DrawingProgramScreen::draw(SkCanvas* canvas) { + main.draw_world(canvas, main.world, main.world->drawData); +} + void DrawingProgramScreen::gui_layout_run() { toolbar.layout_run(); } diff --git a/src/Screens/DrawingProgramScreen.hpp b/src/Screens/DrawingProgramScreen.hpp index 62dd144..9973c25 100644 --- a/src/Screens/DrawingProgramScreen.hpp +++ b/src/Screens/DrawingProgramScreen.hpp @@ -6,6 +6,7 @@ class DrawingProgramScreen : public Screen { public: DrawingProgramScreen(MainProgram& m); virtual void update() override; + virtual void draw(SkCanvas* canvas) override; virtual void gui_layout_run() override; virtual bool app_close_requested() override; virtual void input_add_file_to_canvas_callback(const CustomEvents::AddFileToCanvasEvent& addFile) override; diff --git a/src/Screens/FileSelectScreen.cpp b/src/Screens/FileSelectScreen.cpp index 0454f53..30f037b 100644 --- a/src/Screens/FileSelectScreen.cpp +++ b/src/Screens/FileSelectScreen.cpp @@ -1 +1,20 @@ #include "FileSelectScreen.hpp" +#include "../MainProgram.hpp" +#include "../GUIHolder.hpp" +#include "../GUIStuff/ElementHelpers/TextLabelHelpers.hpp" + +FileSelectScreen::FileSelectScreen(MainProgram& m): Screen(m) {} + +void FileSelectScreen::gui_layout_run() { + using namespace GUIStuff; + using namespace ElementHelpers; + CLAY_AUTO_ID({ + .layout = {} + }) { + text_label(main.g.gui, "File select screen"); + } +} + +void FileSelectScreen::draw(SkCanvas* canvas) { + canvas->clear(SkColor4f{0.0f, 0.0f, 0.0f, 0.0f}); +} diff --git a/src/Screens/FileSelectScreen.hpp b/src/Screens/FileSelectScreen.hpp index e99cc2f..9c6e4a7 100644 --- a/src/Screens/FileSelectScreen.hpp +++ b/src/Screens/FileSelectScreen.hpp @@ -1,7 +1,9 @@ #pragma once +#include "Screen.hpp" -class FileSelectScreen { +class FileSelectScreen : public Screen { public: - FileSelectScreen(); - private: + FileSelectScreen(MainProgram& m); + virtual void gui_layout_run() override; + virtual void draw(SkCanvas* canvas) override; }; diff --git a/src/Screens/Screen.cpp b/src/Screens/Screen.cpp index 5cf49e5..89a9056 100644 --- a/src/Screens/Screen.cpp +++ b/src/Screens/Screen.cpp @@ -6,7 +6,7 @@ Screen::Screen(MainProgram& m): void Screen::update() {} void Screen::gui_layout_run() {} -bool Screen::app_close_requested() { return false; } +bool Screen::app_close_requested() { return true; } void Screen::input_add_file_to_canvas_callback(const CustomEvents::AddFileToCanvasEvent& addFile) {} void Screen::input_open_infinipaint_file_callback(const CustomEvents::OpenInfiniPaintFileEvent& openFile) {} void Screen::input_paste_callback(const CustomEvents::PasteEvent& paste) {} diff --git a/src/Screens/Screen.hpp b/src/Screens/Screen.hpp index 7923316..dc3fd02 100644 --- a/src/Screens/Screen.hpp +++ b/src/Screens/Screen.hpp @@ -5,6 +5,7 @@ class Screen { public: Screen(MainProgram& m); virtual void update(); + virtual void draw(SkCanvas* canvas) = 0; virtual void gui_layout_run(); virtual bool app_close_requested(); diff --git a/src/main.cpp b/src/main.cpp index 841c264..e4d3065 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -553,7 +553,7 @@ void regular_draw(MainStruct& mS) { if(mS.m->window.intermediateSurfaceMSAA) { SkCanvas* intermediateCanvas = mS.m->window.intermediateSurfaceMSAA->getCanvas(); intermediateCanvas->save(); - mS.m->draw(intermediateCanvas, mS.m->world, mS.m->world->drawData); + mS.m->draw(intermediateCanvas); intermediateCanvas->restore(); #ifdef USE_BACKEND_VULKAN @@ -568,11 +568,11 @@ void regular_draw(MainStruct& mS) { } else { #ifdef USE_BACKEND_VULKAN - mS.m->draw(mS.vulkanWindowContext->getBackbufferSurface()->getCanvas(), mS.m->world, mS.m->world->drawData); + mS.m->draw(mS.vulkanWindowContext->getBackbufferSurface()->getCanvas()); mS.ctx->flushAndSubmit(); mS.vulkanWindowContext->swapBuffers(); #elif USE_BACKEND_OPENGL - mS.m->draw(mS.canvas, mS.m->world, mS.m->world->drawData); + mS.m->draw(mS.canvas); mS.ctx->flushAndSubmit(); SDL_GL_SwapWindow(mS.window); #endif