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, ¶m.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