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
RevLine 
[1104]1// Classes image heritant de TMatrix<T>
2// R.Ansari, C.Magneville 07/2000
[220]3// LAL (Orsay) / IN2P3-CNRS DAPNIA/SPP (Saclay) / CEA
4
[2615]5#include "sopnamsp.h"
[244]6#include "machdefs.h"
[220]7#include <stdio.h>
[1104]8#include <stdlib.h>
9#include "pexceptions.h"
[1967]10#include "datatype.h"
11#include <typeinfo>
[220]12
[3836]13#define CIMAGE_CC_BFILE // avoid extern template declarations
14#include "cimage.h"
15
[1390]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
[220]26template <class T>
[1104]27Image<T>::Image()
28// Constructeur par defaut.
29 : TMatrix<T>()
[220]30{
[1104]31 SetOrg();
32 SetPixelSize();
[220]33}
34
[1390]35//! Constructor, with specification of the image size, pixel size and offsets
[220]36template <class T>
[1390]37Image<T>::Image(sa_size_t sizx, sa_size_t sizy, r_8 szpx, r_8 szpy, r_8 orgx, r_8 orgy)
[1104]38// Constructeur par defaut.
39 : TMatrix<T>(sizy, sizx)
[220]40{
[1104]41 SetOrg(orgx, orgy);
42 SetPixelSize(szpx, szpy);
[220]43}
44
[1390]45//! Copy constructor
[220]46template <class T>
[1104]47Image<T>::Image(const Image<T>& a)
48 : TMatrix<T>(a)
[220]49{
[1104]50 SetOrg(a.XOrg(), a.YOrg() );
51 SetPixelSize(a.XPixSize(), a.YPixSize());
[220]52}
53
[1390]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*/
[220]59template <class T>
[1104]60Image<T>::Image(const Image<T>& a, bool share)
61 : TMatrix<T>(a, share)
[220]62{
[1104]63 SetOrg(a.XOrg(), a.YOrg() );
64 SetPixelSize(a.XPixSize(), a.YPixSize());
[220]65}
[1390]66
67//! Destructor
[220]68template <class T>
69Image<T>::~Image()
70{
71}
72
[1159]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{
[2885]105 this->dobj = new Image<T>(obj, true);
106 this->ownobj=true;
[1159]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);
[1967]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 }
[2885]128 if (this->ownobj && this->dobj) delete this->dobj;
129 this->dobj = po; this->ownobj = false;
[1159]130}
131
132template <class T>
133void FIO_Image<T>::ReadSelf(PInPersist& is)
134{
[2885]135 if (this->dobj == NULL) this->dobj = new Image<T>;
136 Image<T> * img = dynamic_cast<Image<T> * > (this->dobj);
[1159]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{
[2885]159 if (this->dobj == NULL) return;
160 Image<T> * img = dynamic_cast<Image<T> * > (this->dobj);
[1159]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
[1104]178///////////////////////////////////////////////////////////////
[220]179#ifdef __CXX_PRAGMA_TEMPLATES__
[3667]180#pragma define_template Image<uint_1>
[220]181#pragma define_template Image<uint_2>
[3526]182#pragma define_template Image<uint_4>
183#pragma define_template Image<uint_8>
[3667]184#pragma define_template Image<int_1>
[3220]185#pragma define_template Image<int_2>
[220]186#pragma define_template Image<int_4>
[1104]187#pragma define_template Image<int_8>
[220]188#pragma define_template Image<r_4>
[1104]189#pragma define_template Image<r_8>
[3220]190#pragma define_template Image< complex<r_4> >
191#pragma define_template Image< complex<r_8> >
[1159]192
[3661]193#pragma define_template FIO_Image<uint_1>
[1159]194#pragma define_template FIO_Image<uint_2>
[3526]195#pragma define_template FIO_Image<uint_4>
196#pragma define_template FIO_Image<uint_8>
[3661]197#pragma define_template FIO_Image<int_1>
[3220]198#pragma define_template FIO_Image<int_2>
[1159]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>
[3220]203#pragma define_template FIO_Image< complex<r_4> >
204#pragma define_template FIO_Image< complex<r_8> >
[220]205#endif
206
[1104]207#if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES)
[2870]208namespace SOPHYA {
[3667]209template class Image<uint_1>;
[220]210template class Image<uint_2>;
[3526]211template class Image<uint_4>;
212template class Image<uint_8>;
[3667]213template class Image<int_1>;
[3220]214template class Image<int_2>;
[220]215template class Image<int_4>;
[1104]216template class Image<int_8>;
[220]217template class Image<r_4>;
[1104]218template class Image<r_8>;
[3220]219template class Image< complex<r_4> >;
220template class Image< complex<r_8> >;
[1159]221
[3661]222template class FIO_Image<uint_1>;
[1159]223template class FIO_Image<uint_2>;
[3526]224template class FIO_Image<uint_4>;
225template class FIO_Image<uint_8>;
[3661]226template class FIO_Image<int_1>;
[3220]227template class FIO_Image<int_2>;
[1159]228template class FIO_Image<int_4>;
229template class FIO_Image<int_8>;
230template class FIO_Image<r_4>;
231template class FIO_Image<r_8>;
[3220]232template class FIO_Image< complex<r_4> >;
233template class FIO_Image< complex<r_8> >;
[2870]234}
[220]235#endif
Note: See TracBrowser for help on using the repository browser.