%D \module
%D   [       file=mlib-pdf,
%D        version=2008.03.25,
%D          title=\METAPOST\ Integrated Graphics,
%D       subtitle=Conversion to PDF,
%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.

\unprotect

%D We use bit more code that needed because we want to limit the amount of boxing.

\registerctxluafile{mlib-pdf}{autosuffix}

%D Some code is shared between MPLIB and MPS. The following variables are also
%D available for introspection and other purposes.

\newdimension\MPwidth
\newdimension\MPheight

\newdimension\MPllx
\newdimension\MPlly
\newdimension\MPurx
\newdimension\MPury

\ifdefined\MPbox\else \newbox\MPbox\fi

\permanent\protected\def\setMPboundingbox#1#2#3#4% at some point we might pass them as base or scaled points
  {\global\MPllx   #1\onebasepoint
   \global\MPlly   #2\onebasepoint
   \global\MPurx   #3\onebasepoint
   \global\MPury   #4\onebasepoint
   \global\MPwidth \dimexpr\MPurx-\MPllx\relax
   \global\MPheight\dimexpr\MPury-\MPlly\relax}

\permanent\protected\def\resetMPboundingbox
  {\global\MPwidth \zeropoint
   \global\MPheight\zeropoint
   \global\MPllx   \zeropoint
   \global\MPlly   \zeropoint
   \global\MPurx   \zeropoint
   \global\MPury   \zeropoint}

\permanent\protected\lettonothing\popMPboundingbox

\permanent\protected\def\pushMPboundingbox
  {\enforced\permanent\protected\edef\popMPboundingbox
     {\global\MPwidth \the\MPwidth
      \global\MPheight\the\MPheight
      \global\MPllx   \the\MPllx
      \global\MPlly   \the\MPlly
      \global\MPurx   \the\MPurx
      \global\MPury   \the\MPury
      \relax}}

% we need to combine these

\permanent\protected\def\repositionMPboxindeed
  {\setbox\MPbox\hpack\bgroup
     \kern-\MPllx
     \raise-\MPlly
     \box\MPbox
   \egroup}

\permanent\protected\def\repositionMPbox
  {\ifzeropt\MPllx
     \ifzeropt\MPlly
       % okay
     \else
       \repositionMPboxindeed
     \fi
   \else
     \repositionMPboxindeed
   \fi}

% combined

\permanent\protected\def\finalizeMPbox
  {\boxxoffset\MPbox-\MPllx\relax
   \boxyoffset\MPbox\dimexpr\boxyoffset\MPbox-\MPheight-\MPlly\relax
   \wd\MPbox\MPwidth
   \ht\MPbox\MPheight}

% MPLIB specific:

% \permanent\protected\def\startMPLIBtoPDF#1#2#3#4%
%   {\meta_process_graphic_figure_start
%    \dostarttagged\t!mpgraphic\empty
%    \naturalhpack attr \imageattribute \plusone \bgroup
%    \dousecolorparameter\s!black\forcecolorhack
%    \setMPboundingbox{#1}{#2}{#3}{#4}%
%    \setbox\MPbox\vpack\bgroup
%  % \forgetall % already done elsewhere
%    \noindent} % forces the proper cm in the backend

\permanent\protected\def\startMPLIBtoPDF#1#2#3#4%
  {\meta_process_graphic_figure_start
   \dostarttagged\t!mpgraphic\empty
   \naturalhpack attr \imageattribute \plusone \bgroup
   \dousecolorparameter\s!black
   \setMPboundingbox{#1}{#2}{#3}{#4}%
   \setbox\MPbox\vpack\bgroup
   \noindent} % forces the proper cm in the backend

\permanent\protected\def\stopMPLIBtoPDF
  {\egroup
   \finalizeMPbox
   \box\MPbox
   \egroup
   \dostoptagged
   \meta_process_graphic_figure_stop}

%D Kind of special:
%
% test.mp:
%
% beginfig(1) fill fullcircle scaled 10cm withcolor red  ; endfig ;
% beginfig(2) draw fullcircle scaled  5cm withcolor blue ; endfig ;
% beginfig(3) draw textext("just some text")             ; endfig ;
%
% standalone pages:
%
% \starttext
%     \directMPgraphic{input "test.mp" ;}
% \stoptext

\aliased\let\normalstartMPLIBtoPDF\startMPLIBtoPDF
\aliased\let\normalstopMPLIBtoPDF \stopMPLIBtoPDF

\permanent\protected\def\directstartMPLIBtoPDF{\startTEXpage\normalstartMPLIBtoPDF}
\permanent\protected\def\directstopMPLIBtoPDF {\normalstopMPLIBtoPDF\stopTEXpage}

% can become \permanent\protected\def\directMPgraphic#=#*#=% but best test first

\permanent\protected\def\directMPgraphic
  {\dodoublegroupempty\mlib_direct_graphic}

\def\mlib_direct_graphic#1#2% makes pages (todo: make boxes)
  {\meta_begin_graphic_group{#1}%
   \enforced\let\startMPLIBtoPDF\directstartMPLIBtoPDF
   \enforced\let\stopMPLIBtoPDF \directstopMPLIBtoPDF
   \meta_start_current_graphic
     \forgetall
     \edef\p_extensions{\MPinstanceparameter\s!extensions}%
     \normalexpanded{\noexpand\clf_mpgraphic
         instance        {\currentMPinstance}%
         format          {\currentMPformat}%
         data            {#2;}%
         initializations {\meta_flush_current_initializations}%
    \ifx\p_extensions\v!yes
         extensions      {\clf_getmpextensions{\currentMPinstance}}%
    \fi
         inclusions      {\meta_flush_current_inclusions}%
         definitions     {\meta_flush_current_definitions}%
         figure          {all}%
         method          {\MPinstanceparameter\c!method}%
     \relax}%
   \meta_stop_current_graphic
   \meta_end_graphic_group}

\protect \endinput

