1e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved. 2e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Use of this source code is governed by a BSD-style license that can be 3e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// found in the LICENSE file. 4ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 5e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 7e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "pageint.h" 8e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 9ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fpdfapi/fpdf_page.h" 10ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 11ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannnamespace { 12ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 13ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst int kSingleCoordinatePair = 1; 14ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst int kTensorCoordinatePairs = 16; 15ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst int kCoonsCoordinatePairs = 12; 16ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 17ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst int kSingleColorPerPatch = 1; 18ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst int kQuadColorsPerPatch = 4; 19ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 20ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannShadingType ToShadingType(int type) { 21ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return (type > static_cast<int>(kInvalidShading) && 22ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann type < static_cast<int>(kMaxShading)) 23ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ? static_cast<ShadingType>(type) 24ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann : kInvalidShading; 25e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 26ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 27ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} // namespace 28ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 29ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Pattern::CPDF_Pattern(PatternType type, 30ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Document* pDoc, 31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pObj, 32ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_Matrix* pParentMatrix) 33ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann : m_PatternType(type), 34ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDocument(pDoc), 35ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pPatternObj(pObj), 36ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_bForceClear(FALSE) { 37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pParentMatrix) 38ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_ParentMatrix = *pParentMatrix; 39e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 40ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Pattern::~CPDF_Pattern() {} 41ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_TilingPattern::CPDF_TilingPattern(CPDF_Document* pDoc, 42ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pPatternObj, 43ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_Matrix* parentMatrix) 44ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann : CPDF_Pattern(TILING, pDoc, pPatternObj, parentMatrix) { 45ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pDict = m_pPatternObj->GetDict(); 46ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Pattern2Form = pDict->GetMatrix("Matrix"); 47ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_bColored = pDict->GetInteger("PaintType") == 1; 48ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (parentMatrix) { 49ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Pattern2Form.Concat(*parentMatrix); 50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pForm = NULL; 52e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 53ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_TilingPattern::~CPDF_TilingPattern() { 54ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann delete m_pForm; 55ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pForm = NULL; 56e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 57ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_TilingPattern::Load() { 58ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pForm) 59e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 60ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 61ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pDict = m_pPatternObj->GetDict(); 62ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pDict) 63ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 64ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 65ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_bColored = pDict->GetInteger("PaintType") == 1; 66ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_XStep = (FX_FLOAT)FXSYS_fabs(pDict->GetNumber("XStep")); 67ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_YStep = (FX_FLOAT)FXSYS_fabs(pDict->GetNumber("YStep")); 68ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 69ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Stream* pStream = m_pPatternObj->AsStream(); 70ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pStream) 71ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 72ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 73ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pForm = new CPDF_Form(m_pDocument, NULL, pStream); 74ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pForm->ParseContent(NULL, &m_ParentMatrix, NULL, NULL); 75ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_BBox = pDict->GetRect("BBox"); 76ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 77e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 78ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_ShadingPattern::CPDF_ShadingPattern(CPDF_Document* pDoc, 79ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pPatternObj, 80ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bShading, 81ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_Matrix* parentMatrix) 82ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann : CPDF_Pattern(SHADING, 83ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDoc, 84ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bShading ? nullptr : pPatternObj, 85ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann parentMatrix), 86ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_ShadingType(kInvalidShading), 87ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_bShadingObj(bShading), 88ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pShadingObj(pPatternObj), 89ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pCS(nullptr), 90ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pCountedCS(nullptr), 91ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_nFuncs(0) { 92ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!bShading) { 93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pDict = m_pPatternObj->GetDict(); 94ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Pattern2Form = pDict->GetMatrix("Matrix"); 95ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pShadingObj = pDict->GetElementValue("Shading"); 96ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (parentMatrix) 97ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Pattern2Form.Concat(*parentMatrix); 98ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 99ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < FX_ArraySize(m_pFunctions); ++i) 100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pFunctions[i] = nullptr; 101e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_ShadingPattern::~CPDF_ShadingPattern() { 104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < m_nFuncs; ++i) 105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann delete m_pFunctions[i]; 106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_ColorSpace* pCS = m_pCountedCS ? m_pCountedCS->get() : NULL; 108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pCS && m_pDocument) 109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDocument->GetPageData()->ReleaseColorSpace(pCS->GetArray()); 110e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_ShadingPattern::Load() { 113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_ShadingType != kInvalidShading) 114ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 115ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pShadingDict = 117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pShadingObj ? m_pShadingObj->GetDict() : NULL; 118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pShadingDict) { 119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 120ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_nFuncs) { 122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < m_nFuncs; i++) 123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann delete m_pFunctions[i]; 124e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_nFuncs = 0; 125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pFunc = pShadingDict->GetElementValue("Function"); 127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFunc) { 128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (CPDF_Array* pArray = pFunc->AsArray()) { 129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_nFuncs = std::min<int>(pArray->GetCount(), 4); 130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < m_nFuncs; i++) { 132ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pFunctions[i] = CPDF_Function::Load(pArray->GetElementValue(i)); 133ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 134ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 135ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pFunctions[0] = CPDF_Function::Load(pFunc); 136ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_nFuncs = 1; 137e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 138ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pCSObj = pShadingDict->GetElementValue("ColorSpace"); 140ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pCSObj) { 141ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 142ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_DocPageData* pDocPageData = m_pDocument->GetPageData(); 144ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pCS = pDocPageData->GetColorSpace(pCSObj, NULL); 145ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pCS) { 146ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pCountedCS = pDocPageData->FindColorSpacePtr(m_pCS->GetArray()); 147ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 148ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 149ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_ShadingType = ToShadingType(pShadingDict->GetInteger("ShadingType")); 150ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 151ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann // We expect to have a stream if our shading type is a mesh. 152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (IsMeshShading() && !ToStream(m_pShadingObj)) 153ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 155ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 156e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 157ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_MeshStream::Load(CPDF_Stream* pShadingStream, 158ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Function** pFuncs, 159ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int nFuncs, 160ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_ColorSpace* pCS) { 161ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Stream.LoadAllData(pShadingStream); 162ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_BitStream.Init(m_Stream.GetData(), m_Stream.GetSize()); 163ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pFuncs = pFuncs; 164ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_nFuncs = nFuncs; 165ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pCS = pCS; 166ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pDict = pShadingStream->GetDict(); 167ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_nCoordBits = pDict->GetInteger("BitsPerCoordinate"); 168ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_nCompBits = pDict->GetInteger("BitsPerComponent"); 169ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_nFlagBits = pDict->GetInteger("BitsPerFlag"); 170ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_nCoordBits || !m_nCompBits) { 171ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 172ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 173ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int nComps = pCS->CountComponents(); 174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (nComps > 8) { 175ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 176ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 177ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_nComps = nFuncs ? 1 : nComps; 178ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (((int)m_nComps < 0) || m_nComps > 8) { 179ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 180ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 181ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_CoordMax = m_nCoordBits == 32 ? -1 : (1 << m_nCoordBits) - 1; 182ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_CompMax = (1 << m_nCompBits) - 1; 183ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pDecode = pDict->GetArray("Decode"); 184ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pDecode || pDecode->GetCount() != 4 + m_nComps * 2) { 185ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 186ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 187ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_xmin = pDecode->GetNumber(0); 188ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_xmax = pDecode->GetNumber(1); 189ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_ymin = pDecode->GetNumber(2); 190ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_ymax = pDecode->GetNumber(3); 191ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (FX_DWORD i = 0; i < m_nComps; i++) { 192ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_ColorMin[i] = pDecode->GetNumber(i * 2 + 4); 193ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_ColorMax[i] = pDecode->GetNumber(i * 2 + 5); 194ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 195ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 196e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 197ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_DWORD CPDF_MeshStream::GetFlag() { 198ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_BitStream.GetBits(m_nFlagBits) & 0x03; 199e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 200ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_MeshStream::GetCoords(FX_FLOAT& x, FX_FLOAT& y) { 201ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_nCoordBits == 32) { 202ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann x = m_xmin + (FX_FLOAT)(m_BitStream.GetBits(m_nCoordBits) * 203ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann (m_xmax - m_xmin) / (double)m_CoordMax); 204ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann y = m_ymin + (FX_FLOAT)(m_BitStream.GetBits(m_nCoordBits) * 205ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann (m_ymax - m_ymin) / (double)m_CoordMax); 206ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 207ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann x = m_xmin + 208ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_BitStream.GetBits(m_nCoordBits) * (m_xmax - m_xmin) / m_CoordMax; 209ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann y = m_ymin + 210ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_BitStream.GetBits(m_nCoordBits) * (m_ymax - m_ymin) / m_CoordMax; 211ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 212e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_MeshStream::GetColor(FX_FLOAT& r, FX_FLOAT& g, FX_FLOAT& b) { 214ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD i; 215ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FLOAT color_value[8]; 216ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (i = 0; i < m_nComps; i++) { 217ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann color_value[i] = m_ColorMin[i] + 218ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_BitStream.GetBits(m_nCompBits) * 219ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann (m_ColorMax[i] - m_ColorMin[i]) / m_CompMax; 220ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 221ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_nFuncs) { 222ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static const int kMaxResults = 8; 223ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FLOAT result[kMaxResults]; 224ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int nResults; 225ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_memset(result, 0, sizeof(result)); 226ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (FX_DWORD i = 0; i < m_nFuncs; i++) { 227ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pFuncs[i] && m_pFuncs[i]->CountOutputs() <= kMaxResults) { 228ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pFuncs[i]->Call(color_value, 1, result, nResults); 229ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 230e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 231ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pCS->GetRGB(result, r, g, b); 232ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 233ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pCS->GetRGB(color_value, r, g, b); 234ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 235e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 236ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_DWORD CPDF_MeshStream::GetVertex(CPDF_MeshVertex& vertex, 237ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_Matrix* pObject2Bitmap) { 238ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD flag = GetFlag(); 239ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann GetCoords(vertex.x, vertex.y); 240ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pObject2Bitmap->Transform(vertex.x, vertex.y); 241ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann GetColor(vertex.r, vertex.g, vertex.b); 242ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_BitStream.ByteAlign(); 243ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return flag; 244e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 245ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_MeshStream::GetVertexRow(CPDF_MeshVertex* vertex, 246ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int count, 247ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_Matrix* pObject2Bitmap) { 248ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < count; i++) { 249ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_BitStream.IsEOF()) { 250ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 251e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 252ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann GetCoords(vertex[i].x, vertex[i].y); 253ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pObject2Bitmap->Transform(vertex[i].x, vertex[i].y); 254ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann GetColor(vertex[i].r, vertex[i].g, vertex[i].b); 255ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_BitStream.ByteAlign(); 256ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 257ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 258e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 259ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 260ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_FloatRect GetShadingBBox(CPDF_Stream* pStream, 261ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ShadingType type, 262ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_Matrix* pMatrix, 263ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Function** pFuncs, 264ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int nFuncs, 265ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_ColorSpace* pCS) { 266ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pStream || !pStream->IsStream() || !pFuncs || !pCS) 267ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return CFX_FloatRect(0, 0, 0, 0); 268ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 269ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_MeshStream stream; 270ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!stream.Load(pStream, pFuncs, nFuncs, pCS)) 271ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return CFX_FloatRect(0, 0, 0, 0); 272ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 273ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_FloatRect rect; 274ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bStarted = FALSE; 275ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bGouraud = type == kFreeFormGouraudTriangleMeshShading || 276ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann type == kLatticeFormGouraudTriangleMeshShading; 277ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 278ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int point_count = kSingleCoordinatePair; 279ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (type == kTensorProductPatchMeshShading) 280ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann point_count = kTensorCoordinatePairs; 281ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann else if (type == kCoonsPatchMeshShading) 282ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann point_count = kCoonsCoordinatePairs; 283ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 284ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int color_count = kSingleColorPerPatch; 285ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (type == kCoonsPatchMeshShading || type == kTensorProductPatchMeshShading) 286ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann color_count = kQuadColorsPerPatch; 287ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 288ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (!stream.m_BitStream.IsEOF()) { 289ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD flag = 0; 290ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (type != kLatticeFormGouraudTriangleMeshShading) 291ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann flag = stream.GetFlag(); 292ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 293ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!bGouraud && flag) { 294ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann point_count -= 4; 295ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann color_count -= 2; 296e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 297ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 298ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < point_count; i++) { 299ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FLOAT x, y; 300ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann stream.GetCoords(x, y); 301ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bStarted) { 302ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann rect.UpdateRect(x, y); 303ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 304ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann rect.InitRect(x, y); 305ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bStarted = TRUE; 306ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 307e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 308ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann stream.m_BitStream.SkipBits(stream.m_nComps * stream.m_nCompBits * 309ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann color_count); 310ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bGouraud) 311ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann stream.m_BitStream.ByteAlign(); 312ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 313ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann rect.Transform(pMatrix); 314ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return rect; 315e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 316