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

View File

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

View File

@@ -624,7 +624,7 @@ void BMPDumperContext::BlitScanlineAndAdvance(const void *scanlineData)
outRowStart[i] = m_blitParams.m_colors[colorIndex];
}
break;
case PortabilityLayer::QDPictBlitSourceType_RGB15:
case PortabilityLayer::QDPictBlitSourceType_RGB15Native:
for (size_t i = 0; i < rowSize; i++)
{
const size_t originCol = i + firstSrcCol;
@@ -637,6 +637,20 @@ void BMPDumperContext::BlitScanlineAndAdvance(const void *scanlineData)
outputItem.a = 255;
}
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:
for (size_t i = 0; i < rowSize; i++)
{