pcbjam/tests/gal-regression
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Viktor Vaczi 18c73c355e feat(webgl): Fix WebGL GAL rendering with proper coordinate setup
- Fix coordinate system for 1:1 pixel mapping (was using nm scale)
- Set worldUnitLength to 1/96 to match native test setup
- Add SetLookAtPoint and SetZoomFactor for proper view transformation
- Fix glDrawBuffers for WebGL 2.0 (array index must match attachment)
- Add legacy_gl_stubs.js for wxWidgets compatibility
- Add isReady() check to prevent race condition in Playwright tests

All 28 GAL test scenarios now render correctly in WebGL.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 10:13:11 +01:00
..
baseline feat(gal-test): Add 100% GAL API test coverage (28 scenarios) 2026-01-07 12:27:06 +01:00
native docs(gal-test): Add README and document DrawBitmap limitation 2026-01-07 13:37:08 +01:00
scenarios docs(gal-test): Add README and document DrawBitmap limitation 2026-01-07 13:37:08 +01:00
wasm feat(webgl): Fix WebGL GAL rendering with proper coordinate setup 2026-01-08 10:13:11 +01:00
README.md docs(gal-test): Add README and document DrawBitmap limitation 2026-01-07 13:37:08 +01:00

GAL Regression Test Harness

Native test harness for KiCad's OPENGL_GAL (Graphics Abstraction Layer) to enable visual regression testing of the WebGL port.

Purpose

This test suite exercises KiCad's actual OPENGL_GAL implementation to:

  • Generate baseline screenshots for visual regression testing
  • Verify GAL API coverage (70/70 methods tested)
  • Provide reference implementations for the WebGL port

Test Scenarios

28 scenarios covering all GAL drawing operations:

# Scenario Description
0 basic-lines DrawLine with various styles
1 line-widths SetLineWidth variations
2 circles DrawCircle filled/stroked
3 arcs DrawArc with different angles
4 rectangles DrawRectangle filled/stroked
5 polygons DrawPolygon with complex shapes
6 alpha-blending Transparency and blending
7 transforms Save/Restore/Translate/Rotate/Scale
8 grid-cursor Grid and cursor rendering
9 segments DrawSegment with endcaps
10 complex-scene Combined operations
11 bezier-curves DrawCurve (cubic Bezier)
12 arc-segments DrawArcSegment with widths
13 segment-chain DrawSegmentChain
14 group-caching BeginGroup/EndGroup/DrawGroup
15 polylines-multi DrawPolyline/DrawPolylines
16 hole-walls DrawHoleWalls from SHAPE_SEGMENT
17 grid-native DrawGrid (native grid rendering)
18 cursor-native DrawCursor (native cursor)
19 render-targets SetTarget/GetTarget/ClearTarget
20 screen-transform SetScreenSize/ComputeWorldScale
21 clear-colors ClearScreen with colors
22 depth-testing SetLayerDepth ordering
23 negative-mode SetNegativeDrawMode
24 text-attrs Text attribute methods (stub)
25 glyphs DrawGlyph/DrawGlyphs
26 bitmap DrawBitmap (see limitation below)
27 transform-api Transform() API documentation

Building

./scripts/build-gal-native-test.sh

Running

# Run all scenarios and save to baseline folder
./tests/gal-regression/native/build/gal_native_test \
    --output ./tests/gal-regression/baseline

# Run specific scenario (by number)
./tests/gal-regression/native/build/gal_native_test \
    --output ./tests/gal-regression/baseline 5

# Show window (non-headless)
./tests/gal-regression/native/build/gal_native_test --show

Known Limitations

DrawBitmap (Scenario 26)

The DrawBitmap test shows empty panels because OPENGL_GAL::DrawBitmap uses legacy OpenGL immediate mode (glBegin/glVertex3f/glEnd) which is incompatible with the shader-based rendering pipeline used by the test harness.

In KiCad's production code, DrawBitmap works because:

  1. The VIEW rendering system orchestrates buffer flushes between render targets
  2. GPU_MANAGER::DrawAll() deactivates the shader after flushing vertices
  3. The fixed-function pipeline can then render the textured quad

In our isolated test harness, the shader remains active throughout rendering, causing the legacy GL calls to fail silently.

This is acceptable because:

  • DrawBitmap is primarily used for reference images in schematics
  • The WebGL port will need its own bitmap rendering implementation anyway
  • All other 69 GAL methods are fully tested

Transform() API (Scenario 27)

The Transform() method is documented but not visually tested because it's dead code in KiCad - never called in production. It uses glMultMatrixd() which doesn't integrate with the VERTEX_MANAGER shader pipeline.

Directory Structure

tests/gal-regression/
├── README.md           # This file
├── baseline/           # Reference PNG screenshots
├── native/
│   ├── CMakeLists.txt
│   ├── gal_native_test.cpp      # Main test driver
│   ├── gal_test_accessor.cpp    # Private member accessors
│   ├── kicad_stubs.cpp          # KiCad symbol stubs
│   ├── bitmap_base_stub.h       # Bitmap test patterns
│   ├── kifont_stub.h            # Glyph factory helpers
│   └── generated/               # Shader source files
└── scenarios/
    ├── gal_test_scenarios.cpp   # Scenario registry
    └── scenario_*.cpp           # Individual test scenarios