X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=lib%2FLaTeX%2FTikZ%2FFormatter.pm;h=aa26ebc91766ba511e8fc9ac1ea1d9b766107b0b;hb=af7d6a5aef3bf5fec0c187b3a13a14adc88251fd;hp=6592b3833f12da2950b7dd690f14a810739a5dd7;hpb=c314e50ea7c67844e6cf5f4d1431d8bf41a39f1a;p=perl%2Fmodules%2FLaTeX-TikZ.git diff --git a/lib/LaTeX/TikZ/Formatter.pm b/lib/LaTeX/TikZ/Formatter.pm index 6592b38..aa26ebc 100644 --- a/lib/LaTeX/TikZ/Formatter.pm +++ b/lib/LaTeX/TikZ/Formatter.pm @@ -17,6 +17,8 @@ our $VERSION = '0.01'; use Sub::Name (); +use LaTeX::TikZ::Interface; + use LaTeX::TikZ::Tools; use Any::Moose; @@ -51,35 +53,56 @@ has 'height' => ( ); has 'origin' => ( - is => 'ro', - does => 'Maybe[LaTeX::TikZ::Point]', + is => 'ro', + isa => 'Maybe[LaTeX::TikZ::Point::Autocoerce]', + coerce => 1, ); -my $find_mods; -$find_mods = do { - no warnings 'recursion'; +sub id { + my $tikz = shift; - Sub::Name::subname('find_mods' => sub { - my ($set, $layers, $others) = @_; + join $;, map { + my $val = $tikz->$_; + defined($val) ? "$val" : '(undef)'; + } qw/unit format scale width height origin/; +} + +my $find_mods = do { + our %seen; + + my $find_mods_rec; + $find_mods_rec = do { + no warnings 'recursion'; + + Sub::Name::subname('find_mods_rec' => sub { + my ($set, $layers, $others) = @_; - if ($set->isa('LaTeX::TikZ::Set::Mod')) { for ($set->mods) { + my $tag = $_->tag; + next if $seen{$tag}++; + if ($_->isa('LaTeX::TikZ::Mod::Layer')) { push @$layers, $_; } else { push @$others, $_; } } - } - my @subsets = $set->isa('LaTeX::TikZ::Set::Sequence') - ? $set->kids - : $set->isa('LaTeX::TikZ::Set::Path') - ? $set->ops - : (); + my @subsets = $set->isa('LaTeX::TikZ::Set::Sequence') + ? $set->kids + : $set->isa('LaTeX::TikZ::Set::Path') + ? $set->ops + : (); + + $find_mods_rec->($_, $layers, $others) for @subsets; + }); + }; + + Sub::Name::subname('find_mods' => sub { + local %seen = (); - $find_mods->($_, $layers, $others) for @subsets; - }) + $find_mods_rec->(@_); + }); }; sub render { @@ -99,7 +122,12 @@ sub render { my $h = $tikz->height; my $canvas = ''; if (defined $w and defined $h) { - $seq->clip(Tikz->rectangle(Tikz->point(0) => [ $w, $h ])); + require LaTeX::TikZ::Set::Rectangle; + $seq->clip(LaTeX::TikZ::Set::Rectangle->new( + from => 0, + width => $w, + height => $h, + )); $_ = $tikz->len($_) for $w, $h; $canvas = ",papersize={$w,$h},body={$w,$h}"; } @@ -156,6 +184,14 @@ sub thickness { 0.8 * $width * ($tikz->scale / 5); } +LaTeX::TikZ::Interface->register( + formatter => sub { + shift; + + __PACKAGE__->new(@_); + }, +); + __PACKAGE__->meta->make_immutable; =head1 AUTHOR