File: color_space.t

package info (click to toggle)
libpdl-graphics-colorspace-perl 0.206-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 172 kB
  • sloc: perl: 537; ansic: 274; makefile: 3
file content (151 lines) | stat: -rw-r--r-- 6,223 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
use strict;
use warnings;

use Test::More;
use PDL::LiteF;
use PDL::Graphics::ColorSpace;
use Test::PDL;

my $rgb = pdl( [255,255,255],[0,0,0],[255,10,50],[1,48,199] ) / 255;
my $hsl = pdl( [0,0,1], [0,0,0], [350.204081632653,1,0.519607843137255], [225.757575757576,0.99,0.392156862745098] );
my $rgb_bad = $rgb->copy->setbadat(1,2);

# rgb_to_hsl   hsl_to_rgb
{
	is_pdl rgb_to_hsl( $rgb ), $hsl, 'rgb_to_hsl';
	is_pdl hsl_to_rgb( $hsl ), $rgb, 'hsl_to_rgb';
	is_pdl rgb_to_hsl($rgb_bad), pdl('0 0 1; 0 0 0; BAD BAD BAD; 225.75758 0.99 0.39215686'), 'rgb_to_hsl with bad value';
	is_pdl hsl_to_rgb($hsl->copy->setbadat(0,3)), pdl('1 1 1; 0 0 0; 1 0.039215686 0.19607843; BAD BAD BAD'), 'hsl_to_rgb with bad value';
}

# rgb_to_cmyk   cmyk_to_rgb
{
	my $cmyk = pdl(
		[0,0,0,0],
		[0,0,0,1],
		[0,0.960784313725491,0.803921568627451,1.11022302462516e-16],
		[0.776470588235295, 0.592156862745098, 0, 0.219607843137255]
	);
	is_pdl rgb_to_cmyk( $rgb ), $cmyk, 'rgb_to_cmyk';
	is_pdl cmyk_to_rgb( $cmyk ), $rgb, 'cmyk_to_rgb';
	is_pdl rgb_to_cmyk($rgb_bad), pdl('0 0 0 0; 0 0 0 1; BAD BAD BAD BAD; 0.77647059 0.59215686 0 0.21960784'), 'rgb_to_cmyk with bad value';
	is_pdl cmyk_to_rgb($cmyk->copy->setbadat(0,3)), pdl('1 1 1; 0 0 0; 1 0.039215686 0.19607843; BAD BAD BAD'), 'cmyk_to_rgb with bad value';
}

# rgb_to_hsv   hsv_to_rgb
{
	my $hsv = pdl( [0,0,1], [0,0,0], [350.204081632653,0.960784313725491,1], [225.757575757576,0.994974874371861,0.780392156862745] );
	is_pdl rgb_to_hsv( $rgb ), $hsv, 'rgb_to_hsv';
	is_pdl hsv_to_rgb( $hsv ), $rgb, 'hsv_to_rgb';
	is_pdl rgb_to_hsv($rgb_bad), pdl('0 0 1; 0 0 0; BAD BAD BAD; 225.75758 0.99497487 0.78039216'), 'rgb_to_hsv with bad value';
	is_pdl hsv_to_rgb($hsv->copy->setbadat(0,3)), pdl('1 1 1; 0 0 0; 1 0.039215686 0.19607843; BAD BAD BAD'), 'hsv_to_rgb with bad value';
}

# rgb_to_xyz and rgb_{to,from}_linear
{
	my $xyz = pdl( [0.950467757575757, 1, 1.08897436363636],
	  [0,0,0],
	  [0.419265223936783, 0.217129144548417, 0.0500096992920757],
	  [0.113762127389896, 0.0624295703768394, 0.546353858701224] );
	my $linear_ans = pdl( [1,1,1],[0,0,0],
	  [1, 0.0030352698, 0.031896033],
	  [0.00030352698, 0.029556834, 0.57112483] );
	is_pdl rgb_to_xyz( $rgb, 'sRGB' ), $xyz, 'rgb_to_xyz sRGB';
	my $rgb_linear = rgb_to_linear($rgb, -1);
	is_pdl $rgb_linear, $linear_ans, 'rgb_to_linear sRGB';
	is_pdl rgb_from_linear($rgb_linear, -1), $rgb, 're-rgb_from_linear sRGB';
	is_pdl rgb_to_xyz( $rgb_linear, 'lsRGB' ), $xyz, 'rgb_to_xyz lsRGB';
	is_pdl xyz_to_rgb( $xyz, 'sRGB' ), $rgb, 'xyz_to_rgb sRGB';
	my $rgb_ = pdl(255, 10, 50) / 255;
	my $ans = pdl( 0.582073320819542, 0.299955362786115, 0.0546021884576833 );
	is_pdl rgb_to_xyz( $rgb_, 'Adobe' ), $ans, 'rgb_to_xyz Adobe';
	$rgb_->inplace->rgb_to_xyz( 'Adobe' );
	is_pdl $rgb_, $ans, 'rgb_to_xyz inplace';
}

