79
Model::DjVuPage::DjVuPage(const DjVuDocument* parent, int index, const ddjvu_pageinfo_t& pageinfo) :
82
QString loadText(miniexp_t textExp, const QRect& rect, int pageHeight)
84
const int textLength = miniexp_length(textExp);
86
if(textLength >= 6 && miniexp_symbolp(miniexp_nth(0, textExp)))
88
const int xmin = miniexp_to_int(miniexp_nth(1, textExp));
89
const int ymin = miniexp_to_int(miniexp_nth(2, textExp));
90
const int xmax = miniexp_to_int(miniexp_nth(3, textExp));
91
const int ymax = miniexp_to_int(miniexp_nth(4, textExp));
93
if(rect.intersects(QRect(xmin, pageHeight - ymax, xmax - xmin, ymax - ymin)))
95
if(qstrncmp(miniexp_to_name(miniexp_nth(0, textExp)), "word", 4) == 0)
97
return QString::fromUtf8(miniexp_to_str(miniexp_nth(5, textExp)));
103
for(int textN = 5; textN < textLength; ++textN)
105
text.append(loadText(miniexp_nth(textN, textExp), rect, pageHeight));
108
if(qstrncmp(miniexp_to_name(miniexp_nth(0, textExp)), "line", 4) == 0)
110
return text.join(" ");
114
return text.join("\n");
123
void loadOutline(miniexp_t outlineExp, int offset, QStandardItem* parent, const QHash< QString, int >& indexByName)
125
const int outlineLength = miniexp_length(outlineExp);
127
for(int outlineN = qMax(0, offset); outlineN < outlineLength; ++outlineN)
129
miniexp_t bookmarkExp = miniexp_nth(outlineN, outlineExp);
130
const int bookmarkLength = miniexp_length(bookmarkExp);
132
if(bookmarkLength <= 1 || !miniexp_stringp(miniexp_nth(0, bookmarkExp)) || !miniexp_stringp(miniexp_nth(1, bookmarkExp)))
137
const QString title = QString::fromUtf8(miniexp_to_str(miniexp_nth(0, bookmarkExp)));
138
QString destination = QString::fromUtf8(miniexp_to_str(miniexp_nth(1, bookmarkExp)));
140
if(!title.isEmpty() && !destination.isEmpty())
142
if(destination.at(0) == QLatin1Char('#'))
144
destination.remove(0,1);
147
int destinationPage = destination.toInt(&ok);
151
if(indexByName.contains(destination))
153
destinationPage = indexByName[destination] + 1;
161
QStandardItem* item = new QStandardItem(title);
162
item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
164
item->setData(destinationPage, Qt::UserRole + 1);
166
QStandardItem* pageItem = item->clone();
167
pageItem->setText(QString::number(destinationPage));
168
pageItem->setTextAlignment(Qt::AlignRight);
170
parent->appendRow(QList< QStandardItem* >() << item << pageItem);
172
if(bookmarkLength >= 3)
174
loadOutline(bookmarkExp, 2, item, indexByName);
186
model::DjVuPage::DjVuPage(const DjVuDocument* parent, int index, const ddjvu_pageinfo_t& pageinfo) :
82
189
m_size(pageinfo.width, pageinfo.height),
87
Model::DjVuPage::~DjVuPage()
194
model::DjVuPage::~DjVuPage()
91
QSizeF Model::DjVuPage::size() const
198
QSizeF model::DjVuPage::size() const
93
200
return 72.0 / m_resolution * m_size;
96
QImage Model::DjVuPage::render(qreal horizontalResolution, qreal verticalResolution, Rotation rotation, const QRect& boundingRect) const
203
QImage model::DjVuPage::render(qreal horizontalResolution, qreal verticalResolution, Rotation rotation, const QRect& boundingRect) const
98
205
QMutexLocker mutexLocker(&m_parent->m_mutex);
339
static QString loadText(miniexp_t textExp, const QRect& rect, int pageHeight)
341
const int textLength = miniexp_length(textExp);
343
if(textLength >= 6 && miniexp_symbolp(miniexp_nth(0, textExp)))
345
const int xmin = miniexp_to_int(miniexp_nth(1, textExp));
346
const int ymin = miniexp_to_int(miniexp_nth(2, textExp));
347
const int xmax = miniexp_to_int(miniexp_nth(3, textExp));
348
const int ymax = miniexp_to_int(miniexp_nth(4, textExp));
350
if(rect.intersects(QRect(xmin, pageHeight - ymax, xmax - xmin, ymax - ymin)))
352
if(qstrncmp(miniexp_to_name(miniexp_nth(0, textExp)), "word", 4) == 0)
354
return QString::fromUtf8(miniexp_to_str(miniexp_nth(5, textExp)));
360
for(int textN = 5; textN < textLength; ++textN)
362
text.append(loadText(miniexp_nth(textN, textExp), rect, pageHeight));
365
if(qstrncmp(miniexp_to_name(miniexp_nth(0, textExp)), "line", 4) == 0)
367
return text.join(" ");
371
return text.join("\n");
380
QString Model::DjVuPage::text(const QRectF& rect) const
446
QString model::DjVuPage::text(const QRectF& rect) const
382
448
QMutexLocker mutexLocker(&m_parent->m_mutex);
527
Model::DjVuDocument::~DjVuDocument()
593
model::DjVuDocument::~DjVuDocument()
529
595
ddjvu_document_release(m_document);
530
596
ddjvu_context_release(m_context);
531
597
ddjvu_format_release(m_format);
534
int Model::DjVuDocument::numberOfPages() const
600
int model::DjVuDocument::numberOfPages() const
536
602
QMutexLocker mutexLocker(&m_mutex);
538
604
return ddjvu_document_get_pagenum(m_document);
541
Model::Page* Model::DjVuDocument::page(int index) const
607
model::Page* model::DjVuDocument::page(int index) const
543
609
QMutexLocker mutexLocker(&m_mutex);
567
633
return new DjVuPage(this, index, pageinfo);
570
QStringList Model::DjVuDocument::saveFilter() const
636
QStringList model::DjVuDocument::saveFilter() const
572
638
return QStringList() << "DjVu (*.djvu *.djv)";
575
bool Model::DjVuDocument::canSave() const
641
bool model::DjVuDocument::canSave() const
580
bool Model::DjVuDocument::save(const QString& filePath, bool withChanges) const
646
bool model::DjVuDocument::save(const QString& filePath, bool withChanges) const
582
648
Q_UNUSED(withChanges);
602
668
return !ddjvu_job_error(job);
605
static void loadOutline(miniexp_t outlineExp, int offset, QStandardItem* parent, const QHash< QString, int >& indexByName)
607
const int outlineLength = miniexp_length(outlineExp);
609
for(int outlineN = qMax(0, offset); outlineN < outlineLength; ++outlineN)
611
miniexp_t bookmarkExp = miniexp_nth(outlineN, outlineExp);
612
const int bookmarkLength = miniexp_length(bookmarkExp);
614
if(bookmarkLength <= 1 || !miniexp_stringp(miniexp_nth(0, bookmarkExp)) || !miniexp_stringp(miniexp_nth(1, bookmarkExp)))
619
const QString title = QString::fromUtf8(miniexp_to_str(miniexp_nth(0, bookmarkExp)));
620
QString destination = QString::fromUtf8(miniexp_to_str(miniexp_nth(1, bookmarkExp)));
622
if(!title.isEmpty() && !destination.isEmpty())
624
if(destination.at(0) == QLatin1Char('#'))
626
destination.remove(0,1);
629
int destinationPage = destination.toInt(&ok);
633
if(indexByName.contains(destination))
635
destinationPage = indexByName[destination] + 1;
643
QStandardItem* item = new QStandardItem(title);
644
item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
646
item->setData(destinationPage, Qt::UserRole + 1);
648
QStandardItem* pageItem = item->clone();
649
pageItem->setText(QString::number(destinationPage));
650
pageItem->setTextAlignment(Qt::AlignRight);
652
parent->appendRow(QList< QStandardItem* >() << item << pageItem);
654
if(bookmarkLength >= 3)
656
loadOutline(bookmarkExp, 2, item, indexByName);
663
void Model::DjVuDocument::loadOutline(QStandardItemModel* outlineModel) const
671
void model::DjVuDocument::loadOutline(QStandardItemModel* outlineModel) const
665
673
Document::loadOutline(outlineModel);