Update of /cvs/poppler/poppler/qt4/src
In directory kemper:/tmp/cvs-serv30833/qt4/src

Modified Files:
        poppler-document.cc poppler-link.cc poppler-page.cc 
        poppler-private.h poppler-qt4.h 
Log Message:
2006-11-15  Albert Astals Cid <[EMAIL PROTECTED]>

        * qt4/src/poppler-link.cc:
        * qt4/src/poppler-page.cc:
        * qt4/src/poppler-qt4.h:
        * qt4/src/poppler-document.cc:
        * qt4/src/poppler-private.h: Generalize the way we render the pages:
        merge all the Page::renderTo* functions in only one that renders on
        a QImage, taking into account the currently chosen backend.
        It is possible to switch rendering backend using the Document.
        Patch by Pino Toscano.

        * qt4/tests/stress-poppler-qt4.cpp:
        * qt4/tests/test-password-qt4.cpp:
        * qt4/tests/test-poppler-qt4.cpp: Adapt the tests to the changes in
        the rendering API of Page. Patch by Pino Toscano.



Index: poppler-document.cc
===================================================================
RCS file: /cvs/poppler/poppler/qt4/src/poppler-document.cc,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -d -r1.23 -r1.24
--- poppler-document.cc 18 Oct 2006 18:43:59 -0000      1.23
+++ poppler-document.cc 15 Nov 2006 21:07:50 -0000      1.24
@@ -417,6 +417,20 @@
        return m_doc->paperColor;
     }
 
+    void Document::setRenderBackend( Document::RenderBackend backend )
+    {
+        // no need to delete the outputdev as for the moment we always create 
a splash one
+        // as the arthur one does not allow "precaching" due to it's signature
+        // delete m_doc->m_outputDev;
+        // m_doc->m_outputDev = NULL;
+        m_doc->m_backend = backend;
+    }
+
+    Document::RenderBackend Document::renderBackend() const
+    {
+        return m_doc->m_backend;
+    }
+
     QDateTime convertDate( char *dateString )
     {
         int year;

Index: poppler-link.cc
===================================================================
RCS file: /cvs/poppler/poppler/qt4/src/poppler-link.cc,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- poppler-link.cc     8 Oct 2006 20:38:47 -0000       1.5
+++ poppler-link.cc     15 Nov 2006 21:07:50 -0000      1.6
@@ -64,7 +64,7 @@
                
                int leftAux, topAux, rightAux, bottomAux;
                
-               SplashOutputDev *sod = data.doc->getSplashOutputDev();
+               OutputDev *sod = data.doc->getOutputDev();
                sod->cvtUserToDev( left, top, &leftAux, &topAux );
                sod->cvtUserToDev( right, bottom, &rightAux, &bottomAux );
                

Index: poppler-page.cc
===================================================================
RCS file: /cvs/poppler/poppler/qt4/src/poppler-page.cc,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -d -r1.27 -r1.28
--- poppler-page.cc     8 Oct 2006 20:38:47 -0000       1.27
+++ poppler-page.cc     15 Nov 2006 21:07:50 -0000      1.28
@@ -21,7 +21,7 @@
 #include <QtCore/QFile>
 #include <QtCore/QMap>
 #include <QtGui/QImage>
-#include <QtGui/QPixmap>
+#include <QtGui/QPainter>
 #include <GlobalParams.h>
 #include <PDFDoc.h>
 #include <Catalog.h>
@@ -161,75 +161,81 @@
   delete m_page;
 }
 
