source: Sophya/trunk/SophyaLib/NTools/cimage.cc

Last change on this file was 3836, checked in by ansari, 15 years ago

Declaration extern des classes templ des classes template avec instantiation explicite (avec flag NEED_EXT_DECL_TEMP) pour regler le pb de dynamic_cast sur Mac OS X 10.6, Reza 05/08/2010

File size: 5.9 KB
Line 
1// Classes image heritant de TMatrix<T>
2// R.Ansari, C.Magneville 07/2000
3// LAL (Orsay) / IN2P3-CNRS DAPNIA/SPP (Saclay) / CEA
4
5#include "sopnamsp.h"
6#include "machdefs.h"
7#include <stdio.h>
8#include <stdlib.h>
9#include "pexceptions.h"
10#include "datatype.h"
11#include <typeinfo>
12
13#define CIMAGE_CC_BFILE // avoid extern template declarations
14#include "cimage.h"
15
16/*!
17 \class SOPHYA::Image
18 \ingroup NTools
19 This class specializes the Matrix class, for representing intensity
20 (or grey-level) images. It adds the possibility of defining pixel
21 size and offset. The convention for the acces operator is also
22 changed, compared to the matrix class.
23*/
24
25//! Default constructor - Pixel array not allocated
26template <class T>
27Image<T>::Image()
28// Constructeur par defaut.
29 : TMatrix<T>()
30{
31 SetOrg();
32 SetPixelSize();
33}
34
35//! Constructor, with specification of the image size, pixel size and offsets
36template <class T>
37Image<T>::Image(sa_size_t sizx, sa_size_t sizy, r_8 szpx, r_8 szpy, r_8 orgx, r_8 orgy)
38// Constructeur par defaut.
39 : TMatrix<T>(sizy, sizx)
40{
41 SetOrg(orgx, orgy);
42 SetPixelSize(szpx, szpy);
43}
44
45//! Copy constructor
46template <class T>
47Image<T>::Image(const Image<T>& a)
48 : TMatrix<T>(a)
49{
50 SetOrg(a.XOrg(), a.YOrg() );
51 SetPixelSize(a.XPixSize(), a.YPixSize());
52}
53
54
55//! Copy constructor with possibility of duplicating the pixel array
56/*!
57 \param share : if true, the data is shared, duplicated if false.
58*/
59template <class T>
60Image<T>::Image(const Image<T>& a, bool share)
61 : TMatrix<T>(a, share)
62{
63 SetOrg(a.XOrg(), a.YOrg() );
64 SetPixelSize(a.XPixSize(), a.YPixSize());
65}
66
67//! Destructor
68template <class T>
69Image<T>::~Image()
70{
71}
72
73
74// --------------------------------------------------------
75// Les objets delegues pour la gestion de persistance
76// --------------------------------------------------------
77/*!
78 \class SOPHYA::FIO_Image
79 \ingroup Image
80 Class for persistent management of Image
81
82 */
83///////////////////////////////////////////////////////////
84
85//! Default constructor
86template <class T>
87FIO_Image<T>::FIO_Image()
88 : FIO_TArray<T>()
89{
90}
91
92
93//! Constructor from the file \b filename
94template <class T>
95FIO_Image<T>::FIO_Image(string const & filename)
96 : FIO_TArray<T>(filename)
97{
98}
99
100//! Constructor from the Image \b obj
101template <class T>
102FIO_Image<T>::FIO_Image(const Image<T> & obj)
103 : FIO_TArray<T>()
104{
105 this->dobj = new Image<T>(obj, true);
106 this->ownobj=true;
107}
108
109//! Connect with a Image \b obj
110template <class T>
111FIO_Image<T>::FIO_Image(Image<T> * obj)
112 : FIO_TArray<T>(obj)
113{
114}
115
116
117//! Connect Image \b o
118template <class T>
119void FIO_Image<T>::SetDataObj(AnyDataObj & o)
120{
121 Image<T> * po = dynamic_cast< Image<T> * >(&o);
122 if (po == NULL) {
123 char buff[160];
124 sprintf(buff,"FIO_Image<%s>::SetDataObj(%s) - Object type error ! ",
125 DataTypeInfo<T>::getTypeName().c_str(), typeid(o).name());
126 throw TypeMismatchExc(PExcLongMessage(buff));
127 }
128 if (this->ownobj && this->dobj) delete this->dobj;
129 this->dobj = po; this->ownobj = false;
130}
131
132template <class T>
133void FIO_Image<T>::ReadSelf(PInPersist& is)
134{
135 if (this->dobj == NULL) this->dobj = new Image<T>;
136 Image<T> * img = dynamic_cast<Image<T> * > (this->dobj);
137// On lit les 3 premiers uint_4
138// 0: Numero de version, 1 : reserve
139 uint_4 itab[3];
140 is.Get(itab,3);
141
142// Image<T> part data
143 r_8 orgx, orgy;
144 is.Get(orgx);
145 is.Get(orgy);
146 img->SetOrg(orgx, orgy);
147 r_8 szx, szy;
148 is.Get(szx);
149 is.Get(szy);
150 img->SetPixelSize(szx, szy);
151
152// Reading the TArray part
153 FIO_TArray<T>::ReadSelf(is);
154}
155
156template <class T>
157void FIO_Image<T>::WriteSelf(POutPersist& os) const
158{
159 if (this->dobj == NULL) return;
160 Image<T> * img = dynamic_cast<Image<T> * > (this->dobj);
161// On ecrit 3 uint_4 ....
162 uint_4 itab[3];
163 itab[0] = 1; // Numero de version a 1
164 itab[1] = 0;
165 itab[2] = 0;
166 os.Put(itab,3);
167
168// Image<T> part data
169 os.Put(img->XOrg());
170 os.Put(img->XOrg());
171 os.Put(img->XPixSize());
172 os.Put(img->YPixSize());
173
174// Writing the TArray part
175 FIO_TArray<T>::WriteSelf(os);
176}
177
178///////////////////////////////////////////////////////////////
179#ifdef __CXX_PRAGMA_TEMPLATES__
180#pragma define_template Image<uint_1>
181#pragma define_template Image<uint_2>
182#pragma define_template Image<uint_4>
183#pragma define_template Image<uint_8>
184#pragma define_template Image<int_1>
185#pragma define_template Image<int_2>
186#pragma define_template Image<int_4>
187#pragma define_template Image<int_8>
188#pragma define_template Image<r_4>
189#pragma define_template Image<r_8>
190#pragma define_template Image< complex<r_4> >
191#pragma define_template Image< complex<r_8> >
192
193#pragma define_template FIO_Image<uint_1>
194#pragma define_template FIO_Image<uint_2>
195#pragma define_template FIO_Image<uint_4>
196#pragma define_template FIO_Image<uint_8>
197#pragma define_template FIO_Image<int_1>
198#pragma define_template FIO_Image<int_2>
199#pragma define_template FIO_Image<int_4>
200#pragma define_template FIO_Image<int_8>
201#pragma define_template FIO_Image<r_4>
202#pragma define_template FIO_Image<r_8>
203#pragma define_template FIO_Image< complex<r_4> >
204#pragma define_template FIO_Image< complex<r_8> >
205#endif
206
207#if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES)
208namespace SOPHYA {
209template class Image<uint_1>;
210template class Image<uint_2>;
211template class Image<uint_4>;
212template class Image<uint_8>;
213template class Image<int_1>;
214template class Image<int_2>;
215template class Image<int_4>;
216template class Image<int_8>;
217template class Image<r_4>;
218template class Image<r_8>;
219template class Image< complex<r_4> >;
220template class Image< complex<r_8> >;
221
222template class FIO_Image<uint_1>;
223template class FIO_Image<uint_2>;
224template class FIO_Image<uint_4>;
225template class FIO_Image<uint_8>;
226template class FIO_Image<int_1>;
227template class FIO_Image<int_2>;
228template class FIO_Image<int_4>;
229template class FIO_Image<int_8>;
230template class FIO_Image<r_4>;
231template class FIO_Image<r_8>;
232template class FIO_Image< complex<r_4> >;
233template class FIO_Image< complex<r_8> >;
234}
235#endif
Note: See TracBrowser for help on using the repository browser.