is_pdl xyY_to_xyz(pdl(0.312713, 0.329016, 1)), pdl(0.950449218275099, 1, 1.08891664843047), 'xyY_to_xyz';

# xyz_to_lab  lab_to_xyz
{
	my $xyz = pdl([0.4, 0.2, 0.02], [0,0,1]);
	my $lab = pdl([51.8372115265385, 82.2953523409701, 64.1921650722979], [0,0,-166.814773017556]);
	is_pdl $xyz->xyz_to_lab('sRGB'), $lab, 'xyz_to_lab sRGB';
	is_pdl $lab->lab_to_xyz('sRGB'), $xyz, 'lab_to_xyz sRGB';
	is_pdl $lab->lab_to_xyz($PDL::Graphics::ColorSpace::RGBSpace::RGB_SPACE->{sRGB}), $xyz, 'lab_to_xyz with hash-ref';
	is_pdl $xyz->copy->setbadat(0,1)->xyz_to_lab('sRGB'), pdl('51.837212 82.295352 64.192165; BAD BAD BAD'), 'xyz_to_lab sRGB with bad value';
	is_pdl $lab->copy->setbadat(0,1)->lab_to_xyz('sRGB'), pdl('0.4 0.2 0.02; BAD BAD BAD'), 'lab_to_xyz sRGB with bad value';
}


# lab_to_lch and lch_to_lab
{
	my $lab = pdl([53.380244, 79.817473, 64.822569], [0,0,1]);
	my $lch = pdl([53.380244, 102.824094685368, 39.081262060261], [0,1,90]);
	is_pdl lab_to_lch($lab), $lch, 'lab_to_lch';
	is_pdl lch_to_lab($lch), $lab, 'lch_to_lab';
}

# rgb_to_lch
{
	my $rgb = pdl([25, 10, 243], [0,0,1]) / 255;
	my $lch = pdl([31.5634666908367, 126.828356633829, 306.221274674578],
		          [ 0.0197916632671635, 0.403227926549451, 290.177020167939 ]);
	is_pdl rgb_to_lch($rgb, 'sRGB'), $lch, 'rgb_to_lch sRGB';
	is_pdl lch_to_rgb($lch, 'sRGB'), $rgb, 'lch_to_rgb sRGB';
	is_pdl $rgb->copy->setbadat(1,1)->rgb_to_lch('sRGB'), pdl('31.563467 126.82836 306.22127; BAD BAD BAD'), 'rgb_to_lch sRGB with bad value';
	is_pdl $lch->copy->setbadat(1,1)->lch_to_rgb('sRGB'), pdl('0.098039216 0.039215686 0.95294118; BAD BAD BAD'), 'lch_to_rgb sRGB with bad value';
}

# rgb_to_lab
{
	my $rgb = pdl([25, 10, 243], [0,0,1]) / 255;
	my $lab = pdl([31.5634666908367, 74.943543, -102.31763],
		          [ 0.0197916632671635, 0.13908209, -0.37848241]);
	is_pdl rgb_to_lab($rgb, 'sRGB'), $lab, 'rgb_to_lab sRGB';
	is_pdl lab_to_rgb($lab, 'sRGB'), $rgb, 'lab_to_rgb sRGB';
	is_pdl $rgb->copy->setbadat(1,1)->rgb_to_lab('sRGB'), pdl('31.563467 74.943543 -102.31763; BAD BAD BAD'), 'rgb_to_lab sRGB with bad value';
	is_pdl $lab->copy->setbadat(1,1)->lab_to_rgb('sRGB'), pdl('0.098039195 0.039215694 0.95294118; BAD BAD BAD'), 'lab_to_rgb sRGB with bad value';
}

# add_rgb_space
{
	my %custom_space = (
		custom_1 => {
          'gamma' => '2.2',
          'm' => [
                   [
                     '0.467384242424242',
                     '0.240995',
                     '0.0219086363636363'
                   ],
                   [
                     '0.294454030769231',
                     '0.683554',
                     '0.0736135076923076'
                   ],
                   [
                     '0.18863',
                     '0.075452',
                     '0.993451333333334'
                   ]
                 ],
          'white_point' => [
                             '0.312713',
                             '0.329016'
                           ],
		},
	);

	PDL::Graphics::ColorSpace::add_rgb_space( \%custom_space );

	my $rgb = pdl([25, 10, 243], [0,0,1]) / 255;

	# custom_1 is in fact copied from BruceRGB
	my $a_lch = rgb_to_lch($rgb, 'BruceRGB');
	my $lch = rgb_to_lch($rgb, 'custom_1');
	is_pdl $a_lch, $lch, 'rgb_to_lch with add_rgb_space';
	eval {PDL::Graphics::ColorSpace::add_rgb_space( \%custom_space )};
        like $@, qr/existing/, 'add duplicate croaks';
}

done_testing();