%% The LaTeX package tikzfill - version 1.0.1 (2023/08/08)
%% tikzlibraryfill.rhombus.code.tex: filling with rhombus patterns
%%
%% -------------------------------------------------------------------------------------------
%% Copyright (c) 2022-2023 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de>
%% -------------------------------------------------------------------------------------------
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3
%% of this license or (at your option) any later version.
%% The latest version of this license is in
%%   http://www.latex-project.org/lppl.txt
%% and version 1.3 or later is part of all distributions of LaTeX
%% version 2005/12/01 or later.
%%
%% This work has the LPPL maintenance status `author-maintained'.
%%
%% This work consists of all files listed in README.md
%%
\ProvidesFile{tikzlibraryfill.rhombus.code.tex}[2022/07/15 v0.0.1 Rhombus pattern library]

\usetikzlibrary{patterns.meta}

\ifx\ExplSyntaxOn\undefined
 \input expl3-generic\relax
\fi
\ExplSyntaxOn

\fp_new:N \l__tikzfill_rho_angle_fp
\fp_new:N \l__tikzfill_rho_d_fp
\fp_new:N \l__tikzfill_rho_s_fp

\tl_new:N \l__tikzfill_rho_dsize_tl
\tl_new:N \l__tikzfill_rho_linewidth_tl
\tl_new:N \l__tikzfill_rho_matrix_a_tl
\tl_new:N \l__tikzfill_rho_matrix_b_tl
\tl_new:N \l__tikzfill_rho_matrix_c_tl
\tl_new:N \l__tikzfill_rho_matrix_d_tl
\tl_new:N \l__tikzfill_rho_poffset_tl
\tl_new:N \l__tikzfill_rho_psize_tl
\tl_new:N \l__tikzfill_rho_size_tl


\pgfdeclarepattern
 {
   name = rhombus,
   parameters =
     {
       \pgfkeysvalueof{/pgf/pattern~keys/size},
       \pgfkeysvalueof{/pgf/pattern~keys/angle},
       \pgfkeysvalueof{/pgf/pattern~keys/ratio},
       \pgfkeysvalueof{/pgf/pattern~keys/xshift},
       \pgfkeysvalueof{/pgf/pattern~keys/yshift},
       \pgfkeysvalueof{/pgf/pattern~keys/line~width},
       \pgfkeysvalueof{/pgf/pattern~keys/pos},
       \pgfkeysvalueof{/pgf/pattern~keys/band},
       \pgfkeysvalueof{/pgf/pattern~keys/_fill_},
     },
   defaults =
     {
       size       /.initial = 10mm,
       angle      /.initial = -40,
       ratio      /.initial = 2,
       xshift     /.initial = 0pt,
       yshift     /.initial = 0pt,
       line~width /.initial = 0.4pt,
       pos        /.initial = 1,
       band       /.initial = 0,
       _fill_     /.initial = 1,
       fill       /.style = { _fill_=1 },
       draw       /.style = { _fill_=0 },
     },
   set~up~code =
     {
       \tl_set:Nx \l__tikzfill_rho_linewidth_tl  { \fp_to_dim:n { \pgfkeysvalueof{/pgf/pattern~keys/line~width} } }

       \fp_set:Nn \l_tmpa_fp { \pgfkeysvalueof{/pgf/pattern~keys/size} }
       \tl_set:Nx \l__tikzfill_rho_size_tl  { \fp_to_dim:N \l_tmpa_fp }
       \tl_set:Nx \l__tikzfill_rho_dsize_tl { \fp_to_dim:n { 2 * \l_tmpa_fp } }

       \fp_set:Nn \l_tmpb_fp { min ( 1, max( 0, \pgfkeysvalueof{/pgf/pattern~keys/pos} )) }
       \tl_set:Nx \l__tikzfill_rho_psize_tl    { \fp_to_dim:n { \l_tmpa_fp * \l_tmpb_fp } }
       \tl_set:Nx \l__tikzfill_rho_poffset_tl  { \fp_to_dim:n { \l_tmpa_fp * (1-\l_tmpb_fp)/2 } }

       \fp_set:Nn \l__tikzfill_rho_angle_fp { \pgfkeysvalueof{/pgf/pattern~keys/angle} }

       \fp_set:Nn \l_tmpa_fp { max( 1 , \pgfkeysvalueof{/pgf/pattern~keys/ratio} ) }
       \fp_set:Nn \l_tmpa_fp { \l_tmpa_fp*\l_tmpa_fp }
       \fp_set:Nn \l__tikzfill_rho_s_fp{ (\l_tmpa_fp-1)/(\l_tmpa_fp+1) }

       \fp_set:Nn \l__tikzfill_rho_d_fp { sqrt( 1 -  \l__tikzfill_rho_s_fp * \l__tikzfill_rho_s_fp ) }
       \fp_set:Nn \l_tmpb_fp
         {
           \l__tikzfill_rho_angle_fp - atand( \l__tikzfill_rho_d_fp / (  1 + \l__tikzfill_rho_s_fp  ) )
         }
       \fp_set:Nn \l_tmpa_fp { cosd(\l_tmpb_fp) }
       \fp_set:Nn \l_tmpb_fp { sind(\l_tmpb_fp) }

       \tl_set:Nx \l__tikzfill_rho_matrix_a_tl { \fp_to_decimal:N \l_tmpa_fp }
       \tl_set:Nx \l__tikzfill_rho_matrix_b_tl { \fp_to_decimal:N \l_tmpb_fp }
       \tl_set:Nx \l__tikzfill_rho_matrix_c_tl { \fp_to_decimal:n
         {
           \l__tikzfill_rho_s_fp * \l_tmpa_fp - \l__tikzfill_rho_d_fp * \l_tmpb_fp
         }}
       \tl_set:Nx \l__tikzfill_rho_matrix_d_tl { \fp_to_decimal:n
         {
           \l__tikzfill_rho_s_fp * \l_tmpb_fp + \l__tikzfill_rho_d_fp * \l_tmpa_fp
         }}
     },
   bottom~left = { \pgfpoint{-\l__tikzfill_rho_linewidth_tl}{-\l__tikzfill_rho_linewidth_tl} },
   top~right   = { \pgfpoint{\l__tikzfill_rho_dsize_tl+\l__tikzfill_rho_linewidth_tl}
                            {\l__tikzfill_rho_dsize_tl+\l__tikzfill_rho_linewidth_tl} },
   tile~size   = { \pgfqpoint{\l__tikzfill_rho_dsize_tl}{\l__tikzfill_rho_dsize_tl} },
   tile~transformation =
     {
       \pgftransformshift
         {
           \pgfpoint{ \pgfkeysvalueof{/pgf/pattern~keys/xshift} }
                    { \pgfkeysvalueof{/pgf/pattern~keys/yshift} }
         }
       \pgftransformcm{\l__tikzfill_rho_matrix_a_tl}{\l__tikzfill_rho_matrix_b_tl}
                      {\l__tikzfill_rho_matrix_c_tl}{\l__tikzfill_rho_matrix_d_tl}
                      {\pgfpointorigin}
     },
   code  =
     {
       \int_set:Nn \l_tmpa_int { \pgfkeysvalueof{/pgf/pattern~keys/band} }
       \int_compare:nNnF \l_tmpa_int = 1
       {
         \pgfpathrectangle{\pgfqpoint{\l__tikzfill_rho_poffset_tl}{\l__tikzfill_rho_poffset_tl}}
                          {\pgfqpoint{\l__tikzfill_rho_psize_tl}{\l__tikzfill_rho_psize_tl}}
         \pgfpathrectangle{\pgfpoint{\l__tikzfill_rho_size_tl+\l__tikzfill_rho_poffset_tl}{\l__tikzfill_rho_size_tl+\l__tikzfill_rho_poffset_tl}}
                          {\pgfqpoint{\l__tikzfill_rho_psize_tl}{\l__tikzfill_rho_psize_tl}}
       }
       \int_compare:nNnT \l_tmpa_int > 0
       {
         \pgfpathrectangle{\pgfpoint{\l__tikzfill_rho_poffset_tl}{\l__tikzfill_rho_size_tl+\l__tikzfill_rho_poffset_tl}}
                          {\pgfqpoint{\l__tikzfill_rho_psize_tl}{\l__tikzfill_rho_psize_tl}}
         \pgfpathrectangle{\pgfpoint{\l__tikzfill_rho_size_tl+\l__tikzfill_rho_poffset_tl}{\l__tikzfill_rho_poffset_tl}}
                          {\pgfqpoint{\l__tikzfill_rho_psize_tl}{\l__tikzfill_rho_psize_tl}}
       }
       \int_compare:nNnTF { \pgfkeysvalueof{/pgf/pattern~keys/_fill_} } = 1
         {
           \pgfusepath{fill}
         }
         {
           \pgfsetlinewidth{\l__tikzfill_rho_linewidth_tl}
           \pgfusepath{draw}
         }
     }
 }


\tikzset{
 pattern~rhombus /.style =
   {
     pattern={rhombus[#1]}
   }
}


\ExplSyntaxOff