diff options
Diffstat (limited to 'src/gui/text/qfontengine_qws.cpp')
-rw-r--r-- | src/gui/text/qfontengine_qws.cpp | 216 |
1 files changed, 60 insertions, 156 deletions
diff --git a/src/gui/text/qfontengine_qws.cpp b/src/gui/text/qfontengine_qws.cpp index 4c6dff2..237842b 100644 --- a/src/gui/text/qfontengine_qws.cpp +++ b/src/gui/text/qfontengine_qws.cpp @@ -40,7 +40,6 @@ ****************************************************************************/ #include "qfontengine_p.h" -#include <private/qunicodetables_p.h> #include <qwsdisplay_qws.h> #include <qvarlengtharray.h> #include <private/qpainter_p.h> @@ -51,15 +50,17 @@ #include <qdebug.h> - #ifndef QT_NO_QWS_QPF +#include "qplatformdefs.h" #include "qfile.h" -#include "qdir.h" -#define QT_USE_MMAP #include <stdlib.h> +#if !defined(Q_OS_INTEGRITY) +#define QT_USE_MMAP +#endif + #ifdef QT_USE_MMAP // for mmap #include <unistd.h> @@ -69,22 +70,17 @@ #include <fcntl.h> #include <errno.h> -# if defined(QT_LINUXBASE) && !defined(MAP_FILE) - // LSB 3.2 does not define MAP_FILE -# define MAP_FILE 0 -# endif - +#ifndef MAP_FILE +# define MAP_FILE 0 +#endif +#ifndef MAP_FAILED +# define MAP_FAILED (void *)-1 #endif -#endif // QT_NO_QWS_QPF +#endif // QT_USE_MMAP QT_BEGIN_NAMESPACE -#ifndef QT_NO_QWS_QPF -QT_BEGIN_INCLUDE_NAMESPACE -#include "qplatformdefs.h" -QT_END_INCLUDE_NAMESPACE - static inline unsigned int getChar(const QChar *str, int &i, const int len) { unsigned int uc = str[i].unicode(); @@ -161,17 +157,10 @@ public: QPFGlyphTree* more; QPFGlyph* glyph; public: -#ifdef QT_USE_MMAP QPFGlyphTree(uchar*& data) { read(data); } -#else - QPFGlyphTree(QIODevice& f) - { - read(f); - } -#endif ~QPFGlyphTree() { @@ -237,7 +226,6 @@ private: { } -#ifdef QT_USE_MMAP void read(uchar*& data) { // All node data first @@ -247,19 +235,7 @@ private: // Then all video data readData(data); } -#else - void read(QIODevice& f) - { - // All node data first - readNode(f); - // Then all non-video data - readMetrics(f); - // Then all video data - readData(f); - } -#endif -#ifdef QT_USE_MMAP void readNode(uchar*& data) { uchar rw = *data++; @@ -285,38 +261,7 @@ private: if ( more ) more->readNode(data); } -#else - void readNode(QIODevice& f) - { - char rw; - char cl; - f.getChar(&rw); - f.getChar(&cl); - min = (rw << 8) | cl; - f.getChar(&rw); - f.getChar(&cl); - max = (rw << 8) | cl; - char flags; - f.getChar(&flags); - if ( flags & 1 ) - less = new QPFGlyphTree; - else - less = 0; - if ( flags & 2 ) - more = new QPFGlyphTree; - else - more = 0; - int n = max-min+1; - glyph = new QPFGlyph[n]; - - if ( less ) - less->readNode(f); - if ( more ) - more->readNode(f); - } -#endif -#ifdef QT_USE_MMAP void readMetrics(uchar*& data) { int n = max-min+1; @@ -329,22 +274,7 @@ private: if ( more ) more->readMetrics(data); } -#else - void readMetrics(QIODevice& f) - { - int n = max-min+1; - for (int i=0; i<n; i++) { - glyph[i].metrics = new QPFGlyphMetrics; - f.read((char*)glyph[i].metrics, sizeof(QPFGlyphMetrics)); - } - if ( less ) - less->readMetrics(f); - if ( more ) - more->readMetrics(f); - } -#endif -#ifdef QT_USE_MMAP void readData(uchar*& data) { int n = max-min+1; @@ -359,24 +289,6 @@ private: if ( more ) more->readData(data); } -#else - void readData(QIODevice& f) - { - int n = max-min+1; - for (int i=0; i<n; i++) { - QSize s( glyph[i].metrics->width, glyph[i].metrics->height ); - //############### s = qt_screen->mapToDevice( s ); - uint datasize = glyph[i].metrics->linestep * s.height(); - glyph[i].data = new uchar[datasize]; // ### deleted? - f.read((char*)glyph[i].data, datasize); - } - if ( less ) - less->readData(f); - if ( more ) - more->readData(f); - } -#endif - }; class QFontEngineQPF1Data @@ -384,73 +296,58 @@ class QFontEngineQPF1Data public: QPFFontMetrics fm; QPFGlyphTree *tree; - void *mmapStart; + uchar *mmapStart; size_t mmapLength; -}; - -#if defined(Q_OS_INTEGRITY) -static void *qt_mmap(void *start, size_t length, int /*prot*/, int /*flags*/, int fd, off_t offset) -{ - // INTEGRITY cannot mmap local files - load it into a local buffer - if (::lseek(fd, offset, SEEK_SET) == -1) { -# if defined(DEBUG_FONTENGINE) - perror("lseek failed"); -# endif - } - void *buf = malloc(length); - if (::read(fd, buf, length) != (ssize_t)length) { -# if defined(DEBUG_FONTENGINE) - perror("read failed"); -# endif - } - - return buf; -} -#else -static inline void *qt_mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset) -{ - return mmap(start, length, prot, flags, fd, offset); -} +#ifdef QT_USE_MMAP + bool used_mmap; #endif - - +}; QFontEngineQPF1::QFontEngineQPF1(const QFontDef&, const QString &fn) { cache_cost = 1; - int f = QT_OPEN( QFile::encodeName(fn), O_RDONLY, 0); - Q_ASSERT(f>=0); + int fd = QT_OPEN(QFile::encodeName(fn).constData(), O_RDONLY, 0); + if (fd == -1) + qFatal("Failed to open '%s'", QFile::encodeName(fn).constData()); + QT_STATBUF st; - if ( QT_FSTAT( f, &st ) ) - qFatal("Failed to stat %s",QFile::encodeName(fn).data()); - uchar* data = (uchar*)qt_mmap( 0, // any address - st.st_size, // whole file - PROT_READ, // read-only memory -#if defined(Q_OS_INTEGRITY) - 0, -#elif !defined(Q_OS_SOLARIS) && !defined(Q_OS_QNX4) && !defined(Q_OS_VXWORKS) - MAP_FILE | MAP_PRIVATE, // swap-backed map from file -#else - MAP_PRIVATE, -#endif - f, 0 ); // from offset 0 of f -#if !defined(MAP_FAILED) && (defined(Q_OS_QNX4) || defined(Q_OS_INTEGRITY)) -#define MAP_FAILED ((void *)-1) -#endif - if ( !data || data == (uchar*)MAP_FAILED ) - qFatal("Failed to mmap %s",QFile::encodeName(fn).data()); - QT_CLOSE(f); + if (QT_FSTAT(fd, &st) != 0) + qFatal("Failed to stat '%s'", QFile::encodeName(fn).constData()); d = new QFontEngineQPF1Data; - d->mmapStart = data; + d->mmapStart = 0; d->mmapLength = st.st_size; - memcpy(reinterpret_cast<char*>(&d->fm),data,sizeof(d->fm)); - data += sizeof(d->fm); - d->tree = new QPFGlyphTree(data); - glyphFormat = (d->fm.flags & FM_SMOOTH) ? QFontEngineGlyphCache::Raster_A8 - : QFontEngineGlyphCache::Raster_Mono; +#ifdef QT_USE_MMAP + d->used_mmap = true; + d->mmapStart = (uchar *)::mmap(0, st.st_size, // any address, whole file + PROT_READ, // read-only memory + MAP_FILE | MAP_PRIVATE, // swap-backed map from file + fd, 0); // from offset 0 of fd + if (d->mmapStart == (uchar *)MAP_FAILED) + d->mmapStart = 0; +#endif + + if (!d->mmapStart) { +#ifdef QT_USE_MMAP + d->used_mmap = false; +#endif + d->mmapStart = new uchar[d->mmapLength]; + if (QT_READ(fd, d->mmapStart, d->mmapLength) != d->mmapLength) + qFatal("Failed to read '%s'", QFile::encodeName(fn).constData()); + } + QT_CLOSE(fd); + + if (d->mmapStart) { + uchar* data = d->mmapStart; + + memcpy(reinterpret_cast<char*>(&d->fm), data, sizeof(d->fm)); + data += sizeof(d->fm); + + d->tree = new QPFGlyphTree(data); + glyphFormat = (d->fm.flags & FM_SMOOTH) ? QFontEngineGlyphCache::Raster_A8 + : QFontEngineGlyphCache::Raster_Mono; #if 0 qDebug() << "font file" << fn << "ascent" << d->fm.ascent << "descent" << d->fm.descent @@ -462,12 +359,19 @@ QFontEngineQPF1::QFontEngineQPF1(const QFontDef&, const QString &fn) << "underlinepos" << d->fm.underlinepos << "underlinewidth" << d->fm.underlinewidth; #endif + } } QFontEngineQPF1::~QFontEngineQPF1() { - if (d->mmapStart) - munmap(d->mmapStart, d->mmapLength); + if (d->mmapStart) { +#if defined(QT_USE_MMAP) + if (d->used_mmap) + ::munmap(d->mmapStart, d->mmapLength); + else +#endif + delete [] d->mmapStart; + } delete d->tree; delete d; } |