in reply to SVG getBoundingBox or getWidth and getHeight
This is close enough
sub bboxwh { my( $g ) = @_; my @xx; my @yy; for my $k ( $g->getChildren ){ my %att = $k->getAttributes ; my $swid = eval { $att{style}{"stroke-width"} } || 0; my $points = $att{points}; $points or next; for my $xy ( split ' ', $points){ my( $xx, $yy ) = split ',', $xy; push @xx, $xx; push @yy, $yy; ## account for swid?? } } @xx = sort { $a <=> $b } @xx; @yy = sort { $a <=> $b } @yy; my $minx = $xx[ 0 ]; my $miny = $yy[ 0 ]; my $maxx = $xx[ -1 ]; my $maxy = $yy[ -1 ]; my $w = $minx < 0 ? abs($minx)+$maxx : abs( $minx - $maxx ); my $h = $miny < 0 ? abs($miny)+$maxy : abs( $miny - $maxy ); my $r = { bbox => [ $minx, $miny, $maxx, $maxy ], p1 => [ $minx, $miny ], p2 => [ $maxx, $maxy ], left => $minx, top => $miny, right => $maxx, bottom => $maxy, id => $g->getElementID, width => $w, height => $h, }; return $r; }
|
|---|