diff options
Diffstat (limited to 'tex/context/base/grph-inc.mkiv')
-rw-r--r-- | tex/context/base/grph-inc.mkiv | 895 |
1 files changed, 317 insertions, 578 deletions
diff --git a/tex/context/base/grph-inc.mkiv b/tex/context/base/grph-inc.mkiv index f96812d26..633130ea9 100644 --- a/tex/context/base/grph-inc.mkiv +++ b/tex/context/base/grph-inc.mkiv @@ -11,10 +11,16 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -% todo: messages - \writestatus{loading}{ConTeXt Graphic Macros / Figure Inclusion} +%D todo: +%D +%D - color conversion +%D - alternative images +%D - a few more obscure things + +% use framedcommandhandler + \registerctxluafile{grph-inc}{1.001} \registerctxluafile{grph-fil}{1.001} \registerctxluafile{grph-u3d}{1.001} % this will change @@ -22,377 +28,25 @@ \unprotect -%D Including graphics is complicated by the fact that we need to locate them first, -%D optionally manipulate them and scale then next. Lookups are to be done as efficient -%D as possible and inclusion of the data might happens only once. In \MKIV\ much of this -%D is delegated to the \LUA\ end. There is nor so much less code as in \MKII\ but it's -%D more powerful, flexible, pluggable and some of the extended functionality has been -%D moved from modules to the core. The overall functionality is rather stable and has -%D not changed much over the years. - -\ifdefined\dotagfigure \else \let\dotagfigure\relax \fi - -\installcorenamespace{externalfigure} -\installcorenamespace{externalfigureinstance} -\installcorenamespace{externalfigurecollection} - -\installframedcommandhandler \??externalfigure {externalfigure} \??externalfigure - -\let\setupexternalfigures\setupexternalfigure - -\setupexternalfigures[% we really need the defaults - \c!method =, - \c!label =, - \c!size =, - \c!conversion =, - \c!resolution =, - \c!prefix =, - \c!cache =, - \c!page =\zerocount, - \c!display =, - \c!mask =, - \c!preset =\v!yes, - \c!split =, - \c!color =, - \c!symbol =\v!no, - \c!controls =\v!no, - \c!resources =, - \c!preview =\v!no - \c!repeat =\v!no - \c!foregroundcolor=, - \c!interaction =\v!none, - \c!hfactor =, - \c!wfactor =, - \c!factor =, - \c!maxwidth =\externalfigureparameter\c!width, - \c!maxheight =\externalfigureparameter\c!height, - \c!xscale =, - \c!yscale =, - \c!scale =, - \c!sx =\externalfigureparameter\c!s, - \c!sy =\externalfigureparameter\c!s, - \c!s =1, - \c!width =, - \c!height =, - \c!lines =, - \c!grid =, - \c!bodyfont =\bodyfontsize, - \c!object =\v!yes, - \c!corner =\v!rectangular, - \c!frame =\v!off, - \c!option =, - \c!reset =\v!no, - \c!directory =, - \c!radius =.5\bodyfontsize, - \c!background =, - \c!splitcolor =\s!white, - \c!order =, - \c!equalwidth =, - \c!equalheight =, - \c!location ={\v!local,\v!global}, - \c!frames =\v!off, - \c!ymax =24, - \c!xmax =, - ] - -%D Defining figures. - -\newcount\c_grph_include_nesting - -\newtoks \everyexternalfigureresets % for the moment still public -\newtoks \everyexternalfigurechecks % for the moment still public - -% \useexternalfigure[alpha][koe] -% \useexternalfigure[beta] [koe] [breedte=1cm] -% \useexternalfigure[gamma][koe][alpha] -% \useexternalfigure[delta][koe][alpha][breedte=2cm] -% -% volle breedte: \externalfigure[koe] \par -% 3cm breed: \externalfigure[koe] [breedte=3cm] \par -% volle breedte: \externalfigure[alpha] \par -% 1cm breed: \externalfigure[beta] \par -% volle breedte: \externalfigure[gamma] \par -% 2cm breed: \externalfigure[delta] \par -% 4cm breed: \externalfigure[beta] [breedte=4cm] \par -% 5cm breed: \externalfigure[gamma][breedte=5cm] \par -% -% \defineexternalfigure[a][width=10cm] -% \defineexternalfigure[b][width=5cm] -% \externalfigure[cow][a] -% \externalfigure[cow][b][height=8cm] -% -% \useexternalfigure[x][cow][width=10cm,height=1cm] -% \externalfigure[x] -% \externalfigure[x][width=3cm] -% -% [label] [filename] -% [label] [filename] [parent] -% [label] [filename] [parent] [settings] -% [label] [filename] [settings] -% -% new: more convenient/efficient than -% -% \use..[a][a][setting] \externalfigure[b][a] -% -% is equivalent to: -% -% \def..[a][setting] \externalfigure[b][a] -% -% see x-res modules for usage: -% -% \defineexternalfigure[name][settings] - -%D Defining is persistent, i.e.\ when you redefine an instance, -%D the already set parameters need to be set again or otherwise -%D the old values will be used. - -\newconditional\c_grph_include_trace_inheritance - -\installtextracker - {graphics.inheritance} - {\settrue \c_grph_include_trace_inheritance} - {\setfalse\c_grph_include_trace_inheritance} - -\installcorenamespace{externalfiguredefinition} - -% \unexpanded\def\defineexternalfigure -% {\dodoubleargument\grph_include_define} -% -% \def\grph_include_define[#1][#2]% -% {\setvalue{\??externalfiguredefinition#1}{\setupcurrentexternalfigure[#2]}} - -\let\defineexternalfigures\defineexternalfigure - -\unexpanded\def\useexternalfigure - {\doquadrupleempty\grph_include_use} - -% label file parent settings -% label file settings -% label file parent - -\def\grph_include_use[#1][#2][#3][#4]% - {\doifelsenothing{#1} - {\doifsomething{#2} - {\doifassignmentelse{#3} - {\grph_include_use_indeed{#2}{#2}{#3}{#4}} - {\grph_include_use_indeed{#2}{#2}\empty{#4}}}} - {\doifelsenothing{#2} - {\doifassignmentelse{#3} - {\grph_include_use_indeed{#1}{#1}\empty{#3}} - {\grph_include_use_indeed{#1}{#1}{#3}{#4}}} - {\doifassignmentelse{#3} - {\grph_include_use_indeed{#1}{#2}\empty{#3}} - {\grph_include_use_indeed{#1}{#2}{#3}{#4}}}}} - -\def\grph_include_use_indeed#1#2#3#4% - {\setvalue{\??externalfigureinstance#1}{\grph_include_setup{#2}{#3}{#4}}% - \grph_include_analyze_collection[#2][#4]} - -% inclusion - -\unexpanded\def\externalfigure - {\dotripleempty\grph_include_figure} - -\def\grph_include_figure[#1][#2][#3]% - {\docheckassignment{#2}% - \ifassignment - \grph_include_place[#1][][#2]% - \else - \grph_include_place[#1][#2][#3]% - \fi} - -% todo: chain them +%D The following registers are used (if only to be downward compatible). -\def\grph_include_setup#1#2#3% name parent settings - {\edef\m_grph_include_name {#1}% - \edef\m_grph_include_parent{#2}% - \ifx\m_grph_include_name\empty \else - \let\p_grph_include_name\m_grph_include_name - \fi - \ifx\m_grph_include_parent\empty \else - \grph_include_inherit_from_parent\m_grph_include_parent - \fi - \setupcurrentexternalfigure[#3]} - -% \def\grph_include_inherit_from_parent#1% -% {\ifcsname\??externalfiguredefinition#1\endcsname -% \ifconditional\c_grph_include_trace_inheritance\c_grph_include_trace_inheritance\writestatus\m!figures{inheriting from definition: #1}\fi -% \csname\??externalfiguredefinition#1\endcsname -% \fi -% \ifcsname\??externalfigureinstance#1\endcsname -% \ifconditional\c_grph_include_trace_inheritance\c_grph_include_trace_inheritance\writestatus\m!figures{inheriting from instance: #1}\fi -% \csname\??externalfigureinstance#1\endcsname -% \fi} +\newbox \foundexternalfigure +\newif \ifskipexternalfigures +\newtoks \everyexternalfigureresets +\newtoks \everyexternalfigurechecks +\newtoks \externalfigurepostprocessors -\def\grph_include_inherit_from_parent#1% - {%\ifcsname\??externalfiguredefinition#1\endcsname - % \ifconditional\c_grph_include_trace_inheritance\writestatus\m!figures{inheriting from definition: #1}\fi - % \csname\??externalfiguredefinition#1\endcsname - %\fi - \ifcsname\??externalfigure#1:\s!parent\endcsname - \let\currentexternalfigure#1% - \fi - \ifcsname\??externalfigureinstance#1\endcsname - \ifconditional\c_grph_include_trace_inheritance\writestatus\m!figures{inheriting from instance: #1}\fi - \csname\??externalfigureinstance#1\endcsname - \fi} +\def\resetfigurevariables {\the\everyexternalfigureresets} +\def\checkfigurevariables {\the\everyexternalfigurechecks} -\newtoks\t_grph_include_local_settings +%D Historic feature: \appendtoks - \let\textunderscore\letterunderscore % {\string _} % space needed as _ is now letter in unprotected mode (probably no longer needed) - % - \dontcomplain - \restorecatcodes - \forgetall -\to \t_grph_include_local_settings - -\def\grph_include_place_inherit - {\ifconditional\c_grph_include_trace_inheritance - \writestatus\m!figures{label: \p_grph_include_label, name: \p_grph_include_name, parent: \p_grph_include_parent}% - \fi - \ifx\p_grph_include_parent\empty - % nothing to be done - \else\ifx\p_grph_include_parent\p_grph_include_label - % redundant - \else - \grph_include_inherit_from_parent\p_grph_include_parent - \fi\fi - \ifx\p_grph_include_label\empty - % nothing to be done - \else - \grph_include_inherit_from_parent\p_grph_include_label - \fi} - -\def\grph_include_place[#1][#2][#3]% [label][file][settings] | [file][settings] | [file][parent][settings] - {\bgroup - \advance\c_grph_include_nesting\plusone - \edef\currentexternalfigure{\the\c_grph_include_nesting}% - \checkexternalfigureparent % each inherits from the root - % - \the\everyexternalfigureresets - % - \edef\p_grph_include_label{#1}% - \let\p_grph_include_name\p_grph_include_label - \docheckassignment{#2}% - \ifassignment - % [label] [settings] - \let\p_grph_include_parent\p_grph_include_label - \grph_include_place_inherit - \setupcurrentexternalfigure[#2]% - \else - % [label] [parent] [settings] - \edef\p_grph_include_parent{#2}% - \ifx\p_grph_include_parent\empty - \let\p_grph_include_parent\p_grph_include_label - \fi - \grph_include_place_inherit - \setupcurrentexternalfigure[#3]% - \fi - % - \the\everyexternalfigurechecks - % - \the\t_grph_include_local_settings - \dostarttagged\t!image\empty - \ctxlua{figures.push { - name = "\p_grph_include_name", - label = "\p_grph_include_label", - page = "\externalfigureparameter\c!page", - size = "\externalfigureparameter\c!size", - object = "\externalfigureparameter\c!object", - prefix = "\externalfigureparameter\c!prefix", - cache = "\externalfigureparameter\c!cache", - format = "\externalfigureparameter\c!method", - preset = "\externalfigureparameter\c!prefix", - controls = "\externalfigureparameter\c!controls", - resources = "\externalfigureparameter\c!resources", - preview = "\externalfigureparameter\c!preview", - display = "\externalfigureparameter\c!display", - mask = "\externalfigureparameter\c!mask", - conversion = "\externalfigureparameter\c!conversion", - resolution = "\externalfigureparameter\c!resolution", - color = "\internalspotcolorparent{\externalfigureparameter\c!color}", % hack is needed - ["repeat"] = "\externalfigureparameter\c!repeat", - width = "\externalfigureparameter\c!width", % can be crap - height = "\externalfigureparameter\c!height", % can be crap - } }% - \ctxlua{figures.identify()}% - % also mode: checkpresense only - \ifconditional\c_grph_include_test_only - \ifcase\figurestatus \else - \ctxlua{figures.check()}% - \ctxlua{figures.dummy()}% - \ctxlua{figures.scale()}% - \ctxlua{figures.done()}% - \fi - \grph_include_set_mode - \else - \ifcase\figurestatus - \ctxlua{figures.dummy()}% - \ctxlua{figures.scale()}% - \else - \ctxlua{figures.check()}% - \ctxlua{figures.include()}% - \ctxlua{figures.scale()}% - \fi - \ctxlua{figures.done()}% - \grph_include_set_mode - \grph_include_finalize - \fi - \ctxlua{figures.pop()}% - \dotagfigure - \naturalvbox attr \imageattribute 2 {\box\foundexternalfigure}% - \dostoptagged - \egroup} - -%D Scaling: - -\let\dowithfigure\relax % name might change (into a proper hook) + \global\let\externalfigurelog\empty +\to \everyexternalfigureresets -\unexpanded\def\doscalefigure % used at lua end - {\global\setbox\foundexternalfigure\vbox{\scale[\v!figure]{\dowithfigure{\box\foundexternalfigure}}}} - -\definescale % some day we will inherit - [\v!figure] - [\c!hfactor =\externalfigureparameter\c!hfactor, - \c!wfactor =\externalfigureparameter\c!wfactor, - \c!factor =\externalfigureparameter\c!factor, - \c!maxwidth =\externalfigureparameter\c!maxwidth , - \c!maxheight =\externalfigureparameter\c!maxheight, - \c!equalwidth =\externalfigureparameter\c!equalwidth , - \c!equalheight=\externalfigureparameter\c!equalheight, - \c!xscale =\externalfigureparameter\c!xscale, - \c!yscale =\externalfigureparameter\c!yscale, - \c!scale =\externalfigureparameter\c!scale, - \c!sx =\externalfigureparameter\c!sx, - \c!sy =\externalfigureparameter\c!sy, - \c!s =\externalfigureparameter\c!s, - \c!width =\externalfigureparameter\c!width, - \c!height =\externalfigureparameter\c!height, - \c!lines =\externalfigureparameter\c!lines] - -% % this will become: -% -% \unexpanded\def\doscalefigure % used at lua end -% {\global\setbox\foundexternalfigure\vbox\bgroup -% \bgroup -% \let\currentscale\currentexternalfigure -% \let\scaleparameter\externalfigureparameter -% \dowithnextboxcs\grph_scale_finish\hbox{\dowithfigure{\box\foundexternalfigure}}% -% \egroup} -% -% % or even better: -% -% \def\grph_scale_inherited#1% -% {\bgroup -% \expandafter\let\expandafter\currentscale \csname current#1\endcsname -% \expandafter\let\expandafter\scaleparameter\csname #1parameter\endcsname -% \dowithnextboxcs\grph_scale_finish\hbox} -% -% \unexpanded\def\doscalefigure % used at lua end -% {\global\setbox\foundexternalfigure\vbox\bgroup -% \grph_scale_inherited{externalfigure}{\dowithfigure{\box\foundexternalfigure}}% -% \egroup} +\let\runutilityfiletrue \relax \let\runutilityfilefalse \relax +\let\consultutilityfiletrue\relax \let\consultutilityfilefalse\relax %D You can register additional suffixes with the following command: %D @@ -403,22 +57,19 @@ %D \stoptyping \unexpanded\def\definegraphictypesynonym - {\dodoubleargument\grph_include_set_type_synonym} + {\dodoubleargument\dodefinegraphictypesynonym} -\def\grph_include_set_type_synonym[#1][#2]% +\def\dodefinegraphictypesynonym[#1][#2]% {\ctxlua{figures.registersuffix("#1","#2")}} %D Additional paths can be installed with the regular setup command. The next %D macro picks up the list. -\unexpanded\def\setfigurepathlist - {\ctxlua{figures.setpaths("\externalfigureparameter\c!location",\!!bs\externalfigureparameter\c!directory\!!es)}} +\def\setfigurepathlist + {\ctxlua{figures.setpaths("\@@exlocation",\!!bs\@@exdirectory\!!es)}} %D Variables: -\newbox \foundexternalfigure -\newtoks\externalfigurepostprocessors - \def\defaultfigurewidth {8\lineheight} \def\defaultfigureheight {6\lineheight} @@ -461,84 +112,209 @@ \let\figurescalexscale \figurexscale \let\figurescaleyscale \figureyscale -%D Abuse: -%D -%D \starttyping -%D \externalfigure[rubish.pdf] \ifcase\figurestatus\relax \ctxlua{os.exit(999)} \fi -%D \stoptyping - -%D Calculating: - -% \enabletrackers[figures.conversion] -% \externalfigure[demo.svg] -% \externalfigure[demo.svg][conversion=png] - -%D The following registers are used (if only to be downward compatible). - -\newconditional\c_grph_include_skip -\newconditional\c_grph_include_test_only -\newconditional\c_grph_include_level \setfalse\c_grph_include_level % true=background false=normal -\newconditional\c_grph_include_flush \settrue \c_grph_include_flush % true=place false=ignore - -\newsystemmode\v!figure - -\def\grph_include_set_mode - {\ifcase\figurestatus - \global\resetsystemmode\v!figure % todo, also: \v!resource - \else - \global\setsystemmode \v!figure % todo, also: \v!resource - \fi} - \appendtoks - \ctxlua { % figures.defaultwidth .. maybe a dimen some day - figures.setpaths("\externalfigureparameter\c!location","\externalfigureparameter\c!directory") ; + \ctxlua { % figures.defaultwidth .. why not dimen + figures.setpaths("\@@exlocation","\@@exdirectory") ; figures.defaultwidth = \number\dimexpr\defaultfigurewidth \relax ; figures.defaultheight = \number\dimexpr\defaultfigureheight\relax ; figures.boxnumber = \number\foundexternalfigure ; }% \to \everyexternalfigureresets +%D In some situations we need to make sure that the figure related variables +%D are reset. This is especially important when we are nesting. Is this still +%D needed in \MKIV. + +\def\resetexternalfigures + {\let\@@efoption \empty % \let\@@efprefix\empty + \let\@@efmaxwidth \empty % \let\@@efcache \empty + \let\@@efmaxheight \empty % \let\@@efframe \v!off + \let\@@efforegroundcolor\empty + \let\@@efcolor \empty + \let\@@efconversion \empty + \let\@@efbackground \empty + \let\@@efresolution \empty} + +\appendtoks \resetexternalfigures \to \everyoverlay +\appendtoks \resetexternalfigures \to \everybeforepagebody % not really needed + +\def\resetfigureusersettings % if we use a command handler we can simply define a new instance + {% + \let\@@efmethod \empty + \let\@@eflabel \empty + \let\@@efsize \empty + \let\@@efconversion\@@exconversion + \let\@@efresolution\@@exresolution + \let\@@efprefix \@@exprefix + \let\@@efcache \@@excache + \let\@@efpage \!!zerocount + \let\@@efobject \@@exobject + \let\@@efdisplay \empty + \let\@@efmask \empty + % + \let\@@efpreset \v!yes + \let\@@efsplit \empty + \let\@@efcolor \empty + % + \let\@@efsymbol \v!no + % + \let\@@efcontrols \v!no + \let\@@efresources \empty + \let\@@efpreview \v!no + \let\@@efrepeat \v!no + % + \let\@@efforegroundcolor\empty + % + \let\@@efinteraction\@@exinteraction + % + \let\@@efhfactor \empty + \let\@@efwfactor \empty + \let\@@effactor \empty + \let\@@efmaxwidth \@@exmaxwidth + \let\@@efmaxheight \@@exmaxheight + \let\@@efxscale \empty + \let\@@efyscale \empty + \let\@@efscale \empty + \let\@@efsx \!!plusone + \let\@@efsy \!!plusone + \let\@@efwidth \empty + \let\@@efheight \empty + \let\@@eflines \empty + \let\@@efgrid \empty} + +\resetfigureusersettings + +\appendtoks + \resetfigureusersettings +\to \everyexternalfigureresets + +\def\checkfigureusersettings + {% old features + \doif\@@exoption\v!frame + {\let\@@efframe\v!on}% + \doif\@@exoption\v!empty + {\skipexternalfigurestrue + \let\@@efframe\v!off}% + \doifsomething\@@efwidth {\doifdimensionelse\@@efwidth {\edef\@@efwidth {\the\dimexpr\@@efwidth }}\donothing}% + \doifsomething\@@efheight{\doifdimensionelse\@@efheight{\edef\@@efheight{\the\dimexpr\@@efheight}}\donothing}% + % fake color in gray bitmaps, assumes that + % a transparent color is used + \doifsomething\@@efforegroundcolor + {\def\@@efbackground{\v!foreground,\v!color}% + \def\@@efbackgroundcolor{\@@efforegroundcolor}}} + \appendtoks - \edef\p_option{\externalfigureparameter\c!option}% - \ifx\p_option\v!frame - \setfalse\c_grph_include_skip - \letexternalfigureparameter\c!frame\v!on - \else\ifx\p_option\v!empty - \settrue\c_grph_include_skip - \letexternalfigureparameter\c!frame\v!off - \else - \setfalse\c_grph_include_skip - \fi\fi - % fake color in gray bitmaps, assumes that - % a transparent color is used - \edef\p_foregroundcolor{\externalfigureparameter\c!foregroundcolor}% - \ifx\p_foregroundcolor\empty \else - \setexternalfigureparameter\c!background{\v!foreground,\v!color}% - \letexternalfigureparameter\c!backgroundcolor\p_foregroundcolor - \fi + \checkfigureusersettings \to \everyexternalfigurechecks %D Internal graphics are handled at the \TEX\ end: -\def\grph_include_process_tex#1% +\def\doprocesstexlikefigure#1% retrofit into mkii {\global\setbox\foundexternalfigure\vbox\framed [\c!strut=\v!no,\c!align=\v!normal,\c!frame=\v!off, \c!offset=\v!overlay,\c!width=\v!fit,\c!height=\v!fit] {\blank[\v!disable]#1\endgraf\removelastskip}} % disable should stay here! -\def\grph_include_process_mps#1% retrofit into mkii +\def\doprocessmpslikefigure#1% retrofit into mkii {\global\setbox\foundexternalfigure\vbox{\convertMPtoPDF{#1}11}} -\def\grph_include_process_cld#1% +\def\doprocesscldlikefigure#1% {\global\setbox\foundexternalfigure\vbox{\cldprocessfile{#1}}} -\unexpanded\def\docheckfigurebuffer #1{\grph_include_process_tex{\getbuffer[#1]}} % used al lua end -\unexpanded\def\docheckfiguretex #1{\grph_include_process_tex{\input{#1}}} % used al lua end -\unexpanded\def\docheckfigurecld #1{\grph_include_process_cld{#1}} % used al lua end -\unexpanded\def\docheckfiguremps #1{\grph_include_process_mps{#1}} % used al lua end -\unexpanded\def\docheckfiguremprun #1#2{\grph_include_process_tex{\useMPrun{#1}{#2}}} % used al lua end +\def\docheckfigurebuffer #1{\doprocesstexlikefigure{\getbuffer[#1]}} +\def\docheckfiguretex #1{\doprocesstexlikefigure{\input{#1}}} +\def\docheckfigurecld #1{\doprocesscldlikefigure{#1}} % we can always add cldrun +\def\docheckfiguremps #1{\doprocessmpslikefigure{#1}} +\def\docheckfiguremprun #1#2{\doprocesstexlikefigure{\useMPrun{#1}{#2}}} + +% \def\doscalefigure +% {\global\setbox\foundexternalfigure\vbox{\doscalebox\??ef{\dowithfigure{\box\foundexternalfigure}}}} + +\def\doscalefigure + {\global\setbox\foundexternalfigure\vbox{\scale[\v!figure]{\dowithfigure{\box\foundexternalfigure}}}} + +% quick hack: chaining \??ef via \s!parent happens when this is also a commandhandler + +\definescale + [\v!figure] + [\c!hfactor =\@@efhfactor , + \c!wfactor =\@@efwfactor , + \c!factor =\@@effactor , + \c!maxwidth =\@@efmaxwidth , + \c!maxheight=\@@efmaxheight, + \c!xscale =\@@efxscale , + \c!yscale =\@@efyscale , + \c!scale =\@@efscale , + \c!sx =\@@efsx , + \c!sy =\@@efsy , + \c!width =\@@efwidth , + \c!height =\@@efheight , + \c!lines =\@@eflines ] + +\newconditional\testexternalfigureonly + +% \enabletrackers[figures.conversion] +% \externalfigure[demo.svg] +% \externalfigure[demo.svg][conversion=png] + +\unexpanded\def\calculateexternalfigure[#1][#2][#3][#4][#5][#6]% \cmd label filename parent_id preset current + {\dontcomplain + \restorecatcodes + \forgetall + \resetfigurevariables + \dosetefparameters{#4}{#5}{#6}% + \checkfigurevariables +% \begingroup +% \color[\@@efcolor]{\xdef\globcolorattr{\internalspotcolorname}} +% \endgroup + \ctxlua{figures.push { + name = "#3", + label = "#2", % todo: \@eflabel + page = "\@@efpage", + size = "\@@efsize", + object = "\@@efobject", + prefix = "\@@efprefix", + cache = "\@@efcache", + format = "\@@efmethod", + preset = "\@@efprefix", + controls = "\@@efcontrols", + resources = "\@@efresources", + preview = "\@@efpreview", + display = "\@@efdisplay", + mask = "\@@efmask", + conversion = "\@@efconversion", + resolution = "\@@efresolution", + color = "\internalspotcolorparent\@@efcolor", % hack is needed + ["repeat"] = "\@@efrepeat", + width = "\@@efwidth", % can be crap + height = "\@@efheight", % can be crap + } }% + \ctxlua{figures.identify()}% + % also mode: checkpresense only + \ifconditional\testexternalfigureonly + \ifcase\figurestatus \else + \ctxlua{figures.check()}% + \ctxlua{figures.dummy()}% + \ctxlua{figures.scale()}% + \ctxlua{figures.done()}% + \fi + \signalexternalfigure + \else + \ifcase\figurestatus + \ctxlua{figures.dummy()}% + \ctxlua{figures.scale()}% + \else + \ctxlua{figures.check()}% + \ctxlua{figures.include()}% + \ctxlua{figures.scale()}% + \fi + \ctxlua{figures.done()}% + \signalexternalfigure + \finishexternalfigure + \fi + \ctxlua{figures.pop()}} -\unexpanded\def\relocateexternalfigure % easier here than in lua +\def\relocateexternalfigure % easier here than in lua {\global\setbox\foundexternalfigure\vbox to \ht\foundexternalfigure\bgroup \vss \ht\foundexternalfigure\zeropoint @@ -548,24 +324,33 @@ \egroup \egroup} +\newsystemmode\v!figure + +\def\signalexternalfigure % global (dup call to status) + {\ifcase\figurestatus + \global\resetsystemmode\v!figure % todo, also: \v!resource + \else + \global\setsystemmode \v!figure % todo, also: \v!resource + \fi} + \unexpanded\def\startfoundexternalfigure#1#2% ht wd {\global\setbox\foundexternalfigure\vbox to #2\bgroup\vss\hbox to #1\bgroup} \unexpanded\def\stopfoundexternalfigure {\hss\egroup\egroup} -\unexpanded\def\emptyfoundexternalfigure % sort of obsolete +\def\emptyfoundexternalfigure {\startfoundexternalfigure\defaultfigurewidth\defaultfigureheight \stopfoundexternalfigure} -\def\grph_include_finalize +\def\finishexternalfigure % here we use \figurevariables {\global\setbox\foundexternalfigure\vbox {\ifcase\figurestatus - \letexternalfigureparameter\c!frame\v!on + \let\@@efframe\v!on \fi - \ifconditional\c_grph_include_flush - \ifconditional\c_grph_include_level % probably background - \ifconditional\c_grph_include_skip + \ifconditional\externalfigureflush + \ifconditional\externalfigurelevel % probably background + \ifskipexternalfigures % nothing \fakebox\foundexternalfigure \else\ifcase\figurestatus @@ -576,29 +361,28 @@ \fi\fi \else \iftrialtypesetting \else \feedbackexternalfigure \fi - \settrue\c_grph_include_level - \ifconditional\c_grph_include_skip + \settrue\externalfigurelevel + \ifskipexternalfigures \ifcase\figurestatus - \grph_include_replacement\figurelabel\figurefileoriginal{unknown}% + \externalfigurereplacement\figurelabel\figurefileoriginal{unknown}% \else - \grph_include_replacement\figurelabel\figurefullname{skipped}% + \externalfigurereplacement\figurelabel\figurefullname{skipped}% \fi \else\ifcase\figurestatus - \grph_include_replacement\figurelabel\figurefileoriginal{unknown}% + \externalfigurereplacement\figurelabel\figurefileoriginal{unknown}% \else \the\externalfigurepostprocessors - \edef\p_reset{\externalfigureparameter\c!reset}% - \ifx\p_reset\v!yes - \wd\foundexternalfigure\figurewidth - \ht\foundexternalfigure\figureheight - \dp\foundexternalfigure\zeropoint - \box\foundexternalfigure - \else - \letexternalfigureparameter\c!offset\v!overlay - \letexternalfigureparameter\c!width \figurewidth - \letexternalfigureparameter\c!height\figureheight - \inheritedexternalfigureframed{\vfilll\box\foundexternalfigure}% - \fi + \doifelse\@@efreset\v!yes + {\wd\foundexternalfigure\figurewidth + \ht\foundexternalfigure\figureheight + \dp\foundexternalfigure\zeropoint + \box\foundexternalfigure} + {\localframed % should also be applied to high res ! + [\??ef] + [\c!offset=\v!overlay, + \c!width=\figurewidth, + \c!height=\figureheight] + {\vfilll\box\foundexternalfigure}}% \fi\fi \fi \else @@ -606,17 +390,35 @@ \iftrialtypesetting \else \feedbackexternalfigure \fi \fi}} -\let\feedbackexternalfigure\relax % hook +\ifx\externalfigurereplacement\undefined\let\externalfigurereplacement\gobblethreearguments\fi +\ifx\externalfigureplaceholder\undefined\let\externalfigureplaceholder\gobblethreearguments\fi -\unexpanded\def\getfiguredimensions - {\dodoubleempty\grph_include_get_dimensions} +\let\feedbackexternalfigure\relax % \gobblefourarguments +\let\dowithfigure \relax -\def\grph_include_get_dimensions[#1][#2]% +\def\getfiguredimensions + {\dodoubleempty\dogetfiguredimensions} + +\def\dogetfiguredimensions[#1][#2]% {\startnointerference - \settrue\c_grph_include_test_only + \settrue\testexternalfigureonly \externalfigure[#1][#2,\c!display=,\c!mask=,\c!object=\v!no]% \stopnointerference} +\let\getfiguredimensionsonly\getfiguredimensions + +% \unexpanded\def\doiffigureelse#1% +% {\getfiguredimensions[#1]% so data is available ! +% \ifdim\figurewidth=\zeropoint % todo: \figurestatus +% \expandafter\secondoftwoarguments +% \else +% \expandafter\firstoftwoarguments +% \fi} + +% \unexpanded\def\doiffigureelse#1% just low level call +% {\getfiguredimensions[#1]% so data is available ! ... grouped so status is local +% \doifmodeelse{*\v!figure}\firstoftwoarguments\secondoftwoarguments} % mode is set global + \unexpanded\def\doiffigureelse#1% {\getfiguredimensions[#1]% so data is available ! \ifcase\figurestatus @@ -625,137 +427,74 @@ \expandafter\firstoftwoarguments \fi} -% No placement, handy for preprocessing: +\def\registerexternalfigure % no placement, handy for preprocessing + {\dotripleempty\doregisterexternalfigure} -\unexpanded\def\registerexternalfigure - {\dotripleempty\grph_include_register} - -\def\grph_include_register[#1][#2][#3]% +\def\doregisterexternalfigure[#1][#2][#3]% {\startnointerference - \c_grph_include_test_only - \setfalse\c_grph_include_flush % == test ? - \externalfigure[#1][#2][#3]% or + \testexternalfigureonly + \setfalse\externalfigureflush % == test ? + \externalfigure[#1][#2][#3]% or \doexternalfigure \externalfigure[#1][#2,\c!display=,\c!mask=,\c!object=\v!no]% \stopnointerference} -% Helpers (will be replaced when xforms are accessible at the lua end) +% helpers (will be replaced when xforms are accessible at the lua end) -\unexpanded\def\dosetfigureobject#1% +\def\dosetfigureobject#1% {\setobject{FIG}{#1}\vbox{\box\foundexternalfigure}} -\unexpanded\def\doboxfigureobject#1% +\def\doboxfigureobject#1% {\global\setbox\foundexternalfigure\vbox{\getobject{FIG}{#1}}} % probably one vbox too many -% Figure bases +% figurebases -\unexpanded\def\usefigurebase[#1]% +\def\usefigurebase[#1]% {\ctxlua{figures.bases.use("#1")}} -\appendtoks - \setfigurepathlist % the path may be used elsewhere too (as in x-res-04) -\to \everysetupexternalfigure - -\appendtoks - \ctxcommand{setfigurelookuporder("\externalfigureparameter\c!order")}% -\to \everysetupexternalfigure - -\definecolor[missingfigurecolor][s=.8] - -\def\grph_include_replacement#1#2#3% - {\bgroup - \letexternalfigureparameter\c!width\figurewidth - \letexternalfigureparameter\c!height\figureheight - \letexternalfigureparameter\c!background\v!color - \setexternalfigureparameter\c!backgroundcolor{missingfigurecolor}% - \inheritedexternalfigureframed - {\tt\tfxx \nohyphens - name: \expanded{\verbatimstring{#1}}\\% - file: \expanded{\verbatimstring{#2}}\\% - state: \expanded{\verbatimstring{#3}}}% - \egroup} - -% maybe setuphandler - -\newconditional\c_grph_include_in_collection - -\newdimen\d_grph_include_collection_minwidth -\newdimen\d_grph_include_collection_maxwidth -\newdimen\d_grph_include_collection_minheight -\newdimen\d_grph_include_collection_maxheight - -\def\grph_include_analyze_collection[#1][#2]% - {\ifconditional\c_grph_include_in_collection - \setfalse\c_grph_include_in_collection - \getfiguredimensions[#1][#2]% - \settrue\c_grph_include_in_collection - \scratchdimen\naturalfigurewidth - \ifdim\scratchdimen>\d_grph_include_collection_maxwidth \d_grph_include_collection_maxwidth \scratchdimen \fi - \ifdim\scratchdimen<\d_grph_include_collection_minwidth \d_grph_include_collection_minwidth \scratchdimen \fi - \scratchdimen\naturalfigureheight - \ifdim\scratchdimen>\d_grph_include_collection_maxheight \d_grph_include_collection_maxheight\scratchdimen \fi - \ifdim\scratchdimen<\d_grph_include_collection_minheight \d_grph_include_collection_minheight\scratchdimen \fi - \fi} - -\unexpanded\def\startexternalfigurecollection[#1]% - {\begingroup - \def\currentexternalfigurecollection{#1}% - \settrue\c_grph_include_in_collection - \d_grph_include_collection_minwidth \maxdimen - \d_grph_include_collection_maxwidth \zeropoint - \d_grph_include_collection_minheight\maxdimen - \d_grph_include_collection_maxheight\zeropoint} - -\unexpanded\def\stopexternalfigurecollection - {\setxvalue{\??externalfigurecollection\currentexternalfigurecollection:\c!minwidth }{\the\d_grph_include_collection_minwidth }% - \setxvalue{\??externalfigurecollection\currentexternalfigurecollection:\c!maxwidth }{\the\d_grph_include_collection_maxwidth }% - \setxvalue{\??externalfigurecollection\currentexternalfigurecollection:\c!minheight}{\the\d_grph_include_collection_minheight}% - \setxvalue{\??externalfigurecollection\currentexternalfigurecollection:\c!maxheight}{\the\d_grph_include_collection_maxheight}% - \endgroup} - -\def\externalfigurecollectionparameter#1#2% - {\csname - \ifcsname\??externalfigurecollection#1:#2\endcsname - \??externalfigurecollection#1:#2% - \else - \s!empty - \fi - \endcsname} - -\def\externalfigurecollectionminwidth #1{\externalfigurecollectionparameter{#1}\c!minwidth } -\def\externalfigurecollectionmaxwidth #1{\externalfigurecollectionparameter{#1}\c!maxwidth } -\def\externalfigurecollectionminheight#1{\externalfigurecollectionparameter{#1}\c!minheight} -\def\externalfigurecollectionmaxheight#1{\externalfigurecollectionparameter{#1}\c!maxheight} - -\let\efcparameter\externalfigurecollectionparameter % still needed ? -\let\efcminwidth \externalfigurecollectionminwidth % still needed ? -\let\efcmaxwidth \externalfigurecollectionmaxwidth % still needed ? -\let\efcminheight\externalfigurecollectionminheight % still needed ? -\let\efcmaxheight\externalfigurecollectionmaxheight % still needed ? - -% \startexternalfigurecollection[name] -% \useexternalfigure[cow] [cow.pdf] -% \useexternalfigure[mill][mill.png] -% \stopexternalfigurecollection -% \starttext -% \bTABLE -% \bTR -% \bTD \externalfigure[cow] [height=\externalfigurecollectionmaxheight{name}] \eTD -% \bTD \externalfigure[mill][height=\externalfigurecollectionmaxheight{name}] \eTD -% \eTR -% \eTABLE -% \stoptext - -\unexpanded\def\showexternalfigures - {\writestatus\m!system{the \string\showexternalfigures\space command is not (yet) implemented in mkiv}} - -\unexpanded\def\overlayfigure#1% - {\externalfigure[#1][\c!width=\overlaywidth,\c!height=\overlayheight]} - -% Bonus: - -\useexternalfigure - [buffer] - [\jobname.buffer] - [\c!object=\v!no] - \protect \endinput + +% \startbuffer +% \definecolor [blue] [c=1,m=.38,y=0,k=.64] +% \definecolor [yellow] [c=0,m=.28,y=1,k=.06] +% +% \definespotcolor [blue-100] [blue] [p=1] +% \definespotcolor [yellow-100] [yellow] [p=1] +% +% \definemultitonecolor [combicolor] [blue=.12,yellow=.28] [c=.1,m=.1,y=.3,k=.1] +% +% \definemultitonecolor [combicolor-b] [blue=1] [c=1,m=.38,y=0,k=.64] % force multitone +% \definemultitonecolor [combicolor-y] [yellow=1] [c=0,m=.28,y=1,k=.06] % force multitone +% +% \useexternalfigure[demo-a][mill.png] [object=no,width=.2\textwidth] +% \useexternalfigure[demo-b][hacker-bw.jpg][object=no,width=.2\textwidth] +% +% \startbaselinecorrection \startcombination[4*1] +% {\externalfigure[demo-a]} {no color} +% {\externalfigure[demo-a][color=combicolor]} {indexed duotone} +% {\externalfigure[demo-a][color=combicolor-b]} {spot color} +% {\externalfigure[demo-a][color=combicolor-y]} {spot color} +% \stopcombination \stopbaselinecorrection +% +% \startbaselinecorrection \startcombination[4*1] +% {\externalfigure[demo-b]} {no color} +% {\externalfigure[demo-b][color=combicolor]} {indexed duotone} +% {\externalfigure[demo-b][color=combicolor-b]} {spot color} +% {\externalfigure[demo-b][color=combicolor-y]} {spot color} +% \stopcombination \stopbaselinecorrection +% +% \startbaselinecorrection \startcombination[4*1] +% {\externalfigure[demo-a]} {no color} +% {\externalfigure[demo-a][color=combicolor]} {indexed duotone} +% {\externalfigure[demo-a][color=blue-100]} {spot color} +% {\externalfigure[demo-a][color=yellow-100]} {spot color} +% \stopcombination \stopbaselinecorrection +% +% \startbaselinecorrection \startcombination[4*1] +% {\externalfigure[demo-b]} {no color} +% {\externalfigure[demo-b][color=combicolor]} {indexed duotone} +% {\externalfigure[demo-b][color=blue-100]} {spot color} +% {\externalfigure[demo-b][color=yellow-100]} {spot color} +% \stopcombination \stopbaselinecorrection +% \stopbuffer +% +% \getbuffer \typebuffer |