View | Details | Raw Unified | Return to bug 218681 | Differences between
and this patch

Collapse All | Expand All

(-)Makefile (-39 / +37 lines)
Lines 2-12 Link Here
2
# $FreeBSD$
2
# $FreeBSD$
3
3
4
PORTNAME=	freeimage
4
PORTNAME=	freeimage
5
PORTVERSION=	3.16.0
5
PORTVERSION=	3.17.0
6
PORTREVISION=	2
7
# Version 3.17.0 is available, but does not build on i386 (and probably
8
# other 32-bit arches) without some not-quite-trivial patching.  If one
9
# decides to update the port, please make sure 32-bit builds are tested!
10
CATEGORIES=	graphics
6
CATEGORIES=	graphics
11
MASTER_SITES=	SF/${PORTNAME}/Source%20Distribution/${PORTVERSION}
7
MASTER_SITES=	SF/${PORTNAME}/Source%20Distribution/${PORTVERSION}
12
DISTNAME=	FreeImage${PORTVERSION:S/.//g}
8
DISTNAME=	FreeImage${PORTVERSION:S/.//g}
Lines 14-62 Link Here
14
MAINTAINER=	ports@FreeBSD.org
10
MAINTAINER=	ports@FreeBSD.org
15
COMMENT=	Simple C/C++ bitmap graphics library
11
COMMENT=	Simple C/C++ bitmap graphics library
16
12
17
USES=		dos2unix gmake zip
13
LICENSE=	FIPL
18
DOS2UNIX_FILES=	Source/LibOpenJPEG/opj_malloc.h \
14
LICENSE_NAME=	FreeImage Public License
19
		Source/LibRawLite/dcraw/dcraw.c \
15
LICENSE_FILE=	${WRKSRC}/license-fi.txt
20
		Source/LibRawLite/internal/dcraw_common.cpp
16
LICENSE_PERMS=	dist-mirror dist-sell pkg-mirror pkg-sell auto-accept
17
18
LIB_DEPENDS=	libopenjp2.so:graphics/openjpeg	\
19
		libpng16.so:graphics/png	\
20
		libraw.so:graphics/libraw	\
21
		libtiff.so:graphics/tiff	\
22
		libwebp.so:graphics/webp	\
23
		libHalf.so:graphics/ilmbase	\
24
		libjxrglue.so:graphics/libjxr	\
25
		libIlmImf.so:graphics/OpenEXR
26
27
USES=		dos2unix jpeg pkgconfig uidfix zip
28
DOS2UNIX_FILES=	TestAPI/testJPEG.cpp TestAPI/MainTestSuite.cpp
21
USE_LDCONFIG=	yes
29
USE_LDCONFIG=	yes
22
WRKSRC=		${WRKDIR}/FreeImage
30
WRKSRC=		${WRKDIR}/FreeImage
23
MAKE_ARGS=	CC="${CC}" CPP="${CPP}" CXX="${CXX}"
24
31
25
CFLAGS+=	-fexceptions -fvisibility=hidden
32
# Do not even extract the the ancient versions of the
26
CFLAGS_aarch64=	-fPIC
33
# various dependencies -- rely on their ports instead:
27
CFLAGS_amd64=	-fPIC
34
EXCLUDE=	LibJPEG LibJXR LibOpenJPEG LibPNG LibRawLite LibTIFF4	\
35
		LibWebP OpenEXR ZLib
36
EXTRACT_AFTER_ARGS=	-a \
37
	${EXCLUDE:C,^(.*)$,-x FreeImage/Source/\1/* -x FreeImage/Source/\1,} \
38
	-x FreeImage/Wrapper/Delphi*	\
39
	-x FreeImage/Wrapper/FreeImage.NET*	\
40
	-x FreeImage/Wrapper/VB6*
28
41
29
PLIST_FILES=	include/FreeImage.h \
42
MAKEFILE=	${FILESDIR}/BSDmakefile
30
		include/FreeImagePlus.h \
31
		lib/libfreeimage.a \
32
		lib/libfreeimage-${PORTVERSION}.so \
33
		lib/libfreeimage.so.3 \
34
		lib/libfreeimage.so \
35
		lib/libfreeimageplus.a \
36
		lib/libfreeimageplus-${PORTVERSION}.so \
37
		lib/libfreeimageplus.so.3 \
38
		lib/libfreeimageplus.so
39
43
40
.include <bsd.port.options.mk>
44
.include <bsd.port.options.mk>
41
45
42
.if ${ARCH} == amd64 || ${ARCH} == powerpc
46
do-configure:
43
USES+=		compiler:c++0x
47
	${LN} -sf ${FILESDIR}/BSDmakefile.Source ${WRKSRC}/Source/BSDmakefile
44
.endif
48
	${LN} -sf ${FILESDIR}/BSDmakefile.FreeImagePlus ${WRKSRC}/Wrapper/FreeImagePlus/BSDmakefile
49
	${LN} -sf ${FILESDIR}/BSDmakefile.TestAPI ${WRKSRC}/TestAPI/BSDmakefile
45
50
46
post-patch:
51
post-patch:
47
	@${REINPLACE_CMD} -e 's|/usr|${PREFIX}| ; s|-o root -g root ||' \
52
	@${REINPLACE_CMD} -e 's|tiffiop.h|tiffio.h|'	\
48
		${WRKSRC}/Makefile.gnu ${WRKSRC}/Makefile.fip
53
		-e 's|#include *"\.\./.*/\([^/]*\)" *$$|#include <\1>|'	\
54
		${WRKSRC}/Source/*/*.[ch]*
49
55
50
post-build:
56
regression-test test check: build
51
	${SETENV} ${MAKE_ENV} ${MAKE_CMD} -f Makefile.fip ${_MAKE_JOBS} \
57
	# Complaints about "uknown tag" are considered Ok
52
		${MAKE_ARGS} -C ${BUILD_WRKSRC}
58
	cd ${WRKSRC}/TestAPI && ./testAPI
53
59
54
post-install:
55
	${SETENV} ${MAKE_ENV} ${MAKE_CMD} -f Makefile.fip ${MAKE_ARGS} \
56
		-C ${INSTALL_WRKSRC} ${INSTALL_TARGET}
57
	${LN} -sf libfreeimageplus.so.3 \
58
		${STAGEDIR}${PREFIX}/lib/libfreeimageplus.so
59
	${LN} -sf libfreeimageplus-${PORTVERSION}.so \
60
		${STAGEDIR}${PREFIX}/lib/libfreeimageplus.so.3
61
62
.include <bsd.port.mk>
60
.include <bsd.port.mk>
(-)distinfo (-2 / +3 lines)
Lines 1-2 Link Here
1
SHA256 (FreeImage3160.zip) = 03af32dd60140d07515ddfe7b4f467baa3b888a72ea78828811aded7adb42f60
1
TIMESTAMP = 1492192692
2
SIZE (FreeImage3160.zip) = 5669228
2
SHA256 (FreeImage3170.zip) = fbfc65e39b3d4e2cb108c4ffa8c41fd02c07d4d436c594fff8dab1a6d5297f89
3
SIZE (FreeImage3170.zip) = 7020636
(-)files/BSDmakefile (+5 lines)
Line 0 Link Here
1
SUBDIR=	Source
2
SUBDIR+=Wrapper/FreeImagePlus
3
SUBDIR+=TestAPI
4
5
.include <bsd.subdir.mk>
(-)files/BSDmakefile.FreeImagePlus (+18 lines)
Line 0 Link Here
1
LIB_CXX=	freeimageplus
2
SHLIB_MAJOR=	3
3
INCS=		FreeImagePlus.h
4
NO_PROFILE=	nope
5
6
LIBDIR=		${PREFIX}/lib
7
INCLUDEDIR=	${PREFIX}/include
8
9
SRCS=	FreeImagePlus.cpp fipImage.cpp fipMemoryIO.cpp fipMetadataFind.cpp \
10
	fipMultiPage.cpp fipTag.cpp
11
12
CXXFLAGS+=-I. -I${.CURDIR:H:H}/Source
13
14
LDADD=	-L${.CURDIR:H:H}/Source -lfreeimage
15
16
.PATH:	src
17
18
.include <bsd.lib.mk>
(-)files/BSDmakefile.Source (+37 lines)
Line 0 Link Here
1
LIB_CXX=	freeimage
2
SHLIB_MAJOR=	${VER_MAJOR}
3
INCS=		FreeImage.h
4
NO_PROFILE=	nope
5
6
LIBDIR=		${PREFIX}/lib
7
INCLUDEDIR=	${PREFIX}/include
8
9
.include "${.CURDIR:H}/Makefile.srcs"
10
11
SRCS:=	${SRCS:M*/Source/FreeImage*/*:T} ${SRCS:M*/Source/Metadata/*:T}	\
12
	${SRCS:M*/Source/DeprecationManager}
13
# Disable the plugins, which require access to internal structures of
14
# the other libraries. Similar thing is also done by Debian and Fedora...
15
SRCS:=	${SRCS:N*PluginG3.cpp}		# Requires TIFF internals
16
SRCS:=	${SRCS:N*JPEGTransform.cpp}	# Requires JPEG internals
17
18
OJPCFLAGS!=	pkgconf libopenjp2 --cflags
19
OJPLIBS!=	pkgconf libopenjp2 --libs
20
ILMLIBS!=	pkgconf IlmBase --libs
21
CXXFLAGS+=	-fexceptions -fvisibility=hidden
22
CXXFLAGS+=	-IDeprecationManager -IMetadata -I.
23
CXXFLAGS+=	-I${LOCALBASE}/include/OpenEXR
24
CXXFLAGS+=	-I${LOCALBASE}/include/libraw
25
CXXFLAGS+=	-I${LOCALBASE}/include/jxrlib
26
CXXFLAGS+=	-I${LOCALBASE}/include/webp
27
CXXFLAGS+=	${OJPCFLAGS}
28
CXXFLAGS+=	-I${LOCALBASE}/include -DOS_CODE=0x03
29
CXXFLAGS+=	-Wcast-qual -Wno-logical-op-parentheses -Wno-bitwise-op-parentheses -Wno-switch -Wno-unused-value -Werror
30
CFLAGS+=	-I. -Werror
31
32
.PATH:	FreeImage FreeImageToolkit Metadata DeprecationMgr
33
34
LDADD=	-L${LOCALBASE}/lib
35
LDADD+=	-lopenjp2 -ljxrglue -ljpeg -lpng16 -lraw -ltiff -lwebpmux -lIlmImf -lHalf -lz
36
37
.include <bsd.lib.mk>
(-)files/BSDmakefile.TestAPI (+10 lines)
Line 0 Link Here
1
PROG_CXX=	testAPI
2
NO_MAN=		ha-ha
3
INTERNALPROG=	do not install
4
5
SRCS!=	echo *.cpp
6
7
CXXFLAGS+=-I${.CURDIR:H}/Source
8
LDADD=	-L${.CURDIR:H}/Source -Wl,-rpath=${.CURDIR:H}/Source -lfreeimage
9
10
.include <bsd.prog.mk>
(-)files/patch-CVE-2016-5684 (+31 lines)
Line 0 Link Here
1
From: Debian Science Maintainers <debian-science-maintainers@lists.alioth.debian.org>
2
Date: Mon, 10 Oct 2016 08:22:44 +0100
3
Subject: CVE-2016-5684
4
5
---
6
 Source/FreeImage/PluginXPM.cpp | 7 ++++++-
7
 1 file changed, 6 insertions(+), 1 deletion(-)
8
9
--- Source/FreeImage/PluginXPM.cpp
10
+++ Source/FreeImage/PluginXPM.cpp
11
@@ -181,6 +181,11 @@ Load(FreeImageIO *io, fi_handle handle, int page, int flags, void *data) {
12
 		}
13
 		free(str);
14
 
15
+		// check info string
16
+		if((width <= 0) || (height <= 0) || (colors <= 0) || (cpp <= 0)) {
17
+			throw "Improperly formed info string";
18
+		}
19
+
20
         if (colors > 256) {
21
 			dib = FreeImage_AllocateHeader(header_only, width, height, 24, FI_RGBA_RED_MASK, FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK);
22
 		} else {
23
@@ -193,7 +198,7 @@ Load(FreeImageIO *io, fi_handle handle, int page, int flags, void *data) {
24
 			FILE_RGBA rgba;
25
 
26
 			str = ReadString(io, handle);
27
-			if(!str)
28
+			if(!str || (strlen(str) < (size_t)cpp))
29
 				throw "Error reading color strings";
30
 
31
 			std::string chrs(str,cpp); //create a string for the color chars using the first cpp chars
(-)files/patch-Disable-testing-of-JPEG-transform (+44 lines)
Line 0 Link Here
1
Adapted from Debian:
2
3
From: Ghislain Antony Vaillant <ghisvail@gmail.com>
4
Date: Tue, 3 Nov 2015 18:15:18 +0000
5
Subject: Disable testing of JPEG transform.
6
7
Reason: the JPEG transform features are disabled from the Debian build as a
8
result of the stripping of the vendored dependencies.
9
---
10
 TestAPI/testJPEG.cpp | 4 ++++
11
 1 file changed, 4 insertions(+)
12
13
diff --git a/TestAPI/testJPEG.cpp b/TestAPI/testJPEG.cpp
14
index 798033d..94638b9 100644
15
--- TestAPI/testJPEG.cpp
16
+++ TestAPI/testJPEG.cpp
17
@@ -25,6 +25,7 @@
18
 // Local test functions
19
 // ----------------------------------------------------------
20
 
21
+#if 0
22
 void testJPEGTransform(const char *src_file) {
23
 	BOOL bResult;
24
 	BOOL perfect;
25
@@ -193,11 +194,13 @@ void testJPEGSameFile(const char *src_file) {
26
 	bResult = FreeImage_JPEGTransform("test.jpg", "test.jpg", FIJPEG_OP_ROTATE_270, perfect);
27
 	assert(bResult);
28
 }
29
+#endif
30
 
31
 // Main test function
32
 // ----------------------------------------------------------
33
 
34
 void testJPEG() {
35
+#if 0
36
 	const char *src_file = "exif.jpg";
37
 
38
 	printf("testJPEG (should throw exceptions) ...\n");
39
@@ -213,4 +216,5 @@ void testJPEG() {
40
 
41
 	// using the same file for src & dst is allowed
42
 	testJPEGSameFile(src_file);
43
+#endif
44
 }
(-)files/patch-Exif.cpp (+75 lines)
Line 0 Link Here
1
--- Source/Metadata/Exif.cpp	2015-03-02 02:07:10.000000000 -0500
2
+++ Source/Metadata/Exif.cpp	2017-05-02 14:09:07.648939000 -0400
3
@@ -400,5 +400,5 @@
4
 */
5
 static void 
6
-processExifTag(FIBITMAP *dib, FITAG *tag, char *pval, BOOL msb_order, TagLib::MDMODEL md_model) {
7
+processExifTag(FIBITMAP *dib, FITAG *tag, const char *pval, BOOL msb_order, TagLib::MDMODEL md_model) {
8
 	char defaultKey[16];
9
 	int n;
10
@@ -418,7 +418,7 @@
11
 		case FIDT_SHORT:
12
 		{
13
-			WORD *value = (WORD*)&exif_value[0];
14
+			uint16_t *value = (uint16_t *)exif_value;
15
 			for(i = 0; i < FreeImage_GetTagCount(tag); i++) {
16
-				value[i] = ReadUint16(msb_order, pval + i * sizeof(WORD));
17
+				value[i] = ReadUint16(msb_order, pval + i * 2);
18
 			}
19
 			FreeImage_SetTagValue(tag, value);
20
@@ -427,7 +427,7 @@
21
 		case FIDT_SSHORT:
22
 		{
23
-			short *value = (short*)&exif_value[0];
24
+			int16_t *value = (int16_t *)exif_value;
25
 			for(i = 0; i < FreeImage_GetTagCount(tag); i++) {
26
-				value[i] = ReadInt16(msb_order, pval + i * sizeof(short));
27
+				value[i] = ReadInt16(msb_order, pval + i * 2);
28
 			}
29
 			FreeImage_SetTagValue(tag, value);
30
@@ -436,7 +436,7 @@
31
 		case FIDT_LONG:
32
 		{
33
-			DWORD *value = (DWORD*)&exif_value[0];
34
+			uint32_t *value = (uint32_t *)exif_value;
35
 			for(i = 0; i < FreeImage_GetTagCount(tag); i++) {
36
-				value[i] = ReadUint32(msb_order, pval + i * sizeof(DWORD));
37
+				value[i] = ReadUint32(msb_order, pval + i * 4);
38
 			}
39
 			FreeImage_SetTagValue(tag, value);
40
@@ -445,7 +445,7 @@
41
 		case FIDT_SLONG:
42
 		{
43
-			LONG *value = (LONG*)&exif_value[0];
44
+			int32_t *value = (int32_t *)exif_value;
45
 			for(i = 0; i < FreeImage_GetTagCount(tag); i++) {
46
-				value[i] = ReadInt32(msb_order, pval + i * sizeof(LONG));
47
+				value[i] = ReadInt32(msb_order, pval + i * 4);
48
 			}
49
 			FreeImage_SetTagValue(tag, value);
50
@@ -454,10 +454,8 @@
51
 		case FIDT_RATIONAL:
52
 		{
53
-			n = sizeof(DWORD);
54
-
55
-			DWORD *value = (DWORD*)&exif_value[0];						
56
+			uint32_t *value = (uint32_t *)exif_value;						
57
 			for(i = 0; i < 2 * FreeImage_GetTagCount(tag); i++) {
58
 				// read a sequence of (numerator, denominator)
59
-				value[i] = ReadUint32(msb_order, n*i + (char*)pval);
60
+				value[i] = ReadUint32(msb_order, pval + i * 4);
61
 			}
62
 			FreeImage_SetTagValue(tag, value);
63
@@ -466,10 +464,8 @@
64
 		case FIDT_SRATIONAL:
65
 		{
66
-			n = sizeof(LONG);
67
-
68
-			LONG *value = (LONG*)&exif_value[0];
69
+			int32_t *value = (int32_t *)exif_value;
70
 			for(i = 0; i < 2 * FreeImage_GetTagCount(tag); i++) {
71
 				// read a sequence of (numerator, denominator)
72
-				value[i] = ReadInt32(msb_order, n*i + (char*)pval);
73
+				value[i] = ReadInt32(msb_order, pval + i * 4);
74
 			}
75
 			FreeImage_SetTagValue(tag, value);
(-)files/patch-FIRational.cpp (+30 lines)
Line 0 Link Here
1
--- Source/Metadata/FIRational.cpp	2015-03-02 02:07:10.000000000 -0500
2
+++ Source/Metadata/FIRational.cpp	2017-05-02 15:18:10.749090000 -0400
3
@@ -50,19 +50,22 @@
4
 /// Constructor with FITAG
5
 FIRational::FIRational(const FITAG *tag) {
6
+	const void *pvalue = FreeImage_GetTagValue((FITAG*)tag);
7
+	LONG d, n;
8
+
9
 	switch(FreeImage_GetTagType((FITAG*)tag)) {
10
 		case FIDT_RATIONAL:		// 64-bit unsigned fraction 
11
 		{
12
-			DWORD *pvalue = (DWORD*)FreeImage_GetTagValue((FITAG*)tag);
13
-			initialize((LONG)pvalue[0], (LONG)pvalue[1]);
14
+			n = ((uint32_t *)pvalue)[0];
15
+			d = ((uint32_t *)pvalue)[1];
16
 			break;
17
 		}
18
-
19
 		case FIDT_SRATIONAL:	// 64-bit signed fraction 
20
 		{
21
-			LONG *pvalue = (LONG*)FreeImage_GetTagValue((FITAG*)tag);
22
-			initialize((LONG)pvalue[0], (LONG)pvalue[1]);
23
+			n = ((int32_t *)pvalue)[0];
24
+			d = ((int32_t *)pvalue)[1];
25
 			break;
26
 		}
27
 	}
28
+	initialize(n, d);
29
 }
30
 
(-)files/patch-FreeImage.h (+19 lines)
Line 0 Link Here
1
--- Source/FreeImage.h	2015-03-04 02:17:54.000000000 -0500
2
+++ Source/FreeImage.h	2017-04-15 00:35:12.308397000 -0400
3
@@ -130,5 +130,4 @@
4
 
5
 #ifndef _WINDOWS_
6
-#define _WINDOWS_
7
 
8
 #ifndef FALSE
9
@@ -155,7 +154,9 @@
10
 typedef uint16_t WORD;
11
 typedef uint32_t DWORD;
12
-typedef int32_t LONG;
13
+typedef long LONG;
14
+#ifndef _LIBRAW_TYPES_H /* libraw defines these on its own -- differently */
15
 typedef int64_t INT64;
16
 typedef uint64_t UINT64;
17
+#endif
18
 #else
19
 // MS is not C99 ISO compliant
(-)files/patch-FreeImageTag.cpp (+9 lines)
Line 0 Link Here
1
--- Source/Metadata/FreeImageTag.cpp	2015-03-04 03:21:12.000000000 -0500
2
+++ Source/Metadata/FreeImageTag.cpp	2017-04-16 14:30:23.045403000 -0400
3
@@ -82,5 +82,5 @@
4
 FITAG * DLL_CALLCONV 
5
 FreeImage_CloneTag(FITAG *tag) {
6
-	if(!tag) return NULL;
7
+	if (!tag || !tag->data) return NULL;
8
 
9
 	// allocate a new tag
(-)files/patch-PluginDDS.cpp (+15 lines)
Line 0 Link Here
1
From https://sourceforge.net/p/freeimage/patches/121/
2
3
--- PluginDDS.cpp (1861)
4
+++ Source/FreeImage/PluginDDS.cpp (working copy)
5
@@ -399,8 +399,8 @@
6
 
7
 static FIBITMAP *
8
 LoadRGB (DDSURFACEDESC2 &desc, FreeImageIO *io, fi_handle handle, int page, int flags, void *data) {
9
-	int width = (int)desc.dwWidth & ~3;
10
-	int height = (int)desc.dwHeight & ~3;
11
+	int width = (int)desc.dwWidth;
12
+	int height = (int)desc.dwHeight;
13
 	int bpp = (int)desc.ddpfPixelFormat.dwRGBBitCount;
14
 	
15
 	// allocate a new dib
(-)files/patch-PluginTIFF.cpp (+236 lines)
Line 0 Link Here
1
Patch to bring up to the CVS-version
2
3
--- Source/FreeImage/PluginTIFF.cpp	2015-03-02 02:07:08.000000000 -0500
4
+++ Source/FreeImage/PluginTIFF.cpp	2017-04-16 15:10:18.458533000 -0400
5
@@ -104,6 +104,6 @@
6
 static BOOL tiff_read_iptc_profile(TIFF *tiff, FIBITMAP *dib);
7
 static BOOL tiff_read_xmp_profile(TIFF *tiff, FIBITMAP *dib);
8
-static BOOL tiff_read_exif_profile(TIFF *tiff, FIBITMAP *dib);
9
-static void ReadMetadata(TIFF *tiff, FIBITMAP *dib);
10
+static BOOL tiff_read_exif_profile(FreeImageIO *io, fi_handle handle, TIFF *tiff, FIBITMAP *dib);
11
+static void ReadMetadata(FreeImageIO *io, fi_handle handle, TIFF *tiff, FIBITMAP *dib);
12
 
13
 static BOOL tiff_write_iptc_profile(TIFF *tiff, FIBITMAP *dib);
14
@@ -214,4 +214,12 @@
15
 }
16
 
17
+void* 
18
+_TIFFcalloc(tmsize_t nmemb, tmsize_t siz) {
19
+	if (nmemb == 0 || siz == 0) {
20
+		return ((void *)NULL);
21
+	}
22
+	return calloc((size_t)nmemb, (size_t)siz);
23
+}
24
+
25
 void
26
 _TIFFfree(void *p) {
27
@@ -810,7 +818,7 @@
28
 */
29
 static BOOL 
30
-tiff_read_exif_profile(TIFF *tiff, FIBITMAP *dib) {
31
+tiff_read_exif_profile(FreeImageIO *io, fi_handle handle, TIFF *tiff, FIBITMAP *dib) {
32
 	BOOL bResult = FALSE;
33
-    toff_t exif_offset = 0;
34
+	toff_t exif_offset = 0;
35
 
36
 	// read EXIF-TIFF tags
37
@@ -820,11 +828,15 @@
38
 	if(TIFFGetField(tiff, TIFFTAG_EXIFIFD, &exif_offset)) {
39
 
40
+		const long tell_pos = io->tell_proc(handle);
41
+		const uint16 cur_dir = TIFFCurrentDirectory(tiff);
42
+
43
 		// read EXIF tags
44
-		if(!TIFFReadEXIFDirectory(tiff, exif_offset)) {
45
-			return FALSE;
46
+		if (TIFFReadEXIFDirectory(tiff, exif_offset)) {
47
+			// read all known exif tags
48
+			bResult = tiff_read_exif_tags(tiff, TagLib::EXIF_EXIF, dib);
49
 		}
50
 
51
-		// read all known exif tags
52
-		bResult = tiff_read_exif_tags(tiff, TagLib::EXIF_EXIF, dib);
53
+		io->seek_proc(handle, tell_pos, SEEK_SET);
54
+		TIFFSetDirectory(tiff, cur_dir);
55
 	}
56
 
57
@@ -836,5 +848,5 @@
58
 */
59
 static void 
60
-ReadMetadata(TIFF *tiff, FIBITMAP *dib) {
61
+ReadMetadata(FreeImageIO *io, fi_handle handle, TIFF *tiff, FIBITMAP *dib) {
62
 
63
 	// IPTC/NAA
64
@@ -848,5 +860,5 @@
65
 
66
 	// Exif-TIFF
67
-	tiff_read_exif_profile(tiff, dib);
68
+	tiff_read_exif_profile(io, handle, tiff, dib);
69
 }
70
 
71
@@ -1092,8 +1104,9 @@
72
 @param photometric TIFFTAG_PHOTOMETRIC tiff tag
73
 @param bitspersample TIFFTAG_BITSPERSAMPLE tiff tag
74
+@param samplesperpixel TIFFTAG_SAMPLESPERPIXEL tiff tag
75
 @return Returns FALSE if a uncommon bit-depth is encountered, returns TRUE otherwise
76
 */
77
 static BOOL 
78
-IsValidBitsPerSample(uint16 photometric, uint16 bitspersample) {
79
+IsValidBitsPerSample(uint16 photometric, uint16 bitspersample, uint16 samplesperpixel) {
80
 
81
 	switch(bitspersample) {
82
@@ -1118,4 +1131,7 @@
83
 			if((photometric == PHOTOMETRIC_MINISWHITE) || (photometric == PHOTOMETRIC_MINISBLACK) || (photometric == PHOTOMETRIC_LOGLUV)) { 
84
 				return TRUE;
85
+			} else if((photometric == PHOTOMETRIC_RGB) && (samplesperpixel == 3) || (samplesperpixel == 4)) {
86
+				// RGB[A]F
87
+				return TRUE;
88
 			} else {
89
 				return FALSE;
90
@@ -1222,22 +1238,22 @@
91
 ReadThumbnail(FreeImageIO *io, fi_handle handle, void *data, TIFF *tiff, FIBITMAP *dib) {
92
 	FIBITMAP* thumbnail = NULL;
93
-
94
+	
95
 	// read exif thumbnail (IFD 1) ...
96
-
97
-	uint32 exif_offset = 0;
98
+	
99
+	toff_t exif_offset = 0;
100
 	if(TIFFGetField(tiff, TIFFTAG_EXIFIFD, &exif_offset)) {
101
-
102
-		if(TIFFLastDirectory(tiff) != 0) {
103
+		
104
+		if(!TIFFLastDirectory(tiff)) {
105
 			// save current position
106
-			long tell_pos = io->tell_proc(handle);
107
-			uint16 cur_dir = TIFFCurrentDirectory(tiff);
108
-
109
+			const long tell_pos = io->tell_proc(handle);
110
+			const uint16 cur_dir = TIFFCurrentDirectory(tiff);
111
+			
112
 			// load the thumbnail
113
-			int page = 1; 
114
+			int page = 1;
115
 			int flags = TIFF_DEFAULT;
116
 			thumbnail = Load(io, handle, page, flags, data);
117
-			// store the thumbnail (remember to release it later ...)
118
+			// store the thumbnail (remember to release it before return)
119
 			FreeImage_SetThumbnail(dib, thumbnail);
120
-
121
+			
122
 			// restore current position
123
 			io->seek_proc(handle, tell_pos, SEEK_SET);
124
@@ -1245,17 +1261,20 @@
125
 		}
126
 	}
127
-
128
+	
129
 	// ... or read the first subIFD
130
-
131
+	
132
 	if(!thumbnail) {
133
 		uint16 subIFD_count = 0;
134
-		uint64* subIFD_offsets = NULL;
135
-		// ### Theoretically this should also read the first subIFD from a Photoshop-created file with "pyramid".
136
-		// It does not however - the tag is there (using Tag Viewer app) but libtiff refuses to read it
137
+		toff_t* subIFD_offsets = NULL;
138
+		
139
+		// This will also read the first (and only) subIFD from a Photoshop-created "pyramid" file.
140
+		// Subsequent, smaller images are 'nextIFD' in that subIFD. Currently we only load the first one. 
141
+		
142
 		if(TIFFGetField(tiff, TIFFTAG_SUBIFD, &subIFD_count, &subIFD_offsets)) {
143
 			if(subIFD_count > 0) {
144
 				// save current position
145
-				long tell_pos = io->tell_proc(handle);
146
-				uint16 cur_dir = TIFFCurrentDirectory(tiff);
147
+				const long tell_pos = io->tell_proc(handle);
148
+				const uint16 cur_dir = TIFFCurrentDirectory(tiff);
149
+				
150
 				if(TIFFSetSubDirectory(tiff, subIFD_offsets[0])) {
151
 					// load the thumbnail
152
@@ -1263,7 +1282,8 @@
153
 					int flags = TIFF_DEFAULT;
154
 					thumbnail = Load(io, handle, page, flags, data);
155
-					// store the thumbnail (remember to release it later ...)
156
+					// store the thumbnail (remember to release it before return)
157
 					FreeImage_SetThumbnail(dib, thumbnail);
158
 				}
159
+				
160
 				// restore current position
161
 				io->seek_proc(handle, tell_pos, SEEK_SET);
162
@@ -1274,15 +1294,15 @@
163
 	
164
 	// ... or read Photoshop thumbnail
165
-
166
+	
167
 	if(!thumbnail) {
168
 		uint32 ps_size = 0;
169
 		void *ps_data = NULL;
170
-
171
+		
172
 		if(TIFFGetField(tiff, TIFFTAG_PHOTOSHOP, &ps_size, &ps_data)) {
173
 			FIMEMORY *handle = FreeImage_OpenMemory((BYTE*)ps_data, ps_size);
174
-
175
+			
176
 			FreeImageIO io;
177
 			SetMemoryIO(&io);
178
-		
179
+			
180
 			psdParser parser;
181
 			parser.ReadImageResources(&io, handle, ps_size);
182
@@ -1292,7 +1312,6 @@
183
 			FreeImage_CloseMemory(handle);
184
 		}
185
-		
186
 	}
187
-
188
+	
189
 	// release thumbnail
190
 	FreeImage_Unload(thumbnail);
191
@@ -1366,5 +1385,5 @@
192
 		// ---------------------------------------------------------------------------------
193
 
194
-		if(IsValidBitsPerSample(photometric, bitspersample) == FALSE) {
195
+		if(IsValidBitsPerSample(photometric, bitspersample, samplesperpixel) == FALSE) {
196
 			FreeImage_OutputMessageProc(s_format_id, 
197
 				"Unable to handle this format: bitspersample = %d, samplesperpixel = %d, photometric = %d", 
198
@@ -2204,15 +2223,22 @@
199
 			throw FI_MSG_ERROR_UNSUPPORTED_FORMAT;
200
 		}
201
-
202
-		// copy ICC profile data (must be done after FreeImage_Allocate)
203
-
204
-		FreeImage_CreateICCProfile(dib, iccBuf, iccSize);		
205
-		if (photometric == PHOTOMETRIC_SEPARATED && asCMYK) {
206
-			FreeImage_GetICCProfile(dib)->flags |= FIICC_COLOR_IS_CMYK;
207
-		}			
208
-
209
+		
210
 		// copy TIFF metadata (must be done after FreeImage_Allocate)
211
 
212
-		ReadMetadata(tif, dib);
213
+		ReadMetadata(io, handle, tif, dib);
214
+
215
+		// copy ICC profile data (must be done after FreeImage_Allocate)
216
+		
217
+		FreeImage_CreateICCProfile(dib, iccBuf, iccSize);
218
+		if (photometric == PHOTOMETRIC_SEPARATED) {
219
+			if (asCMYK) {
220
+				// set the ICC profile as CMYK
221
+				FreeImage_GetICCProfile(dib)->flags |= FIICC_COLOR_IS_CMYK;
222
+			}
223
+			else {
224
+				// if original image is CMYK but is converted to RGB, remove ICC profile from Exif-TIFF metadata
225
+				FreeImage_SetMetadata(FIMD_EXIF_MAIN, dib, "InterColorProfile", NULL);
226
+			}
227
+		}
228
 
229
 		// copy TIFF thumbnail (must be done after FreeImage_Allocate)
230
@@ -2220,5 +2246,5 @@
231
 		ReadThumbnail(io, handle, data, tif, dib);
232
 
233
-		return (FIBITMAP *)dib;
234
+		return dib;
235
 
236
 	} catch (const char *message) {			
(-)files/patch-Source-OpenEXR-IlmImf_ImfAutoArray.h (-11 lines)
Lines 1-11 Link Here
1
--- Source/OpenEXR/IlmImf/ImfAutoArray.h.orig	2013-01-30 11:10:28.000000000 +0100
2
+++ Source/OpenEXR/IlmImf/ImfAutoArray.h	2013-01-30 12:05:10.000000000 +0100
3
@@ -46,6 +46,8 @@
4
 
5
 #include "OpenEXRConfig.h"
6
 
7
+#include <string.h>
8
+
9
 namespace Imf {
10
 
11
 
(-)files/patch-bug119 (+13 lines)
Line 0 Link Here
1
See https://sourceforge.net/p/freeimage/patches/119/
2
3
	-mi
4
5
--- Source/FreeImage/BitmapAccess.cpp	2015-03-02 02:07:08.000000000 -0500
6
+++ Source/FreeImage/BitmapAccess.cpp	2017-05-02 22:52:43.370618000 -0400
7
@@ -576,4 +576,6 @@
8
 		// copy the bitmap + internal pointers (remember to restore new_dib internal pointers later)
9
 		memcpy(new_dib->data, dib->data, dib_size);
10
+		((FREEIMAGEHEADER *)new_dib->data)->external_bits  = NULL;
11
+		((FREEIMAGEHEADER *)new_dib->data)->external_pitch = 0;
12
 
13
 		// reset ICC profile link for new_dib
(-)files/patch-const (+471 lines)
Line 0 Link Here
1
See https://sourceforge.net/p/freeimage/patches/128/
2
3
	-mi
4
5
--- Source/Utilities.h	2015-03-02 01:50:58.000000000 -0500
6
+++ Source/Utilities.h	2017-05-02 23:00:30.970669000 -0400
7
@@ -120,5 +120,5 @@
8
 @see FreeImage_GetRGBMasks
9
 */
10
-DLL_API BOOL DLL_CALLCONV FreeImage_HasRGBMasks(FIBITMAP *dib);
11
+DLL_API BOOL DLL_CALLCONV FreeImage_HasRGBMasks(const FIBITMAP *dib);
12
 
13
 #if defined(__cplusplus)
14
--- Source/FreeImage.h	2015-03-04 02:17:54.000000000 -0500
15
+++ Source/FreeImage.h	2017-05-02 22:57:04.270492000 -0400
16
@@ -808,9 +818,9 @@
17
 DLL_API FIBITMAP *DLL_CALLCONV FreeImage_Allocate(int width, int height, int bpp, unsigned red_mask FI_DEFAULT(0), unsigned green_mask FI_DEFAULT(0), unsigned blue_mask FI_DEFAULT(0));
18
 DLL_API FIBITMAP *DLL_CALLCONV FreeImage_AllocateT(FREE_IMAGE_TYPE type, int width, int height, int bpp FI_DEFAULT(8), unsigned red_mask FI_DEFAULT(0), unsigned green_mask FI_DEFAULT(0), unsigned blue_mask FI_DEFAULT(0));
19
-DLL_API FIBITMAP * DLL_CALLCONV FreeImage_Clone(FIBITMAP *dib);
20
+DLL_API FIBITMAP * DLL_CALLCONV FreeImage_Clone(const FIBITMAP *dib);
21
 DLL_API void DLL_CALLCONV FreeImage_Unload(FIBITMAP *dib);
22
 
23
 // Header loading routines
24
-DLL_API BOOL DLL_CALLCONV FreeImage_HasPixels(FIBITMAP *dib);
25
+DLL_API BOOL DLL_CALLCONV FreeImage_HasPixels(const FIBITMAP *dib);
26
 
27
 // Load / Save routines -----------------------------------------------------
28
@@ -885,5 +895,5 @@
29
 // Image type request routine -----------------------------------------------
30
 
31
-DLL_API FREE_IMAGE_TYPE DLL_CALLCONV FreeImage_GetImageType(FIBITMAP *dib);
32
+DLL_API FREE_IMAGE_TYPE DLL_CALLCONV FreeImage_GetImageType(const FIBITMAP *dib);
33
 
34
 // FreeImage helper routines ------------------------------------------------
35
@@ -895,57 +905,57 @@
36
 // Pixel access routines ----------------------------------------------------
37
 
38
-DLL_API BYTE *DLL_CALLCONV FreeImage_GetBits(FIBITMAP *dib);
39
-DLL_API BYTE *DLL_CALLCONV FreeImage_GetScanLine(FIBITMAP *dib, int scanline);
40
+DLL_API BYTE *DLL_CALLCONV FreeImage_GetBits(const FIBITMAP *dib);
41
+DLL_API BYTE *DLL_CALLCONV FreeImage_GetScanLine(const FIBITMAP *dib, int scanline);
42
 
43
-DLL_API BOOL DLL_CALLCONV FreeImage_GetPixelIndex(FIBITMAP *dib, unsigned x, unsigned y, BYTE *value);
44
-DLL_API BOOL DLL_CALLCONV FreeImage_GetPixelColor(FIBITMAP *dib, unsigned x, unsigned y, RGBQUAD *value);
45
-DLL_API BOOL DLL_CALLCONV FreeImage_SetPixelIndex(FIBITMAP *dib, unsigned x, unsigned y, BYTE *value);
46
-DLL_API BOOL DLL_CALLCONV FreeImage_SetPixelColor(FIBITMAP *dib, unsigned x, unsigned y, RGBQUAD *value);
47
+DLL_API BOOL DLL_CALLCONV FreeImage_GetPixelIndex(const FIBITMAP *dib, unsigned x, unsigned y, BYTE *value);
48
+DLL_API BOOL DLL_CALLCONV FreeImage_GetPixelColor(const FIBITMAP *dib, unsigned x, unsigned y, RGBQUAD *value);
49
+DLL_API BOOL DLL_CALLCONV FreeImage_SetPixelIndex(FIBITMAP *dib, unsigned x, unsigned y, const BYTE *value);
50
+DLL_API BOOL DLL_CALLCONV FreeImage_SetPixelColor(FIBITMAP *dib, unsigned x, unsigned y, const RGBQUAD *value);
51
 
52
 // DIB info routines --------------------------------------------------------
53
 
54
-DLL_API unsigned DLL_CALLCONV FreeImage_GetColorsUsed(FIBITMAP *dib);
55
-DLL_API unsigned DLL_CALLCONV FreeImage_GetBPP(FIBITMAP *dib);
56
-DLL_API unsigned DLL_CALLCONV FreeImage_GetWidth(FIBITMAP *dib);
57
-DLL_API unsigned DLL_CALLCONV FreeImage_GetHeight(FIBITMAP *dib);
58
-DLL_API unsigned DLL_CALLCONV FreeImage_GetLine(FIBITMAP *dib);
59
-DLL_API unsigned DLL_CALLCONV FreeImage_GetPitch(FIBITMAP *dib);
60
-DLL_API unsigned DLL_CALLCONV FreeImage_GetDIBSize(FIBITMAP *dib);
61
-DLL_API unsigned DLL_CALLCONV FreeImage_GetMemorySize(FIBITMAP *dib);
62
-DLL_API RGBQUAD *DLL_CALLCONV FreeImage_GetPalette(FIBITMAP *dib);
63
+DLL_API unsigned DLL_CALLCONV FreeImage_GetColorsUsed(const FIBITMAP *dib);
64
+DLL_API unsigned DLL_CALLCONV FreeImage_GetBPP(const FIBITMAP *dib);
65
+DLL_API unsigned DLL_CALLCONV FreeImage_GetWidth(const FIBITMAP *dib);
66
+DLL_API unsigned DLL_CALLCONV FreeImage_GetHeight(const FIBITMAP *dib);
67
+DLL_API unsigned DLL_CALLCONV FreeImage_GetLine(const FIBITMAP *dib);
68
+DLL_API unsigned DLL_CALLCONV FreeImage_GetPitch(const FIBITMAP *dib);
69
+DLL_API unsigned DLL_CALLCONV FreeImage_GetDIBSize(const FIBITMAP *dib);
70
+DLL_API unsigned DLL_CALLCONV FreeImage_GetMemorySize(const FIBITMAP *dib);
71
+DLL_API RGBQUAD *DLL_CALLCONV FreeImage_GetPalette(const FIBITMAP *dib);
72
 
73
-DLL_API unsigned DLL_CALLCONV FreeImage_GetDotsPerMeterX(FIBITMAP *dib);
74
-DLL_API unsigned DLL_CALLCONV FreeImage_GetDotsPerMeterY(FIBITMAP *dib);
75
+DLL_API unsigned DLL_CALLCONV FreeImage_GetDotsPerMeterX(const FIBITMAP *dib);
76
+DLL_API unsigned DLL_CALLCONV FreeImage_GetDotsPerMeterY(const FIBITMAP *dib);
77
 DLL_API void DLL_CALLCONV FreeImage_SetDotsPerMeterX(FIBITMAP *dib, unsigned res);
78
 DLL_API void DLL_CALLCONV FreeImage_SetDotsPerMeterY(FIBITMAP *dib, unsigned res);
79
 
80
-DLL_API BITMAPINFOHEADER *DLL_CALLCONV FreeImage_GetInfoHeader(FIBITMAP *dib);
81
-DLL_API BITMAPINFO *DLL_CALLCONV FreeImage_GetInfo(FIBITMAP *dib);
82
-DLL_API FREE_IMAGE_COLOR_TYPE DLL_CALLCONV FreeImage_GetColorType(FIBITMAP *dib);
83
-
84
-DLL_API unsigned DLL_CALLCONV FreeImage_GetRedMask(FIBITMAP *dib);
85
-DLL_API unsigned DLL_CALLCONV FreeImage_GetGreenMask(FIBITMAP *dib);
86
-DLL_API unsigned DLL_CALLCONV FreeImage_GetBlueMask(FIBITMAP *dib);
87
+DLL_API BITMAPINFOHEADER *DLL_CALLCONV FreeImage_GetInfoHeader(const FIBITMAP *dib);
88
+DLL_API BITMAPINFO *DLL_CALLCONV FreeImage_GetInfo(const FIBITMAP *dib);
89
+DLL_API FREE_IMAGE_COLOR_TYPE DLL_CALLCONV FreeImage_GetColorType(const FIBITMAP *dib);
90
+
91
+DLL_API unsigned DLL_CALLCONV FreeImage_GetRedMask(const FIBITMAP *dib);
92
+DLL_API unsigned DLL_CALLCONV FreeImage_GetGreenMask(const FIBITMAP *dib);
93
+DLL_API unsigned DLL_CALLCONV FreeImage_GetBlueMask(const FIBITMAP *dib);
94
 
95
-DLL_API unsigned DLL_CALLCONV FreeImage_GetTransparencyCount(FIBITMAP *dib);
96
-DLL_API BYTE * DLL_CALLCONV FreeImage_GetTransparencyTable(FIBITMAP *dib);
97
+DLL_API unsigned DLL_CALLCONV FreeImage_GetTransparencyCount(const FIBITMAP *dib);
98
+DLL_API BYTE * DLL_CALLCONV FreeImage_GetTransparencyTable(const FIBITMAP *dib);
99
 DLL_API void DLL_CALLCONV FreeImage_SetTransparent(FIBITMAP *dib, BOOL enabled);
100
-DLL_API void DLL_CALLCONV FreeImage_SetTransparencyTable(FIBITMAP *dib, BYTE *table, int count);
101
-DLL_API BOOL DLL_CALLCONV FreeImage_IsTransparent(FIBITMAP *dib);
102
+DLL_API void DLL_CALLCONV FreeImage_SetTransparencyTable(FIBITMAP *dib, const BYTE *table, int count);
103
+DLL_API BOOL DLL_CALLCONV FreeImage_IsTransparent(const FIBITMAP *dib);
104
 DLL_API void DLL_CALLCONV FreeImage_SetTransparentIndex(FIBITMAP *dib, int index);
105
-DLL_API int DLL_CALLCONV FreeImage_GetTransparentIndex(FIBITMAP *dib);
106
+DLL_API int DLL_CALLCONV FreeImage_GetTransparentIndex(const FIBITMAP *dib);
107
 
108
-DLL_API BOOL DLL_CALLCONV FreeImage_HasBackgroundColor(FIBITMAP *dib);
109
-DLL_API BOOL DLL_CALLCONV FreeImage_GetBackgroundColor(FIBITMAP *dib, RGBQUAD *bkcolor);
110
-DLL_API BOOL DLL_CALLCONV FreeImage_SetBackgroundColor(FIBITMAP *dib, RGBQUAD *bkcolor);
111
+DLL_API BOOL DLL_CALLCONV FreeImage_HasBackgroundColor(const FIBITMAP *dib);
112
+DLL_API BOOL DLL_CALLCONV FreeImage_GetBackgroundColor(const FIBITMAP *dib, RGBQUAD *bkcolor);
113
+DLL_API BOOL DLL_CALLCONV FreeImage_SetBackgroundColor(FIBITMAP *dib, const RGBQUAD *bkcolor);
114
 
115
-DLL_API FIBITMAP *DLL_CALLCONV FreeImage_GetThumbnail(FIBITMAP *dib);
116
-DLL_API BOOL DLL_CALLCONV FreeImage_SetThumbnail(FIBITMAP *dib, FIBITMAP *thumbnail);
117
+DLL_API FIBITMAP *DLL_CALLCONV FreeImage_GetThumbnail(const FIBITMAP *dib);
118
+DLL_API BOOL DLL_CALLCONV FreeImage_SetThumbnail(FIBITMAP *dib, const FIBITMAP *thumbnail);
119
 
120
 // ICC profile routines -----------------------------------------------------
121
 
122
-DLL_API FIICCPROFILE *DLL_CALLCONV FreeImage_GetICCProfile(FIBITMAP *dib);
123
-DLL_API FIICCPROFILE *DLL_CALLCONV FreeImage_CreateICCProfile(FIBITMAP *dib, void *data, long size);
124
-DLL_API void DLL_CALLCONV FreeImage_DestroyICCProfile(FIBITMAP *dib);
125
+DLL_API FIICCPROFILE *DLL_CALLCONV FreeImage_GetICCProfile(const FIBITMAP *dib);
126
+DLL_API FIICCPROFILE *DLL_CALLCONV FreeImage_CreateICCProfile(const FIBITMAP *dib, const void *data, long size);
127
+DLL_API void DLL_CALLCONV FreeImage_DestroyICCProfile(const FIBITMAP *dib);
128
 
129
 // Line conversion routines -------------------------------------------------
130
@@ -1043,11 +1053,11 @@
131
 
132
 // tag getters and setters
133
-DLL_API const char *DLL_CALLCONV FreeImage_GetTagKey(FITAG *tag);
134
-DLL_API const char *DLL_CALLCONV FreeImage_GetTagDescription(FITAG *tag);
135
-DLL_API WORD DLL_CALLCONV FreeImage_GetTagID(FITAG *tag);
136
-DLL_API FREE_IMAGE_MDTYPE DLL_CALLCONV FreeImage_GetTagType(FITAG *tag);
137
-DLL_API DWORD DLL_CALLCONV FreeImage_GetTagCount(FITAG *tag);
138
-DLL_API DWORD DLL_CALLCONV FreeImage_GetTagLength(FITAG *tag);
139
-DLL_API const void *DLL_CALLCONV FreeImage_GetTagValue(FITAG *tag);
140
+DLL_API const char *DLL_CALLCONV FreeImage_GetTagKey(const FITAG *tag);
141
+DLL_API const char *DLL_CALLCONV FreeImage_GetTagDescription(const FITAG *tag);
142
+DLL_API WORD DLL_CALLCONV FreeImage_GetTagID(const FITAG *tag);
143
+DLL_API FREE_IMAGE_MDTYPE DLL_CALLCONV FreeImage_GetTagType(const FITAG *tag);
144
+DLL_API DWORD DLL_CALLCONV FreeImage_GetTagCount(const FITAG *tag);
145
+DLL_API DWORD DLL_CALLCONV FreeImage_GetTagLength(const FITAG *tag);
146
+DLL_API const void *DLL_CALLCONV FreeImage_GetTagValue(const FITAG *tag);
147
 
148
 DLL_API BOOL DLL_CALLCONV FreeImage_SetTagKey(FITAG *tag, const char *key);
149
@@ -1066,9 +1076,9 @@
150
 // metadata setter and getter
151
 DLL_API BOOL DLL_CALLCONV FreeImage_SetMetadata(FREE_IMAGE_MDMODEL model, FIBITMAP *dib, const char *key, FITAG *tag);
152
-DLL_API BOOL DLL_CALLCONV FreeImage_GetMetadata(FREE_IMAGE_MDMODEL model, FIBITMAP *dib, const char *key, FITAG **tag);
153
+DLL_API BOOL DLL_CALLCONV FreeImage_GetMetadata(FREE_IMAGE_MDMODEL model, const FIBITMAP *dib, const char *key, FITAG **tag);
154
 DLL_API BOOL DLL_CALLCONV FreeImage_SetMetadataKeyValue(FREE_IMAGE_MDMODEL model, FIBITMAP *dib, const char *key, const char *value);
155
 
156
 // helpers
157
-DLL_API unsigned DLL_CALLCONV FreeImage_GetMetadataCount(FREE_IMAGE_MDMODEL model, FIBITMAP *dib);
158
+DLL_API unsigned DLL_CALLCONV FreeImage_GetMetadataCount(FREE_IMAGE_MDMODEL model, const FIBITMAP *dib);
159
 DLL_API BOOL DLL_CALLCONV FreeImage_CloneMetadata(FIBITMAP *dst, FIBITMAP *src);
160
 
161
--- Source/FreeImage/PixelAccess.cpp	2015-03-02 02:07:08.000000000 -0500
162
+++ Source/FreeImage/PixelAccess.cpp	2017-05-02 22:59:30.165541000 -0400
163
@@ -29,5 +29,5 @@
164
 
165
 BYTE * DLL_CALLCONV
166
-FreeImage_GetScanLine(FIBITMAP *dib, int scanline) {
167
+FreeImage_GetScanLine(const FIBITMAP *dib, int scanline) {
168
 	if(!FreeImage_HasPixels(dib)) {
169
 		return NULL;
170
--- Source/FreeImage/BitmapAccess.cpp	2015-03-02 02:07:08.000000000 -0500
171
+++ Source/FreeImage/BitmapAccess.cpp	2017-05-02 22:52:43.370618000 -0400
172
@@ -265,5 +265,5 @@
173
 */
174
 static FREEIMAGERGBMASKS *
175
-FreeImage_GetRGBMasks(FIBITMAP *dib) {
176
+FreeImage_GetRGBMasks(const FIBITMAP *dib) {
177
 	return FreeImage_HasRGBMasks(dib) ? (FREEIMAGERGBMASKS *)(((BYTE *)FreeImage_GetInfoHeader(dib)) + sizeof(BITMAPINFOHEADER)) : NULL;
178
 }
179
@@ -534,5 +534,5 @@
180
 
181
 FIBITMAP * DLL_CALLCONV
182
-FreeImage_Clone(FIBITMAP *dib) {
183
+FreeImage_Clone(const FIBITMAP *dib) {
184
 	if(!dib) {
185
 		return NULL;
186
@@ -637,5 +639,5 @@
187
 
188
 BYTE * DLL_CALLCONV
189
-FreeImage_GetBits(FIBITMAP *dib) {
190
+FreeImage_GetBits(const FIBITMAP *dib) {
191
 	if(!FreeImage_HasPixels(dib)) {
192
 		return NULL;
193
@@ -659,10 +661,10 @@
194
 
195
 FIBITMAP* DLL_CALLCONV
196
-FreeImage_GetThumbnail(FIBITMAP *dib) {
197
+FreeImage_GetThumbnail(const FIBITMAP *dib) {
198
 	return (dib != NULL) ? ((FREEIMAGEHEADER *)dib->data)->thumbnail : NULL;
199
 }
200
 
201
 BOOL DLL_CALLCONV
202
-FreeImage_SetThumbnail(FIBITMAP *dib, FIBITMAP *thumbnail) {
203
+FreeImage_SetThumbnail(FIBITMAP *dib, const FIBITMAP *thumbnail) {
204
 	if(dib == NULL) {
205
 		return FALSE;
206
@@ -682,5 +684,5 @@
207
 
208
 FREE_IMAGE_COLOR_TYPE DLL_CALLCONV
209
-FreeImage_GetColorType(FIBITMAP *dib) {
210
+FreeImage_GetColorType(const FIBITMAP *dib) {
211
 	RGBQUAD *rgb;
212
 
213
@@ -803,5 +805,5 @@
214
 
215
 FREE_IMAGE_TYPE DLL_CALLCONV 
216
-FreeImage_GetImageType(FIBITMAP *dib) {
217
+FreeImage_GetImageType(const FIBITMAP *dib) {
218
 	return (dib != NULL) ? ((FREEIMAGEHEADER *)dib->data)->type : FIT_UNKNOWN;
219
 }
220
@@ -810,5 +812,5 @@
221
 
222
 BOOL DLL_CALLCONV 
223
-FreeImage_HasPixels(FIBITMAP *dib) {
224
+FreeImage_HasPixels(const FIBITMAP *dib) {
225
 	return (dib != NULL) ? ((FREEIMAGEHEADER *)dib->data)->has_pixels : FALSE;
226
 }
227
@@ -817,10 +819,10 @@
228
 
229
 BOOL DLL_CALLCONV
230
-FreeImage_HasRGBMasks(FIBITMAP *dib) {
231
+FreeImage_HasRGBMasks(const FIBITMAP *dib) {
232
 	return dib && FreeImage_GetInfoHeader(dib)->biCompression == BI_BITFIELDS;
233
 }
234
 
235
 unsigned DLL_CALLCONV
236
-FreeImage_GetRedMask(FIBITMAP *dib) {
237
+FreeImage_GetRedMask(const FIBITMAP *dib) {
238
 	FREEIMAGERGBMASKS *masks = NULL;
239
 	FREE_IMAGE_TYPE image_type = FreeImage_GetImageType(dib);
240
@@ -839,5 +841,5 @@
241
 
242
 unsigned DLL_CALLCONV
243
-FreeImage_GetGreenMask(FIBITMAP *dib) {
244
+FreeImage_GetGreenMask(const FIBITMAP *dib) {
245
 	FREEIMAGERGBMASKS *masks = NULL;
246
 	FREE_IMAGE_TYPE image_type = FreeImage_GetImageType(dib);
247
@@ -856,5 +858,5 @@
248
 
249
 unsigned DLL_CALLCONV
250
-FreeImage_GetBlueMask(FIBITMAP *dib) {
251
+FreeImage_GetBlueMask(const FIBITMAP *dib) {
252
 	FREEIMAGERGBMASKS *masks = NULL;
253
 	FREE_IMAGE_TYPE image_type = FreeImage_GetImageType(dib);
254
@@ -875,5 +877,5 @@
255
 
256
 BOOL DLL_CALLCONV
257
-FreeImage_HasBackgroundColor(FIBITMAP *dib) {
258
+FreeImage_HasBackgroundColor(const FIBITMAP *dib) {
259
 	if(dib) {
260
 		RGBQUAD *bkgnd_color = &((FREEIMAGEHEADER *)dib->data)->bkgnd_color;
261
@@ -884,5 +886,5 @@
262
 
263
 BOOL DLL_CALLCONV
264
-FreeImage_GetBackgroundColor(FIBITMAP *dib, RGBQUAD *bkcolor) {
265
+FreeImage_GetBackgroundColor(const FIBITMAP *dib, RGBQUAD *bkcolor) {
266
 	if(dib && bkcolor) {
267
 		if(FreeImage_HasBackgroundColor(dib)) {
268
@@ -915,5 +917,5 @@
269
 
270
 BOOL DLL_CALLCONV 
271
-FreeImage_SetBackgroundColor(FIBITMAP *dib, RGBQUAD *bkcolor) {
272
+FreeImage_SetBackgroundColor(FIBITMAP *dib, const RGBQUAD *bkcolor) {
273
 	if(dib) {
274
 		RGBQUAD *bkgnd_color = &((FREEIMAGEHEADER *)dib->data)->bkgnd_color;
275
@@ -936,5 +938,5 @@
276
 
277
 BOOL DLL_CALLCONV
278
-FreeImage_IsTransparent(FIBITMAP *dib) {
279
+FreeImage_IsTransparent(const FIBITMAP *dib) {
280
 	if(dib) {
281
 		FREE_IMAGE_TYPE image_type = FreeImage_GetImageType(dib);
282
@@ -960,5 +962,5 @@
283
 
284
 BYTE * DLL_CALLCONV
285
-FreeImage_GetTransparencyTable(FIBITMAP *dib) {
286
+FreeImage_GetTransparencyTable(const FIBITMAP *dib) {
287
 	return dib ? ((FREEIMAGEHEADER *)dib->data)->transparent_table : NULL;
288
 }
289
@@ -976,10 +978,10 @@
290
 
291
 unsigned DLL_CALLCONV
292
-FreeImage_GetTransparencyCount(FIBITMAP *dib) {
293
+FreeImage_GetTransparencyCount(const FIBITMAP *dib) {
294
 	return dib ? ((FREEIMAGEHEADER *)dib->data)->transparency_count : 0;
295
 }
296
 
297
 void DLL_CALLCONV
298
-FreeImage_SetTransparencyTable(FIBITMAP *dib, BYTE *table, int count) {
299
+FreeImage_SetTransparencyTable(FIBITMAP *dib, const BYTE *table, int count) {
300
 	if (dib) {
301
 		count = MAX(0, MIN(count, 256));
302
@@ -1047,5 +1049,5 @@
303
  */
304
 int DLL_CALLCONV
305
-FreeImage_GetTransparentIndex(FIBITMAP *dib) {
306
+FreeImage_GetTransparentIndex(const FIBITMAP *dib) {
307
 	int count = FreeImage_GetTransparencyCount(dib);
308
 	BYTE *tt = FreeImage_GetTransparencyTable(dib);
309
@@ -1061,5 +1063,5 @@
310
 
311
 FIICCPROFILE * DLL_CALLCONV
312
-FreeImage_GetICCProfile(FIBITMAP *dib) {
313
+FreeImage_GetICCProfile(const FIBITMAP *dib) {
314
 	FIICCPROFILE *profile = (dib) ? (FIICCPROFILE *)&((FREEIMAGEHEADER *)dib->data)->iccProfile : NULL;
315
 	return profile;
316
@@ -1067,5 +1069,5 @@
317
 
318
 FIICCPROFILE * DLL_CALLCONV
319
-FreeImage_CreateICCProfile(FIBITMAP *dib, void *data, long size) {
320
+FreeImage_CreateICCProfile(const FIBITMAP *dib, const void *data, long size) {
321
 	// clear the profile but preserve profile->flags
322
 	FreeImage_DestroyICCProfile(dib);
323
@@ -1082,5 +1084,5 @@
324
 
325
 void DLL_CALLCONV
326
-FreeImage_DestroyICCProfile(FIBITMAP *dib) {
327
+FreeImage_DestroyICCProfile(const FIBITMAP *dib) {
328
 	FIICCPROFILE *profile = FreeImage_GetICCProfile(dib);
329
 	if(profile) {
330
@@ -1097,25 +1099,25 @@
331
 
332
 unsigned DLL_CALLCONV
333
-FreeImage_GetWidth(FIBITMAP *dib) {
334
+FreeImage_GetWidth(const FIBITMAP *dib) {
335
 	return dib ? FreeImage_GetInfoHeader(dib)->biWidth : 0;
336
 }
337
 
338
 unsigned DLL_CALLCONV
339
-FreeImage_GetHeight(FIBITMAP *dib) {
340
+FreeImage_GetHeight(const FIBITMAP *dib) {
341
 	return (dib) ? FreeImage_GetInfoHeader(dib)->biHeight : 0;
342
 }
343
 
344
 unsigned DLL_CALLCONV
345
-FreeImage_GetBPP(FIBITMAP *dib) {
346
+FreeImage_GetBPP(const FIBITMAP *dib) {
347
 	return dib ? FreeImage_GetInfoHeader(dib)->biBitCount : 0;
348
 }
349
 
350
 unsigned DLL_CALLCONV
351
-FreeImage_GetLine(FIBITMAP *dib) {
352
+FreeImage_GetLine(const FIBITMAP *dib) {
353
 	return dib ? ((FreeImage_GetWidth(dib) * FreeImage_GetBPP(dib)) + 7) / 8 : 0;
354
 }
355
 
356
 unsigned DLL_CALLCONV
357
-FreeImage_GetPitch(FIBITMAP *dib) {
358
+FreeImage_GetPitch(const FIBITMAP *dib) {
359
 	if(dib) {
360
 		FREEIMAGEHEADER *fih = (FREEIMAGEHEADER *)dib->data;
361
@@ -1126,25 +1128,25 @@
362
 
363
 unsigned DLL_CALLCONV
364
-FreeImage_GetColorsUsed(FIBITMAP *dib) {
365
+FreeImage_GetColorsUsed(const FIBITMAP *dib) {
366
 	return dib ? FreeImage_GetInfoHeader(dib)->biClrUsed : 0;
367
 }
368
 
369
 unsigned DLL_CALLCONV
370
-FreeImage_GetDIBSize(FIBITMAP *dib) {
371
+FreeImage_GetDIBSize(const FIBITMAP *dib) {
372
 	return (dib) ? sizeof(BITMAPINFOHEADER) + (FreeImage_GetColorsUsed(dib) * sizeof(RGBQUAD)) + (FreeImage_GetPitch(dib) * FreeImage_GetHeight(dib)) : 0;
373
 }
374
 
375
 RGBQUAD * DLL_CALLCONV
376
-FreeImage_GetPalette(FIBITMAP *dib) {
377
+FreeImage_GetPalette(const FIBITMAP *dib) {
378
 	return (dib && FreeImage_GetBPP(dib) < 16) ? (RGBQUAD *)(((BYTE *)FreeImage_GetInfoHeader(dib)) + sizeof(BITMAPINFOHEADER)) : NULL;
379
 }
380
 
381
 unsigned DLL_CALLCONV
382
-FreeImage_GetDotsPerMeterX(FIBITMAP *dib) {
383
+FreeImage_GetDotsPerMeterX(const FIBITMAP *dib) {
384
 	return (dib) ? FreeImage_GetInfoHeader(dib)->biXPelsPerMeter : 0;
385
 }
386
 
387
 unsigned DLL_CALLCONV
388
-FreeImage_GetDotsPerMeterY(FIBITMAP *dib) {
389
+FreeImage_GetDotsPerMeterY(const FIBITMAP *dib) {
390
 	return (dib) ? FreeImage_GetInfoHeader(dib)->biYPelsPerMeter : 0;
391
 }
392
@@ -1165,5 +1167,5 @@
393
 
394
 BITMAPINFOHEADER * DLL_CALLCONV
395
-FreeImage_GetInfoHeader(FIBITMAP *dib) {
396
+FreeImage_GetInfoHeader(const FIBITMAP *dib) {
397
 	if(!dib) {
398
 		return NULL;
399
@@ -1176,5 +1178,5 @@
400
 
401
 BITMAPINFO * DLL_CALLCONV
402
-FreeImage_GetInfo(FIBITMAP *dib) {
403
+FreeImage_GetInfo(const FIBITMAP *dib) {
404
 	return (BITMAPINFO *)FreeImage_GetInfoHeader(dib);
405
 }
406
@@ -1415,5 +1417,5 @@
407
 
408
 BOOL DLL_CALLCONV 
409
-FreeImage_GetMetadata(FREE_IMAGE_MDMODEL model, FIBITMAP *dib, const char *key, FITAG **tag) {
410
+FreeImage_GetMetadata(FREE_IMAGE_MDMODEL model, const FIBITMAP *dib, const char *key, FITAG **tag) {
411
 	if(!dib || !key || !tag) {
412
 		return FALSE;
413
@@ -1481,5 +1483,5 @@
414
 
415
 unsigned DLL_CALLCONV 
416
-FreeImage_GetMetadataCount(FREE_IMAGE_MDMODEL model, FIBITMAP *dib) {
417
+FreeImage_GetMetadataCount(FREE_IMAGE_MDMODEL model, const FIBITMAP *dib) {
418
 	if(!dib) {
419
 		return FALSE;
420
@@ -1505,5 +1507,5 @@
421
 
422
 unsigned DLL_CALLCONV
423
-FreeImage_GetMemorySize(FIBITMAP *dib) {
424
+FreeImage_GetMemorySize(const FIBITMAP *dib) {
425
 	if (!dib) {
426
 		return 0;
427
--- Source/Metadata/FreeImageTag.cpp	2015-03-04 03:21:12.000000000 -0500
428
+++ Source/Metadata/FreeImageTag.cpp	2017-05-02 23:21:09.818306000 -0400
429
@@ -150,35 +150,35 @@
430
 
431
 const char * DLL_CALLCONV 
432
-FreeImage_GetTagKey(FITAG *tag) {
433
+FreeImage_GetTagKey(const FITAG *tag) {
434
 	return tag ? ((FITAGHEADER *)tag->data)->key : 0;
435
 }
436
 
437
 const char * DLL_CALLCONV 
438
-FreeImage_GetTagDescription(FITAG *tag) {
439
+FreeImage_GetTagDescription(const FITAG *tag) {
440
 	return tag ? ((FITAGHEADER *)tag->data)->description : 0;
441
 }
442
 
443
 WORD DLL_CALLCONV 
444
-FreeImage_GetTagID(FITAG *tag) {
445
+FreeImage_GetTagID(const FITAG *tag) {
446
 	return tag ? ((FITAGHEADER *)tag->data)->id : 0;
447
 }
448
 
449
 FREE_IMAGE_MDTYPE DLL_CALLCONV 
450
-FreeImage_GetTagType(FITAG *tag) {
451
+FreeImage_GetTagType(const FITAG *tag) {
452
 	return tag ? (FREE_IMAGE_MDTYPE)(((FITAGHEADER *)tag->data)->type) : FIDT_NOTYPE;
453
 }
454
 
455
 DWORD DLL_CALLCONV 
456
-FreeImage_GetTagCount(FITAG *tag) {
457
+FreeImage_GetTagCount(const FITAG *tag) {
458
 	return tag ? ((FITAGHEADER *)tag->data)->count : 0;
459
 }
460
 
461
 DWORD DLL_CALLCONV 
462
-FreeImage_GetTagLength(FITAG *tag) {
463
+FreeImage_GetTagLength(const FITAG *tag) {
464
 	return tag ? ((FITAGHEADER *)tag->data)->length : 0;
465
 }
466
 
467
 const void *DLL_CALLCONV 
468
-FreeImage_GetTagValue(FITAG *tag) {
469
+FreeImage_GetTagValue(const FITAG *tag) {
470
 	return tag ? ((FITAGHEADER *)tag->data)->value : 0;
471
 }
(-)files/patch-errorcheck (+138 lines)
Line 0 Link Here
1
See https://sourceforge.net/p/freeimage/patches/129/
2
3
	-mi
4
5
--- Source/FreeImage/PluginICO.cpp	2015-03-02 02:07:08.000000000 -0500
6
+++ Source/FreeImage/PluginICO.cpp	2017-05-02 21:06:46.209285000 -0400
7
@@ -203,5 +203,8 @@
8
 	ICONHEADER icon_header;
9
 
10
-	io->read_proc(&icon_header, sizeof(ICONHEADER), 1, handle);
11
+	if (io->read_proc(&icon_header, sizeof(ICONHEADER), 1, handle) == 0)
12
+		// XXX should we not report the error somehow?
13
+		return 0;
14
+
15
 #ifdef FREEIMAGE_BIGENDIAN
16
 	SwapIconHeader(&icon_header);
17
--- Source/FreeImage/PluginTARGA.cpp	2015-03-02 02:07:08.000000000 -0500
18
+++ Source/FreeImage/PluginTARGA.cpp	2017-05-02 21:08:12.217655000 -0400
19
@@ -28,4 +28,5 @@
20
 #include "FreeImage.h"
21
 #include "Utilities.h"
22
+#include <err.h>
23
 
24
 // ----------------------------------------------------------
25
@@ -363,11 +364,21 @@
26
 	BYTE tga_signature[sizeofSig] = { 84, 82, 85, 69, 86, 73, 83, 73, 79, 78, 45, 88, 70, 73, 76, 69, 46, 0 };
27
 	// get the start offset
28
-	const long start_offset = io->tell_proc(handle);
29
+	long start_offset = io->tell_proc(handle);
30
+	if (start_offset == -1) {
31
+		warn("%s", __func__);
32
+		return 0;
33
+	}
34
 	// get the end-of-file
35
-	io->seek_proc(handle, 0, SEEK_END);
36
+	if (io->seek_proc(handle, 0, SEEK_END) == -1)
37
+		return 0;
38
 	const long eof = io->tell_proc(handle);
39
 	// read the signature
40
-	io->seek_proc(handle, start_offset + eof - sizeofSig, SEEK_SET);
41
-	io->read_proc(&signature, 1, sizeofSig, handle);
42
+	if (eof == -1) {
43
+		warn("%s", __func__);
44
+		return 0;
45
+	}
46
+	if (io->seek_proc(handle, start_offset + eof - sizeofSig, SEEK_SET) == -1 ||
47
+	    io->read_proc(&signature, 1, sizeofSig, handle) == 0)
48
+		return 0;
49
 	// rewind
50
 	io->seek_proc(handle, start_offset, SEEK_SET);
51
@@ -388,5 +399,6 @@
52
 		// get the header
53
 		TGAHEADER header;
54
-		io->read_proc(&header, sizeof(tagTGAHEADER), 1, handle);
55
+		if (io->read_proc(&header, sizeof(tagTGAHEADER), 1, handle) == 0)
56
+			return 0;
57
 #ifdef FREEIMAGE_BIGENDIAN
58
 		SwapHeader(&header);
59
--- Source/FreeImage/PluginXBM.cpp	2015-03-02 02:07:08.000000000 -0500
60
+++ Source/FreeImage/PluginXBM.cpp	2017-05-02 21:12:16.631388000 -0400
61
@@ -56,8 +56,8 @@
62
 	do {
63
 		count = io->read_proc(&c, 1, 1, handle);
64
+		if (count == 0)
65
+			return NULL;
66
 		str[i++] = c;
67
 	} while((c != '\n') && (i < n));
68
-	if(count <= 0)
69
-		return NULL;
70
 	str[i] = '\0';
71
 	return str;
72
--- Source/FreeImage/PluginRAW.cpp	2015-03-08 20:12:04.000000000 -0400
73
+++ Source/FreeImage/PluginRAW.cpp	2017-05-02 22:13:23.679157000 -0400
74
@@ -20,9 +20,10 @@
75
 // ==========================================================
76
 
77
-#include "../LibRawLite/libraw/libraw.h"
78
+#include <err.h>
79
+#include <libraw.h>
80
 
81
 #include "FreeImage.h"
82
 #include "Utilities.h"
83
-#include "../Metadata/FreeImageTag.h"
84
+#include <FreeImageTag.h>
85
 
86
 // ==========================================================
87
@@ -48,10 +49,23 @@
88
 
89
 public:
90
-	LibRaw_freeimage_datastream(FreeImageIO *io, fi_handle handle) : _io(io), _handle(handle) {
91
+	LibRaw_freeimage_datastream(FreeImageIO *io, fi_handle handle) : _io(NULL), _handle(NULL) {
92
 		long start_pos = io->tell_proc(handle);
93
-		io->seek_proc(handle, 0, SEEK_END);
94
+		if (start_pos == -1) {
95
+			warn("%s", __func__);
96
+			return;
97
+		}
98
+		if (io->seek_proc(handle, 0, SEEK_END) == -1)
99
+			return; // XXX What's there to say?
100
 		_eof = io->tell_proc(handle);
101
+		if (_eof == -1) {
102
+			warn("%s", __func__);
103
+			return;
104
+		}
105
 		_fsize = _eof - start_pos;
106
-		io->seek_proc(handle, start_pos, SEEK_SET);
107
+		if (_fsize < 32 ||
108
+		    io->seek_proc(handle, start_pos, SEEK_SET) == -1)
109
+			return;
110
+		_handle = handle;
111
+		_io = io;
112
 	}
113
 
114
@@ -617,8 +631,14 @@
115
 	{
116
 		long tell = io->tell_proc(handle);
117
+
118
+		if (tell == -1) {
119
+			warn("PluginRAW");
120
+			return 0;
121
+		}
122
+
123
 		if( HasMagicHeader(io, handle) ) {
124
 			return TRUE;
125
-		} else {
126
-			io->seek_proc(handle, tell, SEEK_SET);
127
+		} else if (io->seek_proc(handle, tell, SEEK_SET) == -1) {
128
+			return 0;
129
 		}
130
 	}
131
@@ -636,5 +656,6 @@
132
 
133
 			// open the datastream
134
-			if(RawProcessor->open_datastream(&datastream) != LIBRAW_SUCCESS) {
135
+			if (!datastream.valid() ||
136
+			    RawProcessor->open_datastream(&datastream) != LIBRAW_SUCCESS) {
137
 				bSuccess = FALSE;	// LibRaw : failed to open input stream (unknown format)
138
 			}
(-)files/patch-integer_overflow_ljpeg_start (-34 lines)
Lines 1-34 Link Here
1
Description: Fix integer overflow in the ljpeg_start function in dcraw
2
Author: Alex Tutubalin <lexa@lexa.ru>
3
Bug-Debian: https://bugs.debian.org/786790
4
Origin: https://github.com/LibRaw/LibRaw/commit/4606c28f494a750892c5c1ac7903e62dd1c6fdb5
5
	https://github.com/rawstudio/rawstudio/commit/983bda1f0fa5fa86884381208274198a620f006e
6
Bug: https://security-tracker.debian.org/tracker/CVE-2015-3885
7
Bug: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-3885
8
Reviewed-By: Anton Gladky <gladk@debian.org>
9
Last-Update: 2015-10-29
10
11
--- freeimage-3.15.4.orig/Source/LibRawLite/dcraw/dcraw.c
12
+++ Source/LibRawLite/dcraw/dcraw.c
13
@@ -768,7 +768,8 @@ struct jhead {
14
15
 int CLASS ljpeg_start (struct jhead *jh, int info_only)
16
 {
17
-  int c, tag, len;
18
+  int c, tag;
19
+  ushort len;
20
   uchar data[0x10000];
21
   const uchar *dp;
22
23
--- freeimage-3.15.4.orig/Source/LibRawLite/internal/dcraw_common.cpp
24
+++ Source/LibRawLite/internal/dcraw_common.cpp
25
@@ -630,7 +630,8 @@ void CLASS canon_compressed_load_raw()
26
27
 int CLASS ljpeg_start (struct jhead *jh, int info_only)
28
 {
29
-  int c, tag, len;
30
+  int c, tag;
31
+  ushort len;
32
   uchar data[0x10000];
33
   const uchar *dp;
34
(-)files/patch-jpeg (+13 lines)
Line 0 Link Here
1
--- Source/FreeImage/PluginJPEG.cpp	2015-03-02 02:07:08.000000000 -0500
2
+++ Source/FreeImage/PluginJPEG.cpp	2017-04-14 17:48:13.304868000 -0400
3
@@ -36,7 +36,7 @@
4
 #include <setjmp.h>
5
 
6
-#include "../LibJPEG/jinclude.h"
7
-#include "../LibJPEG/jpeglib.h"
8
-#include "../LibJPEG/jerror.h"
9
+#include <stdio.h>
10
+#include <jpeglib.h>
11
+#include <jerror.h>
12
 }
13
 
(-)files/patch-jpeg-cmyk (+76 lines)
Line 0 Link Here
1
--- Source/FreeImage/PluginJPEG.cpp	2015-03-02 02:07:08.000000000 -0500
2
+++ Source/FreeImage/PluginJPEG.cpp	2017-04-16 15:21:32.068749000 -0400
3
@@ -1128,6 +1128,7 @@
4
 SupportsExportDepth(int depth) {
5
 	return (
6
-			(depth == 8) ||
7
-			(depth == 24)
8
+			(depth == 8)  ||
9
+			(depth == 24) ||
10
+			(depth == 32)	// only if 32-bit CMYK
11
 		);
12
 }
13
@@ -1317,4 +1318,8 @@
14
 					}
15
 				}
16
+				
17
+				// if original image is CMYK but is converted to RGB, remove ICC profile from Exif-TIFF metadata
18
+				FreeImage_SetMetadata(FIMD_EXIF_MAIN, dib, "InterColorProfile", NULL);
19
+
20
 			} else if((cinfo.out_color_space == JCS_CMYK) && ((flags & JPEG_CMYK) == JPEG_CMYK)) {
21
 				// convert from LibJPEG CMYK to standard CMYK
22
@@ -1402,10 +1407,10 @@
23
 			// Check dib format
24
 
25
-			const char *sError = "only 24-bit highcolor or 8-bit greyscale/palette bitmaps can be saved as JPEG";
26
+			const char *sError = "only 24-bit RGB, 8-bit greyscale/palette or 32-bit CMYK bitmaps can be saved as JPEG";
27
 
28
 			FREE_IMAGE_COLOR_TYPE color_type = FreeImage_GetColorType(dib);
29
 			WORD bpp = (WORD)FreeImage_GetBPP(dib);
30
 
31
-			if ((bpp != 24) && (bpp != 8)) {
32
+			if ((bpp != 24) && (bpp != 8) && !(bpp == 32 && (color_type == FIC_CMYK))) {
33
 				throw sError;
34
 			}
35
@@ -1456,5 +1461,8 @@
36
 					cinfo.input_components = 1;
37
 					break;
38
-
39
+				case FIC_CMYK:
40
+					cinfo.in_color_space = JCS_CMYK;
41
+					cinfo.input_components = 4;
42
+					break;
43
 				default :
44
 					cinfo.in_color_space = JCS_RGB;
45
@@ -1600,4 +1608,31 @@
46
 				free(target);
47
 			}
48
+			else if(color_type == FIC_CMYK) {
49
+				unsigned pitch = FreeImage_GetPitch(dib);
50
+				BYTE *target = (BYTE*)malloc(pitch * sizeof(BYTE));
51
+				if (target == NULL) {
52
+					throw FI_MSG_ERROR_MEMORY;
53
+				}
54
+				
55
+				while (cinfo.next_scanline < cinfo.image_height) {
56
+					// get a copy of the scanline
57
+					memcpy(target, FreeImage_GetScanLine(dib, FreeImage_GetHeight(dib) - cinfo.next_scanline - 1), pitch);
58
+					
59
+					BYTE *target_p = target;
60
+					for(unsigned x = 0; x < cinfo.image_width; x++) {
61
+						// CMYK pixels are inverted
62
+						target_p[0] = ~target_p[0];	// C
63
+						target_p[1] = ~target_p[1];	// M
64
+						target_p[2] = ~target_p[2];	// Y
65
+						target_p[3] = ~target_p[3];	// K
66
+
67
+						target_p += 4;
68
+					}
69
+					
70
+					// write the scanline
71
+					jpeg_write_scanlines(&cinfo, &target, 1);
72
+				}
73
+				free(target);
74
+			}
75
 			else if(color_type == FIC_MINISBLACK) {
76
 				// 8-bit standard greyscale images
(-)files/patch-jxr (+11 lines)
Line 0 Link Here
1
--- Source/FreeImage/PluginJXR.cpp	2015-03-02 02:07:08.000000000 -0500
2
+++ Source/FreeImage/PluginJXR.cpp	2017-04-15 00:26:28.574254000 -0400
3
@@ -23,5 +23,6 @@
4
 #include "Utilities.h"
5
-#include "../Metadata/FreeImageTag.h"
6
+#include <FreeImageTag.h>
7
 
8
-#include "../LibJXR/jxrgluelib/JXRGlue.h"
9
+#define __ANSI__
10
+#include <JXRGlue.h>
11
 
(-)files/patch-nog3 (+22 lines)
Line 0 Link Here
1
Building the G3 plugin is of questionable utility, but
2
requires access to data not officially exported by libtiff.
3
4
Disable it...
5
6
	-mi
7
--- Source/FreeImage/Plugin.cpp	2015-03-02 02:07:08.000000000 -0500
8
+++ Source/FreeImage/Plugin.cpp	2017-04-15 01:11:48.347512000 -0400
9
@@ -39,5 +39,5 @@
10
 #include "Plugin.h"
11
 
12
-#include "../Metadata/FreeImageTag.h"
13
+#include <FreeImageTag.h>
14
 
15
 // =====================================================================
16
@@ -264,5 +264,5 @@
17
 	        s_plugins->AddNode(InitGIF);
18
 	        s_plugins->AddNode(InitHDR);
19
-			s_plugins->AddNode(InitG3);
20
+//			s_plugins->AddNode(InitG3);
21
 			s_plugins->AddNode(InitSGI);
22
 			s_plugins->AddNode(InitEXR);
(-)files/patch-png (+109 lines)
Line 0 Link Here
1
Based on:
2
3
	From: Ghislain Antony Vaillant <ghisvail@gmail.com>
4
	Date: Tue, 3 Nov 2015 15:20:45 +0000
5
	Subject: Fix compatibility with system libpng.
6
7
	[Ghislain Antony Vaillant]
8
	The PNG plugin of FreeImage makes use of optional features of libpng, which
9
	are not enabled in Debian. This commit adds the necessary guards for FreeImage
10
	to compile and run without these features.
11
12
	[Tobias Frost]
13
	Fix FTBFS with libpng 1.6.
14
15
--- Source/FreeImage/PluginPNG.cpp
16
+++ Source/FreeImage/PluginPNG.cpp
17
@@ -109,9 +109,11 @@ ReadMetadata(png_structp png_ptr, png_infop info_ptr, FIBITMAP *dib) {
18
 			// create a tag
19
 			tag = FreeImage_CreateTag();
20
 			if(!tag) return FALSE;
21
-
22
+#ifdef PNG_iTXt_SUPPORTED
23
 			DWORD tag_length = (DWORD) MAX(text_ptr[i].text_length, text_ptr[i].itxt_length);
24
-
25
+#else
26
+			DWORD tag_length = text_ptr[i].text_length;
27
+#endif
28
 			FreeImage_SetTagLength(tag, tag_length);
29
 			FreeImage_SetTagCount(tag, tag_length);
30
 			FreeImage_SetTagType(tag, FIDT_ASCII);
31
@@ -179,14 +181,19 @@ WriteMetadata(png_structp png_ptr, png_infop info_ptr, FIBITMAP *dib) {
32
 	if(mdhandle) {
33
 		do {
34
 			memset(&text_metadata, 0, sizeof(png_text));
35
+#ifdef PNG_iTXt_SUPPORTED
36
 			text_metadata.compression = 1;							// iTXt, none
37
+#else
38
+			text_metadata.compression = -1;
39
+#endif
40
 			text_metadata.key = (char*)FreeImage_GetTagKey(tag);	// keyword, 1-79 character description of "text"
41
 			text_metadata.text = (char*)FreeImage_GetTagValue(tag);	// comment, may be an empty string (ie "")
42
 			text_metadata.text_length = FreeImage_GetTagLength(tag);// length of the text string
43
+#ifdef PNG_iTXt_SUPPORTED
44
 			text_metadata.itxt_length = FreeImage_GetTagLength(tag);// length of the itxt string
45
 			text_metadata.lang = 0;		 // language code, 0-79 characters or a NULL pointer
46
 			text_metadata.lang_key = 0;	 // keyword translated UTF-8 string, 0 or more chars or a NULL pointer
47
-
48
+#endif
49
 			// set the tag 
50
 			png_set_text(png_ptr, info_ptr, &text_metadata, 1);
51
 
52
@@ -205,10 +212,11 @@ WriteMetadata(png_structp png_ptr, png_infop info_ptr, FIBITMAP *dib) {
53
 		text_metadata.key = (char*)g_png_xmp_keyword;			// keyword, 1-79 character description of "text"
54
 		text_metadata.text = (char*)FreeImage_GetTagValue(tag);	// comment, may be an empty string (ie "")
55
 		text_metadata.text_length = FreeImage_GetTagLength(tag);// length of the text string
56
+#ifdef PNG_iTXt_SUPPORTED
57
 		text_metadata.itxt_length = FreeImage_GetTagLength(tag);// length of the itxt string
58
 		text_metadata.lang = 0;		 // language code, 0-79 characters or a NULL pointer
59
 		text_metadata.lang_key = 0;	 // keyword translated UTF-8 string, 0 or more chars or a NULL pointer
60
-
61
+#endif
62
 		// set the tag 
63
 		png_set_text(png_ptr, info_ptr, &text_metadata, 1);
64
 		bResult &= TRUE;
65
@@ -705,11 +713,19 @@ Load(FreeImageIO *io, fi_handle handle, int page, int flags, void *data) {
66
 
67
 			if (png_get_valid(png_ptr, info_ptr, PNG_INFO_iCCP)) {
68
 				png_charp profile_name = NULL;
69
-				png_bytep profile_data = NULL;
70
+#if PNG_LIBPNG_VER_MAJOR == 1 && PNG_LIBPNG_VER_MINOR >= 4 || PNG_LIBPNG_VER_MAJOR > 1
71
+				png_bytepp profile_data = NULL;
72
+#else
73
+				png_charp profile_data = NULL;
74
+#endif
75
 				png_uint_32 profile_length = 0;
76
 				int  compression_type;
77
 
78
+#if PNG_LIBPNG_VER_MAJOR == 1 && PNG_LIBPNG_VER_MINOR >= 4 || PNG_LIBPNG_VER_MAJOR > 1
79
+				png_get_iCCP(png_ptr, info_ptr, &profile_name, &compression_type, profile_data, &profile_length);
80
+#else
81
 				png_get_iCCP(png_ptr, info_ptr, &profile_name, &compression_type, &profile_data, &profile_length);
82
+#endif
83
 
84
 				// copy ICC profile data (must be done after FreeImage_AllocateHeader)
85
 
86
@@ -744,8 +760,9 @@ Load(FreeImageIO *io, fi_handle handle, int page, int flags, void *data) {
87
 			for (png_uint_32 k = 0; k < height; k++) {
88
 				row_pointers[height - 1 - k] = FreeImage_GetScanLine(dib, k);
89
 			}
90
-
91
+#ifdef PNG_BENIGN_ERRORS_SUPPORTED
92
 			png_set_benign_errors(png_ptr, 1);
93
+#endif
94
 			png_read_image(png_ptr, row_pointers);
95
 
96
 			// check if the bitmap contains transparency, if so enable it in the header
97
@@ -991,7 +1008,11 @@ Save(FreeImageIO *io, FIBITMAP *dib, fi_handle handle, int page, int flags, void
98
 
99
 			FIICCPROFILE *iccProfile = FreeImage_GetICCProfile(dib);
100
 			if (iccProfile->size && iccProfile->data) {
101
-				png_set_iCCP(png_ptr, info_ptr, "Embedded Profile", 0, (png_const_bytep)iccProfile->data, iccProfile->size);
102
+#if PNG_LIBPNG_VER_MAJOR == 1 && PNG_LIBPNG_VER_MINOR >= 4 || PNG_LIBPNG_VER_MAJOR > 1
103
+				//png_set_iCCP(png_ptr, info_ptr, "Embedded Profile", 0, (png_const_bytep)iccProfile->data, iccProfile->size);
104
+#else
105
+				png_set_iCCP(png_ptr, info_ptr, "Embedded Profile", 0, (png_charp)iccProfile->data, iccProfile->size);
106
+#endif
107
 			}
108
 
109
 			// write metadata
(-)files/patch-raw-flags (+57 lines)
Line 0 Link Here
1
From: https://sourceforge.net/p/freeimage/patches/125/
2
3
--- Source/FreeImage/PluginRAW.cpp	2015-03-08 20:12:04.000000000 -0500
4
+++ Source/FreeImage/PluginRAW.cpp	2016-06-26 09:10:48.000000000 -0500
5
@@ -702,6 +702,31 @@
6
 		// (-h) outputs the image in 50% size
7
 		RawProcessor->imgdata.params.half_size = ((flags & RAW_HALFSIZE) == RAW_HALFSIZE) ? 1 : 0;
8
 
9
+		// Output Colorspace (-o [0-5]):
10
+		// raw: 
11
+		if ((flags & RAW_COLOR_RAW) == RAW_COLOR_RAW)    RawProcessor->imgdata.params.output_color = 0;
12
+		// sRGB D65:
13
+		if ((flags & RAW_COLOR_SRGB) == RAW_COLOR_SRGB)  RawProcessor->imgdata.params.output_color = 1;
14
+		// Adobe RGB (1998) D65:
15
+		if ((flags & RAW_COLOR_ADOBE) == RAW_COLOR_ADOBE)RawProcessor->imgdata.params.output_color = 2;
16
+		// Wide Gamut RGB D65:
17
+		if ((flags & RAW_COLOR_WIDE) == RAW_COLOR_WIDE) RawProcessor->imgdata.params.output_color = 3;
18
+		// Kodak ProPhoto RGB D65: 
19
+		if ((flags & RAW_COLOR_PROPHOTO) == RAW_COLOR_PROPHOTO) RawProcessor->imgdata.params.output_color = 4;
20
+		// XYZ:
21
+		if ((flags & RAW_COLOR_XYZ) == RAW_COLOR_XYZ) RawProcessor->imgdata.params.output_color = 5;
22
+
23
+		// Demosaic interpolation algorithm  (-q [0-3]):
24
+		// linear interpolatin: 
25
+		if ((flags & RAW_QUAL_LINEAR) == RAW_QUAL_LINEAR)    RawProcessor->imgdata.params.user_qual = 0;
26
+		// Variable Number of Gradients (VNG) interpolation:
27
+		if ((flags & RAW_QUAL_VNG) == RAW_QUAL_VNG)  RawProcessor->imgdata.params.user_qual = 1;
28
+		// Patterned Pixel Grouping (PPG) interpolation:
29
+		if ((flags & RAW_QUAL_PPG) == RAW_QUAL_PPG)RawProcessor->imgdata.params.user_qual = 2;
30
+		// Adaptive Homogeneity-Directed (AHD) interpolation:
31
+		if ((flags & RAW_QUAL_AHD) == RAW_QUAL_AHD) RawProcessor->imgdata.params.user_qual = 3;
32
+
33
+
34
 		// open the datastream
35
 		if(RawProcessor->open_datastream(&datastream) != LIBRAW_SUCCESS) {
36
 			throw "LibRaw : failed to open input stream (unknown format)";
37
diff -ur FreeImage3170.orig\Source\/FreeImage.h FreeImage3170.ggb\Source\/FreeImage.h
38
--- Source/FreeImage.h	2015-03-04 01:17:54.000000000 -0600
39
+++ Source/FreeImage.h	2016-06-26 08:48:10.000000000 -0500
40
@@ -737,6 +737,17 @@
41
 #define RAW_DISPLAY			2		//! load the file as RGB 24-bit
42
 #define RAW_HALFSIZE		4		//! output a half-size color image
43
 #define RAW_UNPROCESSED		8		//! output a FIT_UINT16 raw Bayer image
44
+#define RAW_COLOR_RAW	    0x0010		// raw colorspace
45
+#define RAW_COLOR_SRGB	    0x0020		// sRGB D65 colorspace
46
+#define RAW_COLOR_ADOBE	    0x0040		// Adobe RGB (1998) D65 colorspace
47
+#define RAW_COLOR_WIDE	    0x0080		// Wide Gamut RGB D65 colorspace
48
+#define RAW_COLOR_PROPHOTO  0x0100		// Kodak ProPhoto RGB D65 colorspace
49
+#define RAW_COLOR_XYZ	    0x0200		// XYZ colorspace
50
+#define RAW_COLOR_ACES	    0x0400		// ACES (in dcraw, not yet implemented in libraw)
51
+#define RAW_QUAL_LINEAR	    0x0800		// linear interpolation
52
+#define RAW_QUAL_VNG	    0x1000		// Variable Number of Gradients (VNG) interpolation
53
+#define RAW_QUAL_PPG	    0x2000		// Patterned Pixel Grouping (PPG) interpolation
54
+#define RAW_QUAL_AHD	    0x4000		// Adaptive Homogeneity-Directed (AHD) interpolation
55
 #define SGI_DEFAULT			0
56
 #define TARGA_DEFAULT       0
57
 #define TARGA_LOAD_RGB888   1       //! if set the loader converts RGB555 and ARGB8888 -> RGB888.
(-)files/patch-warnings (+282 lines)
Line 0 Link Here
1
--- Source/FreeImage/PluginGIF.cpp	2017-05-02 13:55:26.070704000 -0400
2
+++ Source/FreeImage/PluginGIF.cpp	2017-05-02 14:15:34.249511000 -0400
3
@@ -825,5 +825,5 @@
4
 						FITAG *tag;
5
 						if( FreeImage_GetMetadataEx(FIMD_ANIMATION, pagedib, "FrameTime", FIDT_LONG, &tag) ) {
6
-							delay_time = *(LONG *)FreeImage_GetTagValue(tag);
7
+							delay_time = *(uint32_t *)FreeImage_GetTagValue(tag);
8
 						}
9
 					}
10
@@ -992,5 +992,5 @@
11
 
12
 			//Application Extension
13
-			LONG loop = 1; //If no AE with a loop count is found, the default must be 1
14
+			uint32_t loop = 1; //If no AE with a loop count is found, the default must be 1
15
 			for( idx = 0; idx < info->application_extension_offsets.size(); idx++ ) {
16
 				io->seek_proc(handle, (long)info->application_extension_offsets[idx], SEEK_SET);
17
@@ -1028,5 +1028,5 @@
18
 				}
19
 				comment.append(1, '\0');
20
-				sprintf(buf, "Comment%d", idx);
21
+				sprintf(buf, "Comment%zu", idx);
22
 				DWORD comment_size = (DWORD)comment.size();
23
 				FreeImage_SetMetadataEx(FIMD_COMMENTS, dib, buf, 1, FIDT_ASCII, comment_size, comment_size, comment.c_str());
24
@@ -1112,5 +1112,5 @@
25
 		}
26
 		if( FreeImage_GetMetadataEx(FIMD_ANIMATION, dib, "FrameTime", FIDT_LONG, &tag) ) {
27
-			delay_time = *(LONG *)FreeImage_GetTagValue(tag);
28
+			delay_time = *(uint32_t *)FreeImage_GetTagValue(tag);
29
 		}
30
 		if( FreeImage_GetMetadataEx(FIMD_ANIMATION, dib, "DisposalMethod", FIDT_BYTE, &tag) ) {
31
@@ -1215,7 +1215,7 @@
32
 
33
 			//Application Extension
34
-			LONG loop = 0;
35
+			uint32_t loop = 0;
36
 			if( FreeImage_GetMetadataEx(FIMD_ANIMATION, dib, "Loop", FIDT_LONG, &tag) ) {
37
-				loop = *(LONG *)FreeImage_GetTagValue(tag);
38
+				loop = *(uint32_t *)FreeImage_GetTagValue(tag);
39
 			}
40
 			if( loop != 1 ) {
41
--- Source/FreeImage/PluginPICT.cpp	2015-03-02 02:07:08.000000000 -0500
42
+++ Source/FreeImage/PluginPICT.cpp	2017-04-14 19:51:56.531330000 -0400
43
@@ -959,5 +959,5 @@
44
 	try {		
45
 		// Skip empty 512 byte header.
46
-		if ( !io->seek_proc(handle, 512, SEEK_CUR) == 0 )
47
+		if (io->seek_proc(handle, 512, SEEK_CUR) != 0)
48
 			return NULL;
49
 		
50
--- Source/FreeImageToolkit/CopyPaste.cpp	2015-03-02 02:07:10.000000000 -0500
51
+++ Source/FreeImageToolkit/CopyPaste.cpp	2017-04-14 19:58:50.520119000 -0400
52
@@ -800,5 +800,5 @@
53
 	unsigned width = FreeImage_GetWidth(dib);
54
 	unsigned height = FreeImage_GetHeight(dib);
55
-	if (left < 0 || right > width || top < 0 || bottom > height) {
56
+	if (right > width || bottom > height) {
57
 		return NULL;
58
 	}
59
--- Source/Metadata/TagConversion.cpp	2015-03-02 02:07:10.000000000 -0500
60
+++ Source/Metadata/TagConversion.cpp	2017-05-02 15:23:47.348985000 -0400
61
@@ -35,8 +35,9 @@
62
 */
63
 static const char* 
64
-ConvertAnyTag(FITAG *tag) {
65
+ConvertAnyTag(const FITAG *tag) {
66
 	char format[MAX_TEXT_EXTENT];
67
 	static std::string buffer;
68
 	DWORD i;
69
+	const void *pv;
70
 
71
 	if(!tag)
72
@@ -49,14 +50,15 @@
73
 	FREE_IMAGE_MDTYPE tag_type = FreeImage_GetTagType(tag);
74
 	DWORD tag_count = FreeImage_GetTagCount(tag);
75
+	pv = FreeImage_GetTagValue(tag);
76
 
77
 	switch(tag_type) {
78
 		case FIDT_BYTE:		// N x 8-bit unsigned integer 
79
 		{
80
-			BYTE *pvalue = (BYTE*)FreeImage_GetTagValue(tag);
81
+			const uint8_t *pvalue = (const uint8_t *)pv;
82
 
83
-			sprintf(format, "%ld",	(LONG) pvalue[0]);
84
+			sprintf(format, "%u", (unsigned)pvalue[0]);
85
 			buffer += format;
86
 			for(i = 1; i < tag_count; i++) {
87
-				sprintf(format, " %ld",	(LONG) pvalue[i]);
88
+				sprintf(format, " %u", (unsigned)pvalue[i]);
89
 				buffer += format;
90
 			}
91
@@ -65,5 +67,5 @@
92
 		case FIDT_SHORT:	// N x 16-bit unsigned integer 
93
 		{
94
-			unsigned short *pvalue = (unsigned short *)FreeImage_GetTagValue(tag);
95
+			const uint16_t *pvalue = (const uint16_t *)pv;
96
 
97
 			sprintf(format, "%hu", pvalue[0]);
98
@@ -77,10 +79,10 @@
99
 		case FIDT_LONG:		// N x 32-bit unsigned integer 
100
 		{
101
-			DWORD *pvalue = (DWORD *)FreeImage_GetTagValue(tag);
102
+			const uint32_t *pvalue = (const uint32_t *)pv;
103
 
104
-			sprintf(format, "%lu", pvalue[0]);
105
+			sprintf(format, "%u", (unsigned)pvalue[0]);
106
 			buffer += format;
107
 			for(i = 1; i < tag_count; i++) {
108
-				sprintf(format, " %lu",	pvalue[i]);
109
+				sprintf(format, " %u",	(unsigned)pvalue[i]);
110
 				buffer += format;
111
 			}
112
@@ -89,10 +91,10 @@
113
 		case FIDT_RATIONAL: // N x 64-bit unsigned fraction 
114
 		{
115
-			DWORD *pvalue = (DWORD*)FreeImage_GetTagValue(tag);
116
+			const uint32_t *pvalue = (const uint32_t *)pv;
117
 
118
-			sprintf(format, "%ld/%ld", pvalue[0], pvalue[1]);
119
+			sprintf(format, "%lu/%lu", (unsigned long)pvalue[0], (unsigned long)pvalue[1]);
120
 			buffer += format;
121
 			for(i = 1; i < tag_count; i++) {
122
-				sprintf(format, " %ld/%ld", pvalue[2*i], pvalue[2*i+1]);
123
+				sprintf(format, " %lu/%lu", (unsigned long)pvalue[2*i], (unsigned long)pvalue[2*i+1]);
124
 				buffer += format;
125
 			}
126
@@ -101,10 +103,10 @@
127
 		case FIDT_SBYTE:	// N x 8-bit signed integer 
128
 		{
129
-			char *pvalue = (char*)FreeImage_GetTagValue(tag);
130
+			const int8_t *pvalue = (const int8_t *)pv;
131
 
132
-			sprintf(format, "%ld",	(LONG) pvalue[0]);
133
+			sprintf(format, "%d", (int)pvalue[0]);
134
 			buffer += format;
135
 			for(i = 1; i < tag_count; i++) {
136
-				sprintf(format, " %ld",	(LONG) pvalue[i]);
137
+				sprintf(format, " %d",	(int)pvalue[i]);
138
 				buffer += format;
139
 			}
140
@@ -113,10 +115,10 @@
141
 		case FIDT_SSHORT:	// N x 16-bit signed integer 
142
 		{
143
-			short *pvalue = (short *)FreeImage_GetTagValue(tag);
144
+			const int16_t *pvalue = (const int16_t *)pv;
145
 
146
-			sprintf(format, "%hd", pvalue[0]);
147
+			sprintf(format, "%hd", (short)pvalue[0]);
148
 			buffer += format;
149
 			for(i = 1; i < tag_count; i++) {
150
-				sprintf(format, " %hd",	pvalue[i]);
151
+				sprintf(format, " %hd",	(short)pvalue[i]);
152
 				buffer += format;
153
 			}
154
@@ -125,10 +127,10 @@
155
 		case FIDT_SLONG:	// N x 32-bit signed integer 
156
 		{
157
-			LONG *pvalue = (LONG *)FreeImage_GetTagValue(tag);
158
+			const int32_t *pvalue = (const int32_t *)pv;
159
 
160
-			sprintf(format, "%ld", pvalue[0]);
161
+			sprintf(format, "%ld", (long)pvalue[0]);
162
 			buffer += format;
163
 			for(i = 1; i < tag_count; i++) {
164
-				sprintf(format, " %ld",	pvalue[i]);
165
+				sprintf(format, " %ld",	(long)pvalue[i]);
166
 				buffer += format;
167
 			}
168
@@ -137,10 +139,10 @@
169
 		case FIDT_SRATIONAL:// N x 64-bit signed fraction 
170
 		{
171
-			LONG *pvalue = (LONG*)FreeImage_GetTagValue(tag);
172
+			const int64_t *pvalue = (const int64_t *)pv;
173
 
174
-			sprintf(format, "%ld/%ld", pvalue[0], pvalue[1]);
175
+			sprintf(format, "%ld/%ld", (long)pvalue[0], (long)pvalue[1]);
176
 			buffer += format;
177
 			for(i = 1; i < tag_count; i++) {
178
-				sprintf(format, " %ld/%ld", pvalue[2*i], pvalue[2*i+1]);
179
+				sprintf(format, " %ld/%ld", (long)pvalue[2*i], (long)pvalue[2*i+1]);
180
 				buffer += format;
181
 			}
182
@@ -149,5 +151,5 @@
183
 		case FIDT_FLOAT:	// N x 32-bit IEEE floating point 
184
 		{
185
-			float *pvalue = (float *)FreeImage_GetTagValue(tag);
186
+			const float *pvalue = (const float *)pv;
187
 
188
 			sprintf(format, "%f", (double) pvalue[0]);
189
@@ -161,5 +163,5 @@
190
 		case FIDT_DOUBLE:	// N x 64-bit IEEE floating point 
191
 		{
192
-			double *pvalue = (double *)FreeImage_GetTagValue(tag);
193
+			const double *pvalue = (const double *)pv;
194
 
195
 			sprintf(format, "%f", pvalue[0]);
196
@@ -173,10 +175,10 @@
197
 		case FIDT_IFD:		// N x 32-bit unsigned integer (offset) 
198
 		{
199
-			DWORD *pvalue = (DWORD *)FreeImage_GetTagValue(tag);
200
+			const uint32_t *pvalue = (const uint32_t *)pv;
201
 
202
-			sprintf(format, "%X", pvalue[0]);
203
+			sprintf(format, "%lX", (unsigned long)pvalue[0]);
204
 			buffer += format;
205
 			for(i = 1; i < tag_count; i++) {
206
-				sprintf(format, " %X",	pvalue[i]);
207
+				sprintf(format, " %lX",	(unsigned long)pvalue[i]);
208
 				buffer += format;
209
 			}
210
@@ -185,5 +187,5 @@
211
 		case FIDT_PALETTE:	// N x 32-bit RGBQUAD 
212
 		{
213
-			RGBQUAD *pvalue = (RGBQUAD *)FreeImage_GetTagValue(tag);
214
+			const RGBQUAD *pvalue = (const RGBQUAD *)pv;
215
 
216
 			sprintf(format, "(%d,%d,%d,%d)", pvalue[0].rgbRed, pvalue[0].rgbGreen, pvalue[0].rgbBlue, pvalue[0].rgbReserved);
217
@@ -198,10 +200,10 @@
218
 		case FIDT_LONG8:	// N x 64-bit unsigned integer 
219
 		{
220
-			UINT64 *pvalue = (UINT64 *)FreeImage_GetTagValue(tag);
221
+			const uint64_t *pvalue = (const uint64_t *)pv;
222
 
223
-			sprintf(format, "%ld", pvalue[0]);
224
+			sprintf(format, "%llu", (unsigned long long)pvalue[0]);
225
 			buffer += format;
226
 			for(i = 1; i < tag_count; i++) {
227
-				sprintf(format, "%ld", pvalue[i]);
228
+				sprintf(format, "%llu", (unsigned long long)pvalue[i]);
229
 				buffer += format;
230
 			}
231
@@ -211,10 +213,10 @@
232
 		case FIDT_IFD8:		// N x 64-bit unsigned integer (offset)
233
 		{
234
-			UINT64 *pvalue = (UINT64 *)FreeImage_GetTagValue(tag);
235
+			const uint64_t *pvalue = (const uint64_t *)pv;
236
 
237
-			sprintf(format, "%X", pvalue[0]);
238
+			sprintf(format, "%llX", (unsigned long long)pvalue[0]);
239
 			buffer += format;
240
 			for(i = 1; i < tag_count; i++) {
241
-				sprintf(format, "%X", pvalue[i]);
242
+				sprintf(format, "%llX", (unsigned long long)pvalue[i]);
243
 				buffer += format;
244
 			}
245
@@ -224,10 +226,10 @@
246
 		case FIDT_SLONG8:	// N x 64-bit signed integer
247
 		{
248
-			INT64 *pvalue = (INT64 *)FreeImage_GetTagValue(tag);
249
+			const int64_t *pvalue = (const int64_t *)pv;
250
 
251
-			sprintf(format, "%ld", pvalue[0]);
252
+			sprintf(format, "%lld", (long long)pvalue[0]);
253
 			buffer += format;
254
 			for(i = 1; i < tag_count; i++) {
255
-				sprintf(format, "%ld", pvalue[i]);
256
+				sprintf(format, "%lld", (long long)pvalue[i]);
257
 				buffer += format;
258
 			}
259
@@ -242,5 +244,5 @@
260
 			if(max_size == MAX_TEXT_EXTENT)
261
 				max_size--;
262
-			memcpy(format, (char*)FreeImage_GetTagValue(tag), max_size);
263
+			memcpy(format, pv, max_size);
264
 			format[max_size] = '\0';
265
 			buffer += format;
266
@@ -256,5 +258,5 @@
267
 */
268
 static const char* 
269
-ConvertExifTag(FITAG *tag) {
270
+ConvertExifTag(const FITAG *tag) {
271
 	char format[MAX_TEXT_EXTENT];
272
 	static std::string buffer;
273
--- TestAPI/MainTestSuite.cpp	2015-02-25 09:08:38.000000000 -0500
274
+++ TestAPI/MainTestSuite.cpp	2017-04-15 01:18:24.712061000 -0400
275
@@ -35,6 +35,5 @@
276
 		printf("%s Format\n", FreeImage_GetFormatFromFIF(fif));
277
 	}
278
-	printf(message);
279
-	printf(" ***\n");
280
+	printf("%s ***\n", message);
281
 }
282
 
(-)files/patch-webp (+18 lines)
Line 0 Link Here
1
--- Source/FreeImage/PluginWebP.cpp	2015-03-02 02:07:08.000000000 -0500
2
+++ Source/FreeImage/PluginWebP.cpp	2017-04-15 00:38:52.407279000 -0400
3
@@ -23,10 +23,10 @@
4
 #include "Utilities.h"
5
 
6
-#include "../Metadata/FreeImageTag.h"
7
+#include <FreeImageTag.h>
8
 
9
-#include "../LibWebP/src/webp/decode.h"
10
-#include "../LibWebP/src/webp/encode.h"
11
-#include "../LibWebP/src/enc/vp8enci.h"
12
-#include "../LibWebP/src/webp/mux.h"
13
+#include <decode.h>
14
+#include <encode.h>
15
+
16
+#include <mux.h>
17
 
18
 // ==========================================================
(-)files/patch-xtiff (+125 lines)
Line 0 Link Here
1
Adapted from Debian:
2
	From: Ghislain Antony Vaillant <ghisvail@gmail.com>
3
	Date: Tue, 3 Nov 2015 14:39:33 +0000
4
	Subject: Disable vendored dependencies.
5
6
[...]
7
8
This patch is based on Fedora's FreeImage-3.17.0_unbundle patch.
9
--- Source/Metadata/XTIFF.cpp
10
+++ Source/Metadata/XTIFF.cpp
11
@@ -29,13 +29,18 @@
12
 #pragma warning (disable : 4786) // identifier was truncated to 'number' characters
13
 #endif
14
 
15
-#include "../LibTIFF4/tiffiop.h"
16
+#include <tiffio.h>
17
 
18
 #include "FreeImage.h"
19
 #include "Utilities.h"
20
 #include "FreeImageTag.h"
21
 #include "FIRational.h"
22
 
23
+extern "C"
24
+{
25
+    int _TIFFDataSize(TIFFDataType type);
26
+}
27
+
28
 // ----------------------------------------------------------
29
 //   Extended TIFF Directory GEO Tag Support
30
 // ----------------------------------------------------------
31
@@ -224,6 +229,33 @@ tiff_write_geotiff_profile(TIFF *tif, FIBITMAP *dib) {
32
 //   TIFF EXIF tag reading & writing
33
 // ----------------------------------------------------------
34
 
35
+static uint32 exif_tag_ids[] = {
36
+  EXIFTAG_EXPOSURETIME, EXIFTAG_FNUMBER, EXIFTAG_EXPOSUREPROGRAM,
37
+  EXIFTAG_SPECTRALSENSITIVITY, EXIFTAG_ISOSPEEDRATINGS, EXIFTAG_OECF,
38
+  EXIFTAG_EXIFVERSION, EXIFTAG_DATETIMEORIGINAL, EXIFTAG_DATETIMEDIGITIZED,
39
+  EXIFTAG_COMPONENTSCONFIGURATION, EXIFTAG_COMPRESSEDBITSPERPIXEL,
40
+  EXIFTAG_SHUTTERSPEEDVALUE, EXIFTAG_APERTUREVALUE,
41
+  EXIFTAG_BRIGHTNESSVALUE, EXIFTAG_EXPOSUREBIASVALUE,
42
+  EXIFTAG_MAXAPERTUREVALUE, EXIFTAG_SUBJECTDISTANCE, EXIFTAG_METERINGMODE,
43
+  EXIFTAG_LIGHTSOURCE, EXIFTAG_FLASH, EXIFTAG_FOCALLENGTH,
44
+  EXIFTAG_SUBJECTAREA, EXIFTAG_MAKERNOTE, EXIFTAG_USERCOMMENT,
45
+  EXIFTAG_SUBSECTIME, EXIFTAG_SUBSECTIMEORIGINAL,
46
+  EXIFTAG_SUBSECTIMEDIGITIZED, EXIFTAG_FLASHPIXVERSION, EXIFTAG_COLORSPACE,
47
+  EXIFTAG_PIXELXDIMENSION, EXIFTAG_PIXELYDIMENSION,
48
+  EXIFTAG_RELATEDSOUNDFILE, EXIFTAG_FLASHENERGY,
49
+  EXIFTAG_SPATIALFREQUENCYRESPONSE, EXIFTAG_FOCALPLANEXRESOLUTION,
50
+  EXIFTAG_FOCALPLANEYRESOLUTION, EXIFTAG_FOCALPLANERESOLUTIONUNIT,
51
+  EXIFTAG_SUBJECTLOCATION, EXIFTAG_EXPOSUREINDEX, EXIFTAG_SENSINGMETHOD,
52
+  EXIFTAG_FILESOURCE, EXIFTAG_SCENETYPE, EXIFTAG_CFAPATTERN,
53
+  EXIFTAG_CUSTOMRENDERED, EXIFTAG_EXPOSUREMODE, EXIFTAG_WHITEBALANCE,
54
+  EXIFTAG_DIGITALZOOMRATIO, EXIFTAG_FOCALLENGTHIN35MMFILM,
55
+  EXIFTAG_SCENECAPTURETYPE, EXIFTAG_GAINCONTROL, EXIFTAG_CONTRAST,
56
+  EXIFTAG_SATURATION, EXIFTAG_SHARPNESS, EXIFTAG_DEVICESETTINGDESCRIPTION,
57
+  EXIFTAG_SUBJECTDISTANCERANGE, EXIFTAG_GAINCONTROL, EXIFTAG_GAINCONTROL,
58
+  EXIFTAG_IMAGEUNIQUEID
59
+};
60
+static int nExifTags = sizeof(exif_tag_ids) / sizeof(exif_tag_ids[0]);
61
+
62
 /**
63
 Read a single Exif tag
64
 
65
@@ -575,43 +607,10 @@ tiff_read_exif_tags(TIFF *tif, TagLib::MDMODEL md_model, FIBITMAP *dib) {
66
 
67
 	// loop over all Core Directory Tags
68
 	// ### uses private data, but there is no other way
69
+	// -> Fedora: Best we can do without private headers is to hard-code a list of known EXIF tags and read those
70
 	if(md_model == TagLib::EXIF_MAIN) {
71
-		const TIFFDirectory *td = &tif->tif_dir;
72
-
73
-		uint32 lastTag = 0;	//<- used to prevent reading some tags twice (as stored in tif_fieldinfo)
74
-
75
-		for (int fi = 0, nfi = (int)tif->tif_nfields; nfi > 0; nfi--, fi++) {
76
-			const TIFFField *fld = tif->tif_fields[fi];
77
-
78
-			const uint32 tag_id = TIFFFieldTag(fld);
79
-
80
-			if(tag_id == lastTag) {
81
-				continue;
82
-			}
83
-
84
-			// test if tag value is set
85
-			// (lifted directly from LibTiff _TIFFWriteDirectory)
86
-
87
-			if( fld->field_bit == FIELD_CUSTOM ) {
88
-				int is_set = FALSE;
89
-
90
-				for(int ci = 0; ci < td->td_customValueCount; ci++ ) {
91
-					is_set |= (td->td_customValues[ci].info == fld);
92
-				}
93
-
94
-				if( !is_set ) {
95
-					continue;
96
-				}
97
-
98
-			} else if(!TIFFFieldSet(tif, fld->field_bit)) {
99
-				continue;
100
-			}
101
-
102
-			// process *all* other tags (some will be ignored)
103
-
104
-			tiff_read_exif_tag(tif, tag_id, dib, md_model);
105
-
106
-			lastTag = tag_id;
107
+		for (int i = 0; i < nExifTags; ++i) {
108
+			tiff_read_exif_tag(tif, exif_tag_ids[i], dib, md_model);
109
 		}
110
 
111
 	}
112
@@ -723,10 +722,9 @@ tiff_write_exif_tags(TIFF *tif, TagLib::MDMODEL md_model, FIBITMAP *dib) {
113
 	
114
 	TagLib& tag_lib = TagLib::instance();
115
 	
116
-	for (int fi = 0, nfi = (int)tif->tif_nfields; nfi > 0; nfi--, fi++) {
117
-		const TIFFField *fld = tif->tif_fields[fi];
118
-		
119
-		const uint32 tag_id = TIFFFieldTag(fld);
120
+	for (int fi = 0, nfi = nExifTags; nfi > 0; nfi--, fi++) {
121
+		const uint32 tag_id = exif_tag_ids[fi];
122
+		const TIFFField *fld = TIFFFieldWithTag(tif, tag_id);
123
 
124
 		if(skip_write_field(tif, tag_id)) {
125
 			// skip tags that are already handled by the LibTIFF writing process
(-)files/patch-zutil (+14 lines)
Line 0 Link Here
1
Do not include zutil.h -- we only need it for OS_CODE and we simply
2
supply that #define on command-line...
3
--- Source/FreeImage/ZLibInterface.cpp	2015-03-02 02:07:10.000000000 -0500
4
+++ Source/FreeImage/ZLibInterface.cpp	2017-04-14 18:05:32.342316000 -0400
5
@@ -20,8 +20,7 @@
6
 // ==========================================================
7
 
8
-#include "../ZLib/zlib.h"
9
+#include <zlib.h>
10
 #include "FreeImage.h"
11
 #include "Utilities.h"
12
-#include "../ZLib/zutil.h"	/* must be the last header because of error C3163 in VS2008 (_vsnprintf defined in stdio.h) */
13
 
14
 /**
(-)pkg-plist (+8 lines)
Line 0 Link Here
1
include/FreeImage.h
2
include/FreeImagePlus.h
3
lib/libfreeimage.a
4
lib/libfreeimage.so.3
5
lib/libfreeimage.so
6
lib/libfreeimageplus.a
7
lib/libfreeimageplus.so.3
8
lib/libfreeimageplus.so

Return to bug 218681