1e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved. 2e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Use of this source code is governed by a BSD-style license that can be 3e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// found in the LICENSE file. 4ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 5e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 7ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fpdfapi/fpdf_pageobj.h" 8ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fpdfdoc/fpdf_doc.h" 9e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 10e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPDF_AnnotList::CPDF_AnnotList(CPDF_Page* pPage) 11ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann : m_pDocument(pPage->m_pDocument) { 12ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pPage->m_pFormDict) 13ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 14ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 15ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pAnnots = pPage->m_pFormDict->GetArray("Annots"); 16ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pAnnots) 17ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 18ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 19ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pRoot = m_pDocument->GetRoot(); 20ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pAcroForm = pRoot->GetDict("AcroForm"); 21ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bRegenerateAP = pAcroForm && pAcroForm->GetBoolean("NeedAppearances"); 22ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (FX_DWORD i = 0; i < pAnnots->GetCount(); ++i) { 23ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pDict = ToDictionary(pAnnots->GetElementValue(i)); 24ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pDict) 25ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 26ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 27ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD dwObjNum = pDict->GetObjNum(); 28ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (dwObjNum == 0) { 29ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dwObjNum = m_pDocument->AddIndirectObject(pDict); 30ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Reference* pAction = new CPDF_Reference(m_pDocument, dwObjNum); 31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pAnnots->InsertAt(i, pAction); 32ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pAnnots->RemoveAt(i + 1); 33ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDict = pAnnots->GetDict(i); 34ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 35ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_AnnotList.push_back(new CPDF_Annot(pDict, this)); 36ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bRegenerateAP && pDict->GetConstString("Subtype") == "Widget" && 37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_InterForm::UpdatingAPEnabled()) { 38ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FPDF_GenerateAP(m_pDocument, pDict); 39ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 40ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 41e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 42ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 43ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_AnnotList::~CPDF_AnnotList() { 44ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (CPDF_Annot* annot : m_AnnotList) 45ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann delete annot; 46e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 47ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 48ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_AnnotList::DisplayPass(CPDF_Page* pPage, 49ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_RenderDevice* pDevice, 50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_RenderContext* pContext, 51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bPrinting, 52ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_Matrix* pMatrix, 53ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bWidgetPass, 54ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_RenderOptions* pOptions, 55ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_RECT* clip_rect) { 56ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (CPDF_Annot* pAnnot : m_AnnotList) { 57ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bWidget = pAnnot->GetSubType() == "Widget"; 58ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((bWidgetPass && !bWidget) || (!bWidgetPass && bWidget)) 59ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 60ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 61ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD annot_flags = pAnnot->GetFlags(); 62ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (annot_flags & ANNOTFLAG_HIDDEN) 63ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 64ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 65ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bPrinting && (annot_flags & ANNOTFLAG_PRINT) == 0) 66ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 67ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 68ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!bPrinting && (annot_flags & ANNOTFLAG_NOVIEW)) 69ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 70ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 71ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pOptions) { 72ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann IPDF_OCContext* pOCContext = pOptions->m_pOCContext; 73ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pAnnotDict = pAnnot->GetAnnotDict(); 74ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pOCContext && pAnnotDict && 75ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann !pOCContext->CheckOCGVisible(pAnnotDict->GetDict("OC"))) { 76ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 77ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 78ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 79ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Rect annot_rect_f; 80ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pAnnot->GetRect(annot_rect_f); 81ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_Matrix matrix = *pMatrix; 82ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (clip_rect) { 83ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann annot_rect_f.Transform(&matrix); 84ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_RECT annot_rect = annot_rect_f.GetOutterRect(); 85ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann annot_rect.Intersect(*clip_rect); 86ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (annot_rect.IsEmpty()) { 87ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 88ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 89ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 90ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pContext) { 91ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pAnnot->DrawInContext(pPage, pContext, &matrix, CPDF_Annot::Normal); 92ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (!pAnnot->DrawAppearance(pPage, pDevice, &matrix, 93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Annot::Normal, pOptions)) { 94ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pAnnot->DrawBorder(pDevice, &matrix, pOptions); 95ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 96ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 97e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 98ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 99ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_AnnotList::DisplayAnnots(CPDF_Page* pPage, 100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_RenderDevice* pDevice, 101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_RenderContext* pContext, 102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bPrinting, 103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_Matrix* pUser2Device, 104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD dwAnnotFlags, 105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_RenderOptions* pOptions, 106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_RECT* pClipRect) { 107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (dwAnnotFlags & 0x01) { 108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann DisplayPass(pPage, pDevice, pContext, bPrinting, pUser2Device, FALSE, 109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pOptions, pClipRect); 110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (dwAnnotFlags & 0x02) { 112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann DisplayPass(pPage, pDevice, pContext, bPrinting, pUser2Device, TRUE, 113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pOptions, pClipRect); 114ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 115e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Annot::CPDF_Annot(CPDF_Dictionary* pDict, CPDF_AnnotList* pList) 118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann : m_pAnnotDict(pDict), 119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pList(pList), 120ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_sSubtype(m_pAnnotDict->GetConstString("Subtype")) {} 121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Annot::~CPDF_Annot() { 122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ClearCachedAP(); 123e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Annot::ClearCachedAP() { 125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (const auto& pair : m_APMap) { 126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann delete pair.second; 127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_APMap.clear(); 129e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_ByteString CPDF_Annot::GetSubType() const { 131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_sSubtype; 132e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 133ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 134ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Annot::GetRect(CPDF_Rect& rect) const { 135ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pAnnotDict) { 136ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 137ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 138ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann rect = m_pAnnotDict->GetRect("Rect"); 139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann rect.Normalize(); 140e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 141ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 142ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_DWORD CPDF_Annot::GetFlags() const { 143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_pAnnotDict->GetInteger("F"); 144e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 145ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 146ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Stream* FPDFDOC_GetAnnotAP(CPDF_Dictionary* pAnnotDict, 147ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Annot::AppearanceMode mode) { 148ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pAP = pAnnotDict->GetDict("AP"); 149ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pAP) { 150ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 151ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const FX_CHAR* ap_entry = "N"; 153ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (mode == CPDF_Annot::Down) 154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ap_entry = "D"; 155ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann else if (mode == CPDF_Annot::Rollover) 156ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ap_entry = "R"; 157ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pAP->KeyExist(ap_entry)) 158ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ap_entry = "N"; 159ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 160ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* psub = pAP->GetElementValue(ap_entry); 161ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!psub) 162ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 163ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (CPDF_Stream* pStream = psub->AsStream()) 164e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return pStream; 165ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 166ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (CPDF_Dictionary* pDict = psub->AsDictionary()) { 167ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString as = pAnnotDict->GetString("AS"); 168ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (as.IsEmpty()) { 169ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString value = pAnnotDict->GetString("V"); 170ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (value.IsEmpty()) { 171ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pDict = pAnnotDict->GetDict("Parent"); 172ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann value = pDict ? pDict->GetString("V") : CFX_ByteString(); 173ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (value.IsEmpty() || !pDict->KeyExist(value)) 175ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann as = "Off"; 176ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann else 177ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann as = value; 178ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 179ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pDict->GetStream(as); 180ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 181ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 182e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 183ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 184ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Form* CPDF_Annot::GetAPForm(const CPDF_Page* pPage, AppearanceMode mode) { 185ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Stream* pStream = FPDFDOC_GetAnnotAP(m_pAnnotDict, mode); 186ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pStream) 187ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 188ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 189ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann auto it = m_APMap.find(pStream); 190ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (it != m_APMap.end()) 191ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return it->second; 192ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 193ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Form* pNewForm = 194ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann new CPDF_Form(m_pList->GetDocument(), pPage->m_pResources, pStream); 195ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pNewForm->ParseContent(nullptr, nullptr, nullptr, nullptr); 196ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_APMap[pStream] = pNewForm; 197ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pNewForm; 198e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 199ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 200ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic CPDF_Form* FPDFDOC_Annot_GetMatrix(const CPDF_Page* pPage, 201ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Annot* pAnnot, 202ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Annot::AppearanceMode mode, 203ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_Matrix* pUser2Device, 204ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_Matrix& matrix) { 205ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Form* pForm = pAnnot->GetAPForm(pPage, mode); 206ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pForm) { 207ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 208ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 209ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_FloatRect form_bbox = pForm->m_pFormDict->GetRect("BBox"); 210ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_Matrix form_matrix = pForm->m_pFormDict->GetMatrix("Matrix"); 211ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann form_matrix.TransformRect(form_bbox); 212ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Rect arect; 213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pAnnot->GetRect(arect); 214ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann matrix.MatchRect(arect, form_bbox); 215ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann matrix.Concat(*pUser2Device); 216ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pForm; 217e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 218ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_Annot::DrawAppearance(CPDF_Page* pPage, 219ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_RenderDevice* pDevice, 220ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_Matrix* pUser2Device, 221ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann AppearanceMode mode, 222ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CPDF_RenderOptions* pOptions) { 223ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_Matrix matrix; 224ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Form* pForm = 225ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FPDFDOC_Annot_GetMatrix(pPage, this, mode, pUser2Device, matrix); 226ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pForm) { 227ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 228ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 229ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_RenderContext context(pPage); 230ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann context.DrawObjectList(pDevice, pForm, &matrix, pOptions); 231ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 232e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 233ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_Annot::DrawInContext(const CPDF_Page* pPage, 234ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_RenderContext* pContext, 235ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_Matrix* pUser2Device, 236ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann AppearanceMode mode) { 237ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_Matrix matrix; 238ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Form* pForm = 239ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FPDFDOC_Annot_GetMatrix(pPage, this, mode, pUser2Device, matrix); 240ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pForm) { 241ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 242ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 243ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pContext->AppendObjectList(pForm, &matrix); 244ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 245e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 246ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Annot::DrawBorder(CFX_RenderDevice* pDevice, 247ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_Matrix* pUser2Device, 248ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CPDF_RenderOptions* pOptions) { 249ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (GetSubType() == "Popup") { 250ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 251ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 252ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD annot_flags = GetFlags(); 253ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (annot_flags & ANNOTFLAG_HIDDEN) { 254ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 255ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 256ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bPrinting = pDevice->GetDeviceClass() == FXDC_PRINTER || 257ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann (pOptions && (pOptions->m_Flags & RENDER_PRINTPREVIEW)); 258ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bPrinting && (annot_flags & ANNOTFLAG_PRINT) == 0) { 259ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 260ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 261ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!bPrinting && (annot_flags & ANNOTFLAG_NOVIEW)) { 262ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 263ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 264ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pBS = m_pAnnotDict->GetDict("BS"); 265ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann char style_char; 266ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FLOAT width; 267ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pDashArray = NULL; 268ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pBS) { 269ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pBorderArray = m_pAnnotDict->GetArray("Border"); 270ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann style_char = 'S'; 271ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pBorderArray) { 272ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann width = pBorderArray->GetNumber(2); 273ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pBorderArray->GetCount() == 4) { 274ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDashArray = pBorderArray->GetArray(3); 275ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pDashArray) { 276ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 277e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 278ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int nLen = pDashArray->GetCount(); 279ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int i = 0; 280ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (; i < nLen; ++i) { 281ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pObj = pDashArray->GetElementValue(i); 282ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pObj && pObj->GetInteger()) { 283ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 284ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 285e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 286ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (i == nLen) { 287ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 288e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 289ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann style_char = 'D'; 290ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 291e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 292ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann width = 1; 293ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 294ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 295ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString style = pBS->GetString("S"); 296ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDashArray = pBS->GetArray("D"); 297ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann style_char = style[1]; 298ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann width = pBS->GetNumber("W"); 299ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 300ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (width <= 0) { 301ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 302ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 303ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pColor = m_pAnnotDict->GetArray("C"); 304ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD argb = 0xff000000; 305ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pColor) { 306ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int R = (int32_t)(pColor->GetNumber(0) * 255); 307ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int G = (int32_t)(pColor->GetNumber(1) * 255); 308ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int B = (int32_t)(pColor->GetNumber(2) * 255); 309ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann argb = ArgbEncode(0xff, R, G, B); 310ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 311ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_GraphStateData graph_state; 312ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann graph_state.m_LineWidth = width; 313ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (style_char == 'D') { 314ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pDashArray) { 315ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD dash_count = pDashArray->GetCount(); 316ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (dash_count % 2) { 317ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann dash_count++; 318ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 319ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann graph_state.m_DashArray = FX_Alloc(FX_FLOAT, dash_count); 320ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann graph_state.m_DashCount = dash_count; 321ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD i; 322ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (i = 0; i < pDashArray->GetCount(); ++i) { 323ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann graph_state.m_DashArray[i] = pDashArray->GetNumber(i); 324ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 325ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (i < dash_count) { 326ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann graph_state.m_DashArray[i] = graph_state.m_DashArray[i - 1]; 327ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 328ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 329ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann graph_state.m_DashArray = FX_Alloc(FX_FLOAT, 2); 330ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann graph_state.m_DashCount = 2; 331ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann graph_state.m_DashArray[0] = graph_state.m_DashArray[1] = 3 * 1.0f; 332ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 333ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 334ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_FloatRect rect; 335ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann GetRect(rect); 336ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_PathData path; 337ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann width /= 2; 338ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann path.AppendRect(rect.left + width, rect.bottom + width, rect.right - width, 339ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann rect.top - width); 340ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int fill_type = 0; 341ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pOptions && (pOptions->m_Flags & RENDER_NOPATHSMOOTH)) { 342ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann fill_type |= FXFILL_NOPATHSMOOTH; 343ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 344ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDevice->DrawPath(&path, pUser2Device, &graph_state, argb, argb, fill_type); 345e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 346