mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 15:07:45 +00:00
LibTTF: Fix code after rebase
This commit is contained in:
parent
3b31f069f0
commit
a060b6cefd
7 changed files with 120 additions and 74 deletions
|
@ -38,15 +38,6 @@ public:
|
|||
: m_values { 1, 0, 0, 1, 0, 0 }
|
||||
{
|
||||
}
|
||||
AffineTransform(float a, float b, float c, float d, float e, float f)
|
||||
{
|
||||
m_values[0] = a;
|
||||
m_values[1] = b;
|
||||
m_values[2] = c;
|
||||
m_values[3] = d;
|
||||
m_values[4] = e;
|
||||
m_values[5] = f;
|
||||
}
|
||||
|
||||
AffineTransform(float a, float b, float c, float d, float e, float f)
|
||||
: m_values { a, b, c, d, e, f }
|
||||
|
@ -81,8 +72,6 @@ public:
|
|||
AffineTransform& rotate_radians(float);
|
||||
AffineTransform& multiply(const AffineTransform&);
|
||||
|
||||
AffineTransform operator*(const AffineTransform&) const;
|
||||
|
||||
private:
|
||||
float m_values[6] { 0 };
|
||||
};
|
||||
|
|
|
@ -33,4 +33,4 @@ set(SOURCES
|
|||
)
|
||||
|
||||
serenity_lib(LibGfx gfx)
|
||||
target_link_libraries(LibGfx LibM LibCore LibTTF)
|
||||
target_link_libraries(LibGfx LibM LibCore)
|
||||
|
|
|
@ -1282,22 +1282,45 @@ void Painter::draw_line(const IntPoint& p1, const IntPoint& p2, Color color, int
|
|||
}
|
||||
}
|
||||
|
||||
static void split_quadratic_bezier_curve(const FloatPoint& original_control, const FloatPoint& p1, const FloatPoint& p2, Function<void(const FloatPoint&, const FloatPoint&)>& callback)
|
||||
{
|
||||
auto po1_midpoint = original_control + p1;
|
||||
po1_midpoint /= 2;
|
||||
|
||||
auto po2_midpoint = original_control + p2;
|
||||
po2_midpoint /= 2;
|
||||
|
||||
auto new_segment = po1_midpoint + po2_midpoint;
|
||||
new_segment /= 2;
|
||||
|
||||
Painter::for_each_line_segment_on_bezier_curve(po1_midpoint, p1, new_segment, callback);
|
||||
Painter::for_each_line_segment_on_bezier_curve(po2_midpoint, new_segment, p2, callback);
|
||||
}
|
||||
|
||||
static bool can_approximate_bezier_curve(const FloatPoint& p1, const FloatPoint& p2, const FloatPoint& control)
|
||||
{
|
||||
constexpr static int tolerance = 15;
|
||||
|
||||
auto p1x = 3 * control.x() - 2 * p1.x() - p2.x();
|
||||
auto p1y = 3 * control.y() - 2 * p1.y() - p2.y();
|
||||
auto p2x = 3 * control.x() - 2 * p2.x() - p1.x();
|
||||
auto p2y = 3 * control.y() - 2 * p2.y() - p1.y();
|
||||
|
||||
p1x = p1x * p1x;
|
||||
p1y = p1y * p1y;
|
||||
p2x = p2x * p2x;
|
||||
p2y = p2y * p2y;
|
||||
|
||||
return max(p1x, p2x) + max(p1y, p2y) <= tolerance;
|
||||
}
|
||||
|
||||
void Painter::for_each_line_segment_on_bezier_curve(const FloatPoint& control_point, const FloatPoint& p1, const FloatPoint& p2, Function<void(const FloatPoint&, const FloatPoint&)>& callback)
|
||||
{
|
||||
float arbitrary = 15.0;
|
||||
auto mid_point = FloatPoint::interpolate(p1, p2, 0.5);
|
||||
float squared_distance = FloatPoint::squared_distance(control_point, mid_point);
|
||||
size_t num_sections = 1 + floorf(sqrtf(arbitrary * squared_distance));
|
||||
float delta = 1.0 / num_sections;
|
||||
float t = 0.0;
|
||||
FloatPoint p_cur = p1;
|
||||
for (size_t i = 0; i < num_sections - 1; i++) {
|
||||
t += delta;
|
||||
FloatPoint pn = FloatPoint::interpolate(FloatPoint::interpolate(p1, control_point, t), FloatPoint::interpolate(control_point, p2, t), t);
|
||||
callback(p_cur, pn);
|
||||
p_cur = pn;
|
||||
if (can_approximate_bezier_curve(p1, p2, control_point)) {
|
||||
callback(p1, p2);
|
||||
} else {
|
||||
split_quadratic_bezier_curve(control_point, p1, p2, callback);
|
||||
}
|
||||
callback(p_cur, p2);
|
||||
}
|
||||
|
||||
void Painter::for_each_line_segment_on_bezier_curve(const FloatPoint& control_point, const FloatPoint& p1, const FloatPoint& p2, Function<void(const FloatPoint&, const FloatPoint&)>&& callback)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue