%D \module
%D   [       file=back-ini,
%D        version=2009.04.15,
%D          title=\CONTEXT\ Backend Macros,
%D       subtitle=Initialization,
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.

%D Most will go away here as it is replaced by \LUA\ calls to
%D backend functions.

\writestatus{loading}{ConTeXt Backend Macros / Initialization}

\registerctxluafile{back-ini}{1.001}

%D We currently have a curious mix between tex and lua backend
%D handling but eventually most will move to lua.

\unprotect

\ifdefined\everybackendshipout       \else \newtoks\everybackendshipout       \fi
\ifdefined\everylastbackendshipout   \else \newtoks\everylastbackendshipout   \fi
\ifdefined\everybackendlastinshipout \else \newtoks\everybackendlastinshipout \fi % e.g. finalize via latelua

%D Right from the start \CONTEXT\ had a backend system based on
%D runtime pluggable code. As most backend issues involved specials
%D and since postprocessors had not that much in common, we ended up
%D with a system where we could switch backend as well as output code
%D for multiple backends at the same time.
%D
%D Because \LUATEX\ has the backend built in, and since some backend
%D issues have been moved to the frontend I decided to provide new
%D backend code for \MKIV, starting with what was actually used.
%D
%D At this moment \DVI\ is no longer used for advanced document
%D output and we therefore dropped support for this format. Future
%D versions might support more backends again, but this has a low
%D priority.
%D
%D The big question is: what is to be considered a backend issue and
%D what not. For the moment we treat image inclusion, object reuse,
%D position tracking and color as frontend issues, if only because we
%D deal with them via \LUA\ code and as such we don't depend too much
%D on macro calls that need to inject code for the backend.
%D
%D Not everything here makes sense and the content of this file will
%D definitely change.

\let \dostartrotation   \gobbleoneargument
\let \dostoprotation    \donothing
\let \dostartscaling    \gobbletwoarguments
\let \dostopscaling     \donothing
\let \dostartmirroring  \donothing
\let \dostopmirroring   \donothing
\let \dotransformnextbox\gobblesixarguments % and pass last box

%D \macros
%D   {back_ovalbox}
%D
%D When we look at the implementation, this is a complicated
%D one. There are seven arguments.
%D
%D \starttyping
%D \back_ovalbox {w} {h} {d} {linewidth} {radius} {stroke} {fill} {variant}
%D \stoptyping
%D
%D This command has to return a \type{\vbox} which can be used
%D to lay over another one (with text). The radius is in
%D degrees, the stroke and fill are~\type{1} (true) of~\type{0}
%D (false).

\let\back_ovalbox \gobbleeightarguments

%D \macros
%D   {dostartclipping,dostopclipping}
%D
%D Clipping is implemented in such a way that an arbitrary code
%D can be fed.
%D
%D \starttyping
%D \dostartclipping {pathname} {width} {height}
%D \dostopclipping
%D \stoptyping

\let \dostartclipping \gobblethreearguments
\let \dostopclipping  \donothing

%D \macros
%D   {dostartobject,
%D    dostopobject,
%D    doresetobjects,
%D    doinsertobject}
%D
%D Reuse of object can reduce the output filesize
%D considerably. Reusable objects are implemented with:
%D
%D \starttyping
%D \dostartobject{class}{name}{width}{height}{depth}
%D some typeset material
%D \dostopobject
%D \stoptyping
%D
%D \starttyping
%D \doinsertobject{class}{name}
%D \stoptyping
%D
%D The savings can be huge in interactive texts. The next macro needs
%D to be called after a graphic is inserted (in order to clean up
%D global references).
%D
%D \starttyping
%D \doresetobjects
%D \stoptyping

\let \dostartobject   \gobblefourarguments
\let \dostopobject    \donothing
\let \doinsertobject  \gobbletwoarguments
\let \doresetobjects  \donothing

%D From now on, mapfile loading is also a special; we assume the
%D more or less standard dvips syntax.

%let \doresetmapfilelist \donothing
%let \doloadmapfile      \gobbletwoarguments % + - = | filename
%let \doloadmapline      \gobbletwoarguments % + - = | fileline

%D \macros
%D   {jobsuffix}
%D
%D By default, \TEX\ produces \DVI\ files which can be
%D converted to other filetypes. Sometimes it is handy to
%D know what the target file will be. In other driver
%D modules we wil set \type {\jobsuffix} to \type {pdf}.

%D Backend configuration:

\installcorenamespace{backend}

\installsetuponlycommandhandler \??backend {backend}

\let\jobsuffix\empty

\unexpanded\def\back_job_set_suffix#1% % checking could happen in mode
  {\ifx\jobsuffix\empty\else\resetsystemmode\jobsuffix\fi
   \edef\jobsuffix{#1}%
   \ifx\jobsuffix\empty\else\setsystemmode  \jobsuffix\fi}

\back_job_set_suffix{pdf} % default

% \setupbackend[space=yes] % replace spacing in (pdf) file

\appendtoks
    \clf_setrealspaces{\backendparameter\c!space}%
\to \everysetupbackend

%D For older styles:

\let\setupoutput\gobbleoneoptional

\protect \endinput
