pcbjam/tests/gal-regression/scenarios/scenario_bezier_curves.cpp
Viktor Vaczi 650109e10f feat(webgl): Add 4 new GAL test scenarios for expanded coverage
Expand test coverage from ~19% to ~25% of GAL API with modular scenario files:
- bezier-curves: Tests DrawCurve() with S-curves, waves, hearts, and control points
- arc-segments: Tests DrawArcSegment() with thick arc strokes (PCB trace style)
- segment-chain: Tests DrawSegmentChain() with zigzags, spirals, sharp corners
- group-caching: Tests BeginGroup/EndGroup/DrawGroup for cached geometry

Architecture:
- New scenarios in separate files under scenarios/
- Forward declarations in main gal_test_scenarios.cpp
- CMakeLists.txt updated to compile new scenario modules

Also:
- Remove unused build-wxwidgets-native.sh (using system wxWidgets)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-07 09:58:52 +01:00

138 lines
3.7 KiB
C++

/**
* Bezier Curves Scenario
*
* Tests GAL::DrawCurve() - cubic bezier splines
*/
#include <gal/graphics_abstraction_layer.h>
#include <cmath>
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
namespace GALTest {
using KIGFX::COLOR4D;
using KIGFX::GAL;
void RenderBezierCurves(GAL* gal, int width, int height) {
double cx = width / 2.0;
double cy = height / 2.0;
gal->SetIsFill(false);
gal->SetIsStroke(true);
// Simple S-curve
gal->SetStrokeColor(COLOR4D(1.0, 0.3, 0.3, 1.0));
gal->SetLineWidth(3.0);
gal->DrawCurve(
VECTOR2D(100, cy - 100), // start
VECTOR2D(200, cy - 200), // control 1
VECTOR2D(300, cy), // control 2
VECTOR2D(400, cy - 100), // end
0.0 // filter value
);
// Inverse S-curve below
gal->SetStrokeColor(COLOR4D(0.3, 1.0, 0.3, 1.0));
gal->DrawCurve(
VECTOR2D(100, cy + 100),
VECTOR2D(200, cy + 200),
VECTOR2D(300, cy),
VECTOR2D(400, cy + 100),
0.0
);
// Loop curve (tight control points)
gal->SetStrokeColor(COLOR4D(0.3, 0.3, 1.0, 1.0));
gal->SetLineWidth(2.0);
gal->DrawCurve(
VECTOR2D(450, cy - 50),
VECTOR2D(550, cy - 150),
VECTOR2D(550, cy + 150),
VECTOR2D(450, cy + 50),
0.0
);
// Straight-ish curve (control points on line)
gal->SetStrokeColor(COLOR4D(1.0, 1.0, 0.3, 1.0));
gal->DrawCurve(
VECTOR2D(500, 80),
VECTOR2D(550, 80),
VECTOR2D(650, 80),
VECTOR2D(700, 80),
0.0
);
// Wave pattern using multiple curves
gal->SetStrokeColor(COLOR4D(0.8, 0.5, 0.8, 1.0));
gal->SetLineWidth(2.5);
double waveY = height - 100;
double segWidth = 100;
double amplitude = 40;
for (int i = 0; i < 6; i++) {
double x0 = 100 + i * segWidth;
double x1 = x0 + segWidth;
double dir = (i % 2 == 0) ? 1.0 : -1.0;
gal->DrawCurve(
VECTOR2D(x0, waveY),
VECTOR2D(x0 + segWidth * 0.33, waveY + amplitude * dir),
VECTOR2D(x0 + segWidth * 0.66, waveY + amplitude * dir),
VECTOR2D(x1, waveY),
0.0
);
}
// Heart shape using two curves
gal->SetStrokeColor(COLOR4D(1.0, 0.2, 0.4, 1.0));
gal->SetLineWidth(3.0);
double hx = cx + 150;
double hy = cy - 50;
double hs = 50; // heart scale
// Left half of heart
gal->DrawCurve(
VECTOR2D(hx, hy + hs * 0.5), // bottom point
VECTOR2D(hx - hs * 1.5, hy - hs), // left control
VECTOR2D(hx - hs * 0.5, hy - hs * 1.5), // top control
VECTOR2D(hx, hy - hs * 0.3), // top middle
0.0
);
// Right half of heart
gal->DrawCurve(
VECTOR2D(hx, hy - hs * 0.3), // top middle
VECTOR2D(hx + hs * 0.5, hy - hs * 1.5), // top control
VECTOR2D(hx + hs * 1.5, hy - hs), // right control
VECTOR2D(hx, hy + hs * 0.5), // bottom point
0.0
);
// Control point visualization (draw handles)
gal->SetStrokeColor(COLOR4D(0.5, 0.5, 0.5, 0.5));
gal->SetLineWidth(1.0);
// Show control points for the first curve
VECTOR2D p0(100, cy - 100);
VECTOR2D c0(200, cy - 200);
VECTOR2D c1(300, cy);
VECTOR2D p1(400, cy - 100);
gal->DrawLine(p0, c0);
gal->DrawLine(p1, c1);
// Draw control point markers
gal->SetIsFill(true);
gal->SetIsStroke(false);
gal->SetFillColor(COLOR4D(1.0, 0.5, 0.0, 0.8));
gal->DrawCircle(c0, 5);
gal->DrawCircle(c1, 5);
gal->SetFillColor(COLOR4D(0.0, 0.5, 1.0, 0.8));
gal->DrawCircle(p0, 5);
gal->DrawCircle(p1, 5);
}
} // namespace GALTest