-QImage Page::splashRenderToImage(double xres, double yres, int x, int y, int 
w, int h, bool doLinks, Rotation rotate) const
+QImage Page::renderToImage(double xres, double yres, int x, int y, int w, int 
h, bool doLinks, Rotation rotate) const
 {
-  SplashOutputDev *output_dev = m_page->parentDoc->m_doc->getSplashOutputDev();
-  
   int rotation = (int)rotate * 90;
-  
-  m_page->parentDoc->m_doc->doc.displayPageSlice(output_dev, m_page->index + 
1, xres, yres,
-                                                rotation, false, true, 
doLinks, x, y, w, h);
-  
-  SplashBitmap *bitmap = output_dev->getBitmap ();
-  int bw = bitmap->getWidth();
-  int bh = bitmap->getHeight();
-  
-  SplashColorPtr dataPtr = output_dev->getBitmap()->getDataPtr();
-  
-  if (QSysInfo::BigEndian == QSysInfo::ByteOrder)
+  QImage img;
+  switch(m_page->parentDoc->m_doc->m_backend)
   {
-    uchar c;
-    int count = bw * bh * 4;
-    for (int k = 0; k < count; k += 4)
+    case Poppler::Document::SplashBackend:
     {
-      c = dataPtr[k];
-      dataPtr[k] = dataPtr[k+3];
-      dataPtr[k+3] = c;
+      SplashOutputDev *splash_output = static_cast<SplashOutputDev 
*>(m_page->parentDoc->m_doc->getOutputDev());
 
-      c = dataPtr[k+1];
-      dataPtr[k+1] = dataPtr[k+2];
-      dataPtr[k+2] = c;
-    }
-  }
-  
-  // construct a qimage SHARING the raw bitmap data in memory
-  QImage img( dataPtr, bw, bh, QImage::Format_ARGB32 );
-  img = img.copy();
-  // unload underlying xpdf bitmap
-  output_dev->startPage( 0, NULL );
+      m_page->parentDoc->m_doc->doc.displayPageSlice(splash_output, 
m_page->index + 1, xres, yres,
+                                                rotation, false, true, 
doLinks, x, y, w, h);
 
-  return img;
-}
+      SplashBitmap *bitmap = splash_output->getBitmap();
+      int bw = bitmap->getWidth();
+      int bh = bitmap->getHeight();
 
-QPixmap *Page::splashRenderToPixmap(double xres, double yres, int x, int y, 
int w, int h, bool doLinks, Rotation rotate) const
-{
-  QImage img = splashRenderToImage(xres, yres, x, y, w, h, doLinks, rotate);
+      SplashColorPtr dataPtr = splash_output->getBitmap()->getDataPtr();
 
-  // Turn the QImage into a QPixmap
-  QPixmap* out = new QPixmap(QPixmap::fromImage(img));
+      if (QSysInfo::BigEndian == QSysInfo::ByteOrder)
+      {
+        uchar c;
+        int count = bw * bh * 4;
+        for (int k = 0; k < count; k += 4)
+        {
+          c = dataPtr[k];
+          dataPtr[k] = dataPtr[k+3];
+          dataPtr[k+3] = c;
 
-  return out;
-}
+          c = dataPtr[k+1];
+          dataPtr[k+1] = dataPtr[k+2];
+          dataPtr[k+2] = c;
+        }
+      }
 
-void Page::renderToPixmap(QPixmap *pixmap, double xres, double yres) const
-{
-  QPainter* painter = new QPainter(pixmap);
-  painter->setRenderHint(QPainter::Antialiasing);
-  ArthurOutputDev output_dev(painter);
-  output_dev.startDoc(m_page->parentDoc->m_doc->doc.getXRef ());
-  m_page->parentDoc->m_doc->doc.displayPageSlice(&output_dev,
+      // construct a qimage SHARING the raw bitmap data in memory
+      QImage tmpimg( dataPtr, bw, bh, QImage::Format_ARGB32 );
+      img = tmpimg.copy();
+      // unload underlying xpdf bitmap
+      splash_output->startPage( 0, NULL );
+      break;
+    }
+    case Poppler::Document::ArthurBackend:
+    {
+      QSize size = pageSize();
+      QImage tmpimg(w == -1 ? size.width() : w, h == -1 ? size.height() : h, 
QImage::Format_ARGB32);
+
+      QPainter painter(&tmpimg);
+      painter.setRenderHint(QPainter::Antialiasing);
+      painter.save();
+      painter.translate(x == -1 ? 0 : -x, y == -1 ? 0 : -y);
+      if (w == -1 && h == -1)
+        painter.scale((double)w/(double)size.width(), 
(double)h/(double)size.height());
+      ArthurOutputDev arthur_output(&painter);
+      arthur_output.startDoc(m_page->parentDoc->m_doc->doc.getXRef());
+      m_page->parentDoc->m_doc->doc.displayPageSlice(&arthur_output,
                                                 m_page->index + 1,
                                                 xres,
                                                 yres,
-                                                0,
+                                                rotation,
                                                 false,
                                                 true,
-                                                false,
-                                                -1,
-                                                -1,
-                                                -1,
-                                                -1);
-  painter->end();
+                                                doLinks,
+                                                x,
+                                                y,
+                                                w,
+                                                h);
+      painter.restore();
+      painter.end();
+      img = tmpimg;
+      break;
+    }
+  }
+
+  return img;
 }
 
 QString Page::text(const QRectF &r) const
