[NTG-context] resize and center and clip image

Wolfgang Schuster schuster.wolfgang at gmail.com
Thu May 1 21:31:15 CEST 2014


Am 01.05.2014 um 20:00 schrieb Aditya Mahajan <adityam at umich.edu>:

> 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.

We should convince Hans to add this functionality to the \scale macro with “factor=clip”.

Wolfgang


More information about the ntg-context mailing list