diff --git a/PortabilityLayer/QDPictDecoder.cpp b/PortabilityLayer/QDPictDecoder.cpp index 7b15b97..e72d72d 100644 --- a/PortabilityLayer/QDPictDecoder.cpp +++ b/PortabilityLayer/QDPictDecoder.cpp @@ -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; diff --git a/PortabilityLayer/QDPictEmitContext.h b/PortabilityLayer/QDPictEmitContext.h index 6d33b26..62c9ef1 100644 --- a/PortabilityLayer/QDPictEmitContext.h +++ b/PortabilityLayer/QDPictEmitContext.h @@ -18,7 +18,8 @@ namespace PortabilityLayer QDPictBlitSourceType_Indexed2Bit, QDPictBlitSourceType_Indexed4Bit, QDPictBlitSourceType_Indexed8Bit, - QDPictBlitSourceType_RGB15, + QDPictBlitSourceType_RGB15Native, + QDPictBlitSourceType_RGB15BE, QDPictBlitSourceType_RGB24_Interleaved, QDPictBlitSourceType_RGB24_Multiplane, }; diff --git a/gpr2gpa/gpr2gpa.cpp b/gpr2gpa/gpr2gpa.cpp index 2905158..beb64c1 100644 --- a/gpr2gpa/gpr2gpa.cpp +++ b/gpr2gpa/gpr2gpa.cpp @@ -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((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++) {