1e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved. 2e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Use of this source code is governed by a BSD-style license that can be 3e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// found in the LICENSE file. 4ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 5e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 7ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fpdfapi/fpdf_module.h" 8ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fpdfapi/fpdf_page.h" 9ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fpdfapi/fpdf_render.h" 10ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fxcodec/fx_codec.h" 11ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/src/fpdfapi/fpdf_page/pageint.h" 12ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/src/fpdfapi/fpdf_render/render_int.h" 13ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 14ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Dictionary* CPDF_Image::InitJPEG(uint8_t* pData, FX_DWORD size) { 15ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t width; 16ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t height; 17ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t num_comps; 18ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t bits; 19ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL color_trans; 20ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!CPDF_ModuleMgr::Get()->GetJpegModule()->LoadInfo( 21ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pData, size, width, height, num_comps, bits, color_trans)) { 22ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 23ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 24ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pDict = new CPDF_Dictionary; 25ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDict->SetAtName("Type", "XObject"); 26ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDict->SetAtName("Subtype", "Image"); 27ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDict->SetAtInteger("Width", width); 28ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDict->SetAtInteger("Height", height); 29ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const FX_CHAR* csname = NULL; 30ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (num_comps == 1) { 31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann csname = "DeviceGray"; 32ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (num_comps == 3) { 33ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann csname = "DeviceRGB"; 34ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (num_comps == 4) { 35ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann csname = "DeviceCMYK"; 36ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pDecode = new CPDF_Array; 37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int n = 0; n < 4; n++) { 38ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDecode->AddInteger(1); 39ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDecode->AddInteger(0); 40e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 41ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDict->SetAt("Decode", pDecode); 42ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 43ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDict->SetAtName("ColorSpace", csname); 44ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDict->SetAtInteger("BitsPerComponent", bits); 45ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDict->SetAtName("Filter", "DCTDecode"); 46ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!color_trans) { 47ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pParms = new CPDF_Dictionary; 48ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDict->SetAt("DecodeParms", pParms); 49ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pParms->SetAtInteger("ColorTransform", 0); 50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_bIsMask = FALSE; 52ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Width = width; 53ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Height = height; 54ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pStream) { 55ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStream = new CPDF_Stream(NULL, 0, NULL); 56ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 57ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pDict; 58e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 59ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Image::SetJpegImage(uint8_t* pData, FX_DWORD size) { 60ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pDict = InitJPEG(pData, size); 61ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pDict) { 62ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 63ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 64ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStream->InitStream(pData, size, pDict); 65e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 66ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Image::SetJpegImage(IFX_FileRead* pFile) { 67ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD size = (FX_DWORD)pFile->GetSize(); 68ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!size) { 69ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 70ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 71ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD dwEstimateSize = size; 72ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (dwEstimateSize > 8192) { 73ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dwEstimateSize = 8192; 74ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 75ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann uint8_t* pData = FX_Alloc(uint8_t, dwEstimateSize); 76ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pFile->ReadBlock(pData, 0, dwEstimateSize); 77ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pDict = InitJPEG(pData, dwEstimateSize); 78ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_Free(pData); 79ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pDict && size > dwEstimateSize) { 80ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pData = FX_Alloc(uint8_t, size); 81ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pFile->ReadBlock(pData, 0, size); 82ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDict = InitJPEG(pData, size); 83ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_Free(pData); 84ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 85ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pDict) { 86ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 87ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 88ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStream->InitStreamFromFile(pFile, pDict); 89ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 90ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid _DCTEncodeBitmap(CPDF_Dictionary* pBitmapDict, 91ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_DIBitmap* pBitmap, 92ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int quality, 93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann uint8_t*& buf, 94ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_STRSIZE& size) {} 95ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid _JBIG2EncodeBitmap(CPDF_Dictionary* pBitmapDict, 96ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_DIBitmap* pBitmap, 97ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Document* pDoc, 98ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann uint8_t*& buf, 99ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_STRSIZE& size, 100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bLossLess) {} 101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Image::SetImage(const CFX_DIBitmap* pBitmap, 102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iCompress, 103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann IFX_FileWrite* pFileWrite, 104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann IFX_FileRead* pFileRead, 105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_DIBitmap* pMask, 106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CPDF_ImageSetParam* pParam) { 107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t BitmapWidth = pBitmap->GetWidth(); 108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t BitmapHeight = pBitmap->GetHeight(); 109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (BitmapWidth < 1 || BitmapHeight < 1) { 110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann uint8_t* src_buf = pBitmap->GetBuffer(); 113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t src_pitch = pBitmap->GetPitch(); 114ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t bpp = pBitmap->GetBPP(); 115ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bUseMatte = 116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pParam && pParam->pMatteColor && (pBitmap->GetFormat() == FXDIB_Argb); 117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pDict = new CPDF_Dictionary; 118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDict->SetAtName("Type", "XObject"); 119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDict->SetAtName("Subtype", "Image"); 120ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDict->SetAtInteger("Width", BitmapWidth); 121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDict->SetAtInteger("Height", BitmapHeight); 122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann uint8_t* dest_buf = NULL; 123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_STRSIZE dest_pitch = 0, dest_size = 0, opType = -1; 124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bpp == 1) { 125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t reset_a = 0, reset_r = 0, reset_g = 0, reset_b = 0; 126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t set_a = 0, set_r = 0, set_g = 0, set_b = 0; 127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pBitmap->IsAlphaMask()) { 128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ArgbDecode(pBitmap->GetPaletteArgb(0), reset_a, reset_r, reset_g, 129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann reset_b); 130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ArgbDecode(pBitmap->GetPaletteArgb(1), set_a, set_r, set_g, set_b); 131e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 132ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (set_a == 0 || reset_a == 0) { 133ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDict->SetAt("ImageMask", new CPDF_Boolean(TRUE)); 134ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (reset_a == 0) { 135ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pArray = new CPDF_Array; 136ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pArray->AddInteger(1); 137ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pArray->AddInteger(0); 138ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDict->SetAt("Decode", pArray); 139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 140ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 141ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pCS = new CPDF_Array; 142ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pCS->AddName("Indexed"); 143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pCS->AddName("DeviceRGB"); 144ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pCS->AddInteger(1); 145ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString ct; 146ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_CHAR* pBuf = ct.GetBuffer(6); 147ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pBuf[0] = (FX_CHAR)reset_r; 148ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pBuf[1] = (FX_CHAR)reset_g; 149ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pBuf[2] = (FX_CHAR)reset_b; 150ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pBuf[3] = (FX_CHAR)set_r; 151ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pBuf[4] = (FX_CHAR)set_g; 152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pBuf[5] = (FX_CHAR)set_b; 153ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ct.ReleaseBuffer(6); 154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pCS->Add(new CPDF_String(ct, TRUE)); 155ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDict->SetAt("ColorSpace", pCS); 156e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 157ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDict->SetAtInteger("BitsPerComponent", 1); 158ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dest_pitch = (BitmapWidth + 7) / 8; 159ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((iCompress & 0x03) == PDF_IMAGE_NO_COMPRESS) { 160ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opType = 1; 161ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 162ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opType = 0; 163e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 164ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (bpp == 8) { 165ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iPalette = pBitmap->GetPaletteSize(); 166ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iPalette > 0) { 167ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pCS = new CPDF_Array; 168ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDocument->AddIndirectObject(pCS); 169ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pCS->AddName("Indexed"); 170ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pCS->AddName("DeviceRGB"); 171ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pCS->AddInteger(iPalette - 1); 172ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann uint8_t* pColorTable = FX_Alloc2D(uint8_t, iPalette, 3); 173ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann uint8_t* ptr = pColorTable; 174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int32_t i = 0; i < iPalette; i++) { 175ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD argb = pBitmap->GetPaletteArgb(i); 176ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ptr[0] = (uint8_t)(argb >> 16); 177ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ptr[1] = (uint8_t)(argb >> 8); 178ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ptr[2] = (uint8_t)argb; 179ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ptr += 3; 180ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 181ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Stream* pCTS = 182ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann new CPDF_Stream(pColorTable, iPalette * 3, new CPDF_Dictionary); 183ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDocument->AddIndirectObject(pCTS); 184ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pCS->AddReference(m_pDocument, pCTS); 185ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDict->SetAtReference("ColorSpace", m_pDocument, pCS); 186ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 187ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDict->SetAtName("ColorSpace", "DeviceGray"); 188e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 189ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDict->SetAtInteger("BitsPerComponent", 8); 190ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((iCompress & 0x03) == PDF_IMAGE_NO_COMPRESS) { 191ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dest_pitch = BitmapWidth; 192ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opType = 1; 193ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 194ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opType = 0; 195e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 196ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 197ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDict->SetAtName("ColorSpace", "DeviceRGB"); 198ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDict->SetAtInteger("BitsPerComponent", 8); 199ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((iCompress & 0x03) == PDF_IMAGE_NO_COMPRESS) { 200ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dest_pitch = BitmapWidth * 3; 201ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opType = 2; 202e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 203ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann opType = 0; 204e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 205ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 206ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_DIBitmap* pMaskBitmap = NULL; 207ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bDeleteMask = FALSE; 208ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pBitmap->HasAlpha()) { 209ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pMaskBitmap = pBitmap->GetAlphaMask(); 210ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bDeleteMask = TRUE; 211ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 212ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pMaskBitmap && pMask) { 213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXDIB_Format maskFormat = pMask->GetFormat(); 214ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (maskFormat == FXDIB_1bppMask || maskFormat == FXDIB_8bppMask) { 215ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pMaskBitmap = pMask; 216e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 217ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 218ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pMaskBitmap) { 219ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t maskWidth = pMaskBitmap->GetWidth(); 220ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t maskHeight = pMaskBitmap->GetHeight(); 221ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann uint8_t* mask_buf = NULL; 222ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_STRSIZE mask_size = 0; 223ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pMaskDict = new CPDF_Dictionary; 224ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pMaskDict->SetAtName("Type", "XObject"); 225ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pMaskDict->SetAtName("Subtype", "Image"); 226ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pMaskDict->SetAtInteger("Width", maskWidth); 227ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pMaskDict->SetAtInteger("Height", maskHeight); 228ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pMaskDict->SetAtName("ColorSpace", "DeviceGray"); 229ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pMaskDict->SetAtInteger("BitsPerComponent", 8); 230ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pMaskBitmap->GetBPP() == 8 && 231ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann (iCompress & PDF_IMAGE_MASK_LOSSY_COMPRESS) != 0) { 232ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann _DCTEncodeBitmap(pMaskDict, pMaskBitmap, pParam ? pParam->nQuality : 75, 233ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann mask_buf, mask_size); 234ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (pMaskBitmap->GetFormat() == FXDIB_1bppMask) { 235ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann _JBIG2EncodeBitmap(pMaskDict, pMaskBitmap, m_pDocument, mask_buf, 236ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann mask_size, TRUE); 237ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 238ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann mask_buf = FX_Alloc2D(uint8_t, maskHeight, maskWidth); 239ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann mask_size = maskHeight * maskWidth; // Safe since checked alloc returned. 240ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int32_t a = 0; a < maskHeight; a++) { 241ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_memcpy(mask_buf + a * maskWidth, pMaskBitmap->GetScanline(a), 242ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann maskWidth); 243ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 244e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 245ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pMaskDict->SetAtInteger("Length", mask_size); 246ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bUseMatte) { 247ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int a, r, g, b; 248ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ArgbDecode(*(pParam->pMatteColor), a, r, g, b); 249ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pMatte = new CPDF_Array; 250ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pMatte->AddInteger(r); 251ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pMatte->AddInteger(g); 252ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pMatte->AddInteger(b); 253ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pMaskDict->SetAt("Matte", pMatte); 254e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 255ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Stream* pMaskStream = new CPDF_Stream(mask_buf, mask_size, pMaskDict); 256ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDocument->AddIndirectObject(pMaskStream); 257ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDict->SetAtReference("SMask", m_pDocument, pMaskStream); 258ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bDeleteMask) { 259ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann delete pMaskBitmap; 260ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 261ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 262ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bStream = pFileWrite && pFileRead; 263ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (opType == 0) { 264ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iCompress & PDF_IMAGE_LOSSLESS_COMPRESS) { 265ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pBitmap->GetBPP() == 1) { 266ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann _JBIG2EncodeBitmap(pDict, pBitmap, m_pDocument, dest_buf, dest_size, 267ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann TRUE); 268ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 269ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 270ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pBitmap->GetBPP() == 1) { 271ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann _JBIG2EncodeBitmap(pDict, pBitmap, m_pDocument, dest_buf, dest_size, 272ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FALSE); 273ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (pBitmap->GetBPP() >= 8 && pBitmap->GetPalette()) { 274ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_DIBitmap* pNewBitmap = new CFX_DIBitmap(); 275ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pNewBitmap->Copy(pBitmap); 276ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pNewBitmap->ConvertFormat(FXDIB_Rgb); 277ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann SetImage(pNewBitmap, iCompress, pFileWrite, pFileRead); 278ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pDict) { 279ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDict->Release(); 280ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDict = NULL; 281e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 282ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_Free(dest_buf); 283ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dest_buf = NULL; 284ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dest_size = 0; 285ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann delete pNewBitmap; 286ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 287ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 288ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bUseMatte) { 289ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_DIBitmap* pNewBitmap = new CFX_DIBitmap(); 290ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pNewBitmap->Create(BitmapWidth, BitmapHeight, FXDIB_Argb); 291ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann uint8_t* dst_buf = pNewBitmap->GetBuffer(); 292ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t src_offset = 0; 293ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int32_t row = 0; row < BitmapHeight; row++) { 294e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov src_offset = row * src_pitch; 295ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int32_t column = 0; column < BitmapWidth; column++) { 296ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FLOAT alpha = src_buf[src_offset + 3] / 255.0f; 297ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dst_buf[src_offset] = (uint8_t)(src_buf[src_offset] * alpha); 298ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dst_buf[src_offset + 1] = 299ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann (uint8_t)(src_buf[src_offset + 1] * alpha); 300ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dst_buf[src_offset + 2] = 301ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann (uint8_t)(src_buf[src_offset + 2] * alpha); 302ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dst_buf[src_offset + 3] = (uint8_t)(src_buf[src_offset + 3]); 303ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann src_offset += 4; 304e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 305ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 306ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann _DCTEncodeBitmap(pDict, pNewBitmap, pParam ? pParam->nQuality : 75, 307ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dest_buf, dest_size); 308ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann delete pNewBitmap; 309ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 310ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann _DCTEncodeBitmap(pDict, pBitmap, pParam ? pParam->nQuality : 75, 311ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dest_buf, dest_size); 312e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 313ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 314ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 315ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bStream) { 316ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pFileWrite->WriteBlock(dest_buf, dest_size); 317ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_Free(dest_buf); 318ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dest_buf = NULL; 319e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 320ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (opType == 1) { 321ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!bStream) { 322ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dest_buf = FX_Alloc2D(uint8_t, dest_pitch, BitmapHeight); 323ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dest_size = 324ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dest_pitch * BitmapHeight; // Safe since checked alloc returned. 325ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 326ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann uint8_t* pDest = dest_buf; 327ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int32_t i = 0; i < BitmapHeight; i++) { 328ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!bStream) { 329ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_memcpy(pDest, src_buf, dest_pitch); 330ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDest += dest_pitch; 331ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 332ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pFileWrite->WriteBlock(src_buf, dest_pitch); 333ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 334ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann src_buf += src_pitch; 335e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 336ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (opType == 2) { 337e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!bStream) { 338ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dest_buf = FX_Alloc2D(uint8_t, dest_pitch, BitmapHeight); 339ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dest_size = 340ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dest_pitch * BitmapHeight; // Safe since checked alloc returned. 341e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 342ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dest_buf = FX_Alloc(uint8_t, dest_pitch); 343e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 344ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann uint8_t* pDest = dest_buf; 345ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t src_offset = 0; 346ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t dest_offset = 0; 347ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int32_t row = 0; row < BitmapHeight; row++) { 348ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann src_offset = row * src_pitch; 349ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int32_t column = 0; column < BitmapWidth; column++) { 350ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FLOAT alpha = bUseMatte ? src_buf[src_offset + 3] / 255.0f : 1; 351ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDest[dest_offset] = (uint8_t)(src_buf[src_offset + 2] * alpha); 352ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDest[dest_offset + 1] = (uint8_t)(src_buf[src_offset + 1] * alpha); 353ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDest[dest_offset + 2] = (uint8_t)(src_buf[src_offset] * alpha); 354ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dest_offset += 3; 355ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann src_offset += bpp == 24 ? 3 : 4; 356ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 357ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bStream) { 358ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pFileWrite->WriteBlock(pDest, dest_pitch); 359ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDest = dest_buf; 360ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 361ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDest += dest_pitch; 362ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 363ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dest_offset = 0; 364ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 365ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bStream) { 366ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_Free(dest_buf); 367ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dest_buf = NULL; 368e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 369ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 370ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pStream) { 371ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStream = new CPDF_Stream(NULL, 0, NULL); 372ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 373ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!bStream) { 374ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStream->InitStream(dest_buf, dest_size, pDict); 375ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 376ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pFileWrite->Flush(); 377ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStream->InitStreamFromFile(pFileRead, pDict); 378ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 379ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_bIsMask = pBitmap->IsAlphaMask(); 380ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Width = BitmapWidth; 381ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Height = BitmapHeight; 382ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_Free(dest_buf); 383e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 384ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Image::ResetCache(CPDF_Page* pPage, const CFX_DIBitmap* pBitmap) { 385ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pPage->GetRenderCache()->ResetBitmap(m_pStream, pBitmap); 386e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 387