Working up to start of menu loading

This commit is contained in:
elasota
2019-12-12 23:37:40 -05:00
parent f7335a2c8b
commit c9c6976344
35 changed files with 1316 additions and 398 deletions

View File

@@ -992,103 +992,103 @@ void AuditPackBitsRect(MemReaderStream &stream, int pictVersion, bool isPackedFl
class PictDumpEmitContext final : public QDPictEmitContext
{
public:
bool SpecifyFrame(const Rect &rect) override
{
m_rect = rect;
m_width = rect.right - rect.left;
m_height = rect.bottom - rect.top;
m_image.resize(m_width * m_height);
return true;
}
Rect ConstrainRegion(const Rect &rect) const override
{
return rect.Intersect(m_rect);
}
void Start(QDPictBlitSourceType sourceType, const QDPictEmitScanlineParameters &params) override
{
m_blitType = sourceType;
m_params = params;
m_constraintRegionWidth = params.m_constrainedRegionRight - params.m_constrainedRegionLeft;
m_constraintRegionStartIndex = params.m_constrainedRegionLeft - params.m_scanlineOriginX;
m_constraintRegionEndIndex = params.m_constrainedRegionRight - params.m_scanlineOriginX;
const size_t firstCol = params.m_constrainedRegionLeft - m_rect.left;
const size_t firstRow = params.m_firstY - m_rect.top;
m_outputIndexStart = firstRow * m_width + firstCol;
}
void BlitScanlineAndAdvance(const void *data) override
{
const int32_t crRight = m_params.m_constrainedRegionRight;
const int32_t crLeft = m_params.m_constrainedRegionLeft;
const size_t constraintRegionStartIndex = m_constraintRegionStartIndex;
const uint8_t *dataBytes = static_cast<const uint8_t*>(data);
const size_t outputIndexStart = m_outputIndexStart;
const RGBAColor *palette = m_params.m_colors;
const size_t planarSeparation = m_params.m_planarSeparation;
static const RGBAColor bwColors[] =
{
{ 255, 255, 255, 255 },
{ 0, 0, 0, 255 }
};
switch (m_blitType)
{
case QDPictBlitSourceType_Indexed1Bit:
for (size_t i = 0; i < m_constraintRegionWidth; i++)
{
bool SpecifyFrame(const Rect &rect) override
{
m_rect = rect;
m_width = rect.right - rect.left;
m_height = rect.bottom - rect.top;
m_image.resize(m_width * m_height);
return true;
}
Rect ConstrainRegion(const Rect &rect) const override
{
return rect.Intersect(m_rect);
}
void Start(QDPictBlitSourceType sourceType, const QDPictEmitScanlineParameters &params) override
{
m_blitType = sourceType;
m_params = params;
m_constraintRegionWidth = params.m_constrainedRegionRight - params.m_constrainedRegionLeft;
m_constraintRegionStartIndex = params.m_constrainedRegionLeft - params.m_scanlineOriginX;
m_constraintRegionEndIndex = params.m_constrainedRegionRight - params.m_scanlineOriginX;
const size_t firstCol = params.m_constrainedRegionLeft - m_rect.left;
const size_t firstRow = params.m_firstY - m_rect.top;
m_outputIndexStart = firstRow * m_width + firstCol;
}
void BlitScanlineAndAdvance(const void *data) override
{
const int32_t crRight = m_params.m_constrainedRegionRight;
const int32_t crLeft = m_params.m_constrainedRegionLeft;
const size_t constraintRegionStartIndex = m_constraintRegionStartIndex;
const uint8_t *dataBytes = static_cast<const uint8_t*>(data);
const size_t outputIndexStart = m_outputIndexStart;
const RGBAColor *palette = m_params.m_colors;
const size_t planarSeparation = m_params.m_planarSeparation;
static const RGBAColor bwColors[] =
{
{ 255, 255, 255, 255 },
{ 0, 0, 0, 255 }
};
switch (m_blitType)
{
case QDPictBlitSourceType_Indexed1Bit:
for (size_t i = 0; i < m_constraintRegionWidth; i++)
{
const size_t itemIndex = i + constraintRegionStartIndex;
const int bitShift = 7 - (itemIndex & 7);
const int colorIndex = (dataBytes[itemIndex / 8] >> bitShift) & 0x1;
m_image[i + outputIndexStart] = palette[colorIndex];
}
break;
case QDPictBlitSourceType_Indexed2Bit:
for (size_t i = 0; i < m_constraintRegionWidth; i++)
{
m_image[i + outputIndexStart] = palette[colorIndex];
}
break;
case QDPictBlitSourceType_Indexed2Bit:
for (size_t i = 0; i < m_constraintRegionWidth; i++)
{
const size_t itemIndex = i + constraintRegionStartIndex;
const int bitShift = 6 - (2 * (itemIndex & 1));
const int colorIndex = (dataBytes[itemIndex / 4] >> bitShift) & 0x3;
m_image[i + outputIndexStart] = palette[colorIndex];
}
break;
case QDPictBlitSourceType_Indexed4Bit:
for (size_t i = 0; i < m_constraintRegionWidth; i++)
{
m_image[i + outputIndexStart] = palette[colorIndex];
}
break;
case QDPictBlitSourceType_Indexed4Bit:
for (size_t i = 0; i < m_constraintRegionWidth; i++)
{
const size_t itemIndex = i + constraintRegionStartIndex;
const int bitShift = 4 - (4 * (itemIndex & 1));
const int colorIndex = (dataBytes[itemIndex / 2] >> bitShift) & 0xf;
m_image[i + outputIndexStart] = palette[colorIndex];
}
break;
case QDPictBlitSourceType_Indexed8Bit:
for (size_t i = 0; i < m_constraintRegionWidth; i++)
{
const size_t itemIndex = i + constraintRegionStartIndex;
const uint8_t colorIndex = dataBytes[itemIndex];
m_image[i + outputIndexStart] = palette[colorIndex];
}
break;
case QDPictBlitSourceType_1Bit:
for (size_t i = 0; i < m_constraintRegionWidth; i++)
{
m_image[i + outputIndexStart] = palette[colorIndex];
}
break;
case QDPictBlitSourceType_Indexed8Bit:
for (size_t i = 0; i < m_constraintRegionWidth; i++)
{
const size_t itemIndex = i + constraintRegionStartIndex;
const uint8_t colorIndex = dataBytes[itemIndex];
m_image[i + outputIndexStart] = palette[colorIndex];
}
break;
case QDPictBlitSourceType_1Bit:
for (size_t i = 0; i < m_constraintRegionWidth; i++)
{
const size_t itemIndex = i + constraintRegionStartIndex;
const int bitShift = 7 - (itemIndex & 7);
const int colorIndex = (dataBytes[itemIndex / 8] >> bitShift) & 0x1;
m_image[i + outputIndexStart] = bwColors[colorIndex];
}
break;
case QDPictBlitSourceType_RGB15:
for (size_t i = 0; i < m_constraintRegionWidth; i++)
{
m_image[i + outputIndexStart] = bwColors[colorIndex];
}
break;
case QDPictBlitSourceType_RGB15:
for (size_t i = 0; i < m_constraintRegionWidth; i++)
{
const size_t itemIndex = i + constraintRegionStartIndex;
const uint16_t item = *reinterpret_cast<const uint16_t*>(dataBytes + itemIndex * 2);
@@ -1098,11 +1098,11 @@ public:
outputItem.g = FiveToEight((item >> 5) & 0x1f);
outputItem.r = FiveToEight((item >> 10) & 0x1f);
outputItem.a = 255;
}
break;
case QDPictBlitSourceType_RGB24_Multiplane:
for (size_t i = 0; i < m_constraintRegionWidth; i++)
{
}
break;
case QDPictBlitSourceType_RGB24_Multiplane:
for (size_t i = 0; i < m_constraintRegionWidth; i++)
{
const size_t itemIndex = i + constraintRegionStartIndex;
RGBAColor &outputItem = m_image[i + outputIndexStart];
@@ -1111,30 +1111,30 @@ public:
outputItem.g = dataBytes[itemIndex + planarSeparation];
outputItem.b = dataBytes[itemIndex + planarSeparation * 2];
outputItem.a = 255;
}
break;
default:
assert(false);
}
m_outputIndexStart += m_width;
}
bool AllocTempBuffers(uint8_t *&buffer1, size_t buffer1Size, uint8_t *&buffer2, size_t buffer2Size) override
{
m_buffer1.resize(buffer1Size);
m_buffer2.resize(buffer2Size);
buffer1 = &m_buffer1[0];
buffer2 = &m_buffer2[0];
return true;
}
void DumpImageToFile(const char *path)
{
stbi_write_png(path, static_cast<int>(m_width), static_cast<int>(m_height), 4, &m_image[0], static_cast<int>(m_width * 4));
}
}
break;
default:
assert(false);
}
m_outputIndexStart += m_width;
}
bool AllocTempBuffers(uint8_t *&buffer1, size_t buffer1Size, uint8_t *&buffer2, size_t buffer2Size) override
{
m_buffer1.resize(buffer1Size);
m_buffer2.resize(buffer2Size);
buffer1 = &m_buffer1[0];
buffer2 = &m_buffer2[0];
return true;
}
void DumpImageToFile(const char *path)
{
stbi_write_png(path, static_cast<int>(m_width), static_cast<int>(m_height), 4, &m_image[0], static_cast<int>(m_width * 4));
}
private:
Rect m_rect;