diff --git a/PdfForQtLib/sources/pdfcolorspaces.h b/PdfForQtLib/sources/pdfcolorspaces.h index 633f6d6..0cd37e7 100644 --- a/PdfForQtLib/sources/pdfcolorspaces.h +++ b/PdfForQtLib/sources/pdfcolorspaces.h @@ -531,11 +531,10 @@ private: class PDFICCBasedColorSpace : public PDFAbstractColorSpace { -private: +public: static constexpr const size_t MAX_COLOR_COMPONENTS = 4; using Ranges = std::array; -public: explicit PDFICCBasedColorSpace(PDFColorSpacePointer alternateColorSpace, Ranges range, QByteArray iccProfileData); virtual ~PDFICCBasedColorSpace() = default; diff --git a/PdfForQtLib/sources/pdfimage.cpp b/PdfForQtLib/sources/pdfimage.cpp index 360fbf8..2e7a600 100644 --- a/PdfForQtLib/sources/pdfimage.cpp +++ b/PdfForQtLib/sources/pdfimage.cpp @@ -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(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) diff --git a/PdfForQtLib/sources/pdfparser.h b/PdfForQtLib/sources/pdfparser.h index 0bdad40..948a9bb 100644 --- a/PdfForQtLib/sources/pdfparser.h +++ b/PdfForQtLib/sources/pdfparser.h @@ -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;