| Index: core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp
 | 
| diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp
 | 
| index 198054ef7e6f318edc217a11470a85fdbbe55026..c07806c994df52cc20e7c070dcb79f3d6e995167 100644
 | 
| --- a/core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp
 | 
| +++ b/core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp
 | 
| @@ -12,1436 +12,1543 @@
 | 
|  
 | 
|  namespace {
 | 
|  
 | 
| -void sRGB_to_AdobeCMYK(FX_FLOAT R, FX_FLOAT G, FX_FLOAT B, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k)
 | 
| -{
 | 
| -    c = 1.0f - R;
 | 
| -    m = 1.0f - G;
 | 
| -    y = 1.0f - B;
 | 
| -    k = c;
 | 
| -    if (m < k) {
 | 
| -        k = m;
 | 
| -    }
 | 
| -    if (y < k) {
 | 
| -        k = y;
 | 
| -    }
 | 
| +void sRGB_to_AdobeCMYK(FX_FLOAT R,
 | 
| +                       FX_FLOAT G,
 | 
| +                       FX_FLOAT B,
 | 
| +                       FX_FLOAT& c,
 | 
| +                       FX_FLOAT& m,
 | 
| +                       FX_FLOAT& y,
 | 
| +                       FX_FLOAT& k) {
 | 
| +  c = 1.0f - R;
 | 
| +  m = 1.0f - G;
 | 
| +  y = 1.0f - B;
 | 
| +  k = c;
 | 
| +  if (m < k) {
 | 
| +    k = m;
 | 
| +  }
 | 
| +  if (y < k) {
 | 
| +    k = y;
 | 
| +  }
 | 
|  }
 | 
|  
 | 
|  int ComponentsForFamily(int family) {
 | 
| -    if (family == PDFCS_DEVICERGB)
 | 
| -        return 3;
 | 
| -    if (family == PDFCS_DEVICEGRAY)
 | 
| -        return 1;
 | 
| -    return 4;
 | 
| +  if (family == PDFCS_DEVICERGB)
 | 
| +    return 3;
 | 
| +  if (family == PDFCS_DEVICEGRAY)
 | 
| +    return 1;
 | 
| +  return 4;
 | 
|  }
 | 
|  
 | 
|  }  // namespace
 | 
|  
 | 
|  CPDF_DeviceCS::CPDF_DeviceCS(CPDF_Document* pDoc, int family)
 | 
| -        : CPDF_ColorSpace(pDoc, family, ComponentsForFamily(family)) {
 | 
| -}
 | 
| +    : CPDF_ColorSpace(pDoc, family, ComponentsForFamily(family)) {}
 | 
|  
 | 
| -FX_BOOL CPDF_DeviceCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const
 | 
| -{
 | 
| -    if (m_Family == PDFCS_DEVICERGB) {
 | 
| -        R = pBuf[0];
 | 
| -        if (R < 0) {
 | 
| -            R = 0;
 | 
| -        } else if (R > 1) {
 | 
| -            R = 1;
 | 
| -        }
 | 
| -        G = pBuf[1];
 | 
| -        if (G < 0) {
 | 
| -            G = 0;
 | 
| -        } else if (G > 1) {
 | 
| -            G = 1;
 | 
| -        }
 | 
| -        B = pBuf[2];
 | 
| -        if (B < 0) {
 | 
| -            B = 0;
 | 
| -        } else if (B > 1) {
 | 
| -            B = 1;
 | 
| -        }
 | 
| -    } else if (m_Family == PDFCS_DEVICEGRAY) {
 | 
| -        R = *pBuf;
 | 
| -        if (R < 0) {
 | 
| -            R = 0;
 | 
| -        } else if (R > 1) {
 | 
| -            R = 1;
 | 
| -        }
 | 
| -        G = B = R;
 | 
| -    } else if (m_Family == PDFCS_DEVICECMYK) {
 | 
| -        if (!m_dwStdConversion) {
 | 
| -            AdobeCMYK_to_sRGB(pBuf[0], pBuf[1], pBuf[2], pBuf[3], R, G, B);
 | 
| -        } else {
 | 
| -            FX_FLOAT k = pBuf[3];
 | 
| -            R = 1.0f - FX_MIN(1.0f, pBuf[0] + k);
 | 
| -            G = 1.0f - FX_MIN(1.0f, pBuf[1] + k);
 | 
| -            B = 1.0f - FX_MIN(1.0f, pBuf[2] + k);
 | 
| -        }
 | 
| +FX_BOOL CPDF_DeviceCS::GetRGB(FX_FLOAT* pBuf,
 | 
| +                              FX_FLOAT& R,
 | 
| +                              FX_FLOAT& G,
 | 
| +                              FX_FLOAT& B) const {
 | 
| +  if (m_Family == PDFCS_DEVICERGB) {
 | 
| +    R = pBuf[0];
 | 
| +    if (R < 0) {
 | 
| +      R = 0;
 | 
| +    } else if (R > 1) {
 | 
| +      R = 1;
 | 
| +    }
 | 
| +    G = pBuf[1];
 | 
| +    if (G < 0) {
 | 
| +      G = 0;
 | 
| +    } else if (G > 1) {
 | 
| +      G = 1;
 | 
| +    }
 | 
| +    B = pBuf[2];
 | 
| +    if (B < 0) {
 | 
| +      B = 0;
 | 
| +    } else if (B > 1) {
 | 
| +      B = 1;
 | 
| +    }
 | 
| +  } else if (m_Family == PDFCS_DEVICEGRAY) {
 | 
| +    R = *pBuf;
 | 
| +    if (R < 0) {
 | 
| +      R = 0;
 | 
| +    } else if (R > 1) {
 | 
| +      R = 1;
 | 
| +    }
 | 
| +    G = B = R;
 | 
| +  } else if (m_Family == PDFCS_DEVICECMYK) {
 | 
| +    if (!m_dwStdConversion) {
 | 
| +      AdobeCMYK_to_sRGB(pBuf[0], pBuf[1], pBuf[2], pBuf[3], R, G, B);
 | 
|      } else {
 | 
| -        ASSERT(m_Family == PDFCS_PATTERN);
 | 
| -        R = G = B = 0;
 | 
| -        return FALSE;
 | 
| -    }
 | 
| -    return TRUE;
 | 
| -}
 | 
| -FX_BOOL CPDF_DeviceCS::v_GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const
 | 
| -{
 | 
| -    if (m_Family != PDFCS_DEVICECMYK) {
 | 
| -        return FALSE;
 | 
| -    }
 | 
| -    c = pBuf[0];
 | 
| -    m = pBuf[1];
 | 
| -    y = pBuf[2];
 | 
| -    k = pBuf[3];
 | 
| -    return TRUE;
 | 
| -}
 | 
| -FX_BOOL CPDF_DeviceCS::SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const
 | 
| -{
 | 
| -    if (m_Family == PDFCS_DEVICERGB) {
 | 
| -        pBuf[0] = R;
 | 
| -        pBuf[1] = G;
 | 
| -        pBuf[2] = B;
 | 
| -        return TRUE;
 | 
| -    }
 | 
| -    if (m_Family == PDFCS_DEVICEGRAY) {
 | 
| -        if (R == G && R == B) {
 | 
| -            *pBuf = R;
 | 
| -            return TRUE;
 | 
| -        }
 | 
| -        return FALSE;
 | 
| -    }
 | 
| -    if (m_Family == PDFCS_DEVICECMYK) {
 | 
| -        sRGB_to_AdobeCMYK(R, G, B, pBuf[0], pBuf[1], pBuf[2], pBuf[3]);
 | 
| -        return TRUE;
 | 
| +      FX_FLOAT k = pBuf[3];
 | 
| +      R = 1.0f - FX_MIN(1.0f, pBuf[0] + k);
 | 
| +      G = 1.0f - FX_MIN(1.0f, pBuf[1] + k);
 | 
| +      B = 1.0f - FX_MIN(1.0f, pBuf[2] + k);
 | 
|      }
 | 
| +  } else {
 | 
| +    ASSERT(m_Family == PDFCS_PATTERN);
 | 
| +    R = G = B = 0;
 | 
|      return FALSE;
 | 
| -}
 | 
| -FX_BOOL CPDF_DeviceCS::v_SetCMYK(FX_FLOAT* pBuf, FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k) const
 | 
| -{
 | 
| -    if (m_Family == PDFCS_DEVICERGB) {
 | 
| -        AdobeCMYK_to_sRGB(c, m, y, k, pBuf[0], pBuf[1], pBuf[2]);
 | 
| -        return TRUE;
 | 
| -    }
 | 
| -    if (m_Family == PDFCS_DEVICECMYK) {
 | 
| -        pBuf[0] = c;
 | 
| -        pBuf[1] = m;
 | 
| -        pBuf[2] = y;
 | 
| -        pBuf[3] = k;
 | 
| -        return TRUE;
 | 
| -    }
 | 
| +  }
 | 
| +  return TRUE;
 | 
| +}
 | 
| +FX_BOOL CPDF_DeviceCS::v_GetCMYK(FX_FLOAT* pBuf,
 | 
| +                                 FX_FLOAT& c,
 | 
| +                                 FX_FLOAT& m,
 | 
| +                                 FX_FLOAT& y,
 | 
| +                                 FX_FLOAT& k) const {
 | 
| +  if (m_Family != PDFCS_DEVICECMYK) {
 | 
|      return FALSE;
 | 
| -}
 | 
| -static void ReverseRGB(uint8_t* pDestBuf, const uint8_t* pSrcBuf, int pixels)
 | 
| -{
 | 
| -    if (pDestBuf == pSrcBuf)
 | 
| -        for (int i = 0; i < pixels; i ++) {
 | 
| -            uint8_t temp = pDestBuf[2];
 | 
| -            pDestBuf[2] = pDestBuf[0];
 | 
| -            pDestBuf[0] = temp;
 | 
| -            pDestBuf += 3;
 | 
| -        }
 | 
| -    else
 | 
| -        for (int i = 0; i < pixels; i ++) {
 | 
| -            *pDestBuf ++ = pSrcBuf[2];
 | 
| -            *pDestBuf ++ = pSrcBuf[1];
 | 
| -            *pDestBuf ++ = pSrcBuf[0];
 | 
| -            pSrcBuf += 3;
 | 
| -        }
 | 
| -}
 | 
| -void CPDF_DeviceCS::TranslateImageLine(uint8_t* pDestBuf, const uint8_t* pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask) const
 | 
| -{
 | 
| -    if (bTransMask && m_Family == PDFCS_DEVICECMYK) {
 | 
| -        for (int i = 0; i < pixels; i ++) {
 | 
| -            int k = 255 - pSrcBuf[3];
 | 
| -            pDestBuf[0] = ((255 - pSrcBuf[0]) * k) / 255;
 | 
| -            pDestBuf[1] = ((255 - pSrcBuf[1]) * k) / 255;
 | 
| -            pDestBuf[2] = ((255 - pSrcBuf[2]) * k) / 255;
 | 
| -            pDestBuf += 3;
 | 
| -            pSrcBuf += 4;
 | 
| -        }
 | 
| -        return;
 | 
| -    }
 | 
| -    if (m_Family == PDFCS_DEVICERGB) {
 | 
| -        ReverseRGB(pDestBuf, pSrcBuf, pixels);
 | 
| -    } else if (m_Family == PDFCS_DEVICEGRAY) {
 | 
| -        for (int i = 0; i < pixels; i ++) {
 | 
| -            *pDestBuf ++ = pSrcBuf[i];
 | 
| -            *pDestBuf ++ = pSrcBuf[i];
 | 
| -            *pDestBuf ++ = pSrcBuf[i];
 | 
| -        }
 | 
| -    } else {
 | 
| -        for (int i = 0; i < pixels; i ++) {
 | 
| -            if (!m_dwStdConversion) {
 | 
| -                AdobeCMYK_to_sRGB1(pSrcBuf[0], pSrcBuf[1], pSrcBuf[2], pSrcBuf[3], pDestBuf[2], pDestBuf[1], pDestBuf[0]);
 | 
| -            } else {
 | 
| -                uint8_t k = pSrcBuf[3];
 | 
| -                pDestBuf[2] = 255 - FX_MIN(255, pSrcBuf[0] + k);
 | 
| -                pDestBuf[1] = 255 - FX_MIN(255, pSrcBuf[1] + k);
 | 
| -                pDestBuf[0] = 255 - FX_MIN(255, pSrcBuf[2] + k);
 | 
| -            }
 | 
| -            pSrcBuf += 4;
 | 
| -            pDestBuf += 3;
 | 
| -        }
 | 
| +  }
 | 
| +  c = pBuf[0];
 | 
| +  m = pBuf[1];
 | 
| +  y = pBuf[2];
 | 
| +  k = pBuf[3];
 | 
| +  return TRUE;
 | 
| +}
 | 
| +FX_BOOL CPDF_DeviceCS::SetRGB(FX_FLOAT* pBuf,
 | 
| +                              FX_FLOAT R,
 | 
| +                              FX_FLOAT G,
 | 
| +                              FX_FLOAT B) const {
 | 
| +  if (m_Family == PDFCS_DEVICERGB) {
 | 
| +    pBuf[0] = R;
 | 
| +    pBuf[1] = G;
 | 
| +    pBuf[2] = B;
 | 
| +    return TRUE;
 | 
| +  }
 | 
| +  if (m_Family == PDFCS_DEVICEGRAY) {
 | 
| +    if (R == G && R == B) {
 | 
| +      *pBuf = R;
 | 
| +      return TRUE;
 | 
|      }
 | 
| +    return FALSE;
 | 
| +  }
 | 
| +  if (m_Family == PDFCS_DEVICECMYK) {
 | 
| +    sRGB_to_AdobeCMYK(R, G, B, pBuf[0], pBuf[1], pBuf[2], pBuf[3]);
 | 
| +    return TRUE;
 | 
| +  }
 | 
| +  return FALSE;
 | 
| +}
 | 
| +FX_BOOL CPDF_DeviceCS::v_SetCMYK(FX_FLOAT* pBuf,
 | 
| +                                 FX_FLOAT c,
 | 
| +                                 FX_FLOAT m,
 | 
| +                                 FX_FLOAT y,
 | 
| +                                 FX_FLOAT k) const {
 | 
| +  if (m_Family == PDFCS_DEVICERGB) {
 | 
| +    AdobeCMYK_to_sRGB(c, m, y, k, pBuf[0], pBuf[1], pBuf[2]);
 | 
| +    return TRUE;
 | 
| +  }
 | 
| +  if (m_Family == PDFCS_DEVICECMYK) {
 | 
| +    pBuf[0] = c;
 | 
| +    pBuf[1] = m;
 | 
| +    pBuf[2] = y;
 | 
| +    pBuf[3] = k;
 | 
| +    return TRUE;
 | 
| +  }
 | 
| +  return FALSE;
 | 
| +}
 | 
| +static void ReverseRGB(uint8_t* pDestBuf, const uint8_t* pSrcBuf, int pixels) {
 | 
| +  if (pDestBuf == pSrcBuf)
 | 
| +    for (int i = 0; i < pixels; i++) {
 | 
| +      uint8_t temp = pDestBuf[2];
 | 
| +      pDestBuf[2] = pDestBuf[0];
 | 
| +      pDestBuf[0] = temp;
 | 
| +      pDestBuf += 3;
 | 
| +    }
 | 
| +  else
 | 
| +    for (int i = 0; i < pixels; i++) {
 | 
| +      *pDestBuf++ = pSrcBuf[2];
 | 
| +      *pDestBuf++ = pSrcBuf[1];
 | 
| +      *pDestBuf++ = pSrcBuf[0];
 | 
| +      pSrcBuf += 3;
 | 
| +    }
 | 
| +}
 | 
| +void CPDF_DeviceCS::TranslateImageLine(uint8_t* pDestBuf,
 | 
| +                                       const uint8_t* pSrcBuf,
 | 
| +                                       int pixels,
 | 
| +                                       int image_width,
 | 
| +                                       int image_height,
 | 
| +                                       FX_BOOL bTransMask) const {
 | 
| +  if (bTransMask && m_Family == PDFCS_DEVICECMYK) {
 | 
| +    for (int i = 0; i < pixels; i++) {
 | 
| +      int k = 255 - pSrcBuf[3];
 | 
| +      pDestBuf[0] = ((255 - pSrcBuf[0]) * k) / 255;
 | 
| +      pDestBuf[1] = ((255 - pSrcBuf[1]) * k) / 255;
 | 
| +      pDestBuf[2] = ((255 - pSrcBuf[2]) * k) / 255;
 | 
| +      pDestBuf += 3;
 | 
| +      pSrcBuf += 4;
 | 
| +    }
 | 
| +    return;
 | 
| +  }
 | 
| +  if (m_Family == PDFCS_DEVICERGB) {
 | 
| +    ReverseRGB(pDestBuf, pSrcBuf, pixels);
 | 
| +  } else if (m_Family == PDFCS_DEVICEGRAY) {
 | 
| +    for (int i = 0; i < pixels; i++) {
 | 
| +      *pDestBuf++ = pSrcBuf[i];
 | 
| +      *pDestBuf++ = pSrcBuf[i];
 | 
| +      *pDestBuf++ = pSrcBuf[i];
 | 
| +    }
 | 
| +  } else {
 | 
| +    for (int i = 0; i < pixels; i++) {
 | 
| +      if (!m_dwStdConversion) {
 | 
| +        AdobeCMYK_to_sRGB1(pSrcBuf[0], pSrcBuf[1], pSrcBuf[2], pSrcBuf[3],
 | 
| +                           pDestBuf[2], pDestBuf[1], pDestBuf[0]);
 | 
| +      } else {
 | 
| +        uint8_t k = pSrcBuf[3];
 | 
| +        pDestBuf[2] = 255 - FX_MIN(255, pSrcBuf[0] + k);
 | 
| +        pDestBuf[1] = 255 - FX_MIN(255, pSrcBuf[1] + k);
 | 
| +        pDestBuf[0] = 255 - FX_MIN(255, pSrcBuf[2] + k);
 | 
| +      }
 | 
| +      pSrcBuf += 4;
 | 
| +      pDestBuf += 3;
 | 
| +    }
 | 
| +  }
 | 
|  }
 | 
|  const uint8_t g_sRGBSamples1[] = {
 | 
| -    0,   3,   6,  10,  13,  15,  18,  20,  22,  23,  25,  27,  28,  30,  31,  32,
 | 
| -    34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,  48,  49,
 | 
| -    49,  50,  51,  52,  53,  53,  54,  55,  56,  56,  57,  58,  58,  59,  60,  61,
 | 
| -    61,  62,  62,  63,  64,  64,  65,  66,  66,  67,  67,  68,  68,  69,  70,  70,
 | 
| -    71,  71,  72,  72,  73,  73,  74,  74,  75,  76,  76,  77,  77,  78,  78,  79,
 | 
| -    79,  79,  80,  80,  81,  81,  82,  82,  83,  83,  84,  84,  85,  85,  85,  86,
 | 
| -    86,  87,  87,  88,  88,  88,  89,  89,  90,  90,  91,  91,  91,  92,  92,  93,
 | 
| -    93,  93,  94,  94,  95,  95,  95,  96,  96,  97,  97,  97,  98,  98,  98,  99,
 | 
| -    99,  99, 100, 100, 101, 101, 101, 102, 102, 102, 103, 103, 103, 104, 104, 104,
 | 
| -    105, 105, 106, 106, 106, 107, 107, 107, 108, 108, 108, 109, 109, 109, 110, 110,
 | 
| -    110, 110, 111, 111, 111, 112, 112, 112, 113, 113, 113, 114, 114, 114, 115, 115,
 | 
| -    115, 115, 116, 116, 116, 117, 117, 117, 118, 118, 118, 118, 119, 119, 119, 120,
 | 
| +    0,   3,   6,   10,  13,  15,  18,  20,  22,  23,  25,  27,  28,  30,  31,
 | 
| +    32,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
 | 
| +    48,  49,  49,  50,  51,  52,  53,  53,  54,  55,  56,  56,  57,  58,  58,
 | 
| +    59,  60,  61,  61,  62,  62,  63,  64,  64,  65,  66,  66,  67,  67,  68,
 | 
| +    68,  69,  70,  70,  71,  71,  72,  72,  73,  73,  74,  74,  75,  76,  76,
 | 
| +    77,  77,  78,  78,  79,  79,  79,  80,  80,  81,  81,  82,  82,  83,  83,
 | 
| +    84,  84,  85,  85,  85,  86,  86,  87,  87,  88,  88,  88,  89,  89,  90,
 | 
| +    90,  91,  91,  91,  92,  92,  93,  93,  93,  94,  94,  95,  95,  95,  96,
 | 
| +    96,  97,  97,  97,  98,  98,  98,  99,  99,  99,  100, 100, 101, 101, 101,
 | 
| +    102, 102, 102, 103, 103, 103, 104, 104, 104, 105, 105, 106, 106, 106, 107,
 | 
| +    107, 107, 108, 108, 108, 109, 109, 109, 110, 110, 110, 110, 111, 111, 111,
 | 
| +    112, 112, 112, 113, 113, 113, 114, 114, 114, 115, 115, 115, 115, 116, 116,
 | 
| +    116, 117, 117, 117, 118, 118, 118, 118, 119, 119, 119, 120,
 | 
|  };
 | 
|  const uint8_t g_sRGBSamples2[] = {
 | 
| -    120, 121, 122, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136,
 | 
| -    137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 148, 149, 150, 151,
 | 
| -    152, 153, 154, 155, 155, 156, 157, 158, 159, 159, 160, 161, 162, 163, 163, 164,
 | 
| -    165, 166, 167, 167, 168, 169, 170, 170, 171, 172, 173, 173, 174, 175, 175, 176,
 | 
| -    177, 178, 178, 179, 180, 180, 181, 182, 182, 183, 184, 185, 185, 186, 187, 187,
 | 
| -    188, 189, 189, 190, 190, 191, 192, 192, 193, 194, 194, 195, 196, 196, 197, 197,
 | 
| -    198, 199, 199, 200, 200, 201, 202, 202, 203, 203, 204, 205, 205, 206, 206, 207,
 | 
| -    208, 208, 209, 209, 210, 210, 211, 212, 212, 213, 213, 214, 214, 215, 215, 216,
 | 
| -    216, 217, 218, 218, 219, 219, 220, 220, 221, 221, 222, 222, 223, 223, 224, 224,
 | 
| -    225, 226, 226, 227, 227, 228, 228, 229, 229, 230, 230, 231, 231, 232, 232, 233,
 | 
| -    233, 234, 234, 235, 235, 236, 236, 237, 237, 238, 238, 238, 239, 239, 240, 240,
 | 
| -    241, 241, 242, 242, 243, 243, 244, 244, 245, 245, 246, 246, 246, 247, 247, 248,
 | 
| -    248, 249, 249, 250, 250, 251, 251, 251, 252, 252, 253, 253, 254, 254, 255, 255,
 | 
| +    120, 121, 122, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135,
 | 
| +    136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 148, 149,
 | 
| +    150, 151, 152, 153, 154, 155, 155, 156, 157, 158, 159, 159, 160, 161, 162,
 | 
| +    163, 163, 164, 165, 166, 167, 167, 168, 169, 170, 170, 171, 172, 173, 173,
 | 
| +    174, 175, 175, 176, 177, 178, 178, 179, 180, 180, 181, 182, 182, 183, 184,
 | 
| +    185, 185, 186, 187, 187, 188, 189, 189, 190, 190, 191, 192, 192, 193, 194,
 | 
| +    194, 195, 196, 196, 197, 197, 198, 199, 199, 200, 200, 201, 202, 202, 203,
 | 
| +    203, 204, 205, 205, 206, 206, 207, 208, 208, 209, 209, 210, 210, 211, 212,
 | 
| +    212, 213, 213, 214, 214, 215, 215, 216, 216, 217, 218, 218, 219, 219, 220,
 | 
| +    220, 221, 221, 222, 222, 223, 223, 224, 224, 225, 226, 226, 227, 227, 228,
 | 
| +    228, 229, 229, 230, 230, 231, 231, 232, 232, 233, 233, 234, 234, 235, 235,
 | 
| +    236, 236, 237, 237, 238, 238, 238, 239, 239, 240, 240, 241, 241, 242, 242,
 | 
| +    243, 243, 244, 244, 245, 245, 246, 246, 246, 247, 247, 248, 248, 249, 249,
 | 
| +    250, 250, 251, 251, 251, 252, 252, 253, 253, 254, 254, 255, 255,
 | 
|  };
 | 
|  
 | 
| -static FX_FLOAT RGB_Conversion(FX_FLOAT colorComponent)
 | 
| -{
 | 
| -    if (colorComponent > 1) {
 | 
| -        colorComponent = 1;
 | 
| -    }
 | 
| -    if (colorComponent < 0) {
 | 
| -        colorComponent = 0;
 | 
| -    }
 | 
| -    int scale = (int)(colorComponent * 1023);
 | 
| -    if (scale < 0) {
 | 
| -        scale = 0;
 | 
| -    }
 | 
| -    if (scale < 192) {
 | 
| -        colorComponent = (g_sRGBSamples1[scale] / 255.0f);
 | 
| -    }
 | 
| -    else {
 | 
| -        colorComponent = (g_sRGBSamples2[scale / 4 - 48] / 255.0f);
 | 
| -    }
 | 
| -    return colorComponent;
 | 
| +static FX_FLOAT RGB_Conversion(FX_FLOAT colorComponent) {
 | 
| +  if (colorComponent > 1) {
 | 
| +    colorComponent = 1;
 | 
| +  }
 | 
| +  if (colorComponent < 0) {
 | 
| +    colorComponent = 0;
 | 
| +  }
 | 
| +  int scale = (int)(colorComponent * 1023);
 | 
| +  if (scale < 0) {
 | 
| +    scale = 0;
 | 
| +  }
 | 
| +  if (scale < 192) {
 | 
| +    colorComponent = (g_sRGBSamples1[scale] / 255.0f);
 | 
| +  } else {
 | 
| +    colorComponent = (g_sRGBSamples2[scale / 4 - 48] / 255.0f);
 | 
| +  }
 | 
| +  return colorComponent;
 | 
|  }
 | 
|  
 | 
| -static void XYZ_to_sRGB(FX_FLOAT X, FX_FLOAT Y, FX_FLOAT Z, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B)
 | 
| -{
 | 
| -    FX_FLOAT R1 = 3.2410f * X - 1.5374f * Y - 0.4986f * Z;
 | 
| -    FX_FLOAT G1 = -0.9692f * X + 1.8760f * Y + 0.0416f * Z;
 | 
| -    FX_FLOAT B1 =  0.0556f * X - 0.2040f * Y + 1.0570f * Z;
 | 
| +static void XYZ_to_sRGB(FX_FLOAT X,
 | 
| +                        FX_FLOAT Y,
 | 
| +                        FX_FLOAT Z,
 | 
| +                        FX_FLOAT& R,
 | 
| +                        FX_FLOAT& G,
 | 
| +                        FX_FLOAT& B) {
 | 
| +  FX_FLOAT R1 = 3.2410f * X - 1.5374f * Y - 0.4986f * Z;
 | 
| +  FX_FLOAT G1 = -0.9692f * X + 1.8760f * Y + 0.0416f * Z;
 | 
| +  FX_FLOAT B1 = 0.0556f * X - 0.2040f * Y + 1.0570f * Z;
 | 
|  
 | 
| -    R = RGB_Conversion(R1);
 | 
| -    G = RGB_Conversion(G1);
 | 
| -    B = RGB_Conversion(B1);
 | 
| +  R = RGB_Conversion(R1);
 | 
| +  G = RGB_Conversion(G1);
 | 
| +  B = RGB_Conversion(B1);
 | 
|  }
 | 
|  
 | 
| -static void XYZ_to_sRGB_WhitePoint(FX_FLOAT X, FX_FLOAT Y, FX_FLOAT Z, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B, FX_FLOAT Xw, FX_FLOAT Yw, FX_FLOAT Zw)
 | 
| -{
 | 
| -    // The following RGB_xyz is based on
 | 
| -    // sRGB value {Rx,Ry}={0.64, 0.33}, {Gx,Gy}={0.30, 0.60}, {Bx,By}={0.15, 0.06}
 | 
| +static void XYZ_to_sRGB_WhitePoint(FX_FLOAT X,
 | 
| +                                   FX_FLOAT Y,
 | 
| +                                   FX_FLOAT Z,
 | 
| +                                   FX_FLOAT& R,
 | 
| +                                   FX_FLOAT& G,
 | 
| +                                   FX_FLOAT& B,
 | 
| +                                   FX_FLOAT Xw,
 | 
| +                                   FX_FLOAT Yw,
 | 
| +                                   FX_FLOAT Zw) {
 | 
| +  // The following RGB_xyz is based on
 | 
| +  // sRGB value {Rx,Ry}={0.64, 0.33}, {Gx,Gy}={0.30, 0.60}, {Bx,By}={0.15, 0.06}
 | 
|  
 | 
| -    FX_FLOAT Rx = 0.64f, Ry = 0.33f;
 | 
| -    FX_FLOAT Gx = 0.30f, Gy = 0.60f;
 | 
| -    FX_FLOAT Bx = 0.15f, By = 0.06f;
 | 
| -    CFX_Matrix_3by3 RGB_xyz(Rx, Gx, Bx, Ry, Gy, By, 1 - Rx - Ry, 1 - Gx - Gy, 1 - Bx - By);
 | 
| -    CFX_Vector_3by1 whitePoint(Xw, Yw, Zw);
 | 
| -    CFX_Vector_3by1 XYZ(X, Y, Z);
 | 
| +  FX_FLOAT Rx = 0.64f, Ry = 0.33f;
 | 
| +  FX_FLOAT Gx = 0.30f, Gy = 0.60f;
 | 
| +  FX_FLOAT Bx = 0.15f, By = 0.06f;
 | 
| +  CFX_Matrix_3by3 RGB_xyz(Rx, Gx, Bx, Ry, Gy, By, 1 - Rx - Ry, 1 - Gx - Gy,
 | 
| +                          1 - Bx - By);
 | 
| +  CFX_Vector_3by1 whitePoint(Xw, Yw, Zw);
 | 
| +  CFX_Vector_3by1 XYZ(X, Y, Z);
 | 
|  
 | 
| -    CFX_Vector_3by1 RGB_Sum_XYZ = RGB_xyz.Inverse().TransformVector(whitePoint);
 | 
| -    CFX_Matrix_3by3 RGB_SUM_XYZ_DIAG(RGB_Sum_XYZ.a, 0, 0, 0, RGB_Sum_XYZ.b, 0, 0, 0, RGB_Sum_XYZ.c);
 | 
| -    CFX_Matrix_3by3 M = RGB_xyz.Multiply(RGB_SUM_XYZ_DIAG);
 | 
| -    CFX_Vector_3by1 RGB = M.Inverse().TransformVector(XYZ);
 | 
| +  CFX_Vector_3by1 RGB_Sum_XYZ = RGB_xyz.Inverse().TransformVector(whitePoint);
 | 
| +  CFX_Matrix_3by3 RGB_SUM_XYZ_DIAG(RGB_Sum_XYZ.a, 0, 0, 0, RGB_Sum_XYZ.b, 0, 0,
 | 
| +                                   0, RGB_Sum_XYZ.c);
 | 
| +  CFX_Matrix_3by3 M = RGB_xyz.Multiply(RGB_SUM_XYZ_DIAG);
 | 
| +  CFX_Vector_3by1 RGB = M.Inverse().TransformVector(XYZ);
 | 
|  
 | 
| -    R = RGB_Conversion(RGB.a);
 | 
| -    G = RGB_Conversion(RGB.b);
 | 
| -    B = RGB_Conversion(RGB.c);
 | 
| -}
 | 
| -class CPDF_CalGray : public CPDF_ColorSpace
 | 
| -{
 | 
| -public:
 | 
| -    explicit CPDF_CalGray(CPDF_Document* pDoc)
 | 
| -        : CPDF_ColorSpace(pDoc, PDFCS_CALGRAY, 1) {
 | 
| -    }
 | 
| -    FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) override;
 | 
| -    FX_BOOL GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const override;
 | 
| -    FX_BOOL	SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const override;
 | 
| -    void TranslateImageLine(uint8_t* pDestBuf, const uint8_t* pSrcBuf, int pixels, int image_width,
 | 
| -                            int image_height, FX_BOOL bTransMask = FALSE) const override;
 | 
| +  R = RGB_Conversion(RGB.a);
 | 
| +  G = RGB_Conversion(RGB.b);
 | 
| +  B = RGB_Conversion(RGB.c);
 | 
| +}
 | 
| +class CPDF_CalGray : public CPDF_ColorSpace {
 | 
| + public:
 | 
| +  explicit CPDF_CalGray(CPDF_Document* pDoc)
 | 
| +      : CPDF_ColorSpace(pDoc, PDFCS_CALGRAY, 1) {}
 | 
| +  FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) override;
 | 
| +  FX_BOOL GetRGB(FX_FLOAT* pBuf,
 | 
| +                 FX_FLOAT& R,
 | 
| +                 FX_FLOAT& G,
 | 
| +                 FX_FLOAT& B) const override;
 | 
| +  FX_BOOL SetRGB(FX_FLOAT* pBuf,
 | 
| +                 FX_FLOAT R,
 | 
| +                 FX_FLOAT G,
 | 
| +                 FX_FLOAT B) const override;
 | 
| +  void TranslateImageLine(uint8_t* pDestBuf,
 | 
| +                          const uint8_t* pSrcBuf,
 | 
| +                          int pixels,
 | 
| +                          int image_width,
 | 
| +                          int image_height,
 | 
| +                          FX_BOOL bTransMask = FALSE) const override;
 | 
|  
 | 
| -private:
 | 
| -    FX_FLOAT m_WhitePoint[3];
 | 
| -    FX_FLOAT m_BlackPoint[3];
 | 
| -    FX_FLOAT m_Gamma;
 | 
| + private:
 | 
| +  FX_FLOAT m_WhitePoint[3];
 | 
| +  FX_FLOAT m_BlackPoint[3];
 | 
| +  FX_FLOAT m_Gamma;
 | 
|  };
 | 
|  
 | 
| -FX_BOOL CPDF_CalGray::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
 | 
| -{
 | 
| -    CPDF_Dictionary* pDict = pArray->GetDict(1);
 | 
| -    CPDF_Array* pParam = pDict->GetArray(FX_BSTRC("WhitePoint"));
 | 
| -    int i;
 | 
| -    for (i = 0; i < 3; i ++) {
 | 
| -        m_WhitePoint[i] = pParam ? pParam->GetNumber(i) : 0;
 | 
| -    }
 | 
| -    pParam = pDict->GetArray(FX_BSTRC("BlackPoint"));
 | 
| -    for (i = 0; i < 3; i ++) {
 | 
| -        m_BlackPoint[i] = pParam ? pParam->GetNumber(i) : 0;
 | 
| -    }
 | 
| -    m_Gamma = pDict->GetNumber(FX_BSTRC("Gamma"));
 | 
| -    if (m_Gamma == 0) {
 | 
| -        m_Gamma = 1.0f;
 | 
| -    }
 | 
| +FX_BOOL CPDF_CalGray::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) {
 | 
| +  CPDF_Dictionary* pDict = pArray->GetDict(1);
 | 
| +  CPDF_Array* pParam = pDict->GetArray(FX_BSTRC("WhitePoint"));
 | 
| +  int i;
 | 
| +  for (i = 0; i < 3; i++) {
 | 
| +    m_WhitePoint[i] = pParam ? pParam->GetNumber(i) : 0;
 | 
| +  }
 | 
| +  pParam = pDict->GetArray(FX_BSTRC("BlackPoint"));
 | 
| +  for (i = 0; i < 3; i++) {
 | 
| +    m_BlackPoint[i] = pParam ? pParam->GetNumber(i) : 0;
 | 
| +  }
 | 
| +  m_Gamma = pDict->GetNumber(FX_BSTRC("Gamma"));
 | 
| +  if (m_Gamma == 0) {
 | 
| +    m_Gamma = 1.0f;
 | 
| +  }
 | 
| +  return TRUE;
 | 
| +}
 | 
| +FX_BOOL CPDF_CalGray::GetRGB(FX_FLOAT* pBuf,
 | 
| +                             FX_FLOAT& R,
 | 
| +                             FX_FLOAT& G,
 | 
| +                             FX_FLOAT& B) const {
 | 
| +  R = G = B = *pBuf;
 | 
| +  return TRUE;
 | 
| +}
 | 
| +FX_BOOL CPDF_CalGray::SetRGB(FX_FLOAT* pBuf,
 | 
| +                             FX_FLOAT R,
 | 
| +                             FX_FLOAT G,
 | 
| +                             FX_FLOAT B) const {
 | 
| +  if (R == G && R == B) {
 | 
| +    *pBuf = R;
 | 
|      return TRUE;
 | 
| -}
 | 
| -FX_BOOL CPDF_CalGray::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const
 | 
| -{
 | 
| -    R = G = B = *pBuf;
 | 
| -    return TRUE;
 | 
| -}
 | 
| -FX_BOOL CPDF_CalGray::SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const
 | 
| -{
 | 
| -    if (R == G && R == B) {
 | 
| -        *pBuf = R;
 | 
| -        return TRUE;
 | 
| -    }
 | 
| -    return FALSE;
 | 
| -}
 | 
| -void CPDF_CalGray::TranslateImageLine(uint8_t* pDestBuf, const uint8_t* pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask) const
 | 
| -{
 | 
| -    for (int i = 0; i < pixels; i ++) {
 | 
| -        *pDestBuf ++ = pSrcBuf[i];
 | 
| -        *pDestBuf ++ = pSrcBuf[i];
 | 
| -        *pDestBuf ++ = pSrcBuf[i];
 | 
| -    }
 | 
| -}
 | 
| -class CPDF_CalRGB : public CPDF_ColorSpace
 | 
| -{
 | 
| -public:
 | 
| -    explicit CPDF_CalRGB(CPDF_Document* pDoc)
 | 
| -        : CPDF_ColorSpace(pDoc, PDFCS_CALRGB, 3) {
 | 
| -    }
 | 
| -    FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) override;
 | 
| -    FX_BOOL GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const override;
 | 
| -    FX_BOOL SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const override;
 | 
| -    void TranslateImageLine(uint8_t* pDestBuf, const uint8_t* pSrcBuf, int pixels, int image_width,
 | 
| -                            int image_height, FX_BOOL bTransMask = FALSE) const override;
 | 
| +  }
 | 
| +  return FALSE;
 | 
| +}
 | 
| +void CPDF_CalGray::TranslateImageLine(uint8_t* pDestBuf,
 | 
| +                                      const uint8_t* pSrcBuf,
 | 
| +                                      int pixels,
 | 
| +                                      int image_width,
 | 
| +                                      int image_height,
 | 
| +                                      FX_BOOL bTransMask) const {
 | 
| +  for (int i = 0; i < pixels; i++) {
 | 
| +    *pDestBuf++ = pSrcBuf[i];
 | 
| +    *pDestBuf++ = pSrcBuf[i];
 | 
| +    *pDestBuf++ = pSrcBuf[i];
 | 
| +  }
 | 
| +}
 | 
| +class CPDF_CalRGB : public CPDF_ColorSpace {
 | 
| + public:
 | 
| +  explicit CPDF_CalRGB(CPDF_Document* pDoc)
 | 
| +      : CPDF_ColorSpace(pDoc, PDFCS_CALRGB, 3) {}
 | 
| +  FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) override;
 | 
| +  FX_BOOL GetRGB(FX_FLOAT* pBuf,
 | 
| +                 FX_FLOAT& R,
 | 
| +                 FX_FLOAT& G,
 | 
| +                 FX_FLOAT& B) const override;
 | 
| +  FX_BOOL SetRGB(FX_FLOAT* pBuf,
 | 
| +                 FX_FLOAT R,
 | 
| +                 FX_FLOAT G,
 | 
| +                 FX_FLOAT B) const override;
 | 
| +  void TranslateImageLine(uint8_t* pDestBuf,
 | 
| +                          const uint8_t* pSrcBuf,
 | 
| +                          int pixels,
 | 
| +                          int image_width,
 | 
| +                          int image_height,
 | 
| +                          FX_BOOL bTransMask = FALSE) const override;
 | 
|  
 | 
| -    FX_FLOAT m_WhitePoint[3];
 | 
| -    FX_FLOAT m_BlackPoint[3];
 | 
| -    FX_FLOAT m_Gamma[3];
 | 
| -    FX_FLOAT m_Matrix[9];
 | 
| -    FX_BOOL m_bGamma;
 | 
| -    FX_BOOL m_bMatrix;
 | 
| +  FX_FLOAT m_WhitePoint[3];
 | 
| +  FX_FLOAT m_BlackPoint[3];
 | 
| +  FX_FLOAT m_Gamma[3];
 | 
| +  FX_FLOAT m_Matrix[9];
 | 
| +  FX_BOOL m_bGamma;
 | 
| +  FX_BOOL m_bMatrix;
 | 
|  };
 | 
| -FX_BOOL CPDF_CalRGB::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
 | 
| -{
 | 
| -    CPDF_Dictionary* pDict = pArray->GetDict(1);
 | 
| -    if (!pDict)
 | 
| -        return FALSE;
 | 
| +FX_BOOL CPDF_CalRGB::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) {
 | 
| +  CPDF_Dictionary* pDict = pArray->GetDict(1);
 | 
| +  if (!pDict)
 | 
| +    return FALSE;
 | 
|  
 | 
| -    CPDF_Array* pParam = pDict->GetArray(FX_BSTRC("WhitePoint"));
 | 
| -    int i;
 | 
| -    for (i = 0; i < 3; i ++) {
 | 
| -        m_WhitePoint[i] = pParam ? pParam->GetNumber(i) : 0;
 | 
| -    }
 | 
| -    pParam = pDict->GetArray(FX_BSTRC("BlackPoint"));
 | 
| -    for (i = 0; i < 3; i ++) {
 | 
| -        m_BlackPoint[i] = pParam ? pParam->GetNumber(i) : 0;
 | 
| -    }
 | 
| -    pParam = pDict->GetArray(FX_BSTRC("Gamma"));
 | 
| -    if (pParam) {
 | 
| -        m_bGamma = TRUE;
 | 
| -        for (i = 0; i < 3; i ++) {
 | 
| -            m_Gamma[i] = pParam->GetNumber(i);
 | 
| -        }
 | 
| -    } else {
 | 
| -        m_bGamma = FALSE;
 | 
| -    }
 | 
| -    pParam = pDict->GetArray(FX_BSTRC("Matrix"));
 | 
| -    if (pParam) {
 | 
| -        m_bMatrix = TRUE;
 | 
| -        for (i = 0; i < 9; i ++) {
 | 
| -            m_Matrix[i] = pParam->GetNumber(i);
 | 
| -        }
 | 
| -    } else {
 | 
| -        m_bMatrix = FALSE;
 | 
| -    }
 | 
| -    return TRUE;
 | 
| -}
 | 
| -FX_BOOL CPDF_CalRGB::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const
 | 
| -{
 | 
| -    FX_FLOAT A_ = pBuf[0];
 | 
| -    FX_FLOAT B_ = pBuf[1];
 | 
| -    FX_FLOAT C_ = pBuf[2];
 | 
| -    if (m_bGamma) {
 | 
| -        A_ = (FX_FLOAT)FXSYS_pow(A_, m_Gamma[0]);
 | 
| -        B_ = (FX_FLOAT)FXSYS_pow(B_, m_Gamma[1]);
 | 
| -        C_ = (FX_FLOAT)FXSYS_pow(C_, m_Gamma[2]);
 | 
| -    }
 | 
| -    FX_FLOAT X, Y, Z;
 | 
| -    if (m_bMatrix) {
 | 
| -        X = m_Matrix[0] * A_ + m_Matrix[3] * B_ + m_Matrix[6] * C_;
 | 
| -        Y = m_Matrix[1] * A_ + m_Matrix[4] * B_ + m_Matrix[7] * C_;
 | 
| -        Z = m_Matrix[2] * A_ + m_Matrix[5] * B_ + m_Matrix[8] * C_;
 | 
| -    } else {
 | 
| -        X = A_;
 | 
| -        Y = B_;
 | 
| -        Z = C_;
 | 
| -    }
 | 
| -    XYZ_to_sRGB_WhitePoint(X, Y, Z, R, G, B, m_WhitePoint[0], m_WhitePoint[1], m_WhitePoint[2]);
 | 
| -    return TRUE;
 | 
| -}
 | 
| -FX_BOOL CPDF_CalRGB::SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const
 | 
| -{
 | 
| -    pBuf[0] = R;
 | 
| -    pBuf[1] = G;
 | 
| -    pBuf[2] = B;
 | 
| -    return TRUE;
 | 
| -}
 | 
| -void CPDF_CalRGB::TranslateImageLine(uint8_t* pDestBuf, const uint8_t* pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask) const
 | 
| -{
 | 
| -    if (bTransMask) {
 | 
| -        FX_FLOAT Cal[3];
 | 
| -        FX_FLOAT R, G, B;
 | 
| -        for(int i = 0; i < pixels; i ++) {
 | 
| -            Cal[0] = ((FX_FLOAT)pSrcBuf[2]) / 255;
 | 
| -            Cal[1] = ((FX_FLOAT)pSrcBuf[1]) / 255;
 | 
| -            Cal[2] = ((FX_FLOAT)pSrcBuf[0]) / 255;
 | 
| -            GetRGB(Cal, R, G, B);
 | 
| -            pDestBuf[0] = FXSYS_round(B * 255);
 | 
| -            pDestBuf[1] = FXSYS_round(G * 255);
 | 
| -            pDestBuf[2] = FXSYS_round(R * 255);
 | 
| -            pSrcBuf += 3;
 | 
| -            pDestBuf += 3;
 | 
| -        }
 | 
| -    }
 | 
| -    ReverseRGB(pDestBuf, pSrcBuf, pixels);
 | 
| -}
 | 
| -class CPDF_LabCS : public CPDF_ColorSpace
 | 
| -{
 | 
| -public:
 | 
| -    explicit CPDF_LabCS(CPDF_Document* pDoc)
 | 
| -        : CPDF_ColorSpace(pDoc, PDFCS_LAB, 3) {
 | 
| -    }
 | 
| -    void GetDefaultValue(int iComponent, FX_FLOAT& value, FX_FLOAT& min, FX_FLOAT& max) const override;
 | 
| -    FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) override;
 | 
| -    FX_BOOL	GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const override;
 | 
| -    FX_BOOL	SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const override;
 | 
| -    void TranslateImageLine(uint8_t* pDestBuf, const uint8_t* pSrcBuf, int pixels, int image_width,
 | 
| -                            int image_height, FX_BOOL bTransMask = FALSE) const;
 | 
| +  CPDF_Array* pParam = pDict->GetArray(FX_BSTRC("WhitePoint"));
 | 
| +  int i;
 | 
| +  for (i = 0; i < 3; i++) {
 | 
| +    m_WhitePoint[i] = pParam ? pParam->GetNumber(i) : 0;
 | 
| +  }
 | 
| +  pParam = pDict->GetArray(FX_BSTRC("BlackPoint"));
 | 
| +  for (i = 0; i < 3; i++) {
 | 
| +    m_BlackPoint[i] = pParam ? pParam->GetNumber(i) : 0;
 | 
| +  }
 | 
| +  pParam = pDict->GetArray(FX_BSTRC("Gamma"));
 | 
| +  if (pParam) {
 | 
| +    m_bGamma = TRUE;
 | 
| +    for (i = 0; i < 3; i++) {
 | 
| +      m_Gamma[i] = pParam->GetNumber(i);
 | 
| +    }
 | 
| +  } else {
 | 
| +    m_bGamma = FALSE;
 | 
| +  }
 | 
| +  pParam = pDict->GetArray(FX_BSTRC("Matrix"));
 | 
| +  if (pParam) {
 | 
| +    m_bMatrix = TRUE;
 | 
| +    for (i = 0; i < 9; i++) {
 | 
| +      m_Matrix[i] = pParam->GetNumber(i);
 | 
| +    }
 | 
| +  } else {
 | 
| +    m_bMatrix = FALSE;
 | 
| +  }
 | 
| +  return TRUE;
 | 
| +}
 | 
| +FX_BOOL CPDF_CalRGB::GetRGB(FX_FLOAT* pBuf,
 | 
| +                            FX_FLOAT& R,
 | 
| +                            FX_FLOAT& G,
 | 
| +                            FX_FLOAT& B) const {
 | 
| +  FX_FLOAT A_ = pBuf[0];
 | 
| +  FX_FLOAT B_ = pBuf[1];
 | 
| +  FX_FLOAT C_ = pBuf[2];
 | 
| +  if (m_bGamma) {
 | 
| +    A_ = (FX_FLOAT)FXSYS_pow(A_, m_Gamma[0]);
 | 
| +    B_ = (FX_FLOAT)FXSYS_pow(B_, m_Gamma[1]);
 | 
| +    C_ = (FX_FLOAT)FXSYS_pow(C_, m_Gamma[2]);
 | 
| +  }
 | 
| +  FX_FLOAT X, Y, Z;
 | 
| +  if (m_bMatrix) {
 | 
| +    X = m_Matrix[0] * A_ + m_Matrix[3] * B_ + m_Matrix[6] * C_;
 | 
| +    Y = m_Matrix[1] * A_ + m_Matrix[4] * B_ + m_Matrix[7] * C_;
 | 
| +    Z = m_Matrix[2] * A_ + m_Matrix[5] * B_ + m_Matrix[8] * C_;
 | 
| +  } else {
 | 
| +    X = A_;
 | 
| +    Y = B_;
 | 
| +    Z = C_;
 | 
| +  }
 | 
| +  XYZ_to_sRGB_WhitePoint(X, Y, Z, R, G, B, m_WhitePoint[0], m_WhitePoint[1],
 | 
| +                         m_WhitePoint[2]);
 | 
| +  return TRUE;
 | 
| +}
 | 
| +FX_BOOL CPDF_CalRGB::SetRGB(FX_FLOAT* pBuf,
 | 
| +                            FX_FLOAT R,
 | 
| +                            FX_FLOAT G,
 | 
| +                            FX_FLOAT B) const {
 | 
| +  pBuf[0] = R;
 | 
| +  pBuf[1] = G;
 | 
| +  pBuf[2] = B;
 | 
| +  return TRUE;
 | 
| +}
 | 
| +void CPDF_CalRGB::TranslateImageLine(uint8_t* pDestBuf,
 | 
| +                                     const uint8_t* pSrcBuf,
 | 
| +                                     int pixels,
 | 
| +                                     int image_width,
 | 
| +                                     int image_height,
 | 
| +                                     FX_BOOL bTransMask) const {
 | 
| +  if (bTransMask) {
 | 
| +    FX_FLOAT Cal[3];
 | 
| +    FX_FLOAT R, G, B;
 | 
| +    for (int i = 0; i < pixels; i++) {
 | 
| +      Cal[0] = ((FX_FLOAT)pSrcBuf[2]) / 255;
 | 
| +      Cal[1] = ((FX_FLOAT)pSrcBuf[1]) / 255;
 | 
| +      Cal[2] = ((FX_FLOAT)pSrcBuf[0]) / 255;
 | 
| +      GetRGB(Cal, R, G, B);
 | 
| +      pDestBuf[0] = FXSYS_round(B * 255);
 | 
| +      pDestBuf[1] = FXSYS_round(G * 255);
 | 
| +      pDestBuf[2] = FXSYS_round(R * 255);
 | 
| +      pSrcBuf += 3;
 | 
| +      pDestBuf += 3;
 | 
| +    }
 | 
| +  }
 | 
| +  ReverseRGB(pDestBuf, pSrcBuf, pixels);
 | 
| +}
 | 
| +class CPDF_LabCS : public CPDF_ColorSpace {
 | 
| + public:
 | 
| +  explicit CPDF_LabCS(CPDF_Document* pDoc)
 | 
| +      : CPDF_ColorSpace(pDoc, PDFCS_LAB, 3) {}
 | 
| +  void GetDefaultValue(int iComponent,
 | 
| +                       FX_FLOAT& value,
 | 
| +                       FX_FLOAT& min,
 | 
| +                       FX_FLOAT& max) const override;
 | 
| +  FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) override;
 | 
| +  FX_BOOL GetRGB(FX_FLOAT* pBuf,
 | 
| +                 FX_FLOAT& R,
 | 
| +                 FX_FLOAT& G,
 | 
| +                 FX_FLOAT& B) const override;
 | 
| +  FX_BOOL SetRGB(FX_FLOAT* pBuf,
 | 
| +                 FX_FLOAT R,
 | 
| +                 FX_FLOAT G,
 | 
| +                 FX_FLOAT B) const override;
 | 
| +  void TranslateImageLine(uint8_t* pDestBuf,
 | 
| +                          const uint8_t* pSrcBuf,
 | 
| +                          int pixels,
 | 
| +                          int image_width,
 | 
| +                          int image_height,
 | 
| +                          FX_BOOL bTransMask = FALSE) const;
 | 
|  
 | 
| -    FX_FLOAT m_WhitePoint[3];
 | 
| -    FX_FLOAT m_BlackPoint[3];
 | 
| -    FX_FLOAT m_Ranges[4];
 | 
| +  FX_FLOAT m_WhitePoint[3];
 | 
| +  FX_FLOAT m_BlackPoint[3];
 | 
| +  FX_FLOAT m_Ranges[4];
 | 
|  };
 | 
| -FX_BOOL CPDF_LabCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
 | 
| -{
 | 
| -    CPDF_Dictionary* pDict = pArray->GetDict(1);
 | 
| -    if (!pDict) {
 | 
| -        return FALSE;
 | 
| -    }
 | 
| -    CPDF_Array* pParam = pDict->GetArray(FX_BSTRC("WhitePoint"));
 | 
| -    int i;
 | 
| -    for (i = 0; i < 3; i ++) {
 | 
| -        m_WhitePoint[i] = pParam ? pParam->GetNumber(i) : 0;
 | 
| -    }
 | 
| -    pParam = pDict->GetArray(FX_BSTRC("BlackPoint"));
 | 
| -    for (i = 0; i < 3; i ++) {
 | 
| -        m_BlackPoint[i] = pParam ? pParam->GetNumber(i) : 0;
 | 
| -    }
 | 
| -    pParam = pDict->GetArray(FX_BSTRC("Range"));
 | 
| -    const FX_FLOAT def_ranges[4] = { -100 * 1.0f, 100 * 1.0f, -100 * 1.0f, 100 * 1.0f};
 | 
| -    for (i = 0; i < 4; i ++) {
 | 
| -        m_Ranges[i] = pParam ? pParam->GetNumber(i) : def_ranges[i];
 | 
| -    }
 | 
| -    return TRUE;
 | 
| -}
 | 
| -void CPDF_LabCS::GetDefaultValue(int iComponent, FX_FLOAT& value, FX_FLOAT& min, FX_FLOAT& max) const
 | 
| -{
 | 
| -    assert(iComponent < 3);
 | 
| -    value = 0;
 | 
| -    if (iComponent == 0) {
 | 
| -        min = 0;
 | 
| -        max = 100 * 1.0f;
 | 
| -    } else {
 | 
| -        min = m_Ranges[iComponent * 2 - 2];
 | 
| -        max = m_Ranges[iComponent * 2 - 1];
 | 
| -        if (value < min) {
 | 
| -            value = min;
 | 
| -        } else if (value > max) {
 | 
| -            value = max;
 | 
| -        }
 | 
| -    }
 | 
| -}
 | 
| -FX_BOOL CPDF_LabCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const
 | 
| -{
 | 
| -    FX_FLOAT Lstar = pBuf[0];
 | 
| -    FX_FLOAT astar = pBuf[1];
 | 
| -    FX_FLOAT bstar = pBuf[2];
 | 
| -    FX_FLOAT M = (Lstar + 16.0f) / 116.0f;
 | 
| -    FX_FLOAT L = M + astar / 500.0f;
 | 
| -    FX_FLOAT N = M - bstar / 200.0f;
 | 
| -    FX_FLOAT X, Y, Z;
 | 
| -    if (L < 0.2069f) {
 | 
| -        X = 0.957f * 0.12842f * (L - 0.1379f);
 | 
| -    } else {
 | 
| -        X = 0.957f * L * L * L;
 | 
| -    }
 | 
| -    if (M < 0.2069f) {
 | 
| -        Y = 0.12842f * (M - 0.1379f);
 | 
| -    } else {
 | 
| -        Y = M * M * M;
 | 
| -    }
 | 
| -    if (N < 0.2069f) {
 | 
| -        Z = 1.0889f * 0.12842f * (N - 0.1379f);
 | 
| -    } else {
 | 
| -        Z = 1.0889f * N * N * N;
 | 
| -    }
 | 
| -    XYZ_to_sRGB(X, Y, Z, R, G, B);
 | 
| -    return TRUE;
 | 
| -}
 | 
| -FX_BOOL CPDF_LabCS::SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const
 | 
| -{
 | 
| +FX_BOOL CPDF_LabCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) {
 | 
| +  CPDF_Dictionary* pDict = pArray->GetDict(1);
 | 
| +  if (!pDict) {
 | 
|      return FALSE;
 | 
| -}
 | 
| -void CPDF_LabCS::TranslateImageLine(uint8_t* pDestBuf, const uint8_t* pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask) const
 | 
| -{
 | 
| -    for (int i = 0; i < pixels; i ++) {
 | 
| -        FX_FLOAT lab[3];
 | 
| -        FX_FLOAT R, G, B;
 | 
| -        lab[0] = (pSrcBuf[0] * 100 / 255.0f);
 | 
| -        lab[1] = (FX_FLOAT)(pSrcBuf[1] - 128);
 | 
| -        lab[2] = (FX_FLOAT)(pSrcBuf[2] - 128);
 | 
| -        GetRGB(lab, R, G, B);
 | 
| -        pDestBuf[0] = (int32_t)(B * 255);
 | 
| -        pDestBuf[1] = (int32_t)(G * 255);
 | 
| -        pDestBuf[2] = (int32_t)(R * 255);
 | 
| -        pDestBuf += 3;
 | 
| -        pSrcBuf += 3;
 | 
| -    }
 | 
| -}
 | 
| -CPDF_IccProfile::CPDF_IccProfile(const uint8_t* pData, FX_DWORD dwSize):
 | 
| -    m_bsRGB(FALSE),
 | 
| -    m_pTransform(NULL),
 | 
| -    m_nSrcComponents(0)
 | 
| -{
 | 
| -    if (dwSize == 3144 && FXSYS_memcmp(pData + 0x190, "sRGB IEC61966-2.1", 17) == 0) {
 | 
| -        m_bsRGB = TRUE;
 | 
| -        m_nSrcComponents = 3;
 | 
| -    }
 | 
| -    else if (CPDF_ModuleMgr::Get()->GetIccModule()) {
 | 
| -        m_pTransform = CPDF_ModuleMgr::Get()->GetIccModule()->CreateTransform_sRGB(pData, dwSize, m_nSrcComponents);
 | 
| -    }
 | 
| -}
 | 
| -CPDF_IccProfile::~CPDF_IccProfile()
 | 
| -{
 | 
| -    if (m_pTransform) {
 | 
| -        CPDF_ModuleMgr::Get()->GetIccModule()->DestroyTransform(m_pTransform);
 | 
| -    }
 | 
| -}
 | 
| -class CPDF_ICCBasedCS : public CPDF_ColorSpace
 | 
| -{
 | 
| -public:
 | 
| -    explicit CPDF_ICCBasedCS(CPDF_Document* pDoc)
 | 
| -        : CPDF_ColorSpace(pDoc, PDFCS_ICCBASED, 0),
 | 
| -          m_pAlterCS(nullptr),
 | 
| -          m_pProfile(nullptr),
 | 
| -          m_pCache(nullptr),
 | 
| -          m_pRanges(nullptr),
 | 
| -          m_bOwn(FALSE) {
 | 
| -    }
 | 
| -    ~CPDF_ICCBasedCS() override;
 | 
| +  }
 | 
| +  CPDF_Array* pParam = pDict->GetArray(FX_BSTRC("WhitePoint"));
 | 
| +  int i;
 | 
| +  for (i = 0; i < 3; i++) {
 | 
| +    m_WhitePoint[i] = pParam ? pParam->GetNumber(i) : 0;
 | 
| +  }
 | 
| +  pParam = pDict->GetArray(FX_BSTRC("BlackPoint"));
 | 
| +  for (i = 0; i < 3; i++) {
 | 
| +    m_BlackPoint[i] = pParam ? pParam->GetNumber(i) : 0;
 | 
| +  }
 | 
| +  pParam = pDict->GetArray(FX_BSTRC("Range"));
 | 
| +  const FX_FLOAT def_ranges[4] = {-100 * 1.0f, 100 * 1.0f, -100 * 1.0f,
 | 
| +                                  100 * 1.0f};
 | 
| +  for (i = 0; i < 4; i++) {
 | 
| +    m_Ranges[i] = pParam ? pParam->GetNumber(i) : def_ranges[i];
 | 
| +  }
 | 
| +  return TRUE;
 | 
| +}
 | 
| +void CPDF_LabCS::GetDefaultValue(int iComponent,
 | 
| +                                 FX_FLOAT& value,
 | 
| +                                 FX_FLOAT& min,
 | 
| +                                 FX_FLOAT& max) const {
 | 
| +  assert(iComponent < 3);
 | 
| +  value = 0;
 | 
| +  if (iComponent == 0) {
 | 
| +    min = 0;
 | 
| +    max = 100 * 1.0f;
 | 
| +  } else {
 | 
| +    min = m_Ranges[iComponent * 2 - 2];
 | 
| +    max = m_Ranges[iComponent * 2 - 1];
 | 
| +    if (value < min) {
 | 
| +      value = min;
 | 
| +    } else if (value > max) {
 | 
| +      value = max;
 | 
| +    }
 | 
| +  }
 | 
| +}
 | 
| +FX_BOOL CPDF_LabCS::GetRGB(FX_FLOAT* pBuf,
 | 
| +                           FX_FLOAT& R,
 | 
| +                           FX_FLOAT& G,
 | 
| +                           FX_FLOAT& B) const {
 | 
| +  FX_FLOAT Lstar = pBuf[0];
 | 
| +  FX_FLOAT astar = pBuf[1];
 | 
| +  FX_FLOAT bstar = pBuf[2];
 | 
| +  FX_FLOAT M = (Lstar + 16.0f) / 116.0f;
 | 
| +  FX_FLOAT L = M + astar / 500.0f;
 | 
| +  FX_FLOAT N = M - bstar / 200.0f;
 | 
| +  FX_FLOAT X, Y, Z;
 | 
| +  if (L < 0.2069f) {
 | 
| +    X = 0.957f * 0.12842f * (L - 0.1379f);
 | 
| +  } else {
 | 
| +    X = 0.957f * L * L * L;
 | 
| +  }
 | 
| +  if (M < 0.2069f) {
 | 
| +    Y = 0.12842f * (M - 0.1379f);
 | 
| +  } else {
 | 
| +    Y = M * M * M;
 | 
| +  }
 | 
| +  if (N < 0.2069f) {
 | 
| +    Z = 1.0889f * 0.12842f * (N - 0.1379f);
 | 
| +  } else {
 | 
| +    Z = 1.0889f * N * N * N;
 | 
| +  }
 | 
| +  XYZ_to_sRGB(X, Y, Z, R, G, B);
 | 
| +  return TRUE;
 | 
| +}
 | 
| +FX_BOOL CPDF_LabCS::SetRGB(FX_FLOAT* pBuf,
 | 
| +                           FX_FLOAT R,
 | 
| +                           FX_FLOAT G,
 | 
| +                           FX_FLOAT B) const {
 | 
| +  return FALSE;
 | 
| +}
 | 
| +void CPDF_LabCS::TranslateImageLine(uint8_t* pDestBuf,
 | 
| +                                    const uint8_t* pSrcBuf,
 | 
| +                                    int pixels,
 | 
| +                                    int image_width,
 | 
| +                                    int image_height,
 | 
| +                                    FX_BOOL bTransMask) const {
 | 
| +  for (int i = 0; i < pixels; i++) {
 | 
| +    FX_FLOAT lab[3];
 | 
| +    FX_FLOAT R, G, B;
 | 
| +    lab[0] = (pSrcBuf[0] * 100 / 255.0f);
 | 
| +    lab[1] = (FX_FLOAT)(pSrcBuf[1] - 128);
 | 
| +    lab[2] = (FX_FLOAT)(pSrcBuf[2] - 128);
 | 
| +    GetRGB(lab, R, G, B);
 | 
| +    pDestBuf[0] = (int32_t)(B * 255);
 | 
| +    pDestBuf[1] = (int32_t)(G * 255);
 | 
| +    pDestBuf[2] = (int32_t)(R * 255);
 | 
| +    pDestBuf += 3;
 | 
| +    pSrcBuf += 3;
 | 
| +  }
 | 
| +}
 | 
| +CPDF_IccProfile::CPDF_IccProfile(const uint8_t* pData, FX_DWORD dwSize)
 | 
| +    : m_bsRGB(FALSE), m_pTransform(NULL), m_nSrcComponents(0) {
 | 
| +  if (dwSize == 3144 &&
 | 
| +      FXSYS_memcmp(pData + 0x190, "sRGB IEC61966-2.1", 17) == 0) {
 | 
| +    m_bsRGB = TRUE;
 | 
| +    m_nSrcComponents = 3;
 | 
| +  } else if (CPDF_ModuleMgr::Get()->GetIccModule()) {
 | 
| +    m_pTransform = CPDF_ModuleMgr::Get()->GetIccModule()->CreateTransform_sRGB(
 | 
| +        pData, dwSize, m_nSrcComponents);
 | 
| +  }
 | 
| +}
 | 
| +CPDF_IccProfile::~CPDF_IccProfile() {
 | 
| +  if (m_pTransform) {
 | 
| +    CPDF_ModuleMgr::Get()->GetIccModule()->DestroyTransform(m_pTransform);
 | 
| +  }
 | 
| +}
 | 
| +class CPDF_ICCBasedCS : public CPDF_ColorSpace {
 | 
| + public:
 | 
| +  explicit CPDF_ICCBasedCS(CPDF_Document* pDoc)
 | 
| +      : CPDF_ColorSpace(pDoc, PDFCS_ICCBASED, 0),
 | 
| +        m_pAlterCS(nullptr),
 | 
| +        m_pProfile(nullptr),
 | 
| +        m_pCache(nullptr),
 | 
| +        m_pRanges(nullptr),
 | 
| +        m_bOwn(FALSE) {}
 | 
| +  ~CPDF_ICCBasedCS() override;
 | 
|  
 | 
| -    FX_BOOL	v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) override;
 | 
| -    FX_BOOL GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const override;
 | 
| -    FX_BOOL	SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const override;
 | 
| -    FX_BOOL	v_GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const override;
 | 
| -    void EnableStdConversion(FX_BOOL bEnabled) override;
 | 
| -    void TranslateImageLine(uint8_t* pDestBuf, const uint8_t* pSrcBuf, int pixels, int image_width,
 | 
| -                            int image_height, FX_BOOL bTransMask = FALSE) const override;
 | 
| +  FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) override;
 | 
