1e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved.
2e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Use of this source code is governed by a BSD-style license that can be
3e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// found in the LICENSE file.
4ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
5e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
7ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/src/fpdfapi/fpdf_page/pageint.h"
8ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
9ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fpdfapi/fpdf_module.h"
10ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fpdfapi/fpdf_page.h"
11ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fpdfapi/fpdf_serial.h"
12ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
13ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannnamespace {
14ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
15ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstruct _FX_BSTR {
16ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  const FX_CHAR* m_Ptr;
17ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int m_Size;
18ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann};
19ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define _FX_BSTRC(str) \
20ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  { str, sizeof(str) - 1 }
21ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
22ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstruct PDF_AbbrPairs {
23ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  _FX_BSTR full_name;
24ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  _FX_BSTR abbr;
25ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann};
26ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
27ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst PDF_AbbrPairs PDF_InlineKeyAbbr[] = {
28ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {_FX_BSTRC("BitsPerComponent"), _FX_BSTRC("BPC")},
29ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {_FX_BSTRC("ColorSpace"), _FX_BSTRC("CS")},
30ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {_FX_BSTRC("Decode"), _FX_BSTRC("D")},
31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {_FX_BSTRC("DecodeParms"), _FX_BSTRC("DP")},
32ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {_FX_BSTRC("Filter"), _FX_BSTRC("F")},
33ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {_FX_BSTRC("Height"), _FX_BSTRC("H")},
34ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {_FX_BSTRC("ImageMask"), _FX_BSTRC("IM")},
35ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {_FX_BSTRC("Interpolate"), _FX_BSTRC("I")},
36ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {_FX_BSTRC("Width"), _FX_BSTRC("W")},
37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann};
38ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
39ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst PDF_AbbrPairs PDF_InlineValueAbbr[] = {
40ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {_FX_BSTRC("DeviceGray"), _FX_BSTRC("G")},
41ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {_FX_BSTRC("DeviceRGB"), _FX_BSTRC("RGB")},
42ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {_FX_BSTRC("DeviceCMYK"), _FX_BSTRC("CMYK")},
43ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {_FX_BSTRC("Indexed"), _FX_BSTRC("I")},
44ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {_FX_BSTRC("ASCIIHexDecode"), _FX_BSTRC("AHx")},
45ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {_FX_BSTRC("ASCII85Decode"), _FX_BSTRC("A85")},
46ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {_FX_BSTRC("LZWDecode"), _FX_BSTRC("LZW")},
47ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {_FX_BSTRC("FlateDecode"), _FX_BSTRC("Fl")},
48ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {_FX_BSTRC("RunLengthDecode"), _FX_BSTRC("RL")},
49ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {_FX_BSTRC("CCITTFaxDecode"), _FX_BSTRC("CCF")},
50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {_FX_BSTRC("DCTDecode"), _FX_BSTRC("DCT")},
51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann};
52ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
53ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstruct AbbrReplacementOp {
54ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  bool is_replace_key;
55ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_ByteString key;
56ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_ByteStringC replacement;
57ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann};
58ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
59ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_ByteStringC PDF_FindFullName(const PDF_AbbrPairs* table,
60ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                 size_t count,
61ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                 const CFX_ByteStringC& abbr) {
62ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (size_t i = 0; i < count; ++i) {
63ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (abbr.GetLength() != table[i].abbr.m_Size)
64ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      continue;
65ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (memcmp(abbr.GetPtr(), table[i].abbr.m_Ptr, abbr.GetLength()))
66ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      continue;
67ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return CFX_ByteStringC(table[i].full_name.m_Ptr, table[i].full_name.m_Size);
68ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
69ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return CFX_ByteStringC();
70e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
71ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
72ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}  // namespace
73ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
74ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_StreamContentParser::CPDF_StreamContentParser(
75ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_Document* pDocument,
76ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_Dictionary* pPageResources,
77ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_Dictionary* pParentResources,
78ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CFX_Matrix* pmtContentToUser,
79ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_PageObjects* pObjList,
80ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_Dictionary* pResources,
81ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_Rect* pBBox,
82ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_ParseOptions* pOptions,
83ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_AllStates* pStates,
84ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int level)
85ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    : m_pDocument(pDocument),
86ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pPageResources(pPageResources),
87ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pParentResources(pParentResources),
88ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pResources(pResources),
89ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pObjectList(pObjList),
90ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_Level(level),
91ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_ParamStartPos(0),
92ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_ParamCount(0),
93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pCurStates(new CPDF_AllStates),
94ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pLastTextObject(nullptr),
95ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_DefFontSize(0),
96ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pPathPoints(nullptr),
97ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_PathPointCount(0),
98ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_PathAllocSize(0),
99ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_PathCurrentX(0.0f),
100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_PathCurrentY(0.0f),
101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_PathClipType(0),
102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pLastImage(nullptr),
103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pLastImageDict(nullptr),
104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pLastCloneImageDict(nullptr),
105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_bReleaseLastDict(TRUE),
106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_bColored(FALSE),
107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_bResourceMissing(FALSE) {
108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pmtContentToUser) {
109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_mtContentToUser = *pmtContentToUser;
110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pOptions) {
112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_Options = *pOptions;
113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
114ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_pResources) {
115ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pResources = m_pParentResources;
116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_pResources) {
118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pResources = m_pPageResources;
119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
120ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pBBox) {
121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_BBox = *pBBox;
122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pStates) {
124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pCurStates->Copy(*pStates);
125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pCurStates->m_GeneralState.New();
127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pCurStates->m_GraphState.New();
128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pCurStates->m_TextState.New();
129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pCurStates->m_ColorState.New();
130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (size_t i = 0; i < FX_ArraySize(m_Type3Data); ++i) {
132ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_Type3Data[i] = 0.0;
133ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
134e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
135ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
136ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_StreamContentParser::~CPDF_StreamContentParser() {
137ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ClearAllParams();
138ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_Free(m_pPathPoints);
139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pLastImageDict) {
140ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pLastImageDict->Release();
141ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
142ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pLastCloneImageDict) {
143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pLastCloneImageDict->Release();
144ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
145ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
146ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_StreamContentParser::GetNextParamPos() {
147ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_ParamCount == PARAM_BUF_SIZE) {
148ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_ParamStartPos++;
149ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_ParamStartPos == PARAM_BUF_SIZE) {
150ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_ParamStartPos = 0;
151ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_ParamBuf1[m_ParamStartPos].m_Type == 0) {
153ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (CPDF_Object* pObject = m_ParamBuf1[m_ParamStartPos].m_pObject)
154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pObject->Release();
155ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
156ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return m_ParamStartPos;
157ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
158ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int index = m_ParamStartPos + m_ParamCount;
159ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (index >= PARAM_BUF_SIZE) {
160ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    index -= PARAM_BUF_SIZE;
161ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
162ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_ParamCount++;
163ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return index;
164ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
165ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::AddNameParam(const FX_CHAR* name, int len) {
166ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int index = GetNextParamPos();
167ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (len > 32) {
168e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_ParamBuf1[index].m_Type = 0;
169ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_ParamBuf1[index].m_pObject =
170ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        new CPDF_Name(PDF_NameDecode(CFX_ByteStringC(name, len)));
171ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
172ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_ParamBuf1[index].m_Type = PDFOBJ_NAME;
173ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!FXSYS_memchr(name, '#', len)) {
174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FXSYS_memcpy(m_ParamBuf1[index].m_Name.m_Buffer, name, len);
175ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_ParamBuf1[index].m_Name.m_Len = len;
176ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
177ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CFX_ByteString str = PDF_NameDecode(CFX_ByteStringC(name, len));
178ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FXSYS_memcpy(m_ParamBuf1[index].m_Name.m_Buffer, str.c_str(),
179ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                   str.GetLength());
180ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_ParamBuf1[index].m_Name.m_Len = str.GetLength();
181ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
182ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
183ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
184ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::AddNumberParam(const FX_CHAR* str, int len) {
185ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int index = GetNextParamPos();
186ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_ParamBuf1[index].m_Type = PDFOBJ_NUMBER;
187ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_atonum(CFX_ByteStringC(str, len), m_ParamBuf1[index].m_Number.m_bInteger,
188ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            &m_ParamBuf1[index].m_Number.m_Integer);
189ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
190ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::AddObjectParam(CPDF_Object* pObj) {
191ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int index = GetNextParamPos();
192ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_ParamBuf1[index].m_Type = 0;
193ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_ParamBuf1[index].m_pObject = pObj;
194ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
195ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::ClearAllParams() {
196ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD index = m_ParamStartPos;
197ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (FX_DWORD i = 0; i < m_ParamCount; i++) {
198ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_ParamBuf1[index].m_Type == 0) {
199ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (CPDF_Object* pObject = m_ParamBuf1[index].m_pObject)
200ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pObject->Release();
201ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
202ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    index++;
203ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (index == PARAM_BUF_SIZE) {
204ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      index = 0;
205ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
206ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
207ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_ParamStartPos = 0;
208ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_ParamCount = 0;
209ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
210ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Object* CPDF_StreamContentParser::GetObject(FX_DWORD index) {
211ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (index >= m_ParamCount) {
212e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return NULL;
213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
214ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int real_index = m_ParamStartPos + m_ParamCount - index - 1;
215ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (real_index >= PARAM_BUF_SIZE) {
216ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    real_index -= PARAM_BUF_SIZE;
217ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
218ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ContentParam& param = m_ParamBuf1[real_index];
219ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (param.m_Type == PDFOBJ_NUMBER) {
220ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_Number* pNumber = param.m_Number.m_bInteger
221ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                               ? new CPDF_Number(param.m_Number.m_Integer)
222ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                               : new CPDF_Number(param.m_Number.m_Float);
223ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
224ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    param.m_Type = 0;
225ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    param.m_pObject = pNumber;
226ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return pNumber;
227ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
228ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (param.m_Type == PDFOBJ_NAME) {
229ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_Name* pName = new CPDF_Name(
230ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CFX_ByteString(param.m_Name.m_Buffer, param.m_Name.m_Len));
231ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    param.m_Type = 0;
232ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    param.m_pObject = pName;
233ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return pName;
234ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
235ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (param.m_Type == 0) {
236ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return param.m_pObject;
237ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
238ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ASSERT(FALSE);
239ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return NULL;
240ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
241ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_ByteString CPDF_StreamContentParser::GetString(FX_DWORD index) {
242ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (index >= m_ParamCount) {
243e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return CFX_ByteString();
244ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
245ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int real_index = m_ParamStartPos + m_ParamCount - index - 1;
246ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (real_index >= PARAM_BUF_SIZE) {
247ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    real_index -= PARAM_BUF_SIZE;
248ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
249ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ContentParam& param = m_ParamBuf1[real_index];
250ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (param.m_Type == PDFOBJ_NAME) {
251ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return CFX_ByteString(param.m_Name.m_Buffer, param.m_Name.m_Len);
252ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
253ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (param.m_Type == 0 && param.m_pObject) {
254ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return param.m_pObject->GetString();
255ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
256ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return CFX_ByteString();
257ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
258ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_FLOAT CPDF_StreamContentParser::GetNumber(FX_DWORD index) {
259ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (index >= m_ParamCount) {
260e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return 0;
261ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
262ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int real_index = m_ParamStartPos + m_ParamCount - index - 1;
263ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (real_index >= PARAM_BUF_SIZE) {
264ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    real_index -= PARAM_BUF_SIZE;
265ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
266ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ContentParam& param = m_ParamBuf1[real_index];
267ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (param.m_Type == PDFOBJ_NUMBER) {
268ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return param.m_Number.m_bInteger ? (FX_FLOAT)param.m_Number.m_Integer
269ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     : param.m_Number.m_Float;
270ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
271ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (param.m_Type == 0 && param.m_pObject) {
272ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return param.m_pObject->GetNumber();
273ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
274ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return 0;
275ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
276ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_FLOAT CPDF_StreamContentParser::GetNumber16(FX_DWORD index) {
277ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return GetNumber(index);
278ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
279ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::SetGraphicStates(CPDF_PageObject* pObj,
280ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                FX_BOOL bColor,
281ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                FX_BOOL bText,
282ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                FX_BOOL bGraph) {
283ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pObj->m_GeneralState = m_pCurStates->m_GeneralState;
284ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pObj->m_ClipPath = m_pCurStates->m_ClipPath;
285ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pObj->m_ContentMark = m_CurContentMark;
286ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (bColor) {
287ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pObj->m_ColorState = m_pCurStates->m_ColorState;
288ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
289ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (bGraph) {
290ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pObj->m_GraphState = m_pCurStates->m_GraphState;
291ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
292ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (bText) {
293ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pObj->m_TextState = m_pCurStates->m_TextState;
294ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
295e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
296ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
297ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst CPDF_StreamContentParser::OpCode CPDF_StreamContentParser::g_OpCodes[] = {
298ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('"', 0, 0, 0),
299ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     &CPDF_StreamContentParser::Handle_NextLineShowText_Space},
300ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('\'', 0, 0, 0),
301ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     &CPDF_StreamContentParser::Handle_NextLineShowText},
302ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('B', 0, 0, 0), &CPDF_StreamContentParser::Handle_FillStrokePath},
303ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('B', '*', 0, 0),
304ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     &CPDF_StreamContentParser::Handle_EOFillStrokePath},
305ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('B', 'D', 'C', 0),
306ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     &CPDF_StreamContentParser::Handle_BeginMarkedContent_Dictionary},
307ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('B', 'I', 0, 0), &CPDF_StreamContentParser::Handle_BeginImage},
308ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('B', 'M', 'C', 0),
309ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     &CPDF_StreamContentParser::Handle_BeginMarkedContent},
310ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('B', 'T', 0, 0), &CPDF_StreamContentParser::Handle_BeginText},
311ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('B', 'X', 0, 0),
312ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     &CPDF_StreamContentParser::Handle_BeginSectionUndefined},
313ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('C', 'S', 0, 0),
314ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     &CPDF_StreamContentParser::Handle_SetColorSpace_Stroke},
315ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('D', 'P', 0, 0),
316ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     &CPDF_StreamContentParser::Handle_MarkPlace_Dictionary},
317ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('D', 'o', 0, 0),
318ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     &CPDF_StreamContentParser::Handle_ExecuteXObject},
319ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('E', 'I', 0, 0), &CPDF_StreamContentParser::Handle_EndImage},
320ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('E', 'M', 'C', 0),
321ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     &CPDF_StreamContentParser::Handle_EndMarkedContent},
322ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('E', 'T', 0, 0), &CPDF_StreamContentParser::Handle_EndText},
323ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('E', 'X', 0, 0),
324ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     &CPDF_StreamContentParser::Handle_EndSectionUndefined},
325ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('F', 0, 0, 0), &CPDF_StreamContentParser::Handle_FillPathOld},
326ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('G', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetGray_Stroke},
327ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('I', 'D', 0, 0),
328ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     &CPDF_StreamContentParser::Handle_BeginImageData},
329ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('J', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetLineCap},
330ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('K', 0, 0, 0),
331ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     &CPDF_StreamContentParser::Handle_SetCMYKColor_Stroke},
332ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('M', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetMiterLimit},
333ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('M', 'P', 0, 0), &CPDF_StreamContentParser::Handle_MarkPlace},
334ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('Q', 0, 0, 0),
335ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     &CPDF_StreamContentParser::Handle_RestoreGraphState},
336ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('R', 'G', 0, 0),
337ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     &CPDF_StreamContentParser::Handle_SetRGBColor_Stroke},
338ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('S', 0, 0, 0), &CPDF_StreamContentParser::Handle_StrokePath},
339ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('S', 'C', 0, 0),
340ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     &CPDF_StreamContentParser::Handle_SetColor_Stroke},
341ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('S', 'C', 'N', 0),
342ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     &CPDF_StreamContentParser::Handle_SetColorPS_Stroke},
343ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('T', '*', 0, 0),
344ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     &CPDF_StreamContentParser::Handle_MoveToNextLine},
345ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('T', 'D', 0, 0),
346ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     &CPDF_StreamContentParser::Handle_MoveTextPoint_SetLeading},
347ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('T', 'J', 0, 0),
348ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     &CPDF_StreamContentParser::Handle_ShowText_Positioning},
349ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('T', 'L', 0, 0),
350ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     &CPDF_StreamContentParser::Handle_SetTextLeading},
351ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('T', 'c', 0, 0), &CPDF_StreamContentParser::Handle_SetCharSpace},
352ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('T', 'd', 0, 0),
353ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     &CPDF_StreamContentParser::Handle_MoveTextPoint},
354ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('T', 'f', 0, 0), &CPDF_StreamContentParser::Handle_SetFont},
355ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('T', 'j', 0, 0), &CPDF_StreamContentParser::Handle_ShowText},
356ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('T', 'm', 0, 0),
357ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     &CPDF_StreamContentParser::Handle_SetTextMatrix},
358ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('T', 'r', 0, 0),
359ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     &CPDF_StreamContentParser::Handle_SetTextRenderMode},
360ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('T', 's', 0, 0), &CPDF_StreamContentParser::Handle_SetTextRise},
361ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('T', 'w', 0, 0), &CPDF_StreamContentParser::Handle_SetWordSpace},
362ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('T', 'z', 0, 0), &CPDF_StreamContentParser::Handle_SetHorzScale},
363ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('W', 0, 0, 0), &CPDF_StreamContentParser::Handle_Clip},
364ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('W', '*', 0, 0), &CPDF_StreamContentParser::Handle_EOClip},
365ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('b', 0, 0, 0),
366ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     &CPDF_StreamContentParser::Handle_CloseFillStrokePath},
367ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('b', '*', 0, 0),
368ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     &CPDF_StreamContentParser::Handle_CloseEOFillStrokePath},
369ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('c', 0, 0, 0), &CPDF_StreamContentParser::Handle_CurveTo_123},
370ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('c', 'm', 0, 0), &CPDF_StreamContentParser::Handle_ConcatMatrix},
371ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('c', 's', 0, 0),
372ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     &CPDF_StreamContentParser::Handle_SetColorSpace_Fill},
373ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('d', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetDash},
374ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('d', '0', 0, 0), &CPDF_StreamContentParser::Handle_SetCharWidth},
375ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('d', '1', 0, 0),
376ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     &CPDF_StreamContentParser::Handle_SetCachedDevice},
377ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('f', 0, 0, 0), &CPDF_StreamContentParser::Handle_FillPath},
378ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('f', '*', 0, 0), &CPDF_StreamContentParser::Handle_EOFillPath},
379ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('g', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetGray_Fill},
380ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('g', 's', 0, 0),
381ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     &CPDF_StreamContentParser::Handle_SetExtendGraphState},
382ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('h', 0, 0, 0), &CPDF_StreamContentParser::Handle_ClosePath},
383ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('i', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetFlat},
384ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('j', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetLineJoin},
385ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('k', 0, 0, 0),
386ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     &CPDF_StreamContentParser::Handle_SetCMYKColor_Fill},
387ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('l', 0, 0, 0), &CPDF_StreamContentParser::Handle_LineTo},
388ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('m', 0, 0, 0), &CPDF_StreamContentParser::Handle_MoveTo},
389ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('n', 0, 0, 0), &CPDF_StreamContentParser::Handle_EndPath},
390ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('q', 0, 0, 0), &CPDF_StreamContentParser::Handle_SaveGraphState},
391ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('r', 'e', 0, 0), &CPDF_StreamContentParser::Handle_Rectangle},
392ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('r', 'g', 0, 0),
393ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     &CPDF_StreamContentParser::Handle_SetRGBColor_Fill},
394ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('r', 'i', 0, 0),
395ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     &CPDF_StreamContentParser::Handle_SetRenderIntent},
396ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('s', 0, 0, 0),
397ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     &CPDF_StreamContentParser::Handle_CloseStrokePath},
398ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('s', 'c', 0, 0),
399ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     &CPDF_StreamContentParser::Handle_SetColor_Fill},
400ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('s', 'c', 'n', 0),
401ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     &CPDF_StreamContentParser::Handle_SetColorPS_Fill},
402ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('s', 'h', 0, 0), &CPDF_StreamContentParser::Handle_ShadeFill},
403ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('v', 0, 0, 0), &CPDF_StreamContentParser::Handle_CurveTo_23},
404ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('w', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetLineWidth},
405ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {FXBSTR_ID('y', 0, 0, 0), &CPDF_StreamContentParser::Handle_CurveTo_13},
406e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov};
407ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_StreamContentParser::OnOperator(const FX_CHAR* op) {
408ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int i = 0;
409ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD opid = 0;
410ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (i < 4 && op[i]) {
411ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    opid = (opid << 8) + op[i];
412ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    i++;
413ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
414ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (i < 4) {
415ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    opid <<= 8;
416ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    i++;
417ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
418ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int low = 0, high = sizeof g_OpCodes / sizeof(OpCode) - 1;
419ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (low <= high) {
420ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int middle = (low + high) / 2;
421ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int compare = opid - g_OpCodes[middle].m_OpId;
422ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (compare == 0) {
423ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      (this->*g_OpCodes[middle].m_OpHandler)();
424ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return TRUE;
425ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
426ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (compare < 0) {
427ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      high = middle - 1;
428e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    } else {
429ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      low = middle + 1;
430ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
431ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
432ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_CompatCount != 0;
433ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
434ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_CloseFillStrokePath() {
435ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_Options.m_bTextOnly) {
436ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
437ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
438ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  Handle_ClosePath();
439ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  AddPathObject(FXFILL_WINDING, TRUE);
440ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
441ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_FillStrokePath() {
442ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_Options.m_bTextOnly) {
443ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
444ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
445ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  AddPathObject(FXFILL_WINDING, TRUE);
446ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
447ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_CloseEOFillStrokePath() {
448ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_Options.m_bTextOnly) {
449ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
450ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
451ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  AddPathPoint(m_PathStartX, m_PathStartY, FXPT_LINETO | FXPT_CLOSEFIGURE);
452ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  AddPathObject(FXFILL_ALTERNATE, TRUE);
453ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
454ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_EOFillStrokePath() {
455ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_Options.m_bTextOnly) {
456ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
457ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
458ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  AddPathObject(FXFILL_ALTERNATE, TRUE);
459ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
460ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_BeginMarkedContent_Dictionary() {
461ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_Options.m_bMarkedContent) {
462ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
463ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
464ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_ByteString tag = GetString(1);
465ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* pProperty = GetObject(0);
466ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pProperty) {
467ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
468ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
469ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bDirect = TRUE;
470ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pProperty->IsName()) {
471ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pProperty = FindResourceObj("Properties", pProperty->GetString());
472ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!pProperty)
473ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return;
474ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    bDirect = FALSE;
475ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
476ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (CPDF_Dictionary* pDict = pProperty->AsDictionary()) {
477ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_CurContentMark.GetModify()->AddMark(tag, pDict, bDirect);
478ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
479ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
480ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_BeginMarkedContent() {
481ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_Options.m_bMarkedContent) {
482ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
483ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
484ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_ByteString tag = GetString(0);
485ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_CurContentMark.GetModify()->AddMark(tag, NULL, FALSE);
486e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
487ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
488ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid PDF_ReplaceAbbr(CPDF_Object* pObj) {
489ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (pObj->GetType()) {
490ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_DICTIONARY: {
491ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CPDF_Dictionary* pDict = pObj->AsDictionary();
492ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      std::vector<AbbrReplacementOp> replacements;
493ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      for (const auto& it : *pDict) {
494ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CFX_ByteString key = it.first;
495ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CPDF_Object* value = it.second;
496ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CFX_ByteStringC fullname = PDF_FindFullName(
497ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            PDF_InlineKeyAbbr, FX_ArraySize(PDF_InlineKeyAbbr), key);
498ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (!fullname.IsEmpty()) {
499ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          AbbrReplacementOp op;
500ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          op.is_replace_key = true;
501ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          op.key = key;
502ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          op.replacement = fullname;
503ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          replacements.push_back(op);
504ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          key = fullname;
505e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
506ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
507ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (value->IsName()) {
508ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          CFX_ByteString name = value->GetString();
509ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          fullname = PDF_FindFullName(PDF_InlineValueAbbr,
510ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                      FX_ArraySize(PDF_InlineValueAbbr), name);
511ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (!fullname.IsEmpty()) {
512ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            AbbrReplacementOp op;
513ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            op.is_replace_key = false;
514ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            op.key = key;
515ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            op.replacement = fullname;
516ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            replacements.push_back(op);
517ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
518ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        } else {
519ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          PDF_ReplaceAbbr(value);
520e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
521ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
522ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      for (const auto& op : replacements) {
523ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (op.is_replace_key)
524ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          pDict->ReplaceKey(op.key, op.replacement);
525ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        else
526ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          pDict->SetAtName(op.key, op.replacement);
527ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
528ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
529ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
530ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_ARRAY: {
531ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CPDF_Array* pArray = pObj->AsArray();
532ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      for (FX_DWORD i = 0; i < pArray->GetCount(); i++) {
533ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CPDF_Object* pElement = pArray->GetElement(i);
534ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (pElement->IsName()) {
535ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          CFX_ByteString name = pElement->GetString();
536ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          CFX_ByteStringC fullname = PDF_FindFullName(
537ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              PDF_InlineValueAbbr, FX_ArraySize(PDF_InlineValueAbbr), name);
538ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (!fullname.IsEmpty()) {
539ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            pArray->SetAt(i, new CPDF_Name(fullname));
540ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
541ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        } else {
542ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          PDF_ReplaceAbbr(pElement);
543e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
544ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
545ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
546e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
547ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
548e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
549ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
550ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_BeginText() {
551ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_TextMatrix.Set(1.0f, 0, 0, 1.0f, 0, 0);
552ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  OnChangeTextMatrix();
553ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_TextX = 0;
554ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_TextY = 0;
555ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_TextLineX = 0;
556ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_TextLineY = 0;
557ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
558ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_BeginSectionUndefined() {
559ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_CompatCount++;
560ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
561ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_CurveTo_123() {
562ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_Options.m_bTextOnly) {
563ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
564ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
565ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  AddPathPoint(GetNumber(5), GetNumber(4), FXPT_BEZIERTO);
566ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  AddPathPoint(GetNumber(3), GetNumber(2), FXPT_BEZIERTO);
567ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  AddPathPoint(GetNumber(1), GetNumber(0), FXPT_BEZIERTO);
568ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
569ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_ConcatMatrix() {
570ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT a2 = GetNumber16(5), b2 = GetNumber16(4), c2 = GetNumber16(3),
571ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann           d2 = GetNumber16(2);
572ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT e2 = GetNumber(1), f2 = GetNumber(0);
573ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_Matrix new_matrix(a2, b2, c2, d2, e2, f2);
574ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  new_matrix.Concat(m_pCurStates->m_CTM);
575ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_CTM = new_matrix;
576ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  OnChangeTextMatrix();
577ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
578ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetColorSpace_Fill() {
579ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_Options.m_bTextOnly) {
580ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
581ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
582ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_ByteString csname = GetString(0);
583ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_ColorSpace* pCS = FindColorSpace(csname);
584ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pCS) {
585ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
586ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
587ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_ColorState.GetModify()->m_FillColor.SetColorSpace(pCS);
588ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
589ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetColorSpace_Stroke() {
590ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_Options.m_bTextOnly) {
591ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
592ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
593ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_ByteString csname = GetString(0);
594ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_ColorSpace* pCS = FindColorSpace(csname);
595ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pCS) {
596ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
597ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
598ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_ColorState.GetModify()->m_StrokeColor.SetColorSpace(pCS);
599ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
600ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetDash() {
601ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_Options.m_bTextOnly) {
602ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
603ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
604ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Array* pArray = GetObject(1) ? GetObject(1)->GetArray() : NULL;
605ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pArray) {
606ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
607ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
608ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->SetLineDash(pArray, GetNumber(0), 1.0f);
609ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
610ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetCharWidth() {
611ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_Type3Data[0] = GetNumber(1);
612ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_Type3Data[1] = GetNumber(0);
613ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_bColored = TRUE;
614ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
615ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetCachedDevice() {
616ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int i = 0; i < 6; i++) {
617ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_Type3Data[i] = GetNumber(5 - i);
618ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
619ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_bColored = FALSE;
620ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
621ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_ExecuteXObject() {
622ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_ByteString name = GetString(0);
623ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (name == m_LastImageName && m_pLastImage && m_pLastImage->GetStream() &&
624ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pLastImage->GetStream()->GetObjNum()) {
625ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    AddImage(nullptr, m_pLastImage, FALSE);
626ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
627ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
628ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
629ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_Options.m_bTextOnly) {
630ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!m_pResources)
631ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return;
632ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
633ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_Dictionary* pList = m_pResources->GetDict("XObject");
634ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!pList && m_pPageResources && m_pResources != m_pPageResources)
635ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pList = m_pPageResources->GetDict("XObject");
636ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!pList)
637ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return;
638ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_Reference* pRes = ToReference(pList->GetElement(name));
639ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!pRes)
640ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return;
641ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
642ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_BOOL bForm;
643ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_pDocument->IsFormStream(pRes->GetRefObjNum(), bForm) && !bForm)
644ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return;
645ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
646ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
647ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Stream* pXObject = ToStream(FindResourceObj("XObject", name));
648ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pXObject) {
649ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_bResourceMissing = TRUE;
650ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
651ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
652ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
653ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_ByteStringC type = pXObject->GetDict()
654ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                             ? pXObject->GetDict()->GetConstString("Subtype")
655ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                             : CFX_ByteStringC();
656ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (type == "Image") {
657e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (m_Options.m_bTextOnly) {
658ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return;
659ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
660ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_ImageObject* pObj = AddImage(pXObject, NULL, FALSE);
661ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_LastImageName = name;
662ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pLastImage = pObj->m_pImage;
663ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!m_pObjectList->m_bHasImageMask)
664ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pObjectList->m_bHasImageMask = m_pLastImage->IsMask();
665ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (type == "Form") {
666ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    AddForm(pXObject);
667ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
668ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
669ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
670ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
671ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::AddForm(CPDF_Stream* pStream) {
672ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_Options.m_bSeparateForm) {
673ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_Dictionary* pResources = pStream->GetDict()->GetDict("Resources");
674ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CFX_Matrix form_matrix = pStream->GetDict()->GetMatrix("Matrix");
675ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    form_matrix.Concat(m_pCurStates->m_CTM);
676ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_Array* pBBox = pStream->GetDict()->GetArray("BBox");
677ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CFX_FloatRect form_bbox;
678ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_Path ClipPath;
679ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pBBox) {
680ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      form_bbox = pStream->GetDict()->GetRect("BBox");
681ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      ClipPath.New();
682ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      ClipPath.AppendRect(form_bbox.left, form_bbox.bottom, form_bbox.right,
683ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                          form_bbox.top);
684ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      ClipPath.Transform(&form_matrix);
685ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      form_bbox.Transform(&form_matrix);
686ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
687ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_StreamContentParser parser(m_pDocument, m_pPageResources, m_pResources,
688ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                    &m_mtContentToUser, m_pObjectList,
689ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                    pResources, &form_bbox, &m_Options,
690ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                    m_pCurStates.get(), m_Level + 1);
691ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    parser.m_pCurStates->m_CTM = form_matrix;
692ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (ClipPath.NotNull()) {
693ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      parser.m_pCurStates->m_ClipPath.AppendPath(ClipPath, FXFILL_WINDING,
694ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                 TRUE);
695ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
696ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_StreamAcc stream;
697ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    stream.LoadAllData(pStream, FALSE);
698ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (stream.GetSize() == 0) {
699ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return;
700ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
701ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    parser.Parse(stream.GetData(), stream.GetSize(), 0);
702ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
703ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
704ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_FormObject* pFormObj = new CPDF_FormObject;
705ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pFormObj->m_pForm =
706ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      new CPDF_Form(m_pDocument, m_pPageResources, pStream, m_pResources);
707ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pFormObj->m_FormMatrix = m_pCurStates->m_CTM;
708ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pFormObj->m_FormMatrix.Concat(m_mtContentToUser);
709ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_AllStates status;
710ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  status.m_GeneralState = m_pCurStates->m_GeneralState;
711ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  status.m_GraphState = m_pCurStates->m_GraphState;
712ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  status.m_ColorState = m_pCurStates->m_ColorState;
713ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  status.m_TextState = m_pCurStates->m_TextState;
714ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pFormObj->m_pForm->ParseContent(&status, NULL, NULL, &m_Options, m_Level + 1);
715ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_pObjectList->m_bBackgroundAlphaNeeded &&
716ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pFormObj->m_pForm->m_bBackgroundAlphaNeeded) {
717ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pObjectList->m_bBackgroundAlphaNeeded = TRUE;
718ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
719ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pFormObj->CalcBoundingBox();
720ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  SetGraphicStates(pFormObj, TRUE, TRUE, TRUE);
721ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pObjectList->m_ObjectList.AddTail(pFormObj);
722ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
723ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_ImageObject* CPDF_StreamContentParser::AddImage(CPDF_Stream* pStream,
724ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                     CPDF_Image* pImage,
725ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                     FX_BOOL bInline) {
726ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pStream && !pImage) {
727ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
728ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
729ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_Matrix ImageMatrix;
730ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ImageMatrix.Copy(m_pCurStates->m_CTM);
731ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ImageMatrix.Concat(m_mtContentToUser);
732ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_ImageObject* pImageObj = new CPDF_ImageObject;
733ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pImage) {
734ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pImageObj->m_pImage =
735ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pDocument->GetPageData()->GetImage(pImage->GetStream());
736ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (pStream->GetObjNum()) {
737ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pImageObj->m_pImage = m_pDocument->LoadImageF(pStream);
738ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
739ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pImageObj->m_pImage = new CPDF_Image(m_pDocument);
740ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pImageObj->m_pImage->LoadImageF(pStream, bInline);
741ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
742ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  SetGraphicStates(pImageObj, pImageObj->m_pImage->IsMask(), FALSE, FALSE);
743ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pImageObj->m_Matrix = ImageMatrix;
744ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pImageObj->CalcBoundingBox();
745ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pObjectList->m_ObjectList.AddTail(pImageObj);
746ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return pImageObj;
747ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
748ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_MarkPlace_Dictionary() {}
749ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_EndImage() {}
750ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_EndMarkedContent() {
751ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_Options.m_bMarkedContent) {
752ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
753ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
754ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_CurContentMark.IsNull()) {
755ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
756ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
757ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int count = m_CurContentMark.GetObject()->CountItems();
758ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (count == 1) {
759ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_CurContentMark.SetNull();
760ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
761ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
762ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_CurContentMark.GetModify()->DeleteLastMark();
763ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
764ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_EndText() {
765ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int count = m_ClipTextList.GetSize();
766ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (count == 0) {
767ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
768ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
769ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pCurStates->m_TextState.GetObject()->m_TextMode < 4) {
770ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    for (int i = 0; i < count; i++) {
771ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      delete m_ClipTextList.GetAt(i);
772ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
773ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
774ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pCurStates->m_ClipPath.AppendTexts(m_ClipTextList.GetData(), count);
775ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
776ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_ClipTextList.RemoveAll();
777ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
778ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_EndSectionUndefined() {
779ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_CompatCount) {
780ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_CompatCount--;
781ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
782ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
783ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_FillPath() {
784ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_Options.m_bTextOnly) {
785ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
786ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
787ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  AddPathObject(FXFILL_WINDING, FALSE);
788ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
789ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_FillPathOld() {
790ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_Options.m_bTextOnly) {
791ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
792ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
793ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  AddPathObject(FXFILL_WINDING, FALSE);
794ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
795ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_EOFillPath() {
796ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_Options.m_bTextOnly) {
797ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
798ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
799ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  AddPathObject(FXFILL_ALTERNATE, FALSE);
800ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
801ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetGray_Fill() {
802ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT value = GetNumber(0);
803ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY);
804ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_ColorState.SetFillColor(pCS, &value, 1);
805ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
806ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetGray_Stroke() {
807ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT value = GetNumber(0);
808ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY);
809ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_ColorState.SetStrokeColor(pCS, &value, 1);
810ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
811ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetExtendGraphState() {
812ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_ByteString name = GetString(0);
813ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Dictionary* pGS = ToDictionary(FindResourceObj("ExtGState", name));
814ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pGS) {
815ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_bResourceMissing = TRUE;
816ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
817ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
818ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->ProcessExtGS(pGS, this);
819ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
820ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_ClosePath() {
821ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_Options.m_bTextOnly) {
822ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
823ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
824ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_PathPointCount == 0) {
825ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
826ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
827ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_PathStartX != m_PathCurrentX || m_PathStartY != m_PathCurrentY) {
828ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    AddPathPoint(m_PathStartX, m_PathStartY, FXPT_LINETO | FXPT_CLOSEFIGURE);
829ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (m_pPathPoints[m_PathPointCount - 1].m_Flag != FXPT_MOVETO) {
830ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pPathPoints[m_PathPointCount - 1].m_Flag |= FXPT_CLOSEFIGURE;
831ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
832e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
833ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetFlat() {
834ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_GeneralState.GetModify()->m_Flatness = GetNumber(0);
835e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
836ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_BeginImageData() {}
837ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetLineJoin() {
838ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_GraphState.GetModify()->m_LineJoin =
839ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      (CFX_GraphStateData::LineJoin)GetInteger(0);
840e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
841ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetLineCap() {
842ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_GraphState.GetModify()->m_LineCap =
843ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      (CFX_GraphStateData::LineCap)GetInteger(0);
844e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
845ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetCMYKColor_Fill() {
846ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_ParamCount != 4)
847ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
848ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
849ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT values[4];
850ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int i = 0; i < 4; i++) {
851ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    values[i] = GetNumber(3 - i);
852ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
853ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK);
854ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_ColorState.SetFillColor(pCS, values, 4);
855ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
856ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetCMYKColor_Stroke() {
857ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_ParamCount != 4)
858ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
859ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
860ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT values[4];
861ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int i = 0; i < 4; i++) {
862ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    values[i] = GetNumber(3 - i);
863ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
864ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK);
865ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_ColorState.SetStrokeColor(pCS, values, 4);
866ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
867ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_LineTo() {
868ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_ParamCount != 2)
869ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
870ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
871ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_Options.m_bTextOnly) {
872ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
873ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
874ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  AddPathPoint(GetNumber(1), GetNumber(0), FXPT_LINETO);
875ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
876ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_MoveTo() {
877ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_ParamCount != 2)
878ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
879ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
880ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_Options.m_bTextOnly) {
881ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pSyntax->SkipPathObject();
882ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
883ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
884ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  AddPathPoint(GetNumber(1), GetNumber(0), FXPT_MOVETO);
885ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ParsePathObject();
886ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
887ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetMiterLimit() {
888ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_GraphState.GetModify()->m_MiterLimit = GetNumber(0);
889ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
890ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_MarkPlace() {}
891ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_EndPath() {
892ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_Options.m_bTextOnly) {
893ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
894ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
895ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  AddPathObject(0, FALSE);
896ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
897ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SaveGraphState() {
898ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  std::unique_ptr<CPDF_AllStates> pStates(new CPDF_AllStates);
899ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pStates->Copy(*m_pCurStates);
900ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_StateStack.push_back(std::move(pStates));
901ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
902ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_RestoreGraphState() {
903ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_StateStack.empty())
904ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
905ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  std::unique_ptr<CPDF_AllStates> pStates = std::move(m_StateStack.back());
906ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_StateStack.pop_back();
907ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->Copy(*pStates);
908ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
909ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_Rectangle() {
910ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_Options.m_bTextOnly) {
911ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
912ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
913ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT x = GetNumber(3), y = GetNumber(2);
914ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT w = GetNumber(1), h = GetNumber(0);
915ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  AddPathRect(x, y, w, h);
916ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
917ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::AddPathRect(FX_FLOAT x,
918ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                           FX_FLOAT y,
919ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                           FX_FLOAT w,
920ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                           FX_FLOAT h) {
921ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  AddPathPoint(x, y, FXPT_MOVETO);
922ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  AddPathPoint(x + w, y, FXPT_LINETO);
923ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  AddPathPoint(x + w, y + h, FXPT_LINETO);
924ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  AddPathPoint(x, y + h, FXPT_LINETO);
925ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  AddPathPoint(x, y, FXPT_LINETO | FXPT_CLOSEFIGURE);
926ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
927ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetRGBColor_Fill() {
928ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_ParamCount != 3)
929ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
930ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
931ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT values[3];
932ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int i = 0; i < 3; i++) {
933ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    values[i] = GetNumber(2 - i);
934ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
935ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB);
936ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_ColorState.SetFillColor(pCS, values, 3);
937ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
938ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetRGBColor_Stroke() {
939ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_ParamCount != 3)
940ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
941ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
942ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT values[3];
943ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int i = 0; i < 3; i++) {
944ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    values[i] = GetNumber(2 - i);
945ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
946ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB);
947ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_ColorState.SetStrokeColor(pCS, values, 3);
948ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
949ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetRenderIntent() {}
950ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_CloseStrokePath() {
951ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_Options.m_bTextOnly) {
952ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
953ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
954ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  Handle_ClosePath();
955ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  AddPathObject(0, TRUE);
956ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
957ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_StrokePath() {
958ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_Options.m_bTextOnly) {
959ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
960ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
961ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  AddPathObject(0, TRUE);
962ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
963ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetColor_Fill() {
964ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_Options.m_bTextOnly) {
965ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
966ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
967ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT values[4];
968ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int nargs = m_ParamCount;
969ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (nargs > 4) {
970ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    nargs = 4;
971ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
972ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int i = 0; i < nargs; i++) {
973ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    values[i] = GetNumber(nargs - i - 1);
974ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
975ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_ColorState.SetFillColor(NULL, values, nargs);
976ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
977ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetColor_Stroke() {
978ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_Options.m_bTextOnly) {
979ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
980ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
981ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT values[4];
982ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int nargs = m_ParamCount;
983ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (nargs > 4) {
984ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    nargs = 4;
985ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
986ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int i = 0; i < nargs; i++) {
987ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    values[i] = GetNumber(nargs - i - 1);
988ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
989ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_ColorState.SetStrokeColor(NULL, values, nargs);
990ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
991ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetColorPS_Fill() {
992ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_Options.m_bTextOnly) {
993ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
994ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
995ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* pLastParam = GetObject(0);
996ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pLastParam) {
997ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
998ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
999ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int nargs = m_ParamCount;
1000ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int nvalues = nargs;
1001ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pLastParam->IsName()) {
1002ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    nvalues--;
1003ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1004ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT* values = NULL;
1005ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (nvalues) {
1006ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    values = FX_Alloc(FX_FLOAT, nvalues);
1007ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    for (int i = 0; i < nvalues; i++) {
1008ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      values[i] = GetNumber(nargs - i - 1);
1009ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1010ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1011ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (nvalues != nargs) {
1012ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_Pattern* pPattern = FindPattern(GetString(0), FALSE);
1013ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pPattern) {
1014ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pCurStates->m_ColorState.SetFillPattern(pPattern, values, nvalues);
1015ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1016ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
1017ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pCurStates->m_ColorState.SetFillColor(NULL, values, nvalues);
1018ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1019ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_Free(values);
1020ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1021ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetColorPS_Stroke() {
1022ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_Options.m_bTextOnly) {
1023ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
1024ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1025ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* pLastParam = GetObject(0);
1026ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pLastParam) {
1027ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
1028ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1029ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int nargs = m_ParamCount;
1030ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int nvalues = nargs;
1031ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pLastParam->IsName())
1032ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    nvalues--;
1033ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1034ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT* values = NULL;
1035ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (nvalues) {
1036ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    values = FX_Alloc(FX_FLOAT, nvalues);
1037ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    for (int i = 0; i < nvalues; i++) {
1038ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      values[i] = GetNumber(nargs - i - 1);
1039ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1040ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1041ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (nvalues != nargs) {
1042ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_Pattern* pPattern = FindPattern(GetString(0), FALSE);
1043ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pPattern) {
1044ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pCurStates->m_ColorState.SetStrokePattern(pPattern, values, nvalues);
1045ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1046ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
1047ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pCurStates->m_ColorState.SetStrokeColor(NULL, values, nvalues);
1048ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1049ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_Free(values);
1050ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1051ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_FloatRect GetShadingBBox(CPDF_Stream* pStream,
1052ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                             ShadingType type,
1053ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                             const CFX_Matrix* pMatrix,
1054ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                             CPDF_Function** pFuncs,
1055ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                             int nFuncs,
1056ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                             CPDF_ColorSpace* pCS);
1057ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1058ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_ShadeFill() {
1059ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_Options.m_bTextOnly) {
1060ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
1061ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1062ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Pattern* pPattern = FindPattern(GetString(0), TRUE);
1063ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pPattern) {
1064ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
1065ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1066ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pPattern->m_PatternType != CPDF_Pattern::SHADING) {
1067ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
1068ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1069ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_ShadingPattern* pShading = static_cast<CPDF_ShadingPattern*>(pPattern);
1070ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pShading->m_bShadingObj) {
1071ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
1072ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1073ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pShading->Load()) {
1074ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
1075ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1076ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_ShadingObject* pObj = new CPDF_ShadingObject;
1077ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pObj->m_pShading = pShading;
1078ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  SetGraphicStates(pObj, FALSE, FALSE, FALSE);
1079ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pObj->m_Matrix = m_pCurStates->m_CTM;
1080ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pObj->m_Matrix.Concat(m_mtContentToUser);
1081ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_FloatRect bbox;
1082ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pObj->m_ClipPath.IsNull()) {
1083ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    bbox = pObj->m_ClipPath.GetClipBox();
1084ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
1085ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    bbox = m_BBox;
1086ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1087ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pShading->IsMeshShading()) {
1088ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    bbox.Intersect(GetShadingBBox(ToStream(pShading->m_pShadingObj),
1089ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                  pShading->m_ShadingType, &pObj->m_Matrix,
1090ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                  pShading->m_pFunctions, pShading->m_nFuncs,
1091ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                  pShading->m_pCS));
1092ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1093ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pObj->m_Left = bbox.left;
1094ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pObj->m_Right = bbox.right;
1095ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pObj->m_Top = bbox.top;
1096ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pObj->m_Bottom = bbox.bottom;
1097ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pObjectList->m_ObjectList.AddTail(pObj);
1098ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1099ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetCharSpace() {
1100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_TextState.GetModify()->m_CharSpace = GetNumber(0);
1101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_MoveTextPoint() {
1103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_TextLineX += GetNumber(1);
1104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_TextLineY += GetNumber(0);
1105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_TextX = m_pCurStates->m_TextLineX;
1106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_TextY = m_pCurStates->m_TextLineY;
1107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_MoveTextPoint_SetLeading() {
1109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  Handle_MoveTextPoint();
1110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_TextLeading = -GetNumber(0);
1111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetFont() {
1113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT fs = GetNumber(0);
1114ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (fs == 0) {
1115ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    fs = m_DefFontSize;
1116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_TextState.GetModify()->m_FontSize = fs;
1118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Font* pFont = FindFont(GetString(1));
1119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pFont) {
1120ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pCurStates->m_TextState.SetFont(pFont);
1121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Object* CPDF_StreamContentParser::FindResourceObj(
1124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    const CFX_ByteStringC& type,
1125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    const CFX_ByteString& name) {
1126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_pResources) {
1127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
1128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pResources == m_pPageResources) {
1130e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPDF_Dictionary* pList = m_pResources->GetDict(type);
1131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!pList) {
1132ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return NULL;
1133e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1134e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPDF_Object* pRes = pList->GetElementValue(name);
1135e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return pRes;
1136ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1137ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Dictionary* pList = m_pResources->GetDict(type);
1138ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pList) {
1139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!m_pPageResources) {
1140ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return NULL;
1141e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1142ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_Dictionary* pList = m_pPageResources->GetDict(type);
1143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!pList) {
1144ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return NULL;
1145e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1146ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_Object* pRes = pList->GetElementValue(name);
1147ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return pRes;
1148ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1149ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* pRes = pList->GetElementValue(name);
1150ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return pRes;
1151ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Font* CPDF_StreamContentParser::FindFont(const CFX_ByteString& name) {
1153ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Dictionary* pFontDict = ToDictionary(FindResourceObj("Font", name));
1154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pFontDict) {
1155ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_bResourceMissing = TRUE;
1156ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return CPDF_Font::GetStockFont(m_pDocument, "Helvetica");
1157ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1158ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1159ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Font* pFont = m_pDocument->LoadFont(pFontDict);
1160ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pFont && pFont->GetType3Font()) {
1161ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pFont->GetType3Font()->SetPageResources(m_pResources);
1162ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pFont->GetType3Font()->CheckType3FontMetrics();
1163ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1164ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return pFont;
1165ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1166ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_ColorSpace* CPDF_StreamContentParser::FindColorSpace(
1167ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    const CFX_ByteString& name) {
1168ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (name == "Pattern") {
1169ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return CPDF_ColorSpace::GetStockCS(PDFCS_PATTERN);
1170ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1171ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (name == "DeviceGray" || name == "DeviceCMYK" || name == "DeviceRGB") {
1172ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CFX_ByteString defname = "Default";
1173ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    defname += name.Mid(7);
1174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_Object* pDefObj = FindResourceObj("ColorSpace", defname);
1175ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!pDefObj) {
1176ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (name == "DeviceGray") {
1177ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY);
1178ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1179ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (name == "DeviceRGB") {
1180ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB);
1181ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1182ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK);
1183ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1184ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return m_pDocument->LoadColorSpace(pDefObj);
1185ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1186ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* pCSObj = FindResourceObj("ColorSpace", name);
1187ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pCSObj) {
1188ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_bResourceMissing = TRUE;
1189ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
1190ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1191ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_pDocument->LoadColorSpace(pCSObj);
1192ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1193ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Pattern* CPDF_StreamContentParser::FindPattern(const CFX_ByteString& name,
1194ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                    FX_BOOL bShading) {
1195ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* pPattern =
1196ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FindResourceObj(bShading ? "Shading" : "Pattern", name);
1197ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pPattern || (!pPattern->IsDictionary() && !pPattern->IsStream())) {
1198ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_bResourceMissing = TRUE;
1199ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
1200ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1201ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_pDocument->LoadPattern(pPattern, bShading,
1202ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                  &m_pCurStates->m_ParentMatrix);
1203ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1204ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::ConvertTextSpace(FX_FLOAT& x, FX_FLOAT& y) {
1205ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_TextMatrix.Transform(x, y, x, y);
1206ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ConvertUserSpace(x, y);
1207ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1208ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::ConvertUserSpace(FX_FLOAT& x, FX_FLOAT& y) {
1209ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_CTM.Transform(x, y, x, y);
1210ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_mtContentToUser.Transform(x, y, x, y);
1211ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1212ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::AddTextObject(CFX_ByteString* pStrs,
1213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                             FX_FLOAT fInitKerning,
1214ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                             FX_FLOAT* pKerning,
1215ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                             int nsegs) {
1216ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Font* pFont = m_pCurStates->m_TextState.GetFont();
1217ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pFont) {
1218ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
1219ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1220ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (fInitKerning != 0) {
1221ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!pFont->IsVertWriting()) {
1222ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pCurStates->m_TextX -=
1223ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          FXSYS_Mul(fInitKerning, m_pCurStates->m_TextState.GetFontSize()) /
1224ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          1000;
1225e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    } else {
1226ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pCurStates->m_TextY -=
1227ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          FXSYS_Mul(fInitKerning, m_pCurStates->m_TextState.GetFontSize()) /
1228ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          1000;
1229ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1230ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1231ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (nsegs == 0) {
1232ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
1233ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1234ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int textmode;
1235ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pFont->GetFontType() == PDFFONT_TYPE3) {
1236ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    textmode = 0;
1237ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
1238ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    textmode = m_pCurStates->m_TextState.GetObject()->m_TextMode;
1239ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1240ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_TextObject* pText = new CPDF_TextObject;
1241ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pLastTextObject = pText;
1242ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  SetGraphicStates(pText, TRUE, TRUE, TRUE);
1243ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (textmode && textmode != 3 && textmode != 4 && textmode != 7) {
1244ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_FLOAT* pCTM = pText->m_TextState.GetModify()->m_CTM;
1245ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pCTM[0] = m_pCurStates->m_CTM.a;
1246ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pCTM[1] = m_pCurStates->m_CTM.c;
1247ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pCTM[2] = m_pCurStates->m_CTM.b;
1248ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pCTM[3] = m_pCurStates->m_CTM.d;
1249ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1250ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pText->SetSegments(pStrs, pKerning, nsegs);
1251ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pText->m_PosX = m_pCurStates->m_TextX;
1252ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pText->m_PosY = m_pCurStates->m_TextY + m_pCurStates->m_TextRise;
1253ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ConvertTextSpace(pText->m_PosX, pText->m_PosY);
1254ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT x_advance, y_advance;
1255ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pText->CalcPositionData(&x_advance, &y_advance, m_pCurStates->m_TextHorzScale,
1256ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                          m_Level);
1257ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_TextX += x_advance;
1258ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_TextY += y_advance;
1259ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (textmode > 3) {
1260ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_TextObject* pCopy = new CPDF_TextObject;
1261ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pCopy->Copy(pText);
1262ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_ClipTextList.Add(pCopy);
1263ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1264ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pObjectList->m_ObjectList.AddTail(pText);
1265ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pKerning && pKerning[nsegs - 1] != 0) {
1266ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!pFont->IsVertWriting()) {
1267ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pCurStates->m_TextX -=
1268ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          FXSYS_Mul(pKerning[nsegs - 1],
1269ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                    m_pCurStates->m_TextState.GetFontSize()) /
1270ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          1000;
1271ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
1272ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pCurStates->m_TextY -=
1273ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          FXSYS_Mul(pKerning[nsegs - 1],
1274ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                    m_pCurStates->m_TextState.GetFontSize()) /
1275ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          1000;
1276ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1277ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1278ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1279ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_ShowText() {
1280ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_ByteString str = GetString(0);
1281ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (str.IsEmpty()) {
1282ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
1283ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1284ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  AddTextObject(&str, 0, NULL, 1);
1285ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1286ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_ShowText_Positioning() {
1287ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Array* pArray = GetObject(0) ? GetObject(0)->GetArray() : NULL;
1288ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pArray) {
1289ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
1290ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1291ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int n = pArray->GetCount();
1292ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int nsegs = 0;
1293ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int i = 0; i < n; i++) {
1294ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pArray->GetElementValue(i)->IsString())
1295ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      nsegs++;
1296ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1297ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (nsegs == 0) {
1298ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    for (int i = 0; i < n; i++) {
1299ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pCurStates->m_TextX -=
1300ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          FXSYS_Mul(pArray->GetNumber(i),
1301ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                    m_pCurStates->m_TextState.GetFontSize()) /
1302ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          1000;
1303ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1304ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
1305ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1306ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_ByteString* pStrs = new CFX_ByteString[nsegs];
1307ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT* pKerning = FX_Alloc(FX_FLOAT, nsegs);
1308ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int iSegment = 0;
1309ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT fInitKerning = 0;
1310ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int i = 0; i < n; i++) {
1311ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_Object* pObj = pArray->GetElementValue(i);
1312ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pObj->IsString()) {
1313ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CFX_ByteString str = pObj->GetString();
1314ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (str.IsEmpty()) {
1315ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        continue;
1316ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1317ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pStrs[iSegment] = str;
1318ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pKerning[iSegment++] = 0;
1319ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
1320ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FX_FLOAT num = pObj ? pObj->GetNumber() : 0;
1321ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (iSegment == 0) {
1322ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        fInitKerning += num;
1323ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else {
1324ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pKerning[iSegment - 1] += num;
1325ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1326ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1327ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1328ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  AddTextObject(pStrs, fInitKerning, pKerning, iSegment);
1329ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  delete[] pStrs;
1330ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_Free(pKerning);
1331ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1332ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetTextLeading() {
1333ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_TextLeading = GetNumber(0);
1334ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1335ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetTextMatrix() {
1336ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_TextMatrix.Set(GetNumber16(5), GetNumber16(4), GetNumber16(3),
1337ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                 GetNumber16(2), GetNumber(1), GetNumber(0));
1338ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  OnChangeTextMatrix();
1339ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_TextX = 0;
1340ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_TextY = 0;
1341ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_TextLineX = 0;
1342ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_TextLineY = 0;
1343ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1344ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::OnChangeTextMatrix() {
1345ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_Matrix text_matrix(m_pCurStates->m_TextHorzScale, 0.0f, 0.0f, 1.0f, 0.0f,
1346ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                         0.0f);
1347ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  text_matrix.Concat(m_pCurStates->m_TextMatrix);
1348ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  text_matrix.Concat(m_pCurStates->m_CTM);
1349ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  text_matrix.Concat(m_mtContentToUser);
1350ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT* pTextMatrix = m_pCurStates->m_TextState.GetModify()->m_Matrix;
1351ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pTextMatrix[0] = text_matrix.a;
1352ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pTextMatrix[1] = text_matrix.c;
1353ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pTextMatrix[2] = text_matrix.b;
1354ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pTextMatrix[3] = text_matrix.d;
1355ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1356ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetTextRenderMode() {
1357ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int mode = GetInteger(0);
1358ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (mode < 0 || mode > 7) {
1359ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
1360ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1361ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_TextState.GetModify()->m_TextMode = mode;
1362ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1363ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetTextRise() {
1364ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_TextRise = GetNumber(0);
1365ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1366ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetWordSpace() {
1367ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_TextState.GetModify()->m_WordSpace = GetNumber(0);
1368ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1369ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetHorzScale() {
1370ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_ParamCount != 1) {
1371ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
1372ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1373ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_TextHorzScale = GetNumber(0) / 100;
1374ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  OnChangeTextMatrix();
1375ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1376ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_MoveToNextLine() {
1377ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_TextLineY -= m_pCurStates->m_TextLeading;
1378ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_TextX = m_pCurStates->m_TextLineX;
1379ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_TextY = m_pCurStates->m_TextLineY;
1380ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1381ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_CurveTo_23() {
1382ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_Options.m_bTextOnly) {
1383ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
1384ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1385ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  AddPathPoint(m_PathCurrentX, m_PathCurrentY, FXPT_BEZIERTO);
1386ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  AddPathPoint(GetNumber(3), GetNumber(2), FXPT_BEZIERTO);
1387ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  AddPathPoint(GetNumber(1), GetNumber(0), FXPT_BEZIERTO);
1388ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1389ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetLineWidth() {
1390ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT width = GetNumber(0);
1391ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_GraphState.GetModify()->m_LineWidth = width;
1392ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1393ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_Clip() {
1394ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_PathClipType = FXFILL_WINDING;
1395ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1396ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_EOClip() {
1397ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_PathClipType = FXFILL_ALTERNATE;
1398ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1399ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_CurveTo_13() {
1400ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_Options.m_bTextOnly) {
1401ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
1402ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1403ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  AddPathPoint(GetNumber(3), GetNumber(2), FXPT_BEZIERTO);
1404ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  AddPathPoint(GetNumber(1), GetNumber(0), FXPT_BEZIERTO);
1405ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  AddPathPoint(GetNumber(1), GetNumber(0), FXPT_BEZIERTO);
1406ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1407ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_NextLineShowText() {
1408ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  Handle_MoveToNextLine();
1409ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  Handle_ShowText();
1410ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1411ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_NextLineShowText_Space() {
1412ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_TextState.GetModify()->m_WordSpace = GetNumber(2);
1413ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurStates->m_TextState.GetModify()->m_CharSpace = GetNumber(1);
1414ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  Handle_NextLineShowText();
1415ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1416ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_Invalid() {}
1417ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::AddPathPoint(FX_FLOAT x, FX_FLOAT y, int flag) {
1418ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_PathCurrentX = x;
1419ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_PathCurrentY = y;
1420ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (flag == FXPT_MOVETO) {
1421ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_PathStartX = x;
1422ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_PathStartY = y;
1423ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_PathPointCount &&
1424ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pPathPoints[m_PathPointCount - 1].m_Flag == FXPT_MOVETO) {
1425ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pPathPoints[m_PathPointCount - 1].m_PointX = x;
1426ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pPathPoints[m_PathPointCount - 1].m_PointY = y;
1427ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return;
1428ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1429ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (m_PathPointCount == 0) {
1430ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
1431ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1432ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_PathPointCount++;
1433ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_PathPointCount > m_PathAllocSize) {
1434ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int newsize = m_PathPointCount + 256;
1435ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_PATHPOINT* pNewPoints = FX_Alloc(FX_PATHPOINT, newsize);
1436ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_PathAllocSize) {
1437ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FXSYS_memcpy(pNewPoints, m_pPathPoints,
1438ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                   m_PathAllocSize * sizeof(FX_PATHPOINT));
1439ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FX_Free(m_pPathPoints);
1440ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1441ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pPathPoints = pNewPoints;
1442ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_PathAllocSize = newsize;
1443ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1444ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pPathPoints[m_PathPointCount - 1].m_Flag = flag;
1445ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pPathPoints[m_PathPointCount - 1].m_PointX = x;
1446ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pPathPoints[m_PathPointCount - 1].m_PointY = y;
1447ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1448ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamContentParser::AddPathObject(int FillType, FX_BOOL bStroke) {
1449ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int PathPointCount = m_PathPointCount, PathClipType = m_PathClipType;
1450ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_PathPointCount = 0;
1451ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_PathClipType = 0;
1452ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (PathPointCount <= 1) {
1453ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (PathPointCount && PathClipType) {
1454ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CPDF_Path path;
1455ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      path.New()->AppendRect(0, 0, 0, 0);
1456ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pCurStates->m_ClipPath.AppendPath(path, FXFILL_WINDING, TRUE);
1457ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1458ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
1459ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1460ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (PathPointCount &&
1461ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pPathPoints[PathPointCount - 1].m_Flag == FXPT_MOVETO) {
1462ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    PathPointCount--;
1463ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1464ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Path Path;
1465ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_PathData* pPathData = Path.New();
1466ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pPathData->SetPointCount(PathPointCount);
1467ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_memcpy(pPathData->GetPoints(), m_pPathPoints,
1468ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann               sizeof(FX_PATHPOINT) * PathPointCount);
1469ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_Matrix matrix = m_pCurStates->m_CTM;
1470ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  matrix.Concat(m_mtContentToUser);
1471ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (bStroke || FillType) {
1472ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_PathObject* pPathObj = new CPDF_PathObject;
1473ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pPathObj->m_bStroke = bStroke;
1474ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pPathObj->m_FillType = FillType;
1475ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pPathObj->m_Path = Path;
1476ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pPathObj->m_Matrix = matrix;
1477ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    SetGraphicStates(pPathObj, TRUE, FALSE, TRUE);
1478ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pPathObj->CalcBoundingBox();
1479ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pObjectList->m_ObjectList.AddTail(pPathObj);
1480ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1481ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (PathClipType) {
1482ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!matrix.IsIdentity()) {
1483ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      Path.Transform(&matrix);
1484ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      matrix.SetIdentity();
1485ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1486ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pCurStates->m_ClipPath.AppendPath(Path, PathClipType, TRUE);
1487ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1488e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1489