%% The LaTeX package tikzfill - version 1.0.1 (2023/08/08) %% tikzlibraryfill.image.code.tex: filling with images %% %% ------------------------------------------------------------------------------------------- %% Copyright (c) 2022-2023 by Prof. Dr. Dr. Thomas F. Sturm %% ------------------------------------------------------------------------------------------- %% %% 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}[2023/08/08 v1.0.1 Image filling library] \ifx\ExplSyntaxOn\undefined \input expl3-generic\relax \fi \ExplSyntaxOn \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_set_eq:NN \l_tmpa_tl \l__tikzfill_img_graphics_options_tl \tl_if_empty:NTF \l_tmpa_tl { \tl_set:Nn \l_tmpa_tl { \includegraphics } } { \tl_put_left:Nn \l_tmpa_tl { \includegraphics[ } \tl_put_right:Nn \l_tmpa_tl { ] } } \l_tmpa_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_tmpa_dim { \box_wd:N \l__tikzfill_img_box } \dim_compare:nNnTF \l_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_tmpa_dim } } \dim_set:Nn \l_tmpb_dim { \box_ht:N \l__tikzfill_img_box + \box_dp:N \l__tikzfill_img_box } \dim_compare:nNnTF \l_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_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 > 1 { \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_tmpa_dim { \box_wd:N \l__tikzfill_img_box } \dim_set:Nn \l_tmpb_dim { \box_ht:N \l__tikzfill_img_box + \box_dp:N \l__tikzfill_img_box } \dim_set:Nn \l_tmpb_dim { -\l_tmpb_dim } \dim_step_variable:nnnNn { \l__tikzfill_img_xa_tl } { \l_tmpa_dim } { \l__tikzfill_img_xb_tl } \l__tikzfill_img_xc_tl { \dim_step_variable:nnnNn { \l__tikzfill_img_yb_tl } { \l_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}},% }