OSDN Git Service

read PNG rows directly into QImage allocated memory
authorIvailo Monev <xakepa10@gmail.com>
Tue, 15 Nov 2022 15:48:09 +0000 (17:48 +0200)
committerIvailo Monev <xakepa10@gmail.com>
Tue, 15 Nov 2022 15:55:11 +0000 (17:55 +0200)
KAT format is still faster, benchmark result:
********* Start testing of tst_QImageReader *********
Config: Using QTest library 4.12.0, Katie 4.12.0
PASS  : tst_QImageReader::initTestCase()
RESULT   : tst_QImageReader::readImage():"/home/smil3y/katie/tests/benchmarks/gui/image/qimagereader//images/bench.kat":
     449,473.586 CPU ticks per iteration (total: 224,736,793, iterations: 500)
RESULT   : tst_QImageReader::readImage():"/home/smil3y/katie/tests/benchmarks/gui/image/qimagereader//images/bench-large.kat":
     12,192,500.92 CPU ticks per iteration (total: 6,096,250,460, iterations: 500)
RESULT   : tst_QImageReader::readImage():"/home/smil3y/katie/tests/benchmarks/gui/image/qimagereader//images/bench-transparent.kat":
     4,553,239.292 CPU ticks per iteration (total: 2,276,619,646, iterations: 500)
RESULT   : tst_QImageReader::readImage():"/home/smil3y/katie/tests/benchmarks/gui/image/qimagereader//images/bench.png":
     1,847,145.64 CPU ticks per iteration (total: 923,572,823, iterations: 500)
RESULT   : tst_QImageReader::readImage():"/home/smil3y/katie/tests/benchmarks/gui/image/qimagereader//images/bench-large.png":
     19,422,744.28 CPU ticks per iteration (total: 9,711,372,141, iterations: 500)
RESULT   : tst_QImageReader::readImage():"/home/smil3y/katie/tests/benchmarks/gui/image/qimagereader//images/bench-transparent.png":
     12,389,194.51 CPU ticks per iteration (total: 6,194,597,257, iterations: 500)
RESULT   : tst_QImageReader::readImage():"/home/smil3y/katie/tests/benchmarks/gui/image/qimagereader//images/bench.ppm":
     653,286.280 CPU ticks per iteration (total: 326,643,140, iterations: 500)
RESULT   : tst_QImageReader::readImage():"/home/smil3y/katie/tests/benchmarks/gui/image/qimagereader//images/bench-large.ppm":
     2,728,198.060 CPU ticks per iteration (total: 1,364,099,030, iterations: 500)
RESULT   : tst_QImageReader::readImage():"/home/smil3y/katie/tests/benchmarks/gui/image/qimagereader//images/bench-transparent.ppm":
     2,455,954.036 CPU ticks per iteration (total: 1,227,977,018, iterations: 500)
RESULT   : tst_QImageReader::readImage():"/home/smil3y/katie/tests/benchmarks/gui/image/qimagereader//images/bench.svg":
     10,524,974.96 CPU ticks per iteration (total: 5,262,487,482, iterations: 500)
RESULT   : tst_QImageReader::readImage():"/home/smil3y/katie/tests/benchmarks/gui/image/qimagereader//images/bench.xpm":
     8,238,501.942 CPU ticks per iteration (total: 4,119,250,971, iterations: 500)
RESULT   : tst_QImageReader::readImage():"/home/smil3y/katie/tests/benchmarks/gui/image/qimagereader//images/bench-large.xpm":
     74,886,112.602 CPU ticks per iteration (total: 37,443,056,301, iterations: 500)
RESULT   : tst_QImageReader::readImage():"/home/smil3y/katie/tests/benchmarks/gui/image/qimagereader//images/bench-transparent.xpm":
     63,337,570.664 CPU ticks per iteration (total: 31,668,785,332, iterations: 500)
PASS  : tst_QImageReader::readImage()
RESULT   : tst_QImageReader::setScaledSize():"/home/smil3y/katie/tests/benchmarks/gui/image/qimagereader//images/bench.kat":
     1,950,330.16 CPU ticks per iteration (total: 975,165,082, iterations: 500)
RESULT   : tst_QImageReader::setScaledSize():"/home/smil3y/katie/tests/benchmarks/gui/image/qimagereader//images/bench-large.kat":
     13,089,959.61 CPU ticks per iteration (total: 6,544,979,808, iterations: 500)
