Revision: 49 Author: matt Date: 2006-08-05 23:29:53 +0000 (Sat, 05 Aug 2006)
Log Message: ----------- Make next/prev links work on images. Use Image::Epeg if it's available for resizing. Modified Paths: -------------- trunk/plugins/demo/gallery Modified: trunk/plugins/demo/gallery =================================================================== --- trunk/plugins/demo/gallery 2006-08-05 23:28:40 UTC (rev 48) +++ trunk/plugins/demo/gallery 2006-08-05 23:29:53 UTC (rev 49) @@ -40,8 +40,10 @@ use RDF::Core::Literal; use RDF::Core::Statement; use RDF::Core::Model::Serializer; -use AxKit2::Utils qw(uri_decode); +use AxKit2::Utils qw(uri_decode uri_encode); +use constant EPEG_AVAILABLE => eval { require Image::Epeg }; + our $DEFAULT_SIZE = '133 640 800 1024'; sub hook_xmlresponse { @@ -67,7 +69,7 @@ my $format = $client->param('format') || 'html'; if ($format eq 'html') { - return $self->serve_html_page($input, $ct); + return $self->serve_image_page($input, $ct); } # Now we just serve the raw image, possibly resized @@ -88,7 +90,8 @@ $client->headers_out->header('Content-Type', $ct); $client->send_http_headers; local $/; - $client->write(<$fh>); + my $out = <$fh>; + $client->write(\$out); return OK; } @@ -115,6 +118,36 @@ $self->log(LOGINFO, "Resizing image $file to size $size"); + my ($type) = $ct =~ /\/(.*)$/; + + my $out; + + if ($type eq 'jpeg' && EPEG_AVAILABLE) { + my $epg = Image::Epeg->new($file); + $epg->resize($size, $size, Image::Epeg::MAINTAIN_ASPECT_RATIO()); + $out = $epg->get_data(); + if (!$out) { + # Epeg didn't work. Resort to Imager anyway + $self->resize_image($size, $file, $type, \$out); + } + } + else { + $self->resize_image($size, $file, $type, \$out); + } + + $cache->set("$file+$size", $out); + + $client->headers_out->header('Content-Length', length($out)); + $client->headers_out->header('Content-Type', $ct); + $client->send_http_headers; + # using ->get here makes sure Cache::Cache expires stuff + $client->write(\$out); + return OK; +} + +sub resize_image { + my ($self, $size, $file, $type, $out) = @_; + my $image = Imager->new; $image->open(file => $file) @@ -126,7 +159,7 @@ my $quality = $self->get_cfg('GalleryThumbQuality') || 'preview'; $quality = 'normal' if $quality ne 'preview'; - $quality = 'normal' if $client->param('size') ne 'thumb'; + $quality = 'normal' if $self->client->param('size') ne 'thumb'; $self->log(LOGINFO, "Scaling to $size"); @@ -144,22 +177,11 @@ coef => [-0.2, 1, -0.2] ) if $quality eq 'normal'; - my $out; - my ($type) = $ct =~ /\/(.*)$/; - $thumb->write(data => \$out, type => $type) + $thumb->write(data => $out, type => $type) or die "Cannot write to scalar: ", $thumb->errstr; - $cache->set("$file+$size", $out); - - - $client->headers_out->header('Content-Length', length($out)); - $client->headers_out->header('Content-Type', $ct); - $client->send_http_headers; - # using ->get here makes sure Cache::Cache expires stuff - $client->write(\$out); - return OK; } -sub serve_html_page { +sub serve_image_page { my ($self, $input, $ct) = @_; $self->log(LOGINFO, "Serving Imagesheet"); @@ -172,6 +194,31 @@ my $path; ($path, $file) = $file =~ /(.*)\/(.*)/; # Extract the path/file info + my $mm = File::MMagic->new; + + opendir(DIR, $path); + my ($prev, $next); + my $found = 0; + while (my $entry = readdir(DIR)) { + print "Entry: $entry\n"; + next if $entry =~ /^\./; + next if -d $entry; + if ($entry eq $file) { + $found++; + next; + } + my $type = $mm->checktype_filename("$path/$entry"); + print "$entry is of type: $type\n"; + next unless $type =~ /^image\//; + if ($found) { + $next = $entry; + last; + } + else { + $prev = $entry; + } + } + my $uri = $self->client->headers_in->request_uri; $uri =~ s/\?.*//; @@ -252,7 +299,10 @@ } my $out = $input->transform( - XSLT($self->config->docroot . '/stylesheets/imagesheet2html.xsl') + XSLT($self->config->docroot . '/stylesheets/imagesheet2html.xsl', + $prev ? ('prev' => uri_encode($prev)) : (), + $next ? ('next' => uri_encode($next)) : (), + ) ); return OK, $out;