6#ifndef SPRITECONVERTER_HH
7#define SPRITECONVERTER_HH
21template<std::
unsigned_
integral Pixel>
34 std::span<const Pixel, 16> pal)
35 : spriteChecker(spriteChecker_)
45 transparency = enabled;
69 int before = minX - x;
85 auto mask = narrow_cast<int>(0x80000000);
86 pattern &= (mask >> (after - 1));
98 void drawMode1(
int absLine,
int minX,
int maxX, std::span<Pixel> pixelPtr)
101 auto visibleSprites = spriteChecker.
getSprites(absLine);
104 if (visibleSprites.empty())
return;
109 Pixel colIndex = si.colorAttrib & 0x0F;
113 if (colIndex == 0 && transparency)
continue;
114 Pixel color = palette[colIndex];
118 if (!
clipPattern(x, pattern, minX, maxX))
continue;
120 Pixel* p = &pixelPtr[x];
123 if (pattern & 0x80000000) {
143 template<
unsigned MODE>
144 void drawMode2(
int absLine,
int minX,
int maxX, std::span<Pixel> pixelPtr)
147 auto visibleSprites = spriteChecker.
getSprites(absLine);
150 if (visibleSprites.empty())
return;
151 std::span visibleSpritesWithSentinel{visibleSprites.data(),
152 visibleSprites.size() +1};
158 if ((visibleSprites[first].colorAttrib & 0x40) == 0) [[likely]] {
162 }
while (first <
int(visibleSprites.size()));
163 for (
int i = narrow<int>(visibleSprites.size() - 1); i >= first; --i) {
168 if (!
clipPattern(x, pattern, minX, maxX))
continue;
170 if (c == 0 && transparency)
continue;
172 if (pattern & 0x80000000) {
175 for (
int j = i + 1; ; ++j) {
177 visibleSpritesWithSentinel[j];
179 unsigned shift2 = x - info2.
x;
181 ((info2.
pattern << shift2) & 0x80000000)) {
186 Pixel pixL = palette[color >> 2];
187 Pixel pixR = palette[color & 3];
188 pixelPtr[x * 2 + 0] = pixL;
189 pixelPtr[x * 2 + 1] = pixR;
191 Pixel pix = palette[color];
193 pixelPtr[x * 2 + 0] = pix;
194 pixelPtr[x * 2 + 1] = pix;
211 std::span<const Pixel, 16> palette;
Represents a VDP display mode.
uint32_t SpritePattern
Bitmap of length 32 describing a sprite pattern.
std::span< const SpriteInfo > getSprites(int line) const
Get sprites for a display line.
Utility class for converting VRAM contents to host pixels.
SpriteConverter(SpriteChecker &spriteChecker_, std::span< const Pixel, 16 > pal)
Constructor.
void drawMode2(int absLine, int minX, int maxX, std::span< Pixel > pixelPtr)
Draw sprites in sprite mode 2.
void setPalette(std::span< const Pixel, 16 > newPalette)
Set palette to use for converting sprites.
void drawMode1(int absLine, int minX, int maxX, std::span< Pixel > pixelPtr)
Draw sprites in sprite mode 1.
void setTransparency(bool enabled)
Update the transparency setting.
void setDisplayMode(DisplayMode newMode)
Notify SpriteConverter of a display mode change.
static bool clipPattern(int &x, SpriteChecker::SpritePattern &pattern, int minX, int maxX)
This file implemented 3 utility functions:
constexpr auto reverse(Range &&range)
Contains all the information to draw a line of a sprite.
SpritePattern pattern
Pattern of this sprite line, corrected for magnification.
byte colorAttrib
Bit 3..0 are index in palette.
int16_t x
X-coordinate of sprite, corrected for early clock.