[poppler] qt4/src qt5/src
Albert Astals Cid
aacid at kde.org
Sun May 11 09:51:29 PDT 2014
FWIW this was reviewed by Fabio D'Urso that is sitting next to me as I write
this.
Cheers,
Albert
El Diumenge, 11 de maig de 2014, a les 09:32:01, Albert Astals Cid va
escriure:
> 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
>
> _______________________________________________
> poppler mailing list
> poppler at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/poppler
More information about the poppler
mailing list