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

Fridrich Štrba fridrich.strba at bluewin.ch
Mon Jul 18 09:44:20 UTC 2016


 src/lib/CDRCollector.h          |    1 +
 src/lib/CDRContentCollector.cpp |   28 +++++++++++++++++++++++-----
 src/lib/CDRContentCollector.h   |    3 ++-
 src/lib/CDRParser.cpp           |    4 +++-
 src/lib/CDRStylesCollector.h    |    1 +
 src/lib/CMXParser.cpp           |   12 +++++-------
 6 files changed, 35 insertions(+), 14 deletions(-)

New commits:
commit 296365202a94801885625350817522c2d6ef1587
Author: Fridrich Štrba <fridrich.strba at bluewin.ch>
Date:   Mon Jul 18 11:43:54 2016 +0200

    If not line/fill is specified, thy the styles first
    
    Change-Id: I54a687cedf5c2a6b0a93ad578158762b317279ee

diff --git a/src/lib/CDRCollector.h b/src/lib/CDRCollector.h
index ead8d17..32d1c55 100644
--- a/src/lib/CDRCollector.h
+++ b/src/lib/CDRCollector.h
@@ -100,6 +100,7 @@ public:
   virtual void collectArtisticText(double x, double y) = 0;
   virtual void collectParagraphText(double x, double y, double width, double height) = 0;
   virtual void collectStld(unsigned id, const CDRStyle &style) = 0;
+  virtual void collectStyleId(unsigned id) = 0;
 };
 
 } // namespace libcdr
diff --git a/src/lib/CDRContentCollector.cpp b/src/lib/CDRContentCollector.cpp
index e19a6f8..860bf30 100644
--- a/src/lib/CDRContentCollector.cpp
+++ b/src/lib/CDRContentCollector.cpp
@@ -61,7 +61,7 @@ libcdr::CDRContentCollector::CDRContentCollector(libcdr::CDRParserState &ps, lib
   : m_painter(painter), m_isDocumentStarted(false), m_isPageProperties(false), m_isPageStarted(false),
     m_ignorePage(false), m_page(ps.m_pages[0]), m_pageIndex(0), m_currentFillStyle(), m_currentLineStyle(),
     m_spnd(0), m_currentObjectLevel(0), m_currentGroupLevel(0), m_currentVectLevel(0), m_currentPageLevel(0),
-    m_currentImage(), m_currentText(0), m_currentBBox(), m_currentTextBox(), m_currentPath(),
+    m_currentStyleId(0), m_currentImage(), m_currentText(0), m_currentBBox(), m_currentTextBox(), m_currentPath(),
     m_currentTransforms(), m_fillTransforms(), m_polygon(0), m_isInPolygon(false), m_isInSpline(false),
     m_outputElementsStack(0), m_contentOutputElementsStack(), m_fillOutputElementsStack(),
     m_outputElementsQueue(0), m_contentOutputElementsQueue(), m_fillOutputElementsQueue(),
@@ -150,6 +150,7 @@ void libcdr::CDRContentCollector::collectObject(unsigned level)
   m_currentObjectLevel = level;
   m_currentFillStyle = CDRFillStyle();
   m_currentLineStyle = CDRLineStyle();
+  m_currentStyleId = 0;
   m_currentBBox = CDRBox();
 }
 