@@ -412,7 +418,7 @@
 
 QSize Page::pageSize() const
 {
-  return QSize( (int)pageSizeF().width(), (int)pageSizeF().height() );
+  return pageSizeF().toSize();
 }
 
 Page::Orientation Page::orientation() const
@@ -454,8 +460,9 @@
     xpdfLink->getRect( &left, &top, &right, &bottom );
     QRectF linkArea;
     
-    m_page->parentDoc->m_doc->m_splashOutputDev->cvtUserToDev( left, top, 
&leftAux, &topAux );
-    m_page->parentDoc->m_doc->m_splashOutputDev->cvtUserToDev( right, bottom, 
&rightAux, &bottomAux );
+    OutputDev *output_dev = m_page->parentDoc->m_doc->getOutputDev();
+    output_dev->cvtUserToDev( left, top, &leftAux, &topAux );
+    output_dev->cvtUserToDev( right, bottom, &rightAux, &bottomAux );
     linkArea.setLeft(leftAux);
     linkArea.setTop(topAux);
     linkArea.setRight(rightAux);

Index: poppler-private.h
===================================================================
RCS file: /cvs/poppler/poppler/qt4/src/poppler-private.h,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- poppler-private.h   18 Oct 2006 18:43:59 -0000      1.14
+++ poppler-private.h   15 Nov 2006 21:07:50 -0000      1.15
@@ -66,7 +66,8 @@
     class DocumentData {
     public:
        DocumentData(GooString *filePath, GooString *ownerPassword, GooString 
*userPassword) :
-           doc(filePath, ownerPassword, userPassword), m_fontInfoScanner(0), 
m_splashOutputDev(0)
+           doc(filePath, ownerPassword, userPassword), m_fontInfoScanner(0),
+           m_backend(Document::SplashBackend), m_outputDev(0)
            {
                paperColor = Qt::white;
                // It might be more appropriate to delete these in PDFDoc
@@ -80,25 +81,35 @@
        ~DocumentData()
        {
                qDeleteAll(m_embeddedFiles);
-               delete m_splashOutputDev;
+               delete m_outputDev;
                delete m_fontInfoScanner;
                
                count --;
                if ( count == 0 ) delete globalParams;
        }
        
-       SplashOutputDev *getSplashOutputDev()
+       OutputDev *getOutputDev()
        {
-               if (!m_splashOutputDev)
+               if (!m_outputDev)
                {
+                       switch (m_backend)
+                       {
+                       case Document::ArthurBackend:
+                       // create a splash backend even in case of the Arthur 
Backend
+                       case Document::SplashBackend:
+                       {
                        SplashColor bgColor;
                        bgColor[0] = paperColor.red();
                        bgColor[1] = paperColor.green();
                        bgColor[2] = paperColor.blue();
-                       m_splashOutputDev = new 
SplashOutputDev(splashModeRGB8Qt, 4, gFalse, bgColor);
-                       m_splashOutputDev->startDoc(doc.getXRef());
+                       SplashOutputDev * splashOutputDev = new 
SplashOutputDev(splashModeRGB8Qt, 4, gFalse, bgColor);
+                       splashOutputDev->startDoc(doc.getXRef());
+                       m_outputDev = splashOutputDev;
+                       break;
+                       }
+                       }
                }
-               return m_splashOutputDev;
+               return m_outputDev;
        }
        
        void addTocChildren( QDomDocument * docSyn, QDomNode * parent, GooList 
* items )
@@ -161,8 +172,8 @@
                if (color != paperColor)
                {
                        paperColor = color;
-                       delete m_splashOutputDev;
-                       m_splashOutputDev = NULL;
+                       delete m_outputDev;
+                       m_outputDev = NULL;
                }
        }
        
@@ -183,7 +194,8 @@
        class PDFDoc doc;
        bool locked;
        FontInfoScanner *m_fontInfoScanner;
-       SplashOutputDev *m_splashOutputDev;
+       Document::RenderBackend m_backend;
+       OutputDev *m_outputDev;
        QList<EmbeddedFile*> m_embeddedFiles;
        QColor paperColor;
        static int count;

Index: poppler-qt4.h
===================================================================
RCS file: /cvs/poppler/poppler/qt4/src/poppler-qt4.h,v
retrieving revision 1.35
retrieving revision 1.36
diff -u -d -r1.35 -r1.36
--- poppler-qt4.h       8 Oct 2006 20:38:47 -0000       1.35
+++ poppler-qt4.h       15 Nov 2006 21:07:50 -0000      1.36
@@ -234,18 +234,14 @@
        };
 
        /** 
-          Render the page to a QImage using the Splash renderer
-          
-          This method can be used to render the page to a QPixmap. It
-          uses the "Splash" rendering engine. This method is reasonably
-          well-tested and has produced good output so far.
+          Render the page to a QImage using the specified renderer
           
           If x=y=w=h=-1, the method will automatically compute the
            size of the pixmap from the horizontal and vertical
            resolutions specified in xres and yres. Otherwise, the
            method renders only a part of the page, specified by the
-           parameters (x, y, w, h) in pixel coordinates. The QPixmap
-           returned then has size (w, h), independent of the page
+           parameters (x, y, w, h) in pixel coordinates. The returned
+           QImage then has size (w, h), independent of the page
            size.
 
           \param x specifies the left x-coordinate of the box, in
@@ -274,54 +270,7 @@
 
           \returns a QImage of the page, or a null image on failure.
         */
