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 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
212 } | 212 } |
213 pDict->SetNewFor<CPDF_Number>("BitsPerComponent", 1); | 213 pDict->SetNewFor<CPDF_Number>("BitsPerComponent", 1); |
214 dest_pitch = (BitmapWidth + 7) / 8; | 214 dest_pitch = (BitmapWidth + 7) / 8; |
215 } else if (bpp == 8) { | 215 } else if (bpp == 8) { |
216 int32_t iPalette = pBitmap->GetPaletteSize(); | 216 int32_t iPalette = pBitmap->GetPaletteSize(); |
217 if (iPalette > 0) { | 217 if (iPalette > 0) { |
218 CPDF_Array* pCS = m_pDocument->NewIndirect<CPDF_Array>(); | 218 CPDF_Array* pCS = m_pDocument->NewIndirect<CPDF_Array>(); |
219 pCS->AddNew<CPDF_Name>("Indexed"); | 219 pCS->AddNew<CPDF_Name>("Indexed"); |
220 pCS->AddNew<CPDF_Name>("DeviceRGB"); | 220 pCS->AddNew<CPDF_Name>("DeviceRGB"); |
221 pCS->AddNew<CPDF_Number>(iPalette - 1); | 221 pCS->AddNew<CPDF_Number>(iPalette - 1); |
222 uint8_t* pColorTable = FX_Alloc2D(uint8_t, iPalette, 3); | 222 std::unique_ptr<uint8_t, FxFreeDeleter> pColorTable( |
223 uint8_t* ptr = pColorTable; | 223 FX_Alloc2D(uint8_t, iPalette, 3)); |
| 224 uint8_t* ptr = pColorTable.get(); |
224 for (int32_t i = 0; i < iPalette; i++) { | 225 for (int32_t i = 0; i < iPalette; i++) { |
225 uint32_t argb = pBitmap->GetPaletteArgb(i); | 226 uint32_t argb = pBitmap->GetPaletteArgb(i); |
226 ptr[0] = (uint8_t)(argb >> 16); | 227 ptr[0] = (uint8_t)(argb >> 16); |
227 ptr[1] = (uint8_t)(argb >> 8); | 228 ptr[1] = (uint8_t)(argb >> 8); |
228 ptr[2] = (uint8_t)argb; | 229 ptr[2] = (uint8_t)argb; |
229 ptr += 3; | 230 ptr += 3; |
230 } | 231 } |
231 auto pNewDict = | 232 auto pNewDict = |
232 pdfium::MakeUnique<CPDF_Dictionary>(m_pDocument->GetByteStringPool()); | 233 pdfium::MakeUnique<CPDF_Dictionary>(m_pDocument->GetByteStringPool()); |
233 CPDF_Stream* pCTS = m_pDocument->NewIndirect<CPDF_Stream>( | 234 CPDF_Stream* pCTS = m_pDocument->NewIndirect<CPDF_Stream>( |
234 pColorTable, iPalette * 3, std::move(pNewDict)); | 235 std::move(pColorTable), iPalette * 3, std::move(pNewDict)); |
235 pCS->AddNew<CPDF_Reference>(m_pDocument, pCTS->GetObjNum()); | 236 pCS->AddNew<CPDF_Reference>(m_pDocument, pCTS->GetObjNum()); |
236 pDict->SetNewFor<CPDF_Reference>("ColorSpace", m_pDocument, | 237 pDict->SetNewFor<CPDF_Reference>("ColorSpace", m_pDocument, |
237 pCS->GetObjNum()); | 238 pCS->GetObjNum()); |
238 } else { | 239 } else { |
239 pDict->SetNewFor<CPDF_Name>("ColorSpace", "DeviceGray"); | 240 pDict->SetNewFor<CPDF_Name>("ColorSpace", "DeviceGray"); |
240 } | 241 } |
241 pDict->SetNewFor<CPDF_Number>("BitsPerComponent", 8); | 242 pDict->SetNewFor<CPDF_Number>("BitsPerComponent", 8); |
242 dest_pitch = BitmapWidth; | 243 dest_pitch = BitmapWidth; |
243 } else { | 244 } else { |
244 pDict->SetNewFor<CPDF_Name>("ColorSpace", "DeviceRGB"); | 245 pDict->SetNewFor<CPDF_Name>("ColorSpace", "DeviceRGB"); |
245 pDict->SetNewFor<CPDF_Number>("BitsPerComponent", 8); | 246 pDict->SetNewFor<CPDF_Number>("BitsPerComponent", 8); |
246 dest_pitch = BitmapWidth * 3; | 247 dest_pitch = BitmapWidth * 3; |
247 bCopyWithoutAlpha = false; | 248 bCopyWithoutAlpha = false; |
248 } | 249 } |
249 | 250 |
250 std::unique_ptr<CFX_DIBitmap> pMaskBitmap; | 251 std::unique_ptr<CFX_DIBitmap> pMaskBitmap; |
251 if (pBitmap->HasAlpha()) | 252 if (pBitmap->HasAlpha()) |
252 pMaskBitmap = pBitmap->CloneAlphaMask(); | 253 pMaskBitmap = pBitmap->CloneAlphaMask(); |
253 | 254 |
254 if (pMaskBitmap) { | 255 if (pMaskBitmap) { |
255 int32_t maskWidth = pMaskBitmap->GetWidth(); | 256 int32_t maskWidth = pMaskBitmap->GetWidth(); |
256 int32_t maskHeight = pMaskBitmap->GetHeight(); | 257 int32_t maskHeight = pMaskBitmap->GetHeight(); |
257 uint8_t* mask_buf = nullptr; | 258 std::unique_ptr<uint8_t, FxFreeDeleter> mask_buf; |
258 FX_STRSIZE mask_size = 0; | 259 FX_STRSIZE mask_size = 0; |
259 auto pMaskDict = | 260 auto pMaskDict = |
260 pdfium::MakeUnique<CPDF_Dictionary>(m_pDocument->GetByteStringPool()); | 261 pdfium::MakeUnique<CPDF_Dictionary>(m_pDocument->GetByteStringPool()); |
261 pMaskDict->SetNewFor<CPDF_Name>("Type", "XObject"); | 262 pMaskDict->SetNewFor<CPDF_Name>("Type", "XObject"); |
262 pMaskDict->SetNewFor<CPDF_Name>("Subtype", "Image"); | 263 pMaskDict->SetNewFor<CPDF_Name>("Subtype", "Image"); |
263 pMaskDict->SetNewFor<CPDF_Number>("Width", maskWidth); | 264 pMaskDict->SetNewFor<CPDF_Number>("Width", maskWidth); |
264 pMaskDict->SetNewFor<CPDF_Number>("Height", maskHeight); | 265 pMaskDict->SetNewFor<CPDF_Number>("Height", maskHeight); |
265 pMaskDict->SetNewFor<CPDF_Name>("ColorSpace", "DeviceGray"); | 266 pMaskDict->SetNewFor<CPDF_Name>("ColorSpace", "DeviceGray"); |
266 pMaskDict->SetNewFor<CPDF_Number>("BitsPerComponent", 8); | 267 pMaskDict->SetNewFor<CPDF_Number>("BitsPerComponent", 8); |
267 if (pMaskBitmap->GetFormat() != FXDIB_1bppMask) { | 268 if (pMaskBitmap->GetFormat() != FXDIB_1bppMask) { |
268 mask_buf = FX_Alloc2D(uint8_t, maskHeight, maskWidth); | 269 mask_buf.reset(FX_Alloc2D(uint8_t, maskHeight, maskWidth)); |
269 mask_size = maskHeight * maskWidth; // Safe since checked alloc returned. | 270 mask_size = maskHeight * maskWidth; // Safe since checked alloc returned. |
270 for (int32_t a = 0; a < maskHeight; a++) { | 271 for (int32_t a = 0; a < maskHeight; a++) { |
271 FXSYS_memcpy(mask_buf + a * maskWidth, pMaskBitmap->GetScanline(a), | 272 FXSYS_memcpy(mask_buf.get() + a * maskWidth, |
272 maskWidth); | 273 pMaskBitmap->GetScanline(a), maskWidth); |
273 } | 274 } |
274 } | 275 } |
275 pMaskDict->SetNewFor<CPDF_Number>("Length", mask_size); | 276 pMaskDict->SetNewFor<CPDF_Number>("Length", mask_size); |
276 CPDF_Stream* pNewStream = m_pDocument->NewIndirect<CPDF_Stream>( | 277 CPDF_Stream* pNewStream = m_pDocument->NewIndirect<CPDF_Stream>( |
277 mask_buf, mask_size, std::move(pMaskDict)); | 278 std::move(mask_buf), mask_size, std::move(pMaskDict)); |
278 pDict->SetNewFor<CPDF_Reference>("SMask", m_pDocument, | 279 pDict->SetNewFor<CPDF_Reference>("SMask", m_pDocument, |
279 pNewStream->GetObjNum()); | 280 pNewStream->GetObjNum()); |
280 } | 281 } |
281 | 282 |
282 uint8_t* src_buf = pBitmap->GetBuffer(); | 283 uint8_t* src_buf = pBitmap->GetBuffer(); |
283 int32_t src_pitch = pBitmap->GetPitch(); | 284 int32_t src_pitch = pBitmap->GetPitch(); |
284 uint8_t* dest_buf = FX_Alloc2D(uint8_t, dest_pitch, BitmapHeight); | 285 uint8_t* dest_buf = FX_Alloc2D(uint8_t, dest_pitch, BitmapHeight); |
285 // Safe as checked alloc returned. | 286 // Safe as checked alloc returned. |
286 FX_STRSIZE dest_size = dest_pitch * BitmapHeight; | 287 FX_STRSIZE dest_size = dest_pitch * BitmapHeight; |
287 uint8_t* pDest = dest_buf; | 288 uint8_t* pDest = dest_buf; |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
380 } | 381 } |
381 if (!ret) { | 382 if (!ret) { |
382 delete m_pDIBSource; | 383 delete m_pDIBSource; |
383 m_pDIBSource = nullptr; | 384 m_pDIBSource = nullptr; |
384 return false; | 385 return false; |
385 } | 386 } |
386 m_pMask = pSource->DetachMask(); | 387 m_pMask = pSource->DetachMask(); |
387 m_MatteColor = pSource->GetMatteColor(); | 388 m_MatteColor = pSource->GetMatteColor(); |
388 return false; | 389 return false; |
389 } | 390 } |
OLD | NEW |