summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2014-10-07 16:10:11 -0400
committerJesse Luehrs <doy@tozt.net>2014-10-07 16:10:11 -0400
commitdbb201d59ead46aec1d280fe753dcb36fdd767a0 (patch)
tree3ea55a16ea0bc0f6837cdc9f72e566f21b7bc8b1
parent3b5bc86786a56b9437d1e6ac5a3de786110d731e (diff)
downloadimage-pnm-dbb201d59ead46aec1d280fe753dcb36fdd767a0.tar.gz
image-pnm-dbb201d59ead46aec1d280fe753dcb36fdd767a0.zip
implement P6
-rw-r--r--lib/Image/PNM.pm43
-rw-r--r--t/P1.t7
-rw-r--r--t/P2.t7
-rw-r--r--t/P3.t7
-rw-r--r--t/P4.t7
-rw-r--r--t/P5.t7
-rw-r--r--t/P6.t77
-rw-r--r--t/data/P6.ppmbin0 -> 194 bytes
8 files changed, 155 insertions, 0 deletions
diff --git a/lib/Image/PNM.pm b/lib/Image/PNM.pm
index 4deca51..42121da 100644
--- a/lib/Image/PNM.pm
+++ b/lib/Image/PNM.pm
@@ -191,6 +191,24 @@ HEADER
return $data;
}
+sub _as_string_P6 {
+ my $self = shift;
+
+ my $data = <<HEADER;
+P6
+$self->{w} $self->{h}
+$self->{max}
+HEADER
+
+ for my $row (@{ $self->{pixels} }) {
+ $data .= pack("C*", map {
+ ref($_) ? @$_ : ($_, $_, $_)
+ } @$row);
+ }
+
+ return $data;
+}
+
sub _parse_string {
my $self = shift;
my ($string) = @_;
@@ -345,6 +363,31 @@ sub _parse_pnm_P5 {
}
}
+sub _parse_pnm_P6 {
+ 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->(),
+ $next_word->(),
+ $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 325f87e..adf267e 100644
--- a/t/P1.t
+++ b/t/P1.t
@@ -67,4 +67,11 @@ P5
\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x01\x01\x01\x00\x01\x01\x00\x01\x00\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x01\x01\x00\x00\x01\x01\x01\x01\x00\x01\x01\x01\x01\x01\x01
IMAGE
+is($image->as_string('P6') . "\n", <<IMAGE);
+P6
+6 8
+1
+\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x01\x01\x01\x01\x01\x01\x00\x00\x00\x01\x01\x01\x00\x00\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01
+IMAGE
+
done_testing;
diff --git a/t/P2.t b/t/P2.t
index 88efe59..3dab275 100644
--- a/t/P2.t
+++ b/t/P2.t
@@ -67,4 +67,11 @@ P5
\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x4e\xff\xff\xff\x00\xff\xff\x00\xff\x00\xff\xff\xff\xff\x00\x00\x36\x36\x36\x36\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff
IMAGE
+is($image->as_string('P6') . "\n", <<IMAGE);
+P6
+6 8
+255
+\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x4e\x4e\x4e\x4e\x4e\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\xff\xff\xff\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff
+IMAGE
+
done_testing;
diff --git a/t/P3.t b/t/P3.t
index 3a60aa0..a8f848d 100644
--- a/t/P3.t
+++ b/t/P3.t
@@ -67,4 +67,11 @@ P5
\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x4e\xff\xff\xff\x00\xff\xff\x00\xff\x00\xff\xff\xff\xff\x00\x00\x36\x36\x36\x36\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff
IMAGE
+is($image->as_string('P6') . "\n", <<IMAGE);
+P6
+6 8
+255
+\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x54\xff\x00\x54\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\xff\xff\xff\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\xff\x00\x00\xff\x00\x00\xff\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff
+IMAGE
+
done_testing;
diff --git a/t/P4.t b/t/P4.t
index 7c68665..3b6985e 100644
--- a/t/P4.t
+++ b/t/P4.t
@@ -67,4 +67,11 @@ P5
\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x01\x01\x01\x00\x01\x01\x00\x01\x00\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x01\x01\x00\x00\x01\x01\x01\x01\x00\x01\x01\x01\x01\x01\x01
IMAGE
+is($image->as_string('P6') . "\n", <<IMAGE);
+P6
+6 8
+1
+\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x01\x01\x01\x01\x01\x01\x00\x00\x00\x01\x01\x01\x00\x00\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01
+IMAGE
+
done_testing;
diff --git a/t/P5.t b/t/P5.t
index bbd0cbf..87990ae 100644
--- a/t/P5.t
+++ b/t/P5.t
@@ -67,4 +67,11 @@ P5
\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x4e\xff\xff\xff\x00\xff\xff\x00\xff\x00\xff\xff\xff\xff\x00\x00\x36\x36\x36\x36\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff
IMAGE
+is($image->as_string('P6') . "\n", <<IMAGE);
+P6
+6 8
+255
+\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x4e\x4e\x4e\x4e\x4e\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\xff\xff\xff\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff
+IMAGE
+
done_testing;
diff --git a/t/P6.t b/t/P6.t
new file mode 100644
index 0000000..f90fce0
--- /dev/null
+++ b/t/P6.t
@@ -0,0 +1,77 @@
+#!/usr/bin/env perl
+use strict;
+use warnings;
+use Test::More;
+
+use Image::PNM;
+
+my $image = Image::PNM->new('t/data/P6.ppm');
+
+is($image->width, 6);
+is($image->height, 8);
+is($image->max_pixel_value, 255);
+is_deeply($image->raw_pixel(1, 2), [0, 84, 255]);
+is_deeply($image->pixel(4, 1), [1, 0, 0]);
+
+is($image->as_string('P1'), <<IMAGE);
+P1
+6 8
+0 0 0 0 0 0
+0 0 1 1 0 0
+0 1 0 0 1 0
+1 0 0 0 0 1
+1 1 1 1 1 1
+1 0 0 0 0 1
+1 0 0 0 0 1
+0 0 0 0 0 0
+IMAGE
+
+is($image->as_string('P2'), <<IMAGE);
+P2
+6 8
+255
+255 255 255 255 255 255
+255 255 78 78 255 255
+255 0 255 255 0 255
+0 255 255 255 255 0
+0 54 54 54 54 0
+0 255 255 255 255 0
+0 255 255 255 255 0
+255 255 255 255 255 255
+IMAGE
+
+is($image->as_string('P3'), <<IMAGE);
+P3
+6 8
+255
+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 0 84 255 0 84 255 255 255 255 255 255 255
+255 255 255 0 0 0 255 255 255 255 255 255 0 0 0 255 255 255
+0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0
+0 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 0
+0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0
+0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0
+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+IMAGE
+
+is($image->as_string('P4') . "\n", <<IMAGE);
+P4
+6 8
+\x00\x30\x48\x84\xfc\x84\x84\x00
+IMAGE
+
+is($image->as_string('P5') . "\n", <<IMAGE);
+P5
+6 8
+255
+\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x4e\xff\xff\xff\x00\xff\xff\x00\xff\x00\xff\xff\xff\xff\x00\x00\x36\x36\x36\x36\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff
+IMAGE
+
+is($image->as_string('P6') . "\n", <<IMAGE);
+P6
+6 8
+255
+\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x54\xff\x00\x54\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\xff\xff\xff\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\xff\x00\x00\xff\x00\x00\xff\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff
+IMAGE
+
+done_testing;
diff --git a/t/data/P6.ppm b/t/data/P6.ppm
new file mode 100644
index 0000000..347f26b
--- /dev/null
+++ b/t/data/P6.ppm
Binary files differ