-    QImage splashRenderToImage(double xres=72.0, double yres=72.0, int x=-1, 
int y=-1, int w=-1, int h=-1, bool doLinks = false, Rotation rotate = Rotate0) 
const;
-       /**
-          Render the page to a QPixmap using the Splash renderer
-          
-          This member function is provided for convenience. It behaves 
essentially like the above function.
-          It is used as follows.
-
[EMAIL PROTECTED]
-Poppler::Page* pdfPage;
-
-// Generate a QPixmap of the rendered page
-QPixmap* pixmap = pdfPage->splashRenderToPixmap(0, 0, 0, 0, xres, yres );
-if (pixmap == 0) {
-  ... error message ...
-  return;
-}
-
-... use pixmap ...
-
-delete pixmap;
[EMAIL PROTECTED]
-        */
-       
-       QPixmap *splashRenderToPixmap(double xres=72.0, double yres=72.0, int 
x=-1, int y=-1, int w=-1, int h=-1, bool doLinks = false, Rotation rotate = 
Rotate0) const;
-
-       /**
-           Render the page to a pixmap using the Arthur (Qt4) renderer
-          
-          \param q pointer to a QPixmap that is already set to the
-          intended size.
-
-          \param xres horizontal resolution of the graphics device,
-          in dots per inch
-
-          \param yres vertical resolution of the graphics device, in
-          dots per inch
-          
-          You are meant to create the pixmap before passing it to
-          this routine, using something like:
-          \code
-          QPixmap* myPixmap = new QPixmap(page->pageSize());
-          page->renderToPixmap(myPixmap);
-          \endcode
-
-          \warning This is a work in progress. Results are unlikely to be of
-          high quality. 
-       */
-        void renderToPixmap(QPixmap *q, double xres=72.0, double yres=72.0) 
const;
+       QImage renderToImage(double xres=72.0, double yres=72.0, int x=-1, int 
y=-1, int w=-1, int h=-1, bool doLinks = false, Rotation rotate = Rotate0) 
const;
 
        /**
           Returns the text that is inside a specified rectangle
@@ -461,6 +410,14 @@
        };
 
        /**
+          The render backends available
+       */
+       enum RenderBackend {
+           SplashBackend,   ///< Splash backend
+           ArthurBackend,   ///< Arthur (Qt4) backend
+       };
+
+       /**
           Load the document from a file on disk
 
           \param filePath the name (and path, if required) of the file to load
@@ -712,6 +669,14 @@
        void setPaperColor(const QColor &color);
        QColor paperColor() const;
 
+       /**
+        Sets the backend used to render the pages.
+
+        The default backend is @ref SplashBackend
+        */
+       void setRenderBackend( RenderBackend backend );
+       RenderBackend renderBackend() const;
+
        ~Document();
   
     private:

_______________________________________________
poppler mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/poppler

Reply via email to