diff --git a/src/DrawingProgram/DrawingProgramCache.cpp b/src/DrawingProgram/DrawingProgramCache.cpp index f8d1221..5b1b342 100644 --- a/src/DrawingProgram/DrawingProgramCache.cpp +++ b/src/DrawingProgram/DrawingProgramCache.cpp @@ -266,21 +266,8 @@ void DrawingProgramCache::refresh_draw_cache(const std::shared_ptrresolution.x(), bvhNode->resolution.y(), kRGBA_8888_SkColorType, kPremul_SkAlphaType); - #else - SkImageInfo imgInfo = SkImageInfo::MakeN32Premul(bvhNode->resolution.x(), bvhNode->resolution.y()); - #endif - #ifdef USE_SKIA_BACKEND_GRAPHITE - nodeCache.surface = SkSurfaces::RenderTarget(drawP.world.main.window.recorder(), imgInfo, skgpu::Mipmapped::kNo, drawP.world.main.window.defaultMSAASurfaceProps); - #elif USE_SKIA_BACKEND_GANESH - nodeCache.surface = SkSurfaces::RenderTarget(drawP.world.main.window.ctx.get(), skgpu::Budgeted::kNo, imgInfo, drawP.world.main.window.defaultMSAASampleCount, &drawP.world.main.window.defaultMSAASurfaceProps); - #endif - - if(!nodeCache.surface) - throw std::runtime_error("[DrawingProgramCache::refresh_draw_cache] Could not make cache surface"); - } + else + nodeCache.surface = drawP.world.main.create_native_surface(bvhNode->resolution, true); SkCanvas* cacheCanvas = nodeCache.surface->getCanvas(); @@ -339,19 +326,7 @@ void DrawingProgramCache::refresh_draw_cache(const std::shared_ptr()); selectionDrawData.refresh_draw_optimizing_values(); - SkImageInfo imgInfo = canvas->imageInfo(); - sk_sp surface; - #ifdef USE_SKIA_BACKEND_GRAPHITE - surface = SkSurfaces::RenderTarget(drawP.world.main.window.recorder(), imgInfo, skgpu::Mipmapped::kNo, drawP.world.main.window.defaultMSAASurfaceProps); - #elif USE_SKIA_BACKEND_GANESH - surface = SkSurfaces::RenderTarget(drawP.world.main.window.ctx.get(), skgpu::Budgeted::kNo, imgInfo, drawP.world.main.window.defaultMSAASampleCount, &drawP.world.main.window.defaultMSAASurfaceProps); - #endif - if(!surface) - throw std::runtime_error("[DrawingProgramSelection::draw_components] Could not make temporary surface"); - for(auto& c : selectedSet) c->obj->draw(canvas, selectionDrawData); - - SkPaint glowBlurP; - glowBlurP.setImageFilter(SkImageFilters::Blur(5, 5, nullptr)); - - canvas->drawImage(surface->makeTemporaryImage(), 0, 0, SkSamplingOptions{SkFilterMode::kLinear}, &glowBlurP); - canvas->drawImage(surface->makeTemporaryImage(), 0, 0, SkSamplingOptions{SkFilterMode::kLinear}, nullptr); } } diff --git a/src/DrawingProgram/Tools/EyeDropperTool.cpp b/src/DrawingProgram/Tools/EyeDropperTool.cpp index f438aeb..7ced036 100644 --- a/src/DrawingProgram/Tools/EyeDropperTool.cpp +++ b/src/DrawingProgram/Tools/EyeDropperTool.cpp @@ -54,20 +54,7 @@ void EyeDropperTool::tool_update() { if(drawP.controls.leftClick) { SkSurfaceProps props; - #ifdef USE_BACKEND_OPENGLES_3_0 - SkImageInfo imgInfo = SkImageInfo::Make(drawP.world.main.window.size.x(), drawP.world.main.window.size.y(), kRGBA_8888_SkColorType, kPremul_SkAlphaType); - #else - SkImageInfo imgInfo = SkImageInfo::MakeN32Premul(drawP.world.main.window.size.x(), drawP.world.main.window.size.y()); - #endif - #ifdef USE_SKIA_BACKEND_GRAPHITE - sk_sp surface = SkSurfaces::RenderTarget(drawP.world.main.window.recorder(), imgInfo, skgpu::Mipmapped::kNo, &props); - #elif USE_SKIA_BACKEND_GANESH - sk_sp surface = SkSurfaces::RenderTarget(drawP.world.main.window.ctx.get(), skgpu::Budgeted::kNo, imgInfo, 0, &props); - #endif - if(!surface) { - Logger::get().log("INFO", "[SkSurfaces::WrapBackendRenderTarget] Eye Dropper Tool could not make surface"); - return; - } + sk_sp surface = drawP.world.main.create_native_surface(drawP.world.main.window.size, false); SkCanvas* eyeDropperCanvas = surface->getCanvas(); if(!eyeDropperCanvas) { Logger::get().log("INFO", "Eye Dropper Tool could not make canvas"); diff --git a/src/DrawingProgram/Tools/ScreenshotTool.cpp b/src/DrawingProgram/Tools/ScreenshotTool.cpp index ba03267..bd4dc5d 100644 --- a/src/DrawingProgram/Tools/ScreenshotTool.cpp +++ b/src/DrawingProgram/Tools/ScreenshotTool.cpp @@ -147,20 +147,7 @@ void ScreenshotTool::take_screenshot(const std::filesystem::path& filePath) { std::vector finalImgRawData(imageByteSize); SkPixmap finalImgData(finalImgInfo, finalImgRawData.data(), imageRowSize); - #ifdef USE_BACKEND_OPENGLES_3_0 - SkImageInfo imgInfo = SkImageInfo::Make(drawP.world.main.window.size.x(), drawP.world.main.window.size.y(), kRGBA_8888_SkColorType, kPremul_SkAlphaType); - #else - SkImageInfo imgInfo = SkImageInfo::MakeN32Premul(drawP.world.main.window.size.x(), drawP.world.main.window.size.y()); - #endif - #ifdef USE_SKIA_BACKEND_GRAPHITE - sk_sp surface = SkSurfaces::RenderTarget(drawP.world.main.window.recorder(), imgInfo, skgpu::Mipmapped::kNo, &drawP.world.main.window.defaultMSAASurfaceProps); - #elif USE_SKIA_BACKEND_GANESH - sk_sp surface = SkSurfaces::RenderTarget(drawP.world.main.window.ctx.get(), skgpu::Budgeted::kNo, imgInfo, drawP.world.main.window.defaultMSAASampleCount, &drawP.world.main.window.defaultMSAASurfaceProps); - #endif - if(!surface) { - Logger::get().log("INFO", "[SkSurfaces::WrapBackendRenderTarget] Screenshot Tool could not make surface"); - return; - } + sk_sp surface = drawP.world.main.create_native_surface(drawP.world.main.window.size, true); SkCanvas* screenshotCanvas = surface->getCanvas(); if(!screenshotCanvas) { Logger::get().log("INFO", "Screenshot Tool could not make canvas"); diff --git a/src/MainProgram.cpp b/src/MainProgram.cpp index 0c10e4a..6ecc6e1 100755 --- a/src/MainProgram.cpp +++ b/src/MainProgram.cpp @@ -289,6 +289,25 @@ void MainProgram::draw(SkCanvas* canvas) { toolbar.draw(canvas); } +sk_sp MainProgram::create_native_surface(Vector2i resolution, bool isMSAA) { + #ifdef USE_BACKEND_OPENGLES_3_0 + SkImageInfo imgInfo = SkImageInfo::Make(resolution.x(), resolution.y(), kRGBA_8888_SkColorType, kPremul_SkAlphaType); + #else + SkImageInfo imgInfo = SkImageInfo::MakeN32Premul(resolution.x(), resolution.y()); + #endif + SkSurfaceProps defaultProps; + #ifdef USE_SKIA_BACKEND_GRAPHITE + auto surfaceToRet = SkSurfaces::RenderTarget(window.recorder(), imgInfo, skgpu::Mipmapped::kNo, isMSAA ? &window.defaultMSAASurfaceProps : &defaultProps); + #elif USE_SKIA_BACKEND_GANESH + auto surfaceToRet = SkSurfaces::RenderTarget(window.ctx.get(), skgpu::Budgeted::kNo, imgInfo, isMSAA ? window.defaultMSAASampleCount : 0, isMSAA ? &window.defaultMSAASurfaceProps : &defaultProps); + #endif + + if(!surfaceToRet) + throw std::runtime_error("[MainProgram::create_native_surface] Could not make native surface"); + + return surfaceToRet; +} + bool MainProgram::network_being_used() { for(auto& w : worlds) { if(w->netObjMan.is_connected()) diff --git a/src/MainProgram.hpp b/src/MainProgram.hpp index db1cbcb..797b279 100644 --- a/src/MainProgram.hpp +++ b/src/MainProgram.hpp @@ -86,6 +86,7 @@ class MainProgram { MainProgram(); void update(); void draw(SkCanvas* canvas); + sk_sp create_native_surface(Vector2i resolution, bool isMSAA); bool setToQuit = false; diff --git a/src/main.cpp b/src/main.cpp index 850fe54..1d3a258 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -282,18 +282,7 @@ void sdl_terminate(MainStruct& mS) { void resize_window(MainStruct& mS) { // Having intermediate surface allows for changing options more easily - #ifdef USE_BACKEND_OPENGLES_3_0 - SkImageInfo imgInfo = SkImageInfo::Make(mS.m->window.size.x(), mS.m->window.size.y(), kRGBA_8888_SkColorType, kPremul_SkAlphaType); - #else - SkImageInfo imgInfo = SkImageInfo::MakeN32Premul(mS.m->window.size.x(), mS.m->window.size.y()); - #endif -#ifdef USE_SKIA_BACKEND_GRAPHITE - mS.intermediateSurface = SkSurfaces::RenderTarget(mS.vulkanWindowContext->graphiteRecorder(), imgInfo, skgpu::Mipmapped::kNo, &mS.m->window.defaultMSAASurfaceProps); -#elif USE_SKIA_BACKEND_GANESH - mS.intermediateSurface = SkSurfaces::RenderTarget(mS.ctx.get(), skgpu::Budgeted::kNo, imgInfo, mS.m->window.defaultMSAASampleCount, &mS.m->window.defaultMSAASurfaceProps); -#endif - if(!mS.intermediateSurface) - throw std::runtime_error("[resize_window] Could not make intermediate surface"); + mS.intermediateSurface = mS.m->create_native_surface(mS.m->window.size, true); mS.intermediateCanvas = mS.intermediateSurface->getCanvas(); if(!mS.intermediateCanvas)