poppler/Link.cc               |   34 ++++++++++++++++++-----
 poppler/Link.h                |   17 +++++++++--
 qt4/src/poppler-annotation.cc |    2 -
 qt4/src/poppler-annotation.h  |    1 
 qt4/src/poppler-link.cc       |   60 +++++++++++++++++++++++++++++++++++++++---
 qt4/src/poppler-link.h        |   57 +++++++++++++++++++++++++++++++++++++--
 qt4/src/poppler-page.cc       |    8 ++++-
 7 files changed, 158 insertions(+), 21 deletions(-)

New commits:
commit b112602334a5de84ae30c2e90d9bc6d4609f7f96
Author: Tobias Koening <[email protected]>
Date:   Mon Oct 8 22:32:34 2012 +0200

    [qt4] make LinkRendition properties available
    
    Bug #55378

diff --git a/poppler/Link.cc b/poppler/Link.cc
index b90b1c1..b5b2bd3 100644
--- a/poppler/Link.cc
+++ b/poppler/Link.cc
@@ -19,6 +19,7 @@
 // Copyright (C) 2008-2010, 2012 Albert Astals Cid <[email protected]>
 // Copyright (C) 2009 Kovid Goyal <[email protected]>
 // Copyright (C) 2009 Ilya Gorenbein <[email protected]>
+// Copyright (C) 2012 Tobias Koening <[email protected]>
 //
 // To see a description of the changes please see the Changelog file that
 // came with your tarball or type make ChangeLog if you are building from git
