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