src/lib/CDRCollector.cpp | 8 + src/lib/CDRDocumentStructure.h | 1 src/lib/CMXDocument.cpp | 6 - src/lib/CMXParser.cpp | 190 ++++++++++++++++++++++++++++++++++++++--- src/lib/CMXParser.h | 7 + 5 files changed, 198 insertions(+), 14 deletions(-)
New commits: commit fe3247f88f940990557d7822899d50483960c653 Author: Fridrich Å trba <fridrich.st...@bluewin.ch> Date: Thu Jun 30 18:15:03 2016 +0200 missing break Change-Id: I6ed22efb32a75225c7cfd15a80637613e0483913 diff --git a/src/lib/CMXParser.cpp b/src/lib/CMXParser.cpp index b2b40c6..f215a1c 100644 --- a/src/lib/CMXParser.cpp +++ b/src/lib/CMXParser.cpp @@ -651,6 +651,7 @@ void libcdr::CMXParser::readFill(librevenge::RVNGInputStream *input) if (tagId == CMX_Tag_EndTag) { CDR_DEBUG_MSG((" Solid fill - tagId %i\n", tagId)); + break; } tagLength = readU16(input, m_bigEndian); CDR_DEBUG_MSG((" Solid fill - tagId %i, tagLength %u\n", tagId, tagLength)); commit 90c1937b9bd954a09d180c3dcefe39401f9a2019 Author: Fridrich Å trba <fridrich.st...@bluewin.ch> Date: Thu Jun 30 14:58:45 2016 +0200 Initial implementation of fills in cmx v6 Change-Id: I359cd6509fe52f1b48c2d4367850c85ba16492d0 diff --git a/src/lib/CDRCollector.cpp b/src/lib/CDRCollector.cpp index a2f2edd..cc921a2 100644 --- a/src/lib/CDRCollector.cpp +++ b/src/lib/CDRCollector.cpp @@ -470,6 +470,14 @@ unsigned libcdr::CDRParserState::_getRGBColor(const CDRColor &color) } break; } + // BW + case 0x08: + { + red = col0 ? 0 : 0xff; + green = col0 ? 0 : 0xff; + blue = col0 ? 0 : 0xff; + break; + } // Grayscale case 0x09: { diff --git a/src/lib/CDRDocumentStructure.h b/src/lib/CDRDocumentStructure.h index 2d5b1da..5f93b77 100644 --- a/src/lib/CDRDocumentStructure.h +++ b/src/lib/CDRDocumentStructure.h @@ -92,6 +92,7 @@ #define CDR_FOURCC_RIFF 0x46464952 #define CDR_FOURCC_RIFX 0x58464952 +#define CDR_FOURCC_rclr 0x726c6372 #define CDR_FOURCC_rvsn 0x6e737672 #define CDR_FOURCC_spnd 0x646e7073 diff --git a/src/lib/CMXDocument.cpp b/src/lib/CMXDocument.cpp index ff8df44..c92aae1 100644 --- a/src/lib/CMXDocument.cpp +++ b/src/lib/CMXDocument.cpp @@ -7,6 +7,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#include <map> #include <string> #include <string.h> #include <libcdr/libcdr.h> @@ -65,7 +66,8 @@ CDRAPI bool libcdr::CMXDocument::parse(librevenge::RVNGInputStream *input, libre input->seek(0, librevenge::RVNG_SEEK_SET); CDRParserState ps; CDRStylesCollector stylesCollector(ps); - CMXParser stylesParser(&stylesCollector); + std::map<unsigned, libcdr::CDRColor> colorPalette; + CMXParser stylesParser(&stylesCollector, colorPalette); bool retVal = stylesParser.parseRecords(input); if (ps.m_pages.empty()) retVal = false; @@ -73,7 +75,7 @@ CDRAPI bool libcdr::CMXDocument::parse(librevenge::RVNGInputStream *input, libre { input->seek(0, librevenge::RVNG_SEEK_SET); CDRContentCollector contentCollector(ps, painter); - CMXParser contentParser(&contentCollector); + CMXParser contentParser(&contentCollector, colorPalette); retVal = contentParser.parseRecords(input); } return retVal; diff --git a/src/lib/CMXParser.cpp b/src/lib/CMXParser.cpp index c94e027..b2b40c6 100644 --- a/src/lib/CMXParser.cpp +++ b/src/lib/CMXParser.cpp @@ -28,12 +28,12 @@ #define M_PI 3.14159265358979323846 #endif -libcdr::CMXParser::CMXParser(libcdr::CDRCollector *collector) +libcdr::CMXParser::CMXParser(libcdr::CDRCollector *collector, std::map<unsigned, libcdr::CDRColor> &colorPalette) : CommonParser(collector), m_bigEndian(false), m_unit(0), m_scale(0.0), m_xmin(0.0), m_xmax(0.0), m_ymin(0.0), m_ymax(0.0), m_indexSectionOffset(0), m_infoSectionOffset(0), m_thumbnailOffset(0), - m_fillIndex(0), m_nextInstructionOffset(0) {} + m_fillIndex(0), m_nextInstructionOffset(0), m_colorPalette(colorPalette) {} libcdr::CMXParser::~CMXParser() { @@ -124,6 +124,9 @@ void libcdr::CMXParser::readRecord(unsigned fourCC, unsigned &length, librevenge case CDR_FOURCC_ccmm: readCcmm(input, recordEnd); break; + case CDR_FOURCC_rclr: + readRclr(input, length); + break; default: break; } @@ -336,6 +339,7 @@ void libcdr::CMXParser::readBeginGroup(librevenge::RVNGInputStream * /* input */ void libcdr::CMXParser::readPolyCurve(librevenge::RVNGInputStream *input) { + m_collector->collectObject(1); unsigned pointNum = 0; std::vector<std::pair<double, double> > points; std::vector<unsigned char> pointTypes; @@ -402,13 +406,13 @@ void libcdr::CMXParser::readPolyCurve(librevenge::RVNGInputStream *input) else return; - m_collector->collectObject(1); outputPath(points, pointTypes); m_collector->collectLevel(1); } void libcdr::CMXParser::readEllipse(librevenge::RVNGInputStream *input) { + m_collector->collectObject(1); double angle1 = 0.0; double angle2 = 0.0; double rotation = 0.0; @@ -469,7 +473,6 @@ void libcdr::CMXParser::readEllipse(librevenge::RVNGInputStream *input) else return; - m_collector->collectObject(1); CDRPath path; if (angle1 != angle2) { @@ -511,6 +514,7 @@ void libcdr::CMXParser::readEllipse(librevenge::RVNGInputStream *input) void libcdr::CMXParser::readRectangle(librevenge::RVNGInputStream *input) { + m_collector->collectObject(1); double cx = 0.0; double cy = 0.0; double width = 0.0; @@ -565,7 +569,6 @@ void libcdr::CMXParser::readRectangle(librevenge::RVNGInputStream *input) else return; - m_collector->collectObject(1); double x0 = cx - width / 2.0; double y0 = cy - height / 2.0; double x1 = cx + width / 2.0; @@ -629,10 +632,14 @@ libcdr::CDRBox libcdr::CMXParser::readBBox(librevenge::RVNGInputStream *input) void libcdr::CMXParser::readFill(librevenge::RVNGInputStream *input) { + libcdr::CDRColor color1; + libcdr::CDRColor color2; + libcdr::CDRImageFill imageFill; + libcdr::CDRGradient gradient; unsigned fillIdentifier = readU16(input, m_bigEndian); switch (fillIdentifier) { - case 1: + case 1: // Uniform if (m_precision == libcdr::PRECISION_32BIT) { unsigned char tagId = 0; @@ -650,20 +657,24 @@ void libcdr::CMXParser::readFill(librevenge::RVNGInputStream *input) switch (tagId) { case CMX_Tag_RenderAttr_FillSpec_Uniform: - readU32(input, m_bigEndian); - readU32(input, m_bigEndian); + { + unsigned colorRef = readU16(input, m_bigEndian); + color1 = getPaletteColor(colorRef); + readU16(input, m_bigEndian); break; + } default: break; } input->seek(startOffset + tagLength, librevenge::RVNG_SEEK_SET); } while (tagId != CMX_Tag_EndTag); + m_collector->collectFillStyle(fillIdentifier, color1, color2, gradient, imageFill); } else if (m_precision == libcdr::PRECISION_16BIT) { - readU32(input, m_bigEndian); - readU32(input, m_bigEndian); + readU16(input, m_bigEndian); + readU16(input, m_bigEndian); } break; case 2: @@ -707,7 +718,9 @@ void libcdr::CMXParser::readRenderingAttributes(librevenge::RVNGInputStream *inp CDR_DEBUG_MSG((" Fill specification - tagId %i, tagLength %u\n", tagId, tagLength)); switch (tagId) { - + case CMX_Tag_RenderAttr_FillSpec: + readFill(input); + break; default: break; } @@ -856,4 +869,158 @@ void libcdr::CMXParser::readJumpAbsolute(librevenge::RVNGInputStream *input) return; } +void libcdr::CMXParser::readRclr(librevenge::RVNGInputStream *input, unsigned /* length */) +{ + unsigned numRecords = readU16(input, m_bigEndian); + if (m_precision == libcdr::PRECISION_32BIT) + { + for (unsigned j = 1; j < numRecords+1; ++j) + { + unsigned char colorModel = 0; + unsigned char tagId = 0; + CDRColor color; + do + { + long offset = input->tell(); + tagId = readU8(input, m_bigEndian); + if (tagId == CMX_Tag_EndTag) + break; + unsigned short tagLength = readU16(input, m_bigEndian); + switch (tagId) + { + case CMX_Tag_DescrSection_Color_Base: + colorModel = readU8(input, m_bigEndian); + readU8(input, m_bigEndian); + break; + case CMX_Tag_DescrSection_Color_ColorDescr: + { + switch (colorModel) + { + case 0: // Invalid + break; + case 1: // Pantone + { + unsigned short pantoneId = readU16(input, m_bigEndian); + unsigned short pantoneDensity = readU16(input, m_bigEndian); + CDR_DEBUG_MSG(("Pantone color: id 0x%x, density 0x%x\n", pantoneId, pantoneDensity)); + color.m_colorValue = ((unsigned)pantoneId & 0xff) | ((unsigned)pantoneId & 0xff00) | ((unsigned)pantoneDensity & 0xff) << 16 | ((unsigned)pantoneDensity & 0xff00) << 16; + color.m_colorModel = 0; + m_colorPalette[j] = color; + break; + } + case 2: // CMYK + 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)); + color.m_colorValue = c | (unsigned)m << 8 | (unsigned)y << 16 | (unsigned)k << 24; + color.m_colorModel = colorModel; + m_colorPalette[j] = color; + break; + } + case 4: // CMY + { + unsigned char c = readU8(input, m_bigEndian); + unsigned char m = readU8(input, m_bigEndian); + unsigned char y = readU8(input, m_bigEndian); + CDR_DEBUG_MSG(("CMY color: c 0x%x, m 0x%x, y 0x%x\n", c, m, y)); + color.m_colorValue = c | (unsigned)m << 8 | (unsigned)y << 16; + color.m_colorModel = colorModel; + m_colorPalette[j] = color; + break; + } + case 5: // RGB + { + unsigned char r = readU8(input, m_bigEndian); + unsigned char g = readU8(input, m_bigEndian); + unsigned char b = readU8(input, m_bigEndian); + CDR_DEBUG_MSG(("RGB color: r 0x%x, g 0x%x, b 0x%x\n", r, g, b)); + color.m_colorValue = b | (unsigned)g << 8 | (unsigned)r << 16; + color.m_colorModel = colorModel; + m_colorPalette[j] = color; + break; + } + case 6: // HSB + { + unsigned short h = readU16(input, m_bigEndian); + unsigned char s = readU8(input, m_bigEndian); + unsigned char b = readU8(input, m_bigEndian); + CDR_DEBUG_MSG(("HSB color: h 0x%x, s 0x%x, b 0x%x\n", h, s, b)); + color.m_colorValue = (h & 0xff) | ((unsigned)(h & 0xff00) >> 8) << 8 | (unsigned)s << 16 | (unsigned)b << 24; + color.m_colorModel = colorModel; + m_colorPalette[j] = color; + break; + } + case 7: // HLS + { + unsigned short h = readU16(input, m_bigEndian); + unsigned char l = readU8(input, m_bigEndian); + unsigned char s = readU8(input, m_bigEndian); + CDR_DEBUG_MSG(("HLS color: h 0x%x, l 0x%x, s 0x%x\n", h, l, s)); + color.m_colorValue = (h & 0xff) | ((unsigned)(h & 0xff00) >> 8) << 8 | (unsigned)l << 16 | (unsigned)s << 24; + color.m_colorModel = colorModel; + m_colorPalette[j] = color; + break; + } + case 8: // BW + case 9: // Gray + { + unsigned value = readU8(input, m_bigEndian); + CDR_DEBUG_MSG(("%s color: %s 0x%x\n", colorModel == 8 ? "BW" : "Gray", colorModel == 8 ? "black" : "gray", value)); + color.m_colorValue = value; + color.m_colorModel = colorModel; + m_colorPalette[j] = color; + break; + } + case 10: // YIQ255 + { + unsigned char y = readU8(input, m_bigEndian); + unsigned char i = readU8(input, m_bigEndian); + unsigned char q = readU8(input, m_bigEndian); + CDR_DEBUG_MSG(("YIQ255 color: y 0x%x, i 0x%x, q 0x%x\n", y, i, q)); + color.m_colorValue = (unsigned)y << 8 | (unsigned)i << 16 | (unsigned)q << 24 ; + color.m_colorModel = colorModel+1; + m_colorPalette[j] = color; + break; + } + case 11: // LAB + { + unsigned char l = readU8(input, m_bigEndian); + unsigned char a = readU8(input, m_bigEndian); + unsigned char b = readU8(input, m_bigEndian); + CDR_DEBUG_MSG(("LAB color: L 0x%x, green2magenta 0x%x, blue2yellow 0x%x\n", l, a, b)); + color.m_colorValue =l | (unsigned)a << 8 | (unsigned)b << 16; + color.m_colorModel = colorModel; + m_colorPalette[j] = color; + break; + } + default: + break; + } + } + default: + break; + } + input->seek(offset+tagLength, librevenge::RVNG_SEEK_SET); + } + while (tagId != CMX_Tag_EndTag); + } + } + else if (m_precision == libcdr::PRECISION_16BIT) + ; + else + return; +} + +libcdr::CDRColor libcdr::CMXParser::getPaletteColor(unsigned id) +{ + const std::map<unsigned, libcdr::CDRColor>::const_iterator iter = m_colorPalette.find(id); + if (iter != m_colorPalette.end()) + return iter->second; + return libcdr::CDRColor(); +} + /* vim:set shiftwidth=2 softtabstop=2 expandtab: */ diff --git a/src/lib/CMXParser.h b/src/lib/CMXParser.h index aa12e38..6652ab4 100644 --- a/src/lib/CMXParser.h +++ b/src/lib/CMXParser.h @@ -26,7 +26,7 @@ class CDRCollector; class CMXParser : protected CommonParser { public: - explicit CMXParser(CDRCollector *collector); + explicit CMXParser(CDRCollector *collector, std::map<unsigned, CDRColor> &colorPalette); virtual ~CMXParser(); bool parseRecords(librevenge::RVNGInputStream *input, long size = -1, unsigned level = 0); @@ -41,6 +41,7 @@ private: void readDisp(librevenge::RVNGInputStream *input, unsigned length); void readCcmm(librevenge::RVNGInputStream *input, long &recordEnd); void readPage(librevenge::RVNGInputStream *input, unsigned length); + void readRclr(librevenge::RVNGInputStream *input, unsigned length); // Command readers void readBeginPage(librevenge::RVNGInputStream *input); @@ -59,6 +60,9 @@ private: // Complex types readers void readRenderingAttributes(librevenge::RVNGInputStream *input); + // Helper Functions + CDRColor getPaletteColor(unsigned id); + bool m_bigEndian; unsigned short m_unit; double m_scale; @@ -68,6 +72,7 @@ private: unsigned m_thumbnailOffset; unsigned m_fillIndex; unsigned m_nextInstructionOffset; + std::map<unsigned, CDRColor> &m_colorPalette; }; } // namespace libcdr
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits