refactor(core/rendering): deduplicar Surface::render via delegació (DUP-02)
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>
This commit is contained in:
1 parent
9395520a23
commit
d479475dcf
2 files changed
+9
-29
No files matched your search
@@ -78,32 +78,11 @@ auto Surface::getPixel(int x, int y) const -> Uint8 {
|
||||
}
|
||||
|
||||
void Surface::render(int x, int y, const SDL_FRect* src_rect, SDL_FlipMode flip) const {
|
||||
Uint32* dst = Screen::get().getCanvasArgb();
|
||||
const int DST_W = Screen::get().getCanvasWidth();
|
||||
const int DST_H = Screen::get().getCanvasHeight();
|
||||
|
||||
const int SX = (src_rect != nullptr) ? static_cast<int>(src_rect->x) : 0;
|
||||
const int SY = (src_rect != nullptr) ? static_cast<int>(src_rect->y) : 0;
|
||||
int sw = (src_rect != nullptr) ? static_cast<int>(src_rect->w) : surface_data_->width;
|
||||
int sh = (src_rect != nullptr) ? static_cast<int>(src_rect->h) : surface_data_->height;
|
||||
|
||||
sw = std::min(sw, surface_data_->width - SX);
|
||||
sh = std::min(sh, surface_data_->height - SY);
|
||||
|
||||
const Uint8* src = surface_data_->data.get();
|
||||
for (int iy = 0; iy < sh; ++iy) {
|
||||
for (int ix = 0; ix < sw; ++ix) {
|
||||
const int SRC_X = (flip == SDL_FLIP_HORIZONTAL) ? (SX + sw - 1 - ix) : (SX + ix);
|
||||
const int SRC_Y = (flip == SDL_FLIP_VERTICAL) ? (SY + sh - 1 - iy) : (SY + iy);
|
||||
const int DST_X = x + ix;
|
||||
const int DST_Y = y + iy;
|
||||
if (DST_X < 0 || DST_X >= DST_W || DST_Y < 0 || DST_Y >= DST_H) { continue; }
|
||||
|
||||
const Uint8 COLOR = src[SRC_X + (SRC_Y * surface_data_->width)];
|
||||
if (COLOR == transparent_color_) { continue; }
|
||||
dst[DST_X + (DST_Y * DST_W)] = palette_[sub_palette_[COLOR]];
|
||||
}
|
||||
}
|
||||
// Delegem a la versió amb remap: fent source==target==transparent_color_,
|
||||
// qualsevol píxel opaC tindrà COLOR != source_color (els transparents ja
|
||||
// s'han filtrat), així que REMAPPED = sub_palette_[COLOR] — idèntic al
|
||||
// camí sense remap. Això evita duplicar el bucle de blit.
|
||||
renderWithColorReplace(x, y, transparent_color_, transparent_color_, src_rect, flip);
|
||||
}
|
||||
|
||||
void Surface::renderWithColorReplace(int x, int y, Uint8 source_color, Uint8 target_color, const SDL_FRect* src_rect, SDL_FlipMode flip) const {
|
||||
|
||||
Reference in new issue
Block a user