summaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/imageformats/tga/qtgafile.cpp15
-rw-r--r--src/plugins/imageformats/tiff/CMakeLists.txt100
-rw-r--r--src/plugins/imageformats/tiff/qtiffhandler.cpp27
-rw-r--r--src/plugins/imageformats/webp/CMakeLists.txt1
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