[latex3-commits] [l3svn] 02/02: Rework colour support

noreply at latex-project.org noreply at latex-project.org
Thu Jun 15 12:03:02 CEST 2017


This is an automated email from the git hooks/post-receive script.

joseph pushed a commit to branch master
in repository l3svn.

commit 38014e7de69cf30329690f8f5e6fcd3b55800c1e
Author: Joseph Wright <joseph.wright at morningstar2.co.uk>
Date:   Thu Jun 15 10:59:12 2017 +0100

    Rework colour support
    
    This moves more of the code to l3color rather than l3drivers.
    
    Most notably, the colour data is now stored in a driver-independent form.
    That requires some work to pick up LaTeX2e data.
---
 l3kernel/l3color.dtx                    |   33 +++++++++++-
 l3kernel/l3drivers.dtx                  |   87 ++++++++++++++++++++++++-------
 l3kernel/testfiles/m3expl001.luatex.tlg |    6 ++-
 l3kernel/testfiles/m3expl001.ptex.tlg   |    2 +-
 l3kernel/testfiles/m3expl001.tlg        |    6 ++-
 l3kernel/testfiles/m3expl001.uptex.tlg  |    2 +-
 l3kernel/testfiles/m3expl001.xetex.tlg  |    2 +-
 l3kernel/testfiles/m3expl003.luatex.tlg |    6 ++-
 l3kernel/testfiles/m3expl003.ptex.tlg   |    2 +-
 l3kernel/testfiles/m3expl003.tlg        |    6 ++-
 l3kernel/testfiles/m3expl003.uptex.tlg  |    2 +-
 l3kernel/testfiles/m3expl003.xetex.tlg  |    2 +-
 12 files changed, 127 insertions(+), 29 deletions(-)

diff --git a/l3kernel/l3color.dtx b/l3kernel/l3color.dtx
index 7201aac..15daa96 100644
--- a/l3kernel/l3color.dtx
+++ b/l3kernel/l3color.dtx
@@ -51,6 +51,25 @@
 % material here is mainly intended to support a small number of low-level
 % requirements in other \pkg{l3kernel} modules.
 %
+% \begin{variable}[added = 2017-06-15]{\l_color_current_tl}
+%   The color currently active for foreground (text, \emph{etc.}) material.
+%   This is stored in the form of a color model followed by one or more
+%   values in the range $[0,1]$: these determine the color. The model and
+%   applicable data format must be one of the following:
+%   \begin{itemize}
+%     \item \texttt{gray \meta{gray}} Grayscale color with the \meta{gray}
+%       value running from $0$ (fully black) to $1$ (fully white)
+%     \item \texttt{cmyk \meta{cyan} \meta{magenta} \meta{yellow} \meta{black}}
+%     \item \texttt{rgb \meta{red} \meta{green} \meta{blue}}
+%   \end{itemize}
+%   Notice that the value are separated by spaces.
+%   \begin{texnote}
+%     This format is the native one for \texttt{dvips} color specials:
+%     other drivers are expected to convert to their own format when
+%     writing color data to output.
+%   \end{texnote}
+% \end{function}
+%
 % \section{Color in boxes}
 %
 % Controlling the color of text in boxes requires a small number of control
@@ -105,10 +124,22 @@
 %   current color \enquote{now}.
 %    \begin{macrocode}
 \cs_new_protected:Npn \color_ensure_current:
-  { \__driver_color_ensure_current: }
+  {
+    \__driver_color_ensure_current:
+    \group_insert_after:N \__driver_color_reset:
+  }
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{variable}{\l_color_current_tl}
+%   The current color: the format here is taken from \texttt{dvips} but it
+%   is easy enough to convert to \texttt{pdfmode} as required.
+%    \begin{macrocode}
+\tl_new:N \l_color_current_tl
+\tl_set:Nn \l_color_current_tl { gray~0 }
+%    \end{macrocode}
+% \end{variable}
+%
 %    \begin{macrocode}
 %</initex|package>
 %    \end{macrocode}
