10 static SkPaint
const blockOutlinePaint = []() {
14 paint.setStyle(SkPaint::Style::kStroke_Style);
16 paint.setAntiAlias(
true);
22 static SkPaint
const blockOutlineHoveredPaint = []() {
26 paint.setStyle(SkPaint::Style::kStroke_Style);
28 paint.setAntiAlias(
true);
34 static SkPaint
const portOutlineHoveredPaint = []() {
38 paint.setStyle(SkPaint::Style::kStroke_Style);
40 paint.setAntiAlias(
true);
45 static SkPaint
const portOutlinePaint = []() {
49 paint.setStyle(SkPaint::Style::kStroke_Style);
51 paint.setAntiAlias(
true);
57 static SkPaint
const blockFillPaint = []() {
61 paint.setStyle(SkPaint::Style::kFill_Style);
66 static SkPaint
const textPaint = []() {
70 paint.setStyle(SkPaint::Style::kFill_Style);
71 paint.setAntiAlias(
true);
79 const auto leftX = block->
getLeftX();
81 const auto topY = block->
getTopY();
83 const auto cy = block->
getCy();
84 const auto width = block->
getWidth();
93 const auto portCircleOffsetFromBlockEdge =
96 const auto inputCx = leftX + portCircleOffsetFromBlockEdge;
97 const auto outputCx = rightX - portCircleOffsetFromBlockEdge;
99 const auto inputsTotalHeight =
104 const auto outputsTotalHeight =
109 auto inputCy =
static_cast<int>(std::round(cy - (inputsTotalHeight / 2.0F)));
110 auto outputCy =
static_cast<int>(std::round(cy - (outputsTotalHeight / 2.0F)));
114 canvas->drawRect(SkRect::MakeLTRB(leftX, topY, rightX, bottomY),
115 isHovered ? blockOutlineHoveredPaint : blockOutlinePaint);
117 canvas->drawRect(SkRect::MakeLTRB(leftX, topY, rightX, bottomY), blockFillPaint);
119 const auto captionFont =
121 const auto captionFontSize = captionFont.getSize();
123 const auto* blockNameCstr = magic_enum::enum_name(block->
getBlockType()).data();
124 auto blockNameWidth =
125 captionFont.measureText(blockNameCstr, strlen(blockNameCstr), SkTextEncoding::kUTF8);
128 canvas->drawString(blockNameCstr,
129 leftX + (
static_cast<SkScalar
>(width) / 2.0F) - (blockNameWidth / 2),
130 cy + (captionFontSize / 4),
135 for (
size_t i = 0; i < inputPorts.size(); i++) {
140 portCoordinates[&inputPorts[i]] = {.x = inputCx, .y = inputCy};
143 bool const isPortHovered =
151 const SkPaint& renderOutlinePaint =
152 isPortHovered ? portOutlineHoveredPaint : portOutlinePaint;
154 canvas->drawCircle(inputCx,
162 const auto* cstr = inputPorts[i].name.c_str();
165 SkScalar
const captionWidth =
166 captionFont.measureText(cstr, strlen(cstr), SkTextEncoding::kUTF8);
169 canvas->drawString(cstr,
171 captionFontSize - captionWidth,
173 (captionFontSize / 4),
183 for (
size_t i = 0; i < outputPorts.size(); i++) {
188 portCoordinates[&outputPorts[i]] = {.x = outputCx, .y = outputCy};
191 bool const isPortHovered =
199 const SkPaint& renderOutlinePaint =
200 isPortHovered ? portOutlineHoveredPaint : portOutlinePaint;
202 canvas->drawCircle(outputCx,
210 const auto* cstr = outputPorts[i].name.c_str();
217 (captionFontSize / 4),