%D \module
%D   [       file=spec-xtx,
%D        version=2004.11.08,
%D          title=\CONTEXT\ Special Macros,
%D       subtitle=\XETEX\ support,
%D         author={Adam Lindsay \& Hans Hagen \& \unknown},
%D           date=\currentdate,
%D      copyright={Adam Lindsay \& Hans Hagen}]

\unprotect

\startspecials[xetex][reset,dpx]

%D Actually, there's an intermediate ``\type{xdv}''
%D output format, but by default, it's tranparently
%D converted to \PDF\ by \XETEX.

\setjobsuffix{pdf}

%D Rotation looks fine.

\definespecial\dostartrotation#1%
  {\special{x:gsave}\special{x:rotate #1}}

\definespecial\dostoprotation%
  {\special{x:grestore}}

%D Scaling and mirroring are also fine.

\definespecial\dostartscaling#1#2%
  {\special{x:gsave}\special{x:scale #1 #2}}

\definespecial\dostopscaling%
  {\special{x:grestore}}

\definespecial\dostartmirroring%
  {\special{x:gsave}\special{x:scale -1 1}}

\definespecial\dostopmirroring%
  {\special{x:grestore}}

%D Colors are done with the \DVIPDFMX\ color model, which are
%D inherited.

%D Although hex colors were accommodated by Hans, we'll try the
%D more familiar \DVIPDFMX\ ones. One good side-effect of the
%D previous approach
%D was that it kept track of the color state (transparency
%D in XeTeX is accomplished setting the color to an RGBA quadruple,
%D rather than an RGB triple). So transparency will need another
%D plan.

% \macros
%   {dostarttransparency,dostoptransparency}
%
% \starttypen
% \dostarttransparency{fraction}{type}
% \dostoptransparency
% \stoptypen
%
% Although in \CONTEXT\ transparency is closely integrated
% in the color drivers, in the end it is an independent
% feature.

%\installspecial [\dostarttransparency] [or] [2]
%\installspecial [\dostoptransparency]  [or] [0]

%D \macros
%D   {doloadmapfile,doloadmapline,doresetmapfilelist}
%D
%D \XETEX\ 0.91 allows map file additions, via a special.

\definespecial\doresetmapfilelist{\special{x:fontmapfile original-empty.map}}
\definespecial\doloadmapfile #1#2{\special{x:fontmapfile #1#2}}
\definespecial\doloadmapline #1#2{\special{x:fontmapline #1#2}}

%D \XETEX\ supports \type{\doPDFdestination} and
%D \type{\doPDFbookmark} inherited straight from \DVIPDFMX.

\definespecial\doinsertfile#1#2#3#4#5#6#7#8#9%
  {\bgroup
   \dodoinsertfile{xtx}{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}{#9}%
   \egroup}

\definefileinsertion{xtx}{jpg}{\xtxhandleotherimage}
\definefileinsertion{xtx}{png}{\xtxhandleotherimage}
\definefileinsertion{xtx}{gif}{\xtxhandleotherimage}
\definefileinsertion{xtx}{tif}{\xtxhandleotherimage}
\definefileinsertion{xtx}{pdf}{\xtxhandlepdfimage  }

\def\xtxhandleotherimage#1#2#3#4#5#6#7#8#9%
  {\bgroup % not needed, we load this under a normal catcode regime; \catcode`\"=11
   \XeTeXpicfile "#1" width #7 height #8\relax%
   \donetrue
   \egroup}

\def\xtxhandlepdfimage#1#2#3#4#5#6#7#8#9%
  {\bgroup % not needed, we load this under a normal catcode regime; \catcode`\"=11
   \checkpdfimagepagenumber{#9}
   \XeTeXpdffile "#1" \pdfimagepagenumber\space width #7 height #8  \relax%
   \donetrue
   \egroup}

\def\checkpdfimagepagenumber#1%
  {\let\pdfimagepagenumber\empty
   \getfromcommacommand[#1][1]%
   \doifnumberelse\commalistelement
     {\ifcase\commalistelement\else
        \edef\pdfimagepagenumber{page \commalistelement}%
        %\message{(pdf image \pdfimagepagenumber)}%
      \fi}
     {}}

% \type{\getfiguredimensionsA} calls this one.
% \type{\executedtrue} means it was able to get the desired
% dogetfiguresizeBLAH method for the image type.
% \type{\donetrue} means that the image was successfully
% measured to be more than zero points.

\def\dogetXTXfiguresize#1#2#3#4#5#6#7%
    {#4\zeropoint
     #5\zeropoint
     \setbox\foundexternalfigure\vbox{\XeTeXpicfile "#2"}%
     #6\wd\foundexternalfigure
     #7\ht\foundexternalfigure
     \ifdim\wd\foundexternalfigure=\zeropoint % \ifzeropt\wd\foundexternalfigure
       #1{#2}{#3}{#4}{#5}{#6}{#7}%
     \fi}

\def\dogetXTXpdfsize#1#2#3#4#5#6#7%
    {#4\zeropoint
     #5\zeropoint
     \checkpdfimagepagenumber{#3}
     \setbox\foundexternalfigure\vbox{\XeTeXpdffile "#2" \pdfimagepagenumber}% \relax not needed
     #6\wd\foundexternalfigure
     #7\ht\foundexternalfigure
     \ifdim\wd\foundexternalfigure=\zeropoint % \ifzeropt\wd\foundexternalfigure
       #1{#2}{#3}{#4}{#5}{#6}{#7}%
     \fi}

\let\normaldogetfiguresizepng=\dogetfiguresizepng
\let\normaldogetfiguresizetif=\dogetfiguresizetif
\let\normaldogetfiguresizejpg=\dogetfiguresizejpg
\let\normaldogetfiguresizegif=\dogetfiguresizegif
\let\normaldogetfiguresizepdf=\dogetfiguresizepdf

\def\dogetfiguresizepng{\dogetXTXfiguresize\normaldogetfiguresizepng}
\def\dogetfiguresizejpg{\dogetXTXfiguresize\normaldogetfiguresizejpg}
\def\dogetfiguresizegif{\dogetXTXfiguresize\normaldogetfiguresizegif}
\def\dogetfiguresizetif{\dogetXTXfiguresize\normaldogetfiguresizetif}
\def\dogetfiguresizepdf{\dogetXTXpdfsize\normaldogetfiguresizepdf}

\appendtoksonce
  \let\dogetfiguresizepng\normaldogetfiguresizepng
  \let\dogetfiguresizetif\normaldogetfiguresizetif
  \let\dogetfiguresizejpg\normaldogetfiguresizejpg
  \let\dogetfiguresizegif\normaldogetfiguresizegif
  \let\dogetfiguresizepdf\normaldogetfiguresizepdf
\to \everyresetspecials

%D The figure object system caused no end of headaches. They all
%D went away with this single line:

\setupexternalfigures[\c!object=\v!no]

\stopspecials

\protect

%\endinput

% FOR THE MOMENT HERE

\ifx\dqfontquote\undefined \else \endinput \fi

\unprotect

% actually, we can use "" in pdftex> 1.20 as well

\def\parsefontspec#1%
  {\xdef\somefontspec{#1\space}%
   \@EA\doparsefontspec\somefontspec\relax]% =>#1 \empty]
   \donoparsefontspec}

\def\doparsefontspec#1%
  {\ifx"#1%
     \@EA\dodqparsefontspec
   \else\ifx'#1%
     \@EAEAEA\dosqparsefontspec
   \else
     \@EAEAEA\dodoparsefontspec
   \fi\fi#1}

\def\dqfontquote{"}
\def\sqfontquote{'}

\def\dodqparsefontspec"#1"#2%
  {\def\somefontname{#1}%
   \let\somefontquote\dqfontquote
   \ifx#2\relax\@EA\setnaturalfontspec\else\@EA\setforcedfontspec\fi#2}

\def\dosqparsefontspec'#1'#2%
  {\def\somefontname{#1}%
   \let\somefontquote\sqfontquote
   \ifx#2\relax\@EA\setnaturalfontspec\else\@EA\setforcedfontspec\fi#2}

\def\dodoparsefontspec#1 #2%
  {\def\somefontname{#1}%
   \let\somefontquote\empty
   \ifx\somefontname\empty % space before fontname
     \@EA\doparsefontspec
   \else\ifx#2\relax
     \@EAEAEA\setnaturalfontspec
   \else
     \@EAEAEA\setforcedfontspec
   \fi\fi
   #2}

\def\setnaturalfontspec#1]%
  {\@fs@scaled\plusthousand\relax}

\def\setforcedfontspec#1 #2\relax]%
  {\csname\@fs@#1\endcsname#2\relax}

\beginXETEX \font

\def\donoparsefontspec % #1 == \cs
  {\edef\fontfile{\somefontquote\truefontname\somefontname\somefontquote}%
   \ifx\fontfile\s!unknown \let\fontfile\defaultfontfile \fi
   \edef\lastfontname{\fontfile\somefontspec}%
   \ifx\fontclass\empty
     \expandafter\definefontlocal
   \else
     \expandafter\definefontglobal
   \fi} % #1 == \cs

\endXETEX

\protect \endinput

\starttext

\definedfont[{cmr10}  at 40pt] test
\definedfont['cmss10' at 40pt] test
\definedfont["cmtt10" at 40pt] test

\definedfont[{cmr10}  at 40pt] test
\definedfont['cmss10' at 40pt] test
\definedfont["cmtt10" at 40pt] test

% \definedfont["Gentium" at 40pt] test

\stoptext

