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