[Libreoffice-commits] libcdr.git: 2 commits - src/lib

Fridrich Štrba fridrich.strba at bluewin.ch
Thu Jun 30 16:15:29 UTC 2016


 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.strba at 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.strba at 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


More information about the Libreoffice-commits mailing list