#include "EyeDropperTool.hpp" #include "DrawingProgram.hpp" #include "../Server/CommandList.hpp" #include "../MainProgram.hpp" #include "../DrawData.hpp" #include "DrawingProgramToolBase.hpp" #include #include #include #include #include #include #include #include #include #ifdef USE_SKIA_BACKEND_GRAPHITE #include #elif USE_SKIA_BACKEND_GANESH #include #include #endif #include EyeDropperTool::EyeDropperTool(DrawingProgram& initDrawP): DrawingProgramToolBase(initDrawP) { } DrawingProgramToolType EyeDropperTool::get_type() { return DrawingProgramToolType::EYEDROPPER; } void EyeDropperTool::gui_toolbox() { Toolbar& t = drawP.world.main.toolbar; t.gui.push_id("Color select tool"); t.gui.text_label_centered("Color Select"); if(t.gui.radio_button_field("Stroke Color", "Stroke Color", selectingStrokeColor)) selectingStrokeColor = true; if(t.gui.radio_button_field("Fill Color", "Fill Color", !selectingStrokeColor)) selectingStrokeColor = false; t.gui.pop_id(); } 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; } SkCanvas* eyeDropperCanvas = surface->getCanvas(); if(!eyeDropperCanvas) { Logger::get().log("INFO", "Eye Dropper Tool could not make canvas"); return; } int xPos = std::clamp(drawP.world.main.input.mouse.pos.x(), 0, drawP.world.main.window.size.x() - 1); 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; eyeDropperCanvas->restore(); //drawP.world.main.window.ctx->flush(); Vector4 readData; SkImageInfo readDataInfo = SkImageInfo::Make(1, 1, kRGBA_8888_SkColorType, kUnpremul_SkAlphaType); #ifdef USE_SKIA_BACKEND_GRAPHITE // NOT WORKING IN GRAPHITE YET //surface->makeImageSnapshot()->readPixels(drawP.world.main.window.ctx.get(), readDataInfo, (void*)readData.data(), 4, xPos, yPos); #elif USE_SKIA_BACKEND_GANESH surface->makeImageSnapshot()->readPixels(drawP.world.main.window.ctx.get(), readDataInfo, (void*)readData.data(), 4, xPos, yPos); #endif if(selectingStrokeColor) drawP.controls.foregroundColor = readData.cast() / 255.0f; else drawP.controls.backgroundColor = readData.cast() / 255.0f; } } bool EyeDropperTool::prevent_undo_or_redo() { return false; } void EyeDropperTool::draw(SkCanvas* canvas, const DrawData& drawData) { } void EyeDropperTool::switch_tool(DrawingProgramToolType newTool) { }