feat(D.5.2): IconComposer 2-stage effect composite + 5-arg GetIcon
Widen the cache key to (typeUnderlay, icon, underlay, overlay, effects). GetIcon is now a 2-stage composite mirroring retail IconData::RenderIcons (0x0058d180): Stage 1 builds the drag composite (base + overlay) and, when effects != 0, ReplaceColorWhite tints it with the effect tile's mean-opaque color (DR-1: tint SOURCE, not blit; DR-3: zero-effects black path skipped). Stage 2 blits typeUnderlay + custom underlay + drag into the final cached GL texture. Both callers updated: ToolbarController Func arity widened to 6-arg (passes item.Effects); GameWindow closure and OnLiveEntitySpawned EnrichItem call pass spawn.UiEffects. Tree builds with 0 warnings. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
3e019e408a
commit
e0dce5aa9f
4 changed files with 49 additions and 20 deletions
|
|
@ -144,4 +144,17 @@ public class IconComposerTests
|
|||
Assert.Equal(new byte[] { 255, 255, 255, 0 }, px[8..12]); // untouched
|
||||
Assert.Equal(new byte[] { 10, 20, 30, 255 }, px[12..16]); // replaced
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TwoStageWithEffect_recolorsWhiteBeforeUnderlay()
|
||||
{
|
||||
// drag = base (white pixel) over overlay (none); recolor white→blue; then over
|
||||
// an opaque tawny underlay. The white pixel must become blue in the final.
|
||||
var baseIcon = (new byte[] { 255,255,255,255 }, 1, 1); // 1x1 white opaque
|
||||
var drag = IconComposer.Compose(new[] { baseIcon });
|
||||
IconComposer.ReplaceColorWhite(drag.rgba, drag.w, drag.h, (0, 0, 255, 255)); // blue
|
||||
var underlay = (new byte[] { 105, 70, 50, 255 }, 1, 1); // tawny opaque
|
||||
var final = IconComposer.Compose(new[] { underlay, (drag.rgba, drag.w, drag.h) });
|
||||
Assert.Equal(new byte[] { 0, 0, 255, 255 }, final.rgba); // blue on top
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue