Fix Intertwine interface

This commit is contained in:
Martín Capello 2025-09-15 16:21:38 -03:00
parent be4dcb9476
commit a20847bef6
3 changed files with 47 additions and 49 deletions

View File

@ -159,27 +159,4 @@ doc::AlgoLineWithAlgoPixel Intertwine::getLineAlgo(ToolLoop* loop,
}
}
// static
void Intertwine::doPointshapeSlicedCircle(int x1,
int y1,
int x2,
int y2,
int r,
ToolLoop* loop,
bool fill)
{
if (fill) {
algo_sliced_circlefill(x1, y1, x2, y2, r, loop, (AlgoHLine)doPointshapeHline);
}
else {
algo_sliced_circle(x1, y1, x2, y2, r, loop, (AlgoPixel)doPointshapePoint);
}
}
// static
void Intertwine::doPointshapeArc(int xm, int ym, double sa, double ea, int r, ToolLoop* loop)
{
algo_arc(xm, ym, sa, ea, r, loop, (AlgoPixel)doPointshapePoint);
}
}} // namespace app::tools

View File

@ -62,16 +62,6 @@ protected:
static doc::AlgoLineWithAlgoPixel getLineAlgo(ToolLoop* loop,
const Stroke::Pt& a,
const Stroke::Pt& b);
static void doPointshapeSlicedCircle(int x1,
int y1,
int x2,
int y2,
int r,
ToolLoop* loop,
bool fill = false);
static void doPointshapeArc(int xm, int ym, double sa, double ea, int r, ToolLoop* loop);
};
}} // namespace app::tools

View File

@ -11,6 +11,7 @@
#include "app/tools/tool_loop.h"
#include "app/tools/tool_loop_modifiers.h"
#include "base/pi.h"
#include "doc/algo.h"
#include "doc/algorithm/polygon.h"
#include "doc/layer_tilemap.h"
#include "gfx/point.h"
@ -202,7 +203,7 @@ public:
int w = x2 - x1 + 1;
int h = y2 - y1 + 1;
r = std::min(w, std::min(h, 2 * cornerRadius)) / 2;
doPointshapeSlicedCircle(x1, y1, x2, y2, r, loop);
algo_sliced_circle(x1, y1, x2, y2, r, loop, (AlgoPixel)doPointshapePoint);
}
doPointshapeLineWithoutDynamics(x1 + r, y1, x2 - r, y1, loop);
@ -234,10 +235,22 @@ public:
const double ang_minus_PI_2 = base::fmod_radians(angle - PI / 2);
const double ang_plus_PI_2 = base::fmod_radians(angle + PI / 2);
const double ang_plus_PI = base::fmod_radians(angle + PI);
doPointshapeArc(p[2].x, p[2].y, ang_minus_PI_2, angle, r, loop);
doPointshapeArc(p[5].x, p[5].y, angle, ang_plus_PI_2, r, loop);
doPointshapeArc(p[8].x, p[8].y, ang_plus_PI_2, ang_plus_PI, r, loop);
doPointshapeArc(p[11].x, p[11].y, ang_plus_PI, ang_minus_PI_2, r, loop);
algo_arc(p[2].x, p[2].y, ang_minus_PI_2, angle, r, loop, (AlgoPixel)doPointshapePoint);
algo_arc(p[5].x, p[5].y, angle, ang_plus_PI_2, r, loop, (AlgoPixel)doPointshapePoint);
algo_arc(p[8].x,
p[8].y,
ang_plus_PI_2,
ang_plus_PI,
r,
loop,
(AlgoPixel)doPointshapePoint);
algo_arc(p[11].x,
p[11].y,
ang_plus_PI,
ang_minus_PI_2,
r,
loop,
(AlgoPixel)doPointshapePoint);
}
}
}
@ -271,7 +284,7 @@ public:
int w = x2 - x1 + 1;
int h = y2 - y1 + 1;
r = std::min(w, std::min(h, 2 * cornerRadius)) / 2;
doPointshapeSlicedCircle(x1, y1, x2, y2, r, loop, true);
algo_sliced_circlefill(x1, y1, x2, y2, r, loop, (AlgoHLine)doPointshapeHline);
for (y = y1; y < y1 + r; y++)
doPointshapeLineWithoutDynamics(x1 + r, y, x2 - r, y, loop);
@ -295,16 +308,34 @@ public:
Stroke p = rotateRectangle(x1, y1, x2, y2, angle, cornerRadius);
auto v = p.toXYInts();
doc::algorithm::polygon(v.size() / 2, &v[0], loop, (AlgoHLine)doPointshapeHline);
doPointshapeSlicedCircle(p[2].x - r, p[2].y - r, p[2].x + r, p[2].y + r, r, loop, true);
doPointshapeSlicedCircle(p[5].x - r, p[5].y - r, p[5].x + r, p[5].y + r, r, loop, true);
doPointshapeSlicedCircle(p[8].x - r, p[8].y - r, p[8].x + r, p[8].y + r, r, loop, true);
doPointshapeSlicedCircle(p[11].x - r,
algo_sliced_circlefill(p[2].x - r,
p[2].y - r,
p[2].x + r,
p[2].y + r,
r,
loop,
(AlgoHLine)doPointshapeHline);
algo_sliced_circlefill(p[5].x - r,
p[5].y - r,
p[5].x + r,
p[5].y + r,
r,
loop,
(AlgoHLine)doPointshapeHline);
algo_sliced_circlefill(p[8].x - r,
p[8].y - r,
p[8].x + r,
p[8].y + r,
r,
loop,
(AlgoHLine)doPointshapeHline);
algo_sliced_circlefill(p[11].x - r,
p[11].y - r,
p[11].x + r,
p[11].y + r,
r,
loop,
true);
(AlgoHLine)doPointshapeHline);
}
}
}