| +  FX_BOOL GetRGB(FX_FLOAT* pBuf,
 | 
| +                 FX_FLOAT& R,
 | 
| +                 FX_FLOAT& G,
 | 
| +                 FX_FLOAT& B) const override;
 | 
| +  FX_BOOL SetRGB(FX_FLOAT* pBuf,
 | 
| +                 FX_FLOAT R,
 | 
| +                 FX_FLOAT G,
 | 
| +                 FX_FLOAT B) const override;
 | 
| +  FX_BOOL v_GetCMYK(FX_FLOAT* pBuf,
 | 
| +                    FX_FLOAT& c,
 | 
| +                    FX_FLOAT& m,
 | 
| +                    FX_FLOAT& y,
 | 
| +                    FX_FLOAT& k) const override;
 | 
| +  void EnableStdConversion(FX_BOOL bEnabled) override;
 | 
| +  void TranslateImageLine(uint8_t* pDestBuf,
 | 
| +                          const uint8_t* pSrcBuf,
 | 
| +                          int pixels,
 | 
| +                          int image_width,
 | 
| +                          int image_height,
 | 
| +                          FX_BOOL bTransMask = FALSE) const override;
 | 
|  
 | 
| -    CPDF_ColorSpace* m_pAlterCS;
 | 
| -    CPDF_IccProfile* m_pProfile;
 | 
