From 3b5bc86786a56b9437d1e6ac5a3de786110d731e Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Tue, 7 Oct 2014 15:58:36 -0400 Subject: implement P5 --- lib/Image/PNM.pm | 44 ++++++++++++++++++++++++++++++++++ t/P1.t | 7 ++++++ t/P2.t | 7 ++++++ t/P3.t | 7 ++++++ t/P4.t | 7 ++++++ t/P5.t | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ t/data/P5.pgm | Bin 0 -> 98 bytes 7 files changed, 142 insertions(+) create mode 100644 t/P5.t create mode 100644 t/data/P5.pgm diff --git a/lib/Image/PNM.pm b/lib/Image/PNM.pm index b927b44..4deca51 100644 --- a/lib/Image/PNM.pm +++ b/lib/Image/PNM.pm @@ -168,6 +168,29 @@ HEADER return $data; } +sub _as_string_P5 { + my $self = shift; + + my $data = <{w} $self->{h} +$self->{max} +HEADER + + for my $row (@{ $self->{pixels} }) { + $data .= pack("C*", map { + if (ref($_)) { + $self->_to_greyscale(@$_) + } + else { + $_ + } + } @$row); + } + + return $data; +} + sub _parse_string { my $self = shift; my ($string) = @_; @@ -301,6 +324,27 @@ sub _parse_pnm_P4 { } } +sub _parse_pnm_P5 { + my ($self) = shift; + my ($next_line) = @_; + + chomp (my $max = $next_line->()); + die "Invalid max color value: $max" + unless $max =~ /^[0-9]+$/ && $max > 0; + $self->{max} = $max; + + my $next_word = $self->_make_next_bitfield($next_line, 0); + + $self->{pixels} = []; + for my $i (1..$self->{h}) { + my $row = []; + for my $j (1..$self->{w}) { + push @$row, $next_word->(); + } + push @{ $self->{pixels} }, $row; + } +} + sub _make_next_word { my $self = shift; my ($next_line, $ws) = @_; diff --git a/t/P1.t b/t/P1.t index 030634b..325f87e 100644 --- a/t/P1.t +++ b/t/P1.t @@ -60,4 +60,11 @@ P4 \x00\x30\x48\x84\xfc\x84\x84\x00 IMAGE +is($image->as_string('P5') . "\n", <as_string('P5') . "\n", <as_string('P5') . "\n", <as_string('P5') . "\n", <new('t/data/P5.pgm'); + +is($image->width, 6); +is($image->height, 8); +is($image->max_pixel_value, 255); +is_deeply($image->raw_pixel(1, 2), [78, 78, 78]); +is_deeply($image->pixel(0, 0), [1, 1, 1]); + +is($image->as_string('P1'), <as_string('P2'), <as_string('P3'), <as_string('P4') . "\n", <as_string('P5') . "\n", <