mirror of https://github.com/bsnes-emu/bsnes.git
99 lines
2.7 KiB
C++
99 lines
2.7 KiB
C++
#ifndef NALL_IMAGE_LOAD_HPP
|
|
#define NALL_IMAGE_LOAD_HPP
|
|
|
|
namespace nall {
|
|
|
|
bool image::loadBMP(const string& filename) {
|
|
uint32_t* outputData;
|
|
unsigned outputWidth, outputHeight;
|
|
if(bmp::read(filename, outputData, outputWidth, outputHeight) == false) return false;
|
|
|
|
allocate(outputWidth, outputHeight);
|
|
const uint32_t* sp = outputData;
|
|
uint8_t* dp = data;
|
|
|
|
for(unsigned y = 0; y < outputHeight; y++) {
|
|
for(unsigned x = 0; x < outputWidth; x++) {
|
|
uint32_t color = *sp++;
|
|
uint64_t a = normalize((uint8_t)(color >> 24), 8, alpha.depth);
|
|
uint64_t r = normalize((uint8_t)(color >> 16), 8, red.depth);
|
|
uint64_t g = normalize((uint8_t)(color >> 8), 8, green.depth);
|
|
uint64_t b = normalize((uint8_t)(color >> 0), 8, blue.depth);
|
|
write(dp, (a << alpha.shift) | (r << red.shift) | (g << green.shift) | (b << blue.shift));
|
|
dp += stride;
|
|
}
|
|
}
|
|
|
|
delete[] outputData;
|
|
return true;
|
|
}
|
|
|
|
bool image::loadPNG(const string& filename) {
|
|
if(!file::exists(filename)) return false;
|
|
auto buffer = file::read(filename);
|
|
return loadPNG(buffer.data(), buffer.size());
|
|
}
|
|
|
|
bool image::loadPNG(const uint8_t* pngData, unsigned pngSize) {
|
|
Decode::PNG source;
|
|
if(source.decode(pngData, pngSize) == false) return false;
|
|
|
|
allocate(source.info.width, source.info.height);
|
|
const uint8_t* sp = source.data;
|
|
uint8_t* dp = data;
|
|
|
|
auto decode = [&]() -> uint64_t {
|
|
uint64_t p, r, g, b, a;
|
|
|
|
switch(source.info.colorType) {
|
|
case 0: //L
|
|
r = g = b = source.readbits(sp);
|
|
a = (1 << source.info.bitDepth) - 1;
|
|
break;
|
|
case 2: //R,G,B
|
|
r = source.readbits(sp);
|
|
g = source.readbits(sp);
|
|
b = source.readbits(sp);
|
|
a = (1 << source.info.bitDepth) - 1;
|
|
break;
|
|
case 3: //P
|
|
p = source.readbits(sp);
|
|
r = source.info.palette[p][0];
|
|
g = source.info.palette[p][1];
|
|
b = source.info.palette[p][2];
|
|
a = (1 << source.info.bitDepth) - 1;
|
|
break;
|
|
case 4: //L,A
|
|
r = g = b = source.readbits(sp);
|
|
a = source.readbits(sp);
|
|
break;
|
|
case 6: //R,G,B,A
|
|
r = source.readbits(sp);
|
|
g = source.readbits(sp);
|
|
b = source.readbits(sp);
|
|
a = source.readbits(sp);
|
|
break;
|
|
}
|
|
|
|
a = normalize(a, source.info.bitDepth, alpha.depth);
|
|
r = normalize(r, source.info.bitDepth, red.depth);
|
|
g = normalize(g, source.info.bitDepth, green.depth);
|
|
b = normalize(b, source.info.bitDepth, blue.depth);
|
|
|
|
return (a << alpha.shift) | (r << red.shift) | (g << green.shift) | (b << blue.shift);
|
|
};
|
|
|
|
for(unsigned y = 0; y < height; y++) {
|
|
for(unsigned x = 0; x < width; x++) {
|
|
write(dp, decode());
|
|
dp += stride;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|