App-Music-ChordPro
view release on metacpan or search on metacpan
lib/ChordPro/lib/SVGPDF/Contrib/PathExtract.pm view on Meta::CPAN
}
elsif ($ucc eq 'A') {
my $position = position_type ($command);
my $expect_numbers = 7;
if (@numbers % $expect_numbers != 0) {
my $n = scalar (@numbers);
croak "$me: Need multiple of 7 parameters for arc, got $n (@numbers)";
}
for (my $i = 0; $i < @numbers / $expect_numbers; $i++) {
my $o = $expect_numbers * $i;
my %arc;
$arc{svg_key} = $command;
$arc{type} = 'arc';
$arc{name} = 'elliptical arc';
$arc{position} = $position;
@arc{@arc_fields} = @numbers[$o .. $o + 6];
push @path_info, \%arc;
}
}
elsif ($ucc eq 'M') {
my $expect_numbers = 2;
my $position = position_type ($command);
if (@numbers < $expect_numbers) {
croak "$me: Need at least $expect_numbers numbers for move to";
}
if (@numbers % $expect_numbers != 0) {
croak "$me: Odd number of values for an M command " .
scalar (@numbers) . " in '$path'";
}
push @path_info, {
type => 'moveto',
name => 'moveto',
position => $position,
point => [@numbers[0, 1]],
svg_key => $command,
};
# M can be followed by implicit line-to commands, so
# consume these.
if (@numbers > $expect_numbers) {
my @implicit_lineto = splice @numbers, $expect_numbers;
push @path_info, build_lineto ($position, @implicit_lineto);
}
}
else {
croak "I don't know what to do with a curve type '$command'";
}
}
# Now sort it out if the user wants to get rid of the absolute
# paths etc.
my $absolute = $options_ref->{absolute};
my $no_smooth = $options_ref->{no_shortcuts} || $options_ref->{no_smooth};
if ($absolute) {
if ($verbose) {
print "Making all coordinates absolute.\n";
}
my @abs_pos = (0, 0);
my @start_drawing;
my $previous;
my $begin_drawing = 1; ##This will get updated after
for my $element (@path_info) {
if ($element->{type} eq 'moveto') {
$begin_drawing = 1;
if ($element->{position} eq 'relative') {
my $ip = $options_ref->{initial_position};
if ($ip) {
if (ref $ip ne 'ARRAY' ||
scalar @$ip != 2) {
croak "$me: The initial position supplied doesn't look like a pair of coordinates";
}
add_coords ($element->{point}, $ip);
}
else {
add_coords ($element->{point}, \@abs_pos);
}
}
@abs_pos = @{$element->{point}};
# It's possible to have a z, followed by an m,
# followed by a z. This occurred with
# https://github.com/edent/SuperTinyIcons/blob/master/images/svg/mailchimp.svg
# as of commit
# https://github.com/edent/SuperTinyIcons/commit/fd79fb48365ee14ace58e8aed5bad046e5b8136c
# So we should always have a valid value in
# @start_drawing, in case someone makes a useless
# "move".
@start_drawing = @abs_pos;
}
elsif ($element->{type} eq 'line-to') {
if ($element->{position} eq 'relative') {
add_coords ($element->{point}, \@abs_pos);
}
if ($begin_drawing) {
if ($verbose) {
printf "Beginning drawing at [%.4f, %.4f]\n", @abs_pos;
}
$begin_drawing = 0;
@start_drawing = @abs_pos;
}
@abs_pos = @{$element->{point}};
}
elsif ($element->{type} eq 'horizontal-line-to') {
if ($element->{position} eq 'relative') {
$element->{x} += $abs_pos[0];
}
if ($begin_drawing) {
if ($verbose) {
printf "Beginning drawing at [%.4f, %.4f]\n", @abs_pos;
}
$begin_drawing = 0;
@start_drawing = @abs_pos;
}
$abs_pos[0] = $element->{x};
}
elsif ($element->{type} eq 'vertical-line-to') {
if ($element->{position} eq 'relative') {
$element->{y} += $abs_pos[1];
}
if ($begin_drawing) {
if ($verbose) {
printf "Beginning drawing at [%.4f, %.4f]\n", @abs_pos;
( run in 0.354 second using v1.01-cache-2.11-cpan-39bf76dae61 )