mirror of
https://github.com/JakubMelka/PDF4QT.git
synced 2025-02-07 23:38:46 +01:00
Issue #50: Color masking with indexed color space
This commit is contained in:
parent
349efcbf88
commit
5db941954f
@ -1982,6 +1982,81 @@ QImage PDFIndexedColorSpace::getImage(const PDFImageData& imageData,
|
|||||||
return image;
|
return image;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case PDFImageData::MaskingType::ColorKeyMasking:
|
||||||
|
{
|
||||||
|
QImage image(imageData.getWidth(), imageData.getHeight(), QImage::Format_RGBA8888);
|
||||||
|
image.fill(QColor(Qt::transparent));
|
||||||
|
|
||||||
|
unsigned int componentCount = imageData.getComponents();
|
||||||
|
if (componentCount != getColorComponentCount())
|
||||||
|
{
|
||||||
|
throw PDFException(PDFTranslationContext::tr("Invalid colors for color space. Color space has %1 colors. Provided color count is %4.").arg(getColorComponentCount()).arg(componentCount));
|
||||||
|
}
|
||||||
|
|
||||||
|
Q_ASSERT(componentCount > 0);
|
||||||
|
const std::vector<PDFInteger>& colorKeyMask = imageData.getColorKeyMask();
|
||||||
|
if (colorKeyMask.size() / 2 != componentCount)
|
||||||
|
{
|
||||||
|
throw PDFException(PDFTranslationContext::tr("Invalid number of color components in color key mask. Expected %1, provided %2.").arg(2 * componentCount).arg(colorKeyMask.size()));
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::vector<PDFReal>& decode = imageData.getDecode();
|
||||||
|
if (!decode.empty() && decode.size() != componentCount * 2)
|
||||||
|
{
|
||||||
|
throw PDFException(PDFTranslationContext::tr("Invalid size of the decoded array. Expected %1, actual %2.").arg(componentCount * 2).arg(decode.size()));
|
||||||
|
}
|
||||||
|
|
||||||
|
PDFBitReader reader(&imageData.getData(), imageData.getBitsPerComponent());
|
||||||
|
|
||||||
|
PDFColor color;
|
||||||
|
color.resize(componentCount);
|
||||||
|
|
||||||
|
const PDFReal max = reader.max();
|
||||||
|
for (unsigned int i = 0, rowCount = imageData.getHeight(); i < rowCount; ++i)
|
||||||
|
{
|
||||||
|
reader.seek(i * imageData.getStride());
|
||||||
|
unsigned char* outputLine = image.scanLine(i);
|
||||||
|
|
||||||
|
for (unsigned int j = 0; j < imageData.getWidth(); ++j)
|
||||||
|
{
|
||||||
|
// Number of masked-out colors
|
||||||
|
unsigned int maskedColors = 0;
|
||||||
|
|
||||||
|
for (unsigned int k = 0; k < componentCount; ++k)
|
||||||
|
{
|
||||||
|
PDFBitReader::Value value = reader.read();
|
||||||
|
|
||||||
|
// Interpolate value, if decode is not empty
|
||||||
|
if (!decode.empty())
|
||||||
|
{
|
||||||
|
color[k] = interpolate(value, 0.0, max, decode[2 * k], decode[2 * k + 1]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
color[k] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
Q_ASSERT(2 * k + 1 < colorKeyMask.size());
|
||||||
|
if (static_cast<std::decay<decltype(colorKeyMask)>::type::value_type>(value) >= colorKeyMask[2 * k] &&
|
||||||
|
static_cast<std::decay<decltype(colorKeyMask)>::type::value_type>(value) <= colorKeyMask[2 * k + 1])
|
||||||
|
{
|
||||||
|
++maskedColors;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QColor transformedColor = getColor(color, cms, intent, reporter, false);
|
||||||
|
QRgb rgb = transformedColor.rgb();
|
||||||
|
|
||||||
|
*outputLine++ = qRed(rgb);
|
||||||
|
*outputLine++ = qGreen(rgb);
|
||||||
|
*outputLine++ = qBlue(rgb);
|
||||||
|
*outputLine++ = (maskedColors == componentCount) ? 0x00 : 0xFF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw PDFRendererException(RenderErrorType::NotImplemented, PDFTranslationContext::tr("Image masking not implemented!"));
|
throw PDFRendererException(RenderErrorType::NotImplemented, PDFTranslationContext::tr("Image masking not implemented!"));
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user