summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty')
-rw-r--r--Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty839
1 files changed, 638 insertions, 201 deletions
diff --git a/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty b/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty
index d485673b419..7375cf33197 100644
--- a/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty
+++ b/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty
@@ -5,6 +5,7 @@
%% The original source files were:
%%
%% l3draw.dtx (with options: `package')
+%% l3draw-boxes.dtx (with options: `package')
%% l3draw-paths.dtx (with options: `package')
%% l3draw-points.dtx (with options: `package')
%% l3draw-scopes.dtx (with options: `package')
@@ -26,9 +27,69 @@
%%
%% File: l3draw.dtx Copyright(C) 2018 The LaTeX3 Project
\RequirePackage{expl3}
-\ProvidesExplPackage{l3draw}{2018/02/21}{}
+\ProvidesExplPackage{l3draw}{2018/03/05}{}
{L3 Experimental core drawing support}
\RequirePackage { l3color }
+%% File: l3draw-boxes.dtx Copyright(C) 2018 The LaTeX3 Project
+\box_new:N \l__draw_tmp_box
+\cs_new_protected:Npn \draw_box_use:N #1
+ {
+ \__draw_box_use:Nnnnn #1
+ { 0pt } { -\box_dp:N #1 } { \box_wd:N #1 } { \box_ht:N #1 }
+ }
+\cs_new_protected:Npn \__draw_box_use:Nnnnn #1#2#3#4#5
+ {
+ \bool_if:NT \l_draw_bb_update_bool
+ {
+ \__draw_point_process:nn
+ { \__draw_path_update_limits:nn }
+ { \draw_point_transform:n { #2 , #3 } }
+ \__draw_point_process:nn
+ { \__draw_path_update_limits:nn }
+ { \draw_point_transform:n { #4 , #3 } }
+ \__draw_point_process:nn
+ { \__draw_path_update_limits:nn }
+ { \draw_point_transform:n { #4 , #5 } }
+ \__draw_point_process:nn
+ { \__draw_path_update_limits:nn }
+ { \draw_point_transform:n { #2 , #5 } }
+ }
+ \group_begin:
+ \hbox_set:Nn \l__draw_tmp_box
+ {
+ \use:x
+ {
+ \driver_draw_box_use:Nnnnn #1
+ { \fp_use:N \l__draw_matrix_a_fp }
+ { \fp_use:N \l__draw_matrix_b_fp }
+ { \fp_use:N \l__draw_matrix_c_fp }
+ { \fp_use:N \l__draw_matrix_d_fp }
+ }
+ }
+ \hbox_set:Nn \l__draw_tmp_box
+ {
+ \tex_kern:D \l__draw_xshift_dim
+ \box_move_up:nn { \l__draw_yshift_dim }
+ { \box_use_drop:N \l__draw_tmp_box }
+ }
+ \box_set_ht:Nn \l__draw_tmp_box { 0pt }
+ \box_set_dp:Nn \l__draw_tmp_box { 0pt }
+ \box_set_wd:Nn \l__draw_tmp_box { 0pt }
+ \box_use_drop:N \l__draw_tmp_box
+ \group_end:
+ }
+\cs_new_protected:Npn \draw_coffin_use:Nnn #1#2#3
+ {
+ \group_begin:
+ \hbox_set:Nn \l__draw_tmp_box
+ { \coffin_typeset:Nnnnn #1 {#2} {#3} { 0pt } { 0pt } }
+ \__draw_box_use:Nnnnn \l__draw_tmp_box
+ { \box_wd:N \l__draw_tmp_box - \coffin_wd:N #1 }
+ { -\box_dp:N \l__draw_tmp_box }
+ { \box_wd:N \l__draw_tmp_box }
+ { \box_ht:N \l__draw_tmp_box }
+ \group_end:
+ }
%% File: l3draw-paths.dtx Copyright(C) 2018 The LaTeX3 Project
\tl_new:N \l__draw_path_tmp_tl
\fp_new:N \l__draw_path_tmpa_fp
@@ -49,7 +110,7 @@
{ \dim_max:nn \g__draw_path_ymax_dim {#2} }
\dim_gset:Nn \g__draw_path_ymin_dim
{ \dim_min:nn \g__draw_path_ymin_dim {#2} }
- \bool_if:NT \l__draw_update_bb_bool
+ \bool_if:NT \l_draw_bb_update_bool
{
\dim_gset:Nn \g__draw_xmax_dim
{ \dim_max:nn \g__draw_xmax_dim {#1} }
@@ -76,11 +137,7 @@
\dim_new:N \l__draw_corner_xarc_dim
\dim_new:N \l__draw_corner_yarc_dim
\bool_new:N \l__draw_corner_arc_bool
-\cs_new_protected:Npn \draw_path_corner_arc:n #1
- {
- \__draw_point_process:nn { \__draw_path_corner_arc:nn } {#1}
- }
-\cs_new_protected:Npn \__draw_path_corner_arc:nn #1#2
+\cs_new_protected:Npn \draw_path_corner_arc:nn #1#2
{
\dim_set:Nn \l__draw_corner_xarc_dim {#1}
\dim_set:Nn \l__draw_corner_yarc_dim {#2}
@@ -151,6 +208,23 @@
\__draw_path_mark_corner:
\__draw_softpath_closepath:
}
+\cs_new_protected:Npn \draw_path_canvas_moveto:n #1
+ { \__draw_point_process:nn { \__draw_path_moveto:nn } {#1} }
+\cs_new_protected:Npn \draw_path_canvas_lineto:n #1
+ { \__draw_point_process:nn { \__draw_path_lineto:nn } {#1} }
+\cs_new_protected:Npn \draw_path_canvas_curveto:nnn #1#2#3
+ {
+ \__draw_point_process:nnn
+ {
+ \__draw_point_process:nn
+ {
+ \__draw_path_mark_corner:
+ \__draw_path_curveto:nnnnnn
+ }
+ {#1}
+ }
+ {#2} {#3}
+ }
\cs_new_protected:Npn \draw_path_curveto:nn #1#2
{
\__draw_point_process:nnn
@@ -413,7 +487,9 @@
{
\__draw_point_process:nnn
{
- \bool_if:NTF \l__draw_corner_arc_bool
+ \bool_lazy_or:nnTF
+ { \l__draw_corner_arc_bool }
+ { \l__draw_matrix_active_bool }
{ \__draw_path_rectangle_rounded:nnnn }
{ \__draw_path_rectangle:nnnn }
}
@@ -447,24 +523,53 @@
\cs_new_protected:Npn \draw_path_grid:nnnn #1#2#3#4
{
\__draw_point_process:nnn
- { \__draw_path_grid:nnnnnn {#1} {#2} }
+ {
+ \__draw_path_grid_auxi:ffnnnn
+ { \dim_eval:n { \dim_abs:n {#1} } }
+ { \dim_eval:n { \dim_abs:n {#2} } }
+ }
{#3} {#4}
}
-\cs_new_protected:Npn \__draw_path_grid:nnnnnn #1#2#3#4#5#6
+\cs_new_protected:Npn \__draw_path_grid_auxi:nnnnnn #1#2#3#4#5#6
+ {
+ \dim_compare:nNnTF {#3} > {#5}
+ { \__draw_path_grid_auxii:nnnnnn {#1} {#2} {#5} {#4} {#3} {#6} }
+ { \__draw_path_grid_auxii:nnnnnn {#1} {#2} {#3} {#4} {#5} {#6} }
+ }
+\cs_generate_variant:Nn \__draw_path_grid_auxi:nnnnnn { ff }
+\cs_new_protected:Npn \__draw_path_grid_auxii:nnnnnn #1#2#3#4#5#6
+ {
+ \dim_compare:nNnTF {#4} > {#6}
+ { \__draw_path_grid_auxiii:nnnnnn {#1} {#2} {#3} {#6} {#5} {#4} }
+ { \__draw_path_grid_auxiii:nnnnnn {#1} {#2} {#3} {#4} {#5} {#6} }
+ }
+\cs_new_protected:Npn \__draw_path_grid_auxiii:nnnnnn #1#2#3#4#5#6
+ {
+ \__draw_path_grid_auxiv:ffnnnnnn
+ { \fp_to_dim:n { #1 * trunc(#3/(#1)) } }
+ { \fp_to_dim:n { #2 * trunc(#4/(#2)) } }
+ {#1} {#2} {#3} {#4} {#5} {#6}
+ }
+\cs_new_protected:Npn \__draw_path_grid_auxiv:nnnnnnnn #1#2#3#4#5#6#7#8
{
\dim_step_inline:nnnn
- {#3} { \dim_compare:nNnF {#3} < {#5} { - } \dim_abs:n {#1} } {#5}
+ {#1}
+ {#3}
+ {#7}
{
- \draw_path_moveto:n { ##1 , #4 }
- \draw_path_lineto:n { ##1 , #6 }
+ \draw_path_moveto:n { ##1 , #6 }
+ \draw_path_lineto:n { ##1 , #8 }
}
\dim_step_inline:nnnn
- {#4} { \dim_compare:nNnF {#4} < {#6} { - } \dim_abs:n {#2} } {#6}
+ {#2}
+ {#4}
+ {#8}
{
- \draw_path_moveto:n { #3 , ##1 }
- \draw_path_lineto:n { #5 , ##1 }
+ \draw_path_moveto:n { #5 , ##1 }
+ \draw_path_lineto:n { #7 , ##1 }
}
}
+\cs_generate_variant:Nn \__draw_path_grid_auxiv:nnnnnnnn { ff }
\bool_new:N \l__draw_path_use_clip_bool
\bool_new:N \l__draw_path_use_fill_bool
\bool_new:N \l__draw_path_use_stroke_bool
@@ -500,8 +605,9 @@
{ \ERROR }
}
}
+ \__draw_softpath_round_corners:
\bool_lazy_and:nnT
- { \l__draw_update_bb_bool }
+ { \l_draw_bb_update_bool }
{ \l__draw_path_use_stroke_bool }
{ \__draw_path_use_stroke_bb: }
\bool_if:NTF \l__draw_path_use_clear_bool
@@ -526,6 +632,11 @@
{
\bool_set_true:N \l__draw_path_use_stroke_bool
}
+\cs_new_protected:Npn \__draw_path_use_action_fillstroke:
+ {
+ \bool_set_true:N \l__draw_path_use_fill_bool
+ \bool_set_true:N \l__draw_path_use_stroke_bool
+ }
\cs_new_protected:Npn \__draw_path_use_stroke_bb:
{
\__draw_path_use_stroke_bb_aux:NnN x { max } +
@@ -548,6 +659,51 @@
}
}
}
+\dim_new:N \l__draw_path_lastx_dim
+\dim_new:N \l__draw_path_lasty_dim
+\dim_new:N \l__draw_path_xmax_dim
+\dim_new:N \l__draw_path_xmin_dim
+\dim_new:N \l__draw_path_ymax_dim
+\dim_new:N \l__draw_path_ymin_dim
+\dim_new:N \l__draw_softpath_lastx_dim
+\dim_new:N \l__draw_softpath_lasty_dim
+\bool_new:N \l__draw_softpath_corners_bool
+\cs_new_protected:Npn \draw_path_scope_begin:
+ {
+ \group_begin:
+ \dim_set_eq:NN \l__draw_path_lastx_dim \g__draw_path_lastx_dim
+ \dim_set_eq:NN \l__draw_path_lasty_dim \g__draw_path_lasty_dim
+ \dim_set_eq:NN \l__draw_path_xmax_dim \g__draw_path_xmax_dim
+ \dim_set_eq:NN \l__draw_path_xmin_dim \g__draw_path_xmin_dim
+ \dim_set_eq:NN \l__draw_path_ymax_dim \g__draw_path_ymax_dim
+ \dim_set_eq:NN \l__draw_path_ymin_dim \g__draw_path_ymin_dim
+ \dim_set_eq:NN \l__draw_softpath_lastx_dim \g__draw_softpath_lastx_dim
+ \dim_set_eq:NN \l__draw_softpath_lasty_dim \g__draw_softpath_lasty_dim
+ \__draw_path_reset_limits:
+ \__draw_softpath_concat:n { }
+ \tl_set_eq:NN \l__draw_softpath_main_tl \g__draw_softpath_main_tl
+ \bool_set_eq:NN
+ \l__draw_softpath_corners_bool
+ \g__draw_softpath_corners_bool
+ \__draw_softpath_clear:
+ }
+\cs_new_protected:Npn \draw_path_scope_end:
+ {
+ \bool_gset_eq:NN
+ \g__draw_softpath_corners_bool
+ \l__draw_softpath_corners_bool
+ \__draw_softpath_clear:
+ \tl_gset_eq:NN \g__draw_softpath_main_tl \l__draw_softpath_main_tl
+ \dim_gset_eq:NN \g__draw_softpath_lastx_dim \l__draw_softpath_lastx_dim
+ \dim_gset_eq:NN \g__draw_softpath_lasty_dim \l__draw_softpath_lasty_dim
+ \dim_gset_eq:NN \g__draw_path_xmax_dim \l__draw_path_xmax_dim
+ \dim_gset_eq:NN \g__draw_path_xmin_dim \l__draw_path_xmin_dim
+ \dim_gset_eq:NN \g__draw_path_ymax_dim \l__draw_path_ymax_dim
+ \dim_gset_eq:NN \g__draw_path_ymin_dim \l__draw_path_ymin_dim
+ \dim_gset_eq:NN \g__draw_path_lastx_dim \l__draw_path_lastx_dim
+ \dim_gset_eq:NN \g__draw_path_lasty_dim \l__draw_path_lasty_dim
+ \group_end:
+ }
%% File: l3draw-points.dtx Copyright(C) 2018 The LaTeX3 Project
\cs_new:Npn \__draw_point_process:nn #1#2
{
@@ -701,27 +857,22 @@
\cs_generate_variant:Nn \__draw_point_interpolate_line_aux:nnnnnn { f }
\cs_new:Npn \draw_point_interpolate_distance:nnn #1#2#3
{
- \__draw_point_process:nnn
- { \__draw_point_interpolate_distance:nnnnn {#1} }
- {#2} {#3}
- }
-\cs_new:Npn \__draw_point_interpolate_distance:nnnnn #1#2#3#4#5
- {
- \__draw_point_interpolate_distance_aux:nnnnnnn
- { \fp_eval:n { #4 - #2 } }
- { \fp_eval:n { #5 - #3 } }
- {#2} {#3} {#4} {#5} {#1}
+ \__draw_point_process:nn
+ { \__draw_point_interpolate_distance:nnnn {#1} {#3} }
+ {#2}
}
-\cs_new:Npn \__draw_point_interpolate_distance_aux:nnnnnnn #1#2#3#4#5#6#7
+\cs_new:Npn \__draw_point_interpolate_distance:nnnn #1#2#3#4
{
- \__draw_point_interpolate_distance_aux:fnnnn
- { \fp_eval:n { (#7) / (sqrt ( #1 * #1 + #2 * #2 )) } }
- {#3} {#4} {#5} {#6}
+ \__draw_point_process:nn
+ {
+ \__draw_point_interpolate_distance:fnnnn
+ { \fp_eval:n {#1} } {#3} {#4}
+ }
+ { \draw_point_unit_vector:n { ( #2 ) - ( #3 , #4 ) } }
}
-\cs_generate_variant:Nn \__draw_point_interpolate_distance_aux:nnnnnnn { ff }
-\cs_new:Npn \__draw_point_interpolate_distance_aux:nnnnn #1#2#3#4#5
+\cs_new:Npn \__draw_point_interpolate_distance:nnnnn #1#2#3#4#5
{ \__draw_point_to_dim:n { #2 + #1 * #4 , #3 + #1 * #5 } }
-\cs_generate_variant:Nn \__draw_point_interpolate_distance_aux:nnnnn { f }
+\cs_generate_variant:Nn \__draw_point_interpolate_distance:nnnnn { f }
\cs_new:Npn \draw_point_interpolate_arcaxes:nnnnnn #1#2#3#4#5#6
{
\__draw_point_process:nnn
@@ -897,20 +1048,20 @@
}
\cs_new:Npn \__draw_point_transform:nn #1#2
{
- \bool_if:NTF \l__draw_transformcm_active_bool
+ \bool_if:NTF \l__draw_matrix_active_bool
{
\__draw_point_to_dim:n
{
(
- \l__draw_transformcm_aa_fp * #1
- + \l__draw_transformcm_ba_fp * #2
- + \l__draw_transformcm_xshift_dim
+ \l__draw_matrix_a_fp * #1
+ + \l__draw_matrix_c_fp * #2
+ + \l__draw_xshift_dim
)
,
(
- \l__draw_transformcm_ab_fp * #1
- + \l__draw_transformcm_bb_fp * #2
- + \l__draw_transformcm_yshift_dim
+ \l__draw_matrix_b_fp * #1
+ + \l__draw_matrix_d_fp * #2
+ + \l__draw_yshift_dim
)
}
}
@@ -918,8 +1069,7 @@
\__draw_point_to_dim:n
{
(#1, #2)
- + ( \l__draw_transformcm_xshift_dim ,
- \l__draw_transformcm_yshift_dim )
+ + ( \l__draw_xshift_dim , \l__draw_yshift_dim )
}
}
}
@@ -930,18 +1080,18 @@
}
\cs_new:Npn \__draw_point_transform_noshift:nn #1#2
{
- \bool_if:NTF \l__draw_transformcm_active_bool
+ \bool_if:NTF \l__draw_matrix_active_bool
{
\__draw_point_to_dim:n
{
(
- \l__draw_transformcm_aa_fp * #1
- + \l__draw_transformcm_ba_fp * #2
+ \l__draw_matrix_a_fp * #1
+ + \l__draw_matrix_c_fp * #2
)
,
(
- \l__draw_transformcm_ab_fp * #1
- + \l__draw_transformcm_bb_fp * #2
+ \l__draw_matrix_b_fp * #1
+ + \l__draw_matrix_d_fp * #2
)
}
}
@@ -952,37 +1102,106 @@
\dim_new:N \g__draw_xmin_dim
\dim_new:N \g__draw_ymax_dim
\dim_new:N \g__draw_ymin_dim
-\bool_new:N \l__draw_update_bb_bool
+\bool_new:N \l_draw_bb_update_bool
\box_new:N \l__draw_main_box
+\int_new:N \g__draw_id_int
+\cs_new_protected:Npn \__draw_reset_bb:
+ {
+ \dim_gset:Nn \g__draw_xmax_dim { -\c_max_dim }
+ \dim_gset:Nn \g__draw_xmin_dim { \c_max_dim }
+ \dim_gset:Nn \g__draw_ymax_dim { -\c_max_dim }
+ \dim_gset:Nn \g__draw_ymin_dim { \c_max_dim }
+ }
\cs_new_protected:Npn \draw_begin:
{
- \vbox_set:Nw \l__draw_main_box
- \driver_draw_begin:
- \dim_gset:Nn \g__draw_xmax_dim { -\c_max_dim }
- \dim_gset:Nn \g__draw_xmin_dim { \c_max_dim }
- \dim_gset:Nn \g__draw_ymax_dim { -\c_max_dim }
- \dim_gset:Nn \g__draw_ymin_dim { \c_max_dim }
- \bool_set_true:N \l__draw_update_bb_bool
- \draw_transform_reset:
- \draw_linewidth:n { \l_draw_default_linewidth_dim }
+ \group_begin:
+ \int_gincr:N \g__draw_id_int
+ \hbox_set:Nw \l__draw_main_box
+ \driver_draw_begin:
+ \__draw_reset_bb:
+ \__draw_path_reset_limits:
+ \bool_set_true:N \l_draw_bb_update_bool
+ \draw_transform_matrix_reset:
+ \draw_transform_shift_reset:
+ \__draw_softpath_clear:
+ \draw_linewidth:n { \l_draw_default_linewidth_dim }
+ \draw_color:n { . }
}
\cs_new_protected:Npn \draw_end:
{
- \driver_draw_end:
- \vbox_set_end:
- \hbox_set:Nn \l__draw_main_box
- {
- \skip_horizontal:n { -\g__draw_xmin_dim }
- \box_move_down:nn { \g__draw_ymin_dim }
- { \box_use_drop:N \l__draw_main_box }
- }
- \box_set_ht:Nn \l__draw_main_box
- { \g__draw_ymax_dim - \g__draw_ymin_dim }
- \box_set_dp:Nn \l__draw_main_box { 0pt }
- \box_set_wd:Nn \l__draw_main_box
- { \g__draw_xmax_dim - \g__draw_xmin_dim }
- \mode_leave_vertical:
- \box_use_drop:N \l__draw_main_box
+ \driver_draw_end:
+ \hbox_set_end:
+ \dim_compare:nNnT \g__draw_xmin_dim = \c_max_dim
+ {
+ \dim_gzero:N \g__draw_xmax_dim
+ \dim_gzero:N \g__draw_xmin_dim
+ \dim_gzero:N \g__draw_ymax_dim
+ \dim_gzero:N \g__draw_ymin_dim
+ }
+ \hbox_set:Nn \l__draw_main_box
+ {
+ \skip_horizontal:n { -\g__draw_xmin_dim }
+ \box_move_down:nn { \g__draw_ymin_dim }
+ { \box_use_drop:N \l__draw_main_box }
+ }
+ \box_set_ht:Nn \l__draw_main_box
+ { \g__draw_ymax_dim - \g__draw_ymin_dim }
+ \box_set_dp:Nn \l__draw_main_box { 0pt }
+ \box_set_wd:Nn \l__draw_main_box
+ { \g__draw_xmax_dim - \g__draw_xmin_dim }
+ \mode_leave_vertical:
+ \box_use_drop:N \l__draw_main_box
+ \group_end:
+ }
+\dim_new:N \l__draw_linewidth_dim
+\tl_new:N \l__draw_fill_color_tl
+\tl_new:N \l__draw_stroke_color_tl
+\cs_new_protected:Npn \draw_scope_begin:
+ {
+ \driver_draw_scope_begin:
+ \group_begin:
+ \dim_set_eq:NN \l__draw_linewidth_dim \g__draw_linewidth_dim
+ \draw_path_scope_begin:
+ }
+\cs_new_protected:Npn \draw_scope_end:
+ {
+ \draw_path_scope_end:
+ \dim_gset_eq:NN \g__draw_linewidth_dim \l__draw_linewidth_dim
+ \group_end:
+ \driver_draw_scope_end:
+ }
+\dim_new:N \l__draw_xmax_dim
+\dim_new:N \l__draw_xmin_dim
+\dim_new:N \l__draw_ymax_dim
+\dim_new:N \l__draw_ymin_dim
+\cs_new_protected:Npn \__draw_scope_bb_begin:
+ {
+ \group_begin:
+ \dim_set_eq:NN \l__draw_xmax_dim \g__draw_xmax_dim
+ \dim_set_eq:NN \l__draw_xmin_dim \g__draw_xmin_dim
+ \dim_set_eq:NN \l__draw_ymax_dim \g__draw_ymax_dim
+ \dim_set_eq:NN \l__draw_ymin_dim \g__draw_ymin_dim
+ \__draw_reset_bb:
+ }
+\cs_new_protected:Npn \__draw_scope_bb_end:
+ {
+ \dim_gset_eq:NN \g__draw_xmax_dim \l__draw_xmax_dim
+ \dim_gset_eq:NN \g__draw_xmin_dim \l__draw_xmin_dim
+ \dim_gset_eq:NN \g__draw_ymax_dim \l__draw_ymax_dim
+ \dim_gset_eq:NN \g__draw_ymin_dim \l__draw_ymin_dim
+ \group_end:
+ }
+\cs_new_protected:Npn \draw_suspend_begin:
+ {
+ \__draw_scope_bb_begin:
+ \draw_path_scope_begin:
+ \draw_transform_matrix_reset:
+ \draw_transform_shift_reset:
+ }
+\cs_new_protected:Npn \draw_suspend_end:
+ {
+ \draw_path_scope_end:
+ \__draw_scope_bb_end:
}
%% File: l3draw-softpath.dtx Copyright(C) 2018 The LaTeX3 Project
\tl_new:N \g__draw_softpath_main_tl
@@ -990,6 +1209,7 @@
\tl_new:N \g__draw_softpath_buffer_b_tl
\int_new:N \g__draw_softpath_buffer_a_int
\int_new:N \g__draw_softpath_buffer_b_int
+\bool_new:N \g__draw_softpath_corners_bool
\cs_new_protected:Npn \__draw_softpath_add:n #1
{
\int_compare:nNnTF \g__draw_softpath_buffer_a_int < { 40 }
@@ -1032,16 +1252,6 @@
\int_gzero:N \g__draw_softpath_buffer_b_int
\tl_gclear:N \g__draw_softpath_buffer_b_tl
}
-\cs_new_protected:Npn \__draw_softpath_get:N #1
- {
- \__draw_softpath_concat:n { }
- \tl_set_eq:NN #1 \g__draw_softpath_main_tl
- }
-\cs_new_protected:Npn \__draw_softpath_set_eq:N #1
- {
- \tl_gset_eq:NN \g__draw_softpath_main_tl #1
- \__draw_softpath_reset_buffers:
- }
\cs_new_protected:Npn \__draw_softpath_use:
{
\g__draw_softpath_main_tl
@@ -1053,6 +1263,7 @@
\tl_gclear:N \g__draw_softpath_main_tl
\tl_gclear:N \g__draw_softpath_buffer_a_tl
\tl_gclear:N \g__draw_softpath_buffer_b_tl
+ \bool_gset_false:N \g__draw_softpath_corners_bool
}
\cs_new_protected:Npn \__draw_softpath_use_clear:
{
@@ -1108,6 +1319,7 @@
{
\__draw_softpath_add:n
{ \__draw_softpath_roundpoint_op:nn {#1} {#2} }
+ \bool_gset_true:N \g__draw_softpath_corners_bool
}
\cs_generate_variant:Nn \__draw_softpath_roundpoint:nn { VV }
\cs_new_protected:Npn \__draw_softpath_close_op:nn #1#2
@@ -1116,8 +1328,10 @@
{ \__draw_softpath_curveto_opi:nnNnnNnn {#1} {#2} }
\cs_new_protected:Npn \__draw_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 \__draw_softpath_curveto_opii:nn #1#2 { }
-\cs_new_protected:Npn \__draw_softpath_curveto_opiii:nn #1#2 { }
+\cs_new_protected:Npn \__draw_softpath_curveto_opii:nn #1#2
+ { \__draw_softpath_curveto_opii:nn }
+\cs_new_protected:Npn \__draw_softpath_curveto_opiii:nn #1#2
+ { \__draw_softpath_curveto_opiii:nn }
\cs_new_protected:Npn \__draw_softpath_lineto_op:nn #1#2
{ \driver_draw_lineto:nn {#1} {#2} }
\cs_new_protected:Npn \__draw_softpath_moveto_op:nn #1#2
@@ -1128,6 +1342,235 @@
\cs_new_protected:Npn \__draw_softpath_rectangle_opi:nnNnn #1#2#3#4#5
{ \driver_draw_rectangle:nnnn {#1} {#2} {#4} {#5} }
\cs_new_protected:Npn \__draw_softpath_rectangle_opii:nn #1#2 { }
+\tl_new:N \l__draw_softpath_main_tl
+\tl_new:N \l__draw_softpath_part_tl
+\tl_new:N \l__draw_softpath_curve_end_tl
+\fp_new:N \l__draw_softpath_lastx_fp
+\fp_new:N \l__draw_softpath_lasty_fp
+\dim_new:N \l__draw_softpath_corneri_dim
+\dim_new:N \l__draw_softpath_cornerii_dim
+\tl_new:N \l__draw_softpath_first_tl
+\tl_new:N \l__draw_softpath_move_tl
+\fp_const:Nn \c__draw_softpath_arc_fp { 4/3 * (sqrt(2) - 1) }
+\cs_new_protected:Npn \__draw_softpath_round_corners:
+ {
+ \bool_if:NT \g__draw_softpath_corners_bool
+ {
+ \group_begin:
+ \tl_clear:N \l__draw_softpath_main_tl
+ \tl_clear:N \l__draw_softpath_part_tl
+ \fp_zero:N \l__draw_softpath_lastx_fp
+ \fp_zero:N \l__draw_softpath_lasty_fp
+ \tl_clear:N \l__draw_softpath_first_tl
+ \tl_clear:N \l__draw_softpath_move_tl
+ \__draw_softpath_concat:n { }
+ \exp_after:wN \__draw_softpath_round_loop:Nnn
+ \g__draw_softpath_main_tl
+ \q_recursion_tail ? ?
+ \q_recursion_stop
+ \group_end:
+ }
+ \bool_gset_false:N \g__draw_softpath_corners_bool
+ }
+\cs_new_protected:Npn \__draw_softpath_round_loop:Nnn #1#2#3
+ {
+ \quark_if_recursion_tail_stop_do:Nn #1 { \__draw_softpath_round_end: }
+ \token_if_eq_meaning:NNTF #1 \__draw_softpath_roundpoint_op:nn
+ { \__draw_softpath_round_action:nn {#2} {#3} }
+ {
+ \tl_if_empty:NT \l__draw_softpath_first_tl
+ { \tl_set:Nn \l__draw_softpath_first_tl { {#2} {#3} } }
+ \fp_set:Nn \l__draw_softpath_lastx_fp {#2}
+ \fp_set:Nn \l__draw_softpath_lasty_fp {#3}
+ \token_if_eq_meaning:NNTF #1 \__draw_softpath_moveto_op:nn
+ {
+ \tl_put_right:No \l__draw_softpath_main_tl
+ \l__draw_softpath_move_tl
+ \tl_put_right:No \l__draw_softpath_main_tl
+ \l__draw_softpath_part_tl
+ \tl_set:Nn \l__draw_softpath_move_tl { #1 {#2} {#3} }
+ \tl_clear:N \l__draw_softpath_first_tl
+ \tl_clear:N \l__draw_softpath_part_tl
+ }
+ { \tl_put_right:Nn \l__draw_softpath_part_tl { #1 {#2} {#3} } }
+ \__draw_softpath_round_loop:Nnn
+ }
+ }
+\cs_new_protected:Npn \__draw_softpath_round_action:nn #1#2
+ {
+ \dim_set:Nn \l__draw_softpath_corneri_dim {#1}
+ \dim_set:Nn \l__draw_softpath_cornerii_dim {#2}
+ \bool_lazy_and:nnTF
+ { \dim_compare_p:nNn \l__draw_softpath_corneri_dim = { 0pt } }
+ { \dim_compare_p:nNn \l__draw_softpath_cornerii_dim = { 0pt } }
+ { \__draw_softpath_round_loop:Nnn }
+ { \__draw_softpath_round_action:Nnn }
+ }
+\cs_new_protected:Npn \__draw_softpath_round_action:Nnn #1#2#3
+ {
+ \tl_if_empty:NT \l__draw_softpath_first_tl
+ { \tl_set:Nn \l__draw_softpath_first_tl { {#2} {#3} } }
+ \token_if_eq_meaning:NNTF #1 \__draw_softpath_curveto_opi:nn
+ { \__draw_softpath_round_action_curveto:NnnNnn }
+ {
+ \token_if_eq_meaning:NNTF #1 \__draw_softpath_close_op:nn
+ { \__draw_softpath_round_action_close: }
+ {
+ \token_if_eq_meaning:NNTF #1 \__draw_softpath_lineto_op:nn
+ { \__draw_softpath_round_lookahead:NnnNnn }
+ { \__draw_softpath_round_loop:Nnn }
+ }
+ }
+ #1 {#2} {#3}
+ }
+\cs_new_protected:Npn \__draw_softpath_round_action_curveto:NnnNnn
+ #1#2#3#4#5#6
+ {
+ \tl_put_right:Nn \l__draw_softpath_part_tl
+ { #1 {#2} {#3} #4 {#5} {#6} }
+ \fp_set:Nn \l__draw_softpath_lastx_fp {#5}
+ \fp_set:Nn \l__draw_softpath_lasty_fp {#6}
+ \__draw_softpath_round_lookahead:NnnNnn
+ }
+\cs_new_protected:Npn \__draw_softpath_round_action_close:
+ {
+ \bool_lazy_and:nnTF
+ { ! \tl_if_empty_p:N \l__draw_softpath_first_tl }
+ { ! \tl_if_empty_p:N \l__draw_softpath_move_tl }
+ {
+ \exp_after:wN \__draw_softpath_round_close:nn
+ \l__draw_softpath_first_tl
+ }
+ { \__draw_softpath_round_loop:Nnn }
+ }
+\cs_new_protected:Npn \__draw_softpath_round_lookahead:NnnNnn #1#2#3#4#5#6
+ {
+ \bool_lazy_any:nTF
+ {
+ { \token_if_eq_meaning_p:NN #4 \__draw_softpath_lineto_op:nn }
+ { \token_if_eq_meaning_p:NN #4 \__draw_softpath_curveto_opi:nn }
+ { \token_if_eq_meaning_p:NN #4 \__draw_softpath_close_op:nn }
+ }
+ {
+ \__draw_softpath_round_calc:nnnNnn
+ \__draw_softpath_round_loop:Nnn {#5} {#6}
+ }
+ {
+ \token_if_eq_meaning:NNTF #4 \__draw_softpath_roundpoint_op:nn
+ { \__draw_softpath_round_roundpoint:NnnNnnNnn }
+ { \__draw_softpath_round_loop:Nnn }
+ }
+ #1 {#2} {#3}
+ #4 {#5} {#6}
+ }
+\cs_new_protected:Npn \__draw_softpath_round_roundpoint:NnnNnnNnn
+ #1#2#3#4#5#6#7#8#9
+ {
+ \__draw_softpath_round_calc:nnnNnn
+ \__draw_softpath_round_loop:Nnn
+ {#8} {#9} #1 {#2} {#3}
+ #4 {#5} {#6} #7 {#8} {#9}
+ }
+\cs_new_protected:Npn \__draw_softpath_round_calc:nnnNnn #1#2#3#4#5#6
+ {
+ \tl_set:Nx \l__draw_softpath_curve_end_tl
+ {
+ \draw_point_interpolate_distance:nnn
+ \l__draw_softpath_cornerii_dim
+ { #5 , #6 } { #2 , #3 }
+ }
+ \tl_put_right:Nx \l__draw_softpath_part_tl
+ {
+ \exp_not:N #4
+ \__draw_softpath_round_calc:fVnnnn
+ {
+ \draw_point_interpolate_distance:nnn
+ \l__draw_softpath_corneri_dim
+ { #5 , #6 }
+ {
+ \l__draw_softpath_lastx_fp ,
+ \l__draw_softpath_lasty_fp
+ }
+ }
+ \l__draw_softpath_curve_end_tl
+ {#5} {#6} {#2} {#3}
+ }
+ \fp_set:Nn \l__draw_softpath_lastx_fp {#5}
+ \fp_set:Nn \l__draw_softpath_lasty_fp {#6}
+ #1
+ }
+\cs_new:Npn \__draw_softpath_round_calc:nnnnnn #1#2#3#4#5#6
+ {
+ \__draw_softpath_round_calc:nnnnw {#3} {#4} {#5} {#6}
+ #1 \q_mark #2 \q_stop
+ }
+\cs_generate_variant:Nn \__draw_softpath_round_calc:nnnnnn { fV }
+\cs_new:Npn \__draw_softpath_round_calc:nnnnw
+ #1#2#3#4 #5 , #6 \q_mark #7 , #8 \q_stop
+ {
+ {#5} {#6}
+ \exp_not:N \__draw_softpath_curveto_opi:nn
+ {
+ \fp_to_dim:n
+ { #5 + \c__draw_softpath_arc_fp * ( #1 - #5 ) }
+ }
+ {
+ \fp_to_dim:n
+ { #6 + \c__draw_softpath_arc_fp * ( #2 - #6 ) }
+ }
+ \exp_not:N \__draw_softpath_curveto_opii:nn
+ {
+ \fp_to_dim:n
+ { #7 + \c__draw_softpath_arc_fp * ( #1 - #7 ) }
+ }
+ {
+ \fp_to_dim:n
+ { #8 + \c__draw_softpath_arc_fp* ( #2 - #8 ) }
+ }
+ \exp_not:N \__draw_softpath_curveto_opiii:nn
+ {#7} {#8}
+ }
+\cs_new_protected:Npn \__draw_softpath_round_close:nn #1#2
+ {
+ \use:x
+ {
+ \__draw_softpath_round_calc:nnnNnn
+ {
+ \tl_set:Nx \exp_not:N \l__draw_softpath_move_tl
+ {
+ \__draw_softpath_moveto_op:nn
+ \exp_not:N \exp_after:wN
+ \exp_not:N \__draw_softpath_round_close:w
+ \exp_not:N \l__draw_softpath_curve_end_tl
+ \exp_not:N \q_stop
+ }
+ \use:x
+ {
+ \exp_not:N \exp_not:N \exp_not:N \use_i:nnnn
+ {
+ \__draw_softpath_round_loop:Nnn
+ \__draw_softpath_close_op:nn
+ \exp_not:N \exp_after:wN
+ \exp_not:N \__draw_softpath_round_close:w
+ \exp_not:N \l__draw_softpath_curve_end_tl
+ \exp_not:N \q_stop
+ }
+ }
+ }
+ {#1} {#2}
+ \__draw_softpath_lineto_op:nn
+ \exp_after:wN \use_none:n \l__draw_softpath_move_tl
+ }
+ }
+\cs_new:Npn \__draw_softpath_round_close:w #1 , #2 \q_stop { {#1} {#2} }
+\cs_new_protected:Npn \__draw_softpath_round_end:
+ {
+ \tl_put_right:No \l__draw_softpath_main_tl
+ \l__draw_softpath_move_tl
+ \tl_put_right:No \l__draw_softpath_main_tl
+ \l__draw_softpath_part_tl
+ \tl_gset_eq:NN \g__draw_softpath_main_tl \l__draw_softpath_main_tl
+ }
%% File: l3draw-state.dtx Copyright(C) 2018 The LaTeX3 Project
\dim_new:N \g__draw_linewidth_dim
\dim_new:N \g__draw_inner_linewidth_dim
@@ -1141,7 +1584,7 @@
\cs_new_protected:Npn \draw_inner_linewidth:n #1
{ \dim_gset:Nn \g__draw_inner_linewidth_dim { \fp_to_dim:n {#1} } }
\cs_new_protected:Npn \draw_miterlimit:n #1
- { \driver_draw_miterlimit:n { \fp_to_dim:n {#1} } }
+ { \driver_draw_miterlimit:n { \fp_eval:n {#1} } }
\cs_new_protected:Npn \draw_cap_butt: { \driver_draw_cap_butt: }
\cs_new_protected:Npn \draw_cap_rectangle: { \driver_draw_cap_rectangle: }
\cs_new_protected:Npn \draw_cap_round: { \driver_draw_cap_round: }
@@ -1151,10 +1594,7 @@
\cs_new_protected:Npn \draw_join_miter: { \driver_draw_join_miter: }
\cs_new_protected:Npn \draw_join_round: { \driver_draw_join_round: }
\tl_new:N \l__draw_color_tmp_tl
-\tl_new:N \g__draw_fill_color_tl
-\tl_new:N \g__draw_stroke_color_tl
-\cs_new_protected:Npn \draw_color:n #1
- { \__draw_color:nn { } {#1} }
+\cs_new_eq:NN \draw_color:n \color_select:n
\cs_new_protected:Npn \draw_color_fill:n #1
{ \__draw_color:nn { fill } {#1} }
\cs_new_protected:Npn \draw_color_stroke:n #1
@@ -1162,16 +1602,7 @@
\cs_new_protected:Npn \__draw_color:nn #1#2
{
\color_parse:nN {#2} \l__draw_color_tmp_tl
- \tl_if_blank:nTF {#1}
- {
- \tl_gset_eq:NN \g__draw_fill_color_tl \l__draw_color_tmp_tl
- \tl_gset_eq:NN \g__draw_stroke_color_tl \l__draw_color_tmp_tl
- \__draw_color_aux:Vn \l__draw_color_tmp_tl { color }
- }
- {
- \tl_gset_eq:cN { g__draw_ #1 _color_tl } \l__draw_color_tmp_tl
- \__draw_color_aux:Vn \l__draw_color_tmp_tl { #1 }
- }
+ \__draw_color_aux:Vn \l__draw_color_tmp_tl {#1}
}
\cs_new_protected:Npn \__draw_color_aux:nn #1#2
{ \__draw_color:nw {#2} #1 \q_stop }
@@ -1179,104 +1610,96 @@
\cs_new_protected:Npn \__draw_color:nw #1#2 ~ #3 \q_stop
{ \use:c { __draw_color_ #2 :nw } {#1} #3 \q_stop }
\cs_new_protected:Npn \__draw_color_cmyk:nw #1#2 ~ #3 ~ #4 ~ #5 \q_stop
- { \use:c { driver_draw_ #1 _cmyk:nnnn } {#2} {#3} {#4} {#5} }
+ { \use:c { driver_draw_color_ #1 _cmyk:nnnn } {#2} {#3} {#4} {#5} }
\cs_new_protected:Npn \__draw_color_gray:nw #1#2 \q_stop
- { \use:c { driver_draw_ #1 _gray:n } {#2} }
+ { \use:c { driver_draw_color_ #1 _gray:n } {#2} }
\cs_new_protected:Npn \__draw_color_rgb:nw #1#2 ~ #3 ~ #4 \q_stop
- { \use:c { driver_draw_ #1 _rgb:nnn } {#2} {#3} {#4} }
+ { \use:c { driver_draw_color_ #1 _rgb:nnn } {#2} {#3} {#4} }
\cs_new_protected:Npn \__draw_color_spot:nw #1#2 ~ #3 \q_stop
- { \use:c { driver_draw_ #1 _spot:nn } {#2} {#3} }
+ { \use:c { driver_draw_color_ #1 _spot:nn } {#2} {#3} }
%% File: l3draw-transforms.dtx Copyright(C) 2018 The LaTeX3 Project
-\bool_new:N \l__draw_transformcm_active_bool
-\fp_new:N \l__draw_transformcm_aa_fp
-\fp_new:N \l__draw_transformcm_ab_fp
-\fp_new:N \l__draw_transformcm_ba_fp
-\fp_new:N \l__draw_transformcm_bb_fp
-\dim_new:N \l__draw_transformcm_xshift_dim
-\dim_new:N \l__draw_transformcm_yshift_dim
-\cs_new_protected:Npn \draw_transform_reset:
- {
- \fp_set:Nn \l__draw_transformcm_aa_fp { 1}
- \fp_zero:N \l__draw_transformcm_ab_fp
- \fp_zero:N \l__draw_transformcm_ba_fp
- \fp_set:Nn \l__draw_transformcm_bb_fp { 1 }
- \dim_zero:N \l__draw_transformcm_xshift_dim
- \dim_zero:N \l__draw_transformcm_yshift_dim
- }
-\draw_transform_reset:
-\cs_new_protected:Npn \draw_transform:nnnnn #1#2#3#4#5
- {
- \__draw_point_process:nn
- { \__draw_transform:nnnnnnn {#1} {#2} {#3} {#4} }
- {#5}
- }
-\cs_new_protected:Npn \__draw_transform:nnnnnnn #1#2#3#4#5#6
- {
- \fp_set:Nn \l__draw_transformcm_aa_fp {#1}
- \fp_set:Nn \l__draw_transformcm_ab_fp {#2}
- \fp_set:Nn \l__draw_transformcm_ba_fp {#3}
- \fp_set:Nn \l__draw_transformcm_bb_fp {#4}
- \dim_set:Nn \l__draw_transformcm_xshift_dim {#5}
- \dim_set:Nn \l__draw_transformcm_yshift_dim {#6}
+\bool_new:N \l__draw_matrix_active_bool
+\fp_new:N \l__draw_matrix_a_fp
+\fp_new:N \l__draw_matrix_b_fp
+\fp_new:N \l__draw_matrix_c_fp
+\fp_new:N \l__draw_matrix_d_fp
+\dim_new:N \l__draw_xshift_dim
+\dim_new:N \l__draw_yshift_dim
+\cs_new_protected:Npn \draw_transform_matrix_reset:
+ {
+ \fp_set:Nn \l__draw_matrix_a_fp { 1 }
+ \fp_zero:N \l__draw_matrix_b_fp
+ \fp_zero:N \l__draw_matrix_c_fp
+ \fp_set:Nn \l__draw_matrix_d_fp { 1 }
+ }
+\cs_new_protected:Npn \draw_transform_shift_reset:
+ {
+ \dim_zero:N \l__draw_xshift_dim
+ \dim_zero:N \l__draw_yshift_dim
+ }
+\draw_transform_matrix_reset:
+\draw_transform_shift_reset:
+\cs_new_protected:Npn \draw_transform_matrix:nnnn #1#2#3#4
+ {
+ \fp_set:Nn \l__draw_matrix_a_fp {#1}
+ \fp_set:Nn \l__draw_matrix_b_fp {#2}
+ \fp_set:Nn \l__draw_matrix_c_fp {#3}
+ \fp_set:Nn \l__draw_matrix_d_fp {#4}
\bool_lazy_all:nTF
{
- { \fp_compare_p:nNn \l__draw_transformcm_aa_fp = \c_one_fp }
- { \fp_compare_p:nNn \l__draw_transformcm_ab_fp = \c_zero_fp }
- { \fp_compare_p:nNn \l__draw_transformcm_ba_fp = \c_zero_fp }
- { \fp_compare_p:nNn \l__draw_transformcm_bb_fp = \c_one_fp }
+ { \fp_compare_p:nNn \l__draw_matrix_a_fp = \c_one_fp }
+ { \fp_compare_p:nNn \l__draw_matrix_b_fp = \c_zero_fp }
+ { \fp_compare_p:nNn \l__draw_matrix_c_fp = \c_zero_fp }
+ { \fp_compare_p:nNn \l__draw_matrix_d_fp = \c_one_fp }
}
- { \bool_set_false:N \l__draw_transformcm_active_bool }
- { \bool_set_true:N \l__draw_transformcm_active_bool }
+ { \bool_set_false:N \l__draw_matrix_active_bool }
+ { \bool_set_true:N \l__draw_matrix_active_bool }
}
-\cs_new_protected:Npn \draw_transform_concat:nnnnn #1#2#3#4#5
+\cs_new_protected:Npn \draw_transform_shift:n #1
{
\__draw_point_process:nn
- { \__draw_transform_concat:nnnnnn {#1} {#2} {#3} {#4} }
- {#5}
+ { \__draw_transform_shift:nn } {#1}
}
-\cs_new_protected:Npn \__draw_transform_concat:nnnnnn #1#2#3#4#5#6
+\cs_new_protected:Npn \__draw_transform_shift:nn #1#2
+ {
+ \dim_set:Nn \l__draw_xshift_dim {#1}
+ \dim_set:Nn \l__draw_yshift_dim {#2}
+ }
+\cs_new_protected:Npn \draw_transform_matrix_concat:nnnn #1#2#3#4
{
\use:x
{
- \__draw_transform_concat_aux:nnnnnn
+ \__draw_transform_concat:nnnn
{ \fp_eval:n {#1} }
{ \fp_eval:n {#2} }
{ \fp_eval:n {#3} }
{ \fp_eval:n {#4} }
- {#5}
- {#6}
}
}
-\cs_new_protected:Npn \__draw_transform_concat_aux:nnnnnn #1#2#3#4#5#6
+\cs_new_protected:Npn \__draw_transform_concat:nnnn #1#2#3#4
{
\use:x
{
- \__draw_transform:nnnnnnn
- { #1 * \l__draw_transformcm_aa_fp + #2 * \l__draw_transformcm_ba_fp }
- { #1 * \l__draw_transformcm_ab_fp + #2 * \l__draw_transformcm_bb_fp }
- { #3 * \l__draw_transformcm_aa_fp + #4 * \l__draw_transformcm_ba_fp }
- { #3 * \l__draw_transformcm_ab_fp + #4 * \l__draw_transformcm_bb_fp }
- {
- \fp_to_dim:n
- {
- \l__draw_transformcm_xshift_dim
- + \l__draw_transformcm_aa_fp * #5
- + \l__draw_transformcm_ba_fp * #6
- }
- }
- {
- \fp_to_dim:n
- {
- \l__draw_transformcm_yshift_dim
- + \l__draw_transformcm_ab_fp * #5
- + \l__draw_transformcm_bb_fp * #6
- }
- }
+ \draw_transform_matrix:nnnn
+ { #1 * \l__draw_matrix_a_fp + #2 * \l__draw_matrix_c_fp }
+ { #1 * \l__draw_matrix_b_fp + #2 * \l__draw_matrix_d_fp }
+ { #3 * \l__draw_matrix_a_fp + #4 * \l__draw_matrix_c_fp }
+ { #3 * \l__draw_matrix_b_fp + #4 * \l__draw_matrix_d_fp }
}
}
-\cs_new_protected:Npn \draw_transform_invert:
+\cs_new_protected:Npn \draw_transform_shift_concat:n #1
{
- \bool_if:NT \l__draw_transformcm_active_bool
+ \__draw_point_process:nn
+ { \__draw_transform_shift_concat:nn } {#1}
+ }
+\cs_new_protected:Npn \__draw_transform_shift_concat:nn #1#2
+ {
+ \dim_set:Nn \l__draw_xshift_dim { \l__draw_xshift_dim + #1 }
+ \dim_set:Nn \l__draw_yshift_dim { \l__draw_yshift_dim + #2 }
+ }
+\cs_new_protected:Npn \draw_transform_matrix_invert:
+ {
+ \bool_if:NT \l__draw_matrix_active_bool
{
\__draw_transform_invert:f
{
@@ -1284,41 +1707,30 @@
{
1 /
(
- \l__draw_transformcm_aa_fp * \l__draw_transformcm_bb_fp
- - \l__draw_transformcm_ab_fp * \l__draw_transformcm_ba_fp
+ \l__draw_matrix_a_fp * \l__draw_matrix_d_fp
+ - \l__draw_matrix_b_fp * \l__draw_matrix_c_fp
)
}
}
}
- \dim_set:Nn \l__draw_transformcm_xshift_dim
- {
- \fp_to_dim:n
- {
- -\l__draw_transformcm_xshift_dim * \l__draw_transformcm_aa_fp
- -\l__draw_transformcm_yshift_dim * \l__draw_transformcm_ba_fp
- }
- }
- \dim_set:Nn \l__draw_transformcm_yshift_dim
- {
- \fp_to_dim:n
- {
- -\l__draw_transformcm_xshift_dim * \l__draw_transformcm_ab_fp
- -\l__draw_transformcm_yshift_dim * \l__draw_transformcm_bb_fp
- }
- }
}
\cs_new_protected:Npn \__draw_transform_invert:n #1
{
- \fp_set:Nn \l__draw_transformcm_aa_fp
- { \l__draw_transformcm_bb_fp * #1 }
- \fp_set:Nn \l__draw_transformcm_ab_fp
- { -\l__draw_transformcm_ab_fp * #1 }
- \fp_set:Nn \l__draw_transformcm_ba_fp
- { -\l__draw_transformcm_ba_fp * #1 }
- \fp_set:Nn \l__draw_transformcm_bb_fp
- { \l__draw_transformcm_aa_fp * #1 }
+ \fp_set:Nn \l__draw_matrix_a_fp
+ { \l__draw_matrix_d_fp * #1 }
+ \fp_set:Nn \l__draw_matrix_b_fp
+ { -\l__draw_matrix_b_fp * #1 }
+ \fp_set:Nn \l__draw_matrix_c_fp
+ { -\l__draw_matrix_c_fp * #1 }
+ \fp_set:Nn \l__draw_matrix_d_fp
+ { \l__draw_matrix_a_fp * #1 }
}
\cs_generate_variant:Nn \__draw_transform_invert:n { f }
+\cs_new_protected:Npn \draw_transform_shift_invert:
+ {
+ \dim_set:Nn \l__draw_xshift_dim { -\l__draw_xshift_dim }
+ \dim_set:Nn \l__draw_yshift_dim { -\l__draw_yshift_dim }
+ }
\cs_new_protected:Npn \draw_transform_triangle:nnn #1#2#3
{
\__draw_point_process:nnn
@@ -1333,15 +1745,40 @@
{
\use:x
{
- \__draw_transform:nnnnnnn
+ \draw_transform_matrix:nnnn
{ #3 - #1 }
{ #4 - #2 }
{ #5 - #1 }
{ #6 - #2 }
- {#1}
- {#2}
+ \draw_transform_shift:n { #1 , #2 }
}
}
+\cs_new_protected:Npn \draw_transform_scale:n #1
+ { \draw_transform_matrix_concat:nnnn { #1 } { 0 } { 0 } { #1 } }
+\cs_new_protected:Npn \draw_transform_xscale:n #1
+ { \draw_transform_matrix_concat:nnnn { #1 } { 0 } { 0 } { 1 } }
+\cs_new_protected:Npn \draw_transform_yscale:n #1
+ { \draw_transform_matrix_concat:nnnn { 1 } { 0 } { 0 } { #1 } }
+\cs_new_protected:Npn \draw_transform_xshift:n #1
+ { \draw_transform_shift_concat:n { #1 , 0 } }
+\cs_new_protected:Npn \draw_transform_yshift:n #1
+ { \draw_transform_shift_concat:n { 0 , #1 } }
+\cs_new_protected:Npn \draw_transform_xslant:n #1
+ { \draw_transform_matrix_concat:nnnn { 1 } { 0 } { #1 } { 1 } }
+\cs_new_protected:Npn \draw_transform_yslant:n #1
+ { \draw_transform_matrix_concat:nnnn { 1 } { #1 } { 0 } { 1 } }
+\cs_new_protected:Npn \draw_transform_rotate:n #1
+ { \__draw_transform_rotate:f { \fp_eval:n {#1} } }
+\cs_new_protected:Npn \__draw_transform_rotate:n #1
+ {
+ \__draw_transform_rotate:ff
+ { \fp_eval:n { cosd(#1) } }
+ { \fp_eval:n { sind(#1) } }
+ }
+\cs_generate_variant:Nn \__draw_transform_rotate:n { f }
+\cs_new_protected:Npn \__draw_transform_rotate:nn #1#2
+ { \draw_transform_matrix_concat:nnnn {#1} {#2} { -#2 } { #1 } }
+\cs_generate_variant:Nn \__draw_transform_rotate:nn { ff }
%%
%%
%% End of file `l3draw.sty'.