| -    uint8_t* m_pCache;
 | 
| -    FX_FLOAT* m_pRanges;
 | 
| -    FX_BOOL	m_bOwn;
 | 
| +  CPDF_ColorSpace* m_pAlterCS;
 | 
| +  CPDF_IccProfile* m_pProfile;
 | 
| +  uint8_t* m_pCache;
 | 
| +  FX_FLOAT* m_pRanges;
 | 
| +  FX_BOOL m_bOwn;
 | 
|  };
 | 
|  
 | 
| -CPDF_ICCBasedCS::~CPDF_ICCBasedCS()
 | 
| -{
 | 
| -    if (m_pCache) {
 | 
| -        FX_Free(m_pCache);
 | 
| -    }
 | 
| -    if (m_pRanges) {
 | 
| -        FX_Free(m_pRanges);
 | 
| -    }
 | 
| -    if (m_pAlterCS && m_bOwn) {
 | 
| -        m_pAlterCS->ReleaseCS();
 | 
| -    }
 | 
| -    if (m_pProfile && m_pDocument) {
 | 
| -        m_pDocument->GetPageData()->ReleaseIccProfile(m_pProfile);
 | 
| -    }
 | 
| +CPDF_ICCBasedCS::~CPDF_ICCBasedCS() {
 | 
| +  if (m_pCache) {
 | 
| +    FX_Free(m_pCache);
 | 
| +  }
 | 
| +  if (m_pRanges) {
 | 
| +    FX_Free(m_pRanges);
 | 
| +  }
 | 
| +  if (m_pAlterCS && m_bOwn) {
 | 
| +    m_pAlterCS->ReleaseCS();
 | 
| +  }
 | 
| +  if (m_pProfile && m_pDocument) {
 | 
| +    m_pDocument->GetPageData()->ReleaseIccProfile(m_pProfile);
 | 
| +  }
 | 
|  }
 | 
|  
 | 
| -FX_BOOL CPDF_ICCBasedCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
 | 
| -{
 | 
| -    CPDF_Stream* pStream = pArray->GetStream(1);
 | 
| -    if (pStream == NULL) {
 | 
| -        return FALSE;
 | 
| -    }
 | 
| -    m_pProfile = pDoc->LoadIccProfile(pStream);
 | 
| -    if (!m_pProfile) {
 | 
| -        return FALSE;
 | 
| -    }
 | 
| -    m_nComponents = m_pProfile->GetComponents(); //Try using the nComponents from ICC profile
 | 
| -    CPDF_Dictionary* pDict = pStream->GetDict();
 | 
| -    if (m_pProfile->m_pTransform == NULL) { // No valid ICC profile or using sRGB
 | 
| -        CPDF_Object* pAlterCSObj = pDict ? pDict->GetElementValue(FX_BSTRC("Alternate")) : NULL;
 | 
| -        if (pAlterCSObj) {
 | 
| -            CPDF_ColorSpace* pAlterCS = CPDF_ColorSpace::Load(pDoc, pAlterCSObj);
 | 
| -            if (pAlterCS) {
 | 
| -                if (m_nComponents == 0) { // NO valid ICC profile
 | 
| -                    if (pAlterCS->CountComponents() > 0) { // Use Alternative colorspace
 | 
| -                        m_nComponents = pAlterCS->CountComponents();
 | 
| -                        m_pAlterCS = pAlterCS;
 | 
| -                        m_bOwn = TRUE;
 | 
| -                    }
 | 
| -                    else { // No valid alternative colorspace
 | 
| -                        pAlterCS->ReleaseCS();
 | 
| -                        int32_t nDictComponents = pDict ? pDict->GetInteger(FX_BSTRC("N")) : 0;
 | 
| -                        if (nDictComponents != 1 && nDictComponents != 3 && nDictComponents != 4) {
 | 
| -                            return FALSE;
 | 
| -                        }
 | 
| -                        m_nComponents = nDictComponents;
 | 
| -                    }
 | 
| -
 | 
| -                }
 | 
| -                else { // Using sRGB
 | 
| -                    if (pAlterCS->CountComponents() != m_nComponents) {
 | 
| -                        pAlterCS->ReleaseCS();
 | 
| -                    }
 | 
| -                    else {
 | 
| -                        m_pAlterCS = pAlterCS;
 | 
| -                        m_bOwn = TRUE;
 | 
| -                    }
 | 
| -                }
 | 
| -            }
 | 
| -        }
 | 
| -        if (!m_pAlterCS) {
 | 
| -            if (m_nComponents == 1) {
 | 
| -                m_pAlterCS = GetStockCS(PDFCS_DEVICEGRAY);
 | 
| -            }
 | 
| -            else if (m_nComponents == 3) {
 | 
| -                m_pAlterCS = GetStockCS(PDFCS_DEVICERGB);
 | 
| -            }
 | 
| -            else if (m_nComponents == 4) {
 | 
| -                m_pAlterCS = GetStockCS(PDFCS_DEVICECMYK);
 | 
| +FX_BOOL CPDF_ICCBasedCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) {
 | 
| +  CPDF_Stream* pStream = pArray->GetStream(1);
 | 
| +  if (pStream == NULL) {
 | 
| +    return FALSE;
 | 
| +  }
 | 
| +  m_pProfile = pDoc->LoadIccProfile(pStream);
 | 
| +  if (!m_pProfile) {
 | 
| +    return FALSE;
 | 
| +  }
 | 
| +  m_nComponents =
 | 
| +      m_pProfile
 | 
| +          ->GetComponents();  // Try using the nComponents from ICC profile
 | 
| +  CPDF_Dictionary* pDict = pStream->GetDict();
 | 
| +  if (m_pProfile->m_pTransform == NULL) {  // No valid ICC profile or using sRGB
 | 
| +    CPDF_Object* pAlterCSObj =
 | 
| +        pDict ? pDict->GetElementValue(FX_BSTRC("Alternate")) : NULL;
 | 
| +    if (pAlterCSObj) {
 | 
| +      CPDF_ColorSpace* pAlterCS = CPDF_ColorSpace::Load(pDoc, pAlterCSObj);
 | 
| +      if (pAlterCS) {
 | 
| +        if (m_nComponents == 0) {                 // NO valid ICC profile
 | 
| +          if (pAlterCS->CountComponents() > 0) {  // Use Alternative colorspace
 | 
| +            m_nComponents = pAlterCS->CountComponents();
 | 
| +            m_pAlterCS = pAlterCS;
 | 
| +            m_bOwn = TRUE;
 | 
| +          } else {  // No valid alternative colorspace
 | 
| +            pAlterCS->ReleaseCS();
 | 
| +            int32_t nDictComponents =
 | 
| +                pDict ? pDict->GetInteger(FX_BSTRC("N")) : 0;
 | 
| +            if (nDictComponents != 1 && nDictComponents != 3 &&
 | 
| +                nDictComponents != 4) {
 | 
| +              return FALSE;
 | 
|              }
 | 
| +            m_nComponents = nDictComponents;
 | 
| +          }
 | 
| +
 | 
| +        } else {  // Using sRGB
 | 
| +          if (pAlterCS->CountComponents() != m_nComponents) {
 | 
| +            pAlterCS->ReleaseCS();
 | 
| +          } else {
 | 
| +            m_pAlterCS = pAlterCS;
 | 
| +            m_bOwn = TRUE;
 | 
| +          }
 | 
|          }
 | 
| -    }
 | 
| -    CPDF_Array* pRanges = pDict->GetArray(FX_BSTRC("Range"));
 | 
| -    m_pRanges = FX_Alloc2D(FX_FLOAT, m_nComponents, 2);
 | 
| -    for (int i = 0; i < m_nComponents * 2; i ++) {
 | 
| -        if (pRanges) {
 | 
| -            m_pRanges[i] = pRanges->GetNumber(i);
 | 
| -        } else if (i % 2) {
 | 
| -            m_pRanges[i] = 1.0f;
 | 
| -        } else {
 | 
| -            m_pRanges[i] = 0;
 | 
| -        }
 | 
| -    }
 | 
| -    return TRUE;
 | 
| -}
 | 
| -FX_BOOL CPDF_ICCBasedCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const
 | 
| -{
 | 
| -    if (m_pProfile && m_pProfile->m_bsRGB) {
 | 
| -        R = pBuf[0];
 | 
| -        G = pBuf[1];
 | 
| -        B = pBuf[2];
 | 
| -        return TRUE;
 | 
| -    }
 | 
| -    ICodec_IccModule *pIccModule = CPDF_ModuleMgr::Get()->GetIccModule();
 | 
| -    if (m_pProfile->m_pTransform == NULL || pIccModule == NULL) {
 | 
| -        if (m_pAlterCS) {
 | 
| -            m_pAlterCS->GetRGB(pBuf, R, G, B);
 | 
| -        } else {
 | 
| -            R = G = B = 0.0f;
 | 
| -        }
 | 
| -        return TRUE;
 | 
| -    }
 | 
| -    FX_FLOAT rgb[3];
 | 
| -    pIccModule->SetComponents(m_nComponents);
 | 
| -    pIccModule->Translate(m_pProfile->m_pTransform, pBuf, rgb);
 | 
| -    R = rgb[0];
 | 
| -    G = rgb[1];
 | 
| -    B = rgb[2];
 | 
| +      }
 | 
| +    }
 | 
| +    if (!m_pAlterCS) {
 | 
| +      if (m_nComponents == 1) {
 | 
| +        m_pAlterCS = GetStockCS(PDFCS_DEVICEGRAY);
 | 
| +      } else if (m_nComponents == 3) {
 | 
| +        m_pAlterCS = GetStockCS(PDFCS_DEVICERGB);
 | 
| +      } else if (m_nComponents == 4) {
 | 
| +        m_pAlterCS = GetStockCS(PDFCS_DEVICECMYK);
 | 
| +      }
 | 
| +    }
 | 
| +  }
 | 
| +  CPDF_Array* pRanges = pDict->GetArray(FX_BSTRC("Range"));
 | 
| +  m_pRanges = FX_Alloc2D(FX_FLOAT, m_nComponents, 2);
 | 
| +  for (int i = 0; i < m_nComponents * 2; i++) {
 | 
| +    if (pRanges) {
 | 
| +      m_pRanges[i] = pRanges->GetNumber(i);
 | 
| +    } else if (i % 2) {
 | 
| +      m_pRanges[i] = 1.0f;
 | 
| +    } else {
 | 
| +      m_pRanges[i] = 0;
 | 
| +    }
 | 
| +  }
 | 
| +  return TRUE;
 | 
| +}
 | 
| +FX_BOOL CPDF_ICCBasedCS::GetRGB(FX_FLOAT* pBuf,
 | 
| +                                FX_FLOAT& R,
 | 
| +                                FX_FLOAT& G,
 | 
| +                                FX_FLOAT& B) const {
 | 
| +  if (m_pProfile && m_pProfile->m_bsRGB) {
 | 
| +    R = pBuf[0];
 | 
| +    G = pBuf[1];
 | 
| +    B = pBuf[2];
 | 
|      return TRUE;
 | 
| -}
 | 
| -FX_BOOL CPDF_ICCBasedCS::v_GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const
 | 
| -{
 | 
| -    if (m_nComponents != 4) {
 | 
| -        return FALSE;
 | 
| +  }
 | 
| +  ICodec_IccModule* pIccModule = CPDF_ModuleMgr::Get()->GetIccModule();
 | 
| +  if (m_pProfile->m_pTransform == NULL || pIccModule == NULL) {
 | 
| +    if (m_pAlterCS) {
 | 
| +      m_pAlterCS->GetRGB(pBuf, R, G, B);
 | 
| +    } else {
 | 
| +      R = G = B = 0.0f;
 | 
|      }
 | 
| -    c = pBuf[0];
 | 
| -    m = pBuf[1];
 | 
| -    y = pBuf[2];
 | 
| -    k = pBuf[3];
 | 
|      return TRUE;
 | 
| -}
 | 
| -FX_BOOL CPDF_ICCBasedCS::SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const
 | 
| -{
 | 
| +  }
 | 
| +  FX_FLOAT rgb[3];
 | 
| +  pIccModule->SetComponents(m_nComponents);
 | 
| +  pIccModule->Translate(m_pProfile->m_pTransform, pBuf, rgb);
 | 
| +  R = rgb[0];
 | 
| +  G = rgb[1];
 | 
| +  B = rgb[2];
 | 
| +  return TRUE;
 | 
| +}
 | 
| +FX_BOOL CPDF_ICCBasedCS::v_GetCMYK(FX_FLOAT* pBuf,
 | 
| +                                   FX_FLOAT& c,
 | 
| +                                   FX_FLOAT& m,
 | 
| +                                   FX_FLOAT& y,
 | 
| +                                   FX_FLOAT& k) const {
 | 
| +  if (m_nComponents != 4) {
 | 
|      return FALSE;
 | 
| -}
 | 
| -void CPDF_ICCBasedCS::EnableStdConversion(FX_BOOL bEnabled)
 | 
| -{
 | 
| -    CPDF_ColorSpace::EnableStdConversion(bEnabled);
 | 
| -    if (m_pAlterCS) {
 | 
| -        m_pAlterCS->EnableStdConversion(bEnabled);
 | 
| -    }
 | 
| -}
 | 
| -void CPDF_ICCBasedCS::TranslateImageLine(uint8_t* pDestBuf, const uint8_t* pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask) const
 | 
| -{
 | 
| -    if (m_pProfile->m_bsRGB) {
 | 
| -        ReverseRGB(pDestBuf, pSrcBuf, pixels);
 | 
| -    } else if (m_pProfile->m_pTransform) {
 | 
| -        int nMaxColors = 1;
 | 
| -        for (int i = 0; i < m_nComponents; i ++) {
 | 
| -            nMaxColors *= 52;
 | 
| +  }
 | 
| +  c = pBuf[0];
 | 
| +  m = pBuf[1];
 | 
| +  y = pBuf[2];
 | 
| +  k = pBuf[3];
 | 
| +  return TRUE;
 | 
| +}
 | 
| +FX_BOOL CPDF_ICCBasedCS::SetRGB(FX_FLOAT* pBuf,
 | 
| +                                FX_FLOAT R,
 | 
| +                                FX_FLOAT G,
 | 
| +                                FX_FLOAT B) const {
 | 
| +  return FALSE;
 | 
| +}
 | 
| +void CPDF_ICCBasedCS::EnableStdConversion(FX_BOOL bEnabled) {
 | 
| +  CPDF_ColorSpace::EnableStdConversion(bEnabled);
 | 
| +  if (m_pAlterCS) {
 | 
| +    m_pAlterCS->EnableStdConversion(bEnabled);
 | 
| +  }
 | 
| +}
 | 
| +void CPDF_ICCBasedCS::TranslateImageLine(uint8_t* pDestBuf,
 | 
| +                                         const uint8_t* pSrcBuf,
 | 
| +                                         int pixels,
 | 
| +                                         int image_width,
 | 
| +                                         int image_height,
 | 
| +                                         FX_BOOL bTransMask) const {
 | 
| +  if (m_pProfile->m_bsRGB) {
 | 
| +    ReverseRGB(pDestBuf, pSrcBuf, pixels);
 | 
| +  } else if (m_pProfile->m_pTransform) {
 | 
| +    int nMaxColors = 1;
 | 
| +    for (int i = 0; i < m_nComponents; i++) {
 | 
| +      nMaxColors *= 52;
 | 
| +    }
 | 
| +    if (m_nComponents > 3 || image_width * image_height < nMaxColors * 3 / 2) {
 | 
| +      CPDF_ModuleMgr::Get()->GetIccModule()->TranslateScanline(
 | 
| +          m_pProfile->m_pTransform, pDestBuf, pSrcBuf, pixels);
 | 
| +    } else {
 | 
| +      if (m_pCache == NULL) {
 | 
| +        ((CPDF_ICCBasedCS*)this)->m_pCache = FX_Alloc2D(uint8_t, nMaxColors, 3);
 | 
| +        uint8_t* temp_src = FX_Alloc2D(uint8_t, nMaxColors, m_nComponents);
 | 
| +        uint8_t* pSrc = temp_src;
 | 
| +        for (int i = 0; i < nMaxColors; i++) {
 | 
| +          FX_DWORD color = i;
 | 
| +          FX_DWORD order = nMaxColors / 52;
 | 
| +          for (int c = 0; c < m_nComponents; c++) {
 | 
| +            *pSrc++ = (uint8_t)(color / order * 5);
 | 
| +            color %= order;
 | 
| +            order /= 52;
 | 
| +          }
 | 
|          }
 | 
| -        if (m_nComponents > 3 || image_width * image_height < nMaxColors * 3 / 2) {
 | 
| -            CPDF_ModuleMgr::Get()->GetIccModule()->TranslateScanline(m_pProfile->m_pTransform, pDestBuf, pSrcBuf, pixels);
 | 
| -        } else {
 | 
| -            if (m_pCache == NULL) {
 | 
| -                ((CPDF_ICCBasedCS*)this)->m_pCache = FX_Alloc2D(uint8_t, nMaxColors, 3);
 | 
| -                uint8_t* temp_src = FX_Alloc2D(uint8_t, nMaxColors, m_nComponents);
 | 
| -                uint8_t* pSrc = temp_src;
 | 
| -                for (int i = 0; i < nMaxColors; i ++) {
 | 
| -                    FX_DWORD color = i;
 | 
| -                    FX_DWORD order = nMaxColors / 52;
 | 
| -                    for (int c = 0; c < m_nComponents; c ++) {
 | 
| -                        *pSrc++ = (uint8_t)(color / order * 5);
 | 
| -                        color %= order;
 | 
| -                        order /= 52;
 | 
| -                    }
 | 
| -                }
 | 
| -                CPDF_ModuleMgr::Get()->GetIccModule()->TranslateScanline(m_pProfile->m_pTransform, m_pCache, temp_src, nMaxColors);
 | 
| -                FX_Free(temp_src);
 | 
| -            }
 | 
| -            for (int i = 0; i < pixels; i ++) {
 | 
| -                int index = 0;
 | 
| -                for (int c = 0; c < m_nComponents; c ++) {
 | 
| -                    index = index * 52 + (*pSrcBuf) / 5;
 | 
| -                    pSrcBuf ++;
 | 
| -                }
 | 
| -                index *= 3;
 | 
| -                *pDestBuf++ = m_pCache[index];
 | 
| -                *pDestBuf++ = m_pCache[index + 1];
 | 
| -                *pDestBuf++ = m_pCache[index + 2];
 | 
| -            }
 | 
| +        CPDF_ModuleMgr::Get()->GetIccModule()->TranslateScanline(
 | 
| +            m_pProfile->m_pTransform, m_pCache, temp_src, nMaxColors);
 | 
| +        FX_Free(temp_src);
 | 
| +      }
 | 
| +      for (int i = 0; i < pixels; i++) {
 | 
| +        int index = 0;
 | 
| +        for (int c = 0; c < m_nComponents; c++) {
 | 
| +          index = index * 52 + (*pSrcBuf) / 5;
 | 
| +          pSrcBuf++;
 | 
|          }
 | 
| -    } else if (m_pAlterCS) {
 | 
| -        m_pAlterCS->TranslateImageLine(pDestBuf, pSrcBuf, pixels, image_width, image_height);
 | 
| -    }
 | 
| -}
 | 
| -class CPDF_IndexedCS : public CPDF_ColorSpace
 | 
| -{
 | 
| -public:
 | 
| -    explicit CPDF_IndexedCS(CPDF_Document* pDoc)
 | 
| -        : CPDF_ColorSpace(pDoc, PDFCS_INDEXED, 1),
 | 
| -          m_pBaseCS(nullptr),
 | 
| -          m_pCountedBaseCS(nullptr),
 | 
| -          m_pCompMinMax(nullptr) {
 | 
| -    }
 | 
| -    ~CPDF_IndexedCS() override;
 | 
| +        index *= 3;
 | 
| +        *pDestBuf++ = m_pCache[index];
 | 
| +        *pDestBuf++ = m_pCache[index + 1];
 | 
| +        *pDestBuf++ = m_pCache[index + 2];
 | 
| +      }
 | 
| +    }
 | 
| +  } else if (m_pAlterCS) {
 | 
| +    m_pAlterCS->TranslateImageLine(pDestBuf, pSrcBuf, pixels, image_width,
 | 
| +                                   image_height);
 | 
| +  }
 | 
| +}
 | 
| +class CPDF_IndexedCS : public CPDF_ColorSpace {
 | 
| + public:
 | 
| +  explicit CPDF_IndexedCS(CPDF_Document* pDoc)
 | 
| +      : CPDF_ColorSpace(pDoc, PDFCS_INDEXED, 1),
 | 
| +        m_pBaseCS(nullptr),
 | 
| +        m_pCountedBaseCS(nullptr),
 | 
| +        m_pCompMinMax(nullptr) {}
 | 
| +  ~CPDF_IndexedCS() override;
 | 
|  
 | 
| -    FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) override;
 | 
| -    FX_BOOL	GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const override;
 | 
| -    CPDF_ColorSpace* GetBaseCS() const override;
 | 
| -    void EnableStdConversion(FX_BOOL bEnabled) override;
 | 
| +  FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) override;
 | 
| +  FX_BOOL GetRGB(FX_FLOAT* pBuf,
 | 
| +                 FX_FLOAT& R,
 | 
| +                 FX_FLOAT& G,
 | 
| +                 FX_FLOAT& B) const override;
 | 
| +  CPDF_ColorSpace* GetBaseCS() const override;
 | 
| +  void EnableStdConversion(FX_BOOL bEnabled) override;
 | 
|  
 | 
| -    CPDF_ColorSpace* m_pBaseCS;
 | 
| -    CPDF_CountedColorSpace* m_pCountedBaseCS;
 | 
| -    int m_nBaseComponents;
 | 
| -    int	m_MaxIndex;
 | 
| -    CFX_ByteString m_Table;
 | 
| -    FX_FLOAT* m_pCompMinMax;
 | 
| +  CPDF_ColorSpace* m_pBaseCS;
 | 
| +  CPDF_CountedColorSpace* m_pCountedBaseCS;
 | 
| +  int m_nBaseComponents;
 | 
| +  int m_MaxIndex;
 | 
| +  CFX_ByteString m_Table;
 | 
| +  FX_FLOAT* m_pCompMinMax;
 | 
|  };
 | 
| -CPDF_IndexedCS::~CPDF_IndexedCS()
 | 
| -{
 | 
| -    if (m_pCompMinMax) {
 | 
| -        FX_Free(m_pCompMinMax);
 | 
| -    }
 | 
| -    CPDF_ColorSpace* pCS = m_pCountedBaseCS ? m_pCountedBaseCS->get() : NULL;
 | 
| -    if (pCS && m_pDocument) {
 | 
| -        m_pDocument->GetPageData()->ReleaseColorSpace(pCS->GetArray());
 | 
| -    }
 | 
| -}
 | 
| -FX_BOOL CPDF_IndexedCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
 | 
| -{
 | 
| -    if (pArray->GetCount() < 4) {
 | 
| -        return FALSE;
 | 
| -    }
 | 
| -    CPDF_Object* pBaseObj = pArray->GetElementValue(1);
 | 
| -    if (pBaseObj == m_pArray) {
 | 
| -        return FALSE;
 | 
| -    }
 | 
| -    CPDF_DocPageData* pDocPageData = pDoc->GetPageData();
 | 
| -    m_pBaseCS = pDocPageData->GetColorSpace(pBaseObj, NULL);
 | 
| -    if (m_pBaseCS == NULL) {
 | 
| -        return FALSE;
 | 
| -    }
 | 
| -    m_pCountedBaseCS = pDocPageData->FindColorSpacePtr(m_pBaseCS->GetArray());
 | 
| -    m_nBaseComponents = m_pBaseCS->CountComponents();
 | 
| -    m_pCompMinMax = FX_Alloc2D(FX_FLOAT, m_nBaseComponents, 2);
 | 
| -    FX_FLOAT defvalue;
 | 
| -    for (int i = 0; i < m_nBaseComponents; i ++) {
 | 
| -        m_pBaseCS->GetDefaultValue(i, defvalue, m_pCompMinMax[i * 2], m_pCompMinMax[i * 2 + 1]);
 | 
| -        m_pCompMinMax[i * 2 + 1] -= m_pCompMinMax[i * 2];
 | 
| -    }
 | 
| -    m_MaxIndex = pArray->GetInteger(2);
 | 
| -    CPDF_Object* pTableObj = pArray->GetElementValue(3);
 | 
| -    if (pTableObj == NULL) {
 | 
| -        return FALSE;
 | 
| -    }
 | 
| -    if (pTableObj->GetType() == PDFOBJ_STRING) {
 | 
| -        m_Table = ((CPDF_String*)pTableObj)->GetString();
 | 
| -    } else if (pTableObj->GetType() == PDFOBJ_STREAM) {
 | 
| -        CPDF_StreamAcc acc;
 | 
| -        acc.LoadAllData((CPDF_Stream*)pTableObj, FALSE);
 | 
| -        m_Table = CFX_ByteStringC(acc.GetData(), acc.GetSize());
 | 
| -    }
 | 
| -    return TRUE;
 | 
| +CPDF_IndexedCS::~CPDF_IndexedCS() {
 | 
| +  if (m_pCompMinMax) {
 | 
| +    FX_Free(m_pCompMinMax);
 | 
| +  }
 | 
| +  CPDF_ColorSpace* pCS = m_pCountedBaseCS ? m_pCountedBaseCS->get() : NULL;
 | 
| +  if (pCS && m_pDocument) {
 | 
| +    m_pDocument->GetPageData()->ReleaseColorSpace(pCS->GetArray());
 | 
| +  }
 | 
| +}
 | 
| +FX_BOOL CPDF_IndexedCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) {
 | 
| +  if (pArray->GetCount() < 4) {
 | 
| +    return FALSE;
 | 
| +  }
 | 
| +  CPDF_Object* pBaseObj = pArray->GetElementValue(1);
 | 
| +  if (pBaseObj == m_pArray) {
 | 
| +    return FALSE;
 | 
| +  }
 | 
| +  CPDF_DocPageData* pDocPageData = pDoc->GetPageData();
 | 
| +  m_pBaseCS = pDocPageData->GetColorSpace(pBaseObj, NULL);
 | 
| +  if (m_pBaseCS == NULL) {
 | 
| +    return FALSE;
 | 
| +  }
 | 
| +  m_pCountedBaseCS = pDocPageData->FindColorSpacePtr(m_pBaseCS->GetArray());
 | 
| +  m_nBaseComponents = m_pBaseCS->CountComponents();
 | 
| +  m_pCompMinMax = FX_Alloc2D(FX_FLOAT, m_nBaseComponents, 2);
 | 
| +  FX_FLOAT defvalue;
 | 
| +  for (int i = 0; i < m_nBaseComponents; i++) {
 | 
| +    m_pBaseCS->GetDefaultValue(i, defvalue, m_pCompMinMax[i * 2],
 | 
| +                               m_pCompMinMax[i * 2 + 1]);
 | 
| +    m_pCompMinMax[i * 2 + 1] -= m_pCompMinMax[i * 2];
 | 
| +  }
 | 
| +  m_MaxIndex = pArray->GetInteger(2);
 | 
| +  CPDF_Object* pTableObj = pArray->GetElementValue(3);
 | 
| +  if (pTableObj == NULL) {
 | 
| +    return FALSE;
 | 
| +  }
 | 
| +  if (pTableObj->GetType() == PDFOBJ_STRING) {
 | 
| +    m_Table = ((CPDF_String*)pTableObj)->GetString();
 | 
| +  } else if (pTableObj->GetType() == PDFOBJ_STREAM) {
 | 
| +    CPDF_StreamAcc acc;
 | 
| +    acc.LoadAllData((CPDF_Stream*)pTableObj, FALSE);
 | 
| +    m_Table = CFX_ByteStringC(acc.GetData(), acc.GetSize());
 | 
| +  }
 | 
| +  return TRUE;
 | 
|  }
 | 
|  
 | 
| -FX_BOOL CPDF_IndexedCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const
 | 
| -{
 | 
| -    int index = (int32_t)(*pBuf);
 | 
| -    if (index < 0 || index > m_MaxIndex) {
 | 
| -        return FALSE;
 | 
| -    }
 | 
| -    if (m_nBaseComponents) {
 | 
| -        if (index == INT_MAX || (index + 1) > INT_MAX / m_nBaseComponents ||
 | 
| -                (index + 1)*m_nBaseComponents > (int)m_Table.GetLength()) {
 | 
| -            R = G = B = 0;
 | 
| -            return FALSE;
 | 
| -        }
 | 
| -    }
 | 
| -    CFX_FixedBufGrow<FX_FLOAT, 16> Comps(m_nBaseComponents);
 | 
| -    FX_FLOAT* comps = Comps;
 | 
| -    const uint8_t* pTable = m_Table;
 | 
| -    for (int i = 0; i < m_nBaseComponents; i ++) {
 | 
| -        comps[i] = m_pCompMinMax[i * 2] + m_pCompMinMax[i * 2 + 1] * pTable[index * m_nBaseComponents + i] / 255;
 | 
| -    }
 | 
| -    m_pBaseCS->GetRGB(comps, R, G, B);
 | 
| -    return TRUE;
 | 
| -}
 | 
| -CPDF_ColorSpace*CPDF_IndexedCS::GetBaseCS() const
 | 
| -{
 | 
| -    return m_pBaseCS;
 | 
| -}
 | 
| -void CPDF_IndexedCS::EnableStdConversion(FX_BOOL bEnabled)
 | 
| -{
 | 
| -    CPDF_ColorSpace::EnableStdConversion(bEnabled);
 | 
| -    if (m_pBaseCS) {
 | 
| -        m_pBaseCS->EnableStdConversion(bEnabled);
 | 
| -    }
 | 
| -}
 | 
| -#define MAX_PATTERN_COLORCOMPS	16
 | 
| +FX_BOOL CPDF_IndexedCS::GetRGB(FX_FLOAT* pBuf,
 | 
| +                               FX_FLOAT& R,
 | 
| +                               FX_FLOAT& G,
 | 
| +                               FX_FLOAT& B) const {
 | 
| +  int index = (int32_t)(*pBuf);
 | 
| +  if (index < 0 || index > m_MaxIndex) {
 | 
| +    return FALSE;
 | 
| +  }
 | 
| +  if (m_nBaseComponents) {
 | 
| +    if (index == INT_MAX || (index + 1) > INT_MAX / m_nBaseComponents ||
 | 
| +        (index + 1) * m_nBaseComponents > (int)m_Table.GetLength()) {
 | 
| +      R = G = B = 0;
 | 
| +      return FALSE;
 | 
| +    }
 | 
| +  }
 | 
| +  CFX_FixedBufGrow<FX_FLOAT, 16> Comps(m_nBaseComponents);
 | 
| +  FX_FLOAT* comps = Comps;
 | 
| +  const uint8_t* pTable = m_Table;
 | 
| +  for (int i = 0; i < m_nBaseComponents; i++) {
 | 
| +    comps[i] =
 | 
| +        m_pCompMinMax[i * 2] +
 | 
| +        m_pCompMinMax[i * 2 + 1] * pTable[index * m_nBaseComponents + i] / 255;
 | 
| +  }
 | 
| +  m_pBaseCS->GetRGB(comps, R, G, B);
 | 
| +  return TRUE;
 | 
| +}
 | 
| +CPDF_ColorSpace* CPDF_IndexedCS::GetBaseCS() const {
 | 
| +  return m_pBaseCS;
 | 
| +}
 | 
| +void CPDF_IndexedCS::EnableStdConversion(FX_BOOL bEnabled) {
 | 
| +  CPDF_ColorSpace::EnableStdConversion(bEnabled);
 | 
| +  if (m_pBaseCS) {
 | 
| +    m_pBaseCS->EnableStdConversion(bEnabled);
 | 
| +  }
 | 
| +}
 | 
| +#define MAX_PATTERN_COLORCOMPS 16
 | 
|  typedef struct _PatternValue {
 | 
| -    CPDF_Pattern*	m_pPattern;
 | 
| -    CPDF_CountedPattern*	m_pCountedPattern;
 | 
| -    int				m_nComps;
 | 
| -    FX_FLOAT		m_Comps[MAX_PATTERN_COLORCOMPS];
 | 
| +  CPDF_Pattern* m_pPattern;
 | 
| +  CPDF_CountedPattern* m_pCountedPattern;
 | 
| +  int m_nComps;
 | 
| +  FX_FLOAT m_Comps[MAX_PATTERN_COLORCOMPS];
 | 
|  } PatternValue;
 | 
| -CPDF_PatternCS::~CPDF_PatternCS()
 | 
| -{
 | 
| -    CPDF_ColorSpace* pCS = m_pCountedBaseCS ? m_pCountedBaseCS->get() : NULL;
 | 
| -    if (pCS && m_pDocument) {
 | 
| -	    m_pDocument->GetPageData()->ReleaseColorSpace(pCS->GetArray());
 | 
| -    }
 | 
| -}
 | 
| -FX_BOOL CPDF_PatternCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
 | 
| -{
 | 
| -    CPDF_Object* pBaseCS = pArray->GetElementValue(1);
 | 
| -    if (pBaseCS == m_pArray) {
 | 
| -        return FALSE;
 | 
| -    }
 | 
| -    CPDF_DocPageData* pDocPageData = pDoc->GetPageData();
 | 
| -    m_pBaseCS = pDocPageData->GetColorSpace(pBaseCS, NULL);
 | 
| -    if (m_pBaseCS) {
 | 
| -        if (m_pBaseCS->GetFamily() == PDFCS_PATTERN) {
 | 
| -            return FALSE;
 | 
| -        }
 | 
| -        m_pCountedBaseCS = pDocPageData->FindColorSpacePtr(m_pBaseCS->GetArray());
 | 
| -        m_nComponents = m_pBaseCS->CountComponents() + 1;
 | 
| -        if (m_pBaseCS->CountComponents() > MAX_PATTERN_COLORCOMPS) {
 | 
| -            return FALSE;
 | 
| -        }
 | 
| -    } else {
 | 
| -        m_nComponents = 1;
 | 
| -    }
 | 
| -    return TRUE;
 | 
| -}
 | 
| -FX_BOOL CPDF_PatternCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const
 | 
| -{
 | 
| -    if (m_pBaseCS) {
 | 
| -        ASSERT(m_pBaseCS->GetFamily() != PDFCS_PATTERN);
 | 
| -        PatternValue* pvalue = (PatternValue*)pBuf;
 | 
| -        if (m_pBaseCS->GetRGB(pvalue->m_Comps, R, G, B)) {
 | 
| -            return TRUE;
 | 
| -        }
 | 
| -    }
 | 
| -    R = G = B = 0.75f;
 | 
| -    return FALSE;
 | 
| -}
 | 
| -CPDF_ColorSpace* CPDF_PatternCS::GetBaseCS() const
 | 
| -{
 | 
| -    return m_pBaseCS;
 | 
| -}
 | 
| -class CPDF_SeparationCS : public CPDF_ColorSpace
 | 
| -{
 | 
| -public:
 | 
| -    CPDF_SeparationCS(CPDF_Document* pDoc)
 | 
| -            : CPDF_ColorSpace(pDoc, PDFCS_SEPARATION, 1),
 | 
| -              m_pAltCS(nullptr),
 | 
| -              m_pFunc(nullptr) {
 | 
| -    }
 | 
| -    ~CPDF_SeparationCS() override;
 | 
| -    void GetDefaultValue(int iComponent, FX_FLOAT& value, FX_FLOAT& min, FX_FLOAT& max) const override;
 | 
| -    FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) override;
 | 
| -    FX_BOOL GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const override;
 | 
| -    void EnableStdConversion(FX_BOOL bEnabled) override;
 | 
| -
 | 
| -    CPDF_ColorSpace* m_pAltCS;
 | 
| -    CPDF_Function* m_pFunc;
 | 
| -    enum { None, All, Colorant } m_Type;
 | 
| -};
 | 
| -CPDF_SeparationCS::~CPDF_SeparationCS()
 | 
| -{
 | 
| -    if (m_pAltCS) {
 | 
| -        m_pAltCS->ReleaseCS();
 | 
| -    }
 | 
| -    delete m_pFunc;
 | 
| -}
 | 
| -void CPDF_SeparationCS::GetDefaultValue(int iComponent, FX_FLOAT& value, FX_FLOAT& min, FX_FLOAT& max) const
 | 
| -{
 | 
| -    value = 1.0f;
 | 
| -    min = 0;
 | 
| -    max = 1.0f;
 | 
| -}
 | 
| -FX_BOOL CPDF_SeparationCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
 | 
| -{
 | 
| -    CFX_ByteString name = pArray->GetString(1);
 | 
| -    if (name == FX_BSTRC("None")) {
 | 
| -        m_Type = None;
 | 
| -    } else {
 | 
| -        m_Type = Colorant;
 | 
| -        CPDF_Object* pAltCS = pArray->GetElementValue(2);
 | 
| -        if (pAltCS == m_pArray) {
 | 
| -            return FALSE;
 | 
| -        }
 | 
| -        m_pAltCS = Load(pDoc, pAltCS);
 | 
| -        if (!m_pAltCS) {
 | 
| -            return FALSE;
 | 
| -        }
 | 
| -        CPDF_Object* pFuncObj = pArray->GetElementValue(3);
 | 
| -        if (pFuncObj && pFuncObj->GetType() != PDFOBJ_NAME) {
 | 
| -            m_pFunc = CPDF_Function::Load(pFuncObj);
 | 
| -        }
 | 
| -        if (m_pFunc && m_pFunc->CountOutputs() < m_pAltCS->CountComponents()) {
 | 
| -            delete m_pFunc;
 | 
| -            m_pFunc = NULL;
 | 
| -        }
 | 
| -    }
 | 
| -    return TRUE;
 | 
| -}
 | 
| -FX_BOOL CPDF_SeparationCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const
 | 
| -{
 | 
| -    if (m_Type == None) {
 | 
| -        return FALSE;
 | 
| -    }
 | 
| -    if (m_pFunc == NULL) {
 | 
| -        if (m_pAltCS == NULL) {
 | 
| -            return FALSE;
 | 
| -        }
 | 
| -        int nComps = m_pAltCS->CountComponents();
 | 
| -        CFX_FixedBufGrow<FX_FLOAT, 16> results(nComps);
 | 
| -        for (int i = 0; i < nComps; i ++) {
 | 
| -            results[i] = *pBuf;
 | 
| -        }
 | 
| -        m_pAltCS->GetRGB(results, R, G, B);
 | 
| -        return TRUE;
 | 
| -    }
 | 
| -    CFX_FixedBufGrow<FX_FLOAT, 16> results(m_pFunc->CountOutputs());
 | 
| -    int nresults = 0;
 | 
| -    m_pFunc->Call(pBuf, 1, results, nresults);
 | 
| -    if (nresults == 0) {
 | 
| -        return FALSE;
 | 
| -    }
 | 
| -    if (m_pAltCS) {
 | 
| -        m_pAltCS->GetRGB(results, R, G, B);
 | 
| -        return TRUE;
 | 
| -    }
 | 
| -    R = G = B = 0;
 | 
| +CPDF_PatternCS::~CPDF_PatternCS() {
 | 
| +  CPDF_ColorSpace* pCS = m_pCountedBaseCS ? m_pCountedBaseCS->get() : NULL;
 | 
| +  if (pCS && m_pDocument) {
 | 
| +    m_pDocument->GetPageData()->ReleaseColorSpace(pCS->GetArray());
 | 
| +  }
 | 
| +}
 | 
| +FX_BOOL CPDF_PatternCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) {
 | 
| +  CPDF_Object* pBaseCS = pArray->GetElementValue(1);
 | 
| +  if (pBaseCS == m_pArray) {
 | 
|      return FALSE;
 | 
| -}
 | 
| -void CPDF_SeparationCS::EnableStdConversion(FX_BOOL bEnabled)
 | 
| -{
 | 
| -    CPDF_ColorSpace::EnableStdConversion(bEnabled);
 | 
| -    if (m_pAltCS) {
 | 
| -        m_pAltCS->EnableStdConversion(bEnabled);
 | 
| +  }
 | 
| +  CPDF_DocPageData* pDocPageData = pDoc->GetPageData();
 | 
| +  m_pBaseCS = pDocPageData->GetColorSpace(pBaseCS, NULL);
 | 
| +  if (m_pBaseCS) {
 | 
| +    if (m_pBaseCS->GetFamily() == PDFCS_PATTERN) {
 | 
| +      return FALSE;
 | 
|      }
 | 
| -}
 | 
| -class CPDF_DeviceNCS : public CPDF_ColorSpace
 | 
| -{
 | 
| -public:
 | 
| -    CPDF_DeviceNCS(CPDF_Document* pDoc)
 | 
| -            : CPDF_ColorSpace(pDoc, PDFCS_DEVICEN, 0),
 | 
| -              m_pAltCS(nullptr),
 | 
| -              m_pFunc(nullptr) {
 | 
| -    }
 | 
| -    ~CPDF_DeviceNCS() override;
 | 
| -    void GetDefaultValue(int iComponent, FX_FLOAT& value, FX_FLOAT& min, FX_FLOAT& max) const override;
 | 
| -    FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) override;
 | 
| -    FX_BOOL GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const override;
 | 
| -    void EnableStdConversion(FX_BOOL bEnabled) override;
 | 
| +    m_pCountedBaseCS = pDocPageData->FindColorSpacePtr(m_pBaseCS->GetArray());
 | 
| +    m_nComponents = m_pBaseCS->CountComponents() + 1;
 | 
| +    if (m_pBaseCS->CountComponents() > MAX_PATTERN_COLORCOMPS) {
 | 
| +      return FALSE;
 | 
| +    }
 | 
| +  } else {
 | 
| +    m_nComponents = 1;
 | 
| +  }
 | 
| +  return TRUE;
 | 
| +}
 | 
| +FX_BOOL CPDF_PatternCS::GetRGB(FX_FLOAT* pBuf,
 | 
| +                               FX_FLOAT& R,
 | 
| +                               FX_FLOAT& G,
 | 
| +                               FX_FLOAT& B) const {
 | 
| +  if (m_pBaseCS) {
 | 
| +    ASSERT(m_pBaseCS->GetFamily() != PDFCS_PATTERN);
 | 
| +    PatternValue* pvalue = (PatternValue*)pBuf;
 | 
| +    if (m_pBaseCS->GetRGB(pvalue->m_Comps, R, G, B)) {
 | 
| +      return TRUE;
 | 
| +    }
 | 
| +  }
 | 
| +  R = G = B = 0.75f;
 | 
| +  return FALSE;
 | 
| +}
 | 
| +CPDF_ColorSpace* CPDF_PatternCS::GetBaseCS() const {
 | 
| +  return m_pBaseCS;
 | 
| +}
 | 
| +class CPDF_SeparationCS : public CPDF_ColorSpace {
 | 
| + public:
 | 
| +  CPDF_SeparationCS(CPDF_Document* pDoc)
 | 
| +      : CPDF_ColorSpace(pDoc, PDFCS_SEPARATION, 1),
 | 
| +        m_pAltCS(nullptr),
 | 
| +        m_pFunc(nullptr) {}
 | 
| +  ~CPDF_SeparationCS() override;
 | 
| +  void GetDefaultValue(int iComponent,
 | 
| +                       FX_FLOAT& value,
 | 
| +                       FX_FLOAT& min,
 | 
| +                       FX_FLOAT& max) const override;
 | 
| +  FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) override;
 | 
| +  FX_BOOL GetRGB(FX_FLOAT* pBuf,
 | 
| +                 FX_FLOAT& R,
 | 
| +                 FX_FLOAT& G,
 | 
| +                 FX_FLOAT& B) const override;
 | 
| +  void EnableStdConversion(FX_BOOL bEnabled) override;
 | 
|  
 | 
| -    CPDF_ColorSpace* m_pAltCS;
 | 
| -    CPDF_Function* m_pFunc;
 | 
| +  CPDF_ColorSpace* m_pAltCS;
 | 
| +  CPDF_Function* m_pFunc;
 | 
| +  enum { None, All, Colorant } m_Type;
 | 
|  };
 | 
| -CPDF_DeviceNCS::~CPDF_DeviceNCS()
 | 
| -{
 | 
| -    delete m_pFunc;
 | 
| -    if (m_pAltCS) {
 | 
| -        m_pAltCS->ReleaseCS();
 | 
| -    }
 | 
| -}
 | 
| -void CPDF_DeviceNCS::GetDefaultValue(int iComponent, FX_FLOAT& value, FX_FLOAT& min, FX_FLOAT& max) const
 | 
| -{
 | 
| -    value = 1.0f;
 | 
| -    min = 0;
 | 
| -    max = 1.0f;
 | 
| -}
 | 
| -FX_BOOL CPDF_DeviceNCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
 | 
| -{
 | 
| -    CPDF_Object* pObj = pArray->GetElementValue(1);
 | 
| -    if (!pObj) {
 | 
| -        return FALSE;
 | 
| -    }
 | 
| -    if (pObj->GetType() != PDFOBJ_ARRAY) {
 | 
| -        return FALSE;
 | 
| -    }
 | 
| -    m_nComponents = ((CPDF_Array*)pObj)->GetCount();
 | 
| +CPDF_SeparationCS::~CPDF_SeparationCS() {
 | 
| +  if (m_pAltCS) {
 | 
| +    m_pAltCS->ReleaseCS();
 | 
| +  }
 | 
| +  delete m_pFunc;
 | 
| +}
 | 
| +void CPDF_SeparationCS::GetDefaultValue(int iComponent,
 | 
| +                                        FX_FLOAT& value,
 | 
| +                                        FX_FLOAT& min,
 | 
| +                                        FX_FLOAT& max) const {
 | 
| +  value = 1.0f;
 | 
| +  min = 0;
 | 
| +  max = 1.0f;
 | 
| +}
 | 
| +FX_BOOL CPDF_SeparationCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) {
 | 
| +  CFX_ByteString name = pArray->GetString(1);
 | 
| +  if (name == FX_BSTRC("None")) {
 | 
| +    m_Type = None;
 | 
| +  } else {
 | 
| +    m_Type = Colorant;
 | 
|      CPDF_Object* pAltCS = pArray->GetElementValue(2);
 | 
| -    if (!pAltCS || pAltCS == m_pArray) {
 | 
| -        return FALSE;
 | 
| +    if (pAltCS == m_pArray) {
 | 
| +      return FALSE;
 | 
|      }
 | 
|      m_pAltCS = Load(pDoc, pAltCS);
 | 
| -    m_pFunc = CPDF_Function::Load(pArray->GetElementValue(3));
 | 
| -    if (m_pAltCS == NULL || m_pFunc == NULL) {
 | 
| -        return FALSE;
 | 
| +    if (!m_pAltCS) {
 | 
| +      return FALSE;
 | 
|      }
 | 
| -    if (m_pFunc->CountOutputs() < m_pAltCS->CountComponents()) {
 | 
| -        return FALSE;
 | 
| +    CPDF_Object* pFuncObj = pArray->GetElementValue(3);
 | 
| +    if (pFuncObj && pFuncObj->GetType() != PDFOBJ_NAME) {
 | 
| +      m_pFunc = CPDF_Function::Load(pFuncObj);
 | 
|      }
 | 
| -    return TRUE;
 | 
| +    if (m_pFunc && m_pFunc->CountOutputs() < m_pAltCS->CountComponents()) {
 | 
| +      delete m_pFunc;
 | 
| +      m_pFunc = NULL;
 | 
| +    }
 | 
| +  }
 | 
| +  return TRUE;
 | 
|  }
 | 
| -FX_BOOL CPDF_DeviceNCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const
 | 
| -{
 | 
| -    if (m_pFunc == NULL) {
 | 
| -        return FALSE;
 | 
| +FX_BOOL CPDF_SeparationCS::GetRGB(FX_FLOAT* pBuf,
 | 
| +                                  FX_FLOAT& R,
 | 
| +                                  FX_FLOAT& G,
 | 
| +                                  FX_FLOAT& B) const {
 | 
| +  if (m_Type == None) {
 | 
| +    return FALSE;
 | 
| +  }
 | 
| +  if (m_pFunc == NULL) {
 | 
| +    if (m_pAltCS == NULL) {
 | 
| +      return FALSE;
 | 
|      }
 | 
| -    CFX_FixedBufGrow<FX_FLOAT, 16> results(m_pFunc->CountOutputs());
 | 
| -    int nresults = 0;
 | 
| -    m_pFunc->Call(pBuf, m_nComponents, results, nresults);
 | 
| -    if (nresults == 0) {
 | 
| -        return FALSE;
 | 
| +    int nComps = m_pAltCS->CountComponents();
 | 
| +    CFX_FixedBufGrow<FX_FLOAT, 16> results(nComps);
 | 
| +    for (int i = 0; i < nComps; i++) {
 | 
| +      results[i] = *pBuf;
 | 
|      }
 | 
|      m_pAltCS->GetRGB(results, R, G, B);
 | 
|      return TRUE;
 | 
| -}
 | 
| -void CPDF_DeviceNCS::EnableStdConversion(FX_BOOL bEnabled)
 | 
| -{
 | 
| -    CPDF_ColorSpace::EnableStdConversion(bEnabled);
 | 
| -    if (m_pAltCS) {
 | 
| -        m_pAltCS->EnableStdConversion(bEnabled);
 | 
| -    }
 | 
| -}
 | 
| -CPDF_ColorSpace* CPDF_ColorSpace::GetStockCS(int family)
 | 
| -{
 | 
| -    return CPDF_ModuleMgr::Get()->GetPageModule()->GetStockCS(family);;
 | 
| -}
 | 
| -CPDF_ColorSpace* _CSFromName(const CFX_ByteString& name)
 | 
| -{
 | 
| -    if (name == FX_BSTRC("DeviceRGB") || name == FX_BSTRC("RGB")) {
 | 
| -        return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB);
 | 
| -    }
 | 
| -    if (name == FX_BSTRC("DeviceGray") || name == FX_BSTRC("G")) {
 | 
| -        return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY);
 | 
| -    }
 | 
| -    if (name == FX_BSTRC("DeviceCMYK") || name == FX_BSTRC("CMYK")) {
 | 
| -        return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK);
 | 
| -    }
 | 
| -    if (name == FX_BSTRC("Pattern")) {
 | 
| -        return CPDF_ColorSpace::GetStockCS(PDFCS_PATTERN);
 | 
| -    }
 | 
| +  }
 | 
| +  CFX_FixedBufGrow<FX_FLOAT, 16> results(m_pFunc->CountOutputs());
 | 
| +  int nresults = 0;
 | 
| +  m_pFunc->Call(pBuf, 1, results, nresults);
 | 
| +  if (nresults == 0) {
 | 
| +    return FALSE;
 | 
| +  }
 | 
| +  if (m_pAltCS) {
 | 
| +    m_pAltCS->GetRGB(results, R, G, B);
 | 
| +    return TRUE;
 | 
| +  }
 | 
| +  R = G = B = 0;
 | 
| +  return FALSE;
 | 
| +}
 | 
| +void CPDF_SeparationCS::EnableStdConversion(FX_BOOL bEnabled) {
 | 
| +  CPDF_ColorSpace::EnableStdConversion(bEnabled);
 | 
| +  if (m_pAltCS) {
 | 
| +    m_pAltCS->EnableStdConversion(bEnabled);
 | 
| +  }
 | 
| +}
 | 
| +class CPDF_DeviceNCS : public CPDF_ColorSpace {
 | 
| + public:
 | 
| +  CPDF_DeviceNCS(CPDF_Document* pDoc)
 | 
| +      : CPDF_ColorSpace(pDoc, PDFCS_DEVICEN, 0),
 | 
| +        m_pAltCS(nullptr),
 | 
| +        m_pFunc(nullptr) {}
 | 
| +  ~CPDF_DeviceNCS() override;
 | 
| +  void GetDefaultValue(int iComponent,
 | 
| +                       FX_FLOAT& value,
 | 
| +                       FX_FLOAT& min,
 | 
| +                       FX_FLOAT& max) const override;
 | 
| +  FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) override;
 | 
| +  FX_BOOL GetRGB(FX_FLOAT* pBuf,
 | 
| +                 FX_FLOAT& R,
 | 
| +                 FX_FLOAT& G,
 | 
| +                 FX_FLOAT& B) const override;
 | 
| +  void EnableStdConversion(FX_BOOL bEnabled) override;
 | 
| +
 | 
| +  CPDF_ColorSpace* m_pAltCS;
 | 
| +  CPDF_Function* m_pFunc;
 | 
| +};
 | 
| +CPDF_DeviceNCS::~CPDF_DeviceNCS() {
 | 
| +  delete m_pFunc;
 | 
| +  if (m_pAltCS) {
 | 
| +    m_pAltCS->ReleaseCS();
 | 
| +  }
 | 
| +}
 | 
| +void CPDF_DeviceNCS::GetDefaultValue(int iComponent,
 | 
| +                                     FX_FLOAT& value,
 | 
| +                                     FX_FLOAT& min,
 | 
| +                                     FX_FLOAT& max) const {
 | 
| +  value = 1.0f;
 | 
| +  min = 0;
 | 
| +  max = 1.0f;
 | 
| +}
 | 
| +FX_BOOL CPDF_DeviceNCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) {
 | 
| +  CPDF_Object* pObj = pArray->GetElementValue(1);
 | 
| +  if (!pObj) {
 | 
| +    return FALSE;
 | 
| +  }
 | 
| +  if (pObj->GetType() != PDFOBJ_ARRAY) {
 | 
| +    return FALSE;
 | 
| +  }
 | 
| +  m_nComponents = ((CPDF_Array*)pObj)->GetCount();
 | 
| +  CPDF_Object* pAltCS = pArray->GetElementValue(2);
 | 
| +  if (!pAltCS || pAltCS == m_pArray) {
 | 
| +    return FALSE;
 | 
| +  }
 | 
| +  m_pAltCS = Load(pDoc, pAltCS);
 | 
| +  m_pFunc = CPDF_Function::Load(pArray->GetElementValue(3));
 | 
| +  if (m_pAltCS == NULL || m_pFunc == NULL) {
 | 
| +    return FALSE;
 | 
| +  }
 | 
| +  if (m_pFunc->CountOutputs() < m_pAltCS->CountComponents()) {
 | 
| +    return FALSE;
 | 
| +  }
 | 
| +  return TRUE;
 | 
| +}
 | 
| +FX_BOOL CPDF_DeviceNCS::GetRGB(FX_FLOAT* pBuf,
 | 
| +                               FX_FLOAT& R,
 | 
| +                               FX_FLOAT& G,
 | 
| +                               FX_FLOAT& B) const {
 | 
| +  if (m_pFunc == NULL) {
 | 
| +    return FALSE;
 | 
| +  }
 | 
| +  CFX_FixedBufGrow<FX_FLOAT, 16> results(m_pFunc->CountOutputs());
 | 
| +  int nresults = 0;
 | 
| +  m_pFunc->Call(pBuf, m_nComponents, results, nresults);
 | 
| +  if (nresults == 0) {
 | 
| +    return FALSE;
 | 
| +  }
 | 
| +  m_pAltCS->GetRGB(results, R, G, B);
 | 
| +  return TRUE;
 | 
| +}
 | 
| +void CPDF_DeviceNCS::EnableStdConversion(FX_BOOL bEnabled) {
 | 
| +  CPDF_ColorSpace::EnableStdConversion(bEnabled);
 | 
| +  if (m_pAltCS) {
 | 
| +    m_pAltCS->EnableStdConversion(bEnabled);
 | 
| +  }
 | 
| +}
 | 
| +CPDF_ColorSpace* CPDF_ColorSpace::GetStockCS(int family) {
 | 
| +  return CPDF_ModuleMgr::Get()->GetPageModule()->GetStockCS(family);
 | 
| +  ;
 | 
| +}
 | 
| +CPDF_ColorSpace* _CSFromName(const CFX_ByteString& name) {
 | 
| +  if (name == FX_BSTRC("DeviceRGB") || name == FX_BSTRC("RGB")) {
 | 
| +    return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB);
 | 
| +  }
 | 
| +  if (name == FX_BSTRC("DeviceGray") || name == FX_BSTRC("G")) {
 | 
| +    return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY);
 | 
| +  }
 | 
| +  if (name == FX_BSTRC("DeviceCMYK") || name == FX_BSTRC("CMYK")) {
 | 
| +    return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK);
 | 
| +  }
 | 
| +  if (name == FX_BSTRC("Pattern")) {
 | 
| +    return CPDF_ColorSpace::GetStockCS(PDFCS_PATTERN);
 | 
| +  }
 | 
| +  return NULL;
 | 
| +}
 | 
