Handle RGB15BE blit

This commit is contained in:
elasota
2021-09-02 04:13:43 -04:00
parent 376fdf16c4
commit 7e3569500a
3 changed files with 28 additions and 6 deletions

View File

@@ -559,6 +559,7 @@ namespace PortabilityLayer
} }
const int componentSize = pixMapBE.m_componentSize; const int componentSize = pixMapBE.m_componentSize;
const int componentCount = pixMapBE.m_componentCount;
// We only support rect moves that are the same size // We only support rect moves that are the same size
if (srcRect.right - srcRect.left != destRect.right - destRect.left) if (srcRect.right - srcRect.left != destRect.right - destRect.left)
@@ -685,7 +686,7 @@ namespace PortabilityLayer
if (!started) if (!started)
{ {
context->Start(QDPictBlitSourceType_RGB15, params); context->Start(QDPictBlitSourceType_RGB15Native, params);
started = true; started = true;
} }
@@ -758,8 +759,14 @@ namespace PortabilityLayer
case 8: case 8:
context->Start(QDPictBlitSourceType_Indexed8Bit, params); context->Start(QDPictBlitSourceType_Indexed8Bit, params);
break; break;
case 5:
if (componentCount == 3)
context->Start(QDPictBlitSourceType_RGB15BE, params);
else
return 52;
break;
default: default:
return 52; // ??? return 53; // ???
} }
started = true; started = true;
@@ -768,14 +775,14 @@ namespace PortabilityLayer
context->BlitScanlineAndAdvance(decompressedScanlineBuffer); context->BlitScanlineAndAdvance(decompressedScanlineBuffer);
} }
else else
return 53; return 54;
} }
// Either undocumented behavior or non-compliant PICT resources, not sure // Either undocumented behavior or non-compliant PICT resources, not sure
if (isPixMap && (stream->Tell() & 1) != 0) if (isPixMap && (stream->Tell() & 1) != 0)
{ {
if (!stream->SeekCurrent(1)) if (!stream->SeekCurrent(1))
return 54; return 55;
} }
return 0; return 0;

View File

@@ -18,7 +18,8 @@ namespace PortabilityLayer
QDPictBlitSourceType_Indexed2Bit, QDPictBlitSourceType_Indexed2Bit,
QDPictBlitSourceType_Indexed4Bit, QDPictBlitSourceType_Indexed4Bit,
QDPictBlitSourceType_Indexed8Bit, QDPictBlitSourceType_Indexed8Bit,
QDPictBlitSourceType_RGB15, QDPictBlitSourceType_RGB15Native,
QDPictBlitSourceType_RGB15BE,
QDPictBlitSourceType_RGB24_Interleaved, QDPictBlitSourceType_RGB24_Interleaved,
QDPictBlitSourceType_RGB24_Multiplane, QDPictBlitSourceType_RGB24_Multiplane,
}; };

View File

@@ -624,7 +624,7 @@ void BMPDumperContext::BlitScanlineAndAdvance(const void *scanlineData)
outRowStart[i] = m_blitParams.m_colors[colorIndex]; outRowStart[i] = m_blitParams.m_colors[colorIndex];
} }
break; break;
case PortabilityLayer::QDPictBlitSourceType_RGB15: case PortabilityLayer::QDPictBlitSourceType_RGB15Native:
for (size_t i = 0; i < rowSize; i++) for (size_t i = 0; i < rowSize; i++)
{ {
const size_t originCol = i + firstSrcCol; const size_t originCol = i + firstSrcCol;
@@ -637,6 +637,20 @@ void BMPDumperContext::BlitScanlineAndAdvance(const void *scanlineData)
outputItem.a = 255; outputItem.a = 255;
} }
break; break;
case PortabilityLayer::QDPictBlitSourceType_RGB15BE:
for (size_t i = 0; i < rowSize; i++)
{
const size_t originCol = i + firstSrcCol;
const uint8_t *itemBytes = (scanlineBytes + originCol * 2);
const uint16_t item = static_cast<uint16_t>((itemBytes[0] << 8) | itemBytes[1]);
PortabilityLayer::RGBAColor &outputItem = outRowStart[i];
outputItem.b = FiveToEight(item & 0x1f);
outputItem.g = FiveToEight((item >> 5) & 0x1f);
outputItem.r = FiveToEight((item >> 10) & 0x1f);
outputItem.a = 255;
}
break;
case PortabilityLayer::QDPictBlitSourceType_RGB24_Interleaved: case PortabilityLayer::QDPictBlitSourceType_RGB24_Interleaved:
for (size_t i = 0; i < rowSize; i++) for (size_t i = 0; i < rowSize; i++)
{ {