% \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}
%</driver>
% \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-06-18}
%
% \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
  { \exp_args:Nx \@@_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:nnn}
%   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
    \exp_after:wN \@@_color:nnn \l_@@_color_tmp_tl {#1}
  }
\cs_new_protected:Npn \@@_color:nnn #1#2#3
  { \use:c { @@_backend_color_ #3 _ #1 :n } {#2} }
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
%    \begin{macrocode}
%</initex|package>
%    \end{macrocode}
%
% \end{implementation}
%
% \PrintIndex
