1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved. 2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Use of this source code is governed by a BSD-style license that can be 3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// found in the LICENSE file. 4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../../include/fxge/fx_ge.h" 8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../../include/fxcodec/fx_codec.h" 9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../../include/fpdfapi/fpdf_module.h" 10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../../include/fpdfapi/fpdf_render.h" 11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../../include/fpdfapi/fpdf_pageobj.h" 12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../fpdf_page/pageint.h" 13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "render_int.h" 14ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_RenderStatus::ProcessImage(CPDF_ImageObject* pImageObj, const CFX_AffineMatrix* pObj2Device) 15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_ImageRenderer render; 17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (render.Start(this, pImageObj, pObj2Device, m_bStdCS, m_curBlend)) { 18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov render.Continue(NULL); 19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef _FPDFAPI_MINI_ 21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_DitherBits) { 22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov DitherObjectArea(pImageObj, pObj2Device); 23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return render.m_Result; 26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if defined(_FPDFAPI_MINI_) 28ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_RenderStatus::ProcessInlines(CPDF_InlineImages* pInlines, const CFX_AffineMatrix* pObj2Device) 29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int bitmap_alpha = 255; 31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pInlines->m_GeneralState.IsNull()) { 32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bitmap_alpha = FXSYS_round(pInlines->m_GeneralState.GetObject()->m_FillAlpha * 255); 33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pInlines->m_pStream) { 35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_DIBSource dibsrc; 36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!dibsrc.Load(m_pContext->m_pDocument, pInlines->m_pStream, NULL, NULL, NULL, NULL)) { 37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pInlines->m_pBitmap = dibsrc.Clone(); 40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pInlines->m_pStream->Release(); 41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pInlines->m_pStream = NULL; 42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pInlines->m_pBitmap == NULL) { 44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_ARGB fill_argb = 0; 47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pInlines->m_pBitmap->IsAlphaMask()) { 48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov fill_argb = GetFillArgb(pInlines); 49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int flags = 0; 51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_Options.m_Flags & RENDER_FORCE_DOWNSAMPLE) { 52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov flags |= RENDER_FORCE_DOWNSAMPLE; 53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (m_Options.m_Flags & RENDER_FORCE_HALFTONE) { 54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov flags = 0; 55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < pInlines->m_Matrices.GetSize(); i ++) { 57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_AffineMatrix image_matrix = pInlines->m_Matrices.GetAt(i); 58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov image_matrix.Concat(*pObj2Device); 59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_ImageRenderer renderer; 60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (renderer.Start(this, pInlines->m_pBitmap, fill_argb, bitmap_alpha, &image_matrix, flags, FALSE, m_curBlend)) { 61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov renderer.Continue(NULL); 62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_RenderStatus::CompositeDIBitmap(CFX_DIBitmap* pDIBitmap, int left, int top, FX_ARGB mask_argb, 68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int bitmap_alpha, int blend_mode, int Transparency) 69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pDIBitmap == NULL) { 71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bIsolated = Transparency & PDFTRANS_ISOLATED; 74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bGroup = Transparency & PDFTRANS_GROUP; 75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (blend_mode == FXDIB_BLEND_NORMAL) { 76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pDIBitmap->IsAlphaMask()) { 77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bitmap_alpha < 255) { 78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pDIBitmap->MultiplyAlpha(bitmap_alpha); 79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pDevice->SetDIBits(pDIBitmap, left, top)) { 81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD fill_argb = m_Options.TranslateColor(mask_argb); 85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bitmap_alpha < 255) { 86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ((FX_BYTE*)&fill_argb)[3] = ((FX_BYTE*)&fill_argb)[3] * bitmap_alpha / 255; 87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pDevice->SetBitMask(pDIBitmap, left, top, fill_argb)) { 89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bBackAlphaRequired = blend_mode && bIsolated && !m_bDropObjects; 94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bGetBackGround = ((m_pDevice->GetRenderCaps() & FXRC_ALPHA_OUTPUT)) || 95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (!(m_pDevice->GetRenderCaps() & FXRC_ALPHA_OUTPUT) && (m_pDevice->GetRenderCaps() 96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov & FXRC_GET_BITS) && !bBackAlphaRequired); 97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bGetBackGround) { 98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bIsolated || !bGroup) { 99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pDIBitmap->IsAlphaMask()) { 100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDevice->SetDIBits(pDIBitmap, left, top, blend_mode); 103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_RECT rect(left, top, left + pDIBitmap->GetWidth(), top + pDIBitmap->GetHeight()); 105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rect.Intersect(m_pDevice->GetClipBox()); 106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_DIBitmap* pClone = NULL; 107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bClone = FALSE; 108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pDevice->GetBackDrop() && m_pDevice->GetBitmap()) { 109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bClone = TRUE; 110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pClone = m_pDevice->GetBackDrop()->Clone(&rect); 111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_DIBitmap *pForeBitmap = m_pDevice->GetBitmap(); 112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pClone->CompositeBitmap(0, 0, pClone->GetWidth(), pClone->GetHeight(), pForeBitmap, rect.left, rect.top); 113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov left = left >= 0 ? 0 : left; 114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov top = top >= 0 ? 0 : top; 115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pDIBitmap->IsAlphaMask()) 116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pClone->CompositeBitmap(0, 0, pClone->GetWidth(), pClone->GetHeight(), pDIBitmap, 117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov left, top, blend_mode); 118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pClone->CompositeMask(0, 0, pClone->GetWidth(), pClone->GetHeight(), pDIBitmap, 120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov mask_argb, left, top, blend_mode); 121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pClone = pDIBitmap; 123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pDevice->GetBackDrop()) { 125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDevice->SetDIBits(pClone, rect.left, rect.top); 126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pDIBitmap->IsAlphaMask()) { 128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDevice->SetDIBits(pDIBitmap, rect.left, rect.top, blend_mode); 131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bClone) { 133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete pClone; 134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int back_left, back_top; 139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_RECT rect(left, top, left + pDIBitmap->GetWidth(), top + pDIBitmap->GetHeight()); 140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_DIBitmap* pBackdrop = GetBackdrop(m_pCurObj, rect, back_left, back_top, blend_mode > FXDIB_BLEND_NORMAL && bIsolated); 141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pBackdrop) { 142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pDIBitmap->IsAlphaMask()) 145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pBackdrop->CompositeBitmap(left - back_left, top - back_top, pDIBitmap->GetWidth(), pDIBitmap->GetHeight(), pDIBitmap, 146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 0, 0, blend_mode); 147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pBackdrop->CompositeMask(left - back_left, top - back_top, pDIBitmap->GetWidth(), pDIBitmap->GetHeight(), pDIBitmap, 149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov mask_argb, 0, 0, blend_mode); 150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_DIBitmap* pBackdrop1 = FX_NEW CFX_DIBitmap; 151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pBackdrop1->Create(pBackdrop->GetWidth(), pBackdrop->GetHeight(), FXDIB_Rgb32); 152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pBackdrop1->Clear((FX_DWORD) - 1); 153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pBackdrop1->CompositeBitmap(0, 0, pBackdrop->GetWidth(), pBackdrop->GetHeight(), pBackdrop, 0, 0); 154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete pBackdrop; 155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pBackdrop = pBackdrop1; 156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDevice->SetDIBits(pBackdrop, back_left, back_top); 157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete pBackdrop; 158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 159ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_COLORREF CPDF_TransferFunc::TranslateColor(FX_COLORREF rgb) 160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FXSYS_RGB(m_Samples[FXSYS_GetRValue(rgb)], m_Samples[256 + FXSYS_GetGValue(rgb)], 162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Samples[512 + FXSYS_GetBValue(rgb)]); 163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 164ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_DIBSource* CPDF_TransferFunc::TranslateImage(const CFX_DIBSource* pSrc, FX_BOOL bAutoDropSrc) 165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_DIBTransferFunc* pDest = FX_NEW CPDF_DIBTransferFunc(this); 167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pDest->LoadSrc(pSrc, bAutoDropSrc); 168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pDest; 169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 170ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFXDIB_Format CPDF_DIBTransferFunc::GetDestFormat() 171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pSrc->IsAlphaMask()) { 173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FXDIB_8bppMask; 174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ 176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (m_pSrc->HasAlpha()) ? FXDIB_Argb : FXDIB_Rgb32; 177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (m_pSrc->HasAlpha()) ? FXDIB_Argb : FXDIB_Rgb; 179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 181ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_DIBTransferFunc::CPDF_DIBTransferFunc(const CPDF_TransferFunc* pTransferFunc) 182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_RampR = pTransferFunc->m_Samples; 184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_RampG = &pTransferFunc->m_Samples[256]; 185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_RampB = &pTransferFunc->m_Samples[512]; 186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_DIBTransferFunc::TranslateScanline(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf) const 188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int i; 190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bSkip = FALSE; 191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch (m_pSrc->GetFormat()) { 192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case FXDIB_1bppRgb: { 193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int r0 = m_RampR[0], g0 = m_RampG[0], b0 = m_RampB[0]; 194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int r1 = m_RampR[255], g1 = m_RampG[255], b1 = m_RampB[255]; 195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < m_Width; i ++) { 196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (src_buf[i / 8] & (1 << (7 - i % 8))) { 197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_buf++ = b1; 198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_buf++ = g1; 199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_buf++ = r1; 200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_buf++ = b0; 202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_buf++ = g0; 203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_buf++ = r0; 204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ 206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_buf++; 207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case FXDIB_1bppMask: { 212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int m0 = m_RampR[0], m1 = m_RampR[255]; 213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < m_Width; i ++) { 214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (src_buf[i / 8] & (1 << (7 - i % 8))) { 215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_buf++ = m1; 216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_buf++ = m0; 218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case FXDIB_8bppRgb: { 223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_ARGB* pPal = m_pSrc->GetPalette(); 224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < m_Width; i ++) { 225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pPal) { 226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_ARGB src_argb = pPal[*src_buf]; 227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_buf++ = m_RampB[FXARGB_R(src_argb)]; 228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_buf++ = m_RampG[FXARGB_G(src_argb)]; 229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_buf++ = m_RampR[FXARGB_B(src_argb)]; 230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD src_byte = *src_buf; 232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_buf++ = m_RampB[src_byte]; 233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_buf++ = m_RampG[src_byte]; 234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_buf++ = m_RampR[src_byte]; 235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov src_buf ++; 237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ 238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_buf++; 239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case FXDIB_8bppMask: 244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < m_Width; i ++) { 245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_buf++ = m_RampR[*(src_buf++)]; 246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case FXDIB_Rgb: 249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < m_Width; i ++) { 250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_buf++ = m_RampB[*(src_buf++)]; 251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_buf++ = m_RampG[*(src_buf++)]; 252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_buf++ = m_RampR[*(src_buf++)]; 253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ 254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_buf++; 255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case FXDIB_Rgb32: 259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bSkip = TRUE; 260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case FXDIB_Argb: 261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < m_Width; i ++) { 262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_buf++ = m_RampB[*(src_buf++)]; 263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_buf++ = m_RampG[*(src_buf++)]; 264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_buf++ = m_RampR[*(src_buf++)]; 265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bSkip) { 266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_buf++ = *src_buf; 267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ 269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_buf++; 271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov src_buf ++; 274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov default: 277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_DIBTransferFunc::TranslateDownSamples(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf, int pixels, int Bpp) const 281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (Bpp == 8) { 283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < pixels; i ++) { 284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_buf++ = m_RampR[*(src_buf++)]; 285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (Bpp == 24) { 287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < pixels; i ++) { 288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_buf++ = m_RampB[*(src_buf++)]; 289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_buf++ = m_RampG[*(src_buf++)]; 290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_buf++ = m_RampR[*(src_buf++)]; 291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ 294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_pSrc->HasAlpha()) { 295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < pixels; i ++) { 296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_buf++ = m_RampB[*(src_buf++)]; 297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_buf++ = m_RampG[*(src_buf++)]; 298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_buf++ = m_RampR[*(src_buf++)]; 299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_buf++; 300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov src_buf++; 301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else 303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < pixels; i ++) { 305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_buf++ = m_RampB[*(src_buf++)]; 306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_buf++ = m_RampG[*(src_buf++)]; 307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_buf++ = m_RampR[*(src_buf++)]; 308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_buf++ = *(src_buf++); 309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic FX_BOOL _IsSupported(CPDF_ColorSpace* pCS) 313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pCS->GetFamily() == PDFCS_DEVICERGB || pCS->GetFamily() == PDFCS_DEVICEGRAY || 315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pCS->GetFamily() == PDFCS_DEVICECMYK || pCS->GetFamily() == PDFCS_CALGRAY || 316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pCS->GetFamily() == PDFCS_CALRGB) { 317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pCS->GetFamily() == PDFCS_INDEXED && _IsSupported(pCS->GetBaseCS())) { 320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 324ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_ImageRenderer::CPDF_ImageRenderer() 325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pRenderStatus = NULL; 327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pImageObject = NULL; 328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Result = TRUE; 329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Status = 0; 330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pQuickStretcher = NULL; 331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pTransformer = NULL; 332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_DeviceHandle = NULL; 333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_LoadHandle = NULL; 334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pClone = NULL; 335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bStdCS = FALSE; 336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bPatternColor = FALSE; 337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_BlendType = FXDIB_BLEND_NORMAL; 338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pPattern = NULL; 339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pObj2Device = NULL; 340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 341ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_ImageRenderer::~CPDF_ImageRenderer() 342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pQuickStretcher) { 344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete m_pQuickStretcher; 345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pTransformer) { 347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete m_pTransformer; 348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_DeviceHandle) { 350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pRenderStatus->m_pDevice->CancelDIBits(m_DeviceHandle); 351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_LoadHandle) { 353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete (CPDF_ProgressiveImageLoaderHandle*)m_LoadHandle; 354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pClone) { 356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete m_pClone; 357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 359ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_ImageRenderer::StartLoadDIBSource() 360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect(); 362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_RECT image_rect = image_rect_f.GetOutterRect(); 363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int dest_width = image_rect.Width(); 364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int dest_height = image_rect.Height(); 365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_ImageMatrix.a < 0) { 366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_width = -dest_width; 367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_ImageMatrix.d > 0) { 369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_height = -dest_height; 370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_Loader.StartLoadImage(m_pImageObject, m_pRenderStatus->m_pContext->m_pPageCache, m_LoadHandle, m_bStdCS, 372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pRenderStatus->m_GroupFamily, m_pRenderStatus->m_bLoadMask, m_pRenderStatus, dest_width, dest_height)) { 373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_LoadHandle != NULL) { 374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Status = 4; 375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 381ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_ImageRenderer::StartRenderDIBSource() 382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_Loader.m_pBitmap == NULL) { 384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_BitmapAlpha = 255; 387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const CPDF_GeneralStateData* pGeneralState = m_pImageObject->m_GeneralState; 388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pGeneralState) { 389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_BitmapAlpha = FXSYS_round(pGeneralState->m_FillAlpha * 255); 390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDIBSource = m_Loader.m_pBitmap; 392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pRenderStatus->m_Options.m_ColorMode == RENDER_COLOR_ALPHA && m_Loader.m_pMask == NULL) { 393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return StartBitmapAlpha(); 394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef _FPDFAPI_MINI_ 396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pGeneralState && pGeneralState->m_pTR) { 397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pGeneralState->m_pTransferFunc) { 398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ((CPDF_GeneralStateData*)pGeneralState)->m_pTransferFunc = m_pRenderStatus->GetTransferFunc(pGeneralState->m_pTR); 399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pGeneralState->m_pTransferFunc && !pGeneralState->m_pTransferFunc->m_bIdentity) { 401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDIBSource = m_Loader.m_pBitmap = pGeneralState->m_pTransferFunc->TranslateImage(m_Loader.m_pBitmap, !m_Loader.m_bCached); 402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_Loader.m_bCached && m_Loader.m_pMask) { 403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Loader.m_pMask = m_Loader.m_pMask->Clone(); 404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Loader.m_bCached = FALSE; 406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_FillArgb = 0; 410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bPatternColor = FALSE; 411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pPattern = NULL; 412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pDIBSource->IsAlphaMask()) { 413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Color* pColor = m_pImageObject->m_ColorState.GetFillColor(); 414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pColor && pColor->IsPattern()) { 415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pPattern = pColor->GetPattern(); 416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pPattern != NULL) { 417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bPatternColor = TRUE; 418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_FillArgb = m_pRenderStatus->GetFillArgb(m_pImageObject); 421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (m_pRenderStatus->m_Options.m_ColorMode == RENDER_COLOR_GRAY) { 422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pClone = m_pDIBSource->Clone(); 423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pClone->ConvertColorScale(m_pRenderStatus->m_Options.m_BackColor, m_pRenderStatus->m_Options.m_ForeColor); 424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDIBSource = m_pClone; 425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Flags = 0; 427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if !defined(_FPDFAPI_MINI_) 428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pRenderStatus->m_Options.m_Flags & RENDER_FORCE_DOWNSAMPLE) { 429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Flags |= RENDER_FORCE_DOWNSAMPLE; 430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (m_pRenderStatus->m_Options.m_Flags & RENDER_FORCE_HALFTONE) { 431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Flags |= RENDER_FORCE_HALFTONE; 432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!(m_pRenderStatus->m_Options.m_Flags & RENDER_FORCE_HALFTONE)) { 435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pRenderStatus->m_HalftoneLimit) { 436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect(); 437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_RECT image_rect = image_rect_f.GetOutterRect(); 438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_RECT image_clip = image_rect; 439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov image_rect.Intersect(m_pRenderStatus->m_pDevice->GetClipBox()); 440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (image_rect.Width() && image_rect.Height()) { 441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((image_clip.Width() * m_pDIBSource->GetWidth() / image_rect.Width()) * 442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (image_clip.Height() * m_pDIBSource->GetHeight() / image_rect.Height()) > 443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pRenderStatus->m_HalftoneLimit) { 444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Flags |= RENDER_FORCE_DOWNSAMPLE; 445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Flags |= RENDER_FORCE_DOWNSAMPLE; 449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef _FPDFAPI_MINI_ 453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pRenderStatus->m_pDevice->GetDeviceClass() != FXDC_DISPLAY) { 454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object* pFilters = m_pImageObject->m_pImage->GetStream()->GetDict()->GetElementValue(FX_BSTRC("Filter")); 455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pFilters) { 456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pFilters->GetType() == PDFOBJ_NAME) { 457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteStringC bsDecodeType = pFilters->GetConstString(); 458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bsDecodeType == FX_BSTRC("DCTDecode") || bsDecodeType == FX_BSTRC("JPXDecode")) { 459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Flags |= FXRENDER_IMAGE_LOSSY; 460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (pFilters->GetType() == PDFOBJ_ARRAY) { 462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Array* pArray = (CPDF_Array*)pFilters; 463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) { 464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteStringC bsDecodeType = pArray->GetConstString(i); 465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bsDecodeType == FX_BSTRC("DCTDecode") || bsDecodeType == FX_BSTRC("JPXDecode")) { 466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Flags |= FXRENDER_IMAGE_LOSSY; 467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pRenderStatus->m_Options.m_Flags & RENDER_NOIMAGESMOOTH) { 474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Flags |= FXDIB_NOSMOOTH; 475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (m_pImageObject->m_pImage->IsInterpol()) { 476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Flags |= FXDIB_INTERPOL; 477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_Loader.m_pMask) { 480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return DrawMaskedImage(); 481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bPatternColor) { 483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return DrawPatternImage(m_pObj2Device); 484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_) 486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_BitmapAlpha == 255 && pGeneralState && pGeneralState->m_FillOP && 487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pGeneralState->m_OPMode == 0 && pGeneralState->m_BlendType == FXDIB_BLEND_NORMAL && pGeneralState->m_StrokeAlpha == 1 && pGeneralState->m_FillAlpha == 1) { 488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Document* pDocument = NULL; 489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Page* pPage = NULL; 490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pRenderStatus->m_pContext->m_pPageCache) { 491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPage = m_pRenderStatus->m_pContext->m_pPageCache->GetPage(); 492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pDocument = pPage->m_pDocument; 493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pDocument = m_pImageObject->m_pImage->GetDocument(); 495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pPageResources = pPage ? pPage->m_pPageResources : NULL; 497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object* pCSObj = m_pImageObject->m_pImage->GetStream()->GetDict()->GetElementValue(FX_BSTRC("ColorSpace")); 498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_ColorSpace* pColorSpace = pDocument->LoadColorSpace(pCSObj, pPageResources); 499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pColorSpace) { 500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int format = pColorSpace->GetFamily(); 501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (format == PDFCS_DEVICECMYK || format == PDFCS_SEPARATION || format == PDFCS_DEVICEN) { 502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_BlendType = FXDIB_BLEND_DARKEN; 503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pDocument->GetPageData()->ReleaseColorSpace(pCSObj); 505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return StartDIBSource(); 509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 510ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_ImageRenderer::Start(CPDF_RenderStatus* pStatus, const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStdCS, int blendType) 511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pRenderStatus = pStatus; 513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bStdCS = bStdCS; 514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pImageObject = (CPDF_ImageObject*)pObj; 515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_BlendType = blendType; 516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pObj2Device = pObj2Device; 517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef _FPDFAPI_MINI_ 518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pOC = m_pImageObject->m_pImage->GetOC(); 519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pOC && m_pRenderStatus->m_Options.m_pOCContext && !m_pRenderStatus->m_Options.m_pOCContext->CheckOCGVisible(pOC)) { 520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_ImageMatrix = m_pImageObject->m_Matrix; 524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_ImageMatrix.Concat(*pObj2Device); 525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (StartLoadDIBSource()) { 526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return StartRenderDIBSource(); 529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 530ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_ImageRenderer::Start(CPDF_RenderStatus* pStatus, const CFX_DIBSource* pDIBSource, FX_ARGB bitmap_argb, 531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int bitmap_alpha, const CFX_AffineMatrix* pImage2Device, FX_DWORD flags, FX_BOOL bStdCS, int blendType) 532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pRenderStatus = pStatus; 534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDIBSource = pDIBSource; 535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_FillArgb = bitmap_argb; 536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_BitmapAlpha = bitmap_alpha; 537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_ImageMatrix = *pImage2Device; 538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Flags = flags; 539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bStdCS = bStdCS; 540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_BlendType = blendType; 541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return StartDIBSource(); 542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 543ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_ImageRenderer::DrawPatternImage(const CFX_Matrix* pObj2Device) 544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pRenderStatus->m_bPrint && !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) { 546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Result = FALSE; 547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_RECT rect = m_ImageMatrix.GetUnitRect().GetOutterRect(); 550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rect.Intersect(m_pRenderStatus->m_pDevice->GetClipBox()); 551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (rect.IsEmpty()) { 552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_AffineMatrix new_matrix = m_ImageMatrix; 555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov new_matrix.TranslateI(-rect.left, -rect.top); 556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int width = rect.Width(); 557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int height = rect.Height(); 558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_FxgeDevice bitmap_device1; 559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bitmap_device1.Create(rect.Width(), rect.Height(), FXDIB_Rgb32)) { 560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bitmap_device1.GetBitmap()->Clear(0xffffff); 563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_RenderStatus bitmap_render; 565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bitmap_render.Initialize(m_pRenderStatus->m_Level + 1, m_pRenderStatus->m_pContext, &bitmap_device1, NULL, NULL, 566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov NULL, NULL, &m_pRenderStatus->m_Options, 0, m_pRenderStatus->m_bDropObjects, NULL, TRUE); 567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_Matrix patternDevice = *pObj2Device; 568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov patternDevice.Translate((FX_FLOAT) - rect.left, (FX_FLOAT) - rect.top); 569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(m_pPattern->m_PatternType == PATTERN_TILING) { 570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bitmap_render.DrawTilingPattern((CPDF_TilingPattern*)m_pPattern, m_pImageObject, &patternDevice, FALSE); 571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bitmap_render.DrawShadingPattern((CPDF_ShadingPattern*)m_pPattern, m_pImageObject, &patternDevice, FALSE); 573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_FxgeDevice bitmap_device2; 577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bitmap_device2.Create(rect.Width(), rect.Height(), FXDIB_8bppRgb)) { 578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bitmap_device2.GetBitmap()->Clear(0); 581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_RenderStatus bitmap_render; 582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bitmap_render.Initialize(m_pRenderStatus->m_Level + 1, m_pRenderStatus->m_pContext, &bitmap_device2, NULL, NULL, 583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov NULL, NULL, NULL, 0, m_pRenderStatus->m_bDropObjects, NULL, TRUE); 584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_ImageRenderer image_render; 585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (image_render.Start(&bitmap_render, m_pDIBSource, 0xffffffff, 255, &new_matrix, m_Flags, TRUE)) { 586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov image_render.Continue(NULL); 587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_Loader.m_MatteColor != 0xffffffff) { 589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int matte_r = FXARGB_R(m_Loader.m_MatteColor); 590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int matte_g = FXARGB_G(m_Loader.m_MatteColor); 591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int matte_b = FXARGB_B(m_Loader.m_MatteColor); 592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int row = 0; row < height; row ++) { 593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPBYTE dest_scan = (FX_LPBYTE)bitmap_device1.GetBitmap()->GetScanline(row); 594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCBYTE mask_scan = bitmap_device2.GetBitmap()->GetScanline(row); 595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int col = 0; col < width; col ++) { 596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int alpha = *mask_scan ++; 597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (alpha) { 598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int orig = (*dest_scan - matte_b) * 255 / alpha + matte_b; 599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (orig < 0) { 600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov orig = 0; 601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (orig > 255) { 602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov orig = 255; 603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_scan++ = orig; 605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov orig = (*dest_scan - matte_g) * 255 / alpha + matte_g; 606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (orig < 0) { 607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov orig = 0; 608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (orig > 255) { 609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov orig = 255; 610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_scan++ = orig; 612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov orig = (*dest_scan - matte_r) * 255 / alpha + matte_r; 613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (orig < 0) { 614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov orig = 0; 615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (orig > 255) { 616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov orig = 255; 617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_scan++ = orig; 619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_scan ++; 620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_scan += 4; 622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bitmap_device2.GetBitmap()->ConvertFormat(FXDIB_8bppMask); 627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bitmap_device1.GetBitmap()->MultiplyAlpha(bitmap_device2.GetBitmap()); 628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bitmap_device1.GetBitmap()->MultiplyAlpha(255); 629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pRenderStatus->m_pDevice->SetDIBits(bitmap_device1.GetBitmap(), rect.left, rect.top, m_BlendType); 631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 633ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_ImageRenderer::DrawMaskedImage() 634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pRenderStatus->m_bPrint && !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) { 636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Result = FALSE; 637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_RECT rect = m_ImageMatrix.GetUnitRect().GetOutterRect(); 640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rect.Intersect(m_pRenderStatus->m_pDevice->GetClipBox()); 641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (rect.IsEmpty()) { 642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_AffineMatrix new_matrix = m_ImageMatrix; 645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov new_matrix.TranslateI(-rect.left, -rect.top); 646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int width = rect.Width(); 647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int height = rect.Height(); 648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_FxgeDevice bitmap_device1; 649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bitmap_device1.Create(width, height, FXDIB_Rgb32)) { 650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bitmap_device1.GetBitmap()->Clear(0xffffff); 653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_RenderStatus bitmap_render; 655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bitmap_render.Initialize(m_pRenderStatus->m_Level + 1, m_pRenderStatus->m_pContext, &bitmap_device1, NULL, NULL, 656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov NULL, NULL, NULL, 0, m_pRenderStatus->m_bDropObjects, NULL, TRUE); 657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_ImageRenderer image_render; 658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (image_render.Start(&bitmap_render, m_pDIBSource, 0, 255, &new_matrix, m_Flags, TRUE)) { 659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov image_render.Continue(NULL); 660ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_FxgeDevice bitmap_device2; 664ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bitmap_device2.Create(width, height, FXDIB_8bppRgb)) { 665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 667ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bitmap_device2.GetBitmap()->Clear(0); 668ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_RenderStatus bitmap_render; 669ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bitmap_render.Initialize(m_pRenderStatus->m_Level + 1, m_pRenderStatus->m_pContext, &bitmap_device2, NULL, NULL, 670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov NULL, NULL, NULL, 0, m_pRenderStatus->m_bDropObjects, NULL, TRUE); 671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_ImageRenderer image_render; 672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (image_render.Start(&bitmap_render, m_Loader.m_pMask, 0xffffffff, 255, &new_matrix, m_Flags, TRUE)) { 673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov image_render.Continue(NULL); 674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 675ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_Loader.m_MatteColor != 0xffffffff) { 676ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int matte_r = FXARGB_R(m_Loader.m_MatteColor); 677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int matte_g = FXARGB_G(m_Loader.m_MatteColor); 678ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int matte_b = FXARGB_B(m_Loader.m_MatteColor); 679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int row = 0; row < height; row ++) { 680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPBYTE dest_scan = (FX_LPBYTE)bitmap_device1.GetBitmap()->GetScanline(row); 681ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCBYTE mask_scan = bitmap_device2.GetBitmap()->GetScanline(row); 682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int col = 0; col < width; col ++) { 683ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int alpha = *mask_scan ++; 684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (alpha) { 685ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int orig = (*dest_scan - matte_b) * 255 / alpha + matte_b; 686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (orig < 0) { 687ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov orig = 0; 688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (orig > 255) { 689ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov orig = 255; 690ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_scan++ = orig; 692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov orig = (*dest_scan - matte_g) * 255 / alpha + matte_g; 693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (orig < 0) { 694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov orig = 0; 695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (orig > 255) { 696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov orig = 255; 697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_scan++ = orig; 699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov orig = (*dest_scan - matte_r) * 255 / alpha + matte_r; 700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (orig < 0) { 701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov orig = 0; 702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (orig > 255) { 703ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov orig = 255; 704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_scan++ = orig; 706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_scan ++; 707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_scan += 4; 709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 710ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 712ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bitmap_device2.GetBitmap()->ConvertFormat(FXDIB_8bppMask); 714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bitmap_device1.GetBitmap()->MultiplyAlpha(bitmap_device2.GetBitmap()); 715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_BitmapAlpha < 255) { 716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bitmap_device1.GetBitmap()->MultiplyAlpha(m_BitmapAlpha); 717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 719ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pRenderStatus->m_pDevice->SetDIBits(bitmap_device1.GetBitmap(), rect.left, rect.top, m_BlendType); 720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 722ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_ImageRenderer::StartDIBSource() 723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if !defined(_FPDFAPI_MINI_) 725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!(m_Flags & RENDER_FORCE_DOWNSAMPLE) && m_pDIBSource->GetBPP() > 1) { 726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int image_size = m_pDIBSource->GetBPP() / 8 * m_pDIBSource->GetWidth() * m_pDIBSource->GetHeight(); 727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (image_size > FPDF_HUGE_IMAGE_SIZE && !(m_Flags & RENDER_FORCE_HALFTONE)) { 728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Flags |= RENDER_FORCE_DOWNSAMPLE; 729ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 731ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 732ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pRenderStatus->m_pDevice->StartDIBits(m_pDIBSource, m_BitmapAlpha, m_FillArgb, 733ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov &m_ImageMatrix, m_Flags, m_DeviceHandle, 0, NULL, m_BlendType)) { 734ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_DeviceHandle != NULL) { 735ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Status = 3; 736ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 737ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 738ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 739ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 740ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_) 741ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect(); 742ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_RECT image_rect = image_rect_f.GetOutterRect(); 743ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int dest_width = image_rect.Width(); 744ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int dest_height = image_rect.Height(); 745ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((FXSYS_fabs(m_ImageMatrix.b) >= 0.5f || m_ImageMatrix.a == 0) || 746ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FXSYS_fabs(m_ImageMatrix.c) >= 0.5f || m_ImageMatrix.d == 0) ) { 747ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pRenderStatus->m_bPrint && !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) { 748ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Result = FALSE; 749ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 750ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 751ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_RECT clip_box = m_pRenderStatus->m_pDevice->GetClipBox(); 752ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov clip_box.Intersect(image_rect); 753ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Status = 2; 754ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pTransformer = FX_NEW CFX_ImageTransformer; 755ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pTransformer->Start(m_pDIBSource, &m_ImageMatrix, m_Flags, &clip_box); 756ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 757ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 758ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_ImageMatrix.a < 0) { 759ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_width = -dest_width; 760ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 761ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_ImageMatrix.d > 0) { 762ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_height = -dest_height; 763ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 764ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int dest_left, dest_top; 765ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_left = dest_width > 0 ? image_rect.left : image_rect.right; 766ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_top = dest_height > 0 ? image_rect.top : image_rect.bottom; 767ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pDIBSource->IsOpaqueImage() && m_BitmapAlpha == 255) { 768ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pRenderStatus->m_pDevice->StretchDIBits(m_pDIBSource, dest_left, dest_top, 769ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_width, dest_height, m_Flags, NULL, m_BlendType)) { 770ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 771ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 772ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 773ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pDIBSource->IsAlphaMask()) { 774ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_BitmapAlpha != 255) { 775ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_FillArgb = FXARGB_MUL_ALPHA(m_FillArgb, m_BitmapAlpha); 776ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 777ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pRenderStatus->m_pDevice->StretchBitMask(m_pDIBSource, dest_left, dest_top, dest_width, dest_height, m_FillArgb, m_Flags)) { 778ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 779ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 780ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 781ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pRenderStatus->m_bPrint && !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) { 782ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Result = FALSE; 783ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 784ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 785ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_RECT clip_box = m_pRenderStatus->m_pDevice->GetClipBox(); 786ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_RECT dest_rect = clip_box; 787ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_rect.Intersect(image_rect); 788ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_RECT dest_clip(dest_rect.left - image_rect.left, dest_rect.top - image_rect.top, 789ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_rect.right - image_rect.left, dest_rect.bottom - image_rect.top); 790ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_DIBitmap* pStretched = m_pDIBSource->StretchTo(dest_width, dest_height, m_Flags, &dest_clip); 791ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pStretched) { 792ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pRenderStatus->CompositeDIBitmap(pStretched, dest_rect.left, dest_rect.top, m_FillArgb, 793ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_BitmapAlpha, m_BlendType, FALSE); 794ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete pStretched; 795ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pStretched = NULL; 796ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 797ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 798ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 799ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 800ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_ImageRenderer::StartBitmapAlpha() 801ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 802ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef _FPDFAPI_MINI_ 803ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pDIBSource->IsOpaqueImage()) { 804ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_PathData path; 805ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov path.AppendRect(0, 0, 1, 1); 806ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov path.Transform(&m_ImageMatrix); 807ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD fill_color = ArgbEncode(0xff, m_BitmapAlpha, m_BitmapAlpha, m_BitmapAlpha); 808ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pRenderStatus->m_pDevice->DrawPath(&path, NULL, NULL, fill_color, 0, FXFILL_WINDING); 809ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 810ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const CFX_DIBSource* pAlphaMask = m_pDIBSource->IsAlphaMask() ? m_pDIBSource : m_pDIBSource->GetAlphaMask(); 811ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (FXSYS_fabs(m_ImageMatrix.b) >= 0.5f || FXSYS_fabs(m_ImageMatrix.c) >= 0.5f) { 812ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int left, top; 813ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_DIBitmap* pTransformed = pAlphaMask->TransformTo(&m_ImageMatrix, left, top); 814ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pTransformed == NULL) { 815ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 816ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 817ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pRenderStatus->m_pDevice->SetBitMask(pTransformed, left, top, ArgbEncode(0xff, m_BitmapAlpha, m_BitmapAlpha, m_BitmapAlpha)); 818ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete pTransformed; 819ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 820ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect(); 821ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_RECT image_rect = image_rect_f.GetOutterRect(); 822ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int dest_width = m_ImageMatrix.a > 0 ? image_rect.Width() : -image_rect.Width(); 823ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int dest_height = m_ImageMatrix.d > 0 ? -image_rect.Height() : image_rect.Height(); 824ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int left = dest_width > 0 ? image_rect.left : image_rect.right; 825ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int top = dest_height > 0 ? image_rect.top : image_rect.bottom; 826ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pRenderStatus->m_pDevice->StretchBitMask(pAlphaMask, left, top, dest_width, dest_height, 827ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ArgbEncode(0xff, m_BitmapAlpha, m_BitmapAlpha, m_BitmapAlpha)); 828ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 829ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pDIBSource != pAlphaMask) { 830ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete pAlphaMask; 831ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 832ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 833ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 834ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 835ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 836ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_ImageRenderer::Continue(IFX_Pause* pPause) 837ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 838ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_Status == 1) { 839ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef _FPDFAPI_MINI_ 840ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pQuickStretcher->Continue(pPause)) { 841ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 842ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 843ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pQuickStretcher->m_pBitmap->IsAlphaMask()) 844ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pRenderStatus->m_pDevice->SetBitMask(m_pQuickStretcher->m_pBitmap, m_pQuickStretcher->m_ResultLeft, 845ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pQuickStretcher->m_ResultTop, m_FillArgb); 846ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 847ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pRenderStatus->m_pDevice->SetDIBits(m_pQuickStretcher->m_pBitmap, m_pQuickStretcher->m_ResultLeft, 848ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pQuickStretcher->m_ResultTop, m_BlendType); 849ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 850ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 851ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (m_Status == 2) { 852ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_) 853ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pTransformer->Continue(pPause)) { 854ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 855ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 856ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_DIBitmap* pBitmap = m_pTransformer->m_Storer.Detach(); 857ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pBitmap == NULL) { 858ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 859ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 860ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pBitmap->IsAlphaMask()) { 861ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_BitmapAlpha != 255) { 862ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_FillArgb = FXARGB_MUL_ALPHA(m_FillArgb, m_BitmapAlpha); 863ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 864ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Result = m_pRenderStatus->m_pDevice->SetBitMask(pBitmap, 865ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pTransformer->m_ResultLeft, m_pTransformer->m_ResultTop, m_FillArgb); 866ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 867ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_BitmapAlpha != 255) { 868ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pBitmap->MultiplyAlpha(m_BitmapAlpha); 869ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 870ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Result = m_pRenderStatus->m_pDevice->SetDIBits(pBitmap, 871ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pTransformer->m_ResultLeft, m_pTransformer->m_ResultTop, m_BlendType); 872ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 873ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete pBitmap; 874ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 875ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 876ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (m_Status == 3) { 877ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_pRenderStatus->m_pDevice->ContinueDIBits(m_DeviceHandle, pPause); 878ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (m_Status == 4) { 879ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_Loader.Continue(m_LoadHandle, pPause)) { 880ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 881ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 882ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (StartRenderDIBSource()) { 883ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return Continue(pPause); 884ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 885ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 886ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 887ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 888ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 889ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_QuickStretcher::CPDF_QuickStretcher() 890ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 891ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pBitmap = NULL; 892ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDecoder = NULL; 893ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCS = NULL; 894ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 895ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_QuickStretcher::~CPDF_QuickStretcher() 896ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 897ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pBitmap) { 898ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete m_pBitmap; 899ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 900ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pCS) { 901ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCS->ReleaseCS(); 902ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 903ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pDecoder) { 904ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete m_pDecoder; 905ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 906ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 907ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovICodec_ScanlineDecoder* FPDFAPI_CreateFlateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height, 908ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int nComps, int bpc, const CPDF_Dictionary* pParams); 909ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_QuickStretcher::Start(CPDF_ImageObject* pImageObj, CFX_AffineMatrix* pImage2Device, const FX_RECT* pClipBox) 910ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 911ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (FXSYS_fabs(pImage2Device->a) < FXSYS_fabs(pImage2Device->b) * 10 && FXSYS_fabs(pImage2Device->d) < FXSYS_fabs(pImage2Device->c) * 10) { 912ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 913ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 914ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_FloatRect image_rect_f = pImage2Device->GetUnitRect(); 915ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_RECT image_rect = image_rect_f.GetOutterRect(); 916ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_DestWidth = image_rect.Width(); 917ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_DestHeight = image_rect.Height(); 918ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bFlipX = pImage2Device->a < 0; 919ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bFlipY = pImage2Device->d > 0; 920ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_RECT result_rect = *pClipBox; 921ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov result_rect.Intersect(image_rect); 922ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (result_rect.IsEmpty()) { 923ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 924ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 925ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_ResultWidth = result_rect.Width(); 926ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_ResultHeight = result_rect.Height(); 927ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_ResultLeft = result_rect.left; 928ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_ResultTop = result_rect.top; 929ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_ClipLeft = result_rect.left - image_rect.left; 930ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_ClipTop = result_rect.top - image_rect.top; 931ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pDict = pImageObj->m_pImage->GetDict(); 932ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pDict->GetInteger(FX_BSTRC("BitsPerComponent")) != 8) { 933ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 934ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 935ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pDict->KeyExist(FX_BSTRC("SMask")) || pDict->KeyExist(FX_BSTRC("Mask"))) { 936ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 937ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 938ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_SrcWidth = pDict->GetInteger(FX_BSTRC("Width")); 939ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_SrcHeight = pDict->GetInteger(FX_BSTRC("Height")); 940ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCS = NULL; 941ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Bpp = 3; 942ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object* pCSObj = pDict->GetElementValue(FX_BSTRC("ColorSpace")); 943ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pCSObj == NULL) { 944ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 945ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 946ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCS = CPDF_ColorSpace::Load(pImageObj->m_pImage->GetDocument(), pCSObj); 947ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pCS == NULL) { 948ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 949ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 950ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!_IsSupported(m_pCS)) { 951ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 952ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 953ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Bpp = m_pCS->CountComponents(); 954ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pCS->sRGB()) { 955ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCS->ReleaseCS(); 956ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCS = NULL; 957ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 958ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Stream* pStream = pImageObj->m_pImage->GetStream(); 959ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_StreamAcc.LoadAllData(pStream, FALSE, m_SrcWidth * m_SrcHeight * m_Bpp, TRUE); 960ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDecoder = NULL; 961ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!m_StreamAcc.GetImageDecoder().IsEmpty()) { 962ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_StreamAcc.GetImageDecoder() == FX_BSTRC("DCTDecode")) { 963ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const CPDF_Dictionary* pParam = m_StreamAcc.GetImageParam(); 964ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDecoder = CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecoder( 965ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_StreamAcc.GetData(), m_StreamAcc.GetSize(), m_SrcWidth, m_SrcHeight, m_Bpp, 966ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pParam ? pParam->GetInteger(FX_BSTRC("ColorTransform"), 1) : 1); 967ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (m_StreamAcc.GetImageDecoder() == FX_BSTRC("FlateDecode")) { 968ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDecoder = FPDFAPI_CreateFlateDecoder( 969ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_StreamAcc.GetData(), m_StreamAcc.GetSize(), m_SrcWidth, m_SrcHeight, m_Bpp, 8, 970ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_StreamAcc.GetImageParam()); 971ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 972ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 973ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 974ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pDecoder->DownScale(m_DestWidth, m_DestHeight); 975ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 976ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pBitmap = FX_NEW CFX_DIBitmap; 977ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ 978ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pBitmap->Create(m_ResultWidth, m_ResultHeight, FXDIB_Rgb32); 979ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 980ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pBitmap->Create(m_ResultWidth, m_ResultHeight, FXDIB_Rgb); 981ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 982ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_LineIndex = 0; 983ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 984ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 985ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_QuickStretcher::Continue(IFX_Pause* pPause) 986ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 987ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPBYTE result_buf = m_pBitmap->GetBuffer(); 988ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int src_width = m_pDecoder ? m_pDecoder->GetWidth() : m_SrcWidth; 989ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int src_height = m_pDecoder ? m_pDecoder->GetHeight() : m_SrcHeight; 990ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int src_pitch = src_width * m_Bpp; 991ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (m_LineIndex < m_ResultHeight) { 992ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int dest_y, src_y; 993ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_bFlipY) { 994ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_y = m_ResultHeight - m_LineIndex - 1; 995ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov src_y = (m_DestHeight - (dest_y + m_ClipTop) - 1) * src_height / m_DestHeight; 996ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 997ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_y = m_LineIndex; 998ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov src_y = (dest_y + m_ClipTop) * src_height / m_DestHeight; 999ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1000ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCBYTE src_scan; 1001ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pDecoder) { 1002ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov src_scan = m_pDecoder->GetScanline(src_y); 1003ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (src_scan == NULL) { 1004ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 1005ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1006ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1007ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov src_scan = m_StreamAcc.GetData(); 1008ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (src_scan == NULL) { 1009ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 1010ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1011ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov src_scan += src_y * src_pitch; 1012ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1013ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPBYTE result_scan = result_buf + dest_y * m_pBitmap->GetPitch(); 1014ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int x = 0; x < m_ResultWidth; x ++) { 1015ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int dest_x = m_ClipLeft + x; 1016ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int src_x = (m_bFlipX ? (m_DestWidth - dest_x - 1) : dest_x) * src_width / m_DestWidth; 1017ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPCBYTE src_pixel = src_scan + src_x * m_Bpp; 1018ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pCS == NULL) { 1019ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *result_scan = src_pixel[2]; 1020ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov result_scan ++; 1021ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *result_scan = src_pixel[1]; 1022ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov result_scan ++; 1023ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *result_scan = src_pixel[0]; 1024ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov result_scan ++; 1025ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ 1026ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov result_scan ++; 1027ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 1028ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1029ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCS->TranslateImageLine(result_scan, src_pixel, 1, 0, 0); 1030ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ 1031ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov result_scan += 4; 1032ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 1033ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov result_scan += 3; 1034ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 1035ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1036ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1037ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_LineIndex ++; 1038ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pPause && pPause->NeedToPauseNow()) { 1039ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 1040ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1041ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1042ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1043ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1044ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_DIBitmap* CPDF_RenderStatus::LoadSMask(CPDF_Dictionary* pSMaskDict, 1045ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_RECT* pClipRect, const CFX_AffineMatrix* pMatrix) 1046ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1047ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pSMaskDict == NULL) { 1048ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 1049ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1050ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_DIBitmap* pMask = NULL; 1051ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int width = pClipRect->right - pClipRect->left; 1052ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int height = pClipRect->bottom - pClipRect->top; 1053ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bLuminosity = FALSE; 1054ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bLuminosity = pSMaskDict->GetConstString(FX_BSTRC("S")) != FX_BSTRC("Alpha"); 1055ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Stream* pGroup = pSMaskDict->GetStream(FX_BSTRC("G")); 1056ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pGroup == NULL) { 1057ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 1058ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1059ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Function* pFunc = NULL; 1060ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object* pFuncObj = pSMaskDict->GetElementValue(FX_BSTRC("TR")); 1061ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pFuncObj && (pFuncObj->GetType() == PDFOBJ_DICTIONARY || pFuncObj->GetType() == PDFOBJ_STREAM)) { 1062ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pFunc = CPDF_Function::Load(pFuncObj); 1063ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1064ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_AffineMatrix matrix = *pMatrix; 1065ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov matrix.TranslateI(-pClipRect->left, -pClipRect->top); 1066ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Form form(m_pContext->m_pDocument, m_pContext->m_pPageResources, pGroup); 1067ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov form.ParseContent(NULL, NULL, NULL, NULL); 1068ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_FxgeDevice bitmap_device; 1069ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ 1070ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bitmap_device.Create(width, height, bLuminosity ? FXDIB_Rgb32 : FXDIB_8bppMask)) { 1071ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 1072ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1073ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 1074ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!bitmap_device.Create(width, height, bLuminosity ? FXDIB_Rgb : FXDIB_8bppMask)) { 1075ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 1076ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1077ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 1078ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_DIBitmap& bitmap = *bitmap_device.GetBitmap(); 1079ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Object* pCSObj = NULL; 1080ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_ColorSpace* pCS = NULL; 1081ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bLuminosity) { 1082ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Array* pBC = pSMaskDict->GetArray(FX_BSTRC("BC")); 1083ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_ARGB back_color = 0xff000000; 1084ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pBC) { 1085ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pCSObj = pGroup->GetDict()->GetDict(FX_BSTRC("Group"))->GetElementValue(FX_BSTRC("CS")); 1086ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pCS = m_pContext->m_pDocument->LoadColorSpace(pCSObj); 1087ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pCS) { 1088ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT R, G, B; 1089ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_DWORD num_floats = 8; 1090ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pCS->CountComponents() > (FX_INT32)num_floats) { 1091ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov num_floats = (FX_DWORD)pCS->CountComponents(); 1092ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1093ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_FixedBufGrow<FX_FLOAT, 8> float_array(num_floats); 1094ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT* pFloats = float_array; 1095ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memset32(pFloats, 0, num_floats * sizeof(FX_FLOAT)); 1096ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int count = pBC->GetCount() > 8 ? 8 : pBC->GetCount(); 1097ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < count; i ++) { 1098ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pFloats[i] = pBC->GetNumber(i); 1099ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pCS->GetRGB(pFloats, R, G, B); 1101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov back_color = 0xff000000 | ((FX_INT32)(R * 255) << 16) | ((FX_INT32)(G * 255) << 8) | (FX_INT32)(B * 255); 1102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pContext->m_pDocument->GetPageData()->ReleaseColorSpace(pCSObj); 1103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bitmap.Clear(back_color); 1106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bitmap.Clear(0); 1108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Dictionary* pFormResource = NULL; 1110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (form.m_pFormDict) { 1111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pFormResource = form.m_pFormDict->GetDict(FX_BSTRC("Resources")); 1112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_RenderOptions options; 1114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov options.m_ColorMode = bLuminosity ? RENDER_COLOR_NORMAL : RENDER_COLOR_ALPHA; 1115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_RenderStatus status; 1116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status.Initialize(m_Level + 1, m_pContext, &bitmap_device, NULL, NULL, NULL, NULL, 1117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov &options, 0, m_bDropObjects, pFormResource, TRUE, NULL, 0, pCS ? pCS->GetFamily() : 0, bLuminosity); 1118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov status.RenderObjectList(&form, &matrix); 1119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pMask = FX_NEW CFX_DIBitmap; 1120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pMask->Create(width, height, FXDIB_8bppMask)) { 1121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete pMask; 1122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 1123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPBYTE dest_buf = pMask->GetBuffer(); 1125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int dest_pitch = pMask->GetPitch(); 1126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPBYTE src_buf = bitmap.GetBuffer(); 1127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int src_pitch = bitmap.GetPitch(); 1128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPBYTE pTransfer = FX_Alloc(FX_BYTE, 256); 1129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pFunc) { 1130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_FixedBufGrow<FX_FLOAT, 16> results(pFunc->CountOutputs()); 1131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < 256; i ++) { 1132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT input = (FX_FLOAT)i / 255.0f; 1133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int nresult; 1134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pFunc->Call(&input, 1, results, nresult); 1135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pTransfer[i] = FXSYS_round(results[0] * 255); 1136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < 256; i ++) { 1139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pTransfer[i] = i; 1140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (bLuminosity) { 1143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int Bpp = bitmap.GetBPP() / 8; 1144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int row = 0; row < height; row ++) { 1145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPBYTE dest_pos = dest_buf + row * dest_pitch; 1146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_LPBYTE src_pos = src_buf + row * src_pitch; 1147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int col = 0; col < width; col ++) { 1148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *dest_pos ++ = pTransfer[FXRGB2GRAY(src_pos[2], src_pos[1], *src_pos)]; 1149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov src_pos += Bpp; 1150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if (pFunc) { 1153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int size = dest_pitch * height; 1154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < size; i ++) { 1155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dest_buf[i] = pTransfer[src_buf[i]]; 1156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memcpy32(dest_buf, src_buf, dest_pitch * height); 1159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pFunc) { 1161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete pFunc; 1162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_Free(pTransfer); 1164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pMask; 1165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1166