Prima
view release on metacpan or search on metacpan
Prima/Drawable/Path.pm view on Meta::CPAN
my $self = shift;
my $p = $#_ ? [@_] : $_[0];
@$p % 2 and Carp::croak('bad parameters to rline');
$self->rcmd( line => $p);
}
sub spline
{
my ($self, $p, %opt) = @_;
(@$p % 2 || @$p < 6) and Carp::croak('bad parameters to spline');
$self-> cmd( spline => $p, \%opt );
}
sub rspline
{
my ($self, $p, %opt) = @_;
(@$p % 2 || @$p < 6) and Carp::croak('bad parameters to spline');
$self-> rcmd( spline => $p, \%opt );
}
sub glyph
{
my ($self, $ix, %opt) = @_;
return unless $self->{canvas};
my $outline = $self->{canvas}->render_glyph( $ix, %opt );
return unless $outline;
my $size = scalar(@$outline);
my @p;
my $fill = delete $opt{fill};
for ( my $i = 0; $i < $size; ) {
my $cmd = $outline->[$i++];
my $pts = $outline->[$i++] * 2;
my @pts = map { $outline->[$i++] / 64.0 } 0 .. $pts - 1;
if ( $cmd == ggo::Move ) {
$self->close unless $fill;
$self->moveto(@pts);
} elsif ( $cmd == ggo::Line ) {
$self->line([ @p, @pts ]);
} elsif ( $cmd == ggo::Conic ) {
$self->spline([ @p, @pts ]);
} elsif ( $cmd == ggo::Cubic ) {
$self->spline([ @p, @pts ], degree => 3 );
}
@p = @pts[-2,-1];
}
$self->close;
}
sub text
{
my ($self, $text, %opt) = @_;
return unless my $c = $self->{canvas};
my $state = $c->get_paint_state;
unless ($state) {
return unless $c->begin_paint_info;
}
$self->translate( 0, $c->font->descent )
unless $opt{baseline} // $c->textOutBaseline;
my $cache = $opt{cache} || {};
my $unicode = utf8::is_utf8($text);
for my $char ( split //, $text ) {
my $ix = ord($char);
$self->glyph($ix, %opt, unicode => $unicode);
my $r = $cache->{$char} //= do {
my $p = $c->get_font_abc($ix,$ix,$unicode);
$p->[0] + $p->[1] + $p->[2]
};
$self->translate($r,0);
}
$c->end_paint_info unless $state;
}
sub circular_arc
{
my $self = shift;
2 == @_ or Carp::croak('bad parameters to circular_arc');
$self-> cmd( arc => @_, 0 );
}
sub arc
{
my $self = shift;
@_ > 5 or Carp::croak('bad parameters to arc');
my ( $cx, $cy, $dx, $dy, $from, $to, $tilt) = @_;
return $self if $from == $to;
if ( $tilt // 0.0 ) {
return $self-> save->
scale( $dx / 2, $dy / 2)->
rotate( $tilt)->
translate( $cx, $cy )->
circular_arc( $from, $to )->
restore;
} else {
return $self-> save->
matrix( $dx / 2, 0, 0, $dy / 2, $cx, $cy )->
circular_arc( $from, $to )->
restore;
}
}
sub rarc
{
my $self = shift;
@_ > 3 or Carp::croak('bad parameters to arcto');
my ( $dx, $dy, $from, $to, $tilt) = @_;
return $self if $from == $to;
$self->save;
$self->scale( $dx / 2, $dy / 2);
$self->rotate( $tilt // 0.0);
$self->cmd( arc => $from, $to, 1 );
$self->restore;
}
sub ellipse
{
my $self = shift;
@_ > 2 or Carp::croak('bad parameters to ellipse');
my ( $cx, $cy, $dx, $dy, $tilt) = @_;
$dy //= $dx;
Prima/Drawable/Path.pm view on Meta::CPAN
Closes the current shape and opens a new one
close() is same as open() but makes sure the shape's first point is equal to its last point.
=item circular_arc ANGLE_START, ANGLE_END
Adds circular arc to the path. Note that adding transformations will effectively
make it into elliptic arc, which is used internally by C<arc> and C<rarc>.
=item chord CENTER_X, CENTER_Y, DIAMETER_X, DIAMETER_Y, ANGLE_START, ANGLE_END.
Adds chord to the path. Is there only for compatibility with C<Prima::Drawable>.
=item ellipse CENTER_X, CENTER_Y, DIAMETER_X, DIAMETER_Y = DIAMETER_X, TILT = 0
Adds full ellipse to the path.
=item glyph INDEX, %OPTIONS
Adds glyph outline to the path. C<%OPTIONS> are passed as is to L<Prima::Drawable/renger_glyph>.
Note that filled glyphs require C<fillMode> without the C<fm::Overlay> bit set and C<fill> option set
to generate proper shapes with holes.
=item line, rline @POINTS
Adds a polyline to path
=item lines [X1, Y1, X2, Y2]..
Adds set of multiple, unconnected lines to the path. Is there only for
compatibility with C<Prima::Drawable>.
=item moveto, rmoveto X, Y
Stops plotting the current shape and moves the plotting position to X, Y.
=item rarc DIAMETER_X, DIAMETER_Y, ANGLE_START, ANGLE_END, TILT = 0
Adds elliptic arc to path so that the first point of the arc starts on the last
point of the previous primitive, or (0,0) if there's none.
=item rectangle X1, Y1, X2, Y2
Adds rectangle to the path. Is there only for compatibility with C<Prima::Drawable>.
=item round_rect X1, Y1, X2, Y2, MAX_DIAMETER
Adds round rectangle to the path.
=item sector CENTER_X, CENTER_Y, DIAMETER_X, DIAMETER_Y, ANGLE_START, ANGLE_END
Adds sector to the path. Is there only for compatibility with C<Prima::Drawable>.
=item spline, rspline $POINTS, %OPTIONS.
Adds B-spline to path. See L<Prima::Drawable/spline> for C<%OPTIONS> descriptions.
=item text TEXT, %OPTIONS
Adds C<TEXT> to the path. C<%OPTIONS> are same as in L<Prima::Drawable/render_glyph>,
except that C<unicode> is deduced automatically based on whether C<TEXT> has utf8 bit
on or off; and an extra option C<cache> with a hash can be used to speed up the function
with subsequent calls. C<baseline> option is same as L<Prima::Drawable/textOutBaseline>.
=back
=head2 Properties
=over
=item canvas DRAWABLE
Provides access to the attached drawable object
=back
=head2 Transformations
Transformation calls change the current path properties (matrix etc)
so that all subsequent calls will use them until a call to C<restore>
is used. C<save> and C<restore> implement a stacking mechanism, so that
local transformations can be made.
The final transformations calculate coordinates the new and the existing matrices:
P' = NewMatrix * P
=over
=item matrix A, B, C, D, Tx, Ty
Applies transformation matrix to the path. The matrix, as used by the module,
is formed as such:
A B 0
C D 0
Tx Ty 1
and when applied to 2D coordinates, is calculated as
X' = AX + CY + Tx
Y' = BX + DY + Ty
=item precision INTEGER
Selects current precision for splines and arcs. See L<Prima::Drawable/spline>, C<precision> entry.
=item antialias BOOLEAN
Turns on and off slow but more visually pleasant antialiased drawing mode.
Default: false
=item restore
Pops the stack entry and replaces the current matrix and graphic properties with it.
=item rotate ANGLE
Adds rotation to the current matrix
( run in 0.364 second using v1.01-cache-2.11-cpan-00829025b61 )