annotate libinterp/corefcn/__tiff__.cc @ 31197:1604c8812b67

Tiff: added numberOfDirectories method.
author magedrifaat <magedrifaat@gmail.com>
date Thu, 01 Sep 2022 01:56:20 +0200
parents 1da6d747bf78
children 93eb0d6e7f62
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
31104
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
1 #if defined (HAVE_CONFIG_H)
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
2 # include "config.h"
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
3 #endif
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
4
31092
a736190ce738 Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
5 #include <string>
31094
ab5b33e447b0 Modified getTag to account for different tag data types and multivalued tags, the current implementation is still buggy for most tags and data types
magedrifaat <magedrifaat@gmail.com>
parents: 31093
diff changeset
6 #include <iostream>
31194
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
7 #include <fstream>
31092
a736190ce738 Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
8
31160
5f0c3da75926 Tiff: moved internal functions to corefcn.
magedrifaat <magedrifaat@gmail.com>
parents: 31159
diff changeset
9 #include "defun.h"
31092
a736190ce738 Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
10 #include "ov.h"
a736190ce738 Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
11 #include "ovl.h"
31093
e2bed4daae82 Fix typo in module-files
magedrifaat <magedrifaat@gmail.com>
parents: 31092
diff changeset
12 #include "error.h"
31092
a736190ce738 Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
13
31104
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
14 #include "errwarn.h"
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
15
31162
28817158ca86 Tiff: changed write functions to use fcntl wrappers.
magedrifaat <magedrifaat@gmail.com>
parents: 31161
diff changeset
16 #include "fcntl-wrappers.h"
31194
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
17 #include "file-stat.h"
31193
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
18 #include "file-ops.h"
31194
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
19 #include "str-vec.h"
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
20 #include "oct-time.h"
31162
28817158ca86 Tiff: changed write functions to use fcntl wrappers.
magedrifaat <magedrifaat@gmail.com>
parents: 31161
diff changeset
21
31104
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
22 #if defined (HAVE_TIFF)
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
23 # include <tiffio.h>
31189
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
24 bool handlers_set = true;
31104
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
25 #endif
31092
a736190ce738 Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
26
31160
5f0c3da75926 Tiff: moved internal functions to corefcn.
magedrifaat <magedrifaat@gmail.com>
parents: 31159
diff changeset
27 namespace octave
31099
6fc4bf5e14e1 Cleaned up the interface
magedrifaat <magedrifaat@gmail.com>
parents: 31098
diff changeset
28 {
31104
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
29 #if defined (HAVE_TIFF)
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
30 class OCTINTERP_API octave_tiff_handle : public octave_base_value
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
31 {
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
32 public:
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
33 octave_tiff_handle (TIFF *tif)
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
34 : tiff_file (tif), closed (false)
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
35 { }
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
36
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
37 TIFF *get_file(void) { return tiff_file; }
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
38
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
39 bool is_defined (void) const { return true; }
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
40 bool is_constant (void) const { return true; }
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
41
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
42 void close(void)
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
43 {
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
44 if (! closed)
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
45 {
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
46 closed = true;
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
47 TIFFClose (tiff_file);
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
48 }
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
49 }
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
50
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
51 bool is_closed (void) { return closed; }
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
52
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
53 ~octave_tiff_handle (void)
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
54 {
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
55 if (! closed)
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
56 close ();
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
57 }
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
58
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
59 static octave_tiff_handle *
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
60 get_tiff_handle (const octave_value& ov)
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
61 {
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
62 octave_base_value *rep = ov.internal_rep ();
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
63 octave_tiff_handle *handle = dynamic_cast<octave_tiff_handle *> (rep);
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
64 if (! handle)
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
65 error ("get_tiff_handle: dynamic_cast to octave_tiff_handle failed");
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
66
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
67 return handle;
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
68 }
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
69 private:
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
70 TIFF *tiff_file;
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
71 bool closed;
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
72 };
31112
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
73
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
74 struct tiff_image_data
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
75 {
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
76 public:
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
77 uint32_t width;
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
78 uint32_t height;
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
79 uint16_t samples_per_pixel;
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
80 uint16_t bits_per_sample;
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
81 uint16_t planar_configuration;
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
82 uint16_t is_tiled;
31122
1662939a7a49 Tiff read: moved image_date initialization into a constructor
magedrifaat <magedrifaat@gmail.com>
parents: 31121
diff changeset
83
1662939a7a49 Tiff read: moved image_date initialization into a constructor
magedrifaat <magedrifaat@gmail.com>
parents: 31121
diff changeset
84 tiff_image_data (TIFF *tif)
1662939a7a49 Tiff read: moved image_date initialization into a constructor
magedrifaat <magedrifaat@gmail.com>
parents: 31121
diff changeset
85 {
1662939a7a49 Tiff read: moved image_date initialization into a constructor
magedrifaat <magedrifaat@gmail.com>
parents: 31121
diff changeset
86 if (! TIFFGetField (tif, TIFFTAG_IMAGEWIDTH, &width))
1662939a7a49 Tiff read: moved image_date initialization into a constructor
magedrifaat <magedrifaat@gmail.com>
parents: 31121
diff changeset
87 error ("Failed to read image width");
1662939a7a49 Tiff read: moved image_date initialization into a constructor
magedrifaat <magedrifaat@gmail.com>
parents: 31121
diff changeset
88
1662939a7a49 Tiff read: moved image_date initialization into a constructor
magedrifaat <magedrifaat@gmail.com>
parents: 31121
diff changeset
89 if (! TIFFGetField (tif, TIFFTAG_IMAGELENGTH, &height))
1662939a7a49 Tiff read: moved image_date initialization into a constructor
magedrifaat <magedrifaat@gmail.com>
parents: 31121
diff changeset
90 error ("Failed to read image height");
1662939a7a49 Tiff read: moved image_date initialization into a constructor
magedrifaat <magedrifaat@gmail.com>
parents: 31121
diff changeset
91
31127
0d9633ee715e Tiff: fixed a bug where the default value of some tags was ignored
magedrifaat <magedrifaat@gmail.com>
parents: 31126
diff changeset
92 if (! TIFFGetFieldDefaulted (tif, TIFFTAG_SAMPLESPERPIXEL,
0d9633ee715e Tiff: fixed a bug where the default value of some tags was ignored
magedrifaat <magedrifaat@gmail.com>
parents: 31126
diff changeset
93 &samples_per_pixel))
31122
1662939a7a49 Tiff read: moved image_date initialization into a constructor
magedrifaat <magedrifaat@gmail.com>
parents: 31121
diff changeset
94 error ("Failed to read the SamplesPerPixel tag");
1662939a7a49 Tiff read: moved image_date initialization into a constructor
magedrifaat <magedrifaat@gmail.com>
parents: 31121
diff changeset
95
31127
0d9633ee715e Tiff: fixed a bug where the default value of some tags was ignored
magedrifaat <magedrifaat@gmail.com>
parents: 31126
diff changeset
96 if (! TIFFGetFieldDefaulted (tif, TIFFTAG_BITSPERSAMPLE,
0d9633ee715e Tiff: fixed a bug where the default value of some tags was ignored
magedrifaat <magedrifaat@gmail.com>
parents: 31126
diff changeset
97 &bits_per_sample))
31122
1662939a7a49 Tiff read: moved image_date initialization into a constructor
magedrifaat <magedrifaat@gmail.com>
parents: 31121
diff changeset
98 error ("Failed to read the BitsPerSample tag");
1662939a7a49 Tiff read: moved image_date initialization into a constructor
magedrifaat <magedrifaat@gmail.com>
parents: 31121
diff changeset
99
31131
7349994f30f8 Tiff: fixed the first test to use a single-pixel image
magedrifaat <magedrifaat@gmail.com>
parents: 31130
diff changeset
100 if (! TIFFGetField (tif, TIFFTAG_PLANARCONFIG,
7349994f30f8 Tiff: fixed the first test to use a single-pixel image
magedrifaat <magedrifaat@gmail.com>
parents: 31130
diff changeset
101 &planar_configuration))
7349994f30f8 Tiff: fixed the first test to use a single-pixel image
magedrifaat <magedrifaat@gmail.com>
parents: 31130
diff changeset
102 // LibTIFF has a bug where it incorrectly returns 0 as a default
7349994f30f8 Tiff: fixed the first test to use a single-pixel image
magedrifaat <magedrifaat@gmail.com>
parents: 31130
diff changeset
103 // value for PlanarConfiguration although the default value is 1
31185
a1145ac2ce9b Tiff: populated TagID from the C++ map to avoid having two copies
magedrifaat <magedrifaat@gmail.com>
parents: 31184
diff changeset
104 // This doesn't completely solve the issue as LibTIFF will refuse
a1145ac2ce9b Tiff: populated TagID from the C++ map to avoid having two copies
magedrifaat <magedrifaat@gmail.com>
parents: 31184
diff changeset
105 // to write data to images of the tag is not set.
a1145ac2ce9b Tiff: populated TagID from the C++ map to avoid having two copies
magedrifaat <magedrifaat@gmail.com>
parents: 31184
diff changeset
106 // see: https://www.asmail.be/msg0054918184.html
31194
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
107 // This is now solved by this commit:
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
108 // https://gitlab.com/libtiff/libtiff/-/commit/ac6ddaf678fff597610cb217705b55508240f065
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
109 // So this shouldn't be needed for future LibTIFF releases > 4.4.0
31131
7349994f30f8 Tiff: fixed the first test to use a single-pixel image
magedrifaat <magedrifaat@gmail.com>
parents: 31130
diff changeset
110 planar_configuration = 1;
31122
1662939a7a49 Tiff read: moved image_date initialization into a constructor
magedrifaat <magedrifaat@gmail.com>
parents: 31121
diff changeset
111
1662939a7a49 Tiff read: moved image_date initialization into a constructor
magedrifaat <magedrifaat@gmail.com>
parents: 31121
diff changeset
112 is_tiled = TIFFIsTiled(tif);
1662939a7a49 Tiff read: moved image_date initialization into a constructor
magedrifaat <magedrifaat@gmail.com>
parents: 31121
diff changeset
113 }
31112
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
114 };
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
115
31189
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
116 void
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
117 set_internal_handlers (void)
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
118 {
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
119 if (handlers_set)
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
120 {
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
121 TIFFSetErrorHandler (verror_with_id);
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
122 TIFFSetWarningHandler (vwarning_with_id);
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
123 }
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
124 else
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
125 {
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
126 TIFFSetErrorHandler (NULL);
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
127 TIFFSetWarningHandler (NULL);
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
128 }
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
129 }
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
130
31190
a91f2f79e58c Tiff: added internal handler for imread using the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31189
diff changeset
131 bool
31193
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
132 is_colormap (octave_value ov)
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
133 {
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
134 return ov.isnumeric () && ov.isreal () && ov.isfloat ()
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
135 && ov.ndims () == 2 && ov.columns () == 3;
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
136 }
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
137
31182
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
138 // A map of tag names supported by matlab, there are some differences
31195
f8baeb850b36 Tiff: Moved PKG_ADD logic to Tiff.m.
magedrifaat <magedrifaat@gmail.com>
parents: 31194
diff changeset
139 // than LibTIFF's names (e.g. Photometric vs PhotometricInterpretation)
31182
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
140 static const std::map<std::string, ttag_t> tag_name_map = {
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
141 {"SubFileType", 254},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
142 {"ImageWidth", 256},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
143 {"ImageLength", 257},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
144 {"BitsPerSample", 258},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
145 {"Compression", 259},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
146 {"Photometric", 262},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
147 {"Thresholding", 263},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
148 {"FillOrder", 266},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
149 {"DocumentName", 269},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
150 {"ImageDescription", 270},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
151 {"Make", 271},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
152 {"Model", 272},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
153 {"StripOffsets", 273},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
154 {"Orientation", 274},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
155 {"SamplesPerPixel", 277},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
156 {"RowsPerStrip", 278},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
157 {"StripByteCounts", 279},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
158 {"MinSampleValue", 280},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
159 {"MaxSampleValue", 281},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
160 {"XResolution", 282},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
161 {"YResolution", 283},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
162 {"PlanarConfiguration", 284},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
163 {"PageName", 285},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
164 {"XPosition", 286},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
165 {"YPosition", 287},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
166 {"GrayResponseUnit", 290},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
167 {"GrayResponseCurve", 291},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
168 {"Group3Options", 292},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
169 {"Group4Options", 293},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
170 {"ResolutionUnit", 296},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
171 {"PageNumber", 297},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
172 {"TransferFunction", 301},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
173 {"Software", 305},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
174 {"DateTime", 306},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
175 {"Artist", 315},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
176 {"HostComputer", 316},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
177 {"WhitePoint", 318},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
178 {"PrimaryChromaticities", 319},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
179 {"ColorMap", 320},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
180 {"HalfToneHints", 321},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
181 {"TileWidth", 322},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
182 {"TileLength", 323},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
183 {"TileOffsets", 324},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
184 {"TileByteCounts", 325},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
185 {"SubIFD", 330},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
186 {"InkSet", 332},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
187 {"InkNames", 333},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
188 {"NumberOfInks", 334},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
189 {"DotRange", 336},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
190 {"TargetPrinter", 337},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
191 {"ExtraSamples", 338},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
192 {"SampleFormat", 339},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
193 {"SMinSampleValue", 340},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
194 {"SMaxSampleValue", 341},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
195 {"YCbCrCoefficients", 529},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
196 {"YCbCrSubSampling", 530},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
197 {"YCbCrPositioning", 531},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
198 {"ReferenceBlackWhite", 532},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
199 {"XMP", 700},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
200 {"ImageDepth", 32997},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
201 {"Copyright", 33432},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
202 {"RichTIFFIPTC", 33723},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
203 {"Photoshop", 34377},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
204 {"ICCProfile", 34675},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
205 {"SToNits", 37439},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
206 {"JPEGQuality", 65537},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
207 {"JPEGColorMode", 65538},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
208 {"ZipQuality", 65557},
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
209 {"SGILogDataFmt", 6556}
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
210 };
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
211
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
212 const TIFFField *get_fip_with_name (TIFF *tif, std::string& tag_name)
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
213 {
31189
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
214 const TIFFField *fip = NULL;
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
215 if (tag_name_map.find (tag_name) != tag_name_map.cend ())
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
216 fip = TIFFFieldWithTag (tif, tag_name_map.at (tag_name));
31182
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
217
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
218 // If the tag name is not found, fallback to the names defined
31189
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
219 // in LibTIFF.
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
220 if (fip == NULL)
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
221 fip = TIFFFieldWithName (tif, tag_name.c_str ());
31182
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
222
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
223 return fip;
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
224 }
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
225
31162
28817158ca86 Tiff: changed write functions to use fcntl wrappers.
magedrifaat <magedrifaat@gmail.com>
parents: 31161
diff changeset
226 void
28817158ca86 Tiff: changed write functions to use fcntl wrappers.
magedrifaat <magedrifaat@gmail.com>
parents: 31161
diff changeset
227 check_readonly (TIFF *tif)
28817158ca86 Tiff: changed write functions to use fcntl wrappers.
magedrifaat <magedrifaat@gmail.com>
parents: 31161
diff changeset
228 {
28817158ca86 Tiff: changed write functions to use fcntl wrappers.
magedrifaat <magedrifaat@gmail.com>
parents: 31161
diff changeset
229 if (TIFFGetMode (tif) == octave_o_rdonly_wrapper ())
28817158ca86 Tiff: changed write functions to use fcntl wrappers.
magedrifaat <magedrifaat@gmail.com>
parents: 31161
diff changeset
230 error ("Can't write data to a file opened in read-only mode");
28817158ca86 Tiff: changed write functions to use fcntl wrappers.
magedrifaat <magedrifaat@gmail.com>
parents: 31161
diff changeset
231 }
28817158ca86 Tiff: changed write functions to use fcntl wrappers.
magedrifaat <magedrifaat@gmail.com>
parents: 31161
diff changeset
232
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
233 void
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
234 check_closed (octave_tiff_handle *tiff_handle)
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
235 {
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
236 if (tiff_handle->is_closed ())
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
237 error ("The image file was closed");
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
238 }
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
239
31118
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
240 void
31181
8a4ef572077d __tiff__.cc (get_scalar_field_data): replaced _TIFFMalloc with unique_ptr.
magedrifaat <magedrifaat@gmail.com>
parents: 31180
diff changeset
241 validate_tiff_get_field (bool status)
31118
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
242 {
31179
f294b800f002 Tiff.m: added tests for signed images and sub-directories.
magedrifaat <magedrifaat@gmail.com>
parents: 31178
diff changeset
243 // Check if the return status of TIFFGetField is not 1
f294b800f002 Tiff.m: added tests for signed images and sub-directories.
magedrifaat <magedrifaat@gmail.com>
parents: 31178
diff changeset
244 if (status != 1)
31181
8a4ef572077d __tiff__.cc (get_scalar_field_data): replaced _TIFFMalloc with unique_ptr.
magedrifaat <magedrifaat@gmail.com>
parents: 31180
diff changeset
245 error ("Failed to read tag");
31118
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
246 }
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
247
31157
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
248 uint32_t get_rows_in_strip (uint32_t strip_no, uint32_t strip_count,
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
249 uint32_t rows_per_strip,
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
250 tiff_image_data *image_data)
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
251 {
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
252 // Calculate the expected number of elements in the strip data array
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
253 // All strips have equal number of rows except strips at the bottom
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
254 // of the image can have less number of rows
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
255 uint32_t rows_in_strip = rows_per_strip;
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
256 if (image_data->planar_configuration == PLANARCONFIG_CONTIG)
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
257 {
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
258 // All strips have equal number of rows excpet strips at the bottom
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
259 // of the image can have less number of rows
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
260 if (strip_no == strip_count - 1)
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
261 rows_in_strip = image_data->height - rows_in_strip * strip_no;
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
262 }
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
263 else if (image_data->planar_configuration == PLANARCONFIG_SEPARATE)
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
264 {
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
265 // For separate planes, we should check the last strip of each channel
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
266 uint32_t strips_per_channel
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
267 = strip_count / image_data->samples_per_pixel;
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
268 for (uint32_t boundary_strip = strips_per_channel - 1;
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
269 boundary_strip <= strip_count;
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
270 boundary_strip += strips_per_channel)
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
271 if (strip_no == boundary_strip)
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
272 rows_in_strip = image_data->height
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
273 - rows_in_strip * (strip_no % strips_per_channel);
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
274 }
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
275 else
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
276 error ("Planar Configuration not supported");
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
277
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
278 return rows_in_strip;
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
279 }
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
280
31180
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
281 void
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
282 get_tile_dimensions_validated (TIFF *tif, uint32_t& tile_width,
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
283 uint32_t& tile_height)
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
284 {
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
285 if (! TIFFGetField (tif, TIFFTAG_TILELENGTH, &tile_height))
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
286 error ("Filed to read tile length");
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
287
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
288 if (! TIFFGetField (tif, TIFFTAG_TILEWIDTH, &tile_width))
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
289 error ("Filed to read tile length");
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
290
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
291 if (tile_height == 0 || tile_height % 16 != 0
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
292 || tile_width == 0 || tile_width % 16 != 0)
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
293 error ("Tile dimesion tags are invalid");
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
294 }
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
295
31157
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
296 template <typename T>
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
297 octave_value
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
298 read_strip (TIFF *tif, uint32_t strip_no, tiff_image_data * image_data)
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
299 {
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
300 // ASSUMES stripped image and strip_no is a valid zero-based strip
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
301 // index for the tif image
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
302
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
303 uint32_t rows_in_strip;
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
304 if (! TIFFGetFieldDefaulted (tif, TIFFTAG_ROWSPERSTRIP, &rows_in_strip))
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
305 error ("Failed to obtain a value for RowsPerStrip");
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
306
31179
f294b800f002 Tiff.m: added tests for signed images and sub-directories.
magedrifaat <magedrifaat@gmail.com>
parents: 31178
diff changeset
307 // The default for RowsPerStrip is INT_MAX so it should be capped to the
f294b800f002 Tiff.m: added tests for signed images and sub-directories.
magedrifaat <magedrifaat@gmail.com>
parents: 31178
diff changeset
308 // image height
31157
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
309 if (rows_in_strip > image_data->height)
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
310 rows_in_strip = image_data->height;
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
311
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
312 uint32_t strip_count = TIFFNumberOfStrips (tif);
31179
f294b800f002 Tiff.m: added tests for signed images and sub-directories.
magedrifaat <magedrifaat@gmail.com>
parents: 31178
diff changeset
313 // Get the actual number of rows in the strip
31157
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
314 rows_in_strip = get_rows_in_strip (strip_no, strip_count,
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
315 rows_in_strip, image_data);
31179
f294b800f002 Tiff.m: added tests for signed images and sub-directories.
magedrifaat <magedrifaat@gmail.com>
parents: 31178
diff changeset
316
f294b800f002 Tiff.m: added tests for signed images and sub-directories.
magedrifaat <magedrifaat@gmail.com>
parents: 31178
diff changeset
317 // Set the strip dimensions depending on the planar configuration
31157
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
318 dim_vector strip_dims;
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
319 if (image_data->planar_configuration == PLANARCONFIG_CONTIG)
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
320 strip_dims = dim_vector (image_data->samples_per_pixel,
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
321 image_data->width, rows_in_strip);
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
322 else if (image_data->planar_configuration == PLANARCONFIG_SEPARATE)
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
323 strip_dims = dim_vector (image_data->width, rows_in_strip, 1);
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
324 else
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
325 error ("Unsupported bit depth");
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
326
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
327 T strip_data (strip_dims);
31158
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
328 uint8_t *strip_fvec
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
329 = reinterpret_cast<uint8_t *> (strip_data.fortran_vec ());
31157
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
330
31158
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
331 if (image_data->bits_per_sample == 8
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
332 || image_data->bits_per_sample == 16
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
333 || image_data->bits_per_sample == 32
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
334 || image_data->bits_per_sample == 64)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
335 {
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
336 if (TIFFReadEncodedStrip (tif, strip_no, strip_fvec, -1) == -1)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
337 error ("Failed to read strip data");
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
338 }
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
339 else if (image_data->bits_per_sample == 1)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
340 {
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
341 if (image_data->samples_per_pixel != 1)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
342 error ("Bi-Level images must have one channel only");
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
343
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
344 // Create a buffer to hold the packed strip data
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
345 // Unique pointers are faster than vectors for constant size buffers
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
346 std::unique_ptr<uint8_t []> strip_ptr
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
347 = std::make_unique<uint8_t []> (TIFFStripSize (tif));
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
348 uint8_t *strip_buf = strip_ptr.get ();
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
349 if (TIFFReadEncodedStrip (tif, strip_no, strip_buf, -1) == -1)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
350 error ("Failed to read strip data");
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
351
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
352 // According to the format specification, the row should be byte
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
353 // aligned so the number of bytes is rounded up to the nearest byte
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
354 uint32_t padded_width = (image_data->width + 7) / 8;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
355 // Packing the pixel data into bits
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
356 for (uint32_t row = 0; row < rows_in_strip; row++)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
357 {
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
358 for (uint32_t col = 0; col < image_data->width; col++)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
359 {
31183
6ab628dfe2a0 __tif__.cc: added support for BiLevel Images with reversed bit ordering.
magedrifaat <magedrifaat@gmail.com>
parents: 31182
diff changeset
360 uint8_t shift = col % 8;
6ab628dfe2a0 __tif__.cc: added support for BiLevel Images with reversed bit ordering.
magedrifaat <magedrifaat@gmail.com>
parents: 31182
diff changeset
361 if (TIFFIsMSB2LSB (tif))
6ab628dfe2a0 __tif__.cc: added support for BiLevel Images with reversed bit ordering.
magedrifaat <magedrifaat@gmail.com>
parents: 31182
diff changeset
362 shift = 7 - shift;
31158
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
363 strip_fvec[col] = (strip_buf[col / 8] >> shift) & 0x1;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
364 }
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
365 strip_fvec += image_data->width;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
366 strip_buf += padded_width;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
367 }
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
368 }
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
369 else
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
370 error ("Unsupported bit depth");
31157
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
371
31179
f294b800f002 Tiff.m: added tests for signed images and sub-directories.
magedrifaat <magedrifaat@gmail.com>
parents: 31178
diff changeset
372 // Reorder the dimensions to the order expected by Octave
31157
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
373 Array<octave_idx_type> perm (dim_vector (3, 1));
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
374 if (image_data->planar_configuration == PLANARCONFIG_CONTIG)
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
375 {
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
376 perm(0) = 2;
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
377 perm(1) = 1;
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
378 perm(2) = 0;
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
379 }
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
380 else if (image_data->planar_configuration == PLANARCONFIG_SEPARATE)
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
381 {
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
382 perm(0) = 1;
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
383 perm(1) = 0;
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
384 perm(2) = 2;
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
385 }
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
386
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
387 strip_data = strip_data.permute (perm);
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
388 return octave_value (strip_data);
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
389 }
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
390
31113
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
391 template <typename T>
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
392 octave_value
31158
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
393 read_tile (TIFF *tif, uint32_t tile_no, tiff_image_data *image_data)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
394 {
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
395 // ASSUMES tiled image and tile_no is a valid zero-based tile
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
396 // index for the tif image
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
397
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
398 uint32_t tile_width, tile_height;
31180
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
399 get_tile_dimensions_validated (tif, tile_width, tile_height);
31158
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
400
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
401 dim_vector tile_dims;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
402 if (image_data->planar_configuration == PLANARCONFIG_CONTIG)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
403 {
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
404 tile_dims = dim_vector (image_data->samples_per_pixel, tile_width,
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
405 tile_height);
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
406 }
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
407 else if (image_data->planar_configuration == PLANARCONFIG_SEPARATE)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
408 {
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
409 tile_dims = dim_vector (tile_width, tile_height, 1);
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
410 }
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
411 else
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
412 error ("Unsupported planar configuration");
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
413
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
414 T tile_data (tile_dims);
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
415 uint8_t *tile_fvec
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
416 = reinterpret_cast<uint8_t *> (tile_data.fortran_vec ());
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
417
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
418 if (image_data->bits_per_sample == 8
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
419 || image_data->bits_per_sample == 16
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
420 || image_data->bits_per_sample == 32
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
421 || image_data->bits_per_sample == 64)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
422 {
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
423 if (TIFFReadEncodedTile (tif, tile_no, tile_fvec, -1) == -1)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
424 error ("Failed to read tile data");
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
425 }
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
426 else if (image_data->bits_per_sample == 1)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
427 {
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
428 if (image_data->samples_per_pixel != 1)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
429 error ("Bi-Level images must have one channel only");
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
430
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
431 // Create a buffer to hold the packed tile data
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
432 // Unique pointers are faster than vectors for constant size buffers
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
433 std::unique_ptr<uint8_t []> tile_ptr
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
434 = std::make_unique<uint8_t []> (TIFFTileSize (tif));
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
435 uint8_t *tile_buf = tile_ptr.get ();
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
436 if (TIFFReadEncodedTile (tif, tile_no, tile_buf, -1) == -1)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
437 error ("Failed to read tile data");
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
438
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
439 // unpack tile bits into output matrix cells
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
440 for (uint32_t row = 0; row < tile_height; row++)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
441 {
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
442 for (uint32_t col = 0; col < tile_width; col++)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
443 {
31183
6ab628dfe2a0 __tif__.cc: added support for BiLevel Images with reversed bit ordering.
magedrifaat <magedrifaat@gmail.com>
parents: 31182
diff changeset
444 uint8_t shift = col % 8;
6ab628dfe2a0 __tif__.cc: added support for BiLevel Images with reversed bit ordering.
magedrifaat <magedrifaat@gmail.com>
parents: 31182
diff changeset
445 if (TIFFIsMSB2LSB (tif))
6ab628dfe2a0 __tif__.cc: added support for BiLevel Images with reversed bit ordering.
magedrifaat <magedrifaat@gmail.com>
parents: 31182
diff changeset
446 shift = 7 - shift;
31158
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
447 tile_fvec[col] = (tile_buf [col / 8] >> shift) & 0x1;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
448 }
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
449 tile_fvec += tile_width;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
450 tile_buf += tile_width / 8;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
451 }
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
452 }
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
453 else
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
454 error ("Unsupported bit depth");
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
455
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
456 Array<octave_idx_type> perm (dim_vector (3, 1));
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
457 if (image_data->planar_configuration == PLANARCONFIG_CONTIG)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
458 {
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
459 perm(0) = 2;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
460 perm(1) = 1;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
461 perm(2) = 0;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
462 }
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
463 else if (image_data->planar_configuration == PLANARCONFIG_SEPARATE)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
464 {
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
465 perm(0) = 1;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
466 perm(1) = 0;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
467 perm(2) = 2;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
468 }
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
469
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
470 tile_data = tile_data.permute (perm);
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
471
31179
f294b800f002 Tiff.m: added tests for signed images and sub-directories.
magedrifaat <magedrifaat@gmail.com>
parents: 31178
diff changeset
472 // Get the actual tile dimensions for boundary tiles
31158
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
473 uint32_t tiles_across = (image_data->width + tile_width - 1)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
474 / tile_width;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
475 uint32_t tiles_down = (image_data->height + tile_height - 1)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
476 / tile_height;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
477 uint32_t corrected_width = tile_width;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
478 uint32_t corrected_height = tile_height;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
479 if (tile_no % tiles_across == tiles_across - 1)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
480 corrected_width = image_data->width - tile_width * (tiles_across - 1);
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
481 if ((tile_no / tiles_across) % tiles_down == tiles_down - 1)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
482 corrected_height = image_data->height - tile_height * (tiles_down - 1);
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
483
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
484 dim_vector corrected_dims;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
485 if (image_data->planar_configuration == PLANARCONFIG_CONTIG)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
486 corrected_dims = dim_vector (corrected_height, corrected_width,
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
487 image_data->samples_per_pixel);
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
488 else if (image_data->planar_configuration == PLANARCONFIG_SEPARATE)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
489 corrected_dims = dim_vector (corrected_height, corrected_width);
31159
e960e3a3b3f6 Tiff.m: added structs for tag value enums to the Tiff class.
magedrifaat <magedrifaat@gmail.com>
parents: 31158
diff changeset
490
31158
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
491 tile_data.resize (corrected_dims);
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
492
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
493 return octave_value (tile_data);
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
494 }
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
495
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
496 template <typename T>
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
497 octave_value
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
498 read_strip_or_tile (TIFF *tif, uint32_t strip_tile_no,
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
499 tiff_image_data *image_data)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
500 {
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
501 if (image_data->is_tiled)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
502 return read_tile<T> (tif, strip_tile_no, image_data);
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
503 else
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
504 return read_strip<T> (tif, strip_tile_no, image_data);
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
505 }
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
506
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
507 octave_value
31178
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
508 read_unsigned_strip_or_tile (TIFF *tif, uint32_t strip_tile_no,
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
509 tiff_image_data *image_data)
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
510 {
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
511 switch (image_data->bits_per_sample)
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
512 {
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
513 case 1:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
514 return read_strip_or_tile<boolNDArray> (tif, strip_tile_no,
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
515 image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
516 break;
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
517 case 8:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
518 return read_strip_or_tile<uint8NDArray> (tif, strip_tile_no,
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
519 image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
520 break;
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
521 case 16:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
522 return read_strip_or_tile<uint16NDArray> (tif, strip_tile_no,
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
523 image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
524 break;
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
525 case 32:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
526 return read_strip_or_tile<uint32NDArray> (tif, strip_tile_no,
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
527 image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
528 case 64:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
529 return read_strip_or_tile<uint64NDArray> (tif, strip_tile_no,
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
530 image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
531 default:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
532 error ("Unsupported bit depth");
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
533 }
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
534 }
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
535
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
536 octave_value
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
537 read_signed_strip_or_tile (TIFF *tif, uint32_t strip_tile_no,
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
538 tiff_image_data *image_data)
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
539 {
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
540 switch (image_data->bits_per_sample)
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
541 {
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
542 case 8:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
543 return read_strip_or_tile<int8NDArray> (tif, strip_tile_no,
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
544 image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
545 break;
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
546 case 16:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
547 return read_strip_or_tile<int16NDArray> (tif, strip_tile_no,
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
548 image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
549 break;
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
550 case 32:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
551 return read_strip_or_tile<int32NDArray> (tif, strip_tile_no,
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
552 image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
553 case 64:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
554 return read_strip_or_tile<int64NDArray> (tif, strip_tile_no,
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
555 image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
556 default:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
557 error ("Unsupported bit depth for signed images");
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
558 }
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
559 }
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
560
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
561 octave_value
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
562 read_float_strip_or_tile (TIFF *tif, uint32_t strip_tile_no,
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
563 tiff_image_data *image_data)
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
564 {
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
565 switch (image_data->bits_per_sample)
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
566 {
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
567 case 32:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
568 return read_strip_or_tile<FloatNDArray> (tif, strip_tile_no,
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
569 image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
570 case 64:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
571 return read_strip_or_tile<NDArray> (tif, strip_tile_no,
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
572 image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
573 default:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
574 error ("Unsupported bit depth for floating-point images");
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
575 }
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
576 }
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
577
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
578 octave_value
31158
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
579 handle_read_strip_or_tile (TIFF *tif, uint32_t strip_tile_no)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
580 {
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
581 // Obtain all necessary tags
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
582 tiff_image_data image_data (tif);
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
583
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
584 uint16_t sample_format;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
585 if (! TIFFGetFieldDefaulted(tif, TIFFTAG_SAMPLEFORMAT, &sample_format))
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
586 error ("Failed to obtain a value for sample format");
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
587
31178
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
588 switch (sample_format)
31158
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
589 {
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
590 case 1:
31178
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
591 case 4:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
592 return read_unsigned_strip_or_tile (tif, strip_tile_no, &image_data);
31158
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
593 break;
31178
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
594 case 2:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
595 return read_signed_strip_or_tile (tif, strip_tile_no, &image_data);
31158
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
596 break;
31178
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
597 case 3:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
598 return read_float_strip_or_tile (tif, strip_tile_no, &image_data);
31158
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
599 break;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
600 default:
31178
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
601 error ("Unsupported sample format");
31158
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
602 }
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
603 }
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
604
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
605 template <typename T>
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
606 octave_value
31113
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
607 read_stripped_image (TIFF *tif, tiff_image_data *image_data)
31112
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
608 {
31113
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
609 typedef typename T::element_type P;
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
610
31119
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
611 // For 1-bit and 4-bit images, each row must be byte aligned and padding
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
612 // is added to the end of the row to reach the byte mark.
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
613 // To facilitate reading the data, the matrix is defined with the padded
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
614 // size and the padding is removed at the end.
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
615 uint32_t padded_width = image_data->width;
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
616 uint8_t remove_padding = 0;
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
617 if ((image_data->bits_per_sample == 1 || image_data->bits_per_sample == 4)
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
618 && padded_width % 8 != 0)
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
619 {
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
620 padded_width += (8 - padded_width % 8) % 8;
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
621 remove_padding = 1;
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
622 }
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
623
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
624 // The matrix dimensions are defined in the order that corresponds to
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
625 // the order of strip data read from LibTIFF.
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
626 // At the end, the matrix is permutated to the order expected by Octave
31120
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
627 T img;
31119
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
628 if (image_data->planar_configuration == PLANARCONFIG_CONTIG)
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
629 img = T (dim_vector (image_data->samples_per_pixel, padded_width,
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
630 image_data->height));
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
631 else if (image_data->planar_configuration == PLANARCONFIG_SEPARATE)
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
632 img = T (dim_vector (padded_width, image_data->height,
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
633 image_data->samples_per_pixel));
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
634 else
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
635 error ("Unsupported Planar Configuration");
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
636
31113
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
637 P *img_fvec = img.fortran_vec ();
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
638
31112
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
639 // Obtain the necessary data for handling the strips
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
640 uint32_t strip_count = TIFFNumberOfStrips (tif);
31119
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
641
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
642 // Can't rely on StripByteCounts because in compressed images
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
643 // the byte count reflect the actual number of bytes stored
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
644 // in the file not the size of the uncompressed strip
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
645 int64_t strip_size;
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
646 uint64_t written_size = 0;
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
647 uint64_t image_size = padded_width * image_data->height
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
648 * image_data->samples_per_pixel
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
649 * sizeof (P);
31112
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
650 for (uint32_t strip = 0; strip < strip_count; strip++)
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
651 {
31119
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
652 // Read the strip data into the matrix directly
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
653 strip_size = TIFFReadEncodedStrip (tif, strip, img_fvec, -1);
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
654
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
655 // Check if the strip read failed.
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
656 if (strip_size == -1)
31112
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
657 error ("Failed to read strip data");
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
658
31119
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
659 // Check if the size being read exceeds the bounds of the matrix
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
660 // In case of a corrupt image with more data than needed
31129
dfab9c6982bf Tiff getTag: added support for single quotes string fo the tag name
magedrifaat <magedrifaat@gmail.com>
parents: 31128
diff changeset
661 // This is probably redundant as LibTIFF checks sizes internally
31119
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
662 if (written_size + strip_size > image_size)
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
663 error ("Strip data is larger than the image size");
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
664
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
665 if (image_data->bits_per_sample == 1)
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
666 {
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
667 if (image_data->samples_per_pixel != 1)
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
668 error ("Bi-Level images must have one channel only");
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
669
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
670 // The strip size is multiplied by 8 to reflect tha actual
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
671 // number of bytes written to the matrix since each byte
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
672 // in the original strip contains 8 pixels of data
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
673 strip_size *= 8;
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
674
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
675 // Checking bounds again with the new size
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
676 if (written_size + strip_size > image_size)
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
677 error ("Strip data is larger than the image size");
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
678
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
679 // Iterate over the memory region backwards to expand the bits
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
680 // to their respective bytes without overwriting the read data
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
681 for (int64_t pixel = strip_size - 1; pixel >= 0; pixel--)
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
682 {
31183
6ab628dfe2a0 __tif__.cc: added support for BiLevel Images with reversed bit ordering.
magedrifaat <magedrifaat@gmail.com>
parents: 31182
diff changeset
683 uint8_t bit_number = pixel % 8;
6ab628dfe2a0 __tif__.cc: added support for BiLevel Images with reversed bit ordering.
magedrifaat <magedrifaat@gmail.com>
parents: 31182
diff changeset
684 if (TIFFIsMSB2LSB (tif))
6ab628dfe2a0 __tif__.cc: added support for BiLevel Images with reversed bit ordering.
magedrifaat <magedrifaat@gmail.com>
parents: 31182
diff changeset
685 bit_number = 7 - bit_number;
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
686 uint8_t * img_u8 = reinterpret_cast<uint8_t *> (img_fvec);
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
687 img_fvec[pixel] = (img_u8[pixel / 8] >> bit_number) & 0x01;
31119
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
688 }
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
689 }
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
690 else if (image_data->bits_per_sample == 4)
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
691 {
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
692 if (image_data->samples_per_pixel != 1)
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
693 error ("4-bit images are only supported for grayscale");
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
694
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
695 // Strip size is multplied by as each byte contains 2 pixels
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
696 // and each pixel is later expanded into its own byte
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
697 strip_size *= 2;
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
698
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
699 // Checking bounds again with the ne size
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
700 if (written_size + strip_size > image_size)
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
701 error ("Strip data is larger than the image size");
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
702
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
703 // Iterate over the memory region backwards to expand the nibbles
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
704 // to their respective bytes without overwriting the read data
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
705 for (int64_t pixel = strip_size - 1; pixel >= 0; pixel--)
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
706 {
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
707 uint8_t shift = pixel % 2 == 0? 4: 0;
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
708 uint8_t * img_u8 = reinterpret_cast<uint8_t *> (img_fvec);
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
709 img_fvec[pixel] = (img_u8[pixel / 2] >> shift) & 0x0F;
31119
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
710 }
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
711 }
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
712 else if (image_data->bits_per_sample != 8 &&
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
713 image_data->bits_per_sample != 16 &&
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
714 image_data->bits_per_sample != 32 &&
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
715 image_data->bits_per_sample != 64)
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
716 error ("Unsupported bit depth");
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
717
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
718 // Advance the pointer by the amount of bytes read
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
719 img_fvec
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
720 = reinterpret_cast<P *> (reinterpret_cast <uint8_t *> (img_fvec)
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
721 + strip_size);
31119
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
722 written_size += strip_size;
31112
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
723 }
31119
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
724
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
725 // The matrices are permutated back to the shape expected by Octave
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
726 // which is height x width x channels
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
727 Array<octave_idx_type> perm (dim_vector (3, 1));
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
728 if (image_data->planar_configuration == PLANARCONFIG_CONTIG)
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
729 {
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
730 perm(0) = 2;
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
731 perm(1) = 1;
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
732 perm(2) = 0;
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
733 }
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
734 else if (image_data->planar_configuration == PLANARCONFIG_SEPARATE)
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
735 {
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
736 perm(0) = 1;
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
737 perm(1) = 0;
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
738 perm(2) = 2;
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
739 }
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
740
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
741 img = img.permute (perm);
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
742
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
743 if (remove_padding)
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
744 img.resize (dim_vector (image_data->height, image_data->width));
31113
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
745
31118
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
746 return octave_value (img);
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
747 }
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
748
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
749 template <typename T>
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
750 octave_value
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
751 read_tiled_image (TIFF *tif, tiff_image_data *image_data)
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
752 {
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
753 typedef typename T::element_type P;
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
754
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
755 // Obtain the necessary data for handling the tiles
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
756 uint32_t tile_width, tile_height;
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
757 validate_tiff_get_field (TIFFGetField (tif, TIFFTAG_TILEWIDTH,
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
758 &tile_width));
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
759 validate_tiff_get_field (TIFFGetField (tif, TIFFTAG_TILELENGTH,
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
760 &tile_height));
31120
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
761 uint32_t tile_count = TIFFNumberOfTiles (tif);
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
762 uint32_t tiles_across = (image_data->width + tile_width - 1)
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
763 / tile_width;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
764 uint32_t tiles_down = (image_data->height + tile_height - 1)
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
765 / tile_height;
31118
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
766
31120
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
767 T img;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
768 // The matrix dimensions are defined in the order that corresponds to
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
769 // the order of the tile data read from LibTIFF.
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
770 // At the end, the matrix is permutated, reshaped and resized to be in the
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
771 // shape expected by Octave
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
772 if (image_data->planar_configuration == PLANARCONFIG_CONTIG)
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
773 img = T (dim_vector (image_data->samples_per_pixel, tile_width,
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
774 tile_height, tiles_across, tiles_down));
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
775 else if (image_data->planar_configuration == PLANARCONFIG_SEPARATE)
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
776 img = T (dim_vector (tile_width, tile_height, tiles_across, tiles_down,
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
777 image_data->samples_per_pixel));
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
778 else
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
779 error ("Unsupported Planar Configuration");
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
780
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
781 P *img_fvec = img.fortran_vec ();
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
782
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
783 // image_size is calculated from the tile data and not from the
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
784 // image parameters to account for the additional padding in the
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
785 // boundary tiles
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
786 uint64_t image_size = tile_width * tile_height * tile_count * sizeof(P);
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
787 if (image_data->planar_configuration == PLANARCONFIG_CONTIG)
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
788 image_size *= image_data->samples_per_pixel;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
789
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
790 // Can't rely on TileByteCounts because compressed images will report
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
791 // the number of bytes present in the file as opposed to the actual
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
792 // number of bytes of uncompressed data that is needed here
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
793 int64_t tile_size;
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
794 uint64_t written_size = 0;
31120
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
795 for (uint32_t tile = 0; tile < tile_count; tile++)
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
796 {
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
797 tile_size = TIFFReadEncodedTile(tif, tile, img_fvec, -1);
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
798
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
799 if (tile_size == -1)
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
800 error ("Failed to read tile data");
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
801
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
802 // Checking if the read bytes would exceed the size of the matrix
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
803 if (tile_size + written_size > image_size)
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
804 error ("Tile data is larger than image size");
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
805
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
806 if (image_data->bits_per_sample == 1)
31118
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
807 {
31120
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
808 if (image_data->samples_per_pixel != 1)
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
809 error ("Bi-Level images must have one channel only");
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
810
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
811 // The tile size is multiplied by 8 to reflect tha actual
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
812 // number of bytes written to the matrix since each byte
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
813 // in the original tile contains 8 pixels of data
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
814 tile_size *= 8;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
815
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
816 // Checking bounds again with the new size
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
817 if (written_size + tile_size > image_size)
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
818 error ("Tile data is larger than the image size");
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
819
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
820 // Iterate over the memory region backwards to expand the bits
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
821 // to their respective bytes without overwriting the read data
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
822 for (int64_t pixel = tile_size - 1; pixel >= 0; pixel--)
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
823 {
31183
6ab628dfe2a0 __tif__.cc: added support for BiLevel Images with reversed bit ordering.
magedrifaat <magedrifaat@gmail.com>
parents: 31182
diff changeset
824 uint8_t bit_number = pixel % 8;
6ab628dfe2a0 __tif__.cc: added support for BiLevel Images with reversed bit ordering.
magedrifaat <magedrifaat@gmail.com>
parents: 31182
diff changeset
825 if (TIFFIsMSB2LSB (tif))
6ab628dfe2a0 __tif__.cc: added support for BiLevel Images with reversed bit ordering.
magedrifaat <magedrifaat@gmail.com>
parents: 31182
diff changeset
826 bit_number = 7 - bit_number;
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
827 uint8_t * img_u8 = reinterpret_cast<uint8_t *> (img_fvec);
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
828 img_fvec[pixel]= (img_u8[pixel / 8] >> bit_number) & 0x01;
31120
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
829 }
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
830 }
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
831 else if (image_data->bits_per_sample == 4)
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
832 {
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
833 if (image_data->samples_per_pixel != 1)
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
834 error ("4-bit images are only supported for grayscale");
31118
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
835
31120
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
836 // tile size is multplied by as each byte contains 2 pixels
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
837 // and each pixel is later expanded into its own byte
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
838 tile_size *= 2;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
839
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
840 // Checking bounds again with the ne size
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
841 if (written_size + tile_size > image_size)
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
842 error ("Tile data is larger than the image size");
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
843
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
844 // Iterate over the memory region backwards to expand the nibbles
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
845 // to their respective bytes without overwriting the read data
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
846 for (int64_t pixel = tile_size - 1; pixel >= 0; pixel--)
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
847 {
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
848 uint8_t shift = pixel % 2 == 0? 4: 0;
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
849 uint8_t * img_u8 = reinterpret_cast<uint8_t *> (img_fvec);
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
850 img_fvec[pixel] = (img_u8[pixel / 2] >> shift) & 0x0F;
31120
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
851 }
31118
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
852 }
31120
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
853 else if (image_data->bits_per_sample != 8 &&
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
854 image_data->bits_per_sample != 16 &&
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
855 image_data->bits_per_sample != 32 &&
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
856 image_data->bits_per_sample != 64)
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
857 error ("Unsupported bit depth");
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
858
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
859 img_fvec
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
860 = reinterpret_cast<P *> (reinterpret_cast<uint8_t *> (img_fvec)
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
861 + tile_size);
31120
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
862 written_size += tile_size;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
863 }
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
864
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
865 // The data is now in the matrix but in a different order than expected
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
866 // by Octave and with additional padding in boundary tiles.
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
867 // To get it to the right order, the dimensions are permutated to
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
868 // align tiles to their correct grid, then reshaped to remove the
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
869 // extra dimensions (tiles_across, tiles_down), then resized to
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
870 // remove any extra padding, and finally permutated to the correct
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
871 // order that is: height x width x channels
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
872 Array<octave_idx_type> perm1 (dim_vector (5, 1));
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
873 Array<octave_idx_type> perm2 (dim_vector (3, 1));
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
874 if (image_data->planar_configuration == PLANARCONFIG_CONTIG)
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
875 {
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
876 perm1(0) = 0;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
877 perm1(1) = 1;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
878 perm1(2) = 3;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
879 perm1(3) = 2;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
880 perm1(4) = 4;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
881 img = img.permute (perm1);
31118
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
882
31120
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
883 img = img.reshape (dim_vector (image_data->samples_per_pixel,
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
884 tile_width * tiles_across,
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
885 tile_height * tiles_down));
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
886
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
887 if (tile_width * tiles_across != image_data->width
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
888 || tile_height * tiles_down != image_data->height)
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
889 img.resize (dim_vector (image_data->samples_per_pixel,
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
890 image_data->width, image_data->height));
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
891
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
892 perm2(0) = 2;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
893 perm2(1) = 1;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
894 perm2(2) = 0;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
895 img = img.permute (perm2);
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
896 }
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
897 else if (image_data->planar_configuration == PLANARCONFIG_SEPARATE)
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
898 {
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
899 perm1(0) = 0;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
900 perm1(1) = 2;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
901 perm1(2) = 1;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
902 perm1(3) = 3;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
903 perm1(4) = 4;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
904 img = img.permute (perm1);
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
905
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
906 img = img.reshape (dim_vector (tile_width * tiles_across,
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
907 tile_height * tiles_down,
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
908 image_data->samples_per_pixel));
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
909
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
910 if (tile_width * tiles_across != image_data->width
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
911 || tile_height * tiles_down != image_data->height)
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
912 img.resize (dim_vector (image_data->width, image_data->height,
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
913 image_data->samples_per_pixel));
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
914
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
915 perm2(0) = 1;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
916 perm2(1) = 0;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
917 perm2(2) = 2;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
918 img = img.permute (perm2);
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
919 }
31118
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
920
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
921 return octave_value (img);
31113
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
922 }
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
923
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
924 template <typename T>
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
925 octave_value
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
926 read_image (TIFF *tif, tiff_image_data *image_data)
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
927 {
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
928 if (image_data->is_tiled)
31118
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
929 return read_tiled_image<T> (tif, image_data);
31113
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
930 else
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
931 return read_stripped_image<T> (tif, image_data);
31112
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
932 }
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
933
31178
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
934 octave_value
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
935 read_unsigned_image (TIFF *tif, tiff_image_data *image_data)
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
936 {
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
937 switch (image_data->bits_per_sample)
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
938 {
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
939 case 1:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
940 return read_image<boolNDArray> (tif, image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
941 break;
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
942 case 4:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
943 case 8:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
944 return read_image<uint8NDArray> (tif, image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
945 break;
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
946 case 16:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
947 return read_image<uint16NDArray> (tif, image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
948 break;
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
949 case 32:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
950 return read_image<uint32NDArray> (tif, image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
951 case 64:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
952 return read_image<uint64NDArray> (tif, image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
953 break;
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
954 default:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
955 error ("Unsupported bit depth");
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
956 }
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
957 }
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
958
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
959 octave_value
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
960 read_signed_image (TIFF *tif, tiff_image_data *image_data)
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
961 {
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
962 switch (image_data->bits_per_sample)
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
963 {
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
964 case 8:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
965 return read_image<int8NDArray> (tif, image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
966 break;
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
967 case 16:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
968 return read_image<int16NDArray> (tif, image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
969 break;
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
970 case 32:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
971 return read_image<int32NDArray> (tif, image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
972 case 64:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
973 return read_image<int64NDArray> (tif, image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
974 break;
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
975 default:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
976 error ("Unsupported bit depth for signed images");
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
977 }
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
978 }
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
979
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
980 octave_value
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
981 read_float_image (TIFF *tif, tiff_image_data *image_data)
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
982 {
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
983 switch (image_data->bits_per_sample)
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
984 {
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
985 case 32:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
986 return read_image<FloatNDArray> (tif, image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
987 case 64:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
988 return read_image<NDArray> (tif, image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
989 break;
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
990 default:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
991 error ("Unsupported bit depth for floating-point images");
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
992 }
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
993 }
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
994
31180
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
995 template <typename T>
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
996 octave_value
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
997 make_array (void *data, dim_vector& arr_dims)
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
998 {
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
999 typedef typename T::element_type P;
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
1000
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
1001 T arr (arr_dims);
31181
8a4ef572077d __tiff__.cc (get_scalar_field_data): replaced _TIFFMalloc with unique_ptr.
magedrifaat <magedrifaat@gmail.com>
parents: 31180
diff changeset
1002 for (uint32_t i = 0; i < arr_dims.numel (); i++)
31180
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
1003 {
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
1004 arr(i) = (reinterpret_cast<P *> (data))[i];
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
1005 }
31181
8a4ef572077d __tiff__.cc (get_scalar_field_data): replaced _TIFFMalloc with unique_ptr.
magedrifaat <magedrifaat@gmail.com>
parents: 31180
diff changeset
1006 return octave_value (arr);
31180
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
1007 }
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
1008
31114
9dead1249449 Tiff getTag: fixed matrix shape for ColorMap and TransferFunction
magedrifaat <magedrifaat@gmail.com>
parents: 31113
diff changeset
1009 octave_value
31184
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1010 interpret_tag_data (void *data, uint32_t count, TIFFDataType tag_datatype,
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1011 bool convert_to_double = false)
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1012 {
31184
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1013 octave_value retval;dim_vector arr_dims (1, count);
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1014 switch (tag_datatype)
31101
f24d7bcad2d3 Partially fixed formatting of C++ code
magedrifaat <magedrifaat@gmail.com>
parents: 31099
diff changeset
1015 {
31184
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1016 case TIFF_BYTE:
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1017 case TIFF_UNDEFINED:
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1018 {
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1019 retval = make_array<uint8NDArray> (data, arr_dims);
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1020 break;
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1021 }
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1022 case TIFF_ASCII:
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1023 {
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1024 retval = octave_value (*(reinterpret_cast<char **> (data)));
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1025 break;
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1026 }
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1027 case TIFF_SHORT:
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1028 {
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1029 retval = make_array<uint16NDArray> (data, arr_dims);
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1030 break;
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1031 }
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1032 case TIFF_LONG:
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1033 case TIFF_IFD:
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1034 {
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1035 retval = make_array<uint32NDArray> (data, arr_dims);
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1036 break;
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1037 }
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1038 case TIFF_LONG8:
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1039 case TIFF_IFD8:
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1040 {
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1041 retval = make_array<uint64NDArray> (data, arr_dims);
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1042 break;
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1043 }
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1044 case TIFF_RATIONAL:
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1045 case TIFF_SRATIONAL:
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1046 case TIFF_FLOAT:
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1047 {
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1048 retval = make_array<FloatNDArray> (data, arr_dims);
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1049 break;
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1050 }
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1051 case TIFF_SBYTE:
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1052 {
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1053 retval = make_array<int8NDArray> (data, arr_dims);
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1054 break;
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1055 }
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1056 case TIFF_SSHORT:
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1057 {
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1058 retval = make_array<int16NDArray> (data, arr_dims);
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1059 break;
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1060 }
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1061 case TIFF_SLONG:
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1062 {
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1063 retval = make_array<int32NDArray> (data, arr_dims);
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1064 break;
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1065 }
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1066 case TIFF_SLONG8:
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1067 {
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1068 retval = make_array<int64NDArray> (data, arr_dims);
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1069 break;
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1070 }
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1071 case TIFF_DOUBLE:
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1072 {
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1073 retval = make_array<NDArray> (data, arr_dims);
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1074 break;
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1075 }
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1076 default:
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1077 error ("Unsupported tag data type");
31101
f24d7bcad2d3 Partially fixed formatting of C++ code
magedrifaat <magedrifaat@gmail.com>
parents: 31099
diff changeset
1078 }
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1079
31184
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1080 if (tag_datatype != TIFF_ASCII && convert_to_double)
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1081 retval = retval.as_double ();
31114
9dead1249449 Tiff getTag: fixed matrix shape for ColorMap and TransferFunction
magedrifaat <magedrifaat@gmail.com>
parents: 31113
diff changeset
1082 return retval;
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1083 }
31094
ab5b33e447b0 Modified getTag to account for different tag data types and multivalued tags, the current implementation is still buggy for most tags and data types
magedrifaat <magedrifaat@gmail.com>
parents: 31093
diff changeset
1084
31114
9dead1249449 Tiff getTag: fixed matrix shape for ColorMap and TransferFunction
magedrifaat <magedrifaat@gmail.com>
parents: 31113
diff changeset
1085 octave_value
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1086 get_scalar_field_data (TIFF *tif, const TIFFField *fip)
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1087 {
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1088 uint32_t tag_id = TIFFFieldTag (fip);
31097
75ab26f147a5 getTag: Implemented single array tags, only multi-array and special tags are unimplemented
magedrifaat <magedrifaat@gmail.com>
parents: 31096
diff changeset
1089
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1090 // TIFFFieldReadCount returns VARIABLE for some scalar tags
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1091 // (e.g. Compression) But TIFFFieldPassCount seems consistent
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1092 // Since scalar tags are the last to be handled, any tag that
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1093 // require a count to be passed is an unsupported tag.
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1094 if (TIFFFieldPassCount (fip))
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1095 error ("Unsupported tag");
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1096
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1097 int type_size = TIFFDataWidth (TIFFFieldDataType (fip));
31129
dfab9c6982bf Tiff getTag: added support for single quotes string fo the tag name
magedrifaat <magedrifaat@gmail.com>
parents: 31128
diff changeset
1098
31181
8a4ef572077d __tiff__.cc (get_scalar_field_data): replaced _TIFFMalloc with unique_ptr.
magedrifaat <magedrifaat@gmail.com>
parents: 31180
diff changeset
1099 std::unique_ptr<uint8_t []> data
8a4ef572077d __tiff__.cc (get_scalar_field_data): replaced _TIFFMalloc with unique_ptr.
magedrifaat <magedrifaat@gmail.com>
parents: 31180
diff changeset
1100 = std::make_unique<uint8_t []> (type_size);
8a4ef572077d __tiff__.cc (get_scalar_field_data): replaced _TIFFMalloc with unique_ptr.
magedrifaat <magedrifaat@gmail.com>
parents: 31180
diff changeset
1101 uint8_t *data_ptr = data.get ();
31131
7349994f30f8 Tiff: fixed the first test to use a single-pixel image
magedrifaat <magedrifaat@gmail.com>
parents: 31130
diff changeset
1102 if (tag_id == TIFFTAG_PLANARCONFIG)
7349994f30f8 Tiff: fixed the first test to use a single-pixel image
magedrifaat <magedrifaat@gmail.com>
parents: 31130
diff changeset
1103 {
7349994f30f8 Tiff: fixed the first test to use a single-pixel image
magedrifaat <magedrifaat@gmail.com>
parents: 31130
diff changeset
1104 // Workaround for a bug in LibTIFF where it incorrectly returns
7349994f30f8 Tiff: fixed the first test to use a single-pixel image
magedrifaat <magedrifaat@gmail.com>
parents: 31130
diff changeset
1105 // zero as the default value for PlanaConfiguration
31185
a1145ac2ce9b Tiff: populated TagID from the C++ map to avoid having two copies
magedrifaat <magedrifaat@gmail.com>
parents: 31184
diff changeset
1106 // See: https://www.asmail.be/msg0054918184.html
31181
8a4ef572077d __tiff__.cc (get_scalar_field_data): replaced _TIFFMalloc with unique_ptr.
magedrifaat <magedrifaat@gmail.com>
parents: 31180
diff changeset
1107 if (! TIFFGetField(tif, tag_id, data_ptr))
8a4ef572077d __tiff__.cc (get_scalar_field_data): replaced _TIFFMalloc with unique_ptr.
magedrifaat <magedrifaat@gmail.com>
parents: 31180
diff changeset
1108 *reinterpret_cast<uint16_t *> (data_ptr) = 1;
31131
7349994f30f8 Tiff: fixed the first test to use a single-pixel image
magedrifaat <magedrifaat@gmail.com>
parents: 31130
diff changeset
1109 }
7349994f30f8 Tiff: fixed the first test to use a single-pixel image
magedrifaat <magedrifaat@gmail.com>
parents: 31130
diff changeset
1110 else
31181
8a4ef572077d __tiff__.cc (get_scalar_field_data): replaced _TIFFMalloc with unique_ptr.
magedrifaat <magedrifaat@gmail.com>
parents: 31180
diff changeset
1111 validate_tiff_get_field (TIFFGetFieldDefaulted (tif, tag_id, data_ptr));
31131
7349994f30f8 Tiff: fixed the first test to use a single-pixel image
magedrifaat <magedrifaat@gmail.com>
parents: 31130
diff changeset
1112
31184
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1113 // All scalar tags are returned as double
31181
8a4ef572077d __tiff__.cc (get_scalar_field_data): replaced _TIFFMalloc with unique_ptr.
magedrifaat <magedrifaat@gmail.com>
parents: 31180
diff changeset
1114 octave_value tag_data_ov = interpret_tag_data (data_ptr, 1,
31184
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1115 TIFFFieldDataType (fip),
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1116 true);
31094
ab5b33e447b0 Modified getTag to account for different tag data types and multivalued tags, the current implementation is still buggy for most tags and data types
magedrifaat <magedrifaat@gmail.com>
parents: 31093
diff changeset
1117
31114
9dead1249449 Tiff getTag: fixed matrix shape for ColorMap and TransferFunction
magedrifaat <magedrifaat@gmail.com>
parents: 31113
diff changeset
1118 return tag_data_ov;
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1119 }
31094
ab5b33e447b0 Modified getTag to account for different tag data types and multivalued tags, the current implementation is still buggy for most tags and data types
magedrifaat <magedrifaat@gmail.com>
parents: 31093
diff changeset
1120
31114
9dead1249449 Tiff getTag: fixed matrix shape for ColorMap and TransferFunction
magedrifaat <magedrifaat@gmail.com>
parents: 31113
diff changeset
1121 octave_value
31184
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1122 get_array_field_data (TIFF *tif, const TIFFField *fip, uint32_t array_size,
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1123 bool convert_to_double = false)
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1124 {
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1125 void *data;
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1126 validate_tiff_get_field (TIFFGetField (tif, TIFFFieldTag (fip), &data));
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1127
31184
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1128 return interpret_tag_data (data, array_size, TIFFFieldDataType (fip),
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1129 convert_to_double);
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1130 }
31097
75ab26f147a5 getTag: Implemented single array tags, only multi-array and special tags are unimplemented
magedrifaat <magedrifaat@gmail.com>
parents: 31096
diff changeset
1131
31117
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1132 octave_value
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1133 get_field_data (TIFF *tif, const TIFFField *fip)
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1134 {
31117
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1135 octave_value tag_data_ov;
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1136 uint32_t tag_id = TIFFFieldTag (fip);
31097
75ab26f147a5 getTag: Implemented single array tags, only multi-array and special tags are unimplemented
magedrifaat <magedrifaat@gmail.com>
parents: 31096
diff changeset
1137
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1138 switch (tag_id)
31101
f24d7bcad2d3 Partially fixed formatting of C++ code
magedrifaat <magedrifaat@gmail.com>
parents: 31099
diff changeset
1139 {
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1140 case TIFFTAG_STRIPBYTECOUNTS:
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1141 case TIFFTAG_STRIPOFFSETS:
31117
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1142 tag_data_ov = get_array_field_data (tif, fip,
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1143 TIFFNumberOfStrips (tif));
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1144 break;
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1145 case TIFFTAG_TILEBYTECOUNTS:
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1146 case TIFFTAG_TILEOFFSETS:
31178
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1147 tag_data_ov
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1148 = get_array_field_data (tif, fip, TIFFNumberOfTiles (tif));
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1149 break;
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1150 case TIFFTAG_YCBCRCOEFFICIENTS:
31184
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1151 tag_data_ov = get_array_field_data (tif, fip, 3, true);
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1152 break;
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1153 case TIFFTAG_REFERENCEBLACKWHITE:
31184
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1154 tag_data_ov = get_array_field_data (tif, fip, 6, true);
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1155 break;
31106
f5a88c0a61ab Support for GrayResponseCurve and GrayResponseUnit tags
magedrifaat <magedrifaat@gmail.com>
parents: 31105
diff changeset
1156 case TIFFTAG_GRAYRESPONSECURVE:
f5a88c0a61ab Support for GrayResponseCurve and GrayResponseUnit tags
magedrifaat <magedrifaat@gmail.com>
parents: 31105
diff changeset
1157 {
f5a88c0a61ab Support for GrayResponseCurve and GrayResponseUnit tags
magedrifaat <magedrifaat@gmail.com>
parents: 31105
diff changeset
1158 uint16_t bits_per_sample;
31127
0d9633ee715e Tiff: fixed a bug where the default value of some tags was ignored
magedrifaat <magedrifaat@gmail.com>
parents: 31126
diff changeset
1159 if (! TIFFGetFieldDefaulted (tif, TIFFTAG_BITSPERSAMPLE,
0d9633ee715e Tiff: fixed a bug where the default value of some tags was ignored
magedrifaat <magedrifaat@gmail.com>
parents: 31126
diff changeset
1160 &bits_per_sample))
31106
f5a88c0a61ab Support for GrayResponseCurve and GrayResponseUnit tags
magedrifaat <magedrifaat@gmail.com>
parents: 31105
diff changeset
1161 error ("Failed to obtain the bit depth");
f5a88c0a61ab Support for GrayResponseCurve and GrayResponseUnit tags
magedrifaat <magedrifaat@gmail.com>
parents: 31105
diff changeset
1162
31184
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1163 tag_data_ov = get_array_field_data (tif, fip,
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1164 1<<bits_per_sample, true);
31106
f5a88c0a61ab Support for GrayResponseCurve and GrayResponseUnit tags
magedrifaat <magedrifaat@gmail.com>
parents: 31105
diff changeset
1165 break;
f5a88c0a61ab Support for GrayResponseCurve and GrayResponseUnit tags
magedrifaat <magedrifaat@gmail.com>
parents: 31105
diff changeset
1166 }
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1167 case TIFFTAG_COLORMAP:
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1168 {
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1169 uint16_t bits_per_sample;
31127
0d9633ee715e Tiff: fixed a bug where the default value of some tags was ignored
magedrifaat <magedrifaat@gmail.com>
parents: 31126
diff changeset
1170 if (! TIFFGetFieldDefaulted (tif, TIFFTAG_BITSPERSAMPLE,
0d9633ee715e Tiff: fixed a bug where the default value of some tags was ignored
magedrifaat <magedrifaat@gmail.com>
parents: 31126
diff changeset
1171 &bits_per_sample))
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1172 error ("Failed to obtain the bit depth");
31143
a68f2dadafee Tiff.m: added all remaining tests for implemented features.
magedrifaat <magedrifaat@gmail.com>
parents: 31142
diff changeset
1173
a68f2dadafee Tiff.m: added all remaining tests for implemented features.
magedrifaat <magedrifaat@gmail.com>
parents: 31142
diff changeset
1174 // According to the format specification, this field should
a68f2dadafee Tiff.m: added all remaining tests for implemented features.
magedrifaat <magedrifaat@gmail.com>
parents: 31142
diff changeset
1175 // be 8 or 16 only.
a68f2dadafee Tiff.m: added all remaining tests for implemented features.
magedrifaat <magedrifaat@gmail.com>
parents: 31142
diff changeset
1176 if (bits_per_sample > 16)
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1177 error ("Too high bit depth for a palette image");
31098
3cbd0d82167c getTag: Implemented all special tags, only unsupported geotiff tags not implemented
magedrifaat <magedrifaat@gmail.com>
parents: 31097
diff changeset
1178
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1179 uint32_t count = 1 << bits_per_sample;
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1180 uint16_t *red, *green, *blue;
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1181 validate_tiff_get_field (TIFFGetField (tif, TIFFTAG_COLORMAP,
31114
9dead1249449 Tiff getTag: fixed matrix shape for ColorMap and TransferFunction
magedrifaat <magedrifaat@gmail.com>
parents: 31113
diff changeset
1182 &red, &green, &blue));
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1183
31130
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1184 // Retrieving the data of the three channels and concatenating
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1185 // them together
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1186 OCTAVE_LOCAL_BUFFER (NDArray, array_list, 3);
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1187 dim_vector col_dims(count, 1);
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1188 array_list[0] = NDArray (interpret_tag_data (red,
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1189 count,
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1190 TIFFFieldDataType(fip))
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1191 .uint16_array_value ()
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1192 .reshape (col_dims));
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1193 array_list[1] = NDArray (interpret_tag_data (green,
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1194 count,
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1195 TIFFFieldDataType(fip))
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1196 .uint16_array_value ()
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1197 .reshape (col_dims));
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1198 array_list[2] = NDArray (interpret_tag_data (blue,
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1199 count,
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1200 TIFFFieldDataType(fip))
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1201 .uint16_array_value ()
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1202 .reshape (col_dims));
31114
9dead1249449 Tiff getTag: fixed matrix shape for ColorMap and TransferFunction
magedrifaat <magedrifaat@gmail.com>
parents: 31113
diff changeset
1203
31130
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1204 NDArray mat_out = NDArray::cat(1, 3, array_list);
31121
341796f9efb6 Tiff getTag: converted colormap tag data to the correct type and range
magedrifaat <magedrifaat@gmail.com>
parents: 31120
diff changeset
1205 // Normalize the range to be between 0 and 1
341796f9efb6 Tiff getTag: converted colormap tag data to the correct type and range
magedrifaat <magedrifaat@gmail.com>
parents: 31120
diff changeset
1206 mat_out /= UINT16_MAX;
31114
9dead1249449 Tiff getTag: fixed matrix shape for ColorMap and TransferFunction
magedrifaat <magedrifaat@gmail.com>
parents: 31113
diff changeset
1207
31117
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1208 tag_data_ov = octave_value (mat_out);
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1209 break;
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1210 }
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1211 case TIFFTAG_TRANSFERFUNCTION:
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1212 {
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1213 uint16_t samples_per_pixel;
31127
0d9633ee715e Tiff: fixed a bug where the default value of some tags was ignored
magedrifaat <magedrifaat@gmail.com>
parents: 31126
diff changeset
1214 if (! TIFFGetFieldDefaulted (tif, TIFFTAG_SAMPLESPERPIXEL,
0d9633ee715e Tiff: fixed a bug where the default value of some tags was ignored
magedrifaat <magedrifaat@gmail.com>
parents: 31126
diff changeset
1215 &samples_per_pixel))
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1216 error ("Failed to obtain the number of samples per pixel");
31098
3cbd0d82167c getTag: Implemented all special tags, only unsupported geotiff tags not implemented
magedrifaat <magedrifaat@gmail.com>
parents: 31097
diff changeset
1217
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1218 uint16_t bits_per_sample;
31127
0d9633ee715e Tiff: fixed a bug where the default value of some tags was ignored
magedrifaat <magedrifaat@gmail.com>
parents: 31126
diff changeset
1219 if (! TIFFGetFieldDefaulted (tif, TIFFTAG_BITSPERSAMPLE,
0d9633ee715e Tiff: fixed a bug where the default value of some tags was ignored
magedrifaat <magedrifaat@gmail.com>
parents: 31126
diff changeset
1220 &bits_per_sample))
31167
f91cd5ceaae6 Tiff setTag: added support for special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31166
diff changeset
1221 error ("Failed to obtain the bit depth");
31098
3cbd0d82167c getTag: Implemented all special tags, only unsupported geotiff tags not implemented
magedrifaat <magedrifaat@gmail.com>
parents: 31097
diff changeset
1222
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1223 uint32_t count = 1 << bits_per_sample;
31179
f294b800f002 Tiff.m: added tests for signed images and sub-directories.
magedrifaat <magedrifaat@gmail.com>
parents: 31178
diff changeset
1224 uint16_t *ch1 = NULL, *ch2 = NULL, *ch3 = NULL;
f294b800f002 Tiff.m: added tests for signed images and sub-directories.
magedrifaat <magedrifaat@gmail.com>
parents: 31178
diff changeset
1225 // TransferFunction can have 1 or 3 channels depending on the
f294b800f002 Tiff.m: added tests for signed images and sub-directories.
magedrifaat <magedrifaat@gmail.com>
parents: 31178
diff changeset
1226 // SamplesPerPixel but the library still expects three pointers
f294b800f002 Tiff.m: added tests for signed images and sub-directories.
magedrifaat <magedrifaat@gmail.com>
parents: 31178
diff changeset
1227 // to be passed and sets only the needed ones
31168
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1228 validate_tiff_get_field (TIFFGetField (tif, tag_id,
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1229 &ch1, &ch2, &ch3));
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1230 if (ch2 == NULL)
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1231 tag_data_ov = interpret_tag_data (ch1, count,
31184
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1232 TIFFFieldDataType (fip), true);
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1233 else
31179
f294b800f002 Tiff.m: added tests for signed images and sub-directories.
magedrifaat <magedrifaat@gmail.com>
parents: 31178
diff changeset
1234 {
f294b800f002 Tiff.m: added tests for signed images and sub-directories.
magedrifaat <magedrifaat@gmail.com>
parents: 31178
diff changeset
1235 // Concatenate the channels into an n by 3 array
31184
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1236 OCTAVE_LOCAL_BUFFER (NDArray, array_list, 3);
31130
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1237 dim_vector col_dims(count, 1);
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1238 array_list[0] = interpret_tag_data (ch1,
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1239 count,
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1240 TIFFFieldDataType (fip))
31184
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1241 .array_value ()
31130
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1242 .reshape (col_dims);
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1243 array_list[1] = interpret_tag_data (ch2,
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1244 count,
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1245 TIFFFieldDataType (fip))
31184
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1246 .array_value ()
31130
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1247 .reshape (col_dims);
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1248 array_list[2] = interpret_tag_data (ch3,
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1249 count,
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1250 TIFFFieldDataType (fip))
31184
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1251 .array_value ()
31130
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1252 .reshape (col_dims);
31114
9dead1249449 Tiff getTag: fixed matrix shape for ColorMap and TransferFunction
magedrifaat <magedrifaat@gmail.com>
parents: 31113
diff changeset
1253
31178
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1254 tag_data_ov
31184
86f91ea7a642 __tiff__.cc (get_field_data): fixed return type for some tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31183
diff changeset
1255 = octave_value (NDArray::cat (1, 3, array_list));
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1256 }
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1257 break;
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1258 }
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1259 case TIFFTAG_PAGENUMBER:
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1260 case TIFFTAG_HALFTONEHINTS:
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1261 case TIFFTAG_DOTRANGE:
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1262 case TIFFTAG_YCBCRSUBSAMPLING:
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1263 {
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1264 uint16_t tag_part1, tag_part2;
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1265 validate_tiff_get_field (TIFFGetField (tif, tag_id,
31114
9dead1249449 Tiff getTag: fixed matrix shape for ColorMap and TransferFunction
magedrifaat <magedrifaat@gmail.com>
parents: 31113
diff changeset
1266 &tag_part1, &tag_part2));
31117
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1267
31130
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1268 NDArray mat_out (dim_vector (1, 2));
31117
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1269 mat_out(0)
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1270 = interpret_tag_data (&tag_part1, 1,
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1271 TIFFFieldDataType (fip)).double_value ();
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1272 mat_out(1)
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1273 = interpret_tag_data (&tag_part2, 1,
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1274 TIFFFieldDataType (fip)).double_value ();
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1275
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1276 tag_data_ov = octave_value (mat_out);
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1277 break;
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1278 }
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1279 case TIFFTAG_SUBIFD:
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1280 {
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1281 uint16_t count;
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1282 uint64_t *offsets;
31178
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1283 validate_tiff_get_field (TIFFGetField (tif, tag_id,
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1284 &count, &offsets));
31117
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1285 tag_data_ov = interpret_tag_data (offsets, count,
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1286 TIFFFieldDataType (fip));
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1287 break;
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1288 }
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1289 case TIFFTAG_EXTRASAMPLES:
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1290 {
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1291 uint16_t count;
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1292 uint16_t *types;
31178
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1293 validate_tiff_get_field (TIFFGetField (tif, tag_id,
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1294 &count, &types));
31117
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1295 tag_data_ov = interpret_tag_data (types, count,
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1296 TIFFFieldDataType (fip));
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1297 break;
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1298 }
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1299 case TIFFTAG_XMLPACKET:
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1300 case TIFFTAG_RICHTIFFIPTC:
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1301 case TIFFTAG_PHOTOSHOP:
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1302 case TIFFTAG_ICCPROFILE:
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1303 {
31186
90eccc78d958 __tiff__.cc (get_field_data, set_field_data): added support for complex tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31185
diff changeset
1304 uint32_t count;
90eccc78d958 __tiff__.cc (get_field_data, set_field_data): added support for complex tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31185
diff changeset
1305 uint8_t *data;
90eccc78d958 __tiff__.cc (get_field_data, set_field_data): added support for complex tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31185
diff changeset
1306 validate_tiff_get_field (TIFFGetField (tif, tag_id,
90eccc78d958 __tiff__.cc (get_field_data, set_field_data): added support for complex tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31185
diff changeset
1307 &count, &data));
90eccc78d958 __tiff__.cc (get_field_data, set_field_data): added support for complex tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31185
diff changeset
1308 tag_data_ov = interpret_tag_data (data, count, TIFF_BYTE);
90eccc78d958 __tiff__.cc (get_field_data, set_field_data): added support for complex tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31185
diff changeset
1309 // Matlab returns XMP tag as char array not byte array
90eccc78d958 __tiff__.cc (get_field_data, set_field_data): added support for complex tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31185
diff changeset
1310 if (tag_id == TIFFTAG_XMLPACKET)
90eccc78d958 __tiff__.cc (get_field_data, set_field_data): added support for complex tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31185
diff changeset
1311 tag_data_ov = octave_value (tag_data_ov.char_array_value ());
31103
76b21bed2920 Undocumented and unimplemented tags are explicilty mentioned and handled
magedrifaat <magedrifaat@gmail.com>
parents: 31102
diff changeset
1312 break;
76b21bed2920 Undocumented and unimplemented tags are explicilty mentioned and handled
magedrifaat <magedrifaat@gmail.com>
parents: 31102
diff changeset
1313 }
31106
f5a88c0a61ab Support for GrayResponseCurve and GrayResponseUnit tags
magedrifaat <magedrifaat@gmail.com>
parents: 31105
diff changeset
1314 // These tags are not mentioned in the LibTIFF documentation
31103
76b21bed2920 Undocumented and unimplemented tags are explicilty mentioned and handled
magedrifaat <magedrifaat@gmail.com>
parents: 31102
diff changeset
1315 // but are handled correctly by the library
76b21bed2920 Undocumented and unimplemented tags are explicilty mentioned and handled
magedrifaat <magedrifaat@gmail.com>
parents: 31102
diff changeset
1316 case TIFFTAG_ZIPQUALITY:
76b21bed2920 Undocumented and unimplemented tags are explicilty mentioned and handled
magedrifaat <magedrifaat@gmail.com>
parents: 31102
diff changeset
1317 case TIFFTAG_SGILOGDATAFMT:
31106
f5a88c0a61ab Support for GrayResponseCurve and GrayResponseUnit tags
magedrifaat <magedrifaat@gmail.com>
parents: 31105
diff changeset
1318 case TIFFTAG_GRAYRESPONSEUNIT:
31103
76b21bed2920 Undocumented and unimplemented tags are explicilty mentioned and handled
magedrifaat <magedrifaat@gmail.com>
parents: 31102
diff changeset
1319 {
31117
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1320 tag_data_ov = get_scalar_field_data (tif, fip);
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1321 break;
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1322 }
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1323 default:
31117
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1324 tag_data_ov = get_scalar_field_data (tif, fip);
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1325 }
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1326
31117
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1327 return tag_data_ov;
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1328 }
31124
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1329
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1330 void
31165
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1331 set_scalar_field_data (TIFF *tif, const TIFFField *fip, octave_value tag_ov)
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1332 {
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1333 uint32_t tag_id = TIFFFieldTag (fip);
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1334
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1335 // Since scalar tags are the last to be handled, any tag that
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1336 // require a count to be passed is an unsupported tag.
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1337 if (TIFFFieldPassCount (fip))
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1338 error ("Unsupported tag");
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1339
31172
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
1340 TIFFDataType tag_datatype = TIFFFieldDataType (fip);
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
1341
31168
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1342 // According to matlab, the value must be a scalar double
31172
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
1343 // except for strings
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
1344 if (tag_datatype == TIFF_ASCII)
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
1345 {
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
1346 if (! tag_ov.is_string ())
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
1347 error ("Expected string for ascii tag");
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
1348 }
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
1349 else if (! tag_ov.is_scalar_type () || ! tag_ov.is_double_type ())
31168
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1350 error ("Tag value must be a scalar double");
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1351
31165
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1352 switch (tag_datatype)
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1353 {
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1354 case TIFF_BYTE:
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1355 case TIFF_UNDEFINED:
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1356 TIFFSetField (tif, tag_id, tag_ov.uint8_scalar_value ());
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1357 break;
31166
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1358 case TIFF_ASCII:
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1359 TIFFSetField (tif, tag_id, tag_ov.string_value ().c_str ());
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1360 break;
31165
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1361 case TIFF_SHORT:
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1362 TIFFSetField (tif, tag_id, tag_ov.uint16_scalar_value ());
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1363 break;
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1364 case TIFF_LONG:
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1365 TIFFSetField (tif, tag_id, tag_ov.uint32_scalar_value ());
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1366 break;
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1367 case TIFF_LONG8:
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1368 TIFFSetField (tif, tag_id, tag_ov.uint64_scalar_value ());
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1369 break;
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1370 case TIFF_RATIONAL:
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1371 TIFFSetField (tif, tag_id, tag_ov.float_scalar_value ());
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1372 break;
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1373 case TIFF_SBYTE:
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1374 TIFFSetField (tif, tag_id, tag_ov.int8_scalar_value ());
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1375 break;
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1376 case TIFF_SSHORT:
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1377 TIFFSetField (tif, tag_id, tag_ov.int16_scalar_value ());
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1378 break;
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1379 case TIFF_SLONG:
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1380 TIFFSetField (tif, tag_id, tag_ov.int32_scalar_value ());
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1381 break;
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1382 case TIFF_SLONG8:
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1383 TIFFSetField (tif, tag_id, tag_ov.int64_scalar_value ());
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1384 break;
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1385 case TIFF_FLOAT:
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1386 TIFFSetField (tif, tag_id, tag_ov.float_scalar_value ());
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1387 break;
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1388 case TIFF_DOUBLE:
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1389 TIFFSetField (tif, tag_id, tag_ov.double_value ());
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1390 break;
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1391 case TIFF_SRATIONAL:
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1392 TIFFSetField (tif, tag_id, tag_ov.float_scalar_value ());
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1393 break;
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1394 case TIFF_IFD:
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1395 case TIFF_IFD8:
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1396 error ("Unimplemented IFFD data type");
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1397 break;
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1398 default:
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1399 error ("Unsupported tag data type");
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1400 }
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1401 }
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1402
31168
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1403 template <typename T>
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1404 void
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1405 set_array_field_helper (TIFF *tif, uint32_t tag_id, T data_arr)
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1406 {
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1407 const void *data_ptr = data_arr.data ();
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1408
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1409 if (! TIFFSetField (tif, tag_id, data_ptr))
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1410 error ("Failed to set tag");
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1411 }
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1412
31165
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1413 void
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1414 set_array_field_data (TIFF *tif, const TIFFField *fip,
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1415 octave_value tag_ov, uint32_t count)
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1416 {
31166
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1417 uint32_t tag_id = TIFFFieldTag (fip);
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1418 TIFFDataType tag_datatype = TIFFFieldDataType (fip);
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1419
31168
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1420 // Array type must be double in matlab
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1421 if (! tag_ov.is_double_type ())
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1422 error ("Tag data must be double");
31166
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1423
31168
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1424 // Matlab checks number of elements not dimensions
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1425 if (tag_ov.array_value ().numel () != count)
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1426 error ("Expected an array with %u elements", count);
31166
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1427
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1428 switch (tag_datatype)
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1429 {
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1430 case TIFF_BYTE:
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1431 case TIFF_UNDEFINED:
31168
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1432 set_array_field_helper<uint8NDArray> (tif, tag_id,
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1433 tag_ov.uint8_array_value ());
31166
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1434 break;
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1435 case TIFF_SHORT:
31168
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1436 set_array_field_helper<uint16NDArray> (tif, tag_id,
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1437 tag_ov.uint16_array_value ());
31166
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1438 break;
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1439 case TIFF_LONG:
31168
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1440 set_array_field_helper<uint32NDArray> (tif, tag_id,
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1441 tag_ov.uint32_array_value ());
31166
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1442 break;
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1443 case TIFF_LONG8:
31168
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1444 set_array_field_helper<uint64NDArray> (tif, tag_id,
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1445 tag_ov.uint64_array_value ());
31166
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1446 break;
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1447 case TIFF_RATIONAL:
31168
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1448 set_array_field_helper<FloatNDArray> (tif, tag_id,
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1449 tag_ov.float_array_value ());
31166
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1450 break;
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1451 case TIFF_SBYTE:
31168
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1452 set_array_field_helper<int8NDArray> (tif, tag_id,
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1453 tag_ov.int8_array_value ());
31166
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1454 break;
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1455 case TIFF_SSHORT:
31168
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1456 set_array_field_helper<int16NDArray> (tif, tag_id,
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1457 tag_ov.int16_array_value ());
31166
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1458 break;
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1459 case TIFF_SLONG:
31168
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1460 set_array_field_helper<int32NDArray> (tif, tag_id,
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1461 tag_ov.int32_array_value ());
31166
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1462 break;
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1463 case TIFF_SLONG8:
31168
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1464 set_array_field_helper<int64NDArray> (tif, tag_id,
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1465 tag_ov.int64_array_value ());
31166
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1466 break;
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1467 case TIFF_FLOAT:
31168
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1468 set_array_field_helper<FloatNDArray> (tif, tag_id,
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1469 tag_ov.float_array_value ());
31166
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1470 break;
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1471 case TIFF_DOUBLE:
31168
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1472 set_array_field_helper<NDArray> (tif, tag_id,
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1473 tag_ov.array_value ());
31166
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1474 break;
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1475 case TIFF_SRATIONAL:
31168
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1476 set_array_field_helper<FloatNDArray> (tif, tag_id,
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1477 tag_ov.float_array_value ());
31166
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1478 break;
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1479 case TIFF_IFD:
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1480 case TIFF_IFD8:
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1481 error ("Unimplemented IFFD data type");
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1482 break;
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1483 default:
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1484 error ("Unsupported tag data type");
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1485 }
31165
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1486 }
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1487
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1488 void
31124
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1489 set_field_data (TIFF *tif, const TIFFField *fip, octave_value tag_ov)
31167
f91cd5ceaae6 Tiff setTag: added support for special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31166
diff changeset
1490 {
31124
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1491 uint32_t tag_id = TIFFFieldTag (fip);
31168
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1492
31165
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1493 switch (tag_id)
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1494 {
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1495 case TIFFTAG_YCBCRCOEFFICIENTS:
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1496 set_array_field_data (tif, fip, tag_ov, 3);
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1497 break;
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1498 case TIFFTAG_REFERENCEBLACKWHITE:
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1499 set_array_field_data (tif, fip, tag_ov, 6);
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1500 break;
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1501 case TIFFTAG_GRAYRESPONSECURVE:
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1502 {
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1503 uint16_t bits_per_sample;
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1504 if (! TIFFGetFieldDefaulted (tif, TIFFTAG_BITSPERSAMPLE,
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1505 &bits_per_sample))
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1506 error ("Failed to obtain the bit depth");
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1507
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1508 set_array_field_data (tif, fip, tag_ov, 1<<bits_per_sample);
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1509 break;
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1510 }
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1511 case TIFFTAG_COLORMAP:
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1512 {
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1513 uint16_t bits_per_sample;
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1514 if (! TIFFGetFieldDefaulted (tif, TIFFTAG_BITSPERSAMPLE,
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1515 &bits_per_sample))
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1516 error ("Failed to obtain the bit depth");
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1517
31168
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1518 if (! tag_ov.is_double_type ())
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1519 error ("Tag data must be double");
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1520
31165
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1521 // According to the format specification, this field should
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1522 // be 8 or 16 only.
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1523 if (bits_per_sample > 16)
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1524 error ("Too high bit depth for a palette image");
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1525
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1526 uint32_t count = 1 << bits_per_sample;
31168
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1527
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1528 if (tag_ov.is_scalar_type ()
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1529 || tag_ov.array_value ().dim1 () != count
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1530 || tag_ov.array_value ().dim2 () != 3)
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1531 error ("Expected matrix with %u rows and 3 columns", count);
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1532
31166
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1533 NDArray array_data = tag_ov.array_value ();
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1534 array_data *= UINT16_MAX;
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1535 uint16NDArray u16_array = uint16NDArray (array_data);
31168
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1536 const uint16_t *data_ptr
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1537 = reinterpret_cast<const uint16_t *> (u16_array.data ());
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1538 if (! TIFFSetField (tif, tag_id, data_ptr, data_ptr + count,
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1539 data_ptr + 2 * count))
31166
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1540 error ("Failed to set tag");
31165
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1541 break;
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1542 }
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1543 case TIFFTAG_TRANSFERFUNCTION:
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1544 {
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1545 uint16_t samples_per_pixel;
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1546 if (! TIFFGetFieldDefaulted (tif, TIFFTAG_SAMPLESPERPIXEL,
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1547 &samples_per_pixel))
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1548 error ("Failed to obtain the number of samples per pixel");
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1549
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1550 uint16_t bits_per_sample;
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1551 if (! TIFFGetFieldDefaulted (tif, TIFFTAG_BITSPERSAMPLE,
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1552 &bits_per_sample))
31167
f91cd5ceaae6 Tiff setTag: added support for special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31166
diff changeset
1553 error ("Failed to obtain the bit depth");
31165
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1554
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1555 uint32_t count = 1 << bits_per_sample;
31167
f91cd5ceaae6 Tiff setTag: added support for special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31166
diff changeset
1556
31168
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1557 // An intermediate variable is required for storing the return of
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1558 // uint16_array_value so that the object remains in scope and the
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1559 // pointer returned from data () is not a dangling pointer
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1560 uint16NDArray data_arr = tag_ov.uint16_array_value ();
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1561
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1562 if (data_arr.numel () != count)
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1563 error ("Tag data should be and array of %u elements", count);
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1564
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1565 const uint16_t *data_ptr
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1566 = reinterpret_cast<const uint16_t *> (data_arr.data ());
31165
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1567 if (samples_per_pixel == 1)
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1568 {
31167
f91cd5ceaae6 Tiff setTag: added support for special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31166
diff changeset
1569 if (! TIFFSetField (tif, tag_id, data_ptr))
f91cd5ceaae6 Tiff setTag: added support for special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31166
diff changeset
1570 error ("Failed to set field");
31165
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1571 }
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1572 else
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1573 {
31167
f91cd5ceaae6 Tiff setTag: added support for special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31166
diff changeset
1574 if (! TIFFSetField (tif, tag_id, data_ptr, data_ptr + count,
f91cd5ceaae6 Tiff setTag: added support for special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31166
diff changeset
1575 data_ptr + 2 * count))
f91cd5ceaae6 Tiff setTag: added support for special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31166
diff changeset
1576 error ("Failed to set field");
31165
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1577 }
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1578 break;
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1579 }
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1580 case TIFFTAG_PAGENUMBER:
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1581 case TIFFTAG_HALFTONEHINTS:
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1582 case TIFFTAG_DOTRANGE:
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1583 case TIFFTAG_YCBCRSUBSAMPLING:
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1584 {
31167
f91cd5ceaae6 Tiff setTag: added support for special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31166
diff changeset
1585 uint16NDArray array_data = tag_ov.uint16_array_value ();
31168
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1586 if (array_data.numel () != 2)
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1587 error ("Tag data should be an array with 2 elements");
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1588
31167
f91cd5ceaae6 Tiff setTag: added support for special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31166
diff changeset
1589 if (! TIFFSetField (tif, tag_id, array_data (0), array_data (1)))
f91cd5ceaae6 Tiff setTag: added support for special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31166
diff changeset
1590 error ("Failed to set field");
31165
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1591 break;
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1592 }
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1593 case TIFFTAG_SUBIFD:
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1594 {
31179
f294b800f002 Tiff.m: added tests for signed images and sub-directories.
magedrifaat <magedrifaat@gmail.com>
parents: 31178
diff changeset
1595 // Setting the SubIFD invloves setting their count only
f294b800f002 Tiff.m: added tests for signed images and sub-directories.
magedrifaat <magedrifaat@gmail.com>
parents: 31178
diff changeset
1596 // and the library will set the offsets correctly in
f294b800f002 Tiff.m: added tests for signed images and sub-directories.
magedrifaat <magedrifaat@gmail.com>
parents: 31178
diff changeset
1597 // the next calls to writeDirectory, but an array of offsets
f294b800f002 Tiff.m: added tests for signed images and sub-directories.
magedrifaat <magedrifaat@gmail.com>
parents: 31178
diff changeset
1598 // is still required so an array of zeroes is passed
31175
ed329571ec88 Tiff: added support for creating and reading sub-directories
magedrifaat <magedrifaat@gmail.com>
parents: 31174
diff changeset
1599 uint16_t subifd_count = tag_ov.uint16_scalar_value ();
ed329571ec88 Tiff: added support for creating and reading sub-directories
magedrifaat <magedrifaat@gmail.com>
parents: 31174
diff changeset
1600 std::unique_ptr<uint64_t []> subifd_offsets
ed329571ec88 Tiff: added support for creating and reading sub-directories
magedrifaat <magedrifaat@gmail.com>
parents: 31174
diff changeset
1601 = std::make_unique<uint64_t []> (subifd_count);
ed329571ec88 Tiff: added support for creating and reading sub-directories
magedrifaat <magedrifaat@gmail.com>
parents: 31174
diff changeset
1602 uint64_t *offfsets_ptr = subifd_offsets.get ();
ed329571ec88 Tiff: added support for creating and reading sub-directories
magedrifaat <magedrifaat@gmail.com>
parents: 31174
diff changeset
1603 if (! TIFFSetField (tif, tag_id, subifd_count, offfsets_ptr))
ed329571ec88 Tiff: added support for creating and reading sub-directories
magedrifaat <magedrifaat@gmail.com>
parents: 31174
diff changeset
1604 error ("Failed to set tag");
31165
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1605 break;
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1606 }
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1607 case TIFFTAG_EXTRASAMPLES:
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1608 {
31168
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1609 uint16_t samples_per_pixel;
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1610 if (! TIFFGetFieldDefaulted (tif, TIFFTAG_SAMPLESPERPIXEL,
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1611 &samples_per_pixel))
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1612 error ("Failed to obtain the number of samples per pixel");
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1613
31167
f91cd5ceaae6 Tiff setTag: added support for special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31166
diff changeset
1614 uint16NDArray data_array = tag_ov.uint16_array_value ();
31190
a91f2f79e58c Tiff: added internal handler for imread using the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31189
diff changeset
1615 // FIXME: this only works for RGB images. Need to handle grayscale,
a91f2f79e58c Tiff: added internal handler for imread using the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31189
diff changeset
1616 // palette, cmyk and ycbcr
31168
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1617 if (data_array.numel () > samples_per_pixel - 3)
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1618 error ("Failed to set field, too many values");
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1619
31167
f91cd5ceaae6 Tiff setTag: added support for special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31166
diff changeset
1620 if (! TIFFSetField (tif, tag_id,
31168
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1621 static_cast<uint16_t> (data_array.numel ()),
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1622 data_array.data ()))
31167
f91cd5ceaae6 Tiff setTag: added support for special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31166
diff changeset
1623 error ("Failed to set field");
31165
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1624 break;
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1625 }
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1626 case TIFFTAG_XMLPACKET:
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1627 case TIFFTAG_RICHTIFFIPTC:
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1628 case TIFFTAG_PHOTOSHOP:
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1629 case TIFFTAG_ICCPROFILE:
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1630 {
31186
90eccc78d958 __tiff__.cc (get_field_data, set_field_data): added support for complex tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31185
diff changeset
1631 uint8NDArray data_array = tag_ov.uint8_array_value ();
90eccc78d958 __tiff__.cc (get_field_data, set_field_data): added support for complex tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31185
diff changeset
1632 uint32_t count = data_array.numel ();
90eccc78d958 __tiff__.cc (get_field_data, set_field_data): added support for complex tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31185
diff changeset
1633 if (! TIFFSetField (tif, tag_id, count, data_array.data ()))
90eccc78d958 __tiff__.cc (get_field_data, set_field_data): added support for complex tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31185
diff changeset
1634 error ("Failed to set field");
31165
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1635 break;
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1636 }
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1637 // These tags are not mentioned in the LibTIFF documentation
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1638 // but are handled correctly by the library
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1639 case TIFFTAG_ZIPQUALITY:
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1640 case TIFFTAG_SGILOGDATAFMT:
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1641 case TIFFTAG_GRAYRESPONSEUNIT:
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1642 {
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1643 set_scalar_field_data (tif, fip, tag_ov);
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1644 break;
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1645 }
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1646 default:
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1647 set_scalar_field_data (tif, fip, tag_ov);
48d46f7a640b Tiff setTag: handled scalar tags with the correct data type.
magedrifaat <magedrifaat@gmail.com>
parents: 31164
diff changeset
1648 }
31166
b8b6cc05c8ea Tiff setTag: added support for tags with array values.
magedrifaat <magedrifaat@gmail.com>
parents: 31165
diff changeset
1649
31124
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1650 }
31153
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1651
31126
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1652 template <typename T>
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1653 void
31133
e9925d528428 Tiff writeEncodedStrip: used octave_value functions instead of type_name
magedrifaat <magedrifaat@gmail.com>
parents: 31131
diff changeset
1654 write_strip (TIFF *tif, uint32_t strip_no, T strip_data,
31126
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1655 tiff_image_data *image_data)
31133
e9925d528428 Tiff writeEncodedStrip: used octave_value functions instead of type_name
magedrifaat <magedrifaat@gmail.com>
parents: 31131
diff changeset
1656 {
31126
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1657 uint32_t rows_in_strip;
31127
0d9633ee715e Tiff: fixed a bug where the default value of some tags was ignored
magedrifaat <magedrifaat@gmail.com>
parents: 31126
diff changeset
1658 if (! TIFFGetFieldDefaulted (tif, TIFFTAG_ROWSPERSTRIP, &rows_in_strip))
31126
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1659 error ("Failed to obtain the RowsPerStrip tag");
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1660
31127
0d9633ee715e Tiff: fixed a bug where the default value of some tags was ignored
magedrifaat <magedrifaat@gmail.com>
parents: 31126
diff changeset
1661 // The tag has a default value of UINT32_MAX which means the entire
0d9633ee715e Tiff: fixed a bug where the default value of some tags was ignored
magedrifaat <magedrifaat@gmail.com>
parents: 31126
diff changeset
1662 // image, but we need to cap it to the height for later calculations
0d9633ee715e Tiff: fixed a bug where the default value of some tags was ignored
magedrifaat <magedrifaat@gmail.com>
parents: 31126
diff changeset
1663 if (rows_in_strip > image_data->height)
0d9633ee715e Tiff: fixed a bug where the default value of some tags was ignored
magedrifaat <magedrifaat@gmail.com>
parents: 31126
diff changeset
1664 rows_in_strip = image_data->height;
0d9633ee715e Tiff: fixed a bug where the default value of some tags was ignored
magedrifaat <magedrifaat@gmail.com>
parents: 31126
diff changeset
1665
31153
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1666 // LibTIFF uses zero-based indexing as opposed to Octave's 1-based
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1667 strip_no--;
31126
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1668
31153
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1669 uint32_t strip_count = TIFFNumberOfStrips (tif);
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1670 rows_in_strip = get_rows_in_strip (strip_no, strip_count,
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1671 rows_in_strip, image_data);
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1672
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1673 dim_vector strip_dimensions;
31126
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1674 if (image_data->planar_configuration == PLANARCONFIG_CONTIG)
31153
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1675 strip_dimensions = dim_vector (rows_in_strip, image_data->width,
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1676 image_data->samples_per_pixel);
31126
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1677 else if (image_data->planar_configuration == PLANARCONFIG_SEPARATE)
31153
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1678 strip_dimensions = dim_vector (rows_in_strip, image_data->width, 1);
31126
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1679 else
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1680 error ("Planar configuration not supported");
31145
2e11f9cb30b8 Tiff writeEncodedStrip: added warning for input data larger than the size of the strip.
magedrifaat <magedrifaat@gmail.com>
parents: 31144
diff changeset
1681
2e11f9cb30b8 Tiff writeEncodedStrip: added warning for input data larger than the size of the strip.
magedrifaat <magedrifaat@gmail.com>
parents: 31144
diff changeset
1682 if (strip_data.dim1 () > rows_in_strip)
31146
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1683 warning ("The strip is composed of %u rows but the input has %ld rows.",
31145
2e11f9cb30b8 Tiff writeEncodedStrip: added warning for input data larger than the size of the strip.
magedrifaat <magedrifaat@gmail.com>
parents: 31144
diff changeset
1684 rows_in_strip,
2e11f9cb30b8 Tiff writeEncodedStrip: added warning for input data larger than the size of the strip.
magedrifaat <magedrifaat@gmail.com>
parents: 31144
diff changeset
1685 strip_data.dim1 ());
31137
233130c0b1f6 Tiff writeEncodedStrip: changed strip dimension check behavior to mimic matlab
magedrifaat <magedrifaat@gmail.com>
parents: 31136
diff changeset
1686
31145
2e11f9cb30b8 Tiff writeEncodedStrip: added warning for input data larger than the size of the strip.
magedrifaat <magedrifaat@gmail.com>
parents: 31144
diff changeset
1687 if (strip_data.dim2 () > image_data->width)
31146
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1688 warning ("The image width is %u but the input has %ld columns.",
31145
2e11f9cb30b8 Tiff writeEncodedStrip: added warning for input data larger than the size of the strip.
magedrifaat <magedrifaat@gmail.com>
parents: 31144
diff changeset
1689 image_data->width,
2e11f9cb30b8 Tiff writeEncodedStrip: added warning for input data larger than the size of the strip.
magedrifaat <magedrifaat@gmail.com>
parents: 31144
diff changeset
1690 strip_data.dim2 ());
2e11f9cb30b8 Tiff writeEncodedStrip: added warning for input data larger than the size of the strip.
magedrifaat <magedrifaat@gmail.com>
parents: 31144
diff changeset
1691
2e11f9cb30b8 Tiff writeEncodedStrip: added warning for input data larger than the size of the strip.
magedrifaat <magedrifaat@gmail.com>
parents: 31144
diff changeset
1692 if (strip_data.ndims () > 2)
2e11f9cb30b8 Tiff writeEncodedStrip: added warning for input data larger than the size of the strip.
magedrifaat <magedrifaat@gmail.com>
parents: 31144
diff changeset
1693 {
2e11f9cb30b8 Tiff writeEncodedStrip: added warning for input data larger than the size of the strip.
magedrifaat <magedrifaat@gmail.com>
parents: 31144
diff changeset
1694 if (image_data->planar_configuration == PLANARCONFIG_CONTIG
2e11f9cb30b8 Tiff writeEncodedStrip: added warning for input data larger than the size of the strip.
magedrifaat <magedrifaat@gmail.com>
parents: 31144
diff changeset
1695 && strip_data.dim3 () > image_data->samples_per_pixel)
31146
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1696 warning ("The strip is composed of %u channels but the input has %ld channels.",
31145
2e11f9cb30b8 Tiff writeEncodedStrip: added warning for input data larger than the size of the strip.
magedrifaat <magedrifaat@gmail.com>
parents: 31144
diff changeset
1697 image_data->samples_per_pixel,
2e11f9cb30b8 Tiff writeEncodedStrip: added warning for input data larger than the size of the strip.
magedrifaat <magedrifaat@gmail.com>
parents: 31144
diff changeset
1698 strip_data.dim3 ());
2e11f9cb30b8 Tiff writeEncodedStrip: added warning for input data larger than the size of the strip.
magedrifaat <magedrifaat@gmail.com>
parents: 31144
diff changeset
1699 else if (image_data->planar_configuration == PLANARCONFIG_SEPARATE
2e11f9cb30b8 Tiff writeEncodedStrip: added warning for input data larger than the size of the strip.
magedrifaat <magedrifaat@gmail.com>
parents: 31144
diff changeset
1700 && strip_data.dim3 () > 1)
31146
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1701 warning ("The strip is composed of %u channel but the input has %ld channels.",
31145
2e11f9cb30b8 Tiff writeEncodedStrip: added warning for input data larger than the size of the strip.
magedrifaat <magedrifaat@gmail.com>
parents: 31144
diff changeset
1702 1, strip_data.dim3 ());
2e11f9cb30b8 Tiff writeEncodedStrip: added warning for input data larger than the size of the strip.
magedrifaat <magedrifaat@gmail.com>
parents: 31144
diff changeset
1703 }
2e11f9cb30b8 Tiff writeEncodedStrip: added warning for input data larger than the size of the strip.
magedrifaat <magedrifaat@gmail.com>
parents: 31144
diff changeset
1704
31137
233130c0b1f6 Tiff writeEncodedStrip: changed strip dimension check behavior to mimic matlab
magedrifaat <magedrifaat@gmail.com>
parents: 31136
diff changeset
1705 strip_data.resize (strip_dimensions);
31126
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1706
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1707 // Permute the dimesions of the strip to match the expected memory
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1708 // arrangement of LibTIFF (channel x width x height)
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1709 Array<octave_idx_type> perm (dim_vector (3, 1));
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1710 perm(0) = 2;
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1711 perm(1) = 1;
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1712 perm(2) = 0;
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1713 strip_data = strip_data.permute (perm);
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1714
31168
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1715 uint8_t *data_u8
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1716 = reinterpret_cast<uint8_t *> (strip_data.fortran_vec ());
31144
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1717 if (image_data->bits_per_sample == 8
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1718 || image_data->bits_per_sample == 16
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1719 || image_data->bits_per_sample == 32
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1720 || image_data->bits_per_sample == 64)
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1721 {
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1722 // Can't rely on LibTIFF's TIFFStripSize because boundary strips
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1723 // can be smaller in size
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1724 tsize_t strip_size = strip_data.numel ()
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1725 * image_data->bits_per_sample / 8;
31168
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1726 if (TIFFWriteEncodedStrip (tif, strip_no, data_u8, strip_size) == -1)
31144
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1727 error ("Failed to write strip data to image");
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1728
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1729 }
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1730 else if (image_data->bits_per_sample == 1)
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1731 {
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1732 if (image_data->samples_per_pixel != 1)
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1733 error ("Bi-Level images must have one channel only");
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1734
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1735 // Create a buffer to hold the packed strip data
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1736 // Unique pointers are faster than vectors for constant size buffers
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1737 std::unique_ptr<uint8_t []> strip_ptr
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1738 = std::make_unique<uint8_t []> (TIFFStripSize (tif));
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1739 uint8_t *strip_buf = strip_ptr.get ();
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1740 // According to the format specification, the row should be byte
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1741 // aligned so the number of bytes is rounded up to the nearest byte
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1742 uint32_t padded_width = (image_data->width + 7) / 8;
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1743 // Packing the pixel data into bits
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1744 for (uint32_t row = 0; row < rows_in_strip; row++)
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1745 {
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1746 for (uint32_t col = 0; col < image_data->width; col++)
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1747 {
31183
6ab628dfe2a0 __tif__.cc: added support for BiLevel Images with reversed bit ordering.
magedrifaat <magedrifaat@gmail.com>
parents: 31182
diff changeset
1748 uint8_t shift = col % 8;
6ab628dfe2a0 __tif__.cc: added support for BiLevel Images with reversed bit ordering.
magedrifaat <magedrifaat@gmail.com>
parents: 31182
diff changeset
1749 if (TIFFIsMSB2LSB (tif))
6ab628dfe2a0 __tif__.cc: added support for BiLevel Images with reversed bit ordering.
magedrifaat <magedrifaat@gmail.com>
parents: 31182
diff changeset
1750 shift = 7 - shift;
31144
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1751 strip_buf[row * padded_width + col / 8] |= data_u8[col] << shift;
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1752 }
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1753 data_u8 += image_data->width;
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1754 }
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1755 tsize_t strip_size = padded_width * rows_in_strip;
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1756 if (TIFFWriteEncodedStrip (tif, strip_no, strip_buf, strip_size) == -1)
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1757 error ("Failed to write strip data to image");
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1758 }
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1759 else
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1760 {
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1761 error ("Unsupported bit depth");
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1762 }
31126
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1763 }
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1764
31146
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1765 template <typename T>
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1766 void
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1767 write_tile (TIFF *tif, uint32_t tile_no, T tile_data,
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1768 tiff_image_data *image_data)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1769 {
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1770 uint32_t tile_width, tile_height;
31180
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
1771 get_tile_dimensions_validated (tif, tile_width, tile_height);
31146
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1772
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1773 if (tile_no < 1 || tile_no > TIFFNumberOfTiles (tif))
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1774 error ("Tile number out of bounds");
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1775
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1776 if (tile_data.dim1 () > tile_height)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1777 warning ("The tile is composed of %u rows but input has %ld rows",
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1778 tile_height, tile_data.dim1 ());
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1779 if (tile_data.dim2 () > tile_width)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1780 warning ("The tile is composed of %u columns but input has %ld columns",
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1781 tile_width, tile_data.dim2 ());
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1782 if (tile_data.ndims () > 2)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1783 {
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1784 if (image_data->planar_configuration == PLANARCONFIG_CONTIG
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1785 && tile_data.dim3 () > image_data->samples_per_pixel)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1786 warning ("The tile is composed of %u channels but input has %ld channels",
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1787 image_data->samples_per_pixel, tile_data.dim3 ());
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1788 else if (image_data->planar_configuration == PLANARCONFIG_SEPARATE
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1789 && tile_data.dim3 () > 1)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1790 warning ("The tile is composed of %u channels but input has %ld channels",
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1791 1, tile_data.dim3 ());
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1792 }
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1793
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1794 dim_vector tile_dimensions;
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1795 if (image_data->planar_configuration == PLANARCONFIG_CONTIG)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1796 tile_dimensions = dim_vector (tile_height, tile_width,
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1797 image_data->samples_per_pixel);
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1798 else if (image_data->planar_configuration == PLANARCONFIG_SEPARATE)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1799 tile_dimensions = dim_vector (tile_height, tile_width, 1);
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1800 else
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1801 error ("Planar configuration not supported");
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1802
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1803 tile_data.resize (tile_dimensions);
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1804 Array<octave_idx_type> perm (dim_vector (3, 1));
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1805 perm(0) = 2;
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1806 perm(1) = 1;
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1807 perm(2) = 0;
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1808 tile_data = tile_data.permute (perm);
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1809
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1810 // Octave indexing is 1-based while LibTIFF is zero-based
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1811 tile_no--;
31168
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1812 uint8_t *data_u8 = reinterpret_cast<uint8_t *> (tile_data.fortran_vec ());
31146
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1813 if (image_data->bits_per_sample == 8
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1814 || image_data->bits_per_sample == 16
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1815 || image_data->bits_per_sample == 32
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1816 || image_data->bits_per_sample == 64)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1817 {
31168
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
1818 if (TIFFWriteEncodedTile (tif, tile_no, data_u8,
31146
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1819 TIFFTileSize (tif)) == -1)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1820 error ("Failed to write tile data to image");
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1821
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1822 }
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1823 else if (image_data->bits_per_sample == 1)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1824 {
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1825 if (image_data->samples_per_pixel != 1)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1826 error ("Bi-Level images must have one channel only");
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1827
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1828 // Create a buffer to hold the packed tile data
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1829 // Unique pointers are faster than vectors for constant size buffers
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1830 std::unique_ptr<uint8_t []> tile_ptr
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1831 = std::make_unique<uint8_t []> (TIFFTileSize (tif));
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1832 uint8_t *tile_buf = tile_ptr.get ();
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1833 // Packing the pixel data into bits
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1834 for (uint32_t row = 0; row < tile_height; row++)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1835 {
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1836 for (uint32_t col = 0; col < tile_width; col++)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1837 {
31183
6ab628dfe2a0 __tif__.cc: added support for BiLevel Images with reversed bit ordering.
magedrifaat <magedrifaat@gmail.com>
parents: 31182
diff changeset
1838 uint8_t shift = col % 8;
6ab628dfe2a0 __tif__.cc: added support for BiLevel Images with reversed bit ordering.
magedrifaat <magedrifaat@gmail.com>
parents: 31182
diff changeset
1839 if (TIFFIsMSB2LSB (tif))
6ab628dfe2a0 __tif__.cc: added support for BiLevel Images with reversed bit ordering.
magedrifaat <magedrifaat@gmail.com>
parents: 31182
diff changeset
1840 shift = 7 - shift;
31146
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1841 tile_buf[row * tile_width/8 + col/8] |= data_u8[col] << shift;
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1842 }
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1843 data_u8 += tile_width;
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1844 }
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1845 if (TIFFWriteEncodedTile (tif, tile_no, tile_buf,
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1846 TIFFTileSize (tif)) == -1)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1847 error ("Failed to write tile data to image");
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1848 }
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1849 else
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1850 {
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1851 error ("Unsupported bit depth");
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1852 }
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1853 }
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1854
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1855 template <typename T>
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1856 void
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1857 write_strip_or_tile (TIFF *tif, uint32_t strip_tile_no, T strip_data,
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1858 tiff_image_data *image_data)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1859 {
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1860 if (image_data->is_tiled)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1861 write_tile<T> (tif, strip_tile_no, strip_data, image_data);
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1862 else
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1863 write_strip<T> (tif, strip_tile_no, strip_data, image_data);
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1864 }
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1865
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1866 void
31178
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1867 write_unsigned_strip_or_tile (TIFF *tif, uint32_t strip_tile_no,
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1868 octave_value data_ov,
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1869 tiff_image_data *image_data)
31146
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1870 {
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1871 switch (image_data->bits_per_sample)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1872 {
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1873 case 1:
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1874 // We need to check for both scalar and matrix types to handle single
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1875 // element strip
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1876 if (data_ov.is_bool_scalar () || data_ov.is_bool_matrix ())
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1877 write_strip_or_tile<boolNDArray> (tif, strip_tile_no,
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1878 data_ov.bool_array_value (),
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1879 image_data);
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1880 else
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1881 error ("Expected logical matrix for BiLevel image");
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1882 break;
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1883 case 8:
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1884 if (data_ov.is_uint8_type ())
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1885 write_strip_or_tile<uint8NDArray> (tif, strip_tile_no,
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1886 data_ov.uint8_array_value (),
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1887 image_data);
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1888 else
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1889 error ("Only uint8 data is allowed for uint images with bit depth of 8");
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1890 break;
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1891 case 16:
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1892 if (data_ov.is_uint16_type ())
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1893 write_strip_or_tile<uint16NDArray> (tif, strip_tile_no,
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1894 data_ov.uint16_array_value (),
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1895 image_data);
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1896 else
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1897 error ("Only uint16 data is allowed for uint images with bit depth of 16");
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1898 break;
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1899 case 32:
31178
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1900 if (data_ov.is_uint32_type ())
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1901 write_strip_or_tile<uint32NDArray> (tif, strip_tile_no,
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1902 data_ov.uint32_array_value (),
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1903 image_data);
31146
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1904 else
31178
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1905 error ("Only uint32 data is allowed for uint images with bit depth of 32");
31146
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1906 break;
31178
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1907 case 64:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1908 if (data_ov.is_uint64_type ())
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1909 write_strip_or_tile<uint64NDArray> (tif, strip_tile_no,
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1910 data_ov.uint64_array_value (),
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1911 image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1912 else
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1913 error ("Only uint64 data is allowed for uint images with bit depth of 64");
31146
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1914 break;
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1915 default:
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1916 error ("Unsupported bit depth");
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1917 }
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1918 }
31178
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1919
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1920 void
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1921 write_signed_strip_or_tile (TIFF *tif, uint32_t strip_tile_no,
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1922 octave_value data_ov,
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1923 tiff_image_data *image_data)
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1924 {
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1925 switch (image_data->bits_per_sample)
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1926 {
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1927 case 8:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1928 if (data_ov.is_int8_type ())
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1929 write_strip_or_tile<int8NDArray> (tif, strip_tile_no,
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1930 data_ov.int8_array_value (),
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1931 image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1932 else
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1933 error ("Only int8 data is allowed for int images with bit depth of 8");
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1934 break;
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1935 case 16:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1936 if (data_ov.is_int16_type ())
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1937 write_strip_or_tile<int16NDArray> (tif, strip_tile_no,
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1938 data_ov.int16_array_value (),
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1939 image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1940 else
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1941 error ("Only int16 data is allowed for int images with bit depth of 16");
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1942 break;
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1943 case 32:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1944 if (data_ov.is_int32_type ())
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1945 write_strip_or_tile<int32NDArray> (tif, strip_tile_no,
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1946 data_ov.int32_array_value (),
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1947 image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1948 else
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1949 error ("Only int32 data is allowed for int images with bit depth of 32");
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1950 break;
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1951 case 64:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1952 if (data_ov.is_int64_type ())
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1953 write_strip_or_tile<int64NDArray> (tif, strip_tile_no,
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1954 data_ov.int64_array_value (),
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1955 image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1956 else
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1957 error ("Only int64 data is allowed for int images with bit depth of 64");
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1958 break;
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1959 default:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1960 error ("Unsupported bit depth for signed images");
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1961 }
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1962 }
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1963
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1964 void
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1965 write_float_strip_or_tile (TIFF *tif, uint32_t strip_tile_no,
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1966 octave_value data_ov,
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1967 tiff_image_data *image_data)
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1968 {
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1969 switch (image_data->bits_per_sample)
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1970 {
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1971 case 32:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1972 if (data_ov.is_single_type () || data_ov.is_double_type ())
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1973 write_strip_or_tile<FloatNDArray> (tif, strip_tile_no,
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1974 data_ov.float_array_value (),
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1975 image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1976 else
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1977 error ("Only single and double data are allowed for floating-point images");
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1978 break;
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1979 case 64:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1980 if (data_ov.is_single_type () || data_ov.is_double_type ())
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1981 write_strip_or_tile<NDArray> (tif, strip_tile_no,
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1982 data_ov.array_value (),
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1983 image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1984 else
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1985 error ("Only single and double data are allowed for floating-point images");
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1986 break;
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1987 default:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1988 error ("Unsupported bit depth for floating-point images");
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1989 }
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1990 }
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1991
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1992 void
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1993 handle_write_strip_or_tile (TIFF *tif, uint32_t strip_tile_no,
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1994 octave_value data_ov,
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1995 tiff_image_data *image_data)
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1996 {
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1997
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1998 // SampleFormat tag is not a required field and has a default value of 1
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
1999 // So we need to use TIFFGetFieldDefaulted in case it is not present in
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2000 // the file
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2001 uint16_t sample_format;
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2002 if (! TIFFGetFieldDefaulted(tif, TIFFTAG_SAMPLEFORMAT, &sample_format))
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2003 error ("Failed to obtain a value for sample format");
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2004
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2005 switch (sample_format)
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2006 {
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2007 case 1:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2008 case 4:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2009 write_unsigned_strip_or_tile (tif, strip_tile_no, data_ov,
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2010 image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2011 break;
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2012 case 2:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2013 write_signed_strip_or_tile (tif, strip_tile_no, data_ov, image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2014 break;
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2015 case 3:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2016 write_float_strip_or_tile (tif, strip_tile_no, data_ov, image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2017 break;
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2018 default:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2019 error ("Unsupported sample format");
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2020 }
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2021 }
31146
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
2022
31153
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2023 template <typename T>
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2024 void
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2025 write_stripped_image (TIFF *tif, T pixel_data, tiff_image_data *image_data)
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2026 {
31164
3155aa74c62e Tiff write: modified handling incorrect dimensions to match matlab.
magedrifaat <magedrifaat@gmail.com>
parents: 31163
diff changeset
2027 // ASSUMES pixel data dimensions are already validated
31153
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2028
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2029 typedef typename T::element_type P;
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2030
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2031 // Permute pixel data to be aligned in memory to the way LibTIFF
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2032 // expects the data to be (i.e. channel x width x height for chunky
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2033 // and width x height x channel for separate planes)
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2034 Array<octave_idx_type> perm (dim_vector (3, 1));
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2035 if (image_data->planar_configuration == PLANARCONFIG_SEPARATE)
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2036 {
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2037 perm(0) = 1;
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2038 perm(1) = 0;
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2039 perm(2) = 2;
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2040 }
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2041 else
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2042 {
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2043 perm(0) = 2;
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2044 perm(1) = 1;
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2045 perm(2) = 0;
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2046 }
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2047 pixel_data = pixel_data.permute (perm);
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2048
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2049 uint32_t row_per_strip;
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2050 if (! TIFFGetFieldDefaulted (tif, TIFFTAG_ROWSPERSTRIP, &row_per_strip))
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2051 error ("Failed to obtain the RowPerStrip tag");
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2052
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2053 // The default value is INT_MAX so we need to cap it to the image height
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2054 if (row_per_strip > image_data->height)
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2055 row_per_strip = image_data->height;
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2056
31168
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
2057 uint8_t *pixel_fvec
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
2058 = reinterpret_cast<uint8_t *> (pixel_data.fortran_vec ());
31153
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2059 uint32_t strip_count = TIFFNumberOfStrips (tif);
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2060 tsize_t strip_size;
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2061 uint32_t rows_in_strip;
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2062 for (uint32_t strip = 0; strip < strip_count; strip++)
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2063 {
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2064 rows_in_strip = get_rows_in_strip (strip, strip_count,
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2065 row_per_strip, image_data);
31154
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
2066 if (image_data->bits_per_sample == 8
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
2067 || image_data->bits_per_sample == 16
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
2068 || image_data->bits_per_sample == 32
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
2069 || image_data->bits_per_sample == 64)
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
2070 {
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
2071 strip_size = rows_in_strip * image_data->width * sizeof (P);
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
2072 if (image_data->planar_configuration == PLANARCONFIG_CONTIG)
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
2073 strip_size *= image_data->samples_per_pixel;
31186
90eccc78d958 __tiff__.cc (get_field_data, set_field_data): added support for complex tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31185
diff changeset
2074 if (TIFFWriteEncodedStrip (tif, strip, pixel_fvec, strip_size) == -1)
90eccc78d958 __tiff__.cc (get_field_data, set_field_data): added support for complex tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31185
diff changeset
2075 error ("Failed to write strip data");
31154
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
2076 pixel_fvec += strip_size;
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
2077 }
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
2078 else if (image_data->bits_per_sample == 1)
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
2079 {
31156
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
2080 if (image_data->samples_per_pixel != 1)
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
2081 error ("Bi-Level images must have one channel only");
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
2082
31154
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
2083 // Create a buffer to hold the packed strip data
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
2084 // Unique pointers are faster than vectors for constant size buffers
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
2085 std::unique_ptr<uint8_t []> strip_ptr
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
2086 = std::make_unique<uint8_t []> (TIFFStripSize (tif));
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
2087 uint8_t *strip_buf = strip_ptr.get ();
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
2088 // According to the format specification, the row should be byte
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
2089 // aligned so the number of bytes is rounded up to the nearest byte
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
2090 uint32_t padded_width = (image_data->width + 7) / 8;
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
2091 // Packing the pixel data into bits
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
2092 for (uint32_t row = 0; row < rows_in_strip; row++)
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
2093 {
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
2094 for (uint32_t col = 0; col < image_data->width; col++)
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
2095 {
31183
6ab628dfe2a0 __tif__.cc: added support for BiLevel Images with reversed bit ordering.
magedrifaat <magedrifaat@gmail.com>
parents: 31182
diff changeset
2096 uint8_t shift = col % 8;
6ab628dfe2a0 __tif__.cc: added support for BiLevel Images with reversed bit ordering.
magedrifaat <magedrifaat@gmail.com>
parents: 31182
diff changeset
2097 if (TIFFIsMSB2LSB (tif))
6ab628dfe2a0 __tif__.cc: added support for BiLevel Images with reversed bit ordering.
magedrifaat <magedrifaat@gmail.com>
parents: 31182
diff changeset
2098 shift = 7 - shift;
31154
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
2099 strip_buf[row * padded_width + col / 8]
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
2100 |= pixel_fvec[col] << shift;
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
2101 }
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
2102 pixel_fvec += image_data->width;
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
2103 }
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
2104 strip_size = padded_width * rows_in_strip;
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
2105 if (TIFFWriteEncodedStrip (tif, strip, strip_buf, strip_size) == -1)
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
2106 error ("Failed to write strip data to image");
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
2107 }
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
2108 else
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
2109 error ("Unsupported bit depth");
31153
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2110 }
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2111 }
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2112
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2113 template <typename T>
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2114 void
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2115 write_tiled_image (TIFF *tif, T pixel_data, tiff_image_data *image_data)
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2116 {
31164
3155aa74c62e Tiff write: modified handling incorrect dimensions to match matlab.
magedrifaat <magedrifaat@gmail.com>
parents: 31163
diff changeset
2117 // ASSUMES pixel data dimensions are already validated
31153
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2118
31155
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2119 uint32_t tile_width, tile_height;
31180
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
2120 get_tile_dimensions_validated (tif, tile_width, tile_height);
31155
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2121
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2122 uint32_t tiles_across = (image_data->width + tile_width - 1)
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2123 / tile_width;
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2124 uint32_t tiles_down = (image_data->height + tile_height - 1)
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2125 / tile_height;
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2126
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2127 // Resize the image data to add tile padding
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2128 dim_vector padded_dims (tiles_down * tile_height,
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2129 tiles_across * tile_width,
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2130 image_data->samples_per_pixel);
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2131 pixel_data.resize (padded_dims);
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2132
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2133 // Reshape the image to separate tiles into their own dimension
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2134 // so we can permute them to the right order
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2135 dim_vector tiled_dims (tile_height, tiles_down, tile_width, tiles_across,
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2136 image_data->samples_per_pixel);
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2137 pixel_data = pixel_data.reshape (tiled_dims);
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2138
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2139 // Permute the dimesnions to get the memory alignment to match LibTIFF
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2140 Array<octave_idx_type> perm (dim_vector (5, 1));
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2141 if (image_data->planar_configuration == PLANARCONFIG_SEPARATE)
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2142 {
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2143 // For separate planes, the data coming from libtiff will have all
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2144 // tiles of the first sample then all tiles of the second sample
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2145 // and so on. Tiles of each sample will be ordered from left to right
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2146 // and from top to bottom. And data inside each tile is organised as
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2147 // rows and each row contains columns.
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2148 // So the order for LibTIFF is:
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2149 // samples x tiles_down x tiles_across x tile_height x tile_width
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2150 // But memory orientation of Octave arrays is reversed so we set it to
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2151 // tile_width x tile_height x tiles_across x tiles_down x samples
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2152 perm(0) = 2;
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2153 perm(1) = 0;
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2154 perm(2) = 3;
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2155 perm(3) = 1;
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2156 perm(4) = 4;
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2157 }
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2158 else
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2159 {
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2160 // For chunky planes, the data coming from libtiff will be ordered
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2161 // from left to right and from top to bottom. And data inside each
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2162 // tile is organised as rows and each row contains columns and each
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2163 // column contains samples.
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2164 // So the order for LibTIFF is:
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2165 // tiles_down x tiles_across x tile_height x tile_width x samples
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2166 // But memory orientation of Octave arrays is reversed so we set it to
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2167 // samples x tile_width x tile_height x tiles_across x tiles_down
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2168 perm(0) = 4;
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2169 perm(1) = 2;
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2170 perm(2) = 0;
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2171 perm(3) = 3;
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2172 perm(4) = 1;
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2173 }
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2174 pixel_data = pixel_data.permute (perm);
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2175
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2176 uint8_t *pixel_fvec
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2177 = reinterpret_cast<uint8_t *> (pixel_data.fortran_vec ());
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2178 uint32_t tile_count = TIFFNumberOfTiles (tif);
31156
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
2179 tsize_t tile_size = TIFFTileSize (tif);
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
2180
31155
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2181 for (uint32_t tile = 0; tile <tile_count; tile++)
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2182 {
31156
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
2183 if (image_data->bits_per_sample == 8
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
2184 || image_data->bits_per_sample == 16
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
2185 || image_data->bits_per_sample == 32
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
2186 || image_data->bits_per_sample == 64)
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
2187 {
31186
90eccc78d958 __tiff__.cc (get_field_data, set_field_data): added support for complex tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31185
diff changeset
2188 if (TIFFWriteEncodedTile (tif, tile, pixel_fvec, tile_size) == -1)
31156
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
2189 error ("Failed to write tile data");
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
2190 pixel_fvec += tile_size;
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
2191 }
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
2192 else if (image_data->bits_per_sample == 1)
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
2193 {
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
2194 if (image_data->samples_per_pixel != 1)
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
2195 error ("Bi-Level images must have one channel only");
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
2196
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
2197 // Create a buffer to hold the packed tile data
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
2198 // Unique pointers are faster than vectors for
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
2199 // constant size buffers
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
2200 std::unique_ptr<uint8_t []> tile_ptr
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
2201 = std::make_unique<uint8_t []> (tile_size);
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
2202 uint8_t *tile_buf = tile_ptr.get ();
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
2203 // Packing the pixel data into bits
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
2204 for (uint32_t row = 0; row < tile_height; row++)
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
2205 {
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
2206 for (uint32_t col = 0; col < tile_width; col++)
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
2207 {
31183
6ab628dfe2a0 __tif__.cc: added support for BiLevel Images with reversed bit ordering.
magedrifaat <magedrifaat@gmail.com>
parents: 31182
diff changeset
2208 uint8_t shift = col % 8;
6ab628dfe2a0 __tif__.cc: added support for BiLevel Images with reversed bit ordering.
magedrifaat <magedrifaat@gmail.com>
parents: 31182
diff changeset
2209 if (TIFFIsMSB2LSB (tif))
6ab628dfe2a0 __tif__.cc: added support for BiLevel Images with reversed bit ordering.
magedrifaat <magedrifaat@gmail.com>
parents: 31182
diff changeset
2210 shift = 7 - shift;
31156
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
2211 tile_buf[row * tile_width / 8 + col / 8]
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
2212 |= pixel_fvec[col] << shift;
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
2213 }
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
2214 pixel_fvec += tile_width;
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
2215 }
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
2216 if (TIFFWriteEncodedTile (tif, tile, tile_buf,
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
2217 TIFFTileSize (tif)) == -1)
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
2218 error ("Failed to write tile data to image");
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
2219 }
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
2220 else
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
2221 error ("Unsupported bit depth");
31155
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2222 }
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
2223
31153
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2224 }
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2225
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2226 template <typename T>
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2227 void
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2228 write_image (TIFF *tif, T pixel_data, tiff_image_data *image_data)
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2229 {
31168
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
2230 // This dimensions checking is intentially done in this non-homogeneous
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
2231 // way for matlab compatibility.
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
2232 // In Matlab R2022a, If the width or height of the input matrix is less
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
2233 // than needed, the data is silently padded with zeroes to fit.
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
2234 // If the width is larger than needed, a warning is issued and the excess
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
2235 // data is truncated. If the height is larger than needed, no warning is
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
2236 // issued and the image data is wrong. If the number of channels is less
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
2237 // or more than needed an error is produced.
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
2238 // We chose to deviate from matlab in the larger height case to avoid
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
2239 // errors resulting from silently corrupting image data, a warning is
27ed758c1688 Tiff setTag: fixed bug for rational tags and special-case tags.
magedrifaat <magedrifaat@gmail.com>
parents: 31167
diff changeset
2240 // produced instead.
31164
3155aa74c62e Tiff write: modified handling incorrect dimensions to match matlab.
magedrifaat <magedrifaat@gmail.com>
parents: 31163
diff changeset
2241 if ((image_data->samples_per_pixel > 1 && pixel_data.ndims () < 3)
31153
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2242 || (pixel_data.ndims () > 2
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2243 && image_data->samples_per_pixel != pixel_data.dim3 ()))
31164
3155aa74c62e Tiff write: modified handling incorrect dimensions to match matlab.
magedrifaat <magedrifaat@gmail.com>
parents: 31163
diff changeset
2244 error ("Incorrect number of channels, expected %u",
3155aa74c62e Tiff write: modified handling incorrect dimensions to match matlab.
magedrifaat <magedrifaat@gmail.com>
parents: 31163
diff changeset
2245 image_data->samples_per_pixel);
3155aa74c62e Tiff write: modified handling incorrect dimensions to match matlab.
magedrifaat <magedrifaat@gmail.com>
parents: 31163
diff changeset
2246
3155aa74c62e Tiff write: modified handling incorrect dimensions to match matlab.
magedrifaat <magedrifaat@gmail.com>
parents: 31163
diff changeset
2247 if (pixel_data.dim1 () > image_data->height)
3155aa74c62e Tiff write: modified handling incorrect dimensions to match matlab.
magedrifaat <magedrifaat@gmail.com>
parents: 31163
diff changeset
2248 warning ("Input has more rows than the image length, data will be truncated");
3155aa74c62e Tiff write: modified handling incorrect dimensions to match matlab.
magedrifaat <magedrifaat@gmail.com>
parents: 31163
diff changeset
2249 if (pixel_data.dim2 () > image_data->width)
3155aa74c62e Tiff write: modified handling incorrect dimensions to match matlab.
magedrifaat <magedrifaat@gmail.com>
parents: 31163
diff changeset
2250 warning ("Input has more columns than the image width, data will be truncated");
3155aa74c62e Tiff write: modified handling incorrect dimensions to match matlab.
magedrifaat <magedrifaat@gmail.com>
parents: 31163
diff changeset
2251
3155aa74c62e Tiff write: modified handling incorrect dimensions to match matlab.
magedrifaat <magedrifaat@gmail.com>
parents: 31163
diff changeset
2252 pixel_data.resize (dim_vector (image_data->height, image_data->width,
3155aa74c62e Tiff write: modified handling incorrect dimensions to match matlab.
magedrifaat <magedrifaat@gmail.com>
parents: 31163
diff changeset
2253 image_data->samples_per_pixel));
31153
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2254
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2255 if (image_data->is_tiled)
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2256 write_tiled_image<T> (tif, pixel_data, image_data);
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2257 else
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2258 write_stripped_image<T> (tif, pixel_data, image_data);
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2259
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2260 }
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2261
31178
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2262 void
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2263 write_unsigned_image (TIFF *tif, octave_value image_ov,
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2264 tiff_image_data *image_data)
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2265 {
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2266 switch (image_data->bits_per_sample)
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2267 {
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2268 case 1:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2269 // We need to check for both scalar and matrix types to handle single
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2270 // pixel image
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2271 if (image_ov.is_bool_scalar () || image_ov.is_bool_matrix ())
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2272 write_image<boolNDArray> (tif, image_ov.bool_array_value (),
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2273 image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2274 else
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2275 error ("Expected logical matrix for BiLevel image");
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2276 break;
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2277 case 8:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2278 if (image_ov.is_uint8_type ())
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2279 write_image<uint8NDArray> (tif, image_ov.uint8_array_value (),
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2280 image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2281 else
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2282 error ("Only uint8 data is allowed for uint images with bit depth of 8");
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2283 break;
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2284 case 16:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2285 if (image_ov.is_uint16_type ())
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2286 write_image<uint16NDArray> (tif, image_ov.uint16_array_value (),
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2287 image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2288 else
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2289 error ("Only uint16 data is allowed for uint images with bit depth of 16");
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2290 break;
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2291 case 32:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2292 if (image_ov.is_uint32_type ())
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2293 write_image<uint32NDArray> (tif, image_ov.uint32_array_value (),
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2294 image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2295 else
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2296 error ("Only uint32 data is allowed for uint images with bit depth of 32");
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2297 break;
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2298 case 64:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2299 if (image_ov.is_uint64_type ())
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2300 write_image<uint64NDArray> (tif, image_ov.uint64_array_value (),
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2301 image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2302 else
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2303 error ("Only uint64 data is allowed for uint images with bit depth of 64");
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2304 break;
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2305 default:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2306 error ("Unsupported bit depth");
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2307 }
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2308 }
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2309
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2310 void
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2311 write_signed_image (TIFF *tif, octave_value image_ov,
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2312 tiff_image_data *image_data)
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2313 {
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2314 switch (image_data->bits_per_sample)
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2315 {
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2316 case 8:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2317 if (image_ov.is_int8_type ())
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2318 write_image<int8NDArray> (tif, image_ov.int8_array_value (),
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2319 image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2320 else
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2321 error ("Only int8 data is allowed for int images with bit depth of 8");
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2322 break;
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2323 case 16:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2324 if (image_ov.is_int16_type ())
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2325 write_image<int16NDArray> (tif, image_ov.int16_array_value (),
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2326 image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2327 else
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2328 error ("Only int16 data is allowed for int images with bit depth of 16");
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2329 break;
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2330 case 32:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2331 if (image_ov.is_int32_type ())
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2332 write_image<int32NDArray> (tif, image_ov.int32_array_value (),
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2333 image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2334 else
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2335 error ("Only int32 data is allowed for int images with bit depth of 32");
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2336 break;
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2337 case 64:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2338 if (image_ov.is_int64_type ())
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2339 write_image<int64NDArray> (tif, image_ov.int64_array_value (),
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2340 image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2341 else
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2342 error ("Only int64 data is allowed for int images with bit depth of 64");
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2343 break;
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2344 default:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2345 error ("Unsupported bit depth for signed images");
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2346 }
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2347 }
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2348
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2349 void
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2350 write_float_image (TIFF *tif, octave_value image_ov,
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2351 tiff_image_data *image_data)
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2352 {
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2353 switch (image_data->bits_per_sample)
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2354 {
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2355 case 32:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2356 if (image_ov.is_single_type () || image_ov.is_double_type ())
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2357 write_image<FloatNDArray> (tif, image_ov.float_array_value (),
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2358 image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2359 else
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2360 error ("Only single or double data are allowed for float images");
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2361 break;
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2362 case 64:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2363 if (image_ov.is_single_type () || image_ov.is_double_type ())
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2364 write_image<NDArray> (tif, image_ov.array_value (),
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2365 image_data);
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2366 else
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2367 error ("Only single or double data are allowed for float images");
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2368 break;
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2369 default:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2370 error ("Unsupported bit depth for floating-point images");
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2371 }
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2372 }
31153
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2373
31180
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
2374 octave_value_list
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
2375 slice_rgba (uint8NDArray rgba_data)
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
2376 {
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
2377 Array<idx_vector> idx (dim_vector (3, 1));
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
2378 idx(0) = idx_vector (':');
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
2379 idx(1) = idx_vector (':');
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
2380 idx(2) = idx_vector (0, 3);
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
2381 uint8NDArray rgb = uint8NDArray (rgba_data.index (idx));
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
2382 idx(2) = idx_vector (3);
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
2383 uint8NDArray alpha = uint8NDArray (rgba_data.index (idx));
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
2384
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
2385 octave_value_list retval (2);
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
2386 retval(0) = octave_value (rgb);
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
2387 retval(1) = octave_value (alpha);
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
2388 return retval;
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
2389 }
31104
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
2390 #endif
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
2391
31160
5f0c3da75926 Tiff: moved internal functions to corefcn.
magedrifaat <magedrifaat@gmail.com>
parents: 31159
diff changeset
2392 DEFUN (__open_tiff__, args, ,
31109
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2393 "Open a Tiff file and return its handle")
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
2394 {
31104
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
2395 #if defined (HAVE_TIFF)
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
2396 int nargin = args.length ();
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
2397
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
2398 if (nargin == 0 || nargin > 2)
31101
f24d7bcad2d3 Partially fixed formatting of C++ code
magedrifaat <magedrifaat@gmail.com>
parents: 31099
diff changeset
2399 {
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
2400 error ("No filename supplied\n");
31101
f24d7bcad2d3 Partially fixed formatting of C++ code
magedrifaat <magedrifaat@gmail.com>
parents: 31099
diff changeset
2401 }
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
2402
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2403 std::string filename = args(0).string_value ();
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
2404 std::string mode = "r";
31094
ab5b33e447b0 Modified getTag to account for different tag data types and multivalued tags, the current implementation is still buggy for most tags and data types
magedrifaat <magedrifaat@gmail.com>
parents: 31093
diff changeset
2405
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
2406 if (nargin == 2)
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2407 mode = args(1).string_value ();
31123
0bcb35909ef4 Tiff open: removed support for rh mode and marked r+ as not yet supported
magedrifaat <magedrifaat@gmail.com>
parents: 31122
diff changeset
2408
31178
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2409 const std::vector<std::string> supported_modes {
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2410 "r", "w", "w8", "a", "r+"
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2411 };
31123
0bcb35909ef4 Tiff open: removed support for rh mode and marked r+ as not yet supported
magedrifaat <magedrifaat@gmail.com>
parents: 31122
diff changeset
2412
31142
97e7ee3b27b7 Tiff setTag: modify the behavior with structs to be compatible with matlab
magedrifaat <magedrifaat@gmail.com>
parents: 31140
diff changeset
2413 if (std::find (supported_modes.cbegin (), supported_modes.cend (), mode)
97e7ee3b27b7 Tiff setTag: modify the behavior with structs to be compatible with matlab
magedrifaat <magedrifaat@gmail.com>
parents: 31140
diff changeset
2414 == supported_modes.cend ())
31176
c07461ca34d6 Tiff: add support for oppening tiff files in r+ mode
magedrifaat <magedrifaat@gmail.com>
parents: 31175
diff changeset
2415 error ("Invalid mode for openning Tiff file: %s", mode.c_str ());
c07461ca34d6 Tiff: add support for oppening tiff files in r+ mode
magedrifaat <magedrifaat@gmail.com>
parents: 31175
diff changeset
2416
31179
f294b800f002 Tiff.m: added tests for signed images and sub-directories.
magedrifaat <magedrifaat@gmail.com>
parents: 31178
diff changeset
2417 // LibTIFF doesn't support r+ mode but it appears that the difference
f294b800f002 Tiff.m: added tests for signed images and sub-directories.
magedrifaat <magedrifaat@gmail.com>
parents: 31178
diff changeset
2418 // between "a" and "r+" in the context of LibTIFF is that in "a" mode
f294b800f002 Tiff.m: added tests for signed images and sub-directories.
magedrifaat <magedrifaat@gmail.com>
parents: 31178
diff changeset
2419 // the directory is not set while in r+ the directory is set to the
f294b800f002 Tiff.m: added tests for signed images and sub-directories.
magedrifaat <magedrifaat@gmail.com>
parents: 31178
diff changeset
2420 // first directory in the file
31176
c07461ca34d6 Tiff: add support for oppening tiff files in r+ mode
magedrifaat <magedrifaat@gmail.com>
parents: 31175
diff changeset
2421 bool is_rplus = false;
c07461ca34d6 Tiff: add support for oppening tiff files in r+ mode
magedrifaat <magedrifaat@gmail.com>
parents: 31175
diff changeset
2422 if (mode == "r+")
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
2423 {
31176
c07461ca34d6 Tiff: add support for oppening tiff files in r+ mode
magedrifaat <magedrifaat@gmail.com>
parents: 31175
diff changeset
2424 is_rplus = true;
c07461ca34d6 Tiff: add support for oppening tiff files in r+ mode
magedrifaat <magedrifaat@gmail.com>
parents: 31175
diff changeset
2425 mode = "a";
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
2426 }
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
2427
31171
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2428 // LibTIFF does Strip chopping by default, which makes the organization of
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2429 // data exposed to the user different from the actual file, so we need to
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2430 // force disable this behavior by adding 'c' flag to the mode
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2431 mode = mode + 'c';
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2432
31189
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
2433 set_internal_handlers ();
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
2434
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
2435 TIFF *tif = TIFFOpen (filename.c_str (), mode.c_str ());
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
2436
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
2437 if (! tif)
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
2438 error ("Failed to open Tiff file\n");
31176
c07461ca34d6 Tiff: add support for oppening tiff files in r+ mode
magedrifaat <magedrifaat@gmail.com>
parents: 31175
diff changeset
2439
c07461ca34d6 Tiff: add support for oppening tiff files in r+ mode
magedrifaat <magedrifaat@gmail.com>
parents: 31175
diff changeset
2440 if (is_rplus && ! TIFFSetDirectory (tif, 0))
c07461ca34d6 Tiff: add support for oppening tiff files in r+ mode
magedrifaat <magedrifaat@gmail.com>
parents: 31175
diff changeset
2441 error ("Failed to open Tiff file\n");
31092
a736190ce738 Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
2442
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2443 octave_value tiff_ov = octave_value (new octave_tiff_handle (tif));
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
2444 return octave_value_list (tiff_ov);
31104
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
2445 #else
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
2446 octave_unused_parameter (args);
31104
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
2447 err_disabled_feature ("Tiff", "Tiff");
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
2448 #endif
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
2449 }
31092
a736190ce738 Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
2450
a736190ce738 Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
2451
31160
5f0c3da75926 Tiff: moved internal functions to corefcn.
magedrifaat <magedrifaat@gmail.com>
parents: 31159
diff changeset
2452 DEFUN (__close_tiff__, args, ,
31109
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2453 "Close a tiff file")
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
2454 {
31104
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
2455 #if defined (HAVE_TIFF)
31101
f24d7bcad2d3 Partially fixed formatting of C++ code
magedrifaat <magedrifaat@gmail.com>
parents: 31099
diff changeset
2456 int nargin = args.length ();
31092
a736190ce738 Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
2457
a736190ce738 Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
2458 if (nargin == 0)
31101
f24d7bcad2d3 Partially fixed formatting of C++ code
magedrifaat <magedrifaat@gmail.com>
parents: 31099
diff changeset
2459 error ("No handle provided\n");
31092
a736190ce738 Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
2460
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2461 octave_tiff_handle *tiff_handle
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2462 = octave_tiff_handle::get_tiff_handle (args(0));
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2463
31189
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
2464 set_internal_handlers ();
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
2465
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2466 tiff_handle->close ();
31092
a736190ce738 Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
2467
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
2468 return octave_value_list ();
31104
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
2469 #else
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
2470 err_disabled_feature ("close", "Tiff");
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
2471 #endif
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
2472 }
31092
a736190ce738 Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
2473
a736190ce738 Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
2474
31160
5f0c3da75926 Tiff: moved internal functions to corefcn.
magedrifaat <magedrifaat@gmail.com>
parents: 31159
diff changeset
2475 DEFUN (__tiff_get_tag__, args, ,
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2476 "Get the value of a tag from a tiff image")
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
2477 {
31104
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
2478 #if defined (HAVE_TIFF)
31109
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2479 int nargin = args.length ();
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
2480
31109
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2481 if (nargin == 0)
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2482 error ("No handle provided\n");
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2483
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2484 if (nargin < 2)
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2485 error ("No tag name provided\n");
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2486
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2487 octave_tiff_handle *tiff_handle
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2488 = octave_tiff_handle::get_tiff_handle (args(0));
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2489
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2490 check_closed (tiff_handle);
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2491
31189
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
2492 set_internal_handlers ();
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
2493
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2494 TIFF *tif = tiff_handle->get_file ();
31094
ab5b33e447b0 Modified getTag to account for different tag data types and multivalued tags, the current implementation is still buggy for most tags and data types
magedrifaat <magedrifaat@gmail.com>
parents: 31093
diff changeset
2495
31109
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2496 const TIFFField *fip;
31129
dfab9c6982bf Tiff getTag: added support for single quotes string fo the tag name
magedrifaat <magedrifaat@gmail.com>
parents: 31128
diff changeset
2497
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2498 if (args(1).is_string ())
31109
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2499 {
31182
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
2500 std::string tag_name = args(1).string_value ();
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
2501 fip = get_fip_with_name (tif, tag_name);
31109
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2502 if (! fip)
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2503 error ("Tiff tag not found");
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2504 }
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2505 else
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2506 {
31182
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
2507 ttag_t tag_id = args(1).int_value ();
31109
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2508 fip = TIFFFieldWithTag (tif, tag_id);
31129
dfab9c6982bf Tiff getTag: added support for single quotes string fo the tag name
magedrifaat <magedrifaat@gmail.com>
parents: 31128
diff changeset
2509
31109
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2510 if (! fip)
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2511 error ("Tiff tag not found");
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2512 }
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
2513
31117
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
2514 return octave_value_list (get_field_data (tif, fip));
31104
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
2515 #else
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
2516 err_disabled_feature ("getTag", "Tiff");
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
2517 #endif
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
2518 }
31109
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2519
31124
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
2520
31160
5f0c3da75926 Tiff: moved internal functions to corefcn.
magedrifaat <magedrifaat@gmail.com>
parents: 31159
diff changeset
2521 DEFUN (__tiff_set_tag__, args, ,
31124
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
2522 "Set the value of a tag in a tiff image")
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
2523 {
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
2524 #if defined (HAVE_TIFF)
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
2525 int nargin = args.length ();
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
2526
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
2527 if (nargin < 2)
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
2528 error ("Too few arguments provided\n");
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
2529
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2530 octave_tiff_handle *tiff_handle
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2531 = octave_tiff_handle::get_tiff_handle (args(0));
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2532 check_closed (tiff_handle);
31162
28817158ca86 Tiff: changed write functions to use fcntl wrappers.
magedrifaat <magedrifaat@gmail.com>
parents: 31161
diff changeset
2533
31189
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
2534 set_internal_handlers ();
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
2535
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2536 TIFF *tif = tiff_handle->get_file ();
31162
28817158ca86 Tiff: changed write functions to use fcntl wrappers.
magedrifaat <magedrifaat@gmail.com>
parents: 31161
diff changeset
2537 check_readonly (tif);
31124
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
2538
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2539 if (args(1).isstruct ())
31140
5f70efad6e2c Tiff setTag: added support for setting multiple tags at once using structs
magedrifaat <magedrifaat@gmail.com>
parents: 31139
diff changeset
2540 {
31152
2244617f4da5 Tiff computeStrip: fixed inconsistency in checking plane argument.
magedrifaat <magedrifaat@gmail.com>
parents: 31151
diff changeset
2541 octave_scalar_map tags = args(1).xscalar_map_value ("__tiff_set_tag__: struct argument must be a scalar structure");
31142
97e7ee3b27b7 Tiff setTag: modify the behavior with structs to be compatible with matlab
magedrifaat <magedrifaat@gmail.com>
parents: 31140
diff changeset
2542 string_vector keys = tags.fieldnames ();
97e7ee3b27b7 Tiff setTag: modify the behavior with structs to be compatible with matlab
magedrifaat <magedrifaat@gmail.com>
parents: 31140
diff changeset
2543 // Using iterators instead of this loop method seems to process
97e7ee3b27b7 Tiff setTag: modify the behavior with structs to be compatible with matlab
magedrifaat <magedrifaat@gmail.com>
parents: 31140
diff changeset
2544 // the elements of the struct in a different order than they were
97e7ee3b27b7 Tiff setTag: modify the behavior with structs to be compatible with matlab
magedrifaat <magedrifaat@gmail.com>
parents: 31140
diff changeset
2545 // assigned which makes the behavior here incompatible with matlab
97e7ee3b27b7 Tiff setTag: modify the behavior with structs to be compatible with matlab
magedrifaat <magedrifaat@gmail.com>
parents: 31140
diff changeset
2546 // in case of errors.
97e7ee3b27b7 Tiff setTag: modify the behavior with structs to be compatible with matlab
magedrifaat <magedrifaat@gmail.com>
parents: 31140
diff changeset
2547 for (octave_idx_type i = 0; i < keys.numel (); i++)
31140
5f70efad6e2c Tiff setTag: added support for setting multiple tags at once using structs
magedrifaat <magedrifaat@gmail.com>
parents: 31139
diff changeset
2548 {
31142
97e7ee3b27b7 Tiff setTag: modify the behavior with structs to be compatible with matlab
magedrifaat <magedrifaat@gmail.com>
parents: 31140
diff changeset
2549 std::string key = keys[i];
31182
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
2550 const TIFFField *fip = get_fip_with_name (tif, key);
31142
97e7ee3b27b7 Tiff setTag: modify the behavior with structs to be compatible with matlab
magedrifaat <magedrifaat@gmail.com>
parents: 31140
diff changeset
2551 if (! fip)
31140
5f70efad6e2c Tiff setTag: added support for setting multiple tags at once using structs
magedrifaat <magedrifaat@gmail.com>
parents: 31139
diff changeset
2552 error ("Tag %s not found", key.c_str ());
31142
97e7ee3b27b7 Tiff setTag: modify the behavior with structs to be compatible with matlab
magedrifaat <magedrifaat@gmail.com>
parents: 31140
diff changeset
2553 set_field_data (tif, fip, tags.contents (key));
31140
5f70efad6e2c Tiff setTag: added support for setting multiple tags at once using structs
magedrifaat <magedrifaat@gmail.com>
parents: 31139
diff changeset
2554 }
5f70efad6e2c Tiff setTag: added support for setting multiple tags at once using structs
magedrifaat <magedrifaat@gmail.com>
parents: 31139
diff changeset
2555 }
31124
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
2556 else
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
2557 {
31140
5f70efad6e2c Tiff setTag: added support for setting multiple tags at once using structs
magedrifaat <magedrifaat@gmail.com>
parents: 31139
diff changeset
2558 if (nargin < 3)
5f70efad6e2c Tiff setTag: added support for setting multiple tags at once using structs
magedrifaat <magedrifaat@gmail.com>
parents: 31139
diff changeset
2559 error ("Too few arguments provided");
5f70efad6e2c Tiff setTag: added support for setting multiple tags at once using structs
magedrifaat <magedrifaat@gmail.com>
parents: 31139
diff changeset
2560
31124
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
2561 const TIFFField *fip;
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2562 if (args(1).is_string ())
31124
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
2563 {
31182
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
2564 std::string tag_name = args(1).string_value ();
4c8b8c400a3b __tiff__.cc (F__set_tag__, F__get_tag__): check for TagID names as well.
magedrifaat <magedrifaat@gmail.com>
parents: 31181
diff changeset
2565 fip = get_fip_with_name (tif, tag_name);
31124
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
2566 if (! fip)
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
2567 error ("Tiff tag not found");
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
2568 }
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
2569 else
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
2570 {
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2571 uint32_t tag_id = args(1).int_value ();
31124
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
2572 fip = TIFFFieldWithTag (tif, tag_id);
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
2573 if (! fip)
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
2574 error ("Tiff tag not found");
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
2575 }
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
2576
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2577 set_field_data (tif, fip, args(2));
31124
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
2578 }
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
2579
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
2580 return octave_value_list ();
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
2581 #else
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
2582 err_disabled_feature ("setTag", "Tiff");
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
2583 #endif
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
2584 }
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
2585
31160
5f0c3da75926 Tiff: moved internal functions to corefcn.
magedrifaat <magedrifaat@gmail.com>
parents: 31159
diff changeset
2586 DEFUN (__tiff_read__, args, nargout,
31109
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2587 "Read the image in the current IFD")
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2588 {
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2589 #if defined (HAVE_TIFF)
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2590 int nargin = args.length ();
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2591
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2592 if (nargin == 0)
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2593 error ("No handle provided\n");
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2594
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2595 octave_tiff_handle *tiff_handle
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2596 = octave_tiff_handle::get_tiff_handle (args(0));
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2597 check_closed (tiff_handle);
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2598
31189
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
2599 set_internal_handlers ();
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
2600
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2601 TIFF *tif = tiff_handle->get_file ();
31109
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2602
31187
2bff8446484c imformats: added logic to use Tiff interface for image functions
magedrifaat <magedrifaat@gmail.com>
parents: 31186
diff changeset
2603 // FIXME: add support for reading in YCbCr mode
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
2604 octave_unused_parameter (nargout);
31109
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2605
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2606 // Obtain all necessary tags
31112
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
2607 // The main purpose of this struct is to hold all the necessary tags that
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
2608 // will be common among all the different cases of handling the the image
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
2609 // data to avoid repeating the same calls to TIFFGetField in the different
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
2610 // functions as each call is a possible point of failure
31122
1662939a7a49 Tiff read: moved image_date initialization into a constructor
magedrifaat <magedrifaat@gmail.com>
parents: 31121
diff changeset
2611 tiff_image_data image_data (tif);
31125
3b775b939de4 Tiff read: Added support for floating-point images
magedrifaat <magedrifaat@gmail.com>
parents: 31124
diff changeset
2612
3b775b939de4 Tiff read: Added support for floating-point images
magedrifaat <magedrifaat@gmail.com>
parents: 31124
diff changeset
2613 uint16_t sample_format;
3b775b939de4 Tiff read: Added support for floating-point images
magedrifaat <magedrifaat@gmail.com>
parents: 31124
diff changeset
2614 if (! TIFFGetFieldDefaulted(tif, TIFFTAG_SAMPLEFORMAT, &sample_format))
3b775b939de4 Tiff read: Added support for floating-point images
magedrifaat <magedrifaat@gmail.com>
parents: 31124
diff changeset
2615 error ("Failed to obtain a value for sample format");
3b775b939de4 Tiff read: Added support for floating-point images
magedrifaat <magedrifaat@gmail.com>
parents: 31124
diff changeset
2616
31109
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2617 octave_value_list retval;
31178
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2618 switch (sample_format)
31109
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2619 {
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2620 case 1:
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2621 case 4:
31178
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2622 retval (0) = read_unsigned_image (tif, &image_data);
31113
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
2623 break;
31178
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2624 case 2:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2625 retval (0) = read_signed_image (tif, &image_data);
31113
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
2626 break;
31178
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2627 case 3:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2628 retval (0) = read_float_image (tif, &image_data);
31113
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
2629 break;
31109
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2630 default:
31178
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
2631 error ("Unsupported sample format");
31109
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2632 }
31110
2daeeff33980 Tiff read fixed segfault bug for compressed images
magedrifaat <magedrifaat@gmail.com>
parents: 31109
diff changeset
2633
31109
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2634 return retval;
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2635 #else
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2636 err_disabled_feature ("read", "Tiff");
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2637 #endif
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
2638 }
31126
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
2639
31160
5f0c3da75926 Tiff: moved internal functions to corefcn.
magedrifaat <magedrifaat@gmail.com>
parents: 31159
diff changeset
2640 DEFUN (__tiff_read_encoded_strip__, args, nargout,
31158
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2641 "Read a strip from the image in the current IFD")
31157
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
2642 {
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
2643 #if defined (HAVE_TIFF)
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
2644 int nargin = args.length ();
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
2645
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
2646 if (nargin != 2)
31170
72a159bc5a4c Tiff: added readRGBAImage method to read image using the RGBA interface
magedrifaat <magedrifaat@gmail.com>
parents: 31168
diff changeset
2647 error ("Wrong number of arguments");
31157
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
2648
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2649 octave_tiff_handle *tiff_handle
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2650 = octave_tiff_handle::get_tiff_handle (args(0));
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2651 check_closed (tiff_handle);
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2652
31189
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
2653 set_internal_handlers ();
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
2654
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2655 TIFF *tif = tiff_handle->get_file ();
31157
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
2656
31187
2bff8446484c imformats: added logic to use Tiff interface for image functions
magedrifaat <magedrifaat@gmail.com>
parents: 31186
diff changeset
2657 // FIXME: add support for reading in YCbCr mode
31157
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
2658 octave_unused_parameter (nargout);
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
2659
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
2660 if (TIFFIsTiled (tif))
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
2661 error ("The image is tiled not stripped");
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
2662
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
2663 uint32_t strip_no;
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
2664 if (args(1).is_scalar_type ())
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
2665 strip_no = args(1).uint32_scalar_value ();
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
2666 else
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
2667 error ("Expected scalar for strip number");
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
2668
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
2669 if (strip_no < 1 || strip_no > TIFFNumberOfStrips (tif))
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
2670 error ("Strip number out of bounds");
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
2671
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
2672 // Convert from Octave's 1-based indexing to zero-based indexing
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
2673 strip_no--;
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
2674
31158
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2675 return octave_value_list (handle_read_strip_or_tile (tif, strip_no));
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2676 #else
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2677 err_disabled_feature ("readEncodedStrip", "Tiff");
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2678 #endif
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2679 }
31157
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
2680
31160
5f0c3da75926 Tiff: moved internal functions to corefcn.
magedrifaat <magedrifaat@gmail.com>
parents: 31159
diff changeset
2681 DEFUN (__tiff_read_encoded_tile__, args, nargout,
31158
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2682 "Read a tile from the image in the current IFD")
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2683 {
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2684 #if defined (HAVE_TIFF)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2685 int nargin = args.length ();
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2686
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2687 if (nargin != 2)
31170
72a159bc5a4c Tiff: added readRGBAImage method to read image using the RGBA interface
magedrifaat <magedrifaat@gmail.com>
parents: 31168
diff changeset
2688 error ("Wrong number of arguments");
31157
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
2689
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2690 octave_tiff_handle *tiff_handle
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2691 = octave_tiff_handle::get_tiff_handle (args(0));
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2692 check_closed (tiff_handle);
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2693
31189
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
2694 set_internal_handlers ();
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
2695
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2696 TIFF *tif = tiff_handle->get_file ();
31158
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2697
31187
2bff8446484c imformats: added logic to use Tiff interface for image functions
magedrifaat <magedrifaat@gmail.com>
parents: 31186
diff changeset
2698 // FIXME: add support for reading in YCbCr mode
31158
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2699 octave_unused_parameter (nargout);
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2700
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2701 if (! TIFFIsTiled (tif))
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2702 error ("The image is stripped not tiled");
31157
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
2703
31158
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2704 uint32_t tile_no;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2705 if (args(1).is_scalar_type ())
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2706 tile_no = args(1).uint32_scalar_value ();
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2707 else
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2708 error ("Expected scalar for tile number");
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2709
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2710 if (tile_no < 1 || tile_no > TIFFNumberOfTiles (tif))
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2711 error ("Tile number out of bounds");
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2712
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2713 // Convert from Octave's 1-based indexing to zero-based indexing
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2714 tile_no--;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2715
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2716 return octave_value_list (handle_read_strip_or_tile (tif, tile_no));
31157
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
2717 #else
31160
5f0c3da75926 Tiff: moved internal functions to corefcn.
magedrifaat <magedrifaat@gmail.com>
parents: 31159
diff changeset
2718 err_disabled_feature ("readEncodedTile", "Tiff");
31157
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
2719 #endif
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
2720 }
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
2721
31170
72a159bc5a4c Tiff: added readRGBAImage method to read image using the RGBA interface
magedrifaat <magedrifaat@gmail.com>
parents: 31168
diff changeset
2722 DEFUN (__tiff_read_rgba_image__, args, ,
31171
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2723 "Read the image data in rgba mode")
31170
72a159bc5a4c Tiff: added readRGBAImage method to read image using the RGBA interface
magedrifaat <magedrifaat@gmail.com>
parents: 31168
diff changeset
2724 {
72a159bc5a4c Tiff: added readRGBAImage method to read image using the RGBA interface
magedrifaat <magedrifaat@gmail.com>
parents: 31168
diff changeset
2725 #if defined (HAVE_TIFF)
72a159bc5a4c Tiff: added readRGBAImage method to read image using the RGBA interface
magedrifaat <magedrifaat@gmail.com>
parents: 31168
diff changeset
2726 int nargin = args.length ();
72a159bc5a4c Tiff: added readRGBAImage method to read image using the RGBA interface
magedrifaat <magedrifaat@gmail.com>
parents: 31168
diff changeset
2727
72a159bc5a4c Tiff: added readRGBAImage method to read image using the RGBA interface
magedrifaat <magedrifaat@gmail.com>
parents: 31168
diff changeset
2728 if (nargin != 1)
72a159bc5a4c Tiff: added readRGBAImage method to read image using the RGBA interface
magedrifaat <magedrifaat@gmail.com>
parents: 31168
diff changeset
2729 error ("Wrong number of arguments");
72a159bc5a4c Tiff: added readRGBAImage method to read image using the RGBA interface
magedrifaat <magedrifaat@gmail.com>
parents: 31168
diff changeset
2730
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2731 octave_tiff_handle *tiff_handle
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2732 = octave_tiff_handle::get_tiff_handle (args(0));
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2733 check_closed (tiff_handle);
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2734
31189
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
2735 set_internal_handlers ();
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
2736
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2737 TIFF *tif = tiff_handle->get_file ();
31170
72a159bc5a4c Tiff: added readRGBAImage method to read image using the RGBA interface
magedrifaat <magedrifaat@gmail.com>
parents: 31168
diff changeset
2738
72a159bc5a4c Tiff: added readRGBAImage method to read image using the RGBA interface
magedrifaat <magedrifaat@gmail.com>
parents: 31168
diff changeset
2739 tiff_image_data image_data (tif);
72a159bc5a4c Tiff: added readRGBAImage method to read image using the RGBA interface
magedrifaat <magedrifaat@gmail.com>
parents: 31168
diff changeset
2740
31173
0abc9779f751 Tiff: modified readRGBAImage to use the orientation tag correctly
magedrifaat <magedrifaat@gmail.com>
parents: 31172
diff changeset
2741 uint16_t orientation;
0abc9779f751 Tiff: modified readRGBAImage to use the orientation tag correctly
magedrifaat <magedrifaat@gmail.com>
parents: 31172
diff changeset
2742 if (! TIFFGetFieldDefaulted (tif, TIFFTAG_ORIENTATION, &orientation))
0abc9779f751 Tiff: modified readRGBAImage to use the orientation tag correctly
magedrifaat <magedrifaat@gmail.com>
parents: 31172
diff changeset
2743 orientation = ORIENTATION_LEFTTOP;
0abc9779f751 Tiff: modified readRGBAImage to use the orientation tag correctly
magedrifaat <magedrifaat@gmail.com>
parents: 31172
diff changeset
2744
31171
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2745 // Start with reversed dimensions to be aligned with LibTIFF and
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2746 // permute to the correct order later
31170
72a159bc5a4c Tiff: added readRGBAImage method to read image using the RGBA interface
magedrifaat <magedrifaat@gmail.com>
parents: 31168
diff changeset
2747 dim_vector img_dims (4, image_data.width, image_data.height);
72a159bc5a4c Tiff: added readRGBAImage method to read image using the RGBA interface
magedrifaat <magedrifaat@gmail.com>
parents: 31168
diff changeset
2748 uint8NDArray img (img_dims);
72a159bc5a4c Tiff: added readRGBAImage method to read image using the RGBA interface
magedrifaat <magedrifaat@gmail.com>
parents: 31168
diff changeset
2749 uint32_t *img_ptr = reinterpret_cast <uint32_t *> (img.fortran_vec ());
31173
0abc9779f751 Tiff: modified readRGBAImage to use the orientation tag correctly
magedrifaat <magedrifaat@gmail.com>
parents: 31172
diff changeset
2750
31179
f294b800f002 Tiff.m: added tests for signed images and sub-directories.
magedrifaat <magedrifaat@gmail.com>
parents: 31178
diff changeset
2751 // The TIFFRGBAImageGet interface is used instead of TIFFReadRGBAImage
f294b800f002 Tiff.m: added tests for signed images and sub-directories.
magedrifaat <magedrifaat@gmail.com>
parents: 31178
diff changeset
2752 // to have control on the requested orientation of the image
31193
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
2753 // Matlab R2022a handles the orientation for each individual strip
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
2754 // or tile on its own, this results in a distorted image which is
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
2755 // not useful, and is probably a bug. So this deviated from matlab
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
2756 // by applying the orientation to the entire image to produce more
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
2757 // useful results.
31173
0abc9779f751 Tiff: modified readRGBAImage to use the orientation tag correctly
magedrifaat <magedrifaat@gmail.com>
parents: 31172
diff changeset
2758 TIFFRGBAImage img_config;
0abc9779f751 Tiff: modified readRGBAImage to use the orientation tag correctly
magedrifaat <magedrifaat@gmail.com>
parents: 31172
diff changeset
2759 char emsg[1024];
0abc9779f751 Tiff: modified readRGBAImage to use the orientation tag correctly
magedrifaat <magedrifaat@gmail.com>
parents: 31172
diff changeset
2760 if (! TIFFRGBAImageOK (tif, emsg)
0abc9779f751 Tiff: modified readRGBAImage to use the orientation tag correctly
magedrifaat <magedrifaat@gmail.com>
parents: 31172
diff changeset
2761 || ! TIFFRGBAImageBegin (&img_config, tif, 0, emsg))
0abc9779f751 Tiff: modified readRGBAImage to use the orientation tag correctly
magedrifaat <magedrifaat@gmail.com>
parents: 31172
diff changeset
2762 error ("Failed to read image");
0abc9779f751 Tiff: modified readRGBAImage to use the orientation tag correctly
magedrifaat <magedrifaat@gmail.com>
parents: 31172
diff changeset
2763
31196
1da6d747bf78 __tiff_imread__: converted to private octave function
magedrifaat <magedrifaat@gmail.com>
parents: 31195
diff changeset
2764 // FIXME: rotated orientation don't work correctly (e.g. LeftTop)
31173
0abc9779f751 Tiff: modified readRGBAImage to use the orientation tag correctly
magedrifaat <magedrifaat@gmail.com>
parents: 31172
diff changeset
2765 img_config.orientation = ORIENTATION_TOPLEFT;
0abc9779f751 Tiff: modified readRGBAImage to use the orientation tag correctly
magedrifaat <magedrifaat@gmail.com>
parents: 31172
diff changeset
2766 img_config.req_orientation = orientation;
0abc9779f751 Tiff: modified readRGBAImage to use the orientation tag correctly
magedrifaat <magedrifaat@gmail.com>
parents: 31172
diff changeset
2767
0abc9779f751 Tiff: modified readRGBAImage to use the orientation tag correctly
magedrifaat <magedrifaat@gmail.com>
parents: 31172
diff changeset
2768 bool success = TIFFRGBAImageGet (&img_config, img_ptr, img_config.width,
0abc9779f751 Tiff: modified readRGBAImage to use the orientation tag correctly
magedrifaat <magedrifaat@gmail.com>
parents: 31172
diff changeset
2769 img_config.height);
0abc9779f751 Tiff: modified readRGBAImage to use the orientation tag correctly
magedrifaat <magedrifaat@gmail.com>
parents: 31172
diff changeset
2770
0abc9779f751 Tiff: modified readRGBAImage to use the orientation tag correctly
magedrifaat <magedrifaat@gmail.com>
parents: 31172
diff changeset
2771 TIFFRGBAImageEnd (&img_config);
0abc9779f751 Tiff: modified readRGBAImage to use the orientation tag correctly
magedrifaat <magedrifaat@gmail.com>
parents: 31172
diff changeset
2772 if (!success)
31170
72a159bc5a4c Tiff: added readRGBAImage method to read image using the RGBA interface
magedrifaat <magedrifaat@gmail.com>
parents: 31168
diff changeset
2773 error ("Failed to read image");
72a159bc5a4c Tiff: added readRGBAImage method to read image using the RGBA interface
magedrifaat <magedrifaat@gmail.com>
parents: 31168
diff changeset
2774
31171
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2775 // Permute to the correct Octave dimension order
31170
72a159bc5a4c Tiff: added readRGBAImage method to read image using the RGBA interface
magedrifaat <magedrifaat@gmail.com>
parents: 31168
diff changeset
2776 Array<octave_idx_type> perm (dim_vector (3, 1));
72a159bc5a4c Tiff: added readRGBAImage method to read image using the RGBA interface
magedrifaat <magedrifaat@gmail.com>
parents: 31168
diff changeset
2777 perm(0) = 2;
72a159bc5a4c Tiff: added readRGBAImage method to read image using the RGBA interface
magedrifaat <magedrifaat@gmail.com>
parents: 31168
diff changeset
2778 perm(1) = 1;
72a159bc5a4c Tiff: added readRGBAImage method to read image using the RGBA interface
magedrifaat <magedrifaat@gmail.com>
parents: 31168
diff changeset
2779 perm(2) = 0;
72a159bc5a4c Tiff: added readRGBAImage method to read image using the RGBA interface
magedrifaat <magedrifaat@gmail.com>
parents: 31168
diff changeset
2780 img = img.permute (perm);
72a159bc5a4c Tiff: added readRGBAImage method to read image using the RGBA interface
magedrifaat <magedrifaat@gmail.com>
parents: 31168
diff changeset
2781
31171
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2782 // Slice the data into RGB and alpha
31180
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
2783 return slice_rgba (img);
31170
72a159bc5a4c Tiff: added readRGBAImage method to read image using the RGBA interface
magedrifaat <magedrifaat@gmail.com>
parents: 31168
diff changeset
2784 #else
31171
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2785 err_disabled_feature ("readRGBAImage", "Tiff");
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2786 #endif
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2787 }
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2788
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2789 DEFUN (__tiff_read_rgba_strip__, args, ,
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2790 "Read the strip data containing the given row in rgba mode")
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2791 {
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2792 #if defined (HAVE_TIFF)
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2793 int nargin = args.length ();
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2794
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2795 if (nargin != 2)
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2796 error ("Wrong number of arguments");
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2797
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2798 octave_tiff_handle *tiff_handle
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2799 = octave_tiff_handle::get_tiff_handle (args(0));
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2800 check_closed (tiff_handle);
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2801
31189
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
2802 set_internal_handlers ();
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
2803
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2804 TIFF *tif = tiff_handle->get_file ();
31171
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2805
31173
0abc9779f751 Tiff: modified readRGBAImage to use the orientation tag correctly
magedrifaat <magedrifaat@gmail.com>
parents: 31172
diff changeset
2806 // Matlab (R2022a) requires row to be double
0abc9779f751 Tiff: modified readRGBAImage to use the orientation tag correctly
magedrifaat <magedrifaat@gmail.com>
parents: 31172
diff changeset
2807 if (! args(1).is_double_type ())
31175
ed329571ec88 Tiff: added support for creating and reading sub-directories
magedrifaat <magedrifaat@gmail.com>
parents: 31174
diff changeset
2808 error ("row should be of type double");
31173
0abc9779f751 Tiff: modified readRGBAImage to use the orientation tag correctly
magedrifaat <magedrifaat@gmail.com>
parents: 31172
diff changeset
2809
31175
ed329571ec88 Tiff: added support for creating and reading sub-directories
magedrifaat <magedrifaat@gmail.com>
parents: 31174
diff changeset
2810 uint32_t row = args(1).uint32_scalar_value ();
31171
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2811
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2812 tiff_image_data image_data (tif);
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2813 if (image_data.is_tiled)
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2814 error ("The image is tiled not stripped");
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2815
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2816 if (row < 1 || row > image_data.height)
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2817 error ("Row out of bounds of the image");
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2818
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2819 // Convert from 1-based indexing to zero-based
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2820 row--;
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2821
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2822 uint32_t rows_in_strip;
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2823 if (! TIFFGetFieldDefaulted (tif, TIFFTAG_ROWSPERSTRIP, &rows_in_strip))
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2824 error ("Failed to obtain a value for RowsPerStrip");
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2825
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2826 if (rows_in_strip > image_data.height)
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2827 rows_in_strip = image_data.height;
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2828
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2829 // LibTIFF requires the row to be the first row in the strip
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2830 // so this removes any offset to reach the first row
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2831 row -= row % rows_in_strip;
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2832
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2833 // The exact number of rows in the strip is needed for boundary strips
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2834 uint32_t strip_no = TIFFComputeStrip (tif, row, 0);
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2835 rows_in_strip = get_rows_in_strip (strip_no, TIFFNumberOfStrips (tif),
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2836 rows_in_strip, &image_data);
31174
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2837
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2838 uint16_t orientation;
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2839 if (! TIFFGetFieldDefaulted (tif, TIFFTAG_ORIENTATION, &orientation))
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2840 orientation = ORIENTATION_LEFTTOP;
31171
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2841
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2842 // Start with reversed dimensions to be aligned with LibTIFF and
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2843 // permute to the correct order later
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2844 dim_vector strip_dims (4, image_data.width, rows_in_strip);
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2845 uint8NDArray strip_data (strip_dims);
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2846 uint32_t *strip_ptr
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2847 = reinterpret_cast <uint32_t *> (strip_data.fortran_vec ());
31174
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2848
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2849 TIFFRGBAImage img_config;
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2850 char emsg[1024];
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2851 if (! TIFFRGBAImageOK (tif, emsg)
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2852 || ! TIFFRGBAImageBegin (&img_config, tif, 0, emsg))
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2853 error ("Failed to read strip");
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2854
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2855 img_config.orientation = ORIENTATION_TOPLEFT;
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2856 img_config.req_orientation = orientation;
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2857 img_config.row_offset = row;
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2858 img_config.col_offset = 0;
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2859
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2860 bool success = TIFFRGBAImageGet (&img_config, strip_ptr, img_config.width,
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2861 rows_in_strip);
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2862
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2863 TIFFRGBAImageEnd (&img_config);
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2864 if (!success)
31171
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2865 error ("Failed to read strip");
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2866
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2867 // Permute to the correct order of dimensions for Octave
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2868 Array<octave_idx_type> perm (dim_vector (3, 1));
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2869 perm(0) = 2;
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2870 perm(1) = 1;
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2871 perm(2) = 0;
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2872 strip_data = strip_data.permute (perm);
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2873
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2874 // Slice the data into RGB and alpha
31180
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
2875 return slice_rgba (strip_data);
31171
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2876 #else
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2877 err_disabled_feature ("readRGBAStrip", "Tiff");
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2878 #endif
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2879 }
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2880
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2881 DEFUN (__tiff_read_rgba_tile__, args, ,
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2882 "Read the stile data containing the given row and column in rgba mode")
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2883 {
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2884 #if defined (HAVE_TIFF)
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2885 int nargin = args.length ();
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2886
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2887 if (nargin != 3)
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2888 error ("Wrong number of arguments");
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2889
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2890 octave_tiff_handle *tiff_handle
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2891 = octave_tiff_handle::get_tiff_handle (args(0));
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2892 check_closed (tiff_handle);
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2893
31189
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
2894 set_internal_handlers ();
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
2895
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2896 TIFF *tif = tiff_handle->get_file ();
31171
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2897
31175
ed329571ec88 Tiff: added support for creating and reading sub-directories
magedrifaat <magedrifaat@gmail.com>
parents: 31174
diff changeset
2898 if (! args(1).is_double_type ())
ed329571ec88 Tiff: added support for creating and reading sub-directories
magedrifaat <magedrifaat@gmail.com>
parents: 31174
diff changeset
2899 error ("row should be of type double");
ed329571ec88 Tiff: added support for creating and reading sub-directories
magedrifaat <magedrifaat@gmail.com>
parents: 31174
diff changeset
2900 if (! args(2).is_double_type ())
ed329571ec88 Tiff: added support for creating and reading sub-directories
magedrifaat <magedrifaat@gmail.com>
parents: 31174
diff changeset
2901 error ("col should be of type double");
ed329571ec88 Tiff: added support for creating and reading sub-directories
magedrifaat <magedrifaat@gmail.com>
parents: 31174
diff changeset
2902
ed329571ec88 Tiff: added support for creating and reading sub-directories
magedrifaat <magedrifaat@gmail.com>
parents: 31174
diff changeset
2903 uint32_t row = args(1).uint32_scalar_value ();
ed329571ec88 Tiff: added support for creating and reading sub-directories
magedrifaat <magedrifaat@gmail.com>
parents: 31174
diff changeset
2904 uint32_t col = args(2).uint32_scalar_value ();
31171
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2905
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2906 tiff_image_data image_data (tif);
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2907 if (! image_data.is_tiled)
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2908 error ("The image is stripped not tiled");
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2909
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2910 if (row < 1 || row > image_data.height)
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2911 error ("Row out of bounds of the image");
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2912 if (col < 1 || col > image_data.width)
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2913 error ("Column out of bounds of the image");
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2914
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2915 // Convert from 1-based indexing to zero-based
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2916 row--;
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2917 col--;
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2918
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2919 uint32_t tile_width, tile_height;
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2920 if (! TIFFGetField (tif, TIFFTAG_TILELENGTH, &tile_height))
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2921 error ("Failed to obtain a value for TileLength");
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2922 if (! TIFFGetField (tif, TIFFTAG_TILEWIDTH, &tile_width))
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2923 error ("Failed to obtain a value for TileWidth");
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2924
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2925 // LibTIFF requires the row and columns to be the top-left corner of the
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2926 // tile, so this removes any offset to reach the top-left row and column
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2927 // of the tile
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2928 row -= row % tile_height;
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2929 col -= col % tile_width;
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2930
31174
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2931 uint16_t orientation;
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2932 if (! TIFFGetFieldDefaulted (tif, TIFFTAG_ORIENTATION, &orientation))
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2933 orientation = ORIENTATION_LEFTTOP;
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2934
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2935 // Calculate the correct dimensions for boundary tiles
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2936 uint32_t corrected_height = tile_height;
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2937 uint32_t corrected_width = tile_width;
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2938 if (row + tile_height > image_data.height)
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2939 corrected_height = image_data.height - row;
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2940 if (col + tile_width > image_data.width)
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2941 corrected_width = image_data.width - col;
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2942
31171
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2943 // Start with reversed dimensions to be aligned with LibTIFF and
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2944 // permute to the correct order later
31174
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2945 dim_vector tile_dims (4, corrected_width, corrected_height);
31171
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2946 uint8NDArray tile_data (tile_dims);
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2947 uint32_t *tile_ptr
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2948 = reinterpret_cast <uint32_t *> (tile_data.fortran_vec ());
31174
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2949
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2950 TIFFRGBAImage img_config;
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2951 char emsg[1024];
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2952 if (! TIFFRGBAImageOK (tif, emsg)
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2953 || ! TIFFRGBAImageBegin (&img_config, tif, 0, emsg))
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2954 error ("Failed to read tile");
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2955
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2956 img_config.orientation = ORIENTATION_TOPLEFT;
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2957 img_config.req_orientation = orientation;
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2958 img_config.row_offset = row;
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2959 img_config.col_offset = col;
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2960
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2961 bool success = TIFFRGBAImageGet (&img_config, tile_ptr, corrected_width,
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2962 corrected_height);
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2963
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2964 TIFFRGBAImageEnd (&img_config);
1f19e9a06f2d Tiff: modified readRGBAStrip/Tile to correctly use the orientation tag
magedrifaat <magedrifaat@gmail.com>
parents: 31173
diff changeset
2965 if (!success)
31171
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2966 error ("Failed to read tile");
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2967
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2968 // Permute to the correct order of dimensions for Octave
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2969 Array<octave_idx_type> perm (dim_vector (3, 1));
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2970 perm(0) = 2;
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2971 perm(1) = 1;
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2972 perm(2) = 0;
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2973 tile_data = tile_data.permute (perm);
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2974
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2975 // Slice the data into RGB and alpha
31180
ae78937e24d2 __tiff__.cc: refactored repititive code into functions.
magedrifaat <magedrifaat@gmail.com>
parents: 31179
diff changeset
2976 return slice_rgba (tile_data);
31171
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2977 #else
8bf3fa6b6977 Tiff: added readRGBAStrip and readRGBATile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31170
diff changeset
2978 err_disabled_feature ("readRGBATile", "Tiff");
31170
72a159bc5a4c Tiff: added readRGBAImage method to read image using the RGBA interface
magedrifaat <magedrifaat@gmail.com>
parents: 31168
diff changeset
2979 #endif
72a159bc5a4c Tiff: added readRGBAImage method to read image using the RGBA interface
magedrifaat <magedrifaat@gmail.com>
parents: 31168
diff changeset
2980 }
72a159bc5a4c Tiff: added readRGBAImage method to read image using the RGBA interface
magedrifaat <magedrifaat@gmail.com>
parents: 31168
diff changeset
2981
31160
5f0c3da75926 Tiff: moved internal functions to corefcn.
magedrifaat <magedrifaat@gmail.com>
parents: 31159
diff changeset
2982 DEFUN (__tiff_write__, args, ,
31153
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2983 "Write the image data to the current IFD")
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2984 {
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2985 #if defined (HAVE_TIFF)
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2986 int nargin = args.length ();
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2987
31187
2bff8446484c imformats: added logic to use Tiff interface for image functions
magedrifaat <magedrifaat@gmail.com>
parents: 31186
diff changeset
2988 // FIXME: add support for writing in YCbCr mode
31153
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2989 if (nargin < 2)
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2990 error ("Wrong number of arguments\n");
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2991
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2992 octave_tiff_handle *tiff_handle
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2993 = octave_tiff_handle::get_tiff_handle (args(0));
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2994 check_closed (tiff_handle);
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2995
31189
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
2996 set_internal_handlers ();
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
2997
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
2998 TIFF *tif = tiff_handle->get_file ();
31153
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2999
31162
28817158ca86 Tiff: changed write functions to use fcntl wrappers.
magedrifaat <magedrifaat@gmail.com>
parents: 31161
diff changeset
3000 check_readonly (tif);
31153
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
3001
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
3002 // Obtain all necessary tags
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
3003 tiff_image_data image_data (tif);
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
3004
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
3005 uint16_t sample_format;
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
3006 if (! TIFFGetFieldDefaulted(tif, TIFFTAG_SAMPLEFORMAT, &sample_format))
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
3007 error ("Failed to obtain a value for sample format");
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
3008
31178
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
3009 switch (sample_format)
31153
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
3010 {
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
3011 case 1:
31178
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
3012 case 4:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
3013 write_unsigned_image (tif, args(1), &image_data);
31153
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
3014 break;
31178
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
3015 case 2:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
3016 write_signed_image (tif, args(1), &image_data);
31153
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
3017 break;
31178
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
3018 case 3:
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
3019 write_float_image (tif, args(1), &image_data);
31153
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
3020 break;
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
3021 default:
31178
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
3022 error ("Unsupported sample format");
31153
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
3023 }
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
3024
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
3025 return octave_value_list ();
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
3026 #else
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
3027 err_disabled_feature ("write", "Tiff");
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
3028 #endif
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
3029 }
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
3030
31160
5f0c3da75926 Tiff: moved internal functions to corefcn.
magedrifaat <magedrifaat@gmail.com>
parents: 31159
diff changeset
3031 DEFUN (__tiff_write_encoded_strip__, args, ,
31126
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
3032 "Write an encoded strip to the image")
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
3033 {
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
3034 #if defined (HAVE_TIFF)
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
3035 int nargin = args.length ();
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
3036
31187
2bff8446484c imformats: added logic to use Tiff interface for image functions
magedrifaat <magedrifaat@gmail.com>
parents: 31186
diff changeset
3037 // FIXME: add support for writing in YCbCr mode
31126
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
3038 if (nargin < 3)
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
3039 error ("Too few arguments provided\n");
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
3040
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3041 octave_tiff_handle *tiff_handle
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3042 = octave_tiff_handle::get_tiff_handle (args(0));
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3043 check_closed (tiff_handle);
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3044
31189
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
3045 set_internal_handlers ();
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
3046
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3047 TIFF *tif = tiff_handle->get_file ();
31126
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
3048
31162
28817158ca86 Tiff: changed write functions to use fcntl wrappers.
magedrifaat <magedrifaat@gmail.com>
parents: 31161
diff changeset
3049 check_readonly (tif);
31138
68762676dab1 Tiff writeEncodedStrip: prevent writing to a read-only file
magedrifaat <magedrifaat@gmail.com>
parents: 31137
diff changeset
3050
31126
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
3051 // Obtain all necessary tags
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
3052 tiff_image_data image_data (tif);
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
3053
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
3054 if (image_data.is_tiled)
31143
a68f2dadafee Tiff.m: added all remaining tests for implemented features.
magedrifaat <magedrifaat@gmail.com>
parents: 31142
diff changeset
3055 error ("Can't write strips to a tiled image");
31126
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
3056
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3057 uint32_t strip_no = args(1).uint32_scalar_value ();
31126
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
3058 if (strip_no < 1 || strip_no > TIFFNumberOfStrips (tif))
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
3059 error ("Strip number out of range");
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
3060
31158
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
3061 handle_write_strip_or_tile (tif, strip_no, args(2), &image_data);
31126
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
3062
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
3063 return octave_value_list ();
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
3064 #else
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
3065 err_disabled_feature ("writeEncodedStrip", "Tiff");
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
3066 #endif
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
3067 }
31146
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
3068
31160
5f0c3da75926 Tiff: moved internal functions to corefcn.
magedrifaat <magedrifaat@gmail.com>
parents: 31159
diff changeset
3069 DEFUN (__tiff_write_encoded_tile__, args, ,
31146
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
3070 "Write an encoded tile to the image")
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
3071 {
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
3072 #if defined (HAVE_TIFF)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
3073 int nargin = args.length ();
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
3074
31187
2bff8446484c imformats: added logic to use Tiff interface for image functions
magedrifaat <magedrifaat@gmail.com>
parents: 31186
diff changeset
3075 // FIXME: add support for writing in YCbCr mode
31146
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
3076 if (nargin < 3)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
3077 error ("Too few arguments provided\n");
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
3078
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3079 octave_tiff_handle *tiff_handle
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3080 = octave_tiff_handle::get_tiff_handle (args(0));
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3081 check_closed (tiff_handle);
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3082
31189
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
3083 set_internal_handlers ();
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
3084
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3085 TIFF *tif = tiff_handle->get_file ();
31146
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
3086
31162
28817158ca86 Tiff: changed write functions to use fcntl wrappers.
magedrifaat <magedrifaat@gmail.com>
parents: 31161
diff changeset
3087 check_readonly (tif);
31146
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
3088
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
3089 // Obtain all necessary tags
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
3090 tiff_image_data image_data (tif);
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
3091
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
3092 if (! image_data.is_tiled)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
3093 error ("Can't write tiles to a stripped image");
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
3094
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3095 uint32_t tile_no = args(1).uint32_scalar_value ();
31146
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
3096 if (tile_no < 1 || tile_no > TIFFNumberOfTiles (tif))
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
3097 error ("Tile number out of range");
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
3098
31158
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
3099 handle_write_strip_or_tile (tif, tile_no, args(2), &image_data);
31146
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
3100
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
3101 return octave_value_list ();
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
3102 #else
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
3103 err_disabled_feature ("writeEncodedTile", "Tiff");
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
3104 #endif
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
3105 }
31148
4bc9a1938f9a Tiff: added isTiled method to check if the image is tiled or stripped
magedrifaat <magedrifaat@gmail.com>
parents: 31147
diff changeset
3106
31160
5f0c3da75926 Tiff: moved internal functions to corefcn.
magedrifaat <magedrifaat@gmail.com>
parents: 31159
diff changeset
3107 DEFUN (__tiff_is_tiled__, args, ,
31148
4bc9a1938f9a Tiff: added isTiled method to check if the image is tiled or stripped
magedrifaat <magedrifaat@gmail.com>
parents: 31147
diff changeset
3108 "Get whether the image is tiled")
4bc9a1938f9a Tiff: added isTiled method to check if the image is tiled or stripped
magedrifaat <magedrifaat@gmail.com>
parents: 31147
diff changeset
3109 {
4bc9a1938f9a Tiff: added isTiled method to check if the image is tiled or stripped
magedrifaat <magedrifaat@gmail.com>
parents: 31147
diff changeset
3110 #if defined (HAVE_TIFF)
4bc9a1938f9a Tiff: added isTiled method to check if the image is tiled or stripped
magedrifaat <magedrifaat@gmail.com>
parents: 31147
diff changeset
3111 int nargin = args.length ();
4bc9a1938f9a Tiff: added isTiled method to check if the image is tiled or stripped
magedrifaat <magedrifaat@gmail.com>
parents: 31147
diff changeset
3112
4bc9a1938f9a Tiff: added isTiled method to check if the image is tiled or stripped
magedrifaat <magedrifaat@gmail.com>
parents: 31147
diff changeset
3113 if (nargin == 0)
4bc9a1938f9a Tiff: added isTiled method to check if the image is tiled or stripped
magedrifaat <magedrifaat@gmail.com>
parents: 31147
diff changeset
3114 error ("No handle provided\n");
4bc9a1938f9a Tiff: added isTiled method to check if the image is tiled or stripped
magedrifaat <magedrifaat@gmail.com>
parents: 31147
diff changeset
3115
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3116 octave_tiff_handle *tiff_handle
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3117 = octave_tiff_handle::get_tiff_handle (args(0));
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3118 check_closed (tiff_handle);
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3119
31189
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
3120 set_internal_handlers ();
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
3121
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3122 TIFF *tif = tiff_handle->get_file ();
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3123
31148
4bc9a1938f9a Tiff: added isTiled method to check if the image is tiled or stripped
magedrifaat <magedrifaat@gmail.com>
parents: 31147
diff changeset
3124 bool is_tiled = static_cast<bool> (TIFFIsTiled (tif));
31194
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3125 return ovl (is_tiled);
31148
4bc9a1938f9a Tiff: added isTiled method to check if the image is tiled or stripped
magedrifaat <magedrifaat@gmail.com>
parents: 31147
diff changeset
3126 #else
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3127 err_disabled_feature ("isTiled", "Tiff");
31148
4bc9a1938f9a Tiff: added isTiled method to check if the image is tiled or stripped
magedrifaat <magedrifaat@gmail.com>
parents: 31147
diff changeset
3128 #endif
4bc9a1938f9a Tiff: added isTiled method to check if the image is tiled or stripped
magedrifaat <magedrifaat@gmail.com>
parents: 31147
diff changeset
3129 }
4bc9a1938f9a Tiff: added isTiled method to check if the image is tiled or stripped
magedrifaat <magedrifaat@gmail.com>
parents: 31147
diff changeset
3130
31160
5f0c3da75926 Tiff: moved internal functions to corefcn.
magedrifaat <magedrifaat@gmail.com>
parents: 31159
diff changeset
3131 DEFUN (__tiff_number_of_strips__, args, ,
31149
d4dbc69f301e Tiff: implemented numberOfStrips method
magedrifaat <magedrifaat@gmail.com>
parents: 31148
diff changeset
3132 "Get the number of strips in the image")
d4dbc69f301e Tiff: implemented numberOfStrips method
magedrifaat <magedrifaat@gmail.com>
parents: 31148
diff changeset
3133 {
d4dbc69f301e Tiff: implemented numberOfStrips method
magedrifaat <magedrifaat@gmail.com>
parents: 31148
diff changeset
3134 #if defined (HAVE_TIFF)
d4dbc69f301e Tiff: implemented numberOfStrips method
magedrifaat <magedrifaat@gmail.com>
parents: 31148
diff changeset
3135 int nargin = args.length ();
d4dbc69f301e Tiff: implemented numberOfStrips method
magedrifaat <magedrifaat@gmail.com>
parents: 31148
diff changeset
3136
d4dbc69f301e Tiff: implemented numberOfStrips method
magedrifaat <magedrifaat@gmail.com>
parents: 31148
diff changeset
3137 if (nargin == 0)
d4dbc69f301e Tiff: implemented numberOfStrips method
magedrifaat <magedrifaat@gmail.com>
parents: 31148
diff changeset
3138 error ("No handle provided\n");
d4dbc69f301e Tiff: implemented numberOfStrips method
magedrifaat <magedrifaat@gmail.com>
parents: 31148
diff changeset
3139
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3140 octave_tiff_handle *tiff_handle
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3141 = octave_tiff_handle::get_tiff_handle (args(0));
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3142 check_closed (tiff_handle);
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3143
31189
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
3144 set_internal_handlers ();
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
3145
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3146 TIFF *tif = tiff_handle->get_file ();
31152
2244617f4da5 Tiff computeStrip: fixed inconsistency in checking plane argument.
magedrifaat <magedrifaat@gmail.com>
parents: 31151
diff changeset
3147
31149
d4dbc69f301e Tiff: implemented numberOfStrips method
magedrifaat <magedrifaat@gmail.com>
parents: 31148
diff changeset
3148 if (TIFFIsTiled (tif))
d4dbc69f301e Tiff: implemented numberOfStrips method
magedrifaat <magedrifaat@gmail.com>
parents: 31148
diff changeset
3149 error ("The image is tiled not stripped");
d4dbc69f301e Tiff: implemented numberOfStrips method
magedrifaat <magedrifaat@gmail.com>
parents: 31148
diff changeset
3150
d4dbc69f301e Tiff: implemented numberOfStrips method
magedrifaat <magedrifaat@gmail.com>
parents: 31148
diff changeset
3151 double strip_count = static_cast<double> (TIFFNumberOfStrips (tif));
31194
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3152 return ovl (strip_count);
31149
d4dbc69f301e Tiff: implemented numberOfStrips method
magedrifaat <magedrifaat@gmail.com>
parents: 31148
diff changeset
3153 #else
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3154 err_disabled_feature ("numberOfStrips", "Tiff");
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3155 #endif
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3156 }
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3157
31160
5f0c3da75926 Tiff: moved internal functions to corefcn.
magedrifaat <magedrifaat@gmail.com>
parents: 31159
diff changeset
3158 DEFUN (__tiff_number_of_tiles__, args, ,
31151
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
3159 "Get the number of tiles in the image")
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
3160 {
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
3161 #if defined (HAVE_TIFF)
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
3162 int nargin = args.length ();
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
3163
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
3164 if (nargin == 0)
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
3165 error ("No handle provided\n");
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
3166
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3167 octave_tiff_handle *tiff_handle
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3168 = octave_tiff_handle::get_tiff_handle (args(0));
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3169 check_closed (tiff_handle);
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3170
31189
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
3171 set_internal_handlers ();
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
3172
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3173 TIFF *tif = tiff_handle->get_file ();
31152
2244617f4da5 Tiff computeStrip: fixed inconsistency in checking plane argument.
magedrifaat <magedrifaat@gmail.com>
parents: 31151
diff changeset
3174
31151
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
3175 if (! TIFFIsTiled (tif))
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
3176 error ("The image is stripped not tiled");
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
3177
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
3178 double tile_count = static_cast<double> (TIFFNumberOfTiles (tif));
31194
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3179 return ovl (tile_count);
31151
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
3180 #else
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
3181 err_disabled_feature ("numberOfTiles", "Tiff");
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
3182 #endif
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
3183 }
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
3184
31197
1604c8812b67 Tiff: added numberOfDirectories method.
magedrifaat <magedrifaat@gmail.com>
parents: 31196
diff changeset
3185 DEFUN (__tiff_number_of_directories__, args, ,
1604c8812b67 Tiff: added numberOfDirectories method.
magedrifaat <magedrifaat@gmail.com>
parents: 31196
diff changeset
3186 "Get the number of tiles in the image")
1604c8812b67 Tiff: added numberOfDirectories method.
magedrifaat <magedrifaat@gmail.com>
parents: 31196
diff changeset
3187 {
1604c8812b67 Tiff: added numberOfDirectories method.
magedrifaat <magedrifaat@gmail.com>
parents: 31196
diff changeset
3188 #if defined (HAVE_TIFF)
1604c8812b67 Tiff: added numberOfDirectories method.
magedrifaat <magedrifaat@gmail.com>
parents: 31196
diff changeset
3189 int nargin = args.length ();
1604c8812b67 Tiff: added numberOfDirectories method.
magedrifaat <magedrifaat@gmail.com>
parents: 31196
diff changeset
3190
1604c8812b67 Tiff: added numberOfDirectories method.
magedrifaat <magedrifaat@gmail.com>
parents: 31196
diff changeset
3191 if (nargin == 0)
1604c8812b67 Tiff: added numberOfDirectories method.
magedrifaat <magedrifaat@gmail.com>
parents: 31196
diff changeset
3192 error ("No handle provided\n");
1604c8812b67 Tiff: added numberOfDirectories method.
magedrifaat <magedrifaat@gmail.com>
parents: 31196
diff changeset
3193
1604c8812b67 Tiff: added numberOfDirectories method.
magedrifaat <magedrifaat@gmail.com>
parents: 31196
diff changeset
3194 octave_tiff_handle *tiff_handle
1604c8812b67 Tiff: added numberOfDirectories method.
magedrifaat <magedrifaat@gmail.com>
parents: 31196
diff changeset
3195 = octave_tiff_handle::get_tiff_handle (args(0));
1604c8812b67 Tiff: added numberOfDirectories method.
magedrifaat <magedrifaat@gmail.com>
parents: 31196
diff changeset
3196 check_closed (tiff_handle);
1604c8812b67 Tiff: added numberOfDirectories method.
magedrifaat <magedrifaat@gmail.com>
parents: 31196
diff changeset
3197
1604c8812b67 Tiff: added numberOfDirectories method.
magedrifaat <magedrifaat@gmail.com>
parents: 31196
diff changeset
3198 set_internal_handlers ();
1604c8812b67 Tiff: added numberOfDirectories method.
magedrifaat <magedrifaat@gmail.com>
parents: 31196
diff changeset
3199
1604c8812b67 Tiff: added numberOfDirectories method.
magedrifaat <magedrifaat@gmail.com>
parents: 31196
diff changeset
3200 TIFF *tif = tiff_handle->get_file ();
1604c8812b67 Tiff: added numberOfDirectories method.
magedrifaat <magedrifaat@gmail.com>
parents: 31196
diff changeset
3201
1604c8812b67 Tiff: added numberOfDirectories method.
magedrifaat <magedrifaat@gmail.com>
parents: 31196
diff changeset
3202 double dir_count = static_cast<double> (TIFFNumberOfDirectories (tif));
1604c8812b67 Tiff: added numberOfDirectories method.
magedrifaat <magedrifaat@gmail.com>
parents: 31196
diff changeset
3203 return ovl (dir_count);
1604c8812b67 Tiff: added numberOfDirectories method.
magedrifaat <magedrifaat@gmail.com>
parents: 31196
diff changeset
3204 #else
1604c8812b67 Tiff: added numberOfDirectories method.
magedrifaat <magedrifaat@gmail.com>
parents: 31196
diff changeset
3205 err_disabled_feature ("numberOfDirectories", "Tiff");
1604c8812b67 Tiff: added numberOfDirectories method.
magedrifaat <magedrifaat@gmail.com>
parents: 31196
diff changeset
3206 #endif
1604c8812b67 Tiff: added numberOfDirectories method.
magedrifaat <magedrifaat@gmail.com>
parents: 31196
diff changeset
3207 }
1604c8812b67 Tiff: added numberOfDirectories method.
magedrifaat <magedrifaat@gmail.com>
parents: 31196
diff changeset
3208
31160
5f0c3da75926 Tiff: moved internal functions to corefcn.
magedrifaat <magedrifaat@gmail.com>
parents: 31159
diff changeset
3209 DEFUN (__tiff_compute_strip__, args, ,
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3210 "Get the strip index containing the given row")
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3211 {
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3212 #if defined (HAVE_TIFF)
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3213 int nargin = args.length ();
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3214
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3215 if (nargin < 2 || nargin > 3)
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3216 error ("Wrong number of arguments\n");
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3217
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3218 octave_tiff_handle *tiff_handle
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3219 = octave_tiff_handle::get_tiff_handle (args(0));
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3220 check_closed (tiff_handle);
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3221
31189
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
3222 set_internal_handlers ();
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
3223
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3224 TIFF *tif = tiff_handle->get_file ();
31152
2244617f4da5 Tiff computeStrip: fixed inconsistency in checking plane argument.
magedrifaat <magedrifaat@gmail.com>
parents: 31151
diff changeset
3225
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3226 if (TIFFIsTiled (tif))
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3227 error ("The image is tiled not stripped");
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3228
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3229 tiff_image_data image_data (tif);
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3230
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3231 uint32_t row = args(1).uint32_scalar_value ();
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3232 if (row > image_data.height)
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3233 row = image_data.height;
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3234
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3235 // Convert from 1-based to zero-based indexing but avoid underflow
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3236 if (row > 0)
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3237 row--;
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3238
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3239 uint16_t plane;
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3240 if (nargin > 2)
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3241 {
31152
2244617f4da5 Tiff computeStrip: fixed inconsistency in checking plane argument.
magedrifaat <magedrifaat@gmail.com>
parents: 31151
diff changeset
3242 if (image_data.planar_configuration == PLANARCONFIG_CONTIG)
2244617f4da5 Tiff computeStrip: fixed inconsistency in checking plane argument.
magedrifaat <magedrifaat@gmail.com>
parents: 31151
diff changeset
3243 error ("Can't use plane argument for images with chunky PlanarConfiguration");
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3244 plane = args(2).uint16_scalar_value ();
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3245 if (plane > image_data.samples_per_pixel)
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3246 plane = image_data.samples_per_pixel;
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3247 if (plane > 0)
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3248 plane--;
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3249 }
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3250 else
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3251 {
31152
2244617f4da5 Tiff computeStrip: fixed inconsistency in checking plane argument.
magedrifaat <magedrifaat@gmail.com>
parents: 31151
diff changeset
3252 if (image_data.planar_configuration == PLANARCONFIG_SEPARATE)
2244617f4da5 Tiff computeStrip: fixed inconsistency in checking plane argument.
magedrifaat <magedrifaat@gmail.com>
parents: 31151
diff changeset
3253 error ("The plane argument is required for images with separate PlanarConfiguration");
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3254 plane = 0;
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3255 }
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3256
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3257 double strip_number = TIFFComputeStrip (tif, row, plane) + 1;
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3258 if (strip_number > TIFFNumberOfStrips (tif))
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3259 strip_number = TIFFNumberOfStrips (tif);
31194
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3260 return ovl (strip_number);
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3261 #else
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3262 err_disabled_feature ("computeStrip", "Tiff");
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3263 #endif
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3264 }
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3265
31160
5f0c3da75926 Tiff: moved internal functions to corefcn.
magedrifaat <magedrifaat@gmail.com>
parents: 31159
diff changeset
3266 DEFUN (__tiff_compute_tile__, args, ,
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3267 "Get the tile index containing the given row and column")
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3268 {
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3269 #if defined (HAVE_TIFF)
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3270 int nargin = args.length ();
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3271
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3272 if (nargin < 2 || nargin > 3)
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3273 error ("Wrong number of arguments\n");
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3274
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3275 octave_tiff_handle *tiff_handle
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3276 = octave_tiff_handle::get_tiff_handle (args(0));
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3277 check_closed (tiff_handle);
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3278
31189
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
3279 set_internal_handlers ();
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
3280
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3281 TIFF *tif = tiff_handle->get_file ();
31152
2244617f4da5 Tiff computeStrip: fixed inconsistency in checking plane argument.
magedrifaat <magedrifaat@gmail.com>
parents: 31151
diff changeset
3282
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3283 if (! TIFFIsTiled (tif))
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3284 error ("The image is stripped not tiled");
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3285
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3286 uint32NDArray coords = args(1).uint32_array_value ();
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3287 if (coords.dim2() < 2)
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3288 error ("Coordinates must be in the shape [row, col]");
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3289 uint32_t row = coords(0, 0);
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3290 uint32_t col = coords(0, 1);
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3291
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3292 tiff_image_data image_data (tif);
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3293
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3294 if (col > image_data.width)
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3295 col = image_data.width;
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3296 if (row > image_data.height)
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3297 row = image_data.height;
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3298
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3299 // Convert from 1-based to zero-based indexing but avoid underflow
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3300 if (row > 0)
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3301 row--;
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3302 if (col > 0)
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3303 col--;
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3304
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3305 uint16_t plane;
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3306 if (nargin > 2)
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3307 {
31152
2244617f4da5 Tiff computeStrip: fixed inconsistency in checking plane argument.
magedrifaat <magedrifaat@gmail.com>
parents: 31151
diff changeset
3308 if (image_data.planar_configuration == PLANARCONFIG_CONTIG)
2244617f4da5 Tiff computeStrip: fixed inconsistency in checking plane argument.
magedrifaat <magedrifaat@gmail.com>
parents: 31151
diff changeset
3309 error ("Can't use plane argument for images with chunky PlanarConfiguration");
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3310 plane = args(2).uint16_scalar_value ();
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3311 if (plane > image_data.samples_per_pixel)
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3312 plane = image_data.samples_per_pixel;
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3313 if (plane > 0)
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3314 plane--;
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3315 }
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3316 else
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3317 {
31152
2244617f4da5 Tiff computeStrip: fixed inconsistency in checking plane argument.
magedrifaat <magedrifaat@gmail.com>
parents: 31151
diff changeset
3318 if (image_data.planar_configuration == PLANARCONFIG_SEPARATE)
2244617f4da5 Tiff computeStrip: fixed inconsistency in checking plane argument.
magedrifaat <magedrifaat@gmail.com>
parents: 31151
diff changeset
3319 error ("The plane argument is required for images with separate PlanarConfiguration");
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3320 plane = 0;
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3321 }
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3322
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3323 double tile_number = TIFFComputeTile (tif, col, row, 0, plane) + 1;
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3324 if (tile_number > TIFFNumberOfTiles (tif))
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3325 tile_number = TIFFNumberOfTiles (tif);
31194
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3326 return ovl (tile_number);
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3327 #else
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
3328 err_disabled_feature ("computeTile", "Tiff");
31149
d4dbc69f301e Tiff: implemented numberOfStrips method
magedrifaat <magedrifaat@gmail.com>
parents: 31148
diff changeset
3329 #endif
d4dbc69f301e Tiff: implemented numberOfStrips method
magedrifaat <magedrifaat@gmail.com>
parents: 31148
diff changeset
3330 }
d4dbc69f301e Tiff: implemented numberOfStrips method
magedrifaat <magedrifaat@gmail.com>
parents: 31148
diff changeset
3331
31172
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3332 DEFUN (__tiff_current_directory__, args, ,
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3333 "Get the index of the current directory")
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3334 {
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3335 #if defined (HAVE_TIFF)
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3336 int nargin = args.length ();
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3337
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3338 if (nargin != 1)
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3339 error ("Wrong number of arguments\n");
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3340
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3341 octave_tiff_handle *tiff_handle
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3342 = octave_tiff_handle::get_tiff_handle (args(0));
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3343 check_closed (tiff_handle);
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3344
31189
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
3345 set_internal_handlers ();
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
3346
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3347 TIFF *tif = tiff_handle->get_file ();
31172
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3348
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3349 uint16_t dir = TIFFCurrentDirectory (tif);
31175
ed329571ec88 Tiff: added support for creating and reading sub-directories
magedrifaat <magedrifaat@gmail.com>
parents: 31174
diff changeset
3350 dir++;
31172
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3351
31194
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3352 return ovl (static_cast<double> (dir));
31172
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3353 #else
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3354 err_disabled_feature ("currentDirectory", "Tiff");
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3355 #endif
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3356 }
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3357
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3358 DEFUN (__tiff_last_directory__, args, ,
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3359 "Get the whether the current directory is the last")
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3360 {
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3361 #if defined (HAVE_TIFF)
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3362 int nargin = args.length ();
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3363
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3364 if (nargin != 1)
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3365 error ("Wrong number of arguments\n");
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3366
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3367 octave_tiff_handle *tiff_handle
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3368 = octave_tiff_handle::get_tiff_handle (args(0));
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3369 check_closed (tiff_handle);
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3370
31189
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
3371 set_internal_handlers ();
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
3372
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3373 TIFF *tif = tiff_handle->get_file ();
31172
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3374
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3375 bool is_last = TIFFLastDirectory (tif);
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3376
31194
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3377 return ovl (is_last);
31172
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3378 #else
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3379 err_disabled_feature ("lastDirectory", "Tiff");
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3380 #endif
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3381 }
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3382
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3383 DEFUN (__tiff_next_directory__, args, ,
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3384 "Set the next IFD as the current IFD")
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3385 {
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3386 #if defined (HAVE_TIFF)
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3387 int nargin = args.length ();
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3388
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3389 if (nargin != 1)
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3390 error ("Wrong number of arguments\n");
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3391
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3392 octave_tiff_handle *tiff_handle
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3393 = octave_tiff_handle::get_tiff_handle (args(0));
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3394 check_closed (tiff_handle);
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3395
31189
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
3396 set_internal_handlers ();
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
3397
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3398 TIFF *tif = tiff_handle->get_file ();
31172
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3399
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3400 bool is_last = TIFFLastDirectory (tif);
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3401 if (is_last)
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3402 error ("Current directory is the last directory");
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3403
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3404 if (! TIFFReadDirectory (tif))
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3405 error ("Failed to read the next directory");
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3406
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3407 return octave_value_list ();
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3408 #else
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3409 err_disabled_feature ("nextDirectory", "Tiff");
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3410 #endif
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3411 }
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3412
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3413 DEFUN (__tiff_set_directory__, args, ,
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3414 "Set the current IFD using the given index")
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3415 {
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3416 #if defined (HAVE_TIFF)
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3417 int nargin = args.length ();
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3418
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3419 if (nargin != 2)
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3420 error ("Wrong number of arguments\n");
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3421
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3422 octave_tiff_handle *tiff_handle
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3423 = octave_tiff_handle::get_tiff_handle (args(0));
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3424 check_closed (tiff_handle);
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3425
31189
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
3426 set_internal_handlers ();
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
3427
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3428 TIFF *tif = tiff_handle->get_file ();
31172
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3429
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3430 uint16_t dir = args(1).uint16_scalar_value ();
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3431 if (dir < 1 || dir > TIFFNumberOfDirectories (tif))
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3432 error ("Directory index out of bounds");
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3433
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3434 dir--;
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3435
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3436 if (! TIFFSetDirectory(tif, dir))
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3437 error ("Failed to read directory");
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3438
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3439 return octave_value_list ();
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3440 #else
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3441 err_disabled_feature ("setDirectory", "Tiff");
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3442 #endif
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3443 }
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3444
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3445 DEFUN (__tiff_write_directory__, args, ,
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3446 "Write the current IFD to file and create a new one")
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3447 {
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3448 #if defined (HAVE_TIFF)
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3449 int nargin = args.length ();
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3450
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3451 if (nargin != 1)
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3452 error ("Wrong number of arguments\n");
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3453
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3454 octave_tiff_handle *tiff_handle
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3455 = octave_tiff_handle::get_tiff_handle (args(0));
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3456 check_closed (tiff_handle);
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3457
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3458 TIFF *tif = tiff_handle->get_file ();
31175
ed329571ec88 Tiff: added support for creating and reading sub-directories
magedrifaat <magedrifaat@gmail.com>
parents: 31174
diff changeset
3459
31172
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3460 if (! TIFFWriteDirectory(tif))
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3461 error ("Failed to write directory");
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3462
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3463 return octave_value_list ();
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3464 #else
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3465 err_disabled_feature ("writeDirectory", "Tiff");
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3466 #endif
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3467 }
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3468
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3469 DEFUN (__tiff_rewrite_directory__, args, ,
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3470 "Rewrite modifications to the current IFD")
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3471 {
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3472 #if defined (HAVE_TIFF)
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3473 int nargin = args.length ();
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3474
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3475 if (nargin != 1)
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3476 error ("Wrong number of arguments\n");
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3477
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3478 octave_tiff_handle *tiff_handle
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3479 = octave_tiff_handle::get_tiff_handle (args(0));
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3480 check_closed (tiff_handle);
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3481
31189
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
3482 set_internal_handlers ();
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
3483
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3484 TIFF *tif = tiff_handle->get_file ();
31173
0abc9779f751 Tiff: modified readRGBAImage to use the orientation tag correctly
magedrifaat <magedrifaat@gmail.com>
parents: 31172
diff changeset
3485
31172
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3486 if (! TIFFRewriteDirectory(tif))
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3487 error ("Failed to rewrite directory");
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3488
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3489 return octave_value_list ();
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3490 #else
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3491 err_disabled_feature ("rewriteDirectory", "Tiff");
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3492 #endif
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3493 }
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3494
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3495 DEFUN (__tiff_set_sub_directory__, args, ,
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3496 "Set the given offset directory as the current IFD")
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3497 {
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3498 #if defined (HAVE_TIFF)
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3499 int nargin = args.length ();
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3500
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3501 if (nargin != 2)
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3502 error ("Wrong number of arguments\n");
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3503
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3504 octave_tiff_handle *tiff_handle
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3505 = octave_tiff_handle::get_tiff_handle (args(0));
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3506 check_closed (tiff_handle);
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3507
31189
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
3508 set_internal_handlers ();
31190
a91f2f79e58c Tiff: added internal handler for imread using the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31189
diff changeset
3509
31177
c7c79973007f Tiff: added octave_tiff_handle class to wrap the Tiff file pointer
magedrifaat <magedrifaat@gmail.com>
parents: 31176
diff changeset
3510 TIFF *tif = tiff_handle->get_file ();
31172
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3511
31175
ed329571ec88 Tiff: added support for creating and reading sub-directories
magedrifaat <magedrifaat@gmail.com>
parents: 31174
diff changeset
3512 if (! args(1).is_double_type () && ! args(1).is_uint32_type ()
ed329571ec88 Tiff: added support for creating and reading sub-directories
magedrifaat <magedrifaat@gmail.com>
parents: 31174
diff changeset
3513 && ! args(1).is_uint64_type ())
ed329571ec88 Tiff: added support for creating and reading sub-directories
magedrifaat <magedrifaat@gmail.com>
parents: 31174
diff changeset
3514 error ("Expected offset of type double, uint32 or uint64");
ed329571ec88 Tiff: added support for creating and reading sub-directories
magedrifaat <magedrifaat@gmail.com>
parents: 31174
diff changeset
3515
ed329571ec88 Tiff: added support for creating and reading sub-directories
magedrifaat <magedrifaat@gmail.com>
parents: 31174
diff changeset
3516 uint16_t count;
ed329571ec88 Tiff: added support for creating and reading sub-directories
magedrifaat <magedrifaat@gmail.com>
parents: 31174
diff changeset
3517 uint64_t *offsets;
ed329571ec88 Tiff: added support for creating and reading sub-directories
magedrifaat <magedrifaat@gmail.com>
parents: 31174
diff changeset
3518 if (! TIFFGetField (tif, TIFFTAG_SUBIFD, &count, &offsets))
ed329571ec88 Tiff: added support for creating and reading sub-directories
magedrifaat <magedrifaat@gmail.com>
parents: 31174
diff changeset
3519 error ("The current directory doesn't have sub directories");
ed329571ec88 Tiff: added support for creating and reading sub-directories
magedrifaat <magedrifaat@gmail.com>
parents: 31174
diff changeset
3520
31172
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3521 uint64_t offset = args(1).uint64_scalar_value ();
31175
ed329571ec88 Tiff: added support for creating and reading sub-directories
magedrifaat <magedrifaat@gmail.com>
parents: 31174
diff changeset
3522
ed329571ec88 Tiff: added support for creating and reading sub-directories
magedrifaat <magedrifaat@gmail.com>
parents: 31174
diff changeset
3523 int found = 0;
ed329571ec88 Tiff: added support for creating and reading sub-directories
magedrifaat <magedrifaat@gmail.com>
parents: 31174
diff changeset
3524 for (uint16_t i = 0; i < count; i++)
ed329571ec88 Tiff: added support for creating and reading sub-directories
magedrifaat <magedrifaat@gmail.com>
parents: 31174
diff changeset
3525 if (offset == offsets[i])
ed329571ec88 Tiff: added support for creating and reading sub-directories
magedrifaat <magedrifaat@gmail.com>
parents: 31174
diff changeset
3526 {
ed329571ec88 Tiff: added support for creating and reading sub-directories
magedrifaat <magedrifaat@gmail.com>
parents: 31174
diff changeset
3527 found = 1;
ed329571ec88 Tiff: added support for creating and reading sub-directories
magedrifaat <magedrifaat@gmail.com>
parents: 31174
diff changeset
3528 break;
ed329571ec88 Tiff: added support for creating and reading sub-directories
magedrifaat <magedrifaat@gmail.com>
parents: 31174
diff changeset
3529 }
ed329571ec88 Tiff: added support for creating and reading sub-directories
magedrifaat <magedrifaat@gmail.com>
parents: 31174
diff changeset
3530
ed329571ec88 Tiff: added support for creating and reading sub-directories
magedrifaat <magedrifaat@gmail.com>
parents: 31174
diff changeset
3531 if (! found)
ed329571ec88 Tiff: added support for creating and reading sub-directories
magedrifaat <magedrifaat@gmail.com>
parents: 31174
diff changeset
3532 error ("No Sub directory with the given offset");
ed329571ec88 Tiff: added support for creating and reading sub-directories
magedrifaat <magedrifaat@gmail.com>
parents: 31174
diff changeset
3533
31172
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3534 if (! TIFFSetSubDirectory (tif, offset))
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3535 error ("Failed to switch to the sub directory");
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3536
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3537 return octave_value_list ();
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3538 #else
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3539 err_disabled_feature ("setSubDirectory", "Tiff");
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3540 #endif
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3541 }
3f5f1404af8a Tiff: added directory methods (currentDirectory, nextDirectory, ...)
magedrifaat <magedrifaat@gmail.com>
parents: 31171
diff changeset
3542
31160
5f0c3da75926 Tiff: moved internal functions to corefcn.
magedrifaat <magedrifaat@gmail.com>
parents: 31159
diff changeset
3543 DEFUN (__tiff_version__, , ,
31151
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
3544 "Get the version stamp of LibTIFF")
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
3545 {
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
3546 #if defined (HAVE_TIFF)
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
3547 std::string version = std::string (TIFFGetVersion ());
31194
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3548 return ovl (version);
31151
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
3549 #else
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
3550 err_disabled_feature ("getVersion", "Tiff");
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
3551 #endif
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
3552 }
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
3553
31161
b731c8f6db95 Tiff: added setLibTIFFErrorsEnabled method to enable/disable LibTIFF errors
magedrifaat <magedrifaat@gmail.com>
parents: 31160
diff changeset
3554 DEFUN (__tiff_set_errors_enabled__, args, ,
b731c8f6db95 Tiff: added setLibTIFFErrorsEnabled method to enable/disable LibTIFF errors
magedrifaat <magedrifaat@gmail.com>
parents: 31160
diff changeset
3555 "Enables or Disables error output from LibTIFF")
b731c8f6db95 Tiff: added setLibTIFFErrorsEnabled method to enable/disable LibTIFF errors
magedrifaat <magedrifaat@gmail.com>
parents: 31160
diff changeset
3556 {
b731c8f6db95 Tiff: added setLibTIFFErrorsEnabled method to enable/disable LibTIFF errors
magedrifaat <magedrifaat@gmail.com>
parents: 31160
diff changeset
3557 #if defined (HAVE_TIFF)
31163
d701c6a4cda1 Tiff: improved handling LibTIFF error output silencing.
magedrifaat <magedrifaat@gmail.com>
parents: 31162
diff changeset
3558 if (args.length () == 0)
d701c6a4cda1 Tiff: improved handling LibTIFF error output silencing.
magedrifaat <magedrifaat@gmail.com>
parents: 31162
diff changeset
3559 error ("No state argument provided");
d701c6a4cda1 Tiff: improved handling LibTIFF error output silencing.
magedrifaat <magedrifaat@gmail.com>
parents: 31162
diff changeset
3560
d701c6a4cda1 Tiff: improved handling LibTIFF error output silencing.
magedrifaat <magedrifaat@gmail.com>
parents: 31162
diff changeset
3561 if (! args(0).is_bool_scalar ())
d701c6a4cda1 Tiff: improved handling LibTIFF error output silencing.
magedrifaat <magedrifaat@gmail.com>
parents: 31162
diff changeset
3562 error ("Expected logical value as argument");
d701c6a4cda1 Tiff: improved handling LibTIFF error output silencing.
magedrifaat <magedrifaat@gmail.com>
parents: 31162
diff changeset
3563
31178
14edd6b09efe Tiff: added support for reading and writing signed images
magedrifaat <magedrifaat@gmail.com>
parents: 31177
diff changeset
3564 // Set the error and warning handlers according to the bool parameter
31189
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
3565 handlers_set = args(0).bool_value ();
6a9d985e7474 Tiff: fixed bug graphicsmagick error handler colliding with our handler
magedrifaat <magedrifaat@gmail.com>
parents: 31187
diff changeset
3566 set_internal_handlers ();
31161
b731c8f6db95 Tiff: added setLibTIFFErrorsEnabled method to enable/disable LibTIFF errors
magedrifaat <magedrifaat@gmail.com>
parents: 31160
diff changeset
3567
b731c8f6db95 Tiff: added setLibTIFFErrorsEnabled method to enable/disable LibTIFF errors
magedrifaat <magedrifaat@gmail.com>
parents: 31160
diff changeset
3568 return octave_value_list ();
b731c8f6db95 Tiff: added setLibTIFFErrorsEnabled method to enable/disable LibTIFF errors
magedrifaat <magedrifaat@gmail.com>
parents: 31160
diff changeset
3569 #else
b731c8f6db95 Tiff: added setLibTIFFErrorsEnabled method to enable/disable LibTIFF errors
magedrifaat <magedrifaat@gmail.com>
parents: 31160
diff changeset
3570 err_disabled_feature ("setErrorEnabled", "Tiff");
b731c8f6db95 Tiff: added setLibTIFFErrorsEnabled method to enable/disable LibTIFF errors
magedrifaat <magedrifaat@gmail.com>
parents: 31160
diff changeset
3571 #endif
b731c8f6db95 Tiff: added setLibTIFFErrorsEnabled method to enable/disable LibTIFF errors
magedrifaat <magedrifaat@gmail.com>
parents: 31160
diff changeset
3572 }
b731c8f6db95 Tiff: added setLibTIFFErrorsEnabled method to enable/disable LibTIFF errors
magedrifaat <magedrifaat@gmail.com>
parents: 31160
diff changeset
3573
31185
a1145ac2ce9b Tiff: populated TagID from the C++ map to avoid having two copies
magedrifaat <magedrifaat@gmail.com>
parents: 31184
diff changeset
3574 DEFUN (__tiff_make_tagid__, , ,
a1145ac2ce9b Tiff: populated TagID from the C++ map to avoid having two copies
magedrifaat <magedrifaat@gmail.com>
parents: 31184
diff changeset
3575 "Create the TagID structure from the internal map")
a1145ac2ce9b Tiff: populated TagID from the C++ map to avoid having two copies
magedrifaat <magedrifaat@gmail.com>
parents: 31184
diff changeset
3576 {
31187
2bff8446484c imformats: added logic to use Tiff interface for image functions
magedrifaat <magedrifaat@gmail.com>
parents: 31186
diff changeset
3577 #if defined (HAVE_TIFF)
31185
a1145ac2ce9b Tiff: populated TagID from the C++ map to avoid having two copies
magedrifaat <magedrifaat@gmail.com>
parents: 31184
diff changeset
3578 std::map<std::string, octave_value> tag_ov_map;
a1145ac2ce9b Tiff: populated TagID from the C++ map to avoid having two copies
magedrifaat <magedrifaat@gmail.com>
parents: 31184
diff changeset
3579 for (auto it = tag_name_map.cbegin (); it != tag_name_map.cend (); it++)
a1145ac2ce9b Tiff: populated TagID from the C++ map to avoid having two copies
magedrifaat <magedrifaat@gmail.com>
parents: 31184
diff changeset
3580 tag_ov_map[it->first] = octave_value (it->second);
a1145ac2ce9b Tiff: populated TagID from the C++ map to avoid having two copies
magedrifaat <magedrifaat@gmail.com>
parents: 31184
diff changeset
3581 return octave_value_list(octave_scalar_map (tag_ov_map));
31187
2bff8446484c imformats: added logic to use Tiff interface for image functions
magedrifaat <magedrifaat@gmail.com>
parents: 31186
diff changeset
3582 #else
2bff8446484c imformats: added logic to use Tiff interface for image functions
magedrifaat <magedrifaat@gmail.com>
parents: 31186
diff changeset
3583 err_disabled_feature ("F__tiff_make_tagid__", "Tiff");
2bff8446484c imformats: added logic to use Tiff interface for image functions
magedrifaat <magedrifaat@gmail.com>
parents: 31186
diff changeset
3584 #endif
31185
a1145ac2ce9b Tiff: populated TagID from the C++ map to avoid having two copies
magedrifaat <magedrifaat@gmail.com>
parents: 31184
diff changeset
3585 }
31190
a91f2f79e58c Tiff: added internal handler for imread using the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31189
diff changeset
3586
31193
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3587 DEFUN (__tiff_imwrite__, args, ,
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3588 "Handler for imwrite that uses Tiff interface")
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3589 {
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3590 #if defined (HAVE_TIFF)
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3591 int nargin = args.length ();
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3592
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3593 if (nargin < 2)
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3594 error ("imwrite: Wrong number of arguments");
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3595
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3596 if (! (args(0).isnumeric () || args(0).is_bool_matrix ()
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3597 || args(0).is_bool_scalar ()))
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3598 error ("imwrite: Expected image matrix as first argument");
31194
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3599
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3600 // The argument checks here are very similar to the ones found in
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3601 // __imwrite__.m and imwrite_filename.m, the code is duplicated here since
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3602 // the original code is tailored to the generic library graphicsmagick
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3603 // so it is not suitable to be used directly for this case
31193
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3604 uint16_t offset = 1;
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3605 std::string filename;
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3606 octave_value cmap = octave_value (NDArray ());
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3607 if (args(1).is_string ())
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3608 {
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3609 filename = args(1).string_value ();
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3610 offset++;
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3611 }
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3612 else if (nargin > 2 && is_colormap (args(1)) && args(2).is_string ())
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3613 {
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3614 filename = args(2).string_value ();
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3615 cmap = args(1);
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3616 offset += 2;
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3617 }
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3618 else
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3619 error ("imwrite: no FILENAME specified");
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3620
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3621 filename = sys::file_ops::tilde_expand (filename);
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3622
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3623 if (nargin > offset && (nargin - offset) % 2 != 0
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3624 && args(offset).is_string ())
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3625 offset++;
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3626
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3627 if ((nargin - offset) % 2 != 0)
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3628 error ("imwrite: no pair for all arguments (odd number left)");
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3629
31194
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3630 // Setting the default value for the rest of the parameters
31193
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3631 bool append = false;
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3632 uint16_t compression = COMPRESSION_NONE;
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3633 uint32_t rows_per_strip = UINT32_MAX;
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3634 float x_res = 72, y_res = 72;
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3635 std::string description = "";
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3636
31194
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3637 // Extract the values for the paramters provided
31193
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3638 for (uint16_t arg_idx = offset; arg_idx < nargin; arg_idx+=2)
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3639 {
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3640 if (! args(arg_idx).is_string ())
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3641 error ("imwrite: PARAM in PARAM/VALUE pair must be string");
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3642
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3643 const char *param_cstr = args(arg_idx).string_value ().c_str ();
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3644 if (strcasecmp (param_cstr, "colorspace") == 0)
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3645 {
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3646 // Matlab specifies three colorspaces: RGB, CIELAB and ICCLAB.
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3647 // Of the three, only RGB is currently supported so this tag
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3648 // can be ignored.
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3649 }
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3650 else if (strcasecmp (param_cstr, "compression") == 0)
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3651 {
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3652 if (! args(arg_idx + 1).is_string ())
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3653 error ("imwrite: value for %s option must be a string",
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3654 param_cstr);
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3655 std::string comp = args(arg_idx + 1).string_value ();
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3656 if (comp == "packbits")
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3657 compression = COMPRESSION_PACKBITS;
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3658 else if (comp == "lzw")
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3659 compression = COMPRESSION_LZW;
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3660 else if (comp == "deflate")
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3661 compression = COMPRESSION_DEFLATE;
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3662 else if (comp == "jpeg")
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3663 compression = COMPRESSION_JPEG;
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3664 else if (comp == "ccitt")
31194
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3665 compression = COMPRESSION_CCITTRLE;
31193
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3666 else if (comp == "fax3")
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3667 compression = COMPRESSION_CCITTFAX3;
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3668 else if (comp == "fax4")
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3669 compression = COMPRESSION_CCITTFAX4;
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3670 else
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3671 error ("imwrite: invalid compression '%s'", comp.c_str ());
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3672 }
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3673 else if (strcasecmp (param_cstr, "Description") == 0)
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3674 {
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3675 if (! args(arg_idx + 1).is_string ())
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3676 error ("imwrite: value for %s option must be a string",
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3677 param_cstr);
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3678 description = args(arg_idx + 1).string_value ();
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3679 }
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3680 else if (strcasecmp (param_cstr, "resolution") == 0)
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3681 {
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3682 if (! args(arg_idx + 1).isnumeric ())
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3683 error ("imwrite: value for %s option must be numeric",
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3684 param_cstr);
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3685 NDArray res = args(arg_idx + 1).array_value ();
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3686 if (res.numel () == 1)
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3687 {
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3688 x_res = res(0);
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3689 y_res = res(0);
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3690 }
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3691 else if (res.numel () == 2)
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3692 {
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3693 x_res = res(0);
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3694 y_res = res(1);
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3695 }
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3696 else
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3697 error ("imwrite: value for %s option must be either a scalar value or a two-element vector",
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3698 param_cstr);
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3699 }
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3700 else if (strcasecmp (param_cstr, "RowsPerStrip") == 0)
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3701 {
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3702 if (! args(arg_idx + 1).isnumeric ()
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3703 || ! args(arg_idx + 1).is_scalar_type ())
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3704 error ("imwrite: value for %s option must be a scalar value",
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3705 param_cstr);
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3706 rows_per_strip = args(arg_idx + 1).uint32_scalar_value ();
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3707 }
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3708 else if (strcasecmp (param_cstr, "WriteMode") == 0)
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3709 {
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3710 if (! args(arg_idx + 1).is_string ())
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3711 error ("imwrite: value for %s option must be a string",
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3712 param_cstr);
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3713 std::string wmode = args(arg_idx + 1).string_value ();
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3714 if (wmode == "overwrite")
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3715 append = false;
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3716 else if (wmode == "append")
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3717 append = true;
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3718 else
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3719 error ("imwrite: value for %s option must be either 'overwrite' or 'append'",
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3720 param_cstr);
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3721 }
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3722 else
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3723 error ("imread: invalid PARAMETER '%s'", param_cstr);
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3724 }
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3725
31194
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3726 // Matlab specifies that JPEG compression must also specify RowsPerStrip
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3727 // and must be a value divisible by 8
31193
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3728 if (compression == COMPRESSION_JPEG
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3729 && (rows_per_strip == UINT32_MAX || rows_per_strip % 8 != 0))
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3730 error ("imwrite: RowsPerStrip option must be specified for jpeg compression and must be divisible by 8");
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3731
31194
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3732 // These compression schemes are only available for binary images
31193
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3733 if (! (args(0).is_bool_matrix () || args(0).is_bool_scalar ())
31194
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3734 && (compression == COMPRESSION_CCITTRLE
31193
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3735 || compression == COMPRESSION_CCITTFAX3
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3736 || compression == COMPRESSION_CCITTFAX4))
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3737 error ("imwrite: the specified compression scheme is for binary images only");
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3738
31194
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3739 // Matlab rejects 4D data for TIFF images
31193
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3740 dim_vector img_dims = args(0).dims ();
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3741 if (args(0).ndims () != 2 && args(0).ndims () != 3)
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3742 error ("imwrite: expected 2-dimensional or 3-dimensional image matrix");
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3743
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3744 if (args(0).ndims () > 2 && img_dims(2) > 1 && cmap.numel () > 0)
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3745 error ("imwrite: palette images must be 1 channel only");
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3746
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3747 TIFF *tif;
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3748 if (append)
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3749 tif = TIFFOpen (filename.c_str (), "a");
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3750 else
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3751 tif = TIFFOpen (filename.c_str (), "w");
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3752
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3753 if (! tif)
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3754 error ("Failed to open file %s", filename.c_str ());
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3755
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3756 // A simple way to make sure the file will be closed when the function
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3757 // returns or when an error occurs as the destructor will always be called
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3758 octave_tiff_handle tiff_handle (tif);
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3759
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3760 // Set all necessary tags
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3761 if (! TIFFSetField (tif, TIFFTAG_IMAGELENGTH,
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3762 static_cast<uint32_t>(img_dims(0)))
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3763 || ! TIFFSetField (tif, TIFFTAG_IMAGEWIDTH,
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3764 static_cast<uint32_t>(img_dims(1))))
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3765 error ("Failed to set image dimensions");
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3766
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3767 if (img_dims.ndims () > 2)
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3768 if (! TIFFSetField (tif, TIFFTAG_SAMPLESPERPIXEL, img_dims(2)))
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3769 error ("Failed to set the number of samples");
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3770
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3771 if (! TIFFSetField (tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG))
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3772 error ("Failed to set the planar configuration");
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3773
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3774 if (! TIFFSetField (tif, TIFFTAG_COMPRESSION, compression))
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3775 error ("Failed to set the compressoin tag");
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3776
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3777 if (! TIFFSetField (tif, TIFFTAG_XRESOLUTION, x_res)
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3778 || ! TIFFSetField (tif, TIFFTAG_YRESOLUTION, y_res))
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3779 error ("Failed to set resolution tag");
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3780
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3781 if (! TIFFSetField (tif, TIFFTAG_IMAGEDESCRIPTION, description.c_str ()))
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3782 error ("Failed to set description tag");
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3783
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3784 if (rows_per_strip == UINT32_MAX)
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3785 rows_per_strip = TIFFDefaultStripSize (tif, 0);
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3786
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3787 if (! TIFFSetField (tif, TIFFTAG_ROWSPERSTRIP, rows_per_strip))
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3788 error ("Failed to set the RowsPerStrip tag");
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3789
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3790 uint16_t bits_per_sample;
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3791 if (args(0).is_bool_matrix () || args(0).is_bool_scalar ())
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3792 bits_per_sample = 1;
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3793 else if (args(0).is_uint8_type ())
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3794 bits_per_sample = 8;
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3795 else if (args(0).is_uint16_type ())
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3796 bits_per_sample = 16;
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3797 else if (args(0).is_uint32_type () || args(0).is_single_type ())
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3798 bits_per_sample = 32;
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3799 else if (args(0).is_double_type ())
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3800 bits_per_sample = 64;
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3801 else
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3802 error ("imwrite: unsupported image data type");
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3803
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3804 if (! TIFFSetField (tif, TIFFTAG_BITSPERSAMPLE, bits_per_sample))
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3805 error ("Failed to set BitsPerSample tag");
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3806
31194
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3807 // Infer the photometric interpretation of the image from the color map
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3808 // and the number of channels of the input
31193
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3809 uint16_t photometric = PHOTOMETRIC_MINISBLACK;
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3810 if (cmap.numel () > 0)
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3811 {
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3812 photometric = PHOTOMETRIC_PALETTE;
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3813 set_field_data (tif, TIFFFieldWithTag (tif, TIFFTAG_COLORMAP),
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3814 cmap);
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3815 }
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3816 else if (img_dims(2) == 3)
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3817 photometric = PHOTOMETRIC_RGB;
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3818 else if (img_dims(2) == 4)
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3819 photometric = PHOTOMETRIC_SEPARATED;
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3820
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3821 if (! TIFFSetField (tif, TIFFTAG_PHOTOMETRIC, photometric))
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3822 error ("Failed to set the photometric tag");
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3823
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3824 tiff_image_data image_data (tif);
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3825 if (args(0).is_bool_scalar () || args(0).is_bool_matrix ()
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3826 || args(0).is_uint8_type () || args(0).is_uint16_type ()
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3827 || args(0).is_uint32_type ())
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3828 write_unsigned_image (tif, args(0), &image_data);
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3829 else
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3830 {
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3831 if (!TIFFSetField (tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_IEEEFP))
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3832 error ("Failed to set SampleFormat tag");
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3833 write_float_image (tif, args(0).as_double (), &image_data);
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3834 }
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3835
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3836 return octave_value_list ();
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3837 #else
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3838 err_disabled_feature ("imwrite", "Tiff");
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3839 #endif
c142c153034c Tiff: implemented imwrite handler that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31192
diff changeset
3840 }
31194
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3841
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3842 DEFUN (__tiff_imfinfo__, args, ,
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3843 "Handler for imfinfo that uses Tiff interface")
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3844 {
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3845 #if defined (HAVE_TIFF)
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3846 int nargin = args.length ();
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3847
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3848 if (nargin < 1)
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3849 error ("imfinfo: missing filename argument");
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3850
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3851 if (! args(0).is_string ())
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3852 error ("imfinfo: filename must be a string");
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3853
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3854 std::string filename = args(0).string_value ();
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3855
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3856 const sys::file_stat fs (filename);
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3857 if (! fs)
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3858 error ("imfinfo: error reading '%s': %s", filename.c_str (),
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3859 fs.error ().c_str ());
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3860
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3861 TIFF *tif = TIFFOpen (filename.c_str (), "rc");
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3862 if (! tif)
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3863 error ("imfinfo: error reading '%s': LibTIFF failed to read file",
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3864 filename.c_str ());
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3865
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3866 // The destructor for this object will be called when the function returnd
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3867 // or in case of an error so the file will always get closed at the end
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3868 octave_tiff_handle tiff_handle (tif);
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3869
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3870 // A lot of the logic here is copied from __magick_finfo__ due to the
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3871 // great similarity between the two functions but this function is
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3872 // format specific so a lot of the details are different
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3873 uint16_t dir_count = TIFFNumberOfDirectories (tif);
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3874
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3875 // Null terminated char* list to be used to create a string_vector
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3876 static const char *fields[] = {
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3877 "Filename",
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3878 "FileModDate",
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3879 "FileSize",
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3880 "Format",
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3881 "FormatVersion",
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3882 "Width",
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3883 "Height",
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3884 "BitDepth",
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3885 "ColorType",
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3886 "FormatSignature",
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3887 "ByteOrder",
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3888 "NewSubFileType",
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3889 "BitsPerSample",
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3890 "Compression",
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3891 "PhotometricInterpretation",
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3892 "StripOffsets",
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3893 "SamplesPerPixel",
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3894 "RowsPerStrip",
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3895 "StripByteCounts",
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3896 "XResolution",
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3897 "YResolution",
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3898 "ResolutionUnit",
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3899 "Colormap",
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3900 "PlanarConfiguration",
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3901 "TileWidth",
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3902 "TileLength",
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3903 "TileOffsets",
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3904 "TileByteCounts",
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3905 "Orientation",
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3906 "FillOrder",
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3907 "GrayResponseUnit",
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3908 "MaxSampleValue",
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3909 "MinSampleValue",
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3910 "Thresholding",
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3911 "Offset",
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3912 "ImageDescription",
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3913 nullptr
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3914 };
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3915
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3916 // A map to be used as a struct array to hold a scalar_map for each
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3917 // directory
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3918 octave_map info (dim_vector (dir_count, 1), string_vector (fields));
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3919
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3920 // populate template_info with the info that is common between all
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3921 // directories in the file
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3922 octave_scalar_map template_info = (string_vector (fields));
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3923 template_info.setfield ("Format", octave_value ("tif"));
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3924 template_info.setfield ("FormatVersion", octave_value (""));
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3925 const sys::localtime mtime (fs.mtime ());
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3926 const std::string filetime = mtime.strftime ("%e-%b-%Y %H:%M:%S");
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3927 template_info.setfield ("Filename", octave_value (filename));
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3928 template_info.setfield ("FileModDate", octave_value (filetime));
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3929 template_info.setfield ("FileSize", octave_value (fs.size ()));
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3930
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3931 // Extract the image signature (first 4 bytes in file)
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3932 std::ifstream tif_file;
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3933 #if defined (OCTAVE_USE_WINDOWS_API)
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3934 std::wstring wname = sys::u8_to_wstring (filename);
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3935 tif_file.open (wname.c_str (), std::ios_base::binary);
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3936 #else
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3937 tif_file.open (filename.c_str (), std::ios_base::binary);
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3938 #endif
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3939 uint8NDArray signature (dim_vector (1, 4));;
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3940 tif_file.read (reinterpret_cast<char *> (signature.fortran_vec ()), 4);
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3941 tif_file.close ();
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3942 template_info.setfield ("FormatSignature", octave_value (signature));
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3943
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3944 std::string byte_order
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3945 = TIFFIsBigEndian (tif)? "big-endian": "little-endian";
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3946 template_info.setfield ("ByteOrder", octave_value (byte_order));
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3947
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3948 // Extract directory specific information
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3949 for (uint16_t dir = 0; dir < dir_count; dir++)
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3950 {
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3951 octave_scalar_map dir_info (template_info);
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3952
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3953 // Switch to the directory
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3954 if (! TIFFSetDirectory (tif, dir))
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3955 error ("imfinfo: Failed to access frame %d\n", dir);
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3956
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3957 tiff_image_data image_data (tif);
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3958 dir_info.setfield ("Width", octave_value (image_data.width));
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3959
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3960 dir_info.setfield ("Height", octave_value (image_data.height));
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3961
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3962 uint16_t bit_depth = image_data.samples_per_pixel
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3963 * image_data.bits_per_sample;
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3964 dir_info.setfield ("BitDepth", octave_value (bit_depth));
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3965
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3966 std::string planar = "unrecognized";
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3967 if (image_data.planar_configuration == 1)
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3968 planar = "Chunky";
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3969 else if (image_data.planar_configuration == 2)
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3970 planar = "Separate";
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3971 dir_info.setfield ("PlanarConfiguration", octave_value (planar));
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3972
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3973 // Extract photometric information as well as color map if exists
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3974 std::string color_str, photometric_str;
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3975 uint16_t photometric = PHOTOMETRIC_MINISBLACK;
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3976 octave_value cmap = octave_value (Matrix ());
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3977 const TIFFField *fip;
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3978 TIFFGetField (tif, TIFFTAG_PHOTOMETRIC, &photometric);
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3979 switch (photometric)
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3980 {
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3981 case PHOTOMETRIC_MINISBLACK:
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3982 color_str = "grayscale";
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3983 photometric_str = "BlasckIsZero";
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3984 break;
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3985 case PHOTOMETRIC_MINISWHITE:
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3986 color_str = "grayscale";
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3987 photometric_str = "WhiteIsZero";
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3988 break;
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3989 case PHOTOMETRIC_RGB:
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3990 color_str = "truecolor";
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3991 photometric_str = "RGB";
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3992 break;
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3993 case PHOTOMETRIC_PALETTE:
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3994 color_str = "indexed";
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3995 photometric_str = "RGB Palette";
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3996 fip = TIFFFieldWithTag (tif, TIFFTAG_COLORMAP);
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3997 cmap = get_field_data (tif, fip);
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3998 break;
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
3999 case PHOTOMETRIC_SEPARATED:
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4000 color_str = "CMYK";
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4001 photometric_str = "CMYK";
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4002 break;
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4003 default:
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4004 color_str = "undefined";
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4005 photometric_str = "undefined";
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4006 }
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4007 dir_info.setfield ("ColorType", octave_value(color_str));
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4008 dir_info.setfield ("PhotometricInterpretation",
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4009 octave_value(photometric_str));
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4010 dir_info.setfield ("Colormap", octave_value (cmap));
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4011
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4012 fip = TIFFFieldWithTag (tif, TIFFTAG_SUBFILETYPE);
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4013 dir_info.setfield ("NewSubFileType", get_field_data (tif, fip));
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4014
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4015 fip = TIFFFieldWithTag (tif, TIFFTAG_BITSPERSAMPLE);
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4016 dir_info.setfield ("BitsPerSample", get_field_data (tif, fip));
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4017
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4018 fip = TIFFFieldWithTag (tif, TIFFTAG_SAMPLESPERPIXEL);
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4019 dir_info.setfield ("SamplesPerPixel", get_field_data (tif, fip));
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4020
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4021 // Use LibTIFF's compression codec to extract compression scheme name
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4022 uint16_t compression;
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4023 TIFFGetFieldDefaulted (tif, TIFFTAG_COMPRESSION, &compression);
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4024 std::string comp_str = "unrecognized";
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4025 const TIFFCodec *codec = TIFFFindCODEC (compression);
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4026 if (codec)
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4027 comp_str = codec->name;
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4028 dir_info.setfield ("Compression", octave_value (comp_str));
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4029
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4030 // Set strip-specific and tile-specific fields accordingly
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4031 bool tiled = TIFFIsTiled (tif);
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4032 fip = TIFFFieldWithTag (tif, TIFFTAG_TILELENGTH);
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4033 dir_info.setfield ("TileLength", tiled? get_field_data (tif, fip)
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4034 : octave_value (Matrix ()));
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4035 fip = TIFFFieldWithTag (tif, TIFFTAG_TILEWIDTH);
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4036 dir_info.setfield ("TileWidth", tiled? get_field_data (tif, fip)
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4037 : octave_value (Matrix ()));
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4038 fip = TIFFFieldWithTag (tif, TIFFTAG_TILEOFFSETS);
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4039 dir_info.setfield ("TileOffsets", tiled? get_field_data (tif, fip)
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4040 : octave_value (Matrix ()));
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4041 fip = TIFFFieldWithTag (tif, TIFFTAG_TILEBYTECOUNTS);
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4042 dir_info.setfield ("TileByteCounts", tiled? get_field_data (tif, fip)
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4043 : octave_value (Matrix ()));
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4044 fip = TIFFFieldWithTag (tif, TIFFTAG_ROWSPERSTRIP);
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4045 dir_info.setfield ("RowsPerStrip", tiled? octave_value (Matrix ())
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4046 : get_field_data (tif, fip));
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4047 fip = TIFFFieldWithTag (tif, TIFFTAG_STRIPOFFSETS);
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4048 dir_info.setfield ("StripOffsets", tiled? octave_value (Matrix ())
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4049 : get_field_data (tif, fip));
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4050 fip = TIFFFieldWithTag (tif, TIFFTAG_STRIPBYTECOUNTS);
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4051 dir_info.setfield ("StripByteCounts", tiled? octave_value (Matrix ())
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4052 : get_field_data (tif, fip));
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4053
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4054 uint16_t res;
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4055 if (TIFFGetField (tif, TIFFTAG_XRESOLUTION, &res))
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4056 dir_info.setfield ("XResolution", octave_value (res));
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4057 else
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4058 dir_info.setfield ("XResolution", octave_value (Matrix ()));
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4059
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4060 if (TIFFGetField (tif, TIFFTAG_YRESOLUTION, &res))
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4061 dir_info.setfield ("YResolution", octave_value (res));
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4062 else
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4063 dir_info.setfield ("YResolution", octave_value (Matrix ()));
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4064
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4065 TIFFGetFieldDefaulted (tif, TIFFTAG_RESOLUTIONUNIT, &res);
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4066 std::string res_unit = "Inch";
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4067 if (res == 1)
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4068 res_unit = "None";
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4069 else if (res == 3)
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4070 res_unit = "Centimeter";
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4071 dir_info.setfield ("ResolutionUnit", octave_value(res_unit));
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4072
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4073 fip = TIFFFieldWithTag (tif, TIFFTAG_ORIENTATION);
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4074 dir_info.setfield ("Orientation", get_field_data (tif, fip));
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4075
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4076 fip = TIFFFieldWithTag (tif, TIFFTAG_FILLORDER);
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4077 dir_info.setfield ("FillOrder", get_field_data (tif, fip));
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4078
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4079 // The current version of LibTIFF (4.4.0) doesn't set the deafult
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4080 // value for GrayResponseUnit corectly, so we can't use
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4081 // TIFFGetFieldDefaulted, instead we set the default value ourselves
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4082 double gray_response_unit = 0.01;
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4083 uint16_t gray_unit_val;
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4084 if (TIFFGetField (tif, TIFFTAG_GRAYRESPONSEUNIT, &gray_unit_val))
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4085 {
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4086 switch (gray_unit_val)
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4087 {
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4088 case GRAYRESPONSEUNIT_10S:
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4089 gray_response_unit = 0.1;
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4090 break;
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4091 case GRAYRESPONSEUNIT_100S:
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4092 gray_response_unit = 0.01;
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4093 break;
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4094 case GRAYRESPONSEUNIT_1000S:
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4095 gray_response_unit = 0.001;
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4096 break;
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4097 case GRAYRESPONSEUNIT_10000S:
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4098 gray_response_unit = 0.0001;
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4099 break;
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4100 case GRAYRESPONSEUNIT_100000S:
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4101 gray_response_unit = 0.00001;
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4102 break;
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4103 }
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4104 }
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4105 dir_info.setfield ("GrayResponseUnit",
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4106 octave_value (gray_response_unit));
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4107
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4108 // The current version of LibTIFF (4.4.0) doesn't set the deafult
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4109 // value for MinSampleValue and MaxSampleValue, so we can't use
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4110 // TIFFGetFieldDefaulted, instead we set the default value ourselves
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4111 uint16_t min_sample_value = 0;
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4112 uint16_t max_sample_value = (1<<image_data.bits_per_sample) - 1;
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4113 TIFFGetField (tif, TIFFTAG_MINSAMPLEVALUE, &min_sample_value);
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4114 TIFFGetField (tif, TIFFTAG_MAXSAMPLEVALUE, &max_sample_value);
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4115 dim_vector vector_dims = dim_vector (1, image_data.samples_per_pixel);
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4116 NDArray min_sample_values (vector_dims, min_sample_value);
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4117 NDArray max_sample_values (vector_dims, max_sample_value);
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4118 dir_info.setfield ("MinSampleValue",
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4119 octave_value (min_sample_values));
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4120 dir_info.setfield ("MaxSampleValue",
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4121 octave_value (max_sample_values));
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4122
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4123 fip = TIFFFieldWithTag (tif, TIFFTAG_THRESHHOLDING);
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4124 dir_info.setfield ("Thresholding", get_field_data (tif, fip));
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4125
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4126 dir_info.setfield ("Offset",
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4127 octave_value (TIFFCurrentDirOffset (tif)));
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4128
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4129 char *desc = NULL;
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4130 if (TIFFGetField (tif, TIFFTAG_IMAGEDESCRIPTION, &desc))
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4131 dir_info.setfield ("ImageDescription", octave_value (desc));
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4132 else
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4133 dir_info.setfield ("ImageDescription", octave_value (""));
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4134
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4135 // Insert the directory information into the map
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4136 info.fast_elem_insert (dir, dir_info);
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4137 }
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4138
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4139 return ovl (info);
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4140 #else
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4141 err_disabled_feature ("imfinfo", "Tiff");
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4142 #endif
0cdb7f35641e Tiff: added handler for imfinfo that uses the Tiff interface
magedrifaat <magedrifaat@gmail.com>
parents: 31193
diff changeset
4143 }
31092
a736190ce738 Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
4144 }