source: tags/svn.1.5.4/PGT/tiff_image.cxx

Last change on this file was 4876, checked in by baderk, 17 years ago

Fixed compiler warnings in the PGT module

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.6 KB
Line 
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****************************************************************************/
18TIFFimage::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****************************************************************************/
33TIFFimage::~TIFFimage()
34{
35    if(m_hasData) close();
36}
37
38
39/****************************************************************************
40*  TIFFIMAGE - RETURN THE IMAGE WIDTH
41****************************************************************************/
42int 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****************************************************************************/
52int 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****************************************************************************/
62int 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****************************************************************************/
72bool TIFFimage::hasData() { return m_hasData; }
73
74
75/****************************************************************************
76*  TIFFIMAGE - OPEN A TIFF FILE AND IMPORT THE IMAGE DATA
77****************************************************************************/
78int 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****************************************************************************/
168void 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****************************************************************************/
193void 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****************************************************************************/
218XImage *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****************************************************************************/
244void 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
Note: See TracBrowser for help on using the repository browser.