OSDN Git Service

avoid detaching QImage multiple times to set color table
authorIvailo Monev <xakepa10@gmail.com>
Thu, 19 Aug 2021 11:52:13 +0000 (14:52 +0300)
committerIvailo Monev <xakepa10@gmail.com>
Thu, 19 Aug 2021 11:55:32 +0000 (14:55 +0300)
Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
src/gui/image/qimage.cpp
src/gui/image/qpixmap_raster.cpp
src/gui/image/qpixmap_x11.cpp
src/gui/image/qpixmapdata.cpp
src/gui/image/qpnghandler.cpp
src/gui/image/qppmhandler.cpp
src/gui/image/qxbmhandler.cpp
src/gui/qguicommon_p.h

index f32d783..feb79c1 100644 (file)
@@ -37,6 +37,7 @@
 #include "qpaintengine_raster_p.h"
 #include "qimage_p.h"
 #include "qcorecommon_p.h"
+#include "qguicommon_p.h"
 #include "qx11info_x11.h"
 
 #include <ctype.h>
@@ -3242,12 +3243,7 @@ QImage QImage::createHeuristicMask(bool clipTight) const
     int h = height();
     QImage m(w, h, Format_MonoLSB);
     QIMAGE_SANITYCHECK_MEMORY(m);
-    QVector<QRgb> colortable;
-    // same as QColor(Qt::color0).rgba() and qRgba(255, 255, 255, 255)
-    colortable.append(4294967295);
-    // same as QColor(Qt::color1).rgba() and qRgba(0, 0, 0, 255)
-    colortable.append(4278190080);
-    m.setColorTable(colortable);
+    m.setColorTable(monoColorTable());
     m.fill(0xff);
 
     QRgb background = PIX(0,0);
index fd0fdd5..eeb3214 100644 (file)
@@ -63,9 +63,7 @@ void QRasterPixmapData::resize(int width, int height)
     is_null = (w <= 0 || h <= 0);
 
     if (pixelType() == BitmapType && !image.isNull()) {
-        image.setColorCount(2);
-        image.setColor(0, QColor(Qt::color0).rgba());
-        image.setColor(1, QColor(Qt::color1).rgba());
+        image.setColorTable(monoColorTable());
     }
 
     setSerialNumber(image.cacheKey() >> 32);
index 1595dea..20c31b4 100644 (file)
@@ -1604,9 +1604,7 @@ QImage QX11PixmapData::toImage(const XImage *xi, const QRect &rect) const
     }
 
     if (d == 1) {                                // bitmap
-        image.setColorCount(2);
-        image.setColor(0, qRgb(255,255,255));
-        image.setColor(1, qRgb(0,0,0));
+        image.setColorTable(monoColorTable());
     } else if (!trucol) {                        // pixmap with colormap
         QSTACKARRAY(uchar, use, 256);            // pixel-in-use table
         QSTACKARRAY(uchar, pix, 256);            // pixel translation table
index f8a8e96..48f194a 100644 (file)
@@ -177,9 +177,7 @@ QBitmap QPixmapData::mask() const
     if (mask.isNull()) // allocation failed
         return QBitmap();
 
-    mask.setColorCount(2);
-    mask.setColor(0, QColor(Qt::color0).rgba());
-    mask.setColor(1, QColor(Qt::color1).rgba());
+    mask.setColorTable(monoColorTable());
 
     const int bpl = mask.bytesPerLine();
     uchar *dest = mask.bits();
index 326459e..2ac3a39 100644 (file)
@@ -28,6 +28,7 @@
 #include "qvariant.h"
 #include "qvector.h"
 #include "qdrawhelper_p.h"
+#include "qguicommon_p.h"
 
 #include <zlib.h>
 #include <png.h>
@@ -166,9 +167,7 @@ void setup_qt(QImage& image, png_structp png_ptr, png_infop info_ptr, float scre
                 if (image.isNull())
                     return;
             }
-            image.setColorCount(2);
-            image.setColor(1, qRgb(0,0,0));
-            image.setColor(0, qRgb(255,255,255));
+            image.setColorTable(monoColorTable());
         } else if (bit_depth == 16 && png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) {
             png_set_expand(png_ptr);
             png_set_strip_16(png_ptr);
index 90032a5..0c7649d 100644 (file)
@@ -27,6 +27,7 @@
 #include "qvariant.h"
 #include "qvector.h"
 #include "qcorecommon_p.h"
+#include "qguicommon_p.h"
 
 #include <ctype.h>
 
@@ -221,10 +222,8 @@ static bool read_pbm_body(QIODevice *device, char type, int w, int h, int mcc, Q
         }
     }
 
-    if (nbits == 1) {                                // bitmap
-        outImage->setColorCount(2);
-        outImage->setColor(0, qRgb(255,255,255)); // white
-        outImage->setColor(1, qRgb(0,0,0));        // black
+    if (nbits == 1) {                                // black/white bitmap
+        outImage->setColorTable(monoColorTable());
     } else if (nbits == 8) {                        // graymap
         outImage->setColorCount(maxc+1);
         for (int i=0; i<=maxc; i++)
index 1e7f1df..2903ac5 100644 (file)
@@ -22,6 +22,7 @@
 #include "qplatformdefs.h"
 #include "qxbmhandler_p.h"
 #include "qcorecommon_p.h"
+#include "qguicommon_p.h"
 
 #ifndef QT_NO_IMAGEFORMAT_XBM
 
@@ -125,9 +126,7 @@ static bool read_xbm_body(QIODevice *device, int w, int h, QImage *outImage)
             return false;
     }
 
-    outImage->setColorCount(2);
-    outImage->setColor(0, qRgb(255,255,255));        // white
-    outImage->setColor(1, qRgb(0,0,0));                // black
+    outImage->setColorTable(monoColorTable());
 
     int           x = 0, y = 0;
     uchar *b = outImage->scanLine(0);
index 6906203..002e50d 100644 (file)
@@ -9,6 +9,16 @@
 
 QT_BEGIN_NAMESPACE
 
+inline static QVector<QRgb> monoColorTable()
+{
+    QVector<QRgb> colortable;
+    // same as QColor(Qt::color0).rgba() and qRgba(255, 255, 255, 255)
+    colortable.append(4294967295);
+    // same as QColor(Qt::color1).rgba() and qRgba(0, 0, 0, 255)
+    colortable.append(4278190080);
+    return colortable;
+}
+
 inline static QColor mergedColors(const QColor &colorA, const QColor &colorB, int factor = 50)
 {
     const int maxFactor = 100;