diff options
author | Liang Qi <liang.qi@qt.io> | 2017-10-04 10:41:19 +0200 |
---|---|---|
committer | Liang Qi <liang.qi@qt.io> | 2017-10-04 13:41:04 +0200 |
commit | bc5f45052fd8f9a5481a37a6a4d55c7f6cbf037d (patch) | |
tree | 2c20e6c42ccd008e431a8d485450713883eacbb5 /src/gui | |
parent | b8947e9194f0f88f464448ac51f6a05113d36a33 (diff) | |
parent | 3faf8f4d48abd982be8470786cc5f61372519722 (diff) |
Merge remote-tracking branch 'origin/5.9' into 5.10
Conflicts:
src/corelib/global/qconfig-bootstrapped.h
src/corelib/global/qglobal.h
src/corelib/tools/qcryptographichash.cpp
src/corelib/tools/qcryptographichash.h
src/corelib/tools/qmessageauthenticationcode.cpp
src/plugins/platforms/windows/qwindowswindow.h
tests/auto/gui/kernel/qwindow/BLACKLIST
tests/auto/widgets/itemviews/qitemdelegate/BLACKLIST
Change-Id: Ib68112de985a3d714c2071f47c10e907e4f0229a
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/configure.json | 5 | ||||
-rw-r--r-- | src/gui/image/qbmphandler.cpp | 55 |
2 files changed, 25 insertions, 35 deletions
diff --git a/src/gui/configure.json b/src/gui/configure.json index 17b4c3df2c..0a591e110c 100644 --- a/src/gui/configure.json +++ b/src/gui/configure.json @@ -443,6 +443,7 @@ "xcb/xfixes.h", "xcb/xcb_image.h", "xcb/xcb_keysyms.h", + "xcb/xinerama.h", "xcb/sync.h", "xcb/randr.h", "xcb/shm.h" @@ -460,8 +461,8 @@ }, "sources": [ { "type": "pkgConfig", - "args": "xcb xcb-shm xcb-sync xcb-xfixes xcb-randr xcb-image xcb-keysyms xcb-icccm xcb-shape" }, - "-lxcb -lxcb-shm -lxcb-sync -lxcb-xfixes -lxcb-randr -lxcb-image -lxcb-keysyms -lxcb-icccm -lxcb-shape" + "args": "xcb xcb-shm xcb-sync xcb-xfixes xcb-xinerama xcb-randr xcb-image xcb-keysyms xcb-icccm xcb-shape" }, + "-lxcb -lxcb-shm -lxcb-sync -lxcb-xfixes -lxcb-xinerama -lxcb-randr -lxcb-image -lxcb-keysyms -lxcb-icccm -lxcb-shape" ] }, "xcb_xlib": { diff --git a/src/gui/image/qbmphandler.cpp b/src/gui/image/qbmphandler.cpp index c232a84e4f..1ec45a7491 100644 --- a/src/gui/image/qbmphandler.cpp +++ b/src/gui/image/qbmphandler.cpp @@ -562,27 +562,12 @@ static bool read_dib_body(QDataStream &s, const BMP_INFOHDR &bi, qint64 offset, } // this is also used in qmime_win.cpp -bool qt_write_dib(QDataStream &s, QImage image) +bool qt_write_dib(QDataStream &s, const QImage &image, int bpl, int bpl_bmp, int nbits) { - int nbits; - int bpl_bmp; - int bpl = image.bytesPerLine(); - QIODevice* d = s.device(); if (!d->isWritable()) return false; - if (image.depth() == 8 && image.colorCount() <= 16) { - bpl_bmp = (((bpl+1)/2+3)/4)*4; - nbits = 4; - } else if (image.depth() == 32) { - bpl_bmp = ((image.width()*24+31)/32)*4; - nbits = 24; - } else { - bpl_bmp = bpl; - nbits = image.depth(); - } - BMP_INFOHDR bi; bi.biSize = BMP_WIN; // build info header bi.biWidth = image.width(); @@ -617,9 +602,6 @@ bool qt_write_dib(QDataStream &s, QImage image) delete [] color_table; } - if (image.format() == QImage::Format_MonoLSB) - image = image.convertToFormat(QImage::Format_Mono); - int y; if (nbits == 1 || nbits == 8) { // direct output @@ -769,21 +751,17 @@ bool QBmpHandler::read(QImage *image) bool QBmpHandler::write(const QImage &img) { - if (m_format == DibFormat) { - QDataStream dibStream(device()); - dibStream.setByteOrder(QDataStream::LittleEndian); // Intel byte order - return qt_write_dib(dibStream, img); - } - QImage image; switch (img.format()) { case QImage::Format_Mono: - case QImage::Format_MonoLSB: case QImage::Format_Indexed8: case QImage::Format_RGB32: case QImage::Format_ARGB32: image = img; break; + case QImage::Format_MonoLSB: + image = img.convertToFormat(QImage::Format_Mono); + break; case QImage::Format_Alpha8: case QImage::Format_Grayscale8: image = img.convertToFormat(QImage::Format_Indexed8); @@ -796,21 +774,32 @@ bool QBmpHandler::write(const QImage &img) break; } - QIODevice *d = device(); - QDataStream s(d); - BMP_FILEHDR bf; + int nbits; int bpl_bmp; - int bpl = image.bytesPerLine(); + // Calculate a minimum bytes-per-line instead of using whatever value this QImage is using internally. + int bpl = ((image.width() * image.depth() + 31) >> 5) << 2; - // Code partially repeated in qt_write_dib if (image.depth() == 8 && image.colorCount() <= 16) { bpl_bmp = (((bpl+1)/2+3)/4)*4; - } else if (image.depth() == 32) { + nbits = 4; + } else if (image.depth() == 32) { bpl_bmp = ((image.width()*24+31)/32)*4; + nbits = 24; } else { bpl_bmp = bpl; + nbits = image.depth(); } + if (m_format == DibFormat) { + QDataStream dibStream(device()); + dibStream.setByteOrder(QDataStream::LittleEndian); // Intel byte order + return qt_write_dib(dibStream, img, bpl, bpl_bmp, nbits); + } + + QIODevice *d = device(); + QDataStream s(d); + BMP_FILEHDR bf; + // Intel byte order s.setByteOrder(QDataStream::LittleEndian); @@ -825,7 +814,7 @@ bool QBmpHandler::write(const QImage &img) s << bf; // write image - return qt_write_dib(s, image); + return qt_write_dib(s, image, bpl, bpl_bmp, nbits); } bool QBmpHandler::supportsOption(ImageOption option) const |