1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2025-02-22 02:20:47 +01:00

Optimize TextCodec initialization

QTextCodec initialization is very slow due to it's broken caching in Qt when
ICU is enabled. Make TetCodec initialize fast anyway as it may be used very
often in IMG maps (every LBL subfile has it's own codec!).
This commit is contained in:
Martin Tůma 2023-12-21 01:31:44 +01:00
parent e05c2e0383
commit 829d85a70a
5 changed files with 48 additions and 53 deletions

View File

@ -1,56 +1,48 @@
#include <QTextCodec> #include <QTextCodec>
#include "textcodec.h" #include "textcodec.h"
TextCodec::TextCodec() /* When Qt is compiled with ICU support, QTextCodec::codecForName() is very
slow due to broken codec name caching (the function does dozens of
comparisons and only then asks the cache...), so we use our own map. */
static QMap<int, QTextCodec *> initCodecs()
{ {
_codec = QTextCodec::codecForName("Windows-1252"); QMap<int, QTextCodec *> map;
map.insert(65001, 0);
map.insert(874, QTextCodec::codecForName("Windows-874"));
map.insert(932, QTextCodec::codecForName("Shift-JIS"));
map.insert(936, QTextCodec::codecForName("GB18030"));
map.insert(949, QTextCodec::codecForName("EUC-KR"));
map.insert(950, QTextCodec::codecForName("Big5"));
map.insert(1250, QTextCodec::codecForName("Windows-1250"));
map.insert(1251, QTextCodec::codecForName("Windows-1251"));
map.insert(1252, QTextCodec::codecForName("Windows-1252"));
map.insert(1253, QTextCodec::codecForName("Windows-1253"));
map.insert(1254, QTextCodec::codecForName("Windows-1254"));
map.insert(1255, QTextCodec::codecForName("Windows-1255"));
map.insert(1256, QTextCodec::codecForName("Windows-1256"));
map.insert(1257, QTextCodec::codecForName("Windows-1257"));
map.insert(1258, QTextCodec::codecForName("Windows-1258"));
return map;
}
const QMap<int, QTextCodec *> &TextCodec::codecs()
{
static QMap<int, QTextCodec *> map = initCodecs();
return map;
} }
TextCodec::TextCodec(int codepage) TextCodec::TextCodec(int codepage)
{ {
switch (codepage) { const QMap<int, QTextCodec *> &map = codecs();
case 65001:
_codec = 0; QMap<int, QTextCodec *>::const_iterator it(map.find(codepage));
break; if (it == map.cend()) {
case 932: qWarning("%d: Unsupported codepage, using UTF-8", codepage);
_codec = QTextCodec::codecForName("Shift-JIS"); _codec = 0;
break; } else
case 936: _codec = *it;
_codec = QTextCodec::codecForName("GB18030");
break;
case 949:
_codec = QTextCodec::codecForName("EUC-KR");
break;
case 950:
_codec = QTextCodec::codecForName("Big5");
break;
case 1250:
_codec = QTextCodec::codecForName("Windows-1250");
break;
case 1251:
_codec = QTextCodec::codecForName("Windows-1251");
break;
case 1253:
_codec = QTextCodec::codecForName("Windows-1253");
break;
case 1254:
_codec = QTextCodec::codecForName("Windows-1254");
break;
case 1255:
_codec = QTextCodec::codecForName("Windows-1255");
break;
case 1256:
_codec = QTextCodec::codecForName("Windows-1256");
break;
case 1257:
_codec = QTextCodec::codecForName("Windows-1257");
break;
case 1258:
_codec = QTextCodec::codecForName("Windows-1258");
break;
default:
_codec = QTextCodec::codecForName("Windows-1252");
}
} }
QString TextCodec::toString(const QByteArray &ba) const QString TextCodec::toString(const QByteArray &ba) const

View File

@ -2,19 +2,22 @@
#define TEXTCODEC_H #define TEXTCODEC_H
#include <QString> #include <QString>
#include <QMap>
class QTextCodec; class QTextCodec;
class TextCodec class TextCodec
{ {
public: public:
TextCodec(); TextCodec() : _codec(0) {}
TextCodec(int codepage); TextCodec(int codepage);
QString toString(const QByteArray &ba) const; QString toString(const QByteArray &ba) const;
private: private:
QTextCodec *_codec; QTextCodec *_codec;
static const QMap<int, QTextCodec *> &codecs();
}; };
#endif // TEXTCODEC_H #endif // TEXTCODEC_H

View File

@ -128,7 +128,7 @@ qint64 CryptDevice::readData(char *data, qint64 maxSize)
class DataStream : public QDataStream class DataStream : public QDataStream
{ {
public: public:
DataStream(QIODevice *d) : QDataStream(d) {} DataStream(QIODevice *d) : QDataStream(d), _codec(1252) {}
void setCodepage(quint16 codepage) {_codec = TextCodec(codepage);} void setCodepage(quint16 codepage) {_codec = TextCodec(codepage);}

View File

@ -75,7 +75,7 @@ bool TwoNavParser::parse(QFile *file, QList<TrackData> &tracks,
QVector<Waypoint> &waypoints) QVector<Waypoint> &waypoints)
{ {
Q_UNUSED(polygons); Q_UNUSED(polygons);
TextCodec codec; TextCodec codec(1252);
GCS gcs; GCS gcs;
bool ok, route = false, track = false, waypoint = false; bool ok, route = false, track = false, waypoint = false;

View File

@ -16,14 +16,14 @@ class LBLFile : public SubFile
{ {
public: public:
LBLFile(const IMGData *img) LBLFile(const IMGData *img)
: SubFile(img), _huffmanText(0), _table(0), _rasters(0), _imgIdSize(0), : SubFile(img), _huffmanText(0), _table(0), _rasters(0), _codec(1252),
_poiShift(0), _shift(0), _encoding(0) {} _imgIdSize(0), _poiShift(0), _shift(0), _encoding(0) {}
LBLFile(const QString *path) LBLFile(const QString *path)
: SubFile(path), _huffmanText(0), _table(0), _rasters(0), _imgIdSize(0), : SubFile(path), _huffmanText(0), _table(0), _rasters(0), _codec(1252),
_poiShift(0), _shift(0), _encoding(0) {} _imgIdSize(0), _poiShift(0), _shift(0), _encoding(0) {}
LBLFile(const SubFile *gmp, quint32 offset) LBLFile(const SubFile *gmp, quint32 offset)
: SubFile(gmp, offset), _huffmanText(0), _table(0), _rasters(0), : SubFile(gmp, offset), _huffmanText(0), _table(0), _rasters(0),
_imgIdSize(0), _poiShift(0), _shift(0), _encoding(0) {} _codec(1252), _imgIdSize(0), _poiShift(0), _shift(0), _encoding(0) {}
~LBLFile(); ~LBLFile();
bool load(Handle &hdl, const RGNFile *rgn, Handle &rgnHdl); bool load(Handle &hdl, const RGNFile *rgn, Handle &rgnHdl);