IMX6U-Game/src/Rasterizer/SpriteRasterizer.cpp

46 lines
1.1 KiB
C++

#include "SpriteRasterizer.h"
#include "FrameBuffer.h"
#include "../RenderData/Image.h"
#include "../RenderData/Sprite.h"
namespace Rasterizer
{
void SpriteRasterizer::DrawImage(const RenderData::Image& image, int32_t x, int32_t y)
{
DrawSprite(RenderData::Sprite(&image), x, y);
}
void SpriteRasterizer::DrawSprite(const RenderData::Sprite& sprite, int32_t x, int32_t y)
{
if (frameBuffer == nullptr || !sprite.is_valid())
{
return;
}
const int32_t minX = x < 0 ? -x : 0;
const int32_t minY = y < 0 ? -y : 0;
const int32_t maxX = x + sprite.width > frameBuffer->get_width() ? frameBuffer->get_width() - x : sprite.width;
const int32_t maxY = y + sprite.height > frameBuffer->get_height() ? frameBuffer->get_height() - y : sprite.height;
if (minX >= maxX || minY >= maxY)
{
return;
}
for (int32_t sy = minY; sy < maxY; ++sy)
{
for (int32_t sx = minX; sx < maxX; ++sx)
{
const uint32_t color = sprite.get_pixel_fast(sx, sy);
const uint8_t alpha = static_cast<uint8_t>(color & 0xFF);
if (alpha == 0)
{
continue;
}
frameBuffer->set_pixel(x + sx, y + sy, color);
}
}
}
}