From f71baa64c17bb179faa3052de135e16e32446379 Mon Sep 17 00:00:00 2001 From: Ulrike Fischer Date: Sat, 4 Jul 2020 18:12:01 +0200 Subject: [PATCH] moving bdc code to backend --- l3backend-pdf-extra.dtx | 355 ++++++++++++++++++++++++++++++++++++++++ pdfresources.dtx | 354 --------------------------------------- 2 files changed, 355 insertions(+), 354 deletions(-) diff --git a/l3backend-pdf-extra.dtx b/l3backend-pdf-extra.dtx index 3de69624..3689558b 100644 --- a/l3backend-pdf-extra.dtx +++ b/l3backend-pdf-extra.dtx @@ -568,6 +568,361 @@ % \end{macrocode} % \end{macro} % \end{macro} +% \subsubsection{Page resources /Properties + BDC operators} +% \begin{macro} +% { +% \@@_backend_bdc:nn, +% \@@_backend_bdc_obj:nn, +% \@@_backend_bdc_obj:n, +% \@@_backend_bmc:n, +% \@@_backend_emc:, +% \@@_backend_PageResources_gpush:n +% } +% \cs{@@_backend_bdc:nn}, \cs{@@_backend_bdc_obj:nn}, \cs{@@_backend_bdc_obj:n}, +% \cs{@@_backend_bmc:n} and \cs{@@_backend_emc:} +% are the backend command that +% create the bdc/emc marker and store the properties. +% \cs{@@_backend_PageResources_gpush:n} outputs the /Properties and/or the other +% resources for the current page. +% \begin{macrocode} +% pdftex and luatex (and perhaps dvips ...) need to know if there are in a +% xform stream ... +%<*drivers> +\bool_new:N \l_@@_backend_xform_bool +% +%<*dvips> +% dvips is easy: create an object, and reference it in the bdc +% ghostscript will then automatically replace it by a name +% and add the name to the /Properties dict +% special variant von accsupp +% https://chat.stackexchange.com/transcript/message/50831812#50831812 +% +\cs_set_protected:Npn \@@_backend_bdc:nn #1 #2 % #1 eg. Span, #2: dict_content + { + \__pdf_backend_pdfmark:x{/#1~<<#2>>~/BDC} + } +\cs_set_protected:Npn \@@_backend_bdc_obj:nn #1 #2 % #1 eg. Span, #2: object name + { + \__pdf_backend_pdfmark:x{/#1~\@@_backend_object_ref:n{#2}~/BDC} + } +\cs_set_protected:Npn \@@_backend_bdc_obj:n #1 % #1 eg. Span, + { + \__pdf_backend_pdfmark:x{/#1~\@@_backend_object_last:~/BDC} + } +\cs_set_protected:Npn \@@_backend_emc: + { + \__pdf_backend_pdfmark:n{/EMC} % + } +\cs_set_protected:Npn \@@_backend_bmc:n #1 + { + \__pdf_backend_pdfmark:n{/#1~/BMC} % + } +\cs_new_protected:Npn \@@_backend_PageResources_gpush:n #1 {} + +% +% xetex has to create the entries in the /Properties manually +% (like the other backends) +% use pdfbase special +% https://chat.stackexchange.com/transcript/message/50832016#50832016 +% the property is added to xform resources automatically, +% no need to worry about it. +%<*dvipdfmx|xdvipdfmx> + \cs_set_protected:Npn \@@_backend_bdc_obj:nn #1 #2 % #1 eg. Span, #2: object name + { + \int_gincr:N \g_@@_backend_name_int + \__kernel_backend_literal:x + { + pdf:code~/#1/l3pdf\int_use:N\g_@@_backend_name_int\c_space_tl BDC + } + \__kernel_backend_literal:x + { + pdf:put~@resources~ + << + /Properties~ + << + /l3pdf\int_use:N\g_@@_backend_name_int\c_space_tl + \@@_backend_object_ref:n { #2 } + >> + >> + } + } + \cs_set_protected:Npn \@@_backend_bdc_obj:n #1 % #1 eg. Span + { + \int_gincr:N \g_@@_backend_name_int + \__kernel_backend_literal:x + { + pdf:code~/#1/l3pdf\int_use:N\g_@@_backend_name_int\c_space_tl BDC + } + \__kernel_backend_literal:x + { + pdf:put~@resources~ + << + /Properties~ + << + /l3pdf\int_use:N\g_@@_backend_name_int\c_space_tl + \@@_backend_object_last: + >> + >> + } + } +\cs_set_protected:Npn \@@_backend_bmc:n #1 + { + \__kernel_backend_literal:n {pdf:code~/#1~BMC} %pdfbase + } + +%this require management +\cs_set_protected:Npn \@@_backend_bdc_contobj:nn #1 #2 + { + \pdf_object_now:nn { dict }{ #2 } + \@@_backend_bdc_obj:n { #1 } + } + +\cs_set_protected:Npn \@@_backend_bdc_contstream:nn #1 #2 + { + \__kernel_backend_literal:n {pdf:code~ /#1~<<#2>>~BDC } + } + +\cs_set_protected:Npn \@@_backend_bdc:nn #1 #2 + { + \bool_if:NTF \g_@@_Core_active_bool + {\cs_gset_eq:NN \@@_backend_bdc:nn \@@_backend_bdc_contobj:nn} + {\cs_gset_eq:NN \@@_backend_bdc:nn \@@_backend_bdc_contstream:nn} + \@@_backend_bdc:nn {#1}{#1} + } +\cs_set_protected:Npn \@@_backend_emc: + { + \__kernel_backend_literal:n {pdf:code~EMC} %pdfbase + } + % properties are handled automatically, but the other resources should be added + % at shipout +\cs_new_protected:Npn \@@_backend_PageResources_gpush:n #1 + { + \clist_map_inline:Nn \c_@@_backend_PageResources_clist + { + \prop_if_empty:cF { \pdfdict_gname:n {Core/Page/Resources/##1} } + { + \__kernel_backend_literal:x + { + pdf:put~@resources~ + <> + } + } + } + } +% +% luatex + pdftex +%<*pdfmode> +\sys_if_engine_luatex:T + { + \cs_set_protected:Npn \@@_backend_bdc_obj:nn #1 #2 % #1 eg. Span, #2: object name + { + \int_gincr:N \g_@@_backend_name_int + \exp_args:Nx\__kernel_backend_literal_page:n + { /#1 ~ /l3pdf\int_use:N\g_@@_backend_name_int\c_space_tl BDC } + \bool_if:NTF \l_@@_backend_xform_bool + { + \exp_args:Nnx\pdfdict_gput:nnn + { Core/Xform/Resources/Properties } + { l3pdf\int_use:N\g_@@_backend_name_int } + { \@@_backend_object_ref:n { #2 } } + } + { + \exp_args:Nx \tex_latelua:D + { + l3kernel.pdf.Page_Resources_Properties_gput + ( + tex.count["g_shipout_readonly_int"], + "l3pdf\int_use:N\g_@@_backend_name_int", + "\@@_backend_object_ref:n { #2 }" + ) + } + } + } + \cs_set_protected:Npn \@@_backend_bdc_obj:n #1% #1 eg. Span + { + \int_gincr:N \g_@@_backend_name_int + \exp_args:Nx\__kernel_backend_literal_page:n + { /#1 ~ /l3pdf\int_use:N\g_@@_backend_name_int\c_space_tl BDC } + \bool_if:NTF \l_@@_backend_xform_bool + { + \exp_args:Nnx\pdfdict_gput:nnn %no handler needed + { Core/Xform/Resources/Properties } + { l3pdf\int_use:N\g_@@_backend_name_int } + { \@@_backend_object_last: } + } + { + \exp_args:Nx \tex_latelua:D + { + l3kernel.pdf.Page_Resources_Properties_gput + ( + tex.count["g_shipout_readonly_int"], + "l3pdf\int_use:N\g_@@_backend_name_int", + "\@@_backend_object_last:" + ) + } + } + } + \cs_set_protected:Npn \@@_backend_bmc:n #1 + { + \__kernel_backend_literal_page:n { /#1~BMC } + } + \cs_set_protected:Npn \@@_backend_bdc_contobj:nn #1 #2 + { + \pdf_object_now:nn { dict } { #2 } + \@@_backend_bdc_obj:n { #1 } + } + \cs_set_protected:Npn \@@_backend_bdc_contstream:nn #1 #2 + { + \__kernel_backend_literal_page:n { /#1~<<#2>>~BDC } + } + \cs_set_protected:Npn \@@_backend_bdc:nn #1 #2 + { + \bool_if:NTF \g_@@_Core_active_bool + {\cs_gset_eq:NN \@@_backend_bdc:nn \@@_backend_bdc_contobj:nn} + {\cs_gset_eq:NN \@@_backend_bdc:nn \@@_backend_bdc_contstream:nn} + \@@_backend_bdc:nn {#1}{#1} + } + \cs_set_protected:Npn \@@_backend_emc: + { + \__kernel_backend_literal_page:n { EMC } + } + + \cs_new_protected:Npn \@@_backend_PageResources_gpush:n #1 {} + } + +% pdflatex is the most complicated as it has to go through the aux ... +% the push command is extended to take other resources too +\sys_if_engine_pdftex:T + { + \cs_set_protected:Npn \@@_backend_bdc_obj:nn #1 #2 % #1 eg. Span, #2: object name + { + \int_gincr:N \g_@@_backend_name_int + \exp_args:Nx\__kernel_backend_literal_page:n + { /#1 ~ /l3pdf\int_use:N\g_@@_backend_name_int\c_space_tl BDC } + % code to set the property .... + \int_gincr:N\g_@@_backend_resourceid_int + \bool_if:NTF \l_@@_backend_xform_bool + { + \exp_args:Nnxx\pdfdict_gput:nnn %no handler needed + { Core/Xform/Resources/Properties } + { l3pdf\int_use:N\g_@@_backend_resourceid_int } + { \@@_backend_object_ref:n { #2 } } + } + { + \zref@labelbylist + { l3pdf\int_use:N\g_@@_backend_resourceid_int } + { l3pdf } + \tl_set:Nx \l_@@_tmpa_tl + { + \zref@extractdefault + { l3pdf\int_use:N\g_@@_backend_resourceid_int } + {pdf@abspage} + {0} + } + \pdfdict_if_gexist:nF { Core/backend_Page\l_@@_tmpa_tl/Resources/Properties } + { + \pdfdict_gnew:n { Core/backend_Page\l_@@_tmpa_tl/Resources/Properties } + } + \exp_args:Nnxx\pdfdict_gput:nnn + { Core/backend_Page\l_@@_tmpa_tl/Resources/Properties } + { l3pdf\int_use:N\g_@@_backend_resourceid_int } + { \@@_backend_object_ref:n{#2} } + } + } + \cs_set_protected:Npn \@@_backend_bdc_obj:n #1% #1 eg. Span + { + \int_gincr:N \g_@@_backend_name_int + \exp_args:Nx\__kernel_backend_literal_page:n + { /#1 ~ /l3pdf\int_use:N\g_@@_backend_name_int\c_space_tl BDC } + % code to set the property .... + \int_gincr:N\g_@@_backend_resourceid_int + \bool_if:NTF \l_@@_backend_xform_bool + { + \exp_args:Nnxx\pdfdict_gput:nnn + { Core/Xform/Resources/Properties } + { l3pdf\int_use:N\g_@@_backend_resourceid_int } + { \@@_backend_object_last: } + } + { + \zref@labelbylist + { l3pdf\int_use:N\g_@@_backend_resourceid_int } + { l3pdf } + \tl_set:Nx \l_@@_tmpa_tl + { + \zref@extractdefault + { l3pdf\int_use:N\g_@@_backend_resourceid_int } + {pdf@abspage} + {0} + } + \pdfdict_if_gexist:nF { Core/backend_Page\l_@@_tmpa_tl/Resources/Properties } + { + \pdfdict_gnew:n { Core/backend_Page\l_@@_tmpa_tl/Resources/Properties } + } + \exp_args:Nnxx\pdfdict_gput:nnn + { Core/backend_Page\l_@@_tmpa_tl/Resources/Properties } + { l3pdf\int_use:N\g_@@_backend_resourceid_int } + { \@@_backend_object_last: } + %\pdfdict_show:n { backend_Page\l_@@_tmpa_tl/Resources/Properties } + } + } + \cs_set_protected:Npn \@@_backend_bmc:n #1 + { + \__kernel_backend_literal_page:n { /#1~BMC } + } + \cs_set_protected:Npn \@@_backend_bdc_contobj:nn #1 #2 + { + \pdf_object_now:nn { dict } { #2 } + \@@_backend_bdc_obj:n { #1 } + } + \cs_set_protected:Npn \@@_backend_bdc_contstream:nn #1 #2 + { + \__kernel_backend_literal_page:n { /#1~<<#2>>~BDC } + } + \cs_set_protected:Npn \@@_backend_bdc:nn #1 #2 + { + \bool_if:NTF \g_@@_Core_active_bool + {\cs_gset_eq:NN \@@_backend_bdc:nn \@@_backend_bdc_contobj:nn} + {\cs_gset_eq:NN \@@_backend_bdc:nn \@@_backend_bdc_contstream:nn} + \@@_backend_bdc:nn {#1}{#1} + } + \cs_set_protected:Npn \@@_backend_emc: + { + \__kernel_backend_literal_page:n { EMC } + } + + \cs_new:Npn \@@_backend_PageResources_gpush_aux:n #1 %#1 ExtGState etc + { + \prop_if_empty:cF + { \pdfdict_gname:n {Core/Page/Resources/#1} } + { + \pdfdict_item:ne { #1 }{ \pdf_object_ref:n {Page/Resources/#1}} + } + } + + \cs_new_protected:Npn \@@_backend_PageResources_gpush:n #1 + { + \exp_args:NNx \tex_global:D \tex_pdfpageresources:D + { + \prop_if_exist:cT + { \pdfdict_gname:n { Core/backend_Page#1/Resources/Properties } } + { + /Properties~ + << + \prop_map_function:cN + { \pdfdict_gname:n { Core/backend_Page#1/Resources/Properties } } + \pdfdict_item:ne + >> + } + %% add ExtGState etc + \clist_map_function:NN + \c_@@_backend_PageResources_clist + \@@_backend_PageResources_gpush_aux:n + } + } + } +% +% \end{macrocode} +% \end{macro} % \subsection{\enquote{Catalog} \& subdirectories (pdfcatalog) } % The backend command is already in the driver: % \cs{@@_backend_catalog_gput:nn} diff --git a/pdfresources.dtx b/pdfresources.dtx index 725713ee..a92c1116 100644 --- a/pdfresources.dtx +++ b/pdfresources.dtx @@ -366,361 +366,7 @@ % \end{verbatim} % \end{function} % -% \subsubsection{BDC and Properties / backend} -% \begin{macro} -% { -% \@@_backend_bdc:nn, -% \@@_backend_bdc_obj:nn, -% \@@_backend_bdc_obj:n, -% \@@_backend_bmc:n, -% \@@_backend_emc:, -% \@@_backend_PageResources_gpush:n -% } -% \cs{@@_backend_bdc:nn}, \cs{@@_backend_bdc_obj:nn}, \cs{@@_backend_bdc_obj:n}, -% \cs{@@_backend_bmc:n} and \cs{@@_backend_emc:} -% are the backend command that -% create the bdc/emc marker and store the properties. -% \cs{@@_backend_PageResources_gpush:n} outputs the /Properties and/or the other -% resources for the current page. -% \begin{macrocode} -% pdftex and luatex (and perhaps dvips ...) need to know if there are in a -% xform stream ... -%<*drivers> -\bool_new:N \l_@@_backend_xform_bool -% -%<*dvips> -% dvips is easy: create an object, and reference it in the bdc -% ghostscript will then automatically replace it by a name -% and add the name to the /Properties dict -% special variant von accsupp -% https://chat.stackexchange.com/transcript/message/50831812#50831812 -% -\cs_set_protected:Npn \@@_backend_bdc:nn #1 #2 % #1 eg. Span, #2: dict_content - { - \__pdf_backend_pdfmark:x{/#1~<<#2>>~/BDC} - } -\cs_set_protected:Npn \@@_backend_bdc_obj:nn #1 #2 % #1 eg. Span, #2: object name - { - \__pdf_backend_pdfmark:x{/#1~\@@_backend_object_ref:n{#2}~/BDC} - } -\cs_set_protected:Npn \@@_backend_bdc_obj:n #1 % #1 eg. Span, - { - \__pdf_backend_pdfmark:x{/#1~\@@_backend_object_last:~/BDC} - } -\cs_set_protected:Npn \@@_backend_emc: - { - \__pdf_backend_pdfmark:n{/EMC} % - } -\cs_set_protected:Npn \@@_backend_bmc:n #1 - { - \__pdf_backend_pdfmark:n{/#1~/BMC} % - } -\cs_new_protected:Npn \@@_backend_PageResources_gpush:n #1 {} -% -% xetex has to create the entries in the /Properties manually -% (like the other backends) -% use pdfbase special -% https://chat.stackexchange.com/transcript/message/50832016#50832016 -% the property is added to xform resources automatically, -% no need to worry about it. -%<*dvipdfmx|xdvipdfmx> - \cs_set_protected:Npn \@@_backend_bdc_obj:nn #1 #2 % #1 eg. Span, #2: object name - { - \int_gincr:N \g_@@_backend_name_int - \__kernel_backend_literal:x - { - pdf:code~/#1/l3pdf\int_use:N\g_@@_backend_name_int\c_space_tl BDC - } - \__kernel_backend_literal:x - { - pdf:put~@resources~ - << - /Properties~ - << - /l3pdf\int_use:N\g_@@_backend_name_int\c_space_tl - \@@_backend_object_ref:n { #2 } - >> - >> - } - } - \cs_set_protected:Npn \@@_backend_bdc_obj:n #1 % #1 eg. Span - { - \int_gincr:N \g_@@_backend_name_int - \__kernel_backend_literal:x - { - pdf:code~/#1/l3pdf\int_use:N\g_@@_backend_name_int\c_space_tl BDC - } - \__kernel_backend_literal:x - { - pdf:put~@resources~ - << - /Properties~ - << - /l3pdf\int_use:N\g_@@_backend_name_int\c_space_tl - \@@_backend_object_last: - >> - >> - } - } -\cs_set_protected:Npn \@@_backend_bmc:n #1 - { - \__kernel_backend_literal:n {pdf:code~/#1~BMC} %pdfbase - } - -%this require management -\cs_set_protected:Npn \@@_backend_bdc_contobj:nn #1 #2 - { - \pdf_object_now:nn { dict }{ #2 } - \@@_backend_bdc_obj:n { #1 } - } - -\cs_set_protected:Npn \@@_backend_bdc_contstream:nn #1 #2 - { - \__kernel_backend_literal:n {pdf:code~ /#1~<<#2>>~BDC } - } - -\cs_set_protected:Npn \@@_backend_bdc:nn #1 #2 - { - \bool_if:NTF \g_@@_Core_active_bool - {\cs_gset_eq:NN \@@_backend_bdc:nn \@@_backend_bdc_contobj:nn} - {\cs_gset_eq:NN \@@_backend_bdc:nn \@@_backend_bdc_contstream:nn} - \@@_backend_bdc:nn {#1}{#1} - } -\cs_set_protected:Npn \@@_backend_emc: - { - \__kernel_backend_literal:n {pdf:code~EMC} %pdfbase - } - % properties are handled automatically, but the other resources should be added - % at shipout -\cs_new_protected:Npn \@@_backend_PageResources_gpush:n #1 - { - \clist_map_inline:Nn \c_@@_backend_PageResources_clist - { - \prop_if_empty:cF { \pdfdict_gname:n {Core/Page/Resources/##1} } - { - \__kernel_backend_literal:x - { - pdf:put~@resources~ - <> - } - } - } - } -% -% luatex -%<*pdfmode> -\sys_if_engine_luatex:T - { - \cs_set_protected:Npn \@@_backend_bdc_obj:nn #1 #2 % #1 eg. Span, #2: object name - { - \int_gincr:N \g_@@_backend_name_int - \exp_args:Nx\__kernel_backend_literal_page:n - { /#1 ~ /l3pdf\int_use:N\g_@@_backend_name_int\c_space_tl BDC } - \bool_if:NTF \l_@@_backend_xform_bool - { - \exp_args:Nnx\pdfdict_gput:nnn - { Core/Xform/Resources/Properties } - { l3pdf\int_use:N\g_@@_backend_name_int } - { \@@_backend_object_ref:n { #2 } } - } - { - \exp_args:Nx \tex_latelua:D - { - l3kernel.pdf.Page_Resources_Properties_gput - ( - tex.count["g_shipout_readonly_int"], - "l3pdf\int_use:N\g_@@_backend_name_int", - "\@@_backend_object_ref:n { #2 }" - ) - } - } - } - \cs_set_protected:Npn \@@_backend_bdc_obj:n #1% #1 eg. Span - { - \int_gincr:N \g_@@_backend_name_int - \exp_args:Nx\__kernel_backend_literal_page:n - { /#1 ~ /l3pdf\int_use:N\g_@@_backend_name_int\c_space_tl BDC } - \bool_if:NTF \l_@@_backend_xform_bool - { - \exp_args:Nnx\pdfdict_gput:nnn %no handler needed - { Core/Xform/Resources/Properties } - { l3pdf\int_use:N\g_@@_backend_name_int } - { \@@_backend_object_last: } - } - { - \exp_args:Nx \tex_latelua:D - { - l3kernel.pdf.Page_Resources_Properties_gput - ( - tex.count["g_shipout_readonly_int"], - "l3pdf\int_use:N\g_@@_backend_name_int", - "\@@_backend_object_last:" - ) - } - } - } - \cs_set_protected:Npn \@@_backend_bmc:n #1 - { - \__kernel_backend_literal_page:n { /#1~BMC } - } - \cs_set_protected:Npn \@@_backend_bdc_contobj:nn #1 #2 - { - \pdf_object_now:nn { dict } { #2 } - \@@_backend_bdc_obj:n { #1 } - } - \cs_set_protected:Npn \@@_backend_bdc_contstream:nn #1 #2 - { - \__kernel_backend_literal_page:n { /#1~<<#2>>~BDC } - } - \cs_set_protected:Npn \@@_backend_bdc:nn #1 #2 - { - \bool_if:NTF \g_@@_Core_active_bool - {\cs_gset_eq:NN \@@_backend_bdc:nn \@@_backend_bdc_contobj:nn} - {\cs_gset_eq:NN \@@_backend_bdc:nn \@@_backend_bdc_contstream:nn} - \@@_backend_bdc:nn {#1}{#1} - } - \cs_set_protected:Npn \@@_backend_emc: - { - \__kernel_backend_literal_page:n { EMC } - } - - \cs_new_protected:Npn \@@_backend_PageResources_gpush:n #1 {} - } - -% pdflatex is the most complicated as it has to go through the aux ... -% the push command is extended to take other resources too -\sys_if_engine_pdftex:T - { - \cs_set_protected:Npn \@@_backend_bdc_obj:nn #1 #2 % #1 eg. Span, #2: object name - { - \int_gincr:N \g_@@_backend_name_int - \exp_args:Nx\__kernel_backend_literal_page:n - { /#1 ~ /l3pdf\int_use:N\g_@@_backend_name_int\c_space_tl BDC } - % code to set the property .... - \int_gincr:N\g_@@_backend_resourceid_int - \bool_if:NTF \l_@@_backend_xform_bool - { - \exp_args:Nnxx\pdfdict_gput:nnn %no handler needed - { Core/Xform/Resources/Properties } - { l3pdf\int_use:N\g_@@_backend_resourceid_int } - { \@@_backend_object_ref:n { #2 } } - } - { - \zref@labelbylist - { l3pdf\int_use:N\g_@@_backend_resourceid_int } - { l3pdf } - \tl_set:Nx \l_@@_tmpa_tl - { - \zref@extractdefault - { l3pdf\int_use:N\g_@@_backend_resourceid_int } - {pdf@abspage} - {0} - } - \pdfdict_if_gexist:nF { Core/backend_Page\l_@@_tmpa_tl/Resources/Properties } - { - \pdfdict_gnew:n { Core/backend_Page\l_@@_tmpa_tl/Resources/Properties } - } - \exp_args:Nnxx\pdfdict_gput:nnn - { Core/backend_Page\l_@@_tmpa_tl/Resources/Properties } - { l3pdf\int_use:N\g_@@_backend_resourceid_int } - { \@@_backend_object_ref:n{#2} } - } - } - \cs_set_protected:Npn \@@_backend_bdc_obj:n #1% #1 eg. Span - { - \int_gincr:N \g_@@_backend_name_int - \exp_args:Nx\__kernel_backend_literal_page:n - { /#1 ~ /l3pdf\int_use:N\g_@@_backend_name_int\c_space_tl BDC } - % code to set the property .... - \int_gincr:N\g_@@_backend_resourceid_int - \bool_if:NTF \l_@@_backend_xform_bool - { - \exp_args:Nnxx\pdfdict_gput:nnn - { Core/Xform/Resources/Properties } - { l3pdf\int_use:N\g_@@_backend_resourceid_int } - { \@@_backend_object_last: } - } - { - \zref@labelbylist - { l3pdf\int_use:N\g_@@_backend_resourceid_int } - { l3pdf } - \tl_set:Nx \l_@@_tmpa_tl - { - \zref@extractdefault - { l3pdf\int_use:N\g_@@_backend_resourceid_int } - {pdf@abspage} - {0} - } - \pdfdict_if_gexist:nF { Core/backend_Page\l_@@_tmpa_tl/Resources/Properties } - { - \pdfdict_gnew:n { Core/backend_Page\l_@@_tmpa_tl/Resources/Properties } - } - \exp_args:Nnxx\pdfdict_gput:nnn - { Core/backend_Page\l_@@_tmpa_tl/Resources/Properties } - { l3pdf\int_use:N\g_@@_backend_resourceid_int } - { \@@_backend_object_last: } - %\pdfdict_show:n { backend_Page\l_@@_tmpa_tl/Resources/Properties } - } - } - \cs_set_protected:Npn \@@_backend_bmc:n #1 - { - \__kernel_backend_literal_page:n { /#1~BMC } - } - \cs_set_protected:Npn \@@_backend_bdc_contobj:nn #1 #2 - { - \pdf_object_now:nn { dict } { #2 } - \@@_backend_bdc_obj:n { #1 } - } - \cs_set_protected:Npn \@@_backend_bdc_contstream:nn #1 #2 - { - \__kernel_backend_literal_page:n { /#1~<<#2>>~BDC } - } - \cs_set_protected:Npn \@@_backend_bdc:nn #1 #2 - { - \bool_if:NTF \g_@@_Core_active_bool - {\cs_gset_eq:NN \@@_backend_bdc:nn \@@_backend_bdc_contobj:nn} - {\cs_gset_eq:NN \@@_backend_bdc:nn \@@_backend_bdc_contstream:nn} - \@@_backend_bdc:nn {#1}{#1} - } - \cs_set_protected:Npn \@@_backend_emc: - { - \__kernel_backend_literal_page:n { EMC } - } - - \cs_new:Npn \@@_backend_PageResources_gpush_aux:n #1 %#1 ExtGState etc - { - \prop_if_empty:cF - { \pdfdict_gname:n {Core/Page/Resources/#1} } - { - \pdfdict_item:ne { #1 }{ \pdf_object_ref:n {Page/Resources/#1}} - } - } - - \cs_new_protected:Npn \@@_backend_PageResources_gpush:n #1 - { - \exp_args:NNx \tex_global:D \tex_pdfpageresources:D - { - \prop_if_exist:cT - { \pdfdict_gname:n { Core/backend_Page#1/Resources/Properties } } - { - /Properties~ - << - \prop_map_function:cN - { \pdfdict_gname:n { Core/backend_Page#1/Resources/Properties } } - \pdfdict_item:ne - >> - } - %% add ExtGState etc - \clist_map_function:NN - \c_@@_backend_PageResources_clist - \@@_backend_PageResources_gpush_aux:n - } - } - } -% -% \end{macrocode} -% \end{macro} % % \subsubsection{BDC and Properties / management} % \begin{macro}{\pdf_bdc:nn}