mirror of
https://github.com/elasota/Aerofoil.git
synced 2025-12-14 20:19:38 +00:00
Working up to start of menu loading
This commit is contained in:
@@ -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 ¶ms) 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 ¶ms) 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;
|
||||
|
||||
Reference in New Issue
Block a user