| +CPDF_ColorSpace* CPDF_ColorSpace::Load(CPDF_Document* pDoc, CPDF_Object* pObj) {
 | 
| +  if (pObj == NULL) {
 | 
|      return NULL;
 | 
| -}
 | 
| -CPDF_ColorSpace* CPDF_ColorSpace::Load(CPDF_Document* pDoc, CPDF_Object* pObj)
 | 
| -{
 | 
| -    if (pObj == NULL) {
 | 
| -        return NULL;
 | 
| -    }
 | 
| -    if (pObj->GetType() == PDFOBJ_NAME) {
 | 
| -        return _CSFromName(pObj->GetString());
 | 
| -    }
 | 
| -    if (pObj->GetType() == PDFOBJ_STREAM) {
 | 
| -        CPDF_Dictionary *pDict = ((CPDF_Stream *)pObj)->GetDict();
 | 
| -        if (!pDict) {
 | 
| -            return NULL;
 | 
| -        }
 | 
| -        CPDF_ColorSpace *pRet = NULL;
 | 
| -        FX_POSITION pos = pDict->GetStartPos();
 | 
| -        while (pos) {
 | 
| -            CFX_ByteString bsKey;
 | 
| -            CPDF_Object *pValue = pDict->GetNextElement(pos, bsKey);
 | 
| -            if (pValue && pValue->GetType() == PDFOBJ_NAME) {
 | 
| -                pRet = _CSFromName(pValue->GetString());
 | 
| -            }
 | 
| -            if (pRet) {
 | 
| -                return pRet;
 | 
| -            }
 | 
| -        }
 | 
| -        return NULL;
 | 
| -    }
 | 
| -    if (pObj->GetType() != PDFOBJ_ARRAY) {
 | 
| -        return NULL;
 | 
| -    }
 | 
| -    CPDF_Array* pArray = (CPDF_Array*)pObj;
 | 
| -    if (pArray->GetCount() == 0) {
 | 
| -        return NULL;
 | 
| -    }
 | 
| -    CPDF_Object *pFamilyObj = pArray->GetElementValue(0);
 | 
| -    if (!pFamilyObj) {
 | 
| -        return NULL;
 | 
| -    }
 | 
| -    CFX_ByteString familyname = pFamilyObj->GetString();
 | 
| -    if (pArray->GetCount() == 1) {
 | 
| -        return _CSFromName(familyname);
 | 
| -    }
 | 
| -    CPDF_ColorSpace* pCS = NULL;
 | 
| -    FX_DWORD id = familyname.GetID();
 | 
| -    if (id == FXBSTR_ID('C', 'a', 'l', 'G')) {
 | 
| -        pCS = new CPDF_CalGray(pDoc);
 | 
| -    } else if (id == FXBSTR_ID('C', 'a', 'l', 'R')) {
 | 
| -        pCS = new CPDF_CalRGB(pDoc);
 | 
| -    } else if (id == FXBSTR_ID('L', 'a', 'b', 0)) {
 | 
| -        pCS = new CPDF_LabCS(pDoc);
 | 
| -    } else if (id == FXBSTR_ID('I', 'C', 'C', 'B')) {
 | 
| -        pCS = new CPDF_ICCBasedCS(pDoc);
 | 
| -    } else if (id == FXBSTR_ID('I', 'n', 'd', 'e') || id == FXBSTR_ID('I', 0, 0, 0)) {
 | 
| -        pCS = new CPDF_IndexedCS(pDoc);
 | 
| -    } else if (id == FXBSTR_ID('S', 'e', 'p', 'a')) {
 | 
| -        pCS = new CPDF_SeparationCS(pDoc);
 | 
| -    } else if (id == FXBSTR_ID('D', 'e', 'v', 'i')) {
 | 
| -        pCS = new CPDF_DeviceNCS(pDoc);
 | 
| -    } else if (id == FXBSTR_ID('P', 'a', 't', 't')) {
 | 
| -        pCS = new CPDF_PatternCS(pDoc);
 | 
| -    } else {
 | 
| -        return NULL;
 | 
| -    }
 | 
| -    pCS->m_pArray = pArray;
 | 
| -    if (!pCS->v_Load(pDoc, pArray)) {
 | 
| -        pCS->ReleaseCS();
 | 
| -        return NULL;
 | 
| -    }
 | 
| -    return pCS;
 | 
| -}
 | 
| -void CPDF_ColorSpace::ReleaseCS()
 | 
| -{
 | 
| -    if (this == GetStockCS(PDFCS_DEVICERGB)) {
 | 
| -        return;
 | 
| -    }
 | 
| -    if (this == GetStockCS(PDFCS_DEVICEGRAY)) {
 | 
| -        return;
 | 
| -    }
 | 
| -    if (this == GetStockCS(PDFCS_DEVICECMYK)) {
 | 
| -        return;
 | 
| -    }
 | 
| -    if (this == GetStockCS(PDFCS_PATTERN)) {
 | 
| -        return;
 | 
| -    }
 | 
| -    delete this;
 | 
| -}
 | 
| -int CPDF_ColorSpace::GetBufSize() const
 | 
| -{
 | 
| -    if (m_Family == PDFCS_PATTERN) {
 | 
| -        return sizeof(PatternValue);
 | 
| -    }
 | 
| -    return m_nComponents * sizeof(FX_FLOAT);
 | 
| -}
 | 
| -FX_FLOAT* CPDF_ColorSpace::CreateBuf()
 | 
| -{
 | 
| -    int size = GetBufSize();
 | 
| -    uint8_t* pBuf = FX_Alloc(uint8_t, size);
 | 
| -    return (FX_FLOAT*)pBuf;
 | 
| -}
 | 
| -FX_BOOL CPDF_ColorSpace::sRGB() const
 | 
| -{
 | 
| -    if (m_Family == PDFCS_DEVICERGB) {
 | 
| -        return TRUE;
 | 
| -    }
 | 
| -    if (m_Family != PDFCS_ICCBASED) {
 | 
| -        return FALSE;
 | 
| -    }
 | 
| -    CPDF_ICCBasedCS* pCS = (CPDF_ICCBasedCS*)this;
 | 
| -    return pCS->m_pProfile->m_bsRGB;
 | 
| -}
 | 
| -FX_BOOL CPDF_ColorSpace::GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const
 | 
| -{
 | 
| -    if (v_GetCMYK(pBuf, c, m, y, k)) {
 | 
| -        return TRUE;
 | 
| -    }
 | 
| -    FX_FLOAT R, G, B;
 | 
| -    if (!GetRGB(pBuf, R, G, B)) {
 | 
| -        return FALSE;
 | 
| +  }
 | 
| +  if (pObj->GetType() == PDFOBJ_NAME) {
 | 
| +    return _CSFromName(pObj->GetString());
 | 
| +  }
 | 
| +  if (pObj->GetType() == PDFOBJ_STREAM) {
 | 
| +    CPDF_Dictionary* pDict = ((CPDF_Stream*)pObj)->GetDict();
 | 
| +    if (!pDict) {
 | 
| +      return NULL;
 | 
| +    }
 | 
| +    CPDF_ColorSpace* pRet = NULL;
 | 
| +    FX_POSITION pos = pDict->GetStartPos();
 | 
| +    while (pos) {
 | 
| +      CFX_ByteString bsKey;
 | 
| +      CPDF_Object* pValue = pDict->GetNextElement(pos, bsKey);
 | 
| +      if (pValue && pValue->GetType() == PDFOBJ_NAME) {
 | 
| +        pRet = _CSFromName(pValue->GetString());
 | 
| +      }
 | 
| +      if (pRet) {
 | 
| +        return pRet;
 | 
| +      }
 | 
|      }
 | 
| -    sRGB_to_AdobeCMYK(R, G, B, c, m, y, k);
 | 
| +    return NULL;
 | 
| +  }
 | 
| +  if (pObj->GetType() != PDFOBJ_ARRAY) {
 | 
| +    return NULL;
 | 
| +  }
 | 
| +  CPDF_Array* pArray = (CPDF_Array*)pObj;
 | 
| +  if (pArray->GetCount() == 0) {
 | 
| +    return NULL;
 | 
| +  }
 | 
| +  CPDF_Object* pFamilyObj = pArray->GetElementValue(0);
 | 
| +  if (!pFamilyObj) {
 | 
| +    return NULL;
 | 
| +  }
 | 
| +  CFX_ByteString familyname = pFamilyObj->GetString();
 | 
| +  if (pArray->GetCount() == 1) {
 | 
| +    return _CSFromName(familyname);
 | 
| +  }
 | 
| +  CPDF_ColorSpace* pCS = NULL;
 | 
| +  FX_DWORD id = familyname.GetID();
 | 
| +  if (id == FXBSTR_ID('C', 'a', 'l', 'G')) {
 | 
| +    pCS = new CPDF_CalGray(pDoc);
 | 
| +  } else if (id == FXBSTR_ID('C', 'a', 'l', 'R')) {
 | 
| +    pCS = new CPDF_CalRGB(pDoc);
 | 
| +  } else if (id == FXBSTR_ID('L', 'a', 'b', 0)) {
 | 
| +    pCS = new CPDF_LabCS(pDoc);
 | 
| +  } else if (id == FXBSTR_ID('I', 'C', 'C', 'B')) {
 | 
| +    pCS = new CPDF_ICCBasedCS(pDoc);
 | 
| +  } else if (id == FXBSTR_ID('I', 'n', 'd', 'e') ||
 | 
| +             id == FXBSTR_ID('I', 0, 0, 0)) {
 | 
| +    pCS = new CPDF_IndexedCS(pDoc);
 | 
| +  } else if (id == FXBSTR_ID('S', 'e', 'p', 'a')) {
 | 
| +    pCS = new CPDF_SeparationCS(pDoc);
 | 
| +  } else if (id == FXBSTR_ID('D', 'e', 'v', 'i')) {
 | 
| +    pCS = new CPDF_DeviceNCS(pDoc);
 | 
| +  } else if (id == FXBSTR_ID('P', 'a', 't', 't')) {
 | 
| +    pCS = new CPDF_PatternCS(pDoc);
 | 
| +  } else {
 | 
| +    return NULL;
 | 
| +  }
 | 
| +  pCS->m_pArray = pArray;
 | 
| +  if (!pCS->v_Load(pDoc, pArray)) {
 | 
| +    pCS->ReleaseCS();
 | 
| +    return NULL;
 | 
| +  }
 | 
| +  return pCS;
 | 
| +}
 | 
| +void CPDF_ColorSpace::ReleaseCS() {
 | 
| +  if (this == GetStockCS(PDFCS_DEVICERGB)) {
 | 
| +    return;
 | 
| +  }
 | 
| +  if (this == GetStockCS(PDFCS_DEVICEGRAY)) {
 | 
| +    return;
 | 
| +  }
 | 
| +  if (this == GetStockCS(PDFCS_DEVICECMYK)) {
 | 
| +    return;
 | 
| +  }
 | 
| +  if (this == GetStockCS(PDFCS_PATTERN)) {
 | 
| +    return;
 | 
| +  }
 | 
| +  delete this;
 | 
| +}
 | 
| +int CPDF_ColorSpace::GetBufSize() const {
 | 
| +  if (m_Family == PDFCS_PATTERN) {
 | 
| +    return sizeof(PatternValue);
 | 
| +  }
 | 
| +  return m_nComponents * sizeof(FX_FLOAT);
 | 
| +}
 | 
| +FX_FLOAT* CPDF_ColorSpace::CreateBuf() {
 | 
| +  int size = GetBufSize();
 | 
| +  uint8_t* pBuf = FX_Alloc(uint8_t, size);
 | 
| +  return (FX_FLOAT*)pBuf;
 | 
| +}
 | 
| +FX_BOOL CPDF_ColorSpace::sRGB() const {
 | 
| +  if (m_Family == PDFCS_DEVICERGB) {
 | 
|      return TRUE;
 | 
| -}
 | 
| -FX_BOOL CPDF_ColorSpace::SetCMYK(FX_FLOAT* pBuf, FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k) const
 | 
| -{
 | 
| -    if (v_SetCMYK(pBuf, c, m, y, k)) {
 | 
| -        return TRUE;
 | 
| -    }
 | 
| -    FX_FLOAT R, G, B;
 | 
| -    AdobeCMYK_to_sRGB(c, m, y, k, R, G, B);
 | 
| -    return SetRGB(pBuf, R, G, B);
 | 
| -}
 | 
| -void CPDF_ColorSpace::GetDefaultColor(FX_FLOAT* buf) const
 | 
| -{
 | 
| -    if (buf == NULL || m_Family == PDFCS_PATTERN) {
 | 
| -        return;
 | 
| -    }
 | 
| -    FX_FLOAT min, max;
 | 
| -    for (int i = 0; i < m_nComponents; i ++) {
 | 
| -        GetDefaultValue(i, buf[i], min, max);
 | 
| -    }
 | 
| -}
 | 
| -int CPDF_ColorSpace::GetMaxIndex() const
 | 
| -{
 | 
| -    if (m_Family != PDFCS_INDEXED) {
 | 
| -        return 0;
 | 
| -    }
 | 
| -    CPDF_IndexedCS* pCS = (CPDF_IndexedCS*)this;
 | 
| -    return pCS->m_MaxIndex;
 | 
| -}
 | 
| -void CPDF_ColorSpace::TranslateImageLine(uint8_t* dest_buf, const uint8_t* src_buf, int pixels, int image_width, int image_height, FX_BOOL bTransMask) const
 | 
| -{
 | 
| -    CFX_FixedBufGrow<FX_FLOAT, 16> srcbuf(m_nComponents);
 | 
| -    FX_FLOAT* src = srcbuf;
 | 
| -    FX_FLOAT R, G, B;
 | 
| -    for (int i = 0; i < pixels; i ++) {
 | 
| -        for (int j = 0; j < m_nComponents; j ++)
 | 
| -            if (m_Family == PDFCS_INDEXED) {
 | 
| -                src[j] = (FX_FLOAT)(*src_buf ++);
 | 
| -            } else {
 | 
| -                src[j] = (FX_FLOAT)(*src_buf ++) / 255;
 | 
| -            }
 | 
| -        GetRGB(src, R, G, B);
 | 
| -        *dest_buf ++ = (int32_t)(B * 255);
 | 
| -        *dest_buf ++ = (int32_t)(G * 255);
 | 
| -        *dest_buf ++ = (int32_t)(R * 255);
 | 
| -    }
 | 
| -}
 | 
| -void CPDF_ColorSpace::EnableStdConversion(FX_BOOL bEnabled)
 | 
| -{
 | 
| -    if (bEnabled) {
 | 
| -        m_dwStdConversion ++;
 | 
| -    } else if (m_dwStdConversion) {
 | 
| -        m_dwStdConversion --;
 | 
| -    }
 | 
| -}
 | 
| -CPDF_Color::CPDF_Color(int family)
 | 
| -{
 | 
| -    m_pCS = CPDF_ColorSpace::GetStockCS(family);
 | 
| -    int nComps = 3;
 | 
| -    if (family == PDFCS_DEVICEGRAY) {
 | 
| -        nComps = 1;
 | 
| -    } else if (family == PDFCS_DEVICECMYK) {
 | 
| -        nComps = 4;
 | 
| -    }
 | 
| -    m_pBuffer = FX_Alloc(FX_FLOAT, nComps);
 | 
| -    for (int i = 0; i < nComps; i ++) {
 | 
| -        m_pBuffer[i] = 0;
 | 
| -    }
 | 
| -}
 | 
| -CPDF_Color::~CPDF_Color()
 | 
| -{
 | 
| -    ReleaseBuffer();
 | 
| -    ReleaseColorSpace();
 | 
| -}
 | 
| -void CPDF_Color::ReleaseBuffer()
 | 
| -{
 | 
| -    if (!m_pBuffer) {
 | 
| -        return;
 | 
| -    }
 | 
| -    if (m_pCS->GetFamily() == PDFCS_PATTERN) {
 | 
| -        PatternValue* pvalue = (PatternValue*)m_pBuffer;
 | 
| -        CPDF_Pattern* pPattern = pvalue->m_pCountedPattern ? pvalue->m_pCountedPattern->get() : NULL;
 | 
| -        if (pPattern && pPattern->m_pDocument) {
 | 
| -            CPDF_DocPageData *pPageData = pPattern->m_pDocument->GetPageData();
 | 
| -            if (pPageData) {
 | 
| -                pPageData->ReleasePattern(pPattern->m_pPatternObj);
 | 
| -            }
 | 
| -        }
 | 
| -    }
 | 
| -    FX_Free(m_pBuffer);
 | 
| -    m_pBuffer = NULL;
 | 
| -}
 | 
| -void CPDF_Color::ReleaseColorSpace()
 | 
| -{
 | 
| -    if (m_pCS && m_pCS->m_pDocument && m_pCS->GetArray()) {
 | 
| -        m_pCS->m_pDocument->GetPageData()->ReleaseColorSpace(m_pCS->GetArray());
 | 
| -        m_pCS = NULL;
 | 
| -    }
 | 
| -}
 | 
| -void CPDF_Color::SetColorSpace(CPDF_ColorSpace* pCS)
 | 
| -{
 | 
| -    if (m_pCS == pCS) {
 | 
| -        if (m_pBuffer == NULL) {
 | 
| -            m_pBuffer = pCS->CreateBuf();
 | 
| -        }
 | 
| -        ReleaseColorSpace();
 | 
| -        m_pCS = pCS;
 | 
| -        return;
 | 
| +  }
 | 
| +  if (m_Family != PDFCS_ICCBASED) {
 | 
| +    return FALSE;
 | 
| +  }
 | 
| +  CPDF_ICCBasedCS* pCS = (CPDF_ICCBasedCS*)this;
 | 
| +  return pCS->m_pProfile->m_bsRGB;
 | 
| +}
 | 
| +FX_BOOL CPDF_ColorSpace::GetCMYK(FX_FLOAT* pBuf,
 | 
| +                                 FX_FLOAT& c,
 | 
| +                                 FX_FLOAT& m,
 | 
| +                                 FX_FLOAT& y,
 | 
| +                                 FX_FLOAT& k) const {
 | 
| +  if (v_GetCMYK(pBuf, c, m, y, k)) {
 | 
| +    return TRUE;
 | 
| +  }
 | 
| +  FX_FLOAT R, G, B;
 | 
| +  if (!GetRGB(pBuf, R, G, B)) {
 | 
| +    return FALSE;
 | 
| +  }
 | 
| +  sRGB_to_AdobeCMYK(R, G, B, c, m, y, k);
 | 
| +  return TRUE;
 | 
| +}
 | 
| +FX_BOOL CPDF_ColorSpace::SetCMYK(FX_FLOAT* pBuf,
 | 
| +                                 FX_FLOAT c,
 | 
| +                                 FX_FLOAT m,
 | 
| +                                 FX_FLOAT y,
 | 
| +                                 FX_FLOAT k) const {
 | 
| +  if (v_SetCMYK(pBuf, c, m, y, k)) {
 | 
| +    return TRUE;
 | 
| +  }
 | 
| +  FX_FLOAT R, G, B;
 | 
| +  AdobeCMYK_to_sRGB(c, m, y, k, R, G, B);
 | 
| +  return SetRGB(pBuf, R, G, B);
 | 
| +}
 | 
| +void CPDF_ColorSpace::GetDefaultColor(FX_FLOAT* buf) const {
 | 
| +  if (buf == NULL || m_Family == PDFCS_PATTERN) {
 | 
| +    return;
 | 
| +  }
 | 
| +  FX_FLOAT min, max;
 | 
| +  for (int i = 0; i < m_nComponents; i++) {
 | 
| +    GetDefaultValue(i, buf[i], min, max);
 | 
| +  }
 | 
| +}
 | 
| +int CPDF_ColorSpace::GetMaxIndex() const {
 | 
| +  if (m_Family != PDFCS_INDEXED) {
 | 
| +    return 0;
 | 
| +  }
 | 
| +  CPDF_IndexedCS* pCS = (CPDF_IndexedCS*)this;
 | 
| +  return pCS->m_MaxIndex;
 | 
| +}
 | 
| +void CPDF_ColorSpace::TranslateImageLine(uint8_t* dest_buf,
 | 
| +                                         const uint8_t* src_buf,
 | 
| +                                         int pixels,
 | 
| +                                         int image_width,
 | 
| +                                         int image_height,
 | 
| +                                         FX_BOOL bTransMask) const {
 | 
| +  CFX_FixedBufGrow<FX_FLOAT, 16> srcbuf(m_nComponents);
 | 
| +  FX_FLOAT* src = srcbuf;
 | 
| +  FX_FLOAT R, G, B;
 | 
| +  for (int i = 0; i < pixels; i++) {
 | 
| +    for (int j = 0; j < m_nComponents; j++)
 | 
| +      if (m_Family == PDFCS_INDEXED) {
 | 
| +        src[j] = (FX_FLOAT)(*src_buf++);
 | 
| +      } else {
 | 
| +        src[j] = (FX_FLOAT)(*src_buf++) / 255;
 | 
| +      }
 | 
| +    GetRGB(src, R, G, B);
 | 
| +    *dest_buf++ = (int32_t)(B * 255);
 | 
| +    *dest_buf++ = (int32_t)(G * 255);
 | 
| +    *dest_buf++ = (int32_t)(R * 255);
 | 
| +  }
 | 
| +}
 | 
| +void CPDF_ColorSpace::EnableStdConversion(FX_BOOL bEnabled) {
 | 
| +  if (bEnabled) {
 | 
| +    m_dwStdConversion++;
 | 
| +  } else if (m_dwStdConversion) {
 | 
| +    m_dwStdConversion--;
 | 
| +  }
 | 
| +}
 | 
| +CPDF_Color::CPDF_Color(int family) {
 | 
| +  m_pCS = CPDF_ColorSpace::GetStockCS(family);
 | 
| +  int nComps = 3;
 | 
| +  if (family == PDFCS_DEVICEGRAY) {
 | 
| +    nComps = 1;
 | 
| +  } else if (family == PDFCS_DEVICECMYK) {
 | 
| +    nComps = 4;
 | 
| +  }
 | 
| +  m_pBuffer = FX_Alloc(FX_FLOAT, nComps);
 | 
| +  for (int i = 0; i < nComps; i++) {
 | 
| +    m_pBuffer[i] = 0;
 | 
| +  }
 | 
| +}
 | 
| +CPDF_Color::~CPDF_Color() {
 | 
| +  ReleaseBuffer();
 | 
| +  ReleaseColorSpace();
 | 
| +}
 | 
| +void CPDF_Color::ReleaseBuffer() {
 | 
| +  if (!m_pBuffer) {
 | 
| +    return;
 | 
| +  }
 | 
| +  if (m_pCS->GetFamily() == PDFCS_PATTERN) {
 | 
| +    PatternValue* pvalue = (PatternValue*)m_pBuffer;
 | 
| +    CPDF_Pattern* pPattern =
 | 
| +        pvalue->m_pCountedPattern ? pvalue->m_pCountedPattern->get() : NULL;
 | 
| +    if (pPattern && pPattern->m_pDocument) {
 | 
| +      CPDF_DocPageData* pPageData = pPattern->m_pDocument->GetPageData();
 | 
| +      if (pPageData) {
 | 
| +        pPageData->ReleasePattern(pPattern->m_pPatternObj);
 | 
| +      }
 | 
| +    }
 | 
| +  }
 | 
| +  FX_Free(m_pBuffer);
 | 
| +  m_pBuffer = NULL;
 | 
| +}
 | 
| +void CPDF_Color::ReleaseColorSpace() {
 | 
| +  if (m_pCS && m_pCS->m_pDocument && m_pCS->GetArray()) {
 | 
| +    m_pCS->m_pDocument->GetPageData()->ReleaseColorSpace(m_pCS->GetArray());
 | 
| +    m_pCS = NULL;
 | 
| +  }
 | 
| +}
 | 
| +void CPDF_Color::SetColorSpace(CPDF_ColorSpace* pCS) {
 | 
| +  if (m_pCS == pCS) {
 | 
| +    if (m_pBuffer == NULL) {
 | 
| +      m_pBuffer = pCS->CreateBuf();
 | 
|      }
 | 
| -    ReleaseBuffer();
 | 
|      ReleaseColorSpace();
 | 
|      m_pCS = pCS;
 | 
| -    if (m_pCS) {
 | 
| -        m_pBuffer = pCS->CreateBuf();
 | 
| -        pCS->GetDefaultColor(m_pBuffer);
 | 
| -    }
 | 
| -}
 | 
| -void CPDF_Color::SetValue(FX_FLOAT* comps)
 | 
| -{
 | 
| -    if (m_pBuffer == NULL) {
 | 
| -        return;
 | 
| -    }
 | 
| -    if (m_pCS->GetFamily() != PDFCS_PATTERN) {
 | 
| -        FXSYS_memcpy(m_pBuffer, comps, m_pCS->CountComponents() * sizeof(FX_FLOAT));
 | 
| -    }
 | 
| -}
 | 
| -void CPDF_Color::SetValue(CPDF_Pattern* pPattern, FX_FLOAT* comps, int ncomps)
 | 
| -{
 | 
| -    if (ncomps > MAX_PATTERN_COLORCOMPS) {
 | 
| -        return;
 | 
| -    }
 | 
| -    if (m_pCS == NULL || m_pCS->GetFamily() != PDFCS_PATTERN) {
 | 
| -        if (m_pBuffer) {
 | 
| -            FX_Free(m_pBuffer);
 | 
| -        }
 | 
| -        m_pCS = CPDF_ColorSpace::GetStockCS(PDFCS_PATTERN);
 | 
| -        m_pBuffer = m_pCS->CreateBuf();
 | 
| -    }
 | 
| -    CPDF_DocPageData *pDocPageData = NULL;
 | 
| +    return;
 | 
| +  }
 | 
| +  ReleaseBuffer();
 | 
| +  ReleaseColorSpace();
 | 
| +  m_pCS = pCS;
 | 
| +  if (m_pCS) {
 | 
| +    m_pBuffer = pCS->CreateBuf();
 | 
| +    pCS->GetDefaultColor(m_pBuffer);
 | 
| +  }
 | 
| +}
 | 
| +void CPDF_Color::SetValue(FX_FLOAT* comps) {
 | 
| +  if (m_pBuffer == NULL) {
 | 
| +    return;
 | 
| +  }
 | 
| +  if (m_pCS->GetFamily() != PDFCS_PATTERN) {
 | 
| +    FXSYS_memcpy(m_pBuffer, comps, m_pCS->CountComponents() * sizeof(FX_FLOAT));
 | 
| +  }
 | 
| +}
 | 
| +void CPDF_Color::SetValue(CPDF_Pattern* pPattern, FX_FLOAT* comps, int ncomps) {
 | 
| +  if (ncomps > MAX_PATTERN_COLORCOMPS) {
 | 
| +    return;
 | 
| +  }
 | 
| +  if (m_pCS == NULL || m_pCS->GetFamily() != PDFCS_PATTERN) {
 | 
| +    if (m_pBuffer) {
 | 
| +      FX_Free(m_pBuffer);
 | 
| +    }
 | 
| +    m_pCS = CPDF_ColorSpace::GetStockCS(PDFCS_PATTERN);
 | 
| +    m_pBuffer = m_pCS->CreateBuf();
 | 
| +  }
 | 
| +  CPDF_DocPageData* pDocPageData = NULL;
 | 
| +  PatternValue* pvalue = (PatternValue*)m_pBuffer;
 | 
| +  if (pvalue->m_pPattern && pvalue->m_pPattern->m_pDocument) {
 | 
| +    pDocPageData = pvalue->m_pPattern->m_pDocument->GetPageData();
 | 
| +    if (pDocPageData) {
 | 
| +      pDocPageData->ReleasePattern(pvalue->m_pPattern->m_pPatternObj);
 | 
| +    }
 | 
| +  }
 | 
| +  pvalue->m_nComps = ncomps;
 | 
| +  pvalue->m_pPattern = pPattern;
 | 
| +  if (ncomps) {
 | 
| +    FXSYS_memcpy(pvalue->m_Comps, comps, ncomps * sizeof(FX_FLOAT));
 | 
| +  }
 | 
| +  pvalue->m_pCountedPattern = NULL;
 | 
| +  if (pPattern && pPattern->m_pDocument) {
 | 
| +    if (!pDocPageData) {
 | 
| +      pDocPageData = pPattern->m_pDocument->GetPageData();
 | 
| +    }
 | 
| +    pvalue->m_pCountedPattern =
 | 
| +        pDocPageData->FindPatternPtr(pPattern->m_pPatternObj);
 | 
| +  }
 | 
| +}
 | 
| +void CPDF_Color::Copy(const CPDF_Color* pSrc) {
 | 
| +  ReleaseBuffer();
 | 
| +  ReleaseColorSpace();
 | 
| +  m_pCS = pSrc->m_pCS;
 | 
| +  if (m_pCS && m_pCS->m_pDocument) {
 | 
| +    CPDF_Array* pArray = m_pCS->GetArray();
 | 
| +    if (pArray) {
 | 
| +      m_pCS = m_pCS->m_pDocument->GetPageData()->GetCopiedColorSpace(pArray);
 | 
| +    }
 | 
| +  }
 | 
| +  if (m_pCS == NULL) {
 | 
| +    return;
 | 
| +  }
 | 
| +  m_pBuffer = m_pCS->CreateBuf();
 | 
| +  FXSYS_memcpy(m_pBuffer, pSrc->m_pBuffer, m_pCS->GetBufSize());
 | 
| +  if (m_pCS->GetFamily() == PDFCS_PATTERN) {
 | 
|      PatternValue* pvalue = (PatternValue*)m_pBuffer;
 | 
|      if (pvalue->m_pPattern && pvalue->m_pPattern->m_pDocument) {
 | 
| -        pDocPageData = pvalue->m_pPattern->m_pDocument->GetPageData();
 | 
| -        if (pDocPageData) {
 | 
| -            pDocPageData->ReleasePattern(pvalue->m_pPattern->m_pPatternObj);
 | 
| -        }
 | 
| -    }
 | 
| -    pvalue->m_nComps = ncomps;
 | 
| -    pvalue->m_pPattern = pPattern;
 | 
| -    if (ncomps) {
 | 
| -        FXSYS_memcpy(pvalue->m_Comps, comps, ncomps * sizeof(FX_FLOAT));
 | 
| -    }
 | 
| -    pvalue->m_pCountedPattern = NULL;
 | 
| -    if (pPattern && pPattern->m_pDocument)
 | 
| -    {
 | 
| -        if (!pDocPageData) {
 | 
| -            pDocPageData = pPattern->m_pDocument->GetPageData();
 | 
| -        }
 | 
| -        pvalue->m_pCountedPattern = pDocPageData->FindPatternPtr(pPattern->m_pPatternObj);
 | 
| -    }
 | 
| -}
 | 
| -void CPDF_Color::Copy(const CPDF_Color* pSrc)
 | 
| -{
 | 
| -    ReleaseBuffer();
 | 
| -    ReleaseColorSpace();
 | 
| -    m_pCS = pSrc->m_pCS;
 | 
| -    if (m_pCS && m_pCS->m_pDocument) {
 | 
| -        CPDF_Array* pArray = m_pCS->GetArray();
 | 
| -        if (pArray) {
 | 
| -            m_pCS = m_pCS->m_pDocument->GetPageData()->GetCopiedColorSpace(pArray);
 | 
| -        }
 | 
| -    }
 | 
| -    if (m_pCS == NULL) {
 | 
| -        return;
 | 
| -    }
 | 
| -    m_pBuffer = m_pCS->CreateBuf();
 | 
| -    FXSYS_memcpy(m_pBuffer, pSrc->m_pBuffer, m_pCS->GetBufSize());
 | 
| -    if (m_pCS->GetFamily() == PDFCS_PATTERN) {
 | 
| -        PatternValue* pvalue = (PatternValue*)m_pBuffer;
 | 
| -        if (pvalue->m_pPattern && pvalue->m_pPattern->m_pDocument) {
 | 
| -            pvalue->m_pPattern = pvalue->m_pPattern->m_pDocument->GetPageData()->GetPattern(pvalue->m_pPattern->m_pPatternObj, FALSE, &pvalue->m_pPattern->m_ParentMatrix);
 | 
| -        }
 | 
| +      pvalue->m_pPattern =
 | 
| +          pvalue->m_pPattern->m_pDocument->GetPageData()->GetPattern(
 | 
| +              pvalue->m_pPattern->m_pPatternObj, FALSE,
 | 
| +              &pvalue->m_pPattern->m_ParentMatrix);
 | 
|      }
 | 
| +  }
 | 
|  }
 | 
| -FX_BOOL CPDF_Color::GetRGB(int& R, int& G, int& B) const
 | 
| -{
 | 
| -    if (m_pCS == NULL || m_pBuffer == NULL) {
 | 
| -        return FALSE;
 | 
| -    }
 | 
| -    FX_FLOAT r=0.0f, g=0.0f, b=0.0f;
 | 
| -    if (!m_pCS->GetRGB(m_pBuffer, r, g, b)) {
 | 
| -        return FALSE;
 | 
| -    }
 | 
| -    R = (int32_t)(r * 255 + 0.5f);
 | 
| -    G = (int32_t)(g * 255 + 0.5f);
 | 
| -    B = (int32_t)(b * 255 + 0.5f);
 | 
| -    return TRUE;
 | 
| -}
 | 
| -CPDF_Pattern* CPDF_Color::GetPattern() const
 | 
| -{
 | 
| -    if (m_pBuffer == NULL || m_pCS->GetFamily() != PDFCS_PATTERN) {
 | 
| -        return NULL;
 | 
| -    }
 | 
| -    PatternValue* pvalue = (PatternValue*)m_pBuffer;
 | 
| -    return pvalue->m_pPattern;
 | 
| +FX_BOOL CPDF_Color::GetRGB(int& R, int& G, int& B) const {
 | 
| +  if (m_pCS == NULL || m_pBuffer == NULL) {
 | 
| +    return FALSE;
 | 
| +  }
 | 
| +  FX_FLOAT r = 0.0f, g = 0.0f, b = 0.0f;
 | 
| +  if (!m_pCS->GetRGB(m_pBuffer, r, g, b)) {
 | 
| +    return FALSE;
 | 
| +  }
 | 
| +  R = (int32_t)(r * 255 + 0.5f);
 | 
| +  G = (int32_t)(g * 255 + 0.5f);
 | 
| +  B = (int32_t)(b * 255 + 0.5f);
 | 
| +  return TRUE;
 | 
| +}
 | 
| +CPDF_Pattern* CPDF_Color::GetPattern() const {
 | 
| +  if (m_pBuffer == NULL || m_pCS->GetFamily() != PDFCS_PATTERN) {
 | 
| +    return NULL;
 | 
| +  }
 | 
| +  PatternValue* pvalue = (PatternValue*)m_pBuffer;
 | 
| +  return pvalue->m_pPattern;
 | 
|  }
 | 
| -CPDF_ColorSpace* CPDF_Color::GetPatternCS() const
 | 
| -{
 | 
| -    if (m_pBuffer == NULL || m_pCS->GetFamily() != PDFCS_PATTERN) {
 | 
| -        return NULL;
 | 
| -    }
 | 
| -    return m_pCS->GetBaseCS();
 | 
| +CPDF_ColorSpace* CPDF_Color::GetPatternCS() const {
 | 
| +  if (m_pBuffer == NULL || m_pCS->GetFamily() != PDFCS_PATTERN) {
 | 
| +    return NULL;
 | 
| +  }
 | 
| +  return m_pCS->GetBaseCS();
 | 
|  }
 | 
| -FX_FLOAT* CPDF_Color::GetPatternColor() const
 | 
| -{
 | 
| -    if (m_pBuffer == NULL || m_pCS->GetFamily() != PDFCS_PATTERN) {
 | 
| -        return NULL;
 | 
| -    }
 | 
| -    PatternValue* pvalue = (PatternValue*)m_pBuffer;
 | 
| -    return pvalue->m_nComps ? pvalue->m_Comps : NULL;
 | 
| +FX_FLOAT* CPDF_Color::GetPatternColor() const {
 | 
| +  if (m_pBuffer == NULL || m_pCS->GetFamily() != PDFCS_PATTERN) {
 | 
| +    return NULL;
 | 
| +  }
 | 
| +  PatternValue* pvalue = (PatternValue*)m_pBuffer;
 | 
| +  return pvalue->m_nComps ? pvalue->m_Comps : NULL;
 | 
|  }
 | 
| -FX_BOOL CPDF_Color::IsEqual(const CPDF_Color& other) const
 | 
| -{
 | 
| -    if (m_pCS != other.m_pCS || m_pCS == NULL) {
 | 
| -        return FALSE;
 | 
| -    }
 | 
| -    return FXSYS_memcmp(m_pBuffer, other.m_pBuffer, m_pCS->GetBufSize()) == 0;
 | 
| +FX_BOOL CPDF_Color::IsEqual(const CPDF_Color& other) const {
 | 
| +  if (m_pCS != other.m_pCS || m_pCS == NULL) {
 | 
| +    return FALSE;
 | 
| +  }
 | 
| +  return FXSYS_memcmp(m_pBuffer, other.m_pBuffer, m_pCS->GetBufSize()) == 0;
 | 
|  }
 | 
| 
 |