RESULT   : tst_QImageReader::setScaledSize():"/home/smil3y/katie/tests/benchmarks/gui/image/qimagereader//images/bench-transparent.kat":
     5,447,284.922 CPU ticks per iteration (total: 2,723,642,461, iterations: 500)
RESULT   : tst_QImageReader::setScaledSize():"/home/smil3y/katie/tests/benchmarks/gui/image/qimagereader//images/bench.png":
     3,342,337.962 CPU ticks per iteration (total: 1,671,168,981, iterations: 500)
RESULT   : tst_QImageReader::setScaledSize():"/home/smil3y/katie/tests/benchmarks/gui/image/qimagereader//images/bench-large.png":
     20,326,863.998 CPU ticks per iteration (total: 10,163,431,999, iterations: 500)
RESULT   : tst_QImageReader::setScaledSize():"/home/smil3y/katie/tests/benchmarks/gui/image/qimagereader//images/bench-transparent.png":
     13,279,201.09 CPU ticks per iteration (total: 6,639,600,546, iterations: 500)
RESULT   : tst_QImageReader::setScaledSize():"/home/smil3y/katie/tests/benchmarks/gui/image/qimagereader//images/bench.ppm":
     1,498,119.28 CPU ticks per iteration (total: 749,059,644, iterations: 500)
RESULT   : tst_QImageReader::setScaledSize():"/home/smil3y/katie/tests/benchmarks/gui/image/qimagereader//images/bench-large.ppm":
     3,641,910.638 CPU ticks per iteration (total: 1,820,955,319, iterations: 500)
RESULT   : tst_QImageReader::setScaledSize():"/home/smil3y/katie/tests/benchmarks/gui/image/qimagereader//images/bench-transparent.ppm":
     3,370,265.894 CPU ticks per iteration (total: 1,685,132,947, iterations: 500)
RESULT   : tst_QImageReader::setScaledSize():"/home/smil3y/katie/tests/benchmarks/gui/image/qimagereader//images/bench.svg":
     9,147,455.174 CPU ticks per iteration (total: 4,573,727,587, iterations: 500)
RESULT   : tst_QImageReader::setScaledSize():"/home/smil3y/katie/tests/benchmarks/gui/image/qimagereader//images/bench.xpm":
     9,729,368.638 CPU ticks per iteration (total: 4,864,684,319, iterations: 500)
RESULT   : tst_QImageReader::setScaledSize():"/home/smil3y/katie/tests/benchmarks/gui/image/qimagereader//images/bench-large.xpm":
     75,966,954.086 CPU ticks per iteration (total: 37,983,477,043, iterations: 500)
RESULT   : tst_QImageReader::setScaledSize():"/home/smil3y/katie/tests/benchmarks/gui/image/qimagereader//images/bench-transparent.xpm":
     64,719,740.840 CPU ticks per iteration (total: 32,359,870,420, iterations: 500)
PASS  : tst_QImageReader::setScaledSize()
PASS  : tst_QImageReader::cleanupTestCase()
Totals: 4 passed, 0 failed, 0 skipped
********* Finished testing of tst_QImageReader *********

Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
src/gui/image/qpnghandler.cpp

index 2f8f55c..2531578 100644 (file)
@@ -135,8 +135,8 @@ bool QPngHandler::read(QImage *image)
     png_set_read_fn(png_ptr, this, qt_png_read);
     png_read_info(png_ptr, info_ptr);
 
-    png_uint_32 width;
-    png_uint_32 height;
+    png_uint_32 width = 0;
+    png_uint_32 height = 0;
     int bit_depth;
     int color_type;
     png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, 0, 0, 0);
@@ -181,20 +181,16 @@ bool QPngHandler::read(QImage *image)
 
     uchar *data = image->d->data;
     const int bpl = image->bytesPerLine();
-    png_byte **row_pointers = new png_bytep[height];
     for (uint y = 0; y < height; y++) {
-        row_pointers[y] = QFAST_SCAN_LINE(data, bpl, y);
+        png_read_row(png_ptr, QFAST_SCAN_LINE(data, bpl, y), NULL);
     }
 
-    png_read_image(png_ptr, row_pointers);
-
     image->d->dpmx = png_get_x_pixels_per_meter(png_ptr, info_ptr);
     image->d->dpmy = png_get_y_pixels_per_meter(png_ptr, info_ptr);
 
     png_read_end(png_ptr, end_info);
 
     png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
-    delete [] row_pointers;
 
     return true;
 }