Added draw function to screens

This commit is contained in:
Yousef Khadadeh 2026-04-17 19:32:49 +03:00
parent 5a0086c4ea
commit db6dffb4ee
10 changed files with 46 additions and 13 deletions

View file

@ -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<SkSurface>& 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<SkSurface>& 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();

View file

@ -1,5 +1,6 @@
#include "MainProgram.hpp"
#include "CustomEvents.hpp"
#include "Screens/FileSelectScreen.hpp"
#include "VersionConstants.hpp"
#include <SDL3/SDL_render.h>
#include <SDL3/SDL_video.h>
@ -20,6 +21,7 @@
#include <Helpers/Serializers.hpp>
#include <nlohmann/json.hpp>
#include "Screens/DrawingProgramScreen.hpp"
#include "Screens/FileSelectScreen.hpp"
#include <include/core/SkSurface.h>
#ifdef USE_SKIA_BACKEND_GRAPHITE
@ -216,13 +218,16 @@ void MainProgram::refresh_draw_surfaces() {
}
}
void MainProgram::draw(SkCanvas* canvas, std::shared_ptr<World> worldToDraw, const DrawData& drawData) {
void MainProgram::draw_world(SkCanvas* canvas, std::shared_ptr<World> 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<SkSurface> MainProgram::create_native_surface(Vector2i resolution, bool isMSAA) {

View file

@ -92,7 +92,8 @@ class MainProgram {
MainProgram();
void update();
void draw(SkCanvas* canvas, std::shared_ptr<World> worldToDraw, const DrawData& drawData);
void draw_world(SkCanvas* canvas, std::shared_ptr<World> worldToDraw, const DrawData& drawData);
void draw(SkCanvas* canvas);
sk_sp<SkSurface> create_native_surface(Vector2i resolution, bool isMSAA);
bool setToQuit = false;

View file

@ -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();
}

View file

@ -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;

View file

@ -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});
}

View file

@ -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;
};

View file

@ -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) {}

View file

@ -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();

View file

@ -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