25 fcn::Image*
load(std::string
const & filename,
bool convertToDisplayFormat)
override
29 if (loadedSurface ==
nullptr) {
30 std::string
const msg =
"Unable to load image file: " + filename;
35 SDL_FreeSurface(loadedSurface);
37 if (surface ==
nullptr) {
38 std::string
const msg =
"Not enough memory to load: " + filename;
42 std::vector<unsigned int> packedPixels(
static_cast<size_t>(surface->w) *
static_cast<size_t>(surface->h));
43 unsigned int const * srcPixels =
static_cast<unsigned int const *
>(surface->pixels);
44 size_t const srcPitchPixels =
45 static_cast<size_t>(
static_cast<size_t>(surface->pitch) /
sizeof(
unsigned int));
47 std::span<unsigned int const>
const srcSpan(srcPixels, srcPitchPixels *
static_cast<size_t>(surface->h));
48 std::span<unsigned int>
const dstSpan(packedPixels.data(), packedPixels.size());
50 for (
int y = 0; y < surface->h; ++y) {
51 size_t const rowIndex =
static_cast<size_t>(y);
52 auto srcIt = srcSpan.begin() + (rowIndex * srcPitchPixels);
53 auto dstIt = dstSpan.begin() + (rowIndex *
static_cast<size_t>(surface->w));
54 std::copy_n(srcIt,
static_cast<size_t>(surface->w), dstIt);
58 SDL_FreeSurface(surface);