The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
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;