src/lib/CDRCollector.cpp |   10 ++++++++-
 src/lib/CDRParser.cpp    |   50 ++++++++++++++++++++++++++++++++++-------------
 2 files changed, 46 insertions(+), 14 deletions(-)

New commits:
commit 2bdf2a9d5d2ef15c3af1434803d9b58b0bfa0a29
Author:     Fridrich Štrba <fridrich.st...@bluewin.ch>
AuthorDate: Thu Feb 6 22:36:35 2020 +0100
Commit:     Fridrich Štrba <fridrich.st...@bluewin.ch>
CommitDate: Thu Feb 6 22:36:35 2020 +0100

    Some more work on parsing CDRx6+ character colours
    
    Change-Id: Ia80c4efe9b6c3282a9ee92d9b75c9c16e1bfdc50

diff --git a/src/lib/CDRCollector.cpp b/src/lib/CDRCollector.cpp
index 0119a54..3f204d0 100644
--- a/src/lib/CDRCollector.cpp
+++ b/src/lib/CDRCollector.cpp
@@ -337,7 +337,6 @@ unsigned libcdr::CDRParserState::_getRGBColor(const 
CDRColor &color)
   case 0x01:
   case 0x02:
   case 0x15:
-  case 0x14:
   {
     double cmyk[4] =
     {
@@ -567,6 +566,15 @@ unsigned libcdr::CDRParserState::_getRGBColor(const 
CDRColor &color)
     blue = rgb[2];
     break;
   }
+  // Registration colour
+  case 0x14:
+  {
+    red = (unsigned char)cdr_round(255.0 * col0 / 100.0);
+    green = (unsigned char)cdr_round(255.0 * col0 / 100.0);
+    blue = (unsigned char)cdr_round(255.0 * col0 / 100.0);
+    break;
+  }
+
   default:
     break;
   }
diff --git a/src/lib/CDRParser.cpp b/src/lib/CDRParser.cpp
index e27357d..1cac4d5 100644
--- a/src/lib/CDRParser.cpp
+++ b/src/lib/CDRParser.cpp
@@ -117,16 +117,23 @@ static int parseColourString(const char *colourString, 
libcdr::CDRColor &colour,
     ("CMYK", 2)
     ("CMYK255", 3)
     ("RGB255", 5)
+    ("HSB", 6)
+    ("HLS", 7)
+    ("GRAY255", 9)
+    ("YIQ255", 11)
+    ("LAB255", 18)
+    ("REGCOLOR", 20)
+    ("SPOT", 25)
     ;
     auto it = colourString;
     const auto end = it + std::strlen(it);
     bRes = phrase_parse(it, end,
                         //  Begin grammar
                         (
-                          (cmodel | omit[+alnum]) >> -lit(',')
-                          >> omit[+alnum] >> -lit(',')
-                          >> *(uint_ >> -lit(','))
-                          >> (repeat(8)[alnum] >> '-' >> 
repeat(3)[repeat(4)[alnum] >> '-'] >> repeat(12)[alnum])
+                          (cmodel | omit[+alnum]) >> lit(',')
+                          >> omit[+alnum] >> lit(',')
+                          >> *(uint_ >> lit(','))
+                          >> (repeat(8)[xdigit] >> '-' >> 
repeat(3)[repeat(4)[xdigit] >> '-'] >> repeat(12)[xdigit])
                         ),
                         //  End grammar
                         space,
@@ -134,8 +141,8 @@ static int parseColourString(const char *colourString, 
libcdr::CDRColor &colour,
            && it == end;
   }
 
-  if (bRes)
-    return -1;
+  // if (bRes)
+  //  return -1;
 
   if (colourModel)
     colour.m_colorModel = get(colourModel);
@@ -144,17 +151,34 @@ static int parseColourString(const char *colourString, 
libcdr::CDRColor &colour,
   {
     colour.m_colorValue = val[0] | (val[1] << 8) | (val[2] << 16) | (val[3] << 
24);
     opacity = (double)val[4] / 100.0;
-    return 1;
   }
-
-  if (val.size() >= 4)
+  else if (val.size() >= 4)
   {
-    colour.m_colorValue = val[0] | (val[1] << 8) | (val[2] << 16);
+    if (colour.m_colorModel == 5)
+      colour.m_colorValue = val[2] | (val[1] << 8) | (val[0] << 16);
+    else if (colour.m_colorModel == 6 || colour.m_colorModel == 7)
+      colour.m_colorValue = val[0] | (val[1] << 16) | (val[2] << 24);
+    else
+      colour.m_colorValue = val[0] | (val[1] << 8) | (val[2] << 16);
     opacity = (double)val[3] / 100.0;
-    return 1;
   }
-
-  return 0;
+  else if (val.size() >= 2)
+  {
+    colour.m_colorValue = val[0];
+    opacity = (double)val[1] / 100.0;
+  }
+  else if (val.size() >= 1)
+  {
+    colour.m_colorValue = val[0];
+    opacity = 1.0;
+  }
+  else
+  {
+    CDR_DEBUG_MSG(("parseColourString --> bRes %i, size %lu, colorModel %u, 
colorValue 0x%.8x\n", bRes, val.size(), colour.m_colorModel, 
colour.m_colorValue));
+    return 0;
+  }
+  CDR_DEBUG_MSG(("parseColourString --> bRes %i, size %lu, colorModel %u, 
colorValue 0x%.8x\n", bRes, val.size(), colour.m_colorModel, 
colour.m_colorValue));
+  return 1;
 }
 
 void normalizeAngle(double &angle)
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to