src/lib/CMXParser.cpp | 62 +++++++++++++++++++++++++++++++++++++++++++------- src/lib/CMXParser.h | 4 +-- 2 files changed, 56 insertions(+), 10 deletions(-)
New commits: commit 2d5d2dc005625b30a82e5a7baee1f2deac9964bf Author: Fridrich Å trba <[email protected]> Date: Fri Jul 1 10:00:14 2016 +0200 Try not to output bogus shapes in CMX1 when we cannot parse rendering Change-Id: Ieeaa3a53f7fa364d6107239a53219e6544e9603f diff --git a/src/lib/CMXParser.cpp b/src/lib/CMXParser.cpp index 129e019..770124c 100644 --- a/src/lib/CMXParser.cpp +++ b/src/lib/CMXParser.cpp @@ -389,7 +389,8 @@ void libcdr::CMXParser::readPolyCurve(librevenge::RVNGInputStream *input) else if (m_precision == libcdr::PRECISION_16BIT) { CDR_DEBUG_MSG((" CMXParser::readPolyCurve\n")); - readRenderingAttributes(input); + if (!readRenderingAttributes(input)) + return; pointNum = readU16(input); const unsigned long maxPoints = getRemainingLength(input) / (2 * 2 + 1); if (pointNum > maxPoints) @@ -462,6 +463,9 @@ void libcdr::CMXParser::readEllipse(librevenge::RVNGInputStream *input) } else if (m_precision == libcdr::PRECISION_16BIT) { + CDR_DEBUG_MSG((" CMXParser::readEllipse\n")); + if (!readRenderingAttributes(input)) + return; cx = readCoordinate(input, m_bigEndian); cy = readCoordinate(input, m_bigEndian); rx = readCoordinate(input, m_bigEndian) / 2.0; @@ -559,7 +563,9 @@ void libcdr::CMXParser::readRectangle(librevenge::RVNGInputStream *input) } else if (m_precision == libcdr::PRECISION_16BIT) { - input->seek(3, librevenge::RVNG_SEEK_CUR); + CDR_DEBUG_MSG((" CMXParser::readRectangle\n")); + if (!readRenderingAttributes(input)) + return; cx = readCoordinate(input, m_bigEndian); cy = readCoordinate(input, m_bigEndian); width = readCoordinate(input, m_bigEndian); @@ -631,8 +637,9 @@ libcdr::CDRBox libcdr::CMXParser::readBBox(librevenge::RVNGInputStream *input) return box; } -void libcdr::CMXParser::readFill(librevenge::RVNGInputStream *input) +bool libcdr::CMXParser::readFill(librevenge::RVNGInputStream *input) { + bool ret(true); libcdr::CDRColor color1; libcdr::CDRColor color2; libcdr::CDRImageFill imageFill; @@ -685,9 +692,11 @@ void libcdr::CMXParser::readFill(librevenge::RVNGInputStream *input) if (m_precision == libcdr::PRECISION_32BIT) { } - else + else if (m_precision == libcdr::PRECISION_16BIT) { CDR_DEBUG_MSG((" Fountain fill\n")); + if (m_precision == libcdr::PRECISION_16BIT) + ret = false; /* unsigned short fountain = */ readU16(input, m_bigEndian); /* unsigned short screen = */ readU16(input, m_bigEndian); /* unsigned short padding = */ readU16(input, m_bigEndian); @@ -706,29 +715,45 @@ void libcdr::CMXParser::readFill(librevenge::RVNGInputStream *input) break; case 6: CDR_DEBUG_MSG((" Postscript fill\n")); + if (m_precision == libcdr::PRECISION_16BIT) + ret = false; break; case 7: CDR_DEBUG_MSG((" Two-Color Pattern fill\n")); + if (m_precision == libcdr::PRECISION_16BIT) + ret = false; break; case 8: CDR_DEBUG_MSG((" Monochrome with transparent bitmap fill\n")); + if (m_precision == libcdr::PRECISION_16BIT) + ret = false; break; case 9: CDR_DEBUG_MSG((" Imported Bitmap fill\n")); + if (m_precision == libcdr::PRECISION_16BIT) + ret = false; break; case 10: CDR_DEBUG_MSG((" Full-Color Pattern fill\n")); + if (m_precision == libcdr::PRECISION_16BIT) + ret = false; break; case 11: CDR_DEBUG_MSG((" Texture fill\n")); + if (m_precision == libcdr::PRECISION_16BIT) + ret = false; break; default: + if (m_precision == libcdr::PRECISION_16BIT) + ret = false; break; } + return ret; } -void libcdr::CMXParser::readRenderingAttributes(librevenge::RVNGInputStream *input) +bool libcdr::CMXParser::readRenderingAttributes(librevenge::RVNGInputStream *input) { + bool ret(true); unsigned char tagId = 0; unsigned short tagLength = 0; unsigned char bitMask = readU8(input, m_bigEndian); @@ -750,7 +775,7 @@ void libcdr::CMXParser::readRenderingAttributes(librevenge::RVNGInputStream *inp switch (tagId) { case CMX_Tag_RenderAttr_FillSpec: - readFill(input); + ret = readFill(input); break; default: break; @@ -762,7 +787,7 @@ void libcdr::CMXParser::readRenderingAttributes(librevenge::RVNGInputStream *inp else if (m_precision == libcdr::PRECISION_16BIT) { CDR_DEBUG_MSG((" Fill specification\n")); - readFill(input); + ret = readFill(input); } } if (bitMask & 0x02) // outline @@ -824,6 +849,7 @@ void libcdr::CMXParser::readRenderingAttributes(librevenge::RVNGInputStream *inp else if (m_precision == libcdr::PRECISION_16BIT) { CDR_DEBUG_MSG((" Lens specification\n")); + ret = false; } } if (bitMask & 0x08) // canvas @@ -853,6 +879,7 @@ void libcdr::CMXParser::readRenderingAttributes(librevenge::RVNGInputStream *inp else if (m_precision == libcdr::PRECISION_16BIT) { CDR_DEBUG_MSG((" Canvas specification\n")); + ret = false; } } if (bitMask & 0x10) // container @@ -882,8 +909,10 @@ void libcdr::CMXParser::readRenderingAttributes(librevenge::RVNGInputStream *inp else if (m_precision == libcdr::PRECISION_16BIT) { CDR_DEBUG_MSG((" Container specification\n")); + ret = false; } } + return ret; } void libcdr::CMXParser::readJumpAbsolute(librevenge::RVNGInputStream *input) @@ -923,8 +952,10 @@ void libcdr::CMXParser::readJumpAbsolute(librevenge::RVNGInputStream *input) void libcdr::CMXParser::readRclr(librevenge::RVNGInputStream *input, unsigned /* length */) { unsigned numRecords = readU16(input, m_bigEndian); + CDR_DEBUG_MSG(("CMXParser::readRclr - numRecords %i\n", numRecords)); for (unsigned j = 1; j < numRecords+1; ++j) { + CDR_DEBUG_MSG(("Color index %i\n", j)); unsigned char colorModel = 0; if (m_precision == libcdr::PRECISION_32BIT) { @@ -977,6 +1008,7 @@ libcdr::CDRColor libcdr::CMXParser::readColor(librevenge::RVNGInputStream *input switch (colorModel) { case 0: // Invalid + CDR_DEBUG_MSG(("Invalid color model\n")); break; case 1: // Pantone { @@ -988,13 +1020,23 @@ libcdr::CDRColor libcdr::CMXParser::readColor(librevenge::RVNGInputStream *input break; } case 2: // CMYK + { + unsigned char c = readU8(input, m_bigEndian); + unsigned char m = readU8(input, m_bigEndian); + unsigned char y = readU8(input, m_bigEndian); + unsigned char k = readU8(input, m_bigEndian); + CDR_DEBUG_MSG(("CMYK color: c 0x%x, m 0x%x, y 0x%x, k 0x%x\n", c, m, y, k)); + color.m_colorValue = c | (unsigned)m << 8 | (unsigned)y << 16 | (unsigned)k << 24; + color.m_colorModel = colorModel; + break; + } case 3: // CMYK255 { unsigned char c = readU8(input, m_bigEndian); unsigned char m = readU8(input, m_bigEndian); unsigned char y = readU8(input, m_bigEndian); unsigned char k = readU8(input, m_bigEndian); - CDR_DEBUG_MSG(("CMYK%s color: c 0x%x, m 0x%x, y 0x%x, k 0x%x\n", colorModel == 2 ? "" : "255", c, m, y, k)); + CDR_DEBUG_MSG(("CMYK255 color: c 0x%x, m 0x%x, y 0x%x, k 0x%x\n", c, m, y, k)); color.m_colorValue = c | (unsigned)m << 8 | (unsigned)y << 16 | (unsigned)k << 24; color.m_colorModel = colorModel; break; @@ -1068,7 +1110,11 @@ libcdr::CDRColor libcdr::CMXParser::readColor(librevenge::RVNGInputStream *input color.m_colorModel = colorModel; break; } + case 0xff: // something funny here + input->seek(4, librevenge::RVNG_SEEK_CUR); + break; default: + CDR_DEBUG_MSG(("Unknown color model %i\n", colorModel)); break; } return color; diff --git a/src/lib/CMXParser.h b/src/lib/CMXParser.h index 7030e2a..612479b 100644 --- a/src/lib/CMXParser.h +++ b/src/lib/CMXParser.h @@ -55,10 +55,10 @@ private: // Types readers CDRTransform readMatrix(librevenge::RVNGInputStream *input); CDRBox readBBox(librevenge::RVNGInputStream *input); - void readFill(librevenge::RVNGInputStream *input); + bool readFill(librevenge::RVNGInputStream *input); // Complex types readers - void readRenderingAttributes(librevenge::RVNGInputStream *input); + bool readRenderingAttributes(librevenge::RVNGInputStream *input); // Helper Functions CDRColor getPaletteColor(unsigned id);
_______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
