Compare commits

..
31 Commits
Author SHA1 Message Date
Nicolas Fella 8509ac7444 Update dependency version to 6.29.0 2026-08-07 22:22:28 +02:00
Daniel Novomeský a11c1feb23 autotests: add AVIF and JXL with animation 2026-08-06 13:08:53 +02:00
Mirco Miranda 2e199eea80 KRA/ORA: merged in a single plugin and added metadata support
- ORA/KRA: merged in a single plugin (KRA)
- ORA: removed standalone plugin
- KRA: use of logging category
- KRA: add metadata support by processing the embedded `documentinfo.xml`
- Improved signature lookup (see MR !17) and added test case
2026-07-29 07:42:42 +02:00
Mirco MirandaandMirco Miranda 516750e6fc Readme: update supported formats 2026-07-28 09:44:58 +02:00
Mirco Miranda 687914f2e7 Test Readme: added JPG support 2026-07-28 07:19:12 +02:00
Daniel Novomeský 5c3bdcddf2 avif: enable decoding of files with invalid EXIF metadata
When 1st parsing ends with invalid EXIF payload error,
we try 2nd time again while ignoring the EXIF metadata.

Dropped support for legacy 0.x libavif versions,
libavif 1.0.0+ is now required for the AVIF support.
2026-07-27 12:33:25 +00:00
Daniel Novomeský abc2ac2de1 autotests: allow JPG as test source
In special cases, JPG with fuzziness value
can be used instead of big PNG files.
2026-07-27 12:33:25 +00:00
Mirco Miranda 66d7d7c154 QOI: check format only in lowercase 2026-07-27 10:05:33 +02:00
Daniel Novomeský 65b4b14d6f ossfuzz: optimize build, collect all HEIF subformats
Upgrade OpenEXR
2026-07-24 16:02:37 +02:00
Daniel Novomeský a4db968c60 fix HEIC writetest 2026-07-23 10:42:33 +02:00
Daniel Novomeský 27c621901d ossfuzz: enable uncompressed codec in libheif
libheif uses ZLIB and Brotli for the uncompressed codec,
so the libheif will be built after libjxl,
which installs brotli libraries.
2026-07-22 17:21:27 +02:00
Daniel Novomeský 7ec1170c86 heif: declare read support for HIF
image/heif MIME type uses following three file extensions:
heif, heic, hif.

Adding HIF into plugin's list.
2026-07-20 18:23:20 +02:00
Mirco MirandaandMirco Miranda c21b50d699 EXIF: add support for Windows Explorer tags 2026-07-20 07:27:34 +02:00
Daniel Novomeský a0825fe5cb heif: increase Maximum number of child boxes limit 2026-07-18 12:59:37 +02:00
Kyle Alexander BuanandDaniel Novomeský ad0fb9dde4 HEIF: keep reader callback table alive
libheif retains the heif_reader pointer after
heif_context_read_from_reader returns. The callback table was scoped
to the non-sequential branch and could be destroyed before
tiled image decoding used it from worker threads.

Give the callback table static storage duration.

BUG: 523105
2026-07-17 10:49:21 +02:00
Daniel Novomeský 2faf524b85 More HEIF-related tests.
New option `KIMAGEFORMATS_HEIC_TEST` for testing images with
HEVC codec only.

Existing option `KIMAGEFORMATS_HEIF_TEST` is used for testing other
possible (mostly quite rare) codecs that might be used by HEIF
images - uncompressed, deflate, zlib, brotli, jpeg.
2026-07-14 08:36:37 +00:00
Daniel Novomeský c748c6c2c6 heif: AVCI saving, JPEG in HEIF read support
Following compromises were chosen to ensure that saved AVCI
is decodable using OpenH264 decoder:
8-bit only, YUV420 subsampling, lossy compression,
large images encoded via image grid.
2026-07-14 08:36:37 +00:00
Mirco Miranda 7e14d5616f IFF: support for ZIP compressed RGFX 2026-07-13 10:13:23 +02:00
Nicolas Fella 215305fa4b Update version to 6.29.0 2026-07-03 13:39:38 +02:00
Mirco Miranda e6bc1af5e4 EXR: added support for additional metadata 2026-06-26 09:05:48 +02:00
Nicolas Fella 23e6195b9f Update dependency version to 6.28.0 2026-06-24 20:56:02 +02:00
Mirco Miranda 18322b0659 JP2: limits the maximum number of channels to the global value defined 2026-06-22 08:36:49 +02:00
Daniel Novomeský a5c6239138 ossfuzz: replace INITGUID with __ANSI__
It is more correct way how JXR libraries should be used.
2026-06-21 14:45:09 +02:00
Daniel Novomeský 081975807c JXR: remove INITGUID define
The define caused linking problems on Windows
2026-06-19 16:55:27 +02:00
Daniel Novomeský b58b865ba4 ossfuzz: update libaom and libavif 2026-06-19 16:37:27 +02:00
Mirco MirandaandMirco Miranda 8768a8cf97 HEIF: use heif_reader for random access devices 2026-06-12 08:18:19 +02:00
Akseli Lahtinen 7edf807082 avif: If we only have single image, return false at jumpToNextImage
We were errorneously returning true here, as we do not have any more
images to jump to. If we only have one image, return false.

This avoids the avif handler getting stuck in a loop with only single images.

BUG: 521200
FIXED-IN: 6.28
2026-06-10 15:05:06 +03:00
Mirco MirandaandMirco Miranda 52045ff84d Added limit to maximum number of channels 2026-06-10 04:33:37 +02:00
Laurent Montel 8bfdef2e48 GIT_SILENT: Bump kf ecm_set_disabled_deprecation_versions. Make sure that it compiles fine without kf 6.27 deprecated methods 2026-06-09 06:45:33 +02:00
Mirco MirandaandMirco Miranda ec640db10e Improve buffer memory management 2026-06-06 01:28:31 +02:00
Nicolas Fella 86b0fe60c5 Update version to 6.28.0 2026-06-05 18:02:51 +02:00
153 changed files with 1115 additions and 478 deletions
+1 -1
View File
@@ -7,5 +7,5 @@ Dependencies:
Options: Options:
test-before-installing: True test-before-installing: True
require-passing-tests-on: ['Linux', 'FreeBSD', 'Windows'] require-passing-tests-on: ['Linux', 'FreeBSD', 'Windows']
cmake-options: "-DKIMAGEFORMATS_WITH_KNOWN_CRASHES_JXR=ON -DKIMAGEFORMATS_HEIF=ON -DKIMAGEFORMATS_HEIF_TEST:STRING=OFF -DKIMAGEFORMATS_HEJ2_TEST:STRING=OFF -DKIMAGEFORMATS_AVCI_TEST:STRING=OFF" cmake-options: "-DKIMAGEFORMATS_WITH_KNOWN_CRASHES_JXR=ON -DKIMAGEFORMATS_HEIF=ON -DKIMAGEFORMATS_HEIC_TEST:STRING=OFF -DKIMAGEFORMATS_HEIF_TEST:STRING=OFF -DKIMAGEFORMATS_HEJ2_TEST:STRING=OFF -DKIMAGEFORMATS_AVCI_TEST:STRING=OFF"
per-test-timeout: 90 per-test-timeout: 90
+9 -10
View File
@@ -1,11 +1,11 @@
cmake_minimum_required(VERSION 3.29) cmake_minimum_required(VERSION 3.29)
set(KF_VERSION "6.27.0") # handled by release scripts set(KF_VERSION "6.29.0") # handled by release scripts
set(KF_DEP_VERSION "6.27.0") # handled by release scripts set(KF_DEP_VERSION "6.29.0") # handled by release scripts
project(KImageFormats VERSION ${KF_VERSION}) project(KImageFormats VERSION ${KF_VERSION})
include(FeatureSummary) include(FeatureSummary)
find_package(ECM 6.27.0 NO_MODULE) find_package(ECM 6.29.0 NO_MODULE)
set_package_properties(ECM PROPERTIES TYPE REQUIRED DESCRIPTION "Extra CMake Modules." URL "https://commits.kde.org/extra-cmake-modules") set_package_properties(ECM PROPERTIES TYPE REQUIRED DESCRIPTION "Extra CMake Modules." URL "https://commits.kde.org/extra-cmake-modules")
feature_summary(WHAT REQUIRED_PACKAGES_NOT_FOUND FATAL_ON_MISSING_REQUIRED_PACKAGES) feature_summary(WHAT REQUIRED_PACKAGES_NOT_FOUND FATAL_ON_MISSING_REQUIRED_PACKAGES)
@@ -53,10 +53,7 @@ set_package_properties(OpenEXR PROPERTIES
PURPOSE "Required for the QImage plugin for OpenEXR images" PURPOSE "Required for the QImage plugin for OpenEXR images"
) )
find_package(libavif 0.8.2 CONFIG QUIET) find_package(libavif 1 CONFIG)
if(NOT libavif_FOUND)
find_package(libavif 1 CONFIG)
endif()
set_package_properties(libavif PROPERTIES set_package_properties(libavif PROPERTIES
TYPE OPTIONAL TYPE OPTIONAL
PURPOSE "Required for the QImage plugin for AVIF images" PURPOSE "Required for the QImage plugin for AVIF images"
@@ -65,8 +62,10 @@ set_package_properties(libavif PROPERTIES
option(KIMAGEFORMATS_DDS "Enable plugin for DDS format" ON) option(KIMAGEFORMATS_DDS "Enable plugin for DDS format" ON)
option(KIMAGEFORMATS_HEIF "Enable plugin for HEIF format" OFF) option(KIMAGEFORMATS_HEIF "Enable plugin for HEIF format" OFF)
set(KIMAGEFORMATS_HEIF_TEST "ALL" CACHE STRING "Enable HEIF tests: OFF, READ_ONLY, ALL") set(KIMAGEFORMATS_HEIC_TEST "ALL" CACHE STRING "Enable HEIC tests: OFF, READ_ONLY, ALL")
set_property(CACHE KIMAGEFORMATS_HEIF_TEST PROPERTY STRINGS "OFF" "READ_ONLY" "ALL") set_property(CACHE KIMAGEFORMATS_HEIC_TEST PROPERTY STRINGS "OFF" "READ_ONLY" "ALL")
set(KIMAGEFORMATS_HEIF_TEST "ALL" CACHE STRING "Enable HEIF tests: OFF, ALL")
set_property(CACHE KIMAGEFORMATS_HEIF_TEST PROPERTY STRINGS "OFF" "ALL")
set(KIMAGEFORMATS_HEJ2_TEST "ALL" CACHE STRING "Enable HEJ2 tests: OFF, READ_ONLY, ALL") set(KIMAGEFORMATS_HEJ2_TEST "ALL" CACHE STRING "Enable HEJ2 tests: OFF, READ_ONLY, ALL")
set_property(CACHE KIMAGEFORMATS_HEJ2_TEST PROPERTY STRINGS "OFF" "READ_ONLY" "ALL") set_property(CACHE KIMAGEFORMATS_HEJ2_TEST PROPERTY STRINGS "OFF" "READ_ONLY" "ALL")
set(KIMAGEFORMATS_AVCI_TEST "ALL" CACHE STRING "Enable AVCI tests: OFF, ALL") set(KIMAGEFORMATS_AVCI_TEST "ALL" CACHE STRING "Enable AVCI tests: OFF, ALL")
@@ -107,7 +106,7 @@ add_feature_info(LibJXR LibJXR_FOUND "required for the QImage plugin for JPEG XR
ecm_set_disabled_deprecation_versions( ecm_set_disabled_deprecation_versions(
QT 6.11.0 QT 6.11.0
KF 6.26.0 KF 6.27.0
) )
add_subdirectory(src) add_subdirectory(src)
+24 -16
View File
@@ -31,13 +31,13 @@ The following image formats have read-only support:
The following image formats have read and write support: The following image formats have read and write support:
- AV1 Image File Format (avif) - AV1 Image File Format (avif, avifs<sup>1</sup>)
- DirectDraw Surface (dds) - DirectDraw Surface (dds)
- Encapsulated PostScript (eps) - Encapsulated PostScript (eps)
- High Efficiency Image File Format (heif) - High Efficiency Image File Format (avci<sup>2</sup>, heic<sup>2</sup>, heif<sup>2</sup>, hej2<sup>2</sup>, hif<sup>2</sup>)
- JPEG 2000 (jp2, j2k, jpf) - JPEG 2000 (jp2, j2k, jpf<sup>1</sup>)
- JPEG XL (jxl) - JPEG XL (jxl)
- JPEG XR (jxr) - JPEG XR (jxr, hdp<sup>1</sup>, wdp<sup>1</sup>)
- OpenEXR (exr) - OpenEXR (exr)
- Personal Computer Exchange (pcx) - Personal Computer Exchange (pcx)
- Quite OK Image format (qoi) - Quite OK Image format (qoi)
@@ -45,6 +45,11 @@ The following image formats have read and write support:
- Softimage PIC (pic) - Softimage PIC (pic)
- Targa (tga): supports more formats than Qt's version - Targa (tga): supports more formats than Qt's version
Footnotes:
1. Read only support.
2. It depends on the HEIF plugins installed.
## Contributing ## Contributing
See the [`QImageIOPlugin`](https://doc.qt.io/qt-6/qimageioplugin.html) See the [`QImageIOPlugin`](https://doc.qt.io/qt-6/qimageioplugin.html)
@@ -146,6 +151,7 @@ About the image:
scanned. scanned.
- `HostComputer`: The computer and/or operating system in use at the time - `HostComputer`: The computer and/or operating system in use at the time
of image creation. of image creation.
- `Keywords`: Keywords, separated by semicolons, that represent the image.
- `Latitude`: Floating-point number indicating the latitude in degrees - `Latitude`: Floating-point number indicating the latitude in degrees
north of the equator (e.g. 27.717). north of the equator (e.g. 27.717).
- `Longitude`: Floating-point number indicating the longitude in degrees - `Longitude`: Floating-point number indicating the longitude in degrees
@@ -154,6 +160,8 @@ About the image:
without milliseconds (e.g. 2024-03-23T15:30:43). This value should be without milliseconds (e.g. 2024-03-23T15:30:43). This value should be
updated every time the image is saved. updated every time the image is saved.
- `Owner`: Name of the owner of the image. - `Owner`: Name of the owner of the image.
- `Rating`: Integer number indicating the image rating (usually between 1
and 5).
- `Software`: Name and version number of the software package(s) used to - `Software`: Name and version number of the software package(s) used to
create the image. create the image.
- `Speed`: Floating-point number indicating the speed of GPS receiver - `Speed`: Floating-point number indicating the speed of GPS receiver
@@ -357,12 +365,18 @@ plugin:
**If you are interested in compiling the plugin without running the tests, **If you are interested in compiling the plugin without running the tests,
also use the following string options:** also use the following string options:**
- `KIMAGEFORMATS_HEIF_TEST` to change the behaviour of HEIF tests. Set to - `KIMAGEFORMATS_HEIC_TEST` to change the behaviour of HEIC tests. Set to
`"OFF"` (no test at all) or `"READ_ONLY"` (run read tests only). `"OFF"` (no test at all) or `"READ_ONLY"` (run read tests only).
Required codecs: HEVC / H.265.
- `KIMAGEFORMATS_HEIF_TEST` to change the behaviour of HEIF tests. Set to
`"OFF"` (no test at all).
Required codecs: uncompressed, deflate, zlib, brotli, jpeg.
- `KIMAGEFORMATS_HEJ2_TEST` to change the behaviour of HEJ2 tests. Set to - `KIMAGEFORMATS_HEJ2_TEST` to change the behaviour of HEJ2 tests. Set to
`"OFF"` (no test at all) or `"READ_ONLY"` (run read tests only).. `"OFF"` (no test at all) or `"READ_ONLY"` (run read tests only).
Required codecs: JPEG 2000.
- `KIMAGEFORMATS_AVCI_TEST` to change the behaviour of AVCI tests. Set to - `KIMAGEFORMATS_AVCI_TEST` to change the behaviour of AVCI tests. Set to
`"OFF"` (no test at all). `"OFF"` (no test at all).
Required codecs: Advanced Video Coding / H.264.
### The EXR plugin ### The EXR plugin
@@ -415,7 +429,7 @@ The plugin supports the following image data:
with color map only. with color map only.
- FORM IMAG (Compact Disc-Interactive): It supports CLut4, CLut7, CLut8, Rle7 - FORM IMAG (Compact Disc-Interactive): It supports CLut4, CLut7, CLut8, Rle7
and DYuv formats. and DYuv formats.
- FORM RGFX: It supports uncompressed images only. - FORM RGFX: It supports uncompressed and ZIP compressed images.
- FORM DEEP: It supports uncompressed, RLE and TVDC images. - FORM DEEP: It supports uncompressed, RLE and TVDC images.
- FOR4 CIMG (Maya Image File Format): It supports 24/48-bit RGB and 32/64-bit - FOR4 CIMG (Maya Image File Format): It supports 24/48-bit RGB and 32/64-bit
RGBA images. RGBA images.
@@ -479,16 +493,10 @@ plugin:
this format an hack is activated to guarantee total compatibility of the this format an hack is activated to guarantee total compatibility of the
plugin with Windows. plugin with Windows.
### The KRA plugin ### The KRA and ORA plugin
The KRA format is a ZIP archive containing image data. In particular, the Both KRA and ORA formats are ZIP archives containing image data. Specifically,
rendered image in PNG format is saved in the root: the plugin reads this the rendered PNG image is saved in the root directory: the plugin reads this
image.
### The ORA plugin
The ORA format is a ZIP archive containing image data. In particular, the
rendered image in PNG format is saved in the root: the plugin reads this
image. image.
### The PSD plugin ### The PSD plugin
+10 -4
View File
@@ -119,15 +119,21 @@ if (TARGET avif)
endif() endif()
if (LibHeif_FOUND) if (LibHeif_FOUND)
if (KIMAGEFORMATS_HEIF_TEST STREQUAL "ALL" OR KIMAGEFORMATS_HEIF_TEST STREQUAL "READ_ONLY") if (KIMAGEFORMATS_HEIC_TEST STREQUAL "ALL" OR KIMAGEFORMATS_HEIC_TEST STREQUAL "READ_ONLY")
kimageformats_read_tests( kimageformats_read_tests(
heif heic
) )
endif() endif()
if (KIMAGEFORMATS_HEIF_TEST STREQUAL "ALL") if (KIMAGEFORMATS_HEIC_TEST STREQUAL "ALL")
# because the plug-ins use RGB->YUV conversion which sometimes results in 1 value difference. # because the plug-ins use RGB->YUV conversion which sometimes results in 1 value difference.
kimageformats_write_tests(FUZZ 1 kimageformats_write_tests(FUZZ 1
heif-nodatacheck-lossless heic-nodatacheck-lossless
)
endif()
if (KIMAGEFORMATS_HEIF_TEST STREQUAL "ALL")
kimageformats_read_tests(
heif
) )
endif() endif()
+5 -1
View File
@@ -23,7 +23,11 @@ e.g. PSD plugin).
The reading tests are mainly based on comparing the image read by the plugin The reading tests are mainly based on comparing the image read by the plugin
with a template in a known and working format. For this reason, the template with a template in a known and working format. For this reason, the template
formats chosen are those distributed by the Qt project: PNG in the first formats chosen are those distributed by the Qt project: PNG in the first
instance and TIFF for image formats not supported by PNG (e.g. CMYK images). instance, TIFF for image formats not supported by PNG (e.g. CMYK images) and,
as a last choice, lossy JPG for large images.
> [!important]
> Keep the size of individual test images on the order of a few tens of KiB.
Some image options such as `QImageIOHandler::Size`, Some image options such as `QImageIOHandler::Size`,
`QImageIOHandler::ImageFormat` and `QImageIOHandler::ImageTransformation` are `QImageIOHandler::ImageFormat` and `QImageIOHandler::ImageTransformation` are
+55 -58
View File
@@ -26,8 +26,8 @@ export LDFLAGS
# build zstd # build zstd
cd $SRC/zstd cd $SRC/zstd
cmake -S build/cmake -DBUILD_SHARED_LIBS=OFF cmake -G Ninja -S build/cmake -DBUILD_SHARED_LIBS=OFF -DZSTD_BUILD_PROGRAMS=OFF -DBUILD_TESTING=OFF
make install -j$(nproc) ninja install
# Build zlib # Build zlib
cd $SRC/zlib cd $SRC/zlib
@@ -70,13 +70,13 @@ cmake --install .
# Build extra-cmake-modules # Build extra-cmake-modules
cd $SRC/extra-cmake-modules cd $SRC/extra-cmake-modules
cmake . -DBUILD_TESTING=OFF cmake -G Ninja . -DBUILD_TESTING=OFF -DBUILD_DOC=OFF
make install -j$(nproc) ninja install
cd $SRC/karchive cd $SRC/karchive
rm -rf poqm rm -rf poqm
cmake . -DBUILD_SHARED_LIBS=OFF -DBUILD_TESTING=OFF -DCMAKE_INSTALL_PREFIX=/usr/local cmake -G Ninja . -DBUILD_SHARED_LIBS=OFF -DBUILD_TESTING=OFF -DCMAKE_INSTALL_PREFIX=/usr/local
make install -j$(nproc) ninja install
# Build JXRlib # Build JXRlib
cd $SRC/jxrlib cd $SRC/jxrlib
@@ -101,31 +101,28 @@ cd $SRC/aom
mkdir build.libavif mkdir build.libavif
cd build.libavif cd build.libavif
extra_libaom_flags='-DAOM_MAX_ALLOCABLE_MEMORY=536870912 -DDO_RANGE_CHECK_CLAMP=1' extra_libaom_flags='-DAOM_MAX_ALLOCABLE_MEMORY=536870912 -DDO_RANGE_CHECK_CLAMP=1'
cmake -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DENABLE_EXAMPLES=0 -DENABLE_TESTDATA=0 -DENABLE_TESTS=0 -DENABLE_TOOLS=0 -DCONFIG_PIC=1 -DAOM_TARGET_CPU=generic -DCONFIG_SIZE_LIMIT=1 -DDECODE_HEIGHT_LIMIT=12288 -DDECODE_WIDTH_LIMIT=12288 -DAOM_EXTRA_C_FLAGS="${extra_libaom_flags}" -DAOM_EXTRA_CXX_FLAGS="${extra_libaom_flags}" .. cmake -G Ninja -DBUILD_SHARED_LIBS=0 -DENABLE_DOCS=0 -DENABLE_EXAMPLES=0 -DENABLE_TESTDATA=0 -DENABLE_TESTS=0 -DENABLE_TOOLS=0 -DCONFIG_PIC=1 -DAOM_TARGET_CPU=generic -DCONFIG_SIZE_LIMIT=1 -DDECODE_HEIGHT_LIMIT=12288 -DDECODE_WIDTH_LIMIT=12288 -DAOM_EXTRA_C_FLAGS="${extra_libaom_flags}" -DAOM_EXTRA_CXX_FLAGS="${extra_libaom_flags}" ..
make -j$(nproc) ninja install
make install -j$(nproc)
# Build libavif # Build libavif
cd $SRC/libavif cd $SRC/libavif
ln -s "$SRC/aom" "$SRC/libavif/ext/" ln -s "$SRC/aom" "$SRC/libavif/ext/"
mkdir build mkdir build
cd build cd build
CFLAGS="$CFLAGS -fPIC" cmake -DBUILD_SHARED_LIBS=OFF -DAVIF_ENABLE_WERROR=OFF -DAVIF_CODEC_AOM=LOCAL -DAVIF_LIBYUV=OFF .. CFLAGS="$CFLAGS -fPIC" cmake -G Ninja -DBUILD_SHARED_LIBS=OFF -DAVIF_ENABLE_WERROR=OFF -DAVIF_CODEC_AOM=LOCAL -DAVIF_LIBYUV=OFF ..
make -j$(nproc) ninja
# Build libde265 # Build libde265
cd $SRC/libde265 cd $SRC/libde265
cmake -DBUILD_SHARED_LIBS=OFF -DDISABLE_SSE=ON . cmake -G Ninja -DBUILD_SHARED_LIBS=OFF -DENABLE_SDL=OFF -DENABLE_SIMD=OFF -DENABLE_AVX2=OFF -DENABLE_AVX512=OFF .
make -j$(nproc) ninja install
make install -j$(nproc)
# Build openjpeg # Build openjpeg
cd $SRC/openjpeg cd $SRC/openjpeg
mkdir build mkdir build
cd build cd build
cmake -DBUILD_SHARED_LIBS=OFF -DBUILD_STATIC_LIBS=ON -DBUILD_CODEC=OFF .. cmake -G Ninja -DBUILD_SHARED_LIBS=OFF -DBUILD_STATIC_LIBS=ON -DBUILD_CODEC=OFF ..
make -j$(nproc) ninja install
make install -j$(nproc)
# build openh264 # build openh264
cd $SRC/openh264 cd $SRC/openh264
@@ -135,9 +132,15 @@ make USE_ASM=No BUILDTYPE=Debug install-static -j$(nproc)
cd $SRC/openexr cd $SRC/openexr
mkdir _build mkdir _build
cd _build cd _build
cmake -DBUILD_SHARED_LIBS=OFF .. cmake -G Ninja -DBUILD_SHARED_LIBS=OFF -DBUILD_TESTING=OFF -DOPENEXR_BUILD_TOOLS=OFF -DOPENEXR_INSTALL_TOOLS=OFF -DOPENEXR_BUILD_EXAMPLES=OFF -DOPENEXR_TEST_LIBRARIES=OFF -DOPENEXR_TEST_TOOLS=OFF -DOPENEXR_TEST_PYTHON=OFF ..
make -j$(nproc) ninja install
make install -j$(nproc)
# Build libjxl
cd $SRC/libjxl
mkdir build
cd build
CXXFLAGS="$CXXFLAGS -DHWY_COMPILE_ONLY_SCALAR" cmake -G Ninja -DBUILD_SHARED_LIBS=OFF -DBUILD_TESTING=OFF -DJPEGXL_ENABLE_BENCHMARK=OFF -DJPEGXL_ENABLE_DOXYGEN=OFF -DJPEGXL_ENABLE_EXAMPLES=OFF -DJPEGXL_ENABLE_JNI=OFF -DJPEGXL_ENABLE_MANPAGES=OFF -DJPEGXL_ENABLE_OPENEXR=OFF -DJPEGXL_ENABLE_PLUGINS=OFF -DJPEGXL_ENABLE_SJPEG=OFF -DJPEGXL_ENABLE_SKCMS=ON -DJPEGXL_ENABLE_TCMALLOC=OFF -DJPEGXL_ENABLE_TOOLS=OFF -DJPEGXL_ENABLE_FUZZERS=OFF ..
ninja install
# Build libheif # Build libheif
cd $SRC/libheif cd $SRC/libheif
@@ -146,56 +149,50 @@ sed -i "s/static const int MAX_IMAGE_WIDTH = 32768;/static const int MAX_IMAGE_W
sed -i "s/static const int MAX_IMAGE_HEIGHT = 32768;/static const int MAX_IMAGE_HEIGHT = 8192;/g" libheif/security_limits.h sed -i "s/static const int MAX_IMAGE_HEIGHT = 32768;/static const int MAX_IMAGE_HEIGHT = 8192;/g" libheif/security_limits.h
mkdir build mkdir build
cd build cd build
cmake -DBUILD_SHARED_LIBS=OFF -DENABLE_PLUGIN_LOADING=OFF -DWITH_DAV1D=OFF -DWITH_EXAMPLES=OFF -DWITH_LIBDE265=ON -DWITH_RAV1E=OFF -DWITH_RAV1E_PLUGIN=OFF -DWITH_SvtEnc=OFF -DWITH_SvtEnc_PLUGIN=OFF -DWITH_X265=OFF -DWITH_OpenJPEG_DECODER=ON -DWITH_OpenH264_DECODER=ON .. cmake -G Ninja -DBUILD_SHARED_LIBS=OFF -DBUILD_TESTING=OFF -DENABLE_PLUGIN_LOADING=OFF -DWITH_EXAMPLES=OFF -DBUILD_DOCUMENTATION=OFF -DWITH_LIBSHARPYUV=OFF -DWITH_UNCOMPRESSED_CODEC=ON -DWITH_DAV1D=OFF -DWITH_EXAMPLES=OFF -DWITH_LIBDE265=ON -DWITH_RAV1E=OFF -DWITH_RAV1E_PLUGIN=OFF -DWITH_SvtEnc=OFF -DWITH_SvtEnc_PLUGIN=OFF -DWITH_X265=OFF -DWITH_X264=OFF -DWITH_OpenJPEG_DECODER=ON -DWITH_OpenH264_DECODER=ON ..
make -j$(nproc) ninja install
make install -j$(nproc)
# Build libjxl
cd $SRC/libjxl
mkdir build
cd build
CXXFLAGS="$CXXFLAGS -DHWY_COMPILE_ONLY_SCALAR" cmake -DBUILD_SHARED_LIBS=OFF -DBUILD_TESTING=OFF -DJPEGXL_ENABLE_BENCHMARK=OFF -DJPEGXL_ENABLE_DOXYGEN=OFF -DJPEGXL_ENABLE_EXAMPLES=OFF -DJPEGXL_ENABLE_JNI=OFF -DJPEGXL_ENABLE_JPEGLI=OFF -DJPEGXL_ENABLE_JPEGLI_LIBJPEG=OFF -DJPEGXL_ENABLE_MANPAGES=OFF -DJPEGXL_ENABLE_OPENEXR=OFF -DJPEGXL_ENABLE_PLUGINS=OFF -DJPEGXL_ENABLE_SJPEG=OFF -DJPEGXL_ENABLE_SKCMS=ON -DJPEGXL_ENABLE_TCMALLOC=OFF -DJPEGXL_ENABLE_TOOLS=OFF -DJPEGXL_ENABLE_FUZZERS=OFF ..
make -j$(nproc) jxl jxl_cms jxl_threads
cd $SRC/kimageformats cd $SRC/kimageformats
HANDLER_TYPES="ANIHandler ani HANDLER_TYPES="ani
QAVIFHandler avif avif
QDDSHandler dds dds
EXRHandler exr exr
FFHandler ff ff
HDRHandler hdr hdr
HEIFHandler heif heif
IFFHandler iff iff
JP2Handler jp2 jp2
QJpegXLHandler jxl jxl
JXRHandler jxr jxr
KraHandler kra kra
OraHandler ora pcx
PCXHandler pcx pfm
PFMHandler pfm pic
SoftimagePICHandler pic psd
PSDHandler psd pxr
PXRHandler pxr qoi
QOIHandler qoi ras
RASHandler ras raw
RAWHandler raw rgb
RGBHandler rgb sct
ScitexHandler sct tim
TIMHandler tim tga
TGAHandler tga xcf"
XCFHandler xcf"
echo "$HANDLER_TYPES" | while read class format; do echo "$HANDLER_TYPES" | while read format; do
( (
fuzz_target_name=kimgio_${format}_fuzzer fuzz_target_name=kimgio_${format}_fuzzer
/usr/libexec/moc $SRC/kimageformats/src/imageformats/$format.cpp -o $format.moc /usr/libexec/moc $SRC/kimageformats/src/imageformats/$format.cpp -o $format.moc
header=`ls $SRC/kimageformats/src/imageformats/$format*.h` header=`ls $SRC/kimageformats/src/imageformats/$format*.h`
/usr/libexec/moc $header -o moc_`basename $header .h`.cpp /usr/libexec/moc $header -o moc_`basename $header .h`.cpp
$CXX $CXXFLAGS $LDFLAGS -fPIC -DHANDLER=$class -std=c++17 autotests/ossfuzz/kimgio_fuzzer.cc $SRC/kimageformats/src/imageformats/$format.cpp $SRC/kimageformats/src/imageformats/scanlineconverter.cpp $SRC/kimageformats/src/imageformats/microexif.cpp $SRC/kimageformats/src/imageformats/chunks.cpp -o $OUT/$fuzz_target_name -DJXL_STATIC_DEFINE -DJXL_THREADS_STATIC_DEFINE -DJXL_CMS_STATIC_DEFINE -DINITGUID -I $SRC/kimageformats/src/imageformats/ -I $SRC/libavif/include/ -I $SRC/libjxl/build/lib/include/ -I $SRC/libjxl/lib/include/ -I /usr/local/include/OpenEXR/ -I /usr/local/include/KF6/KArchive/ -I /usr/local/include/openjpeg-2.5 -I /usr/local/include/Imath -I $SRC/jxrlib/common/include -I $SRC/jxrlib/jxrgluelib -I $SRC/jxrlib/image/sys -I /usr/include/QtCore/ -I /usr/include/QtGui/ -I . $SRC/libavif/build/libavif.a /usr/local/lib/libheif.a /usr/local/lib/libde265.a /usr/local/lib/libopenh264.a $SRC/aom/build.libavif/libaom.a $SRC/libjxl/build/lib/libjxl_threads.a $SRC/libjxl/build/lib/libjxl.a $SRC/libjxl/build/lib/libjxl_cms.a $SRC/libjxl/build/third_party/highway/libhwy.a $SRC/libjxl/build/third_party/brotli/libbrotlidec.a $SRC/libjxl/build/third_party/brotli/libbrotlienc.a $SRC/libjxl/build/third_party/brotli/libbrotlicommon.a -lQt6Gui -lQt6Core -lQt6BundledLibpng -lQt6BundledHarfbuzz -lm -lQt6BundledPcre2 -ldl -lpthread $LIB_FUZZING_ENGINE /usr/local/lib/libz.a /usr/local/lib/x86_64-linux-gnu/libKF6Archive.a /usr/local/lib/libz.a /usr/local/lib/libraw.a /usr/local/lib/libOpenEXR-3_3.a /usr/local/lib/libIex-3_3.a /usr/local/lib/libImath-3_1.a /usr/local/lib/libIlmThread-3_3.a /usr/local/lib/libOpenEXRCore-3_3.a /usr/local/lib/libOpenEXRUtil-3_3.a /usr/local/lib/libopenjp2.a /usr/local/lib/libzstd.a $SRC/jxrlib/build/libjxrglue.a $SRC/jxrlib/build/libjpegxr.a /usr/local/lib/liblzma.a /usr/local/lib/libbz2.a -lclang_rt.builtins $CXX $CXXFLAGS $LDFLAGS -fPIC -DKIMG_FUZZER_${format}=1 -std=c++17 autotests/ossfuzz/kimgio_fuzzer.cc $SRC/kimageformats/src/imageformats/$format.cpp $SRC/kimageformats/src/imageformats/scanlineconverter.cpp $SRC/kimageformats/src/imageformats/microexif.cpp $SRC/kimageformats/src/imageformats/chunks.cpp -o $OUT/$fuzz_target_name -DJXL_STATIC_DEFINE -DJXL_THREADS_STATIC_DEFINE -DJXL_CMS_STATIC_DEFINE -D__ANSI__ -I $SRC/kimageformats/src/imageformats/ -I $SRC/libavif/include/ -I $SRC/libjxl/build/lib/include/ -I $SRC/libjxl/lib/include/ -I /usr/local/include/OpenEXR/ -I /usr/local/include/KF6/KArchive/ -I /usr/local/include/openjpeg-2.5 -I /usr/local/include/Imath -I $SRC/jxrlib/common/include -I $SRC/jxrlib/jxrgluelib -I $SRC/jxrlib/image/sys -I /usr/include/QtCore/ -I /usr/include/QtGui/ -I . $SRC/libavif/build/libavif.a /usr/local/lib/libheif.a /usr/local/lib/libde265.a /usr/local/lib/libopenh264.a $SRC/aom/build.libavif/libaom.a $SRC/libjxl/build/lib/libjxl_threads.a $SRC/libjxl/build/lib/libjxl.a $SRC/libjxl/build/lib/libjxl_cms.a $SRC/libjxl/build/third_party/highway/libhwy.a $SRC/libjxl/build/third_party/brotli/libbrotlidec.a $SRC/libjxl/build/third_party/brotli/libbrotlienc.a $SRC/libjxl/build/third_party/brotli/libbrotlicommon.a -lQt6Gui -lQt6Core -lQt6BundledLibpng -lQt6BundledHarfbuzz -lm -lQt6BundledPcre2 -ldl -lpthread $LIB_FUZZING_ENGINE /usr/local/lib/libz.a /usr/local/lib/x86_64-linux-gnu/libKF6Archive.a /usr/local/lib/libz.a /usr/local/lib/libraw.a /usr/local/lib/libOpenEXR-3_4.a /usr/local/lib/libIex-3_4.a /usr/local/lib/libImath-3_2.a /usr/local/lib/libIlmThread-3_4.a /usr/local/lib/libOpenEXRCore-3_4.a /usr/local/lib/libOpenEXRUtil-3_4.a /usr/local/lib/libopenjp2.a /usr/local/lib/libzstd.a $SRC/jxrlib/build/libjxrglue.a $SRC/jxrlib/build/libjpegxr.a /usr/local/lib/liblzma.a /usr/local/lib/libbz2.a -lclang_rt.builtins
# -lclang_rt.builtins in the previous line is a temporary workaround to avoid a linker error "undefined reference to __truncsfhf2". Investigate why this is needed here, but not anywhere else, and possibly remove it. # -lclang_rt.builtins in the previous line is a temporary workaround to avoid a linker error "undefined reference to __truncsfhf2". Investigate why this is needed here, but not anywhere else, and possibly remove it.
find . -name "*.${format}" | zip -q $OUT/${fuzz_target_name}_seed_corpus.zip -@ find . -name "*.${format}" | zip -q $OUT/${fuzz_target_name}_seed_corpus.zip -@
) )
done done
# Manually add other supported extensions to HEIF seed corpus
find . -type f \( -name "*.avci" -o -name "*.heic" -o -name "*.hej2" \) | zip -q $OUT/kimgio_heif_fuzzer_seed_corpus.zip -@
+56 -4
View File
@@ -23,7 +23,7 @@
Usage: Usage:
python infra/helper.py build_image kimageformats python infra/helper.py build_image kimageformats
python infra/helper.py build_fuzzers --sanitizer undefined|address|memory kimageformats python infra/helper.py build_fuzzers --sanitizer undefined|address|memory kimageformats
python infra/helper.py run_fuzzer kimageformats kimgio_[ani|avif|dds|exr|ff|hdr|heif|iff|jp2|jxl|jxr|kra|ora|pcx|pfm|pic|psd|pxr|qoi|ras|raw|rgb|sct|tim|tga|xcf]_fuzzer python infra/helper.py run_fuzzer kimageformats kimgio_[ani|avif|dds|exr|ff|hdr|heif|iff|jp2|jxl|jxr|kra|pcx|pfm|pic|psd|pxr|qoi|ras|raw|rgb|sct|tim|tga|xcf]_fuzzer
*/ */
#include <QBuffer> #include <QBuffer>
@@ -31,32 +31,84 @@
#include <QImage> #include <QImage>
#include <QImageReader> #include <QImageReader>
#if defined KIMG_FUZZER_ani
#include "ani_p.h" #include "ani_p.h"
#define HANDLER ANIHandler
#elif defined KIMG_FUZZER_avif
#include "avif_p.h" #include "avif_p.h"
#define HANDLER QAVIFHandler
#elif defined KIMG_FUZZER_dds
#include "dds_p.h" #include "dds_p.h"
#define HANDLER QDDSHandler
#elif defined KIMG_FUZZER_exr
#include "exr_p.h" #include "exr_p.h"
#define HANDLER EXRHandler
#elif defined KIMG_FUZZER_ff
#include "ff_p.h" #include "ff_p.h"
#define HANDLER FFHandler
#elif defined KIMG_FUZZER_hdr
#include "hdr_p.h" #include "hdr_p.h"
#define HANDLER HDRHandler
#elif defined KIMG_FUZZER_heif
#include "heif_p.h" #include "heif_p.h"
#define HANDLER HEIFHandler
#elif defined KIMG_FUZZER_iff
#include "iff_p.h" #include "iff_p.h"
#define HANDLER IFFHandler
#elif defined KIMG_FUZZER_jp2
#include "jp2_p.h" #include "jp2_p.h"
#define HANDLER JP2Handler
#elif defined KIMG_FUZZER_jxl
#include "jxl_p.h" #include "jxl_p.h"
#define HANDLER QJpegXLHandler
#elif defined KIMG_FUZZER_jxr
#include "jxr_p.h" #include "jxr_p.h"
#include "kra.h" #define HANDLER JXRHandler
#include "ora.h" #elif defined KIMG_FUZZER_kra
#include "kra_p.h"
#define HANDLER KraHandler
#elif defined KIMG_FUZZER_pcx
#include "pcx_p.h" #include "pcx_p.h"
#define HANDLER PCXHandler
#elif defined KIMG_FUZZER_pfm
#include "pfm_p.h" #include "pfm_p.h"
#define HANDLER PFMHandler
#elif defined KIMG_FUZZER_pic
#include "pic_p.h" #include "pic_p.h"
#define HANDLER SoftimagePICHandler
#elif defined KIMG_FUZZER_psd
#include "psd_p.h" #include "psd_p.h"
#define HANDLER PSDHandler
#elif defined KIMG_FUZZER_pxr
#include "pxr_p.h" #include "pxr_p.h"
#define HANDLER PXRHandler
#elif defined KIMG_FUZZER_qoi
#include "qoi_p.h" #include "qoi_p.h"
#define HANDLER QOIHandler
#elif defined KIMG_FUZZER_ras
#include "ras_p.h" #include "ras_p.h"
#define HANDLER RASHandler
#elif defined KIMG_FUZZER_raw
#include "raw_p.h" #include "raw_p.h"
#define HANDLER RAWHandler
#elif defined KIMG_FUZZER_rgb
#include "rgb_p.h" #include "rgb_p.h"
#define HANDLER RGBHandler
#elif defined KIMG_FUZZER_sct
#include "sct_p.h" #include "sct_p.h"
#define HANDLER ScitexHandler
#elif defined KIMG_FUZZER_tim
#include "tim_p.h" #include "tim_p.h"
#define HANDLER TIMHandler
#elif defined KIMG_FUZZER_tga
#include "tga_p.h" #include "tga_p.h"
#define HANDLER TGAHandler
#elif defined KIMG_FUZZER_xcf
#include "xcf_p.h" #include "xcf_p.h"
#define HANDLER XCFHandler
#else
#error "KIMG_FUZZER_format not defined!"
#endif
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
{ {
@@ -65,7 +117,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
QImageReader::setAllocationLimit(512); QImageReader::setAllocationLimit(512);
QImageIOHandler* handler = new HANDLER(); QImageIOHandler *handler = new HANDLER();
QImage i; QImage i;
QBuffer b; QBuffer b;
+4 -4
View File
@@ -27,14 +27,14 @@ apt-get update && \
git clone --depth 1 https://github.com/madler/zlib.git git clone --depth 1 https://github.com/madler/zlib.git
git clone --depth 1 -b v1.5.7 https://github.com/facebook/zstd.git git clone --depth 1 -b v1.5.7 https://github.com/facebook/zstd.git
wget https://sourceware.org/pub/bzip2/bzip2-1.0.8.tar.gz wget https://sourceware.org/pub/bzip2/bzip2-1.0.8.tar.gz
git clone https://github.com/tukaani-project/xz.git git clone --depth 1 https://github.com/tukaani-project/xz.git
git clone --depth 1 --branch=RB-3.3 https://github.com/AcademySoftwareFoundation/openexr.git git clone --depth 1 --branch=RB-3.4 https://github.com/AcademySoftwareFoundation/openexr.git
git clone --depth 1 -b master https://invent.kde.org/frameworks/extra-cmake-modules.git git clone --depth 1 -b master https://invent.kde.org/frameworks/extra-cmake-modules.git
git clone --depth 1 --branch=dev git://code.qt.io/qt/qtbase.git git clone --depth 1 --branch=dev git://code.qt.io/qt/qtbase.git
git clone --depth 1 --branch=dev git://code.qt.io/qt/qttools.git git clone --depth 1 --branch=dev git://code.qt.io/qt/qttools.git
git clone --depth 1 -b master https://invent.kde.org/frameworks/karchive.git git clone --depth 1 -b master https://invent.kde.org/frameworks/karchive.git
git clone --depth 1 -b v3.13.1 https://aomedia.googlesource.com/aom git clone --depth 1 -b v3.14.1 https://aomedia.googlesource.com/aom
git clone --depth 1 -b v1.3.0 https://github.com/AOMediaCodec/libavif.git git clone --depth 1 -b v1.4.2 https://github.com/AOMediaCodec/libavif.git
git clone --depth 1 https://github.com/strukturag/libde265.git git clone --depth 1 https://github.com/strukturag/libde265.git
git clone --depth 1 -b v2.5.4 https://github.com/uclouvain/openjpeg.git git clone --depth 1 -b v2.5.4 https://github.com/uclouvain/openjpeg.git
git clone --depth 1 https://github.com/strukturag/libheif.git git clone --depth 1 https://github.com/strukturag/libheif.git
Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

@@ -0,0 +1,7 @@
[
{
"fileName": "invalid-exif.jpg",
"fuzziness": 30,
"description": "Minimum fuzziness value to pass the test on all architectures."
}
]
Binary file not shown.

After

Width:  |  Height:  |  Size: 366 KiB

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.
+7
View File
@@ -0,0 +1,7 @@
[
{
"fileName" : "jpeg.png",
"fuzziness" : 1,
"description" : "Minimum fuzziness value to pass the test on all architectures."
}
]
Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.
@@ -0,0 +1,5 @@
[
{
"fileName" : "sv5_idx8_rgx.png"
}
]
Binary file not shown.
@@ -0,0 +1,5 @@
[
{
"fileName" : "sv5_rgb16_rgx.png"
}
]
Binary file not shown.
@@ -0,0 +1,5 @@
[
{
"fileName" : "sv5_rgb32_rgx.png"
}
]
Binary file not shown.
@@ -0,0 +1,5 @@
[
{
"fileName" : "sv5_rgb8_rgx.png"
}
]
Binary file not shown.
@@ -0,0 +1,5 @@
[
{
"fileName" : "sv5_rgba16_rgx.png"
}
]
Binary file not shown.
@@ -0,0 +1,5 @@
[
{
"fileName" : "sv5_rgba32_rgx.png"
}
]
Binary file not shown.
@@ -0,0 +1,5 @@
[
{
"fileName" : "sv5_rgba8_rgx.png"
}
]
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.
+8
View File
@@ -12,6 +12,14 @@
"key" : "ModificationDate", "key" : "ModificationDate",
"value" : "2025-01-05T10:18:16" "value" : "2025-01-05T10:18:16"
}, },
{
"key" : "Keywords",
"value" : "kde;w11"
},
{
"key" : "Rating",
"value" : "4"
},
{ {
"key" : "Software" , "key" : "Software" ,
"value" : "GIMP 3.0.0-RC2" "value" : "GIMP 3.0.0-RC2"
Binary file not shown.
+8
View File
@@ -59,6 +59,14 @@
{ {
"key" : "Model", "key" : "Model",
"value" : "KImageFormats" "value" : "KImageFormats"
},
{
"key" : "Keywords",
"value" : "broacast;test;kde"
},
{
"key" : "Rating",
"value" : "5"
} }
], ],
"resolution" : { "resolution" : {
+19
View File
@@ -0,0 +1,19 @@
[
{
"fileName" : "src.png",
"metadata" : [
{
"key" : "CreationDate",
"value" : "2016-01-27T10:40:16"
},
{
"key" : "ModificationDate",
"value" : "2016-01-27T10:41:28"
},
{
"key" : "Author" ,
"value" : "Boudewijn Rempt"
}
]
}
]
+15
View File
@@ -0,0 +1,15 @@
[
{
"fileName" : "src.png",
"metadata" : [
{
"key" : "CreationDate",
"value" : "2016-01-27T10:40:16"
},
{
"key" : "ModificationDate",
"value" : "2026-07-16T07:00:36"
}
]
}
]
Binary file not shown.
+10 -13
View File
@@ -14,7 +14,7 @@
#include <QMetaEnum> #include <QMetaEnum>
#include <QVersionNumber> #include <QVersionNumber>
static QJsonObject searchObject(const QFileInfo& file) static QJsonObject searchObject(const QFileInfo &file)
{ {
auto fi = QFileInfo(QStringLiteral("%1.json").arg(file.filePath())); auto fi = QFileInfo(QStringLiteral("%1.json").arg(file.filePath()));
if (!fi.exists()) { if (!fi.exists()) {
@@ -56,17 +56,15 @@ static QJsonObject searchObject(const QFileInfo& file)
return {}; return {};
} }
TemplateImage::TemplateImage(const QFileInfo &fi)
TemplateImage::TemplateImage(const QFileInfo &fi) : : m_fi(fi)
m_fi(fi)
{ {
} }
bool TemplateImage::isTemplate() const bool TemplateImage::isTemplate() const
{ {
auto list = suffixes(); auto list = suffixes();
for (auto&& suffix : list) { for (auto &&suffix : list) {
if (!m_fi.suffix().compare(suffix, Qt::CaseInsensitive)) if (!m_fi.suffix().compare(suffix, Qt::CaseInsensitive))
return true; return true;
} }
@@ -87,7 +85,7 @@ bool TemplateImage::skipSequentialDeviceTest() const
return obj.value("skipSequential").toBool(); return obj.value("skipSequential").toBool();
} }
QFileInfo TemplateImage::compareImage(TestFlags &flags, QString& comment) const QFileInfo TemplateImage::compareImage(TestFlags &flags, QString &comment) const
{ {
auto fi = jsonImage(flags, comment); auto fi = jsonImage(flags, comment);
if ((flags & TestFlag::SkipTest) == TestFlag::SkipTest) { if ((flags & TestFlag::SkipTest) == TestFlag::SkipTest) {
@@ -99,7 +97,7 @@ QFileInfo TemplateImage::compareImage(TestFlags &flags, QString& comment) const
return legacyImage(); return legacyImage();
} }
bool TemplateImage::checkOptionaInfo(const QImage& image, QString& error) const bool TemplateImage::checkOptionaInfo(const QImage &image, QString &error) const
{ {
auto obj = searchObject(m_fi); auto obj = searchObject(m_fi);
if (obj.isEmpty()) { if (obj.isEmpty()) {
@@ -196,13 +194,13 @@ bool TemplateImage::perceptiveFuzziness() const
QStringList TemplateImage::suffixes() QStringList TemplateImage::suffixes()
{ {
return QStringList({"png", "tif", "tiff", "json"}); return QStringList({"png", "tif", "tiff", "json", "jpg"});
} }
QFileInfo TemplateImage::legacyImage() const QFileInfo TemplateImage::legacyImage() const
{ {
auto list = suffixes(); auto list = suffixes();
for (auto&& suffix : list) { for (auto &&suffix : list) {
auto fi = QFileInfo(QStringLiteral("%1/%2.%3").arg(m_fi.path(), m_fi.completeBaseName(), suffix)); auto fi = QFileInfo(QStringLiteral("%1/%2.%3").arg(m_fi.path(), m_fi.completeBaseName(), suffix));
if (fi.exists()) { if (fi.exists()) {
return fi; return fi;
@@ -211,7 +209,7 @@ QFileInfo TemplateImage::legacyImage() const
return {}; return {};
} }
QFileInfo TemplateImage::jsonImage(TestFlags &flags, QString& comment) const QFileInfo TemplateImage::jsonImage(TestFlags &flags, QString &comment) const
{ {
flags = TestFlag::None; flags = TestFlag::None;
@@ -224,7 +222,7 @@ QFileInfo TemplateImage::jsonImage(TestFlags &flags, QString& comment) const
auto unsupportedFormat = obj.value("unsupportedFormat").toBool(); auto unsupportedFormat = obj.value("unsupportedFormat").toBool();
comment = obj.value("comment").toString(); comment = obj.value("comment").toString();
if(obj.value("disableAutoTransform").toBool()) { if (obj.value("disableAutoTransform").toBool()) {
flags |= TestFlag::DisableAutotransform; flags |= TestFlag::DisableAutotransform;
} }
@@ -235,4 +233,3 @@ QFileInfo TemplateImage::jsonImage(TestFlags &flags, QString& comment) const
return QFileInfo(QStringLiteral("%1/%2").arg(m_fi.path(), name)); return QFileInfo(QStringLiteral("%1/%2").arg(m_fi.path(), name));
} }
+32
View File
@@ -32,6 +32,38 @@
{ {
"key" : "Model", "key" : "Model",
"value" : "KImageFormats" "value" : "KImageFormats"
},
{
"key" : "Comment",
"value" : "This is a test image from KImageFormats"
},
{
"key" : "Owner",
"value" : "KDE project"
},
{
"key" : "LensSerialNumber",
"value" : "LEN123456789"
},
{
"key" : "SerialNumber",
"value" : "CAM123456789"
},
{
"key" : "ISOSpeedRatings",
"value" : "102"
},
{
"key" : "ExposureTime",
"value" : "0.015"
},
{
"key" : "FNumber",
"value" : "1.85"
},
{
"key" : "FocalLength",
"value" : "6.81"
} }
], ],
"resolution" : { "resolution" : {
+8
View File
@@ -37,6 +37,14 @@
"key" : "Description", "key" : "Description",
"value" : "テレビ放送テスト映像。(TV broadcast test image.)" "value" : "テレビ放送テスト映像。(TV broadcast test image.)"
}, },
{
"key" : "Keywords",
"value" : "kde;test"
},
{
"key" : "Rating",
"value" : "5"
},
{ {
"key" : "Latitude", "key" : "Latitude",
"value" : "44.6478" "value" : "44.6478"
+4
View File
@@ -29,6 +29,10 @@
"key" : "Description", "key" : "Description",
"value" : "TV broadcast test image." "value" : "TV broadcast test image."
}, },
{
"key" : "Rating",
"value" : "4"
},
{ {
"key" : "Latitude", "key" : "Latitude",
"value" : "44.6478" "value" : "44.6478"

Some files were not shown because too many files have changed in this diff Show More