our
$VERSION
=
'v1.0.7'
;
my
$RE_REAL
=
"(?:(?i)(?:[-+]?)(?:(?=[.]?[0123456789])(?:[0123456789]*)"
.
"(?:(?:[.])(?:[0123456789]{0,}))?)(?:(?:[E])(?:(?:[-+]?)"
.
"(?:[0123456789]+))|))"
;
my
$DEFAULT_RESOLUTION
= 100.0;
sub
_parseResolution {
my
$value
=
shift
;
my
$state
=
shift
;
my
$pattern
=
"\\s*($RE_REAL)"
.
"(\\s*[/xX,]?\\s*($RE_REAL))?"
.
"(\\s*(dpi|dpcm|dpm))?\\s*"
;
if
(
defined
(
$value
) &&
$value
=~ m/^${pattern}$/) {
my
$x
= $1;
my
$y
= $3;
my
$dpi
;
if
(
defined
($5)) {
if
($5 eq
"dpcm"
) {
$dpi
= 2.54;
}
elsif
($5 eq
"dpm"
) {
$dpi
= 0.0254;
}
else
{
$dpi
= 1.0;
}
}
if
(!
defined
(
$dpi
) &&
defined
(
$y
)) {
if
(
$state
->{
"best_form"
} < 1) {
$state
->{
"x_resolution"
} =
$x
*
$DEFAULT_RESOLUTION
;
$state
->{
"y_resolution"
} =
$y
*
$DEFAULT_RESOLUTION
;
$state
->{
"best_form"
} = 1;
}
return
1;
}
if
(
defined
(
$dpi
) && !
defined
(
$y
)) {
if
(
$state
->{
"best_form"
} < 2) {
$state
->{
"x_resolution"
} =
$x
*
$dpi
;
$state
->{
"y_resolution"
} =
$x
*
$dpi
;
$state
->{
"best_form"
} = 2;
}
return
1;
}
if
(
defined
(
$dpi
) &&
defined
(
$y
)) {
if
(
$state
->{
"best_form"
} < 3) {
$state
->{
"x_resolution"
} =
$x
*
$dpi
;
$state
->{
"y_resolution"
} =
$y
*
$dpi
;
$state
->{
"best_form"
} = 3;
}
return
1
}
}
return
undef
;
}
sub
_convertResolution {
my
$value
=
shift
;
my
$fromImage
=
shift
;
my
$state
= {
x_resolution
=>
$DEFAULT_RESOLUTION
,
y_resolution
=>
$DEFAULT_RESOLUTION
,
best_form
=> 0,
};
if
(
$fromImage
&&
ref
(
$value
) eq
"ARRAY"
) {
foreach
my
$temp
(@{
$value
}) {
&_parseResolution
(
$temp
,
$state
);
}
}
else
{
if
(!
&_parseResolution
(
$value
,
$state
) && !
$fromImage
) {
croak(
"picture: error: ${value}: invalid resolution"
);
}
}
return
[
$state
->{
"x_resolution"
},
$state
->{
"y_resolution"
} ];
}
sub
convertResolution {
my
$fig
=
shift
;
my
$prefix
=
shift
;
my
$value
=
shift
;
my
$context
=
shift
;
return
&_convertResolution
(
$value
, 0);
}
my
@PolylineCommonParameters
= (
\
%Graphics::Fig::Parameters::UnitsParameter
,
\
%Graphics::Fig::Parameters::PositionParameter
,
\
%Graphics::Fig::Parameters::ColorParameter
,
\
%Graphics::Fig::Parameters::DepthParameter
,
@Graphics::Fig::Parameters::FillParameters
,
\
%Graphics::Fig::Parameters::JoinStyleParameter
,
@Graphics::Fig::Parameters::LineParameters
,
\
%Graphics::Fig::Parameters::PointsParameter
,
);
my
%PolylineParameterTemplate
= (
positional
=> {
"@"
=> [
"points"
],
},
named
=> [
@PolylineCommonParameters
,
@Graphics::Fig::Parameters::ArrowParameters
,
\
%Graphics::Fig::Parameters::CapStyleParameter
,
],
);
my
%LinetoParameterTemplate
= (
positional
=> {
".."
=> [
"distance"
,
"heading"
],
"@"
=> [
"points"
],
},
named
=> [
@PolylineCommonParameters
,
@Graphics::Fig::Parameters::ArrowParameters
,
\
%Graphics::Fig::Parameters::CapStyleParameter
,
{
name
=>
"distance"
,
convert
=> \
&Graphics::Fig::Parameters::convertLength
,
},
{
name
=>
"heading"
,
convert
=> \
&Graphics::Fig::Parameters::convertAngle
,
},
{
name
=>
"detachedLineto"
,
convert
=> \
&Graphics::Fig::Parameters::convertBool
,
aliases
=> [
"new"
],
}
],
);
my
%BoxParameterTemplate
= (
positional
=> {
".."
=> [
"width"
,
"height"
],
"@"
=> [
"points"
],
},
named
=> [
@PolylineCommonParameters
,
\
%Graphics::Fig::Parameters::CenterParameter
,
\
%Graphics::Fig::Parameters::CornerRadiusParameter
,
{
name
=>
"width"
,
convert
=> \
&Graphics::Fig::Parameters::convertLength
,
},
{
name
=>
"height"
,
convert
=> \
&Graphics::Fig::Parameters::convertLength
,
},
],
);
my
%PolygonParameterTemplate
= (
positional
=> {
".."
=> [
"n"
,
"r"
],
"@"
=> [
"points"
],
},
named
=> [
@PolylineCommonParameters
,
\
%Graphics::Fig::Parameters::CenterParameter
,
\
%Graphics::Fig::Parameters::RotationParameter
,
{
name
=>
"n"
,
convert
=> \
&Graphics::Fig::Parameters::convertInt
,
},
{
name
=>
"r"
,
convert
=> \
&Graphics::Fig::Parameters::convertLength
,
aliases
=> [
"radius"
],
},
],
);
my
%PictureParameterTemplate
= (
positional
=> {
""
=> [ ],
"."
=> [
"filename"
],
".."
=> [
"filename"
,
"width"
],
"..."
=> [
"filename"
,
"width"
,
"height"
],
".@"
=> [
"filename"
,
"points"
],
},
named
=> [
@PolylineCommonParameters
,
\
%Graphics::Fig::Parameters::CenterParameter
,
{
name
=>
"filename"
,
},
{
name
=>
"width"
,
convert
=> \
&Graphics::Fig::Parameters::convertLength
,
},
{
name
=>
"height"
,
convert
=> \
&Graphics::Fig::Parameters::convertLength
,
},
{
name
=>
"resolution"
,
convert
=> \
&convertResolution
,
},
],
);
sub
new {
my
$proto
=
shift
;
my
$subtype
=
shift
;
my
$parameters
=
shift
;
my
$self
= {
subtype
=>
$subtype
,
lineStyle
=> ${
$parameters
}{
"lineStyle"
},
lineThickness
=> ${
$parameters
}{
"lineThickness"
},
penColor
=> ${
$parameters
}{
"penColor"
},
fillColor
=> ${
$parameters
}{
"fillColor"
},
depth
=> ${
$parameters
}{
"depth"
},
areaFill
=> ${
$parameters
}{
"areaFill"
},
styleVal
=> ${
$parameters
}{
"styleVal"
},
joinStyle
=> ${
$parameters
}{
"joinStyle"
},
capStyle
=> 0,
cornerRadius
=> 0,
fArrow
=>
undef
,
bArrow
=>
undef
,
points
=> [],
};
my
$class
=
ref
(
$proto
) ||
$proto
;
bless
(
$self
,
$class
);
return
$self
;
}
sub
polyline {
my
$proto
=
shift
;
my
$fig
=
shift
;
my
%parameters
;
my
$stack
= ${
$fig
}{
"stack"
};
my
$tos
= ${
$stack
}[$
eval
{
Graphics::Fig::Parameters::parse(
$fig
,
"polyline"
,
\
%PolylineParameterTemplate
,
${
$tos
}{
"options"
}, \
%parameters
,
@_
);
};
if
($@) {
$@ =~ s/ at [^\s]* line \d+\.\n//;
croak(
"$@"
);
}
my
$temp
;
if
(!
defined
(
$temp
=
$parameters
{
"points"
}) ||
scalar
(@{
$temp
} < 2)) {
croak(
"polyline: error: at least two points must be given"
);
}
my
$self
=
$proto
->new(1, \
%parameters
);
${
$self
}{
"capStyle"
} =
$parameters
{
"capStyle"
};
${
$self
}{
"points"
} =
$parameters
{
"points"
};
Graphics::Fig::Parameters::copyArrowParameters(
$self
, \
%parameters
);
push
(@{${
$tos
}{
"objects"
}},
$self
);
return
$self
;
}
sub
lineto {
my
$proto
=
shift
;
my
$fig
=
shift
;
my
$self
;
my
%parameters
;
my
$stack
= ${
$fig
}{
"stack"
};
my
$tos
= ${
$stack
}[$
eval
{
Graphics::Fig::Parameters::parse(
$fig
,
"lineto"
,
\
%LinetoParameterTemplate
,
${
$tos
}{
"options"
}, \
%parameters
,
@_
);
};
if
($@) {
$@ =~ s/ at [^\s]* line \d+\.\n//;
croak(
"$@"
);
}
my
$newPoints
=
$parameters
{
"points"
};
if
(!
defined
(
$newPoints
)) {
if
(!
defined
(
$parameters
{
"distance"
})) {
croak(
"lineto error: expected distance and heading, or points"
);
}
if
(!
defined
(
$parameters
{
"heading"
})) {
croak(
"lineto error: expected distance and heading, or points"
);
}
$newPoints
= [[
$parameters
{
"position"
}[0] +
$parameters
{
"distance"
} *
cos
(
$parameters
{
"heading"
}),
$parameters
{
"position"
}[1] -
$parameters
{
"distance"
} *
sin
(
$parameters
{
"heading"
})
]];
}
else
{
if
(
defined
(
$parameters
{
"distance"
})) {
croak(
"lineto error: distance cannot be given with points"
);
}
if
(
defined
(
$parameters
{
"heading"
})) {
croak(
"lineto error: heading cannot be given with points"
);
}
if
(
scalar
(@{
$newPoints
}) == 0) {
croak(
"lineto error: expected at least one point"
);
}
}
my
$curPoints
;
my
$finalPoint
;
if
(
defined
(
$self
= ${
$tos
}{
"openLineto"
})) {
$curPoints
= ${
$self
}{
"points"
};
$finalPoint
= ${
$curPoints
}[$
}
my
$position
=
$parameters
{
"position"
};
if
(!
defined
(
$self
) || !
defined
(
$finalPoint
) ||
$parameters
{
"detachedLineto"
} ||
${
$position
}[0] != ${
$finalPoint
}[0] ||
${
$position
}[1] != ${
$finalPoint
}[1] ||
${
$self
}{
"lineStyle"
} !=
$parameters
{
"lineStyle"
} ||
${
$self
}{
"lineThickness"
} !=
$parameters
{
"lineThickness"
} ||
${
$self
}{
"penColor"
} !=
$parameters
{
"penColor"
} ||
${
$self
}{
"fillColor"
} !=
$parameters
{
"fillColor"
} ||
${
$self
}{
"depth"
} !=
$parameters
{
"depth"
} ||
${
$self
}{
"areaFill"
} !=
$parameters
{
"areaFill"
} ||
${
$self
}{
"styleVal"
} !=
$parameters
{
"styleVal"
} ||
${
$self
}{
"joinStyle"
} !=
$parameters
{
"joinStyle"
} ||
${
$self
}{
"capStyle"
} !=
$parameters
{
"capStyle"
} ||
Graphics::Fig::Parameters::compareArrowParameters(
$self
,
\
%parameters
) != 0) {
$self
=
$proto
->new(1, \
%parameters
);
${
$self
}{
"capStyle"
} =
$parameters
{
"capStyle"
};
${
$self
}{
"points"
} =
$parameters
{
"points"
};
Graphics::Fig::Parameters::copyArrowParameters(
$self
, \
%parameters
);
$curPoints
= [
$position
];
${
$self
}{
"points"
} =
$curPoints
;
push
(@{${
$tos
}{
"objects"
}},
$self
);
${
$tos
}{
"openLineto"
} =
$self
;
}
push
(@{
$curPoints
}, @{
$newPoints
});
${
$tos
}{
"options"
}{
"position"
} = ${
$newPoints
}[$
return
$self
;
}
sub
box {
my
$proto
=
shift
;
my
$fig
=
shift
;
my
%parameters
;
my
$stack
= ${
$fig
}{
"stack"
};
my
$tos
= ${
$stack
}[$
eval
{
Graphics::Fig::Parameters::parse(
$fig
,
"box"
,
\
%BoxParameterTemplate
,
${
$tos
}{
"options"
}, \
%parameters
,
@_
);
};
if
($@) {
$@ =~ s/ at [^\s]* line \d+\.\n//;
croak(
"$@"
);
}
my
$self
;
my
$cornerRadius
=
$parameters
{
"cornerRadius"
};
if
(
defined
(
$cornerRadius
) &&
$cornerRadius
!= 0) {
$self
=
$proto
->new(4, \
%parameters
);
${
$self
}{
"cornerRadius"
} =
$cornerRadius
;
}
else
{
$self
=
$proto
->new(2, \
%parameters
);
}
my
$temp
;
if
(
defined
(
$temp
=
$parameters
{
"points"
})) {
my
(
$x1
,
$y1
,
$x2
,
$y2
);
if
(
defined
(
$parameters
{
"width"
})) {
croak(
"box: error: width not allowed with points"
);
}
if
(
defined
(
$parameters
{
"height"
})) {
croak(
"box: error: height not allowed with points"
);
}
if
(
defined
(
$parameters
{
"center"
})) {
croak(
"box: error: center not allowed with points"
);
}
if
(
scalar
(@{
$temp
}) == 1) {
(
$x1
,
$y1
) = @{
$parameters
{
"position"
}};
(
$x2
,
$y2
) = @{${
$temp
}[0]};
}
elsif
(
scalar
(@{
$temp
}) == 2) {
(
$x1
,
$y1
) = @{${
$temp
}[0]};
(
$x2
,
$y2
) = @{${
$temp
}[1]};
}
else
{
croak(
"box: error: expected 1 or 2 points"
);
}
${
$self
}{
"points"
} = [
[
$x1
,
$y1
], [
$x2
,
$y1
], [
$x2
,
$y2
], [
$x1
,
$y2
], [
$x1
,
$y1
]
];
}
elsif
(
defined
(
my
$width
=
$parameters
{
"width"
}) &&
defined
(
my
$height
=
$parameters
{
"height"
})) {
my
(
$xc
,
$yc
);
if
(
defined
(
$parameters
{
"center"
})) {
(
$xc
,
$yc
) = @{
$parameters
{
"center"
}};
}
else
{
(
$xc
,
$yc
) = @{
$parameters
{
"position"
}};
}
my
$dx
=
$width
/ 2.0;
my
$dy
=
$height
/ 2.0;
${
$self
}{
"points"
} = [
[
$xc
-
$dx
,
$yc
-
$dy
],
[
$xc
+
$dx
,
$yc
-
$dy
],
[
$xc
+
$dx
,
$yc
+
$dy
],
[
$xc
-
$dx
,
$yc
+
$dy
],
[
$xc
-
$dx
,
$yc
-
$dy
]
];
}
else
{
croak(
"box: error: expected width and height or 1 or 2 points"
);
}
push
(@{${
$tos
}{
"objects"
}},
$self
);
return
$self
;
}
sub
polygon {
my
$proto
=
shift
;
my
$fig
=
shift
;
my
%parameters
;
my
$stack
= ${
$fig
}{
"stack"
};
my
$tos
= ${
$stack
}[$
eval
{
Graphics::Fig::Parameters::parse(
$fig
,
"polygon"
,
\
%PolygonParameterTemplate
,
${
$tos
}{
"options"
}, \
%parameters
,
@_
);
};
if
($@) {
$@ =~ s/ at [^\s]* line \d+\.\n//;
croak(
"$@"
);
}
my
$self
=
$proto
->new(3, \
%parameters
);
my
$n
;
if
(
defined
(
$n
=
$parameters
{
"n"
})) {
my
$center
;
my
$rotation
= 0.0;
my
$firstPoint
;
my
$basePoint
;
if
(
$n
< 3) {
croak(
"polygon: error: n must be at least 3"
);
}
if
(
defined
(
$parameters
{
"center"
})) {
$center
=
$parameters
{
"center"
};
}
else
{
$center
=
$parameters
{
"position"
};
}
if
(
defined
(
$parameters
{
"points"
})) {
my
$points
=
$parameters
{
"points"
};
if
(
scalar
(@{
$points
}) != 1) {
croak(
"polygon: error: only one point allowed with n"
);
}
$firstPoint
= ${
$points
}[0];
$basePoint
= [ ${
$firstPoint
}[0] - ${
$center
}[0],
${
$firstPoint
}[1] - ${
$center
}[1] ];
if
(
defined
(
$parameters
{
"r"
})) {
croak(
"polygon: error: r not allowed with points"
);
}
if
(
defined
(
$parameters
{
"rotation"
})) {
croak(
"polygon: error: rotation not allowed with points"
);
}
}
else
{
my
$r
;
if
(!
defined
(
$r
=
$parameters
{
"r"
})) {
croak(
"polygon: error: r parameter required"
);
}
if
(
defined
(
$parameters
{
"rotation"
})) {
$rotation
=
$parameters
{
"rotation"
};
}
$basePoint
= [
$r
*
cos
(
$rotation
), -
$r
*
sin
(
$rotation
) ];
$firstPoint
= [ ${
$basePoint
}[0] + ${
$center
}[0],
${
$basePoint
}[1] + ${
$center
}[1] ];
}
push
(@{${
$self
}{
"points"
}},
$firstPoint
);
for
(
my
$i
= 1;
$i
<
$n
; ++
$i
) {
my
$c
=
cos
(2 * pi *
$i
/
$n
);
my
$s
=
sin
(2 * pi *
$i
/
$n
);
my
$point
= [
$c
* ${
$basePoint
}[0] +
$s
* ${
$basePoint
}[1] + ${
$center
}[0],
-
$s
* ${
$basePoint
}[0] +
$c
* ${
$basePoint
}[1] + ${
$center
}[1]
];
push
(@{${
$self
}{
"points"
}},
$point
);
}
}
else
{
my
$points
=
$parameters
{
"points"
};
if
(
scalar
(@{
$points
}) < 3) {
croak(
"polygon: error: expected n or at least 3 points"
);
}
if
(
defined
(
$parameters
{
"r"
})) {
croak(
"polygon: error: r not allowed with points"
);
}
if
(
defined
(
$parameters
{
"rotation"
})) {
croak(
"polygon: error: rotation not allowed with points"
);
}
@{${
$self
}{
"points"
}} = @{
$points
};
}
{
my
$points
= ${
$self
}{
"points"
};
push
(@{
$points
}, ${
$points
}[0]);
}
push
(@{${
$tos
}{
"objects"
}},
$self
);
return
$self
;
}
sub
picture {
my
$proto
=
shift
;
my
$fig
=
shift
;
my
%parameters
;
my
$stack
= ${
$fig
}{
"stack"
};
my
$tos
= ${
$stack
}[$
eval
{
Graphics::Fig::Parameters::parse(
$fig
,
"pictures"
,
\
%PictureParameterTemplate
,
${
$tos
}{
"options"
}, \
%parameters
,
@_
);
};
if
($@) {
$@ =~ s/ at [^\s]* line \d+\.\n//;
croak(
"$@"
);
}
my
$filename
=
$parameters
{
"filename"
};
if
(!
defined
(
$filename
)) {
croak(
"picture: error: filename must be given"
);
}
if
(
$filename
=~ m/\n/) {
croak(
"picture: error: invalid filename"
);
}
my
$self
=
$proto
->new(5, \
%parameters
);
${
$self
}{
"filename"
} =
$filename
;
${
$self
}{
"flipped"
} = 0;
my
$temp
;
if
(
defined
(
$temp
=
$parameters
{
"points"
})) {
my
(
$x1
,
$y1
,
$x2
,
$y2
);
if
(
defined
(
$parameters
{
"width"
})) {
croak(
"picture: error: width not allowed with points"
);
}
if
(
defined
(
$parameters
{
"height"
})) {
croak(
"picture: error: height not allowed with points"
);
}
if
(
defined
(
$parameters
{
"center"
})) {
croak(
"picture: error: center not allowed with points"
);
}
if
(
scalar
(@{
$temp
}) == 1) {
(
$x1
,
$y1
) = @{
$parameters
{
"position"
}};
(
$x2
,
$y2
) = @{${
$temp
}[0]};
}
elsif
(
scalar
(@{
$temp
}) == 2) {
(
$x1
,
$y1
) = @{${
$temp
}[0]};
(
$x2
,
$y2
) = @{${
$temp
}[1]};
}
else
{
croak(
"picture: error: expected 1 or 2 points"
);
}
${
$self
}{
"points"
} = [
[
$x1
,
$y1
], [
$x2
,
$y1
], [
$x2
,
$y2
], [
$x1
,
$y2
], [
$x1
,
$y1
]
];
}
else
{
my
(
$xc
,
$yc
);
if
(
defined
(
$parameters
{
"center"
})) {
(
$xc
,
$yc
) = @{
$parameters
{
"center"
}};
}
else
{
(
$xc
,
$yc
) = @{
$parameters
{
"position"
}};
}
my
$width
=
$parameters
{
"width"
};
my
$height
=
$parameters
{
"height"
};
my
$resolution
=
$parameters
{
"resolution"
};
if
(!
defined
(
$width
) || !
defined
(
$height
)) {
my
$info
= image_info(
$filename
);
if
(
my
$error
= ${
$info
}{
"error"
}) {
croak(
"picture: error: ${error}"
);
}
if
(!
defined
(
$resolution
)) {
$resolution
=
&_convertResolution
(${
$info
}{
"resolution"
}, 1);
}
die
"picture: internal error"
unless
ref
(
$resolution
) eq
"ARRAY"
;
my
$nWidth
= ${
$info
}{
"width"
};
my
$nHeight
= ${
$info
}{
"height"
};
if
(!
defined
(
$nWidth
) ||
$nWidth
<= 0.0 ||
!
defined
(
$nHeight
) ||
$nHeight
<= 0.0) {
croak(
"picture: error: cannot determine image size"
);
}
$nWidth
/= ${
$resolution
}[0];
$nHeight
/= ${
$resolution
}[1];
if
(
defined
(
$width
)) {
$height
=
$nHeight
*
$width
/
$nWidth
;
}
elsif
(
defined
(
$height
)) {
$width
=
$nWidth
*
$height
/
$nHeight
;
}
else
{
$width
=
$nWidth
;
$height
=
$nHeight
;
}
}
my
$dx
=
$width
/ 2.0;
my
$dy
=
$height
/ 2.0;
${
$self
}{
"points"
} = [
[
$xc
-
$dx
,
$yc
-
$dy
],
[
$xc
+
$dx
,
$yc
-
$dy
],
[
$xc
+
$dx
,
$yc
+
$dy
],
[
$xc
-
$dx
,
$yc
+
$dy
],
[
$xc
-
$dx
,
$yc
-
$dy
]
];
}
push
(@{${
$tos
}{
"objects"
}},
$self
);
return
$self
;
}
sub
translate {
my
$self
=
shift
;
my
$parameters
=
shift
;
@{${
$self
}{
"points"
}} = Graphics::Fig::Parameters::translatePoints(
$parameters
, @{${
$self
}{
"points"
}});
return
1;
}
sub
rotate {
my
$self
=
shift
;
my
$parameters
=
shift
;
my
$rotation
= ${
$parameters
}{
"rotation"
};
@{${
$self
}{
"points"
}} = Graphics::Fig::Parameters::rotatePoints(
$parameters
, @{${
$self
}{
"points"
}});
my
$subtype
= ${
$self
}{
"subtype"
};
if
(
sin
(
$rotation
) *
cos
(
$rotation
) != 0 &&
(
$subtype
== 2 ||
$subtype
== 4)) {
${
$self
}{
"subtype"
} = 3;
}
return
1;
}
sub
scale {
my
$self
=
shift
;
my
$parameters
=
shift
;
@{${
$self
}{
"points"
}} = Graphics::Fig::Parameters::scalePoints(
$parameters
, @{${
$self
}{
"points"
}});
my
$subtype
= ${
$self
}{
"subtype"
};
if
(
$subtype
== 5) {
my
$scale
= ${
$parameters
}{
"scale"
};
if
(${
$scale
}[0] * ${
$scale
}[1] < 0) {
${
$self
}{
"flipped"
} ^= 1;
}
}
}
sub
getbbox {
my
$self
=
shift
;
my
$parameters
=
shift
;
return
Graphics::Fig::Parameters::getbboxFromPoints(@{${
$self
}{
"points"
}});
}
sub
print
{
my
$self
=
shift
;
my
$fh
=
shift
;
my
$parameters
=
shift
;
my
$figPerInch
= Graphics::Fig::_figPerInch(
$parameters
);
my
$subtype
= ${
$self
}{
"subtype"
};
printf
$fh
(
"2 %d %d %.0f %d %d %d -1 %d %.3f %d %d %.0f %d %d %d\n"
,
$subtype
,
${
$self
}{
"lineStyle"
},
${
$self
}{
"lineThickness"
} * 80.0,
${
$self
}{
"penColor"
},
${
$self
}{
"fillColor"
},
${
$self
}{
"depth"
},
${
$self
}{
"areaFill"
},
${
$self
}{
"styleVal"
} * 80.0,
${
$self
}{
"joinStyle"
},
${
$self
}{
"capStyle"
},
${
$self
}{
"cornerRadius"
} * 80.0,
defined
(${
$self
}{
"fArrow"
}) ? 1 : 0,
defined
(${
$self
}{
"bArrow"
}) ? 1 : 0,
scalar
(@{${
$self
}{
"points"
}}));
Graphics::Fig::Parameters::printArrowParameters(
$self
,
$fh
,
$parameters
);
if
(
$subtype
== 5) {
printf
$fh
(
" %d %s\n"
, ${
$self
}{
"flipped"
}, ${
$self
}{
"filename"
});
}
foreach
my
$point
(@{${
$self
}{
"points"
}}) {
printf
$fh
(
"\t%.0f %.0f\n"
,
${
$point
}[0] *
$figPerInch
,
${
$point
}[1] *
$figPerInch
);
}
}
1;