Mercurial > octave
annotate scripts/image/imformats.m @ 17351:80bf005cdf8e
New function __magick_ping__ to speed reading of images.
* __magick_read__.cc (__magick_ping__): New function that only pings
one of the images in a file to obtain height, width and format
information. This becomes an alternative to imfinfo for internal
Octave functions. Because imfinfo requires reading of the whole
file and all images, this has a large speed increase, specially
for multipage images.
* imformats.m: use __magick_ping__() to check image format.
* private/__imread__.m: use __magick_ping__() to get rows and columns
of an image which is used to set the reading defaults.
author | Carnë Draug <carandraug@octave.org> |
---|---|
date | Fri, 30 Aug 2013 07:19:13 +0100 |
parents | 1c89599167a6 |
children | 6dbc866379e2 |
rev | line source |
---|---|
16901 | 1 ## Copyright (C) 2013 Carnë Draug |
2 ## | |
3 ## This file is part of Octave. | |
4 ## | |
5 ## Octave is free software; you can redistribute it and/or modify it | |
6 ## under the terms of the GNU General Public License as published by | |
7 ## the Free Software Foundation; either version 3 of the License, or (at | |
8 ## your option) any later version. | |
9 ## | |
10 ## Octave is distributed in the hope that it will be useful, but | |
11 ## WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 ## General Public License for more details. | |
14 ## | |
15 ## You should have received a copy of the GNU General Public License | |
16 ## along with Octave; see the file COPYING. If not, see | |
17 ## <http://www.gnu.org/licenses/>. | |
18 | |
19 ## -*- texinfo -*- | |
20 ## @deftypefn {Function File} {} imformats () | |
21 ## @deftypefnx {Function File} {@var{formats} =} imformats (@var{ext}) | |
22 ## @deftypefnx {Function File} {@var{formats} =} imformats (@var{format}) | |
23 ## @deftypefnx {Function File} {@var{formats} =} imformats ("add", @var{format}) | |
24 ## @deftypefnx {Function File} {@var{formats} =} imformats ("remove", @var{ext}) | |
25 ## @deftypefnx {Function File} {@var{formats} =} imformats ("update", @var{ext}, @var{format}) | |
26 ## @deftypefnx {Function File} {@var{formats} =} imformats ("factory") | |
27 ## Manage supported image formats. | |
28 ## | |
29 ## @var{formats} is a structure with information about each supported file | |
30 ## format, or from a specific format @var{ext}, the value displayed on the | |
31 ## field @code{ext}. It contains the following fields: | |
32 ## | |
33 ## @table @asis | |
34 ## @item ext | |
35 ## The name of the file format. This may match the file extension but Octave | |
36 ## will automatically detect the file format. | |
17170
d6499c14021c
doc: Periodic grammarcheck of documentation.
Rik <rik@octave.org>
parents:
17086
diff
changeset
|
37 ## |
16901 | 38 ## @item description |
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 | 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 | 44 ## @item write |
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 | 47 ## @item read |
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 | 50 ## @item info |
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 | 53 ## @item alpha |
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 | 56 ## @item multipage |
57 ## Logical value if format supports multipage (multiple images per file). | |
58 ## @end table | |
59 ## | |
60 ## It is possible to change the way Octave manages file formats with the options | |
17281
bc924baa2c4e
doc: Add new @qcode macro for code samples which are quoted.
Rik <rik@octave.org>
parents:
17170
diff
changeset
|
61 ## @qcode{"add"}, @qcode{"remove"}, and @qcode{"update"}, and supplying a |
16901 | 62 ## 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 | 64 ## |
65 ## This can be used by Octave packages to extend the image reading capabilities | |
66 ## Octave, through use of the PKG_ADD and PKG_DEL commands. | |
67 ## | |
68 ## @seealso{imfinfo, imread, imwrite} | |
69 ## @end deftypefn | |
70 | |
71 ## Author: Carnë Draug <carandraug@octave.org> | |
72 | |
73 function varargout = imformats (arg1, arg2, arg3) | |
74 if (nargin > 3) | |
75 print_usage (); | |
76 endif | |
77 | |
78 persistent formats = default_formats (); | |
79 | |
80 if (nargin == 0 && nargout == 0) | |
81 error ("imformats: pretty print not yet implemented."); | |
82 elseif (nargin >= 1) | |
83 if (isstruct (arg1)) | |
84 arrayfun (@is_valid_format, arg1); | |
85 ## FIXME: what is the return value in this situation? | |
86 formats = arg1; | |
87 | |
88 elseif (ischar (arg1)) | |
89 switch (tolower (arg1)) | |
90 case "add", | |
91 if (! isstruct (arg2)) | |
92 error ("imformats: FORMAT to %s must be a structure.", arg1); | |
93 endif | |
94 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
|
95 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
|
96 varargout{1} = formats; |
16901 | 97 |
98 case {"remove", "update"}, | |
99 if (! ischar (arg2)) | |
100 error ("imformats: EXT to %s must be a string.", arg1); | |
101 endif | |
102 ## FIXME: suppose a format with multiple extensions. If one of | |
103 ## them is requested to be removed, should we remove the | |
104 ## 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
|
105 match = find_ext_idx (formats, arg2); |
16901 | 106 if (! any (match)) |
107 error ("imformats: no EXT `%s' found.", arg2); | |
108 endif | |
109 if (strcmpi (arg1, "remove")) | |
110 formats(match) = []; | |
111 else | |
112 ## then it's update | |
113 if (! isstruct (arg3)) | |
114 error ("imformats: FORMAT to update must be a structure."); | |
115 endif | |
116 is_valid_format (arg3); | |
117 formats(match) = arg3; | |
118 endif | |
16907
04f4f067eb33
imformats: fix typos and silence some statements.
Carnë Draug <carandraug@octave.org>
parents:
16906
diff
changeset
|
119 varargout{1} = formats; |
16901 | 120 |
121 case "factory", | |
122 formats = default_formats (); | |
123 otherwise | |
124 ## 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
|
125 match = find_ext_idx (formats, arg1); |
16901 | 126 ## For matlab compatibility, if we don't find any format we must |
127 ## return an empty struct with NO fields. We can't use match as mask | |
128 if (any (match)) | |
16907
04f4f067eb33
imformats: fix typos and silence some statements.
Carnë Draug <carandraug@octave.org>
parents:
16906
diff
changeset
|
129 varargout{1} = formats(match); |
16901 | 130 else |
16907
04f4f067eb33
imformats: fix typos and silence some statements.
Carnë Draug <carandraug@octave.org>
parents:
16906
diff
changeset
|
131 varargout{1} = struct (); |
16901 | 132 endif |
133 endswitch | |
134 else | |
135 error ("imformats: first argument must be either a structure or string."); | |
136 endif | |
137 else | |
138 varargout{1} = formats; | |
139 endif | |
140 endfunction | |
141 | |
142 function formats = default_formats () | |
143 | |
144 ## The available formats are dependent on what the user has installed at | |
145 ## a given time, and how GraphicsMagick was built. Checking for | |
146 ## GraphicsMagick features when building Octave is not enough since it | |
147 ## delegates some of them to external programs which can be removed or | |
148 ## installed at any time. | |
149 ## The recommended method would be to use CoderInfoList() to get a list of | |
150 ## all available coders and try to write and read back a small test image. | |
151 ## But this will not work since some coders are readable or writable only. | |
152 ## It will still fail if we test only the ones marked as readable and | |
153 ## writable because some RW coders are not of image formats (NULL, 8BIM, | |
154 ## or EXIF for example). | |
155 ## So we'd need a blacklist (unacceptable because a `bad' coder may be | |
156 ## added later) or a whitelist. A whitelist means that even with a | |
157 ## super-fancy recent build of GraphicsMagick, some formats won't be listed | |
158 ## by imformats but in truth, we will still be able to read and write them | |
159 ## since imread() and imwrite() will give it a try anyway. | |
160 ## | |
161 ## For more info and comments from the GraphicsMagick main developer, see | |
162 ## http://sourceforge.net/mailarchive/forum.php?thread_name=alpine.GSO.2.01.1304301916050.2267%40freddy.simplesystems.org&forum_name=graphicsmagick-help | |
163 | |
164 persistent formats = struct ( "coder", {}, | |
165 "ext", {}, | |
166 "isa", {}, | |
167 "info", {}, | |
168 "read", {}, | |
169 "write", {}, | |
170 "alpha", {}, | |
171 "description", {}, | |
172 "multipage", {}); | |
173 | |
174 ## Image IO abilities won't change during the same Octave session, | |
175 ## there's no need to go and calculate it all over again if we are | |
176 ## requested to reset back to factory. | |
177 if (! isempty (formats)) | |
17312
088d014a7fe2
Use semicolon after "return" statement in core m-files.
Rik <rik@octave.org>
parents:
17281
diff
changeset
|
178 return; |
16901 | 179 endif |
180 | |
181 ## Building the formats info | |
182 ## | |
183 ## As mentioned above we start with a whitelist of coders. Since the | |
184 ## GraphicsMagick build may be missing some coders, we will remove those | |
185 ## from the list. Some info can be obtained directly from GraphicsMagick | |
186 ## through the CoderInfo object. However, some will need to be hardcoded. | |
187 ## | |
188 ## The association between file extensions and coders needs to be done | |
189 ## with a manually coded list (file extensions do not define the image | |
190 ## format and GraphicsMagick will not be fooled by changing the extension). | |
191 ## | |
192 ## We can get the read, write, description and multipage fields from | |
193 ## CoderInfo in C++. We should do the same for alpha (GraphicsMagick | |
194 ## calls it matte) but it's not available from CoderInfo. The only way to | |
195 ## check it is to create a sample image with each coder, then try to read | |
196 ## it back with GraphicsMagick and use the matte method on the Image class. | |
197 ## But making such test for each Octave session... meh! While technically | |
198 ## it may be possible that the same coder has different support for alpha | |
199 ## channel in different versions and builds, this doesn't seem to happen. | |
200 ## So we also hardcode those. In the future, maybe the CoderInfo class will | |
201 ## have a matte method like it does for multipage. | |
202 ## | |
203 ## Other notes: some formats have more than one coder that do the same. For | |
204 ## example, for jpeg images there is both the JPG and JPEG coders. However, | |
205 ## it seems that when reading images, GraphicsMagick only uses one of them | |
206 ## and that's the one we list (it's the one reported by imfinfo and that we | |
207 ## can use for isa). However, in some cases GraphicsMagick seems to rely | |
208 ## uniquely on the file extension ((JBIG and JBG at least. Create an image | |
209 ## with each of those coders, swap their extension and it will report the | |
210 ## other coder). We don't have such cases on the whitelist but if we did, we | |
211 ## would need two entries for such cases. | |
212 | |
213 ## each row: 1st => Coder, 2nd=> file extensions, 3rd=> alpha | |
214 coders = {"BMP", {"bmp"}, true; | |
215 "CUR", {"cur"}, false; | |
216 "GIF", {"gif"}, true; | |
217 "ICO", {"ico"}, true; | |
218 "JBG", {"jbg"}, false; | |
219 "JBIG", {"jbig"}, false; | |
220 "JP2", {"jp2", "jpx"}, true; | |
221 "JPEG", {"jpg", "jpeg"}, false; # there is also a JPG coder | |
222 "PBM", {"pbm"}, false; | |
223 "PCX", {"pcx"}, true; | |
224 "PGM", {"pgm"}, false; | |
225 "PGM", {"pgm"}, false; | |
226 "PNG", {"png"}, true; | |
227 ## PNM is a family of formats supporting portable bitmaps (PBM), | |
228 ## graymaps (PGM), and pixmaps (PPM). There is no file format | |
229 ## associated with pnm itself. If PNM is used as the output format | |
230 ## specifier, then GraphicsMagick automatically selects the most | |
231 ## appropriate format to represent the image. | |
232 "PNM", {"pnm"}, true; | |
233 "PPM", {"ppm"}, false; | |
234 "SUN", {"ras"}, true; # SUN Rasterfile | |
235 "TGA", {"tga", "tpic"}, true; | |
236 "TIFF", {"tif", "tiff"}, true; | |
237 "XBM", {"xbm"}, false; | |
238 "XPM", {"xpm"}, true; | |
239 "XWD", {"xwd"}, false; | |
240 }; | |
241 | |
242 for fidx = 1: rows(coders) | |
243 formats(fidx).coder = coders{fidx, 1}; | |
244 formats(fidx).ext = coders{fidx, 2}; | |
245 formats(fidx).alpha = coders{fidx, 3}; | |
246 ## default isa is to check if the format returned by imfinfo is the coder | |
247 formats(fidx).isa = @(x) isa_magick (coders{fidx,1}, x); | |
248 endfor | |
249 | |
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 | 254 |
255 ## fills rest of format information by checking with GraphicsMagick | |
256 formats = __magick_formats__ (formats); | |
257 endfunction | |
258 | |
259 function is_valid_format (format) | |
260 ## the minimal list of fields required in the structure. We don't | |
261 ## require multipage because it doesn't exist in matlab | |
262 min_fields = {"ext", "read", "isa", "write", "info", "alpha", "description"}; | |
263 fields_mask = cellfun (@(x) isfield (format, x), min_fields); | |
264 if (! all (fields_mask)) | |
265 error ("imformats: structure has missing field `%s'.", min_fields(! fields_mask){1}); | |
266 endif | |
267 endfunction | |
268 | |
269 function match = find_ext_idx (formats, ext) | |
270 ## FIXME: is matlab sensitive to file extensions? | |
271 ## XXX: what should we do if there's more than one hit? | |
272 ## Should this function prevent the addition of | |
273 ## duplicated extensions? | |
274 match = cellfun (@(x) any (strcmp (x, ext)), {formats.ext}); | |
275 endfunction | |
276 | |
277 function bool = isa_magick (coder, filename) | |
278 bool = false; | |
279 try | |
17351
80bf005cdf8e
New function __magick_ping__ to speed reading of images.
Carnë Draug <carandraug@octave.org>
parents:
17338
diff
changeset
|
280 info = __magick_ping__ (filename, 1); |
16901 | 281 bool = strcmp (coder, info.Format); |
282 end_try_catch | |
283 endfunction | |
16949
1eb5e5f0ee13
imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents:
16922
diff
changeset
|
284 |
17338
1c89599167a6
maint: End m-files with 1 blank line.
Rik <rik@octave.org>
parents:
17312
diff
changeset
|
285 |
16949
1eb5e5f0ee13
imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents:
16922
diff
changeset
|
286 ## changing the function to read |
1eb5e5f0ee13
imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents:
16922
diff
changeset
|
287 %!testif HAVE_MAGICK |
1eb5e5f0ee13
imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents:
16922
diff
changeset
|
288 %! fmt = imformats ("jpg"); |
1eb5e5f0ee13
imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents:
16922
diff
changeset
|
289 %! fmt.read = @(x) size (x, 2); |
1eb5e5f0ee13
imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents:
16922
diff
changeset
|
290 %! imformats ("update", "jpg", fmt); |
1eb5e5f0ee13
imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents:
16922
diff
changeset
|
291 %! assert (imread ("this is 30 characters long.jpg"), 30); |
1eb5e5f0ee13
imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents:
16922
diff
changeset
|
292 |
1eb5e5f0ee13
imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents:
16922
diff
changeset
|
293 ## 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
|
294 %!testif HAVE_MAGICK |
1eb5e5f0ee13
imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents:
16922
diff
changeset
|
295 %! fmt = imformats ("jpg"); |
1eb5e5f0ee13
imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents:
16922
diff
changeset
|
296 %! fmt.ext = "junk"; |
1eb5e5f0ee13
imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents:
16922
diff
changeset
|
297 %! fmt.read = @(x) true(); |
1eb5e5f0ee13
imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents:
16922
diff
changeset
|
298 %! imformats ("add", fmt); |
1eb5e5f0ee13
imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents:
16922
diff
changeset
|
299 %! assert (imread ("some file.junk"), true); |
1eb5e5f0ee13
imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents:
16922
diff
changeset
|
300 |
1eb5e5f0ee13
imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents:
16922
diff
changeset
|
301 ## adding multiple formats in one way |
1eb5e5f0ee13
imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents:
16922
diff
changeset
|
302 %!testif HAVE_MAGICK |
1eb5e5f0ee13
imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents:
16922
diff
changeset
|
303 %! fmt = imformats ("jpg"); |
1eb5e5f0ee13
imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents:
16922
diff
changeset
|
304 %! fmt.ext = "junk1"; |
1eb5e5f0ee13
imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents:
16922
diff
changeset
|
305 %! fmt.read = @(x) true(); |
1eb5e5f0ee13
imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents:
16922
diff
changeset
|
306 %! fmt(2) = fmt(1); |
1eb5e5f0ee13
imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents:
16922
diff
changeset
|
307 %! fmt(2).ext = "junk2"; |
1eb5e5f0ee13
imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents:
16922
diff
changeset
|
308 %! imformats ("add", fmt); |
1eb5e5f0ee13
imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents:
16922
diff
changeset
|
309 %! assert (imread ("some file.junk1"), true); |
1eb5e5f0ee13
imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents:
16922
diff
changeset
|
310 %! assert (imread ("some file.junk2"), true); |
1eb5e5f0ee13
imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents:
16922
diff
changeset
|
311 |
1eb5e5f0ee13
imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents:
16922
diff
changeset
|
312 ## changing format |
1eb5e5f0ee13
imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents:
16922
diff
changeset
|
313 %!testif HAVE_MAGICK |
1eb5e5f0ee13
imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents:
16922
diff
changeset
|
314 %! 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
|
315 %! 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
|
316 %! 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
|
317 %! 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
|
318 %! 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
|
319 %! imformats ("factory"); |
1eb5e5f0ee13
imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents:
16922
diff
changeset
|
320 %! 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
|
321 %! 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
|
322 |
1eb5e5f0ee13
imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents:
16922
diff
changeset
|
323 ## FIXME: how to test for error together with testif? |
1eb5e5f0ee13
imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents:
16922
diff
changeset
|
324 ## update to an invalid format |
1eb5e5f0ee13
imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents:
16922
diff
changeset
|
325 #%!testif HAVE_MAGICK |
1eb5e5f0ee13
imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents:
16922
diff
changeset
|
326 #%! fmt = imformats ("jpg"); |
1eb5e5f0ee13
imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents:
16922
diff
changeset
|
327 #%! fmt = rmfield (fmt, "read"); |
1eb5e5f0ee13
imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents:
16922
diff
changeset
|
328 #%! error imformats ("update", "jpg", fmt); |
1eb5e5f0ee13
imformats.m: add tests and fix bug when adding new formats.
Carnë Draug <carandraug@octave.org>
parents:
16922
diff
changeset
|
329 |