14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2016 PDFium Authors. All rights reserved.
24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be
34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// found in the LICENSE file.
44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/page/cpdf_streamcontentparser.h"
84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <memory>
104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <utility>
114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <vector>
124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/font/cpdf_font.h"
144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/font/cpdf_type3font.h"
154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/page/cpdf_allstates.h"
164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/page/cpdf_docpagedata.h"
174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/page/cpdf_form.h"
184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/page/cpdf_formobject.h"
194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/page/cpdf_image.h"
204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/page/cpdf_imageobject.h"
214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/page/cpdf_meshstream.h"
224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/page/cpdf_pageobject.h"
234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/page/cpdf_pathobject.h"
244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/page/cpdf_shadingobject.h"
254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/page/cpdf_shadingpattern.h"
264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/page/cpdf_streamparser.h"
274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/page/cpdf_textobject.h"
284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/page/pageint.h"
294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_array.h"
304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_dictionary.h"
314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_document.h"
324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_name.h"
334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_number.h"
344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_reference.h"
354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_stream.h"
364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/fpdf_parser_decode.h"
374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcrt/fx_safe_types.h"
384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxge/cfx_graphstatedata.h"
394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "third_party/base/ptr_util.h"
404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannnamespace {
424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst int kMaxFormLevel = 30;
444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst int kSingleCoordinatePair = 1;
464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst int kTensorCoordinatePairs = 16;
474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst int kCoonsCoordinatePairs = 12;
484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst int kSingleColorPerPatch = 1;
494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst int kQuadColorsPerPatch = 4;
504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst char kPathOperatorSubpath = 'm';
524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst char kPathOperatorLine = 'l';
534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst char kPathOperatorCubicBezier1 = 'c';
544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst char kPathOperatorCubicBezier2 = 'v';
554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst char kPathOperatorCubicBezier3 = 'y';
564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst char kPathOperatorClosePath = 'h';
574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst char kPathOperatorRectangle[] = "re";
584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CPDF_StreamParserAutoClearer {
604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann public:
614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_StreamParserAutoClearer(CPDF_StreamParser** scoped_variable,
624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                               CPDF_StreamParser* new_parser)
634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      : scoped_variable_(scoped_variable) {
644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    *scoped_variable_ = new_parser;
654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ~CPDF_StreamParserAutoClearer() { *scoped_variable_ = nullptr; }
674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann private:
694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_StreamParser** scoped_variable_;
704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann};
714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_FloatRect GetShadingBBox(CPDF_ShadingPattern* pShading,
734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                             const CFX_Matrix& matrix) {
744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ShadingType type = pShading->GetShadingType();
754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Stream* pStream = ToStream(pShading->GetShadingObject());
764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_ColorSpace* pCS = pShading->GetCS();
774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pStream || !pCS)
784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return CFX_FloatRect(0, 0, 0, 0);
794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_MeshStream stream(type, pShading->GetFuncs(), pStream, pCS);
814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!stream.Load())
824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return CFX_FloatRect(0, 0, 0, 0);
834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_FloatRect rect;
854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool bStarted = false;
864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool bGouraud = type == kFreeFormGouraudTriangleMeshShading ||
874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                  type == kLatticeFormGouraudTriangleMeshShading;
884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int point_count = kSingleCoordinatePair;
904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (type == kTensorProductPatchMeshShading)
914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    point_count = kTensorCoordinatePairs;
924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  else if (type == kCoonsPatchMeshShading)
934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    point_count = kCoonsCoordinatePairs;
944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int color_count = kSingleColorPerPatch;
964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (type == kCoonsPatchMeshShading || type == kTensorProductPatchMeshShading)
974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    color_count = kQuadColorsPerPatch;
984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  while (!stream.BitStream()->IsEOF()) {
1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    uint32_t flag = 0;
10133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    if (type != kLatticeFormGouraudTriangleMeshShading) {
10233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann      if (!stream.CanReadFlag())
10333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann        break;
10433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann      flag = stream.ReadFlag();
10533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    }
1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!bGouraud && flag) {
1084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      point_count -= 4;
1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      color_count -= 2;
1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    for (int i = 0; i < point_count; i++) {
11333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann      if (!stream.CanReadCoords())
11433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann        break;
11533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann      CFX_PointF origin = stream.ReadCoords();
1164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (bStarted) {
11733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann        rect.UpdateRect(origin.x, origin.y);
1184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      } else {
11933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann        rect.InitRect(origin.x, origin.y);
1204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        bStarted = true;
1214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
1224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
1234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    FX_SAFE_UINT32 nBits = stream.Components();
1244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    nBits *= stream.ComponentBits();
1254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    nBits *= color_count;
1264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!nBits.IsValid())
1274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
1284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    stream.BitStream()->SkipBits(nBits.ValueOrDie());
1304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (bGouraud)
1314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      stream.BitStream()->ByteAlign();
1324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
13333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  matrix.TransformRect(rect);
1344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return rect;
1354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannstruct AbbrPair {
1384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const FX_CHAR* abbr;
1394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const FX_CHAR* full_name;
1404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann};
1414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst AbbrPair InlineKeyAbbr[] = {
1434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    {"BPC", "BitsPerComponent"}, {"CS", "ColorSpace"}, {"D", "Decode"},
1444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    {"DP", "DecodeParms"},       {"F", "Filter"},      {"H", "Height"},
1454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    {"IM", "ImageMask"},         {"I", "Interpolate"}, {"W", "Width"},
1464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann};
1474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst AbbrPair InlineValueAbbr[] = {
1494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    {"G", "DeviceGray"},       {"RGB", "DeviceRGB"},
1504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    {"CMYK", "DeviceCMYK"},    {"I", "Indexed"},
1514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    {"AHx", "ASCIIHexDecode"}, {"A85", "ASCII85Decode"},
1524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    {"LZW", "LZWDecode"},      {"Fl", "FlateDecode"},
1534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    {"RL", "RunLengthDecode"}, {"CCF", "CCITTFaxDecode"},
1544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    {"DCT", "DCTDecode"},
1554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann};
1564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannstruct AbbrReplacementOp {
1584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool is_replace_key;
1594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteString key;
1604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteStringC replacement;
1614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann};
1624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_ByteStringC FindFullName(const AbbrPair* table,
1644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                             size_t count,
1654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                             const CFX_ByteStringC& abbr) {
1664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto it = std::find_if(table, table + count, [abbr](const AbbrPair& pair) {
1674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return pair.abbr == abbr;
1684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  });
1694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return it != table + count ? CFX_ByteStringC(it->full_name)
1704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                             : CFX_ByteStringC();
1714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid ReplaceAbbr(CPDF_Object* pObj) {
1744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  switch (pObj->GetType()) {
1754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case CPDF_Object::DICTIONARY: {
1764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CPDF_Dictionary* pDict = pObj->AsDictionary();
1774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      std::vector<AbbrReplacementOp> replacements;
1784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      for (const auto& it : *pDict) {
1794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        CFX_ByteString key = it.first;
1804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        CPDF_Object* value = it.second.get();
1814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        CFX_ByteStringC fullname = FindFullName(
1824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            InlineKeyAbbr, FX_ArraySize(InlineKeyAbbr), key.AsStringC());
1834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (!fullname.IsEmpty()) {
1844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          AbbrReplacementOp op;
1854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          op.is_replace_key = true;
1864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          op.key = key;
1874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          op.replacement = fullname;
1884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          replacements.push_back(op);
1894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          key = fullname;
1904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
1914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (value->IsName()) {
1934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          CFX_ByteString name = value->GetString();
1944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          fullname = FindFullName(
1954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              InlineValueAbbr, FX_ArraySize(InlineValueAbbr), name.AsStringC());
1964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          if (!fullname.IsEmpty()) {
1974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            AbbrReplacementOp op;
1984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            op.is_replace_key = false;
1994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            op.key = key;
2004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            op.replacement = fullname;
2014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            replacements.push_back(op);
2024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          }
2034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        } else {
2044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          ReplaceAbbr(value);
2054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
2064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
2074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      for (const auto& op : replacements) {
2084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (op.is_replace_key)
2094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          pDict->ReplaceKey(op.key, CFX_ByteString(op.replacement));
2104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        else
2114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          pDict->SetNewFor<CPDF_Name>(op.key, CFX_ByteString(op.replacement));
2124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
2134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
2144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
2154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case CPDF_Object::ARRAY: {
2164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CPDF_Array* pArray = pObj->AsArray();
2174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      for (size_t i = 0; i < pArray->GetCount(); i++) {
2184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        CPDF_Object* pElement = pArray->GetObjectAt(i);
2194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (pElement->IsName()) {
2204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          CFX_ByteString name = pElement->GetString();
2214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          CFX_ByteStringC fullname = FindFullName(
2224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              InlineValueAbbr, FX_ArraySize(InlineValueAbbr), name.AsStringC());
2234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          if (!fullname.IsEmpty())
2244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            pArray->SetNewAt<CPDF_Name>(i, CFX_ByteString(fullname));
2254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        } else {
2264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          ReplaceAbbr(pElement);
2274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
2284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
2294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
2304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
2314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    default:
2324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
2334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}  // namespace
2374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_ByteStringC PDF_FindKeyAbbreviationForTesting(const CFX_ByteStringC& abbr) {
2394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return FindFullName(InlineKeyAbbr, FX_ArraySize(InlineKeyAbbr), abbr);
2404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_ByteStringC PDF_FindValueAbbreviationForTesting(
2434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    const CFX_ByteStringC& abbr) {
2444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return FindFullName(InlineValueAbbr, FX_ArraySize(InlineValueAbbr), abbr);
2454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_StreamContentParser::CPDF_StreamContentParser(
2484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_Document* pDocument,
2494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_Dictionary* pPageResources,
2504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_Dictionary* pParentResources,
2514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    const CFX_Matrix* pmtContentToUser,
2524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_PageObjectHolder* pObjHolder,
2534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_Dictionary* pResources,
2544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFX_FloatRect* pBBox,
2554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_AllStates* pStates,
2564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    int level)
2574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    : m_pDocument(pDocument),
2584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pPageResources(pPageResources),
2594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pParentResources(pParentResources),
2604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pResources(pResources),
2614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pObjectHolder(pObjHolder),
2624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_Level(level),
2634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_ParamStartPos(0),
2644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_ParamCount(0),
2654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pCurStates(new CPDF_AllStates),
2664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pLastTextObject(nullptr),
2674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_DefFontSize(0),
2684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pPathPoints(nullptr),
2694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_PathPointCount(0),
2704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_PathAllocSize(0),
27133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann      m_PathStartX(0.0f),
27233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann      m_PathStartY(0.0f),
2734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_PathCurrentX(0.0f),
2744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_PathCurrentY(0.0f),
2754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_PathClipType(0),
2764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pLastImage(nullptr),
2774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_bColored(false),
2784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_bResourceMissing(false) {
2794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pmtContentToUser)
2804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_mtContentToUser = *pmtContentToUser;
2814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_pResources)
2824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pResources = m_pParentResources;
2834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_pResources)
2844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pResources = m_pPageResources;
2854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pBBox)
2864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_BBox = *pBBox;
2874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pStates) {
2884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pCurStates->Copy(*pStates);
2894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else {
2904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pCurStates->m_GeneralState.Emplace();
2914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pCurStates->m_GraphState.Emplace();
2924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pCurStates->m_TextState.Emplace();
2934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pCurStates->m_ColorState.Emplace();
2944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (size_t i = 0; i < FX_ArraySize(m_Type3Data); ++i) {
2964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_Type3Data[i] = 0.0;
2974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_StreamContentParser::~CPDF_StreamContentParser() {
3014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ClearAllParams();
3024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_Free(m_pPathPoints);
3034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint CPDF_StreamContentParser::GetNextParamPos() {
3064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_ParamCount == kParamBufSize) {
3074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_ParamStartPos++;
3084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (m_ParamStartPos == kParamBufSize) {
3094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_ParamStartPos = 0;
3104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
3114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (m_ParamBuf[m_ParamStartPos].m_Type == ContentParam::OBJECT)
3124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_ParamBuf[m_ParamStartPos].m_pObject.reset();
3134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return m_ParamStartPos;
3154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
3164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int index = m_ParamStartPos + m_ParamCount;
3174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (index >= kParamBufSize) {
3184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    index -= kParamBufSize;
3194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
3204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_ParamCount++;
3214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return index;
3224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
32433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmannvoid CPDF_StreamContentParser::AddNameParam(const CFX_ByteStringC& bsName) {
3254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ContentParam& param = m_ParamBuf[GetNextParamPos()];
32633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  if (bsName.GetLength() > 32) {
3274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    param.m_Type = ContentParam::OBJECT;
3284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    param.m_pObject = pdfium::MakeUnique<CPDF_Name>(
3294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        m_pDocument->GetByteStringPool(), PDF_NameDecode(bsName));
3304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else {
3314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    param.m_Type = ContentParam::NAME;
3324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (bsName.Find('#') == -1) {
33333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann      FXSYS_memcpy(param.m_Name.m_Buffer, bsName.raw_str(), bsName.GetLength());
33433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann      param.m_Name.m_Len = bsName.GetLength();
3354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else {
3364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CFX_ByteString str = PDF_NameDecode(bsName);
3374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      FXSYS_memcpy(param.m_Name.m_Buffer, str.c_str(), str.GetLength());
3384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      param.m_Name.m_Len = str.GetLength();
3394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
3404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
3414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
34333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmannvoid CPDF_StreamContentParser::AddNumberParam(const CFX_ByteStringC& str) {
3444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ContentParam& param = m_ParamBuf[GetNextParamPos()];
3454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  param.m_Type = ContentParam::NUMBER;
34633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  param.m_Number.m_bInteger = FX_atonum(str, &param.m_Number.m_Integer);
3474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::AddObjectParam(
3504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    std::unique_ptr<CPDF_Object> pObj) {
3514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ContentParam& param = m_ParamBuf[GetNextParamPos()];
3524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  param.m_Type = ContentParam::OBJECT;
3534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  param.m_pObject = std::move(pObj);
3544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::ClearAllParams() {
3574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint32_t index = m_ParamStartPos;
3584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (uint32_t i = 0; i < m_ParamCount; i++) {
3594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (m_ParamBuf[index].m_Type == ContentParam::OBJECT)
3604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_ParamBuf[index].m_pObject.reset();
3614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    index++;
3624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (index == kParamBufSize)
3634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      index = 0;
3644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
3654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_ParamStartPos = 0;
3664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_ParamCount = 0;
3674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_Object* CPDF_StreamContentParser::GetObject(uint32_t index) {
3704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (index >= m_ParamCount) {
3714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return nullptr;
3724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
3734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int real_index = m_ParamStartPos + m_ParamCount - index - 1;
3744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (real_index >= kParamBufSize) {
3754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    real_index -= kParamBufSize;
3764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
3774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ContentParam& param = m_ParamBuf[real_index];
3784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (param.m_Type == ContentParam::NUMBER) {
3794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    param.m_Type = ContentParam::OBJECT;
3804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    param.m_pObject =
3814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        param.m_Number.m_bInteger
3824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            ? pdfium::MakeUnique<CPDF_Number>(param.m_Number.m_Integer)
3834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            : pdfium::MakeUnique<CPDF_Number>(param.m_Number.m_Float);
3844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return param.m_pObject.get();
3854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
3864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (param.m_Type == ContentParam::NAME) {
3874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    param.m_Type = ContentParam::OBJECT;
3884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    param.m_pObject = pdfium::MakeUnique<CPDF_Name>(
3894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        m_pDocument->GetByteStringPool(),
3904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        CFX_ByteString(param.m_Name.m_Buffer, param.m_Name.m_Len));
3914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return param.m_pObject.get();
3924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
3934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (param.m_Type == ContentParam::OBJECT)
3944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return param.m_pObject.get();
3954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ASSERT(false);
3974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return nullptr;
3984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_ByteString CPDF_StreamContentParser::GetString(uint32_t index) {
4014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (index >= m_ParamCount) {
4024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return CFX_ByteString();
4034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int real_index = m_ParamStartPos + m_ParamCount - index - 1;
4054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (real_index >= kParamBufSize) {
4064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    real_index -= kParamBufSize;
4074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ContentParam& param = m_ParamBuf[real_index];
4094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (param.m_Type == ContentParam::NAME) {
4104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return CFX_ByteString(param.m_Name.m_Buffer, param.m_Name.m_Len);
4114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (param.m_Type == 0 && param.m_pObject) {
4134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return param.m_pObject->GetString();
4144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return CFX_ByteString();
4164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_FLOAT CPDF_StreamContentParser::GetNumber(uint32_t index) {
4194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (index >= m_ParamCount) {
4204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return 0;
4214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int real_index = m_ParamStartPos + m_ParamCount - index - 1;
4234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (real_index >= kParamBufSize) {
4244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    real_index -= kParamBufSize;
4254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ContentParam& param = m_ParamBuf[real_index];
4274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (param.m_Type == ContentParam::NUMBER) {
4284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return param.m_Number.m_bInteger ? (FX_FLOAT)param.m_Number.m_Integer
4294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                     : param.m_Number.m_Float;
4304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (param.m_Type == 0 && param.m_pObject) {
4324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return param.m_pObject->GetNumber();
4334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return 0;
4354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::SetGraphicStates(CPDF_PageObject* pObj,
4384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                                bool bColor,
4394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                                bool bText,
4404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                                bool bGraph) {
4414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pObj->m_GeneralState = m_pCurStates->m_GeneralState;
4424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pObj->m_ClipPath = m_pCurStates->m_ClipPath;
4434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pObj->m_ContentMark = m_CurContentMark;
4444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (bColor) {
4454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pObj->m_ColorState = m_pCurStates->m_ColorState;
4464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (bGraph) {
4484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pObj->m_GraphState = m_pCurStates->m_GraphState;
4494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (bText) {
4514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pObj->m_TextState = m_pCurStates->m_TextState;
4524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static
4564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_StreamContentParser::OpCodes
4574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_StreamContentParser::InitializeOpCodes() {
4584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return OpCodes({
4594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('"', 0, 0, 0),
4604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_NextLineShowText_Space},
4614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('\'', 0, 0, 0),
4624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_NextLineShowText},
4634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('B', 0, 0, 0),
4644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_FillStrokePath},
4654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('B', '*', 0, 0),
4664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_EOFillStrokePath},
4674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('B', 'D', 'C', 0),
4684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_BeginMarkedContent_Dictionary},
4694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('B', 'I', 0, 0), &CPDF_StreamContentParser::Handle_BeginImage},
4704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('B', 'M', 'C', 0),
4714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_BeginMarkedContent},
4724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('B', 'T', 0, 0), &CPDF_StreamContentParser::Handle_BeginText},
4734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('C', 'S', 0, 0),
4744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_SetColorSpace_Stroke},
4754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('D', 'P', 0, 0),
4764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_MarkPlace_Dictionary},
4774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('D', 'o', 0, 0),
4784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_ExecuteXObject},
4794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('E', 'I', 0, 0), &CPDF_StreamContentParser::Handle_EndImage},
4804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('E', 'M', 'C', 0),
4814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_EndMarkedContent},
4824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('E', 'T', 0, 0), &CPDF_StreamContentParser::Handle_EndText},
4834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('F', 0, 0, 0), &CPDF_StreamContentParser::Handle_FillPathOld},
4844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('G', 0, 0, 0),
4854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_SetGray_Stroke},
4864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('I', 'D', 0, 0),
4874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_BeginImageData},
4884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('J', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetLineCap},
4894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('K', 0, 0, 0),
4904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_SetCMYKColor_Stroke},
4914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('M', 0, 0, 0),
4924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_SetMiterLimit},
4934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('M', 'P', 0, 0), &CPDF_StreamContentParser::Handle_MarkPlace},
4944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('Q', 0, 0, 0),
4954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_RestoreGraphState},
4964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('R', 'G', 0, 0),
4974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_SetRGBColor_Stroke},
4984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('S', 0, 0, 0), &CPDF_StreamContentParser::Handle_StrokePath},
4994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('S', 'C', 0, 0),
5004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_SetColor_Stroke},
5014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('S', 'C', 'N', 0),
5024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_SetColorPS_Stroke},
5034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('T', '*', 0, 0),
5044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_MoveToNextLine},
5054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('T', 'D', 0, 0),
5064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_MoveTextPoint_SetLeading},
5074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('T', 'J', 0, 0),
5084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_ShowText_Positioning},
5094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('T', 'L', 0, 0),
5104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_SetTextLeading},
5114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('T', 'c', 0, 0),
5124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_SetCharSpace},
5134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('T', 'd', 0, 0),
5144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_MoveTextPoint},
5154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('T', 'f', 0, 0), &CPDF_StreamContentParser::Handle_SetFont},
5164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('T', 'j', 0, 0), &CPDF_StreamContentParser::Handle_ShowText},
5174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('T', 'm', 0, 0),
5184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_SetTextMatrix},
5194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('T', 'r', 0, 0),
5204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_SetTextRenderMode},
5214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('T', 's', 0, 0),
5224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_SetTextRise},
5234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('T', 'w', 0, 0),
5244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_SetWordSpace},
5254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('T', 'z', 0, 0),
5264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_SetHorzScale},
5274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('W', 0, 0, 0), &CPDF_StreamContentParser::Handle_Clip},
5284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('W', '*', 0, 0), &CPDF_StreamContentParser::Handle_EOClip},
5294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('b', 0, 0, 0),
5304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_CloseFillStrokePath},
5314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('b', '*', 0, 0),
5324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_CloseEOFillStrokePath},
5334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('c', 0, 0, 0), &CPDF_StreamContentParser::Handle_CurveTo_123},
5344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('c', 'm', 0, 0),
5354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_ConcatMatrix},
5364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('c', 's', 0, 0),
5374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_SetColorSpace_Fill},
5384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('d', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetDash},
5394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('d', '0', 0, 0),
5404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_SetCharWidth},
5414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('d', '1', 0, 0),
5424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_SetCachedDevice},
5434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('f', 0, 0, 0), &CPDF_StreamContentParser::Handle_FillPath},
5444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('f', '*', 0, 0), &CPDF_StreamContentParser::Handle_EOFillPath},
5454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('g', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetGray_Fill},
5464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('g', 's', 0, 0),
5474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_SetExtendGraphState},
5484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('h', 0, 0, 0), &CPDF_StreamContentParser::Handle_ClosePath},
5494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('i', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetFlat},
5504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('j', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetLineJoin},
5514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('k', 0, 0, 0),
5524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_SetCMYKColor_Fill},
5534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('l', 0, 0, 0), &CPDF_StreamContentParser::Handle_LineTo},
5544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('m', 0, 0, 0), &CPDF_StreamContentParser::Handle_MoveTo},
5554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('n', 0, 0, 0), &CPDF_StreamContentParser::Handle_EndPath},
5564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('q', 0, 0, 0),
5574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_SaveGraphState},
5584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('r', 'e', 0, 0), &CPDF_StreamContentParser::Handle_Rectangle},
5594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('r', 'g', 0, 0),
5604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_SetRGBColor_Fill},
5614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('r', 'i', 0, 0),
5624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_SetRenderIntent},
5634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('s', 0, 0, 0),
5644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_CloseStrokePath},
5654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('s', 'c', 0, 0),
5664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_SetColor_Fill},
5674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('s', 'c', 'n', 0),
5684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann       &CPDF_StreamContentParser::Handle_SetColorPS_Fill},
5694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('s', 'h', 0, 0), &CPDF_StreamContentParser::Handle_ShadeFill},
5704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('v', 0, 0, 0), &CPDF_StreamContentParser::Handle_CurveTo_23},
5714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('w', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetLineWidth},
5724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      {FXBSTR_ID('y', 0, 0, 0), &CPDF_StreamContentParser::Handle_CurveTo_13},
5734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  });
5744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
57633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmannvoid CPDF_StreamContentParser::OnOperator(const CFX_ByteStringC& op) {
5774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  static const OpCodes s_OpCodes = InitializeOpCodes();
5784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
57933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  auto it = s_OpCodes.find(op.GetID());
5804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (it != s_OpCodes.end())
5814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    (this->*it->second)();
5824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_CloseFillStrokePath() {
5854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  Handle_ClosePath();
5864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  AddPathObject(FXFILL_WINDING, true);
5874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_FillStrokePath() {
5904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  AddPathObject(FXFILL_WINDING, true);
5914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_CloseEOFillStrokePath() {
59433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  AddPathPoint(m_PathStartX, m_PathStartY, FXPT_TYPE::LineTo, true);
5954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  AddPathObject(FXFILL_ALTERNATE, true);
5964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_EOFillStrokePath() {
5994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  AddPathObject(FXFILL_ALTERNATE, true);
6004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_BeginMarkedContent_Dictionary() {
6034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteString tag = GetString(1);
6044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Object* pProperty = GetObject(0);
6054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pProperty) {
6064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
6074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
6084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool bDirect = true;
6094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pProperty->IsName()) {
6104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pProperty = FindResourceObj("Properties", pProperty->GetString());
6114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!pProperty)
6124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
6134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    bDirect = false;
6144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
6154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (CPDF_Dictionary* pDict = pProperty->AsDictionary()) {
6164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_CurContentMark.AddMark(tag, pDict, bDirect);
6174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
6184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_BeginImage() {
6214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FILESIZE savePos = m_pSyntax->GetPos();
6224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto pDict =
6234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      pdfium::MakeUnique<CPDF_Dictionary>(m_pDocument->GetByteStringPool());
6244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  while (1) {
6254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_StreamParser::SyntaxType type = m_pSyntax->ParseNextElement();
6264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (type == CPDF_StreamParser::Keyword) {
62733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann      if (m_pSyntax->GetWord() != "ID") {
6284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        m_pSyntax->SetPos(savePos);
6294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return;
6304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
6314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
6324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (type != CPDF_StreamParser::Name) {
6334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
6344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
63533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    CFX_ByteString key(m_pSyntax->GetWord().Mid(1));
63633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    auto pObj = m_pSyntax->ReadNextObject(false, false, 0);
6374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!key.IsEmpty()) {
6384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      uint32_t dwObjNum = pObj ? pObj->GetObjNum() : 0;
6394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (dwObjNum)
6404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        pDict->SetNewFor<CPDF_Reference>(key, m_pDocument, dwObjNum);
6414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      else
6424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        pDict->SetFor(key, std::move(pObj));
6434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
6444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
6454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ReplaceAbbr(pDict.get());
6464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Object* pCSObj = nullptr;
6474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pDict->KeyExist("ColorSpace")) {
6484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pCSObj = pDict->GetDirectObjectFor("ColorSpace");
6494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (pCSObj->IsName()) {
6504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CFX_ByteString name = pCSObj->GetString();
6514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (name != "DeviceRGB" && name != "DeviceGray" && name != "DeviceCMYK") {
6524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        pCSObj = FindResourceObj("ColorSpace", name);
6534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (pCSObj && pCSObj->IsInline())
6544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          pDict->SetFor("ColorSpace", pCSObj->Clone());
6554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
6564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
6574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
6584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pDict->SetNewFor<CPDF_Name>("Subtype", "Image");
6594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::unique_ptr<CPDF_Stream> pStream =
6604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pSyntax->ReadInlineStream(m_pDocument, std::move(pDict), pCSObj);
6614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  while (1) {
6624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_StreamParser::SyntaxType type = m_pSyntax->ParseNextElement();
6634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (type == CPDF_StreamParser::EndOfData) {
6644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
6654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
6664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (type != CPDF_StreamParser::Keyword) {
6674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      continue;
6684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
66933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    if (m_pSyntax->GetWord() == "EI") {
6704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
6714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
6724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
6734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  AddImage(std::move(pStream));
6744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_BeginMarkedContent() {
6774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_CurContentMark.AddMark(GetString(0), nullptr, false);
6784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_BeginText() {
68133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  m_pCurStates->m_TextMatrix = CFX_Matrix();
6824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  OnChangeTextMatrix();
68333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  m_pCurStates->m_TextPos = CFX_PointF();
68433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  m_pCurStates->m_TextLinePos = CFX_PointF();
6854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_CurveTo_123() {
68833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  AddPathPoint(GetNumber(5), GetNumber(4), FXPT_TYPE::BezierTo, false);
68933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  AddPathPoint(GetNumber(3), GetNumber(2), FXPT_TYPE::BezierTo, false);
69033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  AddPathPoint(GetNumber(1), GetNumber(0), FXPT_TYPE::BezierTo, false);
6914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_ConcatMatrix() {
6944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_Matrix new_matrix(GetNumber(5), GetNumber(4), GetNumber(3), GetNumber(2),
6954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                        GetNumber(1), GetNumber(0));
6964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  new_matrix.Concat(m_pCurStates->m_CTM);
6974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pCurStates->m_CTM = new_matrix;
6984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  OnChangeTextMatrix();
6994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
7004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetColorSpace_Fill() {
7024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_ColorSpace* pCS = FindColorSpace(GetString(0));
7034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pCS)
7044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
7054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pCurStates->m_ColorState.GetMutableFillColor()->SetColorSpace(pCS);
7074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
7084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetColorSpace_Stroke() {
7104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_ColorSpace* pCS = FindColorSpace(GetString(0));
7114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pCS)
7124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
7134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pCurStates->m_ColorState.GetMutableStrokeColor()->SetColorSpace(pCS);
7154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
7164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetDash() {
7184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Array* pArray = ToArray(GetObject(1));
7194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pArray)
7204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
7214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pCurStates->SetLineDash(pArray, GetNumber(0), 1.0f);
7234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
7244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetCharWidth() {
7264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_Type3Data[0] = GetNumber(1);
7274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_Type3Data[1] = GetNumber(0);
7284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_bColored = true;
7294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
7304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetCachedDevice() {
7324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (int i = 0; i < 6; i++) {
7334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_Type3Data[i] = GetNumber(5 - i);
7344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
7354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_bColored = false;
7364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
7374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_ExecuteXObject() {
7394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteString name = GetString(0);
7404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (name == m_LastImageName && m_pLastImage && m_pLastImage->GetStream() &&
7414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pLastImage->GetStream()->GetObjNum()) {
7424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    AddImage(m_pLastImage);
7434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
7444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
7454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Stream* pXObject = ToStream(FindResourceObj("XObject", name));
7474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pXObject) {
7484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_bResourceMissing = true;
7494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
7504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
7514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteString type;
7534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pXObject->GetDict())
7544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    type = pXObject->GetDict()->GetStringFor("Subtype");
7554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (type == "Image") {
7574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_ImageObject* pObj = pXObject->IsInline()
7584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                 ? AddImage(std::unique_ptr<CPDF_Stream>(
7594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                       ToStream(pXObject->Clone())))
7604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                 : AddImage(pXObject->GetObjNum());
7614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_LastImageName = name;
7634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pLastImage = pObj->GetImage();
7644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!m_pObjectHolder->HasImageMask())
7654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pObjectHolder->SetHasImageMask(m_pLastImage->IsMask());
7664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else if (type == "Form") {
7674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    AddForm(pXObject);
7684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
7694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
7704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::AddForm(CPDF_Stream* pStream) {
7724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::unique_ptr<CPDF_FormObject> pFormObj(new CPDF_FormObject);
7734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pFormObj->m_pForm.reset(
7744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      new CPDF_Form(m_pDocument, m_pPageResources, pStream, m_pResources));
7754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pFormObj->m_FormMatrix = m_pCurStates->m_CTM;
7764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pFormObj->m_FormMatrix.Concat(m_mtContentToUser);
7774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_AllStates status;
7784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  status.m_GeneralState = m_pCurStates->m_GeneralState;
7794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  status.m_GraphState = m_pCurStates->m_GraphState;
7804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  status.m_ColorState = m_pCurStates->m_ColorState;
7814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  status.m_TextState = m_pCurStates->m_TextState;
7824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pFormObj->m_pForm->ParseContent(&status, nullptr, nullptr, m_Level + 1);
7834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_pObjectHolder->BackgroundAlphaNeeded() &&
7844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      pFormObj->m_pForm->BackgroundAlphaNeeded()) {
7854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pObjectHolder->SetBackgroundAlphaNeeded(true);
7864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
7874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pFormObj->CalcBoundingBox();
7884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  SetGraphicStates(pFormObj.get(), true, true, true);
7894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pObjectHolder->GetPageObjectList()->push_back(std::move(pFormObj));
7904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
7914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_ImageObject* CPDF_StreamContentParser::AddImage(
7934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    std::unique_ptr<CPDF_Stream> pStream) {
7944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pStream)
7954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return nullptr;
7964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto pImageObj = pdfium::MakeUnique<CPDF_ImageObject>();
7984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pImageObj->SetOwnedImage(
7994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      pdfium::MakeUnique<CPDF_Image>(m_pDocument, std::move(pStream)));
8004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return AddImageObject(std::move(pImageObj));
8014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
8024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_ImageObject* CPDF_StreamContentParser::AddImage(uint32_t streamObjNum) {
8044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto pImageObj = pdfium::MakeUnique<CPDF_ImageObject>();
8054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pImageObj->SetUnownedImage(m_pDocument->LoadImageFromPageData(streamObjNum));
8064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return AddImageObject(std::move(pImageObj));
8074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
8084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_ImageObject* CPDF_StreamContentParser::AddImage(CPDF_Image* pImage) {
8104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pImage)
8114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return nullptr;
8124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto pImageObj = pdfium::MakeUnique<CPDF_ImageObject>();
8144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pImageObj->SetUnownedImage(
8154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pDocument->GetPageData()->GetImage(pImage->GetStream()->GetObjNum()));
8164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return AddImageObject(std::move(pImageObj));
8184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
8194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_ImageObject* CPDF_StreamContentParser::AddImageObject(
8214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    std::unique_ptr<CPDF_ImageObject> pImageObj) {
8224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  SetGraphicStates(pImageObj.get(), pImageObj->GetImage()->IsMask(), false,
8234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                   false);
8244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_Matrix ImageMatrix = m_pCurStates->m_CTM;
8264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ImageMatrix.Concat(m_mtContentToUser);
8274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pImageObj->set_matrix(ImageMatrix);
8284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pImageObj->CalcBoundingBox();
8294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_ImageObject* pRet = pImageObj.get();
8314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pObjectHolder->GetPageObjectList()->push_back(std::move(pImageObj));
8324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return pRet;
8334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
8344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_MarkPlace_Dictionary() {}
8364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_EndImage() {}
8384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_EndMarkedContent() {
8404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_CurContentMark)
8414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_CurContentMark.DeleteLastMark();
8424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
8434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_EndText() {
8454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_ClipTextList.empty())
8464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
8474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (TextRenderingModeIsClipMode(m_pCurStates->m_TextState.GetTextMode()))
8494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pCurStates->m_ClipPath.AppendTexts(&m_ClipTextList);
8504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_ClipTextList.clear();
8524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
8534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_FillPath() {
8554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  AddPathObject(FXFILL_WINDING, false);
8564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
8574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_FillPathOld() {
8594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  AddPathObject(FXFILL_WINDING, false);
8604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
8614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_EOFillPath() {
8634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  AddPathObject(FXFILL_ALTERNATE, false);
8644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
8654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetGray_Fill() {
8674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT value = GetNumber(0);
8684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY);
8694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pCurStates->m_ColorState.SetFillColor(pCS, &value, 1);
8704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
8714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetGray_Stroke() {
8734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT value = GetNumber(0);
8744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY);
8754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pCurStates->m_ColorState.SetStrokeColor(pCS, &value, 1);
8764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
8774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetExtendGraphState() {
8794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteString name = GetString(0);
8804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Dictionary* pGS = ToDictionary(FindResourceObj("ExtGState", name));
8814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pGS) {
8824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_bResourceMissing = true;
8834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
8844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
8854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pCurStates->ProcessExtGS(pGS, this);
8864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
8874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_ClosePath() {
8894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_PathPointCount == 0) {
8904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
8914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
8924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_PathStartX != m_PathCurrentX || m_PathStartY != m_PathCurrentY) {
89333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    AddPathPoint(m_PathStartX, m_PathStartY, FXPT_TYPE::LineTo, true);
89433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  } else if (m_pPathPoints[m_PathPointCount - 1].m_Type != FXPT_TYPE::MoveTo) {
89533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    m_pPathPoints[m_PathPointCount - 1].m_CloseFigure = true;
8964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
8974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
8984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetFlat() {
9004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pCurStates->m_GeneralState.SetFlatness(GetNumber(0));
9014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
9024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_BeginImageData() {}
9044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetLineJoin() {
9064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pCurStates->m_GraphState.SetLineJoin(
9074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      static_cast<CFX_GraphStateData::LineJoin>(GetInteger(0)));
9084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
9094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetLineCap() {
9114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pCurStates->m_GraphState.SetLineCap(
9124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      static_cast<CFX_GraphStateData::LineCap>(GetInteger(0)));
9134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
9144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetCMYKColor_Fill() {
9164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_ParamCount != 4)
9174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
9184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT values[4];
9204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (int i = 0; i < 4; i++) {
9214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    values[i] = GetNumber(3 - i);
9224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
9234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK);
9244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pCurStates->m_ColorState.SetFillColor(pCS, values, 4);
9254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
9264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetCMYKColor_Stroke() {
9284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_ParamCount != 4)
9294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
9304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT values[4];
9324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (int i = 0; i < 4; i++) {
9334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    values[i] = GetNumber(3 - i);
9344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
9354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK);
9364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pCurStates->m_ColorState.SetStrokeColor(pCS, values, 4);
9374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
9384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_LineTo() {
9404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_ParamCount != 2)
9414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
9424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
94333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  AddPathPoint(GetNumber(1), GetNumber(0), FXPT_TYPE::LineTo, false);
9444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
9454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_MoveTo() {
9474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_ParamCount != 2)
9484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
9494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
95033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  AddPathPoint(GetNumber(1), GetNumber(0), FXPT_TYPE::MoveTo, false);
9514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ParsePathObject();
9524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
9534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetMiterLimit() {
9554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pCurStates->m_GraphState.SetMiterLimit(GetNumber(0));
9564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
9574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_MarkPlace() {}
9594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_EndPath() {
9614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  AddPathObject(0, false);
9624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
9634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SaveGraphState() {
9654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::unique_ptr<CPDF_AllStates> pStates(new CPDF_AllStates);
9664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pStates->Copy(*m_pCurStates);
9674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_StateStack.push_back(std::move(pStates));
9684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
9694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_RestoreGraphState() {
9714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_StateStack.empty())
9724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
9734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::unique_ptr<CPDF_AllStates> pStates = std::move(m_StateStack.back());
9744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_StateStack.pop_back();
9754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pCurStates->Copy(*pStates);
9764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
9774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_Rectangle() {
9794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT x = GetNumber(3), y = GetNumber(2);
9804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT w = GetNumber(1), h = GetNumber(0);
9814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  AddPathRect(x, y, w, h);
9824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
9834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::AddPathRect(FX_FLOAT x,
9854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                           FX_FLOAT y,
9864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                           FX_FLOAT w,
9874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                           FX_FLOAT h) {
98833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  AddPathPoint(x, y, FXPT_TYPE::MoveTo, false);
98933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  AddPathPoint(x + w, y, FXPT_TYPE::LineTo, false);
99033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  AddPathPoint(x + w, y + h, FXPT_TYPE::LineTo, false);
99133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  AddPathPoint(x, y + h, FXPT_TYPE::LineTo, false);
99233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  AddPathPoint(x, y, FXPT_TYPE::LineTo, true);
9934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
9944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetRGBColor_Fill() {
9964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_ParamCount != 3)
9974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
9984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT values[3];
10004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (int i = 0; i < 3; i++) {
10014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    values[i] = GetNumber(2 - i);
10024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
10034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB);
10044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pCurStates->m_ColorState.SetFillColor(pCS, values, 3);
10054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
10064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetRGBColor_Stroke() {
10084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_ParamCount != 3)
10094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
10104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT values[3];
10124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (int i = 0; i < 3; i++) {
10134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    values[i] = GetNumber(2 - i);
10144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
10154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB);
10164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pCurStates->m_ColorState.SetStrokeColor(pCS, values, 3);
10174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
10184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetRenderIntent() {}
10204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_CloseStrokePath() {
10224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  Handle_ClosePath();
10234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  AddPathObject(0, true);
10244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
10254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_StrokePath() {
10274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  AddPathObject(0, true);
10284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
10294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetColor_Fill() {
10314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT values[4];
10324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int nargs = m_ParamCount;
10334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (nargs > 4) {
10344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    nargs = 4;
10354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
10364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (int i = 0; i < nargs; i++) {
10374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    values[i] = GetNumber(nargs - i - 1);
10384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
10394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pCurStates->m_ColorState.SetFillColor(nullptr, values, nargs);
10404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
10414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetColor_Stroke() {
10434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT values[4];
10444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int nargs = m_ParamCount;
10454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (nargs > 4) {
10464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    nargs = 4;
10474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
10484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (int i = 0; i < nargs; i++) {
10494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    values[i] = GetNumber(nargs - i - 1);
10504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
10514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pCurStates->m_ColorState.SetStrokeColor(nullptr, values, nargs);
10524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
10534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetColorPS_Fill() {
10554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Object* pLastParam = GetObject(0);
10564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pLastParam) {
10574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
10584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
10594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint32_t nargs = m_ParamCount;
10604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint32_t nvalues = nargs;
10614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pLastParam->IsName())
10624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    nvalues--;
10634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT* values = nullptr;
10644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (nvalues) {
10654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    values = FX_Alloc(FX_FLOAT, nvalues);
10664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    for (uint32_t i = 0; i < nvalues; i++) {
10674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      values[i] = GetNumber(nargs - i - 1);
10684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
10694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
10704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (nvalues != nargs) {
10714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_Pattern* pPattern = FindPattern(GetString(0), false);
10724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (pPattern) {
10734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pCurStates->m_ColorState.SetFillPattern(pPattern, values, nvalues);
10744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
10754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else {
10764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pCurStates->m_ColorState.SetFillColor(nullptr, values, nvalues);
10774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
10784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_Free(values);
10794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
10804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetColorPS_Stroke() {
10824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Object* pLastParam = GetObject(0);
10834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pLastParam) {
10844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
10854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
10864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int nargs = m_ParamCount;
10874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int nvalues = nargs;
10884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pLastParam->IsName())
10894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    nvalues--;
10904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
10914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT* values = nullptr;
10924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (nvalues) {
10934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    values = FX_Alloc(FX_FLOAT, nvalues);
10944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    for (int i = 0; i < nvalues; i++) {
10954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      values[i] = GetNumber(nargs - i - 1);
10964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
10974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
10984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (nvalues != nargs) {
10994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_Pattern* pPattern = FindPattern(GetString(0), false);
11004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (pPattern) {
11014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pCurStates->m_ColorState.SetStrokePattern(pPattern, values, nvalues);
11024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
11034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else {
11044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pCurStates->m_ColorState.SetStrokeColor(nullptr, values, nvalues);
11054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
11064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_Free(values);
11074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
11084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
11094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_ShadeFill() {
11104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Pattern* pPattern = FindPattern(GetString(0), true);
11114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pPattern)
11124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
11134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
11144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_ShadingPattern* pShading = pPattern->AsShadingPattern();
11154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pShading)
11164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
11174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
11184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pShading->IsShadingObject() || !pShading->Load())
11194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
11204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
11214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::unique_ptr<CPDF_ShadingObject> pObj(new CPDF_ShadingObject);
11224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pObj->m_pShading = pShading;
11234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  SetGraphicStates(pObj.get(), false, false, false);
11244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pObj->m_Matrix = m_pCurStates->m_CTM;
11254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pObj->m_Matrix.Concat(m_mtContentToUser);
11264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_FloatRect bbox =
11274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      pObj->m_ClipPath ? pObj->m_ClipPath.GetClipBox() : m_BBox;
11284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pShading->IsMeshShading())
11294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    bbox.Intersect(GetShadingBBox(pShading, pObj->m_Matrix));
11304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pObj->m_Left = bbox.left;
11314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pObj->m_Right = bbox.right;
11324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pObj->m_Top = bbox.top;
11334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pObj->m_Bottom = bbox.bottom;
11344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pObjectHolder->GetPageObjectList()->push_back(std::move(pObj));
11354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
11364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
11374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetCharSpace() {
11384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pCurStates->m_TextState.SetCharSpace(GetNumber(0));
11394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
11404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
11414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_MoveTextPoint() {
114233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  m_pCurStates->m_TextLinePos += CFX_PointF(GetNumber(1), GetNumber(0));
114333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  m_pCurStates->m_TextPos = m_pCurStates->m_TextLinePos;
11444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
11454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
11464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_MoveTextPoint_SetLeading() {
11474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  Handle_MoveTextPoint();
11484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pCurStates->m_TextLeading = -GetNumber(0);
11494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
11504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
11514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetFont() {
11524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT fs = GetNumber(0);
11534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (fs == 0) {
11544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    fs = m_DefFontSize;
11554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
11564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pCurStates->m_TextState.SetFontSize(fs);
11574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Font* pFont = FindFont(GetString(1));
11584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pFont) {
11594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pCurStates->m_TextState.SetFont(pFont);
11604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
11614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
11624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
11634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_Object* CPDF_StreamContentParser::FindResourceObj(
11644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    const CFX_ByteString& type,
11654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    const CFX_ByteString& name) {
11664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_pResources)
11674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return nullptr;
11684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Dictionary* pDict = m_pResources->GetDictFor(type);
11694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pDict)
11704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return pDict->GetDirectObjectFor(name);
11714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_pResources == m_pPageResources || !m_pPageResources)
11724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return nullptr;
11734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
11744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Dictionary* pPageDict = m_pPageResources->GetDictFor(type);
11754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return pPageDict ? pPageDict->GetDirectObjectFor(name) : nullptr;
11764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
11774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
11784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_Font* CPDF_StreamContentParser::FindFont(const CFX_ByteString& name) {
11794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Dictionary* pFontDict = ToDictionary(FindResourceObj("Font", name));
11804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pFontDict) {
11814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_bResourceMissing = true;
11824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return CPDF_Font::GetStockFont(m_pDocument, "Helvetica");
11834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
11844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
11854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Font* pFont = m_pDocument->LoadFont(pFontDict);
11864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pFont && pFont->IsType3Font()) {
11874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pFont->AsType3Font()->SetPageResources(m_pResources);
11884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pFont->AsType3Font()->CheckType3FontMetrics();
11894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
11904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return pFont;
11914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
11924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
11934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_ColorSpace* CPDF_StreamContentParser::FindColorSpace(
11944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    const CFX_ByteString& name) {
11954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (name == "Pattern") {
11964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return CPDF_ColorSpace::GetStockCS(PDFCS_PATTERN);
11974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
11984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (name == "DeviceGray" || name == "DeviceCMYK" || name == "DeviceRGB") {
11994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFX_ByteString defname = "Default";
12004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    defname += name.Mid(7);
12014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_Object* pDefObj = FindResourceObj("ColorSpace", defname);
12024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!pDefObj) {
12034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (name == "DeviceGray") {
12044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY);
12054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
12064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (name == "DeviceRGB") {
12074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB);
12084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
12094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK);
12104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
12114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return m_pDocument->LoadColorSpace(pDefObj);
12124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
12134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Object* pCSObj = FindResourceObj("ColorSpace", name);
12144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pCSObj) {
12154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_bResourceMissing = true;
12164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return nullptr;
12174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
12184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_pDocument->LoadColorSpace(pCSObj);
12194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
12204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
12214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_Pattern* CPDF_StreamContentParser::FindPattern(const CFX_ByteString& name,
12224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                                    bool bShading) {
12234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Object* pPattern =
12244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      FindResourceObj(bShading ? "Shading" : "Pattern", name);
12254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pPattern || (!pPattern->IsDictionary() && !pPattern->IsStream())) {
12264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_bResourceMissing = true;
12274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return nullptr;
12284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
12294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_pDocument->LoadPattern(pPattern, bShading,
12304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                  m_pCurStates->m_ParentMatrix);
12314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
12324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
12334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::AddTextObject(CFX_ByteString* pStrs,
12344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                             FX_FLOAT fInitKerning,
12354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                             FX_FLOAT* pKerning,
12364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                             int nsegs) {
12374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Font* pFont = m_pCurStates->m_TextState.GetFont();
12384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pFont) {
12394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
12404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
12414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (fInitKerning != 0) {
12424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!pFont->IsVertWriting()) {
124333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann      m_pCurStates->m_TextPos.x -=
12444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          (fInitKerning * m_pCurStates->m_TextState.GetFontSize() *
12454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann           m_pCurStates->m_TextHorzScale) /
12464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          1000;
12474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else {
124833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann      m_pCurStates->m_TextPos.y -=
12494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          (fInitKerning * m_pCurStates->m_TextState.GetFontSize()) / 1000;
12504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
12514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
12524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (nsegs == 0) {
12534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
12544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
12554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const TextRenderingMode text_mode =
12564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      pFont->IsType3Font() ? TextRenderingMode::MODE_FILL
12574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                           : m_pCurStates->m_TextState.GetTextMode();
12584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  {
12594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    std::unique_ptr<CPDF_TextObject> pText(new CPDF_TextObject);
12604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pLastTextObject = pText.get();
12614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    SetGraphicStates(m_pLastTextObject, true, true, true);
12624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (TextRenderingModeIsStrokeMode(text_mode)) {
12634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      FX_FLOAT* pCTM = pText->m_TextState.GetMutableCTM();
12644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      pCTM[0] = m_pCurStates->m_CTM.a;
12654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      pCTM[1] = m_pCurStates->m_CTM.c;
12664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      pCTM[2] = m_pCurStates->m_CTM.b;
12674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      pCTM[3] = m_pCurStates->m_CTM.d;
12684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
12694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pText->SetSegments(pStrs, pKerning, nsegs);
127033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    pText->m_Pos = m_mtContentToUser.Transform(
127133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann        m_pCurStates->m_CTM.Transform(m_pCurStates->m_TextMatrix.Transform(
127233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann            CFX_PointF(m_pCurStates->m_TextPos.x,
127333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann                       m_pCurStates->m_TextPos.y + m_pCurStates->m_TextRise))));
127433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann
127533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    m_pCurStates->m_TextPos +=
127633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann        pText->CalcPositionData(m_pCurStates->m_TextHorzScale);
12774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (TextRenderingModeIsClipMode(text_mode)) {
12784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_ClipTextList.push_back(
12794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          std::unique_ptr<CPDF_TextObject>(pText->Clone()));
12804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
12814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pObjectHolder->GetPageObjectList()->push_back(std::move(pText));
12824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
12834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pKerning && pKerning[nsegs - 1] != 0) {
12844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!pFont->IsVertWriting()) {
128533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann      m_pCurStates->m_TextPos.x -=
12864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          (pKerning[nsegs - 1] * m_pCurStates->m_TextState.GetFontSize() *
12874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann           m_pCurStates->m_TextHorzScale) /
12884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          1000;
12894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else {
129033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann      m_pCurStates->m_TextPos.y -=
12914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          (pKerning[nsegs - 1] * m_pCurStates->m_TextState.GetFontSize()) /
12924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          1000;
12934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
12944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
12954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
12964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
12974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_ShowText() {
12984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteString str = GetString(0);
12994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (str.IsEmpty()) {
13004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
13014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
13024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  AddTextObject(&str, 0, nullptr, 1);
13034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
13044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
13054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_ShowText_Positioning() {
13064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Array* pArray = ToArray(GetObject(0));
13074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pArray)
13084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
13094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
13104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  size_t n = pArray->GetCount();
13114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  size_t nsegs = 0;
13124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (size_t i = 0; i < n; i++) {
13134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (pArray->GetDirectObjectAt(i)->IsString())
13144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      nsegs++;
13154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
13164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (nsegs == 0) {
13174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    for (size_t i = 0; i < n; i++) {
131833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann      m_pCurStates->m_TextPos.x -=
13194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          (pArray->GetNumberAt(i) * m_pCurStates->m_TextState.GetFontSize() *
13204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann           m_pCurStates->m_TextHorzScale) /
13214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          1000;
13224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
13234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
13244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
13254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteString* pStrs = new CFX_ByteString[nsegs];
13264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT* pKerning = FX_Alloc(FX_FLOAT, nsegs);
13274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  size_t iSegment = 0;
13284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT fInitKerning = 0;
13294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (size_t i = 0; i < n; i++) {
13304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_Object* pObj = pArray->GetDirectObjectAt(i);
13314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (pObj->IsString()) {
13324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CFX_ByteString str = pObj->GetString();
13334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (str.IsEmpty()) {
13344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        continue;
13354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
13364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      pStrs[iSegment] = str;
13374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      pKerning[iSegment++] = 0;
13384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else {
13394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      FX_FLOAT num = pObj ? pObj->GetNumber() : 0;
13404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (iSegment == 0) {
13414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        fInitKerning += num;
13424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      } else {
13434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        pKerning[iSegment - 1] += num;
13444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
13454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
13464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
13474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  AddTextObject(pStrs, fInitKerning, pKerning, iSegment);
13484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  delete[] pStrs;
13494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_Free(pKerning);
13504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
13514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
13524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetTextLeading() {
13534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pCurStates->m_TextLeading = GetNumber(0);
13544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
13554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
13564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetTextMatrix() {
135733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  m_pCurStates->m_TextMatrix =
135833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann      CFX_Matrix(GetNumber(5), GetNumber(4), GetNumber(3), GetNumber(2),
135933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann                 GetNumber(1), GetNumber(0));
13604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  OnChangeTextMatrix();
136133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  m_pCurStates->m_TextPos = CFX_PointF();
136233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  m_pCurStates->m_TextLinePos = CFX_PointF();
13634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
13644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
13654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::OnChangeTextMatrix() {
13664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_Matrix text_matrix(m_pCurStates->m_TextHorzScale, 0.0f, 0.0f, 1.0f, 0.0f,
13674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                         0.0f);
13684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  text_matrix.Concat(m_pCurStates->m_TextMatrix);
13694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  text_matrix.Concat(m_pCurStates->m_CTM);
13704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  text_matrix.Concat(m_mtContentToUser);
13714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT* pTextMatrix = m_pCurStates->m_TextState.GetMutableMatrix();
13724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pTextMatrix[0] = text_matrix.a;
13734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pTextMatrix[1] = text_matrix.c;
13744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pTextMatrix[2] = text_matrix.b;
13754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pTextMatrix[3] = text_matrix.d;
13764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
13774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
13784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetTextRenderMode() {
13794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  TextRenderingMode mode;
13804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (SetTextRenderingModeFromInt(GetInteger(0), &mode))
13814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pCurStates->m_TextState.SetTextMode(mode);
13824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
13834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
13844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetTextRise() {
13854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pCurStates->m_TextRise = GetNumber(0);
13864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
13874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
13884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetWordSpace() {
13894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pCurStates->m_TextState.SetWordSpace(GetNumber(0));
13904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
13914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
13924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetHorzScale() {
13934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_ParamCount != 1) {
13944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
13954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
13964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pCurStates->m_TextHorzScale = GetNumber(0) / 100;
13974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  OnChangeTextMatrix();
13984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
13994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
14004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_MoveToNextLine() {
140133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  m_pCurStates->m_TextLinePos.y -= m_pCurStates->m_TextLeading;
140233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  m_pCurStates->m_TextPos = m_pCurStates->m_TextLinePos;
14034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
14044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
14054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_CurveTo_23() {
140633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  AddPathPoint(m_PathCurrentX, m_PathCurrentY, FXPT_TYPE::BezierTo, false);
140733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  AddPathPoint(GetNumber(3), GetNumber(2), FXPT_TYPE::BezierTo, false);
140833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  AddPathPoint(GetNumber(1), GetNumber(0), FXPT_TYPE::BezierTo, false);
14094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
14104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
14114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_SetLineWidth() {
14124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pCurStates->m_GraphState.SetLineWidth(GetNumber(0));
14134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
14144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
14154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_Clip() {
14164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_PathClipType = FXFILL_WINDING;
14174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
14184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
14194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_EOClip() {
14204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_PathClipType = FXFILL_ALTERNATE;
14214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
14224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
14234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_CurveTo_13() {
142433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  AddPathPoint(GetNumber(3), GetNumber(2), FXPT_TYPE::BezierTo, false);
142533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  AddPathPoint(GetNumber(1), GetNumber(0), FXPT_TYPE::BezierTo, false);
142633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  AddPathPoint(GetNumber(1), GetNumber(0), FXPT_TYPE::BezierTo, false);
14274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
14284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
14294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_NextLineShowText() {
14304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  Handle_MoveToNextLine();
14314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  Handle_ShowText();
14324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
14334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
14344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_NextLineShowText_Space() {
14354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pCurStates->m_TextState.SetWordSpace(GetNumber(2));
14364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pCurStates->m_TextState.SetCharSpace(GetNumber(1));
14374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  Handle_NextLineShowText();
14384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
14394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
14404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::Handle_Invalid() {}
14414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
144233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmannvoid CPDF_StreamContentParser::AddPathPoint(FX_FLOAT x,
144333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann                                            FX_FLOAT y,
144433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann                                            FXPT_TYPE type,
144533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann                                            bool close) {
14464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_PathCurrentX = x;
14474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_PathCurrentY = y;
144833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  if (type == FXPT_TYPE::MoveTo && !close) {
14494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_PathStartX = x;
14504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_PathStartY = y;
14514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (m_PathPointCount &&
145233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann        m_pPathPoints[m_PathPointCount - 1].IsTypeAndOpen(FXPT_TYPE::MoveTo)) {
145333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann      m_pPathPoints[m_PathPointCount - 1].m_Point = CFX_PointF(x, y);
14544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
14554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
14564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else if (m_PathPointCount == 0) {
14574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
14584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
14594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_PathPointCount++;
14604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_PathPointCount > m_PathAllocSize) {
14614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    int newsize = m_PathPointCount + 256;
14624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    FX_PATHPOINT* pNewPoints = FX_Alloc(FX_PATHPOINT, newsize);
14634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (m_PathAllocSize) {
14644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      FXSYS_memcpy(pNewPoints, m_pPathPoints,
14654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                   m_PathAllocSize * sizeof(FX_PATHPOINT));
14664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      FX_Free(m_pPathPoints);
14674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
14684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pPathPoints = pNewPoints;
14694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_PathAllocSize = newsize;
14704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
147133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  m_pPathPoints[m_PathPointCount - 1].m_Type = type;
147233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  m_pPathPoints[m_PathPointCount - 1].m_CloseFigure = close;
147333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  m_pPathPoints[m_PathPointCount - 1].m_Point = CFX_PointF(x, y);
14744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
14754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
14764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::AddPathObject(int FillType, bool bStroke) {
14774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int PathPointCount = m_PathPointCount;
14784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint8_t PathClipType = m_PathClipType;
14794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_PathPointCount = 0;
14804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_PathClipType = 0;
14814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (PathPointCount <= 1) {
14824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (PathPointCount && PathClipType) {
14834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CPDF_Path path;
14844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      path.AppendRect(0, 0, 0, 0);
14854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pCurStates->m_ClipPath.AppendPath(path, FXFILL_WINDING, true);
14864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
14874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
14884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
14894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (PathPointCount &&
149033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann      m_pPathPoints[PathPointCount - 1].IsTypeAndOpen(FXPT_TYPE::MoveTo)) {
14914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    PathPointCount--;
14924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
149333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann
14944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Path Path;
149533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  for (int i = 0; i < PathPointCount; i++) {
149633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    FX_PATHPOINT& point = m_pPathPoints[i];
149733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    Path.AppendPoint(point.m_Point, point.m_Type, point.m_CloseFigure);
149833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  }
149933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann
15004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_Matrix matrix = m_pCurStates->m_CTM;
15014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  matrix.Concat(m_mtContentToUser);
15024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (bStroke || FillType) {
15034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    std::unique_ptr<CPDF_PathObject> pPathObj(new CPDF_PathObject);
15044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pPathObj->m_bStroke = bStroke;
15054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pPathObj->m_FillType = FillType;
15064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pPathObj->m_Path = Path;
15074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pPathObj->m_Matrix = matrix;
15084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    SetGraphicStates(pPathObj.get(), true, false, true);
15094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pPathObj->CalcBoundingBox();
15104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pObjectHolder->GetPageObjectList()->push_back(std::move(pPathObj));
15114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
15124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (PathClipType) {
15134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!matrix.IsIdentity()) {
15144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      Path.Transform(&matrix);
15154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      matrix.SetIdentity();
15164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
15174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pCurStates->m_ClipPath.AppendPath(Path, PathClipType, true);
15184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
15194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
15204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
15214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannuint32_t CPDF_StreamContentParser::Parse(const uint8_t* pData,
15224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                         uint32_t dwSize,
15234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                         uint32_t max_cost) {
15244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_Level > kMaxFormLevel)
15254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return dwSize;
15264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
15274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint32_t InitObjCount = m_pObjectHolder->GetPageObjectList()->size();
15284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_StreamParser syntax(pData, dwSize, m_pDocument->GetByteStringPool());
15294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_StreamParserAutoClearer auto_clearer(&m_pSyntax, &syntax);
15304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  while (1) {
15314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    uint32_t cost = m_pObjectHolder->GetPageObjectList()->size() - InitObjCount;
15324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (max_cost && cost >= max_cost) {
15334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
15344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
15354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    switch (syntax.ParseNextElement()) {
15364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case CPDF_StreamParser::EndOfData:
15374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return m_pSyntax->GetPos();
15384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case CPDF_StreamParser::Keyword:
153933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann        OnOperator(syntax.GetWord());
15404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        ClearAllParams();
15414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
15424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case CPDF_StreamParser::Number:
154333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann        AddNumberParam(syntax.GetWord());
15444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
15454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case CPDF_StreamParser::Name:
154633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann        AddNameParam(syntax.GetWord().Mid(1));
15474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
15484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      default:
15494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        AddObjectParam(syntax.GetObject());
15504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
15514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
15524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_pSyntax->GetPos();
15534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
15544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
15554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamContentParser::ParsePathObject() {
15564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT params[6] = {};
15574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int nParams = 0;
15584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int last_pos = m_pSyntax->GetPos();
15594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  while (1) {
15604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_StreamParser::SyntaxType type = m_pSyntax->ParseNextElement();
15614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    bool bProcessed = true;
15624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    switch (type) {
15634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case CPDF_StreamParser::EndOfData:
15644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return;
15654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case CPDF_StreamParser::Keyword: {
156633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann        CFX_ByteStringC strc = m_pSyntax->GetWord();
156733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann        int len = strc.GetLength();
15684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (len == 1) {
156933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann          switch (strc[0]) {
15704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            case kPathOperatorSubpath:
157133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann              AddPathPoint(params[0], params[1], FXPT_TYPE::MoveTo, false);
15724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              nParams = 0;
15734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              break;
15744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            case kPathOperatorLine:
157533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann              AddPathPoint(params[0], params[1], FXPT_TYPE::LineTo, false);
15764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              nParams = 0;
15774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              break;
15784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            case kPathOperatorCubicBezier1:
157933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann              AddPathPoint(params[0], params[1], FXPT_TYPE::BezierTo, false);
158033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann              AddPathPoint(params[2], params[3], FXPT_TYPE::BezierTo, false);
158133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann              AddPathPoint(params[4], params[5], FXPT_TYPE::BezierTo, false);
15824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              nParams = 0;
15834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              break;
15844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            case kPathOperatorCubicBezier2:
158533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann              AddPathPoint(m_PathCurrentX, m_PathCurrentY, FXPT_TYPE::BezierTo,
158633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann                           false);
158733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann              AddPathPoint(params[0], params[1], FXPT_TYPE::BezierTo, false);
158833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann              AddPathPoint(params[2], params[3], FXPT_TYPE::BezierTo, false);
15894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              nParams = 0;
15904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              break;
15914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            case kPathOperatorCubicBezier3:
159233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann              AddPathPoint(params[0], params[1], FXPT_TYPE::BezierTo, false);
159333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann              AddPathPoint(params[2], params[3], FXPT_TYPE::BezierTo, false);
159433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann              AddPathPoint(params[2], params[3], FXPT_TYPE::BezierTo, false);
15954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              nParams = 0;
15964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              break;
15974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            case kPathOperatorClosePath:
15984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              Handle_ClosePath();
15994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              nParams = 0;
16004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              break;
16014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            default:
16024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              bProcessed = false;
16034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              break;
16044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          }
16054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        } else if (len == 2) {
160633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann          if (strc[0] == kPathOperatorRectangle[0] &&
160733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann              strc[1] == kPathOperatorRectangle[1]) {
16084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            AddPathRect(params[0], params[1], params[2], params[3]);
16094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            nParams = 0;
16104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          } else {
16114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            bProcessed = false;
16124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          }
16134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        } else {
16144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          bProcessed = false;
16154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
16164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (bProcessed) {
16174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          last_pos = m_pSyntax->GetPos();
16184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
16194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
16204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
16214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case CPDF_StreamParser::Number: {
16224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (nParams == 6)
16234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          break;
16244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
16254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        int value;
162633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann        bool bInteger = FX_atonum(m_pSyntax->GetWord(), &value);
16274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        params[nParams++] = bInteger ? (FX_FLOAT)value : *(FX_FLOAT*)&value;
16284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
16294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
16304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      default:
16314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        bProcessed = false;
16324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
16334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!bProcessed) {
16344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pSyntax->SetPos(last_pos);
16354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
16364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
16374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
16384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
16394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
16404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_StreamContentParser::ContentParam::ContentParam() {}
16414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
16424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_StreamContentParser::ContentParam::~ContentParam() {}
1643