PDF: use a map, not a hash, to write the dest roots name tree
A PDF name tree is sorted, so just use a sorted data structure for that. This simplifies the code. This work has been kindly sponsored by the QGIS project (https://qgis.org/). Change-Id: Ib08b14aaf79c9180319efe7fefa9e797a4364d54 Reviewed-by: Albert Astals Cid <aacid@kde.org>
This commit is contained in:
parent
2f9c72028d
commit
0dca6c40e1
@ -23,6 +23,8 @@
|
|||||||
#include <qtimezone.h>
|
#include <qtimezone.h>
|
||||||
#include <quuid.h>
|
#include <quuid.h>
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
|
||||||
#ifndef QT_NO_COMPRESS
|
#ifndef QT_NO_COMPRESS
|
||||||
#include <zlib.h>
|
#include <zlib.h>
|
||||||
#endif
|
#endif
|
||||||
@ -1857,7 +1859,7 @@ void QPdfEnginePrivate::writeDestsRoot()
|
|||||||
if (destCache.isEmpty())
|
if (destCache.isEmpty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
QHash<QString, int> destObjects;
|
std::map<QString, int> destObjects;
|
||||||
QByteArray xs, ys;
|
QByteArray xs, ys;
|
||||||
for (const DestInfo &destInfo : std::as_const(destCache)) {
|
for (const DestInfo &destInfo : std::as_const(destCache)) {
|
||||||
int destObj = addXrefEntry(-1);
|
int destObj = addXrefEntry(-1);
|
||||||
@ -1865,21 +1867,19 @@ void QPdfEnginePrivate::writeDestsRoot()
|
|||||||
ys.setNum(static_cast<double>(destInfo.coords.y()), 'f');
|
ys.setNum(static_cast<double>(destInfo.coords.y()), 'f');
|
||||||
xprintf("[%d 0 R /XYZ %s %s 0]\n", destInfo.pageObj, xs.constData(), ys.constData());
|
xprintf("[%d 0 R /XYZ %s %s 0]\n", destInfo.pageObj, xs.constData(), ys.constData());
|
||||||
xprintf("endobj\n");
|
xprintf("endobj\n");
|
||||||
destObjects.insert(destInfo.anchor, destObj);
|
destObjects.insert_or_assign(destInfo.anchor, destObj);
|
||||||
}
|
}
|
||||||
|
|
||||||
// names
|
// names
|
||||||
destsRoot = addXrefEntry(-1);
|
destsRoot = addXrefEntry(-1);
|
||||||
QStringList anchors = destObjects.keys();
|
|
||||||
anchors.sort();
|
|
||||||
xprintf("<<\n/Limits [");
|
xprintf("<<\n/Limits [");
|
||||||
printString(anchors.constFirst());
|
printString(destObjects.begin()->first);
|
||||||
xprintf(" ");
|
xprintf(" ");
|
||||||
printString(anchors.constLast());
|
printString(destObjects.rbegin()->first);
|
||||||
xprintf("]\n/Names [\n");
|
xprintf("]\n/Names [\n");
|
||||||
for (const QString &anchor : std::as_const(anchors)) {
|
for (const auto &[anchor, destObject] : destObjects) {
|
||||||
printString(anchor);
|
printString(anchor);
|
||||||
xprintf(" %d 0 R\n", destObjects[anchor]);
|
xprintf(" %d 0 R\n", destObject);
|
||||||
}
|
}
|
||||||
xprintf("]\n>>\n"
|
xprintf("]\n>>\n"
|
||||||
"endobj\n");
|
"endobj\n");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user