271. Acceso a píxeles del framebuffer

Añadir ayudantes sencillos de acceso a píxeles del framebuffer.

Lección 271 de 356 · tests/chapter_05_rendering_pipeline/test_271_framebuffer_pixel_access.py

Archivo a actualizar

emulator/rendering/framebuffer.py

Por qué existe este paso

El framebuffer ahora almacena una lista plana de píxeles RGB. El código de renderizado no debería tener que repetir la fórmula de índice plano en todas partes, así que Framebuffer expone dos pequeños ayudantes:

get_pixel(x, y) -> RGBColor
set_pixel(x, y, color) -> None

¿Qué es la indexación plana de píxeles? La indexación plana almacena coordenadas de imagen 2D en una lista 1D.

Fórmula

index = y * width + x

Ejemplo mínimo con width = 4:

(x=0, y=0) -> index 0
(x=1, y=0) -> index 1
(x=0, y=1) -> index 4
(x=2, y=1) -> index 6

Ejemplo de implementación sugerida

class Framebuffer:
    ...

    def get_pixel(self, x: int, y: int) -> RGBColor:
        return self.pixels[y * self.width + x]

    def set_pixel(self, x: int, y: int, color: RGBColor) -> None:
        self.pixels[y * self.width + x] = color

Simplificación importante

Este paso del tutorial mantiene intencionadamente los ayudantes pequeños. En el futuro podemos añadir validación para:

x/y out of bounds
negative coordinates
RGB tuple length
RGB component byte range 0-255

Por ahora, los tests usan únicamente coordenadas válidas y colores RGB válidos.

Fuera de alcance

  • validación de coordenadas
  • validación de RGB
  • búsqueda en paleta
  • renderizado de tablas de patrones
  • renderizado de nametables
  • pantalla de pygame

Ejecutar esta lección

uv run pytest tests/chapter_05_rendering_pipeline/test_271_framebuffer_pixel_access.py -v