diff options
Diffstat (limited to 'src/gui/image/qppmhandler.cpp')
-rw-r--r-- | src/gui/image/qppmhandler.cpp | 28 |
1 files changed, 15 insertions, 13 deletions
diff --git a/src/gui/image/qppmhandler.cpp b/src/gui/image/qppmhandler.cpp index 8eb88c1387..df260d56d0 100644 --- a/src/gui/image/qppmhandler.cpp +++ b/src/gui/image/qppmhandler.cpp @@ -11,13 +11,12 @@ #include <qloggingcategory.h> #include <qrgba64.h> #include <qvariant.h> - -#include <ctype.h> +#include <private/qlocale_p.h> +#include <private/qtools_p.h> +#include <private/qimage_p.h> QT_BEGIN_NAMESPACE -Q_DECLARE_LOGGING_CATEGORY(lcImageIo) - /***************************************************************************** PBM/PGM/PPM (ASCII and RAW) image read/write functions *****************************************************************************/ @@ -32,7 +31,7 @@ static void discard_pbm_line(QIODevice *d) } while (res > 0 && buf[res-1] != '\n'); } -static int read_pbm_int(QIODevice *d, bool *ok) +static int read_pbm_int(QIODevice *d, bool *ok, int maxDigits = -1) { char c; int val = -1; @@ -41,7 +40,7 @@ static int read_pbm_int(QIODevice *d, bool *ok) for (;;) { if (!d->getChar(&c)) // end of file break; - digit = isdigit((uchar) c); + digit = QtMiscUtils::isAsciiDigit(c); if (val != -1) { if (digit) { const int cValue = c - '0'; @@ -50,6 +49,8 @@ static int read_pbm_int(QIODevice *d, bool *ok) } else { hasOverflow = true; } + if (maxDigits > 0 && --maxDigits == 0) + break; continue; } else { if (c == '#') // comment @@ -59,12 +60,14 @@ static int read_pbm_int(QIODevice *d, bool *ok) } if (digit) // first digit val = c - '0'; - else if (isspace((uchar) c)) + else if (ascii_isspace(c)) continue; else if (c == '#') discard_pbm_line(d); else break; + if (maxDigits > 0 && --maxDigits == 0) + break; } if (val < 0) *ok = false; @@ -77,7 +80,7 @@ static bool read_pbm_header(QIODevice *device, char& type, int& w, int& h, int& if (device->read(buf, 3) != 3) // read P[1-6]<white-space> return false; - if (!(buf[0] == 'P' && isdigit((uchar) buf[1]) && isspace((uchar) buf[2]))) + if (!(buf[0] == 'P' && QtMiscUtils::isAsciiDigit(buf[1]) && ascii_isspace(buf[2]))) return false; type = buf[1]; @@ -213,7 +216,7 @@ static bool read_pbm_body(QIODevice *device, char type, int w, int h, int mcc, Q b = 0; for (int i=0; i<8; i++) { if (i < bitsLeft) - b = (b << 1) | (read_pbm_int(device, &ok) & 1); + b = (b << 1) | (read_pbm_int(device, &ok, 1) & 1); else b = (b << 1) | (0 & 1); // pad it our self if we need to } @@ -265,13 +268,12 @@ static bool read_pbm_body(QIODevice *device, char type, int w, int h, int mcc, Q return true; } -static bool write_pbm_image(QIODevice *out, const QImage &sourceImage, const QByteArray &sourceFormat) +static bool write_pbm_image(QIODevice *out, const QImage &sourceImage, QByteArrayView sourceFormat) { QByteArray str; QImage image = sourceImage; - QByteArray format = sourceFormat; + const QByteArrayView format = sourceFormat.left(3); // ignore RAW part - format = format.left(3); // ignore RAW part bool gray = format == "pgm"; if (format == "pbm") { @@ -341,7 +343,7 @@ static bool write_pbm_image(QIODevice *out, const QImage &sourceImage, const QBy qsizetype bpl = qsizetype(w) * (gray ? 1 : 3); uchar *buf = new uchar[bpl]; if (image.format() == QImage::Format_Indexed8) { - QList<QRgb> color = image.colorTable(); + const QList<QRgb> color = image.colorTable(); for (uint y=0; y<h; y++) { const uchar *b = image.constScanLine(y); uchar *p = buf; |