App-Music-ChordPro
view release on metacpan or search on metacpan
lib/ChordPro/lib/SVGPDF/Rect.pm view on Meta::CPAN
#! perl
use v5.26;
use Object::Pad;
use utf8;
use Carp;
class SVGPDF::Rect :isa(SVGPDF::Element);
method process () {
my $atts = $self->atts;
my $xo = $self->xo;
return if $atts->{omit}; # for testing/debugging.
my ( $x, $y, $w, $h, $rx, $ry, $tf ) =
$self->get_params( $atts, qw( x:H y:V width:H height:V rx:U ry:U transform:s ) );
$self->_dbg( $self->name, " x=$x y=$y w=$w h=$h" );
$self->_dbg( "+ xo save" );
$xo->save;
$self->set_graphics;
$self->set_transform($tf) if $tf;
unless ( $rx || $ry ) {
$xo->rectangle( $x, $y, $x+$w, $y+$h );
}
else {
# https://svgwg.org/svg2-draft/shapes.html#RectElement
# Resolve percentages.
if ( $rx ) {
$rx = $1 * $w if $rx =~ /^([-+,\d]+)\%$/;
}
if ( $ry ) {
$ry = $1 * $h if $ry =~ /^([-+,\d]+)\%$/;
}
# Default one to the other.
$rx ||= $ry; $ry ||= $rx;
# Maximize to half of the width/height.
if ( $rx > $w/2 ) {
$rx = $w/2;
}
if ( $ry > $h/2 ) {
$ry = $h/2;
}
$self->_dbg( $self->name, "(rounded) rx=$rx ry=$ry" );
$xo->move( $x+$rx, $y );
$xo->hline( $x + $w - $rx );
$xo->arc( $x+$w-$rx, $y+$ry, $rx, $ry, -90, 0 );
$xo->vline( $y + $h - $ry );
$xo->arc( $x+$w-$rx, $y+$h-$ry, $rx, $ry, 0, 90 );
$xo->hline( $x + $rx );
$xo->arc( $x+$rx, $y+$h-$ry, $rx, $ry, 90, 180 );
$xo->vline( $y + $ry );
$xo->arc( $x+$rx, $y+$ry, $rx, $ry, 180, 270 );
$xo->close;
}
$self->_paintsub->();
$self->_dbg( "- xo restore" );
$xo->restore;
$self->css_pop;
}
1;
( run in 0.664 second using v1.01-cache-2.11-cpan-39bf76dae61 )