src/lib/CDRParser.cpp |  900 +++++++++++++++++++++++++-------------------------
 src/lib/CDRParser.h   |    1 
 src/lib/CDRTypes.h    |    8 
 3 files changed, 458 insertions(+), 451 deletions(-)

New commits:
commit 9c123d71095d284fad32296b1d35b744878d33b1
Author:     Fridrich Štrba <fridrich.st...@bluewin.ch>
AuthorDate: Tue Feb 18 14:17:45 2020 +0100
Commit:     Fridrich Štrba <fridrich.st...@bluewin.ch>
CommitDate: Tue Feb 18 14:17:45 2020 +0100

    Extract palette resolution into a separate function
    
    Change-Id: Ifd7e8c42c1ff2cd0986a467a27335af6b441b2f8

diff --git a/src/lib/CDRParser.cpp b/src/lib/CDRParser.cpp
index 8d6ddba..eb43b39 100644
--- a/src/lib/CDRParser.cpp
+++ b/src/lib/CDRParser.cpp
@@ -734,476 +734,57 @@ double 
libcdr::CDRParser::readRectCoord(librevenge::RVNGInputStream *input)
 
 libcdr::CDRColor libcdr::CDRParser::readColor(librevenge::RVNGInputStream 
*input)
 {
-  unsigned short colorModel = 0;
-  unsigned colorValue = 0;
+  libcdr::CDRColor tmpColor;
+
   if (m_version >= 500)
   {
-    colorModel = readU16(input);
-    if (colorModel == 0x01 && m_version >= 1300)
-      colorModel = 0x19;
-    if (colorModel == 0x19 || colorModel == 0x1e)
-    {
-      unsigned char r = 0;
-      unsigned char g = 0;
-      unsigned char b = 0;
-      unsigned char c = 0;
-      unsigned char m = 0;
-      unsigned char y = 0;
-      unsigned char k = 100;
-      unsigned short paletteID = 0;
-      /* A bug in CorelDraw x7 creates a corrupted file. If we meet colorModel 
of 0x1e,
-       * it is actually colorModel 0x19 and paletteId 0x1e */
-      if (colorModel == 0x1e)
-      {
-        colorModel = 0x19;
-        paletteID = 0x1e;
-      }
-      else
-      {
-        paletteID = readU16(input);
-        input->seek(4, librevenge::RVNG_SEEK_CUR);
-      }
-      unsigned short ix = readU16(input);
-      unsigned short tint = readU16(input);
-      switch (paletteID)
-      {
-      case 0x03:
-        if (ix > 0
-            && ix <= sizeof(palette_19_03_C)/sizeof(palette_19_03_C[0])
-            && ix <= sizeof(palette_19_03_M)/sizeof(palette_19_03_M[0])
-            && ix <= sizeof(palette_19_03_Y)/sizeof(palette_19_03_Y[0])
-            && ix <= sizeof(palette_19_03_K)/sizeof(palette_19_03_K[0]))
-        {
-          c = palette_19_03_C[ix-1];
-          m = palette_19_03_M[ix-1];
-          y = palette_19_03_Y[ix-1];
-          k = palette_19_03_K[ix-1];
-        }
-        break;
-      case 0x08:
-        if (ix > 0
-            && ix <= sizeof(palette_19_08_C)/sizeof(palette_19_08_C[0])
-            && ix <= sizeof(palette_19_08_M)/sizeof(palette_19_08_M[0])
-            && ix <= sizeof(palette_19_08_Y)/sizeof(palette_19_08_Y[0])
-            && ix <= sizeof(palette_19_08_K)/sizeof(palette_19_08_K[0]))
-        {
-          c = palette_19_08_C[ix-1];
-          m = palette_19_08_M[ix-1];
-          y = palette_19_08_Y[ix-1];
-          k = palette_19_08_K[ix-1];
-        }
-        break;
-      case 0x09:
-        if (ix > 0
-            && ix <= sizeof(palette_19_09_L)/sizeof(palette_19_09_L[0])
-            && ix <= sizeof(palette_19_09_A)/sizeof(palette_19_09_A[0])
-            && ix <= sizeof(palette_19_09_B)/sizeof(palette_19_09_B[0]))
-        {
-          colorValue = palette_19_09_B[ix-1];
-          colorValue <<= 8;
-          colorValue |= palette_19_09_A[ix-1];
-          colorValue <<= 8;
-          colorValue |= palette_19_09_L[ix-1];
-        }
-        break;
-      case 0x0a:
-        if (ix > 0
-            && ix <= sizeof(palette_19_0A_C)/sizeof(palette_19_0A_C[0])
-            && ix <= sizeof(palette_19_0A_M)/sizeof(palette_19_0A_M[0])
-            && ix <= sizeof(palette_19_0A_Y)/sizeof(palette_19_0A_Y[0])
-            && ix <= sizeof(palette_19_0A_K)/sizeof(palette_19_0A_K[0]))
-        {
-          c = palette_19_0A_C[ix-1];
-          m = palette_19_0A_M[ix-1];
-          y = palette_19_0A_Y[ix-1];
-          k = palette_19_0A_K[ix-1];
-        }
-        break;
-      case 0x0b:
-        if (ix > 0
-            && ix <= sizeof(palette_19_0B_C)/sizeof(palette_19_0B_C[0])
-            && ix <= sizeof(palette_19_0B_M)/sizeof(palette_19_0B_M[0])
-            && ix <= sizeof(palette_19_0B_Y)/sizeof(palette_19_0B_Y[0])
-            && ix <= sizeof(palette_19_0B_K)/sizeof(palette_19_0B_K[0]))
-        {
-          c = palette_19_0B_C[ix-1];
-          m = palette_19_0B_M[ix-1];
-          y = palette_19_0B_Y[ix-1];
-          k = palette_19_0B_K[ix-1];
-        }
-        break;
-      case 0x11:
-        if (ix > 0
-            && ix <= sizeof(palette_19_11_C)/sizeof(palette_19_11_C[0])
-            && ix <= sizeof(palette_19_11_M)/sizeof(palette_19_11_M[0])
-            && ix <= sizeof(palette_19_11_Y)/sizeof(palette_19_11_Y[0])
-            && ix <= sizeof(palette_19_11_K)/sizeof(palette_19_11_K[0]))
-        {
-          c = palette_19_11_C[ix-1];
-          m = palette_19_11_M[ix-1];
-          y = palette_19_11_Y[ix-1];
-          k = palette_19_11_K[ix-1];
-        }
-        break;
-      case 0x12:
-        if (ix > 0
-            && ix <= sizeof(palette_19_12_C)/sizeof(palette_19_12_C[0])
-            && ix <= sizeof(palette_19_12_M)/sizeof(palette_19_12_M[0])
-            && ix <= sizeof(palette_19_12_Y)/sizeof(palette_19_12_Y[0])
-            && ix <= sizeof(palette_19_12_K)/sizeof(palette_19_12_K[0]))
-        {
-          c = palette_19_12_C[ix-1];
-          m = palette_19_12_M[ix-1];
-          y = palette_19_12_Y[ix-1];
-          k = palette_19_12_K[ix-1];
-        }
-        break;
-      case 0x14:
-        if (ix > 0
-            && ix <= sizeof(palette_19_14_C)/sizeof(palette_19_14_C[0])
-            && ix <= sizeof(palette_19_14_M)/sizeof(palette_19_14_M[0])
-            && ix <= sizeof(palette_19_14_Y)/sizeof(palette_19_14_Y[0])
-            && ix <= sizeof(palette_19_14_K)/sizeof(palette_19_14_K[0]))
-        {
-          c = palette_19_14_C[ix-1];
-          m = palette_19_14_M[ix-1];
-          y = palette_19_14_Y[ix-1];
-          k = palette_19_14_K[ix-1];
-        }
-        break;
-      case 0x15:
-        if (ix > 0
-            && ix <= sizeof(palette_19_15_C)/sizeof(palette_19_15_C[0])
-            && ix <= sizeof(palette_19_15_M)/sizeof(palette_19_15_M[0])
-            && ix <= sizeof(palette_19_15_Y)/sizeof(palette_19_15_Y[0])
-            && ix <= sizeof(palette_19_15_K)/sizeof(palette_19_15_K[0]))
-        {
-          c = palette_19_15_C[ix-1];
-          m = palette_19_15_M[ix-1];
-          y = palette_19_15_Y[ix-1];
-          k = palette_19_15_K[ix-1];
-        }
-        break;
-      case 0x16:
-        if (ix > 0
-            && ix <= sizeof(palette_19_16_C)/sizeof(palette_19_16_C[0])
-            && ix <= sizeof(palette_19_16_M)/sizeof(palette_19_16_M[0])
-            && ix <= sizeof(palette_19_16_Y)/sizeof(palette_19_16_Y[0])
-            && ix <= sizeof(palette_19_16_K)/sizeof(palette_19_16_K[0]))
-        {
-          c = palette_19_16_C[ix-1];
-          m = palette_19_16_M[ix-1];
-          y = palette_19_16_Y[ix-1];
-          k = palette_19_16_K[ix-1];
-        }
-        break;
-      case 0x17:
-        if (ix > 0
-            && ix <= sizeof(palette_19_17_C)/sizeof(palette_19_17_C[0])
-            && ix <= sizeof(palette_19_17_M)/sizeof(palette_19_17_M[0])
-            && ix <= sizeof(palette_19_17_Y)/sizeof(palette_19_17_Y[0])
-            && ix <= sizeof(palette_19_17_K)/sizeof(palette_19_17_K[0]))
-        {
-          c = palette_19_17_C[ix-1];
-          m = palette_19_17_M[ix-1];
-          y = palette_19_17_Y[ix-1];
-          k = palette_19_17_K[ix-1];
-        }
-        break;
-      case 0x1a:
-        if (ix < sizeof(palette_19_1A_C)/sizeof(palette_19_1A_C[0])
-            && ix < sizeof(palette_19_1A_M)/sizeof(palette_19_1A_M[0])
-            && ix < sizeof(palette_19_1A_Y)/sizeof(palette_19_1A_Y[0])
-            && ix < sizeof(palette_19_1A_K)/sizeof(palette_19_1A_K[0]))
-        {
-          c = palette_19_1A_C[ix];
-          m = palette_19_1A_M[ix];
-          y = palette_19_1A_Y[ix];
-          k = palette_19_1A_K[ix];
-        }
-        break;
-      case 0x1b:
-        if (ix < sizeof(palette_19_1B_C)/sizeof(palette_19_1B_C[0])
-            && ix < sizeof(palette_19_1B_M)/sizeof(palette_19_1B_M[0])
-            && ix < sizeof(palette_19_1B_Y)/sizeof(palette_19_1B_Y[0])
-            && ix < sizeof(palette_19_1B_K)/sizeof(palette_19_1B_K[0]))
-        {
-          c = palette_19_1B_C[ix];
-          m = palette_19_1B_M[ix];
-          y = palette_19_1B_Y[ix];
-          k = palette_19_1B_K[ix];
-        }
-        break;
-      case 0x1c:
-        if (ix < sizeof(palette_19_1C_C)/sizeof(palette_19_1C_C[0])
-            && ix < sizeof(palette_19_1C_M)/sizeof(palette_19_1C_M[0])
-            && ix < sizeof(palette_19_1C_Y)/sizeof(palette_19_1C_Y[0])
-            && ix < sizeof(palette_19_1C_K)/sizeof(palette_19_1C_K[0]))
-        {
-          c = palette_19_1C_C[ix];
-          m = palette_19_1C_M[ix];
-          y = palette_19_1C_Y[ix];
-          k = palette_19_1C_K[ix];
-        }
-        break;
-      case 0x1d:
-        if (ix < sizeof(palette_19_1D_C)/sizeof(palette_19_1D_C[0])
-            && ix < sizeof(palette_19_1D_M)/sizeof(palette_19_1D_M[0])
-            && ix < sizeof(palette_19_1D_Y)/sizeof(palette_19_1D_Y[0])
-            && ix < sizeof(palette_19_1D_K)/sizeof(palette_19_1D_K[0]))
-        {
-          c = palette_19_1D_C[ix];
-          m = palette_19_1D_M[ix];
-          y = palette_19_1D_Y[ix];
-          k = palette_19_1D_K[ix];
-        }
-        break;
-      case 0x1e:
-        if (ix > 0
-            && ix <= sizeof(palette_19_1E_R)/sizeof(palette_19_1E_R[0])
-            && ix <= sizeof(palette_19_1E_G)/sizeof(palette_19_1E_G[0])
-            && ix <= sizeof(palette_19_1E_B)/sizeof(palette_19_1E_B[0]))
-        {
-          r = palette_19_1E_R[ix-1];
-          g = palette_19_1E_G[ix-1];
-          b = palette_19_1E_B[ix-1];
-        }
-        break;
-      case 0x1f:
-        if (ix > 0
-            && ix <= sizeof(palette_19_1F_R)/sizeof(palette_19_1F_R[0])
-            && ix <= sizeof(palette_19_1F_G)/sizeof(palette_19_1F_G[0])
-            && ix <= sizeof(palette_19_1F_B)/sizeof(palette_19_1F_B[0]))
-        {
-          r = palette_19_1F_R[ix-1];
-          g = palette_19_1F_G[ix-1];
-          b = palette_19_1F_B[ix-1];
-        }
-        break;
-      case 0x20:
-        if (ix > 0
-            && ix <= sizeof(palette_19_20_R)/sizeof(palette_19_20_R[0])
-            && ix <= sizeof(palette_19_20_G)/sizeof(palette_19_20_G[0])
-            && ix <= sizeof(palette_19_20_B)/sizeof(palette_19_20_B[0]))
-        {
-          r = palette_19_20_R[ix-1];
-          g = palette_19_20_G[ix-1];
-          b = palette_19_20_B[ix-1];
-        }
-        break;
-      case 0x23:
-        if (ix > 0
-            && ix <= sizeof(palette_19_23_C)/sizeof(palette_19_23_C[0])
-            && ix <= sizeof(palette_19_23_M)/sizeof(palette_19_23_M[0])
-            && ix <= sizeof(palette_19_23_Y)/sizeof(palette_19_23_Y[0])
-            && ix <= sizeof(palette_19_23_K)/sizeof(palette_19_23_K[0]))
-        {
-          c = palette_19_23_C[ix-1];
-          m = palette_19_23_M[ix-1];
-          y = palette_19_23_Y[ix-1];
-          k = palette_19_23_K[ix-1];
-        }
-        break;
-      case 0x24:
-        if (ix > 0
-            && ix <= sizeof(palette_19_24_C)/sizeof(palette_19_24_C[0])
-            && ix <= sizeof(palette_19_24_M)/sizeof(palette_19_24_M[0])
-            && ix <= sizeof(palette_19_24_Y)/sizeof(palette_19_24_Y[0])
-            && ix <= sizeof(palette_19_24_K)/sizeof(palette_19_24_K[0]))
-        {
-          c = palette_19_24_C[ix-1];
-          m = palette_19_24_M[ix-1];
-          y = palette_19_24_Y[ix-1];
-          k = palette_19_24_K[ix-1];
-        }
-        break;
-      case 0x25:
-        if (ix > 0
-            && ix <= sizeof(palette_19_25_C)/sizeof(palette_19_25_C[0])
-            && ix <= sizeof(palette_19_25_M)/sizeof(palette_19_25_M[0])
-            && ix <= sizeof(palette_19_25_Y)/sizeof(palette_19_25_Y[0])
-            && ix <= sizeof(palette_19_25_K)/sizeof(palette_19_25_K[0]))
-        {
-          c = palette_19_25_C[ix-1];
-          m = palette_19_25_M[ix-1];
-          y = palette_19_25_Y[ix-1];
-          k = palette_19_25_K[ix-1];
-        }
-        break;
-      default:
-        colorValue = (tint << 16) | ix;
-        break;
-      }
-
-      switch (paletteID)
-      {
-      case 0x03:
-      case 0x08:
-      case 0x0a:
-      case 0x0b:
-      case 0x11:
-      case 0x12:
-      case 0x14:
-      case 0x15:
-      case 0x16:
-      case 0x17:
-      case 0x1a:
-      case 0x1b:
-      case 0x1c:
-      case 0x1d:
-      case 0x23:
-      case 0x24:
-      case 0x25:
-      {
-        colorModel = 0x02; // CMYK100
-        unsigned cyan = (unsigned)tint * (unsigned)c / 100;
-        unsigned magenta = (unsigned)tint * (unsigned)m / 100;
-        unsigned yellow = (unsigned)tint * (unsigned)y / 100;
-        unsigned black = (unsigned)tint * (unsigned)k / 100;
-        colorValue = (black & 0xff);
-        colorValue <<= 8;
-        colorValue |= (yellow & 0xff);
-        colorValue <<= 8;
-        colorValue |= (magenta & 0xff);
-        colorValue <<= 8;
-        colorValue |= (cyan & 0xff);
-        break;
-      }
-      case 0x1e:
-      case 0x1f:
-      case 0x20:
-      {
-        colorModel = 0x05; // RGB
-        unsigned red = (unsigned)tint * (unsigned)r + 255 * (100 - tint);
-        unsigned green = (unsigned)tint * (unsigned)g + 255 * (100 - tint);
-        unsigned blue = (unsigned)tint * (unsigned)b + 255 * (100 - tint);
-        red /= 100;
-        green /= 100;
-        blue /= 100;
-        colorValue = (red & 0xff);
-        colorValue <<= 8;
-        colorValue |= (green & 0xff);
-        colorValue <<= 8;
-        colorValue |= (blue & 0xff);
-        break;
-      }
-      case 0x09:
-        colorModel = 0x12; // L*a*b
-        break;
-      default:
-        break;
-      }
-    }
-    else if (colorModel == 0x0e)
+    tmpColor.m_colorModel = readU16(input);
+    if (tmpColor.m_colorModel == 0x01 && m_version >= 1300)
+      tmpColor.m_colorModel = 0x19;
+    /* A bug in CorelDraw x7 creates a corrupted file. If we meet colorModel 
of 0x1e,
+     * it is actually colorModel 0x19 and paletteId 0x1e */
+    if (tmpColor.m_colorModel == 0x1e)
     {
-      unsigned short paletteID = readU16(input);
-      input->seek(4, librevenge::RVNG_SEEK_CUR);
-      unsigned short ix = readU16(input);
-      unsigned short tint = readU16(input);
-      switch (paletteID)
-      {
-      case 0x0c:
-        if (ix > 0
-            && ix <= sizeof(palette_0E_0C_L)/sizeof(palette_0E_0C_L[0])
-            && ix <= sizeof(palette_0E_0C_A)/sizeof(palette_0E_0C_A[0])
-            && ix <= sizeof(palette_0E_0C_B)/sizeof(palette_0E_0C_B[0]))
-        {
-          colorValue = palette_0E_0C_B[ix-1];
-          colorValue <<= 8;
-          colorValue |= palette_0E_0C_A[ix-1];
-          colorValue <<= 8;
-          colorValue |= palette_0E_0C_L[ix-1];
-        }
-        break;
-      case 0x18:
-        if (ix > 0
-            && ix <= sizeof(palette_0E_18_L)/sizeof(palette_0E_18_L[0])
-            && ix <= sizeof(palette_0E_18_A)/sizeof(palette_0E_18_A[0])
-            && ix <= sizeof(palette_0E_18_B)/sizeof(palette_0E_18_B[0]))
-        {
-          colorValue = palette_0E_18_B[ix-1];
-          colorValue <<= 8;
-          colorValue |= palette_0E_18_A[ix-1];
-          colorValue <<= 8;
-          colorValue |= palette_0E_18_L[ix-1];
-        }
-        break;
-      case 0x21:
-        if (ix > 0
-            && ix <= sizeof(palette_0E_21_L)/sizeof(palette_0E_21_L[0])
-            && ix <= sizeof(palette_0E_21_A)/sizeof(palette_0E_21_A[0])
-            && ix <= sizeof(palette_0E_21_B)/sizeof(palette_0E_21_B[0]))
-        {
-          colorValue = palette_0E_21_B[ix-1];
-          colorValue <<= 8;
-          colorValue |= palette_0E_21_A[ix-1];
-          colorValue <<= 8;
-          colorValue |= palette_0E_21_L[ix-1];
-        }
-        break;
-      case 0x22:
-        if (ix > 0
-            && ix <= sizeof(palette_0E_22_L)/sizeof(palette_0E_22_L[0])
-            && ix <= sizeof(palette_0E_22_A)/sizeof(palette_0E_22_A[0])
-            && ix <= sizeof(palette_0E_22_B)/sizeof(palette_0E_22_B[0]))
-        {
-          colorValue = palette_0E_22_B[ix-1];
-          colorValue <<= 8;
-          colorValue |= palette_0E_22_A[ix-1];
-          colorValue <<= 8;
-          colorValue |= palette_0E_22_L[ix-1];
-        }
-        break;
-      default:
-        colorValue = tint;
-        colorValue <<= 16;
-        colorValue |= ix;
-        break;
-      }
-
-      switch (paletteID)
-      {
-      case 0x0c:
-      case 0x18:
-      case 0x21:
-      case 0x22:
-        colorModel = 0x12; // L*a*b
-        break;
-      default:
-        break;
-      }
+      tmpColor.m_colorModel = 0x19;
+      tmpColor.m_colorPalette = 0x1e;
     }
     else
     {
-      input->seek(6, librevenge::RVNG_SEEK_CUR);
-      colorValue = readU32(input);
+      tmpColor.m_colorPalette = readU16(input);
+      input->seek(4, librevenge::RVNG_SEEK_CUR);
     }
+    tmpColor.m_colorValue = readU32(input);
+
   }
   else if (m_version >= 400)
   {
-    colorModel = readU16(input);
+    tmpColor.m_colorModel = readU16(input);
     unsigned short c = readU16(input);
     unsigned short m = readU16(input);
     unsigned short y = readU16(input);
     unsigned short k = readU16(input);
-    colorValue = (k & 0xff);
-    colorValue <<= 8;
-    colorValue |= (y & 0xff);
-    colorValue <<= 8;
-    colorValue |= (m & 0xff);
-    colorValue <<= 8;
-    colorValue |= (c & 0xff);
+    tmpColor.m_colorValue = (k & 0xff);
+    tmpColor.m_colorValue <<= 8;
+    tmpColor.m_colorValue |= (y & 0xff);
+    tmpColor.m_colorValue <<= 8;
+    tmpColor.m_colorValue |= (m & 0xff);
+    tmpColor.m_colorValue <<= 8;
+    tmpColor.m_colorValue |= (c & 0xff);
     input->seek(2, librevenge::RVNG_SEEK_CUR);
   }
   else
   {
-    colorModel = readU8(input);
-    colorValue = readU32(input);
+    tmpColor.m_colorModel = readU8(input);
+    tmpColor.m_colorValue = readU32(input);
   }
 
-  CDR_DEBUG_MSG(("CDRParser::readColor --> colorModel 0x%x -- colorValue 
0x%x\n", colorModel, colorValue));
+  CDR_DEBUG_MSG(("CDRParser::readColor --> colorModel 0x%x -- colorPalette 
0x%x -- colorValue 0x%x\n", tmpColor.m_colorModel, tmpColor.m_colorPalette, 
tmpColor.m_colorValue));
 
-  return libcdr::CDRColor(colorModel, colorValue);
+  _resolveColorPalette(tmpColor);
+
+  CDR_DEBUG_MSG(("CDRParser::readColor resolved --> colorModel 0x%x -- 
colorPalette 0x%x -- colorValue 0x%x\n", tmpColor.m_colorModel, 
tmpColor.m_colorPalette, tmpColor.m_colorValue));
+
+  return tmpColor;
 }
 
 void libcdr::CDRParser::readRectangle(librevenge::RVNGInputStream *input)
@@ -3552,4 +3133,425 @@ void 
libcdr::CDRParser::_skipX3Optional(librevenge::RVNGInputStream *input)
   }
 }
 
