On Thu, 1 May 2014, Mikael P. Sundqvist wrote:
\startluacode
userdata = userdata or {}
function userdata.lundklippfyllbild(str, bredd, hojd)
if tex.dimen[0] / tex.dimen[2] < tex.dimen[4] / tex.dimen[6] then
     local skalning =
-0.5*(tex.dimen[4]/tex.dimen[0]*tex.dimen[2]-tex.dimen[6])
     context("\\vskip%ssp", skalning)
     context.externalfigure({str},{width=bredd})
     context.sprint("foo")
else
     local skalning =
-0.5*(tex.dimen[6]/tex.dimen[2]*tex.dimen[0]-tex.dimen[4])
     context("\\hskip%ssp", skalning)
     context.externalfigure({str},{height=hojd})
     context.sprint("bar")
end
end
\stopluacode

\unexpanded\def\lundklippfyllbild#1#2#3{%
\startexternalfigurecollection[#1]%
\useexternalfigure[#1][#1]%
\stopexternalfigurecollection%
\clip[
width=#2,
height=#3,
hoffset=0mm,
voffset=0mm,
]{%
\framed[width=#2,height=#3,align={middle,lohi},offset=overlay,frame=off]{%
\dimen0=\externalfigurecollectionminwidth{#1}%
\dimen2=\externalfigurecollectionmaxheight{#1}%
\dimen4=#2%
\dimen6=#3%
{\ctxlua{userdata.lundklippfyllbild([==[#1]==],[==[#2]==],[==[#3]==])}}}}}



and then run


\lundklippfyllbild{k.jpg}{\textwidth}{\textheight}

Here is an eTeX solution.

\unprotect

\newdimen\d_scaleandclip_actual_wd
\newdimen\d_scaleandclip_actual_ht

\newdimen\d_scaleandclip_requested_wd
\newdimen\d_scaleandclip_requested_ht

\newbox\scaleandclip_box

\installnamespace{scaleandclip}
\installcommandhandler \????scaleandclip {scaleandclip} \????scaleandclip

\setupscaleandclip
  [width=\textwidth,
   height=\textheight]

\unexpanded\def\scaleandclip{\dodoubleempty\doscaleandclip}

\def\doscaleandclip[#1][#2]%
  {\bgroup
   \ifsecondargument
      \edef\currentscaleandclip{#1}%
      \setupcurrentscaleandclip[#2]%
   \else\iffirstargument
      \doifassignmentelse{#1}
          {\let\currentscaleandclip\empty
           \setupcurrentscaleandclip[#1]}
          {\edef\currentscaleandclip{#1}}
    \else
      \let\currentscaleandclip\empty
    \fi\fi
    \dowithnextboxcs\scaleandclip_finish\hbox}

\def\scaleandclip_finish
    {%
      \d_scaleandclip_requested_wd \dimexpr\scaleandclipparameter\c!width\relax
      \d_scaleandclip_requested_ht \dimexpr\scaleandclipparameter\c!height\relax
      %
      \d_scaleandclip_actual_wd\wd\nextbox
      \d_scaleandclip_actual_ht\dimexpr\ht\nextbox + \dp\nextbox\relax
      %
      \ifdim\dimexpr\d_scaleandclip_actual_wd*100/\d_scaleandclip_requested_wd <
            \dimexpr\d_scaleandclip_actual_ht*100/\d_scaleandclip_requested_ht 
\relax
            \setbox\scaleandclip_box\hbox
                {\scale[\c!width=\d_scaleandclip_requested_wd]{\box\nextbox}}%
            \scratchdimen=\the\dimexpr(\ht\scaleandclip_box - 
\d_scaleandclip_requested_ht)/2\relax
            \clip
              [
                \c!voffset=\scratchdimen,
                \c!height=\d_scaleandclip_requested_ht,
              ]{\box\scaleandclip_box}%
      \else
            \setbox\scaleandclip_box\hbox
                {\scale[\c!height=\d_scaleandclip_requested_ht]{\box\nextbox}}%
            \scratchdimen=\the\dimexpr(\wd\scaleandclip_box - 
\d_scaleandclip_requested_wd)/2\relax
            \clip
              [
                \c!hoffset=\scratchdimen,
                \c!width=\d_scaleandclip_requested_wd,
              ]{\box\scaleandclip_box}%
      \fi
      \egroup}

\protect

The usage is:

\scaleandclip[width=..., height=...]{ ... any box ...}

simimlar to the usage of \scale macro.


\starttext

\dontleavehmode
\scaleandclip[width=3cm, 
height=3cm]{\externalfigure[cow.pdf][width=3cm,frame=on]}
\scale[maxwidth=3cm, 
maxheight=3cm]{\externalfigure[cow.pdf][width=3cm,frame=on]}

\dontleavehmode
\scaleandclip[width=3cm, 
height=3cm]{\externalfigure[cow.pdf][width=3cm,height=10cm,frame=on]}
\scale[maxwidth=3cm, 
maxheight=3cm]{\externalfigure[cow.pdf][width=3cm,height=10cm,frame=on]}

\dontleavehmode
\scaleandclip[width=3cm, 
height=3cm]{\externalfigure[cow.pdf][width=10cm,height=3cm,frame=on]}
\scale[maxwidth=3cm, 
maxheight=3cm]{\externalfigure[cow.pdf][width=10cm,height=3cm,frame=on]}

\stoptext
___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the 
Wiki!

maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage  : http://www.pragma-ade.nl / http://tex.aanhet.net
archive  : http://foundry.supelec.fr/projects/contextrev/
wiki     : http://contextgarden.net
___________________________________________________________________________________

Reply via email to