NES TDD

271. Доступ к пикселям фреймбуфера

Добавление простых вспомогательных функций доступа к пикселям фреймбуфера.

Урок 271 из 356 · tests/chapter_05_rendering_pipeline/test_271_framebuffer_pixel_access.py

Файл для обновления

emulator/rendering/framebuffer.py

Почему этот шаг важен

Теперь фреймбуфер хранит плоский список RGB-пикселей. Код рендеринга не должен всюду повторять формулу плоского индекса, поэтому Framebuffer предоставляет два небольших вспомогательных метода:

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

Что такое плоское индексирование пикселей? Плоское индексирование хранит 2D-координаты изображения в 1D-списке.

Формула

index = y * width + x

Минимальный пример при 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

Пример возможной реализации

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

Важное упрощение

Этот шаг курса намеренно оставляет вспомогательные методы небольшими. В будущем можно добавить проверку для:

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

Пока тесты используют только допустимые координаты и допустимые RGB-цвета.

Вне рамок этого шага

  • проверка координат
  • проверка RGB
  • поиск в палитре
  • рендеринг таблиц шаблонов
  • рендеринг таблиц имён
  • отображение через pygame

Запустить этот урок

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