summaryrefslogtreecommitdiffstats
path: root/lib/Image/PNM.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Image/PNM.pm')
-rw-r--r--lib/Image/PNM.pm43
1 files changed, 43 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) = @_;