LibGfx: Add some AntiAliasingPainter FIXMEs

Also fixup the style on some comments.

See #16270... Hopefully someone will land on these :^)
This commit is contained in:
MacDue 2022-11-30 23:38:35 +00:00 committed by Linus Groh
parent eb50969781
commit b85af4e9bf
Notes: sideshowbarker 2024-07-17 03:46:14 +09:00

View file

@ -687,15 +687,18 @@ void AntiAliasingPainter::fill_rect_with_rounded_corners(IntRect const& a_rect,
void AntiAliasingPainter::stroke_segment_intersection(FloatPoint const& current_line_a, FloatPoint const& current_line_b, FloatLine const& previous_line, Color color, float thickness)
{
// starting point of the current line is where the last line ended... this is an intersection
// FIXME: This is currently drawn in slightly the wrong place most of the time.
// FIXME: This is sometimes drawn when the intersection would not be visible anyway.
// Starting point of the current line is where the last line ended... this is an intersection.
auto intersection = current_line_a;
auto previous_line_b = (previous_line.a());
// if both are straight lines we can simply draw a rectangle at the intersection
// If both are straight lines we can simply draw a rectangle at the intersection.
if ((current_line_a.x() == current_line_b.x() || current_line_a.y() == current_line_b.y()) && (previous_line.a().x() == previous_line.b().x() || previous_line.a().y() == previous_line.b().y())) {
intersection = m_transform.map(current_line_a);
// adjust coordinates to handle rounding offsets
// Adjust coordinates to handle rounding offsets.
auto intersection_rect = IntSize(thickness, thickness);
float drawing_edge_offset = fmodf(thickness, 2.0f) < 0.5f && thickness > 3 ? 1 : 0;
auto integer_part = [](float x) { return floorf(x); };
@ -720,20 +723,20 @@ void AntiAliasingPainter::stroke_segment_intersection(FloatPoint const& current_
float scale_to_move_current = (thickness / 2) / intersection.distance_from(current_line_b);
float scale_to_move_previous = (thickness / 2) / intersection.distance_from(previous_line_b);
// move the point on the line by half of the thickness
// Move the point on the line by half of the thickness.
double offset_current_edge_x = scale_to_move_current * (current_line_b.x() - intersection.x());
double offset_current_edge_y = scale_to_move_current * (current_line_b.y() - intersection.y());
double offset_prev_edge_x = scale_to_move_previous * (previous_line_b.x() - intersection.x());
double offset_prev_edge_y = scale_to_move_previous * (previous_line_b.y() - intersection.y());
// rotate the point by 90 and 270 degrees to get the points for both edges
// Rotate the point by 90 and 270 degrees to get the points for both edges.
double rad_90deg = 0.5 * M_PI;
FloatPoint current_rotated_90deg = { (offset_current_edge_x * cos(rad_90deg) - offset_current_edge_y * sin(rad_90deg)), (offset_current_edge_x * sin(rad_90deg) + offset_current_edge_y * cos(rad_90deg)) };
FloatPoint current_rotated_270deg = intersection - current_rotated_90deg;
FloatPoint previous_rotated_90deg = { (offset_prev_edge_x * cos(rad_90deg) - offset_prev_edge_y * sin(rad_90deg)), (offset_prev_edge_x * sin(rad_90deg) + offset_prev_edge_y * cos(rad_90deg)) };
FloatPoint previous_rotated_270deg = intersection - previous_rotated_90deg;
// translate coordinates to the intersection point
// Translate coordinates to the intersection point.
current_rotated_90deg += intersection;
previous_rotated_90deg += intersection;
@ -767,15 +770,15 @@ void AntiAliasingPainter::stroke_segment_intersection(FloatPoint const& current_
fill_path(intersection_edge_path, color);
}
// rotates a rectangle around 0,0
FloatQuad AntiAliasingPainter::build_rotated_rectangle(FloatPoint const& direction, float width)
{
// Rotates a rectangle around 0,0
double half_size = width / 2;
double radian = atan2(direction.y(), direction.x());
if (radian < 0) {
radian += (2 * M_PI);
}
// rotated by: (xcosθysinθ ,xsinθ+ycosθ)
// Rotated by: (xcosθysinθ ,xsinθ+ycosθ)
// p1 p2
//
// x,y