CSS-SpriteMaker
view release on metacpan or search on metacpan
lib/CSS/SpriteMaker.pm view on Meta::CPAN
# Still nothing, then use default layout
#
if (!defined $Layout) {
my $layout_name = $self->{layout}{name};
my $layout_options = {};
LOAD_DEFAULT_LAYOUT_PLUGIN:
for my $plugin ($self->plugins()) {
my ($plugin_name) = reverse split "::", $plugin;
if ($plugin eq $layout_name || $plugin_name eq $layout_name) {
$self->_verbose(" * using DEFAULT layout $plugin");
$Layout = $plugin->new($options{rh_sources_info}, $layout_options);
last LOAD_DEFAULT_LAYOUT_PLUGIN;
}
}
}
return $Layout;
}
sub _write_image {
my $self = shift;
my %options = @_;
my $target_file = $options{target_file} // $self->{target_file};
my $output_format = $options{format} // $self->{format};
my $Layout = $options{Layout} // 0;
my $rh_sources_info = $options{rh_sources_info} // 0;
if (!$target_file) {
die "the ``target_file'' parameter is required for this subroutine or you must instantiate Css::SpriteMaker with the target_file parameter";
}
if (!$rh_sources_info) {
die "The 'rh_sources_info' parameter must be passed to _write_image";
}
if (!$Layout) {
die "The 'layout' parameter needs to be specified for _write_image, and must be a CSS::SpriteMaker::Layout object";
}
$self->_verbose(" * writing sprite image");
$self->_verbose(sprintf("Target image size: %s, %s",
$Layout->width(),
$Layout->height())
);
my $Target = Image::Magick->new();
$Target->Set(size => sprintf("%sx%s",
$Layout->width(),
$Layout->height()
));
# prepare the target image
if (my $err = $Target->ReadImage('xc:white')) {
warn $err;
}
$Target->Set(type => 'TruecolorMatte');
# make it transparent
$self->_verbose(" - clearing canvas");
$Target->Draw(
fill => 'transparent',
primitive => 'rectangle',
points => sprintf("0,0 %s,%s", $Layout->width(), $Layout->height())
);
$Target->Transparent('color' => 'white');
# place each image according to the layout
ITEM_ID:
for my $source_id ($Layout->get_item_ids) {
my $rh_source_info = $rh_sources_info->{$source_id};
my ($layout_x, $layout_y) = $Layout->get_item_coord($source_id);
$self->_verbose(sprintf(" - placing %s (format: %s size: %sx%s position: [%s,%s])",
$rh_source_info->{pathname},
$rh_source_info->{format},
$rh_source_info->{width},
$rh_source_info->{height},
$layout_y,
$layout_x
));
my $I = Image::Magick->new();
my $err = $I->Read($rh_source_info->{pathname});
if ($err) {
warn $err;
next ITEM_ID;
}
my $padding = $rh_source_info->{add_extra_padding};
my $destx = $layout_x + $padding;
my $desty = $layout_y + $padding;
$Target->Composite(image=>$I,compose=>'xor',geometry=>"+$destx+$desty");
}
# write target image
my $err = $Target->Write("$output_format:".$target_file);
if ($err) {
warn "unable to obtain $target_file for writing it as $output_format. Perhaps you have specified an invalid format. Check http://www.imagemagick.org/script/formats.php for a list of supported formats. Error: $err";
$self->_verbose("Wrote $target_file");
return 1;
}
# cache the layout and the rh_info structure so that it hasn't to be passed
# as a parameter next times.
$self->{_cache_layout} = $Layout;
# cache the target image file, as making the stylesheet can't be done
# without this information.
$self->{_cache_target_image_file} = $target_file;
# cache sources info
$self->{_cache_rh_source_info} = $rh_sources_info;
return 0;
}
=head2 _get_image_properties
( run in 0.898 second using v1.01-cache-2.11-cpan-39bf76dae61 )