%% The LaTeX package tikzfill - version 1.1.0 (2026/03/26)
%% tikzlibraryfill.image.code.tex: filling with images
%%
%% -------------------------------------------------------------------------------------------
%% 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.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.image.code.tex}[2026/03/26 v1.1.0 Image filling library]

\ExplSyntaxOn

\dim_zero_new:N \l__tikzfill_tmpa_dim
\dim_zero_new:N \l__tikzfill_tmpb_dim

\box_new:N \l__tikzfill_img_box

\tl_new:N \l__tikzfill_img_xa_tl
\tl_new:N \l__tikzfill_img_xb_tl
\tl_new:N \l__tikzfill_img_ya_tl
\tl_new:N \l__tikzfill_img_yb_tl
\tl_new:N \l__tikzfill_img_xc_tl
\tl_new:N \l__tikzfill_img_yc_tl
\tl_new:N \l__tikzfill_img_width_tl
\tl_new:N \l__tikzfill_img_height_tl

\tl_new:N \l__tikzfill_img_opacity_tl
\tl_new:N \l__tikzfill_img_scale_tl
\tl_new:N \l__tikzfill_img_graphics_options_tl

\fp_new:N \l__tikzfill_img_scale_x_fp
\fp_new:N \l__tikzfill_img_scale_y_fp


\cs_new_nopar:Npn \__tikzfill_img_process_ppbb:
  {
    \pgf@process{\pgfpointanchor{ path~picture~bounding~box } { south~west }}
    \tl_set:Nx \l__tikzfill_img_xa_tl { \dim_eval:n { \pgf@x } }
    \tl_set:Nx \l__tikzfill_img_ya_tl { \dim_eval:n { \pgf@y } }
    \pgf@process{\pgfpointanchor{ path~picture~bounding~box } { north~east }}
    \tl_set:Nx \l__tikzfill_img_xb_tl { \dim_eval:n { \pgf@x } }
    \tl_set:Nx \l__tikzfill_img_yb_tl { \dim_eval:n { \pgf@y } }
    \tl_set:Nx \l__tikzfill_img_width_tl  { \dim_eval:n { \pgf@x - \l__tikzfill_img_xa_tl } }
    \tl_set:Nx \l__tikzfill_img_height_tl { \dim_eval:n { \pgf@y - \l__tikzfill_img_ya_tl } }
    \pgfsetfillopacity{ \l__tikzfill_img_opacity_tl }
    \pgfsetstrokeopacity{ \l__tikzfill_img_opacity_tl }
  }


\cs_new_nopar:Npn \__tikzfill_img_path_picture:n #1
  {
    \pgfkeysalso
      {
        path~picture =
          {
            \__tikzfill_img_process_ppbb:
            #1
          }
      }
  }


