| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
18
|
|
|
18
|
|
791
|
use v5.12; |
|
|
18
|
|
|
|
|
92
|
|
|
2
|
18
|
|
|
18
|
|
121
|
use warnings; |
|
|
18
|
|
|
|
|
30
|
|
|
|
18
|
|
|
|
|
995
|
|
|
3
|
|
|
|
|
|
|
|
|
4
|
|
|
|
|
|
|
# common code of Graphics::Toolkit::Color::Space::Instance::* |
|
5
|
|
|
|
|
|
|
|
|
6
|
|
|
|
|
|
|
package Graphics::Toolkit::Color::Space; |
|
7
|
18
|
|
|
18
|
|
7835
|
use Graphics::Toolkit::Color::Space::Basis; |
|
|
18
|
|
|
|
|
43
|
|
|
|
18
|
|
|
|
|
554
|
|
|
8
|
18
|
|
|
18
|
|
8073
|
use Graphics::Toolkit::Color::Space::Shape; |
|
|
18
|
|
|
|
|
47
|
|
|
|
18
|
|
|
|
|
22685
|
|
|
9
|
|
|
|
|
|
|
|
|
10
|
|
|
|
|
|
|
sub new { |
|
11
|
68
|
|
|
68
|
0
|
1507
|
my $pkg = shift; |
|
12
|
68
|
|
|
|
|
223
|
my %args = @_; |
|
13
|
68
|
|
|
|
|
454
|
my $basis = Graphics::Toolkit::Color::Space::Basis->new( $args{'axis'}, $args{'short'} ); |
|
14
|
68
|
100
|
|
|
|
223
|
return unless ref $basis; |
|
15
|
67
|
|
|
|
|
357
|
my $shape = Graphics::Toolkit::Color::Space::Shape->new( $basis, $args{'range'}, $args{'type'} ); |
|
16
|
67
|
50
|
|
|
|
197
|
return unless ref $shape; |
|
17
|
|
|
|
|
|
|
|
|
18
|
|
|
|
|
|
|
# which formats the constructor will accept, that can be deconverted into list |
|
19
|
571
|
100
|
|
571
|
|
1093
|
my %deformats = ( hash => sub { $basis->list_from_hash(@_) if $basis->is_hash(@_) }, |
|
20
|
675
|
100
|
|
675
|
|
1245
|
named_array => sub { @{$_[0]}[1 .. $#{$_[0]}] if $basis->is_named_array(@_) }, |
|
|
106
|
|
|
|
|
331
|
|
|
|
106
|
|
|
|
|
241
|
|
|
21
|
610
|
100
|
|
610
|
|
1044
|
string => sub { $basis->list_from_string(@_) if $basis->is_string(@_) }, |
|
22
|
560
|
100
|
|
560
|
|
1011
|
css_string => sub { $basis->list_from_css(@_) if $basis->is_css_string(@_) }, |
|
23
|
67
|
|
|
|
|
758
|
); |
|
24
|
|
|
|
|
|
|
# which formats we can output |
|
25
|
518
|
|
|
518
|
|
1550
|
my %formats = (list => sub { @_ }, # 1,2,3 |
|
26
|
12
|
|
|
12
|
|
39
|
hash => sub { $basis->key_hash_from_list(@_) }, # { red => 1, green => 2, blue => 3 } |
|
27
|
1
|
|
|
1
|
|
7
|
char_hash => sub { $basis->shortcut_hash_from_list(@_) },# { r =>1, g => 2, b => 3 } |
|
28
|
1
|
|
|
1
|
|
5
|
array => sub { $basis->named_array_from_list(@_) }, # ['rgb',1,2,3] |
|
29
|
42
|
|
|
42
|
|
133
|
string => sub { $basis->named_string_from_list(@_) }, # rgb: 1, 2, 3 |
|
30
|
4
|
|
|
4
|
|
16
|
css_string => sub { $basis->css_string_from_list(@_) }, # rgb(1,2,3) |
|
31
|
67
|
|
|
|
|
633
|
); |
|
32
|
|
|
|
|
|
|
|
|
33
|
67
|
|
|
|
|
417
|
bless { basis => $basis, shape => $shape, format => \%formats, deformat => \%deformats, convert => {} }; |
|
34
|
|
|
|
|
|
|
} |
|
35
|
6607
|
|
|
6607
|
0
|
11405
|
sub basis { $_[0]{'basis'}} |
|
36
|
1738
|
|
|
1738
|
0
|
17093
|
sub name { $_[0]->basis->name } |
|
37
|
3006
|
|
|
3006
|
0
|
4002
|
sub dimensions { $_[0]->basis->count } |
|
38
|
815
|
|
|
815
|
0
|
1302
|
sub is_array { $_[0]->basis->is_array( $_[1] ) } |
|
39
|
3
|
|
|
3
|
0
|
10
|
sub is_partial_hash { $_[0]->basis->is_partial_hash( $_[1] ) } |
|
40
|
620
|
100
|
66
|
620
|
0
|
3630
|
sub has_format { (defined $_[1] and exists $_[0]{'format'}{ lc $_[1] }) ? 1 : 0 } |
|
41
|
390
|
100
|
66
|
390
|
0
|
5856
|
sub can_convert { (defined $_[1] and exists $_[0]{'convert'}{ uc $_[1] }) ? 1 : 0 } |
|
42
|
|
|
|
|
|
|
|
|
43
|
|
|
|
|
|
|
######################################################################## |
|
44
|
|
|
|
|
|
|
|
|
45
|
106
|
|
|
106
|
0
|
9892
|
sub delta { shift->{'shape'}->delta( @_ ) } # @values -- @vector, @vector --> |@vector # on normalize values |
|
46
|
282
|
|
|
282
|
0
|
11724
|
sub check { shift->{'shape'}->check( @_ ) } # @values -- @range --> ? # pos if carp |
|
47
|
256
|
|
|
256
|
0
|
31543
|
sub clamp { shift->{'shape'}->clamp( @_ ) } # @values -- @range --> |@vector |
|
48
|
234
|
|
|
234
|
0
|
527
|
sub normalize { shift->{'shape'}->normalize(@_)} # @values -- @range --> |@vector |
|
49
|
597
|
|
|
597
|
0
|
3515
|
sub denormalize{ shift->{'shape'}->denormalize(@_)} # @values -- @range --> |@vector |
|
50
|
94
|
|
|
94
|
0
|
205
|
sub denormalize_range{ shift->{'shape'}->denormalize_range(@_)} # @values -- @range --> |@vector |
|
51
|
|
|
|
|
|
|
|
|
52
|
|
|
|
|
|
|
######################################################################## |
|
53
|
|
|
|
|
|
|
|
|
54
|
|
|
|
|
|
|
sub add_formatter { |
|
55
|
9
|
|
|
9
|
0
|
24
|
my ($self, $format, $code) = @_; |
|
56
|
9
|
50
|
33
|
|
|
81
|
return 0 if not defined $format or ref $format or ref $code ne 'CODE'; |
|
|
|
|
33
|
|
|
|
|
|
57
|
9
|
50
|
|
|
|
27
|
return 0 if $self->has_format( $format ); |
|
58
|
9
|
|
|
|
|
35
|
$self->{'format'}{ $format } = $code; |
|
59
|
|
|
|
|
|
|
} |
|
60
|
|
|
|
|
|
|
sub format { |
|
61
|
604
|
|
|
604
|
0
|
8340
|
my ($self, $values, $format) = @_; |
|
62
|
604
|
50
|
|
|
|
944
|
return unless $self->basis->is_array( $values ); |
|
63
|
604
|
100
|
|
|
|
1107
|
$self->{'format'}{ lc $format }->(@$values) if $self->has_format( $format ); |
|
64
|
|
|
|
|
|
|
} |
|
65
|
|
|
|
|
|
|
|
|
66
|
|
|
|
|
|
|
sub add_deformatter { |
|
67
|
17
|
|
|
17
|
0
|
394
|
my ($self, $format, $code) = @_; |
|
68
|
17
|
50
|
33
|
|
|
183
|
return 0 if not defined $format or ref $format or exists $self->{'deformat'}{$format} or ref $code ne 'CODE'; |
|
|
|
|
33
|
|
|
|
|
|
|
|
|
33
|
|
|
|
|
|
69
|
17
|
|
|
|
|
64
|
$self->{'deformat'}{ lc $format } = $code; |
|
70
|
|
|
|
|
|
|
} |
|
71
|
|
|
|
|
|
|
sub deformat { |
|
72
|
706
|
|
|
706
|
0
|
25524
|
my ($self, $values) = @_; |
|
73
|
706
|
50
|
|
|
|
1434
|
return undef unless defined $values; |
|
74
|
706
|
|
|
|
|
772
|
for my $deformatter (values %{$self->{'deformat'}}){ |
|
|
706
|
|
|
|
|
1553
|
|
|
75
|
2866
|
|
|
|
|
4282
|
my @values = $deformatter->($values); |
|
76
|
2866
|
100
|
|
|
|
4469
|
return @values if @values == $self->dimensions; |
|
77
|
|
|
|
|
|
|
} |
|
78
|
458
|
|
|
|
|
834
|
return undef; |
|
79
|
|
|
|
|
|
|
} |
|
80
|
|
|
|
|
|
|
|
|
81
|
|
|
|
|
|
|
######################################################################## |
|
82
|
|
|
|
|
|
|
|
|
83
|
|
|
|
|
|
|
sub add_converter { |
|
84
|
59
|
|
|
59
|
0
|
137
|
my ($self, $space_name, $to_code, $from_code, $mode) = @_; |
|
85
|
59
|
50
|
33
|
|
|
450
|
return 0 if not defined $space_name or ref $space_name or ref $from_code ne 'CODE' or ref $to_code ne 'CODE'; |
|
|
|
|
33
|
|
|
|
|
|
|
|
|
33
|
|
|
|
|
|
86
|
59
|
50
|
|
|
|
141
|
return 0 if $self->can_convert( $space_name ); |
|
87
|
59
|
|
|
|
|
326
|
$self->{'convert'}{ uc $space_name } = { from => $from_code, to => $to_code, mode => $mode }; |
|
88
|
|
|
|
|
|
|
} |
|
89
|
|
|
|
|
|
|
sub convert { |
|
90
|
144
|
|
|
144
|
0
|
26695
|
my ($self, $values, $space_name) = @_; |
|
91
|
144
|
50
|
33
|
|
|
350
|
return unless $self->{'basis'}->is_array( $values ) and defined $space_name; |
|
92
|
144
|
50
|
|
|
|
317
|
$self->{'convert'}{ uc $space_name }{'to'}->(@$values) if $self->can_convert( $space_name ); |
|
93
|
|
|
|
|
|
|
} |
|
94
|
|
|
|
|
|
|
|
|
95
|
|
|
|
|
|
|
sub deconvert { |
|
96
|
179
|
|
|
179
|
0
|
26091
|
my ($self, $values, $space_name) = @_; |
|
97
|
179
|
50
|
33
|
|
|
652
|
return unless ref $values eq 'ARRAY' and defined $space_name; |
|
98
|
179
|
50
|
|
|
|
329
|
$self->{'convert'}{ uc $space_name }{'from'}->(@$values) if $self->can_convert( $space_name ); |
|
99
|
|
|
|
|
|
|
} |
|
100
|
|
|
|
|
|
|
|
|
101
|
|
|
|
|
|
|
1; |