yacreaderとはcomixよりもリッチな見栄えのコミックビューアです.iPhone版もリリースされて開発が活発なので利用してみました.
それでもまだ少し機能が足らないところがあったのでソースをいじったのでメモ.
yacreaderのダウンロード
Linux版ではlibpoppler-qt4が必要です.予めsudo apt-get install libpoppler-qt4-dev
でインストールしておきます.本体はこちらからダウンロードすることができます.
ソースコードをコンパイルする
現在はBitbucket上で開発されているようですのでそこからソースコードをクローンします.
$ hg clone https://bitbucket.org/luisangelsm/yacreader
コンパイルにはlibpoppler-qt4-dev以外にもPhonon, libqt4-sql, libqt4-sql-sqliteなどが必要なようです.(INSTALL.txtで詳しい情報が確認できます.)僕の環境ではlibpoppler-qt4-devとphononのみでインストールが必要でした.
$ sudo apt-get install libpoppler-qt4-dev phonon
先程ダウンロードしたビルドパッケージ内の
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では少し機能の足らない部分があるのでソースコードをいじってしまいます.(これらの変更は今後開発が進めば必要なくなるかもしれません.)
見開き表示にしたときに左右ページの順序が逆になるのを直したい.(海外コミックは横書き=左とじなため)
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目盛りから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; } }
カバーが横長の場合は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
を実行してコンパイルをすると変化が確認できます.