+void libcdr::CDRParser::_resolveColorPalette(libcdr::CDRColor &color)
+{
+  unsigned char r = 0;
+  unsigned char g = 0;
+  unsigned char b = 0;
+  unsigned char c = 0;
+  unsigned char m = 0;
+  unsigned char y = 0;
+  unsigned char k = 100;
+
+  unsigned short ix = color.m_colorValue & 0xffff;
+  unsigned short tint = (color.m_colorValue >> 16) & 0xffff;
+
+  if (color.m_colorModel == 0x19)
+  {
+    switch (color.m_colorPalette)
+    {
+    case 0x03:
+      if (ix > 0
+          && ix <= sizeof(palette_19_03_C)/sizeof(palette_19_03_C[0])
+          && ix <= sizeof(palette_19_03_M)/sizeof(palette_19_03_M[0])
+          && ix <= sizeof(palette_19_03_Y)/sizeof(palette_19_03_Y[0])
+          && ix <= sizeof(palette_19_03_K)/sizeof(palette_19_03_K[0]))
+      {
+        c = palette_19_03_C[ix-1];
+        m = palette_19_03_M[ix-1];
+        y = palette_19_03_Y[ix-1];
+        k = palette_19_03_K[ix-1];
+      }
+      break;
+    case 0x08:
+      if (ix > 0
+          && ix <= sizeof(palette_19_08_C)/sizeof(palette_19_08_C[0])
+          && ix <= sizeof(palette_19_08_M)/sizeof(palette_19_08_M[0])
+          && ix <= sizeof(palette_19_08_Y)/sizeof(palette_19_08_Y[0])
+          && ix <= sizeof(palette_19_08_K)/sizeof(palette_19_08_K[0]))
+      {
+        c = palette_19_08_C[ix-1];
+        m = palette_19_08_M[ix-1];
+        y = palette_19_08_Y[ix-1];
+        k = palette_19_08_K[ix-1];
+      }
+      break;
+    case 0x09:
+      if (ix > 0
+          && ix <= sizeof(palette_19_09_L)/sizeof(palette_19_09_L[0])
+          && ix <= sizeof(palette_19_09_A)/sizeof(palette_19_09_A[0])
+          && ix <= sizeof(palette_19_09_B)/sizeof(palette_19_09_B[0]))
+      {
+        color.m_colorValue = palette_19_09_B[ix-1];
+        color.m_colorValue <<= 8;
+        color.m_colorValue |= palette_19_09_A[ix-1];
+        color.m_colorValue <<= 8;
+        color.m_colorValue |= palette_19_09_L[ix-1];
+      }
+      break;
+    case 0x0a:
+      if (ix > 0
+          && ix <= sizeof(palette_19_0A_C)/sizeof(palette_19_0A_C[0])
+          && ix <= sizeof(palette_19_0A_M)/sizeof(palette_19_0A_M[0])
+          && ix <= sizeof(palette_19_0A_Y)/sizeof(palette_19_0A_Y[0])
+          && ix <= sizeof(palette_19_0A_K)/sizeof(palette_19_0A_K[0]))
+      {
+        c = palette_19_0A_C[ix-1];
+        m = palette_19_0A_M[ix-1];
+        y = palette_19_0A_Y[ix-1];
+        k = palette_19_0A_K[ix-1];
+      }
+      break;
+    case 0x0b:
+      if (ix > 0
+          && ix <= sizeof(palette_19_0B_C)/sizeof(palette_19_0B_C[0])
+          && ix <= sizeof(palette_19_0B_M)/sizeof(palette_19_0B_M[0])
+          && ix <= sizeof(palette_19_0B_Y)/sizeof(palette_19_0B_Y[0])
+          && ix <= sizeof(palette_19_0B_K)/sizeof(palette_19_0B_K[0]))
+      {
+        c = palette_19_0B_C[ix-1];
+        m = palette_19_0B_M[ix-1];
+        y = palette_19_0B_Y[ix-1];
+        k = palette_19_0B_K[ix-1];
+      }
+      break;
+    case 0x11:
+      if (ix > 0
+          && ix <= sizeof(palette_19_11_C)/sizeof(palette_19_11_C[0])
+          && ix <= sizeof(palette_19_11_M)/sizeof(palette_19_11_M[0])
+          && ix <= sizeof(palette_19_11_Y)/sizeof(palette_19_11_Y[0])
+          && ix <= sizeof(palette_19_11_K)/sizeof(palette_19_11_K[0]))
+      {
+        c = palette_19_11_C[ix-1];
+        m = palette_19_11_M[ix-1];
+        y = palette_19_11_Y[ix-1];
+        k = palette_19_11_K[ix-1];
+      }
+      break;
+    case 0x12:
+      if (ix > 0
+          && ix <= sizeof(palette_19_12_C)/sizeof(palette_19_12_C[0])
+          && ix <= sizeof(palette_19_12_M)/sizeof(palette_19_12_M[0])
+          && ix <= sizeof(palette_19_12_Y)/sizeof(palette_19_12_Y[0])
+          && ix <= sizeof(palette_19_12_K)/sizeof(palette_19_12_K[0]))
+      {
+        c = palette_19_12_C[ix-1];
+        m = palette_19_12_M[ix-1];
+        y = palette_19_12_Y[ix-1];
+        k = palette_19_12_K[ix-1];
+      }
+      break;
+    case 0x14:
+      if (ix > 0
+          && ix <= sizeof(palette_19_14_C)/sizeof(palette_19_14_C[0])
+          && ix <= sizeof(palette_19_14_M)/sizeof(palette_19_14_M[0])
+          && ix <= sizeof(palette_19_14_Y)/sizeof(palette_19_14_Y[0])
+          && ix <= sizeof(palette_19_14_K)/sizeof(palette_19_14_K[0]))
+      {
+        c = palette_19_14_C[ix-1];
+        m = palette_19_14_M[ix-1];
+        y = palette_19_14_Y[ix-1];
+        k = palette_19_14_K[ix-1];
+      }
+      break;
+    case 0x15:
+      if (ix > 0
+          && ix <= sizeof(palette_19_15_C)/sizeof(palette_19_15_C[0])
+          && ix <= sizeof(palette_19_15_M)/sizeof(palette_19_15_M[0])
+          && ix <= sizeof(palette_19_15_Y)/sizeof(palette_19_15_Y[0])
+          && ix <= sizeof(palette_19_15_K)/sizeof(palette_19_15_K[0]))
+      {
+        c = palette_19_15_C[ix-1];
+        m = palette_19_15_M[ix-1];
+        y = palette_19_15_Y[ix-1];
+        k = palette_19_15_K[ix-1];
+      }
+      break;
+    case 0x16:
+      if (ix > 0
+          && ix <= sizeof(palette_19_16_C)/sizeof(palette_19_16_C[0])
+          && ix <= sizeof(palette_19_16_M)/sizeof(palette_19_16_M[0])
+          && ix <= sizeof(palette_19_16_Y)/sizeof(palette_19_16_Y[0])
+          && ix <= sizeof(palette_19_16_K)/sizeof(palette_19_16_K[0]))
+      {
+        c = palette_19_16_C[ix-1];
+        m = palette_19_16_M[ix-1];
+        y = palette_19_16_Y[ix-1];
+        k = palette_19_16_K[ix-1];
+      }
+      break;
+    case 0x17:
+      if (ix > 0
+          && ix <= sizeof(palette_19_17_C)/sizeof(palette_19_17_C[0])
+          && ix <= sizeof(palette_19_17_M)/sizeof(palette_19_17_M[0])
+          && ix <= sizeof(palette_19_17_Y)/sizeof(palette_19_17_Y[0])
+          && ix <= sizeof(palette_19_17_K)/sizeof(palette_19_17_K[0]))
+      {
+        c = palette_19_17_C[ix-1];
+        m = palette_19_17_M[ix-1];
+        y = palette_19_17_Y[ix-1];
+        k = palette_19_17_K[ix-1];
+      }
+      break;
+    case 0x1a:
+      if (ix < sizeof(palette_19_1A_C)/sizeof(palette_19_1A_C[0])
+          && ix < sizeof(palette_19_1A_M)/sizeof(palette_19_1A_M[0])
+          && ix < sizeof(palette_19_1A_Y)/sizeof(palette_19_1A_Y[0])
+          && ix < sizeof(palette_19_1A_K)/sizeof(palette_19_1A_K[0]))
+      {
+        c = palette_19_1A_C[ix];
+        m = palette_19_1A_M[ix];
+        y = palette_19_1A_Y[ix];
+        k = palette_19_1A_K[ix];
+      }
+      break;
+    case 0x1b:
+      if (ix < sizeof(palette_19_1B_C)/sizeof(palette_19_1B_C[0])
+          && ix < sizeof(palette_19_1B_M)/sizeof(palette_19_1B_M[0])
+          && ix < sizeof(palette_19_1B_Y)/sizeof(palette_19_1B_Y[0])
+          && ix < sizeof(palette_19_1B_K)/sizeof(palette_19_1B_K[0]))
+      {
+        c = palette_19_1B_C[ix];
+        m = palette_19_1B_M[ix];
+        y = palette_19_1B_Y[ix];
+        k = palette_19_1B_K[ix];
+      }
+      break;
+    case 0x1c:
+      if (ix < sizeof(palette_19_1C_C)/sizeof(palette_19_1C_C[0])
+          && ix < sizeof(palette_19_1C_M)/sizeof(palette_19_1C_M[0])
+          && ix < sizeof(palette_19_1C_Y)/sizeof(palette_19_1C_Y[0])
+          && ix < sizeof(palette_19_1C_K)/sizeof(palette_19_1C_K[0]))
+      {
+        c = palette_19_1C_C[ix];
+        m = palette_19_1C_M[ix];
+        y = palette_19_1C_Y[ix];
+        k = palette_19_1C_K[ix];
+      }
+      break;
+    case 0x1d:
+      if (ix < sizeof(palette_19_1D_C)/sizeof(palette_19_1D_C[0])
+          && ix < sizeof(palette_19_1D_M)/sizeof(palette_19_1D_M[0])
+          && ix < sizeof(palette_19_1D_Y)/sizeof(palette_19_1D_Y[0])
+          && ix < sizeof(palette_19_1D_K)/sizeof(palette_19_1D_K[0]))
+      {
+        c = palette_19_1D_C[ix];
+        m = palette_19_1D_M[ix];
+        y = palette_19_1D_Y[ix];
+        k = palette_19_1D_K[ix];
+      }
+      break;
+    case 0x1e:
+      if (ix > 0
+          && ix <= sizeof(palette_19_1E_R)/sizeof(palette_19_1E_R[0])
+          && ix <= sizeof(palette_19_1E_G)/sizeof(palette_19_1E_G[0])
+          && ix <= sizeof(palette_19_1E_B)/sizeof(palette_19_1E_B[0]))
+      {
+        r = palette_19_1E_R[ix-1];
+        g = palette_19_1E_G[ix-1];
+        b = palette_19_1E_B[ix-1];
+      }
+      break;
+    case 0x1f:
+      if (ix > 0
+          && ix <= sizeof(palette_19_1F_R)/sizeof(palette_19_1F_R[0])
+          && ix <= sizeof(palette_19_1F_G)/sizeof(palette_19_1F_G[0])
+          && ix <= sizeof(palette_19_1F_B)/sizeof(palette_19_1F_B[0]))
+      {
+        r = palette_19_1F_R[ix-1];
+        g = palette_19_1F_G[ix-1];
+        b = palette_19_1F_B[ix-1];
+      }
+      break;
+    case 0x20:
+      if (ix > 0
+          && ix <= sizeof(palette_19_20_R)/sizeof(palette_19_20_R[0])
+          && ix <= sizeof(palette_19_20_G)/sizeof(palette_19_20_G[0])
+          && ix <= sizeof(palette_19_20_B)/sizeof(palette_19_20_B[0]))
+      {
+        r = palette_19_20_R[ix-1];
+        g = palette_19_20_G[ix-1];
+        b = palette_19_20_B[ix-1];
+      }
+      break;
+    case 0x23:
+      if (ix > 0
+          && ix <= sizeof(palette_19_23_C)/sizeof(palette_19_23_C[0])
+          && ix <= sizeof(palette_19_23_M)/sizeof(palette_19_23_M[0])
+          && ix <= sizeof(palette_19_23_Y)/sizeof(palette_19_23_Y[0])
+          && ix <= sizeof(palette_19_23_K)/sizeof(palette_19_23_K[0]))
+      {
+        c = palette_19_23_C[ix-1];
+        m = palette_19_23_M[ix-1];
+        y = palette_19_23_Y[ix-1];
+        k = palette_19_23_K[ix-1];
+      }
+      break;
+    case 0x24:
+      if (ix > 0
+          && ix <= sizeof(palette_19_24_C)/sizeof(palette_19_24_C[0])
+          && ix <= sizeof(palette_19_24_M)/sizeof(palette_19_24_M[0])
+          && ix <= sizeof(palette_19_24_Y)/sizeof(palette_19_24_Y[0])
+          && ix <= sizeof(palette_19_24_K)/sizeof(palette_19_24_K[0]))
+      {
+        c = palette_19_24_C[ix-1];
+        m = palette_19_24_M[ix-1];
+        y = palette_19_24_Y[ix-1];
+        k = palette_19_24_K[ix-1];
+      }
+      break;
+    case 0x25:
+      if (ix > 0
+          && ix <= sizeof(palette_19_25_C)/sizeof(palette_19_25_C[0])
+          && ix <= sizeof(palette_19_25_M)/sizeof(palette_19_25_M[0])
+          && ix <= sizeof(palette_19_25_Y)/sizeof(palette_19_25_Y[0])
+          && ix <= sizeof(palette_19_25_K)/sizeof(palette_19_25_K[0]))
+      {
+        c = palette_19_25_C[ix-1];
+        m = palette_19_25_M[ix-1];
+        y = palette_19_25_Y[ix-1];
+        k = palette_19_25_K[ix-1];
+      }
+      break;
+    default:
+      break;
+    }
+
+    switch (color.m_colorPalette)
+    {
+    case 0x03:
+    case 0x08:
+    case 0x0a:
+    case 0x0b:
+    case 0x11:
+    case 0x12:
+    case 0x14:
+    case 0x15:
+    case 0x16:
+    case 0x17:
+    case 0x1a:
+    case 0x1b:
+    case 0x1c:
+    case 0x1d:
+    case 0x23:
+    case 0x24:
+    case 0x25:
+    {
+      color.m_colorModel = 0x02; // CMYK100
+      unsigned cyan = (unsigned)tint * (unsigned)c / 100;
+      unsigned magenta = (unsigned)tint * (unsigned)m / 100;
+      unsigned yellow = (unsigned)tint * (unsigned)y / 100;
+      unsigned black = (unsigned)tint * (unsigned)k / 100;
+      color.m_colorValue = (black & 0xff);
+      color.m_colorValue <<= 8;
+      color.m_colorValue |= (yellow & 0xff);
+      color.m_colorValue <<= 8;
+      color.m_colorValue |= (magenta & 0xff);
+      color.m_colorValue <<= 8;
+      color.m_colorValue |= (cyan & 0xff);
+      color.m_colorPalette = 0;
+      break;
+    }
+    case 0x1e:
+    case 0x1f:
+    case 0x20:
+    {
+      color.m_colorModel = 0x05; // RGB
+      unsigned red = (unsigned)tint * (unsigned)r + 255 * (100 - tint);
+      unsigned green = (unsigned)tint * (unsigned)g + 255 * (100 - tint);
+      unsigned blue = (unsigned)tint * (unsigned)b + 255 * (100 - tint);
+      red /= 100;
+      green /= 100;
+      blue /= 100;
+      color.m_colorValue = (red & 0xff);
+      color.m_colorValue <<= 8;
+      color.m_colorValue |= (green & 0xff);
+      color.m_colorValue <<= 8;
+      color.m_colorValue |= (blue & 0xff);
+      color.m_colorPalette = 0;
+      break;
+    }
+    case 0x09:
+      color.m_colorModel = 0x12; // L*a*b
+      color.m_colorPalette = 0;
+      break;
+    default:
+      break;
+    }
+  }
+  else if (color.m_colorModel == 0x0e)
+  {
+    switch (color.m_colorPalette)
+    {
+    case 0x0c:
+      if (ix > 0
+          && ix <= sizeof(palette_0E_0C_L)/sizeof(palette_0E_0C_L[0])
+          && ix <= sizeof(palette_0E_0C_A)/sizeof(palette_0E_0C_A[0])
+          && ix <= sizeof(palette_0E_0C_B)/sizeof(palette_0E_0C_B[0]))
+      {
+        color.m_colorValue = palette_0E_0C_B[ix-1];
+        color.m_colorValue <<= 8;
+        color.m_colorValue |= palette_0E_0C_A[ix-1];
+        color.m_colorValue <<= 8;
+        color.m_colorValue |= palette_0E_0C_L[ix-1];
+      }
+      break;
+    case 0x18:
+      if (ix > 0
+          && ix <= sizeof(palette_0E_18_L)/sizeof(palette_0E_18_L[0])
+          && ix <= sizeof(palette_0E_18_A)/sizeof(palette_0E_18_A[0])
+          && ix <= sizeof(palette_0E_18_B)/sizeof(palette_0E_18_B[0]))
+      {
+        color.m_colorValue = palette_0E_18_B[ix-1];
+        color.m_colorValue <<= 8;
+        color.m_colorValue |= palette_0E_18_A[ix-1];
+        color.m_colorValue <<= 8;
+        color.m_colorValue |= palette_0E_18_L[ix-1];
+      }
+      break;
+    case 0x21:
+      if (ix > 0
+          && ix <= sizeof(palette_0E_21_L)/sizeof(palette_0E_21_L[0])
+          && ix <= sizeof(palette_0E_21_A)/sizeof(palette_0E_21_A[0])
+          && ix <= sizeof(palette_0E_21_B)/sizeof(palette_0E_21_B[0]))
+      {
+        color.m_colorValue = palette_0E_21_B[ix-1];
+        color.m_colorValue <<= 8;
+        color.m_colorValue |= palette_0E_21_A[ix-1];
+        color.m_colorValue <<= 8;
+        color.m_colorValue |= palette_0E_21_L[ix-1];
+      }
+      break;
+    case 0x22:
+      if (ix > 0
+          && ix <= sizeof(palette_0E_22_L)/sizeof(palette_0E_22_L[0])
+          && ix <= sizeof(palette_0E_22_A)/sizeof(palette_0E_22_A[0])
+          && ix <= sizeof(palette_0E_22_B)/sizeof(palette_0E_22_B[0]))
+      {
+        color.m_colorValue = palette_0E_22_B[ix-1];
+        color.m_colorValue <<= 8;
+        color.m_colorValue |= palette_0E_22_A[ix-1];
+        color.m_colorValue <<= 8;
+        color.m_colorValue |= palette_0E_22_L[ix-1];
+      }
+      break;
+    default:
+      break;
+    }
+
+    switch (color.m_colorPalette)
+    {
+    case 0x0c:
+    case 0x18:
+    case 0x21:
+    case 0x22:
+      color.m_colorModel = 0x12; // L*a*b
+      color.m_colorPalette = 0;
+      break;
+    default:
+      break;
+    }
+  }
+}
+
 /* vim:set shiftwidth=2 softtabstop=2 expandtab: */
