[latex3-commits] [git/LaTeX3-latex3-latex3] master: Round corners in drawing paths (aca5418)
Joseph Wright
joseph.wright at morningstar2.co.uk
Mon Feb 26 11:05:13 CET 2018
Repository : https://github.com/latex3/latex3
On branch : master
Link : https://github.com/latex3/latex3/commit/aca54185c1234bf9013915eccce42610a52951a6
>---------------------------------------------------------------
commit aca54185c1234bf9013915eccce42610a52951a6
Author: Joseph Wright <joseph.wright at morningstar2.co.uk>
Date: Mon Feb 26 09:58:27 2018 +0000
Round corners in drawing paths
The same ideas as in pgf, so the same limitation
if the path is short ...
>---------------------------------------------------------------
aca54185c1234bf9013915eccce42610a52951a6
l3experimental/l3draw/l3draw-paths.dtx | 1 +
l3experimental/l3draw/l3draw-softpath.dtx | 367 +++++++++++++++++++-
l3experimental/l3draw/l3draw.dtx | 36 ++
l3experimental/l3draw/testfiles/m3draw000.tlg | 2 +
l3experimental/l3draw/testfiles/m3draw003.ptex.tlg | 13 +-
l3experimental/l3draw/testfiles/m3draw003.tlg | 13 +-
.../l3draw/testfiles/m3draw003.uptex.tlg | 13 +-
.../l3draw/testfiles/m3draw003.xetex.tlg | 13 +-
8 files changed, 440 insertions(+), 18 deletions(-)
diff --git a/l3experimental/l3draw/l3draw-paths.dtx b/l3experimental/l3draw/l3draw-paths.dtx
index 2e16122..fb6bc93 100644
--- a/l3experimental/l3draw/l3draw-paths.dtx
+++ b/l3experimental/l3draw/l3draw-paths.dtx
@@ -892,6 +892,7 @@
{ \ERROR }
}
}
+ \@@_softpath_round_corners:
\bool_lazy_and:nnT
{ \l_@@_update_bb_bool }
{ \l_@@_path_use_stroke_bool }
diff --git a/l3experimental/l3draw/l3draw-softpath.dtx b/l3experimental/l3draw/l3draw-softpath.dtx
index f10d792..72f2278 100644
--- a/l3experimental/l3draw/l3draw-softpath.dtx
+++ b/l3experimental/l3draw/l3draw-softpath.dtx
@@ -58,6 +58,8 @@
%<@@=draw>
% \end{macrocode}
%
+% \subsection{Managing soft paths}
+%
% There are two linked aims in the code here. The most significant is to
% provide a way to modify paths, for example to shorten the ends or round
% the corners. This means that the path cannot be written piecemeal as
@@ -100,6 +102,13 @@
% \end{macrocode}
% \end{variable}
%
+% \begin{variable}{\g_@@_softpath_corners_bool}
+% Allow for optimised path use.
+% \begin{macrocode}
+\bool_new:N \g_@@_softpath_corners_bool
+% \end{macrocode}
+% \end{variable}
+%
% \begin{macro}{\@@_softpath_add:n, \@@_softpath_add:x}
% \begin{macro}{\@@_softpath_concat:n}
% \begin{macro}{\@@_softpath_reset_buffers:}
@@ -186,6 +195,7 @@
\tl_gclear:N \g_@@_softpath_main_tl
\tl_gclear:N \g_@@_softpath_buffer_a_tl
\tl_gclear:N \g_@@_softpath_buffer_b_tl
+ \bool_gset_false:N \g_@@_softpath_corners_bool
}
\cs_new_protected:Npn \@@_softpath_use_clear:
{
@@ -267,6 +277,7 @@
{
\@@_softpath_add:n
{ \@@_softpath_roundpoint_op:nn {#1} {#2} }
+ \bool_gset_true:N \g_@@_softpath_corners_bool
}
\cs_generate_variant:Nn \@@_softpath_roundpoint:nn { VV }
% \end{macrocode}
@@ -290,6 +301,8 @@
% \begin{macro}{\@@_softpath_curveto_opi:nnNnnNnn}
% \begin{macro}{\@@_softpath_rectangle_opi:nnNnn}
% The markers for operations: all the top-level ones take two arguments.
+% The support tokens for curves have to be different in meaning to a
+% round point, hence being quark-like.
% \begin{macrocode}
\cs_new_protected:Npn \@@_softpath_close_op:nn #1#2
{ \driver_draw_closepath: }
@@ -297,8 +310,10 @@
{ \@@_softpath_curveto_opi:nnNnnNnn {#1} {#2} }
\cs_new_protected:Npn \@@_softpath_curveto_opi:nnNnnNnn #1#2#3#4#5#6#7#8
{ \driver_draw_curveto:nnnnnn {#1} {#2} {#4} {#5} {#7} {#8} }
-\cs_new_protected:Npn \@@_softpath_curveto_opii:nn #1#2 { }
-\cs_new_protected:Npn \@@_softpath_curveto_opiii:nn #1#2 { }
+\cs_new_protected:Npn \@@_softpath_curveto_opii:nn #1#2
+ { \@@_softpath_curveto_opii:nn }
+\cs_new_protected:Npn \@@_softpath_curveto_opiii:nn #1#2
+ { \@@_softpath_curveto_opiii:nn }
\cs_new_protected:Npn \@@_softpath_lineto_op:nn #1#2
{ \driver_draw_lineto:nn {#1} {#2} }
\cs_new_protected:Npn \@@_softpath_moveto_op:nn #1#2
@@ -314,6 +329,354 @@
% \end{macro}
% \end{macro}
%
+% \subsection{Rounding soft path corners}
+%
+% The aim here is to find corner rounding points and to replace them with
+% arcs of appropriate length. The approach is exactly that in \pkg{pgf}:
+% step through, find the corners, find the supporting data, do the rounding.
+%
+% \begin{variable}{\l_@@_softpath_main_tl}
+% For constructing the updated path: notice that we use \pkg{l3tl-build}
+% here as grouping can be controlled.
+% \begin{macrocode}
+\tl_new:N \l_@@_softpath_main_tl
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_@@_softpath_part_tl}
+% Data structures.
+% \begin{macrocode}
+\tl_new:N \l_@@_softpath_part_tl
+\tl_new:N \l_@@_softpath_curve_end_tl
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}
+% {\l_@@_softpath_lastx_fp, \l_@@_softpath_lasty_fp}
+% \begin{variable}
+% {\l_@@_softpath_corneri_dim, \l_@@_softpath_cornerii_dim}
+% \begin{variable}{\l_@@_softpath_first_tl, \l_@@_softpath_move_tl}
+% Position tracking: the token list data may be entirely empty or set to
+% a co-ordinate.
+% \begin{macrocode}
+\fp_new:N \l_@@_softpath_lastx_fp
+\fp_new:N \l_@@_softpath_lasty_fp
+\dim_new:N \l_@@_softpath_corneri_dim
+\dim_new:N \l_@@_softpath_cornerii_dim
+\tl_new:N \l_@@_softpath_first_tl
+\tl_new:N \l_@@_softpath_move_tl
+% \end{macrocode}
+% \end{variable}
+% \end{variable}
+% \end{variable}
+%
+% \begin{macro}{\@@_softpath_round_corners:}
+% \begin{macro}{\@@_softpath_round_loop:Nnn}
+% \begin{macro}{\@@_softpath_round_action:nn}
+% \begin{macro}{\@@_softpath_round_action:Nnn}
+% \begin{macro}{\@@_softpath_round_action_curveto:NnnNnn}
+% \begin{macro}{\@@_softpath_round_action_close:}
+% \begin{macro}{\@@_softpath_round_lookahead:NnnNnn}
+% \begin{macro}{\@@_softpath_round_roundpoint:NnnNnnNnn}
+% \begin{macro}{\@@_softpath_round_calc:nnnNnn}
+% \begin{macro}[EXP]
+% {\@@_softpath_round_calc:nnnnnn, \@@_softpath_round_calc:fVnnnn}
+% \begin{macro}[EXP]{\@@_softpath_round_calc:nnnnw}
+% \begin{macro}{\@@_softpath_round_close:nn}
+% \begin{macro}[EXP]{\@@_softpath_round_close:w}
+% \begin{macro}{\@@_softpath_round_end:}
+% Rounding corners on a path means going through the entire path and
+% adjusting it. As such, we avoid this entirely if we know there are no
+% corners to deal with. Assuming there is work to do, we recover the existing
+% path and start a loop, using \pkg{l3tl-build} for the main data storage
+% (everything here can be in a group).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_softpath_round_corners:
+ {
+ \bool_if:NT \g_@@_softpath_corners_bool
+ {
+ \__tl_build:Nw \l_@@_softpath_main_tl
+ \tl_clear:N \l_@@_softpath_part_tl
+ \fp_zero:N \l_@@_softpath_lastx_fp
+ \fp_zero:N \l_@@_softpath_lasty_fp
+ \tl_clear:N \l_@@_softpath_first_tl
+ \tl_clear:N \l_@@_softpath_move_tl
+ \@@_softpath_concat:n { }
+ \exp_after:wN \@@_softpath_round_loop:Nnn
+ \g_@@_softpath_main_tl
+ \q_recursion_tail ? ?
+ \q_recursion_stop
+ }
+ \bool_gset_false:N \g_@@_softpath_corners_bool
+ }
+% \end{macrocode}
+% The loop can take advantage of the fact that all soft path operations are
+% made up of a token followed by two arguments. At this stage, there is
+% a simple split: have we round a round point. If so, is there any actual
+% rounding to be done: if the arcs have come through zero, just ignore it.
+% In cases where we are not at a corner, we simply move along the path,
+% allowing for any new part starting due to a \texttt{moveto}.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_softpath_round_loop:Nnn #1#2#3
+ {
+ \quark_if_recursion_tail_stop_do:Nn #1 { \@@_softpath_round_end: }
+ \token_if_eq_meaning:NNTF #1 \@@_softpath_roundpoint_op:nn
+ { \@@_softpath_round_action:nn {#2} {#3} }
+ {
+ \tl_if_empty:NT \l_@@_softpath_first_tl
+ { \tl_set:Nn \l_@@_softpath_first_tl { {#2} {#3} } }
+ \fp_set:Nn \l_@@_softpath_lastx_fp {#2}
+ \fp_set:Nn \l_@@_softpath_lasty_fp {#3}
+ \token_if_eq_meaning:NNTF #1 \@@_softpath_moveto_op:nn
+ {
+ \__tl_build_one:o \l_@@_softpath_move_tl
+ \__tl_build_one:o \l_@@_softpath_part_tl
+ \tl_set:Nn \l_@@_softpath_move_tl { #1 {#2} {#3} }
+ \tl_clear:N \l_@@_softpath_first_tl
+ \tl_clear:N \l_@@_softpath_part_tl
+ }
+ { \tl_put_right:Nn \l_@@_softpath_part_tl { #1 {#2} {#3} } }
+ \@@_softpath_round_loop:Nnn
+ }
+ }
+\cs_new_protected:Npn \@@_softpath_round_action:nn #1#2
+ {
+ \dim_set:Nn \l_@@_softpath_corneri_dim {#1}
+ \dim_set:Nn \l_@@_softpath_cornerii_dim {#2}
+ \bool_lazy_and:nnTF
+ { \dim_compare_p:nNn \l_@@_softpath_corneri_dim = { 0pt } }
+ { \dim_compare_p:nNn \l_@@_softpath_cornerii_dim = { 0pt } }
+ { \@@_softpath_round_loop:Nnn }
+ { \@@_softpath_round_action:Nnn }
+ }
+% \end{macrocode}
+% We now have a round point to work on and have grabbed the next item in
+% the path. There are only a few cases where we have to do anything. Each of
+% them is picked up by looking for the appropriate action.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_softpath_round_action:Nnn #1#2#3
+ {
+ \tl_if_empty:NT \l_@@_softpath_first_tl
+ { \tl_set:Nn \l_@@_softpath_first_tl { {#2} {#3} } }
+ \token_if_eq_meaning:NNTF #1 \@@_softpath_curveto_opi:nn
+ { \@@_softpath_round_action_curveto:NnnNnn }
+ {
+ \token_if_eq_meaning:NNTF #1 \@@_softpath_close_op:nn
+ { \@@_softpath_round_action_close: }
+ {
+ \token_if_eq_meaning:NNTF #1 \@@_softpath_lineto_op:nn
+ { \@@_softpath_round_lookahead:NnnNnn }
+ { \@@_softpath_round_loop:Nnn }
+ }
+ }
+ #1 {#2} {#3}
+ }
+% \end{macrocode}
+% For a curve, we collect the two control points then move on to grab the
+% end point and add the curve there: the second control point becomes our
+% starter.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_softpath_round_action_curveto:NnnNnn
+ #1#2#3#4#5#6
+ {
+ \tl_put_right:Nn \l_@@_softpath_part_tl
+ { #1 {#2} {#3} #4 {#5} {#6} }
+ \fp_set:Nn \l_@@_softpath_lastx_fp {#5}
+ \fp_set:Nn \l_@@_softpath_lasty_fp {#6}
+ \@@_softpath_round_lookahead:NnnNnn
+ }
+\cs_new_protected:Npn \@@_softpath_round_action_close:
+ {
+ \bool_lazy_and:nnTF
+ { ! \tl_if_empty_p:N \l_@@_softpath_first_tl }
+ { ! \tl_if_empty_p:N \l_@@_softpath_move_tl }
+ {
+ \exp_after:wN \@@_softpath_round_close:nn
+ \l_@@_softpath_first_tl
+ }
+ { \@@_softpath_round_loop:Nnn }
+ }
+% \end{macrocode}
+% At this stage we have a current (sub)operation (|#1|) and the next
+% operation (|#4|), and can therefore decide whether to round or not.
+% In the case of yet another rounding marker, we have to look a bit
+% further ahead.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_softpath_round_lookahead:NnnNnn #1#2#3#4#5#6
+ {
+ \bool_lazy_any:nTF
+ {
+ { \token_if_eq_meaning_p:NN #4 \@@_softpath_lineto_op:nn }
+ { \token_if_eq_meaning_p:NN #4 \@@_softpath_curveto_opi:nn }
+ { \token_if_eq_meaning_p:NN #4 \@@_softpath_close_op:nn }
+ }
+ {
+ \@@_softpath_round_calc:nnnNnn
+ \@@_softpath_round_loop:Nnn {#5} {#6}
+ }
+ {
+ \token_if_eq_meaning:NNTF #4 \@@_softpath_roundpoint_op:nn
+ { \@@_softpath_round_roundpoint:NnnNnnNnn }
+ { \@@_softpath_round_loop:Nnn }
+ }
+ #1 {#2} {#3}
+ #4 {#5} {#6}
+ }
+\cs_new_protected:Npn \@@_softpath_round_roundpoint:NnnNnnNnn
+ #1#2#3#4#5#6#7#8#9
+ {
+ \@@_softpath_round_calc:nnnNnn
+ \@@_softpath_round_loop:Nnn
+ {#8} {#9} #1 {#2} {#3}
+ #4 {#5} {#6} #7 {#8} {#9}
+ }
+% \end{macrocode}
+% We now have all of the data needed to construct a rounded corner: all that
+% is left to do is to work out the detail! At this stage, we have details
+% of where the corner itself is (|#4|, |#5|), and where the next point is
+% (|#1|, |#2|). There are two types of calculations to do. First, we
+% need to interpolate from those two points in the direction of the
+% corner, in order to work out where the curve we are adding will start
+% and end. From those, plus the points we already have, we work out where
+% the control points will lie. All of this is done in an expansion to
+% avoid multiple calls to |\tl_put_right:Nx|. The end point of the line
+% is worked out up-front and saved: we need that if dealing with a
+% close-path operation.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_softpath_round_calc:nnnNnn #1#2#3#4#5#6
+ {
+ \tl_set:Nx \l_@@_softpath_curve_end_tl
+ {
+ \draw_point_interpolate_distance:nnn
+ \l_@@_softpath_cornerii_dim
+ { #5 , #6 } { #2 , #3 }
+ }
+ \tl_put_right:Nx \l_@@_softpath_part_tl
+ {
+ \exp_not:N #4
+ \@@_softpath_round_calc:fVnnnn
+ {
+ \draw_point_interpolate_distance:nnn
+ \l_@@_softpath_corneri_dim
+ { #5 , #6 }
+ {
+ \l_@@_softpath_lastx_fp ,
+ \l_@@_softpath_lasty_fp
+ }
+ }
+ \l_@@_softpath_curve_end_tl
+ {#5} {#6} {#2} {#3}
+ }
+ \fp_set:Nn \l_@@_softpath_lastx_fp {#5}
+ \fp_set:Nn \l_@@_softpath_lasty_fp {#6}
+ #1
+ }
+% \end{macrocode}
+% At this stage we have the two curve end points, but they are in
+% co-ordinate form. So we split them up (with some more reordering).
+% \begin{macrocode}
+\cs_new:Npn \@@_softpath_round_calc:nnnnnn #1#2#3#4#5#6
+ {
+ \@@_softpath_round_calc:nnnnw {#3} {#4} {#5} {#6}
+ #1 \q_mark #2 \q_stop
+ }
+\cs_generate_variant:Nn \@@_softpath_round_calc:nnnnnn { fV }
+% \end{macrocode}
+% The calculations themselves are relatively straight-forward, as we use a
+% quadratic Bézier curve.
+% \begin{macrocode}
+\cs_new:Npn \@@_softpath_round_calc:nnnnw
+ #1#2#3#4 #5 , #6 \q_mark #7 , #8 \q_stop
+ {
+ {#5} {#6}
+ \exp_not:N \@@_softpath_curveto_opi:nn
+ {
+ \fp_to_dim:n
+ { #5 + \fp_use:c { c_@@_path_arc_90_fp } * ( #1 - #5 ) }
+ }
+ {
+ \fp_to_dim:n
+ { #6 + \fp_use:c { c_@@_path_arc_90_fp } * ( #2 - #6 ) }
+ }
+ \exp_not:N \@@_softpath_curveto_opii:nn
+ {
+ \fp_to_dim:n
+ { #7 + \fp_use:c { c_@@_path_arc_90_fp } * ( #1 - #7 ) }
+ }
+ {
+ \fp_to_dim:n
+ { #8 + \fp_use:c { c_@@_path_arc_90_fp } * ( #2 - #8 ) }
+ }
+ \exp_not:N \@@_softpath_curveto_opiii:nn
+ {#7} {#8}
+ }
+% \end{macrocode}
+% To deal with a close-path operation, we need to do some manipulation.
+% It needs to be treated as a line operation for rounding, and then
+% have the close path operation re-added at the point where the curve
+% ends. That means saving the end point in the calculation step (see
+% earlier), and shuffling a lot.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_softpath_round_close:nn #1#2
+ {
+ \use:x
+ {
+ \@@_softpath_round_calc:nnnNnn
+ {
+ \tl_set:Nx \exp_not:N \l_@@_softpath_move_tl
+ {
+ \@@_softpath_moveto_op:nn
+ \exp_not:N \exp_after:wN
+ \exp_not:N \@@_softpath_round_close:w
+ \exp_not:N \l_@@_softpath_curve_end_tl
+ \exp_not:N \q_stop
+ }
+ \use:x
+ {
+ \exp_not:N \exp_not:N \exp_not:N \use_i:nnnn
+ {
+ \@@_softpath_round_loop:Nnn
+ \@@_softpath_close_op:nn
+ \exp_not:N \exp_after:wN
+ \exp_not:N \@@_softpath_round_close:w
+ \exp_not:N \l_@@_softpath_curve_end_tl
+ \exp_not:N \q_stop
+ }
+ }
+ }
+ {#1} {#2}
+ \@@_softpath_lineto_op:nn
+ \exp_after:wN \use_none:n \l_@@_softpath_move_tl
+ }
+ }
+\cs_new:Npn \@@_softpath_round_close:w #1 , #2 \q_stop { {#1} {#2} }
+% \end{macrocode}
+% Tidy up the parts of the path, complete the built token list and put
+% it back into action.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_softpath_round_end:
+ {
+ \__tl_build_one:o \l_@@_softpath_move_tl
+ \__tl_build_one:o \l_@@_softpath_part_tl
+ \__tl_build_end:
+ \tl_gset_eq:NN \g_@@_softpath_main_tl \l_@@_softpath_main_tl
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
% \begin{macrocode}
%</initex|package>
% \end{macrocode}
diff --git a/l3experimental/l3draw/l3draw.dtx b/l3experimental/l3draw/l3draw.dtx
index 418e0ab..fb229ec 100644
--- a/l3experimental/l3draw/l3draw.dtx
+++ b/l3experimental/l3draw/l3draw.dtx
@@ -481,6 +481,42 @@
% operation), and the second to that \enquote{leading out}. If both
% values are \texttt{0pt} then corners will not be rounded. The values
% apply within the scope of the current \TeX{} group.
+% \begin{demo}
+% \draw_begin:
+% \draw_path_corner_arc:nn { 5mm } { 5mm }
+% \draw_path_rectangle_corners:nn
+% { 0cm , 0cm } { 3cm , 2cm }
+% \draw_path_use_clear:n { stroke }
+% \draw_end:
+% \end{demo}
+% \begin{demo}
+% \draw_begin:
+% \draw_path_corner_arc:nn { 10mm } { 5mm }
+% \draw_path_moveto:n { 0cm , 0cm }
+% \draw_path_lineto:n { 0cm , 2cm }
+% \draw_path_lineto:n { 3cm , 2cm }
+% \draw_path_curveto:nnn
+% { 3cm , 0cm } { 2cm , 0cm } { 1cm , 0 cm }
+% \draw_path_use_clear:n { stroke }
+% \draw_end:
+% \end{demo}
+% The corners created are quarter-circles for exact right-angles and
+% close approximations otherwise. Closing a path will result in rounding
+% correctly.
+% \begin{demo}
+% \draw_begin:
+% \draw_path_corner_arc:nn { 4pt } { 4pt }
+% \draw_path_moveto:n
+% { \draw_point_polar:nn { 0 } { 1cm } }
+% \int_step_inline:nnnn { 72 } { 72 } { 359 }
+% {
+% \draw_path_lineto:n
+% { \draw_point_polar:nn { #1 } { 1cm } }
+% }
+% \draw_path_close:
+% \draw_path_use_clear:n { stroke }
+% \draw_end:
+% \end{demo}
% \end{function}
%
% \begin{function}{\draw_path_close:}
diff --git a/l3experimental/l3draw/testfiles/m3draw000.tlg b/l3experimental/l3draw/testfiles/m3draw000.tlg
index ac4f364..63a5dc2 100644
--- a/l3experimental/l3draw/testfiles/m3draw000.tlg
+++ b/l3experimental/l3draw/testfiles/m3draw000.tlg
@@ -29,6 +29,8 @@ Author: Joseph Wright
\g__draw_softpath_buffer_b_int=\count...
\g__draw_softpath_lastx_dim=\dimen...
\g__draw_softpath_lasty_dim=\dimen...
+\l__draw_softpath_corneri_dim=\dimen...
+\l__draw_softpath_cornerii_dim=\dimen...
\g__draw_linewidth_dim=\dimen...
\g__draw_inner_linewidth_dim=\dimen...
\l_draw_default_linewidth_dim=\dimen...
diff --git a/l3experimental/l3draw/testfiles/m3draw003.ptex.tlg b/l3experimental/l3draw/testfiles/m3draw003.ptex.tlg
index 58df04d..e516da6 100644
--- a/l3experimental/l3draw/testfiles/m3draw003.ptex.tlg
+++ b/l3experimental/l3draw/testfiles/m3draw003.ptex.tlg
@@ -336,10 +336,15 @@ l. ... }
..\vbox(0.0+0.0)x0.0, shifted -84.55826
...\special{pdf:literal q}
...\special{pdf:literal 0.3985 w}
-...\special{pdf:literal 85.03938 85.03938 m}
-...\special{pdf:literal 56.69292 85.03938 l}
-...\special{pdf:literal 56.69292 56.69292 l}
-...\special{pdf:literal 85.03938 56.69292 l}
+...\special{pdf:literal 83.04684 85.03938 m}
+...\special{pdf:literal 58.68544 85.03938 l}
+...\special{pdf:literal 57.585 85.03938 56.69292 84.1473 56.69292 83.04684 c}
+...\special{pdf:literal 56.69292 58.68544 l}
+...\special{pdf:literal 56.69292 57.585 57.585 56.69292 58.68544 56.69292 c}
+...\special{pdf:literal 83.04684 56.69292 l}
+...\special{pdf:literal 84.1473 56.69292 85.03938 57.585 85.03938 58.68544 c}
+...\special{pdf:literal 85.03938 83.04684 l}
+...\special{pdf:literal 85.03938 84.1473 84.1473 85.03938 83.04684 85.03938 c}
...\special{pdf:literal h}
...\special{pdf:literal 56.69292 56.69292 m}
...\special{pdf:literal S}
diff --git a/l3experimental/l3draw/testfiles/m3draw003.tlg b/l3experimental/l3draw/testfiles/m3draw003.tlg
index 3bd8521..7b07255 100644
--- a/l3experimental/l3draw/testfiles/m3draw003.tlg
+++ b/l3experimental/l3draw/testfiles/m3draw003.tlg
@@ -336,10 +336,15 @@ l. ... }
..\vbox(0.0+0.0)x0.0, shifted -84.55826
...\pdfliteral{q}
...\pdfliteral{0.3985 w}
-...\pdfliteral{85.03938 85.03938 m}
-...\pdfliteral{56.69292 85.03938 l}
-...\pdfliteral{56.69292 56.69292 l}
-...\pdfliteral{85.03938 56.69292 l}
+...\pdfliteral{83.04684 85.03938 m}
+...\pdfliteral{58.68544 85.03938 l}
+...\pdfliteral{57.585 85.03938 56.69292 84.1473 56.69292 83.04684 c}
+...\pdfliteral{56.69292 58.68544 l}
+...\pdfliteral{56.69292 57.585 57.585 56.69292 58.68544 56.69292 c}
+...\pdfliteral{83.04684 56.69292 l}
+...\pdfliteral{84.1473 56.69292 85.03938 57.585 85.03938 58.68544 c}
+...\pdfliteral{85.03938 83.04684 l}
+...\pdfliteral{85.03938 84.1473 84.1473 85.03938 83.04684 85.03938 c}
...\pdfliteral{h}
...\pdfliteral{56.69292 56.69292 m}
...\pdfliteral{S}
diff --git a/l3experimental/l3draw/testfiles/m3draw003.uptex.tlg b/l3experimental/l3draw/testfiles/m3draw003.uptex.tlg
index 58df04d..e516da6 100644
--- a/l3experimental/l3draw/testfiles/m3draw003.uptex.tlg
+++ b/l3experimental/l3draw/testfiles/m3draw003.uptex.tlg
@@ -336,10 +336,15 @@ l. ... }
..\vbox(0.0+0.0)x0.0, shifted -84.55826
...\special{pdf:literal q}
...\special{pdf:literal 0.3985 w}
-...\special{pdf:literal 85.03938 85.03938 m}
-...\special{pdf:literal 56.69292 85.03938 l}
-...\special{pdf:literal 56.69292 56.69292 l}
-...\special{pdf:literal 85.03938 56.69292 l}
+...\special{pdf:literal 83.04684 85.03938 m}
+...\special{pdf:literal 58.68544 85.03938 l}
+...\special{pdf:literal 57.585 85.03938 56.69292 84.1473 56.69292 83.04684 c}
+...\special{pdf:literal 56.69292 58.68544 l}
+...\special{pdf:literal 56.69292 57.585 57.585 56.69292 58.68544 56.69292 c}
+...\special{pdf:literal 83.04684 56.69292 l}
+...\special{pdf:literal 84.1473 56.69292 85.03938 57.585 85.03938 58.68544 c}
+...\special{pdf:literal 85.03938 83.04684 l}
+...\special{pdf:literal 85.03938 84.1473 84.1473 85.03938 83.04684 85.03938 c}
...\special{pdf:literal h}
...\special{pdf:literal 56.69292 56.69292 m}
...\special{pdf:literal S}
diff --git a/l3experimental/l3draw/testfiles/m3draw003.xetex.tlg b/l3experimental/l3draw/testfiles/m3draw003.xetex.tlg
index 58df04d..e516da6 100644
--- a/l3experimental/l3draw/testfiles/m3draw003.xetex.tlg
+++ b/l3experimental/l3draw/testfiles/m3draw003.xetex.tlg
@@ -336,10 +336,15 @@ l. ... }
..\vbox(0.0+0.0)x0.0, shifted -84.55826
...\special{pdf:literal q}
...\special{pdf:literal 0.3985 w}
-...\special{pdf:literal 85.03938 85.03938 m}
-...\special{pdf:literal 56.69292 85.03938 l}
-...\special{pdf:literal 56.69292 56.69292 l}
-...\special{pdf:literal 85.03938 56.69292 l}
+...\special{pdf:literal 83.04684 85.03938 m}
+...\special{pdf:literal 58.68544 85.03938 l}
+...\special{pdf:literal 57.585 85.03938 56.69292 84.1473 56.69292 83.04684 c}
+...\special{pdf:literal 56.69292 58.68544 l}
+...\special{pdf:literal 56.69292 57.585 57.585 56.69292 58.68544 56.69292 c}
+...\special{pdf:literal 83.04684 56.69292 l}
+...\special{pdf:literal 84.1473 56.69292 85.03938 57.585 85.03938 58.68544 c}
+...\special{pdf:literal 85.03938 83.04684 l}
+...\special{pdf:literal 85.03938 84.1473 84.1473 85.03938 83.04684 85.03938 c}
...\special{pdf:literal h}
...\special{pdf:literal 56.69292 56.69292 m}
...\special{pdf:literal S}
More information about the latex3-commits
mailing list