diff --git a/l3kernel/l3drivers.dtx b/l3kernel/l3drivers.dtx
index 1f29099..f5a78a7 100644
--- a/l3kernel/l3drivers.dtx
+++ b/l3kernel/l3drivers.dtx
@@ -510,21 +510,22 @@
 %<*dvisvgm|dvipdfmx|dvips|xdvipdfmx>
 %    \end{macrocode}
 %
-% \begin{variable}{\l_@@_color_current_tl}
-%   The current color in driver-dependent format.
+% \begin{macro}[aux]{\@@_color_pickup:}
+%   Allow for \LaTexe{}.
 %    \begin{macrocode}
-\tl_new:N \l_@@_color_current_tl
-\tl_set:Nn \l_@@_color_current_tl { gray~0 }
 %<*package>
 \AtBeginDocument
   {
     \@ifpackageloaded { color }
-      { \tl_set:Nn \l_@@_color_current_tl { \current at color } }
-      { }
+      {
+        \cs_new_protected:Npn \@@_color_pickup:
+          { \tl_set_eq:NN \l_color_current_tl \current at color }
+      }
+      { \cs_new_protected:Npn \@@_color_pickup: { } }
   }
 %</package>
 %    \end{macrocode}
-% \end{variable}
+% \end{macro}
 %
 % \begin{macro}[int]{\@@_color_ensure_current:}
 % \begin{macro}[aux]{\@@_color_reset:}
@@ -532,8 +533,10 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_color_ensure_current:
   {
-    \tex_special:D { color~push~\l_@@_color_current_tl }
-    \group_insert_after:N \@@_color_reset:
+%<*package>
+    \@@_color_pickup:
+%</package>
+    \tex_special:D { color~push~\l_color_current_tl }
   }
 \cs_new_protected:Npn \@@_color_reset:
   { \tex_special:D { color~pop } }
@@ -551,22 +554,46 @@
 %<*pdfmode>
 %    \end{macrocode}
 %
-% \begin{variable}{\l_@@_color_current_tl}
+% \begin{macro}[aux]{\@@_color_pickup:}
+% \begin{macro}[aux]{\@@_color_pickup_aux:}
 %   The current color in driver-dependent format: pick up the package-mode
-%   data if available.
+%   data if available. We end up converting back and forward in this route as
+%   we store our color data in \texttt{dvips} format.
 %    \begin{macrocode}
