svg_dropshadow revision 6b15695578f07a3f72c4c9475c1a261a3021472a
6ea1b817e31b89a627e146fe69e23ea0a64c89ecBob Halley#!/usr/bin/perl -w
36d3f6b40f89cfc1be669377f6260639b53ed9c0Tinderbox User#
6ea1b817e31b89a627e146fe69e23ea0a64c89ecBob Halley# svg_dropshadow
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews#
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews# Creates drop shadows for all svg elements specified by --id, or
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews# whole file if no ids are given.
6ea1b817e31b89a627e146fe69e23ea0a64c89ecBob Halley#
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User# Authors: Daniel Goude (goude@dtek.chalmers.se)
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt#
83a28ca274521e15086fc39febde507bcc4e145eMark Andrews
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Huntuse strict;
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Huntuse warnings;
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt
6ea1b817e31b89a627e146fe69e23ea0a64c89ecBob Halleyuse File::Basename();
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Huntuse lib File::Basename::dirname($0);
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt
6ea1b817e31b89a627e146fe69e23ea0a64c89ecBob Halleyuse SpSVG;
6ea1b817e31b89a627e146fe69e23ea0a64c89ecBob Halley
6ea1b817e31b89a627e146fe69e23ea0a64c89ecBob Halleymy $sp = new SpSVG;
6ea1b817e31b89a627e146fe69e23ea0a64c89ecBob Halley
6ea1b817e31b89a627e146fe69e23ea0a64c89ecBob Halley# Set the script name, used when displaying --help
6ea1b817e31b89a627e146fe69e23ea0a64c89ecBob Halley$sp->set_name($0);
6ea1b817e31b89a627e146fe69e23ea0a64c89ecBob Halley
6ea1b817e31b89a627e146fe69e23ea0a64c89ecBob Halley# Set usage string (options are handled separately).
6ea1b817e31b89a627e146fe69e23ea0a64c89ecBob Halleymy $usage = <<EOF;
6ea1b817e31b89a627e146fe69e23ea0a64c89ecBob HalleyCreates drop shadows from svg group(s)
6ea1b817e31b89a627e146fe69e23ea0a64c89ecBob HalleyEOF
6ea1b817e31b89a627e146fe69e23ea0a64c89ecBob Halley$sp->set_usage($usage);
6ea1b817e31b89a627e146fe69e23ea0a64c89ecBob Halley
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein# Set script specific options and description (used for --help)
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein# SpSVG will hasdle in/out files, and help
704e6c8876907aac0bf7380effca8bca400d4acdMark Andrewsmy @opt_vals = (
704e6c8876907aac0bf7380effca8bca400d4acdMark Andrews {
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein "opt" => "color=s",
f5d30e2864e048a42c4dc1134993ae7efdb5d6c3Mark Andrews "desc" => "Shadow color (default black)",
c1a883f2e04d94e99c433b1f6cfd0c0338f4ed85Mark Andrews },
3398334b3acda24b086957286288ca9852662b12Automatic Updater
d60212e03fbef1d3dd7f7eb05c0545cc373cb9fcAutomatic Updater
938440694b33cd752e9e4b71a526368b4811c177Tinderbox User {
0e9b328d62f6b051113287e6bade704bff66a009Tinderbox User "opt" => "opacity=s",
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews "desc" => "Shadow offset (0-1, default 0.5)",
36d3f6b40f89cfc1be669377f6260639b53ed9c0Tinderbox User },
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein {
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein "opt" => "offset=s",
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein "desc" => "Shadow offset, default 10",
6ea1b817e31b89a627e146fe69e23ea0a64c89ecBob Halley },
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt);
6ea1b817e31b89a627e146fe69e23ea0a64c89ecBob Halley
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Huntmy %opts = $sp->get_opts(@opt_vals);
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Huntmy $color = $opts{'color'} || 'black';
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Huntmy $opacity = $opts{'opacity'} || '0.5';
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Huntmy $offset= $opts{'offset'} || '10';
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt# Read input file (from --file or STDIN)
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt$sp->parse;
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt# Apply make_shadow to selected ids, or whole file
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt$sp->process_ids(\&make_shadow);
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt# Dump the file (to --output or STDOUT)
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt$sp->dump;
b7a823a402eb5c4e99f283e58d778a903d2e72f5Michał Kępień
b7a823a402eb5c4e99f283e58d778a903d2e72f5Michał Kępień# That's it!
b7a823a402eb5c4e99f283e58d778a903d2e72f5Michał Kępień
b7a823a402eb5c4e99f283e58d778a903d2e72f5Michał Kępień# make_shadow takes an svg fragment and returns named fragment
6ea1b817e31b89a627e146fe69e23ea0a64c89ecBob Halley# with a shadow added
6ea1b817e31b89a627e146fe69e23ea0a64c89ecBob Halleysub make_shadow {
6ea1b817e31b89a627e146fe69e23ea0a64c89ecBob Halley my $element = shift;
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt
30eec077db2bdcb6f2a0dc388a3cdde2ede75ec1Mark Andrews # Duplicate element
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein my $shadow = $element;
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein # Set shadow color
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein $shadow =~ s/(stroke|fill):[^;]+;/$1:$color;/ig;
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein my $svg = <<EOF;
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein <svg:g id="fooz" style="opacity:$opacity;" transform="translate($offset,
6ea1b817e31b89a627e146fe69e23ea0a64c89ecBob Halley$offset)">
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein $shadow
30eec077db2bdcb6f2a0dc388a3cdde2ede75ec1Mark Andrews </svg:g>
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein $element
268a4475065fe6a8cd7cc707820982cf5e98f430Rob AusteinEOF
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein return $svg;
f9f11eb54be19b7deedf3978496f71d81432a5eeJeremy Reed}
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein
6ea1b817e31b89a627e146fe69e23ea0a64c89ecBob Halley