IDAT data and other PNG chunks, removing acTL, fcTL and
fdAT. It does not decode or recompress those pixels in core. This follows the
PNG static-image fallback, rather than
asking the browser to choose an animation frame.
normalizeStatusIcon returns Outcome<IconValue>. Static PNG bytes remain
identical. Removing animation metadata emits warning code
animated-icon-static, with a stable translation key and English/German text.
Invalid base64, unsupported dimensions or incomplete chunk framing return
invalid-icon; the existing limit is 131,072 base64 characters. This is bounded
structural validation and projection, not a full pixel decoder.
Saved source documents retain their original icon bytes. evaluateStatus and
compileStatusTemplate project them without modifying the document; ordinary
Java favicon output contains the static PNG only. importStatus stores the
projected icon and returns its notice. Inherited base favicons use the same
projection; unsupported inherited icons are omitted with an
invalid-inherited-icon warning, leaving the other status fields usable.
Viewer, editor, upload normalization and crop previews use the same static
pixels, including transparency. normalizeIcon also accepts image/apng and
retains its existing input-size, pixel-count and crop bounds. Conversion happens
before ImageBitmap decoding. Crop Apply remains one undoable transaction, and
source replacement/cancellation still invalidate pending uploads. No new
resource request, animation timer or reduced-motion exception is introduced:
ordinary status icons remain static with either animation preference.
Generic URLs supplied through host presentation assets are separate from status
favicon data. Hosts must supply static icon resources for a Vanilla-faithful
result; an animated custom URL does not establish native icon-animation support
and falls outside that contract. The host owns those resources. Modded clients
or protocol extensions would need a separate capability/model and verification
before animated support.
Native evidence and limits
The official 26.3 client JAR was independently SHA-1 checked ase877b6a07acd633fb3bb475002175cec036e7b87 on 2026-10-24. Its audited path is:
ServerStatus.Faviconaccepts the PNG data-URI prefix.ServerData.validateIconchecks PNG header data; finalFaviconTexture.uploadrequires 64×64 pixels.OnlineServerEntryuploads the icon when its byte content changes.NativeImage.readvalidates the PNG header and callsstbi_load_from_memoryfor one RGBA image, which is uploaded as one texture.
255,0,0,128 and a transparent corner. The browser fixture deliberately has a
blue animation, including a case where the default image is excluded from that
animation. See tests/fixtures/icons/manifest.json and
tools/reference/status-icon-probe.c for provenance and reproduction. This
decoder probe is not a complete client screen capture. No client JAR, extracted
game code or game image data is included in these fixtures or the npm package.