@@ -700,9 +701,10 @@ LinkSound::~LinkSound() {
 //------------------------------------------------------------------------
 
 LinkRendition::LinkRendition(Object *obj) {
-  operation = -1;
+  operation = NoRendition;
   media = NULL;
   js = NULL;
+  int operationCode = -1;
 
   if (obj->isDict()) {
     Object tmp;
@@ -721,25 +723,43 @@ LinkRendition::LinkRendition(Object *obj) {
     tmp.free();
 
     if (obj->dictLookup("OP", &tmp)->isInt()) {
-      operation = tmp.getInt();
-      if (!js && (operation < 0 || operation > 4)) {
-        error(errSyntaxWarning, -1, "Invalid Rendition Action: unrecognized 
operation valued: {0:d}", operation);
+      operationCode = tmp.getInt();
+      if (!js && (operationCode < 0 || operationCode > 4)) {
+        error(errSyntaxWarning, -1, "Invalid Rendition Action: unrecognized 
operation valued: {0:d}", operationCode);
       } else {
         Object obj1;
 
         // retrieve rendition object
         if (obj->dictLookup("R", &renditionObj)->isDict()) {
           media = new MediaRendition(&renditionObj);
-       } else if (operation == 0 || operation == 4) {
-          error(errSyntaxWarning, -1, "Invalid Rendition Action: no R field 
with op = {0:d}", operation);
+       } else if (operationCode == 0 || operationCode == 4) {
+          error(errSyntaxWarning, -1, "Invalid Rendition Action: no R field 
with op = {0:d}", operationCode);
          renditionObj.free();
        }
 
        if (!obj->dictLookupNF("AN", &screenRef)->isRef() && operation >= 0 && 
operation <= 4) {
-         error(errSyntaxWarning, -1, "Invalid Rendition Action: no AN field 
with op = {0:d}", operation);
+         error(errSyntaxWarning, -1, "Invalid Rendition Action: no AN field 
with op = {0:d}", operationCode);
          screenRef.free();
        }
       }
+
+      switch (operationCode) {
+        case 0:
+          operation = PlayRendition;
+          break;
+        case 1:
+          operation = StopRendition;
+          break;
+        case 2:
+          operation = PauseRendition;
+          break;
+        case 3:
+          operation = ResumeRendition;
+          break;
+        case 4:
+          operation = PlayRendition;
+          break;
+      }
     } else if (!js) {
       error(errSyntaxWarning, -1, "Invalid Rendition action: no OP or JS field 
defined");
     }
diff --git a/poppler/Link.h b/poppler/Link.h
index 8e2df24..fc2abe6 100644
--- a/poppler/Link.h
+++ b/poppler/Link.h
@@ -16,6 +16,7 @@
 // Copyright (C) 2006, 2008 Pino Toscano <[email protected]>
 // Copyright (C) 2008 Hugo Mercier <[email protected]>
 // Copyright (C) 2010, 2011 Carlos Garcia Campos <[email protected]>
+// Copyright (C) 2012 Tobias Koening <[email protected]>
 //
 // To see a description of the changes please see the Changelog file that
 // came with your tarball or type make ChangeLog if you are building from git
@@ -51,7 +52,7 @@ enum LinkActionKind {
   actionURI,                   // URI
   actionNamed,                 // named action
   actionMovie,                 // movie action
-  actionRendition,
+  actionRendition,             // rendition action
   actionSound,                 // sound action
   actionJavaScript,            // JavaScript action
   actionOCGState,               // Set-OCG-State action
@@ -319,6 +320,16 @@ private:
 
 class LinkRendition: public LinkAction {
 public:
+  /**
+   * Describes the possible rendition operations.
+   */
+  enum RenditionOperation {
+    NoRendition,
+    PlayRendition,
+    StopRendition,
+    PauseRendition,
+    ResumeRendition
+  };
 
   LinkRendition(Object *Obj);
 
@@ -334,7 +345,7 @@ public:
   GBool hasScreenAnnot() { return screenRef.isRef(); }
   Ref getScreenAnnot() { return screenRef.getRef(); }
 
-  int getOperation() { return operation; }
+  RenditionOperation getOperation() { return operation; }
 
   MediaRendition* getMedia() { return media; }
 
@@ -344,7 +355,7 @@ private:
 
   Object screenRef;
   Object renditionObj;
-  int operation;
+  RenditionOperation operation;
 
   MediaRendition* media;
 
diff --git a/qt4/src/poppler-annotation.cc b/qt4/src/poppler-annotation.cc
index 825bbf6..5ecea80 100644
--- a/qt4/src/poppler-annotation.cc
+++ b/qt4/src/poppler-annotation.cc
@@ -527,8 +527,6 @@ Link* AnnotationPrivate::additionalAction( 
Annotation::AdditionalActionType type
     if ( linkAction )
         link = PageData::convertLinkActionToLink( linkAction, parentDoc, 
QRectF() );
 
-    delete linkAction;
-
     return link;
 }
 
diff --git a/qt4/src/poppler-annotation.h b/qt4/src/poppler-annotation.h
index 5adc9a8..9208ca7 100644
--- a/qt4/src/poppler-annotation.h
+++ b/qt4/src/poppler-annotation.h
@@ -107,6 +107,7 @@ class POPPLER_QT4_EXPORT Annotation
 {
   friend class AnnotationUtils;
   friend class LinkMovie;
+  friend class LinkRendition;
 
   public:
     // enum definitions
diff --git a/qt4/src/poppler-link.cc b/qt4/src/poppler-link.cc
index a4bc55b..199e2db 100644
--- a/qt4/src/poppler-link.cc
+++ b/qt4/src/poppler-link.cc
@@ -168,16 +168,40 @@ class LinkSoundPrivate : public LinkPrivate
 class LinkRenditionPrivate : public LinkPrivate
 {
        public:
-               LinkRenditionPrivate( const QRectF &area, ::MediaRendition 
*rendition );
+               LinkRenditionPrivate( const QRectF &area, ::MediaRendition 
*rendition, ::LinkRendition::RenditionOperation operation, const QString 
&script, const Ref &annotationReference );
                ~LinkRenditionPrivate();
 
                MediaRendition *rendition;
+               LinkRendition::RenditionAction action;
+               QString script;
+               Ref annotationReference;
 };
 
-       LinkRenditionPrivate::LinkRenditionPrivate( const QRectF &area, 
::MediaRendition *r )
+       LinkRenditionPrivate::LinkRenditionPrivate( const QRectF &area, 
::MediaRendition *r, ::LinkRendition::RenditionOperation operation, const 
QString &javaScript, const Ref &ref )
                : LinkPrivate( area )
-               , rendition( new MediaRendition( r ) )
+               , rendition( r ? new MediaRendition( r ) : 0 )
+               , action( LinkRendition::PlayRendition )
+               , script( javaScript )
+               , annotationReference( ref )
        {
+               switch ( operation )
+               {
+                       case ::LinkRendition::NoRendition:
+                               action = LinkRendition::NoRendition;
+                               break;
+                       case ::LinkRendition::PlayRendition:
+                               action = LinkRendition::PlayRendition;
+                               break;
+                       case ::LinkRendition::StopRendition:
+                               action = LinkRendition::StopRendition;
+                               break;
+                       case ::LinkRendition::PauseRendition:
+                               action = LinkRendition::PauseRendition;
+                               break;
+                       case ::LinkRendition::ResumeRendition:
+                               action = LinkRendition::ResumeRendition;
+                               break;
+               }
        }
 
        LinkRenditionPrivate::~LinkRenditionPrivate()
@@ -579,10 +603,15 @@ class LinkMoviePrivate : public LinkPrivate
 
        // LinkRendition
        LinkRendition::LinkRendition( const QRectF &linkArea, ::MediaRendition 
*rendition )
-               : Link( *new LinkRenditionPrivate( linkArea, rendition ) )
+               : Link( *new LinkRenditionPrivate( linkArea, rendition, 
::LinkRendition::NoRendition, QString(), Ref() ) )
        {
        }
        
+       LinkRendition::LinkRendition( const QRectF &linkArea, ::MediaRendition 
*rendition, int operation, const QString &script, const Ref 
&annotationReference )
+               : Link( *new LinkRenditionPrivate( linkArea, rendition, 
static_cast<enum ::LinkRendition::RenditionOperation>(operation), script, 
annotationReference ) )
+       {
+       }
+
        LinkRendition::~LinkRendition()
        {
        }
@@ -598,6 +627,29 @@ class LinkMoviePrivate : public LinkPrivate
                return d->rendition;
        }
 
+       LinkRendition::RenditionAction LinkRendition::action() const
+       {
+               Q_D( const LinkRendition );
+               return d->action;
+       }
+
+       QString LinkRendition::script() const
+       {
+               Q_D( const LinkRendition );
+               return d->script;
+       }
+
+       bool LinkRendition::isReferencedAnnotation( const ScreenAnnotation 
*annotation ) const
+       {
+               Q_D( const LinkRendition );
+               if ( d->annotationReference.num != -1 && d->annotationReference 
== annotation->d_ptr->pdfObjectReference() )
+               {
+                       return true;
+               }
+
+               return false;
+       }
+
        // LinkJavaScript
        LinkJavaScript::LinkJavaScript( const QRectF &linkArea, const QString 
&js )
                : Link( *new LinkJavaScriptPrivate( linkArea ) )
diff --git a/qt4/src/poppler-link.h b/qt4/src/poppler-link.h
index a2ef2d3..ef93bf0 100644
--- a/qt4/src/poppler-link.h
+++ b/qt4/src/poppler-link.h
@@ -455,12 +455,40 @@ class POPPLER_QT4_EXPORT LinkRendition : public Link
 {
        public:
                /**
-                * Create a new media rendition link.
+                * Describes the possible rendition actions.
+                *
+                * \since 0.22
+                */
+               enum RenditionAction {
+                       NoRendition,
+                       PlayRendition,
+                       StopRendition,
+                       PauseRendition,
+                       ResumeRendition
+               };
+
+               /**
+                * Create a new rendition link.
+                *
+                * \param linkArea the active area of the link
+                * \param rendition the media rendition object
+                *
+                * \deprecated Use the constructor that takes all parameter 
instead
+                */
+               Q_DECL_DEPRECATED LinkRendition( const QRectF &linkArea, 
::MediaRendition *rendition );
+
+               /**
+                * Create a new rendition link.
                 *
                 * \param linkArea the active area of the link
-                * \param rendition 
+                * \param rendition the media rendition object
+                * \param operation the numeric operation (action) (@see 
::LinkRendition::RenditionOperation)
+                * \param script the java script code
+                * \param annotationReference the object reference of the 
screen annotation associated with this rendition action
+                * \since 0.22
                 */
-               LinkRendition( const QRectF &linkArea, ::MediaRendition 
*rendition );
+               LinkRendition( const QRectF &linkArea, ::MediaRendition 
*rendition, int operation, const QString &script, const Ref 
&annotationReference );
+
                /**
                 * Destructor.
                 */
@@ -469,10 +497,31 @@ class POPPLER_QT4_EXPORT LinkRendition : public Link
                LinkType linkType() const;
 
                /**
-                * 
+                * Returns the media rendition object if the redition provides 
one, @c 0 otherwise
                 */
                MediaRendition *rendition() const;
 
+               /**
+                * Returns the action that should be executed if a rendition 
object is provided.
+                *
+                * \since 0.22
+                */
+               RenditionAction action() const;
+
+               /**
+                * The JS code that shall be executed or an empty string.
+                *
+                * \since 0.22
+                */
+               QString script() const;
+
+               /**
+                * Returns whether the given @p annotation is the referenced 
screen annotation for this rendition @p link.
+                *
+                * \since 0.22
+                */
+               bool isReferencedAnnotation( const ScreenAnnotation *annotation 
) const;
+
        private:
                Q_DECLARE_PRIVATE( LinkRendition )
                Q_DISABLE_COPY( LinkRendition )
diff --git a/qt4/src/poppler-page.cc b/qt4/src/poppler-page.cc
index 349a1bb..03aa1bb 100644
--- a/qt4/src/poppler-page.cc
+++ b/qt4/src/poppler-page.cc
@@ -197,7 +197,13 @@ Link* PageData::convertLinkActionToLink(::LinkAction * a, 
DocumentData *parentDo
     case actionRendition:
     {
       ::LinkRendition *lrn = (::LinkRendition *)a;
-      popplerLink = new LinkRendition( linkArea, lrn->getMedia() );
+
+      Ref reference;
+      reference.num = reference.gen = -1;
+      if ( lrn->hasScreenAnnot() )
+        reference = lrn->getScreenAnnot();
+
+      popplerLink = new LinkRendition( linkArea, lrn->getMedia(), 
lrn->getOperation(), UnicodeParsedString( lrn->getScript() ), reference );
     }
     break;
 
_______________________________________________
poppler mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/poppler

Reply via email to