From b3a5240832fce3f0b706c16070a1e69c2c1edb86 Mon Sep 17 00:00:00 2001 From: Ralf Sippl Date: Mon, 19 Mar 2018 23:30:28 +0000 Subject: Calculate AP for multi-line markup annotations correctly Currently, when constructing AP for multi-line markup annotations, we only take into account the first set of quadpoints, resulting in only the first line of the annotation being displayed if the annotation spans multiple lines. This CL, initially written by Jane Liu (https://pdfium-review.googlesource.com/12010) takes into account all the quadpoints, so multi-line annotations can be displayed correctly. BUG=pdfium:876 Change-Id: I8be10ee38e01eb6525ddef556df1b727189455c7 Reviewed-on: https://pdfium-review.googlesource.com/28590 Reviewed-by: Lei Zhang Commit-Queue: Lei Zhang --- core/fpdfdoc/cpdf_annot.cpp | 50 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 9 deletions(-) (limited to 'core/fpdfdoc/cpdf_annot.cpp') diff --git a/core/fpdfdoc/cpdf_annot.cpp b/core/fpdfdoc/cpdf_annot.cpp index cc70a3087c..91cdb12d9f 100644 --- a/core/fpdfdoc/cpdf_annot.cpp +++ b/core/fpdfdoc/cpdf_annot.cpp @@ -6,6 +6,7 @@ #include "core/fpdfdoc/cpdf_annot.h" +#include #include #include "core/fpdfapi/page/cpdf_form.h" @@ -158,7 +159,7 @@ CFX_FloatRect CPDF_Annot::RectForDrawing() const { bool bShouldUseQuadPointsCoords = m_bIsTextMarkupAnnotation && m_bHasGeneratedAP; if (bShouldUseQuadPointsCoords) - return RectFromQuadPoints(m_pAnnotDict.Get()); + return BoundingRectFromQuadPoints(m_pAnnotDict.Get()); return m_pAnnotDict->GetRectFor("Rect"); } @@ -205,11 +206,8 @@ CPDF_Form* CPDF_Annot::GetAPForm(const CPDF_Page* pPage, AppearanceMode mode) { } // Static. -CFX_FloatRect CPDF_Annot::RectFromQuadPoints(CPDF_Dictionary* pAnnotDict) { - CPDF_Array* pArray = pAnnotDict->GetArrayFor("QuadPoints"); - if (!pArray) - return CFX_FloatRect(); - +CFX_FloatRect CPDF_Annot::RectFromQuadPointsArray(const CPDF_Array* pArray, + size_t nIndex) { // QuadPoints are defined with 4 pairs of numbers // ([ pair0, pair1, pair2, pair3 ]), where // pair0 = top_left @@ -217,11 +215,40 @@ CFX_FloatRect CPDF_Annot::RectFromQuadPoints(CPDF_Dictionary* pAnnotDict) { // pair2 = bottom_left // pair3 = bottom_right // - // On the other hand, /Rect is define as 2 pairs [pair0, pair1] where: + // On the other hand, /Rect is defined as 2 pairs [pair0, pair1] where: // pair0 = bottom_left // pair1 = top_right. - return CFX_FloatRect(pArray->GetNumberAt(4), pArray->GetNumberAt(5), - pArray->GetNumberAt(2), pArray->GetNumberAt(3)); + + return CFX_FloatRect( + pArray->GetNumberAt(4 + nIndex * 8), pArray->GetNumberAt(5 + nIndex * 8), + pArray->GetNumberAt(2 + nIndex * 8), pArray->GetNumberAt(3 + nIndex * 8)); +} + +// Static. +CFX_FloatRect CPDF_Annot::BoundingRectFromQuadPoints( + CPDF_Dictionary* pAnnotDict) { + CPDF_Array* pArray = pAnnotDict->GetArrayFor("QuadPoints"); + if (!pArray) + return CFX_FloatRect(); + + CFX_FloatRect ret = RectFromQuadPointsArray(pArray, 0); + size_t nQuadPointCount = QuadPointCount(pArray); + for (size_t i = 1; i < nQuadPointCount; ++i) { + CFX_FloatRect rect = RectFromQuadPointsArray(pArray, i); + ret.Union(rect); + } + return ret; +} + +// Static. +CFX_FloatRect CPDF_Annot::RectFromQuadPoints(CPDF_Dictionary* pAnnotDict, + size_t nIndex) { + CPDF_Array* pArray = pAnnotDict->GetArrayFor("QuadPoints"); + + if (!pArray) + return CFX_FloatRect(); + + return RectFromQuadPointsArray(pArray, nIndex); } // Static. @@ -348,6 +375,11 @@ ByteString CPDF_Annot::AnnotSubtypeToString(CPDF_Annot::Subtype nSubtype) { return ""; } +// Static. +size_t CPDF_Annot::QuadPointCount(const CPDF_Array* pArray) { + return pArray->GetCount() / 8; +} + bool CPDF_Annot::DrawAppearance(CPDF_Page* pPage, CFX_RenderDevice* pDevice, const CFX_Matrix& mtUser2Device, -- cgit v1.2.3