Skip to content

Fix double rotation of macro circle/line center coordinates (#233)#310

Merged
spe-ciellt merged 1 commit intogerbv:developfrom
SourceParts:fix/macro-double-rotation
Mar 5, 2026
Merged

Fix double rotation of macro circle/line center coordinates (#233)#310
spe-ciellt merged 1 commit intogerbv:developfrom
SourceParts:fix/macro-double-rotation

Conversation

@rampageservices
Copy link
Copy Markdown
Contributor

Summary

  • Remove redundant gerbv_rotate_coord() calls for CIRCLE, LINE21, and LINE22 macro primitives in gerb_image.c
  • The rotation parameter update alone is sufficient — gerbv_rotate_coord() was double-applying the rotation

Root cause

The rendering code (draw.c) uses cairo_rotate()cairo_translate() order for these primitives, so the rotation parameter already rotates the center coordinates as part of the Cairo transformation. The image copy/transform code was additionally pre-rotating the center coordinates via gerbv_rotate_coord(), causing a double rotation when the exported file was re-loaded.

LINE20, POLYGON, MOIRE, and THERMAL already handle this correctly — they only update the rotation parameter without calling gerbv_rotate_coord(). This fix makes CIRCLE, LINE21, and LINE22 consistent.

Test plan

  • Clean build with zero warnings
  • 94/104 regression tests pass (10 pre-existing rendering mismatches)
  • Load a gerber with macro line/circle primitives, rotate, export to RS274X, re-load — verify no double rotation

Fixes #233

The rendering code (draw.c) applies cairo_rotate() before
cairo_translate() for CIRCLE, LINE21, and LINE22 macro primitives,
meaning the rotation parameter already rotates the center coordinates
as part of the Cairo transformation.

The image copy/transform code (gerb_image.c) was updating the rotation
parameter AND calling gerbv_rotate_coord() on the center coordinates.
When the exported file was re-loaded, the center was rotated twice:
once by the pre-rotated coordinates, and again by cairo_rotate().

Remove the redundant gerbv_rotate_coord() calls for CIRCLE and
LINE21/LINE22, matching the pattern already used by LINE20, POLYGON,
MOIRE, and THERMAL — all of which correctly rely on the rotation
parameter alone.

Fixes gerbv#233
@rampageservices
Copy link
Copy Markdown
Contributor Author

This PR is labeled as enhancement but it's actually a bug fix — it corrects a double-rotation issue where gerbv_rotate_coord() was redundantly pre-rotating center coordinates that were already being rotated by the Cairo transformation in draw.c. The title and body both say "Fix", and it references #233 which is a bug report. The label should be bug instead.

@spe-ciellt spe-ciellt added bug Something isn't working fix Solution for a potential problem or omission. and removed enhancement New feature or request bug Something isn't working labels Mar 5, 2026
@spe-ciellt
Copy link
Copy Markdown
Contributor

No review comments.

@spe-ciellt spe-ciellt merged commit f2dcf5f into gerbv:develop Mar 5, 2026
2 checks passed
@spe-ciellt spe-ciellt removed their request for review March 5, 2026 16:36
rampageservices added a commit to SourceParts/gerbv that referenced this pull request Mar 6, 2026
gerbv_gdk_draw_prim1 was the only GDK macro primitive handler that
did not apply rotation to its center coordinates. Before gerbv#310, this
was masked because gerb_image.c pre-rotated the center via
gerbv_rotate_coord(). Removing that pre-rotation (correctly, to fix
the Cairo double-rotation bug) exposed that the GDK renderer never
had its own rotation handling for circles.

Apply rotate_point() to the center offset before translating, matching
the pattern used by all other GDK macro primitives (prim4, prim5,
prim6, prim7, prim20, prim21, prim22).

Fixes gerbv#352
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

fix Solution for a potential problem or omission.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

rotate macro_line tiwce when export image to rs274x

2 participants