changeset 595:4243c0790cd9

im2float: common code from im2single and im2double in private function
author carandraug
date Fri, 21 Sep 2012 12:44:08 +0000
parents 48c6d134cef7
children 9e9ea9c5222d
files inst/im2double.m inst/im2single.m inst/private/im2float.m
diffstat 3 files changed, 45 insertions(+), 48 deletions(-) [+]
line wrap: on
line diff
--- a/inst/im2double.m
+++ b/inst/im2double.m
@@ -37,30 +37,7 @@
 ## @end deftypefn
 
 function im = im2double (im, indexed = false)
-
-  ## Input checking (private function that is used for all im2class functions)
-  im_class = imconversion (nargin, "im2double", indexed, im);
-
-  ## READ BEFORE MAKE CHANGES:
-  ## this function is pretty much the same as im2single. Any changes on this code
-  ## should most likely also be done there
-
-  switch im_class
-    case "double"
-      ## do nothing, return the same
-    case {"logical", "single"}
-      im = double (im);
-    case {"uint8", "uint16"}
-      if (indexed)
-        im = double (im) + 1;
-      else
-        im = double (im) / double (intmax (im_class));
-      endif
-    case "int16"
-      im = (double (im) + double (intmax (im_class)) + 1) / double (intmax ("uint16"));
-    otherwise
-      error ("unsupported image class %s", im_class);
-  endswitch
+  im = im2float ("double", nargin, im, indexed);
 endfunction
 
 %!assert(im2double([1 2 3]), [1 2 3]);                  # double returns the same
--- a/inst/im2single.m
+++ b/inst/im2single.m
@@ -36,30 +36,7 @@
 ## @end deftypefn
 
 function im = im2single (im, indexed = false)
-
-  ## Input checking (private function that is used for all im2class functions)
-  im_class = imconversion (nargin, "im2single", indexed, im);
-
-  ## READ BEFORE MAKE CHANGES:
-  ## this function is pretty much the same as im2double. Any changes on this code
-  ## should most likely also be done there
-
-  switch im_class
-    case "single"
-      ## do nothing, return the same
-    case {"logical", "double"}
-      im = single (im);
-    case {"uint8", "uint16"}
-      if (indexed)
-        im = single (im) + 1;
-      else
-        im = single (im) / single (intmax (im_class));
-      endif
-    case "int16"
-      im = (single (im) + single (intmax (im_class)) + 1) / single (intmax ("uint16"));
-    otherwise
-      error ("unsupported image class %s", im_class);
-  endswitch
+  im = im2float ("single", nargin, im, indexed);
 endfunction
 
 %!assert(im2single([1 2 3]), single([1 2 3]));                  # double returns the same
new file mode 100644
--- /dev/null
+++ b/inst/private/im2float.m
@@ -0,0 +1,43 @@
+## Copyright (C) 2012 Carnë Draug <carandraug+dev@gmail.com>
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 3 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, see <http://www.gnu.org/licenses/>.
+
+## im2double and im2single are very similar so here's the common code,
+## which is prety much all of it.
+
+function im = im2float (out_class, caller_nargin, im, indexed = false)
+
+  ## Input checking (private function that is used for all im2class functions)
+  im_class = imconversion (caller_nargin, ["im2" out_class], indexed, im);
+
+  converter = eval (["@" out_class]);
+  switch im_class
+    case {"single", "double", "logical"}
+      if (strcmp (im_class, out_class))
+        ## do nothing, return the same
+      else
+        im = converter (im);
+      endif
+    case {"uint8", "uint16"}
+      if (indexed)
+        im = converter (im) + 1;
+      else
+        im = converter (im) / converter (intmax (im_class));
+      endif
+    case "int16"
+      im = (converter (im) + converter (intmax (im_class)) + 1) / converter (intmax ("uint16"));
+    otherwise
+      error ("unsupported image class %s", im_class);
+  endswitch
+endfunction