#!/perl/bin/perl
############################################
# Photoshop SOAP server
# Mike Schilli <m@perlmeister.com>
############################################

use SOAP::Transport::HTTP;

SOAP::Transport::HTTP::CGI
   ->dispatch_to("Photoshop::Hoelle")
   ->handle;

############################################
package Photoshop::Hoelle;

use Win32::OLE;
use Win32::OLE::Const 'Photoshop';

############################################
sub pshopit {
############################################
    my($self, $data) = @_;
    my($desc, $control, $pngfile);

    my $class   = "Photoshop.Application";
    my $tmpfile = "c:\\tmp\\ps.jpg";

    unlink $tmpfile;

    open FILE, ">$tmpfile" or
        die "Cannot open tmp file $tmpfile";
    binmode FILE;
    print FILE $data;
    close FILE;

        # An Photoshop andocken
    my $ps = Win32::OLE->new($class);

    $ps->{Visible} = 0;

        # Datei öffnen
    $desc    = $ps->MakeDescriptor();
    $control = $ps->MakeControlObject();
    $desc->PutPath(phKeyNull, "$tmpfile");
    $control->Play(phEventOpen, $desc, 
                   phDialogSilent);

        # AutoLevels
    $desc    = $ps->MakeDescriptor();
    $control = $ps->MakeControlObject();
    $desc->PutBoolean(phKeyAuto, 1);
    $control->Play(phEventLevels, $desc, 
                   phDialogSilent);

        # Resize auf 600*800
    $desc    = $ps->MakeDescriptor();
    $control = $ps->MakeControlObject();
    $desc->PutUnitDouble(phKeyWidth, 
             phUnitPixels, 600);
    $desc->PutBoolean(
             phKeyConstrainProportions, 1);
    $desc->PutEnumerated(
             phKeyInterfaceIconFrameDimmed, 
             phTypeInterpolation,
             phEnumBicubic);
    $control->Play(phEventImageSize, $desc, 
             phDialogSilent);

    $control = $ps->MakeControlObject();
    my $d1   = $ps->MakeDescriptor();
    my $d2   = $ps->MakeDescriptor();
    $d2->PutEnumerated(
        phKeyPNGInterlaceType, 
        phTypePNGInterlaceType,
        phEnumPNGInterlaceNone);
    $d2->PutEnumerated(phKeyPNGFilter, 
        phTypePNGFilter, 
        phEnumPNGFilterAdaptive);
    $d1->PutObject(phKeyAs, 
                   phClassPNGFormat, $d2);
    ($pngfile = $tmpfile) =~ s/jpg$/png/;
    $d1->PutPath(phKeyIn, $pngfile);
    $d1->PutBoolean(phKeyLowercase, 1);
    $control->Play(phEventSave, $d1, 
        phDialogSilent);

    $desc    = $ps->MakeDescriptor();
    $control = $ps->MakeControlObject();
    $control->Play(phEventClose, $desc, 
                   phDialogSilent);

    open FILE, "<$pngfile" or
        die "Cannot open tmp file $pngfile";
    binmode FILE;
    my $data = join '', <FILE>;
    close FILE;
    unlink $pngfile;
    unlink $tmpfile;

    return $data;
}
