annotate scripts/image/imformats.m @ 21489:ea81c2fdd568

imformats: return empty instead of error if there's no support for image IO. * __magick_read__.cc (__magick_formats__): if Octave was built without support for image IO, return an empty struct instead of error. If we have no support for image format, it doesn't matter if that's because of limited configuration on the GraphicsMagick build or Octave. Remember we can't even promise support for all formats at the same time, that's dependent on the configuration of GraphicsMagick. * imformats.m: add simple test for even when we were built without support for image IO.
author Carnë Draug <carandraug@octave.org>
date Fri, 18 Mar 2016 22:52:28 +0000
parents 516bb87ea72e
children ecce63c99c3f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
19697
4197fc428c7d maint: Update copyright notices for 2015.
John W. Eaton <jwe@octave.org>
parents: 19653
diff changeset
1 ## Copyright (C) 2013-2015 Carnë Draug
16901
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
2 ##
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
3 ## This file is part of Octave.
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
4 ##
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
5 ## Octave is free software; you can redistribute it and/or modify it
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
6 ## under the terms of the GNU General Public License as published by
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
7 ## the Free Software Foundation; either version 3 of the License, or (at
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
8 ## your option) any later version.
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
9 ##
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
10 ## Octave is distributed in the hope that it will be useful, but
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
11 ## WITHOUT ANY WARRANTY; without even the implied warranty of
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
12 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
13 ## General Public License for more details.
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
14 ##
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
15 ## You should have received a copy of the GNU General Public License
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
16 ## along with Octave; see the file COPYING. If not, see
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
17 ## <http://www.gnu.org/licenses/>.
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
18
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
19 ## -*- texinfo -*-
20852
516bb87ea72e 2015 Code Sprint: remove class of function from docstring for all m-files.
Rik <rik@octave.org>
parents: 20176
diff changeset
20 ## @deftypefn {} {} imformats ()
516bb87ea72e 2015 Code Sprint: remove class of function from docstring for all m-files.
Rik <rik@octave.org>
parents: 20176
diff changeset
21 ## @deftypefnx {} {@var{formats} =} imformats (@var{ext})
516bb87ea72e 2015 Code Sprint: remove class of function from docstring for all m-files.
Rik <rik@octave.org>
parents: 20176
diff changeset
22 ## @deftypefnx {} {@var{formats} =} imformats (@var{format})
516bb87ea72e 2015 Code Sprint: remove class of function from docstring for all m-files.
Rik <rik@octave.org>
parents: 20176
diff changeset
23 ## @deftypefnx {} {@var{formats} =} imformats ("add", @var{format})
516bb87ea72e 2015 Code Sprint: remove class of function from docstring for all m-files.
Rik <rik@octave.org>
parents: 20176
diff changeset
24 ## @deftypefnx {} {@var{formats} =} imformats ("remove", @var{ext})
516bb87ea72e 2015 Code Sprint: remove class of function from docstring for all m-files.
Rik <rik@octave.org>
parents: 20176
diff changeset
25 ## @deftypefnx {} {@var{formats} =} imformats ("update", @var{ext}, @var{format})
516bb87ea72e 2015 Code Sprint: remove class of function from docstring for all m-files.
Rik <rik@octave.org>
parents: 20176
diff changeset
26 ## @deftypefnx {} {@var{formats} =} imformats ("factory")
16901
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
27 ## Manage supported image formats.
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
28 ##
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
29 ## @var{formats} is a structure with information about each supported file
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
30 ## format, or from a specific format @var{ext}, the value displayed on the
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
31 ## field @code{ext}. It contains the following fields:
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
32 ##
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
33 ## @table @asis
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
34 ## @item ext
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
35 ## The name of the file format. This may match the file extension but Octave
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
36 ## will automatically detect the file format.
17170
d6499c14021c doc: Periodic grammarcheck of documentation.
Rik <rik@octave.org>
parents: 17086
diff changeset
37 ##
16901
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
38 ## @item description
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
39 ## A long description of the file format.
17170
d6499c14021c doc: Periodic grammarcheck of documentation.
Rik <rik@octave.org>
parents: 17086
diff changeset
40 ##
16922
bfd119642f6a doc: Fix some spellings in image.texi.
Rik <rik@octave.org>
parents: 16916
diff changeset
41 ## @item @nospell{isa}
16901
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
42 ## A function handle to confirm if a file is of the specified format.
17170
d6499c14021c doc: Periodic grammarcheck of documentation.
Rik <rik@octave.org>
parents: 17086
diff changeset
43 ##
16901
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
44 ## @item write
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
45 ## A function handle to write if a file is of the specified format.
17170
d6499c14021c doc: Periodic grammarcheck of documentation.
Rik <rik@octave.org>
parents: 17086
diff changeset
46 ##
16901
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
47 ## @item read
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
48 ## A function handle to open files the specified format.
17170
d6499c14021c doc: Periodic grammarcheck of documentation.
Rik <rik@octave.org>
parents: 17086
diff changeset
49 ##
16901
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
50 ## @item info
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
51 ## A function handle to obtain image information of the specified format.
17170
d6499c14021c doc: Periodic grammarcheck of documentation.
Rik <rik@octave.org>
parents: 17086
diff changeset
52 ##
16901
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
53 ## @item alpha
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
54 ## Logical value if format supports alpha channel (transparency or matte).
17170
d6499c14021c doc: Periodic grammarcheck of documentation.
Rik <rik@octave.org>
parents: 17086
diff changeset
55 ##
16901
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
56 ## @item multipage
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
57 ## Logical value if format supports multipage (multiple images per file).
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
58 ## @end table
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
59 ##
20158
7503499a252b doc: Update docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents: 19697
diff changeset
60 ## It is possible to change the way Octave manages file formats with the
7503499a252b doc: Update docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents: 19697
diff changeset
61 ## options @qcode{"add"}, @qcode{"remove"}, and @qcode{"update"}, and supplying
7503499a252b doc: Update docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents: 19697
diff changeset
62 ## a structure @var{format} with the required fields. The option
17281
bc924baa2c4e doc: Add new @qcode macro for code samples which are quoted.
Rik <rik@octave.org>
parents: 17170
diff changeset
63 ## @qcode{"factory"} resets the configuration to the default.
16901
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
64 ##
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
65 ## This can be used by Octave packages to extend the image reading capabilities
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
66 ## Octave, through use of the PKG_ADD and PKG_DEL commands.
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
67 ##
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
68 ## @seealso{imfinfo, imread, imwrite}
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
69 ## @end deftypefn
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
70
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
71 ## Author: Carnë Draug <carandraug@octave.org>
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
72
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
73 function varargout = imformats (arg1, arg2, arg3)
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
74 if (nargin > 3)
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
75 print_usage ();
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
76 endif
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
77
19653
b95aab49b6be imformats: memory lock function to prevent "registry" of imageIO to be cleared
Carnë Draug <carandraug@octave.org>
parents: 19278
diff changeset
78 mlock (); # prevent formats to be removed by "clear all"
16901
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
79 persistent formats = default_formats ();
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
80
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
81 if (nargin == 0 && nargout == 0)
20170
c0f64bc26eee imformats.m: rewrite pretty print of format table.
Carnë Draug <carandraug@octave.org>
parents: 20169
diff changeset
82 pretty_print_formats (formats);
16901
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
83 elseif (nargin >= 1)
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
84 if (isstruct (arg1))
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
85 arrayfun (@is_valid_format, arg1);
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
86 ## FIXME: what is the return value in this situation?
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
87 formats = arg1;
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
88
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
89 elseif (ischar (arg1))
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
90 switch (tolower (arg1))
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
91 case "add",
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
92 if (! isstruct (arg2))
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
93 error ("imformats: FORMAT to %s must be a structure.", arg1);
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
94 endif
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
95 arrayfun (@is_valid_format, arg2);
16949
1eb5e5f0ee13 imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents: 16922
diff changeset
96 formats(end + 1: end + numel (arg2)) = arg2;
16907
04f4f067eb33 imformats: fix typos and silence some statements.
Carnë Draug <carandraug@octave.org>
parents: 16906
diff changeset
97 varargout{1} = formats;
16901
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
98
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
99 case {"remove", "update"},
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
100 if (! ischar (arg2))
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
101 error ("imformats: EXT to %s must be a string.", arg1);
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
102 endif
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
103 ## FIXME: suppose a format with multiple extensions. If one of
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
104 ## them is requested to be removed, should we remove the
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
105 ## whole format, or just that extension from the format?
16907
04f4f067eb33 imformats: fix typos and silence some statements.
Carnë Draug <carandraug@octave.org>
parents: 16906
diff changeset
106 match = find_ext_idx (formats, arg2);
16901
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
107 if (! any (match))
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
108 error ("imformats: no EXT `%s' found.", arg2);
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
109 endif
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
110 if (strcmpi (arg1, "remove"))
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
111 formats(match) = [];
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
112 else
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
113 ## then it's update
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
114 if (! isstruct (arg3))
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
115 error ("imformats: FORMAT to update must be a structure.");
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
116 endif
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
117 is_valid_format (arg3);
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
118 formats(match) = arg3;
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
119 endif
16907
04f4f067eb33 imformats: fix typos and silence some statements.
Carnë Draug <carandraug@octave.org>
parents: 16906
diff changeset
120 varargout{1} = formats;
16901
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
121
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
122 case "factory",
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
123 formats = default_formats ();
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
124 otherwise
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
125 ## then we look for a format with that extension.
16907
04f4f067eb33 imformats: fix typos and silence some statements.
Carnë Draug <carandraug@octave.org>
parents: 16906
diff changeset
126 match = find_ext_idx (formats, arg1);
16901
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
127 ## For matlab compatibility, if we don't find any format we must
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
128 ## return an empty struct with NO fields. We can't use match as mask
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
129 if (any (match))
16907
04f4f067eb33 imformats: fix typos and silence some statements.
Carnë Draug <carandraug@octave.org>
parents: 16906
diff changeset
130 varargout{1} = formats(match);
16901
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
131 else
16907
04f4f067eb33 imformats: fix typos and silence some statements.
Carnë Draug <carandraug@octave.org>
parents: 16906
diff changeset
132 varargout{1} = struct ();
16901
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
133 endif
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
134 endswitch
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
135 else
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
136 error ("imformats: first argument must be either a structure or string.");
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
137 endif
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
138 else
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
139 varargout{1} = formats;
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
140 endif
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
141 endfunction
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
142
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
143 function formats = default_formats ()
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
144
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
145 ## The available formats are dependent on what the user has installed at
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
146 ## a given time, and how GraphicsMagick was built. Checking for
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
147 ## GraphicsMagick features when building Octave is not enough since it
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
148 ## delegates some of them to external programs which can be removed or
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
149 ## installed at any time.
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
150 ## The recommended method would be to use CoderInfoList() to get a list of
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
151 ## all available coders and try to write and read back a small test image.
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
152 ## But this will not work since some coders are readable or writable only.
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
153 ## It will still fail if we test only the ones marked as readable and
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
154 ## writable because some RW coders are not of image formats (NULL, 8BIM,
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
155 ## or EXIF for example).
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
156 ## So we'd need a blacklist (unacceptable because a `bad' coder may be
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
157 ## added later) or a whitelist. A whitelist means that even with a
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
158 ## super-fancy recent build of GraphicsMagick, some formats won't be listed
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
159 ## by imformats but in truth, we will still be able to read and write them
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
160 ## since imread() and imwrite() will give it a try anyway.
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
161 ##
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
162 ## For more info and comments from the GraphicsMagick main developer, see
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
163 ## http://sourceforge.net/mailarchive/forum.php?thread_name=alpine.GSO.2.01.1304301916050.2267%40freddy.simplesystems.org&forum_name=graphicsmagick-help
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
164
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
165 persistent formats = struct ( "coder", {},
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
166 "ext", {},
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
167 "isa", {},
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
168 "info", {},
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
169 "read", {},
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
170 "write", {},
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
171 "alpha", {},
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
172 "description", {},
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
173 "multipage", {});
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
174
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
175 ## Image IO abilities won't change during the same Octave session,
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
176 ## there's no need to go and calculate it all over again if we are
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
177 ## requested to reset back to factory.
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
178 if (! isempty (formats))
17312
088d014a7fe2 Use semicolon after "return" statement in core m-files.
Rik <rik@octave.org>
parents: 17281
diff changeset
179 return;
16901
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
180 endif
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
181
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
182 ## Building the formats info
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
183 ##
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
184 ## As mentioned above we start with a whitelist of coders. Since the
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
185 ## GraphicsMagick build may be missing some coders, we will remove those
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
186 ## from the list. Some info can be obtained directly from GraphicsMagick
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
187 ## through the CoderInfo object. However, some will need to be hardcoded.
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
188 ##
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
189 ## The association between file extensions and coders needs to be done
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
190 ## with a manually coded list (file extensions do not define the image
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
191 ## format and GraphicsMagick will not be fooled by changing the extension).
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
192 ##
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
193 ## We can get the read, write, description and multipage fields from
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
194 ## CoderInfo in C++. We should do the same for alpha (GraphicsMagick
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
195 ## calls it matte) but it's not available from CoderInfo. The only way to
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
196 ## check it is to create a sample image with each coder, then try to read
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
197 ## it back with GraphicsMagick and use the matte method on the Image class.
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
198 ## But making such test for each Octave session... meh! While technically
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
199 ## it may be possible that the same coder has different support for alpha
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
200 ## channel in different versions and builds, this doesn't seem to happen.
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
201 ## So we also hardcode those. In the future, maybe the CoderInfo class will
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
202 ## have a matte method like it does for multipage.
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
203 ##
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
204 ## Other notes: some formats have more than one coder that do the same. For
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
205 ## example, for jpeg images there is both the JPG and JPEG coders. However,
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
206 ## it seems that when reading images, GraphicsMagick only uses one of them
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
207 ## and that's the one we list (it's the one reported by imfinfo and that we
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
208 ## can use for isa). However, in some cases GraphicsMagick seems to rely
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
209 ## uniquely on the file extension ((JBIG and JBG at least. Create an image
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
210 ## with each of those coders, swap their extension and it will report the
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
211 ## other coder). We don't have such cases on the whitelist but if we did, we
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
212 ## would need two entries for such cases.
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
213
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
214 ## each row: 1st => Coder, 2nd=> file extensions, 3rd=> alpha
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
215 coders = {"BMP", {"bmp"}, true;
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
216 "CUR", {"cur"}, false;
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
217 "GIF", {"gif"}, true;
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
218 "ICO", {"ico"}, true;
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
219 "JBG", {"jbg"}, false;
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
220 "JBIG", {"jbig"}, false;
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
221 "JP2", {"jp2", "jpx"}, true;
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
222 "JPEG", {"jpg", "jpeg"}, false; # there is also a JPG coder
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
223 "PBM", {"pbm"}, false;
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
224 "PCX", {"pcx"}, true;
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
225 "PGM", {"pgm"}, false;
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
226 "PNG", {"png"}, true;
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
227 ## PNM is a family of formats supporting portable bitmaps (PBM),
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
228 ## graymaps (PGM), and pixmaps (PPM). There is no file format
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
229 ## associated with pnm itself. If PNM is used as the output format
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
230 ## specifier, then GraphicsMagick automatically selects the most
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
231 ## appropriate format to represent the image.
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
232 "PNM", {"pnm"}, true;
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
233 "PPM", {"ppm"}, false;
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
234 "SUN", {"ras"}, true; # SUN Rasterfile
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
235 "TGA", {"tga", "tpic"}, true;
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
236 "TIFF", {"tif", "tiff"}, true;
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
237 "XBM", {"xbm"}, false;
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
238 "XPM", {"xpm"}, true;
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
239 "XWD", {"xwd"}, false;
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
240 };
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
241
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
242 for fidx = 1: rows(coders)
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
243 formats(fidx).coder = coders{fidx, 1};
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
244 formats(fidx).ext = coders{fidx, 2};
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
245 formats(fidx).alpha = coders{fidx, 3};
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
246 ## default isa is to check if the format returned by imfinfo is the coder
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
247 formats(fidx).isa = @(x) isa_magick (coders{fidx,1}, x);
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
248 endfor
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
249
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
250 ## the default info, read, and write functions
17086
3db796f89695 Rename private core_imfnc functions to follow the __fnc__ convention style.
Carnë Draug <carandraug@octave.org>
parents: 16949
diff changeset
251 [formats.info ] = deal (@__imfinfo__);
3db796f89695 Rename private core_imfnc functions to follow the __fnc__ convention style.
Carnë Draug <carandraug@octave.org>
parents: 16949
diff changeset
252 [formats.read ] = deal (@__imread__);
3db796f89695 Rename private core_imfnc functions to follow the __fnc__ convention style.
Carnë Draug <carandraug@octave.org>
parents: 16949
diff changeset
253 [formats.write] = deal (@__imwrite__);
16901
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
254
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
255 ## fills rest of format information by checking with GraphicsMagick
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
256 formats = __magick_formats__ (formats);
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
257 endfunction
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
258
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
259 function is_valid_format (format)
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
260 ## the minimal list of fields required in the structure. We don't
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
261 ## require multipage because it doesn't exist in matlab
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
262 min_fields = {"ext", "read", "isa", "write", "info", "alpha", "description"};
17386
6dbc866379e2 Replace cellfun() occurrences with faster code where possible.
Rik <rik@octave.org>
parents: 17351
diff changeset
263 fields_mask = isfield (format, min_fields);
16901
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
264 if (! all (fields_mask))
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
265 error ("imformats: structure has missing field `%s'.", min_fields(! fields_mask){1});
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
266 endif
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
267 endfunction
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
268
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
269 function match = find_ext_idx (formats, ext)
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
270 ## XXX: what should we do if there's more than one hit?
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
271 ## Should this function prevent the addition of
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
272 ## duplicated extensions?
18292
4718af222d9d image/imformats.m: be case insensitive about file extension.
Carnë Draug <carandraug@octave.org>
parents: 17580
diff changeset
273 match = cellfun (@(x) any (strcmpi (x, ext)), {formats.ext});
16901
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
274 endfunction
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
275
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
276 function bool = isa_magick (coder, filename)
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
277 bool = false;
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
278 try
17351
80bf005cdf8e New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents: 17338
diff changeset
279 info = __magick_ping__ (filename, 1);
16901
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
280 bool = strcmp (coder, info.Format);
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
281 end_try_catch
861516dcad19 New function imformats.
Carnë Draug <carandraug@octave.org>
parents:
diff changeset
282 endfunction
16949
1eb5e5f0ee13 imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents: 16922
diff changeset
283
20170
c0f64bc26eee imformats.m: rewrite pretty print of format table.
Carnë Draug <carandraug@octave.org>
parents: 20169
diff changeset
284 function pretty_print_formats (formats)
20169
cf96961effdb imformats.m: implement pretty print when nargout is zero (bug #44119)
Hartmut Gimpel <hg_code@gmx.de>
parents: 19697
diff changeset
285 ## define header names (none should be shorter than 3 characters)
20170
c0f64bc26eee imformats.m: rewrite pretty print of format table.
Carnë Draug <carandraug@octave.org>
parents: 20169
diff changeset
286 headers = {"Extension", "isa", "Info", "Read", "Write", "Alpha", "Description"};
c0f64bc26eee imformats.m: rewrite pretty print of format table.
Carnë Draug <carandraug@octave.org>
parents: 20169
diff changeset
287 cols_length = cellfun (@numel, headers);
c0f64bc26eee imformats.m: rewrite pretty print of format table.
Carnë Draug <carandraug@octave.org>
parents: 20169
diff changeset
288
c0f64bc26eee imformats.m: rewrite pretty print of format table.
Carnë Draug <carandraug@octave.org>
parents: 20169
diff changeset
289 ## Adjust the maximal length of the extensions column
c0f64bc26eee imformats.m: rewrite pretty print of format table.
Carnë Draug <carandraug@octave.org>
parents: 20169
diff changeset
290 extensions = cellfun (@strjoin, {formats.ext}, {", "},
c0f64bc26eee imformats.m: rewrite pretty print of format table.
Carnë Draug <carandraug@octave.org>
parents: 20169
diff changeset
291 "UniformOutput", false);
c0f64bc26eee imformats.m: rewrite pretty print of format table.
Carnë Draug <carandraug@octave.org>
parents: 20169
diff changeset
292 cols_length(1) = max (max (cellfun (@numel, extensions)), cols_length(1));
c0f64bc26eee imformats.m: rewrite pretty print of format table.
Carnë Draug <carandraug@octave.org>
parents: 20169
diff changeset
293 headers{1} = postpad (headers{1}, cols_length(1), " ");
c0f64bc26eee imformats.m: rewrite pretty print of format table.
Carnë Draug <carandraug@octave.org>
parents: 20169
diff changeset
294
c0f64bc26eee imformats.m: rewrite pretty print of format table.
Carnë Draug <carandraug@octave.org>
parents: 20169
diff changeset
295 ## Print the headers
c0f64bc26eee imformats.m: rewrite pretty print of format table.
Carnë Draug <carandraug@octave.org>
parents: 20169
diff changeset
296 disp (strjoin (headers, " | "));
c0f64bc26eee imformats.m: rewrite pretty print of format table.
Carnë Draug <carandraug@octave.org>
parents: 20169
diff changeset
297 under_headers = cellfun (@(x) repmat ("-", 1, numel (x)), headers,
c0f64bc26eee imformats.m: rewrite pretty print of format table.
Carnë Draug <carandraug@octave.org>
parents: 20169
diff changeset
298 "UniformOutput", false);
c0f64bc26eee imformats.m: rewrite pretty print of format table.
Carnë Draug <carandraug@octave.org>
parents: 20169
diff changeset
299 disp (strjoin (under_headers, "-+-"));
c0f64bc26eee imformats.m: rewrite pretty print of format table.
Carnë Draug <carandraug@octave.org>
parents: 20169
diff changeset
300
c0f64bc26eee imformats.m: rewrite pretty print of format table.
Carnë Draug <carandraug@octave.org>
parents: 20169
diff changeset
301 template = strjoin (arrayfun (@(x) sprintf ("%%-%is", x), cols_length,
c0f64bc26eee imformats.m: rewrite pretty print of format table.
Carnë Draug <carandraug@octave.org>
parents: 20169
diff changeset
302 "UniformOutput", false), " | ");
c0f64bc26eee imformats.m: rewrite pretty print of format table.
Carnë Draug <carandraug@octave.org>
parents: 20169
diff changeset
303
c0f64bc26eee imformats.m: rewrite pretty print of format table.
Carnë Draug <carandraug@octave.org>
parents: 20169
diff changeset
304 ## Print the function handle for this things won't be a pretty table. So
c0f64bc26eee imformats.m: rewrite pretty print of format table.
Carnë Draug <carandraug@octave.org>
parents: 20169
diff changeset
305 ## instead we replace them with "yes" or "no", based on the support it has.
c0f64bc26eee imformats.m: rewrite pretty print of format table.
Carnë Draug <carandraug@octave.org>
parents: 20169
diff changeset
306 yes_no_cols = cat (2, {formats.isa}(:), {formats.info}(:), {formats.read}(:),
c0f64bc26eee imformats.m: rewrite pretty print of format table.
Carnë Draug <carandraug@octave.org>
parents: 20169
diff changeset
307 {formats.write}(:), {formats.alpha}(:));
c0f64bc26eee imformats.m: rewrite pretty print of format table.
Carnë Draug <carandraug@octave.org>
parents: 20169
diff changeset
308 empty = cellfun (@isempty, yes_no_cols);
c0f64bc26eee imformats.m: rewrite pretty print of format table.
Carnë Draug <carandraug@octave.org>
parents: 20169
diff changeset
309 yes_no_cols(empty) = "no";
c0f64bc26eee imformats.m: rewrite pretty print of format table.
Carnë Draug <carandraug@octave.org>
parents: 20169
diff changeset
310 yes_no_cols(! empty) = "yes";
c0f64bc26eee imformats.m: rewrite pretty print of format table.
Carnë Draug <carandraug@octave.org>
parents: 20169
diff changeset
311
c0f64bc26eee imformats.m: rewrite pretty print of format table.
Carnë Draug <carandraug@octave.org>
parents: 20169
diff changeset
312 descriptions = {formats.description};
c0f64bc26eee imformats.m: rewrite pretty print of format table.
Carnë Draug <carandraug@octave.org>
parents: 20169
diff changeset
313 table = cat (2, extensions(:), yes_no_cols, descriptions(:));
c0f64bc26eee imformats.m: rewrite pretty print of format table.
Carnë Draug <carandraug@octave.org>
parents: 20169
diff changeset
314 printf ([template "\n"], table'{:});
c0f64bc26eee imformats.m: rewrite pretty print of format table.
Carnë Draug <carandraug@octave.org>
parents: 20169
diff changeset
315
20169
cf96961effdb imformats.m: implement pretty print when nargout is zero (bug #44119)
Hartmut Gimpel <hg_code@gmx.de>
parents: 19697
diff changeset
316 endfunction
cf96961effdb imformats.m: implement pretty print when nargout is zero (bug #44119)
Hartmut Gimpel <hg_code@gmx.de>
parents: 19697
diff changeset
317
21489
ea81c2fdd568 imformats: return empty instead of error if there's no support for image IO.
Carnë Draug <carandraug@octave.org>
parents: 20852
diff changeset
318 ## This must work, even without support for image IO
ea81c2fdd568 imformats: return empty instead of error if there's no support for image IO.
Carnë Draug <carandraug@octave.org>
parents: 20852
diff changeset
319 %!test
ea81c2fdd568 imformats: return empty instead of error if there's no support for image IO.
Carnë Draug <carandraug@octave.org>
parents: 20852
diff changeset
320 %! formats = imformats ();
ea81c2fdd568 imformats: return empty instead of error if there's no support for image IO.
Carnë Draug <carandraug@octave.org>
parents: 20852
diff changeset
321 %! assert (isstruct (formats))
ea81c2fdd568 imformats: return empty instead of error if there's no support for image IO.
Carnë Draug <carandraug@octave.org>
parents: 20852
diff changeset
322 %!
ea81c2fdd568 imformats: return empty instead of error if there's no support for image IO.
Carnë Draug <carandraug@octave.org>
parents: 20852
diff changeset
323 %! min_fields = {"ext", "read", "isa", "write", "info", "alpha", "description"};
ea81c2fdd568 imformats: return empty instead of error if there's no support for image IO.
Carnë Draug <carandraug@octave.org>
parents: 20852
diff changeset
324 %! assert (all (ismember (min_fields, fieldnames (formats))))
ea81c2fdd568 imformats: return empty instead of error if there's no support for image IO.
Carnë Draug <carandraug@octave.org>
parents: 20852
diff changeset
325 %!
ea81c2fdd568 imformats: return empty instead of error if there's no support for image IO.
Carnë Draug <carandraug@octave.org>
parents: 20852
diff changeset
326 %! if (__have_feature__ ("MAGICK"))
ea81c2fdd568 imformats: return empty instead of error if there's no support for image IO.
Carnë Draug <carandraug@octave.org>
parents: 20852
diff changeset
327 %! assert (numel (formats) > 0)
ea81c2fdd568 imformats: return empty instead of error if there's no support for image IO.
Carnë Draug <carandraug@octave.org>
parents: 20852
diff changeset
328 %! else
ea81c2fdd568 imformats: return empty instead of error if there's no support for image IO.
Carnë Draug <carandraug@octave.org>
parents: 20852
diff changeset
329 %! assert (numel (formats), 0)
ea81c2fdd568 imformats: return empty instead of error if there's no support for image IO.
Carnë Draug <carandraug@octave.org>
parents: 20852
diff changeset
330 %! endif
ea81c2fdd568 imformats: return empty instead of error if there's no support for image IO.
Carnë Draug <carandraug@octave.org>
parents: 20852
diff changeset
331
18298
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
332 ## When imread or imfinfo are called, the file must exist or the
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
333 ## function defined by imformats will never be called. Because
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
334 ## of this, we must create a file for the tests to work.
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
335
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
336 ## changing the function that does the reading
16949
1eb5e5f0ee13 imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents: 16922
diff changeset
337 %!testif HAVE_MAGICK
19278
6ca096827123 Use tempname() rather than tmpnam() in core Octave.
Rik <rik@octave.org>
parents: 18298
diff changeset
338 %! fname = [tempname() ".jpg"];
18298
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
339 %! def_fmt = imformats ();
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
340 %! fid = fopen (fname, "w");
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
341 %! unwind_protect
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
342 %! fmt = imformats ("jpg");
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
343 %! fmt.read = @numel;
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
344 %! imformats ("update", "jpg", fmt);
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
345 %! assert (imread (fname), numel (fname));
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
346 %! unwind_protect_cleanup
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
347 %! fclose (fid);
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
348 %! unlink (fname);
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
349 %! imformats (def_fmt);
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
350 %! end_unwind_protect
16949
1eb5e5f0ee13 imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents: 16922
diff changeset
351
1eb5e5f0ee13 imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents: 16922
diff changeset
352 ## adding a new format
1eb5e5f0ee13 imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents: 16922
diff changeset
353 %!testif HAVE_MAGICK
19278
6ca096827123 Use tempname() rather than tmpnam() in core Octave.
Rik <rik@octave.org>
parents: 18298
diff changeset
354 %! fname = [tempname() ".new_fmt"];
18298
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
355 %! def_fmt = imformats ();
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
356 %! fid = fopen (fname, "w");
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
357 %! unwind_protect
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
358 %! fmt = imformats ("jpg"); # take jpg as template
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
359 %! fmt.ext = "new_fmt";
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
360 %! fmt.read = @() true ();
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
361 %! imformats ("add", fmt);
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
362 %! assert (imread (fname), true);
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
363 %! unwind_protect_cleanup
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
364 %! fclose (fid);
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
365 %! unlink (fname);
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
366 %! imformats (def_fmt);
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
367 %! end_unwind_protect
16949
1eb5e5f0ee13 imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents: 16922
diff changeset
368
18298
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
369 ## adding multiple formats at the same time
16949
1eb5e5f0ee13 imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents: 16922
diff changeset
370 %!testif HAVE_MAGICK
19278
6ca096827123 Use tempname() rather than tmpnam() in core Octave.
Rik <rik@octave.org>
parents: 18298
diff changeset
371 %! fname1 = [tempname() ".new_fmt1"];
18298
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
372 %! fid1 = fopen (fname1, "w");
19278
6ca096827123 Use tempname() rather than tmpnam() in core Octave.
Rik <rik@octave.org>
parents: 18298
diff changeset
373 %! fname2 = [tempname() ".new_fmt2"];
18298
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
374 %! fid2 = fopen (fname2, "w");
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
375 %! def_fmt = imformats ();
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
376 %! unwind_protect
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
377 %! fmt = imformats ("jpg"); # take jpg as template
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
378 %! fmt.ext = "new_fmt1";
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
379 %! fmt.read = @() true();
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
380 %! fmt(2) = fmt(1);
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
381 %! fmt(2).ext = "new_fmt2";
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
382 %! imformats ("add", fmt);
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
383 %! assert (imread (fname1), true);
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
384 %! assert (imread (fname2), true);
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
385 %! unwind_protect_cleanup
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
386 %! fclose (fid1);
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
387 %! fclose (fid2);
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
388 %! unlink (fname1);
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
389 %! unlink (fname2);
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
390 %! imformats (def_fmt);
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
391 %! end_unwind_protect
16949
1eb5e5f0ee13 imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents: 16922
diff changeset
392
18298
15db54c4a572 Fix input parsing for imageIO functions and make imread accept URL (bug #41234)
Carnë Draug <carandraug@octave.org>
parents: 18297
diff changeset
393 ## changing format and resetting back to default
16949
1eb5e5f0ee13 imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents: 16922
diff changeset
394 %!testif HAVE_MAGICK
1eb5e5f0ee13 imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents: 16922
diff changeset
395 %! ori_fmt = mod_fmt = imformats ("jpg");
1eb5e5f0ee13 imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents: 16922
diff changeset
396 %! mod_fmt.description = "Another description";
1eb5e5f0ee13 imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents: 16922
diff changeset
397 %! imformats ("update", "jpg", mod_fmt);
1eb5e5f0ee13 imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents: 16922
diff changeset
398 %! new_fmt = imformats ("jpg");
1eb5e5f0ee13 imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents: 16922
diff changeset
399 %! assert (new_fmt.description, mod_fmt.description);
1eb5e5f0ee13 imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents: 16922
diff changeset
400 %! imformats ("factory");
1eb5e5f0ee13 imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents: 16922
diff changeset
401 %! new_fmt = imformats ("jpg");
1eb5e5f0ee13 imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents: 16922
diff changeset
402 %! assert (new_fmt.description, ori_fmt.description);
1eb5e5f0ee13 imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents: 16922
diff changeset
403
18297
1589b2fc74ae imformats.m: add test for updating a format with invalid struct.
Carnë Draug <carandraug@octave.org>
parents: 18292
diff changeset
404 ## updating to an invalid format should cause an error
1589b2fc74ae imformats.m: add test for updating a format with invalid struct.
Carnë Draug <carandraug@octave.org>
parents: 18292
diff changeset
405 %!testif HAVE_MAGICK
1589b2fc74ae imformats.m: add test for updating a format with invalid struct.
Carnë Draug <carandraug@octave.org>
parents: 18292
diff changeset
406 %! fmt = imformats ("jpg");
1589b2fc74ae imformats.m: add test for updating a format with invalid struct.
Carnë Draug <carandraug@octave.org>
parents: 18292
diff changeset
407 %! fmt = rmfield (fmt, "read");
1589b2fc74ae imformats.m: add test for updating a format with invalid struct.
Carnë Draug <carandraug@octave.org>
parents: 18292
diff changeset
408 %! error_thrown = false;
1589b2fc74ae imformats.m: add test for updating a format with invalid struct.
Carnë Draug <carandraug@octave.org>
parents: 18292
diff changeset
409 %! try
1589b2fc74ae imformats.m: add test for updating a format with invalid struct.
Carnë Draug <carandraug@octave.org>
parents: 18292
diff changeset
410 %! imformats ("update", "jpg", fmt);
1589b2fc74ae imformats.m: add test for updating a format with invalid struct.
Carnë Draug <carandraug@octave.org>
parents: 18292
diff changeset
411 %! catch
1589b2fc74ae imformats.m: add test for updating a format with invalid struct.
Carnë Draug <carandraug@octave.org>
parents: 18292
diff changeset
412 %! error_thrown = true;
1589b2fc74ae imformats.m: add test for updating a format with invalid struct.
Carnë Draug <carandraug@octave.org>
parents: 18292
diff changeset
413 %! end_try_catch
1589b2fc74ae imformats.m: add test for updating a format with invalid struct.
Carnë Draug <carandraug@octave.org>
parents: 18292
diff changeset
414 %! assert (error_thrown, true);
16949
1eb5e5f0ee13 imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents: 16922
diff changeset
415