[latex3-commits] [git/LaTeX3-latex3-latex3] master: l3draw: Transformation of points (36b1f20)

Joseph Wright joseph.wright at morningstar2.co.uk
Sat Feb 10 21:23:24 CET 2018


Repository : https://github.com/latex3/latex3
On branch  : master
Link       : https://github.com/latex3/latex3/commit/36b1f201f76d0dd3d58d538dda0fdc1d172486ad

>---------------------------------------------------------------

commit 36b1f201f76d0dd3d58d538dda0fdc1d172486ad
Author: Joseph Wright <joseph.wright at morningstar2.co.uk>
Date:   Sat Feb 10 15:43:10 2018 +0000

    l3draw: Transformation of points
    
    This is a somewhat different set up to pgf, largely as we can work
    expandably. Over time this may change: need to see how things work out.


>---------------------------------------------------------------

36b1f201f76d0dd3d58d538dda0fdc1d172486ad
 l3trial/l3draw/l3draw-points.dtx                   |   49 ++++++
 l3trial/l3draw/l3draw-transforms.dtx               |  186 ++++++++++++++++++++
 l3trial/l3draw/l3draw.dtx                          |   22 +++
 l3trial/l3draw/l3draw.ins                          |   11 +-
 l3trial/l3draw/testfiles/m3draw000.tlg             |    2 +
 l3trial/l3draw/testfiles/m3draw002.lvt             |   38 ++++
 .../l3draw/testfiles/m3draw002.tlg                 |   31 ++--
 7 files changed, 323 insertions(+), 16 deletions(-)

diff --git a/l3trial/l3draw/l3draw-points.dtx b/l3trial/l3draw/l3draw-points.dtx
index 95c0dae..3344af5 100644
--- a/l3trial/l3draw/l3draw-points.dtx
+++ b/l3trial/l3draw/l3draw-points.dtx
@@ -939,6 +939,55 @@
 % \end{macro}
 % \end{macro}
 %
