PPresenter
view release on metacpan or search on metacpan
PPresenter/Decoration.pm view on Meta::CPAN
package PPresenter::Decoration;
use strict;
use PPresenter::StyleElem;
use base 'PPresenter::StyleElem';
use constant ObjDefaults =>
{ type => 'decoration'
, -bgcolor => undef
, -fgcolor => undef
, -bdcolor => undef
, -backdrop => undef
, -defaultBounds => [ 0.05, 0.05, 0.97, 0.97 ]
, -notesBounds => [ 0.02, 0.02, 0.98, 0.98 ]
, -defaultTitlebarHeight => 0.15
, -defaultFooterHeight => 0.06
, -areaSeparation => 0.03
, -titleBounds => undef
, -mainBounds => undef
, -mainBoundsNoTitle=> undef
, -footerBounds => undef
, devices =>
# device bgcolor fgcolor bdcolor backdrop?
{ lcd => [ 'dark blue', 'yellow', 'black', 1 ]
, beamer => [ 'white', 'black', 'gray', 0 ]
, printer => [ 'white', 'black', 'gray', 0 ]
}
, -nestImages => ['640x480', 'greenball.gif', 'redball.gif', 'purpleball.gif' ]
};
sub InitObject()
{ my $deco = shift;
$deco->check_nestImages(@{$deco->{-nestImages}});
foreach (qw(-defaultTitlebarHeight -defaultFooterHeight -areaSeparation))
{ next unless defined $deco->{$_};
$deco->{$_} = $deco->toPercentage($deco->{$_});
}
foreach (qw(-defaultBounds -notesBounds -titleBounds -mainBounds
-mainBoundsNoTitle -footerBounds))
{ next unless defined $deco->{$_};
$deco->{$_} = [ map {$deco->toPercentage($_)} @{$deco->{$_}} ];
}
$deco;
}
sub check_nestImages($@)
{ my ($deco, $geom) = (shift, shift);
if(defined $geom)
{ foreach (@_)
{ next unless ref $_;
next if $_->isa('PPresenter::Image::Magick');
# Photo objects are already sized.
die "-nestImages geometry only on filenames and Magick objects.\n";
}
}
else
{ foreach (@_)
{ next unless ref @_;
next if $_->isa('PPresenter::Image');
die "-nestImages wants filenames or PPresenter::Image objects.\n";
}
}
}
sub addDevice($$$$)
{ my $deco = shift;
unshift @{$deco->{devices}}, [ @_ ];
$deco;
}
sub hasBackdrop($)
{ my ($deco,$device) = @_;
return $deco->{-backdrop}
if defined $deco->{-backdrop};
my $spec = $deco->{devices}{$device} || undef;
die "Undefined device $device.\n" unless defined $spec;
$spec->[3];
}
sub color($$)
{ my ($deco, $view, $name) = @_;
my $NAME = uc $name;
my $device = $view->device;
my $spec = $deco->{devices}{$device}
|| die "Undefined device $device\n";
return $deco->{-bgcolor} || $spec->[0] if $NAME eq 'BGCOLOR';
return $deco->{-fgcolor} || $spec->[1] if $NAME eq 'FGCOLOR';
return $deco->{-bdcolor} || $spec->[2] if $NAME eq 'BDCOLOR';
$name;
}
sub nestImageDef($$)
{ my ($deco, $nest) = @_;
my $nr_images = @{$deco->{-nestImages}}-1;
$nest = $nr_images-1 if $nest >= $nr_images;
@{$deco->{-nestImages}}[0,$nest+1];
}
sub boundingBox($@)
{ my ($deco, $view) = (shift, shift);
my ($w, $h) = $view->canvasDimensions;
( int(shift(@_) * $w), int(shift(@_) * $h)
, int(shift(@_) * $w), int(shift(@_) * $h)
( run in 0.868 second using v1.01-cache-2.11-cpan-5a3173703d6 )