Update acc. to spec PDF 2.0, chapter 7, color space of JPX image, minor parser update

This commit is contained in:
Jakub Melka 2020-07-10 17:08:22 +02:00
parent 863ae5a873
commit 4647633956
3 changed files with 23 additions and 12 deletions

View File

@ -531,11 +531,10 @@ private:
class PDFICCBasedColorSpace : public PDFAbstractColorSpace
{
private:
public:
static constexpr const size_t MAX_COLOR_COMPONENTS = 4;
using Ranges = std::array<PDFColorComponent, MAX_COLOR_COMPONENTS * 2>;
public:
explicit PDFICCBasedColorSpace(PDFColorSpacePointer alternateColorSpace, Ranges range, QByteArray iccProfileData);
virtual ~PDFICCBasedColorSpace() = default;

View File

@ -461,6 +461,14 @@ PDFImage PDFImage::createImage(const PDFDocument* document,
imageData.errors.push_back(PDFRenderError(RenderErrorType::Error, PDFTranslationContext::tr("Unknown color space for JPEG 2000 image.")));
break;
}
// Jakub Melka: Try to use ICC profile, if image has it
if (jpegImage->icc_profile_buf && jpegImage->icc_profile_len > 0 && image.m_colorSpace)
{
QByteArray iccProfileData(reinterpret_cast<const char*>(jpegImage->icc_profile_buf), jpegImage->icc_profile_len);
PDFICCBasedColorSpace::Ranges ranges = { 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0 };
image.m_colorSpace.reset(new PDFICCBasedColorSpace(image.m_colorSpace, ranges, qMove(iccProfileData)));
}
}
// First we must check, if all components are valid (i.e has same width/height/precision)

View File

@ -48,16 +48,18 @@ constexpr const char CHAR_SPACE = 0x20;
// Group of delimiter characters
constexpr const char CHAR_LEFT_BRACKET = '(';
constexpr const char CHAR_RIGHT_BRACKET = ')';
constexpr const char CHAR_LEFT_ANGLE = '<';
constexpr const char CHAR_RIGHT_ANGLE = '>';
constexpr const char CHAR_ARRAY_START = '[';
constexpr const char CHAR_ARRAY_END = ']';
constexpr const char CHAR_SLASH = '/';
constexpr const char CHAR_PERCENT = '%';
constexpr const char CHAR_BACKSLASH = '\\';
constexpr const char CHAR_MARK = '#';
constexpr const char CHAR_LEFT_BRACKET = '(';
constexpr const char CHAR_RIGHT_BRACKET = ')';
constexpr const char CHAR_LEFT_ANGLE = '<';
constexpr const char CHAR_RIGHT_ANGLE = '>';
constexpr const char CHAR_ARRAY_START = '[';
constexpr const char CHAR_ARRAY_END = ']';
constexpr const char CHAR_LEFT_CURLY_BRACKET = '{';
constexpr const char CHAR_RIGHT_CURLY_BRACKET = '}';
constexpr const char CHAR_SLASH = '/';
constexpr const char CHAR_PERCENT = '%';
constexpr const char CHAR_BACKSLASH = '\\';
constexpr const char CHAR_MARK = '#';
// These constants reserves memory while reading string or name
@ -371,6 +373,8 @@ constexpr bool PDFLexicalAnalyzer::isDelimiter(char character)
case CHAR_RIGHT_ANGLE:
case CHAR_ARRAY_START:
case CHAR_ARRAY_END:
case CHAR_LEFT_CURLY_BRACKET:
case CHAR_RIGHT_CURLY_BRACKET:
case CHAR_SLASH:
case CHAR_PERCENT:
return true;