Hi,

this patch adds support for the drop caps letters setting.
+ it fixes the column-count and column-gap reading.

Greetings,
Franz Schmid
>From 36f37dfd42b7ca2778a6c91135804135cd7d6f38 Mon Sep 17 00:00:00 2001
From: Franz Schmid <fr...@linux-hp-i7.site>
Date: Wed, 1 May 2013 20:35:07 +0200
Subject: [PATCH] Added support for DropCaps letter setting and fixed column and
 column-gap output.

---
 src/lib/MSPUBBlockID.h     |    2 ++
 src/lib/MSPUBCollector.cpp |   18 ++++++++++++++++++
 src/lib/MSPUBParser.cpp    |   27 +++++++++++++++------------
 src/lib/MSPUBTypes.h       |    3 ++-
 4 files changed, 37 insertions(+), 13 deletions(-)

diff --git a/src/lib/MSPUBBlockID.h b/src/lib/MSPUBBlockID.h
index a44c5a8..4cd7c2b 100644
--- a/src/lib/MSPUBBlockID.h
+++ b/src/lib/MSPUBBlockID.h
@@ -69,6 +69,8 @@ enum MSPUBBlockID // Don't be alarmed by multiple elements with the same value;
   PARAGRAPH_LEFT_INDENT = 0xD,
   PARAGRAPH_RIGHT_INDENT = 0xE,
   PARAGRAPH_DROP_CAP_LINES = 0x8,
+  PARAGRAPH_DROP_CAP_UP = 0x2C,
+  PARAGRAPH_DROP_CAP_LETTERS = 0x2D,
   THIS_MASTER_NAME = 0xE,
   APPLIED_MASTER_NAME = 0xD,
   BA_ARRAY = 0x02,
diff --git a/src/lib/MSPUBCollector.cpp b/src/lib/MSPUBCollector.cpp
index f16ae79..a23c713 100644
--- a/src/lib/MSPUBCollector.cpp
+++ b/src/lib/MSPUBCollector.cpp
@@ -809,6 +809,18 @@ boost::function<void(void)> libmspub::MSPUBCollector::paintShape(const ShapeInfo
         break;
       }
     }
+    if (info.m_numColumns)
+    {
+      unsigned ncols = info.m_numColumns.get_value_or(0);
+      if (ncols > 0)
+        props.insert("fo:column-count", (int)ncols);
+    }
+    if (info.m_columnSpacing)
+    {
+      unsigned ngap = info.m_columnSpacing;
+      if (ngap > 0)
+        props.insert("fo:column-gap", (double)ngap / EMUS_IN_INCH);
+    }
     m_painter->startTextObject(props, WPXPropertyListVector());
     for (unsigned i_lines = 0; i_lines < text.size(); ++i_lines)
     {
@@ -1199,6 +1211,12 @@ WPXPropertyList libmspub::MSPUBCollector::getParaStyleProps(const ParagraphStyle
   {
     ret.insert("style:drop-cap", (int)dropCapLines);
   }
+  unsigned dropCapLetters = style.m_dropCapLetters.get_value_or(
+                              defaultStyle.m_dropCapLetters.get_value_or(0));
+  if (dropCapLetters != 0)
+  {
+    ret.insert("style:length", (int)dropCapLetters);
+  }
   return ret;
 }
 
diff --git a/src/lib/MSPUBParser.cpp b/src/lib/MSPUBParser.cpp
index 418ea1b..993b706 100644
--- a/src/lib/MSPUBParser.cpp
+++ b/src/lib/MSPUBParser.cpp
@@ -1263,6 +1263,9 @@ libmspub::ParagraphStyle libmspub::MSPUBParser::getParagraphStyle(WPXInputStream
     case PARAGRAPH_DROP_CAP_LINES:
       ret.m_dropCapLines = info.data;
       break;
+    case PARAGRAPH_DROP_CAP_LETTERS:
+      ret.m_dropCapLetters = info.data;
+      break;
     default:
       break;
     }
@@ -1686,17 +1689,19 @@ void libmspub::MSPUBParser::parseEscherShape(WPXInputStream *input, const Escher
                                         dotStyle));
           }
 
