Mercurial > octave-libtiff
annotate libinterp/dldfcn/__tiff__.cc @ 31111:5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
* __tiff__.cc (F__tiff_read__): added the necessary logic for handling
bit depths that are less than one byte in width (1 or 4 bits).
author | magedrifaat <magedrifaat@gmail.com> |
---|---|
date | Fri, 08 Jul 2022 14:06:55 +0200 |
parents | 2daeeff33980 |
children | e3d8443585fe |
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> |
31092
a736190ce738
Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff
changeset
|
7 |
a736190ce738
Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff
changeset
|
8 #include "defun-dld.h" |
a736190ce738
Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff
changeset
|
9 #include "ov.h" |
a736190ce738
Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff
changeset
|
10 #include "ovl.h" |
31093
e2bed4daae82
Fix typo in module-files
magedrifaat <magedrifaat@gmail.com>
parents:
31092
diff
changeset
|
11 #include "error.h" |
31092
a736190ce738
Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff
changeset
|
12 |
31104
b5d59c115e52
Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents:
31103
diff
changeset
|
13 #include "errwarn.h" |
b5d59c115e52
Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents:
31103
diff
changeset
|
14 |
b5d59c115e52
Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents:
31103
diff
changeset
|
15 #if defined (HAVE_TIFF) |
b5d59c115e52
Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents:
31103
diff
changeset
|
16 # include <tiffio.h> |
b5d59c115e52
Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents:
31103
diff
changeset
|
17 #endif |
31092
a736190ce738
Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff
changeset
|
18 |
a736190ce738
Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff
changeset
|
19 // TODO(maged): Tidy up the formatting to be consistant with octave |
a736190ce738
Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff
changeset
|
20 |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
21 namespace octve |
31099
6fc4bf5e14e1
Cleaned up the interface
magedrifaat <magedrifaat@gmail.com>
parents:
31098
diff
changeset
|
22 { |
31104
b5d59c115e52
Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents:
31103
diff
changeset
|
23 #if defined (HAVE_TIFF) |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
24 // Error if status is not 1 (success status for TIFFGetField) |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
25 void |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
26 validate_tiff_get_field (bool status, void *p_to_free=NULL) |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
27 { |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
28 if (status != 1) |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
29 { |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
30 if (p_to_free != NULL) |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
31 _TIFFfree (p_to_free); |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
32 error ("Failed to read tag"); |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
33 } |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
34 } |
31101
f24d7bcad2d3
Partially fixed formatting of C++ code
magedrifaat <magedrifaat@gmail.com>
parents:
31099
diff
changeset
|
35 |
31105
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
36 octave_value_list |
31109
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
37 interpret_scalar (void *data, TIFFDataType tag_datatype) |
31105
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
38 { |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
39 double retval; |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
40 |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
41 switch (tag_datatype) |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
42 { |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
43 case TIFF_BYTE: |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
44 case TIFF_UNDEFINED: |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
45 { |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
46 retval = (double)(*((uint8_t *)data)); |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
47 break; |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
48 } |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
49 case TIFF_SHORT: |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
50 { |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
51 retval = (double)(*((uint16_t *)data)); |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
52 break; |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
53 } |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
54 case TIFF_LONG: |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
55 { |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
56 retval = (double)(*((uint32_t *)data)); |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
57 break; |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
58 } |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
59 case TIFF_LONG8: |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
60 { |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
61 retval = (double)(*((uint64_t *)data)); |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
62 break; |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
63 } |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
64 case TIFF_RATIONAL: |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
65 { |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
66 error ("TIFF_RATIONAL should have at least 2 elements but got only 1"); |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
67 break; |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
68 } |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
69 case TIFF_SBYTE: |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
70 { |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
71 retval = (double)(*((int8_t *)data)); |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
72 break; |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
73 } |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
74 case TIFF_SSHORT: |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
75 { |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
76 retval = (double)(*((int16_t *)data)); |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
77 break; |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
78 } |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
79 case TIFF_SLONG: |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
80 { |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
81 retval = (double)(*((int32_t *)data)); |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
82 break; |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
83 } |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
84 case TIFF_SLONG8: |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
85 { |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
86 retval = (double)(*((int64_t *)data)); |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
87 break; |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
88 } |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
89 case TIFF_FLOAT: |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
90 { |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
91 retval = *((float *)data); |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
92 break; |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
93 } |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
94 case TIFF_DOUBLE: |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
95 { |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
96 retval = *((double *)data); |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
97 break; |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
98 } |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
99 case TIFF_SRATIONAL: |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
100 { |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
101 error ("TIFF_SRATIONAL should have at least 2 elements but got only 1"); |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
102 break; |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
103 } |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
104 case TIFF_IFD: |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
105 case TIFF_IFD8: |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
106 error ("Unimplemented IFFD data type"); |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
107 break; |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
108 default: |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
109 error ("Unsupported tag data type"); |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
110 } |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
111 |
31109
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
112 return octave_value_list (octave_value (retval)); |
31105
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
113 } |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
114 |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
115 // Convert memory buffer into suitable octave values |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
116 // depending on tag_datatype |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
117 octave_value_list |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
118 interpret_data (void *data, uint32_t count, TIFFDataType tag_datatype) |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
119 { |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
120 octave_value_list ovl_data; |
31105
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
121 // Apparently matlab converts scalar numerical values into double |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
122 // but doesn't do the same for arrays |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
123 if (count == 1 && tag_datatype != TIFF_ASCII) |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
124 { |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
125 ovl_data = interpret_scalar (data, tag_datatype); |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
126 } |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
127 else |
31101
f24d7bcad2d3
Partially fixed formatting of C++ code
magedrifaat <magedrifaat@gmail.com>
parents:
31099
diff
changeset
|
128 { |
31105
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
129 dim_vector arr_dims (1, count); |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
130 |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
131 switch (tag_datatype) |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
132 { |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
133 case TIFF_BYTE: |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
134 case TIFF_UNDEFINED: |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
135 { |
31105
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
136 uint8NDArray arr (arr_dims); |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
137 for (uint32_t i = 0; i < count; i++) |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
138 { |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
139 arr(i) = ((uint8_t *)data)[i]; |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
140 } |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
141 ovl_data(0) = arr; |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
142 break; |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
143 } |
31105
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
144 case TIFF_ASCII: |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
145 { |
31109
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
146 ovl_data(0) = octave_value (*(char **)data); |
31105
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
147 break; |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
148 } |
31105
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
149 case TIFF_SHORT: |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
150 { |
31105
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
151 uint16NDArray arr (arr_dims); |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
152 for (uint32_t i = 0; i < count; i++) |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
153 { |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
154 arr(i) = ((uint16_t *)data)[i]; |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
155 } |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
156 ovl_data(0) = arr; |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
157 break; |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
158 } |
31105
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
159 case TIFF_LONG: |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
160 { |
31105
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
161 uint32NDArray arr (arr_dims); |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
162 for (uint32_t i = 0; i < count; i++) |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
163 { |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
164 arr(i) = ((uint32_t *)data)[i]; |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
165 } |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
166 ovl_data(0) = arr; |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
167 break; |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
168 } |
31105
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
169 case TIFF_LONG8: |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
170 { |
31105
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
171 uint64NDArray arr (arr_dims); |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
172 for (uint32_t i = 0; i < count; i++) |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
173 { |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
174 arr(i) = ((uint64_t *)data)[i]; |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
175 } |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
176 ovl_data(0) = arr; |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
177 break; |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
178 } |
31105
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
179 case TIFF_RATIONAL: |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
180 { |
31105
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
181 NDArray arr (arr_dims); |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
182 for (uint32_t i = 0; i < count; i+=2) |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
183 { |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
184 arr(i / 2) = (float)((uint32_t *)data)[i] |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
185 / (float)((uint32_t *)data)[i+1]; |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
186 } |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
187 ovl_data(0) = arr; |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
188 break; |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
189 } |
31105
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
190 case TIFF_SBYTE: |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
191 { |
31105
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
192 int8NDArray arr (arr_dims); |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
193 for (uint32_t i = 0; i < count; i++) |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
194 { |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
195 arr(i) = ((int8_t *)data)[i]; |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
196 } |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
197 ovl_data(0) = arr; |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
198 break; |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
199 } |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
200 case TIFF_SSHORT: |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
201 { |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
202 int16NDArray arr (arr_dims); |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
203 for (uint32_t i = 0; i < count; i++) |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
204 { |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
205 arr(i) = ((int16_t *)data)[i]; |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
206 } |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
207 ovl_data(0) = arr; |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
208 break; |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
209 } |
31105
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
210 case TIFF_SLONG: |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
211 { |
31105
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
212 int32NDArray arr (arr_dims); |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
213 for (uint32_t i = 0; i < count; i++) |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
214 { |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
215 arr(i) = ((int32_t *)data)[i]; |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
216 } |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
217 ovl_data(0) = arr; |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
218 break; |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
219 } |
31105
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
220 case TIFF_SLONG8: |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
221 { |
31105
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
222 int64NDArray arr (arr_dims); |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
223 for (uint32_t i = 0; i < count; i++) |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
224 { |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
225 arr(i) = ((int64_t *)data)[i]; |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
226 } |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
227 ovl_data(0) = arr; |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
228 break; |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
229 } |
31105
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
230 case TIFF_FLOAT: |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
231 { |
31105
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
232 NDArray arr (arr_dims); |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
233 for (uint32_t i = 0; i < count; i++) |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
234 { |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
235 arr(i) = ((float *)data)[i]; |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
236 } |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
237 ovl_data(0) = arr; |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
238 break; |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
239 } |
31105
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
240 case TIFF_DOUBLE: |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
241 { |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
242 NDArray arr (arr_dims); |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
243 for (uint32_t i = 0; i < count; i++) |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
244 { |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
245 arr(i) = ((double *)data)[i]; |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
246 } |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
247 ovl_data(0) = arr; |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
248 break; |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
249 } |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
250 case TIFF_SRATIONAL: |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
251 { |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
252 NDArray arr (arr_dims); |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
253 for (uint32_t i = 0; i < count; i+=2) |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
254 { |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
255 arr(i / 2) = (float)((int32_t *)data)[i] |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
256 / (float)((int32_t *)data)[i+1]; |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
257 } |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
258 ovl_data(0) = arr; |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
259 break; |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
260 } |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
261 case TIFF_IFD: |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
262 case TIFF_IFD8: |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
263 // TODO(maged): implement IFD datatype? |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
264 error ("Unimplemented IFFD data type"); |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
265 break; |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
266 default: |
7c5b8a294f60
getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents:
31104
diff
changeset
|
267 error ("Unsupported tag data type"); |
31101
f24d7bcad2d3
Partially fixed formatting of C++ code
magedrifaat <magedrifaat@gmail.com>
parents:
31099
diff
changeset
|
268 } |
f24d7bcad2d3
Partially fixed formatting of C++ code
magedrifaat <magedrifaat@gmail.com>
parents:
31099
diff
changeset
|
269 } |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
270 |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
271 return ovl_data; |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
272 } |
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
|
273 |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
274 octave_value_list |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
275 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
|
276 { |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
277 octave_value_list tag_data_ovl; |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
278 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
|
279 |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
280 // TIFFFieldReadCount returns VARIABLE for some scalar tags |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
281 // (e.g. Compression) But TIFFFieldPassCount seems consistent |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
282 // 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
|
283 // 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
|
284 if (TIFFFieldPassCount (fip)) |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
285 error ("Unsupported tag"); |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
286 |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
287 // TODO(maged): test this function vs actual data type size |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
288 int type_size = TIFFDataWidth (TIFFFieldDataType (fip)); |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
289 void *data = _TIFFmalloc (type_size); |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
290 validate_tiff_get_field (TIFFGetField (tif, tag_id, data), data); |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
291 tag_data_ovl = interpret_data (data, 1, TIFFFieldDataType (fip)); |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
292 _TIFFfree (data); |
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
|
293 |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
294 return tag_data_ovl; |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
295 } |
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
|
296 |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
297 octave_value_list |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
298 get_array_field_data (TIFF *tif, const TIFFField *fip, uint32_t array_size) |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
299 { |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
300 void *data; |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
301 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
|
302 |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
303 return interpret_data (data, array_size, TIFFFieldDataType (fip)); |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
304 } |
31097
75ab26f147a5
getTag: Implemented single array tags, only multi-array and special tags are unimplemented
magedrifaat <magedrifaat@gmail.com>
parents:
31096
diff
changeset
|
305 |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
306 octave_value_list |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
307 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
|
308 { |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
309 octave_value_list tag_data_ovl; |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
310 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
|
311 |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
312 // TODO(maged): find/create images to test the special tags |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
313 switch (tag_id) |
31101
f24d7bcad2d3
Partially fixed formatting of C++ code
magedrifaat <magedrifaat@gmail.com>
parents:
31099
diff
changeset
|
314 { |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
315 case TIFFTAG_STRIPBYTECOUNTS: |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
316 case TIFFTAG_STRIPOFFSETS: |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
317 tag_data_ovl = get_array_field_data (tif, fip, |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
318 TIFFNumberOfStrips (tif)); |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
319 break; |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
320 case TIFFTAG_TILEBYTECOUNTS: |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
321 case TIFFTAG_TILEOFFSETS: |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
322 tag_data_ovl = get_array_field_data (tif, fip, TIFFNumberOfTiles (tif)); |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
323 break; |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
324 case TIFFTAG_YCBCRCOEFFICIENTS: |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
325 tag_data_ovl = get_array_field_data (tif, fip, 3); |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
326 break; |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
327 case TIFFTAG_REFERENCEBLACKWHITE: |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
328 tag_data_ovl = get_array_field_data (tif, fip, 6); |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
329 break; |
31106
f5a88c0a61ab
Support for GrayResponseCurve and GrayResponseUnit tags
magedrifaat <magedrifaat@gmail.com>
parents:
31105
diff
changeset
|
330 case TIFFTAG_GRAYRESPONSECURVE: |
f5a88c0a61ab
Support for GrayResponseCurve and GrayResponseUnit tags
magedrifaat <magedrifaat@gmail.com>
parents:
31105
diff
changeset
|
331 { |
f5a88c0a61ab
Support for GrayResponseCurve and GrayResponseUnit tags
magedrifaat <magedrifaat@gmail.com>
parents:
31105
diff
changeset
|
332 uint16_t bits_per_sample; |
f5a88c0a61ab
Support for GrayResponseCurve and GrayResponseUnit tags
magedrifaat <magedrifaat@gmail.com>
parents:
31105
diff
changeset
|
333 if (! TIFFGetField (tif, TIFFTAG_BITSPERSAMPLE, &bits_per_sample)) |
f5a88c0a61ab
Support for GrayResponseCurve and GrayResponseUnit tags
magedrifaat <magedrifaat@gmail.com>
parents:
31105
diff
changeset
|
334 error ("Failed to obtain the bit depth"); |
f5a88c0a61ab
Support for GrayResponseCurve and GrayResponseUnit tags
magedrifaat <magedrifaat@gmail.com>
parents:
31105
diff
changeset
|
335 |
f5a88c0a61ab
Support for GrayResponseCurve and GrayResponseUnit tags
magedrifaat <magedrifaat@gmail.com>
parents:
31105
diff
changeset
|
336 tag_data_ovl = get_array_field_data (tif, fip, 1<<bits_per_sample); |
f5a88c0a61ab
Support for GrayResponseCurve and GrayResponseUnit tags
magedrifaat <magedrifaat@gmail.com>
parents:
31105
diff
changeset
|
337 break; |
f5a88c0a61ab
Support for GrayResponseCurve and GrayResponseUnit tags
magedrifaat <magedrifaat@gmail.com>
parents:
31105
diff
changeset
|
338 } |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
339 case TIFFTAG_COLORMAP: |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
340 { |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
341 uint16_t bits_per_sample; |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
342 if (! TIFFGetField (tif, TIFFTAG_BITSPERSAMPLE, &bits_per_sample)) |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
343 error ("Failed to obtain the bit depth"); |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
344 |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
345 if (bits_per_sample > 24) |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
346 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
|
347 |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
348 uint32_t count = 1 << bits_per_sample; |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
349 uint16_t *red, *green, *blue; |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
350 validate_tiff_get_field (TIFFGetField (tif, TIFFTAG_COLORMAP, |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
351 &red, &green, &blue)); |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
352 tag_data_ovl(0) |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
353 = octave_value (interpret_data (red, count, |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
354 TIFFFieldDataType (fip))); |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
355 tag_data_ovl(1) |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
356 = octave_value (interpret_data (green, count, |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
357 TIFFFieldDataType (fip))); |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
358 tag_data_ovl(2) |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
359 = octave_value (interpret_data (blue, count, |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
360 TIFFFieldDataType (fip))); |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
361 |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
362 break; |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
363 } |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
364 case TIFFTAG_TRANSFERFUNCTION: |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
365 { |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
366 uint16_t samples_per_pixel; |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
367 if (! TIFFGetField (tif, TIFFTAG_SAMPLESPERPIXEL, &samples_per_pixel)) |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
368 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
|
369 |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
370 uint16_t bits_per_sample; |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
371 if (! TIFFGetField (tif, TIFFTAG_BITSPERSAMPLE, &bits_per_sample)) |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
372 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
|
373 |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
374 uint32_t count = 1 << bits_per_sample; |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
375 uint16_t *ch1, *ch2, *ch3; |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
376 if (samples_per_pixel == 1) |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
377 { |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
378 validate_tiff_get_field (TIFFGetField (tif, TIFFTAG_COLORMAP, &ch1)); |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
379 tag_data_ovl(0) |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
380 = octave_value (interpret_data (ch1, count, |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
381 TIFFFieldDataType (fip))); |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
382 } |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
383 else |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
384 { |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
385 validate_tiff_get_field (TIFFGetField (tif, TIFFTAG_COLORMAP, |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
386 &ch1, &ch2, &ch3)); |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
387 tag_data_ovl(0) |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
388 = octave_value (interpret_data (ch1, count, |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
389 TIFFFieldDataType (fip))); |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
390 tag_data_ovl(1) |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
391 = octave_value (interpret_data (ch2, count, |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
392 TIFFFieldDataType (fip))); |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
393 tag_data_ovl(2) |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
394 = octave_value (interpret_data (ch3, count, |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
395 TIFFFieldDataType (fip))); |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
396 } |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
397 break; |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
398 } |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
399 case TIFFTAG_PAGENUMBER: |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
400 case TIFFTAG_HALFTONEHINTS: |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
401 case TIFFTAG_DOTRANGE: |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
402 case TIFFTAG_YCBCRSUBSAMPLING: |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
403 { |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
404 uint16_t tag_part1, tag_part2; |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
405 validate_tiff_get_field (TIFFGetField (tif, tag_id, |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
406 &tag_part1, &tag_part2)); |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
407 tag_data_ovl(0) |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
408 = octave_value (interpret_data (&tag_part1, 1, |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
409 TIFFFieldDataType (fip))); |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
410 tag_data_ovl(1) |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
411 = octave_value (interpret_data (&tag_part2, 1, |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
412 TIFFFieldDataType (fip))); |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
413 break; |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
414 } |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
415 case TIFFTAG_SUBIFD: |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
416 { |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
417 uint16_t count; |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
418 uint64_t *offsets; |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
419 validate_tiff_get_field (TIFFGetField (tif, tag_id, &count, &offsets)); |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
420 tag_data_ovl = interpret_data (offsets, count, TIFFFieldDataType (fip)); |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
421 break; |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
422 } |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
423 case TIFFTAG_EXTRASAMPLES: |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
424 { |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
425 uint16_t count; |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
426 uint16_t *types; |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
427 validate_tiff_get_field (TIFFGetField (tif, tag_id, &count, &types)); |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
428 tag_data_ovl = interpret_data (types, count, TIFFFieldDataType (fip)); |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
429 break; |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
430 } |
31103
76b21bed2920
Undocumented and unimplemented tags are explicilty mentioned and handled
magedrifaat <magedrifaat@gmail.com>
parents:
31102
diff
changeset
|
431 // TODO(maged): These tags are more complex to implement |
76b21bed2920
Undocumented and unimplemented tags are explicilty mentioned and handled
magedrifaat <magedrifaat@gmail.com>
parents:
31102
diff
changeset
|
432 // will be implemented and tested later. |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
433 case TIFFTAG_XMLPACKET: |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
434 case TIFFTAG_RICHTIFFIPTC: |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
435 case TIFFTAG_PHOTOSHOP: |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
436 case TIFFTAG_ICCPROFILE: |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
437 { |
31103
76b21bed2920
Undocumented and unimplemented tags are explicilty mentioned and handled
magedrifaat <magedrifaat@gmail.com>
parents:
31102
diff
changeset
|
438 error ("Complex Tags not implemented"); |
76b21bed2920
Undocumented and unimplemented tags are explicilty mentioned and handled
magedrifaat <magedrifaat@gmail.com>
parents:
31102
diff
changeset
|
439 break; |
76b21bed2920
Undocumented and unimplemented tags are explicilty mentioned and handled
magedrifaat <magedrifaat@gmail.com>
parents:
31102
diff
changeset
|
440 } |
31106
f5a88c0a61ab
Support for GrayResponseCurve and GrayResponseUnit tags
magedrifaat <magedrifaat@gmail.com>
parents:
31105
diff
changeset
|
441 // 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
|
442 // 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
|
443 case TIFFTAG_ZIPQUALITY: |
76b21bed2920
Undocumented and unimplemented tags are explicilty mentioned and handled
magedrifaat <magedrifaat@gmail.com>
parents:
31102
diff
changeset
|
444 case TIFFTAG_SGILOGDATAFMT: |
31106
f5a88c0a61ab
Support for GrayResponseCurve and GrayResponseUnit tags
magedrifaat <magedrifaat@gmail.com>
parents:
31105
diff
changeset
|
445 case TIFFTAG_GRAYRESPONSEUNIT: |
31103
76b21bed2920
Undocumented and unimplemented tags are explicilty mentioned and handled
magedrifaat <magedrifaat@gmail.com>
parents:
31102
diff
changeset
|
446 { |
76b21bed2920
Undocumented and unimplemented tags are explicilty mentioned and handled
magedrifaat <magedrifaat@gmail.com>
parents:
31102
diff
changeset
|
447 tag_data_ovl = get_scalar_field_data (tif, fip); |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
448 break; |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
449 } |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
450 default: |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
451 tag_data_ovl = get_scalar_field_data (tif, fip); |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
452 } |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
453 |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
454 return tag_data_ovl; |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
455 } |
31104
b5d59c115e52
Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents:
31103
diff
changeset
|
456 #endif |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
457 |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
458 DEFUN_DLD (__open_tiff__, args, nargout, |
31109
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
459 "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
|
460 { |
31104
b5d59c115e52
Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents:
31103
diff
changeset
|
461 #if defined (HAVE_TIFF) |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
462 int nargin = args.length (); |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
463 |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
464 if (nargin == 0 || nargin > 2) |
31101
f24d7bcad2d3
Partially fixed formatting of C++ code
magedrifaat <magedrifaat@gmail.com>
parents:
31099
diff
changeset
|
465 { |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
466 // TODO(maged): return invalid object instead?? |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
467 error ("No filename supplied\n"); |
31101
f24d7bcad2d3
Partially fixed formatting of C++ code
magedrifaat <magedrifaat@gmail.com>
parents:
31099
diff
changeset
|
468 } |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
469 |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
470 std::string filename = args (0).string_value (); |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
471 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
|
472 |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
473 // TODO(maged): check valid mode |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
474 if (nargin == 2) |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
475 mode = args (1).string_value (); |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
476 |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
477 // TODO(maged): Look into unwind action |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
478 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
|
479 |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
480 if (! tif) |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
481 error ("Failed to open Tiff file\n"); |
31092
a736190ce738
Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff
changeset
|
482 |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
483 // TODO(maged): use inheritance of octave_base_value instead |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
484 octave_value tiff_ov = octave_value ((uint64_t)tif); |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
485 return octave_value_list (tiff_ov); |
31104
b5d59c115e52
Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents:
31103
diff
changeset
|
486 #else |
b5d59c115e52
Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents:
31103
diff
changeset
|
487 err_disabled_feature ("Tiff", "Tiff"); |
b5d59c115e52
Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents:
31103
diff
changeset
|
488 #endif |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
489 } |
31092
a736190ce738
Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff
changeset
|
490 |
a736190ce738
Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff
changeset
|
491 |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
492 DEFUN_DLD (__close_tiff__, args, nargout, |
31109
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
493 "Close a tiff file") |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
494 { |
31104
b5d59c115e52
Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents:
31103
diff
changeset
|
495 #if defined (HAVE_TIFF) |
31101
f24d7bcad2d3
Partially fixed formatting of C++ code
magedrifaat <magedrifaat@gmail.com>
parents:
31099
diff
changeset
|
496 int nargin = args.length (); |
31092
a736190ce738
Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff
changeset
|
497 |
a736190ce738
Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff
changeset
|
498 if (nargin == 0) |
31101
f24d7bcad2d3
Partially fixed formatting of C++ code
magedrifaat <magedrifaat@gmail.com>
parents:
31099
diff
changeset
|
499 error ("No handle provided\n"); |
31092
a736190ce738
Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff
changeset
|
500 |
31101
f24d7bcad2d3
Partially fixed formatting of C++ code
magedrifaat <magedrifaat@gmail.com>
parents:
31099
diff
changeset
|
501 TIFF *tif = (TIFF *)(args (0).uint64_value ()); |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
502 TIFFClose (tif); |
31092
a736190ce738
Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff
changeset
|
503 |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
504 return octave_value_list (); |
31104
b5d59c115e52
Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents:
31103
diff
changeset
|
505 #else |
b5d59c115e52
Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents:
31103
diff
changeset
|
506 err_disabled_feature ("close", "Tiff"); |
b5d59c115e52
Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents:
31103
diff
changeset
|
507 #endif |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
508 } |
31092
a736190ce738
Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff
changeset
|
509 |
a736190ce738
Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff
changeset
|
510 |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
511 DEFUN_DLD (__tiff_get_tag__, args, nargout, |
31109
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
512 "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
|
513 { |
31104
b5d59c115e52
Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents:
31103
diff
changeset
|
514 #if defined (HAVE_TIFF) |
31109
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
515 int nargin = args.length (); |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
516 |
31109
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
517 if (nargin == 0) |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
518 error ("No handle provided\n"); |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
519 |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
520 if (nargin < 2) |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
521 error ("No tag name provided\n"); |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
522 |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
523 TIFF *tif = (TIFF *)(args (0).uint64_value ()); |
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
|
524 |
31109
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
525 uint32_t tag_id; |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
526 const TIFFField *fip; |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
527 if (args (1).type_name () == "string") |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
528 { |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
529 std::string tagName = args (1).string_value (); |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
530 fip = TIFFFieldWithName (tif, tagName.c_str ()); |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
531 if (! fip) |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
532 error ("Tiff tag not found"); |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
533 |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
534 tag_id = TIFFFieldTag (fip); |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
535 } |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
536 else |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
537 { |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
538 tag_id = args (1).int_value (); |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
539 fip = TIFFFieldWithTag (tif, tag_id); |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
540 // TODO(maged): Handle other types of errors (e.g. unsupported tags) |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
541 if (! fip) |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
542 error ("Tiff tag not found"); |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
543 } |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
544 |
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
545 |
31109
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
546 octave_value_list tag_data_ovl = get_field_data (tif, fip); |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
547 |
31109
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
548 return tag_data_ovl; |
31104
b5d59c115e52
Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents:
31103
diff
changeset
|
549 #else |
b5d59c115e52
Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents:
31103
diff
changeset
|
550 err_disabled_feature ("getTag", "Tiff"); |
b5d59c115e52
Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents:
31103
diff
changeset
|
551 #endif |
31102
d6ecf0e8838b
Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents:
31101
diff
changeset
|
552 } |
31109
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
553 |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
554 DEFUN_DLD (__tiff_read__, args, nargout, |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
555 "Read the image in the current IFD") |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
556 { |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
557 #if defined (HAVE_TIFF) |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
558 int nargin = args.length (); |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
559 |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
560 if (nargin == 0) |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
561 error ("No handle provided\n"); |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
562 |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
563 TIFF *tif = (TIFF *)(args (0).uint64_value ()); |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
564 |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
565 // Check: Strips vs Tiles |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
566 // Planar Configuration |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
567 // StripByteCounts |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
568 // SamplesPerPixel and bits_per_smaple |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
569 // nargout and ycbcr |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
570 // ExtendedSamples? TransferFunction? GrayResponse? ColorMap? |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
571 // What about floating point images? |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
572 |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
573 // Obtain all necessary tags |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
574 uint32_t width, height; |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
575 if (! TIFFGetField (tif, TIFFTAG_IMAGEWIDTH, &width)) |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
576 error ("Failed to read image width"); |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
577 |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
578 if (! TIFFGetField (tif, TIFFTAG_IMAGELENGTH, &height)) |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
579 error ("Failed to read image height"); |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
580 |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
581 uint16_t samples_per_pixel; |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
582 if (! TIFFGetField (tif, TIFFTAG_SAMPLESPERPIXEL, &samples_per_pixel)) |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
583 error ("Failed to read the SamplesPerPixel tag"); |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
584 |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
585 uint16_t bits_per_sample; |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
586 if (! TIFFGetField (tif, TIFFTAG_BITSPERSAMPLE, &bits_per_sample)) |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
587 error ("Failed to read the BitsPerSample tag"); |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
588 |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
589 uint16_t planar_configuration; |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
590 if (! TIFFGetField (tif, TIFFTAG_PLANARCONFIG, &planar_configuration)) |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
591 error ("Failed to read the PlanarConfiguration tag"); |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
592 |
31110
2daeeff33980
Tiff read fixed segfault bug for compressed images
magedrifaat <magedrifaat@gmail.com>
parents:
31109
diff
changeset
|
593 int is_tiled = TIFFIsTiled(tif); |
31109
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
594 |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
595 // Create memory for storing the image data |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
596 // TODO(maged): replace malloc with a suitable C++ structure |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
597 void ***image = (void ***)malloc (sizeof(void ***) * height); |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
598 uint32_t pixel_size = samples_per_pixel * (bits_per_sample / 8); |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
599 for (uint32_t row = 0; row < height; row++) |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
600 { |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
601 image[row] = (void **)malloc (sizeof(void **) * width); |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
602 for (uint32_t column = 0; column < width; column++) |
31111
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
603 // Allocate at least one byte per pixel (For BitsPerSample < 8) |
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
604 image[row][column] = malloc (pixel_size > 0? pixel_size: 1); |
31109
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
605 } |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
606 |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
607 if (is_tiled) |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
608 // TODO(maged): Implement tiled images |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
609 error ("Tiled images are not implemented yet"); |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
610 else |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
611 { |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
612 // Obtain the necessary data for handling the strips |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
613 uint32_t strip_count = TIFFNumberOfStrips (tif); |
31110
2daeeff33980
Tiff read fixed segfault bug for compressed images
magedrifaat <magedrifaat@gmail.com>
parents:
31109
diff
changeset
|
614 tdata_t buf = _TIFFmalloc (TIFFStripSize (tif)); |
2daeeff33980
Tiff read fixed segfault bug for compressed images
magedrifaat <magedrifaat@gmail.com>
parents:
31109
diff
changeset
|
615 if (! buf) |
2daeeff33980
Tiff read fixed segfault bug for compressed images
magedrifaat <magedrifaat@gmail.com>
parents:
31109
diff
changeset
|
616 error ("Failed to allocate buffer for strip data"); |
2daeeff33980
Tiff read fixed segfault bug for compressed images
magedrifaat <magedrifaat@gmail.com>
parents:
31109
diff
changeset
|
617 |
31109
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
618 uint32_t row_index = 0; |
31111
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
619 uint32_t row_size_in_bits = width * samples_per_pixel |
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
620 * bits_per_sample; |
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
621 // According to the Tiff format specification, the row size is |
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
622 // padded at least up to the next byte, so we add padding to |
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
623 // complete the byte |
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
624 row_size_in_bits += (8 - row_size_in_bits % 8) % 8; |
31109
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
625 for (uint32_t strip = 0; strip < strip_count; strip++) |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
626 { |
31111
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
627 uint32_t strip_bytes = TIFFReadEncodedStrip (tif, strip, buf, -1); |
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
628 if (strip_bytes == -1) |
31110
2daeeff33980
Tiff read fixed segfault bug for compressed images
magedrifaat <magedrifaat@gmail.com>
parents:
31109
diff
changeset
|
629 error ("Failed to read strip data"); |
2daeeff33980
Tiff read fixed segfault bug for compressed images
magedrifaat <magedrifaat@gmail.com>
parents:
31109
diff
changeset
|
630 |
31109
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
631 if (planar_configuration == PLANARCONFIG_CONTIG) |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
632 { |
31111
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
633 uint32_t rows_in_strip = strip_bytes * 8 / row_size_in_bits; |
31109
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
634 for (uint32_t row_subindex = 0; |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
635 row_subindex < rows_in_strip; |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
636 row_subindex++) |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
637 { |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
638 for (uint32_t column = 0; column < width; column++) |
31111
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
639 { |
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
640 uint32_t row_offset = row_size_in_bits / 8 |
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
641 * row_subindex; |
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
642 // TODO(maged): support arbitrary BitsPerSample |
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
643 // for palette images |
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
644 if (bits_per_sample >= 8 && bits_per_sample % 8 == 0) |
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
645 { |
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
646 memcpy (image[row_index + row_subindex][column], |
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
647 buf + row_offset + column * pixel_size, |
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
648 pixel_size); |
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
649 } |
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
650 else if (bits_per_sample == 4 |
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
651 && samples_per_pixel == 1) |
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
652 { |
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
653 // TODO(maged): Check FillOrder for completeness |
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
654 uint8_t byte |
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
655 = ((uint8_t *)buf)[row_offset + column / 2]; |
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
656 // Extract the needed nibble from the byte |
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
657 byte = (column % 2 == 0? byte >> 4: byte) & 0x0F; |
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
658 uint8_t ***u8_img = (uint8_t ***)image; |
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
659 u8_img[row_index + row_subindex][column][0] = byte; |
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
660 } |
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
661 else if (bits_per_sample == 1 |
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
662 && samples_per_pixel == 1) |
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
663 { |
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
664 uint8_t byte |
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
665 = ((uint8_t *)buf)[row_offset + column / 8]; |
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
666 // Extract the needed bit from the byte |
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
667 uint8_t bit = (byte >> (7 - column % 8)) & 0x01; |
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
668 uint8_t ***u8_img = (uint8_t ***)image; |
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
669 u8_img[row_index + row_subindex][column][0] = bit; |
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
670 } |
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
671 else |
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
672 error ("Unsupported bit depth"); |
5d79d99c96b9
Tiff read: Added support for bi-level and 4-bit-grayscale images
magedrifaat <magedrifaat@gmail.com>
parents:
31110
diff
changeset
|
673 } |
31109
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
674 } |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
675 row_index += rows_in_strip; |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
676 } |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
677 else |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
678 error ("Images with multiple planes are not implemented yet"); |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
679 } |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
680 _TIFFfree (buf); |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
681 } |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
682 |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
683 octave_value_list retval; |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
684 dim_vector arr_dims (height, width, samples_per_pixel); |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
685 // TODO(maged): what about palette images? are they handled internally? |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
686 switch (bits_per_sample) |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
687 { |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
688 case 1: |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
689 { |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
690 boolNDArray arr(arr_dims); |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
691 for (uint32_t row = 0; row < height; row++) |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
692 for (uint32_t column = 0; column < width; column++) |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
693 for (uint16_t sample = 0; sample < samples_per_pixel; sample++) |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
694 arr(row, column, sample) = ((uint8_t ***)image)[row][column][sample]; |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
695 |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
696 retval(0) = arr; |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
697 break; |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
698 } |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
699 case 4: |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
700 case 8: |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
701 { |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
702 uint8NDArray arr(arr_dims); |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
703 for (uint32_t row = 0; row < height; row++) |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
704 for (uint32_t column = 0; column < width; column++) |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
705 for (uint16_t sample = 0; sample < samples_per_pixel; sample++) |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
706 arr(row, column, sample) = ((uint8_t ***)image)[row][column][sample]; |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
707 |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
708 retval(0) = arr; |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
709 break; |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
710 } |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
711 case 16: |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
712 { |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
713 uint16NDArray arr(arr_dims); |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
714 for (uint32_t row = 0; row < height; row++) |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
715 for (uint32_t column = 0; column < width; column++) |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
716 for (uint16_t sample = 0; sample < samples_per_pixel; sample++) |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
717 arr(row, column, sample) = ((uint16_t ***)image)[row][column][sample]; |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
718 |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
719 retval(0) = arr; |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
720 break; |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
721 } |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
722 case 32: |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
723 { |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
724 uint32NDArray arr(arr_dims); |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
725 for (uint32_t row = 0; row < height; row++) |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
726 for (uint32_t column = 0; column < width; column++) |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
727 for (uint16_t sample = 0; sample < samples_per_pixel; sample++) |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
728 arr(row, column, sample) = ((uint32_t ***)image)[row][column][sample]; |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
729 |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
730 retval(0) = arr; |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
731 break; |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
732 } |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
733 case 64: |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
734 { |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
735 uint64NDArray arr(arr_dims); |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
736 for (uint32_t row = 0; row < height; row++) |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
737 for (uint32_t column = 0; column < width; column++) |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
738 for (uint16_t sample = 0; sample < samples_per_pixel; sample++) |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
739 arr(row, column, sample) = ((uint64_t ***)image)[row][column][sample]; |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
740 |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
741 retval(0) = arr; |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
742 break; |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
743 } |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
744 default: |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
745 error ("Unsupported bit depth"); |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
746 } |
31110
2daeeff33980
Tiff read fixed segfault bug for compressed images
magedrifaat <magedrifaat@gmail.com>
parents:
31109
diff
changeset
|
747 |
2daeeff33980
Tiff read fixed segfault bug for compressed images
magedrifaat <magedrifaat@gmail.com>
parents:
31109
diff
changeset
|
748 for (uint32_t row = 0; row < height; row++) |
2daeeff33980
Tiff read fixed segfault bug for compressed images
magedrifaat <magedrifaat@gmail.com>
parents:
31109
diff
changeset
|
749 { |
2daeeff33980
Tiff read fixed segfault bug for compressed images
magedrifaat <magedrifaat@gmail.com>
parents:
31109
diff
changeset
|
750 for (uint32_t column = 0; column < width; column++) |
2daeeff33980
Tiff read fixed segfault bug for compressed images
magedrifaat <magedrifaat@gmail.com>
parents:
31109
diff
changeset
|
751 free (image[row][column]); |
2daeeff33980
Tiff read fixed segfault bug for compressed images
magedrifaat <magedrifaat@gmail.com>
parents:
31109
diff
changeset
|
752 |
2daeeff33980
Tiff read fixed segfault bug for compressed images
magedrifaat <magedrifaat@gmail.com>
parents:
31109
diff
changeset
|
753 free (image[row]); |
2daeeff33980
Tiff read fixed segfault bug for compressed images
magedrifaat <magedrifaat@gmail.com>
parents:
31109
diff
changeset
|
754 } |
31109
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
755 return retval; |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
756 #else |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
757 err_disabled_feature ("read", "Tiff"); |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
758 #endif |
06814e8b5a29
add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents:
31106
diff
changeset
|
759 } |
31092
a736190ce738
Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff
changeset
|
760 } |