#pragma once #include #include #include #include "ObjectAttribute.h" namespace EightBit { class Ram; namespace GameBoy { class AbstractColourPalette; class CharacterDefinition; class Bus; class Display final { public: enum { BufferWidth = 256, BufferHeight = 256, BufferCharacterWidth = BufferWidth / 8, BufferCharacterHeight = BufferHeight / 8, RasterWidth = 160, RasterHeight = 144, }; Display(const AbstractColourPalette* colours, Bus& bus, Ram& oam, Ram& vram); const std::vector& pixels() const; void initialise(); void render(); void loadObjectAttributes(); private: std::vector m_pixels; Bus& m_bus; Ram& m_oam; Ram& m_vram; const AbstractColourPalette* m_colours; std::array m_objectAttributes; uint8_t m_control = 0; uint8_t m_scanLine = 0; std::array createPalette(int address); void renderBackground(); void renderBackground( int bgArea, int bgCharacters, int offsetX, int offsetY, const std::array& palette); void renderObjects(); void renderTile( int height, int drawX, int drawY, bool flipX, bool flipY, bool allowTransparencies, const std::array& palette, const CharacterDefinition& definition); }; } }