summaryrefslogtreecommitdiff
path: root/core/src/fpdfapi
diff options
context:
space:
mode:
authorBo Xu <bo_xu@foxitsoftware.com>2014-09-03 13:30:43 -0700
committerBo Xu <bo_xu@foxitsoftware.com>2014-09-03 13:30:43 -0700
commitbb3c1a29348511afdc140cccdf5b1f5d0292794c (patch)
tree6af3eb03b3928e9bb12033ad9a87565ce81bd7d9 /core/src/fpdfapi
parent5f8a503b2a8701c5c4f6e0aadf334affcdd03d28 (diff)
downloadpdfium-bb3c1a29348511afdc140cccdf5b1f5d0292794c.tar.xz
Allocate m_pCompData when |m_nComponents| is updated.
When |m_nComponents| is changed from loading stream information, previously allocated memory that depends on |m_nComponents| needes to be freed and allocated again to enforce memory size consistency. BUG=409695 R=tsepez@chromium.org Review URL: https://codereview.chromium.org/528163002
Diffstat (limited to 'core/src/fpdfapi')
-rw-r--r--core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp60
-rw-r--r--core/src/fpdfapi/fpdf_render/render_int.h1
2 files changed, 38 insertions, 23 deletions
diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp
index 50041399e5..d2910dc1ab 100644
--- a/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp
+++ b/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp
@@ -496,55 +496,63 @@ FX_BOOL CPDF_DIBSource::LoadColorInfo(CPDF_Dictionary* pFormResources, CPDF_Dict
}
}
ValidateDictParam();
- m_pCompData = FX_Alloc(DIB_COMP_DATA, m_nComponents);
- if (m_bpc == 0) {
- return TRUE;
+ m_pCompData = GetDecodeAndMaskArray(m_bDefaultDecode, m_bColorKey);
+ if (m_pCompData == NULL) {
+ return FALSE;
+ }
+ return TRUE;
+}
+DIB_COMP_DATA* CPDF_DIBSource::GetDecodeAndMaskArray(FX_BOOL& bDefaultDecode, FX_BOOL& bColorKey)
+{
+ DIB_COMP_DATA* pCompData = FX_Alloc(DIB_COMP_DATA, m_nComponents);
+ if (pCompData == NULL) {
+ return NULL;
}
int max_data = (1 << m_bpc) - 1;
CPDF_Array* pDecode = m_pDict->GetArray(FX_BSTRC("Decode"));
if (pDecode) {
for (FX_DWORD i = 0; i < m_nComponents; i ++) {
- m_pCompData[i].m_DecodeMin = pDecode->GetNumber(i * 2);
+ pCompData[i].m_DecodeMin = pDecode->GetNumber(i * 2);
FX_FLOAT max = pDecode->GetNumber(i * 2 + 1);
- m_pCompData[i].m_DecodeStep = (max - m_pCompData[i].m_DecodeMin) / max_data;
+ pCompData[i].m_DecodeStep = (max - pCompData[i].m_DecodeMin) / max_data;
FX_FLOAT def_value, def_min, def_max;
m_pColorSpace->GetDefaultValue(i, def_value, def_min, def_max);
if (m_Family == PDFCS_INDEXED) {
def_max = (FX_FLOAT)max_data;
}
- if (def_min != m_pCompData[i].m_DecodeMin || def_max != max) {
- m_bDefaultDecode = FALSE;
+ if (def_min != pCompData[i].m_DecodeMin || def_max != max) {
+ bDefaultDecode = FALSE;
}
}
} else {
for (FX_DWORD i = 0; i < m_nComponents; i ++) {
FX_FLOAT def_value;
- m_pColorSpace->GetDefaultValue(i, def_value, m_pCompData[i].m_DecodeMin, m_pCompData[i].m_DecodeStep);
+ m_pColorSpace->GetDefaultValue(i, def_value, pCompData[i].m_DecodeMin, pCompData[i].m_DecodeStep);
if (m_Family == PDFCS_INDEXED) {
- m_pCompData[i].m_DecodeStep = (FX_FLOAT)max_data;
+ pCompData[i].m_DecodeStep = (FX_FLOAT)max_data;
}
- m_pCompData[i].m_DecodeStep = (m_pCompData[i].m_DecodeStep - m_pCompData[i].m_DecodeMin) / max_data;
+ pCompData[i].m_DecodeStep = (pCompData[i].m_DecodeStep - pCompData[i].m_DecodeMin) / max_data;
}
}
if (!m_pDict->KeyExist(FX_BSTRC("SMask"))) {
CPDF_Object* pMask = m_pDict->GetElementValue(FX_BSTRC("Mask"));
if (pMask == NULL) {
- return TRUE;
+ return pCompData;
}
if (pMask->GetType() == PDFOBJ_ARRAY) {
CPDF_Array* pArray = (CPDF_Array*)pMask;
- if (pArray->GetCount() >= m_nComponents * 2)
- for (FX_DWORD i = 0; i < m_nComponents * 2; i ++) {
- if (i % 2) {
- m_pCompData[i / 2].m_ColorKeyMax = pArray->GetInteger(i);
- } else {
- m_pCompData[i / 2].m_ColorKeyMin = pArray->GetInteger(i);
- }
+ if (pArray->GetCount() >= m_nComponents * 2) {
+ for (FX_DWORD i = 0; i < m_nComponents; i++) {
+ int min_num = pArray->GetInteger(i * 2);
+ int max_num = pArray->GetInteger(i * 2 + 1);
+ pCompData[i].m_ColorKeyMin = FX_MAX(min_num, 0);
+ pCompData[i].m_ColorKeyMax = FX_MIN(max_num, max_data);
}
- m_bColorKey = TRUE;
+ }
+ bColorKey = TRUE;
}
}
- return TRUE;
+ return pCompData;
}
ICodec_ScanlineDecoder* FPDFAPI_CreateFaxDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
const CPDF_Dictionary* pParams);
@@ -572,7 +580,14 @@ int CPDF_DIBSource::CreateDecoder()
int comps, bpc;
ICodec_JpegModule* pJpegModule = CPDF_ModuleMgr::Get()->GetJpegModule();
if (pJpegModule->LoadInfo(src_data, src_size, m_Width, m_Height, comps, bpc, bTransform)) {
- m_nComponents = comps;
+ if (m_nComponents != comps) {
+ FX_Free(m_pCompData);
+ m_nComponents = comps;
+ m_pCompData = GetDecodeAndMaskArray(m_bDefaultDecode, m_bColorKey);
+ if (m_pCompData == NULL) {
+ return 0;
+ }
+ }
m_bpc = bpc;
m_pDecoder = CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecoder(src_data, src_size, m_Width, m_Height,
m_nComponents, bTransform);
@@ -1159,8 +1174,7 @@ FX_LPCBYTE CPDF_DIBSource::GetScanline(int line) const
FX_LPBYTE alpha_channel = m_pMaskedLine + 3;
for (int col = 0; col < m_Width; col ++) {
FX_LPCBYTE pPixel = pSrcLine + col * 3;
- alpha_channel[col * 4] = (pPixel[0] < m_pCompData[0].m_ColorKeyMin ||
- pPixel[0] > m_pCompData[0].m_ColorKeyMax ||
+ alpha_channel[col * 4] = (pPixel[0] < m_pCompData[0].m_ColorKeyMin || pPixel[0] > m_pCompData[0].m_ColorKeyMax ||
pPixel[1] < m_pCompData[1].m_ColorKeyMin || pPixel[1] > m_pCompData[1].m_ColorKeyMax ||
pPixel[2] < m_pCompData[2].m_ColorKeyMin || pPixel[2] > m_pCompData[2].m_ColorKeyMax) ? 0xff : 0;
}
diff --git a/core/src/fpdfapi/fpdf_render/render_int.h b/core/src/fpdfapi/fpdf_render/render_int.h
index 8fb4aca1c5..f9a04a99a4 100644
--- a/core/src/fpdfapi/fpdf_render/render_int.h
+++ b/core/src/fpdfapi/fpdf_render/render_int.h
@@ -412,6 +412,7 @@ public:
FX_BOOL m_bHasMask;
protected:
FX_BOOL LoadColorInfo(CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources);
+ DIB_COMP_DATA* GetDecodeAndMaskArray(FX_BOOL& bDefaultDecode, FX_BOOL& bColorKey);
CPDF_DIBSource* LoadMask(FX_DWORD& MatteColor);
CPDF_DIBSource* LoadMaskDIB(CPDF_Stream* pMask);
void LoadJpxBitmap();