yacreaderとはcomixよりもリッチな見栄えのコミックビューアです.iPhone版もリリースされて開発が活発なので利用してみました.

それでもまだ少し機能が足らないところがあったのでソースをいじったのでメモ.

yacreaderのダウンロード

Linux版ではlibpoppler-qt4が必要です.予めsudo apt-get install libpoppler-qt4-devでインストールしておきます.本体はこちらからダウンロードすることができます.

ソースコードをコンパイルする

  1. 現在はBitbucket上で開発されているようですのでそこからソースコードをクローンします.

     $ hg clone https://bitbucket.org/luisangelsm/yacreader
  2. コンパイルにはlibpoppler-qt4-dev以外にもPhonon, libqt4-sql, libqt4-sql-sqliteなどが必要なようです.(INSTALL.txtで詳しい情報が確認できます.)僕の環境ではlibpoppler-qt4-devとphononのみでインストールが必要でした.

     $ sudo apt-get install libpoppler-qt4-dev phonon
  3. 先程ダウンロードしたビルドパッケージ内のutilsフォルダをクローンしたソースコードのフォルダにコピーします.

     $ cp -R ~/Downloads/YACReader-\* X11-x64-qt4/utils yacreader/

以上が完了したら以下を実行してコンパイルします.

$ ./compileX11.sh

成功するとクローンしたフォルダ内にYACReader- X11--qt4というフォルダ作成され,中にutilsフォルダ,YACReader, YACReaderLibraryがあるはずです.

コンパイルに失敗する場合

- g++とかgccが無いって言われる → `sudo apt-get install build-essential`  
- 入れたのにphononが無いって言われる → `qmake -v`でQtVersionが5になっているかも.`.compileX11.sh`をエディタで開き,`qmake`をすべて`qmake-qt4`に変えて再びコンパイルする.

ソースコードをいじる

以下,yacreader6.5.3をもとに変更を行なっています

現状のYACReaderでは少し機能の足らない部分があるのでソースコードをいじってしまいます.(これらの変更は今後開発が進めば必要なくなるかもしれません.)

  1. 見開き表示にしたときに左右ページの順序が逆になるのを直したい.(海外コミックは横書き=左とじなため)

    yacreader/YACReader/render.cppの430行付近を以下のように変更.

     QImage auxImg(totalWidth,totalHeight,QImage::Format_RGB32);
         QPainter painter(&auxImg);
     -    painter.drawImage(QRect(0,0,width1,totalHeight),img);
     -    if(!img2.isNull())
     -        painter.drawImage(QRect(width1,0,width2,totalHeight),img2);
     +    if(!img2.isNull()){
     +        painter.drawImage(QRect(0,0,width2,totalHeight),img2);
     +        painter.drawImage(QRect(width2,0,width1,totalHeight),img);
     +    }else{
     +        painter.drawImage(QRect(0,0,width1,totalHeight),img);
     +    }
         painter.end();
  2. ページ移動に必要なホイールの移動量を2目盛りから1目盛りへ変えたい.

    yacreader/YACReader/viewer.cppの370行付近を以下のように変更

     void Viewer::wheelEvent(QWheelEvent * event)
     {
         if(render->hasLoadedComic())
         {
             if((event->delta()<0)&&(verticalScrollBar()->sliderPosition()==verticalScrollBar()->maximum()))
             {
     -            if(whellStop)
     +            if(true)
                 {
                     next();
                     verticalScroller->stop();
                     event->accept();
                     wheelStop = false;
                     return;
                 }
                 else
                     wheelStop = true;
             }
             else
             {
                 if((event->delta()>0)&&(verticalScrollBar()->sliderPosition()==verticalScrollBar()->minimum()))
                 {
     -                if(whellStop)
     +                if(true)
                     {
                         prev();
                         verticalScroller->stop();
                         event->accept();
                         wheelStop = false;
                         return;
                     }
                     else
                         wheelStop = true;
                 }
             }
  3. カバーが横長の場合は90度回転して欲しい

    • hardwareAccelarationなしのとき
      yacreader/common/pictureflow.cppの600行あたりを以下のように変更

        static QImage* prepareSurface(const QImage* slideImage, int w, int h, QRgb bgcolor,
        PictureFlow::ReflectionEffect reflectionEffect)
        {
      
              int iw,ih;
          iw = slideImage->width();
          ih = slideImage->height();
          int psw,psh;
          if(iw>ih)
          {
        -      psw = w;
        -      psh = w * (1.0*ih/iw);
        +      int w1 = w;
        +      psh = w1 * (1.0*iw/ih);
        +      psw = w1;
      
        +      while(psh>h)
        +      {
        +        w1-=2;
        +        psh= w1* (1.0*iw/ih);
        +        psw = w1;
        +      }
          }
          else
          {
              int h1=h;
              psw = h1 * (1.0*iw/ih);
              psh = h1;
      
              while(psw>w)
              {
                    h1-=2;
                   psw = h1 * (1.0*iw/ih);
                   psh = h1;
              }
          }
          w = psw;
      
        #ifdef PICTUREFLOW_QT4
          Qt::TransformationMode mode = Qt::SmoothTransformation;
        -   QImage img = slideImage->scaled(psw, psh, Qt::IgnoreAspectRatio, mode);
        +  QImage img;
        +  if (iw > ih){
        +    QTransform rot;
        +    rot.rotate(90);
        +    img = slideImage->transformed(rot, Qt::SmoothTransformation);
        +    img = img.scaled(psw, psh, Qt::IgnoreAspectRatio, mode);
        +  }else{
        +    img = slideImage->scaled(psw, psh, Qt::IgnoreAspectRatio, mode);
        +  }
    • hardwareAccelarationありのとき
      common/yacreader_flow_gl.cppの380行付近を以下のように変更

        void YACReaderFlowGL::drawCover(CFImage *CF)
        {
            float w = CF->width;
            float h = CF->height;
      
        +    w = 1.8f*(w/h);
        +    h = 1.8f;

      同ファイルの1240行付近を以下のように変更

        //-----------------------------------------------------------------------------
        //ImageLoader
        //-----------------------------------------------------------------------------
        QImage ImageLoaderGL::loadImage(const QString& fileName)
        {
            QImage image;
            bool result = image.load(fileName);
      
        +    if (image.width() > image.height())
        +        image = image.transformed(QMatrix().rotate(90));

ソースコードをいじったら再度./compileX11.shを実行してコンパイルをすると変化が確認できます.