]> git.vpit.fr Git - perl/modules/LaTeX-TikZ.git/blobdiff - lib/LaTeX/TikZ/Formatter.pm
Complete origin support in the formatter object
[perl/modules/LaTeX-TikZ.git] / lib / LaTeX / TikZ / Formatter.pm
index aa26ebc91766ba511e8fc9ac1ea1d9b766107b0b..899b4b036c7cd2ed70c210016820c3754b5c67ad 100644 (file)
@@ -17,6 +17,8 @@ our $VERSION = '0.01';
 
 use Sub::Name ();
 
+use LaTeX::TikZ::Point;
+
 use LaTeX::TikZ::Interface;
 
 use LaTeX::TikZ::Tools;
@@ -37,34 +39,41 @@ has 'format' => (
 );
 
 has 'scale' => (
- is      => 'ro',
+ is      => 'rw',
  isa     => 'Num',
  default => 1,
 );
 
 has 'width' => (
- is  => 'ro',
+ is  => 'rw',
  isa => 'Maybe[Num]',
 );
 
 has 'height' => (
- is  => 'ro',
+ is  => 'rw',
  isa => 'Maybe[Num]',
 );
 
 has 'origin' => (
- is     => 'ro',
- isa    => 'Maybe[LaTeX::TikZ::Point::Autocoerce]',
+ is     => 'rw',
+ isa    => 'LaTeX::TikZ::Point::Autocoerce',
  coerce => 1,
 );
 
 sub id {
  my $tikz = shift;
 
+ my $origin = $tikz->origin;
+ if (defined $origin) {
+  my ($x, $y) = map $origin->$_, qw/x y/;
+  $origin = "($x;$y)";
+ } else {
+  $origin = "(0;0)";
+ }
+
  join $;, map {
-  my $val = $tikz->$_;
-  defined($val) ? "$val" : '(undef)';
- } qw/unit format scale width height origin/;
+  defined() ? "$_" : '(undef)';
+ } map($tikz->$_, qw/unit format scale width height/), $origin;
 }
 
 my $find_mods = do {
@@ -105,6 +114,8 @@ my $find_mods = do {
  });
 };
 
+my $translate;
+
 sub render {
  my $tikz = shift;
 
@@ -112,12 +123,32 @@ sub render {
   kids => \@_,
  );
 
+ unless ($translate) {
+  require LaTeX::TikZ::Functor;
+  $translate = LaTeX::TikZ::Functor->new(
+   rules => [
+    'LaTeX::TikZ::Set::Point' => sub {
+     my ($functor, $set, $v) = @_;
+
+     $set->new(
+      point => [
+       $set->x + $v->x,
+       $set->y + $v->y,
+      ],
+      label => $set->label,
+      pos   => $set->pos,
+     );
+    },
+   ],
+  );
+ }
+
+ my $origin = $tikz->origin;
+ $seq = $seq->$translate($origin) if defined $origin;
+
  my (@layers, @other_mods);
  $find_mods->($seq, \@layers, \@other_mods);
 
- my $o = $tikz->origin;
- $seq  = $seq->translate($o) if defined $o;
-
  my $w = $tikz->width;
  my $h = $tikz->height;
  my $canvas = '';