package PDL::Graphics::ColorSpace::RGBSpace;
use strict;
use warnings;
use Carp;
=head1 NAME
PDL::Graphics::ColorSpace::RGBSpace -- defines RGB space conversion parameters and white points.
=head1 DESCRIPTION
Sourced from Graphics::ColorObject (Izvorski & Reibenschuh, 2005).
=head1 Usage
use Data::Dumper;
print Dumper $PDL::Graphics::ColorSpace::RGBSpace::RGB_SPACE;
print Dumper $PDL::Graphics::ColorSpace::RGBSpace::WHITE_POINT;
=cut
our $WHITE_POINT = {
'D50' => [
'0.34567',
'0.3585'
],
'A' => [
'0.44757',
'0.40745'
],
'D75' => [
'0.29902',
'0.31485'
],
'D55' => [
'0.33242',
'0.34743'
],
'D65' => [
'0.312713',
'0.329016'
],
'E' => [
'0.333333',
'0.333333'
],
'B' => [
'0.34842',
'0.35161'
],
'F11' => [
'0.38054',
'0.37691'
],
'F2' => [
'0.37207',
'0.37512'
],
'C' => [
'0.310063',
'0.316158'
],
'D93' => [
'0.2848',
'0.2932'
],
'F7' => [
'0.31285',
'0.32918'
]
};
our $RGB_SPACE = {
'BruceRGB' => {
'gamma' => '2.2',
'mstar' => [
[
'2.74565437614039',
'-0.969256810842655',
'0.0112706581772173'
],
[
'-1.1358911781912',
'1.87599300082369',
'-0.113958877125197'
],
[
'-0.435056564214666',
'0.0415556222493375',
'1.01310694059653'
]
],
'm' => [
[
'0.467384242424242',
'0.240995',
'0.0219086363636363'
],
[
'0.294454030769231',
'0.683554',
'0.0736135076923076'
],
[
'0.18863',
'0.075452',
'0.993451333333334'
]
],
'white_point' => $WHITE_POINT->{'D65'},
},
'Adobe RGB (1998)' => {
'gamma' => '2.2',
'mstar' => [
[
'2.04147788287772',
'-0.969256870874686',
'0.0134454339800522'
],
[
'-0.564976526119188',
'1.87599311701547',
'-0.118372546216537'
],
[
'-0.34471277324621',
'0.0415556248231326',
'1.01526208347413'
]
],
'm' => [
[
'0.576700121212121',
'0.297361',
'0.0270328181818181'
],
[
'0.185555704225352',
'0.627355',
'0.0706878873239437'
],
[
'0.1882125',
'0.075285',
'0.9912525'
]
],
'white_point' => $WHITE_POINT->{'D65'},
},
'WideGamut' => {
'gamma' => '2.2',
'mstar' => [
[
'1.46280876111587',
'-0.521793192978599',
'0.0349338148323482'
],
[
'-0.184062599070901',
'1.44723772392177',
'-0.0968919015161355'
],
[
'-0.274361028741716',
'0.0677227300206644',
'1.28839528723064'
]
],
'm' => [
[
'0.716103566037736',
'0.258187',
'0'
],
[
'0.100929624697337',
'0.724938',
'0.0517812857142858'
],
[
'0.1471875',
'0.016875',
'0.7734375'
]
],
'white_point' => $WHITE_POINT->{'D50'},
},
'NTSC' => {
'gamma' => '2.2',
'mstar' => [
[
'1.91049094509024',
'-0.984310618506658',
'0.0583742441336926'
],
[
'-0.53259210489728',
'1.99844883151352',
'-0.118517404756285'
],
[
'-0.288283799898528',
'-0.0282979742694222',
'0.898609576361084'
]
],
'm' => [
[
'0.606733727272727',
'0.298839',
'-1e-16'
],
[
'0.173563816901409',
'0.586811',
'0.0661195492957747'
],
[
'0.2001125',
'0.11435',
'1.1149125'
]
],
'white_point' => $WHITE_POINT->{'C'},
},
'Ekta Space PS5' => {
'gamma' => '2.2',
'mstar' => [
[
'2.00437873609682',
'-0.711029017049311',
'0.0381257297502959'
],
[
'-0.730483256478366',
'1.62021366180089',
'-0.0868766628736253'
],
[
'-0.245004796257919',
'0.0792227384931296',
'1.27252435691152'
]
],
'm' => [
[
'0.59389231147541',
'0.260629',
'0'
],
[
'0.272979942857143',
'0.734946',
'0.0419969142857143'
],
[
'0.09735',
'0.004425',
'0.783225'
]
],
'white_point' => $WHITE_POINT->{'D50'},
},
'PAL/SECAM' => {
'gamma' => '2.2',
'mstar' => [
[
'3.06313080780361',
'-0.969257031353275',
'0.0678676345258901'
],
[
'-1.3932854294802',
'1.87599342762119',
'-0.228821478155597'
],
[
'-0.475787968862948',
'0.0415556317034429',
'1.06919338982591'
]
],
'm' => [
[
'0.430586181818182',
'0.222021',
'0.0201837272727273'
],
[
'0.341545083333333',
'0.706645',
'0.129551583333333'
],
[
'0.178335',
'0.071334',
'0.939231'
]
],
'white_point' => $WHITE_POINT->{'D65'},
},
'Apple RGB' => {
'gamma' => '1.8',
'mstar' => [
[
'2.95176033980206',
'-1.08510012648728',
'0.0854802409232915'
],
[
'-1.28950900724704',
'1.9908397072633',
'-0.2694550155056'
],
[
'-0.473880286660678',
'0.0372022452865781',
'1.09113013413848'
]
],
'm' => [
[
'0.449694852941176',
'0.244634',
'0.0251829117647059'
],
[
'0.316251294117647',
'0.672034',
'0.141183613445378'
],
[
'0.184520857142857',
'0.083332',
'0.922604285714286'
]
],
'white_point' => $WHITE_POINT->{'D65'},
},
'sRGB' => {
'gamma' => '-1', # mark it for special case
'mstar' => [
[
'3.24071094399417',
'-0.969258109065483',
'0.0556349466243886'
],
[
'-1.53726031958698',
'1.87599551352921',
'-0.203994804289425'
],
[
'-0.498570914460642',
'0.0415556779089489',
'1.05706398586338'
]
],
'm' => [
[
'0.412423757575757',
'0.212656',
'0.0193323636363636'
],
[
'0.357579',
'0.715158',
'0.119193'
],
[
'0.180465',
'0.072186',
'0.950449'
]
],
'white_point' => $WHITE_POINT->{'D65'},
},
'ColorMatch' => {
'gamma' => '1.8',
'mstar' => [
[
'2.64228725945873',
'-1.11197540964573',
'0.0821692807629542'
],
[
'-1.22342696462069',
'2.05901666762151',
'-0.280723441849461'
],
[
'-0.393014279448075',
'0.0159613695164458',
'1.45597744493852'
]
],
'm' => [
[
'0.509343882352941',
'0.274884',
'0.0242544705882353'
],
[
'0.320907338842975',
'0.658132',
'0.108782148760331'
],
[
'0.13397',
'0.066985',
'0.692178333333333'
]
],
'white_point' => $WHITE_POINT->{'D50'},
},
'SMPTE-C' => {
'gamma' => '2.2',
'mstar' => [
[
'3.50569560396941',
'-1.06906411585768',
'0.056311654337365'
],
[
'-1.73963804628462',
'1.97780951196929',
'-0.196993365173273'
],
[
'-0.54401052306495',
'0.0351719640259221',
'1.0500467308791'
]
],
'm' => [
[
'0.393555441176471',
'0.212395',
'0.0187407352941176'
],
[
'0.365252420168067',
'0.701049',
'0.111932193277311'
],
[
'0.191659714285714',
'0.086556',
'0.958298571428571'
]
],
'white_point' => $WHITE_POINT->{'D65'},
},
'CIE' => {
'gamma' => '2.2',
'mstar' => [
[
'2.37068020229465',
'-0.513884773083019',
'0.0052981111618865'
],
[
'-0.900042762577686',
'1.42530304987177',
'-0.0146947611471193'
],
[
'-0.470634962281563',
'0.088581346669925',
'1.00938458712529'
]
],
'm' => [
[
'0.488716754716981',
'0.176204',
'0'
],
[
'0.310680460251046',
'0.812985',
'0.0102048326359833'
],
[
'0.200604111111111',
'0.010811',
'0.989807111111111'
]
],
'white_point' => $WHITE_POINT->{'E'},
},
'ProPhoto' => {
'gamma' => '1.8',
'mstar' => [
[
'1.3459444124134',
'-0.544598943846181',
'-0'
],
[
'-0.255607720396453',
'1.50816752372329',
'-0'
],
[
'-0.0511118080787822',
'0.0205351443915685',
'1.2070909349885'
]
],
'm' => [
[
'0.797674285714286',
'0.28804',
'0'
],
[
'0.135191683008091',
'0.711874',
'0'
],
[
'0.031476',
'8.6e-05',
'0.828438'
]
],
'white_point' => $WHITE_POINT->{'D50'},
},
'BestRGB' => {
'gamma' => '2.2',
'mstar' => [
[
'1.75525888974901',
'-0.544133847258114',
'0.0063467101890703'
],
[
'-0.483678273936868',
'1.50687952348487',
'-0.0175760572028268'
],
[
'-0.252999899496505',
'0.0215528345168675',
'1.22569016415407'
]
],
'm' => [
[
'0.632670026008293',
'0.228457',
'0'
],
[
'0.204555716129032',
'0.737352',
'0.0095142193548387'
],
[
'0.126995142857143',
'0.034191',
'0.815699571428571'
]
],
'white_point' => $WHITE_POINT->{'D50'},
},
'DonRGB4' => {
'gamma' => '2.2',
'mstar' => [
[
'1.76038788466061',
'-0.712628997581103',
'0.0078207770365325'
],
[
'-0.488119149776404',
'1.65274365376055',
'-0.0347412748629646'
],
[
'-0.253612281154138',
'0.0416715470705678',
'1.24478041036567'
]
],
'm' => [
[
'0.645772',
'0.27835',
'0.0037113333333334'
],
[
'0.193351045751634',
'0.68797',
'0.0179861437908497'
],
[
'0.125097142857143',
'0.03368',
'0.803508571428572'
]
],
'white_point' => $WHITE_POINT->{'D50'},
},
'Beta RGB' => {
'gamma' => '2.2',
'mstar' => [
[
'1.68322461050127',
'-0.771022999934446',
'0.0400016919321019'
],
[
'-0.428235686922801',
'1.70655733404514',
'-0.0885384492378917'
],
[
'-0.236018152270938',
'0.0446899574535591',
'1.27237682509323'
]
],
'm' => [
[
'0.67125463496144',
'0.303273',
'1e-16'
],
[
'0.1745833659118',
'0.663786',
'0.0407009558998808'
],
[
'0.11838171875',
'0.032941',
'0.784501144886363'
]
],
'white_point' => $WHITE_POINT->{'D50'},
},
'ECI' => {
'gamma' => '1.8',
'mstar' => [
[
'1.78276097904707',
'-0.959362431268921',
'0.0859317810050046'
],
[
'-0.496984518455576',
'1.94779645136417',
'-0.174467555373797'
],
[
'-0.269009968705312',
'-0.0275807381172883',
'1.32282862880431'
]
],
'm' => [
[
'0.650204545454545',
'0.32025',
'-1e-16'
],
[
'0.178077338028169',
'0.602071',
'0.067838985915493'
],
[
'0.13593825',
'0.077679',
'0.75737025'
]
],
'white_point' => $WHITE_POINT->{'D50'},
},
};
# aliases
$RGB_SPACE->{'Adobe'} = $RGB_SPACE->{'Adobe RGB (1998)'};
$RGB_SPACE->{'601'} = $RGB_SPACE->{'NTSC'};
$RGB_SPACE->{'Apple'} = $RGB_SPACE->{'Apple RGB'};
$RGB_SPACE->{'CIE ITU'} = $RGB_SPACE->{'PAL/SECAM'};
$RGB_SPACE->{'PAL'} = $RGB_SPACE->{'PAL/SECAM'};
$RGB_SPACE->{'709'} = $RGB_SPACE->{'sRGB'};
$RGB_SPACE->{'SMPTE'} = $RGB_SPACE->{'SMPTE-C'};
$RGB_SPACE->{'CIE Rec 709'} = $RGB_SPACE->{'sRGB'};
$RGB_SPACE->{'CIE Rec 601'} = $RGB_SPACE->{'NTSC'};
sub add_rgb_space {
my ($new_space) = @_;
while (my ($name, $profile) = each %$new_space) {
croak "There is an existing RGB space definition with the same name: $name"
if $RGB_SPACE->{$name};
for (keys %{ $RGB_SPACE->{'sRGB'} }) {
carp "Missing definition for custom RGB space $name: $_"
unless defined $profile->{$_};
}
$RGB_SPACE->{$name} = $profile;
}
}
1;