@@ -681,6 +682,13 @@ void libcdr::CDRContentCollector::collectPolygonTransform(unsigned numAngles, un
 
 void libcdr::CDRContentCollector::_fillProperties(librevenge::RVNGPropertyList &propList)
 {
+  if (m_currentFillStyle.fillType == (unsigned short)-1 && m_currentStyleId)
+  {
+    CDRStyle tmpStyle;
+    m_ps.getRecursedStyle(tmpStyle, m_currentStyleId);
+    m_currentFillStyle = tmpStyle.m_fillStyle;
+  }
+
   if (m_fillOpacity < 1.0)
     propList.insert("draw:opacity", m_fillOpacity, librevenge::RVNG_PERCENT);
   if (m_currentFillStyle.fillType == 0)
@@ -994,12 +1002,17 @@ void libcdr::CDRContentCollector::_fillProperties(librevenge::RVNGPropertyList &
 
 void libcdr::CDRContentCollector::_lineProperties(librevenge::RVNGPropertyList &propList)
 {
-  if (m_currentLineStyle.lineType == (unsigned short)-1)
+  if (m_currentLineStyle.lineType == (unsigned short)-1 && m_currentStyleId)
   {
-    propList.insert("draw:stroke", "solid");
-    propList.insert("svg:stroke-width", 0.0);
-    propList.insert("svg:stroke-color", "#000000");
+    CDRStyle tmpStyle;
+    m_ps.getRecursedStyle(tmpStyle, m_currentStyleId);
+    m_currentLineStyle = tmpStyle.m_lineStyle;
   }
+
+  if (m_currentLineStyle.lineType == (unsigned short)-1)
+    /* No line style specified and also no line style from the style id,
+       the shape has no outline then. */
+    propList.insert("draw:stroke", "none");
   else
   {
     if (m_currentLineStyle.lineType & 0x1)
@@ -1315,4 +1328,9 @@ void libcdr::CDRContentCollector::collectParagraphText(double x, double y, doubl
     m_currentText = &(iter->second);
 }
 
+void libcdr::CDRContentCollector::collectStyleId(unsigned styleId)
+{
+  m_currentStyleId = styleId;
+}
+
 /* vim:set shiftwidth=2 softtabstop=2 expandtab: */
diff --git a/src/lib/CDRContentCollector.h b/src/lib/CDRContentCollector.h
index 517692a..2261454 100644
--- a/src/lib/CDRContentCollector.h
+++ b/src/lib/CDRContentCollector.h
@@ -66,6 +66,7 @@ public:
   void collectArtisticText(double x, double y);
   void collectParagraphText(double x, double y, double width, double height);
   void collectStld(unsigned, const CDRStyle &) {}
+  void collectStyleId(unsigned styleId);
 
 private:
   CDRContentCollector(const CDRContentCollector &);
@@ -94,7 +95,7 @@ private:
   CDRFillStyle m_currentFillStyle;
   CDRLineStyle m_currentLineStyle;
   unsigned m_spnd;
-  unsigned m_currentObjectLevel, m_currentGroupLevel, m_currentVectLevel, m_currentPageLevel;
+  unsigned m_currentObjectLevel, m_currentGroupLevel, m_currentVectLevel, m_currentPageLevel, m_currentStyleId;
   CDRImage m_currentImage;
   const std::vector<CDRTextLine> *m_currentText;
   CDRBox m_currentBBox;
diff --git a/src/lib/CDRParser.cpp b/src/lib/CDRParser.cpp
index 76a8024..db463eb 100644
--- a/src/lib/CDRParser.cpp
+++ b/src/lib/CDRParser.cpp
@@ -2160,7 +2160,9 @@ void libcdr::CDRParser::readLoda(librevenge::RVNGInputStream *input, unsigned le
     }
     else if (argTypes[i] == 0xc8)
     {
-      // TODO: Handle styles
+      unsigned styleId = readUnsigned(input);
+      if (styleId)
+        m_collector->collectStyleId(styleId);
     }
     else if (argTypes[i] == 0x2af8)
       readPolygonTransform(input);
diff --git a/src/lib/CDRStylesCollector.h b/src/lib/CDRStylesCollector.h
index 2183376..8b1433d 100644
--- a/src/lib/CDRStylesCollector.h
+++ b/src/lib/CDRStylesCollector.h
@@ -65,6 +65,7 @@ public:
   void collectArtisticText(double, double) {}
   void collectParagraphText(double, double, double, double) {}
   void collectStld(unsigned id, const CDRStyle &style);
+  void collectStyleId(unsigned) {}
 
 private:
   CDRStylesCollector(const CDRStylesCollector &);
diff --git a/src/lib/CMXParser.cpp b/src/lib/CMXParser.cpp
index 324ca0c..bf3f818 100644
--- a/src/lib/CMXParser.cpp
+++ b/src/lib/CMXParser.cpp
@@ -1411,9 +1411,9 @@ bool libcdr::CMXParser::readRenderingAttributes(librevenge::RVNGInputStream *inp
         return false;
     }
   }
-  CDRLineStyle lineStyle;
   if (bitMask & 0x02) // outline
   {
+    CDRLineStyle lineStyle;
     if (m_precision == libcdr::PRECISION_32BIT)
     {
       do
@@ -1444,13 +1444,11 @@ bool libcdr::CMXParser::readRenderingAttributes(librevenge::RVNGInputStream *inp
       CDR_DEBUG_MSG(("  Outline specification\n"));
       lineStyle = getLineStyle(readU16(input, m_bigEndian));
     }
+    m_collector->collectLineStyle(lineStyle.lineType, lineStyle.capsType, lineStyle.joinType,
+                                  lineStyle.lineWidth, lineStyle.stretch, lineStyle.angle,
+                                  lineStyle.color, lineStyle.dashArray,
+                                  lineStyle.startMarker, lineStyle.endMarker);
   }
-  else
-    lineStyle.lineType = 1;
-  m_collector->collectLineStyle(lineStyle.lineType, lineStyle.capsType, lineStyle.joinType,
-                                lineStyle.lineWidth, lineStyle.stretch, lineStyle.angle,
-                                lineStyle.color, lineStyle.dashArray,
-                                lineStyle.startMarker, lineStyle.endMarker);
   if (bitMask & 0x04) // lens
   {
     if (m_precision == libcdr::PRECISION_32BIT)


More information about the Libreoffice-commits mailing list