1 | // Copyright (c) 2004 - 2005 Kai Bader <baderk@in.tum.de> |
---|
2 | // |
---|
3 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
---|
4 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
---|
5 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
---|
6 | // AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN |
---|
7 | // AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
---|
8 | // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
---|
9 | |
---|
10 | // CVS REVISION TAG -- $Revision: 4876 $ |
---|
11 | |
---|
12 | #include "tiff_image.hxx" |
---|
13 | |
---|
14 | |
---|
15 | /**************************************************************************** |
---|
16 | * TIFFIMAGE - CONSTRUCTOR |
---|
17 | ****************************************************************************/ |
---|
18 | TIFFimage::TIFFimage() |
---|
19 | { |
---|
20 | // PREDEFINE THE CLASS VARIABLES |
---|
21 | m_array= NULL; |
---|
22 | m_width= 0; |
---|
23 | m_height= 0; |
---|
24 | m_size= 0; |
---|
25 | m_ximage_colormap= false; |
---|
26 | m_hasData= false; |
---|
27 | } |
---|
28 | |
---|
29 | |
---|
30 | /**************************************************************************** |
---|
31 | * TIFFIMAGE - DESTRUCTOR |
---|
32 | ****************************************************************************/ |
---|
33 | TIFFimage::~TIFFimage() |
---|
34 | { |
---|
35 | if(m_hasData) close(); |
---|
36 | } |
---|
37 | |
---|
38 | |
---|
39 | /**************************************************************************** |
---|
40 | * TIFFIMAGE - RETURN THE IMAGE WIDTH |
---|
41 | ****************************************************************************/ |
---|
42 | int TIFFimage::width() |
---|
43 | { |
---|
44 | if(m_hasData) return (int)m_width; |
---|
45 | return 0; |
---|
46 | } |
---|
47 | |
---|
48 | |
---|
49 | /**************************************************************************** |
---|
50 | * TIFFIMAGE - RETURN THE IMAGE HEIGHT |
---|
51 | ****************************************************************************/ |
---|
52 | int TIFFimage::height() |
---|
53 | { |
---|
54 | if(m_hasData) return (int)m_height; |
---|
55 | return 0; |
---|
56 | } |
---|
57 | |
---|
58 | |
---|
59 | /**************************************************************************** |
---|
60 | * TIFFIMAGE - RETURN THE IMAGE SIZE |
---|
61 | ****************************************************************************/ |
---|
62 | int TIFFimage::size() |
---|
63 | { |
---|
64 | if(m_hasData) return (int)m_size; |
---|
65 | return 0; |
---|
66 | } |
---|
67 | |
---|
68 | |
---|
69 | /**************************************************************************** |
---|
70 | * TIFFIMAGE - RETURN BOOLEAN ANSWER IF IMAGE DATA IS AVAILABLE |
---|
71 | ****************************************************************************/ |
---|
72 | bool TIFFimage::hasData() { return m_hasData; } |
---|
73 | |
---|
74 | |
---|
75 | /**************************************************************************** |
---|
76 | * TIFFIMAGE - OPEN A TIFF FILE AND IMPORT THE IMAGE DATA |
---|
77 | ****************************************************************************/ |
---|
78 | int TIFFimage::open(char *name) |
---|
79 | { |
---|
80 | // DEFINE LOCAL VARIABLES |
---|
81 | TIFF *tiff= NULL; |
---|
82 | uint32 *array= NULL; |
---|
83 | uint32 loc_width= 0; |
---|
84 | uint32 loc_height= 0; |
---|
85 | uint32 loc_size= 0; |
---|
86 | uint32 orientation= 0; |
---|
87 | bool error= false; |
---|
88 | |
---|
89 | // OPEN TIFF FiLENAME |
---|
90 | tiff= TIFFOpen(name, "r"); |
---|
91 | |
---|
92 | // IF A HANDLE WAS RETURNED, CONTINUE... |
---|
93 | if(tiff) |
---|
94 | { |
---|
95 | // GET TIFF IMAGE DIMENSIONS |
---|
96 | TIFFGetField(tiff, TIFFTAG_IMAGEWIDTH, &loc_width); |
---|
97 | TIFFGetField(tiff, TIFFTAG_IMAGELENGTH, &loc_height); |
---|
98 | loc_size= loc_width * loc_height; |
---|
99 | |
---|
100 | // CREATE MEMORY ARRAY FOR THE TIFF IMAGE DATA |
---|
101 | array= (uint32 *)_TIFFmalloc(loc_size * sizeof(uint32)); |
---|
102 | |
---|
103 | // IF ARRAY WAS CREATED SUCCESSFULLY... |
---|
104 | if(array) |
---|
105 | { |
---|
106 | // FIX TIFF IMAGE ORIENTATION |
---|
107 | if(!TIFFGetFieldDefaulted(tiff, TIFFTAG_ORIENTATION, &orientation)) |
---|
108 | orientation= 0; |
---|
109 | |
---|
110 | switch(orientation) |
---|
111 | { |
---|
112 | case ORIENTATION_TOPLEFT: |
---|
113 | case ORIENTATION_TOPRIGHT: |
---|
114 | case ORIENTATION_LEFTTOP: |
---|
115 | case ORIENTATION_RIGHTTOP: orientation= ORIENTATION_BOTLEFT; break; |
---|
116 | |
---|
117 | case ORIENTATION_BOTRIGHT: |
---|
118 | case ORIENTATION_BOTLEFT: |
---|
119 | case ORIENTATION_RIGHTBOT: |
---|
120 | case ORIENTATION_LEFTBOT: orientation= ORIENTATION_TOPLEFT; break; |
---|
121 | } |
---|
122 | TIFFSetField(tiff, TIFFTAG_ORIENTATION, orientation); |
---|
123 | |
---|
124 | if(!(TIFFReadRGBAImage(tiff, loc_width, loc_height, array, 0))) |
---|
125 | error= true; |
---|
126 | } |
---|
127 | else error= true; // ARRAY INIT FAILED |
---|
128 | } |
---|
129 | else error= true; // OPEN TIFF FILE FAILED (NO HANDLE) |
---|
130 | |
---|
131 | // CLOSE TIFF FILE |
---|
132 | if(tiff) TIFFClose(tiff); |
---|
133 | |
---|
134 | // IS THERE AN ERROR ? |
---|
135 | if(error) |
---|
136 | { |
---|
137 | _TIFFfree(array); |
---|
138 | return -1; |
---|
139 | } |
---|
140 | |
---|
141 | // IF OLD DATA IS AVAILABLE, CLEAN IT UP |
---|
142 | // CHECK, IF AN IMAGE IS AVAILABLE |
---|
143 | if(m_hasData) close(); |
---|
144 | |
---|
145 | // FILL LOCAL VARIABLES |
---|
146 | m_array= array; |
---|
147 | m_width= loc_width; |
---|
148 | m_height= loc_height; |
---|
149 | m_size= loc_size; |
---|
150 | m_hasData= true; |
---|
151 | |
---|
152 | // SAVE FILE NAME |
---|
153 | m_name= (char *)malloc((strlen(name) + 1)* sizeof(char)); |
---|
154 | strcpy(m_name, name); |
---|
155 | |
---|
156 | // CONVERT COLORMAP TO XIMAGE FORMAT |
---|
157 | fixRGB(); |
---|
158 | m_ximage_colormap= true; |
---|
159 | |
---|
160 | return 0; |
---|
161 | } |
---|
162 | |
---|
163 | |
---|
164 | /**************************************************************************** |
---|
165 | * TIFFIMAGE - CORRECTS THE COLORMAP OF EACH PIXEL |
---|
166 | * FOR THE USE IN AN XIMAGE (SWITCHES R <-> B BYTE) |
---|
167 | ****************************************************************************/ |
---|
168 | void TIFFimage::fixRGB() |
---|
169 | { |
---|
170 | // CHECK, IF AN IMAGE IS AVAILABLE |
---|
171 | if(!m_hasData) return; |
---|
172 | |
---|
173 | // SOME LOCAL VARIABLES |
---|
174 | uint32 i, p; |
---|
175 | |
---|
176 | // THE FOLLOWING LOOP SWITCHES THE R<->B COLOR BYTES FOR EACH PIXEL |
---|
177 | for(i= 0; i < m_size; i++) |
---|
178 | { |
---|
179 | p= m_array[i] & 0xFF00FF00; |
---|
180 | p= p | ((m_array[i] & 0x000000FF) << 16); |
---|
181 | p= p | ((m_array[i] & 0x00FF0000) >> 16); |
---|
182 | m_array[i]= p; |
---|
183 | } |
---|
184 | |
---|
185 | // INVERT COLORMAP FLAG |
---|
186 | m_ximage_colormap= ~m_ximage_colormap; |
---|
187 | } |
---|
188 | |
---|
189 | |
---|
190 | /**************************************************************************** |
---|
191 | * TIFFIMAGE - RESET ALL ENTRIES, FREE ALLOCATED MEM IF NEEDED |
---|
192 | ****************************************************************************/ |
---|
193 | void TIFFimage::close() |
---|
194 | { |
---|
195 | // CHECK, IF AN IMAGE IS AVAILABLE |
---|
196 | if(!m_hasData) return; |
---|
197 | |
---|
198 | // FREE ALLOCATED NAME MEMORY |
---|
199 | free(m_name); |
---|
200 | m_name= NULL; |
---|
201 | |
---|
202 | // FREE ALLOCATED IMAGE MEMORY |
---|
203 | _TIFFfree(m_array); |
---|
204 | m_array= NULL; |
---|
205 | |
---|
206 | // RESET CLASS VARIABLES |
---|
207 | m_hasData= false; |
---|
208 | m_width= 0; |
---|
209 | m_height= 0; |
---|
210 | m_size= 0; |
---|
211 | m_ximage_colormap= false; |
---|
212 | } |
---|
213 | |
---|
214 | |
---|
215 | /**************************************************************************** |
---|
216 | * TIFFIMAGE - RESET ALL ENTRIES, FREE ALLOCATED MEM IF NEEDED |
---|
217 | ****************************************************************************/ |
---|
218 | XImage *TIFFimage::createXImage(Widget widget) |
---|
219 | { |
---|
220 | // CHECK, IF AN IMAGE IS AVAILABLE |
---|
221 | if(!m_hasData) return NULL; |
---|
222 | |
---|
223 | // CREATE XIMAGE VARIABLE |
---|
224 | XImage *ximage; |
---|
225 | |
---|
226 | // FETCH ENVIRONMENT SETTINGS |
---|
227 | Display *display= XtDisplay(widget); |
---|
228 | Visual *visual= XDefaultVisual(display, 0); |
---|
229 | |
---|
230 | // INVERT COLORMAP IF NOT ALREADY DONE |
---|
231 | if(!m_ximage_colormap) fixRGB(); |
---|
232 | |
---|
233 | // CREATE XIMAGE FROM ARRAY DATA |
---|
234 | ximage= XCreateImage(display, visual, 24, ZPixmap, 0, |
---|
235 | (char *)m_array, m_width, m_height, 32, 0); |
---|
236 | |
---|
237 | return ximage; |
---|
238 | } |
---|
239 | |
---|
240 | |
---|
241 | /**************************************************************************** |
---|
242 | * TIFFIMAGE - MASK IMAGE COLOURS |
---|
243 | ****************************************************************************/ |
---|
244 | void TIFFimage::colorFilter(uint32 mask) |
---|
245 | { |
---|
246 | // TODO: MASKING IS INFLUENCED BY THE POSITION OF THE R<->B BYTES |
---|
247 | // SEE: RGBFIX FUNCTION !!! |
---|
248 | |
---|
249 | |
---|
250 | // CHECK, IF AN IMAGE IS AVAILABLE |
---|
251 | if(!m_hasData) return; |
---|
252 | |
---|
253 | // INVERT COLORMAP IF NOT ALREADY DONE |
---|
254 | if(!m_ximage_colormap) fixRGB(); |
---|
255 | |
---|
256 | // SOME LOCAL VARIABLES |
---|
257 | uint32 i, p; |
---|
258 | |
---|
259 | // IN THIS LOOP EVERY PIXEL IN THE ARRAY IS MASKED |
---|
260 | // WITH THE PREDEFINED COLOR |
---|
261 | for(i= 0; i < m_size; i++) |
---|
262 | { |
---|
263 | // GET ARRAY ENTRY |
---|
264 | p= m_array[i]; |
---|
265 | |
---|
266 | // DO SOME MASKING HERE... |
---|
267 | p= p | mask; |
---|
268 | |
---|
269 | // WRITE BACK ARRAY ENTRY |
---|
270 | m_array[i]= p; |
---|
271 | } |
---|
272 | } |
---|
273 | |
---|