REL: Version 3.1.0#51
Merged
imikejackson merged 21 commits intoJun 30, 2026
Merged
Conversation
Now use A1, A2, A3 for axis labels and get away from the arbitrary RD, TD, ND
…cimation Wires together LaueOps crystallography, StereographicProjectUpperHemisphere, RenderDiscreteMarkerSprite, MarkerOccupancyGrid, and shared chrome free functions into DiscretePoleFigureCompositor::generateCompositeImage. Adds smoke (ProducesImage) and determinism (IsDeterministic) tests; all 3 DiscretePoleFigureCompositorTest cases pass. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…FigureComposite Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The v3 archive reflects the new discrete vector rendering plus current axis label positions. NOTE: Pole_Figure_Images_v3.tar.gz must be uploaded to the EbsdLib test-data archive before CI / fresh clones can download it; the data is already present locally for verification.
* The marker Y mapping in DiscretePoleFigureCompositor hardcoded +Y-up regardless of config.flipFinalImage, while DrawPoleFigureFrame places the A2 label based on that flag — causing label/marker mismatch when flipFinalImage=false. * Gate the cy formula on flipFinalImage: true keeps the existing +Y-up (subtracted dy), false uses +Y-down (added dy), matching the raster path's conditional vertical flip. * Add HonorsFlipFinalImage test that compares the figure-1 pixel box between flip=true and flip=false, requiring boxDiffs > 0 to confirm markers are vertically mirrored by the flag. Signed-off-by: Michael Jackson <mike.jackson@bluequartz.net>
* getDefaultPoleFigureNames now returns plane-family brace notation
({001}, {10-10}, {11-20}, ...) for every Laue class. Hexagonal high/low
no longer switch the a-family label by convention: the family identity
is convention-independent, so both X||a and X||a* report {11-20}.
* Default HexConvention is now XParallelA (TSL/EDAX) across the library:
the generateIPFTriangleLegend API, PoleFigureConfiguration_t, and
CompositePoleFigureConfiguration_t. IPF colors are convention-invariant;
only the corner/pole labels and hex/trig pole positions follow the basis.
* Annotate hex/trig IPF legends with a small "Convention: X||a (TSL)"
sub-line under the title (centralized in annotateIPFImage); cubic and the
other non-hex classes are unaffected.
* PoleFigureChrome renders {hkil} family labels as parenthesized titles.
* generate_ipf_legends and render_ebsd default to X||a and print their
output directory; regenerate the shipped IPF legends as PNG (replacing
the legacy TIFF assets).
* Route PoleFigureLaueComparisonTest through GeneratePoleFigureComposite so
discrete figures use the vector-marker renderer; it pins X||a* locally to
stay aligned with the MTEX comparison script.
* Add LaueOpsTest::IPFColor_SSTCorners asserting SST-corner primaries
(red apex, green eta-min edge, blue eta-max edge) for all Laue classes,
and update the family-label assertions.
* Sync the MTEX pole-figure golden CSV and generator script family labels
to brace notation.
Signed-off-by: Michael Jackson <mike.jackson@bluequartz.net>
* Update v3_api_reference.md to v3.1.0: document the discrete vector-marker
renderer (GeneratePoleFigureComposite dispatch, DiscretePoleFigureCompositor,
DiscreteMarkerStyle, StereographicProjectUpperHemisphere, PoleFigureChrome)
and correct the now-stale v3.0 statements (conv base-virtual default,
convention-independent brace labels, struct-default flip to X||a).
* Default InversePoleFigureConfiguration_t::hexConvention to X||a for
consistency with the pole-figure config structs; IPF colors are
convention-invariant so this affects only the SST label annotation.
* Pin compare_pole_figures_all_laue.m to X||a* explicitly so the MTEX
side-by-side stays apples-to-apples with PoleFigureLaueComparisonTest.
* Note InversePoleFigureConfiguration_t in the Index.md migration list.
Signed-off-by: Michael Jackson <mike.jackson@bluequartz.net>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Release Notes — EbsdLib 3.1.0
EbsdLib 3.1 is the "discrete pole figures + TSL-by-default" release. It builds
on the 3.0 MTEX-correctness work with a new vector-marker pole-figure renderer
and a switch of the public default hexagonal/trigonal basis back to
X‖a(TSL/EDAX). The two themes:
a crisp, decimated vector marker instead of rasterizing it as pixels —
sharper figures, controllable marker size, and a hard cap on overdraw for
million-pole datasets.
X‖a(TSL) is the default convention again. 3.0 shippedX‖a*(MTEX) asthe public default; 3.1 returns the default to
X‖ato match legacy DREAM3Dand the rest of EbsdLib. The internal canonical tables are unchanged
(
X‖a*); only the default the public APIs/structs select changed.Detailed API reference:
v3_api_reference.md.Breaking changes
Default hexagonal/trigonal convention is now
X‖a(TSL)The default value of
HexConventionflipped fromXParallelAStar(3.0) toXParallelA(3.1) in every public surface that selects it:LaueOps::generateIPFTriangleLegend(...)— theconvparameter, which wasrequired in 3.0, now defaults to
ebsdlib::HexConvention::XParallelA.PoleFigureConfiguration_t::hexConvention— now defaults toXParallelA.CompositePoleFigureConfiguration_t::hexConvention— now defaults toXParallelA.Effect: hexagonal/trigonal pole-figure positions and legend/family labels
render in the TSL basis by default. IPF colors are unaffected (convention-
invariant). Callers that want the 3.0 behavior must now pass
HexConvention::XParallelAStarexplicitly (e.g. to compare side-by-side withMTEX). Cubic / tetragonal / orthorhombic / monoclinic / triclinic are unaffected.
Pole-figure family labels: brace notation, convention-independent
getDefaultPoleFigureNames()now returns plane-family brace notation —{0001},{10-10},{11-20},{001},{011},{111}, etc. — for everyLaue class, and the labels are identical under both conventions. The 3.0
behavior of switching the hexagonal a-family label (
<10-10>↔<2-1-10>) withthe convention is removed; both conventions now report
{11-20}for that family(the family identity is convention-independent; only the on-figure dot positions
rotate by 30°). Downstream code that parsed the old angle-bracket strings, or
that relied on the per-convention label switch, must update.
Rendered-figure differences
Pole figures now render +Y-up by default (
flipFinalImage), and discretefigures use the vector-marker renderer rather than per-pixel stamping. Output is
not byte-identical to 3.0. Any pixel-level exemplars pinned against 3.0 pole
figures must be regenerated.
New features
Discrete vector-marker pole figure renderer
DiscretePoleFigureCompositorrenders discrete pole figures by stampingopaque marker sprites, with a
MarkerOccupancyGridthat decimatesoverlapping markers (bounded overdraw for >1M-pole inputs).
ebsdlib::GeneratePoleFigureComposite(config)is the dispatch entry point:it routes
discrete && !discreteHeatMapfigures to the vector-markerrenderer and everything else to the raster
PoleFigureCompositor. Preferthis over calling a compositor directly.
CompositePoleFigureConfiguration_tgained aDiscreteMarkerStyle(
markerStyle.radiusFraction) to control marker size.StereographicProjectUpperHemisphere(...)projection helper.PoleFigureChromemodule.IPF legends annotate their convention
Hexagonal and trigonal IPF triangle legends now print a small
Convention: X||a (TSL)(orX||a* (MTEX/Oxford)) sub-line under the title,so a legend is self-documenting. Non-hex/trig classes are unchanged.
Apps that changed
generate_ipf_legendsX‖a; prints the absolute output directory at start/finish; regenerates the per-class legend + pole-figure matrix as PNGrender_ebsd--conventionnow defaults tox_a(TSL)Validation evidence
LaueOpsTest::IPFColor_SSTCornersasserts thestandard-stereographic-triangle corners render as pure primaries for every
Laue class: apex (
[0001]/[001]) = red, η-min edge = green, η-max edge =blue (exact primaries for cubic and hex 6/mmm; dominant-channel just inside the
edge for the wider-wedge classes, which sit on a fold boundary).
discrete figure to bound decimation cost.
PoleFigurePositionTestcontinues to passagainst the MTEX golden (
X‖a*).PoleFigureLaueComparisonTestnow routesthrough
GeneratePoleFigureComposite(vector markers) and pinsX‖a*locallyto stay aligned with its MTEX comparison script.