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 "../../../third_party/base/nonstd_unique_ptr.h" 8e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "../../include/fpdfdoc/fpdf_doc.h" 9e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "../../include/fpdfapi/fpdf_pageobj.h" 10e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 11e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPDF_AnnotList::CPDF_AnnotList(CPDF_Page* pPage) 12e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 13e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(pPage != NULL); 14e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pPageDict = pPage->m_pFormDict; 15e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_pPageDict == NULL) { 16e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; 17e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 18e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pDocument = pPage->m_pDocument; 19e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_Array* pAnnots = m_pPageDict->GetArray("Annots"); 20e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pAnnots == NULL) { 21e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; 22e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 23e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_Dictionary* pRoot = m_pDocument->GetRoot(); 24e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_Dictionary* pAcroForm = pRoot->GetDict("AcroForm"); 25e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_BOOL bRegenerateAP = pAcroForm && pAcroForm->GetBoolean("NeedAppearances"); 26e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (FX_DWORD i = 0; i < pAnnots->GetCount(); i ++) { 27e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_Dictionary* pDict = (CPDF_Dictionary*)pAnnots->GetElementValue(i); 28e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pDict == NULL || pDict->GetType() != PDFOBJ_DICTIONARY) { 29e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov continue; 30e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 31e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_DWORD dwObjNum = pDict->GetObjNum(); 32e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (dwObjNum == 0) { 33e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov dwObjNum = m_pDocument->AddIndirectObject(pDict); 34e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_Reference* pAction = CPDF_Reference::Create(m_pDocument, dwObjNum); 35e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pAction == NULL) { 36e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 37e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 38e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pAnnots->InsertAt(i, pAction); 39e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pAnnots->RemoveAt(i + 1); 40e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pDict = pAnnots->GetDict(i); 41e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 42e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_Annot* pAnnot = new CPDF_Annot(pDict); 43e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pAnnot->m_pList = this; 44e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_AnnotList.Add(pAnnot); 45e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (bRegenerateAP && pDict->GetConstString(FX_BSTRC("Subtype")) == FX_BSTRC("Widget")) 46e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (CPDF_InterForm::UpdatingAPEnabled()) { 47e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FPDF_GenerateAP(m_pDocument, pDict); 48e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 49e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 50e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 51e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPDF_AnnotList::~CPDF_AnnotList() 52e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 53e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int i = 0; 54e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (i = 0; i < m_AnnotList.GetSize(); i ++) { 55e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov delete (CPDF_Annot*)m_AnnotList[i]; 56e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 57e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (i = 0; i < m_Borders.GetSize(); ++i) { 58e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov delete (CPDF_PageObjects*)m_Borders[i]; 59e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 60e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 61e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPDF_AnnotList::DisplayPass(const CPDF_Page* pPage, CFX_RenderDevice* pDevice, 62e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_RenderContext* pContext, FX_BOOL bPrinting, CFX_AffineMatrix* pMatrix, 63e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_BOOL bWidgetPass, CPDF_RenderOptions* pOptions, FX_RECT* clip_rect) 64e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 65e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (int i = 0; i < m_AnnotList.GetSize(); i ++) { 66e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_Annot* pAnnot = (CPDF_Annot*)m_AnnotList[i]; 67e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_BOOL bWidget = pAnnot->GetSubType() == "Widget"; 68e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if ((bWidgetPass && !bWidget) || (!bWidgetPass && bWidget)) { 69e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov continue; 70e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 71e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_DWORD annot_flags = pAnnot->GetFlags(); 72e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (annot_flags & ANNOTFLAG_HIDDEN) { 73e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov continue; 74e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 75e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (bPrinting && (annot_flags & ANNOTFLAG_PRINT) == 0) { 76e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov continue; 77e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 78e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!bPrinting && (annot_flags & ANNOTFLAG_NOVIEW)) { 79e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov continue; 80e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 81e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pOptions != NULL) { 82e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov IPDF_OCContext* pOCContext = pOptions->m_pOCContext; 83e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_Dictionary* pAnnotDict = pAnnot->m_pAnnotDict; 84e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pOCContext != NULL && pAnnotDict != NULL && 85e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov !pOCContext->CheckOCGVisible(pAnnotDict->GetDict(FX_BSTRC("OC")))) { 86e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov continue; 87e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 88e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 89e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_Rect annot_rect_f; 90e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pAnnot->GetRect(annot_rect_f); 91e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_Matrix matrix; 92e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov matrix = *pMatrix; 93e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (clip_rect) { 94e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov annot_rect_f.Transform(&matrix); 95e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_RECT annot_rect = annot_rect_f.GetOutterRect(); 96e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov annot_rect.Intersect(*clip_rect); 97e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (annot_rect.IsEmpty()) { 98e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov continue; 99e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 100e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 101e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pContext) { 102e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pAnnot->DrawInContext(pPage, pContext, &matrix, CPDF_Annot::Normal); 103e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else if (!pAnnot->DrawAppearance(pPage, pDevice, &matrix, CPDF_Annot::Normal, pOptions)) { 104e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pAnnot->DrawBorder(pDevice, &matrix, pOptions); 105e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 106e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 107e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 108e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPDF_AnnotList::DisplayAnnots(const CPDF_Page* pPage, CFX_RenderDevice* pDevice, 109e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_AffineMatrix* pUser2Device, 110e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_BOOL bShowWidget, CPDF_RenderOptions* pOptions) 111e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 112e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_RECT clip_rect; 113e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pDevice) { 114e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov clip_rect = pDevice->GetClipBox(); 115e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 116e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_BOOL bPrinting = pDevice->GetDeviceClass() == FXDC_PRINTER || (pOptions && (pOptions->m_Flags & RENDER_PRINTPREVIEW)); 117e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov DisplayAnnots(pPage, pDevice, NULL, bPrinting, pUser2Device, bShowWidget ? 3 : 1, pOptions, &clip_rect); 118e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 119e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPDF_AnnotList::DisplayAnnots(const CPDF_Page* pPage, CFX_RenderDevice* pDevice, CPDF_RenderContext* pContext, 120e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_BOOL bPrinting, CFX_AffineMatrix* pUser2Device, FX_DWORD dwAnnotFlags, 121e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_RenderOptions* pOptions, FX_RECT* pClipRect) 122e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 123e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (dwAnnotFlags & 0x01) { 124e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov DisplayPass(pPage, pDevice, pContext, bPrinting, pUser2Device, FALSE, pOptions, pClipRect); 125e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 126e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (dwAnnotFlags & 0x02) { 127e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov DisplayPass(pPage, pDevice, pContext, bPrinting, pUser2Device, TRUE, pOptions, pClipRect); 128e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 129e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 130e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovint CPDF_AnnotList::GetIndex(CPDF_Annot* pAnnot) 131e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 132e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (int i = 0; i < m_AnnotList.GetSize(); i ++) 133e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_AnnotList[i] == (FX_LPVOID)pAnnot) { 134e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return i; 135e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 136e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return -1; 137e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 138e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPDF_Annot::CPDF_Annot(CPDF_Dictionary* pDict) 139e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 140e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pList = NULL; 141e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pAnnotDict = pDict; 142e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 143e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPDF_Annot::~CPDF_Annot() 144e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 145e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ClearCachedAP(); 146e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 147e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPDF_Reference* CPDF_Annot::NewAnnotRef() 148e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 149e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_pAnnotDict->GetObjNum() == 0) { 150e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pList->m_pDocument->AddIndirectObject(m_pAnnotDict); 151e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 152e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return CPDF_Reference::Create(m_pList->m_pDocument, m_pAnnotDict->GetObjNum()); 153e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 154e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPDF_Annot::ClearCachedAP() 155e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 156e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_POSITION pos = m_APMap.GetStartPosition(); 157e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov while (pos) { 158e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov void* pForm; 159e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov void* pObjects; 160e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_APMap.GetNextAssoc(pos, pForm, pObjects); 161e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov delete (CPDF_PageObjects*)pObjects; 162e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 163e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_APMap.RemoveAll(); 164e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 165e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCFX_ByteString CPDF_Annot::GetSubType() const 166e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 167e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return m_pAnnotDict ? m_pAnnotDict->GetConstString(FX_BSTRC("Subtype")) : CFX_ByteStringC(); 168e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 169e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPDF_Annot::GetRect(CPDF_Rect& rect) const 170e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 171e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_pAnnotDict == NULL) { 172e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; 173e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 174e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov rect = m_pAnnotDict->GetRect("Rect"); 175e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov rect.Normalize(); 176e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 177e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPDF_Stream* FPDFDOC_GetAnnotAP(CPDF_Dictionary* pAnnotDict, CPDF_Annot::AppearanceMode mode) 178e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 179e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_Dictionary* pAP = pAnnotDict->GetDict("AP"); 180e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pAP == NULL) { 181e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return NULL; 182e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 183e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov const FX_CHAR* ap_entry = "N"; 184e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (mode == CPDF_Annot::Down) { 185e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ap_entry = "D"; 186e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else if (mode == CPDF_Annot::Rollover) { 187e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ap_entry = "R"; 188e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 189e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!pAP->KeyExist(ap_entry)) { 190e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ap_entry = "N"; 191e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 192e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_Object* psub = pAP->GetElementValue(ap_entry); 193e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (psub == NULL) { 194e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return NULL; 195e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 196e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_Stream* pStream = NULL; 197e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (psub->GetType() == PDFOBJ_STREAM) { 198e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pStream = (CPDF_Stream*)psub; 199e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else if (psub->GetType() == PDFOBJ_DICTIONARY) { 200e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_ByteString as = pAnnotDict->GetString("AS"); 201e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (as.IsEmpty()) { 202e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_ByteString value = pAnnotDict->GetString(FX_BSTRC("V")); 203e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (value.IsEmpty()) { 204e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_Dictionary* pDict = pAnnotDict->GetDict(FX_BSTRC("Parent")); 205e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov value = pDict ? pDict->GetString(FX_BSTRC("V")) : CFX_ByteString(); 206e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 207e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (value.IsEmpty() || !((CPDF_Dictionary*)psub)->KeyExist(value)) { 208e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov as = FX_BSTRC("Off"); 209e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 210e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov as = value; 211e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 212e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 213e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pStream = ((CPDF_Dictionary*)psub)->GetStream(as); 214e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 215e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return pStream; 216e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 217e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPDF_Form* CPDF_Annot::GetAPForm(const CPDF_Page* pPage, AppearanceMode mode) 218e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 219e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_Stream* pStream = FPDFDOC_GetAnnotAP(m_pAnnotDict, mode); 220e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pStream == NULL) { 221e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return NULL; 222e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 223e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_Form* pForm; 224e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_APMap.Lookup(pStream, (void*&)pForm)) { 225e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return pForm; 226e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 227e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pForm = new CPDF_Form(m_pList->m_pDocument, pPage->m_pResources, pStream); 228e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pForm->ParseContent(NULL, NULL, NULL, NULL); 229e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_APMap.SetAt(pStream, pForm); 230e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return pForm; 231e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 232e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic CPDF_Form* FPDFDOC_Annot_GetMatrix(const CPDF_Page* pPage, CPDF_Annot* pAnnot, CPDF_Annot::AppearanceMode mode, const CFX_AffineMatrix* pUser2Device, CFX_Matrix &matrix) 233e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 234e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_Form* pForm = pAnnot->GetAPForm(pPage, mode); 235e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!pForm) { 236e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return NULL; 237e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 238e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_FloatRect form_bbox = pForm->m_pFormDict->GetRect(FX_BSTRC("BBox")); 239e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_Matrix form_matrix = pForm->m_pFormDict->GetMatrix(FX_BSTRC("Matrix")); 240e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov form_matrix.TransformRect(form_bbox); 241e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_Rect arect; 242e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pAnnot->GetRect(arect); 243e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov matrix.MatchRect(arect, form_bbox); 244e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov matrix.Concat(*pUser2Device); 245e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return pForm; 246e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 247e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CPDF_Annot::DrawAppearance(const CPDF_Page* pPage, CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pUser2Device, 248e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov AppearanceMode mode, const CPDF_RenderOptions* pOptions) 249e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 250e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_Matrix matrix; 251e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_Form* pForm = FPDFDOC_Annot_GetMatrix(pPage, this, mode, pUser2Device, matrix); 252e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!pForm) { 253e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 254e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 255e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_RenderContext context; 256e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov context.Create((CPDF_Page*)pPage); 257e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov context.DrawObjectList(pDevice, pForm, &matrix, pOptions); 258e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 259e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 260e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CPDF_Annot::DrawInContext(const CPDF_Page* pPage, const CPDF_RenderContext* pContext, const CFX_AffineMatrix* pUser2Device, AppearanceMode mode) 261e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 262e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_Matrix matrix; 263e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_Form* pForm = FPDFDOC_Annot_GetMatrix(pPage, this, mode, pUser2Device, matrix); 264e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!pForm) { 265e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 266e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 267e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ((CPDF_RenderContext*)pContext)->AppendObjectList(pForm, &matrix); 268e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 269e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 270e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPDF_PageObject* CPDF_Annot::GetBorder(FX_BOOL bPrint, const CPDF_RenderOptions* pOptions) 271e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 272e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (GetSubType() == "Popup") { 273e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return NULL; 274e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 275e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_DWORD annot_flags = GetFlags(); 276e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (annot_flags & ANNOTFLAG_HIDDEN) { 277e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return NULL; 278e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 279e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_BOOL bPrinting = bPrint || (pOptions && (pOptions->m_Flags & RENDER_PRINTPREVIEW)); 280e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (bPrinting && (annot_flags & ANNOTFLAG_PRINT) == 0) { 281e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return NULL; 282e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 283e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!bPrinting && (annot_flags & ANNOTFLAG_NOVIEW)) { 284e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return NULL; 285e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 286e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_Dictionary* pBS = m_pAnnotDict->GetDict("BS"); 287e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov char style_char; 288e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_FLOAT width; 289e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_Array* pDashArray = NULL; 290e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pBS == NULL) { 291e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_Array* pBorderArray = m_pAnnotDict->GetArray("Border"); 292e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov style_char = 'S'; 293e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pBorderArray) { 294e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov width = pBorderArray->GetNumber(2); 295e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pBorderArray->GetCount() == 4) { 296e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pDashArray = pBorderArray->GetArray(3); 297e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pDashArray == NULL) { 298e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return NULL; 299e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 300e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov style_char = 'D'; 301e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 302e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 303e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov width = 1; 304e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 305e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 306e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_ByteString style = pBS->GetString("S"); 307e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pDashArray = pBS->GetArray("D"); 308e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov style_char = style[1]; 309e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov width = pBS->GetNumber("W"); 310e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 311e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (width <= 0) { 312e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return NULL; 313e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 314e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_Array* pColor = m_pAnnotDict->GetArray("C"); 315e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_DWORD argb = 0xff000000; 316e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pColor != NULL) { 317e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int R = (FX_INT32)(pColor->GetNumber(0) * 255); 318e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int G = (FX_INT32)(pColor->GetNumber(1) * 255); 319e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int B = (FX_INT32)(pColor->GetNumber(2) * 255); 320e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov argb = ArgbEncode(0xff, R, G, B); 321e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 322e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov nonstd::unique_ptr<CPDF_PathObject> pPathObject(new CPDF_PathObject()); 323e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_GraphStateData *pGraphState = pPathObject->m_GraphState.GetModify(); 324e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!pGraphState) { 325e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return NULL; 326e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 327e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pGraphState->m_LineWidth = width; 328e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_ColorStateData *pColorData = pPathObject->m_ColorState.GetModify(); 329e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!pColorData) { 330e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return NULL; 331e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 332e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pColorData->m_StrokeRGB = argb; 333e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pPathObject->m_bStroke = TRUE; 334e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pPathObject->m_FillType = 0; 335e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (style_char == 'D') { 336e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pDashArray) { 337e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_DWORD dash_count = pDashArray->GetCount(); 338e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (dash_count % 2) { 339e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov dash_count ++; 340e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 341e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pGraphState->m_DashArray = FX_Alloc(FX_FLOAT, dash_count); 342e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pGraphState->m_DashCount = dash_count; 343e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_DWORD i; 344e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (i = 0; i < pDashArray->GetCount(); i ++) { 345e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pGraphState->m_DashArray[i] = pDashArray->GetNumber(i); 346e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 347e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (i < dash_count) { 348e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pGraphState->m_DashArray[i] = pGraphState->m_DashArray[i - 1]; 349e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 350e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 351e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pGraphState->m_DashArray = FX_Alloc(FX_FLOAT, 2); 352e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pGraphState->m_DashCount = 2; 353e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pGraphState->m_DashArray[0] = pGraphState->m_DashArray[1] = 3 * 1.0f; 354e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 355e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 356e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_FloatRect rect; 357e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov GetRect(rect); 358e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov width /= 2; 359e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_PathData *pPathData = pPathObject->m_Path.GetModify(); 360e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pPathData) { 361e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pPathData->AppendRect(rect.left + width, rect.bottom + width, rect.right - width, rect.top - width); 362e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 363e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pPathObject->CalcBoundingBox(); 364e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return pPathObject.release(); 365e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 366e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPDF_Annot::DrawBorder(CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pUser2Device, const CPDF_RenderOptions* pOptions) 367e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 368e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (GetSubType() == "Popup") { 369e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; 370e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 371e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_DWORD annot_flags = GetFlags(); 372e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (annot_flags & ANNOTFLAG_HIDDEN) { 373e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; 374e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 375e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_BOOL bPrinting = pDevice->GetDeviceClass() == FXDC_PRINTER || (pOptions && (pOptions->m_Flags & RENDER_PRINTPREVIEW)); 376e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (bPrinting && (annot_flags & ANNOTFLAG_PRINT) == 0) { 377e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; 378e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 379e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!bPrinting && (annot_flags & ANNOTFLAG_NOVIEW)) { 380e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; 381e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 382e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_Dictionary* pBS = m_pAnnotDict->GetDict("BS"); 383e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov char style_char; 384e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_FLOAT width; 385e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_Array* pDashArray = NULL; 386e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pBS == NULL) { 387e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_Array* pBorderArray = m_pAnnotDict->GetArray("Border"); 388e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov style_char = 'S'; 389e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pBorderArray) { 390e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov width = pBorderArray->GetNumber(2); 391e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pBorderArray->GetCount() == 4) { 392e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pDashArray = pBorderArray->GetArray(3); 393e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pDashArray == NULL) { 394e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; 395e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 396e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int nLen = pDashArray->GetCount(); 397e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int i = 0; 398e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (; i < nLen; ++i) { 399e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_Object*pObj = pDashArray->GetElementValue(i); 400e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pObj && pObj->GetInteger()) { 401e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 402e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 403e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 404e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (i == nLen) { 405e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; 406e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 407e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov style_char = 'D'; 408e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 409e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 410e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov width = 1; 411e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 412e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 413e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_ByteString style = pBS->GetString("S"); 414e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pDashArray = pBS->GetArray("D"); 415e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov style_char = style[1]; 416e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov width = pBS->GetNumber("W"); 417e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 418e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (width <= 0) { 419e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; 420e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 421e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_Array* pColor = m_pAnnotDict->GetArray("C"); 422e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_DWORD argb = 0xff000000; 423e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pColor != NULL) { 424e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int R = (FX_INT32)(pColor->GetNumber(0) * 255); 425e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int G = (FX_INT32)(pColor->GetNumber(1) * 255); 426e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int B = (FX_INT32)(pColor->GetNumber(2) * 255); 427e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov argb = ArgbEncode(0xff, R, G, B); 428e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 429e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_GraphStateData graph_state; 430e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov graph_state.m_LineWidth = width; 431e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (style_char == 'D') { 432e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pDashArray) { 433e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_DWORD dash_count = pDashArray->GetCount(); 434e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (dash_count % 2) { 435e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov dash_count ++; 436e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 437e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov graph_state.m_DashArray = FX_Alloc(FX_FLOAT, dash_count); 438e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov graph_state.m_DashCount = dash_count; 439e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_DWORD i; 440e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (i = 0; i < pDashArray->GetCount(); i ++) { 441e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov graph_state.m_DashArray[i] = pDashArray->GetNumber(i); 442e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 443e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (i < dash_count) { 444e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov graph_state.m_DashArray[i] = graph_state.m_DashArray[i - 1]; 445e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 446e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 447e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov graph_state.m_DashArray = FX_Alloc(FX_FLOAT, 2); 448e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov graph_state.m_DashCount = 2; 449e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov graph_state.m_DashArray[0] = graph_state.m_DashArray[1] = 3 * 1.0f; 450e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 451e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 452e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_FloatRect rect; 453e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov GetRect(rect); 454e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_PathData path; 455e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov width /= 2; 456e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov path.AppendRect(rect.left + width, rect.bottom + width, rect.right - width, rect.top - width); 457e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int fill_type = 0; 458e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pOptions && (pOptions->m_Flags & RENDER_NOPATHSMOOTH)) { 459e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov fill_type |= FXFILL_NOPATHSMOOTH; 460e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 461e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pDevice->DrawPath(&path, pUser2Device, &graph_state, argb, argb, fill_type); 462e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 463e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovint CPDF_Annot::CountIRTNotes() 464e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 465e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int count = 0; 466e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (int i = 0; i < m_pList->Count(); i ++) { 467e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_Annot* pAnnot = m_pList->GetAt(i); 468e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pAnnot == NULL) { 469e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov continue; 470e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 471e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_Dictionary* pIRT = pAnnot->m_pAnnotDict->GetDict("IRT"); 472e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pIRT != m_pAnnotDict) { 473e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov continue; 474e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 475e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov count ++; 476e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 477e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return count; 478e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 479e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPDF_Annot* CPDF_Annot::GetIRTNote(int index) 480e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 481e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int count = 0; 482e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (int i = 0; i < m_pList->Count(); i ++) { 483e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_Annot* pAnnot = m_pList->GetAt(i); 484e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pAnnot == NULL) { 485e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov continue; 486e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 487e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CPDF_Dictionary* pIRT = pAnnot->m_pAnnotDict->GetDict("IRT"); 488e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pIRT != m_pAnnotDict) { 489e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov continue; 490e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 491e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (count == index) { 492e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return pAnnot; 493e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 494e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov count ++; 495e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 496e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return NULL; 497e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 498