File Coverage

blib/lib/ICC/Profile/XYZ_.pm
Criterion Covered Total %
statement 42 67 62.6
branch 4 24 16.6
condition 1 6 16.6
subroutine 9 13 69.2
pod 1 7 14.2
total 57 117 48.7


line stmt bran cond sub pod time code
1             package ICC::Profile::XYZ_;
2              
3 2     2   98489 use strict;
  2         11  
  2         48  
4 2     2   8 use Carp;
  2         2  
  2         109  
5              
6             our $VERSION = 0.12;
7              
8             # revised 2018-08-07
9             #
10             # Copyright © 2004-2020 by William B. Birkett
11              
12             # inherit from Shared
13 2     2   10 use parent qw(ICC::Shared);
  2         4  
  2         11  
14              
15             # note that the XYZ tag contains an array of XYZ values, not a single XYZ value
16             # there is typically just one XYZ value in that array, which is accessed by the 'XYZ' method
17              
18             # create new XYZ_ tag object
19             # parameters: ()
20             # parameters: (ref_to_XYZ_array)
21             # parameters: (ref_to_array_of_XYZ_arrays)
22             # returns: (ref_to_object)
23             sub new {
24              
25             # get object class
26 1     1 0 880 my $class = shift();
27              
28             # create empty XYZ_ object
29 1         3 my $self = [
30             {}, # object header
31             [], # array of XYZ arrays
32             ];
33              
34             # if single parameter is an array reference
35 1 50 33     4 if (@_ == 1 && ref($_[0]) eq 'ARRAY') {
36            
37             # set object attributes
38 0         0 _newICCXYZ_($self, @_);
39            
40             }
41              
42             # bless object
43 1         2 bless($self, $class);
44              
45             # return object reference
46 1         2 return($self);
47              
48             }
49              
50             # create XYZ_ tag object from ICC profile
51             # parameters: (ref_to_parent_object, file_handle, ref_to_tag_table_entry)
52             # returns: (ref_to_object)
53             sub new_fh {
54              
55             # get object class
56 1     1 0 625 my $class = shift();
57              
58             # create empty XYZ_ object
59 1         3 my $self = [
60             {}, # object header
61             [], # array of XYZ arrays
62             ];
63              
64             # verify 3 parameters
65 1 50       4 (@_ == 3) or croak('wrong number of parameters');
66              
67             # read XYZ_ data from profile
68 1         4 _readICCXYZ_($self, @_);
69              
70             # bless object
71 1         3 bless($self, $class);
72              
73             # return object reference
74 1         8 return($self);
75              
76             }
77              
78             # writes XYZ_ tag object to ICC profile
79             # parameters: (ref_to_parent_object, file_handle, ref_to_tag_table_entry)
80             sub write_fh {
81              
82             # verify 4 parameters
83 1 50   1 0 990 (@_ == 4) or croak('wrong number of parameters');
84              
85             # write XYZ_ data to profile
86 1         5 goto &_writeICCXYZ_;
87              
88             }
89              
90             # get tag size (for writing to profile)
91             # returns: (tag_size)
92             sub size {
93              
94             # get parameters
95 3     3 0 494 my ($self) = @_;
96              
97             # return size
98 3         5 return(8 + @{$self->[1]} * 12);
  3         23  
99              
100             }
101              
102             # get reference to array of XYZ arrays
103             # returns: (ref_to_array_of_XYZ arrays)
104             sub array {
105              
106             # get parameters
107 0     0 0 0 my $self = shift();
108              
109             # return reference to array of XYZ arrays
110 0         0 return($self->[1]);
111              
112             }
113              
114             # get/set first XYZ array
115             # parameters: ([ref_to_XYZ_array])
116             # returns: (ref_to_XYZ_array)
117             sub XYZ {
118              
119             # get object reference
120 0     0 0 0 my $self = shift();
121              
122             # if parameter supplied
123 0 0       0 if (@_) {
124            
125             # verify array reference
126 0 0       0 (ref($_[0]) eq 'ARRAY') or croak('parameter must be array reference');
127            
128             # save array reference
129 0         0 $self->[1][0] = shift();
130            
131             }
132              
133             # return array reference
134 0         0 return($self->[1][0]);
135              
136             }
137              
138             # print object contents to string
139             # format is an array structure
140             # parameter: ([format])
141             # returns: (string)
142             sub sdump {
143              
144             # get parameters
145 0     0 1 0 my ($self, $p) = @_;
146              
147             # local variables
148 0         0 my ($s, $fmt);
149              
150             # resolve parameter to an array reference
151 0 0       0 $p = defined($p) ? ref($p) eq 'ARRAY' ? $p : [$p] : [];
    0          
152              
153             # get format string
154 0 0 0     0 $fmt = defined($p->[0]) && ! ref($p->[0]) ? $p->[0] : 'undef';
155              
156             # set string to object ID
157 0         0 $s = sprintf("'%s' object, (0x%x)\n", ref($self), $self);
158              
159             # return
160 0         0 return($s);
161              
162             }
163              
164             # make new XYZ_ tag from array
165             # array may be a single XYZ triplet, or an array of XYZ triplets
166             # parameters: (ref_to_object, ref_to_array)
167             sub _newICCXYZ_ {
168              
169             # get parameters
170 0     0   0 my ($self, $array) = @_;
171              
172             # if first array element is an array
173 0 0       0 if (ref($array->[0]) eq 'ARRAY') {
    0          
174            
175             # for each array element
176 0         0 for my $i (0 .. $#{$array}) {
  0         0  
177            
178             # if first array element is not a reference
179 0 0       0 if (! ref($array->[$i][0])) {
180            
181             # save XYZ triplet
182 0         0 $self->[1][$i] = [@{$array->[$i]}];
  0         0  
183            
184             } else {
185            
186             # error
187 0         0 croak('invalid parameters for XYZ tag');
188            
189             }
190            
191             }
192            
193             # if first array element is not a reference
194             } elsif (! ref($array->[0])) {
195            
196             # save XYZ triplet
197 0         0 $self->[1] = [[@{$array}]];
  0         0  
198            
199             } else {
200            
201             # error
202 0         0 croak('invalid parameters for XYZ tag');
203            
204             }
205            
206             }
207              
208             # read XYZ_ tag from ICC profile
209             # parameters: (ref_to_object, ref_to_parent_object, file_handle, ref_to_tag_table_entry)
210             sub _readICCXYZ_ {
211              
212             # get parameters
213 1     1   2 my ($self, $parent, $fh, $tag) = @_;
214              
215             # local variables
216 1         2 my ($buf);
217              
218             # save tag signature
219 1         2 $self->[0]{'signature'} = $tag->[0];
220              
221             # seek start of tag data
222 1         10 seek($fh, $tag->[1] + 8, 0);
223              
224             # for each XYZ triplet
225 1         5 for my $i (0 .. ($tag->[2] - 20)/12) {
226            
227             # read XYZ values
228 1         7 read($fh, $buf, 12);
229            
230             # unpack XYZ values
231 1         6 $self->[1][$i] = [ICC::Shared::s15f162v(unpack('N3', $buf))];
232            
233             }
234            
235             }
236              
237             # write XYZ_ tag to ICC profile
238             # parameters: (ref_to_object, ref_to_parent_object, file_handle, ref_to_tag_table_entry)
239             sub _writeICCXYZ_ {
240              
241             # get parameters
242 1     1   3 my ($self, $parent, $fh, $tag) = @_;
243              
244             # verify tag data
245 1 50       1 (@{$self->[1]} > 0) or carp('writing \'XYZ_\' tag without values');
  1         3  
246              
247             # seek start of tag
248 1         8 seek($fh, $tag->[1], 0);
249              
250             # write tag signature
251 1         15 print $fh pack('a4 x4', 'XYZ ');
252              
253             # for each XYZ triplet
254 1         3 for my $XYZ (@{$self->[1]}) {
  1         4  
255            
256             # write XYZ values
257 1         2 print $fh pack('N3', map {$_ + 0.5} ICC::Shared::v2s15f16(@{$XYZ}));
  3         11  
  1         4  
258            
259             }
260            
261             }
262              
263             1;