OSDN Git Service

Perl5.26以降対応の為、PDFJ-0.91RC1へ変更。
[fswiki/fswiki.git] / lib / PDFJ / Shape.pm
1 # Additional PDFJ::Shape methods
2 # 2004 nakajima@netstock.co.jp
3 package PDFJ::Shape;
4 use Carp;
5 use strict;
6
7 sub arrow {
8         my($self, $x, $y, $w, $h, $headsize, $headangle, $style)
9                 = PDFJ::Util::methodargs([qw(x y w h headsize headangle style)], @_);
10         my $xt = $x + $w;
11         my $yt = $y + $h;
12         my $axisangle = atan2(-$h, -$w);
13         my $x1 = $xt + $headsize * cos($axisangle + $headangle);
14         my $y1 = $yt + $headsize * sin($axisangle + $headangle);
15         my $x2 = $xt + $headsize * cos($axisangle - $headangle);
16         my $y2 = $yt + $headsize * sin($axisangle - $headangle);
17         my $hlen = $headsize * cos($headangle);
18         $w += $hlen * cos($axisangle);
19         $h += $hlen * sin($axisangle);
20         my $coords = [$xt, $yt, $x1, $y1, $x2, $y2, $xt, $yt];
21         $self->line($x, $y, $w, $h, $style);
22         $self->polygon($coords, 'f', $style);
23 }
24
25 sub brace {
26         my($self, $x, $y, $w, $h, $style)
27                 = PDFJ::Util::methodargs([qw(x y w h style)], @_);
28         $self->setboundary($x, $y);
29         $self->setboundary($x + $w, $y + $h);
30         ($w, $h) = ($w / 2, $h / 2);
31         my $ch = abs($w * 3 / 2);
32         croak "too wide brace" if $ch > $h / 2;
33         my $lw = ($style && $style->{linewidth}) ? $style->{linewidth} / 2 :
34                 ($self->{style} && $self->{style}{linewidth}) ? 
35                         $self->{style}{linewidth} / 2 :
36                 1 / 2;
37         $self->newpath;
38         $self->moveto($x, $y + $h);
39         $self->curveto(_bracecurve($x, $y + $h, $w + $lw, $ch));
40         $self->lineto($x + $w + $lw, $y + $h * 2 - $ch);
41         $self->curveto(_bracecurve2($x + $w + $lw, $y + $h * 2 - $ch, $w - $lw, $ch));
42         $self->curveto(_bracecurve($x + $w * 2, $y + $h * 2, -$w - $lw, -$ch));
43         $self->lineto($x + $w - $lw, $y + $h + $ch);
44         $self->curveto(_bracecurve2($x + $w - $lw, $y + $h + $ch, -$w + $lw, -$ch));
45         $self->fill;
46         $self->newpath;
47         $self->moveto($x, $y + $h);
48         $self->curveto(_bracecurve($x, $y + $h, $w + $lw, -$ch));
49         $self->lineto($x + $w + $lw, $y + $ch);
50         $self->curveto(_bracecurve2($x + $w + $lw, $y + $ch, $w - $lw, -$ch));
51         $self->curveto(_bracecurve($x + $w * 2, $y, -$w - $lw, $ch));
52         $self->lineto($x + $w - $lw, $y + $h - $ch);
53         $self->curveto(_bracecurve2($x + $w - $lw, $y + $h - $ch, -$w + $lw, +$ch));
54         $self->fill;
55         $self;
56 }
57
58 sub bracket {
59         my($self, $x, $y, $w, $h, $style)
60                 = PDFJ::Util::methodargs([qw(x y w h style)], @_);
61         my $coords = [$x + $w, $y, $x, $y, $x, $y + $h, $x + $w, $y + $h];
62         $self->polygon($coords, 's', $style);
63 }
64
65 sub paren {
66         my($self, $x, $y, $w, $h, $style)
67                 = PDFJ::Util::methodargs([qw(x y w h style)], @_);
68         $self->setboundary($x, $y);
69         $self->setboundary($x + $w, $y + $h);
70         my $lw = ($style && $style->{linewidth}) ? $style->{linewidth}:
71                 ($self->{style} && $self->{style}{linewidth}) ? 
72                         $self->{style}{linewidth} :
73                 1;
74         $lw = -$lw if $w < 0;
75         $h = $h / 2;
76         $self->newpath;
77         $self->moveto($x, $y + $h);
78         $self->curveto(_bracecurve2($x, $y + $h, $w, $h));
79         $self->curveto(_bracecurve($x + $w, $y + $h * 2, -$w + $lw, -$h));
80         $self->curveto(_bracecurve2($x + $lw, $y + $h, $w - $lw, -$h));
81         $self->curveto(_bracecurve($x + $w, $y, -$w, $h));
82         $self->fill;
83         $self;
84 }
85
86 sub _bracecurve {
87         my($x, $y, $w, $h) = @_;
88         my($x1, $y1) = ($x + $w * 2 / 3, $y + $h / 4);
89         my($x2, $y2) = ($x + $w, $y + $h / 2);
90         my($x3, $y3) = ($x + $w, $y + $h);
91         ($x1, $y1, $x2, $y2, $x3, $y3);
92 }
93 sub _bracecurve2 {
94         my($x, $y, $w, $h) = @_;
95         my($x1, $y1, $x2, $y2, $x3, $y3) = 
96                 _bracecurve($x + $w, $y + $h, -$w, -$h);
97         ($x2, $y2, $x1, $y1, $x + $w, $y + $h);
98 }
99
100 1;