/usr/local/CPAN/AxKit-App-Gallery/AxKit/App/Gallery/Plugin.pm
package AxKit::App::Gallery::Plugin;
# Copyright (c) 2003 Nik Clayton
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
# $Id: Plugin.pm,v 1.5 2003/11/09 12:33:21 nik Exp $
use strict;
use Apache::Constants qw(OK DECLINED);
use Apache::Request;
use URI;
use URI::Escape;
use Imager; # Scaling
use Image::Info; # For width/height
# The job here is two-fold. First, to decide if AxKit should process this
# resource (and thus return OK), second, if it shouldn't process the
# resource, and a jpeg should be created, then to create the jpeg, cache
# it, set $r->filename() to the location of the cached jpeg, and then
# return DECLINED.
sub handler {
my $r = Apache::Request->new(shift);
# $r->log_error('In the plugin handler');
# $r->log_error('args: ' . $r->args());
# Always return OK for a directory
# $r->log_error('Checking to see if it\'s a directory: ' . $r->filename());
return OK if -d $r->filename();
return OK unless substr($r->content_type(), 0, 6) eq 'image/';
# $r->log_error('Filename is: ' . $r->filename());
my $format = $r->param('format');
# $r->log_error("Format param was $format");
# If no format parameter was passed in then AxKit can process the URI
# If the format param is 'html' then AxKit can process the URI
return OK if ! defined $format;
return OK if $format eq 'html';
# $r->log_error('Filename is: ' . $r->filename());
# Make sure the specified size is one we're configured to
# support. If it isn't then use the default size
my $sizelist = $r->dir_config('GallerySizes');
$sizelist = '133 640 800 1024' unless defined $sizelist;
my @sizes = split(/\s+/, $sizelist);
my $size = $r->param('size');
if($size eq 'thumb') {
$size = $sizes[0];
} else {
$size = $sizes[1] unless grep { $_ eq $size } @sizes;
}
# Get the larger of the image's width and height. If this is smaller than
# the size user has requested, change the size to 'full'
# XXX should write code to do this
# $r->log_error("New size is $size");
# $r->log_error('Filename is: ' . $r->filename());
# If the size is 'full' then we're sending back the full size
# image. There's no work to do, so just return DECLINED
return DECLINED if $size eq 'full';
# Now we know what size the image should be, check to see if a
# cached copy already exists.
my $cache_dir = $r->dir_config('GalleryCache');
# my $uri = URI->new($r->uri());
# my $cachepath = "$cache_dir/$uri";
my $cachepath = $cache_dir . $r->filename();
my $cachedfile = "$cachepath/$size.jpg";
$cachedfile = uri_unescape($cachedfile);
# $r->log_error("Cachedfile is $cachedfile");
my $image = Imager->new();
if(! -f $cachedfile
|| -z $cachedfile
|| (stat($r->filename()))[9] > (stat($cachedfile))[9]) {
# $r->log_error("will open " . $r->filename());
$image->open(file => $r->filename())
or die $image->errstr();
# $r->log_error("opened original image");
my($w, $h) = ($image->getwidth(), $image->getheight());
my $quality = $r->dir_config('GalleryThumbQuality');
$quality = 'normal' if $quality ne 'preview';
my $thumb = $image->scale(qtype => $quality,
$w > $h
? (xpixels => $size)
: (ypixels => $size));
# $r->log_error("scaled image");
$thumb->write(file => $cachedfile);
# $r->log_error("Wrote scaled image to $cachedfile");
}
$r->filename($cachedfile);
return DECLINED;
}
1;