%%
%% This is file `l3backend-testphase-luatex.def',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% l3backend-testphase.dtx  (with options: `drivers,luatex')
%% 
%% Copyright (C) 2019-2021 The LaTeX 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:
%% 
%%    https://www.latex-project.org/lppl.txt
%% 
%% This file is part of the "LaTeX PDF management testphase bundle" (The Work in LPPL)
%% and all files in that bundle must be distributed together.
%% 
%% File: l3backend-testphase.dtx
\ProvidesExplFile
  {l3backend-testphase-luatex.def}{2021-02-22}{}
  {LaTeX~PDF~management~testphase~bundle~backend~support: PDF output (LuaTeX)}
\RequirePackage{l3ref-tmp}
\cs_generate_variant:Nn \ref_label:nn {en}
\cs_generate_variant:Nn \ref_value:nn {en}
\cs_new_protected:Npn \__pdf_backend_ref_label:nn #1 #2
  {
     \@bsphack
     \ref_label:nn{#1}{abspage}
     \@esphack
  }
\cs_new:Npn \__pdf_backend_ref_value:nn #1 #2
  {
     \ref_value:nn{#1}{#2}
  }
\cs_generate_variant:Nn \__pdf_backend_ref_label:nn {en}
\cs_generate_variant:Nn \__pdf_backend_ref_value:nn {en}
\prop_new:N \g__pdf_tmpa_prop
\tl_new:N   \l__pdf_tmpa_tl
\box_new:N  \l__pdf_backend_tmpa_box
\int_new:N \g__pdf_backend_resourceid_int
\int_new:N \g__pdf_backend_name_int
\int_new:N \g__pdf_backend_page_int
    \directlua { require("l3backend-testphase.lua") }
\tl_gput_right:Nn \@kernel@after@enddocument@afterlastpage
  {
    \g__kernel_pdfmanagement_end_run_code_tl
  }
\tl_if_exist:NTF \@kernel@after@shipout@background
  {
    \g@addto@macro \@kernel@before@shipout@background{\relax}
    \g@addto@macro \@kernel@after@shipout@background
      {
        \g__kernel_pdfmanagement_thispage_shipout_code_tl
      }
    \tl_gput_left:Nn\@kernel@after@shipout@lastpage
      {
        \g__kernel_pdfmanagement_lastpage_shipout_code_tl
      }
  }
  {
    \hook_gput_code:nnn{shipout/background}{pdf}
      {
        \g__kernel_pdfmanagement_thispage_shipout_code_tl
      }
    \hook_gput_code:nnn {shipout/lastpage} {pdf}
      {
        \g__kernel_pdfmanagement_lastpage_shipout_code_tl
      }
  }

\sys_if_engine_luatex:T
  {
    \cs_new_protected:Npn \__pdf_backend_Pages_primitive:n #1
      {
        \tex_directlua:D
          {
            pdf.setpagesattributes( \__pdf_backend_luastring:n { #1 } )
          }
      }
  }
\cs_new:Npn \__pdf_backend_luastring:n #1
  {
    "\tex_luaescapestring:D { \tex_unexpanded:D { #1 } }"
  }
 %not used, only there for consistency
\cs_new_protected:Npn \__pdf_backend_Page_primitive:n #1
  {
    \tex_latelua:D
      {
        pdf.setpageattributes(\__pdf_backend_luastring:n { #1 })
      }
  }
  % the command to store default values.
  % Uses a prop with pdflatex + dvi,
  % sets a lua table with lualatex
\cs_new_protected:Npn \__pdf_backend_Page_gput:nn #1 #2
  {
    \tex_directlua:D
      {
        ltx.__pdf.backend_Page_gput
          (
            \__pdf_backend_luastring:n { #1 },
            \__pdf_backend_luastring:n { #2 }
          )
      }
  }
  % the command to remove a default value.
  % Uses a prop with pdflatex + dvi,
  % changes a lua table with lualatex
\cs_new_protected:Npn \__pdf_backend_Page_gremove:n #1
  {
    \tex_directlua:D
      {
        ltx.__pdf.backend_Page_gremove (\__pdf_backend_luastring:n { #1 })
      }
  }
 % the command used in the document.
 % direct call of the primitive special with dvips/dvipdfmx
 % \latelua: fill a page related table with lualatex, merge it with the page
 % table and push it directly
 % write to aux and store in prop with pdflatex
\cs_new_protected:Npn \__pdf_backend_ThisPage_gput:nn #1 #2
  {
    \tex_latelua:D
      {
        ltx.__pdf.backend_ThisPage_gput
          (
            tex.count["g_shipout_readonly_int"],
            \__pdf_backend_luastring:n { #1 },
            \__pdf_backend_luastring:n { #2 }
          )
        ltx.__pdf.backend_ThisPage_gpush (tex.count["g_shipout_readonly_int"])
      }
  }
  %the code to push the values, used in shipout
  %merges the two props and then fills the register in pdflatex
  %merges the two tables (the one is probably still empty) and then fills (in lua) in luatex
  %issues the values stored in the global prop with dvi
\cs_new_protected:Npn \__pdf_backend_ThisPage_gpush:n #1
  {
    \tex_latelua:D
      {
        ltx.__pdf.backend_ThisPage_gpush (tex.count["g_shipout_readonly_int"])
      }
  }

\clist_const:Nn \c__pdf_backend_PageResources_clist
  {
    ExtGState,
    ColorSpace,
    Pattern,
    Shading,
  }
 %create the backend objects:
\clist_map_inline:Nn \c__pdf_backend_PageResources_clist
  {
    \__pdf_backend_object_new:nn {Page/Resources/#1} {dict}
    \cs_if_exist:NT \tex_directlua:D
      {
        \tex_directlua:D
          {
            ltx.__pdf.object["Page/Resources/#1"]
            =
            "\__pdf_backend_object_ref:n{Page/Resources/#1}"
          }
      }
   }
\cs_new_protected:Npn \__pdf_backend_PageResources_gput:nnn #1 #2 #3
  {
    \pdfdict_gput:nnn {g__pdf_Core/Page/Resources/#1} { #2 }{ #3 }
    % luatex must also trigger the lua side
    \tex_latelua:D{ltx.__pdf.Page.Resources.#1=true}
    \tex_latelua:D
      {
        ltx.pdf.Page_Resources_gpush(tex.count["g_shipout_readonly_int"])
      }
  }
\cs_new_protected:Npn \__pdf_backend_PageResources_obj_gpush:
  {
    \clist_map_inline:Nn \c__pdf_backend_PageResources_clist
      {
        \prop_if_empty:cF
          { \__kernel_pdfdict_name:n { g__pdf_Core/Page/Resources/##1} }
          {
            \__pdf_backend_object_write:nx
              { Page/Resources/##1 }
              { \pdfdict_use:n { g__pdf_Core/Page/Resources/##1} }
          }
     }
  }
\bool_new:N \l__pdf_backend_xform_bool

\cs_set_protected:Npn \__pdf_backend_bdcobject:nn #1 #2 % #1 eg. Span, #2: object name
  {
    \int_gincr:N \g__pdf_backend_name_int
    \exp_args:Nx\__kernel_backend_literal_page:n
      { /#1 ~ /l3pdf\int_use:N\g__pdf_backend_name_int\c_space_tl BDC }
    \bool_if:NTF \l__pdf_backend_xform_bool
      {
        \exp_args:Nnx\pdfdict_gput:nnn
          { g__pdf_Core/Xform/Resources/Properties }
          { l3pdf\int_use:N\g__pdf_backend_name_int }
          { \__pdf_backend_object_ref:n { #2 } }
      }
      {
        \exp_args:Nx \tex_latelua:D
          {
            ltx.pdf.Page_Resources_Properties_gput
              (
                tex.count["g_shipout_readonly_int"],
                "l3pdf\int_use:N\g__pdf_backend_name_int",
                "\__pdf_backend_object_ref:n { #2 }"
              )
          }
      }
  }
\cs_set_protected:Npn \__pdf_backend_bdcobject:n #1% #1 eg. Span
  {
    \int_gincr:N \g__pdf_backend_name_int
    \exp_args:Nx\__kernel_backend_literal_page:n
      { /#1 ~ /l3pdf\int_use:N\g__pdf_backend_name_int\c_space_tl BDC }
    \bool_if:NTF \l__pdf_backend_xform_bool
      {
        \exp_args:Nnx\pdfdict_gput:nnn %no handler needed
          { g__pdf_Core/Xform/Resources/Properties }
          { l3pdf\int_use:N\g__pdf_backend_name_int }
          { \__pdf_backend_object_last: }
      }
      {
        \exp_args:Nx \tex_latelua:D
          {
            ltx.pdf.Page_Resources_Properties_gput
              (
                tex.count["g_shipout_readonly_int"],
                "l3pdf\int_use:N\g__pdf_backend_name_int",
                "\__pdf_backend_object_last:"
              )
          }
      }
  }
\cs_set_protected:Npn \__pdf_backend_bmc:n #1
   {
     \__kernel_backend_literal_page:n { /#1~BMC }
   }
\cs_set_protected:Npn \__pdf_backend_bdc_contobj:nn #1 #2
  {
    \pdf_object_unnamed_write:nn { dict } { #2 }
    \__pdf_backend_bdcobject:n { #1 }
  }
\cs_set_protected:Npn \__pdf_backend_bdc_contstream:nn #1 #2
  {
    \__kernel_backend_literal_page:n { /#1~<<#2>>~BDC }
  }
\cs_set_protected:Npn \__pdf_backend_bdc:nn #1 #2
  {
    \bool_if:NTF  \g__pdfmanagement_active_bool
      {\cs_gset_eq:NN \__pdf_backend_bdc:nn \__pdf_backend_bdc_contobj:nn}
      {\cs_gset_eq:NN \__pdf_backend_bdc:nn \__pdf_backend_bdc_contstream:nn}
      \__pdf_backend_bdc:nn {#1}{#2}
  }
\cs_set_protected:Npn \__pdf_backend_emc:
  {
    \__kernel_backend_literal_page:n { EMC }
  }

\cs_new_protected:Npn \__pdf_backend_PageResources_gpush:n #1 {}
\cs_new_protected:Npn \__pdf_backend_NamesEmbeddedFiles_gpush:n #1 %array content
  {
    \pdf_object_unnamed_write:nn {dict} {/Names [#1] }
    \tex_pdfextension:D~names~{/EmbeddedFiles~\pdf_object_ref_last: }
  }


\int_new:N \g__pdf_backend_EmbeddedFiles_int
\cs_new:Npn \__pdf_backend_EmbeddedFiles_name:
 {
   (
    l3ef
    \int_compare:nNnT {\g__pdf_backend_EmbeddedFiles_int} < {10}
     {0}
    \int_compare:nNnT {\g__pdf_backend_EmbeddedFiles_int} < {100}
     {0}
    \int_compare:nNnT {\g__pdf_backend_EmbeddedFiles_int} < {1000}
     {0}
    \int_use:N \g__pdf_backend_EmbeddedFiles_int
   )
 }
\seq_new:N \g__pdf_backend_EmbeddedFiles_seq
\prop_new:N \g__pdf_backend_EmbeddedFiles_named_prop
\cs_new_protected:Npn  \__pdf_backend_NamesEmbeddedFiles_add:n #1
    %#1 object ref
    {
      \int_gincr:N \g__pdf_backend_EmbeddedFiles_int
      \prop_gput:Nnx \g__pdf_backend_EmbeddedFiles_named_prop
        { #1 }
        { \__pdf_backend_EmbeddedFiles_name: }
      \seq_gput_right:Nx \g__pdf_backend_EmbeddedFiles_seq
        { \__pdf_backend_EmbeddedFiles_name: \c_space_tl #1 }
    }

\cs_new_protected:Npn \__pdf_backend_xform_new:nnnn #1 #2 #3 #4
  {
    \hbox_set:Nn \l__pdf_backend_tmpa_box
      {
        \bool_set_true:N \l__pdf_backend_xform_bool
        \prop_gclear:c { \__kernel_pdfdict_name:n { g__pdf_Core/Xform/Resources/Properties } }
        #4
      }
    \tl_const:cx
      { c__pdf_backend_xform_wd_ \tl_to_str:n {#1} _tl }
      { \tex_the:D \box_wd:N \l__pdf_backend_tmpa_box }
    \tl_const:cx
      { c__pdf_backend_xform_ht_ \tl_to_str:n {#1} _tl }
      { \tex_the:D \box_ht:N \l__pdf_backend_tmpa_box }
    \tl_const:cx
      { c__pdf_backend_xform_dp_ \tl_to_str:n {#1} _tl }
      { \tex_the:D \box_dp:N \l__pdf_backend_tmpa_box }
    %% do we need to test if #2 and #3 are empty??
    \tex_immediate:D \tex_pdfxform:D
      ~  attr      ~ { #2 }
      %% which resources should be default? Is an argument actually needed?
      ~  resources ~
      {
        #3
        \int_compare:nNnT
          {\prop_count:c { \__kernel_pdfdict_name:n { g__pdf_Core/Xform/Resources/Properties } }}
          >
          { 0 }
          {
            /Properties~
              <<
                \pdfdict_use:n { g__pdf_Core/Xform/Resources/Properties }
              >>
          }
        \prop_if_empty:cF
          { \__kernel_pdfdict_name:n { g__pdf_Core/Page/Resources/ExtGState } }
          {
            /ExtGState~ \pdf_object_ref:n { Page/Resources/ExtGState }
          }
        \prop_if_empty:cF
          { \__kernel_pdfdict_name:n { g__pdf_Core/Page/Resources/Pattern } }
          {
            /Pattern~ \pdf_object_ref:n { Page/Resources/Pattern }
          }
        \prop_if_empty:cF
          { \__kernel_pdfdict_name:n { g__pdf_Core/Page/Resources/Shading } }
          {
            /Shading~ \pdf_object_ref:n { Page/Resources/Shading }
          }
        \prop_if_empty:cF
          { \__kernel_pdfdict_name:n { g__pdf_Core/Page/Resources/ColorSpace } }
          {
            /ColorSpace~ \pdf_object_ref:n { Page/Resources/ColorSpace }
          }
      }
      \l__pdf_backend_tmpa_box
      \int_const:cn
        { c__pdf_backend_xform_ \tl_to_str:n {#1} _int }
        { \tex_pdflastxform:D }
  }

\cs_new_protected:Npn \__pdf_backend_xform_use:n #1 %protected as with xelatex
  {
    \tex_pdfrefxform:D \int_use:c
      {
        c__pdf_backend_xform_ \tl_to_str:n {#1} _int
      }
      \scan_stop:
  }

\cs_new:Npn \__pdf_backend_xform_ref:n #1
  { \int_use:c { c__pdf_backend_xform_ \tl_to_str:n {#1} _int } ~ 0 ~ R }

%% all
\prg_new_conditional:Npnn \__pdf_backend_xform_if_exist:n #1 { p , T , F , TF }
  {
    \int_if_exist:cTF { c__pdf_backend_xform_ \tl_to_str:n {#1} _int }
     { \prg_return_true: }
     { \prg_return_false:}
  }
\prg_new_eq_conditional:NNn \pdfxform_if_exist:n\__pdf_backend_xform_if_exist:n
  { TF , T , F , p }
%% 
%%
%% End of file `l3backend-testphase-luatex.def'.
