⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 generator_djvu.cpp.svn-base

📁 okular
💻 SVN-BASE
字号:
/*************************************************************************** *   Copyright (C) 2006 by Pino Toscano <toscano.pino@tiscali.it>          * *                                                                         * *   This program is free software; you can redistribute it and/or modify  * *   it under the terms of the GNU General Public License as published by  * *   the Free Software Foundation; either version 2 of the License, or     * *   (at your option) any later version.                                   * ***************************************************************************/#include "generator_djvu.h"#include "kdjvu.h"#include "core/area.h"#include "core/document.h"#include "core/link.h"#include "core/page.h"#include "core/utils.h"#include <qdom.h>#include <qstring.h>#include <kdebug.h>#include <klocale.h>static void recurseCreateTOC( QDomDocument &maindoc, QDomNode &parent, QDomNode &parentDestination ){    QDomNode n = parent.firstChild();    while( !n.isNull() )    {        QDomElement el = n.toElement();        QDomElement newel = maindoc.createElement( el.attribute( "title" ) );        parentDestination.appendChild( newel );        if ( !el.attribute( "destination" ).isEmpty() )        {            bool ok = true;            int page = el.attribute( "destination" ).toInt( &ok );            if ( ok && ( page > 0 ) )            {                DocumentViewport vp;                vp.pageNumber = page - 1;                newel.setAttribute( "Viewport", vp.toString() );            }        }        if ( el.hasChildNodes() )        {            recurseCreateTOC( maindoc, n, newel );        }        n = n.nextSibling();    }}OKULAR_EXPORT_PLUGIN(DjVuGenerator)DjVuGenerator::DjVuGenerator( KPDFDocument * doc ) : Generator ( doc ),  m_docInfo( 0 ), m_docSyn( 0 ), ready( false ){    m_djvu = new KDjVu();    connect( m_djvu, SIGNAL( pixmapGenerated( int, const QPixmap & ) ), this, SLOT( djvuPixmapGenerated( int, const QPixmap & ) ) );}bool DjVuGenerator::loadDocument( const QString & fileName, QVector< KPDFPage * > & pagesVector ){    if ( !m_djvu->openFile( fileName ) )        return false;    loadPages( pagesVector, 0 );    ready = true;    return true;}bool DjVuGenerator::closeDocument(){    m_djvu->closeFile();    delete m_docInfo;    m_docInfo = 0;    delete m_docSyn;    m_docSyn = 0;    ready = false;    return true;}bool DjVuGenerator::canGeneratePixmap( bool /*async*/ ){    return ready;}void DjVuGenerator::generatePixmap( PixmapRequest * request ){    ready = false;    m_request = request;    QPixmap pix = m_djvu->pixmap( request->pageNumber, request->width, request->height, request->documentRotation );    if ( pix.isNull() )    {        m_djvu->requestPixmap( request->pageNumber, request->width, request->height, request->documentRotation );    }    else    {        djvuPixmapGenerated( request->pageNumber, pix );    }}const DocumentInfo * DjVuGenerator::generateDocumentInfo(){    if ( m_docInfo )        return m_docInfo;    m_docInfo = new DocumentInfo();    m_docInfo->set( "mimeType", "image/x-djvu" );    if ( m_djvu )    {        // compile internal structure reading properties from KDjVu        QString doctype = m_djvu->getMetaData( "documentType" );        m_docInfo->set( "documentType", doctype.isEmpty() ? i18n( "Unknown" ) : doctype, i18n( "Type of document" ) );        QString numcomponents = m_djvu->getMetaData( "componentFile" );        m_docInfo->set( "componentFile", numcomponents.isEmpty() ? i18n( "Unknown" ) : numcomponents, i18n( "Component Files" ) );    }    else    {        m_docInfo->set( "documentType", i18n( "Unknown" ), i18n( "Type of document" ) );        m_docInfo->set( "componentFile", i18n( "Unknown" ), i18n( "Component Files" ) );    }    return m_docInfo;}const DocumentSynopsis * DjVuGenerator::generateDocumentSynopsis(){    if ( m_docSyn )        return m_docSyn;    const QDomDocument *doc = m_djvu->documentBookmarks();    if ( doc )    {        m_docSyn = new DocumentSynopsis();        recurseCreateTOC( *m_docSyn, *const_cast<QDomDocument*>( doc ), *m_docSyn );    }    return m_docSyn;}void DjVuGenerator::setOrientation( QVector<KPDFPage*> & pagesVector, int orientation ){    loadPages( pagesVector, orientation );}void DjVuGenerator::djvuPixmapGenerated( int page, const QPixmap & pix ){    m_request->page->setPixmap( m_request->id, new QPixmap( pix ) );    QList<KDjVu::Link*> links = m_djvu->linksForPage( page );    if ( links.count() > 0 )    {        QLinkedList<ObjectRect *> rects;        QList<KDjVu::Link*>::ConstIterator it = links.constBegin();        QList<KDjVu::Link*>::ConstIterator itEnd = links.constEnd();        for ( ; it != itEnd; ++it )        {            KDjVu::Link *curlink = (*it);            KPDFLink *newlink = 0;            int newpage = -1;            switch ( curlink->type() )            {                case KDjVu::Link::PageLink:                {                    KDjVu::PageLink* l = static_cast<KDjVu::PageLink*>( curlink );                    bool ok = true;                    QString target = l->page();                    if ( ( target.length() > 0 ) && target.at(0) == QLatin1Char( '#' ) )                        target.remove( 0, 1 );                    int tmppage = target.toInt( &ok );                    if ( ok || target.isEmpty() )                    {                        DocumentViewport vp;                        if ( !target.isEmpty() )                        {                            vp.pageNumber = ( target.at(0) == QLatin1Char( '+' ) || target.at(0) == QLatin1Char( '-' ) ) ? page + tmppage : tmppage - 1;                            newpage = vp.pageNumber;                        }                        newlink = new KPDFLinkGoto( QString::null, vp );                    }                    break;                }                case KDjVu::Link::UrlLink:                {                    KDjVu::UrlLink* l = static_cast<KDjVu::UrlLink*>( curlink );                    QString url = l->url();                    newlink = new KPDFLinkBrowse( url );                    break;                }            }            if ( newlink )            {                const KDjVu::Page* p = m_djvu->pages().at( newpage == -1 ? page : newpage );                int width = p->width();                int height = p->height();                bool scape_orientation = ( m_request->documentRotation % 2 == 1 );                if ( scape_orientation )                    qSwap( width, height );                ObjectRect *newrect = 0;                switch ( curlink->areaType() )                {                    case KDjVu::Link::RectArea:                    case KDjVu::Link::EllipseArea:                    {                        QRect r( QPoint( curlink->point().x(), p->height() - curlink->point().y() - curlink->size().height() ), curlink->size() );                        bool ellipse = ( curlink->areaType() == KDjVu::Link::EllipseArea );                        newrect = new ObjectRect( NormalizedRect( okularUtils::rotateRect( r, width, height, m_request->documentRotation ), width, height ), ellipse, ObjectRect::Link, newlink );                        break;                    }                    case KDjVu::Link::PolygonArea:                    {                        QPolygon poly = curlink->polygon();                        QPolygonF newpoly;                        for ( int i = 0; i < poly.count(); ++i )                        {                            int x = poly.at(i).x();                            int y = poly.at(i).y();                            if ( scape_orientation )                                qSwap( x, y );                            else                            {                                y = height - y;                            }                            newpoly << QPointF( (double)(x)/width, (double)(y)/height );                        }                        if ( !newpoly.isEmpty() )                        {                            newpoly << newpoly.first();                            newrect = new ObjectRect( newpoly, ObjectRect::Link, newlink );                        }                        break;                    }                    default: ;                }                if ( newrect )                    rects.append( newrect );                else                    delete newlink;            }            // delete the links as soon as we process them            delete curlink;        }        if ( rects.count() > 0 )            m_request->page->setObjectRects( rects );    }    ready = true;    signalRequestDone( m_request );}void DjVuGenerator::loadPages( QVector<KPDFPage*> & pagesVector, int rotation ){    const QVector<KDjVu::Page*> &djvu_pages = m_djvu->pages();    int numofpages = djvu_pages.count();    pagesVector.resize( numofpages );    for ( int i = 0; i < numofpages; ++i )    {        const KDjVu::Page *p = djvu_pages.at( i );        if (pagesVector[i])            delete pagesVector[i];        int w = p->width();        int h = p->height();        if ( rotation % 2 == 1 )            qSwap( w, h );        KPDFPage *page = new KPDFPage( i, w, h, p->orientation() + rotation );        pagesVector[i] = page;    }}#include "generator_djvu.moc"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -