diff options
Diffstat (limited to 'Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty')
-rw-r--r-- | Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty | 839 |
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'. |