BlueQuartzSoftware / BlueQuartzSoftware/EbsdLib

IPF gridded legend rendering: PUCM produces sub-pixel edge artifacts not seen in TSL/NH

Open
#47 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
C++
Stars
8
Forks
13
Avg merge
1d 17h
Merged PRs (30d)
3

Description

# IPF gridded legend rendering: PUCM produces sub-pixel edge artifacts not seen in TSL/NH

> Draft GitHub issue body. Issues are disabled on `imikejackson/EbsdLib`;
> enable them and paste this, or file under a different repo, or convert
> to a TODO in the v3.1 plan.

## Summary

When `generate_ipf_legends` (or `LaueOps::generateIPFTriangleLegend(...,
gridded=true)`) is called with `ColorKeyKind::PUCM`, the resulting
gridded SST legends contain visible **sub-pixel white/dark dot
artifacts** along SST boundaries on most Laue classes (cubic m-3m,
cubic m-3, hex 6/m, tetragonal 4/m, trigonal -3m, trigonal -3,
monoclinic 2/m). TSL and NH gridded legends from the same code path
are artifact-free.

Sample affected outputs (after running
`Bin/generate_ipf_legends` and viewing
`Testing/Temporary/IPF_Legend//_PUCM_GRIDDED.png`):

- Cubic m-3m: ~4 single-pixel white dots along the [001]–[011] edge of
the SST, evenly spaced.
- Trigonal -3m: 2 single-pixel dark dots in the upper portion of the
kite SST.
- Tetragonal 4/m, Cubic m-3, Hex 6/m: pixel-level artifacts in the
"Discontinuous Colors" SST extensions.

## Root cause investigation (from the v3.0 release Phase 4.5 sweep)

The artifacts come from the inner PUCM key (wlenthe's
`dispatchPucm(group, direction)`) returning near-white/near-black
"singular" colors for certain `(eta, chi)` cell-center directions that
are well INSIDE the SST's angleLimits rectangle. The three existing
gridded fixes — `b3aafc4` (chi-clamp), `89aca99` (no-push-outside-SST),
`2c20533` (route 3-arg through inner key) — all live in
`GriddedColorKey` and are key-agnostic, so they're already applied to
PUCM via the shared decorator. But:

- TSL's closed-form `r = 1 − chi/chiMax` is smooth at the SST boundary;
no singularities.
- NH's `FundamentalSectorGeometry::polarCoordinates` clamps radius to
`[0, 1]` and produces graceful colors at boundaries.
- PUCM's `direction2Color(eta, chi, angleLimits)` ignores `angleLimits`
entirely (line 131 of `PUCMColorKey.cpp`: `(void)angleLimits;`),
converts `(eta, chi)` → Vec3, and hands off to wlenthe. wlenthe has
its own per-Laue-class FZ check and produces near-singular colors at
certain `(eta, chi)` cell-centers that fall just outside its
fundamental sector.

Attempted no-API-change fix (fall back to unsnapped `(eta, chi)` when
the chi clamp triggers): tested in the v3.0 prep, **did not eliminate
the visible dots**. The problematic cell-centers are inside the
angleLimits rectangle but outside wlenthe's actual SST shape
(curved [011]–[111] arc on cubic m-3m, etc.).

## Suggested fix (post-v3.0)

Add an `isInSST(const Vec3& direction)` virtual to `IColorKey` with a
`return true` default. Override in `PUCMColorKey` to call wlenthe's FZ
check (whatever PUCM uses internally — needs to be lifted to the
public API). In `GriddedColorKey::direction2Color(eta, chi, ...)`,
after snapping, reconstruct the direction and test
`m_InnerKey->isInSST(snappedDir)`. If false, fall back to the
unsnapped `(eta, chi)`.

Scope:

- ~20 lines + 1 new virtual on `IColorKey` (non-breaking; existing
inner keys outside EbsdLib compile unchanged).
- `PUCMColorKey` gets the only non-default implementation.
- TSL and NH inherit the default and are unaffected.

## Why this was deferred from v3.0

- Per-pixel IPF maps (`make_ipf`, `render_ebsd`,
`WritePoleFigureFilter`'s IPF outputs) do NOT go through
`GriddedColorKey`. They compute color per pixel directly. So the
artifacts only affect the **legend** rendering, not the IPF map.
- The artifacts are 1–2 pixels on a 1024–2000 px legend canvas — only
visible when zoomed into SST boundaries.
- The v3.0 release notes already characterize PUCM as a verbatim
wlenthe port. "wlenthe's edge behavior shows on our 1° grid" is
defensibly a wlenthe characteristic.

## References

- `Source/EbsdLib/Utilities/GriddedColorKey.cpp` — the gridded decorator
(where the eventual fix would land, plus the existing chi-clamp at
lines 107–114).
- `Source/EbsdLib/Utilities/PUCMColorKey.cpp` — PUCM's wlenthe dispatch
(line 121–135). `direction2Color(eta, chi, angleLimits)` currently
ignores `angleLimits`.
- `Source/EbsdLib/Utilities/IColorKey.hpp` — the base class that would
gain the `isInSST` virtual.
- Prior NH-era fixes: commits `b3aafc4`, `89aca99`, `2c20533`. These
apply to all inner keys but don't cover wlenthe's interior
singularities.

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.