App-Music-ChordPro
view release on metacpan or search on metacpan
lib/ChordPro/Output/PDF.pm view on Meta::CPAN
else {
warn("Invalid img attribute: \"$kk\"\n");
$err++;
}
}
if ( $err ) {
if ( $ctl{id} ) {
$ctl{id} = "__ERROR__";
}
}
elsif ( $ctl{id} ) {
my $a = ChordPro::Output::PDF::Song::assets($ctl{id});
if ( $a && $a->{opts}->{base} ) {
$ctl{base} = $a->{opts}->{base};
}
}
return \%ctl;
}
method getimage ($fragment) {
$fragment->{_img} //= do {
my $xo;
if ( $fragment->{id} ) {
my $o = ChordPro::Output::PDF::Song::assets($fragment->{id});
$xo = $o->{data} if $o;
unless ( $o && $xo ) {
warn("Unknown image ID in <img>: $fragment->{id}\n")
unless $fragment->{id} eq "__ERROR__";
$xo = alert( $fragment->{size} );
}
$fragment->{design_scale} = $o->{opts}->{scale};
if ( $o->{width} && $o->{vwidth} ) {
$fragment->{design_scale} ||= 1;
$fragment->{design_scale} *= $o->{vwidth}/$o->{width};
}
}
elsif ( $fragment->{builtin} ) {
my $i = $fragment->{builtin};
if ( $i =~ /^alert(?:\(([\d.]+)\))?$/ ) {
$xo = alert( $1 || $fragment->{size} );
}
else {
warn("Unknown builtin image in <img>: $i\n");
$xo = alert( $fragment->{size} );
}
}
elsif ( $fragment->{chord} ) {
my $info = ChordPro::Chords::known_chord($fragment->{chord});
unless ( $info ) {
warn("Unknown chord in <img>: $fragment->{chord}\n");
$xo = alert( $fragment->{size} );
}
else {
my $type = $fragment->{instrument} // $config->{instrument}->{type};
my $p = ChordPro::Output::PDF::diagrammer($type);
$xo = $p->diagram_xo($info);
}
}
$xo // $self->SUPER::getimage($fragment) // alert( $fragment->{size} );
};
}
sub alert ($size) {
my $scale = $size/20;
my $xo = $pr->{pdf}->xo_form;
$xo->bbox( 0, -18*$scale, 20*$scale, 0 );
$xo->matrix( $scale, 0, 0, -$scale, 0, 0 );
$xo->line_width(2)->line_join(1);
$xo->stroke_color("red");
$xo->fill_color("red");
$xo->move( 1, 17 )->polyline( 19, 17, 10, 1 )->close->stroke;
$xo->rectangle( 9, 13, 11, 15 );
$xo->move( 9, 12 )->polyline( 8.5, 7, 11.5, 7, 11, 12 )->close->fill;
return $xo;
}
class TextLayoutSymbolElement :does(Text::Layout::ElementRole);
use ChordPro::Utils qw(parse_kv);
use ChordPro::Symbols;
field $glyphs;
BUILD {
$glyphs = ChordPro::Symbols::symbols();
};
method parse( $ctx, $k, $v ) {
my $kv = parse_kv($v);
my $res =
{ %$ctx,
type => "text",
font => Text::Layout::FontConfig->from_string("ChordProSymbols"),
};
while ( ( $k,$v) = each(%$kv) ) {
$res->{$k} = $v, next
if $k =~ /^(size|color|bgcolor|href)$/;
$res->{text} = $glyphs->{$k}, next if defined $glyphs->{$k};
warn("Unknown attribute in <sym>: $k (ignored)\n");
}
return $res;
}
# These methods must be defined for the role, but will not be used.
method render( $hash, $gfx, $x, $y ) {}
method bbox( $hash ) {}
1;
( run in 0.521 second using v1.01-cache-2.11-cpan-ceb78f64989 )