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; } } 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]; } } } else if (m_pAlterCS) { m_pAlterCS->TranslateImageLine(pDestBuf, pSrcBuf, pixels, image_width, image_height); } }
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); }
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; } } }