mirror of
https://github.com/libretro/scummvm.git
synced 2025-01-11 20:26:31 +00:00
GRAPHICS: Add support for true 32bpp DirectBits images
This commit is contained in:
parent
23c7b9f0dc
commit
ec67dfae30
@ -331,7 +331,7 @@ void PictDecoder::unpackBitsRect(Common::SeekableReadStream *stream, bool hasPal
|
|||||||
if (packBitsData.pixMap.pixelSize <= 8)
|
if (packBitsData.pixMap.pixelSize <= 8)
|
||||||
bytesPerPixel = 1;
|
bytesPerPixel = 1;
|
||||||
else if (packBitsData.pixMap.pixelSize == 32)
|
else if (packBitsData.pixMap.pixelSize == 32)
|
||||||
bytesPerPixel = 3;
|
bytesPerPixel = packBitsData.pixMap.cmpCount;
|
||||||
else
|
else
|
||||||
bytesPerPixel = packBitsData.pixMap.pixelSize / 8;
|
bytesPerPixel = packBitsData.pixMap.pixelSize / 8;
|
||||||
|
|
||||||
@ -357,10 +357,12 @@ void PictDecoder::unpackBitsRect(Common::SeekableReadStream *stream, bool hasPal
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bytesPerPixel == 1) {
|
switch (bytesPerPixel) {
|
||||||
|
case 1:
|
||||||
// Just copy to the image
|
// Just copy to the image
|
||||||
memcpy(_outputSurface->pixels, buffer, _outputSurface->w * _outputSurface->h);
|
memcpy(_outputSurface->pixels, buffer, _outputSurface->w * _outputSurface->h);
|
||||||
} else if (bytesPerPixel == 2) {
|
break;
|
||||||
|
case 2:
|
||||||
// Convert from 16-bit to whatever surface we need
|
// Convert from 16-bit to whatever surface we need
|
||||||
for (uint16 y = 0; y < _outputSurface->h; y++) {
|
for (uint16 y = 0; y < _outputSurface->h; y++) {
|
||||||
for (uint16 x = 0; x < _outputSurface->w; x++) {
|
for (uint16 x = 0; x < _outputSurface->w; x++) {
|
||||||
@ -373,7 +375,8 @@ void PictDecoder::unpackBitsRect(Common::SeekableReadStream *stream, bool hasPal
|
|||||||
*((uint32 *)_outputSurface->getBasePtr(x, y)) = _pixelFormat.RGBToColor(r, g, b);
|
*((uint32 *)_outputSurface->getBasePtr(x, y)) = _pixelFormat.RGBToColor(r, g, b);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
break;
|
||||||
|
case 3:
|
||||||
// Convert from 24-bit (planar!) to whatever surface we need
|
// Convert from 24-bit (planar!) to whatever surface we need
|
||||||
for (uint16 y = 0; y < _outputSurface->h; y++) {
|
for (uint16 y = 0; y < _outputSurface->h; y++) {
|
||||||
for (uint16 x = 0; x < _outputSurface->w; x++) {
|
for (uint16 x = 0; x < _outputSurface->w; x++) {
|
||||||
@ -386,6 +389,22 @@ void PictDecoder::unpackBitsRect(Common::SeekableReadStream *stream, bool hasPal
|
|||||||
*((uint32 *)_outputSurface->getBasePtr(x, y)) = _pixelFormat.RGBToColor(r, g, b);
|
*((uint32 *)_outputSurface->getBasePtr(x, y)) = _pixelFormat.RGBToColor(r, g, b);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
// Convert from 32-bit (planar!) to whatever surface we need
|
||||||
|
for (uint16 y = 0; y < _outputSurface->h; y++) {
|
||||||
|
for (uint16 x = 0; x < _outputSurface->w; x++) {
|
||||||
|
byte r = *(buffer + y * _outputSurface->w * 4 + x);
|
||||||
|
byte g = *(buffer + y * _outputSurface->w * 4 + _outputSurface->w + x);
|
||||||
|
byte b = *(buffer + y * _outputSurface->w * 4 + _outputSurface->w * 2 + x);
|
||||||
|
byte a = *(buffer + y * _outputSurface->w * 4 + _outputSurface->w * 3 + x);
|
||||||
|
if (_pixelFormat.bytesPerPixel == 2)
|
||||||
|
*((uint16 *)_outputSurface->getBasePtr(x, y)) = _pixelFormat.ARGBToColor(r, g, b, a);
|
||||||
|
else
|
||||||
|
*((uint32 *)_outputSurface->getBasePtr(x, y)) = _pixelFormat.ARGBToColor(r, g, b, a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
delete[] buffer;
|
delete[] buffer;
|
||||||
@ -421,7 +440,7 @@ void PictDecoder::unpackBitsLine(byte *out, uint32 length, Common::SeekableReadS
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// HACK: rowBytes is in 32-bit, but the data is 24-bit...
|
// HACK: Even if the data is 24-bit, rowBytes is still 32-bit
|
||||||
if (bytesPerPixel == 3)
|
if (bytesPerPixel == 3)
|
||||||
dataDecoded += length / 4;
|
dataDecoded += length / 4;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user