SVGPDF
view release on metacpan or search on metacpan
lib/SVGPDF/Element.pm view on Meta::CPAN
( $param, $flags ) = ( $1, $2 )
if $param =~ /^(.*):(.*)$/;
$param = lc($param);
# Get and remove the attribute.
my $p = delete( $atts{$param} );
# Queue.
push( @todo, [ $param, $flags, $p ] );
}
# CSS push with updated attributes.
$self->css_push( \%atts );
# Now we can process the values.
for ( @todo ) {
my ( $param, $flags, $p ) = @$_;
unless ( defined $p ) {
if ( $flags =~ /s/ ) { $p = ""; }
elsif ( $flags =~ /[0HUV]/ ) { $p = 0; }
else {
croak("Undefined mandatory attribute: $param")
if $flags =~ /\!/;
push( @res, $p );
next;
}
}
$flags = lc($flags);
# Convert units if 'u' flag.
if ( $flags =~ /([huv])/ ) {
my $flag = $1;
if ( $p =~ /^([\d.]+)\%$/ ) {
$p = $1/100;
if ( $flags eq "w" || $param =~ /^(?:w(?:idth)|x)?$/i ) {
# Percentage of viewBox width.
$p *= $root->xoforms->[-1]->{width};
}
elsif ( $flag eq "h" || $param =~ /^(?:h(?:eight)?|y)$/i ) {
# Percentage of viewBox height.
$p *= $root->xoforms->[-1]->{height};
}
else {
# Percentage of viewBox diagonal.
$p *= $root->xoforms->[-1]->{diag};
}
}
else {
$p = $self->u($p);
}
}
push( @res, $p );
}
# Return param values.
return @res;
}
method get_cdata () {
my $res = "";
for ( $self->get_children ) {
$res .= "\n" . $_->content if ref($_) eq "SVGPDF::TextElement";
}
$res;
}
method nfi ( $tag ) {
state $aw = {};
warn("SVG: $tag - not fully implemented, expect strange results.\n")
unless !$self->root->verbose || $aw->{$tag}++;
}
method set_font ( $xo, $style ) {
my $msg ="";
my $ret;
{
local $SIG{__WARN__} = sub { $msg .= "@_" };
$ret = $self->root->fontmanager->set_font( $xo, $style );
}
if ( $msg && $self->root->verbose ) {
warn($msg);
}
$ret;
}
################ Bounding Box ################
# method bb ( $x, $y, $t = 0 ) {
# my $bb = $self->root->xoforms->[-1]->{bb};
#
# $t = $self->u($t) unless $t =~ /^[-+]?\d*(?:\.\d*)$/;
# $t /= 2;
# $bb->[0] = $x-$t if $bb->[0] > $x-$t;
# $bb->[1] = $y-$t if $bb->[1] > $y-$t;
# $bb->[2] = $x+$t if $bb->[2] < $x+$t;
# $bb->[3] = $y+$t if $bb->[3] < $y+$t;
#
# return $bb;
# }
#
################ Utility ################
method data_inline($src) {
my %info;
unless ( $src =~ m! ^ data:
(?<mimetype> [^/]+ ) /
(?<subtype> [^;]+ ) ;
(?<encoding> [^,]+ ) ,
(?<data> . + ) $
!sx ) {
return { error => "Malformed inline data" };
}
if ( $+{encoding} eq "base64" ) {
require MIME::Base64;
$info{data} = MIME::Base64::decode($+{data});
( run in 0.725 second using v1.01-cache-2.11-cpan-39bf76dae61 )