[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    playground/graphics/okular/generators/dvi
From:       Pino Toscano <toscano.pino () tiscali ! it>
Date:       2006-06-30 22:35:50
Message-ID: 1151706950.452935.11511.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 556622 by pino:

Extract the table of contents from DVI documents.


 M  +82 -22    generator_dvi.cpp  
 M  +11 -2     generator_dvi.h  


--- trunk/playground/graphics/okular/generators/dvi/generator_dvi.cpp #556621:556622
@@ -19,6 +19,7 @@
 #include <QX11Info>
 #include <qstring.h>
 #include <qurl.h>
+#include <qstack.h>
 
 #include <kdebug.h>
 #include <kimageeffect.h>
@@ -27,7 +28,7 @@
 OKULAR_EXPORT_PLUGIN(DviGenerator)
 
 DviGenerator::DviGenerator( KPDFDocument * doc ) : Generator ( doc ),
-  m_docInfo( 0 ), m_dviRenderer( 0 )
+  m_docInfo( 0 ), m_docSynopsis( 0 ), ready( false ), m_dviRenderer( 0 )
 {
 }
 
@@ -38,6 +39,8 @@
 
     delete m_docInfo;
     m_docInfo = 0;
+    delete m_docSynopsis;
+    m_docSynopsis = 0;
 
     delete m_dviRenderer;
 
@@ -125,7 +128,33 @@
     return tr;
 }
 