+% \subsection{Transformations}
+%
+% \begin{macro}[rEXP]{\draw_point_transform:n}
+% \begin{macro}[rEXP]{\@@_point_transform:nnnn}
+% \begin{macro}[rEXP]{\@@_point_transform:nn}
+%   Applies a transformation matrix to a point: see \texttt{l3draw-transforms}
+%   for the business end. As there is only one point expression, we provide
+%   a dummy one for the expansion. After that, it's the usual requirement:
+%   apply the mathematics (or not!). Where possible, we avoid the relatively
+%   expensive multiplication step.
+%    \begin{macrocode}
+\cs_new:Npn \draw_point_transform:n #1
+  {
+    \@@_point_expand:nnN {#1} { { } { } }
+      \@@_point_transform:nnnn
+  }
+\cs_new:Npn \@@_point_transform:nnnn #1#2#3#4
+  { \@@_point_transform:nn {#1} {#2} }
+\cs_new:Npn \@@_point_transform:nn #1#2
+  {
+    \bool_if:NTF \l_@@_transformcm_active_bool
+      {
+        {
+          \fp_to_dim:n
+            {
+                \l_@@_transformcm_aa_fp * #1
+              + \l_@@_transformcm_ba_fp * #2
+              + \l_@@_transformcm_xshift_dim
+            }
+        }
+        {
+          \fp_to_dim:n
+            {
+                \l_@@_transformcm_ab_fp * #1
+              + \l_@@_transformcm_bb_fp * #2
+              + \l_@@_transformcm_yshift_dim
+            }
+        }
+      }
+      {
+        { \fp_to_dim:n { #1 + \l_@@_transformcm_xshift_dim } }
+        { \fp_to_dim:n { #2 + \l_@@_transformcm_yshift_dim } }
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
 %    \begin{macrocode}
 %</initex|package>
 %    \end{macrocode}
diff --git a/l3trial/l3draw/l3draw-transforms.dtx b/l3trial/l3draw/l3draw-transforms.dtx
new file mode 100644
index 0000000..050f88e
--- /dev/null
+++ b/l3trial/l3draw/l3draw-transforms.dtx
@@ -0,0 +1,186 @@
+% \iffalse meta-comment
+%
+%% File: l3draw-transforms.dtx Copyright(C) 2018 The LaTeX3 Project
+%
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version.  The latest version
+% of this license is in the file
+%
+%    http://www.latex-project.org/lppl.txt
+%
+% This file is part of the "l3trial bundle" (The Work in LPPL)
+% and all files in that bundle must be distributed together.
+%
+% -----------------------------------------------------------------------
+%
+% The development version of the bundle can be found at
+%
+%    https://github.com/latex3/latex3
+%
+% for those people who are interested.
+%
+%<*driver>
+\RequirePackage{expl3}
+\documentclass[full]{l3doc}
+\begin{document}
+  \DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \title{^^A
+%   The \pkg{l3draw-transforms} package\\ Transformations^^A
+% }
+%
+% \author{^^A
+%  The \LaTeX3 Project\thanks
+%    {^^A
+%      E-mail:
+%        \href{mailto:latex-team at latex-project.org}
+%          {latex-team at latex-project.org}^^A
+%    }^^A
+% }
+%
+% \date{Released 2018/02/05}
+%
+% \maketitle
+%
+% \begin{implementation}
+%
+% \section{\pkg{l3draw-transforms} implementation}
+%
+%    \begin{macrocode}
+%<*initex|package>
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+%<@@=draw>
+%    \end{macrocode}
+%
+% \begin{variable}{\l_@@_transformcm_active_bool}
+%   An internal flag to avoid redundant calculations.
+%    \begin{macrocode}
+\bool_new:N \l_@@_transformcm_active_bool
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}
+%   {
+%     \l_@@_transformcm_aa_fp, \l_@@_transformcm_ab_fp,
+%     \l_@@_transformcm_ba_fp, \l_@@_transformcm_aa_fp,
+%     \l_@@_transformcm_xshift_dim,
+%     \l_@@_transformcm_yshift_dim
+%   }
+%   The active matrix itself.
+%    \begin{macrocode}
+\fp_new:N \l_@@_transformcm_aa_fp
+\fp_new:N \l_@@_transformcm_ab_fp
+\fp_new:N \l_@@_transformcm_ba_fp
+\fp_new:N \l_@@_transformcm_bb_fp
+\dim_new:N \l_@@_transformcm_xshift_dim
+\dim_new:N \l_@@_transformcm_yshift_dim
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\draw_set_transform:nnnnn}
+% \begin{macro}{\@@_set_transform:nnnnnn}
+%   Setting the transform matrix is straight-forward, with just a bit
+%   of expansion to sort out. With the mechanism active, the identity
+%   matrix is set.
+%    \begin{macrocode}
+\cs_new_protected:Npn \draw_set_transform:nnnnn #1#2#3#4#5
+  {
+    \use:x
+      { \@@_set_transform:nnnnnn {#1} {#2} {#3} {#4} #5 }
+  }
+\cs_new_protected:Npn \@@_set_transform:nnnnnn #1#2#3#4#5#6
+  {
+    \fp_set:Nn \l_@@_transformcm_aa_fp {#1}
+    \fp_set:Nn \l_@@_transformcm_ab_fp {#2}
+    \fp_set:Nn \l_@@_transformcm_ba_fp {#3}
+    \fp_set:Nn \l_@@_transformcm_bb_fp {#4}
+    \dim_set:Nn \l_@@_transformcm_xshift_dim {#5}
+    \dim_set:Nn \l_@@_transformcm_yshift_dim {#6}
+    \bool_lazy_all:nTF
+      {
+        { \fp_compare_p:nNn \l_@@_transformcm_aa_fp = \c_one_fp }
+        { \fp_compare_p:nNn \l_@@_transformcm_ab_fp = \c_zero_fp }
+        { \fp_compare_p:nNn \l_@@_transformcm_ba_fp = \c_zero_fp }
+        { \fp_compare_p:nNn \l_@@_transformcm_bb_fp = \c_one_fp }
+      }
+      { \bool_set_false:N \l_@@_transformcm_active_bool }
+      { \bool_set_true:N \l_@@_transformcm_active_bool }
+  }
+\draw_set_transform:nnnnn { 1 } { 0 } { 0 } { 1 } { { 0pt } { 0pt } }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\draw_add_transform:nnnnn}
+% \begin{macro}{\@@_add_transform:nnnnnn}
+% \begin{macro}{\@@_add_transform_aux:nnnnnn}
+%   Much the same story for adding to an existing matrix. The part that is more
+%   complex is the calculations required: everything gets passed back to
+%   \cs{@@_set_transform:nnnnnn}, with pre-expansion just in case there are
+%   \emph{e.g}~random values. The final step is \texttt{x}-type expanded as
+%   otherwise later values affect earlier ones.
+%    \begin{macrocode}
+\cs_new_protected:Npn \draw_add_transform:nnnnn #1#2#3#4#5
+  {
+    \use:x
+      { \@@_add_transform:nnnnnn {#1} {#2} {#3} {#4} #5 }
+  }
+\cs_new_protected:Npn \@@_add_transform:nnnnnn #1#2#3#4#5#6
+  {
+    \use:x
+      {
+        \@@_add_transform_aux:nnnnnn
+          { \fp_eval:n {#1} }
+          { \fp_eval:n {#2} }
+          { \fp_eval:n {#3} }
+          { \fp_eval:n {#4} }
+          { \fp_to_dim:n {#5} }
+          { \fp_to_dim:n {#6} }
+      }
+  }
+\cs_new_protected:Npn \@@_add_transform_aux:nnnnnn #1#2#3#4#5#6
+  {
+    \use:x
+      {
+        \@@_set_transform:nnnnnn
+          { #1 * \l_@@_transformcm_aa_fp + #2 * \l_@@_transformcm_ba_fp }
+          { #1 * \l_@@_transformcm_ab_fp + #2 * \l_@@_transformcm_bb_fp }
+          { #3 * \l_@@_transformcm_aa_fp + #4 * \l_@@_transformcm_ba_fp }
+          { #3 * \l_@@_transformcm_ab_fp + #4 * \l_@@_transformcm_bb_fp }
+          {
+            \exp_not:N \fp_to_dim:n
+              {
+                  \l_@@_transformcm_xshift_dim
+                + \l_@@_transformcm_aa_fp * #5
+                + \l_@@_transformcm_ba_fp * #6
+              }
+          }
+          {
+            \exp_not:N \fp_to_dim:n
+              {
+                  \l_@@_transformcm_yshift_dim
+                + \l_@@_transformcm_ab_fp * #5
+                + \l_@@_transformcm_bb_fp * #6
+              }
+          }
+        }
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%    \begin{macrocode}
+%</initex|package>
+%    \end{macrocode}
+%
+% \end{implementation}
+%
+% \PrintIndex
diff --git a/l3trial/l3draw/l3draw.dtx b/l3trial/l3draw/l3draw.dtx
index 5a0d6d3..e5562f2 100644
--- a/l3trial/l3draw/l3draw.dtx
+++ b/l3trial/l3draw/l3draw.dtx
@@ -150,6 +150,28 @@
 %   \end{syntax}
 % \end{function}
 %
+% \begin{function}[rEXP]{\draw_point_transform:n}
+%   \begin{syntax}
+%     \cs{draw_point_transform:n} \marg{point expr}
+%   \end{syntax}
+% \end{function}
+%
+% \subsection{Transformations}
+%
+% \begin{function}{\draw_add_transformcm:nnnnn}
+%   \begin{syntax}
+%     \cs{draw_add_transformcm:nnnnn}
+%       \marg{a} \marg{b} \marg{c} \marg{d} \marg{point expr}
+%   \end{syntax}
+% \end{function}
+%
+% \begin{function}{\draw_set_transformcm:nnnnn}
+%   \begin{syntax}
+%     \cs{draw_set_transformcm:nnnnn}
+%       \marg{a} \marg{b} \marg{c} \marg{d} \marg{point expr}
+%   \end{syntax}
+% \end{function}
+%
 % \end{documentation}
 %
 % \begin{implementation}
diff --git a/l3trial/l3draw/l3draw.ins b/l3trial/l3draw/l3draw.ins
index 48758c8..76739c8 100644
--- a/l3trial/l3draw/l3draw.ins
+++ b/l3trial/l3draw/l3draw.ins
@@ -53,11 +53,12 @@ and all files in that bundle must be distributed together.
 
 \generate{\file{l3draw.sty}
   {
-    \from{l3draw.dtx}       {package}
-    \from{l3draw-paths.dtx} {package}
-    \from{l3draw-points.dtx}{package}
-    \from{l3draw-scopes.dtx}{package}
-    \from{l3draw-state.dtx} {package}
+    \from{l3draw.dtx}            {package}
+    \from{l3draw-paths.dtx}      {package}
+    \from{l3draw-points.dtx}     {package}
+    \from{l3draw-scopes.dtx}     {package}
+    \from{l3draw-state.dtx}      {package}
+    \from{l3draw-transforms.dtx} {package}
   }
 }
 
diff --git a/l3trial/l3draw/testfiles/m3draw000.tlg b/l3trial/l3draw/testfiles/m3draw000.tlg
index 967e789..599167b 100644
--- a/l3trial/l3draw/testfiles/m3draw000.tlg
+++ b/l3trial/l3draw/testfiles/m3draw000.tlg
@@ -19,4 +19,6 @@ Author: Joseph Wright
 \g__draw_ymax_dim=\dimen...
 \g__draw_ymin_dim=\dimen...
 \l__draw_main_box=\box...
+\l__draw_transformcm_xshift_dim=\dimen...
+\l__draw_transformcm_yshift_dim=\dimen...
 )
diff --git a/l3trial/l3draw/testfiles/m3draw002.lvt b/l3trial/l3draw/testfiles/m3draw002.lvt
new file mode 100644
index 0000000..818b89b
--- /dev/null
+++ b/l3trial/l3draw/testfiles/m3draw002.lvt
@@ -0,0 +1,38 @@
+%
+% Copyright (C) 2018 The LaTeX3 Project
+%
+
+\documentclass{minimal}
+\input{regression-test}
+
+\RequirePackage[check-declarations]{expl3}
+\ExplSyntaxOn
+\debug_on:n { deprecation }
+\ExplSyntaxOff
+
+\AUTHOR{Joseph Wright}
+\RequirePackage{l3draw}
+
+\ExplSyntaxOn
+
+\START
+
+\TEST { \draw_set_transform:nnnnn }
+  {
+    \exp_args:Nx \tl_show:n { \draw_point_transform:n { { 1 } { 1 } } }
+    \draw_set_transform:nnnnn { 1 } { 1 } { 1 } { 1 } { { 0pt } { 0pt } }
+    \exp_args:Nx \tl_show:n { \draw_point_transform:n { { 1 } { 1 } } }
+    \draw_set_transform:nnnnn { 1 } { 0 } { 0 } { 1 } { { 10pt } { -10pt } }
+    \exp_args:Nx \tl_show:n { \draw_point_transform:n { { 1 } { 1 } } }
+  }
+
+\TEST { \draw_add_transform:nnnnn }
+  {
+    \exp_args:Nx \tl_show:n { \draw_point_transform:n { { 1 } { 1 } } }
+    \draw_add_transform:nnnnn { 1 } { 1 } { 1 } { 1 } { { 0pt } { 0pt } }
+    \exp_args:Nx \tl_show:n { \draw_point_transform:n { { 1 } { 1 } } }
+    \draw_add_transform:nnnnn { 1 } { 0 } { 0 } { 1 } { { 10pt } { -10pt } }
+    \exp_args:Nx \tl_show:n { \draw_point_transform:n { { 1 } { 1 } } }
+  }
+
+\END
diff --git a/l3kernel/testfiles/m3clist006.tlg b/l3trial/l3draw/testfiles/m3draw002.tlg
similarity index 59%
copy from l3kernel/testfiles/m3clist006.tlg
copy to l3trial/l3draw/testfiles/m3draw002.tlg
index 3df01c2..f7cabc3 100644
--- a/l3kernel/testfiles/m3clist006.tlg
+++ b/l3trial/l3draw/testfiles/m3draw002.tlg
@@ -1,19 +1,28 @@
 This is a generated file for the LaTeX (2e + expl3) validation system.
 Don't change this file in any respect.
-Author: Bruno Le Floch
 ============================================================
-TEST 1: clist_reverse:n
+TEST 1: \draw_set_transform:nnnnn 
 ============================================================
-|| |{}|,|, |,{}| ,|{},|
-|,,, { },{ }, {},{}, |\c ,\a \b |
+> {1pt}{1pt}.
+<recently read> }
+l. ...  }
+> {2pt}{2pt}.
+<recently read> }
+l. ...  }
+> {11pt}{-9pt}.
+<recently read> }
+l. ...  }
 ============================================================
 ============================================================
-TEST 2: clist_reverse:N
+TEST 2: \draw_add_transform:nnnnn 
 ============================================================
-Defining \c_test_clist on line ...
-\c ,{,},{ },\a \b 
-TRUE
-FALSE
-TRUE
-TRUE
+> {1pt}{1pt}.
+<recently read> }
+l. ...  }
+> {2pt}{2pt}.
+<recently read> }
+l. ...  }
+> {2pt}{2pt}.
+<recently read> }
+l. ...  }
 ============================================================





More information about the latex3-commits mailing list