diff --git a/src/lib/CDRParser.h b/src/lib/CDRParser.h
index 76c46e0..75acc0e 100644
--- a/src/lib/CDRParser.h
+++ b/src/lib/CDRParser.h
@@ -95,6 +95,7 @@ private:
   bool _redirectX6Chunk(librevenge::RVNGInputStream **input, unsigned &length);
   void _readX6StyleString(librevenge::RVNGInputStream *input, unsigned length, 
CDRStyle &style);
   void _skipX3Optional(librevenge::RVNGInputStream *input);
+  void _resolveColorPalette(CDRColor &color);
 
   const std::vector<std::unique_ptr<librevenge::RVNGInputStream>> 
&m_externalStreams;
 
diff --git a/src/lib/CDRTypes.h b/src/lib/CDRTypes.h
index f3010e0..9144592 100644
--- a/src/lib/CDRTypes.h
+++ b/src/lib/CDRTypes.h
@@ -53,10 +53,14 @@ struct CDRBox
 struct CDRColor
 {
   unsigned short m_colorModel;
+  unsigned short m_colorPalette;
   unsigned m_colorValue;
-  CDRColor() : m_colorModel(0), m_colorValue(0) {}
+  CDRColor(unsigned short colorModel, unsigned short colorPalette, unsigned 
colorValue)
+    : m_colorModel(colorModel), m_colorPalette(colorPalette), 
m_colorValue(colorValue) {}
+  CDRColor()
+    : m_colorModel(0), m_colorPalette(0), m_colorValue(0) {}
   CDRColor(unsigned short colorModel, unsigned colorValue)
-    : m_colorModel(colorModel), m_colorValue(colorValue) {}
+    : m_colorModel(colorModel), m_colorPalette(0), m_colorValue(colorValue) {}
 };
 
 struct CDRGradientStop
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to