% \iffalse meta-comment % %% File: l3draw-state.dtx % % Copyright (C) 2018-2020 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 "l3experimental 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} % % \fi % % \title{^^A % The \pkg{l3draw-state} package\\ Drawing graphics state^^A % } % % \author{^^A % The \LaTeX3 Project\thanks % {^^A % E-mail: % \href{mailto:latex-team@latex-project.org} % {latex-team@latex-project.org}^^A % }^^A % } % % \date{Released 2020-01-12} % % \maketitle % % \begin{implementation} % % \section{\pkg{l3draw-state} implementation} % % \begin{macrocode} %<*initex|package> % \end{macrocode} % % \begin{macrocode} %<@@=draw> % \end{macrocode} % % This sub-module covers more-or-less the same ideas as % \texttt{pgfcoregraphicstate.code.tex}. At present, equivalents of the % following are currently absent: % \begin{itemize} % \item \cs{pgfsetinnerlinewidth}, \cs{pgfinnerlinewidth}, % \cs{pgfsetinnerstrokecolor}, \cs{pgfsetinnerstrokecolor}: Likely to % be added on further work is done on paths/stroking. % \end{itemize} % % \begin{variable}{\g_@@_linewidth_dim} % Linewidth for strokes: global as the scope for this relies on the graphics % state. The inner line width is used for places where two lines are used. % \begin{macrocode} \dim_new:N \g_@@_linewidth_dim % \end{macrocode} % \end{variable} % % \begin{variable}{\l_draw_default_linewidth_dim} % A default: this is used at the start of every drawing. % \begin{macrocode} \dim_new:N \l_draw_default_linewidth_dim \dim_set:Nn \l_draw_default_linewidth_dim { 0.4pt } % \end{macrocode} % \end{variable} % % \begin{macro}{\draw_linewidth:n} % Set the linewidth: we need a wrapper as this has to pass to the driver % layer. % \begin{macrocode} \cs_new_protected:Npn \draw_linewidth:n #1 { \dim_gset:Nn \g_@@_linewidth_dim { \fp_to_dim:n {#1} } \@@_backend_linewidth:n \g_@@_linewidth_dim } % \end{macrocode} % \end{macro} % % \begin{macro}{\draw_dash_pattern:nn} % \begin{variable}{\l_@@_tmp_seq} % Evaluated all of the list and pass it to the driver layer. % \begin{macrocode} \cs_new_protected:Npn \draw_dash_pattern:nn #1#2 { \group_begin: \seq_set_from_clist:Nn \l_@@_tmp_seq {#1} \seq_set_map:NNn \l_@@_tmp_seq \l_@@_tmp_seq { \fp_to_dim:n {##1} } \use:x { \@@_backend_dash_pattern:nn { \seq_use:Nn \l_@@_tmp_seq { , } } { \fp_to_dim:n {#2} } } \group_end: } \seq_new:N \l_@@_tmp_seq % \end{macrocode} % \end{variable} % \end{macro} % % \begin{macro}{\draw_miterlimit:n} % Pass through to the driver layer. % \begin{macrocode} \cs_new_protected:Npn \draw_miterlimit:n #1 { \@@_backend_miterlimit:n { \fp_eval:n {#1} } } % \end{macrocode} % \end{macro} % % \begin{macro} % { % \draw_cap_butt:, \draw_cap_rectangle:, \draw_cap_round:, % \draw_evenodd_rule:, \draw_nonzero_rule:, % \draw_join_bevel:, \draw_join_miter:, \draw_join_round: % } % All straight wrappers. % \begin{macrocode} \cs_new_protected:Npn \draw_cap_butt: { \@@_backend_cap_butt: } \cs_new_protected:Npn \draw_cap_rectangle: { \@@_backend_cap_rectangle: } \cs_new_protected:Npn \draw_cap_round: { \@@_backend_cap_round: } \cs_new_protected:Npn \draw_evenodd_rule: { \@@_backend_evenodd_rule: } \cs_new_protected:Npn \draw_nonzero_rule: { \@@_backend_nonzero_rule: } \cs_new_protected:Npn \draw_join_bevel: { \@@_backend_join_bevel: } \cs_new_protected:Npn \draw_join_miter: { \@@_backend_join_miter: } \cs_new_protected:Npn \draw_join_round: { \@@_backend_join_round: } % \end{macrocode} % \end{macro} % % \begin{variable}{\l_@@_color_tmp_tl} % Scratch space. % \begin{macrocode} \tl_new:N \l_@@_color_tmp_tl % \end{macrocode} % \end{variable} % % \begin{macro}{\draw_color:n, \draw_color_fill:n, \draw_color_stroke:n} % \begin{macro}{\@@_color:nn} % \begin{macro}{\@@_color_aux:nn, \@@_color_aux:Vn} % \begin{macro}{\@@_color:nw} % \begin{macro} % { % \@@_select_cmyk:nw, \@@_select_gray:nw, % \@@_select_rgb:nw, \@@_split_select:nw % } % Much the same as for core color support but calling the relevant % driver-level function. % \begin{macrocode} \cs_new_eq:NN \draw_color:n \color_select:n \cs_new_protected:Npn \draw_color_fill:n #1 { \@@_color:nn { fill } {#1} } \cs_new_protected:Npn \draw_color_stroke:n #1 { \@@_color:nn { stroke } {#1} } \cs_new_protected:Npn \@@_color:nn #1#2 { \color_parse:nN {#2} \l_@@_color_tmp_tl \@@_color_aux:Vn \l_@@_color_tmp_tl {#1} } \cs_new_protected:Npn \@@_color_aux:nn #1#2 { \@@_color:nw {#2} #1 \q_stop } \cs_generate_variant:Nn \@@_color_aux:nn { V } \cs_new_protected:Npn \@@_color:nw #1#2 ~ #3 \q_stop { \use:c { @@_color_ #2 :nw } {#1} #3 \q_stop } \cs_new_protected:Npn \@@_color_cmyk:nw #1#2 ~ #3 ~ #4 ~ #5 \q_stop { \use:c { @@_backend_color_ #1 _cmyk:nnnn } {#2} {#3} {#4} {#5} } \cs_new_protected:Npn \@@_color_gray:nw #1#2 \q_stop { \use:c { @@_backend_color_ #1 _gray:n } {#2} } \cs_new_protected:Npn \@@_color_rgb:nw #1#2 ~ #3 ~ #4 \q_stop { \use:c { @@_backend_color_ #1 _rgb:nnn } {#2} {#3} {#4} } \cs_new_protected:Npn \@@_color_spot:nw #1#2 ~ #3 \q_stop { \use:c { @@_backend_color_ #1 _spot:nn } {#2} {#3} } % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \begin{macrocode} % % \end{macrocode} % % \end{implementation} % % \PrintIndex