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

Last change on this file since 4048 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.