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 7e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "render_int.h" 8ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 9ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include <utility> 10ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include <vector> 11ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 12ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fpdfapi/fpdf_module.h" 13ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fpdfapi/fpdf_pageobj.h" 14ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fpdfapi/fpdf_render.h" 15ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fxcodec/fx_codec.h" 16ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fxcrt/fx_safe_types.h" 17ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fxge/fx_ge.h" 18ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/src/fpdfapi/fpdf_page/pageint.h" 19ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 20ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_RenderStatus::ProcessImage(CPDF_ImageObject* pImageObj, 21ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_Matrix* pObj2Device) { 22ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_ImageRenderer render; 23ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (render.Start(this, pImageObj, pObj2Device, m_bStdCS, m_curBlend)) { 24ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann render.Continue(NULL); 25ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 26ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return render.m_Result; 27e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 28ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_RenderStatus::CompositeDIBitmap(CFX_DIBitmap* pDIBitmap, 29ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int left, 30ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int top, 31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_ARGB mask_argb, 32ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int bitmap_alpha, 33ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int blend_mode, 34ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int Transparency) { 35ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pDIBitmap) { 36ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 38ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bIsolated = Transparency & PDFTRANS_ISOLATED; 39ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bGroup = Transparency & PDFTRANS_GROUP; 40ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (blend_mode == FXDIB_BLEND_NORMAL) { 41ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pDIBitmap->IsAlphaMask()) { 42ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bitmap_alpha < 255) { 43ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDIBitmap->MultiplyAlpha(bitmap_alpha); 44ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 45ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pDevice->SetDIBits(pDIBitmap, left, top)) { 46e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; 47ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 48ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 49ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD fill_argb = m_Options.TranslateColor(mask_argb); 50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bitmap_alpha < 255) { 51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ((uint8_t*)&fill_argb)[3] = 52ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ((uint8_t*)&fill_argb)[3] * bitmap_alpha / 255; 53ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 54ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pDevice->SetBitMask(pDIBitmap, left, top, fill_argb)) { 55e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; 56ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 57ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 58ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 59ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bBackAlphaRequired = blend_mode && bIsolated && !m_bDropObjects; 60ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bGetBackGround = 61ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ((m_pDevice->GetRenderCaps() & FXRC_ALPHA_OUTPUT)) || 62ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann (!(m_pDevice->GetRenderCaps() & FXRC_ALPHA_OUTPUT) && 63ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann (m_pDevice->GetRenderCaps() & FXRC_GET_BITS) && !bBackAlphaRequired); 64ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bGetBackGround) { 65ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bIsolated || !bGroup) { 66ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pDIBitmap->IsAlphaMask()) { 67e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; 68ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 69ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDevice->SetDIBits(pDIBitmap, left, top, blend_mode); 70ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 71ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_RECT rect(left, top, left + pDIBitmap->GetWidth(), 72ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann top + pDIBitmap->GetHeight()); 73ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann rect.Intersect(m_pDevice->GetClipBox()); 74ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_DIBitmap* pClone = NULL; 75ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bClone = FALSE; 76ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pDevice->GetBackDrop() && m_pDevice->GetBitmap()) { 77ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bClone = TRUE; 78ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pClone = m_pDevice->GetBackDrop()->Clone(&rect); 79ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_DIBitmap* pForeBitmap = m_pDevice->GetBitmap(); 80ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pClone->CompositeBitmap(0, 0, pClone->GetWidth(), pClone->GetHeight(), 81ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pForeBitmap, rect.left, rect.top); 82ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann left = left >= 0 ? 0 : left; 83ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann top = top >= 0 ? 0 : top; 84ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pDIBitmap->IsAlphaMask()) 85ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pClone->CompositeBitmap(0, 0, pClone->GetWidth(), pClone->GetHeight(), 86ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDIBitmap, left, top, blend_mode); 87ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann else 88ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pClone->CompositeMask(0, 0, pClone->GetWidth(), pClone->GetHeight(), 89ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDIBitmap, mask_argb, left, top, blend_mode); 90ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 91ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pClone = pDIBitmap; 92ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pDevice->GetBackDrop()) { 94ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDevice->SetDIBits(pClone, rect.left, rect.top); 95ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 96ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pDIBitmap->IsAlphaMask()) { 97ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 98ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 99ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDevice->SetDIBits(pDIBitmap, rect.left, rect.top, blend_mode); 100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bClone) { 102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann delete pClone; 103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int back_left, back_top; 108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_RECT rect(left, top, left + pDIBitmap->GetWidth(), 109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann top + pDIBitmap->GetHeight()); 110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann std::unique_ptr<CFX_DIBitmap> pBackdrop( 111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann GetBackdrop(m_pCurObj, rect, back_left, back_top, 112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann blend_mode > FXDIB_BLEND_NORMAL && bIsolated)); 113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pBackdrop) 114ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 115ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pDIBitmap->IsAlphaMask()) { 117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pBackdrop->CompositeBitmap(left - back_left, top - back_top, 118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDIBitmap->GetWidth(), pDIBitmap->GetHeight(), 119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDIBitmap, 0, 0, blend_mode); 120ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pBackdrop->CompositeMask(left - back_left, top - back_top, 122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDIBitmap->GetWidth(), pDIBitmap->GetHeight(), 123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDIBitmap, mask_argb, 0, 0, blend_mode); 124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann std::unique_ptr<CFX_DIBitmap> pBackdrop1(new CFX_DIBitmap); 127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pBackdrop1->Create(pBackdrop->GetWidth(), pBackdrop->GetHeight(), 128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXDIB_Rgb32); 129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pBackdrop1->Clear((FX_DWORD)-1); 130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pBackdrop1->CompositeBitmap(0, 0, pBackdrop->GetWidth(), 131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pBackdrop->GetHeight(), pBackdrop.get(), 0, 0); 132ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pBackdrop = std::move(pBackdrop1); 133ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDevice->SetDIBits(pBackdrop.get(), back_left, back_top); 134e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 135ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 136ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_TransferFunc::CPDF_TransferFunc(CPDF_Document* pDoc) : m_pPDFDoc(pDoc) {} 137ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 138ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_COLORREF CPDF_TransferFunc::TranslateColor(FX_COLORREF rgb) const { 139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FXSYS_RGB(m_Samples[FXSYS_GetRValue(rgb)], 140ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Samples[256 + FXSYS_GetGValue(rgb)], 141ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Samples[512 + FXSYS_GetBValue(rgb)]); 142e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 144ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_DIBSource* CPDF_TransferFunc::TranslateImage(const CFX_DIBSource* pSrc, 145ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bAutoDropSrc) { 146ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_DIBTransferFunc* pDest = new CPDF_DIBTransferFunc(this); 147ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDest->LoadSrc(pSrc, bAutoDropSrc); 148ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pDest; 149e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 150ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 151ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_DIBTransferFunc::~CPDF_DIBTransferFunc() { 152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 153ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFXDIB_Format CPDF_DIBTransferFunc::GetDestFormat() { 155ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pSrc->IsAlphaMask()) { 156ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FXDIB_8bppMask; 157ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 158ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ 159ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return (m_pSrc->HasAlpha()) ? FXDIB_Argb : FXDIB_Rgb32; 160e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#else 161ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return (m_pSrc->HasAlpha()) ? FXDIB_Argb : FXDIB_Rgb; 162e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 163e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 164ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_DIBTransferFunc::CPDF_DIBTransferFunc( 165ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CPDF_TransferFunc* pTransferFunc) { 166ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_RampR = pTransferFunc->m_Samples; 167ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_RampG = &pTransferFunc->m_Samples[256]; 168ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_RampB = &pTransferFunc->m_Samples[512]; 169e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 170ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_DIBTransferFunc::TranslateScanline(uint8_t* dest_buf, 171ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const uint8_t* src_buf) const { 172ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int i; 173ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bSkip = FALSE; 174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann switch (m_pSrc->GetFormat()) { 175ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case FXDIB_1bppRgb: { 176ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int r0 = m_RampR[0], g0 = m_RampG[0], b0 = m_RampB[0]; 177ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int r1 = m_RampR[255], g1 = m_RampG[255], b1 = m_RampB[255]; 178ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (i = 0; i < m_Width; i++) { 179ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (src_buf[i / 8] & (1 << (7 - i % 8))) { 180ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *dest_buf++ = b1; 181ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *dest_buf++ = g1; 182ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *dest_buf++ = r1; 183ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 184ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *dest_buf++ = b0; 185ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *dest_buf++ = g0; 186ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *dest_buf++ = r0; 187ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 188ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ 189ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dest_buf++; 190e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 191ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 192ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 193ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 194ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case FXDIB_1bppMask: { 195ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int m0 = m_RampR[0], m1 = m_RampR[255]; 196ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (i = 0; i < m_Width; i++) { 197ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (src_buf[i / 8] & (1 << (7 - i % 8))) { 198ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *dest_buf++ = m1; 199ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 200ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *dest_buf++ = m0; 201ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 202ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 203ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 204ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 205ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case FXDIB_8bppRgb: { 206ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_ARGB* pPal = m_pSrc->GetPalette(); 207ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (i = 0; i < m_Width; i++) { 208ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pPal) { 209ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_ARGB src_argb = pPal[*src_buf]; 210ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *dest_buf++ = m_RampB[FXARGB_R(src_argb)]; 211ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *dest_buf++ = m_RampG[FXARGB_G(src_argb)]; 212ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *dest_buf++ = m_RampR[FXARGB_B(src_argb)]; 213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 214ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD src_byte = *src_buf; 215ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *dest_buf++ = m_RampB[src_byte]; 216ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *dest_buf++ = m_RampG[src_byte]; 217ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *dest_buf++ = m_RampR[src_byte]; 218ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 219ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann src_buf++; 220ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ 221ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dest_buf++; 222e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 223ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 224ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 225ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 226ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case FXDIB_8bppMask: 227ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (i = 0; i < m_Width; i++) { 228ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *dest_buf++ = m_RampR[*(src_buf++)]; 229ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 230ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 231ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case FXDIB_Rgb: 232ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (i = 0; i < m_Width; i++) { 233ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *dest_buf++ = m_RampB[*(src_buf++)]; 234ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *dest_buf++ = m_RampG[*(src_buf++)]; 235ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *dest_buf++ = m_RampR[*(src_buf++)]; 236ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ 237ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dest_buf++; 238e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 239ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 240ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 241ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case FXDIB_Rgb32: 242ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bSkip = TRUE; 243ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case FXDIB_Argb: 244ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (i = 0; i < m_Width; i++) { 245ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *dest_buf++ = m_RampB[*(src_buf++)]; 246ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *dest_buf++ = m_RampG[*(src_buf++)]; 247ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *dest_buf++ = m_RampR[*(src_buf++)]; 248ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!bSkip) { 249ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *dest_buf++ = *src_buf; 250ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 251ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ 252ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann else { 253ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dest_buf++; 254ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 255e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 256ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann src_buf++; 257ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 258ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 259ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann default: 260ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 261ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 262e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 263ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_DIBTransferFunc::TranslateDownSamples(uint8_t* dest_buf, 264ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const uint8_t* src_buf, 265ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int pixels, 266ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int Bpp) const { 267ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (Bpp == 8) { 268ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < pixels; i++) { 269ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *dest_buf++ = m_RampR[*(src_buf++)]; 270ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 271ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (Bpp == 24) { 272ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < pixels; i++) { 273ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *dest_buf++ = m_RampB[*(src_buf++)]; 274ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *dest_buf++ = m_RampG[*(src_buf++)]; 275ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *dest_buf++ = m_RampR[*(src_buf++)]; 276ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 277ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 278ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ 279ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pSrc->HasAlpha()) { 280ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < pixels; i++) { 281ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *dest_buf++ = m_RampB[*(src_buf++)]; 282ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *dest_buf++ = m_RampG[*(src_buf++)]; 283ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *dest_buf++ = m_RampR[*(src_buf++)]; 284ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dest_buf++; 285ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann src_buf++; 286ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 287ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else 288e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 289ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < pixels; i++) { 290ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *dest_buf++ = m_RampB[*(src_buf++)]; 291ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *dest_buf++ = m_RampG[*(src_buf++)]; 292ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *dest_buf++ = m_RampR[*(src_buf++)]; 293ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *dest_buf++ = *(src_buf++); 294ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 295ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 296e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 297ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_ImageRenderer::CPDF_ImageRenderer() { 298ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pRenderStatus = NULL; 299ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pImageObject = NULL; 300ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Result = TRUE; 301ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Status = 0; 302ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pTransformer = NULL; 303ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_DeviceHandle = NULL; 304ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_LoadHandle = NULL; 305ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pClone = NULL; 306ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_bStdCS = FALSE; 307ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_bPatternColor = FALSE; 308ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_BlendType = FXDIB_BLEND_NORMAL; 309ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pPattern = NULL; 310ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pObj2Device = NULL; 311e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 312ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_ImageRenderer::~CPDF_ImageRenderer() { 313ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann delete m_pTransformer; 314ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_DeviceHandle) { 315ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pRenderStatus->m_pDevice->CancelDIBits(m_DeviceHandle); 316ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 317ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann delete m_LoadHandle; 318ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann delete m_pClone; 319e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 320ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_ImageRenderer::StartLoadDIBSource() { 321ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect(); 322ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_RECT image_rect = image_rect_f.GetOutterRect(); 323ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int dest_width = image_rect.Width(); 324ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int dest_height = image_rect.Height(); 325ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_ImageMatrix.a < 0) { 326ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dest_width = -dest_width; 327ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 328ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_ImageMatrix.d > 0) { 329ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dest_height = -dest_height; 330ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 331ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_Loader.Start(m_pImageObject, 332ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pRenderStatus->m_pContext->GetPageCache(), m_LoadHandle, 333ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_bStdCS, m_pRenderStatus->m_GroupFamily, 334ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pRenderStatus->m_bLoadMask, m_pRenderStatus, dest_width, 335ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dest_height)) { 336e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_LoadHandle) { 337ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Status = 4; 338ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 339e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 340ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 341ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 342e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 343ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_ImageRenderer::StartRenderDIBSource() { 344ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_Loader.m_pBitmap) { 345e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 346ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 347ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_BitmapAlpha = 255; 348ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CPDF_GeneralStateData* pGeneralState = m_pImageObject->m_GeneralState; 349ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pGeneralState) { 350ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_BitmapAlpha = FXSYS_round(pGeneralState->m_FillAlpha * 255); 351ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 352ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDIBSource = m_Loader.m_pBitmap; 353ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pRenderStatus->m_Options.m_ColorMode == RENDER_COLOR_ALPHA && 354ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann !m_Loader.m_pMask) { 355ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return StartBitmapAlpha(); 356ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 357ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pGeneralState && pGeneralState->m_pTR) { 358ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pGeneralState->m_pTransferFunc) { 359ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ((CPDF_GeneralStateData*)pGeneralState)->m_pTransferFunc = 360ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pRenderStatus->GetTransferFunc(pGeneralState->m_pTR); 361ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 362ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pGeneralState->m_pTransferFunc && 363ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann !pGeneralState->m_pTransferFunc->m_bIdentity) { 364ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDIBSource = m_Loader.m_pBitmap = 365ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pGeneralState->m_pTransferFunc->TranslateImage(m_Loader.m_pBitmap, 366ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann !m_Loader.m_bCached); 367ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_Loader.m_bCached && m_Loader.m_pMask) { 368ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Loader.m_pMask = m_Loader.m_pMask->Clone(); 369ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 370ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Loader.m_bCached = FALSE; 371ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 372ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 373ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_FillArgb = 0; 374ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_bPatternColor = FALSE; 375ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pPattern = NULL; 376ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pDIBSource->IsAlphaMask()) { 377ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Color* pColor = m_pImageObject->m_ColorState.GetFillColor(); 378ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pColor && pColor->IsPattern()) { 379ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pPattern = pColor->GetPattern(); 380ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pPattern) { 381ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_bPatternColor = TRUE; 382ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 383ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 384ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_FillArgb = m_pRenderStatus->GetFillArgb(m_pImageObject); 385ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (m_pRenderStatus->m_Options.m_ColorMode == RENDER_COLOR_GRAY) { 386ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pClone = m_pDIBSource->Clone(); 387ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pClone->ConvertColorScale(m_pRenderStatus->m_Options.m_BackColor, 388ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pRenderStatus->m_Options.m_ForeColor); 389ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDIBSource = m_pClone; 390ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 391ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Flags = 0; 392ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pRenderStatus->m_Options.m_Flags & RENDER_FORCE_DOWNSAMPLE) { 393ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Flags |= RENDER_FORCE_DOWNSAMPLE; 394ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (m_pRenderStatus->m_Options.m_Flags & RENDER_FORCE_HALFTONE) { 395ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Flags |= RENDER_FORCE_HALFTONE; 396ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 397ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pRenderStatus->m_pDevice->GetDeviceClass() != FXDC_DISPLAY) { 398ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pFilters = 399ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pImageObject->m_pImage->GetStream()->GetDict()->GetElementValue( 400ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann "Filter"); 401ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFilters) { 402ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFilters->IsName()) { 403ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteStringC bsDecodeType = pFilters->GetConstString(); 404ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bsDecodeType == "DCTDecode" || bsDecodeType == "JPXDecode") { 405ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Flags |= FXRENDER_IMAGE_LOSSY; 406ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 407ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (CPDF_Array* pArray = pFilters->AsArray()) { 408ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (FX_DWORD i = 0; i < pArray->GetCount(); i++) { 409ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteStringC bsDecodeType = pArray->GetConstString(i); 410ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bsDecodeType == "DCTDecode" || bsDecodeType == "JPXDecode") { 411ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Flags |= FXRENDER_IMAGE_LOSSY; 412ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 413ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 414ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 415ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 416ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 417ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 418ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pRenderStatus->m_Options.m_Flags & RENDER_NOIMAGESMOOTH) { 419ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Flags |= FXDIB_NOSMOOTH; 420ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (m_pImageObject->m_pImage->IsInterpol()) { 421ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Flags |= FXDIB_INTERPOL; 422ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 423ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_Loader.m_pMask) { 424ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return DrawMaskedImage(); 425ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 426ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_bPatternColor) { 427ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return DrawPatternImage(m_pObj2Device); 428ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 429ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_BitmapAlpha == 255 && pGeneralState && pGeneralState->m_FillOP && 430ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pGeneralState->m_OPMode == 0 && 431ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pGeneralState->m_BlendType == FXDIB_BLEND_NORMAL && 432ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pGeneralState->m_StrokeAlpha == 1 && pGeneralState->m_FillAlpha == 1) { 433ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Document* pDocument = NULL; 434ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Page* pPage = NULL; 435ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pRenderStatus->m_pContext->GetPageCache()) { 436ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pPage = m_pRenderStatus->m_pContext->GetPageCache()->GetPage(); 437ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDocument = pPage->m_pDocument; 438ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 439ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDocument = m_pImageObject->m_pImage->GetDocument(); 440ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 441ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pPageResources = pPage ? pPage->m_pPageResources : NULL; 442ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pCSObj = 443ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pImageObject->m_pImage->GetStream()->GetDict()->GetElementValue( 444ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann "ColorSpace"); 445ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_ColorSpace* pColorSpace = 446ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDocument->LoadColorSpace(pCSObj, pPageResources); 447ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pColorSpace) { 448ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int format = pColorSpace->GetFamily(); 449ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (format == PDFCS_DEVICECMYK || format == PDFCS_SEPARATION || 450ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann format == PDFCS_DEVICEN) { 451ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_BlendType = FXDIB_BLEND_DARKEN; 452ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 453ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDocument->GetPageData()->ReleaseColorSpace(pCSObj); 454ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 455ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 456ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return StartDIBSource(); 457e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 458ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_ImageRenderer::Start(CPDF_RenderStatus* pStatus, 459ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CPDF_PageObject* pObj, 460ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_Matrix* pObj2Device, 461ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bStdCS, 462ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int blendType) { 463ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pRenderStatus = pStatus; 464ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_bStdCS = bStdCS; 465ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pImageObject = (CPDF_ImageObject*)pObj; 466ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_BlendType = blendType; 467ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pObj2Device = pObj2Device; 468ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pOC = m_pImageObject->m_pImage->GetOC(); 469ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pOC && m_pRenderStatus->m_Options.m_pOCContext && 470ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann !m_pRenderStatus->m_Options.m_pOCContext->CheckOCGVisible(pOC)) { 471e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 472ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 473ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_ImageMatrix = m_pImageObject->m_Matrix; 474ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_ImageMatrix.Concat(*pObj2Device); 475ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (StartLoadDIBSource()) { 476ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 477ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 478ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return StartRenderDIBSource(); 479e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 480ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_ImageRenderer::Start(CPDF_RenderStatus* pStatus, 481ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_DIBSource* pDIBSource, 482ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_ARGB bitmap_argb, 483ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int bitmap_alpha, 484ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_Matrix* pImage2Device, 485ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD flags, 486ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bStdCS, 487ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int blendType) { 488ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pRenderStatus = pStatus; 489ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDIBSource = pDIBSource; 490ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_FillArgb = bitmap_argb; 491ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_BitmapAlpha = bitmap_alpha; 492ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_ImageMatrix = *pImage2Device; 493ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Flags = flags; 494ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_bStdCS = bStdCS; 495ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_BlendType = blendType; 496ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return StartDIBSource(); 497e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 498ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_ImageRenderer::DrawPatternImage(const CFX_Matrix* pObj2Device) { 499ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pRenderStatus->m_bPrint && 500ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) { 501ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Result = FALSE; 502e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 503ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 504ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_RECT rect = m_ImageMatrix.GetUnitRect().GetOutterRect(); 505ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann rect.Intersect(m_pRenderStatus->m_pDevice->GetClipBox()); 506ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (rect.IsEmpty()) { 507ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 508ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 509ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_Matrix new_matrix = m_ImageMatrix; 510ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann new_matrix.TranslateI(-rect.left, -rect.top); 511ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int width = rect.Width(); 512ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int height = rect.Height(); 513ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_FxgeDevice bitmap_device1; 514ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!bitmap_device1.Create(rect.Width(), rect.Height(), FXDIB_Rgb32)) { 515ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 516ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 517ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bitmap_device1.GetBitmap()->Clear(0xffffff); 518ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann { 519ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_RenderStatus bitmap_render; 520ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bitmap_render.Initialize(m_pRenderStatus->m_pContext, &bitmap_device1, NULL, 521ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann NULL, NULL, NULL, &m_pRenderStatus->m_Options, 0, 522ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pRenderStatus->m_bDropObjects, NULL, TRUE); 523ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_Matrix patternDevice = *pObj2Device; 524ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann patternDevice.Translate((FX_FLOAT)-rect.left, (FX_FLOAT)-rect.top); 525ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pPattern->m_PatternType == CPDF_Pattern::TILING) { 526ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bitmap_render.DrawTilingPattern( 527ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static_cast<CPDF_TilingPattern*>(m_pPattern), m_pImageObject, 528ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann &patternDevice, FALSE); 529e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 530ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bitmap_render.DrawShadingPattern( 531ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static_cast<CPDF_ShadingPattern*>(m_pPattern), m_pImageObject, 532ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann &patternDevice, FALSE); 533ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 534ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 535ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann { 536ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_FxgeDevice bitmap_device2; 537ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!bitmap_device2.Create(rect.Width(), rect.Height(), FXDIB_8bppRgb)) { 538ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 539ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 540ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bitmap_device2.GetBitmap()->Clear(0); 541ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_RenderStatus bitmap_render; 542ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bitmap_render.Initialize(m_pRenderStatus->m_pContext, &bitmap_device2, NULL, 543ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann NULL, NULL, NULL, NULL, 0, 544ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pRenderStatus->m_bDropObjects, NULL, TRUE); 545ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_ImageRenderer image_render; 546ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (image_render.Start(&bitmap_render, m_pDIBSource, 0xffffffff, 255, 547ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann &new_matrix, m_Flags, TRUE)) { 548ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann image_render.Continue(NULL); 549ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 550ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_Loader.m_MatteColor != 0xffffffff) { 551ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int matte_r = FXARGB_R(m_Loader.m_MatteColor); 552ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int matte_g = FXARGB_G(m_Loader.m_MatteColor); 553ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int matte_b = FXARGB_B(m_Loader.m_MatteColor); 554ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int row = 0; row < height; row++) { 555ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann uint8_t* dest_scan = 556ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann (uint8_t*)bitmap_device1.GetBitmap()->GetScanline(row); 557ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const uint8_t* mask_scan = bitmap_device2.GetBitmap()->GetScanline(row); 558ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int col = 0; col < width; col++) { 559ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int alpha = *mask_scan++; 560ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (alpha) { 561ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int orig = (*dest_scan - matte_b) * 255 / alpha + matte_b; 562ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (orig < 0) { 563ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann orig = 0; 564ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (orig > 255) { 565ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann orig = 255; 566e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 567ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *dest_scan++ = orig; 568ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann orig = (*dest_scan - matte_g) * 255 / alpha + matte_g; 569ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (orig < 0) { 570ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann orig = 0; 571ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (orig > 255) { 572ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann orig = 255; 573e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 574ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *dest_scan++ = orig; 575ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann orig = (*dest_scan - matte_r) * 255 / alpha + matte_r; 576ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (orig < 0) { 577ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann orig = 0; 578ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (orig > 255) { 579ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann orig = 255; 580e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 581ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *dest_scan++ = orig; 582ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dest_scan++; 583ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 584ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dest_scan += 4; 585ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 586ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 587ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 588ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 589ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bitmap_device2.GetBitmap()->ConvertFormat(FXDIB_8bppMask); 590ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bitmap_device1.GetBitmap()->MultiplyAlpha(bitmap_device2.GetBitmap()); 591ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bitmap_device1.GetBitmap()->MultiplyAlpha(255); 592ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 593ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pRenderStatus->m_pDevice->SetDIBits(bitmap_device1.GetBitmap(), rect.left, 594ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann rect.top, m_BlendType); 595ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 596e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 597ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_ImageRenderer::DrawMaskedImage() { 598ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pRenderStatus->m_bPrint && 599ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) { 600ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Result = FALSE; 601ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 602ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 603ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_RECT rect = m_ImageMatrix.GetUnitRect().GetOutterRect(); 604ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann rect.Intersect(m_pRenderStatus->m_pDevice->GetClipBox()); 605ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (rect.IsEmpty()) { 606ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 607ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 608ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_Matrix new_matrix = m_ImageMatrix; 609ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann new_matrix.TranslateI(-rect.left, -rect.top); 610ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int width = rect.Width(); 611ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int height = rect.Height(); 612ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_FxgeDevice bitmap_device1; 613ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!bitmap_device1.Create(width, height, FXDIB_Rgb32)) { 614e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 615ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 616ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bitmap_device1.GetBitmap()->Clear(0xffffff); 617ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann { 618ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_RenderStatus bitmap_render; 619ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bitmap_render.Initialize(m_pRenderStatus->m_pContext, &bitmap_device1, NULL, 620ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann NULL, NULL, NULL, NULL, 0, 621ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pRenderStatus->m_bDropObjects, NULL, TRUE); 622ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_ImageRenderer image_render; 623ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (image_render.Start(&bitmap_render, m_pDIBSource, 0, 255, &new_matrix, 624ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Flags, TRUE)) { 625ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann image_render.Continue(NULL); 626ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 627ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 628ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann { 629ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_FxgeDevice bitmap_device2; 630ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!bitmap_device2.Create(width, height, FXDIB_8bppRgb)) { 631ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 632ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 633ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bitmap_device2.GetBitmap()->Clear(0); 634ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_RenderStatus bitmap_render; 635ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bitmap_render.Initialize(m_pRenderStatus->m_pContext, &bitmap_device2, NULL, 636ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann NULL, NULL, NULL, NULL, 0, 637ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pRenderStatus->m_bDropObjects, NULL, TRUE); 638ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_ImageRenderer image_render; 639ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (image_render.Start(&bitmap_render, m_Loader.m_pMask, 0xffffffff, 255, 640ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann &new_matrix, m_Flags, TRUE)) { 641ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann image_render.Continue(NULL); 642ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 643ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_Loader.m_MatteColor != 0xffffffff) { 644ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int matte_r = FXARGB_R(m_Loader.m_MatteColor); 645ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int matte_g = FXARGB_G(m_Loader.m_MatteColor); 646ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int matte_b = FXARGB_B(m_Loader.m_MatteColor); 647ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int row = 0; row < height; row++) { 648ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann uint8_t* dest_scan = 649ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann (uint8_t*)bitmap_device1.GetBitmap()->GetScanline(row); 650ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const uint8_t* mask_scan = bitmap_device2.GetBitmap()->GetScanline(row); 651ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int col = 0; col < width; col++) { 652ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int alpha = *mask_scan++; 653ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (alpha) { 654ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int orig = (*dest_scan - matte_b) * 255 / alpha + matte_b; 655ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (orig < 0) { 656ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann orig = 0; 657ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (orig > 255) { 658ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann orig = 255; 659e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 660ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *dest_scan++ = orig; 661ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann orig = (*dest_scan - matte_g) * 255 / alpha + matte_g; 662ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (orig < 0) { 663ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann orig = 0; 664ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (orig > 255) { 665ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann orig = 255; 666e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 667ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *dest_scan++ = orig; 668ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann orig = (*dest_scan - matte_r) * 255 / alpha + matte_r; 669ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (orig < 0) { 670ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann orig = 0; 671ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (orig > 255) { 672ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann orig = 255; 673e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 674ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *dest_scan++ = orig; 675ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dest_scan++; 676ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 677ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dest_scan += 4; 678ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 679ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 680ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 681ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 682ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bitmap_device2.GetBitmap()->ConvertFormat(FXDIB_8bppMask); 683ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bitmap_device1.GetBitmap()->MultiplyAlpha(bitmap_device2.GetBitmap()); 684ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_BitmapAlpha < 255) { 685ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bitmap_device1.GetBitmap()->MultiplyAlpha(m_BitmapAlpha); 686ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 687ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 688ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pRenderStatus->m_pDevice->SetDIBits(bitmap_device1.GetBitmap(), rect.left, 689ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann rect.top, m_BlendType); 690ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 691ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 692ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_ImageRenderer::StartDIBSource() { 693ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!(m_Flags & RENDER_FORCE_DOWNSAMPLE) && m_pDIBSource->GetBPP() > 1) { 694ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int image_size = m_pDIBSource->GetBPP() / 8 * m_pDIBSource->GetWidth() * 695ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDIBSource->GetHeight(); 696ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (image_size > FPDF_HUGE_IMAGE_SIZE && 697ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann !(m_Flags & RENDER_FORCE_HALFTONE)) { 698ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Flags |= RENDER_FORCE_DOWNSAMPLE; 699ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 700ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 701ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pRenderStatus->m_pDevice->StartDIBits( 702ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDIBSource, m_BitmapAlpha, m_FillArgb, &m_ImageMatrix, m_Flags, 703ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_DeviceHandle, 0, NULL, m_BlendType)) { 704ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_DeviceHandle) { 705ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Status = 3; 706ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 707e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 708e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 709ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 710ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect(); 711ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_RECT image_rect = image_rect_f.GetOutterRect(); 712ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int dest_width = image_rect.Width(); 713ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int dest_height = image_rect.Height(); 714ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((FXSYS_fabs(m_ImageMatrix.b) >= 0.5f || m_ImageMatrix.a == 0) || 715ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann (FXSYS_fabs(m_ImageMatrix.c) >= 0.5f || m_ImageMatrix.d == 0)) { 716ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pRenderStatus->m_bPrint && 717ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) { 718ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Result = FALSE; 719ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 720ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 721ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_RECT clip_box = m_pRenderStatus->m_pDevice->GetClipBox(); 722ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann clip_box.Intersect(image_rect); 723ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Status = 2; 724ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pTransformer = new CFX_ImageTransformer; 725ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pTransformer->Start(m_pDIBSource, &m_ImageMatrix, m_Flags, &clip_box); 726ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 727ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 728ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_ImageMatrix.a < 0) { 729ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dest_width = -dest_width; 730ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 731ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_ImageMatrix.d > 0) { 732ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dest_height = -dest_height; 733ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 734ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int dest_left, dest_top; 735ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dest_left = dest_width > 0 ? image_rect.left : image_rect.right; 736ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dest_top = dest_height > 0 ? image_rect.top : image_rect.bottom; 737ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pDIBSource->IsOpaqueImage() && m_BitmapAlpha == 255) { 738ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pRenderStatus->m_pDevice->StretchDIBits( 739ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDIBSource, dest_left, dest_top, dest_width, dest_height, m_Flags, 740ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann NULL, m_BlendType)) { 741ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 742ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 743ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 744ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pDIBSource->IsAlphaMask()) { 745ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_BitmapAlpha != 255) { 746ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_FillArgb = FXARGB_MUL_ALPHA(m_FillArgb, m_BitmapAlpha); 747ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 748ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pRenderStatus->m_pDevice->StretchBitMask( 749ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDIBSource, dest_left, dest_top, dest_width, dest_height, 750ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_FillArgb, m_Flags)) { 751ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 752ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 753ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 754ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pRenderStatus->m_bPrint && 755ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) { 756ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Result = FALSE; 757ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 758ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 759ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_RECT clip_box = m_pRenderStatus->m_pDevice->GetClipBox(); 760ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_RECT dest_rect = clip_box; 761ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dest_rect.Intersect(image_rect); 762ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_RECT dest_clip( 763ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dest_rect.left - image_rect.left, dest_rect.top - image_rect.top, 764ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dest_rect.right - image_rect.left, dest_rect.bottom - image_rect.top); 765ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann std::unique_ptr<CFX_DIBitmap> pStretched( 766ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDIBSource->StretchTo(dest_width, dest_height, m_Flags, &dest_clip)); 767ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pStretched) { 768ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pRenderStatus->CompositeDIBitmap(pStretched.get(), dest_rect.left, 769ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dest_rect.top, m_FillArgb, m_BitmapAlpha, 770ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_BlendType, FALSE); 771ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 772ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 773e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 774ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_ImageRenderer::StartBitmapAlpha() { 775ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pDIBSource->IsOpaqueImage()) { 776ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_PathData path; 777ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann path.AppendRect(0, 0, 1, 1); 778ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann path.Transform(&m_ImageMatrix); 779ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD fill_color = 780ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ArgbEncode(0xff, m_BitmapAlpha, m_BitmapAlpha, m_BitmapAlpha); 781ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pRenderStatus->m_pDevice->DrawPath(&path, NULL, NULL, fill_color, 0, 782ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXFILL_WINDING); 783ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 784ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_DIBSource* pAlphaMask = m_pDIBSource->IsAlphaMask() 785ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ? m_pDIBSource 786ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann : m_pDIBSource->GetAlphaMask(); 787ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (FXSYS_fabs(m_ImageMatrix.b) >= 0.5f || 788ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_fabs(m_ImageMatrix.c) >= 0.5f) { 789ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int left, top; 790ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann std::unique_ptr<CFX_DIBitmap> pTransformed( 791ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pAlphaMask->TransformTo(&m_ImageMatrix, left, top)); 792ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pTransformed) 793ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 794ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 795ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pRenderStatus->m_pDevice->SetBitMask( 796ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pTransformed.get(), left, top, 797ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ArgbEncode(0xff, m_BitmapAlpha, m_BitmapAlpha, m_BitmapAlpha)); 798ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 799ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect(); 800ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_RECT image_rect = image_rect_f.GetOutterRect(); 801ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int dest_width = 802ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_ImageMatrix.a > 0 ? image_rect.Width() : -image_rect.Width(); 803ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int dest_height = 804ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_ImageMatrix.d > 0 ? -image_rect.Height() : image_rect.Height(); 805ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int left = dest_width > 0 ? image_rect.left : image_rect.right; 806ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int top = dest_height > 0 ? image_rect.top : image_rect.bottom; 807ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pRenderStatus->m_pDevice->StretchBitMask( 808ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pAlphaMask, left, top, dest_width, dest_height, 809ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ArgbEncode(0xff, m_BitmapAlpha, m_BitmapAlpha, m_BitmapAlpha)); 810ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 811ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pDIBSource != pAlphaMask) { 812ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann delete pAlphaMask; 813ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 814ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 815ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 816ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 817ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_ImageRenderer::Continue(IFX_Pause* pPause) { 818ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_Status == 2) { 819ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pTransformer->Continue(pPause)) { 820ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 821ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 822ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_DIBitmap* pBitmap = m_pTransformer->m_Storer.Detach(); 823ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pBitmap) { 824ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 825ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 826ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pBitmap->IsAlphaMask()) { 827ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_BitmapAlpha != 255) { 828ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_FillArgb = FXARGB_MUL_ALPHA(m_FillArgb, m_BitmapAlpha); 829ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 830ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Result = m_pRenderStatus->m_pDevice->SetBitMask( 831ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pBitmap, m_pTransformer->m_ResultLeft, m_pTransformer->m_ResultTop, 832ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_FillArgb); 833ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 834ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_BitmapAlpha != 255) { 835ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pBitmap->MultiplyAlpha(m_BitmapAlpha); 836ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 837ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Result = m_pRenderStatus->m_pDevice->SetDIBits( 838ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pBitmap, m_pTransformer->m_ResultLeft, m_pTransformer->m_ResultTop, 839ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_BlendType); 840ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 841ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann delete pBitmap; 842ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 843ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 844ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_Status == 3) { 845ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_pRenderStatus->m_pDevice->ContinueDIBits(m_DeviceHandle, pPause); 846ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 847ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_Status == 4) { 848ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_Loader.Continue(m_LoadHandle, pPause)) { 849ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 850ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 851ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (StartRenderDIBSource()) { 852ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return Continue(pPause); 853ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 854ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 855ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 856ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 857ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannICodec_ScanlineDecoder* FPDFAPI_CreateFlateDecoder( 858ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const uint8_t* src_buf, 859ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD src_size, 860ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int width, 861ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int height, 862ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int nComps, 863ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int bpc, 864ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CPDF_Dictionary* pParams); 865e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCFX_DIBitmap* CPDF_RenderStatus::LoadSMask(CPDF_Dictionary* pSMaskDict, 866ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_RECT* pClipRect, 867ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_Matrix* pMatrix) { 868ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pSMaskDict) { 869ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 870ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 871ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int width = pClipRect->right - pClipRect->left; 872ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int height = pClipRect->bottom - pClipRect->top; 873ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bLuminosity = FALSE; 874ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bLuminosity = pSMaskDict->GetConstString("S") != "Alpha"; 875ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Stream* pGroup = pSMaskDict->GetStream("G"); 876ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pGroup) { 877ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 878ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 879ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann std::unique_ptr<CPDF_Function> pFunc; 880ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pFuncObj = pSMaskDict->GetElementValue("TR"); 881ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFuncObj && (pFuncObj->IsDictionary() || pFuncObj->IsStream())) 882ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pFunc.reset(CPDF_Function::Load(pFuncObj)); 883ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 884ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_Matrix matrix = *pMatrix; 885ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann matrix.TranslateI(-pClipRect->left, -pClipRect->top); 886ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Form form(m_pContext->m_pDocument, m_pContext->m_pPageResources, pGroup); 887ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann form.ParseContent(NULL, NULL, NULL, NULL); 888ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_FxgeDevice bitmap_device; 889ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ 890ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!bitmap_device.Create(width, height, 891ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bLuminosity ? FXDIB_Rgb32 : FXDIB_8bppMask)) { 892ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 893ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 894e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#else 895ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!bitmap_device.Create(width, height, 896ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bLuminosity ? FXDIB_Rgb : FXDIB_8bppMask)) { 897ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 898ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 899e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 900ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_DIBitmap& bitmap = *bitmap_device.GetBitmap(); 901ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pCSObj = NULL; 902ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_ColorSpace* pCS = NULL; 903ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bLuminosity) { 904ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pBC = pSMaskDict->GetArray("BC"); 905ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_ARGB back_color = 0xff000000; 906ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pBC) { 907ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pDict = pGroup->GetDict(); 908ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pDict && pDict->GetDict("Group")) 909ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pCSObj = pDict->GetDict("Group")->GetElementValue("CS"); 910ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann else 911ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pCSObj = NULL; 912ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pCS = m_pContext->m_pDocument->LoadColorSpace(pCSObj); 913ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pCS) { 914ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FLOAT R, G, B; 915ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD comps = 8; 916ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pCS->CountComponents() > static_cast<int32_t>(comps)) { 917ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann comps = (FX_DWORD)pCS->CountComponents(); 918ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 919ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_FixedBufGrow<FX_FLOAT, 8> float_array(comps); 920ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FLOAT* pFloats = float_array; 921ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_SAFE_DWORD num_floats = comps; 922ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann num_floats *= sizeof(FX_FLOAT); 923ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!num_floats.IsValid()) { 924ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 925ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 926ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_memset(pFloats, 0, num_floats.ValueOrDie()); 927ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int count = pBC->GetCount() > 8 ? 8 : pBC->GetCount(); 928ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < count; i++) { 929ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pFloats[i] = pBC->GetNumber(i); 930ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 931ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pCS->GetRGB(pFloats, R, G, B); 932ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann back_color = 0xff000000 | ((int32_t)(R * 255) << 16) | 933ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ((int32_t)(G * 255) << 8) | (int32_t)(B * 255); 934ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pContext->m_pDocument->GetPageData()->ReleaseColorSpace(pCSObj); 935ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 936ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 937ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bitmap.Clear(back_color); 938ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 939ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bitmap.Clear(0); 940ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 941ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pFormResource = NULL; 942ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (form.m_pFormDict) { 943ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pFormResource = form.m_pFormDict->GetDict("Resources"); 944ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 945ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_RenderOptions options; 946ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann options.m_ColorMode = bLuminosity ? RENDER_COLOR_NORMAL : RENDER_COLOR_ALPHA; 947ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_RenderStatus status; 948ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann status.Initialize(m_pContext, &bitmap_device, NULL, NULL, NULL, NULL, 949ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann &options, 0, m_bDropObjects, pFormResource, TRUE, NULL, 0, 950ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pCS ? pCS->GetFamily() : 0, bLuminosity); 951ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann status.RenderObjectList(&form, &matrix); 952ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann std::unique_ptr<CFX_DIBitmap> pMask(new CFX_DIBitmap); 953ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pMask->Create(width, height, FXDIB_8bppMask)) 954ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 955ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 956ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann uint8_t* dest_buf = pMask->GetBuffer(); 957ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int dest_pitch = pMask->GetPitch(); 958ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann uint8_t* src_buf = bitmap.GetBuffer(); 959ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int src_pitch = bitmap.GetPitch(); 960ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann std::vector<uint8_t> transfers(256); 961ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFunc) { 962ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_FixedBufGrow<FX_FLOAT, 16> results(pFunc->CountOutputs()); 963ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < 256; i++) { 964ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FLOAT input = (FX_FLOAT)i / 255.0f; 965ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int nresult; 966ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pFunc->Call(&input, 1, results, nresult); 967ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann transfers[i] = FXSYS_round(results[0] * 255); 968ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 969ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 970ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < 256; i++) { 971ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann transfers[i] = i; 972ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 973ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 974ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bLuminosity) { 975ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int Bpp = bitmap.GetBPP() / 8; 976ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int row = 0; row < height; row++) { 977ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann uint8_t* dest_pos = dest_buf + row * dest_pitch; 978ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann uint8_t* src_pos = src_buf + row * src_pitch; 979ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int col = 0; col < width; col++) { 980ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *dest_pos++ = transfers[FXRGB2GRAY(src_pos[2], src_pos[1], *src_pos)]; 981ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann src_pos += Bpp; 982ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 983ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 984ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (pFunc) { 985ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int size = dest_pitch * height; 986ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < size; i++) { 987ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dest_buf[i] = transfers[src_buf[i]]; 988ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 989ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 990ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_memcpy(dest_buf, src_buf, dest_pitch * height); 991ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 992ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pMask.release(); 993e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 994