- DUP-01: les tres branques del switch d'extensions que saltaven el
mateix (bloc fix + sub-blocs) es substitueixen per una crida a
skipExtensionBlock(); com que totes les extensions comparteixen
layout, el switch desapareix i el codi es redueix a una línia.
- DUP-06: el constructor Surface(file_path) llegia el fitxer dues
voltes (una via loadSurface per pixels i una altra via
loadPaletteFromGif per la paleta); ara carrega el buffer una sola
vegada i n'extrau pixels + paleta en passades separades sobre la
memòria. Surface::loadSurface passa a no existir públicament (no
tenia callers externs).
- HC-03: les màscares i talls màgics del decoder LZW i del Screen
Descriptor passen a constants nominals (LZW_MIN/MAX_CODE_LENGTH,
LZW_MASK_INITIAL, LZW_MASK_OVERFLOW, SCREEN_GCT_FLAG,
SCREEN_GCT_SIZE_MASK, GCT_BYTES_PER_ENTRY).
- HC-10: processImageDescriptor tenia gct i resolution_bits
[[maybe_unused]] vestigials; se'n treu la signatura. L'struct RGB,
que només servia per a aquests args, també s'elimina.
- PATCH-05: el comentari "reemplaçar macro READ" (migració parcial des
de C) passa a ser un comentari neutre sobre el que fa readBytes.
Build + smoke 5s xvfb OK (exit 124).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Surface::renderWithColorReplace usava Screen::get().getCanvasArgb() i
companys per a obtenir el buffer destí. S'introdueix una abstracció
mínima:
- source/core/rendering/canvas.hpp: struct Canvas amb pixels/width/
height i la fàbrica activeCanvas() que retorna el canvas actiu.
- source/core/rendering/canvas.cpp: implementació que delega a Screen.
Surface ara inclou canvas.hpp en lloc de screen.hpp i crida
Rendering::activeCanvas(). L'indirecció permet, més endavant, empènyer
canvases alternatius (off-screen, efectes) sense tocar Surface; ara
mateix es comporta idèntic al codi anterior.
Build + smoke 5s xvfb OK (exit 124).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Surface::render i Surface::renderWithColorReplace compartien ~30 línies
del bucle de blit (clipping, flip, transparent check, escriptura ARGB) i
només diferien en l'ARGB final. Ara render() delega a la versió amb
remap passant source==target==transparent_color_: qualsevol píxel opac
té COLOR != source_color (els transparents ja s'han filtrat), per tant
REMAPPED == sub_palette_[COLOR] — resultat idèntic al path original.
Verificat amb make build + smoke test de 5s sota xvfb-run (exit 124 =
timeout sencer, sense crash).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>