deri pushed a commit to branch master
in repository groff.
commit dd63af83c106a6a44dbb15ab36d5f3e211515ca5
Author: Deri James
AuthorDate: Sat Jun 22 18:33:49 2024 +0100
Fix invalid pdf when using certain sizes of
dashed ellipse in pic.
* src/devices/gropdf/gropdf.pl: For short dashes on flat part
of ellipse some v. small numbers written in form n.nnnE-n which
is invalid for pdfs. Also rather than split each arc always into
4 pieces, split into number of quadrants described between start
and end angle. If arc describes a straight line, use line segment
rather than bezier curve. (grops does this as well)
Fixes https://savannah.gnu.org/bugs/index.php?65901
Thanks to Morten Bo Johansen for reporting this issue.
---
ChangeLog| 16
src/devices/gropdf/gropdf.pl | 60
2 files changed, 55 insertions(+), 21 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index cec91f58e..e9c4c568f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+2024-06-22 Deri James
+
+ [gropdf] Fix invalid pdf when using certain sizes of
+ dashed ellipse in pic.
+
+ * src/devices/gropdf/gropdf.pl: For short dashes on flat part
+ of ellipse some v. small numbers written in form n.nnnE-n which
+ is invalid for pdfs. Also rather than split each arc always into
+ 4 pieces, split into number of quadrants described between start
+ and end angle. If arc describes a straight line, use line segment
+ rather than bezier curve. (grops does this as well)
+
+ Fixes https://savannah.gnu.org/bugs/index.php?65901
+
+ Thanks to Morten Bo Johansen for reporting this issue.
+
2024-06-21 G. Branden Robinson
* src/roff/troff/env.cpp (environment::possibly_break_line):
diff --git a/src/devices/gropdf/gropdf.pl b/src/devices/gropdf/gropdf.pl
index df645c4e0..85a3a5e0f 100644
--- a/src/devices/gropdf/gropdf.pl
+++ b/src/devices/gropdf/gropdf.pl
@@ -3922,7 +3922,7 @@ sub do_D
}
elsif ($Dcmd eq 'a')
{
- # Arc
+ # Arc : h1 v1 h2 v2
$par=substr($par,1);
my (@p)=split(' ',$par);
my $rad180=3.14159;
@@ -3941,25 +3941,43 @@ sub do_D
my ($startang,$r)=RtoP(-$centre->[0],$centre->[1]);
my
($endang,$r2)=RtoP(($p[0]+$p[2])-$centre->[0],-($p[1]+$p[3]-$centre->[1]));
- $endang+=$rad360 if $endang < $startang;
- my $totang=($endang-$startang)/4; # do it in 4 pieces
- # Now 1 piece
-
- my $x0=cos($totang/2);
- my $y0=sin($totang/2);
- my $x3=$x0;
- my $y3=-$y0;
- my $x1=(4-$x0)/3;
- my $y1=((1-$x0)*(3-$x0))/(3*$y0);
- my $x2=$x1;
- my $y2=-$y1;
-
- # Rotate to start position and draw 4 pieces
-
- foreach my $j (0..3)
+ if (abs($endang-$startang) < 0.004)
+ {
+ if ($frot)
+ {
+ $stream.="q $ypos ".GraphY($xpos)." m ".($ypos+$p[1]+$p[3])."
".GraphY($xpos+$p[0]+$p[2])." l S Q\n";
+ }
+ else
+ {
+ $stream.="q $xpos ".GraphY($ypos)." m ".($xpos+$p[0]+$p[2])."
".GraphY($ypos+$p[1]+$p[3])." l S Q\n";
+ }
+ }
+ else
{
-
PlotArcSegment($totang/2+$startang+$j*$totang,$r,$xpos+$centre->[0],GraphY($ypos+$centre->[1]),$x0,$y0,$x1,$y1,$x2,$y2,$x3,$y3);
+ $endang+=$rad360 if $endang < $startang;
+ my $pieces=int(($endang-$startang) / $rad90)+1;
+ my $totang=($endang-$startang)/$pieces; # do it in pieces
+ print STDERR "Pieces=$pieces, P=",join(',',@p),"\n";
+
+ # Now 1 piece
+
+ my $x0=cos($totang/2);
+ my $y0=sin($totang/2);
+ return if !$y0;
+ my $x3=$x0;
+ my $y3=-$y0;
+ my $x1=(4-$x0)/3;
+ my $y1=((1-$x0)*(3-$x0))/(3*$y0);
+ my $x2=$x1;
+ my $y2=-$y1;
+
+ # Rotate to start position and draw pieces
+
+ foreach my $j (0..$pieces-1)
+ {
+
PlotArcSegment($totang/2+$startang+$j*$totang,$r,d3($xpos+$centre->[0]),d3(GraphY($ypos+$centre->[1])),d3($x0),d3($y0),d3($x1),d3($y1),d3($x2),d3($y2),d3($x3),d3($y3));
+ }
}
$xpos+=$p[0]+$p[2];
@@ -4001,7 +4019,7 @@ sub adjust_arc_centre
}
else
{
- return(undef);
+ return([0,0]);
}
}
@@ -4009,8 +4027,8 @@ sub adjust_arc_centre
sub PlotArcSegment
{
my ($ang,$r,$transx,$transy,$x0,$y0,$x1,$y1,$x2,$y2,$x3,$y3)=@_;
-my $cos=cos($ang);
-my $sin=sin($ang);
+my $cos=sprintf("%0.5f",cos($ang));
+my $sin=sprintf("%0.5f",sin($ang));
my @mat=($cos,$sin,-$sin,$cos,0,0);
my $lw=$lwidth/$r;
___
Groff-commit mailing list
Groff-commit@gnu.org
https://lists.gnu.org/mailman/listinfo/groff-commit