annotate libinterp/corefcn/__tiff__.cc @ 31160:5f0c3da75926

Tiff: moved internal functions to corefcn.
author magedrifaat <magedrifaat@gmail.com>
date Wed, 10 Aug 2022 00:58:12 +0200
parents libinterp/dldfcn/__tiff__.cc@e960e3a3b3f6
children b731c8f6db95
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
31104
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
1 #if defined (HAVE_CONFIG_H)
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
2 # include "config.h"
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
3 #endif
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
4
31092
a736190ce738 Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
5 #include <string>
31094
ab5b33e447b0 Modified getTag to account for different tag data types and multivalued tags, the current implementation is still buggy for most tags and data types
magedrifaat <magedrifaat@gmail.com>
parents: 31093
diff changeset
6 #include <iostream>
31092
a736190ce738 Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
7
31138
68762676dab1 Tiff writeEncodedStrip: prevent writing to a read-only file
magedrifaat <magedrifaat@gmail.com>
parents: 31137
diff changeset
8 // Workaround to not have to include fcntl which doesn't exist on windows
31139
3431a15b2c75 Tiff.m: refactored tests to use functions to reduce code repetition.
magedrifaat <magedrifaat@gmail.com>
parents: 31138
diff changeset
9 // TODO(maged): see what octave does for this (fcntl)
31138
68762676dab1 Tiff writeEncodedStrip: prevent writing to a read-only file
magedrifaat <magedrifaat@gmail.com>
parents: 31137
diff changeset
10 #ifndef O_RDONLY
68762676dab1 Tiff writeEncodedStrip: prevent writing to a read-only file
magedrifaat <magedrifaat@gmail.com>
parents: 31137
diff changeset
11 #define O_RDONLY 0
68762676dab1 Tiff writeEncodedStrip: prevent writing to a read-only file
magedrifaat <magedrifaat@gmail.com>
parents: 31137
diff changeset
12 #endif
68762676dab1 Tiff writeEncodedStrip: prevent writing to a read-only file
magedrifaat <magedrifaat@gmail.com>
parents: 31137
diff changeset
13
31160
5f0c3da75926 Tiff: moved internal functions to corefcn.
magedrifaat <magedrifaat@gmail.com>
parents: 31159
diff changeset
14 #include "defun.h"
31092
a736190ce738 Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
15 #include "ov.h"
a736190ce738 Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
16 #include "ovl.h"
31093
e2bed4daae82 Fix typo in module-files
magedrifaat <magedrifaat@gmail.com>
parents: 31092
diff changeset
17 #include "error.h"
31092
a736190ce738 Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
18
31104
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
19 #include "errwarn.h"
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
20
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
21 #if defined (HAVE_TIFF)
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
22 # include <tiffio.h>
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
23 #endif
31092
a736190ce738 Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
24
31160
5f0c3da75926 Tiff: moved internal functions to corefcn.
magedrifaat <magedrifaat@gmail.com>
parents: 31159
diff changeset
25 namespace octave
31099
6fc4bf5e14e1 Cleaned up the interface
magedrifaat <magedrifaat@gmail.com>
parents: 31098
diff changeset
26 {
31104
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
27 #if defined (HAVE_TIFF)
31112
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
28
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
29 struct tiff_image_data
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
30 {
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
31 public:
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
32 uint32_t width;
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
33 uint32_t height;
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
34 uint16_t samples_per_pixel;
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
35 uint16_t bits_per_sample;
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
36 uint16_t planar_configuration;
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
37 uint16_t is_tiled;
31122
1662939a7a49 Tiff read: moved image_date initialization into a constructor
magedrifaat <magedrifaat@gmail.com>
parents: 31121
diff changeset
38
1662939a7a49 Tiff read: moved image_date initialization into a constructor
magedrifaat <magedrifaat@gmail.com>
parents: 31121
diff changeset
39 tiff_image_data (TIFF *tif)
1662939a7a49 Tiff read: moved image_date initialization into a constructor
magedrifaat <magedrifaat@gmail.com>
parents: 31121
diff changeset
40 {
1662939a7a49 Tiff read: moved image_date initialization into a constructor
magedrifaat <magedrifaat@gmail.com>
parents: 31121
diff changeset
41 if (! TIFFGetField (tif, TIFFTAG_IMAGEWIDTH, &width))
1662939a7a49 Tiff read: moved image_date initialization into a constructor
magedrifaat <magedrifaat@gmail.com>
parents: 31121
diff changeset
42 error ("Failed to read image width");
1662939a7a49 Tiff read: moved image_date initialization into a constructor
magedrifaat <magedrifaat@gmail.com>
parents: 31121
diff changeset
43
1662939a7a49 Tiff read: moved image_date initialization into a constructor
magedrifaat <magedrifaat@gmail.com>
parents: 31121
diff changeset
44 if (! TIFFGetField (tif, TIFFTAG_IMAGELENGTH, &height))
1662939a7a49 Tiff read: moved image_date initialization into a constructor
magedrifaat <magedrifaat@gmail.com>
parents: 31121
diff changeset
45 error ("Failed to read image height");
1662939a7a49 Tiff read: moved image_date initialization into a constructor
magedrifaat <magedrifaat@gmail.com>
parents: 31121
diff changeset
46
31127
0d9633ee715e Tiff: fixed a bug where the default value of some tags was ignored
magedrifaat <magedrifaat@gmail.com>
parents: 31126
diff changeset
47 if (! TIFFGetFieldDefaulted (tif, TIFFTAG_SAMPLESPERPIXEL,
0d9633ee715e Tiff: fixed a bug where the default value of some tags was ignored
magedrifaat <magedrifaat@gmail.com>
parents: 31126
diff changeset
48 &samples_per_pixel))
31122
1662939a7a49 Tiff read: moved image_date initialization into a constructor
magedrifaat <magedrifaat@gmail.com>
parents: 31121
diff changeset
49 error ("Failed to read the SamplesPerPixel tag");
1662939a7a49 Tiff read: moved image_date initialization into a constructor
magedrifaat <magedrifaat@gmail.com>
parents: 31121
diff changeset
50
31127
0d9633ee715e Tiff: fixed a bug where the default value of some tags was ignored
magedrifaat <magedrifaat@gmail.com>
parents: 31126
diff changeset
51 if (! TIFFGetFieldDefaulted (tif, TIFFTAG_BITSPERSAMPLE,
0d9633ee715e Tiff: fixed a bug where the default value of some tags was ignored
magedrifaat <magedrifaat@gmail.com>
parents: 31126
diff changeset
52 &bits_per_sample))
31122
1662939a7a49 Tiff read: moved image_date initialization into a constructor
magedrifaat <magedrifaat@gmail.com>
parents: 31121
diff changeset
53 error ("Failed to read the BitsPerSample tag");
1662939a7a49 Tiff read: moved image_date initialization into a constructor
magedrifaat <magedrifaat@gmail.com>
parents: 31121
diff changeset
54
31147
7af78a63d3c3 Tiff.m: added test for writing and reading tiled images.
magedrifaat <magedrifaat@gmail.com>
parents: 31146
diff changeset
55 // TODO(maged): this doesn't really work for writing as LibTIFF will
7af78a63d3c3 Tiff.m: added test for writing and reading tiled images.
magedrifaat <magedrifaat@gmail.com>
parents: 31146
diff changeset
56 // refuse to write unless the tag is set
31131
7349994f30f8 Tiff: fixed the first test to use a single-pixel image
magedrifaat <magedrifaat@gmail.com>
parents: 31130
diff changeset
57 if (! TIFFGetField (tif, TIFFTAG_PLANARCONFIG,
7349994f30f8 Tiff: fixed the first test to use a single-pixel image
magedrifaat <magedrifaat@gmail.com>
parents: 31130
diff changeset
58 &planar_configuration))
7349994f30f8 Tiff: fixed the first test to use a single-pixel image
magedrifaat <magedrifaat@gmail.com>
parents: 31130
diff changeset
59 // LibTIFF has a bug where it incorrectly returns 0 as a default
7349994f30f8 Tiff: fixed the first test to use a single-pixel image
magedrifaat <magedrifaat@gmail.com>
parents: 31130
diff changeset
60 // value for PlanarConfiguration although the default value is 1
7349994f30f8 Tiff: fixed the first test to use a single-pixel image
magedrifaat <magedrifaat@gmail.com>
parents: 31130
diff changeset
61 planar_configuration = 1;
31122
1662939a7a49 Tiff read: moved image_date initialization into a constructor
magedrifaat <magedrifaat@gmail.com>
parents: 31121
diff changeset
62
1662939a7a49 Tiff read: moved image_date initialization into a constructor
magedrifaat <magedrifaat@gmail.com>
parents: 31121
diff changeset
63 is_tiled = TIFFIsTiled(tif);
1662939a7a49 Tiff read: moved image_date initialization into a constructor
magedrifaat <magedrifaat@gmail.com>
parents: 31121
diff changeset
64 }
31112
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
65 };
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
66
31118
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
67 // Error if status is not 1 (success status for TIFFGetField)
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
68 void
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
69 validate_tiff_get_field (bool status, void *p_to_free=NULL)
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
70 {
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
71 if (status != 1)
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
72 {
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
73 if (p_to_free != NULL)
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
74 _TIFFfree (p_to_free);
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
75 error ("Failed to read tag");
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
76 }
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
77 }
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
78
31157
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
79 uint32_t get_rows_in_strip (uint32_t strip_no, uint32_t strip_count,
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
80 uint32_t rows_per_strip,
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
81 tiff_image_data *image_data)
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
82 {
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
83 // Calculate the expected number of elements in the strip data array
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
84 // All strips have equal number of rows except strips at the bottom
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
85 // of the image can have less number of rows
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
86 uint32_t rows_in_strip = rows_per_strip;
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
87 if (image_data->planar_configuration == PLANARCONFIG_CONTIG)
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
88 {
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
89 // All strips have equal number of rows excpet strips at the bottom
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
90 // of the image can have less number of rows
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
91 if (strip_no == strip_count - 1)
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
92 rows_in_strip = image_data->height - rows_in_strip * strip_no;
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
93 }
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
94 else if (image_data->planar_configuration == PLANARCONFIG_SEPARATE)
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
95 {
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
96 // For separate planes, we should check the last strip of each channel
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
97 uint32_t strips_per_channel
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
98 = strip_count / image_data->samples_per_pixel;
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
99 for (uint32_t boundary_strip = strips_per_channel - 1;
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
100 boundary_strip <= strip_count;
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
101 boundary_strip += strips_per_channel)
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
102 if (strip_no == boundary_strip)
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
103 rows_in_strip = image_data->height
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
104 - rows_in_strip * (strip_no % strips_per_channel);
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
105 }
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
106 else
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
107 error ("Planar Configuration not supported");
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
108
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
109 return rows_in_strip;
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
110 }
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
111
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
112 template <typename T>
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
113 octave_value
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
114 read_strip (TIFF *tif, uint32_t strip_no, tiff_image_data * image_data)
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
115 {
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
116 // ASSUMES stripped image and strip_no is a valid zero-based strip
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
117 // index for the tif image
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
118
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
119 uint32_t rows_in_strip;
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
120 if (! TIFFGetFieldDefaulted (tif, TIFFTAG_ROWSPERSTRIP, &rows_in_strip))
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
121 error ("Failed to obtain a value for RowsPerStrip");
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
122
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
123 if (rows_in_strip > image_data->height)
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
124 rows_in_strip = image_data->height;
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
125
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
126 uint32_t strip_count = TIFFNumberOfStrips (tif);
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
127 rows_in_strip = get_rows_in_strip (strip_no, strip_count,
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
128 rows_in_strip, image_data);
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
129 dim_vector strip_dims;
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
130 if (image_data->planar_configuration == PLANARCONFIG_CONTIG)
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
131 strip_dims = dim_vector (image_data->samples_per_pixel,
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
132 image_data->width, rows_in_strip);
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
133 else if (image_data->planar_configuration == PLANARCONFIG_SEPARATE)
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
134 strip_dims = dim_vector (image_data->width, rows_in_strip, 1);
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
135 else
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
136 error ("Unsupported bit depth");
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
137
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
138 T strip_data (strip_dims);
31158
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
139 uint8_t *strip_fvec
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
140 = reinterpret_cast<uint8_t *> (strip_data.fortran_vec ());
31157
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
141
31158
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
142 if (image_data->bits_per_sample == 8
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
143 || image_data->bits_per_sample == 16
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
144 || image_data->bits_per_sample == 32
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
145 || image_data->bits_per_sample == 64)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
146 {
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
147 if (TIFFReadEncodedStrip (tif, strip_no, strip_fvec, -1) == -1)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
148 error ("Failed to read strip data");
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
149 }
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
150 else if (image_data->bits_per_sample == 1)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
151 {
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
152 if (image_data->samples_per_pixel != 1)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
153 error ("Bi-Level images must have one channel only");
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
154
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
155 // Create a buffer to hold the packed strip data
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
156 // Unique pointers are faster than vectors for constant size buffers
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
157 std::unique_ptr<uint8_t []> strip_ptr
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
158 = std::make_unique<uint8_t []> (TIFFStripSize (tif));
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
159 uint8_t *strip_buf = strip_ptr.get ();
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
160 if (TIFFReadEncodedStrip (tif, strip_no, strip_buf, -1) == -1)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
161 error ("Failed to read strip data");
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
162
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
163 // According to the format specification, the row should be byte
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
164 // aligned so the number of bytes is rounded up to the nearest byte
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
165 uint32_t padded_width = (image_data->width + 7) / 8;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
166 // Packing the pixel data into bits
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
167 for (uint32_t row = 0; row < rows_in_strip; row++)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
168 {
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
169 for (uint32_t col = 0; col < image_data->width; col++)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
170 {
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
171 uint8_t shift = 7 - col % 8;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
172 strip_fvec[col] = (strip_buf[col / 8] >> shift) & 0x1;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
173 }
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
174 strip_fvec += image_data->width;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
175 strip_buf += padded_width;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
176 }
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
177 }
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
178 else
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
179 error ("Unsupported bit depth");
31157
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
180
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
181 Array<octave_idx_type> perm (dim_vector (3, 1));
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
182 if (image_data->planar_configuration == PLANARCONFIG_CONTIG)
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
183 {
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
184 perm(0) = 2;
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
185 perm(1) = 1;
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
186 perm(2) = 0;
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
187 }
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
188 else if (image_data->planar_configuration == PLANARCONFIG_SEPARATE)
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
189 {
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
190 perm(0) = 1;
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
191 perm(1) = 0;
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
192 perm(2) = 2;
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
193 }
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
194
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
195 strip_data = strip_data.permute (perm);
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
196 return octave_value (strip_data);
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
197 }
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
198
31113
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
199 template <typename T>
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
200 octave_value
31158
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
201 read_tile (TIFF *tif, uint32_t tile_no, tiff_image_data *image_data)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
202 {
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
203 // ASSUMES tiled image and tile_no is a valid zero-based tile
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
204 // index for the tif image
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
205
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
206 // TODO(maged): refactor into a function?
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
207 uint32_t tile_width, tile_height;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
208 if (! TIFFGetField (tif, TIFFTAG_TILELENGTH, &tile_height))
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
209 error ("Filed to read tile length");
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
210
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
211 if (! TIFFGetField (tif, TIFFTAG_TILEWIDTH, &tile_width))
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
212 error ("Filed to read tile length");
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
213
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
214 if (tile_height == 0 || tile_height % 16 != 0
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
215 || tile_width == 0 || tile_width % 16 != 0)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
216 error ("Tile dimesion tags are invalid");
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
217
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
218 dim_vector tile_dims;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
219 if (image_data->planar_configuration == PLANARCONFIG_CONTIG)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
220 {
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
221 tile_dims = dim_vector (image_data->samples_per_pixel, tile_width,
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
222 tile_height);
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
223 }
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
224 else if (image_data->planar_configuration == PLANARCONFIG_SEPARATE)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
225 {
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
226 tile_dims = dim_vector (tile_width, tile_height, 1);
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
227 }
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
228 else
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
229 error ("Unsupported planar configuration");
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
230
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
231 T tile_data (tile_dims);
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
232 uint8_t *tile_fvec
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
233 = reinterpret_cast<uint8_t *> (tile_data.fortran_vec ());
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
234
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
235 if (image_data->bits_per_sample == 8
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
236 || image_data->bits_per_sample == 16
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
237 || image_data->bits_per_sample == 32
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
238 || image_data->bits_per_sample == 64)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
239 {
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
240 if (TIFFReadEncodedTile (tif, tile_no, tile_fvec, -1) == -1)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
241 error ("Failed to read tile data");
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
242 }
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
243 else if (image_data->bits_per_sample == 1)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
244 {
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
245 if (image_data->samples_per_pixel != 1)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
246 error ("Bi-Level images must have one channel only");
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
247
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
248 // Create a buffer to hold the packed tile data
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
249 // Unique pointers are faster than vectors for constant size buffers
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
250 std::unique_ptr<uint8_t []> tile_ptr
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
251 = std::make_unique<uint8_t []> (TIFFTileSize (tif));
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
252 uint8_t *tile_buf = tile_ptr.get ();
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
253 if (TIFFReadEncodedTile (tif, tile_no, tile_buf, -1) == -1)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
254 error ("Failed to read tile data");
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
255
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
256 // unpack tile bits into output matrix cells
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
257 for (uint32_t row = 0; row < tile_height; row++)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
258 {
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
259 for (uint32_t col = 0; col < tile_width; col++)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
260 {
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
261 uint8_t shift = 7 - col % 8;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
262 tile_fvec[col] = (tile_buf [col / 8] >> shift) & 0x1;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
263 }
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
264 tile_fvec += tile_width;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
265 tile_buf += tile_width / 8;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
266 }
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
267 }
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
268 else
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
269 error ("Unsupported bit depth");
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
270
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
271 Array<octave_idx_type> perm (dim_vector (3, 1));
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
272 if (image_data->planar_configuration == PLANARCONFIG_CONTIG)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
273 {
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
274 perm(0) = 2;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
275 perm(1) = 1;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
276 perm(2) = 0;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
277 }
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
278 else if (image_data->planar_configuration == PLANARCONFIG_SEPARATE)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
279 {
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
280 perm(0) = 1;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
281 perm(1) = 0;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
282 perm(2) = 2;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
283 }
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
284
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
285 tile_data = tile_data.permute (perm);
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
286
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
287 // Get the actual tile dimensions
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
288 uint32_t tiles_across = (image_data->width + tile_width - 1)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
289 / tile_width;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
290 uint32_t tiles_down = (image_data->height + tile_height - 1)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
291 / tile_height;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
292 uint32_t corrected_width = tile_width;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
293 uint32_t corrected_height = tile_height;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
294 if (tile_no % tiles_across == tiles_across - 1)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
295 corrected_width = image_data->width - tile_width * (tiles_across - 1);
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
296 if ((tile_no / tiles_across) % tiles_down == tiles_down - 1)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
297 corrected_height = image_data->height - tile_height * (tiles_down - 1);
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
298
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
299 dim_vector corrected_dims;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
300 if (image_data->planar_configuration == PLANARCONFIG_CONTIG)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
301 corrected_dims = dim_vector (corrected_height, corrected_width,
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
302 image_data->samples_per_pixel);
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
303 else if (image_data->planar_configuration == PLANARCONFIG_SEPARATE)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
304 corrected_dims = dim_vector (corrected_height, corrected_width);
31159
e960e3a3b3f6 Tiff.m: added structs for tag value enums to the Tiff class.
magedrifaat <magedrifaat@gmail.com>
parents: 31158
diff changeset
305
31158
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
306 tile_data.resize (corrected_dims);
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
307
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
308 return octave_value (tile_data);
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
309 }
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
310
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
311 template <typename T>
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
312 octave_value
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
313 read_strip_or_tile (TIFF *tif, uint32_t strip_tile_no,
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
314 tiff_image_data *image_data)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
315 {
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
316 if (image_data->is_tiled)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
317 return read_tile<T> (tif, strip_tile_no, image_data);
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
318 else
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
319 return read_strip<T> (tif, strip_tile_no, image_data);
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
320 }
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
321
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
322 octave_value
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
323 handle_read_strip_or_tile (TIFF *tif, uint32_t strip_tile_no)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
324 {
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
325 // Obtain all necessary tags
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
326 tiff_image_data image_data (tif);
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
327
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
328 uint16_t sample_format;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
329 if (! TIFFGetFieldDefaulted(tif, TIFFTAG_SAMPLEFORMAT, &sample_format))
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
330 error ("Failed to obtain a value for sample format");
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
331
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
332 if (sample_format == 3)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
333 {
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
334 if (image_data.bits_per_sample != 32
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
335 && image_data.bits_per_sample != 64)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
336 error ("Floating point images are only supported for bit depths of 32 and 64");
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
337 }
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
338 else if (sample_format != 1 && sample_format != 4)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
339 error ("Unsupported sample format");
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
340
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
341 switch (image_data.bits_per_sample)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
342 {
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
343 case 1:
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
344 return read_strip_or_tile<boolNDArray> (tif, strip_tile_no,
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
345 &image_data);
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
346 break;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
347 case 8:
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
348 return read_strip_or_tile<uint8NDArray> (tif, strip_tile_no,
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
349 &image_data);
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
350 break;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
351 case 16:
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
352 return read_strip_or_tile<uint16NDArray> (tif, strip_tile_no,
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
353 &image_data);
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
354 break;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
355 case 32:
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
356 if (sample_format == 3)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
357 return read_strip_or_tile<FloatNDArray> (tif, strip_tile_no,
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
358 &image_data);
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
359 else
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
360 return read_strip_or_tile<uint32NDArray> (tif, strip_tile_no,
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
361 &image_data);
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
362 break;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
363 case 64:
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
364 if (sample_format == 3)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
365 return read_strip_or_tile<NDArray> (tif, strip_tile_no,
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
366 &image_data);
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
367 else
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
368 return read_strip_or_tile<uint64NDArray> (tif, strip_tile_no,
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
369 &image_data);
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
370 break;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
371 default:
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
372 error ("Unsupported bit depth");
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
373 }
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
374 }
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
375
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
376 template <typename T>
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
377 octave_value
31113
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
378 read_stripped_image (TIFF *tif, tiff_image_data *image_data)
31112
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
379 {
31113
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
380 typedef typename T::element_type P;
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
381
31119
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
382 // For 1-bit and 4-bit images, each row must be byte aligned and padding
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
383 // is added to the end of the row to reach the byte mark.
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
384 // To facilitate reading the data, the matrix is defined with the padded
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
385 // size and the padding is removed at the end.
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
386 uint32_t padded_width = image_data->width;
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
387 uint8_t remove_padding = 0;
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
388 if ((image_data->bits_per_sample == 1 || image_data->bits_per_sample == 4)
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
389 && padded_width % 8 != 0)
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
390 {
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
391 padded_width += (8 - padded_width % 8) % 8;
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
392 remove_padding = 1;
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
393 }
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
394
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
395 // The matrix dimensions are defined in the order that corresponds to
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
396 // the order of strip data read from LibTIFF.
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
397 // At the end, the matrix is permutated to the order expected by Octave
31120
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
398 T img;
31119
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
399 if (image_data->planar_configuration == PLANARCONFIG_CONTIG)
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
400 img = T (dim_vector (image_data->samples_per_pixel, padded_width,
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
401 image_data->height));
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
402 else if (image_data->planar_configuration == PLANARCONFIG_SEPARATE)
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
403 img = T (dim_vector (padded_width, image_data->height,
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
404 image_data->samples_per_pixel));
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
405 else
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
406 error ("Unsupported Planar Configuration");
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
407
31113
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
408 P *img_fvec = img.fortran_vec ();
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
409
31112
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
410 // Obtain the necessary data for handling the strips
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
411 uint32_t strip_count = TIFFNumberOfStrips (tif);
31119
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
412
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
413 // Can't rely on StripByteCounts because in compressed images
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
414 // the byte count reflect the actual number of bytes stored
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
415 // in the file not the size of the uncompressed strip
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
416 int64_t strip_size;
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
417 uint64_t written_size = 0;
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
418 uint64_t image_size = padded_width * image_data->height
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
419 * image_data->samples_per_pixel
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
420 * sizeof (P);
31112
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
421 for (uint32_t strip = 0; strip < strip_count; strip++)
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
422 {
31119
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
423 // Read the strip data into the matrix directly
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
424 strip_size = TIFFReadEncodedStrip (tif, strip, img_fvec, -1);
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
425
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
426 // Check if the strip read failed.
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
427 if (strip_size == -1)
31112
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
428 error ("Failed to read strip data");
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
429
31119
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
430 // Check if the size being read exceeds the bounds of the matrix
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
431 // In case of a corrupt image with more data than needed
31129
dfab9c6982bf Tiff getTag: added support for single quotes string fo the tag name
magedrifaat <magedrifaat@gmail.com>
parents: 31128
diff changeset
432 // This is probably redundant as LibTIFF checks sizes internally
31119
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
433 if (written_size + strip_size > image_size)
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
434 error ("Strip data is larger than the image size");
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
435
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
436 if (image_data->bits_per_sample == 1)
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
437 {
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
438 if (image_data->samples_per_pixel != 1)
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
439 error ("Bi-Level images must have one channel only");
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
440
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
441 // The strip size is multiplied by 8 to reflect tha actual
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
442 // number of bytes written to the matrix since each byte
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
443 // in the original strip contains 8 pixels of data
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
444 strip_size *= 8;
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
445
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
446 // Checking bounds again with the new size
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
447 if (written_size + strip_size > image_size)
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
448 error ("Strip data is larger than the image size");
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
449
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
450 // Iterate over the memory region backwards to expand the bits
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
451 // to their respective bytes without overwriting the read data
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
452 for (int64_t pixel = strip_size - 1; pixel >= 0; pixel--)
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
453 {
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
454 // TODO(maged): is it necessary to check FillOrder?
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
455 uint8_t bit_number = 7 - pixel % 8;
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
456 uint8_t * img_u8 = reinterpret_cast<uint8_t *> (img_fvec);
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
457 img_fvec[pixel] = (img_u8[pixel / 8] >> bit_number) & 0x01;
31119
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
458 }
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
459 }
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
460 else if (image_data->bits_per_sample == 4)
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
461 {
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
462 if (image_data->samples_per_pixel != 1)
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
463 error ("4-bit images are only supported for grayscale");
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
464
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
465 // Strip size is multplied by as each byte contains 2 pixels
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
466 // and each pixel is later expanded into its own byte
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
467 strip_size *= 2;
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
468
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
469 // Checking bounds again with the ne size
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
470 if (written_size + strip_size > image_size)
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
471 error ("Strip data is larger than the image size");
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
472
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
473 // Iterate over the memory region backwards to expand the nibbles
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
474 // to their respective bytes without overwriting the read data
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
475 for (int64_t pixel = strip_size - 1; pixel >= 0; pixel--)
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
476 {
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
477 uint8_t shift = pixel % 2 == 0? 4: 0;
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
478 uint8_t * img_u8 = reinterpret_cast<uint8_t *> (img_fvec);
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
479 img_fvec[pixel] = (img_u8[pixel / 2] >> shift) & 0x0F;
31119
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
480 }
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
481 }
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
482 else if (image_data->bits_per_sample != 8 &&
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
483 image_data->bits_per_sample != 16 &&
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
484 image_data->bits_per_sample != 32 &&
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
485 image_data->bits_per_sample != 64)
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
486 error ("Unsupported bit depth");
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
487
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
488 // Advance the pointer by the amount of bytes read
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
489 img_fvec
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
490 = reinterpret_cast<P *> (reinterpret_cast <uint8_t *> (img_fvec)
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
491 + strip_size);
31119
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
492 written_size += strip_size;
31112
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
493 }
31119
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
494
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
495 // The matrices are permutated back to the shape expected by Octave
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
496 // which is height x width x channels
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
497 Array<octave_idx_type> perm (dim_vector (3, 1));
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
498 if (image_data->planar_configuration == PLANARCONFIG_CONTIG)
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
499 {
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
500 perm(0) = 2;
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
501 perm(1) = 1;
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
502 perm(2) = 0;
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
503 }
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
504 else if (image_data->planar_configuration == PLANARCONFIG_SEPARATE)
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
505 {
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
506 perm(0) = 1;
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
507 perm(1) = 0;
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
508 perm(2) = 2;
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
509 }
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
510
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
511 img = img.permute (perm);
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
512
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
513 if (remove_padding)
dbca50246dfc Tiff read: changed logic to matrix operations instead of pointer math
magedrifaat <magedrifaat@gmail.com>
parents: 31118
diff changeset
514 img.resize (dim_vector (image_data->height, image_data->width));
31113
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
515
31118
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
516 return octave_value (img);
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
517 }
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
518
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
519 template <typename T>
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
520 octave_value
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
521 read_tiled_image (TIFF *tif, tiff_image_data *image_data)
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
522 {
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
523 typedef typename T::element_type P;
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
524
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
525 // Obtain the necessary data for handling the tiles
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
526 uint32_t tile_width, tile_height;
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
527 validate_tiff_get_field (TIFFGetField (tif, TIFFTAG_TILEWIDTH,
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
528 &tile_width));
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
529 validate_tiff_get_field (TIFFGetField (tif, TIFFTAG_TILELENGTH,
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
530 &tile_height));
31120
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
531 uint32_t tile_count = TIFFNumberOfTiles (tif);
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
532 uint32_t tiles_across = (image_data->width + tile_width - 1)
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
533 / tile_width;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
534 uint32_t tiles_down = (image_data->height + tile_height - 1)
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
535 / tile_height;
31118
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
536
31120
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
537 T img;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
538 // The matrix dimensions are defined in the order that corresponds to
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
539 // the order of the tile data read from LibTIFF.
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
540 // At the end, the matrix is permutated, reshaped and resized to be in the
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
541 // shape expected by Octave
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
542 if (image_data->planar_configuration == PLANARCONFIG_CONTIG)
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
543 img = T (dim_vector (image_data->samples_per_pixel, tile_width,
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
544 tile_height, tiles_across, tiles_down));
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
545 else if (image_data->planar_configuration == PLANARCONFIG_SEPARATE)
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
546 img = T (dim_vector (tile_width, tile_height, tiles_across, tiles_down,
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
547 image_data->samples_per_pixel));
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
548 else
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
549 error ("Unsupported Planar Configuration");
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
550
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
551 P *img_fvec = img.fortran_vec ();
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
552
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
553 // image_size is calculated from the tile data and not from the
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
554 // image parameters to account for the additional padding in the
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
555 // boundary tiles
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
556 uint64_t image_size = tile_width * tile_height * tile_count * sizeof(P);
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
557 if (image_data->planar_configuration == PLANARCONFIG_CONTIG)
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
558 image_size *= image_data->samples_per_pixel;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
559
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
560 // Can't rely on TileByteCounts because compressed images will report
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
561 // the number of bytes present in the file as opposed to the actual
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
562 // number of bytes of uncompressed data that is needed here
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
563 int64_t tile_size;
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
564 uint64_t written_size = 0;
31120
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
565 for (uint32_t tile = 0; tile < tile_count; tile++)
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
566 {
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
567 tile_size = TIFFReadEncodedTile(tif, tile, img_fvec, -1);
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
568
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
569 if (tile_size == -1)
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
570 error ("Failed to read tile data");
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
571
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
572 // Checking if the read bytes would exceed the size of the matrix
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
573 if (tile_size + written_size > image_size)
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
574 error ("Tile data is larger than image size");
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
575
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
576 if (image_data->bits_per_sample == 1)
31118
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
577 {
31120
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
578 if (image_data->samples_per_pixel != 1)
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
579 error ("Bi-Level images must have one channel only");
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
580
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
581 // The tile size is multiplied by 8 to reflect tha actual
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
582 // number of bytes written to the matrix since each byte
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
583 // in the original tile contains 8 pixels of data
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
584 tile_size *= 8;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
585
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
586 // Checking bounds again with the new size
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
587 if (written_size + tile_size > image_size)
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
588 error ("Tile data is larger than the image size");
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
589
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
590 // Iterate over the memory region backwards to expand the bits
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
591 // to their respective bytes without overwriting the read data
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
592 for (int64_t pixel = tile_size - 1; pixel >= 0; pixel--)
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
593 {
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
594 // TODO(maged): is it necessary to check FillOrder?
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
595 uint8_t bit_number = 7 - pixel % 8;
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
596 uint8_t * img_u8 = reinterpret_cast<uint8_t *> (img_fvec);
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
597 img_fvec[pixel]= (img_u8[pixel / 8] >> bit_number) & 0x01;
31120
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
598 }
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
599 }
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
600 else if (image_data->bits_per_sample == 4)
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
601 {
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
602 if (image_data->samples_per_pixel != 1)
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
603 error ("4-bit images are only supported for grayscale");
31118
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
604
31120
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
605 // tile size is multplied by as each byte contains 2 pixels
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
606 // and each pixel is later expanded into its own byte
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
607 tile_size *= 2;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
608
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
609 // Checking bounds again with the ne size
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
610 if (written_size + tile_size > image_size)
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
611 error ("Tile data is larger than the image size");
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
612
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
613 // Iterate over the memory region backwards to expand the nibbles
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
614 // to their respective bytes without overwriting the read data
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
615 for (int64_t pixel = tile_size - 1; pixel >= 0; pixel--)
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
616 {
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
617 uint8_t shift = pixel % 2 == 0? 4: 0;
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
618 uint8_t * img_u8 = reinterpret_cast<uint8_t *> (img_fvec);
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
619 img_fvec[pixel] = (img_u8[pixel / 2] >> shift) & 0x0F;
31120
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
620 }
31118
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
621 }
31120
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
622 else if (image_data->bits_per_sample != 8 &&
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
623 image_data->bits_per_sample != 16 &&
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
624 image_data->bits_per_sample != 32 &&
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
625 image_data->bits_per_sample != 64)
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
626 error ("Unsupported bit depth");
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
627
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
628 img_fvec
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
629 = reinterpret_cast<P *> (reinterpret_cast<uint8_t *> (img_fvec)
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
630 + tile_size);
31120
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
631 written_size += tile_size;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
632 }
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
633
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
634 // The data is now in the matrix but in a different order than expected
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
635 // by Octave and with additional padding in boundary tiles.
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
636 // To get it to the right order, the dimensions are permutated to
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
637 // align tiles to their correct grid, then reshaped to remove the
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
638 // extra dimensions (tiles_across, tiles_down), then resized to
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
639 // remove any extra padding, and finally permutated to the correct
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
640 // order that is: height x width x channels
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
641 Array<octave_idx_type> perm1 (dim_vector (5, 1));
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
642 Array<octave_idx_type> perm2 (dim_vector (3, 1));
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
643 if (image_data->planar_configuration == PLANARCONFIG_CONTIG)
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
644 {
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
645 perm1(0) = 0;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
646 perm1(1) = 1;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
647 perm1(2) = 3;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
648 perm1(3) = 2;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
649 perm1(4) = 4;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
650 img = img.permute (perm1);
31118
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
651
31120
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
652 img = img.reshape (dim_vector (image_data->samples_per_pixel,
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
653 tile_width * tiles_across,
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
654 tile_height * tiles_down));
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
655
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
656 if (tile_width * tiles_across != image_data->width
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
657 || tile_height * tiles_down != image_data->height)
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
658 img.resize (dim_vector (image_data->samples_per_pixel,
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
659 image_data->width, image_data->height));
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
660
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
661 perm2(0) = 2;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
662 perm2(1) = 1;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
663 perm2(2) = 0;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
664 img = img.permute (perm2);
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
665 }
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
666 else if (image_data->planar_configuration == PLANARCONFIG_SEPARATE)
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
667 {
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
668 perm1(0) = 0;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
669 perm1(1) = 2;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
670 perm1(2) = 1;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
671 perm1(3) = 3;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
672 perm1(4) = 4;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
673 img = img.permute (perm1);
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
674
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
675 img = img.reshape (dim_vector (tile_width * tiles_across,
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
676 tile_height * tiles_down,
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
677 image_data->samples_per_pixel));
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
678
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
679 if (tile_width * tiles_across != image_data->width
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
680 || tile_height * tiles_down != image_data->height)
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
681 img.resize (dim_vector (image_data->width, image_data->height,
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
682 image_data->samples_per_pixel));
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
683
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
684 perm2(0) = 1;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
685 perm2(1) = 0;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
686 perm2(2) = 2;
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
687 img = img.permute (perm2);
46bb98cec195 Tiff read: implemented all cases for tiled images using matrix operations
magedrifaat <magedrifaat@gmail.com>
parents: 31119
diff changeset
688 }
31118
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
689
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
690 return octave_value (img);
31113
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
691 }
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
692
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
693 template <typename T>
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
694 octave_value
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
695 read_image (TIFF *tif, tiff_image_data *image_data)
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
696 {
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
697 if (image_data->is_tiled)
31118
f8be3654caef Tiff read: Support for tiled images with normal planar configuration
magedrifaat <magedrifaat@gmail.com>
parents: 31117
diff changeset
698 return read_tiled_image<T> (tif, image_data);
31113
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
699 else
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
700 return read_stripped_image<T> (tif, image_data);
31112
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
701 }
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
702
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
703 // Convert tag value to double
31114
9dead1249449 Tiff getTag: fixed matrix shape for ColorMap and TransferFunction
magedrifaat <magedrifaat@gmail.com>
parents: 31113
diff changeset
704 octave_value
31112
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
705 interpret_scalar_tag_data (void *data, TIFFDataType tag_datatype)
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
706 {
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
707 double retval;
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
708
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
709 switch (tag_datatype)
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
710 {
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
711 case TIFF_BYTE:
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
712 case TIFF_UNDEFINED:
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
713 {
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
714 retval = static_cast<double> (*(reinterpret_cast<uint8_t *> (data)));
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
715 break;
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
716 }
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
717 case TIFF_SHORT:
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
718 {
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
719 retval = static_cast<double> (*(reinterpret_cast<uint16_t *> (data)));
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
720 break;
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
721 }
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
722 case TIFF_LONG:
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
723 {
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
724 retval = static_cast<double> (*(reinterpret_cast<uint32_t *> (data)));
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
725 break;
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
726 }
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
727 case TIFF_LONG8:
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
728 {
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
729 retval = static_cast<double> (*(reinterpret_cast<uint64_t *> (data)));
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
730 break;
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
731 }
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
732 case TIFF_RATIONAL:
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
733 {
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
734 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
735 break;
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
736 }
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
737 case TIFF_SBYTE:
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
738 {
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
739 retval = static_cast<double> (*(reinterpret_cast<int8_t *> (data)));
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
740 break;
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
741 }
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
742 case TIFF_SSHORT:
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
743 {
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
744 retval = static_cast<double> (*(reinterpret_cast<int16_t *> (data)));
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
745 break;
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
746 }
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
747 case TIFF_SLONG:
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
748 {
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
749 retval = static_cast<double> (*(reinterpret_cast<int32_t *> (data)));
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
750 break;
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
751 }
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
752 case TIFF_SLONG8:
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
753 {
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
754 retval = static_cast<double> (*(reinterpret_cast<int64_t *> (data)));
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
755 break;
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
756 }
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
757 case TIFF_FLOAT:
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
758 {
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
759 retval = *(reinterpret_cast<float *> (data));
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
760 break;
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
761 }
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
762 case TIFF_DOUBLE:
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
763 {
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
764 retval = *(reinterpret_cast<double *> (data));
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
765 break;
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
766 }
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
767 case TIFF_SRATIONAL:
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
768 {
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
769 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
770 break;
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
771 }
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
772 case TIFF_IFD:
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
773 case TIFF_IFD8:
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
774 error ("Unimplemented IFFD data type");
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
775 break;
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
776 default:
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
777 error ("Unsupported tag data type");
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
778 }
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
779
31114
9dead1249449 Tiff getTag: fixed matrix shape for ColorMap and TransferFunction
magedrifaat <magedrifaat@gmail.com>
parents: 31113
diff changeset
780 return octave_value (retval);
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
781 }
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
782
31114
9dead1249449 Tiff getTag: fixed matrix shape for ColorMap and TransferFunction
magedrifaat <magedrifaat@gmail.com>
parents: 31113
diff changeset
783 // Convert memory buffer into a suitable octave value
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
784 // depending on tag_datatype
31114
9dead1249449 Tiff getTag: fixed matrix shape for ColorMap and TransferFunction
magedrifaat <magedrifaat@gmail.com>
parents: 31113
diff changeset
785 octave_value
31112
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
786 interpret_tag_data (void *data, uint32_t count, TIFFDataType tag_datatype)
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
787 {
31114
9dead1249449 Tiff getTag: fixed matrix shape for ColorMap and TransferFunction
magedrifaat <magedrifaat@gmail.com>
parents: 31113
diff changeset
788 octave_value retval;
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
789 // Apparently matlab converts scalar numerical values into double
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
790 // but doesn't do the same for arrays
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
791 if (count == 1 && tag_datatype != TIFF_ASCII)
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
792 {
31114
9dead1249449 Tiff getTag: fixed matrix shape for ColorMap and TransferFunction
magedrifaat <magedrifaat@gmail.com>
parents: 31113
diff changeset
793 retval = interpret_scalar_tag_data (data, tag_datatype);
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
794 }
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
795 else
31101
f24d7bcad2d3 Partially fixed formatting of C++ code
magedrifaat <magedrifaat@gmail.com>
parents: 31099
diff changeset
796 {
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
797 dim_vector arr_dims (1, count);
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
798
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
799 switch (tag_datatype)
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
800 {
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
801 case TIFF_BYTE:
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
802 case TIFF_UNDEFINED:
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
803 {
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
804 uint8NDArray arr (arr_dims);
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
805 for (uint32_t i = 0; i < count; i++)
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
806 {
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
807 arr(i) = (reinterpret_cast<uint8_t *> (data))[i];
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
808 }
31114
9dead1249449 Tiff getTag: fixed matrix shape for ColorMap and TransferFunction
magedrifaat <magedrifaat@gmail.com>
parents: 31113
diff changeset
809 retval = octave_value (arr);
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
810 break;
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
811 }
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
812 case TIFF_ASCII:
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
813 {
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
814 retval = octave_value (*(reinterpret_cast<char **> (data)));
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
815 break;
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
816 }
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
817 case TIFF_SHORT:
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
818 {
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
819 uint16NDArray arr (arr_dims);
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
820 for (uint32_t i = 0; i < count; i++)
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
821 {
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
822 arr(i) = (reinterpret_cast<uint16_t *> (data))[i];
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
823 }
31114
9dead1249449 Tiff getTag: fixed matrix shape for ColorMap and TransferFunction
magedrifaat <magedrifaat@gmail.com>
parents: 31113
diff changeset
824 retval = octave_value (arr);
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
825 break;
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
826 }
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
827 case TIFF_LONG:
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
828 {
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
829 uint32NDArray arr (arr_dims);
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
830 for (uint32_t i = 0; i < count; i++)
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
831 {
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
832 arr(i) = (reinterpret_cast<uint32_t *> (data))[i];
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
833 }
31114
9dead1249449 Tiff getTag: fixed matrix shape for ColorMap and TransferFunction
magedrifaat <magedrifaat@gmail.com>
parents: 31113
diff changeset
834 retval = octave_value (arr);
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
835 break;
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
836 }
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
837 case TIFF_LONG8:
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
838 {
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
839 uint64NDArray arr (arr_dims);
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
840 for (uint32_t i = 0; i < count; i++)
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
841 {
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
842 arr(i) = (reinterpret_cast<uint64_t *> (data))[i];
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
843 }
31114
9dead1249449 Tiff getTag: fixed matrix shape for ColorMap and TransferFunction
magedrifaat <magedrifaat@gmail.com>
parents: 31113
diff changeset
844 retval = octave_value (arr);
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
845 break;
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
846 }
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
847 case TIFF_RATIONAL:
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
848 {
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
849 NDArray arr (arr_dims);
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
850 for (uint32_t i = 0; i < count; i+=2)
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
851 {
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
852 arr(i / 2) = static_cast<float> ((reinterpret_cast<uint32_t *> (data))[i])
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
853 / static_cast<float> ((reinterpret_cast<uint32_t *> (data))[i+1]);
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
854 }
31114
9dead1249449 Tiff getTag: fixed matrix shape for ColorMap and TransferFunction
magedrifaat <magedrifaat@gmail.com>
parents: 31113
diff changeset
855 retval = octave_value (arr);
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
856 break;
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
857 }
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
858 case TIFF_SBYTE:
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
859 {
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
860 int8NDArray arr (arr_dims);
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
861 for (uint32_t i = 0; i < count; i++)
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
862 {
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
863 arr(i) = (reinterpret_cast<int8_t *> (data))[i];
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
864 }
31114
9dead1249449 Tiff getTag: fixed matrix shape for ColorMap and TransferFunction
magedrifaat <magedrifaat@gmail.com>
parents: 31113
diff changeset
865 retval = octave_value (arr);
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
866 break;
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
867 }
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
868 case TIFF_SSHORT:
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
869 {
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
870 int16NDArray arr (arr_dims);
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
871 for (uint32_t i = 0; i < count; i++)
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
872 {
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
873 arr(i) = (reinterpret_cast<int16_t *> (data))[i];
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
874 }
31114
9dead1249449 Tiff getTag: fixed matrix shape for ColorMap and TransferFunction
magedrifaat <magedrifaat@gmail.com>
parents: 31113
diff changeset
875 retval = octave_value (arr);
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
876 break;
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
877 }
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
878 case TIFF_SLONG:
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
879 {
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
880 int32NDArray arr (arr_dims);
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
881 for (uint32_t i = 0; i < count; i++)
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
882 {
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
883 arr(i) = (reinterpret_cast<int32_t *> (data))[i];
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
884 }
31114
9dead1249449 Tiff getTag: fixed matrix shape for ColorMap and TransferFunction
magedrifaat <magedrifaat@gmail.com>
parents: 31113
diff changeset
885 retval = octave_value (arr);
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
886 break;
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
887 }
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
888 case TIFF_SLONG8:
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
889 {
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
890 int64NDArray arr (arr_dims);
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
891 for (uint32_t i = 0; i < count; i++)
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
892 {
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
893 arr(i) = (reinterpret_cast<int64_t *> (data))[i];
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
894 }
31114
9dead1249449 Tiff getTag: fixed matrix shape for ColorMap and TransferFunction
magedrifaat <magedrifaat@gmail.com>
parents: 31113
diff changeset
895 retval = octave_value (arr);
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
896 break;
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
897 }
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
898 case TIFF_FLOAT:
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
899 {
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
900 NDArray arr (arr_dims);
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
901 for (uint32_t i = 0; i < count; i++)
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
902 {
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
903 arr(i) = (reinterpret_cast<float *> (data))[i];
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
904 }
31114
9dead1249449 Tiff getTag: fixed matrix shape for ColorMap and TransferFunction
magedrifaat <magedrifaat@gmail.com>
parents: 31113
diff changeset
905 retval = octave_value (arr);
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
906 break;
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
907 }
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
908 case TIFF_DOUBLE:
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
909 {
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
910 NDArray arr (arr_dims);
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
911 for (uint32_t i = 0; i < count; i++)
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
912 {
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
913 arr(i) = (reinterpret_cast<double *> (data))[i];
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
914 }
31114
9dead1249449 Tiff getTag: fixed matrix shape for ColorMap and TransferFunction
magedrifaat <magedrifaat@gmail.com>
parents: 31113
diff changeset
915 retval = octave_value (arr);
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
916 break;
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
917 }
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
918 case TIFF_SRATIONAL:
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
919 {
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
920 NDArray arr (arr_dims);
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
921 for (uint32_t i = 0; i < count; i+=2)
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
922 {
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
923 arr(i / 2) = static_cast<float> ((reinterpret_cast<int32_t *> (data))[i])
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
924 / static_cast<float> ((reinterpret_cast<int32_t *> (data))[i+1]);
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
925 }
31114
9dead1249449 Tiff getTag: fixed matrix shape for ColorMap and TransferFunction
magedrifaat <magedrifaat@gmail.com>
parents: 31113
diff changeset
926 retval = octave_value (arr);
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
927 break;
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
928 }
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
929 case TIFF_IFD:
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
930 case TIFF_IFD8:
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
931 // TODO(maged): implement IFD datatype?
31129
dfab9c6982bf Tiff getTag: added support for single quotes string fo the tag name
magedrifaat <magedrifaat@gmail.com>
parents: 31128
diff changeset
932 error ("Unimplemented IFD data type");
31105
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
933 break;
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
934 default:
7c5b8a294f60 getTag returns double for scalar values
magedrifaat <magedrifaat@gmail.com>
parents: 31104
diff changeset
935 error ("Unsupported tag data type");
31101
f24d7bcad2d3 Partially fixed formatting of C++ code
magedrifaat <magedrifaat@gmail.com>
parents: 31099
diff changeset
936 }
f24d7bcad2d3 Partially fixed formatting of C++ code
magedrifaat <magedrifaat@gmail.com>
parents: 31099
diff changeset
937 }
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
938
31114
9dead1249449 Tiff getTag: fixed matrix shape for ColorMap and TransferFunction
magedrifaat <magedrifaat@gmail.com>
parents: 31113
diff changeset
939 return retval;
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
940 }
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
941
31114
9dead1249449 Tiff getTag: fixed matrix shape for ColorMap and TransferFunction
magedrifaat <magedrifaat@gmail.com>
parents: 31113
diff changeset
942 octave_value
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
943 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
944 {
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
945 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
946
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
947 // TIFFFieldReadCount returns VARIABLE for some scalar tags
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
948 // (e.g. Compression) But TIFFFieldPassCount seems consistent
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
949 // 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
950 // 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
951 if (TIFFFieldPassCount (fip))
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
952 error ("Unsupported tag");
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
953
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
954 int type_size = TIFFDataWidth (TIFFFieldDataType (fip));
31129
dfab9c6982bf Tiff getTag: added support for single quotes string fo the tag name
magedrifaat <magedrifaat@gmail.com>
parents: 31128
diff changeset
955
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
956 void *data = _TIFFmalloc (type_size);
31131
7349994f30f8 Tiff: fixed the first test to use a single-pixel image
magedrifaat <magedrifaat@gmail.com>
parents: 31130
diff changeset
957 if (tag_id == TIFFTAG_PLANARCONFIG)
7349994f30f8 Tiff: fixed the first test to use a single-pixel image
magedrifaat <magedrifaat@gmail.com>
parents: 31130
diff changeset
958 {
7349994f30f8 Tiff: fixed the first test to use a single-pixel image
magedrifaat <magedrifaat@gmail.com>
parents: 31130
diff changeset
959 // Workaround for a bug in LibTIFF where it incorrectly returns
7349994f30f8 Tiff: fixed the first test to use a single-pixel image
magedrifaat <magedrifaat@gmail.com>
parents: 31130
diff changeset
960 // zero as the default value for PlanaConfiguration
7349994f30f8 Tiff: fixed the first test to use a single-pixel image
magedrifaat <magedrifaat@gmail.com>
parents: 31130
diff changeset
961 if (! TIFFGetField(tif, tag_id, data))
7349994f30f8 Tiff: fixed the first test to use a single-pixel image
magedrifaat <magedrifaat@gmail.com>
parents: 31130
diff changeset
962 *reinterpret_cast<uint16_t *> (data) = 1;
7349994f30f8 Tiff: fixed the first test to use a single-pixel image
magedrifaat <magedrifaat@gmail.com>
parents: 31130
diff changeset
963 }
7349994f30f8 Tiff: fixed the first test to use a single-pixel image
magedrifaat <magedrifaat@gmail.com>
parents: 31130
diff changeset
964 else
7349994f30f8 Tiff: fixed the first test to use a single-pixel image
magedrifaat <magedrifaat@gmail.com>
parents: 31130
diff changeset
965 validate_tiff_get_field (TIFFGetFieldDefaulted (tif, tag_id, data), data);
7349994f30f8 Tiff: fixed the first test to use a single-pixel image
magedrifaat <magedrifaat@gmail.com>
parents: 31130
diff changeset
966
31130
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
967 octave_value tag_data_ov = interpret_tag_data (data, 1,
31114
9dead1249449 Tiff getTag: fixed matrix shape for ColorMap and TransferFunction
magedrifaat <magedrifaat@gmail.com>
parents: 31113
diff changeset
968 TIFFFieldDataType (fip));
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
969 _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
970
31114
9dead1249449 Tiff getTag: fixed matrix shape for ColorMap and TransferFunction
magedrifaat <magedrifaat@gmail.com>
parents: 31113
diff changeset
971 return tag_data_ov;
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
972 }
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
973
31114
9dead1249449 Tiff getTag: fixed matrix shape for ColorMap and TransferFunction
magedrifaat <magedrifaat@gmail.com>
parents: 31113
diff changeset
974 octave_value
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
975 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
976 {
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
977 void *data;
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
978 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
979
31112
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
980 return interpret_tag_data (data, array_size, TIFFFieldDataType (fip));
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
981 }
31097
75ab26f147a5 getTag: Implemented single array tags, only multi-array and special tags are unimplemented
magedrifaat <magedrifaat@gmail.com>
parents: 31096
diff changeset
982
31117
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
983 octave_value
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
984 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
985 {
31117
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
986 octave_value tag_data_ov;
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
987 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
988
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
989 // 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
990 switch (tag_id)
31101
f24d7bcad2d3 Partially fixed formatting of C++ code
magedrifaat <magedrifaat@gmail.com>
parents: 31099
diff changeset
991 {
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
992 case TIFFTAG_STRIPBYTECOUNTS:
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
993 case TIFFTAG_STRIPOFFSETS:
31117
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
994 tag_data_ov = get_array_field_data (tif, fip,
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
995 TIFFNumberOfStrips (tif));
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
996 break;
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
997 case TIFFTAG_TILEBYTECOUNTS:
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
998 case TIFFTAG_TILEOFFSETS:
31117
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
999 tag_data_ov = get_array_field_data (tif, fip, TIFFNumberOfTiles (tif));
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1000 break;
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1001 case TIFFTAG_YCBCRCOEFFICIENTS:
31117
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1002 tag_data_ov = get_array_field_data (tif, fip, 3);
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1003 break;
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1004 case TIFFTAG_REFERENCEBLACKWHITE:
31117
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1005 tag_data_ov = get_array_field_data (tif, fip, 6);
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1006 break;
31106
f5a88c0a61ab Support for GrayResponseCurve and GrayResponseUnit tags
magedrifaat <magedrifaat@gmail.com>
parents: 31105
diff changeset
1007 case TIFFTAG_GRAYRESPONSECURVE:
f5a88c0a61ab Support for GrayResponseCurve and GrayResponseUnit tags
magedrifaat <magedrifaat@gmail.com>
parents: 31105
diff changeset
1008 {
f5a88c0a61ab Support for GrayResponseCurve and GrayResponseUnit tags
magedrifaat <magedrifaat@gmail.com>
parents: 31105
diff changeset
1009 uint16_t bits_per_sample;
31127
0d9633ee715e Tiff: fixed a bug where the default value of some tags was ignored
magedrifaat <magedrifaat@gmail.com>
parents: 31126
diff changeset
1010 if (! TIFFGetFieldDefaulted (tif, TIFFTAG_BITSPERSAMPLE,
0d9633ee715e Tiff: fixed a bug where the default value of some tags was ignored
magedrifaat <magedrifaat@gmail.com>
parents: 31126
diff changeset
1011 &bits_per_sample))
31106
f5a88c0a61ab Support for GrayResponseCurve and GrayResponseUnit tags
magedrifaat <magedrifaat@gmail.com>
parents: 31105
diff changeset
1012 error ("Failed to obtain the bit depth");
f5a88c0a61ab Support for GrayResponseCurve and GrayResponseUnit tags
magedrifaat <magedrifaat@gmail.com>
parents: 31105
diff changeset
1013
31117
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1014 tag_data_ov = get_array_field_data (tif, fip, 1<<bits_per_sample);
31106
f5a88c0a61ab Support for GrayResponseCurve and GrayResponseUnit tags
magedrifaat <magedrifaat@gmail.com>
parents: 31105
diff changeset
1015 break;
f5a88c0a61ab Support for GrayResponseCurve and GrayResponseUnit tags
magedrifaat <magedrifaat@gmail.com>
parents: 31105
diff changeset
1016 }
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1017 case TIFFTAG_COLORMAP:
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1018 {
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1019 uint16_t bits_per_sample;
31127
0d9633ee715e Tiff: fixed a bug where the default value of some tags was ignored
magedrifaat <magedrifaat@gmail.com>
parents: 31126
diff changeset
1020 if (! TIFFGetFieldDefaulted (tif, TIFFTAG_BITSPERSAMPLE,
0d9633ee715e Tiff: fixed a bug where the default value of some tags was ignored
magedrifaat <magedrifaat@gmail.com>
parents: 31126
diff changeset
1021 &bits_per_sample))
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1022 error ("Failed to obtain the bit depth");
31143
a68f2dadafee Tiff.m: added all remaining tests for implemented features.
magedrifaat <magedrifaat@gmail.com>
parents: 31142
diff changeset
1023
a68f2dadafee Tiff.m: added all remaining tests for implemented features.
magedrifaat <magedrifaat@gmail.com>
parents: 31142
diff changeset
1024 // According to the format specification, this field should
a68f2dadafee Tiff.m: added all remaining tests for implemented features.
magedrifaat <magedrifaat@gmail.com>
parents: 31142
diff changeset
1025 // be 8 or 16 only.
a68f2dadafee Tiff.m: added all remaining tests for implemented features.
magedrifaat <magedrifaat@gmail.com>
parents: 31142
diff changeset
1026 if (bits_per_sample > 16)
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1027 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
1028
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1029 uint32_t count = 1 << bits_per_sample;
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1030 uint16_t *red, *green, *blue;
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1031 validate_tiff_get_field (TIFFGetField (tif, TIFFTAG_COLORMAP,
31114
9dead1249449 Tiff getTag: fixed matrix shape for ColorMap and TransferFunction
magedrifaat <magedrifaat@gmail.com>
parents: 31113
diff changeset
1032 &red, &green, &blue));
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1033
31130
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1034 // Retrieving the data of the three channels and concatenating
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1035 // them together
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1036 OCTAVE_LOCAL_BUFFER (NDArray, array_list, 3);
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1037 dim_vector col_dims(count, 1);
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1038 array_list[0] = NDArray (interpret_tag_data (red,
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1039 count,
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1040 TIFFFieldDataType(fip))
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1041 .uint16_array_value ()
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1042 .reshape (col_dims));
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1043 array_list[1] = NDArray (interpret_tag_data (green,
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1044 count,
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1045 TIFFFieldDataType(fip))
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1046 .uint16_array_value ()
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1047 .reshape (col_dims));
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1048 array_list[2] = NDArray (interpret_tag_data (blue,
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1049 count,
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1050 TIFFFieldDataType(fip))
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1051 .uint16_array_value ()
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1052 .reshape (col_dims));
31114
9dead1249449 Tiff getTag: fixed matrix shape for ColorMap and TransferFunction
magedrifaat <magedrifaat@gmail.com>
parents: 31113
diff changeset
1053
31130
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1054 NDArray mat_out = NDArray::cat(1, 3, array_list);
31121
341796f9efb6 Tiff getTag: converted colormap tag data to the correct type and range
magedrifaat <magedrifaat@gmail.com>
parents: 31120
diff changeset
1055 // Normalize the range to be between 0 and 1
341796f9efb6 Tiff getTag: converted colormap tag data to the correct type and range
magedrifaat <magedrifaat@gmail.com>
parents: 31120
diff changeset
1056 mat_out /= UINT16_MAX;
31114
9dead1249449 Tiff getTag: fixed matrix shape for ColorMap and TransferFunction
magedrifaat <magedrifaat@gmail.com>
parents: 31113
diff changeset
1057
31117
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1058 tag_data_ov = octave_value (mat_out);
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1059 break;
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1060 }
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1061 case TIFFTAG_TRANSFERFUNCTION:
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1062 {
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1063 uint16_t samples_per_pixel;
31127
0d9633ee715e Tiff: fixed a bug where the default value of some tags was ignored
magedrifaat <magedrifaat@gmail.com>
parents: 31126
diff changeset
1064 if (! TIFFGetFieldDefaulted (tif, TIFFTAG_SAMPLESPERPIXEL,
0d9633ee715e Tiff: fixed a bug where the default value of some tags was ignored
magedrifaat <magedrifaat@gmail.com>
parents: 31126
diff changeset
1065 &samples_per_pixel))
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1066 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
1067
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1068 uint16_t bits_per_sample;
31127
0d9633ee715e Tiff: fixed a bug where the default value of some tags was ignored
magedrifaat <magedrifaat@gmail.com>
parents: 31126
diff changeset
1069 if (! TIFFGetFieldDefaulted (tif, TIFFTAG_BITSPERSAMPLE,
0d9633ee715e Tiff: fixed a bug where the default value of some tags was ignored
magedrifaat <magedrifaat@gmail.com>
parents: 31126
diff changeset
1070 &bits_per_sample))
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1071 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
1072
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1073 uint32_t count = 1 << bits_per_sample;
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1074 uint16_t *ch1, *ch2, *ch3;
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1075 if (samples_per_pixel == 1)
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1076 {
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1077 validate_tiff_get_field (TIFFGetField (tif, TIFFTAG_COLORMAP, &ch1));
31117
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1078 tag_data_ov = interpret_tag_data (ch1, count,
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1079 TIFFFieldDataType (fip));
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1080 }
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1081 else
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1082 {
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1083 validate_tiff_get_field (TIFFGetField (tif, TIFFTAG_COLORMAP,
31114
9dead1249449 Tiff getTag: fixed matrix shape for ColorMap and TransferFunction
magedrifaat <magedrifaat@gmail.com>
parents: 31113
diff changeset
1084 &ch1, &ch2, &ch3));
9dead1249449 Tiff getTag: fixed matrix shape for ColorMap and TransferFunction
magedrifaat <magedrifaat@gmail.com>
parents: 31113
diff changeset
1085
31130
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1086 OCTAVE_LOCAL_BUFFER (uint16NDArray, array_list, 3);
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1087 dim_vector col_dims(count, 1);
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1088 array_list[0] = interpret_tag_data (ch1,
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1089 count,
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1090 TIFFFieldDataType (fip))
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1091 .uint16_array_value ()
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1092 .reshape (col_dims);
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1093 array_list[1] = interpret_tag_data (ch2,
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1094 count,
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1095 TIFFFieldDataType (fip))
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1096 .uint16_array_value ()
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1097 .reshape (col_dims);
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1098 array_list[2] = interpret_tag_data (ch3,
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1099 count,
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1100 TIFFFieldDataType (fip))
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1101 .uint16_array_value ()
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1102 .reshape (col_dims);
31114
9dead1249449 Tiff getTag: fixed matrix shape for ColorMap and TransferFunction
magedrifaat <magedrifaat@gmail.com>
parents: 31113
diff changeset
1103
31130
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1104 tag_data_ov = octave_value (uint16NDArray::cat (1, 3, array_list));
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1105 }
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1106 break;
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1107 }
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1108 case TIFFTAG_PAGENUMBER:
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1109 case TIFFTAG_HALFTONEHINTS:
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1110 case TIFFTAG_DOTRANGE:
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1111 case TIFFTAG_YCBCRSUBSAMPLING:
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1112 {
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1113 uint16_t tag_part1, tag_part2;
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1114 validate_tiff_get_field (TIFFGetField (tif, tag_id,
31114
9dead1249449 Tiff getTag: fixed matrix shape for ColorMap and TransferFunction
magedrifaat <magedrifaat@gmail.com>
parents: 31113
diff changeset
1115 &tag_part1, &tag_part2));
31117
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1116
31130
8475bdb70457 Tiff getTag: changed ColorMap to use Array::cat instead of memcpy
magedrifaat <magedrifaat@gmail.com>
parents: 31129
diff changeset
1117 NDArray mat_out (dim_vector (1, 2));
31117
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1118 mat_out(0)
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1119 = interpret_tag_data (&tag_part1, 1,
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1120 TIFFFieldDataType (fip)).double_value ();
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1121 mat_out(1)
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1122 = interpret_tag_data (&tag_part2, 1,
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1123 TIFFFieldDataType (fip)).double_value ();
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1124
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1125 tag_data_ov = octave_value (mat_out);
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1126 break;
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1127 }
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1128 case TIFFTAG_SUBIFD:
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1129 {
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1130 uint16_t count;
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1131 uint64_t *offsets;
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1132 validate_tiff_get_field (TIFFGetField (tif, tag_id, &count, &offsets));
31117
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1133 tag_data_ov = interpret_tag_data (offsets, count,
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1134 TIFFFieldDataType (fip));
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1135 break;
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1136 }
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1137 case TIFFTAG_EXTRASAMPLES:
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1138 {
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1139 uint16_t count;
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1140 uint16_t *types;
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1141 validate_tiff_get_field (TIFFGetField (tif, tag_id, &count, &types));
31117
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1142 tag_data_ov = interpret_tag_data (types, count,
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1143 TIFFFieldDataType (fip));
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1144 break;
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1145 }
31103
76b21bed2920 Undocumented and unimplemented tags are explicilty mentioned and handled
magedrifaat <magedrifaat@gmail.com>
parents: 31102
diff changeset
1146 // 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
1147 // will be implemented and tested later.
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1148 case TIFFTAG_XMLPACKET:
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1149 case TIFFTAG_RICHTIFFIPTC:
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1150 case TIFFTAG_PHOTOSHOP:
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1151 case TIFFTAG_ICCPROFILE:
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1152 {
31103
76b21bed2920 Undocumented and unimplemented tags are explicilty mentioned and handled
magedrifaat <magedrifaat@gmail.com>
parents: 31102
diff changeset
1153 error ("Complex Tags not implemented");
76b21bed2920 Undocumented and unimplemented tags are explicilty mentioned and handled
magedrifaat <magedrifaat@gmail.com>
parents: 31102
diff changeset
1154 break;
76b21bed2920 Undocumented and unimplemented tags are explicilty mentioned and handled
magedrifaat <magedrifaat@gmail.com>
parents: 31102
diff changeset
1155 }
31106
f5a88c0a61ab Support for GrayResponseCurve and GrayResponseUnit tags
magedrifaat <magedrifaat@gmail.com>
parents: 31105
diff changeset
1156 // 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
1157 // 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
1158 case TIFFTAG_ZIPQUALITY:
76b21bed2920 Undocumented and unimplemented tags are explicilty mentioned and handled
magedrifaat <magedrifaat@gmail.com>
parents: 31102
diff changeset
1159 case TIFFTAG_SGILOGDATAFMT:
31106
f5a88c0a61ab Support for GrayResponseCurve and GrayResponseUnit tags
magedrifaat <magedrifaat@gmail.com>
parents: 31105
diff changeset
1160 case TIFFTAG_GRAYRESPONSEUNIT:
31103
76b21bed2920 Undocumented and unimplemented tags are explicilty mentioned and handled
magedrifaat <magedrifaat@gmail.com>
parents: 31102
diff changeset
1161 {
31117
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1162 tag_data_ov = get_scalar_field_data (tif, fip);
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1163 break;
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1164 }
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1165 default:
31117
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1166 tag_data_ov = get_scalar_field_data (tif, fip);
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1167 }
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1168
31117
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1169 return tag_data_ov;
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1170 }
31124
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1171
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1172 void
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1173 set_field_data (TIFF *tif, const TIFFField *fip, octave_value tag_ov)
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1174 {
31139
3431a15b2c75 Tiff.m: refactored tests to use functions to reduce code repetition.
magedrifaat <magedrifaat@gmail.com>
parents: 31138
diff changeset
1175 // TODO(maged): prevent calling here for read-only images
3431a15b2c75 Tiff.m: refactored tests to use functions to reduce code repetition.
magedrifaat <magedrifaat@gmail.com>
parents: 31138
diff changeset
1176
31124
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1177 // TODO(maged): complete the implementation of this function
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1178 uint32_t tag_id = TIFFFieldTag (fip);
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1179 uint32_t tag_data = tag_ov.double_value ();
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1180
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1181 if (! TIFFSetField(tif, tag_id, tag_data))
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1182 error ("Failed to set tag value");
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1183 }
31153
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1184
31126
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1185 template <typename T>
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1186 void
31133
e9925d528428 Tiff writeEncodedStrip: used octave_value functions instead of type_name
magedrifaat <magedrifaat@gmail.com>
parents: 31131
diff changeset
1187 write_strip (TIFF *tif, uint32_t strip_no, T strip_data,
31126
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1188 tiff_image_data *image_data)
31133
e9925d528428 Tiff writeEncodedStrip: used octave_value functions instead of type_name
magedrifaat <magedrifaat@gmail.com>
parents: 31131
diff changeset
1189 {
31126
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1190 uint32_t rows_in_strip;
31127
0d9633ee715e Tiff: fixed a bug where the default value of some tags was ignored
magedrifaat <magedrifaat@gmail.com>
parents: 31126
diff changeset
1191 if (! TIFFGetFieldDefaulted (tif, TIFFTAG_ROWSPERSTRIP, &rows_in_strip))
31126
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1192 error ("Failed to obtain the RowsPerStrip tag");
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1193
31127
0d9633ee715e Tiff: fixed a bug where the default value of some tags was ignored
magedrifaat <magedrifaat@gmail.com>
parents: 31126
diff changeset
1194 // The tag has a default value of UINT32_MAX which means the entire
0d9633ee715e Tiff: fixed a bug where the default value of some tags was ignored
magedrifaat <magedrifaat@gmail.com>
parents: 31126
diff changeset
1195 // image, but we need to cap it to the height for later calculations
0d9633ee715e Tiff: fixed a bug where the default value of some tags was ignored
magedrifaat <magedrifaat@gmail.com>
parents: 31126
diff changeset
1196 if (rows_in_strip > image_data->height)
0d9633ee715e Tiff: fixed a bug where the default value of some tags was ignored
magedrifaat <magedrifaat@gmail.com>
parents: 31126
diff changeset
1197 rows_in_strip = image_data->height;
0d9633ee715e Tiff: fixed a bug where the default value of some tags was ignored
magedrifaat <magedrifaat@gmail.com>
parents: 31126
diff changeset
1198
31153
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1199 // LibTIFF uses zero-based indexing as opposed to Octave's 1-based
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1200 strip_no--;
31126
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1201
31153
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1202 uint32_t strip_count = TIFFNumberOfStrips (tif);
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1203 rows_in_strip = get_rows_in_strip (strip_no, strip_count,
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1204 rows_in_strip, image_data);
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1205
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1206 dim_vector strip_dimensions;
31126
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1207 if (image_data->planar_configuration == PLANARCONFIG_CONTIG)
31153
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1208 strip_dimensions = dim_vector (rows_in_strip, image_data->width,
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1209 image_data->samples_per_pixel);
31126
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1210 else if (image_data->planar_configuration == PLANARCONFIG_SEPARATE)
31153
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1211 strip_dimensions = dim_vector (rows_in_strip, image_data->width, 1);
31126
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1212 else
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1213 error ("Planar configuration not supported");
31145
2e11f9cb30b8 Tiff writeEncodedStrip: added warning for input data larger than the size of the strip.
magedrifaat <magedrifaat@gmail.com>
parents: 31144
diff changeset
1214
2e11f9cb30b8 Tiff writeEncodedStrip: added warning for input data larger than the size of the strip.
magedrifaat <magedrifaat@gmail.com>
parents: 31144
diff changeset
1215 if (strip_data.dim1 () > rows_in_strip)
31146
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1216 warning ("The strip is composed of %u rows but the input has %ld rows.",
31145
2e11f9cb30b8 Tiff writeEncodedStrip: added warning for input data larger than the size of the strip.
magedrifaat <magedrifaat@gmail.com>
parents: 31144
diff changeset
1217 rows_in_strip,
2e11f9cb30b8 Tiff writeEncodedStrip: added warning for input data larger than the size of the strip.
magedrifaat <magedrifaat@gmail.com>
parents: 31144
diff changeset
1218 strip_data.dim1 ());
31137
233130c0b1f6 Tiff writeEncodedStrip: changed strip dimension check behavior to mimic matlab
magedrifaat <magedrifaat@gmail.com>
parents: 31136
diff changeset
1219
31145
2e11f9cb30b8 Tiff writeEncodedStrip: added warning for input data larger than the size of the strip.
magedrifaat <magedrifaat@gmail.com>
parents: 31144
diff changeset
1220 if (strip_data.dim2 () > image_data->width)
31146
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1221 warning ("The image width is %u but the input has %ld columns.",
31145
2e11f9cb30b8 Tiff writeEncodedStrip: added warning for input data larger than the size of the strip.
magedrifaat <magedrifaat@gmail.com>
parents: 31144
diff changeset
1222 image_data->width,
2e11f9cb30b8 Tiff writeEncodedStrip: added warning for input data larger than the size of the strip.
magedrifaat <magedrifaat@gmail.com>
parents: 31144
diff changeset
1223 strip_data.dim2 ());
2e11f9cb30b8 Tiff writeEncodedStrip: added warning for input data larger than the size of the strip.
magedrifaat <magedrifaat@gmail.com>
parents: 31144
diff changeset
1224
2e11f9cb30b8 Tiff writeEncodedStrip: added warning for input data larger than the size of the strip.
magedrifaat <magedrifaat@gmail.com>
parents: 31144
diff changeset
1225 if (strip_data.ndims () > 2)
2e11f9cb30b8 Tiff writeEncodedStrip: added warning for input data larger than the size of the strip.
magedrifaat <magedrifaat@gmail.com>
parents: 31144
diff changeset
1226 {
2e11f9cb30b8 Tiff writeEncodedStrip: added warning for input data larger than the size of the strip.
magedrifaat <magedrifaat@gmail.com>
parents: 31144
diff changeset
1227 if (image_data->planar_configuration == PLANARCONFIG_CONTIG
2e11f9cb30b8 Tiff writeEncodedStrip: added warning for input data larger than the size of the strip.
magedrifaat <magedrifaat@gmail.com>
parents: 31144
diff changeset
1228 && strip_data.dim3 () > image_data->samples_per_pixel)
31146
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1229 warning ("The strip is composed of %u channels but the input has %ld channels.",
31145
2e11f9cb30b8 Tiff writeEncodedStrip: added warning for input data larger than the size of the strip.
magedrifaat <magedrifaat@gmail.com>
parents: 31144
diff changeset
1230 image_data->samples_per_pixel,
2e11f9cb30b8 Tiff writeEncodedStrip: added warning for input data larger than the size of the strip.
magedrifaat <magedrifaat@gmail.com>
parents: 31144
diff changeset
1231 strip_data.dim3 ());
2e11f9cb30b8 Tiff writeEncodedStrip: added warning for input data larger than the size of the strip.
magedrifaat <magedrifaat@gmail.com>
parents: 31144
diff changeset
1232 else if (image_data->planar_configuration == PLANARCONFIG_SEPARATE
2e11f9cb30b8 Tiff writeEncodedStrip: added warning for input data larger than the size of the strip.
magedrifaat <magedrifaat@gmail.com>
parents: 31144
diff changeset
1233 && strip_data.dim3 () > 1)
31146
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1234 warning ("The strip is composed of %u channel but the input has %ld channels.",
31145
2e11f9cb30b8 Tiff writeEncodedStrip: added warning for input data larger than the size of the strip.
magedrifaat <magedrifaat@gmail.com>
parents: 31144
diff changeset
1235 1, strip_data.dim3 ());
2e11f9cb30b8 Tiff writeEncodedStrip: added warning for input data larger than the size of the strip.
magedrifaat <magedrifaat@gmail.com>
parents: 31144
diff changeset
1236 }
2e11f9cb30b8 Tiff writeEncodedStrip: added warning for input data larger than the size of the strip.
magedrifaat <magedrifaat@gmail.com>
parents: 31144
diff changeset
1237
31137
233130c0b1f6 Tiff writeEncodedStrip: changed strip dimension check behavior to mimic matlab
magedrifaat <magedrifaat@gmail.com>
parents: 31136
diff changeset
1238 strip_data.resize (strip_dimensions);
31126
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1239
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1240 // Permute the dimesions of the strip to match the expected memory
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1241 // arrangement of LibTIFF (channel x width x height)
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1242 Array<octave_idx_type> perm (dim_vector (3, 1));
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1243 perm(0) = 2;
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1244 perm(1) = 1;
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1245 perm(2) = 0;
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1246 strip_data = strip_data.permute (perm);
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1247
31144
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1248 void *data_vec = strip_data.fortran_vec ();
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1249 if (image_data->bits_per_sample == 8
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1250 || image_data->bits_per_sample == 16
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1251 || image_data->bits_per_sample == 32
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1252 || image_data->bits_per_sample == 64)
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1253 {
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1254 // Can't rely on LibTIFF's TIFFStripSize because boundary strips
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1255 // can be smaller in size
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1256 tsize_t strip_size = strip_data.numel ()
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1257 * image_data->bits_per_sample / 8;
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1258 if (TIFFWriteEncodedStrip (tif, strip_no, data_vec, strip_size) == -1)
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1259 error ("Failed to write strip data to image");
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1260
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1261 }
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1262 else if (image_data->bits_per_sample == 1)
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1263 {
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1264 if (image_data->samples_per_pixel != 1)
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1265 error ("Bi-Level images must have one channel only");
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1266
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1267 // Create a buffer to hold the packed strip data
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1268 // Unique pointers are faster than vectors for constant size buffers
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1269 std::unique_ptr<uint8_t []> strip_ptr
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1270 = std::make_unique<uint8_t []> (TIFFStripSize (tif));
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1271 uint8_t *strip_buf = strip_ptr.get ();
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1272 uint8_t *data_u8 = reinterpret_cast<uint8_t *> (data_vec);
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1273 // According to the format specification, the row should be byte
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1274 // aligned so the number of bytes is rounded up to the nearest byte
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1275 uint32_t padded_width = (image_data->width + 7) / 8;
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1276 // Packing the pixel data into bits
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1277 for (uint32_t row = 0; row < rows_in_strip; row++)
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1278 {
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1279 for (uint32_t col = 0; col < image_data->width; col++)
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1280 {
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1281 uint8_t shift = 7 - col % 8;
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1282 strip_buf[row * padded_width + col / 8] |= data_u8[col] << shift;
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1283 }
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1284 data_u8 += image_data->width;
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1285 }
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1286 tsize_t strip_size = padded_width * rows_in_strip;
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1287 if (TIFFWriteEncodedStrip (tif, strip_no, strip_buf, strip_size) == -1)
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1288 error ("Failed to write strip data to image");
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1289 }
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1290 else
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1291 {
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1292 error ("Unsupported bit depth");
8ba9f2326ee9 Tiff writeEncodedStrip: added support for BiLevel images
magedrifaat <magedrifaat@gmail.com>
parents: 31143
diff changeset
1293 }
31126
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1294 }
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1295
31146
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1296 template <typename T>
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1297 void
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1298 write_tile (TIFF *tif, uint32_t tile_no, T tile_data,
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1299 tiff_image_data *image_data)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1300 {
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1301 uint32_t tile_width, tile_height;
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1302 if (! TIFFGetField (tif, TIFFTAG_TILEWIDTH, &tile_width))
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1303 error ("Failed to get the tile width");
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1304 if (! TIFFGetField (tif, TIFFTAG_TILELENGTH, &tile_height))
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1305 error ("Failed to get the tile length");
31152
2244617f4da5 Tiff computeStrip: fixed inconsistency in checking plane argument.
magedrifaat <magedrifaat@gmail.com>
parents: 31151
diff changeset
1306
2244617f4da5 Tiff computeStrip: fixed inconsistency in checking plane argument.
magedrifaat <magedrifaat@gmail.com>
parents: 31151
diff changeset
1307 if (tile_height == 0 || tile_height % 16 != 0
2244617f4da5 Tiff computeStrip: fixed inconsistency in checking plane argument.
magedrifaat <magedrifaat@gmail.com>
parents: 31151
diff changeset
1308 || tile_width == 0 || tile_width % 16 != 0)
2244617f4da5 Tiff computeStrip: fixed inconsistency in checking plane argument.
magedrifaat <magedrifaat@gmail.com>
parents: 31151
diff changeset
1309 error ("Tile dimesion tags are invalid");
31146
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1310
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1311 if (tile_no < 1 || tile_no > TIFFNumberOfTiles (tif))
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1312 error ("Tile number out of bounds");
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1313
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1314 if (tile_data.dim1 () > tile_height)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1315 warning ("The tile is composed of %u rows but input has %ld rows",
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1316 tile_height, tile_data.dim1 ());
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1317 if (tile_data.dim2 () > tile_width)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1318 warning ("The tile is composed of %u columns but input has %ld columns",
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1319 tile_width, tile_data.dim2 ());
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1320 if (tile_data.ndims () > 2)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1321 {
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1322 if (image_data->planar_configuration == PLANARCONFIG_CONTIG
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1323 && tile_data.dim3 () > image_data->samples_per_pixel)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1324 warning ("The tile is composed of %u channels but input has %ld channels",
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1325 image_data->samples_per_pixel, tile_data.dim3 ());
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1326 else if (image_data->planar_configuration == PLANARCONFIG_SEPARATE
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1327 && tile_data.dim3 () > 1)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1328 warning ("The tile is composed of %u channels but input has %ld channels",
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1329 1, tile_data.dim3 ());
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1330 }
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1331
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1332 dim_vector tile_dimensions;
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1333 if (image_data->planar_configuration == PLANARCONFIG_CONTIG)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1334 tile_dimensions = dim_vector (tile_height, tile_width,
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1335 image_data->samples_per_pixel);
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1336 else if (image_data->planar_configuration == PLANARCONFIG_SEPARATE)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1337 tile_dimensions = dim_vector (tile_height, tile_width, 1);
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1338 else
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1339 error ("Planar configuration not supported");
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1340
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1341 tile_data.resize (tile_dimensions);
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1342 Array<octave_idx_type> perm (dim_vector (3, 1));
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1343 perm(0) = 2;
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1344 perm(1) = 1;
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1345 perm(2) = 0;
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1346 tile_data = tile_data.permute (perm);
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1347
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1348 // Octave indexing is 1-based while LibTIFF is zero-based
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1349 tile_no--;
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1350 void *data_vec = tile_data.fortran_vec ();
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1351 if (image_data->bits_per_sample == 8
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1352 || image_data->bits_per_sample == 16
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1353 || image_data->bits_per_sample == 32
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1354 || image_data->bits_per_sample == 64)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1355 {
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1356 if (TIFFWriteEncodedTile (tif, tile_no, data_vec,
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1357 TIFFTileSize (tif)) == -1)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1358 error ("Failed to write tile data to image");
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1359
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1360 }
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1361 else if (image_data->bits_per_sample == 1)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1362 {
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1363 if (image_data->samples_per_pixel != 1)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1364 error ("Bi-Level images must have one channel only");
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1365
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1366 // Create a buffer to hold the packed tile data
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1367 // Unique pointers are faster than vectors for constant size buffers
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1368 std::unique_ptr<uint8_t []> tile_ptr
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1369 = std::make_unique<uint8_t []> (TIFFTileSize (tif));
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1370 uint8_t *tile_buf = tile_ptr.get ();
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1371 uint8_t *data_u8 = reinterpret_cast<uint8_t *> (data_vec);
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1372 // Packing the pixel data into bits
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1373 for (uint32_t row = 0; row < tile_height; row++)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1374 {
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1375 for (uint32_t col = 0; col < tile_width; col++)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1376 {
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1377 uint8_t shift = 7 - col % 8;
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1378 tile_buf[row * tile_width/8 + col/8] |= data_u8[col] << shift;
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1379 }
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1380 data_u8 += tile_width;
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1381 }
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1382 if (TIFFWriteEncodedTile (tif, tile_no, tile_buf,
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1383 TIFFTileSize (tif)) == -1)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1384 error ("Failed to write tile data to image");
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1385 }
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1386 else
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1387 {
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1388 error ("Unsupported bit depth");
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1389 }
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1390 }
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1391
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1392 template <typename T>
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1393 void
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1394 write_strip_or_tile (TIFF *tif, uint32_t strip_tile_no, T strip_data,
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1395 tiff_image_data *image_data)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1396 {
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1397 if (image_data->is_tiled)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1398 write_tile<T> (tif, strip_tile_no, strip_data, image_data);
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1399 else
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1400 write_strip<T> (tif, strip_tile_no, strip_data, image_data);
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1401 }
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1402
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1403 void
31158
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
1404 handle_write_strip_or_tile (TIFF *tif, uint32_t strip_tile_no,
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
1405 octave_value data_ov,
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
1406 tiff_image_data *image_data)
31146
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1407 {
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1408
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1409 // SampleFormat tag is not a required field and has a default value of 1
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1410 // So we need to use TIFFGetFieldDefaulted in case it is not present in
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1411 // the file
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1412 uint16_t sample_format;
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1413 if (! TIFFGetFieldDefaulted(tif, TIFFTAG_SAMPLEFORMAT, &sample_format))
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1414 error ("Failed to obtain a value for sample format");
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1415
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1416 // TODO(maged): add support for signed integer images
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1417 if (sample_format == 3)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1418 {
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1419 if (image_data->bits_per_sample != 32
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1420 && image_data->bits_per_sample != 64)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1421 error ("Floating point images are only supported for bit depths of 32 and 64");
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1422 }
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1423
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1424 // The standard specifies that a SampleFormat of 4 should be treated
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1425 // the same as 1 (unsigned integer)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1426 else if (sample_format != 1 && sample_format != 4)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1427 error ("Unsupported sample format");
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1428
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1429 switch (image_data->bits_per_sample)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1430 {
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1431 case 1:
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1432 // We need to check for both scalar and matrix types to handle single
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1433 // element strip
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1434 if (data_ov.is_bool_scalar () || data_ov.is_bool_matrix ())
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1435 write_strip_or_tile<boolNDArray> (tif, strip_tile_no,
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1436 data_ov.bool_array_value (),
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1437 image_data);
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1438 else
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1439 error ("Expected logical matrix for BiLevel image");
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1440 break;
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1441 case 8:
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1442 if (data_ov.is_uint8_type ())
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1443 write_strip_or_tile<uint8NDArray> (tif, strip_tile_no,
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1444 data_ov.uint8_array_value (),
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1445 image_data);
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1446 else
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1447 error ("Only uint8 data is allowed for uint images with bit depth of 8");
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1448 break;
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1449 case 16:
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1450 if (data_ov.is_uint16_type ())
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1451 write_strip_or_tile<uint16NDArray> (tif, strip_tile_no,
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1452 data_ov.uint16_array_value (),
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1453 image_data);
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1454 else
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1455 error ("Only uint16 data is allowed for uint images with bit depth of 16");
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1456 break;
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1457 case 32:
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1458 if (sample_format == 3)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1459 if (data_ov.is_single_type () || data_ov.is_double_type ())
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1460 write_strip_or_tile<FloatNDArray> (tif, strip_tile_no,
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1461 data_ov.float_array_value (),
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1462 image_data);
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1463 else
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1464 error ("Only single and double data are allowed for floating-point images");
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1465 else
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1466 if (data_ov.is_uint32_type ())
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1467 write_strip_or_tile<uint32NDArray> (tif, strip_tile_no,
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1468 data_ov.uint32_array_value (),
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1469 image_data);
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1470 else
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1471 error ("Only uint32 data is allowed for uint images with bit depth of 32");
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1472 break;
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1473 case 64:
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1474 if (sample_format == 3)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1475 if (data_ov.is_single_type () || data_ov.is_double_type ())
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1476 write_strip_or_tile<NDArray> (tif, strip_tile_no,
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1477 data_ov.array_value (),
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1478 image_data);
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1479 else
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1480 error ("Only single and double data are allowed for floating-point images");
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1481 else
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1482 if (data_ov.is_uint64_type ())
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1483 write_strip_or_tile<uint64NDArray> (tif, strip_tile_no,
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1484 data_ov.uint64_array_value (),
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1485 image_data);
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1486 else
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1487 error ("Only uint64 data is allowed for uint images with bit depth of 64");
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1488 break;
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1489 default:
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1490 error ("Unsupported bit depth");
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1491 }
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1492 }
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
1493
31153
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1494 template <typename T>
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1495 void
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1496 write_stripped_image (TIFF *tif, T pixel_data, tiff_image_data *image_data)
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1497 {
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1498 // TODO(maged): remove this? ASSUMES pixel data dimensions are already validated
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1499
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1500 typedef typename T::element_type P;
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1501
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1502 // Permute pixel data to be aligned in memory to the way LibTIFF
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1503 // expects the data to be (i.e. channel x width x height for chunky
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1504 // and width x height x channel for separate planes)
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1505 Array<octave_idx_type> perm (dim_vector (3, 1));
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1506 if (image_data->planar_configuration == PLANARCONFIG_SEPARATE)
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1507 {
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1508 perm(0) = 1;
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1509 perm(1) = 0;
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1510 perm(2) = 2;
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1511 }
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1512 else
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1513 {
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1514 perm(0) = 2;
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1515 perm(1) = 1;
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1516 perm(2) = 0;
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1517 }
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1518 pixel_data = pixel_data.permute (perm);
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1519
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1520 uint32_t row_per_strip;
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1521 if (! TIFFGetFieldDefaulted (tif, TIFFTAG_ROWSPERSTRIP, &row_per_strip))
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1522 error ("Failed to obtain the RowPerStrip tag");
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1523
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1524 // The default value is INT_MAX so we need to cap it to the image height
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1525 if (row_per_strip > image_data->height)
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1526 row_per_strip = image_data->height;
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1527
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1528 uint8_t *pixel_fvec = reinterpret_cast<uint8_t *> (pixel_data.fortran_vec ());
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1529 uint32_t strip_count = TIFFNumberOfStrips (tif);
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1530 tsize_t strip_size;
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1531 uint32_t rows_in_strip;
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1532 for (uint32_t strip = 0; strip < strip_count; strip++)
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1533 {
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1534 rows_in_strip = get_rows_in_strip (strip, strip_count,
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1535 row_per_strip, image_data);
31154
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
1536 if (image_data->bits_per_sample == 8
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
1537 || image_data->bits_per_sample == 16
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
1538 || image_data->bits_per_sample == 32
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
1539 || image_data->bits_per_sample == 64)
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
1540 {
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
1541 strip_size = rows_in_strip * image_data->width * sizeof (P);
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
1542 if (image_data->planar_configuration == PLANARCONFIG_CONTIG)
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
1543 strip_size *= image_data->samples_per_pixel;
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
1544 if (! TIFFWriteEncodedStrip (tif, strip, pixel_fvec, strip_size))
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
1545 error ("Failed to rite strip data");
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
1546 pixel_fvec += strip_size;
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
1547 }
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
1548 else if (image_data->bits_per_sample == 1)
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
1549 {
31156
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
1550 if (image_data->samples_per_pixel != 1)
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
1551 error ("Bi-Level images must have one channel only");
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
1552
31154
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
1553 // Create a buffer to hold the packed strip data
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
1554 // Unique pointers are faster than vectors for constant size buffers
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
1555 std::unique_ptr<uint8_t []> strip_ptr
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
1556 = std::make_unique<uint8_t []> (TIFFStripSize (tif));
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
1557 uint8_t *strip_buf = strip_ptr.get ();
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
1558 // According to the format specification, the row should be byte
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
1559 // aligned so the number of bytes is rounded up to the nearest byte
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
1560 uint32_t padded_width = (image_data->width + 7) / 8;
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
1561 // Packing the pixel data into bits
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
1562 for (uint32_t row = 0; row < rows_in_strip; row++)
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
1563 {
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
1564 for (uint32_t col = 0; col < image_data->width; col++)
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
1565 {
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
1566 uint8_t shift = 7 - col % 8;
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
1567 strip_buf[row * padded_width + col / 8]
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
1568 |= pixel_fvec[col] << shift;
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
1569 }
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
1570 pixel_fvec += image_data->width;
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
1571 }
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
1572 strip_size = padded_width * rows_in_strip;
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
1573 if (TIFFWriteEncodedStrip (tif, strip, strip_buf, strip_size) == -1)
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
1574 error ("Failed to write strip data to image");
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
1575 }
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
1576 else
828b7cc9aa36 Tiff write: added support for BiLevel stripped images and added unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31153
diff changeset
1577 error ("Unsupported bit depth");
31153
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1578 }
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1579 }
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1580
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1581 template <typename T>
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1582 void
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1583 write_tiled_image (TIFF *tif, T pixel_data, tiff_image_data *image_data)
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1584 {
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1585 // TODO(maged): remove this? ASSUMES pixel data dimensions are already validated
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1586
31155
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1587 uint32_t tile_width, tile_height;
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1588 if (! TIFFGetField (tif, TIFFTAG_TILEWIDTH, &tile_width))
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1589 error ("Failed to get the tile width");
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1590 if (! TIFFGetField (tif, TIFFTAG_TILELENGTH, &tile_height))
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1591 error ("Failed to get the tile length");
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1592
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1593 if (tile_height == 0 || tile_height % 16 != 0
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1594 || tile_width == 0 || tile_width % 16 != 0)
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1595 error ("Tile dimesion tags are invalid");
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1596
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1597 uint32_t tiles_across = (image_data->width + tile_width - 1)
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1598 / tile_width;
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1599 uint32_t tiles_down = (image_data->height + tile_height - 1)
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1600 / tile_height;
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1601
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1602 // Resize the image data to add tile padding
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1603 dim_vector padded_dims (tiles_down * tile_height,
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1604 tiles_across * tile_width,
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1605 image_data->samples_per_pixel);
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1606 pixel_data.resize (padded_dims);
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1607
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1608 // Reshape the image to separate tiles into their own dimension
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1609 // so we can permute them to the right order
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1610 dim_vector tiled_dims (tile_height, tiles_down, tile_width, tiles_across,
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1611 image_data->samples_per_pixel);
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1612 pixel_data = pixel_data.reshape (tiled_dims);
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1613
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1614 // Permute the dimesnions to get the memory alignment to match LibTIFF
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1615 Array<octave_idx_type> perm (dim_vector (5, 1));
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1616 if (image_data->planar_configuration == PLANARCONFIG_SEPARATE)
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1617 {
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1618 // For separate planes, the data coming from libtiff will have all
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1619 // tiles of the first sample then all tiles of the second sample
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1620 // and so on. Tiles of each sample will be ordered from left to right
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1621 // and from top to bottom. And data inside each tile is organised as
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1622 // rows and each row contains columns.
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1623 // So the order for LibTIFF is:
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1624 // samples x tiles_down x tiles_across x tile_height x tile_width
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1625 // But memory orientation of Octave arrays is reversed so we set it to
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1626 // tile_width x tile_height x tiles_across x tiles_down x samples
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1627 perm(0) = 2;
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1628 perm(1) = 0;
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1629 perm(2) = 3;
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1630 perm(3) = 1;
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1631 perm(4) = 4;
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1632 }
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1633 else
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1634 {
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1635 // For chunky planes, the data coming from libtiff will be ordered
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1636 // from left to right and from top to bottom. And data inside each
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1637 // tile is organised as rows and each row contains columns and each
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1638 // column contains samples.
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1639 // So the order for LibTIFF is:
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1640 // tiles_down x tiles_across x tile_height x tile_width x samples
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1641 // But memory orientation of Octave arrays is reversed so we set it to
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1642 // samples x tile_width x tile_height x tiles_across x tiles_down
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1643 perm(0) = 4;
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1644 perm(1) = 2;
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1645 perm(2) = 0;
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1646 perm(3) = 3;
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1647 perm(4) = 1;
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1648 }
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1649 pixel_data = pixel_data.permute (perm);
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1650
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1651 uint8_t *pixel_fvec
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1652 = reinterpret_cast<uint8_t *> (pixel_data.fortran_vec ());
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1653 uint32_t tile_count = TIFFNumberOfTiles (tif);
31156
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
1654 tsize_t tile_size = TIFFTileSize (tif);
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
1655
31155
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1656 for (uint32_t tile = 0; tile <tile_count; tile++)
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1657 {
31156
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
1658 if (image_data->bits_per_sample == 8
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
1659 || image_data->bits_per_sample == 16
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
1660 || image_data->bits_per_sample == 32
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
1661 || image_data->bits_per_sample == 64)
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
1662 {
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
1663 if (! TIFFWriteEncodedTile (tif, tile, pixel_fvec, tile_size))
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
1664 error ("Failed to write tile data");
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
1665 pixel_fvec += tile_size;
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
1666 }
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
1667 else if (image_data->bits_per_sample == 1)
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
1668 {
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
1669 if (image_data->samples_per_pixel != 1)
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
1670 error ("Bi-Level images must have one channel only");
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
1671
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
1672 // Create a buffer to hold the packed tile data
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
1673 // Unique pointers are faster than vectors for
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
1674 // constant size buffers
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
1675 std::unique_ptr<uint8_t []> tile_ptr
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
1676 = std::make_unique<uint8_t []> (tile_size);
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
1677 uint8_t *tile_buf = tile_ptr.get ();
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
1678 // Packing the pixel data into bits
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
1679 for (uint32_t row = 0; row < tile_height; row++)
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
1680 {
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
1681 for (uint32_t col = 0; col < tile_width; col++)
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
1682 {
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
1683 uint8_t shift = 7 - col % 8;
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
1684 tile_buf[row * tile_width / 8 + col / 8]
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
1685 |= pixel_fvec[col] << shift;
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
1686 }
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
1687 pixel_fvec += tile_width;
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
1688 }
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
1689 if (TIFFWriteEncodedTile (tif, tile, tile_buf,
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
1690 TIFFTileSize (tif)) == -1)
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
1691 error ("Failed to write tile data to image");
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
1692 }
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
1693 else
1e633a093faa Tiff write: added support for logical tile images and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31155
diff changeset
1694 error ("Unsupported bit depth");
31155
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1695 }
a30b144bc10b Tiff write: added support for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31154
diff changeset
1696
31153
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1697 }
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1698
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1699 template <typename T>
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1700 void
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1701 write_image (TIFF *tif, T pixel_data, tiff_image_data *image_data)
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1702 {
31159
e960e3a3b3f6 Tiff.m: added structs for tag value enums to the Tiff class.
magedrifaat <magedrifaat@gmail.com>
parents: 31158
diff changeset
1703 // TODO(maged): matlab sets the remaining to zero for less width and height
31160
5f0c3da75926 Tiff: moved internal functions to corefcn.
magedrifaat <magedrifaat@gmail.com>
parents: 31159
diff changeset
1704 // and issues a warning for larger widths but not for larger height? (we should error)
31159
e960e3a3b3f6 Tiff.m: added structs for tag value enums to the Tiff class.
magedrifaat <magedrifaat@gmail.com>
parents: 31158
diff changeset
1705 // and errors for less or more number of channels
31153
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1706 if (image_data->height != pixel_data.dim1 ()
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1707 || image_data->width != pixel_data.dim2 ()
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1708 || pixel_data.ndims () > 3
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1709 || (image_data->samples_per_pixel > 1 && pixel_data.ndims () < 3)
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1710 || (pixel_data.ndims () > 2
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1711 && image_data->samples_per_pixel != pixel_data.dim3 ()))
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1712 error ("Dimensions of the input don't match image dimenions");
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1713
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1714 if (image_data->is_tiled)
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1715 write_tiled_image<T> (tif, pixel_data, image_data);
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1716 else
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1717 write_stripped_image<T> (tif, pixel_data, image_data);
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1718
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1719 }
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1720
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
1721
31104
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
1722 #endif
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1723
31160
5f0c3da75926 Tiff: moved internal functions to corefcn.
magedrifaat <magedrifaat@gmail.com>
parents: 31159
diff changeset
1724 DEFUN (__open_tiff__, args, ,
31109
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1725 "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
1726 {
31104
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
1727 #if defined (HAVE_TIFF)
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1728 int nargin = args.length ();
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1729
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1730 if (nargin == 0 || nargin > 2)
31101
f24d7bcad2d3 Partially fixed formatting of C++ code
magedrifaat <magedrifaat@gmail.com>
parents: 31099
diff changeset
1731 {
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1732 // TODO(maged): return invalid object instead??
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1733 error ("No filename supplied\n");
31101
f24d7bcad2d3 Partially fixed formatting of C++ code
magedrifaat <magedrifaat@gmail.com>
parents: 31099
diff changeset
1734 }
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1735
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
1736 std::string filename = args(0).string_value ();
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1737 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
1738
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1739 if (nargin == 2)
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
1740 mode = args(1).string_value ();
31123
0bcb35909ef4 Tiff open: removed support for rh mode and marked r+ as not yet supported
magedrifaat <magedrifaat@gmail.com>
parents: 31122
diff changeset
1741
31142
97e7ee3b27b7 Tiff setTag: modify the behavior with structs to be compatible with matlab
magedrifaat <magedrifaat@gmail.com>
parents: 31140
diff changeset
1742 const std::vector<std::string> supported_modes {"r", "w", "w8", "a"};
31123
0bcb35909ef4 Tiff open: removed support for rh mode and marked r+ as not yet supported
magedrifaat <magedrifaat@gmail.com>
parents: 31122
diff changeset
1743
31142
97e7ee3b27b7 Tiff setTag: modify the behavior with structs to be compatible with matlab
magedrifaat <magedrifaat@gmail.com>
parents: 31140
diff changeset
1744 if (std::find (supported_modes.cbegin (), supported_modes.cend (), mode)
97e7ee3b27b7 Tiff setTag: modify the behavior with structs to be compatible with matlab
magedrifaat <magedrifaat@gmail.com>
parents: 31140
diff changeset
1745 == supported_modes.cend ())
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
1746 {
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
1747 if (mode == "r+")
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
1748 error ("Openning files in r+ mode is not yet supported");
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
1749 else
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
1750 error ("Invalid mode for openning Tiff file: %s", mode.c_str ());
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
1751 }
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1752
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1753 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
1754
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1755 if (! tif)
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1756 error ("Failed to open Tiff file\n");
31092
a736190ce738 Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
1757
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1758 // 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
1759 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
1760 return octave_value_list (tiff_ov);
31104
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
1761 #else
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
1762 octave_unused_parameter (args);
31104
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
1763 err_disabled_feature ("Tiff", "Tiff");
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
1764 #endif
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1765 }
31092
a736190ce738 Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
1766
a736190ce738 Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
1767
31160
5f0c3da75926 Tiff: moved internal functions to corefcn.
magedrifaat <magedrifaat@gmail.com>
parents: 31159
diff changeset
1768 DEFUN (__close_tiff__, args, ,
31109
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1769 "Close a tiff file")
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1770 {
31104
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
1771 #if defined (HAVE_TIFF)
31101
f24d7bcad2d3 Partially fixed formatting of C++ code
magedrifaat <magedrifaat@gmail.com>
parents: 31099
diff changeset
1772 int nargin = args.length ();
31092
a736190ce738 Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
1773
a736190ce738 Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
1774 if (nargin == 0)
31101
f24d7bcad2d3 Partially fixed formatting of C++ code
magedrifaat <magedrifaat@gmail.com>
parents: 31099
diff changeset
1775 error ("No handle provided\n");
31092
a736190ce738 Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
1776
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
1777 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
1778 TIFFClose (tif);
31092
a736190ce738 Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
1779
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1780 return octave_value_list ();
31104
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
1781 #else
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
1782 err_disabled_feature ("close", "Tiff");
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
1783 #endif
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1784 }
31092
a736190ce738 Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
1785
a736190ce738 Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
1786
31160
5f0c3da75926 Tiff: moved internal functions to corefcn.
magedrifaat <magedrifaat@gmail.com>
parents: 31159
diff changeset
1787 DEFUN (__tiff_get_tag__, args, ,
31109
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1788 "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
1789 {
31104
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
1790 #if defined (HAVE_TIFF)
31109
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1791 int nargin = args.length ();
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1792
31109
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1793 if (nargin == 0)
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1794 error ("No handle provided\n");
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1795
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1796 if (nargin < 2)
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1797 error ("No tag name provided\n");
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1798
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
1799 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
1800
31109
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1801 uint32_t tag_id;
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1802 const TIFFField *fip;
31129
dfab9c6982bf Tiff getTag: added support for single quotes string fo the tag name
magedrifaat <magedrifaat@gmail.com>
parents: 31128
diff changeset
1803
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
1804 if (args(1).is_string ())
31109
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1805 {
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
1806 std::string tagName = args(1).string_value ();
31109
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1807 fip = TIFFFieldWithName (tif, tagName.c_str ());
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1808 if (! fip)
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1809 error ("Tiff tag not found");
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1810
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1811 tag_id = TIFFFieldTag (fip);
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1812 }
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1813 else
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1814 {
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
1815 tag_id = args(1).int_value ();
31109
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1816 fip = TIFFFieldWithTag (tif, tag_id);
31129
dfab9c6982bf Tiff getTag: added support for single quotes string fo the tag name
magedrifaat <magedrifaat@gmail.com>
parents: 31128
diff changeset
1817
31109
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1818 if (! fip)
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1819 error ("Tiff tag not found");
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1820 }
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1821
31117
530dbd1d6b07 Tiff getTag: fixed bug for multivalued tags where only first item is returned
magedrifaat <magedrifaat@gmail.com>
parents: 31115
diff changeset
1822 return octave_value_list (get_field_data (tif, fip));
31104
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
1823 #else
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
1824 err_disabled_feature ("getTag", "Tiff");
b5d59c115e52 Use HAVE_TIFF flag to optionally disable Tiff
magedrifaat <magedrifaat@gmail.com>
parents: 31103
diff changeset
1825 #endif
31102
d6ecf0e8838b Add the new code to the octave namespace
magedrifaat <magedrifaat@gmail.com>
parents: 31101
diff changeset
1826 }
31109
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1827
31124
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1828
31160
5f0c3da75926 Tiff: moved internal functions to corefcn.
magedrifaat <magedrifaat@gmail.com>
parents: 31159
diff changeset
1829 DEFUN (__tiff_set_tag__, args, ,
31124
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1830 "Set the value of a tag in a tiff image")
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1831 {
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1832 #if defined (HAVE_TIFF)
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1833 int nargin = args.length ();
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1834
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1835 if (nargin < 2)
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1836 error ("Too few arguments provided\n");
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1837
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
1838 TIFF *tif = (TIFF *)(args(0).uint64_value ());
31124
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1839
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
1840 if (args(1).isstruct ())
31140
5f70efad6e2c Tiff setTag: added support for setting multiple tags at once using structs
magedrifaat <magedrifaat@gmail.com>
parents: 31139
diff changeset
1841 {
31152
2244617f4da5 Tiff computeStrip: fixed inconsistency in checking plane argument.
magedrifaat <magedrifaat@gmail.com>
parents: 31151
diff changeset
1842 octave_scalar_map tags = args(1).xscalar_map_value ("__tiff_set_tag__: struct argument must be a scalar structure");
31142
97e7ee3b27b7 Tiff setTag: modify the behavior with structs to be compatible with matlab
magedrifaat <magedrifaat@gmail.com>
parents: 31140
diff changeset
1843 string_vector keys = tags.fieldnames ();
97e7ee3b27b7 Tiff setTag: modify the behavior with structs to be compatible with matlab
magedrifaat <magedrifaat@gmail.com>
parents: 31140
diff changeset
1844 // Using iterators instead of this loop method seems to process
97e7ee3b27b7 Tiff setTag: modify the behavior with structs to be compatible with matlab
magedrifaat <magedrifaat@gmail.com>
parents: 31140
diff changeset
1845 // the elements of the struct in a different order than they were
97e7ee3b27b7 Tiff setTag: modify the behavior with structs to be compatible with matlab
magedrifaat <magedrifaat@gmail.com>
parents: 31140
diff changeset
1846 // assigned which makes the behavior here incompatible with matlab
97e7ee3b27b7 Tiff setTag: modify the behavior with structs to be compatible with matlab
magedrifaat <magedrifaat@gmail.com>
parents: 31140
diff changeset
1847 // in case of errors.
97e7ee3b27b7 Tiff setTag: modify the behavior with structs to be compatible with matlab
magedrifaat <magedrifaat@gmail.com>
parents: 31140
diff changeset
1848 for (octave_idx_type i = 0; i < keys.numel (); i++)
31140
5f70efad6e2c Tiff setTag: added support for setting multiple tags at once using structs
magedrifaat <magedrifaat@gmail.com>
parents: 31139
diff changeset
1849 {
31142
97e7ee3b27b7 Tiff setTag: modify the behavior with structs to be compatible with matlab
magedrifaat <magedrifaat@gmail.com>
parents: 31140
diff changeset
1850 std::string key = keys[i];
97e7ee3b27b7 Tiff setTag: modify the behavior with structs to be compatible with matlab
magedrifaat <magedrifaat@gmail.com>
parents: 31140
diff changeset
1851 const TIFFField *fip = TIFFFieldWithName (tif, key.c_str ());
97e7ee3b27b7 Tiff setTag: modify the behavior with structs to be compatible with matlab
magedrifaat <magedrifaat@gmail.com>
parents: 31140
diff changeset
1852 if (! fip)
31140
5f70efad6e2c Tiff setTag: added support for setting multiple tags at once using structs
magedrifaat <magedrifaat@gmail.com>
parents: 31139
diff changeset
1853 error ("Tag %s not found", key.c_str ());
31142
97e7ee3b27b7 Tiff setTag: modify the behavior with structs to be compatible with matlab
magedrifaat <magedrifaat@gmail.com>
parents: 31140
diff changeset
1854 set_field_data (tif, fip, tags.contents (key));
31140
5f70efad6e2c Tiff setTag: added support for setting multiple tags at once using structs
magedrifaat <magedrifaat@gmail.com>
parents: 31139
diff changeset
1855 }
5f70efad6e2c Tiff setTag: added support for setting multiple tags at once using structs
magedrifaat <magedrifaat@gmail.com>
parents: 31139
diff changeset
1856 }
31124
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1857 else
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1858 {
31140
5f70efad6e2c Tiff setTag: added support for setting multiple tags at once using structs
magedrifaat <magedrifaat@gmail.com>
parents: 31139
diff changeset
1859 if (nargin < 3)
5f70efad6e2c Tiff setTag: added support for setting multiple tags at once using structs
magedrifaat <magedrifaat@gmail.com>
parents: 31139
diff changeset
1860 error ("Too few arguments provided");
5f70efad6e2c Tiff setTag: added support for setting multiple tags at once using structs
magedrifaat <magedrifaat@gmail.com>
parents: 31139
diff changeset
1861
31124
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1862 const TIFFField *fip;
31142
97e7ee3b27b7 Tiff setTag: modify the behavior with structs to be compatible with matlab
magedrifaat <magedrifaat@gmail.com>
parents: 31140
diff changeset
1863 // TODO(maged): matlab actually checks for its own strings not LibTIFF's
31160
5f0c3da75926 Tiff: moved internal functions to corefcn.
magedrifaat <magedrifaat@gmail.com>
parents: 31159
diff changeset
1864 // Make it work in both ways
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
1865 if (args(1).is_string ())
31124
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1866 {
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
1867 std::string tagName = args(1).string_value ();
31124
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1868 fip = TIFFFieldWithName (tif, tagName.c_str ());
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1869 if (! fip)
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1870 error ("Tiff tag not found");
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1871 }
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1872 else
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1873 {
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
1874 uint32_t tag_id = args(1).int_value ();
31124
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1875 fip = TIFFFieldWithTag (tif, tag_id);
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1876 if (! fip)
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1877 error ("Tiff tag not found");
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1878 }
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1879
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
1880 set_field_data (tif, fip, args(2));
31124
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1881 }
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1882
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1883 return octave_value_list ();
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1884 #else
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1885 err_disabled_feature ("setTag", "Tiff");
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1886 #endif
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1887 }
e8d1cc309bc9 Tiff: added initial implementation of setTag function for scalar tags
magedrifaat <magedrifaat@gmail.com>
parents: 31123
diff changeset
1888
31160
5f0c3da75926 Tiff: moved internal functions to corefcn.
magedrifaat <magedrifaat@gmail.com>
parents: 31159
diff changeset
1889 DEFUN (__tiff_read__, args, nargout,
31109
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1890 "Read the image in the current IFD")
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1891 {
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1892 #if defined (HAVE_TIFF)
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1893 int nargin = args.length ();
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1894
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1895 if (nargin == 0)
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1896 error ("No handle provided\n");
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1897
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
1898 TIFF *tif = (TIFF *)(args(0).uint64_value ());
31109
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1899
31126
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1900 // TODO(maged): nargout and ycbcr
31128
524cb3106432 __tiff__.cc: handled compiler warnings for unused params and old-style casts.
magedrifaat <magedrifaat@gmail.com>
parents: 31127
diff changeset
1901 octave_unused_parameter (nargout);
31109
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1902
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1903 // Obtain all necessary tags
31112
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
1904 // The main purpose of this struct is to hold all the necessary tags that
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
1905 // will be common among all the different cases of handling the the image
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
1906 // data to avoid repeating the same calls to TIFFGetField in the different
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
1907 // functions as each call is a possible point of failure
31122
1662939a7a49 Tiff read: moved image_date initialization into a constructor
magedrifaat <magedrifaat@gmail.com>
parents: 31121
diff changeset
1908 tiff_image_data image_data (tif);
31125
3b775b939de4 Tiff read: Added support for floating-point images
magedrifaat <magedrifaat@gmail.com>
parents: 31124
diff changeset
1909
3b775b939de4 Tiff read: Added support for floating-point images
magedrifaat <magedrifaat@gmail.com>
parents: 31124
diff changeset
1910 uint16_t sample_format;
3b775b939de4 Tiff read: Added support for floating-point images
magedrifaat <magedrifaat@gmail.com>
parents: 31124
diff changeset
1911 if (! TIFFGetFieldDefaulted(tif, TIFFTAG_SAMPLEFORMAT, &sample_format))
3b775b939de4 Tiff read: Added support for floating-point images
magedrifaat <magedrifaat@gmail.com>
parents: 31124
diff changeset
1912 error ("Failed to obtain a value for sample format");
3b775b939de4 Tiff read: Added support for floating-point images
magedrifaat <magedrifaat@gmail.com>
parents: 31124
diff changeset
1913
3b775b939de4 Tiff read: Added support for floating-point images
magedrifaat <magedrifaat@gmail.com>
parents: 31124
diff changeset
1914 if (sample_format == 3)
3b775b939de4 Tiff read: Added support for floating-point images
magedrifaat <magedrifaat@gmail.com>
parents: 31124
diff changeset
1915 {
31135
b7ffe64e0287 Tiff.m: added test for 16- and 32-bit grayscale and RGB images.
magedrifaat <magedrifaat@gmail.com>
parents: 31133
diff changeset
1916 if (image_data.bits_per_sample != 32 && image_data.bits_per_sample != 64)
31125
3b775b939de4 Tiff read: Added support for floating-point images
magedrifaat <magedrifaat@gmail.com>
parents: 31124
diff changeset
1917 error ("Floating point images are only supported for bit depths of 32 and 64");
3b775b939de4 Tiff read: Added support for floating-point images
magedrifaat <magedrifaat@gmail.com>
parents: 31124
diff changeset
1918 }
3b775b939de4 Tiff read: Added support for floating-point images
magedrifaat <magedrifaat@gmail.com>
parents: 31124
diff changeset
1919 else if (sample_format != 1 && sample_format != 4)
3b775b939de4 Tiff read: Added support for floating-point images
magedrifaat <magedrifaat@gmail.com>
parents: 31124
diff changeset
1920 error ("Unsupported sample format");
31109
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1921
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1922 octave_value_list retval;
31112
e3d8443585fe Tiff read refactored reading stripped images into a separate function
magedrifaat <magedrifaat@gmail.com>
parents: 31111
diff changeset
1923 switch (image_data.bits_per_sample)
31109
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1924 {
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1925 case 1:
31113
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
1926 retval(0) = read_image<boolNDArray> (tif, &image_data);
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
1927 break;
31109
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1928 case 4:
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1929 case 8:
31113
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
1930 retval(0) = read_image<uint8NDArray> (tif, &image_data);
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
1931 break;
31109
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1932 case 16:
31113
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
1933 retval(0) = read_image<uint16NDArray> (tif, &image_data);
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
1934 break;
31109
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1935 case 32:
31125
3b775b939de4 Tiff read: Added support for floating-point images
magedrifaat <magedrifaat@gmail.com>
parents: 31124
diff changeset
1936 if (sample_format == 3)
3b775b939de4 Tiff read: Added support for floating-point images
magedrifaat <magedrifaat@gmail.com>
parents: 31124
diff changeset
1937 retval(0) = read_image<FloatNDArray> (tif, &image_data);
3b775b939de4 Tiff read: Added support for floating-point images
magedrifaat <magedrifaat@gmail.com>
parents: 31124
diff changeset
1938 else
3b775b939de4 Tiff read: Added support for floating-point images
magedrifaat <magedrifaat@gmail.com>
parents: 31124
diff changeset
1939 retval(0) = read_image<uint32NDArray> (tif, &image_data);
31113
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
1940 break;
31109
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1941 case 64:
31125
3b775b939de4 Tiff read: Added support for floating-point images
magedrifaat <magedrifaat@gmail.com>
parents: 31124
diff changeset
1942 if (sample_format == 3)
3b775b939de4 Tiff read: Added support for floating-point images
magedrifaat <magedrifaat@gmail.com>
parents: 31124
diff changeset
1943 retval(0) = read_image<NDArray> (tif, &image_data);
3b775b939de4 Tiff read: Added support for floating-point images
magedrifaat <magedrifaat@gmail.com>
parents: 31124
diff changeset
1944 else
3b775b939de4 Tiff read: Added support for floating-point images
magedrifaat <magedrifaat@gmail.com>
parents: 31124
diff changeset
1945 retval(0) = read_image<uint64NDArray> (tif, &image_data);
31113
a74059523d74 Tiff read: use template to remove repitition in filling matrices
magedrifaat <magedrifaat@gmail.com>
parents: 31112
diff changeset
1946 break;
31109
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1947 default:
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1948 error ("Unsupported bit depth");
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1949 }
31110
2daeeff33980 Tiff read fixed segfault bug for compressed images
magedrifaat <magedrifaat@gmail.com>
parents: 31109
diff changeset
1950
31109
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1951 return retval;
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1952 #else
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1953 err_disabled_feature ("read", "Tiff");
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1954 #endif
06814e8b5a29 add function to read an entire image
magedrifaat <magedrifaat@gmail.com>
parents: 31106
diff changeset
1955 }
31126
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
1956
31160
5f0c3da75926 Tiff: moved internal functions to corefcn.
magedrifaat <magedrifaat@gmail.com>
parents: 31159
diff changeset
1957 DEFUN (__tiff_read_encoded_strip__, args, nargout,
31158
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
1958 "Read a strip from the image in the current IFD")
31157
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
1959 {
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
1960 #if defined (HAVE_TIFF)
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
1961 int nargin = args.length ();
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
1962
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
1963 if (nargin != 2)
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
1964 error ("rong number of arguments");
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
1965
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
1966 TIFF *tif = (TIFF *)(args(0).uint64_value ());
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
1967
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
1968 // TODO(maged): nargout and ycbcr
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
1969 octave_unused_parameter (nargout);
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
1970
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
1971 if (TIFFIsTiled (tif))
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
1972 error ("The image is tiled not stripped");
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
1973
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
1974 uint32_t strip_no;
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
1975 if (args(1).is_scalar_type ())
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
1976 strip_no = args(1).uint32_scalar_value ();
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
1977 else
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
1978 error ("Expected scalar for strip number");
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
1979
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
1980 if (strip_no < 1 || strip_no > TIFFNumberOfStrips (tif))
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
1981 error ("Strip number out of bounds");
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
1982
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
1983 // Convert from Octave's 1-based indexing to zero-based indexing
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
1984 strip_no--;
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
1985
31158
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
1986 return octave_value_list (handle_read_strip_or_tile (tif, strip_no));
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
1987 #else
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
1988 err_disabled_feature ("readEncodedStrip", "Tiff");
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
1989 #endif
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
1990 }
31157
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
1991
31160
5f0c3da75926 Tiff: moved internal functions to corefcn.
magedrifaat <magedrifaat@gmail.com>
parents: 31159
diff changeset
1992 DEFUN (__tiff_read_encoded_tile__, args, nargout,
31158
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
1993 "Read a tile from the image in the current IFD")
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
1994 {
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
1995 #if defined (HAVE_TIFF)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
1996 int nargin = args.length ();
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
1997
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
1998 if (nargin != 2)
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
1999 error ("rong number of arguments");
31157
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
2000
31158
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2001 TIFF *tif = (TIFF *)(args(0).uint64_value ());
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2002
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2003 // TODO(maged): nargout and ycbcr
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2004 octave_unused_parameter (nargout);
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2005
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2006 if (! TIFFIsTiled (tif))
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2007 error ("The image is stripped not tiled");
31157
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
2008
31158
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2009 uint32_t tile_no;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2010 if (args(1).is_scalar_type ())
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2011 tile_no = args(1).uint32_scalar_value ();
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2012 else
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2013 error ("Expected scalar for tile number");
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2014
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2015 if (tile_no < 1 || tile_no > TIFFNumberOfTiles (tif))
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2016 error ("Tile number out of bounds");
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2017
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2018 // Convert from Octave's 1-based indexing to zero-based indexing
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2019 tile_no--;
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2020
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2021 return octave_value_list (handle_read_strip_or_tile (tif, tile_no));
31157
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
2022 #else
31160
5f0c3da75926 Tiff: moved internal functions to corefcn.
magedrifaat <magedrifaat@gmail.com>
parents: 31159
diff changeset
2023 err_disabled_feature ("readEncodedTile", "Tiff");
31157
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
2024 #endif
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
2025 }
dc3d2744916d Tiff: added readEncodedStrip method and corresponding unit tests
magedrifaat <magedrifaat@gmail.com>
parents: 31156
diff changeset
2026
31160
5f0c3da75926 Tiff: moved internal functions to corefcn.
magedrifaat <magedrifaat@gmail.com>
parents: 31159
diff changeset
2027 DEFUN (__tiff_write__, args, ,
31153
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2028 "Write the image data to the current IFD")
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2029 {
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2030 #if defined (HAVE_TIFF)
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2031 int nargin = args.length ();
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2032
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2033 if (nargin < 2)
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2034 error ("Wrong number of arguments\n");
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2035
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2036 TIFF *tif = (TIFF *)(args(0).uint64_value ());
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2037
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2038 // TODO(maged): check on windows
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2039 if (TIFFGetMode (tif) == O_RDONLY)
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2040 error ("Can't write data to a file opened in read-only mode");
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2041
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2042 // Obtain all necessary tags
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2043 tiff_image_data image_data (tif);
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2044
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2045 uint16_t sample_format;
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2046 if (! TIFFGetFieldDefaulted(tif, TIFFTAG_SAMPLEFORMAT, &sample_format))
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2047 error ("Failed to obtain a value for sample format");
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2048
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2049 if (sample_format == 3)
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2050 {
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2051 if (image_data.bits_per_sample != 32
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2052 && image_data.bits_per_sample != 64)
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2053 error ("Floating point images are only supported for bit depths of 32 and 64");
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2054 }
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2055 else if (sample_format != 1 && sample_format != 4)
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2056 error ("Unsupported sample format");
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2057
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2058 switch (image_data.bits_per_sample)
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2059 {
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2060 case 1:
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2061 // We need to check for both scalar and matrix types to handle single
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2062 // pixel image
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2063 if (args (1).is_bool_scalar () || args (1).is_bool_matrix ())
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2064 write_image<boolNDArray> (tif, args (1).bool_array_value (),
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2065 &image_data);
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2066 else
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2067 error ("Expected logical matrix for BiLevel image");
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2068 break;
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2069 case 8:
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2070 if (args (1).is_uint8_type ())
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2071 write_image<uint8NDArray> (tif, args (1).uint8_array_value (),
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2072 &image_data);
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2073 else
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2074 error ("Only uint8 data is allowed for uint images with bit depth of 8");
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2075 break;
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2076 case 16:
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2077 if (args (1).is_uint16_type ())
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2078 write_image<uint16NDArray> (tif, args (1).uint16_array_value (),
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2079 &image_data);
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2080 else
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2081 error ("Only uint16 data is allowed for uint images with bit depth of 16");
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2082 break;
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2083 case 32:
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2084 if (sample_format == 3)
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2085 if (args (1).is_single_type () || args (1).is_double_type ())
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2086 write_image<FloatNDArray> (tif, args (1).float_array_value (),
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2087 &image_data);
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2088 else
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2089 error ("Only single and double data are allowed for floating-point images");
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2090 else
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2091 if (args (1).is_uint32_type ())
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2092 write_image<uint32NDArray> (tif, args (1).uint32_array_value (),
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2093 &image_data);
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2094 else
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2095 error ("Only uint32 data is allowed for uint images with bit depth of 32");
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2096 break;
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2097 case 64:
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2098 if (sample_format == 3)
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2099 if (args (1).is_single_type () || args (1).is_double_type ())
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2100 write_image<NDArray> (tif, args (1).array_value (), &image_data);
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2101 else
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2102 error ("Only single and double data are allowed for floating-point images");
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2103 else
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2104 if (args (1).is_uint64_type ())
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2105 write_image<uint64NDArray> (tif, args (1).uint64_array_value (),
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2106 &image_data);
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2107 else
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2108 error ("Only uint64 data is allowed for uint images with bit depth of 64");
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2109 break;
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2110 default:
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2111 error ("Unsupported bit depth");
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2112 }
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2113
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2114 return octave_value_list ();
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2115 #else
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2116 err_disabled_feature ("write", "Tiff");
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2117 #endif
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2118 }
c66d6c7f025e Tiff: implemented write method for stripped images
magedrifaat <magedrifaat@gmail.com>
parents: 31152
diff changeset
2119
31160
5f0c3da75926 Tiff: moved internal functions to corefcn.
magedrifaat <magedrifaat@gmail.com>
parents: 31159
diff changeset
2120 DEFUN (__tiff_write_encoded_strip__, args, ,
31126
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
2121 "Write an encoded strip to the image")
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
2122 {
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
2123 #if defined (HAVE_TIFF)
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
2124 int nargin = args.length ();
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
2125
31146
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
2126 // TODO(maged): add support for YCbCr data
31126
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
2127 if (nargin < 3)
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
2128 error ("Too few arguments provided\n");
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
2129
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2130 TIFF *tif = (TIFF *)(args(0).uint64_value ());
31126
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
2131
31139
3431a15b2c75 Tiff.m: refactored tests to use functions to reduce code repetition.
magedrifaat <magedrifaat@gmail.com>
parents: 31138
diff changeset
2132 // TODO(maged): check on windows
31138
68762676dab1 Tiff writeEncodedStrip: prevent writing to a read-only file
magedrifaat <magedrifaat@gmail.com>
parents: 31137
diff changeset
2133 if (TIFFGetMode (tif) == O_RDONLY)
68762676dab1 Tiff writeEncodedStrip: prevent writing to a read-only file
magedrifaat <magedrifaat@gmail.com>
parents: 31137
diff changeset
2134 error ("Can't write data to a file opened in read-only mode");
68762676dab1 Tiff writeEncodedStrip: prevent writing to a read-only file
magedrifaat <magedrifaat@gmail.com>
parents: 31137
diff changeset
2135
31126
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
2136 // Obtain all necessary tags
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
2137 tiff_image_data image_data (tif);
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
2138
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
2139 if (image_data.is_tiled)
31143
a68f2dadafee Tiff.m: added all remaining tests for implemented features.
magedrifaat <magedrifaat@gmail.com>
parents: 31142
diff changeset
2140 error ("Can't write strips to a tiled image");
31126
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
2141
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2142 uint32_t strip_no = args(1).uint32_scalar_value ();
31126
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
2143 if (strip_no < 1 || strip_no > TIFFNumberOfStrips (tif))
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
2144 error ("Strip number out of range");
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
2145
31158
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2146 handle_write_strip_or_tile (tif, strip_no, args(2), &image_data);
31126
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
2147
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
2148 return octave_value_list ();
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
2149 #else
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
2150 err_disabled_feature ("writeEncodedStrip", "Tiff");
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
2151 #endif
7851c5b9c950 Tiff: implemented writeEncodedStrip function for writing a strip to an image
magedrifaat <magedrifaat@gmail.com>
parents: 31125
diff changeset
2152 }
31146
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
2153
31160
5f0c3da75926 Tiff: moved internal functions to corefcn.
magedrifaat <magedrifaat@gmail.com>
parents: 31159
diff changeset
2154 DEFUN (__tiff_write_encoded_tile__, args, ,
31146
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
2155 "Write an encoded tile to the image")
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
2156 {
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
2157 #if defined (HAVE_TIFF)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
2158 int nargin = args.length ();
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
2159
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
2160 // TODO(maged): add support for YCbCr data
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
2161 if (nargin < 3)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
2162 error ("Too few arguments provided\n");
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
2163
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2164 TIFF *tif = (TIFF *)(args(0).uint64_value ());
31146
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
2165
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
2166 // TODO(maged): check on windows
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
2167 if (TIFFGetMode (tif) == O_RDONLY)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
2168 error ("Can't write data to a file opened in read-only mode");
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
2169
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
2170 // Obtain all necessary tags
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
2171 tiff_image_data image_data (tif);
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
2172
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
2173 if (! image_data.is_tiled)
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
2174 error ("Can't write tiles to a stripped image");
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
2175
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2176 uint32_t tile_no = args(1).uint32_scalar_value ();
31146
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
2177 if (tile_no < 1 || tile_no > TIFFNumberOfTiles (tif))
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
2178 error ("Tile number out of range");
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
2179
31158
f2ae7763739a Tiff: added writeEncodedTile method to read tiles from image
magedrifaat <magedrifaat@gmail.com>
parents: 31157
diff changeset
2180 handle_write_strip_or_tile (tif, tile_no, args(2), &image_data);
31146
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
2181
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
2182 return octave_value_list ();
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
2183 #else
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
2184 err_disabled_feature ("writeEncodedTile", "Tiff");
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
2185 #endif
50402b8dfb4a Tiff: added writeEncodedTile function for writing tiled images
magedrifaat <magedrifaat@gmail.com>
parents: 31145
diff changeset
2186 }
31148
4bc9a1938f9a Tiff: added isTiled method to check if the image is tiled or stripped
magedrifaat <magedrifaat@gmail.com>
parents: 31147
diff changeset
2187
31160
5f0c3da75926 Tiff: moved internal functions to corefcn.
magedrifaat <magedrifaat@gmail.com>
parents: 31159
diff changeset
2188 DEFUN (__tiff_is_tiled__, args, ,
31148
4bc9a1938f9a Tiff: added isTiled method to check if the image is tiled or stripped
magedrifaat <magedrifaat@gmail.com>
parents: 31147
diff changeset
2189 "Get whether the image is tiled")
4bc9a1938f9a Tiff: added isTiled method to check if the image is tiled or stripped
magedrifaat <magedrifaat@gmail.com>
parents: 31147
diff changeset
2190 {
4bc9a1938f9a Tiff: added isTiled method to check if the image is tiled or stripped
magedrifaat <magedrifaat@gmail.com>
parents: 31147
diff changeset
2191 #if defined (HAVE_TIFF)
4bc9a1938f9a Tiff: added isTiled method to check if the image is tiled or stripped
magedrifaat <magedrifaat@gmail.com>
parents: 31147
diff changeset
2192 int nargin = args.length ();
4bc9a1938f9a Tiff: added isTiled method to check if the image is tiled or stripped
magedrifaat <magedrifaat@gmail.com>
parents: 31147
diff changeset
2193
4bc9a1938f9a Tiff: added isTiled method to check if the image is tiled or stripped
magedrifaat <magedrifaat@gmail.com>
parents: 31147
diff changeset
2194 if (nargin == 0)
4bc9a1938f9a Tiff: added isTiled method to check if the image is tiled or stripped
magedrifaat <magedrifaat@gmail.com>
parents: 31147
diff changeset
2195 error ("No handle provided\n");
4bc9a1938f9a Tiff: added isTiled method to check if the image is tiled or stripped
magedrifaat <magedrifaat@gmail.com>
parents: 31147
diff changeset
2196
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2197 TIFF *tif = (TIFF *)(args(0).uint64_value ());
31148
4bc9a1938f9a Tiff: added isTiled method to check if the image is tiled or stripped
magedrifaat <magedrifaat@gmail.com>
parents: 31147
diff changeset
2198 bool is_tiled = static_cast<bool> (TIFFIsTiled (tif));
4bc9a1938f9a Tiff: added isTiled method to check if the image is tiled or stripped
magedrifaat <magedrifaat@gmail.com>
parents: 31147
diff changeset
2199 return octave_value_list (octave_value (is_tiled));
4bc9a1938f9a Tiff: added isTiled method to check if the image is tiled or stripped
magedrifaat <magedrifaat@gmail.com>
parents: 31147
diff changeset
2200 #else
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2201 err_disabled_feature ("isTiled", "Tiff");
31148
4bc9a1938f9a Tiff: added isTiled method to check if the image is tiled or stripped
magedrifaat <magedrifaat@gmail.com>
parents: 31147
diff changeset
2202 #endif
4bc9a1938f9a Tiff: added isTiled method to check if the image is tiled or stripped
magedrifaat <magedrifaat@gmail.com>
parents: 31147
diff changeset
2203 }
4bc9a1938f9a Tiff: added isTiled method to check if the image is tiled or stripped
magedrifaat <magedrifaat@gmail.com>
parents: 31147
diff changeset
2204
31160
5f0c3da75926 Tiff: moved internal functions to corefcn.
magedrifaat <magedrifaat@gmail.com>
parents: 31159
diff changeset
2205 DEFUN (__tiff_number_of_strips__, args, ,
31149
d4dbc69f301e Tiff: implemented numberOfStrips method
magedrifaat <magedrifaat@gmail.com>
parents: 31148
diff changeset
2206 "Get the number of strips in the image")
d4dbc69f301e Tiff: implemented numberOfStrips method
magedrifaat <magedrifaat@gmail.com>
parents: 31148
diff changeset
2207 {
d4dbc69f301e Tiff: implemented numberOfStrips method
magedrifaat <magedrifaat@gmail.com>
parents: 31148
diff changeset
2208 #if defined (HAVE_TIFF)
d4dbc69f301e Tiff: implemented numberOfStrips method
magedrifaat <magedrifaat@gmail.com>
parents: 31148
diff changeset
2209 int nargin = args.length ();
d4dbc69f301e Tiff: implemented numberOfStrips method
magedrifaat <magedrifaat@gmail.com>
parents: 31148
diff changeset
2210
d4dbc69f301e Tiff: implemented numberOfStrips method
magedrifaat <magedrifaat@gmail.com>
parents: 31148
diff changeset
2211 if (nargin == 0)
d4dbc69f301e Tiff: implemented numberOfStrips method
magedrifaat <magedrifaat@gmail.com>
parents: 31148
diff changeset
2212 error ("No handle provided\n");
d4dbc69f301e Tiff: implemented numberOfStrips method
magedrifaat <magedrifaat@gmail.com>
parents: 31148
diff changeset
2213
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2214 TIFF *tif = (TIFF *)(args(0).uint64_value ());
31152
2244617f4da5 Tiff computeStrip: fixed inconsistency in checking plane argument.
magedrifaat <magedrifaat@gmail.com>
parents: 31151
diff changeset
2215
31149
d4dbc69f301e Tiff: implemented numberOfStrips method
magedrifaat <magedrifaat@gmail.com>
parents: 31148
diff changeset
2216 if (TIFFIsTiled (tif))
d4dbc69f301e Tiff: implemented numberOfStrips method
magedrifaat <magedrifaat@gmail.com>
parents: 31148
diff changeset
2217 error ("The image is tiled not stripped");
d4dbc69f301e Tiff: implemented numberOfStrips method
magedrifaat <magedrifaat@gmail.com>
parents: 31148
diff changeset
2218
d4dbc69f301e Tiff: implemented numberOfStrips method
magedrifaat <magedrifaat@gmail.com>
parents: 31148
diff changeset
2219 double strip_count = static_cast<double> (TIFFNumberOfStrips (tif));
d4dbc69f301e Tiff: implemented numberOfStrips method
magedrifaat <magedrifaat@gmail.com>
parents: 31148
diff changeset
2220 return octave_value_list (octave_value (strip_count));
d4dbc69f301e Tiff: implemented numberOfStrips method
magedrifaat <magedrifaat@gmail.com>
parents: 31148
diff changeset
2221 #else
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2222 err_disabled_feature ("numberOfStrips", "Tiff");
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2223 #endif
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2224 }
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2225
31160
5f0c3da75926 Tiff: moved internal functions to corefcn.
magedrifaat <magedrifaat@gmail.com>
parents: 31159
diff changeset
2226 DEFUN (__tiff_number_of_tiles__, args, ,
31151
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
2227 "Get the number of tiles in the image")
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
2228 {
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
2229 #if defined (HAVE_TIFF)
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
2230 int nargin = args.length ();
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
2231
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
2232 if (nargin == 0)
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
2233 error ("No handle provided\n");
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
2234
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
2235 TIFF *tif = (TIFF *)(args(0).uint64_value ());
31152
2244617f4da5 Tiff computeStrip: fixed inconsistency in checking plane argument.
magedrifaat <magedrifaat@gmail.com>
parents: 31151
diff changeset
2236
31151
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
2237 if (! TIFFIsTiled (tif))
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
2238 error ("The image is stripped not tiled");
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
2239
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
2240 double tile_count = static_cast<double> (TIFFNumberOfTiles (tif));
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
2241 return octave_value_list (octave_value (tile_count));
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
2242 #else
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
2243 err_disabled_feature ("numberOfTiles", "Tiff");
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
2244 #endif
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
2245 }
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
2246
31160
5f0c3da75926 Tiff: moved internal functions to corefcn.
magedrifaat <magedrifaat@gmail.com>
parents: 31159
diff changeset
2247 DEFUN (__tiff_compute_strip__, args, ,
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2248 "Get the strip index containing the given row")
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2249 {
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2250 #if defined (HAVE_TIFF)
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2251 int nargin = args.length ();
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2252
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2253 if (nargin < 2 || nargin > 3)
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2254 error ("Wrong number of arguments\n");
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2255
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2256 TIFF *tif = (TIFF *)(args(0).uint64_value ());
31152
2244617f4da5 Tiff computeStrip: fixed inconsistency in checking plane argument.
magedrifaat <magedrifaat@gmail.com>
parents: 31151
diff changeset
2257
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2258 if (TIFFIsTiled (tif))
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2259 error ("The image is tiled not stripped");
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2260
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2261 tiff_image_data image_data (tif);
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2262
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2263 uint32_t row = args(1).uint32_scalar_value ();
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2264 if (row > image_data.height)
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2265 row = image_data.height;
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2266
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2267 // Convert from 1-based to zero-based indexing but avoid underflow
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2268 if (row > 0)
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2269 row--;
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2270
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2271 uint16_t plane;
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2272 if (nargin > 2)
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2273 {
31152
2244617f4da5 Tiff computeStrip: fixed inconsistency in checking plane argument.
magedrifaat <magedrifaat@gmail.com>
parents: 31151
diff changeset
2274 if (image_data.planar_configuration == PLANARCONFIG_CONTIG)
2244617f4da5 Tiff computeStrip: fixed inconsistency in checking plane argument.
magedrifaat <magedrifaat@gmail.com>
parents: 31151
diff changeset
2275 error ("Can't use plane argument for images with chunky PlanarConfiguration");
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2276 plane = args(2).uint16_scalar_value ();
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2277 if (plane > image_data.samples_per_pixel)
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2278 plane = image_data.samples_per_pixel;
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2279 if (plane > 0)
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2280 plane--;
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2281 }
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2282 else
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2283 {
31152
2244617f4da5 Tiff computeStrip: fixed inconsistency in checking plane argument.
magedrifaat <magedrifaat@gmail.com>
parents: 31151
diff changeset
2284 if (image_data.planar_configuration == PLANARCONFIG_SEPARATE)
2244617f4da5 Tiff computeStrip: fixed inconsistency in checking plane argument.
magedrifaat <magedrifaat@gmail.com>
parents: 31151
diff changeset
2285 error ("The plane argument is required for images with separate PlanarConfiguration");
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2286 plane = 0;
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2287 }
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2288
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2289 double strip_number = TIFFComputeStrip (tif, row, plane) + 1;
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2290 if (strip_number > TIFFNumberOfStrips (tif))
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2291 strip_number = TIFFNumberOfStrips (tif);
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2292 return octave_value_list (octave_value (strip_number));
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2293 #else
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2294 err_disabled_feature ("computeStrip", "Tiff");
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2295 #endif
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2296 }
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2297
31160
5f0c3da75926 Tiff: moved internal functions to corefcn.
magedrifaat <magedrifaat@gmail.com>
parents: 31159
diff changeset
2298 DEFUN (__tiff_compute_tile__, args, ,
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2299 "Get the tile index containing the given row and column")
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2300 {
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2301 #if defined (HAVE_TIFF)
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2302 int nargin = args.length ();
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2303
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2304 if (nargin < 2 || nargin > 3)
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2305 error ("Wrong number of arguments\n");
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2306
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2307 TIFF *tif = (TIFF *)(args(0).uint64_value ());
31152
2244617f4da5 Tiff computeStrip: fixed inconsistency in checking plane argument.
magedrifaat <magedrifaat@gmail.com>
parents: 31151
diff changeset
2308
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2309 if (! TIFFIsTiled (tif))
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2310 error ("The image is stripped not tiled");
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2311
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2312 uint32NDArray coords = args(1).uint32_array_value ();
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2313 if (coords.dim2() < 2)
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2314 error ("Coordinates must be in the shape [row, col]");
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2315 uint32_t row = coords(0, 0);
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2316 uint32_t col = coords(0, 1);
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2317
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2318 tiff_image_data image_data (tif);
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2319
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2320 if (col > image_data.width)
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2321 col = image_data.width;
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2322 if (row > image_data.height)
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2323 row = image_data.height;
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2324
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2325 // Convert from 1-based to zero-based indexing but avoid underflow
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2326 if (row > 0)
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2327 row--;
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2328 if (col > 0)
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2329 col--;
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2330
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2331 uint16_t plane;
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2332 if (nargin > 2)
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2333 {
31152
2244617f4da5 Tiff computeStrip: fixed inconsistency in checking plane argument.
magedrifaat <magedrifaat@gmail.com>
parents: 31151
diff changeset
2334 if (image_data.planar_configuration == PLANARCONFIG_CONTIG)
2244617f4da5 Tiff computeStrip: fixed inconsistency in checking plane argument.
magedrifaat <magedrifaat@gmail.com>
parents: 31151
diff changeset
2335 error ("Can't use plane argument for images with chunky PlanarConfiguration");
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2336 plane = args(2).uint16_scalar_value ();
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2337 if (plane > image_data.samples_per_pixel)
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2338 plane = image_data.samples_per_pixel;
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2339 if (plane > 0)
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2340 plane--;
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2341 }
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2342 else
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2343 {
31152
2244617f4da5 Tiff computeStrip: fixed inconsistency in checking plane argument.
magedrifaat <magedrifaat@gmail.com>
parents: 31151
diff changeset
2344 if (image_data.planar_configuration == PLANARCONFIG_SEPARATE)
2244617f4da5 Tiff computeStrip: fixed inconsistency in checking plane argument.
magedrifaat <magedrifaat@gmail.com>
parents: 31151
diff changeset
2345 error ("The plane argument is required for images with separate PlanarConfiguration");
31150
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2346 plane = 0;
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2347 }
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2348
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2349 double tile_number = TIFFComputeTile (tif, col, row, 0, plane) + 1;
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2350 if (tile_number > TIFFNumberOfTiles (tif))
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2351 tile_number = TIFFNumberOfTiles (tif);
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2352 return octave_value_list (octave_value (tile_number));
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2353 #else
6bede2d6f273 Tiff: added computeStrip and computeTile methods
magedrifaat <magedrifaat@gmail.com>
parents: 31149
diff changeset
2354 err_disabled_feature ("computeTile", "Tiff");
31149
d4dbc69f301e Tiff: implemented numberOfStrips method
magedrifaat <magedrifaat@gmail.com>
parents: 31148
diff changeset
2355 #endif
d4dbc69f301e Tiff: implemented numberOfStrips method
magedrifaat <magedrifaat@gmail.com>
parents: 31148
diff changeset
2356 }
d4dbc69f301e Tiff: implemented numberOfStrips method
magedrifaat <magedrifaat@gmail.com>
parents: 31148
diff changeset
2357
31160
5f0c3da75926 Tiff: moved internal functions to corefcn.
magedrifaat <magedrifaat@gmail.com>
parents: 31159
diff changeset
2358 DEFUN (__tiff_version__, , ,
31151
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
2359 "Get the version stamp of LibTIFF")
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
2360 {
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
2361 #if defined (HAVE_TIFF)
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
2362 std::string version = std::string (TIFFGetVersion ());
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
2363 return octave_value_list (octave_value (version));
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
2364 #else
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
2365 err_disabled_feature ("getVersion", "Tiff");
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
2366 #endif
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
2367 }
6fb54834aa93 Tiff: added numberOfTiles and getVersion methods
magedrifaat <magedrifaat@gmail.com>
parents: 31150
diff changeset
2368
31092
a736190ce738 Added the Tiff classdef files to octave
magedrifaat <magedrifaat@gmail.com>
parents:
diff changeset
2369 }