+void DviGenerator::fillViewportFromAnchor( DocumentViewport &vp,
+                                           const Anchor &anch, int pW, int pH, 
+                                           int orientation ) 
+{
+    vp.pageNumber = anch.page - 1;
 
+    double vp_x = 0.0, vp_y = 0.0;
+
+    SimplePageSize ps = m_dviRenderer->sizeOfPage( vp.pageNumber );
+    double resolution = 0;
+
+    if ( orientation % 2 == 0 )
+        resolution = (double)(pW)/ps.width().getLength_in_inch();
+    else
+        resolution = (double)(pH)/ps.height().getLength_in_inch();
+
+    double py = (double)anch.distance_from_top.getLength_in_inch()*resolution + 0.5; 
+ 
+    rotateCoordinates( 0.5, py / (double)pH,
+                       vp_x, vp_y, orientation );
+    vp.rePos.normalizedX = vp_x;
+    vp.rePos.normalizedY = vp_y;
+    vp.rePos.enabled = true;
+    vp.rePos.pos = DocumentViewport::TopLeft;
+
+}
+
 QLinkedList<ObjectRect*> DviGenerator::generateDviLinks( const dviPageInfo *pageInfo,   
                                                          int orientation )
 {
@@ -145,31 +174,17 @@
                nr = (double)boxArea.right() / pageWidth,
                nb = (double)boxArea.bottom() / pageHeight;
 
-        /* distinguish between local (-> anchor) and remote links */
-
         Anchor anch = m_dviRenderer->findAnchor(dviLink.linkText);
 
-	KPDFLink *okuLink = 0;
+        KPDFLink *okuLink = 0;
 
-	if (anch.isValid())
+        /* distinguish between local (-> anchor) and remote links */
+        if (anch.isValid())
         {
-            /* TODO: internal link */
+            /* internal link */
             DocumentViewport vp;
-            vp.pageNumber = anch.page - 1;
-
-            double vp_x = 0.0, vp_y = 0.0;
-
-	    SimplePageSize ps = m_dviRenderer->sizeOfPage( vp.pageNumber );
-            double resolution = (double)(pageInfo->width)/ps.width().getLength_in_inch();
-            double py = (double)anch.distance_from_top.getLength_in_inch()*resolution + 0.5; 
-	    
-            rotateCoordinates( 0.5, py / (double)pageHeight,
-                               vp_x, vp_y, orientation );
-            vp.rePos.normalizedX = vp_x;
-            vp.rePos.normalizedY = vp_y;
-            vp.rePos.enabled = true;
-            vp.rePos.pos = DocumentViewport::Center;
-
+            fillViewportFromAnchor( vp, anch, pageWidth, pageHeight,
+                                    orientation );
             okuLink = new KPDFLinkGoto( "", vp );
         }
         else
@@ -295,7 +310,7 @@
     for ( ; it != itEnd ; ++it )
     {
         TextBox curTB = *it;
-        //tmpRect = curTB.box;
+ 
         tmpRect = rotateQRect( curTB.box, pageWidth, pageHeight, orientation );
 
 #if 0
@@ -337,6 +352,51 @@
     return m_docInfo;
 }
 
+const DocumentSynopsis *DviGenerator::generateDocumentSynopsis()
+{
+    if ( m_docSynopsis )
+        return m_docSynopsis;
+
+    m_docSynopsis = new DocumentSynopsis();
+ 
+    QStack<QDomElement*> stack;
+
+    Q3ValueVector<PreBookmark> prebookmarks = m_dviRenderer->getPrebookmarks();
+
+    if ( prebookmarks.isEmpty() ) 
+        return m_docSynopsis;
+
+    Q3ValueVector<PreBookmark>::ConstIterator it = prebookmarks.begin();
+    Q3ValueVector<PreBookmark>::ConstIterator itEnd = prebookmarks.end();
+    for( ; it != itEnd; ++it ) 
+    {
+        QDomElement *domel = new QDomElement; 
+        *domel= m_docSynopsis->createElement( (*it).title );
+
+        Anchor a = m_dviRenderer->findAnchor((*it).anchorName);
+        if ( a.isValid() )
+        {
+            DocumentViewport vp;
+ 
+            const KPDFPage *p = m_document->page( a.page - 1 );
+            /* Don't care about rotations... */
+            fillViewportFromAnchor( vp, a, (int)p->width(), (int)p->height(), 0 );
+            domel->setAttribute( "Viewport", vp.toString() );
+        }
+        if ( stack.isEmpty() )
+            m_docSynopsis->appendChild( *domel );
+        else 
+        {
+            stack.top()->appendChild( *domel );
+            stack.pop();
+        }
+        for ( int i = 0; i < (*it).noOfChildren; ++i )
+            stack.push( domel );
+    }
+
+    return m_docSynopsis;
+}
+
 void DviGenerator::setOrientation(QVector<KPDFPage*> & pagesVector, int orientation)
 {
     loadPages( pagesVector, orientation );
--- trunk/playground/graphics/okular/generators/dvi/generator_dvi.h #556621:556622
@@ -14,6 +14,8 @@
 
 class dviRenderer;
 class dviPageInfo;
+class DocumentViewport;
+class Anchor;
 
 class DviGenerator : public Generator
 {
@@ -29,8 +31,11 @@
         void generateSyncTextPage( KPDFPage * page );
 
         // document information
-        const DocumentInfo * generateDocumentInfo();
+        const DocumentInfo *generateDocumentInfo();
 
+        // table of contents
+        const DocumentSynopsis *generateDocumentSynopsis();
+
         // rotation
         bool supportsRotation() { return true; };
         void setOrientation(QVector<KPDFPage*> & pagesVector, int orientation);
@@ -42,11 +47,15 @@
         double m_resolution;
 
         DocumentInfo *m_docInfo;
+        DocumentSynopsis *m_docSynopsis;
+
+        bool ready;
         dviRenderer *m_dviRenderer;
-        bool ready;
 
         void loadPages( QVector< KPDFPage * > & pagesVector, int orientation );
         KPDFTextPage *extractTextFromPage( dviPageInfo *pageInfo, int orientation );
+        void fillViewportFromAnchor( DocumentViewport &vp, const Anchor &anch, 
+                                     int pW, int pH, int orientation ); 
         QLinkedList<ObjectRect*> generateDviLinks( const dviPageInfo *pageInfo, 
                                                    int orientation );
 };
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic