diff options
Diffstat (limited to 'src/plugins/imageformats')
-rw-r--r-- | src/plugins/imageformats/tga/qtgafile.cpp | 15 | ||||
-rw-r--r-- | src/plugins/imageformats/tiff/CMakeLists.txt | 100 | ||||
-rw-r--r-- | src/plugins/imageformats/tiff/qtiffhandler.cpp | 27 | ||||
-rw-r--r-- | src/plugins/imageformats/webp/CMakeLists.txt | 1 |
4 files changed, 138 insertions, 5 deletions
diff --git a/src/plugins/imageformats/tga/qtgafile.cpp b/src/plugins/imageformats/tga/qtgafile.cpp index 5d086c6..3961c16 100644 --- a/src/plugins/imageformats/tga/qtgafile.cpp +++ b/src/plugins/imageformats/tga/qtgafile.cpp @@ -220,9 +220,18 @@ QImage QTgaFile::readImage() int offset = mHeader[IdLength]; // Mostly always zero - // Even in TrueColor files a color pallette may be present - if (mHeader[ColorMapType] == 1) - offset += littleEndianInt(&mHeader[CMapLength]) * littleEndianInt(&mHeader[CMapDepth]); + // Even in TrueColor files a color palette may be present so we have to check it here + // even we only support image type 2 (= uncompressed true-color image) + if (mHeader[ColorMapType] == 1) { + int cmapDepth = mHeader[CMapDepth]; + if (cmapDepth == 15) // 15 bit is stored as 16 bit + ignoring the highest bit (no alpha) + cmapDepth = 16; + if (cmapDepth != 16 && cmapDepth != 24 && cmapDepth != 32) { + mErrorMessage = tr("Invalid color map depth (%1)").arg(cmapDepth); + return {}; + } + offset += littleEndianInt(&mHeader[CMapLength]) * cmapDepth / 8; + } mDevice->seek(HeaderSize + offset); diff --git a/src/plugins/imageformats/tiff/CMakeLists.txt b/src/plugins/imageformats/tiff/CMakeLists.txt new file mode 100644 index 0000000..d38a8ec --- /dev/null +++ b/src/plugins/imageformats/tiff/CMakeLists.txt @@ -0,0 +1,100 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from tiff.pro. + +##################################################################### +## QTiffPlugin Plugin: +##################################################################### + +# special case begin +# Handle the conditional finding of either system zlib or qt zlib. +if(NOT QT_FEATURE_system_zlib) + find_package(Qt6 COMPONENTS ZlibPrivate) +elseif(NOT TARGET WrapZLIB::WrapZLIB) + qt_find_package(WrapZLIB PROVIDED_TARGETS WrapZLIB::WrapZLIB) +endif() +# special case end + +qt_internal_add_plugin(QTiffPlugin + OUTPUT_NAME qtiff + PLUGIN_TYPE imageformats + SOURCES + main.cpp + qtiffhandler.cpp qtiffhandler_p.h + LIBRARIES + Qt::Core + Qt::Gui +) + +#### Keys ignored in scope 1:.:.:tiff.pro:<TRUE>: +# OTHER_FILES = "tiff.json" +# QT_FOR_CONFIG = "imageformats-private" + +## Scopes: +##################################################################### + +qt_internal_extend_target(QTiffPlugin CONDITION QT_FEATURE_system_tiff + LIBRARIES + TIFF::TIFF +) + +qt_internal_extend_target(QTiffPlugin CONDITION NOT QT_FEATURE_system_tiff + SOURCES + ../../../3rdparty/libtiff/libtiff/tif_aux.c + ../../../3rdparty/libtiff/libtiff/tif_close.c + ../../../3rdparty/libtiff/libtiff/tif_codec.c + ../../../3rdparty/libtiff/libtiff/tif_color.c + ../../../3rdparty/libtiff/libtiff/tif_compress.c + ../../../3rdparty/libtiff/libtiff/tif_dir.c + ../../../3rdparty/libtiff/libtiff/tif_dirinfo.c + ../../../3rdparty/libtiff/libtiff/tif_dirread.c + ../../../3rdparty/libtiff/libtiff/tif_dirwrite.c + ../../../3rdparty/libtiff/libtiff/tif_dumpmode.c + ../../../3rdparty/libtiff/libtiff/tif_error.c + ../../../3rdparty/libtiff/libtiff/tif_extension.c + ../../../3rdparty/libtiff/libtiff/tif_fax3.c + ../../../3rdparty/libtiff/libtiff/tif_fax3sm.c + ../../../3rdparty/libtiff/libtiff/tif_flush.c + ../../../3rdparty/libtiff/libtiff/tif_getimage.c + ../../../3rdparty/libtiff/libtiff/tif_hash_set.c + ../../../3rdparty/libtiff/libtiff/tif_luv.c + ../../../3rdparty/libtiff/libtiff/tif_lzw.c + ../../../3rdparty/libtiff/libtiff/tif_next.c + ../../../3rdparty/libtiff/libtiff/tif_open.c + ../../../3rdparty/libtiff/libtiff/tif_packbits.c + ../../../3rdparty/libtiff/libtiff/tif_pixarlog.c + ../../../3rdparty/libtiff/libtiff/tif_predict.c + ../../../3rdparty/libtiff/libtiff/tif_print.c + ../../../3rdparty/libtiff/libtiff/tif_read.c + ../../../3rdparty/libtiff/libtiff/tif_strip.c + ../../../3rdparty/libtiff/libtiff/tif_swab.c + ../../../3rdparty/libtiff/libtiff/tif_thunder.c + ../../../3rdparty/libtiff/libtiff/tif_tile.c + ../../../3rdparty/libtiff/libtiff/tif_version.c + ../../../3rdparty/libtiff/libtiff/tif_warning.c + ../../../3rdparty/libtiff/libtiff/tif_write.c + ../../../3rdparty/libtiff/libtiff/tif_zip.c + INCLUDE_DIRECTORIES + ../../../3rdparty/libtiff/libtiff +) + +qt_internal_extend_target(QTiffPlugin CONDITION WIN32 AND NOT QT_FEATURE_system_tiff + SOURCES + ../../../3rdparty/libtiff/libtiff/tif_win32.c +) + +qt_internal_extend_target(QTiffPlugin CONDITION UNIX AND NOT QT_FEATURE_system_tiff + SOURCES + ../../../3rdparty/libtiff/libtiff/tif_unix.c +) + +qt_internal_extend_target(QTiffPlugin CONDITION QT_FEATURE_system_zlib AND NOT QT_FEATURE_system_tiff + LIBRARIES + WrapZLIB::WrapZLIB +) + +qt_internal_extend_target(QTiffPlugin CONDITION NOT QT_FEATURE_system_tiff AND NOT QT_FEATURE_system_zlib + LIBRARIES + Qt::ZlibPrivate +) diff --git a/src/plugins/imageformats/tiff/qtiffhandler.cpp b/src/plugins/imageformats/tiff/qtiffhandler.cpp index ac8956c..f0dfe7f 100644 --- a/src/plugins/imageformats/tiff/qtiffhandler.cpp +++ b/src/plugins/imageformats/tiff/qtiffhandler.cpp @@ -43,6 +43,9 @@ #include <qdebug.h> #include <qimage.h> #include <qglobal.h> +#include <qbuffer.h> +#include <qfiledevice.h> + extern "C" { #include "tiffio.h" } @@ -90,13 +93,33 @@ toff_t qtiffSizeProc(thandle_t fd) return static_cast<QIODevice *>(fd)->size(); } -int qtiffMapProc(thandle_t /*fd*/, tdata_t* /*pbase*/, toff_t* /*psize*/) +int qtiffMapProc(thandle_t fd, void **base, toff_t *size) { + QIODevice *device = static_cast<QIODevice *>(fd); + + QFileDevice *file = qobject_cast<QFileDevice *>(device); + if (file) { + *base = file->map(0, file->size()); + if (*base != nullptr) { + *size = file->size(); + return 1; + } + } else { + QBuffer *buf = qobject_cast<QBuffer *>(device); + if (buf) { + *base = const_cast<char *>(buf->data().constData()); + *size = buf->size(); + return 1; + } + } return 0; } -void qtiffUnmapProc(thandle_t /*fd*/, tdata_t /*base*/, toff_t /*size*/) +void qtiffUnmapProc(thandle_t fd, void *base, toff_t /*size*/) { + QFileDevice *file = qobject_cast<QFileDevice *>(static_cast<QIODevice *>(fd)); + if (file && base) + file->unmap(static_cast<uchar *>(base)); } diff --git a/src/plugins/imageformats/webp/CMakeLists.txt b/src/plugins/imageformats/webp/CMakeLists.txt index 25aa0c9..fbbcc1c 100644 --- a/src/plugins/imageformats/webp/CMakeLists.txt +++ b/src/plugins/imageformats/webp/CMakeLists.txt @@ -30,6 +30,7 @@ qt_internal_extend_target(QWebpPlugin CONDITION QT_FEATURE_system_webp qt_internal_extend_target(QWebpPlugin CONDITION NOT QT_FEATURE_system_webp SOURCES ../../../3rdparty/libwebp/sharpyuv/sharpyuv.c + ../../../3rdparty/libwebp/sharpyuv/sharpyuv_cpu.c ../../../3rdparty/libwebp/sharpyuv/sharpyuv_csp.c ../../../3rdparty/libwebp/sharpyuv/sharpyuv_dsp.c ../../../3rdparty/libwebp/sharpyuv/sharpyuv_gamma.c |