-\tl_new:N \l_@@_color_current_tl
-\tl_set:Nn \l_@@_color_current_tl { 0~g~0~G }
 %<*package>
 \AtBeginDocument
   {
     \@ifpackageloaded { color }
-      { \tl_set:Nn \l_@@_color_current_tl { \current at color } }
-      { }
+      {
+        \cs_new_protected:Npn \@@_color_pickup:
+          {
+            \tl_set:Nx \l_color_current_tl
+              {
+                \exp_after:wN \@@_color_pickup_aux:w
+                  \l_color_current_tl ~ 0 ~ 0 ~ 0 \q_stop
+              }
+          }
+        \cs_new:Npn \@@_color_pickup_aux:w #1 ~ #2 ~ #3 ~ #4 ~ #5 ~ #6 \q_stop
+          {
+            \str_if_eq:nnTF {#2} { g }
+              { gray ~ #1 }
+              {
+                \str_if_eq:nnTF {#4} { rg }
+                  { rgb ~ #1 ~ #2 ~ #3 }
+                  {
+                    \str_if_eq:nnTF {#5} { k }
+                      { cmyk ~ #1 ~ #2 ~ #3 ~ #4 }
+                      { gray ~ #1 }
+                  }
+              }
+          }
+      }
+      { \cs_new_protected:Npn \@@_color_pickup: { } }
   }
 %</package>
 %    \end{macrocode}
-% \end{variable}
+% \end{macro}
+% \end{macro}
 %
 % \begin{variable}{\l_@@_color_stack_int}
 %   \pdfTeX{} and \LuaTeX{} have multiple stacks available, and to track
@@ -577,19 +604,42 @@
 % \end{variable}
 %
 % \begin{macro}[int]{\@@_color_ensure_current:}
+% \begin{macro}[aux, EXP]
+%   {
+%     \@@_color_convert:w, \@@_color_convert_gray:w,
+%     \@@_color_convert_cmyk:w, \@@_color_convert_rgb:w
+%   }
 % \begin{macro}[aux]{\@@_color_reset:}
 %   There is a dedicated primitive/primitive interface for setting colors.
 %   As with scoping, this approach is not suitable for cached operations.
+%   Since we are using the \texttt{dvips} format to store color, there is a
+%   bit of work to correctly place it in the output.
 %    \begin{macrocode}
 \cs_new_protected:Npx \@@_color_ensure_current:
   {
+%<*package>
+    \exp_not:N \@@_color_pickup:
+%</package>
     \cs_if_exist:NTF \luatex_pdfextension:D
       { \luatex_pdfextension:D colorstack }
       { \pdftex_pdfcolorstack:D }
         \exp_not:N \l_@@_color_stack_int push
-          { \exp_not:N \l_@@_color_current_tl }
-    \group_insert_after:N \exp_not:N \@@_color_reset:
+          {
+            \exp_not:N \exp_after:wN
+            \exp_not:N \@@_color_convert:w
+            \exp_not:N \l_color_current_tl
+            \c_space_tl 0 ~ 0 ~ 0
+            \exp_not:N \q_stop
+          }
   }
+\cs_new:Npn \@@_color_convert:w #1 ~
+  { \use:c { @@_color_convert_ #1 :w } }
+\cs_new:Npn \@@_color_convert_gray:w #1 ~ #2 \q_stop
+  { #1 ~ g ~ #1 ~ G }
+\cs_new:Npn \@@_color_convert_cmyk:w #1 ~ #2 ~ #3 ~ #4 \q_stop
+  { #1 ~ #2 ~ #3 ~ rg ~ #1 ~ #2 ~ #3 ~ RG }
+\cs_new:Npn \@@_color_convert_rgb:w #1 ~ #2 ~ #3 ~ #4 ~ #5 \q_stop
+  { #1 ~ #2 ~ #3 ~ #4 ~ k ~ #1 ~ #2 ~ #3 ~ #4 ~ K }
 \cs_new_protected:Npx \@@_color_reset:
   {
     \cs_if_exist:NTF \luatex_pdfextension:D
@@ -600,6 +650,7 @@
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
+% \end{macro}
 %
 %    \begin{macrocode}
 %</pdfmode>
diff --git a/l3kernel/testfiles/m3expl001.luatex.tlg b/l3kernel/testfiles/m3expl001.luatex.tlg
index e9556a7..730b63e 100644
--- a/l3kernel/testfiles/m3expl001.luatex.tlg
+++ b/l3kernel/testfiles/m3expl001.luatex.tlg
@@ -5294,6 +5294,7 @@ Defining message LaTeX/kernel/show-coffin on line ...
 Defining \color_group_begin: on line ...
 Defining \color_group_end: on line ...
 Defining \color_ensure_current: on line ...
+Defining \l_color_current_tl on line ...
 Defining \c_sys_jobname_str on line ...
 Defining \c_sys_minute_int on line ...
 Defining \c_sys_hour_int on line ...
@@ -5651,10 +5652,13 @@ Defining key expl/log-functions/true on line ...
 Defining key expl/log-functions/false on line ...
 Defining \c__expl_def_ext_tl on line ...
  (l3pdfmode.def
-Defining \l__driver_color_current_tl on line ...
 Defining \l__driver_color_stack_int on line ...
 \l__driver_color_stack_int=\count192
 Defining \__driver_color_ensure_current: on line ...
+Defining \__driver_color_convert:w on line ...
+Defining \__driver_color_convert_gray:w on line ...
+Defining \__driver_color_convert_cmyk:w on line ...
+Defining \__driver_color_convert_rgb:w on line ...
 Defining \__driver_color_reset: on line ...
 Defining \__driver_literal:n on line ...
 Defining \__driver_scope_begin: on line ...
diff --git a/l3kernel/testfiles/m3expl001.ptex.tlg b/l3kernel/testfiles/m3expl001.ptex.tlg
index 0bdb6ef..427ba49 100644
--- a/l3kernel/testfiles/m3expl001.ptex.tlg
+++ b/l3kernel/testfiles/m3expl001.ptex.tlg
@@ -5284,6 +5284,7 @@ Defining message LaTeX/kernel/show-coffin on line ...
 Defining \color_group_begin: on line ...
 Defining \color_group_end: on line ...
 Defining \color_ensure_current: on line ...
+Defining \l_color_current_tl on line ...
 Defining \c_sys_jobname_str on line ...
 Defining \c_sys_minute_int on line ...
 Defining \c_sys_hour_int on line ...
@@ -5642,7 +5643,6 @@ Defining key expl/log-functions/true on line ...
 Defining key expl/log-functions/false on line ...
 Defining \c__expl_def_ext_tl on line ...
  (l3dvipdfmx.def
-Defining \l__driver_color_current_tl on line ...
 Defining \__driver_color_ensure_current: on line ...
 Defining \__driver_color_reset: on line ...
 Defining \__driver_literal:n on line ...
diff --git a/l3kernel/testfiles/m3expl001.tlg b/l3kernel/testfiles/m3expl001.tlg
index 7501329..6486a60 100644
--- a/l3kernel/testfiles/m3expl001.tlg
+++ b/l3kernel/testfiles/m3expl001.tlg
@@ -5284,6 +5284,7 @@ Defining message LaTeX/kernel/show-coffin on line ...
 Defining \color_group_begin: on line ...
 Defining \color_group_end: on line ...
 Defining \color_ensure_current: on line ...
+Defining \l_color_current_tl on line ...
 Defining \c_sys_jobname_str on line ...
 Defining \c_sys_minute_int on line ...
 Defining \c_sys_hour_int on line ...
@@ -5843,10 +5844,13 @@ Defining key expl/log-functions/true on line ...
 Defining key expl/log-functions/false on line ...
 Defining \c__expl_def_ext_tl on line ...
  (l3pdfmode.def
-Defining \l__driver_color_current_tl on line ...
 Defining \l__driver_color_stack_int on line ...
 \l__driver_color_stack_int=\count194
 Defining \__driver_color_ensure_current: on line ...
+Defining \__driver_color_convert:w on line ...
+Defining \__driver_color_convert_gray:w on line ...
+Defining \__driver_color_convert_cmyk:w on line ...
+Defining \__driver_color_convert_rgb:w on line ...
 Defining \__driver_color_reset: on line ...
 Defining \__driver_literal:n on line ...
 Defining \__driver_scope_begin: on line ...
diff --git a/l3kernel/testfiles/m3expl001.uptex.tlg b/l3kernel/testfiles/m3expl001.uptex.tlg
index ba6d092..8632ddb 100644
--- a/l3kernel/testfiles/m3expl001.uptex.tlg
+++ b/l3kernel/testfiles/m3expl001.uptex.tlg
@@ -5282,6 +5282,7 @@ Defining message LaTeX/kernel/show-coffin on line ...
 Defining \color_group_begin: on line ...
 Defining \color_group_end: on line ...
 Defining \color_ensure_current: on line ...
+Defining \l_color_current_tl on line ...
 Defining \c_sys_jobname_str on line ...
 Defining \c_sys_minute_int on line ...
 Defining \c_sys_hour_int on line ...
@@ -5841,7 +5842,6 @@ Defining key expl/log-functions/true on line ...
 Defining key expl/log-functions/false on line ...
 Defining \c__expl_def_ext_tl on line ...
  (l3dvipdfmx.def
-Defining \l__driver_color_current_tl on line ...
 Defining \__driver_color_ensure_current: on line ...
 Defining \__driver_color_reset: on line ...
 Defining \__driver_literal:n on line ...
diff --git a/l3kernel/testfiles/m3expl001.xetex.tlg b/l3kernel/testfiles/m3expl001.xetex.tlg
index 5d19c72..fe2c035 100644
--- a/l3kernel/testfiles/m3expl001.xetex.tlg
+++ b/l3kernel/testfiles/m3expl001.xetex.tlg
@@ -5272,6 +5272,7 @@ Defining message LaTeX/kernel/show-coffin on line ...
 Defining \color_group_begin: on line ...
 Defining \color_group_end: on line ...
 Defining \color_ensure_current: on line ...
+Defining \l_color_current_tl on line ...
 Defining \c_sys_jobname_str on line ...
 Defining \c_sys_minute_int on line ...
 Defining \c_sys_hour_int on line ...
@@ -5625,7 +5626,6 @@ Defining key expl/log-functions/true on line ...
 Defining key expl/log-functions/false on line ...
 Defining \c__expl_def_ext_tl on line ...
  (l3xdvipdfmx.def
-Defining \l__driver_color_current_tl on line ...
 Defining \__driver_color_ensure_current: on line ...
 Defining \__driver_color_reset: on line ...
 Defining \__driver_literal:n on line ...
diff --git a/l3kernel/testfiles/m3expl003.luatex.tlg b/l3kernel/testfiles/m3expl003.luatex.tlg
index 0176dba..f2c56f7 100644
--- a/l3kernel/testfiles/m3expl003.luatex.tlg
+++ b/l3kernel/testfiles/m3expl003.luatex.tlg
@@ -5295,6 +5295,7 @@ Defining message LaTeX/kernel/show-coffin on line ...
 Defining \color_group_begin: on line ...
 Defining \color_group_end: on line ...
 Defining \color_ensure_current: on line ...
+Defining \l_color_current_tl on line ...
 Defining \c_sys_jobname_str on line ...
 Defining \c_sys_minute_int on line ...
 Defining \c_sys_hour_int on line ...
@@ -5652,10 +5653,13 @@ Defining key expl/log-functions/true on line ...
 Defining key expl/log-functions/false on line ...
 Defining \c__expl_def_ext_tl on line ...
  (l3pdfmode.def
-Defining \l__driver_color_current_tl on line ...
 Defining \l__driver_color_stack_int on line ...
 \l__driver_color_stack_int=\count192
 Defining \__driver_color_ensure_current: on line ...
+Defining \__driver_color_convert:w on line ...
+Defining \__driver_color_convert_gray:w on line ...
+Defining \__driver_color_convert_cmyk:w on line ...
+Defining \__driver_color_convert_rgb:w on line ...
 Defining \__driver_color_reset: on line ...
 Defining \__driver_literal:n on line ...
 Defining \__driver_scope_begin: on line ...
diff --git a/l3kernel/testfiles/m3expl003.ptex.tlg b/l3kernel/testfiles/m3expl003.ptex.tlg
index 240a638..77762c0 100644
--- a/l3kernel/testfiles/m3expl003.ptex.tlg
+++ b/l3kernel/testfiles/m3expl003.ptex.tlg
@@ -5285,6 +5285,7 @@ Defining message LaTeX/kernel/show-coffin on line ...
 Defining \color_group_begin: on line ...
 Defining \color_group_end: on line ...
 Defining \color_ensure_current: on line ...
+Defining \l_color_current_tl on line ...
 Defining \c_sys_jobname_str on line ...
 Defining \c_sys_minute_int on line ...
 Defining \c_sys_hour_int on line ...
@@ -5643,7 +5644,6 @@ Defining key expl/log-functions/true on line ...
 Defining key expl/log-functions/false on line ...
 Defining \c__expl_def_ext_tl on line ...
  (l3dvipdfmx.def
-Defining \l__driver_color_current_tl on line ...
 Defining \__driver_color_ensure_current: on line ...
 Defining \__driver_color_reset: on line ...
 Defining \__driver_literal:n on line ...
diff --git a/l3kernel/testfiles/m3expl003.tlg b/l3kernel/testfiles/m3expl003.tlg
index e861aab..a273b8b 100644
--- a/l3kernel/testfiles/m3expl003.tlg
+++ b/l3kernel/testfiles/m3expl003.tlg
@@ -5285,6 +5285,7 @@ Defining message LaTeX/kernel/show-coffin on line ...
 Defining \color_group_begin: on line ...
 Defining \color_group_end: on line ...
 Defining \color_ensure_current: on line ...
+Defining \l_color_current_tl on line ...
 Defining \c_sys_jobname_str on line ...
 Defining \c_sys_minute_int on line ...
 Defining \c_sys_hour_int on line ...
@@ -5844,10 +5845,13 @@ Defining key expl/log-functions/true on line ...
 Defining key expl/log-functions/false on line ...
 Defining \c__expl_def_ext_tl on line ...
  (l3pdfmode.def
-Defining \l__driver_color_current_tl on line ...
 Defining \l__driver_color_stack_int on line ...
 \l__driver_color_stack_int=\count194
 Defining \__driver_color_ensure_current: on line ...
+Defining \__driver_color_convert:w on line ...
+Defining \__driver_color_convert_gray:w on line ...
+Defining \__driver_color_convert_cmyk:w on line ...
+Defining \__driver_color_convert_rgb:w on line ...
 Defining \__driver_color_reset: on line ...
 Defining \__driver_literal:n on line ...
 Defining \__driver_scope_begin: on line ...
diff --git a/l3kernel/testfiles/m3expl003.uptex.tlg b/l3kernel/testfiles/m3expl003.uptex.tlg
index d8582e3..d49cc73 100644
--- a/l3kernel/testfiles/m3expl003.uptex.tlg
+++ b/l3kernel/testfiles/m3expl003.uptex.tlg
@@ -5283,6 +5283,7 @@ Defining message LaTeX/kernel/show-coffin on line ...
 Defining \color_group_begin: on line ...
 Defining \color_group_end: on line ...
 Defining \color_ensure_current: on line ...
+Defining \l_color_current_tl on line ...
 Defining \c_sys_jobname_str on line ...
 Defining \c_sys_minute_int on line ...
 Defining \c_sys_hour_int on line ...
@@ -5842,7 +5843,6 @@ Defining key expl/log-functions/true on line ...
 Defining key expl/log-functions/false on line ...
 Defining \c__expl_def_ext_tl on line ...
  (l3dvipdfmx.def
-Defining \l__driver_color_current_tl on line ...
 Defining \__driver_color_ensure_current: on line ...
 Defining \__driver_color_reset: on line ...
 Defining \__driver_literal:n on line ...
diff --git a/l3kernel/testfiles/m3expl003.xetex.tlg b/l3kernel/testfiles/m3expl003.xetex.tlg
index aa63090..2b02731 100644
--- a/l3kernel/testfiles/m3expl003.xetex.tlg
+++ b/l3kernel/testfiles/m3expl003.xetex.tlg
@@ -5273,6 +5273,7 @@ Defining message LaTeX/kernel/show-coffin on line ...
 Defining \color_group_begin: on line ...
 Defining \color_group_end: on line ...
 Defining \color_ensure_current: on line ...
+Defining \l_color_current_tl on line ...
 Defining \c_sys_jobname_str on line ...
 Defining \c_sys_minute_int on line ...
 Defining \c_sys_hour_int on line ...
@@ -5626,7 +5627,6 @@ Defining key expl/log-functions/true on line ...
 Defining key expl/log-functions/false on line ...
 Defining \c__expl_def_ext_tl on line ...
  (l3xdvipdfmx.def
-Defining \l__driver_color_current_tl on line ...
 Defining \__driver_color_ensure_current: on line ...
 Defining \__driver_color_reset: on line ...
 Defining \__driver_literal:n on line ...

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the latex3-commits mailing list