OLD | NEW |
1 // Copyright 2016 PDFium Authors. All rights reserved. | 1 // Copyright 2016 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "core/fpdfapi/page/cpdf_image.h" | 7 #include "core/fpdfapi/page/cpdf_image.h" |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <memory> | 10 #include <memory> |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
108 } | 108 } |
109 pDict->SetNameFor("ColorSpace", csname); | 109 pDict->SetNameFor("ColorSpace", csname); |
110 pDict->SetIntegerFor("BitsPerComponent", bits); | 110 pDict->SetIntegerFor("BitsPerComponent", bits); |
111 pDict->SetNameFor("Filter", "DCTDecode"); | 111 pDict->SetNameFor("Filter", "DCTDecode"); |
112 if (!color_trans) { | 112 if (!color_trans) { |
113 CPDF_Dictionary* pParms = | 113 CPDF_Dictionary* pParms = |
114 new CPDF_Dictionary(m_pDocument->GetByteStringPool()); | 114 new CPDF_Dictionary(m_pDocument->GetByteStringPool()); |
115 pDict->SetFor("DecodeParms", pParms); | 115 pDict->SetFor("DecodeParms", pParms); |
116 pParms->SetIntegerFor("ColorTransform", 0); | 116 pParms->SetIntegerFor("ColorTransform", 0); |
117 } | 117 } |
118 m_bIsMask = FALSE; | 118 m_bIsMask = false; |
119 m_Width = width; | 119 m_Width = width; |
120 m_Height = height; | 120 m_Height = height; |
121 if (!m_pStream) | 121 if (!m_pStream) |
122 m_pStream = new CPDF_Stream; | 122 m_pStream = new CPDF_Stream; |
123 return pDict; | 123 return pDict; |
124 } | 124 } |
125 | 125 |
126 void CPDF_Image::SetJpegImage(IFX_SeekableReadStream* pFile) { | 126 void CPDF_Image::SetJpegImage(IFX_SeekableReadStream* pFile) { |
127 uint32_t size = (uint32_t)pFile->GetSize(); | 127 uint32_t size = (uint32_t)pFile->GetSize(); |
128 if (!size) | 128 if (!size) |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
163 FX_STRSIZE dest_pitch = 0, dest_size = 0, opType = -1; | 163 FX_STRSIZE dest_pitch = 0, dest_size = 0, opType = -1; |
164 if (bpp == 1) { | 164 if (bpp == 1) { |
165 int32_t reset_a = 0, reset_r = 0, reset_g = 0, reset_b = 0; | 165 int32_t reset_a = 0, reset_r = 0, reset_g = 0, reset_b = 0; |
166 int32_t set_a = 0, set_r = 0, set_g = 0, set_b = 0; | 166 int32_t set_a = 0, set_r = 0, set_g = 0, set_b = 0; |
167 if (!pBitmap->IsAlphaMask()) { | 167 if (!pBitmap->IsAlphaMask()) { |
168 ArgbDecode(pBitmap->GetPaletteArgb(0), reset_a, reset_r, reset_g, | 168 ArgbDecode(pBitmap->GetPaletteArgb(0), reset_a, reset_r, reset_g, |
169 reset_b); | 169 reset_b); |
170 ArgbDecode(pBitmap->GetPaletteArgb(1), set_a, set_r, set_g, set_b); | 170 ArgbDecode(pBitmap->GetPaletteArgb(1), set_a, set_r, set_g, set_b); |
171 } | 171 } |
172 if (set_a == 0 || reset_a == 0) { | 172 if (set_a == 0 || reset_a == 0) { |
173 pDict->SetFor("ImageMask", new CPDF_Boolean(TRUE)); | 173 pDict->SetFor("ImageMask", new CPDF_Boolean(true)); |
174 if (reset_a == 0) { | 174 if (reset_a == 0) { |
175 CPDF_Array* pArray = new CPDF_Array; | 175 CPDF_Array* pArray = new CPDF_Array; |
176 pArray->AddInteger(1); | 176 pArray->AddInteger(1); |
177 pArray->AddInteger(0); | 177 pArray->AddInteger(0); |
178 pDict->SetFor("Decode", pArray); | 178 pDict->SetFor("Decode", pArray); |
179 } | 179 } |
180 } else { | 180 } else { |
181 CPDF_Array* pCS = new CPDF_Array; | 181 CPDF_Array* pCS = new CPDF_Array; |
182 pCS->AddName("Indexed"); | 182 pCS->AddName("Indexed"); |
183 pCS->AddName("DeviceRGB"); | 183 pCS->AddName("DeviceRGB"); |
184 pCS->AddInteger(1); | 184 pCS->AddInteger(1); |
185 CFX_ByteString ct; | 185 CFX_ByteString ct; |
186 FX_CHAR* pBuf = ct.GetBuffer(6); | 186 FX_CHAR* pBuf = ct.GetBuffer(6); |
187 pBuf[0] = (FX_CHAR)reset_r; | 187 pBuf[0] = (FX_CHAR)reset_r; |
188 pBuf[1] = (FX_CHAR)reset_g; | 188 pBuf[1] = (FX_CHAR)reset_g; |
189 pBuf[2] = (FX_CHAR)reset_b; | 189 pBuf[2] = (FX_CHAR)reset_b; |
190 pBuf[3] = (FX_CHAR)set_r; | 190 pBuf[3] = (FX_CHAR)set_r; |
191 pBuf[4] = (FX_CHAR)set_g; | 191 pBuf[4] = (FX_CHAR)set_g; |
192 pBuf[5] = (FX_CHAR)set_b; | 192 pBuf[5] = (FX_CHAR)set_b; |
193 ct.ReleaseBuffer(6); | 193 ct.ReleaseBuffer(6); |
194 pCS->Add(new CPDF_String(ct, TRUE)); | 194 pCS->Add(new CPDF_String(ct, true)); |
195 pDict->SetFor("ColorSpace", pCS); | 195 pDict->SetFor("ColorSpace", pCS); |
196 } | 196 } |
197 pDict->SetIntegerFor("BitsPerComponent", 1); | 197 pDict->SetIntegerFor("BitsPerComponent", 1); |
198 dest_pitch = (BitmapWidth + 7) / 8; | 198 dest_pitch = (BitmapWidth + 7) / 8; |
199 if ((iCompress & 0x03) == PDF_IMAGE_NO_COMPRESS) { | 199 if ((iCompress & 0x03) == PDF_IMAGE_NO_COMPRESS) { |
200 opType = 1; | 200 opType = 1; |
201 } else { | 201 } else { |
202 opType = 0; | 202 opType = 0; |
203 } | 203 } |
204 } else if (bpp == 8) { | 204 } else if (bpp == 8) { |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
237 pDict->SetNameFor("ColorSpace", "DeviceRGB"); | 237 pDict->SetNameFor("ColorSpace", "DeviceRGB"); |
238 pDict->SetIntegerFor("BitsPerComponent", 8); | 238 pDict->SetIntegerFor("BitsPerComponent", 8); |
239 if ((iCompress & 0x03) == PDF_IMAGE_NO_COMPRESS) { | 239 if ((iCompress & 0x03) == PDF_IMAGE_NO_COMPRESS) { |
240 dest_pitch = BitmapWidth * 3; | 240 dest_pitch = BitmapWidth * 3; |
241 opType = 2; | 241 opType = 2; |
242 } else { | 242 } else { |
243 opType = 0; | 243 opType = 0; |
244 } | 244 } |
245 } | 245 } |
246 const CFX_DIBitmap* pMaskBitmap = nullptr; | 246 const CFX_DIBitmap* pMaskBitmap = nullptr; |
247 FX_BOOL bDeleteMask = FALSE; | 247 bool bDeleteMask = false; |
248 if (pBitmap->HasAlpha()) { | 248 if (pBitmap->HasAlpha()) { |
249 pMaskBitmap = pBitmap->GetAlphaMask(); | 249 pMaskBitmap = pBitmap->GetAlphaMask(); |
250 bDeleteMask = TRUE; | 250 bDeleteMask = true; |
251 } | 251 } |
252 if (pMaskBitmap) { | 252 if (pMaskBitmap) { |
253 int32_t maskWidth = pMaskBitmap->GetWidth(); | 253 int32_t maskWidth = pMaskBitmap->GetWidth(); |
254 int32_t maskHeight = pMaskBitmap->GetHeight(); | 254 int32_t maskHeight = pMaskBitmap->GetHeight(); |
255 uint8_t* mask_buf = nullptr; | 255 uint8_t* mask_buf = nullptr; |
256 FX_STRSIZE mask_size = 0; | 256 FX_STRSIZE mask_size = 0; |
257 CPDF_Dictionary* pMaskDict = | 257 CPDF_Dictionary* pMaskDict = |
258 new CPDF_Dictionary(m_pDocument->GetByteStringPool()); | 258 new CPDF_Dictionary(m_pDocument->GetByteStringPool()); |
259 pMaskDict->SetNameFor("Type", "XObject"); | 259 pMaskDict->SetNameFor("Type", "XObject"); |
260 pMaskDict->SetNameFor("Subtype", "Image"); | 260 pMaskDict->SetNameFor("Subtype", "Image"); |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
341 m_Height = BitmapHeight; | 341 m_Height = BitmapHeight; |
342 FX_Free(dest_buf); | 342 FX_Free(dest_buf); |
343 } | 343 } |
344 | 344 |
345 void CPDF_Image::ResetCache(CPDF_Page* pPage, const CFX_DIBitmap* pBitmap) { | 345 void CPDF_Image::ResetCache(CPDF_Page* pPage, const CFX_DIBitmap* pBitmap) { |
346 pPage->GetRenderCache()->ResetBitmap(m_pStream, pBitmap); | 346 pPage->GetRenderCache()->ResetBitmap(m_pStream, pBitmap); |
347 } | 347 } |
348 | 348 |
349 CFX_DIBSource* CPDF_Image::LoadDIBSource(CFX_DIBSource** ppMask, | 349 CFX_DIBSource* CPDF_Image::LoadDIBSource(CFX_DIBSource** ppMask, |
350 uint32_t* pMatteColor, | 350 uint32_t* pMatteColor, |
351 FX_BOOL bStdCS, | 351 bool bStdCS, |
352 uint32_t GroupFamily, | 352 uint32_t GroupFamily, |
353 FX_BOOL bLoadMask) const { | 353 bool bLoadMask) const { |
354 std::unique_ptr<CPDF_DIBSource> source(new CPDF_DIBSource); | 354 std::unique_ptr<CPDF_DIBSource> source(new CPDF_DIBSource); |
355 if (source->Load(m_pDocument, m_pStream, | 355 if (source->Load(m_pDocument, m_pStream, |
356 reinterpret_cast<CPDF_DIBSource**>(ppMask), pMatteColor, | 356 reinterpret_cast<CPDF_DIBSource**>(ppMask), pMatteColor, |
357 nullptr, nullptr, bStdCS, GroupFamily, bLoadMask)) { | 357 nullptr, nullptr, bStdCS, GroupFamily, bLoadMask)) { |
358 return source.release(); | 358 return source.release(); |
359 } | 359 } |
360 return nullptr; | 360 return nullptr; |
361 } | 361 } |
362 | 362 |
363 CFX_DIBSource* CPDF_Image::DetachBitmap() { | 363 CFX_DIBSource* CPDF_Image::DetachBitmap() { |
364 CFX_DIBSource* pBitmap = m_pDIBSource; | 364 CFX_DIBSource* pBitmap = m_pDIBSource; |
365 m_pDIBSource = nullptr; | 365 m_pDIBSource = nullptr; |
366 return pBitmap; | 366 return pBitmap; |
367 } | 367 } |
368 | 368 |
369 CFX_DIBSource* CPDF_Image::DetachMask() { | 369 CFX_DIBSource* CPDF_Image::DetachMask() { |
370 CFX_DIBSource* pBitmap = m_pMask; | 370 CFX_DIBSource* pBitmap = m_pMask; |
371 m_pMask = nullptr; | 371 m_pMask = nullptr; |
372 return pBitmap; | 372 return pBitmap; |
373 } | 373 } |
374 | 374 |
375 FX_BOOL CPDF_Image::StartLoadDIBSource(CPDF_Dictionary* pFormResource, | 375 bool CPDF_Image::StartLoadDIBSource(CPDF_Dictionary* pFormResource, |
376 CPDF_Dictionary* pPageResource, | 376 CPDF_Dictionary* pPageResource, |
377 FX_BOOL bStdCS, | 377 bool bStdCS, |
378 uint32_t GroupFamily, | 378 uint32_t GroupFamily, |
379 FX_BOOL bLoadMask) { | 379 bool bLoadMask) { |
380 std::unique_ptr<CPDF_DIBSource> source(new CPDF_DIBSource); | 380 std::unique_ptr<CPDF_DIBSource> source(new CPDF_DIBSource); |
381 int ret = | 381 int ret = |
382 source->StartLoadDIBSource(m_pDocument, m_pStream, TRUE, pFormResource, | 382 source->StartLoadDIBSource(m_pDocument, m_pStream, true, pFormResource, |
383 pPageResource, bStdCS, GroupFamily, bLoadMask); | 383 pPageResource, bStdCS, GroupFamily, bLoadMask); |
384 if (ret == 2) { | 384 if (ret == 2) { |
385 m_pDIBSource = source.release(); | 385 m_pDIBSource = source.release(); |
386 return TRUE; | 386 return true; |
387 } | 387 } |
388 if (!ret) { | 388 if (!ret) { |
389 m_pDIBSource = nullptr; | 389 m_pDIBSource = nullptr; |
390 return FALSE; | 390 return false; |
391 } | 391 } |
392 m_pMask = source->DetachMask(); | 392 m_pMask = source->DetachMask(); |
393 m_MatteColor = source->GetMatteColor(); | 393 m_MatteColor = source->GetMatteColor(); |
394 m_pDIBSource = source.release(); | 394 m_pDIBSource = source.release(); |
395 return FALSE; | 395 return false; |
396 } | 396 } |
397 | 397 |
398 FX_BOOL CPDF_Image::Continue(IFX_Pause* pPause) { | 398 bool CPDF_Image::Continue(IFX_Pause* pPause) { |
399 CPDF_DIBSource* pSource = static_cast<CPDF_DIBSource*>(m_pDIBSource); | 399 CPDF_DIBSource* pSource = static_cast<CPDF_DIBSource*>(m_pDIBSource); |
400 int ret = pSource->ContinueLoadDIBSource(pPause); | 400 int ret = pSource->ContinueLoadDIBSource(pPause); |
401 if (ret == 2) { | 401 if (ret == 2) { |
402 return TRUE; | 402 return true; |
403 } | 403 } |
404 if (!ret) { | 404 if (!ret) { |
405 delete m_pDIBSource; | 405 delete m_pDIBSource; |
406 m_pDIBSource = nullptr; | 406 m_pDIBSource = nullptr; |
407 return FALSE; | 407 return false; |
408 } | 408 } |
409 m_pMask = pSource->DetachMask(); | 409 m_pMask = pSource->DetachMask(); |
410 m_MatteColor = pSource->GetMatteColor(); | 410 m_MatteColor = pSource->GetMatteColor(); |
411 return FALSE; | 411 return false; |
412 } | 412 } |
OLD | NEW |