Make cursors and select tools visible without special blend modes
This commit is contained in:
parent
bd4d662dd9
commit
c85fb11636
8 changed files with 39 additions and 48 deletions
|
|
@ -2,37 +2,10 @@
|
|||
#include "DrawingProgram/DrawingProgram.hpp"
|
||||
#include <Helpers/HsvRgb.hpp>
|
||||
#include "MainProgram.hpp"
|
||||
#include "Helpers/Networking/NetLibrary.hpp"
|
||||
#include "World.hpp"
|
||||
|
||||
using namespace NetworkingObjects;
|
||||
|
||||
const char* visibleBlendModeCode = R"V(
|
||||
vec4 main(vec4 src, vec4 dst) {
|
||||
float value = max(max(dst.x, dst.y), dst.z) / dst.a;
|
||||
vec4 actualSrc;
|
||||
if(value > 0.6)
|
||||
actualSrc = vec4(vec3(0.0), src.a);
|
||||
else
|
||||
actualSrc = vec4(src.a);
|
||||
return actualSrc + (1.0 - actualSrc.a) * dst;
|
||||
}
|
||||
)V";
|
||||
|
||||
sk_sp<SkBlender> CanvasTheme::get_visible_blend_mode() {
|
||||
static sk_sp<SkBlender> blender = nullptr;
|
||||
if(!blender) {
|
||||
auto effect = SkRuntimeEffect::MakeForBlender(SkString(visibleBlendModeCode));
|
||||
if(!effect.effect) {
|
||||
std::cout << "[CanvasTheme::get_visible_blend_mode] " << " blender construction error\n";
|
||||
std::cout << effect.errorText.c_str() << std::endl;
|
||||
throw std::runtime_error("Shader Compile Failure");
|
||||
}
|
||||
blender = effect.effect->makeBlender(nullptr);
|
||||
}
|
||||
return blender;
|
||||
}
|
||||
|
||||
CanvasTheme::CanvasTheme(World& w):
|
||||
world(w)
|
||||
{}
|
||||
|
|
|
|||
|
|
@ -24,8 +24,6 @@ class CanvasTheme {
|
|||
void save_file(cereal::PortableBinaryOutputArchive& a) const;
|
||||
void load_file(cereal::PortableBinaryInputArchive& a, VersionNumber version);
|
||||
|
||||
static sk_sp<SkBlender> get_visible_blend_mode();
|
||||
|
||||
private:
|
||||
void set_tool_front_color(DrawingProgram& drawP);
|
||||
struct BackColor {
|
||||
|
|
|
|||
|
|
@ -575,20 +575,27 @@ bool DrawingProgram::prevent_undo_or_redo() {
|
|||
return drawTool->prevent_undo_or_redo();
|
||||
}
|
||||
|
||||
SkPaint DrawingProgram::select_tool_line_paint(const DrawData& drawData) {
|
||||
SkScalar intervals[] = {10, 5};
|
||||
std::pair<SkPaint, SkPaint> DrawingProgram::select_tool_line_paint(const DrawData& drawData) {
|
||||
SkScalar intervals[] = {10, 10};
|
||||
SkScalar intervalSum = intervals[0] + intervals[1];
|
||||
float timeSinceEpoch = std::chrono::duration_cast<std::chrono::duration<float>>(std::chrono::steady_clock::now().time_since_epoch()).count();
|
||||
sk_sp<SkPathEffect> lassoLineDashEffect = SkDashPathEffect::Make({intervals, 2}, -std::fmod(timeSinceEpoch * 50, 15));
|
||||
sk_sp<SkPathEffect> lassoLineDashEffect1 = SkDashPathEffect::Make({intervals, 2}, -std::fmod(timeSinceEpoch * 10, intervalSum));
|
||||
sk_sp<SkPathEffect> lassoLineDashEffect2 = SkDashPathEffect::Make({intervals, 2}, -std::fmod(timeSinceEpoch * 10, intervalSum) + 10);
|
||||
|
||||
SkPaint selectLinePaint;
|
||||
selectLinePaint.setStyle(SkPaint::kStroke_Style);
|
||||
selectLinePaint.setStrokeWidth(3);
|
||||
selectLinePaint.setColor4f(world.canvasTheme.get_tool_front_color());
|
||||
selectLinePaint.setPathEffect(lassoLineDashEffect);
|
||||
selectLinePaint.setBlender(CanvasTheme::get_visible_blend_mode());
|
||||
selectLinePaint.setAntiAlias(drawData.skiaAA);
|
||||
std::pair<SkPaint, SkPaint> selectLinePaintPair;
|
||||
selectLinePaintPair.first.setStyle(SkPaint::kStroke_Style);
|
||||
selectLinePaintPair.first.setStrokeWidth(3);
|
||||
selectLinePaintPair.first.setColor4f(SkColor4f{1.0f, 1.0f, 1.0f, 1.0f});
|
||||
selectLinePaintPair.first.setPathEffect(lassoLineDashEffect1);
|
||||
selectLinePaintPair.first.setAntiAlias(drawData.skiaAA);
|
||||
|
||||
return selectLinePaint;
|
||||
selectLinePaintPair.second.setStyle(SkPaint::kStroke_Style);
|
||||
selectLinePaintPair.second.setStrokeWidth(3);
|
||||
selectLinePaintPair.second.setColor4f(SkColor4f{0.0f, 0.0f, 0.0f, 1.0f});
|
||||
selectLinePaintPair.second.setPathEffect(lassoLineDashEffect2);
|
||||
selectLinePaintPair.second.setAntiAlias(drawData.skiaAA);
|
||||
|
||||
return selectLinePaintPair;
|
||||
}
|
||||
|
||||
void DrawingProgram::rebuild_cache() {
|
||||
|
|
|
|||
|
|
@ -89,7 +89,7 @@ class DrawingProgram {
|
|||
|
||||
float drag_point_radius();
|
||||
void draw_drag_circle(SkCanvas* canvas, const Vector2f& pos, const SkColor4f& c, const DrawData& drawData, float radiusMultiplier = 1.0f);
|
||||
SkPaint select_tool_line_paint(const DrawData& drawData);
|
||||
std::pair<SkPaint, SkPaint> select_tool_line_paint(const DrawData& drawData);
|
||||
bool is_actual_selection_tool(DrawingProgramToolType typeToCheck);
|
||||
bool is_selection_allowing_tool(DrawingProgramToolType typeToCheck);
|
||||
|
||||
|
|
|
|||
|
|
@ -208,9 +208,11 @@ void BrushTool::draw(SkCanvas* canvas, const DrawData& drawData) {
|
|||
linePaint.setStyle(SkPaint::kStroke_Style);
|
||||
linePaint.setStrokeCap(SkPaint::kRound_Cap);
|
||||
linePaint.setStrokeWidth(0.0f);
|
||||
linePaint.setBlender(CanvasTheme::get_visible_blend_mode());
|
||||
SkPath circ = SkPath::Circle(pos.x(), pos.y(), width);
|
||||
canvas->drawPath(circ, linePaint);
|
||||
linePaint.setColor4f({0.0f, 0.0f, 0.0f, 1.0f});
|
||||
circ = SkPath::Circle(pos.x(), pos.y(), width - 1.0f);
|
||||
canvas->drawPath(circ, linePaint);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -125,15 +125,20 @@ void EraserTool::draw(SkCanvas* canvas, const DrawData& drawData) {
|
|||
float width = relativeWidthResult.first.value() * 0.5f;
|
||||
SkPaint linePaint;
|
||||
linePaint.setAntiAlias(drawData.skiaAA);
|
||||
linePaint.setColor4f({1.0f, 1.0f, 1.0f, 0.5f});
|
||||
linePaint.setColor4f({0.0f, 0.0f, 0.0f, 0.4f});
|
||||
linePaint.setStyle(SkPaint::kStroke_Style);
|
||||
linePaint.setStrokeCap(SkPaint::kRound_Cap);
|
||||
linePaint.setStrokeWidth(width * 2.0f);
|
||||
linePaint.setBlender(CanvasTheme::get_visible_blend_mode());
|
||||
linePaint.setStrokeWidth(width * 2.0f + 1.0f);
|
||||
SkPathBuilder erasePath;
|
||||
erasePath.moveTo(convert_vec2<SkPoint>(lastPos));
|
||||
erasePath.lineTo(convert_vec2<SkPoint>(drawData.main->input.mouse.pos));
|
||||
canvas->drawPath(erasePath.detach(), linePaint);
|
||||
|
||||
SkPath erasePathDetach = erasePath.detach();
|
||||
canvas->drawPath(erasePathDetach, linePaint);
|
||||
|
||||
linePaint.setStrokeWidth(width * 2.0f);
|
||||
linePaint.setColor4f({1.0f, 1.0f, 1.0f, 0.4f});
|
||||
canvas->drawPath(erasePathDetach, linePaint);
|
||||
}
|
||||
|
||||
lastPos = drawData.main->input.mouse.pos;
|
||||
|
|
|
|||
|
|
@ -138,7 +138,10 @@ void LassoSelectTool::draw(SkCanvas* canvas, const DrawData& drawData) {
|
|||
for(Vector2f& p : controls.lassoPoints | std::views::drop(1))
|
||||
lassoPath.lineTo(convert_vec2<SkPoint>(p));
|
||||
|
||||
canvas->drawPath(lassoPath.detach(), drawP.select_tool_line_paint(drawData));
|
||||
auto paintPair = drawP.select_tool_line_paint(drawData);
|
||||
SkPath lassoPathDetach = lassoPath.detach();
|
||||
canvas->drawPath(lassoPathDetach, paintPair.first);
|
||||
canvas->drawPath(lassoPathDetach, paintPair.second);
|
||||
|
||||
canvas->restore();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -100,7 +100,10 @@ void RectSelectTool::draw(SkCanvas* canvas, const DrawData& drawData) {
|
|||
controls.coords.transform_sk_canvas(canvas, drawData);
|
||||
|
||||
SkRect r = SkRect::MakeLTRB(newT[0].x(), newT[0].y(), newT[2].x(), newT[2].y());
|
||||
canvas->drawRect(r, drawP.select_tool_line_paint(drawData));
|
||||
|
||||
auto paintPair = drawP.select_tool_line_paint(drawData);
|
||||
canvas->drawRect(r, paintPair.first);
|
||||
canvas->drawRect(r, paintPair.second);
|
||||
|
||||
canvas->restore();
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue