1 Star 0 Fork 5

edwardewang/qt5-qtimageformats

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
0003-Implement-support-for-file-memory-mapping-for-tiff-r.patch 2.60 KB
一键复制 编辑 原始数据 按行查看 历史
edwardewang 提交于 2024-01-17 17:14 . Upgrade to 5.15.11
From a733ebf966d4fad62ba05d90d29e36668eb5ce68 Mon Sep 17 00:00:00 2001
From: Eirik Aavitsland <[email protected]>
Date: Wed, 4 Jan 2023 18:06:57 +0100
Subject: [PATCH 03/10] Implement support for file memory mapping for tiff
reading
libtiff will by default attempt to establish a memory map for reading
a tiff file. Implement the callbacks to establish this in Qt's tiff
handler, since this will save data copying, particularly in the case
where the input file is already in memory as a resource or QBuffer.
Also, this makes sure that QTiffHandler utilizes libtiff's default,
and hence best tested, code path for tiff decoding. Specifically, it
avoids a hitting a bug that breaks reading of certain tiffs in the
newly released libtiff version 4.5.0.
Pick-to: 6.5 6.4 6.2 5.15
Change-Id: Id6a746546e069da9910cacd4a4996c669c72cbab
Reviewed-by: Dmitry Shachnev <[email protected]>
Reviewed-by: Allan Sandfeld Jensen <[email protected]>
(cherry picked from commit cd92d76e9dcd98f4fc974c796453459779393bdc)
---
.../imageformats/tiff/qtiffhandler.cpp | 26 +++++++++++++++++--
1 file changed, 24 insertions(+), 2 deletions(-)
diff --git a/src/plugins/imageformats/tiff/qtiffhandler.cpp b/src/plugins/imageformats/tiff/qtiffhandler.cpp
index b385273..79be154 100644
--- a/src/plugins/imageformats/tiff/qtiffhandler.cpp
+++ b/src/plugins/imageformats/tiff/qtiffhandler.cpp
@@ -44,6 +44,8 @@
#include <qglobal.h>
#include <qvariant.h>
#include <qvarlengtharray.h>
+#include <qbuffer.h>
+#include <qfiledevice.h>
extern "C" {
#include "tiffio.h"
@@ -92,13 +94,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));
}
--
2.43.0
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/EdwardElric233/qt5-qtimageformats.git
[email protected]:EdwardElric233/qt5-qtimageformats.git
EdwardElric233
qt5-qtimageformats
qt5-qtimageformats
master

搜索帮助