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

Fridrich Å trba fridrich.strba at bluewin.ch
Sat Apr 13 06:37:42 PDT 2013


 src/lib/CDRParser.cpp |   40 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 40 insertions(+)

New commits:
commit f114b46288a23b8cfb1300c89b372c9d8a3c709d
Author: Fridrich Å trba <fridrich.strba at bluewin.ch>
Date:   Sat Apr 13 15:37:17 2013 +0200

    Boost-based parser of CDR x6 colour string

diff --git a/src/lib/CDRParser.cpp b/src/lib/CDRParser.cpp
index 5ffe7df..604a98c 100644
--- a/src/lib/CDRParser.cpp
+++ b/src/lib/CDRParser.cpp
@@ -34,6 +34,7 @@
 #include <set>
 #include <boost/property_tree/json_parser.hpp>
 #include <boost/property_tree/ptree.hpp>
+#include <boost/spirit/include/classic.hpp>
 #include "libcdr_utils.h"
 #include "CDRDocumentStructure.h"
 #include "CDRInternalStream.h"
@@ -128,6 +129,45 @@ static void processNameForEncoding(WPXString &name, unsigned short &encoding)
   return;
 }
 
+int parseColourString(const char *colourString, libcdr::CDRColor &colour, double &opacity)
+{
+  using namespace ::boost::spirit::classic;
+  bool bRes = false;
+
+  std::string colourModel;
+  unsigned val0, val1, val2, val3, val4;
+
+  if (colourString)
+  {
+    bRes = parse(colourString,
+                 //  Begin grammar
+                 (
+                   (repeat_p(1, more)[alnum_p])[assign_a(colourModel)] >> (',' | eps_p)
+                   >> (repeat_p(1, more)[alnum_p]) >> (',' | eps_p)
+                   >> int_p[assign_a(val0)] >> (',' | eps_p)
+                   >> int_p[assign_a(val1)] >> (',' | eps_p)
+                   >> int_p[assign_a(val2)] >> (',' | eps_p)
+                   >> int_p[assign_a(val3)] >> (',' | eps_p)
+                   >> int_p[assign_a(val4)] >> (',' | eps_p)
+                   >> (repeat_p(8)[alnum_p] >> ('-') >> repeat_p(3)[repeat_p(4)[alnum_p] >> ('-')] >> repeat_p(12)[alnum_p])
+                 ) >> end_p,
+                 //  End grammar
+                 space_p).full;
+  }
+
+  if( !bRes )
+    return -1;
+
+  if (colourModel == "CMYK")
+    colour.m_colorModel = 2;
+  else if (colourModel == "CMYK255")
+    colour.m_colorModel = 3;
+  colour.m_colorValue = val0 | (val1 << 8) | (val2 << 16) | (val3 << 24);
+  opacity = (double)val4 / 100.0;
+
+  return 1;
+}
+
 static void _readX6StyleString(WPXInputStream *input, unsigned length, libcdr::CDRCharacterStyle &style)
 {
   std::vector<unsigned char> styleBuffer(length);


More information about the Libreoffice-commits mailing list