[poppler] qt4/src qt5/src
Albert Astals Cid
aacid at kemper.freedesktop.org
Sun May 11 09:32:01 PDT 2014
qt4/src/poppler-annotation-private.h | 4 +-
qt4/src/poppler-annotation.cc | 48 +++++++++++++++++++++++++++++++++--
qt4/src/poppler-page.cc | 7 ++++-
qt4/src/poppler-qt4.h | 14 ++++++++++
qt5/src/poppler-annotation-private.h | 4 +-
qt5/src/poppler-annotation.cc | 48 +++++++++++++++++++++++++++++++++--
qt5/src/poppler-page.cc | 7 ++++-
qt5/src/poppler-qt5.h | 15 ++++++++++
8 files changed, 137 insertions(+), 10 deletions(-)
New commits:
commit 93373cd113d046b65538fe983b46842d689a2112
Author: Albert Astals Cid <aacid at kde.org>
Date: Sun May 11 18:31:10 2014 +0200
Qt: Add a new page->annotations() call that let's you specify subtypes
This way we don't return annotations you may not be interested in
diff --git a/qt4/src/poppler-annotation-private.h b/qt4/src/poppler-annotation-private.h
index c755eb3..4c263eb 100644
--- a/qt4/src/poppler-annotation-private.h
+++ b/qt4/src/poppler-annotation-private.h
@@ -93,8 +93,8 @@ class AnnotationPrivate : public QSharedData
PDFRectangle boundaryToPdfRectangle(const QRectF &r, int flags) const;
AnnotPath * toAnnotPath(const QLinkedList<QPointF> &l) const;
- /* Scan page for annotations, parentId=0 searches for root annotations */
- static QList<Annotation*> findAnnotations(::Page *pdfPage, DocumentData *doc, int parentId = 0);
+ /* Scan page for annotations, parentId=0 searches for root annotations, subtypes empty means all subtypes */
+ static QList<Annotation*> findAnnotations(::Page *pdfPage, DocumentData *doc, const QSet<Annotation::SubType> &subtypes, int parentId = 0);
/* Add given annotation to given page */
static void addAnnotationToPage(::Page *pdfPage, DocumentData *doc, const Annotation * ann);
diff --git a/qt4/src/poppler-annotation.cc b/qt4/src/poppler-annotation.cc
index 70a5ea2..8375287 100644
--- a/qt4/src/poppler-annotation.cc
+++ b/qt4/src/poppler-annotation.cc
@@ -366,7 +366,7 @@ AnnotPath * AnnotationPrivate::toAnnotPath(const QLinkedList<QPointF> &list) con
return new AnnotPath(ac, count);
}
-QList<Annotation*> AnnotationPrivate::findAnnotations(::Page *pdfPage, DocumentData *doc, int parentID)
+QList<Annotation*> AnnotationPrivate::findAnnotations(::Page *pdfPage, DocumentData *doc, const QSet<Annotation::SubType> &subtypes, int parentID)
{
Annots* annots = pdfPage->getAnnots();
const uint numAnnotations = annots->getNumAnnots();
@@ -375,6 +375,20 @@ QList<Annotation*> AnnotationPrivate::findAnnotations(::Page *pdfPage, DocumentD
return QList<Annotation*>();
}
+ const bool wantTextAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::AText);
+ const bool wantLineAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::ALine);
+ const bool wantGeomAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::AGeom);
+ const bool wantHighlightAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::AHighlight);
+ const bool wantStampAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::AStamp);
+ const bool wantInkAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::AInk);
+ const bool wantLinkAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::ALink);
+ const bool wantCaretAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::ACaret);
+ const bool wantFileAttachmentAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::AFileAttachment);
+ const bool wantSoundAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::ASound);
+ const bool wantMovieAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::AMovie);
+ const bool wantScreenAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::AScreen);
+ const bool wantWidgetAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::AWidget);
+
// Create Annotation objects and tie to their native Annot
QList<Annotation*> res;
for ( uint j = 0; j < numAnnotations; j++ )
@@ -405,36 +419,54 @@ QList<Annotation*> AnnotationPrivate::findAnnotations(::Page *pdfPage, DocumentD
switch ( subType )
{
case Annot::typeText:
+ if (!wantTextAnnotations)
+ continue;
annotation = new TextAnnotation(TextAnnotation::Linked);
break;
case Annot::typeFreeText:
+ if (!wantTextAnnotations)
+ continue;
annotation = new TextAnnotation(TextAnnotation::InPlace);
break;
case Annot::typeLine:
+ if (!wantLineAnnotations)
+ continue;
annotation = new LineAnnotation(LineAnnotation::StraightLine);
break;
case Annot::typePolygon:
case Annot::typePolyLine:
+ if (!wantLineAnnotations)
+ continue;
annotation = new LineAnnotation(LineAnnotation::Polyline);
break;
case Annot::typeSquare:
case Annot::typeCircle:
+ if (!wantGeomAnnotations)
+ continue;
annotation = new GeomAnnotation();
break;
case Annot::typeHighlight:
case Annot::typeUnderline:
case Annot::typeSquiggly:
case Annot::typeStrikeOut:
+ if (!wantHighlightAnnotations)
+ continue;
annotation = new HighlightAnnotation();
break;
case Annot::typeStamp:
+ if (!wantStampAnnotations)
+ continue;
annotation = new StampAnnotation();
break;
case Annot::typeInk:
+ if (!wantInkAnnotations)
+ continue;
annotation = new InkAnnotation();
break;
case Annot::typeLink: /* TODO: Move logic to getters */
{
+ if (!wantLinkAnnotations)
+ continue;
// parse Link params
AnnotLink * linkann = static_cast< AnnotLink * >( ann );
LinkAnnotation * l = new LinkAnnotation();
@@ -458,10 +490,14 @@ QList<Annotation*> AnnotationPrivate::findAnnotations(::Page *pdfPage, DocumentD
break;
}
case Annot::typeCaret:
+ if (!wantCaretAnnotations)
+ continue;
annotation = new CaretAnnotation();
break;
case Annot::typeFileAttachment: /* TODO: Move logic to getters */
{
+ if (!wantFileAttachmentAnnotations)
+ continue;
AnnotFileAttachment * attachann = static_cast< AnnotFileAttachment * >( ann );
FileAttachmentAnnotation * f = new FileAttachmentAnnotation();
annotation = f;
@@ -474,6 +510,8 @@ QList<Annotation*> AnnotationPrivate::findAnnotations(::Page *pdfPage, DocumentD
}
case Annot::typeSound: /* TODO: Move logic to getters */
{
+ if (!wantSoundAnnotations)
+ continue;
AnnotSound * soundann = static_cast< AnnotSound * >( ann );
SoundAnnotation * s = new SoundAnnotation();
annotation = s;
@@ -486,6 +524,8 @@ QList<Annotation*> AnnotationPrivate::findAnnotations(::Page *pdfPage, DocumentD
}
case Annot::typeMovie: /* TODO: Move logic to getters */
{
+ if (!wantMovieAnnotations)
+ continue;
AnnotMovie * movieann = static_cast< AnnotMovie * >( ann );
MovieAnnotation * m = new MovieAnnotation();
annotation = m;
@@ -501,6 +541,8 @@ QList<Annotation*> AnnotationPrivate::findAnnotations(::Page *pdfPage, DocumentD
}
case Annot::typeScreen:
{
+ if (!wantScreenAnnotations)
+ continue;
AnnotScreen * screenann = static_cast< AnnotScreen * >( ann );
if (!screenann->getAction())
continue;
@@ -522,6 +564,8 @@ QList<Annotation*> AnnotationPrivate::findAnnotations(::Page *pdfPage, DocumentD
case Annot::typeUnknown:
continue; // special case for ignoring unknown annotations
case Annot::typeWidget:
+ if (!wantWidgetAnnotations)
+ continue;
annotation = new WidgetAnnotation();
break;
default:
@@ -1607,7 +1651,7 @@ QList<Annotation*> Annotation::revisions() const
if ( !d->pdfAnnot->getHasRef() )
return QList<Annotation*>();
- return AnnotationPrivate::findAnnotations( d->pdfPage, d->parentDoc, d->pdfAnnot->getId() );
+ return AnnotationPrivate::findAnnotations( d->pdfPage, d->parentDoc, QSet<Annotation::SubType>(), d->pdfAnnot->getId() );
}
//END Annotation implementation
diff --git a/qt4/src/poppler-page.cc b/qt4/src/poppler-page.cc
index f7c2427..32f6d7e 100644
--- a/qt4/src/poppler-page.cc
+++ b/qt4/src/poppler-page.cc
@@ -671,7 +671,12 @@ QList<Link*> Page::links() const
QList<Annotation*> Page::annotations() const
{
- return AnnotationPrivate::findAnnotations(m_page->page, m_page->parentDoc);
+ return AnnotationPrivate::findAnnotations(m_page->page, m_page->parentDoc, QSet<Annotation::SubType>());
+}
+
+QList<Annotation*> Page::annotations(const QSet<Annotation::SubType> &subtypes) const
+{
+ return AnnotationPrivate::findAnnotations(m_page->page, m_page->parentDoc, subtypes);
}
void Page::addAnnotation( const Annotation *ann )
diff --git a/qt4/src/poppler-qt4.h b/qt4/src/poppler-qt4.h
index 30295cf..6c4a410 100644
--- a/qt4/src/poppler-qt4.h
+++ b/qt4/src/poppler-qt4.h
@@ -701,6 +701,20 @@ delete it;
QList<Annotation*> annotations() const;
/**
+ Returns the annotations of the page
+
+ \param subtypes the subtypes of annotations you are interested in
+
+ \note If you call this method twice, you get different objects
+ pointing to the same annotations (see Annotation).
+ The caller owns the returned objects and they should be deleted
+ when no longer required.
+
+ \since 0.28
+ */
+ QList<Annotation*> annotations(const QSet<Annotation::SubType> &subtypes) const;
+
+ /**
Adds an annotation to the page
\note Ownership of the annotation object stays with the caller, who can
diff --git a/qt5/src/poppler-annotation-private.h b/qt5/src/poppler-annotation-private.h
index c755eb3..4c263eb 100644
--- a/qt5/src/poppler-annotation-private.h
+++ b/qt5/src/poppler-annotation-private.h
@@ -93,8 +93,8 @@ class AnnotationPrivate : public QSharedData
PDFRectangle boundaryToPdfRectangle(const QRectF &r, int flags) const;
AnnotPath * toAnnotPath(const QLinkedList<QPointF> &l) const;
- /* Scan page for annotations, parentId=0 searches for root annotations */
- static QList<Annotation*> findAnnotations(::Page *pdfPage, DocumentData *doc, int parentId = 0);
+ /* Scan page for annotations, parentId=0 searches for root annotations, subtypes empty means all subtypes */
+ static QList<Annotation*> findAnnotations(::Page *pdfPage, DocumentData *doc, const QSet<Annotation::SubType> &subtypes, int parentId = 0);
/* Add given annotation to given page */
static void addAnnotationToPage(::Page *pdfPage, DocumentData *doc, const Annotation * ann);
diff --git a/qt5/src/poppler-annotation.cc b/qt5/src/poppler-annotation.cc
index e6d331d..3654cb3 100644
--- a/qt5/src/poppler-annotation.cc
+++ b/qt5/src/poppler-annotation.cc
@@ -366,7 +366,7 @@ AnnotPath * AnnotationPrivate::toAnnotPath(const QLinkedList<QPointF> &list) con
return new AnnotPath(ac, count);
}
-QList<Annotation*> AnnotationPrivate::findAnnotations(::Page *pdfPage, DocumentData *doc, int parentID)
+QList<Annotation*> AnnotationPrivate::findAnnotations(::Page *pdfPage, DocumentData *doc, const QSet<Annotation::SubType> &subtypes, int parentID)
{
Annots* annots = pdfPage->getAnnots();
const uint numAnnotations = annots->getNumAnnots();
@@ -375,6 +375,20 @@ QList<Annotation*> AnnotationPrivate::findAnnotations(::Page *pdfPage, DocumentD
return QList<Annotation*>();
}
+ const bool wantTextAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::AText);
+ const bool wantLineAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::ALine);
+ const bool wantGeomAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::AGeom);
+ const bool wantHighlightAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::AHighlight);
+ const bool wantStampAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::AStamp);
+ const bool wantInkAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::AInk);
+ const bool wantLinkAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::ALink);
+ const bool wantCaretAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::ACaret);
+ const bool wantFileAttachmentAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::AFileAttachment);
+ const bool wantSoundAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::ASound);
+ const bool wantMovieAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::AMovie);
+ const bool wantScreenAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::AScreen);
+ const bool wantWidgetAnnotations = subtypes.isEmpty() || subtypes.contains(Annotation::AWidget);
+
// Create Annotation objects and tie to their native Annot
QList<Annotation*> res;
for ( uint j = 0; j < numAnnotations; j++ )
@@ -405,36 +419,54 @@ QList<Annotation*> AnnotationPrivate::findAnnotations(::Page *pdfPage, DocumentD
switch ( subType )
{
case Annot::typeText:
+ if (!wantTextAnnotations)
+ continue;
annotation = new TextAnnotation(TextAnnotation::Linked);
break;
case Annot::typeFreeText:
+ if (!wantTextAnnotations)
+ continue;
annotation = new TextAnnotation(TextAnnotation::InPlace);
break;
case Annot::typeLine:
+ if (!wantLineAnnotations)
+ continue;
annotation = new LineAnnotation(LineAnnotation::StraightLine);
break;
case Annot::typePolygon:
case Annot::typePolyLine:
+ if (!wantLineAnnotations)
+ continue;
annotation = new LineAnnotation(LineAnnotation::Polyline);
break;
case Annot::typeSquare:
case Annot::typeCircle:
+ if (!wantGeomAnnotations)
+ continue;
annotation = new GeomAnnotation();
break;
case Annot::typeHighlight:
case Annot::typeUnderline:
case Annot::typeSquiggly:
case Annot::typeStrikeOut:
+ if (!wantHighlightAnnotations)
+ continue;
annotation = new HighlightAnnotation();
break;
case Annot::typeStamp:
+ if (!wantStampAnnotations)
+ continue;
annotation = new StampAnnotation();
break;
case Annot::typeInk:
+ if (!wantInkAnnotations)
+ continue;
annotation = new InkAnnotation();
break;
case Annot::typeLink: /* TODO: Move logic to getters */
{
+ if (!wantLinkAnnotations)
+ continue;
// parse Link params
AnnotLink * linkann = static_cast< AnnotLink * >( ann );
LinkAnnotation * l = new LinkAnnotation();
@@ -458,10 +490,14 @@ QList<Annotation*> AnnotationPrivate::findAnnotations(::Page *pdfPage, DocumentD
break;
}
case Annot::typeCaret:
+ if (!wantCaretAnnotations)
+ continue;
annotation = new CaretAnnotation();
break;
case Annot::typeFileAttachment: /* TODO: Move logic to getters */
{
+ if (!wantFileAttachmentAnnotations)
+ continue;
AnnotFileAttachment * attachann = static_cast< AnnotFileAttachment * >( ann );
FileAttachmentAnnotation * f = new FileAttachmentAnnotation();
annotation = f;
@@ -474,6 +510,8 @@ QList<Annotation*> AnnotationPrivate::findAnnotations(::Page *pdfPage, DocumentD
}
case Annot::typeSound: /* TODO: Move logic to getters */
{
+ if (!wantSoundAnnotations)
+ continue;
AnnotSound * soundann = static_cast< AnnotSound * >( ann );
SoundAnnotation * s = new SoundAnnotation();
annotation = s;
@@ -486,6 +524,8 @@ QList<Annotation*> AnnotationPrivate::findAnnotations(::Page *pdfPage, DocumentD
}
case Annot::typeMovie: /* TODO: Move logic to getters */
{
+ if (!wantMovieAnnotations)
+ continue;
AnnotMovie * movieann = static_cast< AnnotMovie * >( ann );
MovieAnnotation * m = new MovieAnnotation();
annotation = m;
@@ -501,6 +541,8 @@ QList<Annotation*> AnnotationPrivate::findAnnotations(::Page *pdfPage, DocumentD
}
case Annot::typeScreen:
{
+ if (!wantScreenAnnotations)
+ continue;
AnnotScreen * screenann = static_cast< AnnotScreen * >( ann );
if (!screenann->getAction())
continue;
@@ -522,6 +564,8 @@ QList<Annotation*> AnnotationPrivate::findAnnotations(::Page *pdfPage, DocumentD
case Annot::typeUnknown:
continue; // special case for ignoring unknown annotations
case Annot::typeWidget:
+ if (!wantWidgetAnnotations)
+ continue;
annotation = new WidgetAnnotation();
break;
default:
@@ -1604,7 +1648,7 @@ QList<Annotation*> Annotation::revisions() const
if ( !d->pdfAnnot->getHasRef() )
return QList<Annotation*>();
- return AnnotationPrivate::findAnnotations( d->pdfPage, d->parentDoc, d->pdfAnnot->getId() );
+ return AnnotationPrivate::findAnnotations( d->pdfPage, d->parentDoc, QSet<Annotation::SubType>(), d->pdfAnnot->getId() );
}
//END Annotation implementation
diff --git a/qt5/src/poppler-page.cc b/qt5/src/poppler-page.cc
index df2ef69..2977214 100644
--- a/qt5/src/poppler-page.cc
+++ b/qt5/src/poppler-page.cc
@@ -653,7 +653,12 @@ QList<Link*> Page::links() const
QList<Annotation*> Page::annotations() const
{
- return AnnotationPrivate::findAnnotations(m_page->page, m_page->parentDoc);
+ return AnnotationPrivate::findAnnotations(m_page->page, m_page->parentDoc, QSet<Annotation::SubType>());
+}
+
+QList<Annotation*> Page::annotations(const QSet<Annotation::SubType> &subtypes) const
+{
+ return AnnotationPrivate::findAnnotations(m_page->page, m_page->parentDoc, subtypes);
}
void Page::addAnnotation( const Annotation *ann )
diff --git a/qt5/src/poppler-qt5.h b/qt5/src/poppler-qt5.h
index 6f36088..d8f13ea 100644
--- a/qt5/src/poppler-qt5.h
+++ b/qt5/src/poppler-qt5.h
@@ -689,6 +689,21 @@ delete it;
*/
QList<Annotation*> annotations() const;
+
+ /**
+ Returns the annotations of the page
+
+ \param subtypes the subtypes of annotations you are interested in
+
+ \note If you call this method twice, you get different objects
+ pointing to the same annotations (see Annotation).
+ The caller owns the returned objects and they should be deleted
+ when no longer required.
+
+ \since 0.28
+ */
+ QList<Annotation*> annotations(const QSet<Annotation::SubType> &subtypes) const;
+
/**
Adds an annotation to the page
More information about the poppler
mailing list