\cs_new_nopar:Npn \__tikzfill_img_draw_textbox:n #1
  {
    \pgftext
      [
        x = \dim_eval:n { \l__tikzfill_img_xa_tl + \l__tikzfill_img_width_tl / 2 },
        y = \dim_eval:n { \l__tikzfill_img_ya_tl + \l__tikzfill_img_height_tl / 2 }
      ] { #1 }
  }


\cs_new_nopar:Npn \__tikzfill_img_include_graphics:n #1
  {
    \tl_if_empty:NTF \l__tikzfill_img_graphics_options_tl
      {
        \includegraphics { #1 }
      }
      {
        \exp_args:NNV \includegraphics [ \l__tikzfill_img_graphics_options_tl ] { #1 }
      }
  }


\cs_new_nopar:Npn \__tikzfill_img_set_box_to_image:n #1
  {
    \hbox_set:Nn \l__tikzfill_img_box
      {
        \pgfinterruptpicture
        \group_begin:
        \__tikzfill_img_include_graphics:n { #1 }
        \group_end:
        \endpgfinterruptpicture
      }
  }



\cs_new_nopar:Npn \__tikzfill_img_set_box_to_picture:n #1
  {
    \hbox_set:Nn \l__tikzfill_img_box
      {
        \pgfinterruptpicture
        \group_begin:
        \pgfsetbaseline { 0pt }
        \tikzpicture#1\endtikzpicture
        \group_end:
        \endpgfinterruptpicture
      }
  }


\cs_new_nopar:Npn \__tikzfill_img_draw_box:
  {
    \__tikzfill_img_draw_textbox:n
      {
        \box_use_drop:N \l__tikzfill_img_box
      }
  }


\cs_new_nopar:Npn \__tikzfill_img_stretch_draw_box:
  {
    \box_resize_to_wd_and_ht_plus_dp:Nnn \l__tikzfill_img_box
      { \fp_to_dim:n { \l__tikzfill_img_scale_tl * \l__tikzfill_img_width_tl  }}
      { \fp_to_dim:n { \l__tikzfill_img_scale_tl * \l__tikzfill_img_height_tl }}
    \__tikzfill_img_draw_box:
  }


\cs_new_nopar:Npn \__tikzfill_img_compute_scales:
  {
    \dim_set:Nn \l__tikzfill_tmpa_dim { \box_wd:N \l__tikzfill_img_box }
    \dim_compare:nNnTF { \l__tikzfill_tmpa_dim } < { 1pt }
      {
        \fp_set_eq:NN \l__tikzfill_img_scale_x_fp \c_one_fp
      }
      {
        \fp_set:Nn \l__tikzfill_img_scale_x_fp
          {
            \l__tikzfill_img_scale_tl * \l__tikzfill_img_width_tl / \l__tikzfill_tmpa_dim
          }
      }
    \dim_set:Nn \l__tikzfill_tmpb_dim { \box_ht:N \l__tikzfill_img_box + \box_dp:N \l__tikzfill_img_box }
    \dim_compare:nNnTF { \l__tikzfill_tmpb_dim } < { 1pt }
      {
        \fp_set_eq:NN \l__tikzfill_img_scale_y_fp \c_one_fp
      }
      {
        \fp_set:Nn \l__tikzfill_img_scale_y_fp
          {
            \l__tikzfill_img_scale_tl * \l__tikzfill_img_height_tl / \l__tikzfill_tmpb_dim
          }
      }
  }


\cs_new_nopar:Npn \__tikzfill_img_scale_draw_box:
  {
    \box_scale:Nnn \l__tikzfill_img_box
      { \fp_to_dim:N \l__tikzfill_img_scale_x_fp }
      { \fp_to_dim:N \l__tikzfill_img_scale_y_fp }
    \__tikzfill_img_draw_box:
  }


\cs_new_nopar:Npn \__tikzfill_img_overzoom_draw_box:
  {
    \__tikzfill_img_compute_scales:
    \fp_compare:nNnTF { \l__tikzfill_img_scale_x_fp } > { \l__tikzfill_img_scale_y_fp }
      { \fp_set_eq:NN \l__tikzfill_img_scale_y_fp \l__tikzfill_img_scale_x_fp }
      { \fp_set_eq:NN \l__tikzfill_img_scale_x_fp \l__tikzfill_img_scale_y_fp }
    \__tikzfill_img_scale_draw_box:
  }


\cs_new_nopar:Npn \__tikzfill_img_zoom_draw_box:
  {
    \__tikzfill_img_compute_scales:
    \fp_compare:nNnTF { \l__tikzfill_img_scale_x_fp } > { \l__tikzfill_img_scale_y_fp }
      { \fp_set_eq:NN \l__tikzfill_img_scale_x_fp \l__tikzfill_img_scale_y_fp }
      { \fp_set_eq:NN \l__tikzfill_img_scale_y_fp \l__tikzfill_img_scale_x_fp }
    \__tikzfill_img_scale_draw_box:
  }


\cs_new_nopar:Npn \__tikzfill_img_shrink_draw_box:
  {
    \__tikzfill_img_compute_scales:
    \fp_compare:nNnTF { \l__tikzfill_img_scale_x_fp } > { \l__tikzfill_img_scale_y_fp }
      { \fp_set_eq:NN \l__tikzfill_img_scale_x_fp \l__tikzfill_img_scale_y_fp }
      { \fp_set_eq:NN \l__tikzfill_img_scale_y_fp \l__tikzfill_img_scale_x_fp }
    \fp_compare:nNnT { \l__tikzfill_img_scale_x_fp } > { \c_one_fp }
      {
        \fp_set_eq:NN \l__tikzfill_img_scale_x_fp \c_one_fp
        \fp_set_eq:NN \l__tikzfill_img_scale_y_fp \c_one_fp
      }
    \__tikzfill_img_scale_draw_box:
  }


\cs_new_nopar:Npn \__tikzfill_img_tile_draw_box:
  {
    \dim_set:Nn \l__tikzfill_tmpa_dim { \box_wd:N \l__tikzfill_img_box }
    \dim_set:Nn \l__tikzfill_tmpb_dim { \box_ht:N \l__tikzfill_img_box + \box_dp:N \l__tikzfill_img_box }
    \dim_set:Nn \l__tikzfill_tmpb_dim { - \l__tikzfill_tmpb_dim }

    \dim_step_variable:nnnNn
      { \l__tikzfill_img_xa_tl }
      { \l__tikzfill_tmpa_dim }
      { \l__tikzfill_img_xb_tl }
        \l__tikzfill_img_xc_tl
      {
        \dim_step_variable:nnnNn
          { \l__tikzfill_img_yb_tl }
          { \l__tikzfill_tmpb_dim }
          { \l__tikzfill_img_ya_tl }
            \l__tikzfill_img_yc_tl
          {
            \pgftext
              [
                x = \l__tikzfill_img_xc_tl,
                y = \l__tikzfill_img_yc_tl,
                left,
                top
              ]
              { \box_use:N \l__tikzfill_img_box }
          }
      }
  }


\tikzset
  {
    fill~image~opacity / .store~in = \l__tikzfill_img_opacity_tl,
    fill~image~opacity = 1,
    fill~image~scale   / .store~in   = \l__tikzfill_img_scale_tl,
    fill~image~scale   = 1,
    fill~image~options / .store~in = \l__tikzfill_img_graphics_options_tl,
    fill~image~options = ,
    fill~plain~image   /.code =
      {
        \__tikzfill_img_path_picture:n
          {
            \__tikzfill_img_draw_textbox:n
              {
                \__tikzfill_img_include_graphics:n { #1 }
              }
          }
      },
    fill~plain~picture/.code=
      {
        \__tikzfill_img_set_box_to_picture:n { #1 }
        \__tikzfill_img_path_picture:n
        {
          \__tikzfill_img_draw_box:
        }
      },
    fill~stretch~image/.code=
      {
        \__tikzfill_img_set_box_to_image:n { #1 }
        \__tikzfill_img_path_picture:n
        {
          \__tikzfill_img_stretch_draw_box:
        }
      },
    fill~stretch~picture/.code=
      {
        \__tikzfill_img_set_box_to_picture:n { #1 }
        \__tikzfill_img_path_picture:n
        {
          \__tikzfill_img_stretch_draw_box:
        }
      },
    fill~overzoom~image/.code=
      {
        \__tikzfill_img_set_box_to_image:n { #1 }
        \__tikzfill_img_path_picture:n
        {
          \__tikzfill_img_overzoom_draw_box:
        }
      },
    fill~overzoom~picture/.code=
      {
        \__tikzfill_img_set_box_to_picture:n { #1 }
        \__tikzfill_img_path_picture:n
        {
          \__tikzfill_img_overzoom_draw_box:
        }
      },
    fill~zoom~image/.code=
      {
        \__tikzfill_img_set_box_to_image:n { #1 }
        \__tikzfill_img_path_picture:n
        {
          \__tikzfill_img_zoom_draw_box:
        }
      },
    fill~zoom~picture/.code=
      {
        \__tikzfill_img_set_box_to_picture:n { #1 }
        \__tikzfill_img_path_picture:n
        {
          \__tikzfill_img_zoom_draw_box:
        }
      },
    fill~shrink~image/.code=
      {
        \__tikzfill_img_set_box_to_image:n { #1 }
        \__tikzfill_img_path_picture:n
        {
          \__tikzfill_img_shrink_draw_box:
        }
      },
    fill~shrink~picture/.code=
      {
        \__tikzfill_img_set_box_to_picture:n { #1 }
        \__tikzfill_img_path_picture:n
        {
          \__tikzfill_img_shrink_draw_box:
        }
      },
    fill~tile~image/.code=
      {
        \__tikzfill_img_set_box_to_image:n { #1 }
        \__tikzfill_img_path_picture:n
        {
          \__tikzfill_img_tile_draw_box:
        }
      },
    fill~tile~picture/.code=
      {
        \__tikzfill_img_set_box_to_picture:n { #1 }
        \__tikzfill_img_path_picture:n
        {
          \__tikzfill_img_tile_draw_box:
        }
      },
    fill~tile~picture*/.code~n~args = { 2 }
      {
        \__tikzfill_img_set_box_to_picture:n { #2 }
        \box_scale:Nnn \l__tikzfill_img_box { #1 } { #1 }
        \__tikzfill_img_path_picture:n
        {
          \__tikzfill_img_tile_draw_box:
        }
      },
  }


\ExplSyntaxOff

\tikzset
  {
    fill plain image*/.style n args={2}{fill image options={#1},fill plain image={#2}},%
    fill stretch image*/.style n args={2}{fill image options={#1},fill stretch image={#2}},%
    fill overzoom image*/.style n args={2}{fill image options={#1},fill overzoom image={#2}},%
    fill zoom image*/.style n args={2}{fill image options={#1},fill zoom image={#2}},%
    fill shrink image*/.style n args={2}{fill image options={#1},fill shrink image={#2}},%
    fill tile image*/.style n args={2}{fill image options={#1},fill tile image={#2}},%
  }

