Fix #20146:
[blender.git] / source / blender / imbuf / intern / dynlibtiff.c
1 /**
2  * Dynamically loaded libtiff support.
3  *
4  * This file is automatically generated by the gen_dynlibtiff.py script.
5  * 
6  * ***** BEGIN GPL LICENSE BLOCK *****
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; either version 2
11  * of the License, or (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software Foundation,
20  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
21  *
22  * Contributor(s): Jonathan Merritt.
23  *
24  * ***** END GPL LICENSE BLOCK *****
25  */
26  
27 /**
28  * To use the dynamic libtiff support, you must initialize the library using:
29  *      libtiff_init()
30  * This attempts to load libtiff dynamically at runtime.  G.have_libtiff will
31  * be set to indicate whether or not libtiff is available.  If libtiff is
32  * not available, Blender can proceed with no ill effects, provided that
33  * it does not attempt to use any of the libtiff_ functions.  When you're
34  * finished, close the library with:
35  *      libtiff_exit()
36  * These functions are both declared in IMB_imbuf.h
37  *
38  * The functions provided by dyn_libtiff.h are the same as those in the
39  * normal static / shared libtiff, except that they are prefixed by the 
40  * string "libtiff_" to indicate that they belong to a dynamically-loaded 
41  * version.
42  */
43 #include "dynlibtiff.h"
44
45 #include <assert.h>
46 #include <stdio.h>
47 #include <stdlib.h>
48
49 #include "BLI_blenlib.h"
50
51 #include "imbuf.h"
52 #include "imbuf_patch.h"
53 #include "IMB_imbuf.h"
54
55 #include "BKE_global.h"
56 #include "PIL_dynlib.h"
57
58 /*********************
59  * LOCAL DEFINITIONS *
60  *********************/
61 PILdynlib *libtiff = NULL;
62 void  libtiff_loadlibtiff(void);
63 void* libtiff_findsymbol(char*);
64 int   libtiff_load_symbols(void);
65
66
67 /**************************
68  * LIBRARY INITIALIZATION *
69  **************************/
70
71 void libtiff_loadlibtiff(void)
72 {
73         char *filename;
74         libtiff = NULL;
75
76         filename = getenv("BF_TIFF_LIB");
77         if (filename) libtiff = PIL_dynlib_open(filename);
78         if (libtiff != NULL)  return;
79
80         /* Try to find libtiff in a couple of standard places */
81 #ifdef __APPLE__
82         /* OSX has version specific library */
83         //standard install location
84         libtiff = PIL_dynlib_open("/usr/local/lib/libtiff.dylib");
85         if (libtiff != NULL)  return;
86         libtiff = PIL_dynlib_open("/usr/local/lib/libtiff.3.dylib");
87         if (libtiff != NULL)  return;
88         libtiff = PIL_dynlib_open("/usr/local/lib/libtiff.4.dylib");
89         if (libtiff != NULL)  return;
90         //inside the blender app package contents/resources
91         libtiff = PIL_dynlib_open("@executable_path/../resources/libtiff.dylib");
92         if (libtiff != NULL)  return;
93         libtiff = PIL_dynlib_open("@executable_path/../resources/libtiff.3.dylib");
94         if (libtiff != NULL)  return;
95         libtiff = PIL_dynlib_open("@executable_path/../resources/libtiff.4.dylib");
96         if (libtiff != NULL)  return;
97         //inside the blender app package contents/frameworks
98         libtiff = PIL_dynlib_open("@executable_path/../frameworks/libtiff.dylib");
99         if (libtiff != NULL)  return;
100         libtiff = PIL_dynlib_open("@executable_path/../frameworks/libtiff.3.dylib");
101         if (libtiff != NULL)  return;
102         libtiff = PIL_dynlib_open("@executable_path/../frameworks/libtiff.4.dylib");
103         if (libtiff != NULL)  return;
104         //along side the blender app package
105         libtiff = PIL_dynlib_open("@executable_path/../../../libtiff.dylib");
106         if (libtiff != NULL)  return;
107         libtiff = PIL_dynlib_open("@executable_path/../../../libtiff.3.dylib");
108         if (libtiff != NULL)  return;
109         libtiff = PIL_dynlib_open("@executable_path/../../../libtiff.4.dylib");
110         if (libtiff != NULL)  return;
111         //inside the blender app package contents/MacOS
112         libtiff = PIL_dynlib_open("@executable_path/libtiff.dylib");
113         if (libtiff != NULL)  return;
114         libtiff = PIL_dynlib_open("@executable_path/libtiff.3.dylib");
115         if (libtiff != NULL)  return;
116         libtiff = PIL_dynlib_open("@executable_path/libtiff.4.dylib");
117         if (libtiff != NULL)  return;
118 #else
119         libtiff = PIL_dynlib_open("libtiff.so");
120         if (libtiff != NULL)  return;
121         libtiff = PIL_dynlib_open("libtiff.so.3");
122         if (libtiff != NULL)  return;
123         libtiff = PIL_dynlib_open("libtiff.so.4");
124         if (libtiff != NULL)  return;
125         libtiff = PIL_dynlib_open("libtiff.dll");
126         if (libtiff != NULL)  return;
127         libtiff = PIL_dynlib_open("/usr/lib/libtiff.so");
128         if (libtiff != NULL)  return;
129         libtiff = PIL_dynlib_open("/usr/lib/libtiff.so.3");
130         if (libtiff != NULL)  return;
131         libtiff = PIL_dynlib_open("/usr/lib/libtiff.so.4");
132         if (libtiff != NULL)  return;
133 #ifdef __x86_64__
134         libtiff = PIL_dynlib_open("/usr/lib64/libtiff.so");
135         if (libtiff != NULL)  return;
136         libtiff = PIL_dynlib_open("/usr/lib64/libtiff.so.3");
137         if (libtiff != NULL)  return;
138         libtiff = PIL_dynlib_open("/usr/lib64/libtiff.so.4");
139         if (libtiff != NULL)  return;
140 #endif
141         libtiff = PIL_dynlib_open("/usr/local/lib/libtiff.so");
142         if (libtiff != NULL)  return;
143         /* For solaris */
144         libtiff = PIL_dynlib_open("/usr/openwin/lib/libtiff.so");
145 #endif
146
147 }
148
149 void *libtiff_findsymbol(char *name)
150 {
151         void *symbol = NULL;
152         assert(libtiff != NULL);
153         symbol = PIL_dynlib_find_symbol(libtiff, name);
154         if (symbol == NULL) {
155                 char *err = PIL_dynlib_get_error_as_string(libtiff);
156
157                 if (err) printf("libtiff_findsymbol: error %s\n",err);
158                 else printf("libtiff_findsymbol: error Unknown.\n");
159
160                 libtiff = NULL;
161                 G.have_libtiff = (0);
162                 return NULL;
163         }
164         return symbol;
165 }
166
167 void libtiff_init(void)
168 {
169         if (libtiff != NULL) {
170                 printf("libtiff_init: Attempted to load libtiff twice!\n");
171                 return;
172         }
173         libtiff_loadlibtiff();
174         G.have_libtiff = ((libtiff != NULL) && (libtiff_load_symbols()));
175 }
176
177 void libtiff_exit(void)
178 {
179         if (libtiff != NULL) {
180                 PIL_dynlib_close(libtiff);
181                 libtiff = NULL;
182         }
183 }
184
185
186 int libtiff_load_symbols(void)
187 {
188         /* Attempt to load TIFFClientOpen */
189         libtiff_TIFFClientOpen = libtiff_findsymbol("TIFFClientOpen");
190         if (libtiff_TIFFClientOpen == NULL) {
191                 return (0);
192         }
193         /* Attempt to load TIFFClose */
194         libtiff_TIFFClose = libtiff_findsymbol("TIFFClose");
195         if (libtiff_TIFFClose == NULL) {
196                 return (0);
197         }
198         /* Attempt to load TIFFGetField */
199         libtiff_TIFFGetField = libtiff_findsymbol("TIFFGetField");
200         if (libtiff_TIFFGetField == NULL) {
201                 return (0);
202         }
203         /* Attempt to load TIFFOpen */
204         libtiff_TIFFOpen = libtiff_findsymbol("TIFFOpen");
205         if (libtiff_TIFFOpen == NULL) {
206                 return (0);
207         }
208         /* Attempt to load TIFFReadRGBAImage */
209         libtiff_TIFFReadRGBAImage = libtiff_findsymbol("TIFFReadRGBAImage");
210         if (libtiff_TIFFReadRGBAImage == NULL) {
211                 return (0);
212         }
213         /* Attempt to load TIFFSetField */
214         libtiff_TIFFSetField = libtiff_findsymbol("TIFFSetField");
215         if (libtiff_TIFFSetField == NULL) {
216                 return (0);
217         }
218         /* Attempt to load TIFFWriteEncodedStrip */
219         libtiff_TIFFWriteEncodedStrip = libtiff_findsymbol("TIFFWriteEncodedStrip");
220         if (libtiff_TIFFWriteEncodedStrip == NULL) {
221                 return (0);
222         }
223         /* Attempt to load _TIFFfree */
224         libtiff__TIFFfree = libtiff_findsymbol("_TIFFfree");
225         if (libtiff__TIFFfree == NULL) {
226                 return (0);
227         }
228         /* Attempt to load _TIFFmalloc */
229         libtiff__TIFFmalloc = libtiff_findsymbol("_TIFFmalloc");
230         if (libtiff__TIFFmalloc == NULL) {
231                 return (0);
232         }
233         return (1);
234 }
235
236         
237 /*******************
238  * SYMBOL POINTERS *
239  *******************/
240
241 TIFF* (*libtiff_TIFFClientOpen)(const char*, const char*, thandle_t, TIFFReadWriteProc, TIFFReadWriteProc, TIFFSeekProc, TIFFCloseProc, TIFFSizeProc, TIFFMapFileProc, TIFFUnmapFileProc) = NULL;
242 void (*libtiff_TIFFClose)(TIFF*) = NULL;
243 int (*libtiff_TIFFGetField)(TIFF*, ttag_t, ...) = NULL;
244 TIFF* (*libtiff_TIFFOpen)(const char*, const char*) = NULL;
245 int (*libtiff_TIFFReadRGBAImage)(TIFF*, uint32, uint32, uint32*, int) = NULL;
246 int (*libtiff_TIFFSetField)(TIFF*, ttag_t, ...) = NULL;
247 tsize_t (*libtiff_TIFFWriteEncodedStrip)(TIFF*, tstrip_t, tdata_t, tsize_t) = NULL;
248 void (*libtiff__TIFFfree)(tdata_t) = NULL;
249 tdata_t (*libtiff__TIFFmalloc)(tsize_t) = NULL;