]> Creatis software - clitk.git/blob - utilities/CxImage/tif_xfile.cpp
CxImage sources taken from
[clitk.git] / utilities / CxImage / tif_xfile.cpp
1 /*\r
2  * TIFF file IO, using CxFile.\r
3  */\r
4 \r
5 #ifdef WIN32\r
6  #include <windows.h>\r
7 #endif\r
8 #include <stdio.h>\r
9 \r
10 #include "ximage.h"\r
11 \r
12 #if CXIMAGE_SUPPORT_TIF\r
13 \r
14 #include "../tiff/tiffiop.h"\r
15 \r
16 #include "xfile.h"\r
17 \r
18 static tsize_t \r
19 _tiffReadProcEx(thandle_t fd, tdata_t buf, tsize_t size)\r
20 {\r
21         return (tsize_t)((CxFile*)fd)->Read(buf, 1, size);\r
22 }\r
23 \r
24 static tsize_t\r
25 _tiffWriteProcEx(thandle_t fd, tdata_t buf, tsize_t size)\r
26 {\r
27         return (tsize_t)((CxFile*)fd)->Write(buf, 1, size);\r
28 }\r
29 \r
30 static toff_t\r
31 _tiffSeekProcEx(thandle_t fd, toff_t off, int whence)\r
32 {\r
33         if ( off == 0xFFFFFFFF ) \r
34                 return 0xFFFFFFFF;\r
35         if (!((CxFile*)fd)->Seek(off, whence))\r
36                 return 0xFFFFFFFF;\r
37         if (whence == SEEK_SET)\r
38                 return off;\r
39 \r
40         return (toff_t)((CxFile*)fd)->Tell();\r
41 }\r
42 \r
43 // Return nonzero if error\r
44 static int\r
45 _tiffCloseProcEx(thandle_t /*fd*/)\r
46 {\r
47 //      return !((CxFile*)fd)->Close(); // "//" needed for memory files <DP>\r
48         return 0;\r
49 }\r
50 \r
51 #include <sys/stat.h>\r
52 \r
53 static toff_t\r
54 _tiffSizeProcEx(thandle_t fd)\r
55 {\r
56         return ((CxFile*)fd)->Size();\r
57 }\r
58 \r
59 static int\r
60 _tiffMapProcEx(thandle_t /*fd*/, tdata_t* /*pbase*/, toff_t* /*psize*/)\r
61 {\r
62         return (0);\r
63 }\r
64 \r
65 static void\r
66 _tiffUnmapProcEx(thandle_t /*fd*/, tdata_t /*base*/, toff_t /*size*/)\r
67 {\r
68 }\r
69 \r
70 // Open a TIFF file descriptor for read/writing.\r
71 /*\r
72 TIFF*\r
73 TIFFOpen(const char* name, const char* mode)\r
74 {\r
75         static const char module[] = "TIFFOpen";\r
76    FILE* stream = fopen(name, mode);\r
77         if (stream == NULL) \r
78    {\r
79                 TIFFError(module, "%s: Cannot open", name);\r
80                 return NULL;\r
81         }\r
82         return (TIFFFdOpen((int)stream, name, mode));\r
83 }\r
84 */\r
85 \r
86 TIFF*\r
87 _TIFFFdOpen(void* fd, const char* name, const char* mode)\r
88 {\r
89         TIFF* tif;\r
90 \r
91         tif = TIFFClientOpen(name, mode,\r
92             (thandle_t) fd,\r
93             _tiffReadProcEx, _tiffWriteProcEx, _tiffSeekProcEx, _tiffCloseProcEx,\r
94             _tiffSizeProcEx, _tiffMapProcEx, _tiffUnmapProcEx);\r
95         if (tif)\r
96                 tif->tif_fd = fd;\r
97         return (tif);\r
98 }\r
99 \r
100 extern "C" TIFF* _TIFFOpenEx(CxFile* stream, const char* mode)\r
101 {\r
102         return (_TIFFFdOpen(stream, "TIFF IMAGE", mode));\r
103 }\r
104 \r
105 #ifdef __GNUC__\r
106 extern  char* malloc();\r
107 extern  char* realloc();\r
108 #else\r
109 #include <malloc.h>\r
110 #endif\r
111 \r
112 tdata_t\r
113 _TIFFmalloc(tsize_t s)\r
114 {\r
115         return (malloc((size_t) s));\r
116 }\r
117 \r
118 void\r
119 _TIFFfree(tdata_t p)\r
120 {\r
121         free(p);\r
122 }\r
123 \r
124 tdata_t\r
125 _TIFFrealloc(tdata_t p, tsize_t s)\r
126 {\r
127         return (realloc(p, (size_t) s));\r
128 }\r
129 \r
130 void\r
131 _TIFFmemset(tdata_t p, int v, tsize_t c)\r
132 {\r
133         memset(p, v, (size_t) c);\r
134 }\r
135 \r
136 void\r
137 _TIFFmemcpy(tdata_t d, const tdata_t s, tsize_t c)\r
138 {\r
139         memcpy(d, s, (size_t) c);\r
140 }\r
141 \r
142 int\r
143 _TIFFmemcmp(const tdata_t p1, const tdata_t p2, tsize_t c)\r
144 {\r
145         return (memcmp(p1, p2, (size_t) c));\r
146 }\r
147 \r
148 #ifndef UNICODE\r
149 #define DbgPrint wvsprintf\r
150 #define DbgPrint2 wsprintf\r
151 #define DbgMsgBox MessageBox\r
152 #else\r
153 #define DbgPrint wvsprintfA\r
154 #define DbgPrint2 wsprintfA\r
155 #define DbgMsgBox MessageBoxA\r
156 #endif\r
157 \r
158 static void\r
159 Win32WarningHandler(const char* module, const char* fmt, va_list ap)\r
160 {\r
161 #ifdef _DEBUG\r
162 #if (!defined(_CONSOLE) && !defined(_WIN32_WCE) && defined(WIN32))\r
163         LPSTR szTitle;\r
164         LPSTR szTmp;\r
165         LPCSTR szTitleText = "%s Warning";\r
166         LPCSTR szDefaultModule = "TIFFLIB";\r
167         szTmp = (module == NULL) ? (LPSTR)szDefaultModule : (LPSTR)module;\r
168         if ((szTitle = (LPSTR)LocalAlloc(LMEM_FIXED, (strlen(szTmp) +\r
169                         strlen(szTitleText) + strlen(fmt) + 128))) == NULL)\r
170                 return;\r
171         DbgPrint2(szTitle, szTitleText, szTmp);\r
172         szTmp = szTitle + (strlen(szTitle)+2);\r
173         DbgPrint(szTmp, fmt, ap);\r
174         DbgMsgBox(GetFocus(), szTmp, szTitle, MB_OK | MB_ICONINFORMATION);\r
175         LocalFree(szTitle);\r
176         return;\r
177 #else\r
178         if (module != NULL)\r
179                 fprintf(stderr, "%s: ", module);\r
180         fprintf(stderr, "Warning, ");\r
181         vfprintf(stderr, fmt, ap);\r
182         fprintf(stderr, ".\n");\r
183 #endif\r
184 #endif\r
185 }\r
186 TIFFErrorHandler _TIFFwarningHandler = Win32WarningHandler;\r
187 \r
188 static void\r
189 Win32ErrorHandler(const char* module, const char* fmt, va_list ap)\r
190 {\r
191 #ifdef _DEBUG\r
192 #if (!defined(_CONSOLE) && !defined(_WIN32_WCE) && defined(WIN32))\r
193         LPSTR szTitle;\r
194         LPSTR szTmp;\r
195         LPCSTR szTitleText = "%s Error";\r
196         LPCSTR szDefaultModule = "TIFFLIB";\r
197         szTmp = (module == NULL) ? (LPSTR)szDefaultModule : (LPSTR)module;\r
198         if ((szTitle = (LPSTR)LocalAlloc(LMEM_FIXED, (strlen(szTmp) +\r
199                         strlen(szTitleText) + strlen(fmt) + 128))) == NULL)\r
200                 return;\r
201         DbgPrint2(szTitle, szTitleText, szTmp);\r
202         szTmp = szTitle + (strlen(szTitle)+2);\r
203         DbgPrint(szTmp, fmt, ap);\r
204         DbgMsgBox(GetFocus(), szTmp, szTitle, MB_OK | MB_ICONEXCLAMATION);\r
205         LocalFree(szTitle);\r
206         return;\r
207 #else\r
208         if (module != NULL)\r
209                 fprintf(stderr, "%s: ", module);\r
210         vfprintf(stderr, fmt, ap);\r
211         fprintf(stderr, ".\n");\r
212 #endif\r
213 #endif\r
214 }\r
215 TIFFErrorHandler _TIFFerrorHandler = Win32ErrorHandler;\r
216 \r
217 #endif\r
218 \r