#!/perl/bin/perl
############################################
# Photoshop SOAP server
# Mike Schilli <[email protected]>
############################################

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;
}