1 /*
2  * Medical Image Registration ToolKit (MIRTK)
3  *
4  * Copyright 2013-2015 Imperial College London
5  * Copyright 2013-2015 Andreas Schuh
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *     http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19 
20 #ifndef MIRTK_ExtrapolationMode_H
21 #define MIRTK_ExtrapolationMode_H
22 
23 #include "mirtk/String.h"
24 
25 
26 namespace mirtk {
27 
28 
29 // ----------------------------------------------------------------------------
30 /// Image extrapolation modes
31 enum ExtrapolationMode {
32   Extrapolation_Default, // i.e., not specified
33   Extrapolation_None,    // i.e., partial interpolation or default value
34   Extrapolation_Const,
35   Extrapolation_NN,
36   Extrapolation_Repeat,  // i.e., periodic
37   Extrapolation_Mirror,
38   Extrapolation_ConstWithPeriodicTime,
39   // Add new enumeration values above
40   Extrapolation_Last
41 };
42 
43 // ----------------------------------------------------------------------------
44 template <>
ToString(const ExtrapolationMode & m,int w,char c,bool left)45 inline string ToString(const ExtrapolationMode &m, int w, char c, bool left)
46 {
47   const char *str;
48   switch(m) {
49     case Extrapolation_Default:               str = "Default"; break;
50     case Extrapolation_None:                  str = "None"; break;
51     case Extrapolation_Const:                 str = "Const"; break;
52     case Extrapolation_NN:                    str = "NN"; break;
53     case Extrapolation_Repeat:                str = "Repeat"; break;
54     case Extrapolation_Mirror:                str = "Mirror"; break;
55     case Extrapolation_ConstWithPeriodicTime: str = "ConstWithPeriodicTime"; break;
56     default:                                  str = "Unknown"; break;
57   }
58   return ToString(str, w, c, left);
59 }
60 
61 // ----------------------------------------------------------------------------
62 /// Get corresponding extrapolation with periodic time
ExtrapolationWithPeriodicTime(ExtrapolationMode m)63 inline ExtrapolationMode ExtrapolationWithPeriodicTime(ExtrapolationMode m)
64 {
65   switch(m) {
66     case Extrapolation_ConstWithPeriodicTime:
67     case Extrapolation_Const:  return Extrapolation_ConstWithPeriodicTime;
68     case Extrapolation_Repeat: return Extrapolation_Repeat;
69     default:                   return Extrapolation_None;
70   }
71 }
72 
73 // ----------------------------------------------------------------------------
74 /// Get corresponding extrapolation without periodic time
ExtrapolationWithoutPeriodicTime(ExtrapolationMode m)75 inline ExtrapolationMode ExtrapolationWithoutPeriodicTime(ExtrapolationMode m)
76 {
77   switch(m) {
78     case Extrapolation_Const:
79     case Extrapolation_ConstWithPeriodicTime: return Extrapolation_Const;
80     // Note: Extrapolation_Repeat remains periodic in all dimensions
81     default: return m;
82   }
83 }
84 
85 // ----------------------------------------------------------------------------
86 template <>
FromString(const char * str,ExtrapolationMode & m)87 inline bool FromString(const char *str, ExtrapolationMode &m)
88 {
89   string lstr = ToLower(str);
90   if      (lstr == "default"                 ) m = Extrapolation_Default;
91   else if (lstr == "none"                    ) m = Extrapolation_None;
92   else if (lstr == "const"                   ) m = Extrapolation_Const;
93   else if (lstr == "nn"                      ) m = Extrapolation_NN;
94   else if (lstr == "repeat" || lstr == "tile") m = Extrapolation_Repeat;
95   else if (lstr == "mirror"                  ) m = Extrapolation_Mirror;
96   else if (lstr == "constwithperiodictime"   ) m = Extrapolation_ConstWithPeriodicTime;
97   else return false;
98   return true;
99 }
100 
101 
102 } // namespace mirtk
103 
104 #endif // MIRTK_ExtrapolationMode_H
105