The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

pp_add_exported('', 'delta_e_2000');

$PDL::Graphics::ColorDistance::VERSION = '0.0.1';

pp_setversion("'$PDL::Graphics::ColorDistance::VERSION'");

pp_addpm({At=>'Top'}, <<'EOD');

=encoding utf-8

=head1 NAME

PDL::Graphics::ColorDistance

=head1 VERSION

0.0.1

=head1 DESCRIPTION

This is a PDL implementation of the CIEDE2000 color difference formula.

=head1 SYNOPSIS

    use PDL::LiteF;
    use PDL::Graphics::ColorDistance;

    my $lab1 = pdl([ 50, 2.6772, -79.7751 ]);
    my $lab2 = pdl([ 50, 0,      -82.7485 ]);
    my $delta_e = delta_e_2000($lab1, $lab2);

    # $delta_e == 2.0425;

=cut

use strict;
use warnings;

use Carp;
use PDL::LiteF;

$PDL::onlinedoc->scan(__FILE__) if $PDL::onlinedoc;

EOD

pp_addhdr('
#include <math.h>
#include "color_distance.h"  /* Local decs */
'
);

pp_def('delta_e_2000',
    Pars => 'double lab1(c=3); double lab2(c=3); double [o]delta_e()',
    Code => '
        deltaE2000( $P(lab1), $P(lab2), $P(delta_e) );
    ',

    HandleBad => 1,
    BadCode => '
        /* First check for bad values */
        if ($ISBAD(lab1(c=>0)) || $ISBAD(lab1(c=>1)) || $ISBAD(lab1(c=>2)) ||
            $ISBAD(lab2(c=>0)) || $ISBAD(lab2(c=>1)) || $ISBAD(lab2(c=>2))) {
            loop (c) %{
                $SETBAD(lab1());
                $SETBAD(lab2());
            %}
            /* skip to the next triple */
        }
        else {
            deltaE2000( $P(lab1), $P(lab2), $P(delta_e) );
        }
    ',

    Doc => <<'DOCUMENTATION',

=for ref

Calculates the ΔE*00 (delta e, color distance) between two Lab colors

=for usage

Usage:

    my $delta_e = delta_e_2000($lab1, $lab2);

DOCUMENTATION
    BadDoc => <<BADDOC,

If C<delta_e_2000> encounters a bad value in any of the L, a, or b values the input values will be marked as bad

BADDOC
);


pp_addpm(<<'EOD');

=head1 DEVELOPMENT

This module is being developed via a git repository publicly available at http://github.com/ewaters/perl-PDL-Graphics-ColorDistance.

=head1 COPYRIGHT

Copyright (c) 2013 Eric Waters and Shutterstock Images (http://shutterstock.com).  All rights reserved.  This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

The full text of the license can be found in the LICENSE file included with this module.

=head1 AUTHOR

Eric Waters <ewaters@gmail.com>

=cut

EOD

pp_done();