1 /*=========================================================================
2 
3   Program: GDCM (Grassroots DICOM). A DICOM library
4 
5   Copyright (c) 2006-2011 Mathieu Malaterre
6   All rights reserved.
7   See Copyright.txt or http://gdcm.sourceforge.net/Copyright.html for details.
8 
9      This software is distributed WITHOUT ANY WARRANTY; without even
10      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11      PURPOSE.  See the above copyright notice for more information.
12 
13 =========================================================================*/
14 #include "gdcmImage.h"
15 #include "gdcmTrace.h"
16 #include "gdcmExplicitDataElement.h"
17 #include "gdcmByteValue.h"
18 #include "gdcmDataSet.h"
19 #include "gdcmSequenceOfFragments.h"
20 #include "gdcmFragment.h"
21 
22 #include <iostream>
23 #include <limits>
24 
25 namespace gdcm
26 {
27 
GetSpacing() const28 const double *Image::GetSpacing() const
29 {
30   assert( NumberOfDimensions );
31   return &Spacing[0];
32 }
33 
GetSpacing(unsigned int idx) const34 double Image::GetSpacing(unsigned int idx) const
35 {
36   assert( NumberOfDimensions );
37   //if( idx < Spacing.size() )
38     {
39     return Spacing[idx];
40     }
41   //assert( 0 && "Should not happen" );
42   //return 1; // FIXME ???
43 }
44 
SetSpacing(const double * spacing)45 void Image::SetSpacing(const double *spacing)
46 {
47   assert( NumberOfDimensions );
48   Spacing.assign(spacing, spacing+NumberOfDimensions);
49 }
50 
SetSpacing(unsigned int idx,double spacing)51 void Image::SetSpacing(unsigned int idx, double spacing)
52 {
53   //assert( spacing > 1.e3 );
54   Spacing.resize( 3 /*idx + 1*/ );
55   Spacing[idx] = spacing;
56 }
57 
GetOrigin() const58 const double *Image::GetOrigin() const
59 {
60   assert( NumberOfDimensions );
61   if( !Origin.empty() )
62     return &Origin[0];
63   return nullptr;
64 }
65 
GetOrigin(unsigned int idx) const66 double Image::GetOrigin(unsigned int idx) const
67 {
68   assert( NumberOfDimensions );
69   if( idx < Origin.size() )
70     {
71     return Origin[idx];
72     }
73   return 0; // FIXME ???
74 }
75 
SetOrigin(const float * ori)76 void Image::SetOrigin(const float *ori)
77 {
78   assert( NumberOfDimensions );
79   Origin.resize( NumberOfDimensions );
80   for(unsigned int i = 0; i < NumberOfDimensions; ++i)
81     {
82     Origin[i] = static_cast<double>(ori[i]);
83     }
84 }
85 
SetOrigin(const double * ori)86 void Image::SetOrigin(const double *ori)
87 {
88   assert( NumberOfDimensions );
89   Origin.assign(ori, ori+NumberOfDimensions);
90 }
91 
SetOrigin(unsigned int idx,double ori)92 void Image::SetOrigin(unsigned int idx, double ori)
93 {
94   Origin.resize( idx + 1 );
95   Origin[idx] = ori;
96 }
97 
GetDirectionCosines() const98 const double *Image::GetDirectionCosines() const
99 {
100   assert( NumberOfDimensions );
101   if( !DirectionCosines.empty() )
102     return &DirectionCosines[0];
103   return nullptr;
104 }
GetDirectionCosines(unsigned int idx) const105 double Image::GetDirectionCosines(unsigned int idx) const
106 {
107   assert( NumberOfDimensions );
108   if( idx < DirectionCosines.size() )
109     {
110     return DirectionCosines[idx];
111     }
112   return 0; // FIXME !!
113 }
114 
SetDirectionCosines(const float * dircos)115 void Image::SetDirectionCosines(const float *dircos)
116 {
117   assert( NumberOfDimensions );
118   DirectionCosines.resize( 6 );
119   for(int i = 0; i < 6; ++i)
120     {
121     DirectionCosines[i] = static_cast<double>(dircos[i]);
122     }
123 }
124 
SetDirectionCosines(const double * dircos)125 void Image::SetDirectionCosines(const double *dircos)
126 {
127   assert( NumberOfDimensions );
128   DirectionCosines.assign(dircos, dircos+6);
129 }
130 
SetDirectionCosines(unsigned int idx,double dircos)131 void Image::SetDirectionCosines(unsigned int idx, double dircos)
132 {
133   DirectionCosines.resize( idx + 1 );
134   DirectionCosines[idx] = dircos;
135 }
136 
Print(std::ostream & os) const137 void Image::Print(std::ostream &os) const
138 {
139   Pixmap::Print(os);
140   if( NumberOfDimensions )
141     {
142       {
143       os << "Origin: (";
144       if( !Origin.empty() )
145         {
146         std::vector<double>::const_iterator it = Origin.begin();
147         os << *it;
148         for(++it; it != Origin.end(); ++it)
149           {
150           os << "," << *it;
151           }
152         }
153       os << ")\n";
154       }
155       {
156       os << "Spacing: (";
157       std::vector<double>::const_iterator it = Spacing.begin();
158       os << *it;
159       for(++it; it != Spacing.end(); ++it)
160         {
161         os << "," << *it;
162         }
163       os << ")\n";
164       }
165       {
166       os << "DirectionCosines: (";
167       if( !DirectionCosines.empty() )
168         {
169         std::vector<double>::const_iterator it = DirectionCosines.begin();
170         os << *it;
171         for(++it; it != DirectionCosines.end(); ++it)
172           {
173           os << "," << *it;
174           }
175         }
176       os << ")\n";
177       }
178       {
179       os << "Rescale Intercept/Slope: (" << Intercept << "," << Slope << ")\n";
180       }
181     //std::vector<double> Spacing;
182     //std::vector<double> Origin;
183 
184     }
185 }
186 
187 } // end namespace gdcm
188