%% The LaTeX package tikzfill - version 1.2.0 (2026/04/23)
%% tikzlibraryfill.rhombus.code.tex: filling with rhombus patterns
%%
%% -------------------------------------------------------------------------------------------
%% Copyright (c) 2022-2026 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.3c or later is part of all distributions of LaTeX
%% version 2008 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}[2026/04/23 v1.2.0 Rhombus pattern library]

\usetikzlibrary{patterns.meta}

\ExplSyntaxOn

\fp_zero_new:N \l__tikzfill_tmpa_fp
\fp_zero_new:N \l__tikzfill_tmpb_fp
\int_zero_new:N \l__tikzfill_tmpa_int

\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__tikzfill_tmpa_fp { \pgfkeysvalueof{ /pgf/pattern~keys/size } }
        \tl_set:Nx \l__tikzfill_rho_size_tl  { \fp_to_dim:N \l__tikzfill_tmpa_fp }
        \tl_set:Nx \l__tikzfill_rho_dsize_tl { \fp_to_dim:n { 2 * \l__tikzfill_tmpa_fp } }

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

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

        \fp_set:Nn \l__tikzfill_tmpa_fp { max( 1 , \pgfkeysvalueof{ /pgf/pattern~keys/ratio } ) }
        \fp_set:Nn \l__tikzfill_tmpa_fp { \l__tikzfill_tmpa_fp * \l__tikzfill_tmpa_fp }
        \fp_set:Nn \l__tikzfill_rho_s_fp { ( \l__tikzfill_tmpa_fp - 1) / ( \l__tikzfill_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__tikzfill_tmpb_fp
          {
            \l__tikzfill_rho_angle_fp - atand( \l__tikzfill_rho_d_fp / (  1 + \l__tikzfill_rho_s_fp  ) )
          }
        \fp_set:Nn \l__tikzfill_tmpa_fp { cosd( \l__tikzfill_tmpb_fp ) }
        \fp_set:Nn \l__tikzfill_tmpb_fp { sind( \l__tikzfill_tmpb_fp ) }

        \tl_set:Nx \l__tikzfill_rho_matrix_a_tl { \fp_to_decimal:N \l__tikzfill_tmpa_fp }
        \tl_set:Nx \l__tikzfill_rho_matrix_b_tl { \fp_to_decimal:N \l__tikzfill_tmpb_fp }
        \tl_set:Nx \l__tikzfill_rho_matrix_c_tl { \fp_to_decimal:n
          {
            \l__tikzfill_rho_s_fp * \l__tikzfill_tmpa_fp - \l__tikzfill_rho_d_fp * \l__tikzfill_tmpb_fp
          }}
        \tl_set:Nx \l__tikzfill_rho_matrix_d_tl { \fp_to_decimal:n
          {
            \l__tikzfill_rho_s_fp * \l__tikzfill_tmpb_fp + \l__tikzfill_rho_d_fp * \l__tikzfill_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__tikzfill_tmpa_int { \pgfkeysvalueof{ /pgf/pattern~keys/band } }
        \int_compare:nNnF { \l__tikzfill_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__tikzfill_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