-          unsigned *ptr_numColumns = getIfExists(foptValues.m_scalarValues,
-                                                 FIELDID_NUM_COLUMNS);
-          if (ptr_numColumns)
-          {
-            m_collector->setShapeNumColumns(*shapeSeqNum, *ptr_numColumns);
-          }
-          unsigned *ptr_columnSpacing = getIfExists(foptValues.m_scalarValues,
-                                        FIELDID_COLUMN_SPACING);
-          if (ptr_columnSpacing)
+          if (!!maybe_tertiaryFoptValues)
           {
-            m_collector->setShapeColumnSpacing(*shapeSeqNum, *ptr_columnSpacing);
+            std::map<unsigned short, unsigned> &tertiaryFoptValues = maybe_tertiaryFoptValues.get();
+            unsigned *ptr_numColumns = getIfExists(tertiaryFoptValues, FIELDID_NUM_COLUMNS);
+            if (ptr_numColumns)
+            {
+              m_collector->setShapeNumColumns(*shapeSeqNum, *ptr_numColumns);
+            }
+            unsigned *ptr_columnSpacing = getIfExists(tertiaryFoptValues, FIELDID_COLUMN_SPACING);
+            if (ptr_columnSpacing)
+            {
+              m_collector->setShapeColumnSpacing(*shapeSeqNum, *ptr_columnSpacing);
+            }
           }
           unsigned *ptr_beginArrowStyle = getIfExists(foptValues.m_scalarValues,
                                           FIELDID_BEGIN_ARROW_STYLE);
@@ -1774,7 +1779,6 @@ void libmspub::MSPUBParser::parseEscherShape(WPXInputStream *input, const Escher
           {
             std::vector<libmspub::Vertex> ret = parseVertices(wrapVertexData);
             m_collector->setShapeClipPath(*shapeSeqNum, ret);
-            MSPUB_DEBUG_MSG(("Current Escher shape has wrap Path\n"));
           }
         }
         if (foundAnchor)
@@ -2171,7 +2175,6 @@ libmspub::FOPTValues libmspub::MSPUBParser::extractFOPTValues(WPXInputStream *in
     unsigned short id = readU16(input);
     unsigned value  = readU32(input);
     ret.m_scalarValues[id] = value;
-    MSPUB_DEBUG_MSG(("EscherFopt ID %u  Value %u\n", id, value));
     bool complex = id & 0x8000;
     if (complex)
     {
diff --git a/src/lib/MSPUBTypes.h b/src/lib/MSPUBTypes.h
index 946f9c4..984ce5c 100644
--- a/src/lib/MSPUBTypes.h
+++ b/src/lib/MSPUBTypes.h
@@ -159,10 +159,11 @@ struct ParagraphStyle
   boost::optional<ListInfo> m_listInfo;
   std::vector<unsigned> m_tabStopsInEmu;
   boost::optional<unsigned> m_dropCapLines;
+  boost::optional<unsigned> m_dropCapLetters;
   ParagraphStyle() :
     m_align(), m_defaultCharStyleIndex(), m_lineSpacing(), m_spaceBeforeEmu(),
     m_spaceAfterEmu(), m_firstLineIndentEmu(), m_leftIndentEmu(),
-    m_rightIndentEmu(), m_listInfo(), m_tabStopsInEmu(), m_dropCapLines()
+    m_rightIndentEmu(), m_listInfo(), m_tabStopsInEmu(), m_dropCapLines(), m_dropCapLetters()
   {
   }
 };
-- 
1.7.1

_______________________________________________
LibreOffice mailing list
LibreOffice@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice

Reply via email to