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