diff options
Diffstat (limited to 'tex/context/base/mkiv/grph-trf.mkxl')
-rw-r--r-- | tex/context/base/mkiv/grph-trf.mkxl | 1011 |
1 files changed, 0 insertions, 1011 deletions
diff --git a/tex/context/base/mkiv/grph-trf.mkxl b/tex/context/base/mkiv/grph-trf.mkxl deleted file mode 100644 index 0a423bd6b..000000000 --- a/tex/context/base/mkiv/grph-trf.mkxl +++ /dev/null @@ -1,1011 +0,0 @@ -%D \module -%D [ file=grph-trf, -%D version=2006.08.26, % overhaul/split of 1997.03.31 core-fig -%D title=\CONTEXT\ Graphic Macros, -%D subtitle=Transformations, -%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. - -\writestatus{loading}{ConTeXt Graphic Macros / Transformations} - -\unprotect - -%D We probably use too many dimens as the width calculations can go away. Some of -%D this is an inheritance of limited backends (some supported fractions, some -%D 1000's, some dimentions) so we calculate all of them. Nowadays scaling is always -%D available so we could simplify the code. On the other hand, we now get some extra -%D values for free. -%D -%D We could move the calculations to \LUA\ and clean up this lot anyway. On the -%D other hand, there is some danger of messing up so it has a real low priority. - -\registerctxluafile{grph-trf}{} - -% local: - -\newdimen\d_grph_scale_x_size -\newdimen\d_grph_scale_y_size -\newdimen\d_grph_scale_x_offset -\newdimen\d_grph_scale_y_offset - -\newdimen\d_grph_scale_h_size -\newdimen\d_grph_scale_v_size - -\newconditional\c_grph_scale_done -\newconditional\c_grph_scale_scaling_done -\newconditional\c_grph_scale_limit_factors \settrue\c_grph_scale_limit_factors - -\newconditional\c_grph_scale_swap_factor - -\newdimen\d_grph_scale_wd -\newdimen\d_grph_scale_ht -\newdimen\d_grph_scale_dp - -% global - -\newdimen\d_grph_scale_used_x_size -\newdimen\d_grph_scale_used_y_size - -\newcount\c_grph_scale_used_x_scale -\newcount\c_grph_scale_used_y_scale - -\let \m_grph_scale_used_x_scale\!!plusone -\let \m_grph_scale_used_y_scale\!!plusone - -\newdimen\d_grph_scale_outer_v_size % we cannot manipulate any global vsize ! - -% scratch: - -\let\m_grph_scale_temp \empty -\let\m_grph_scale_temp_x\empty -\let\m_grph_scale_temp_y\empty - -% public: - -\let\finalscaleboxxscale \!!plusone -\let\finalscaleboxyscale \!!plusone -\let\finalscaleboxwidth \!!zeropoint -\let\finalscaleboxheight \!!zeropoint - -% we can let sx/sy win (first check) - -\installcorenamespace{scale} -\installcorenamespace{scalegrid} -\installcorenamespace{scalenorm} -\installcorenamespace{scalefact} - -\installcommandhandler \??scale {scale} \??scale % we can have instances - -\setupscale - [\c!sx=\scaleparameter\c!s, - \c!sy=\scaleparameter\c!s, - \c!s=1, - %\c!scale=, - %\c!xscale=, - %\c!yscale=, - %\c!width=, - %\c!height=, - %\c!lines=, - %\c!factor=, - %\c!hfactor=, - %\c!wfactor=, - %\c!grid=, - %\c!equalwidth=, - %\c!equalheight=, - \c!maxwidth=\scaleparameter\c!width, - \c!maxheight=\scaleparameter\c!height] - -\permanent\tolerant\protected\def\scale[#1]#*[#2]% - {\bgroup - % this is quite common so we might make this a helper - \ifarguments - \let\currentscale\empty - \or - \ifhastok={#1}% - \let\currentscale\empty - \setupcurrentscale[#1]% - \else - \edef\currentscale{#1}% - \fi - \or - \edef\currentscale{#1}% - \setupcurrentscale[#2]% - \fi - % - \dowithnextboxcs\grph_scale_finish\hbox} - -\def\grph_scale_finish - {% todo: p_scale_ - \edef\p_scale {\scaleparameter\c!scale }% - \edef\p_xscale {\scaleparameter\c!xscale }% - \edef\p_yscale {\scaleparameter\c!yscale }% - \edef\p_width {\scaleparameter\c!width }% - \edef\p_height {\scaleparameter\c!height }% - \edef\p_depth {\scaleparameter\c!depth }% - \edef\p_lines {\scaleparameter\c!lines }% - \edef\p_factor {\scaleparameter\c!factor }% - \edef\p_hfactor {\scaleparameter\c!hfactor }% - \edef\p_wfactor {\scaleparameter\c!wfactor }% - % \edef\p_grid {\scaleparameter\c!grid }% used once - \edef\p_maxwidth {\scaleparameter\c!maxwidth }% - \edef\p_maxheight {\scaleparameter\c!maxheight }% - \edef\p_sx {\scaleparameter\c!sx }% - \edef\p_sy {\scaleparameter\c!sy }% - \edef\p_equalwidth {\scaleparameter\c!equalwidth }% - \edef\p_equalheight{\scaleparameter\c!equalheight}% - % - \d_grph_scale_dp\dp\nextbox - \ifx\p_depth\v!no \ifzeropt\d_grph_scale_dp \else - \setbox\nextbox\naturalhpack{\raise\d_grph_scale_dp\box\nextbox}% new - \d_grph_scale_dp\dp\nextbox - \fi \fi - \d_grph_scale_wd\wd\nextbox - \d_grph_scale_ht\ht\nextbox - \d_grph_scale_dp\dp\nextbox - % - \glet\finalscaleboxxscale \!!plusone - \glet\finalscaleboxyscale \!!plusone - \xdef\finalscaleboxwidth {\the\d_grph_scale_wd}% - \xdef\finalscaleboxheight{\the\d_grph_scale_ht}% - % - \forgetall - \dontcomplain - % - \setfalse\c_grph_scale_done - \grph_scale_calculate - \ifconditional\c_grph_scale_done - \grph_scale_apply - \fi - \grph_scale_position - % - \box\nextbox - \egroup} - -\def\grph_scale_apply - {\d_grph_scale_wd\finalscaleboxxscale\d_grph_scale_wd - \d_grph_scale_ht\finalscaleboxyscale\d_grph_scale_ht - \d_grph_scale_dp\finalscaleboxyscale\d_grph_scale_dp - \ifdim\d_grph_scale_wd=\wd\nextbox - \ifdim\d_grph_scale_ht=\ht\nextbox - \ifdim\d_grph_scale_dp=\dp\nextbox - % \grph_scale_apply_nop - \else - \grph_scale_apply_yes - \fi - \else - \grph_scale_apply_yes - \fi - \else - \grph_scale_apply_yes - \fi} - -\def\grph_scale_apply_yes - {\setbox\nextbox\naturalhpack - {\dostartscaling \finalscaleboxxscale \finalscaleboxyscale - \smashedbox\nextbox - \dostopscaling}% - \wd\nextbox\d_grph_scale_wd - \ht\nextbox\d_grph_scale_ht - \dp\nextbox\d_grph_scale_dp} - -\def\m_grph_scale_stamp_c{11} - -\def\grph_scale_calculate - {\ifdim\d_grph_scale_ht>\zeropoint \ifdim\d_grph_scale_wd>\zeropoint - \edef\m_grph_scale_stamp_a{\p_scale\p_xscale\p_yscale\p_factor\p_wfactor\p_hfactor\p_lines\p_width\p_height}% - \edef\m_grph_scale_stamp_b{\p_sx\p_sy}% - \ifempty\m_grph_scale_stamp_a - \ifx\m_grph_scale_stamp_b\m_grph_scale_stamp_c - % no scaling, don't change this (previous attempts failed anyway) - \insidefloattrue % trick - \grph_scale_calculations_yes - \else - \grph_scale_check_sx_sy - \grph_scale_calculations_nop - \fi - \else - \ifempty\m_grph_scale_stamp_b - % no need to check further - \else - \grph_scale_check_sx_sy - \fi - \grph_scale_calculations_yes - \fi - \fi \fi} - -\def\grph_scale_check_sx_sy - {\ifdim\p_sx\onepoint=\onepoint\else\edef\p_width {\the\dimexpr\p_sx\d_grph_scale_wd}\fi - \ifdim\p_sy\onepoint=\onepoint\else\edef\p_height{\the\dimexpr\p_sy\d_grph_scale_ht}\fi} - -\def\grph_scale_rounded#1% - {\thewithoutunit\dimexpr#1\points*100+32768\scaledpoint\relax} - -\def\grph_scale_calculations_nop - {\settrue\c_grph_scale_done - \xdef\finalscaleboxwidth {\the\dimexpr\p_sx\d_grph_scale_wd\relax}% - \xdef\finalscaleboxheight{\the\dimexpr\p_sy\d_grph_scale_ht\relax}% - \glet\finalscaleboxxscale\p_sx - \glet\finalscaleboxyscale\p_sy - \ifempty\finalscaleboxxscale\let\finalscaleboxxscale\!!plusone\fi - \ifempty\finalscaleboxyscale\let\finalscaleboxyscale\!!plusone\fi} - -\let\grph_scale_calculations_report\relax - -\def\grph_scale_calculations_yes - {\settrue\c_grph_scale_done - % initial values - \d_grph_scale_x_offset\zeropoint - \d_grph_scale_y_offset\zeropoint - \d_grph_scale_x_size \d_grph_scale_wd - \d_grph_scale_y_size \d_grph_scale_ht % alleen ht wordt geschaald! - % final values - \global\d_grph_scale_used_x_size \zeropoint % see note * (core-fig) - \global\d_grph_scale_used_y_size \zeropoint % see note * (core-fig) - \c_grph_scale_used_x_scale \plusone % see note * (core-fig) - \c_grph_scale_used_y_scale \plusone % see note * (core-fig) - \let\m_grph_scale_used_x_scale \!!plusone - \let\m_grph_scale_used_y_scale \!!plusone - % preparations - \setfalse\c_grph_scale_scaling_done - \grph_scale_check_parameters - % calculators - % beware, they operate in sequence, and calculate missing dimensions / messy - % grph_scale_by_nature % when? needed? - \ifconditional\c_grph_scale_scaling_done\else\grph_scale_by_factor \fi - \ifconditional\c_grph_scale_scaling_done\else\grph_scale_by_scale \fi - \ifconditional\c_grph_scale_scaling_done\else\grph_scale_by_dimension\fi - % used in actual scaling - \xdef\finalscaleboxwidth {\the\d_grph_scale_used_x_size}% - \xdef\finalscaleboxheight {\the\d_grph_scale_used_y_size}% - \glet\finalscaleboxxscale \m_grph_scale_used_x_scale - \glet\finalscaleboxyscale \m_grph_scale_used_y_scale - \grph_scale_calculations_report} - -\setvalue{\??scalegrid\v!yes }{\getnoflines \d_grph_scale_used_y_size\edef\p_height{\the\noflines\lineheight}} -\setvalue{\??scalegrid\v!height }{\getrawnoflines\d_grph_scale_used_y_size\edef\p_height{\the\dimexpr\noflines\lineheight+\strutdepth}} -\setvalue{\??scalegrid\v!depth }{\getrawnoflines\d_grph_scale_used_y_size\edef\p_height{\the\dimexpr\noflines\lineheight-\strutdepth}} -\setvalue{\??scalegrid\v!halfline}{\getrawnoflines\d_grph_scale_used_y_size\edef\p_height{\the\dimexpr\noflines\lineheight+.5\lineheight}} -\setvalue{\??scalegrid\v!fit }{\getrawnoflines\d_grph_scale_used_y_size\edef\p_height{\the\noflines\lineheight}} -\letvalue{\??scalegrid\empty }\donothing - -\def\grph_scale_check_parameters % resolve self referencing loops - {\ifempty\p_maxwidth \else \edef\p_maxwidth {\the\dimexpr\p_maxwidth }\fi - \ifempty\p_maxheight\else \edef\p_maxheight{\the\dimexpr\p_maxheight }\fi - \ifempty\p_lines \else \edef\p_height {\the\dimexpr\p_lines\lineheight}\fi - \csname\??scalegrid\scaleparameter\c!grid\endcsname} - -\def\grph_scale_by_nature % where ! ! ! ! ! - {\ifempty\p_width \else \global\d_grph_scale_used_x_size\p_width \fi - \ifempty\p_height\else \global\d_grph_scale_used_y_size\p_height\fi - \ifempty\p_scale \else \c_grph_scale_used_x_scale\p_scale - \c_grph_scale_used_y_scale\p_scale \fi - \ifempty\p_xscale\else \c_grph_scale_used_x_scale\p_xscale\fi - \ifempty\p_yscale\else \c_grph_scale_used_y_scale\p_yscale\fi} - -% \defineexternalfigure[width-6][factor=auto,maxwidth=\textheight,maxheight=\textwidth] -% \defineexternalfigure[width-7][factor=auto,maxwidth=\textwidth,maxheight=\textheight] -% \placefigure{none}{\rotate[frame=on,offset=overlay]{\externalfigure[t:/sources/cow.pdf][width-6]}} \page -% \placefigure{none}{\framed[frame=on,offset=overlay]{\externalfigure[t:/sources/cow.pdf][width-7]}} - -%D The \typpe {min} option makes sure that the smallest available space determines -%D the max size (so we can get a bleed on the other axis): -%D -%D \startlinecorrection -%D \startcombination[nx=2,ny=2,distance=4cm] -%D {\externalfigure[hacker][factor=max,maxwidth=6cm,maxheight=6cm]} {} -%D {\externalfigure[mill] [factor=max,maxwidth=6cm,maxheight=6cm]} {} -%D {\externalfigure[hacker][factor=min,maxwidth=6cm,maxheight=6cm]} {} -%D {\externalfigure[mill] [factor=min,maxwidth=6cm,maxheight=6cm]} {} -%D \stopcombination -%D \stoplinecorrection - -\def\m_grph_scale_factor_set{\v!min,\v!max,\v!fit,\v!broad,\v!auto} % can be an \edef - -\def\grph_scale_by_factor - {\doifelseinset\p_factor\m_grph_scale_factor_set - \grph_scale_by_factor_a - {\doifelseinset\p_hfactor\m_grph_scale_factor_set - \grph_scale_by_factor_b - {\doifelseinset\p_wfactor\m_grph_scale_factor_set - \grph_scale_by_factor_c - \grph_scale_by_factor_d}}} - -\def\grph_scale_by_factor_a - {\grph_scale_apply_size - \ifdim\d_grph_scale_x_size >\d_grph_scale_y_size - \grph_scale_calculate_norm \d_grph_scale_used_x_size\p_factor\p_maxwidth\hsize\d_grph_scale_h_size - \grph_scale_calculate_scales\d_grph_scale_used_x_size\d_grph_scale_x_size - \d_grph_scale_used_y_size\m_grph_scale_used_x_scale\d_grph_scale_y_size - \else - \grph_scale_calculate_norm \d_grph_scale_used_y_size\p_factor\p_maxheight\d_grph_scale_outer_v_size\d_grph_scale_v_size - \grph_scale_calculate_scales\d_grph_scale_used_y_size\d_grph_scale_y_size - \d_grph_scale_used_x_size\m_grph_scale_used_x_scale\d_grph_scale_x_size - \fi - \grph_scale_by_factor_indeed} - -\def\grph_scale_by_factor_b - {\grph_scale_apply_size - \grph_scale_calculate_norm \d_grph_scale_used_y_size\p_hfactor\p_maxheight\d_grph_scale_outer_v_size\d_grph_scale_v_size - \grph_scale_calculate_scales\d_grph_scale_used_y_size\d_grph_scale_y_size - \d_grph_scale_used_x_size\m_grph_scale_used_x_scale\d_grph_scale_x_size - \grph_scale_by_factor_indeed} - -\def\grph_scale_by_factor_c - {\grph_scale_apply_size - \grph_scale_calculate_norm \d_grph_scale_used_x_size\p_wfactor\p_maxwidth\hsize\d_grph_scale_h_size - \grph_scale_calculate_scales\d_grph_scale_used_x_size\d_grph_scale_x_size - \d_grph_scale_used_y_size\m_grph_scale_used_x_scale\d_grph_scale_y_size - \grph_scale_by_factor_indeed} - -\def\grph_scale_by_factor_d - {\grph_scale_calculate_norm\d_grph_scale_used_y_size\p_factor \p_height \textheight\d_grph_scale_v_size - \grph_scale_calculate_norm\d_grph_scale_used_y_size\p_hfactor\p_height \textheight\d_grph_scale_v_size - \grph_scale_calculate_norm\d_grph_scale_used_x_size\p_wfactor\p_width \hsize \hsize} - -\def\grph_scale_by_factor_indeed - {\grph_scale_calculate_fact\p_factor - \settrue\c_grph_scale_scaling_done - \ifconditional\c_grph_scale_limit_factors - \ifdim\d_grph_scale_used_x_size\ifconditional\c_grph_scale_swap_factor<\else>\fi\d_grph_scale_h_size - \global\d_grph_scale_used_y_size\zeropoint - \global\d_grph_scale_used_x_size\d_grph_scale_h_size - \orelse\ifdim\d_grph_scale_used_y_size\ifconditional\c_grph_scale_swap_factor<\else>\fi\d_grph_scale_v_size - \global\d_grph_scale_used_x_size\zeropoint - \global\d_grph_scale_used_y_size\d_grph_scale_v_size - \fi - \fi - \grph_scale_by_dimension} - -\def\grph_scale_by_scale - {\edef\m_grph_scale_temp{\p_scale\p_xscale\p_yscale}% - \ifempty\m_grph_scale_temp \else - \grph_scale_apply_scale\m_grph_scale_used_x_scale\p_xscale - \grph_scale_apply_scale\m_grph_scale_used_y_scale\p_yscale - % \global\d_grph_scale_used_x_size\m_grph_scale_used_x_scale\d_grph_scale_x_size\relax % no global needed here - % \global\d_grph_scale_used_y_size\m_grph_scale_used_y_scale\d_grph_scale_y_size\relax % no global needed here - % wrong: we need to recalculate the scale - \global\d_grph_scale_used_x_size\zeropoint - \global\d_grph_scale_used_y_size\zeropoint - % - \ifempty\p_maxwidth - \ifempty\p_maxheight - \else - \ifdim\d_grph_scale_y_size>\p_maxheight\relax - \global\d_grph_scale_used_y_size\p_maxheight - \fi - \fi - \else - \ifdim\d_grph_scale_x_size>\p_maxwidth\relax - \global\d_grph_scale_used_x_size\p_maxwidth - \fi - \fi - \fi} - -\def\grph_scale_by_dimension - {\ifdim\d_grph_scale_used_x_size>\zeropoint - \ifdim\d_grph_scale_used_y_size>\zeropoint - \grph_scale_by_dimension_a - \else - \grph_scale_by_dimension_b - \fi - \else - \ifdim\d_grph_scale_used_y_size>\zeropoint - \grph_scale_by_dimension_c - \else - \grph_scale_by_dimension_d - \fi - \fi} - -\def\grph_scale_by_dimension_a - {\grph_scale_by_dimension_indeed - {\grph_scale_calculate_scale\m_grph_scale_used_y_scale\d_grph_scale_used_y_size\d_grph_scale_y_size - \grph_scale_calculate_scale\m_grph_scale_used_x_scale\d_grph_scale_used_x_size\d_grph_scale_x_size}% - {\grph_scale_calculate_scale\m_grph_scale_used_y_scale\d_grph_scale_used_y_size\d_grph_scale_y_size - \grph_scale_calculate_scale\m_grph_scale_used_x_scale\d_grph_scale_used_x_size\d_grph_scale_x_size}% - {\grph_scale_calculate_scale\m_grph_scale_used_y_scale\d_grph_scale_used_y_size\d_grph_scale_y_size - \grph_scale_calculate_scale\m_grph_scale_used_x_scale\d_grph_scale_used_x_size\d_grph_scale_x_size}} - -\def\grph_scale_by_dimension_b - {\grph_scale_by_dimension_indeed - {\grph_scale_calculate_scales\d_grph_scale_used_x_size\d_grph_scale_x_size - \d_grph_scale_used_y_size\m_grph_scale_used_x_scale\d_grph_scale_y_size}% - {\grph_scale_calculate_scales\d_grph_scale_used_x_size\d_grph_scale_x_size - \d_grph_scale_used_y_size\m_grph_scale_used_x_scale\d_grph_scale_y_size}% - {\grph_scale_calculate_scales\d_grph_scale_used_x_size\d_grph_scale_x_size - \d_grph_scale_used_y_size\m_grph_scale_used_x_scale\d_grph_scale_y_size}} - -\def\grph_scale_by_dimension_c - {\grph_scale_by_dimension_indeed % weird .. three same cases - {\grph_scale_calculate_scales\d_grph_scale_used_y_size\d_grph_scale_y_size - \d_grph_scale_used_x_size\m_grph_scale_used_x_scale\d_grph_scale_x_size}% - {\grph_scale_calculate_scales\d_grph_scale_used_y_size\d_grph_scale_y_size - \d_grph_scale_used_x_size\m_grph_scale_used_x_scale\d_grph_scale_x_size}% - {\grph_scale_calculate_scales\d_grph_scale_used_y_size\d_grph_scale_y_size - \d_grph_scale_used_x_size\m_grph_scale_used_x_scale\d_grph_scale_x_size}} - -\def\grph_scale_by_dimension_d - {\grph_scale_by_dimension_indeed - {\grph_scale_apply_scale\m_grph_scale_used_x_scale\p_xscale - \grph_scale_apply_scale\m_grph_scale_used_y_scale\p_yscale - \global\d_grph_scale_used_x_size\m_grph_scale_used_x_scale\d_grph_scale_x_size - \global\d_grph_scale_used_y_size\m_grph_scale_used_y_scale\d_grph_scale_y_size}% - {\grph_scale_calculate_scales\d_grph_scale_used_x_size\d_grph_scale_x_size - \d_grph_scale_used_y_size\m_grph_scale_used_x_scale\d_grph_scale_y_size}% - {\grph_scale_calculate_scales\d_grph_scale_used_y_size\d_grph_scale_y_size - \d_grph_scale_used_x_size\m_grph_scale_used_x_scale\d_grph_scale_x_size}} - -\def\grph_scale_by_dimension_indeed#1#2#3% - {#1\relax - \ifempty\p_maxwidth \else - \ifdim\d_grph_scale_used_x_size>\p_maxwidth\relax - \global\d_grph_scale_used_x_size\p_maxwidth - #2\relax - \fi - \fi - \ifempty\p_maxheight \else - \ifdim\d_grph_scale_used_y_size>\p_maxheight\relax - \global\d_grph_scale_used_y_size\p_maxheight - #3\relax - \fi - \fi} - -\def\grph_scale_calculate_norm#1#2% todo: swap 1 and 2 and pass one less - {\csname\??scalenorm\ifcsname\??scalenorm#2\endcsname#2\else\s!unknown\fi\endcsname#1#2} - -\def\grph_scale_calculate_fact#1% - {\csname\??scalefact\ifcsname\??scalefact#1\endcsname#1\else\s!unknown\fi\endcsname} - -%setvalue{\??scalenorm\v!min }#1#2#3#4#5{\global#1#4} -\setvalue{\??scalenorm\v!max }#1#2#3#4#5{\global#1#4} -\setvalue{\??scalenorm\v!fit }#1#2#3#4#5{\global#1#5} -\setvalue{\??scalenorm\v!broad }#1#2#3#4#5{\global#1\dimexpr#5-4\externalfigureparameter\c!bodyfont\relax} -\setvalue{\??scalenorm\s!unknown}#1#2#3#4#5{\global#1\dimexpr#2\dimexpr\externalfigureparameter\c!bodyfont/10\relax\relax} % brr ex -\setvalue{\??scalenorm\v!auto }#1#2#3#4#5{\ifx#3\empty\else\global#1#3\fi} -\setvalue{\??scalenorm\empty }#1#2#3#4#5{\ifx#3\empty\else\global#1#3\fi} -\setvalue{\??scalenorm\s!default}#1#2#3#4#5{\ifx#3\empty\else\global#1#3\fi} - -\setvalue{\??scalefact\v!min }{\global\settrue \c_grph_scale_swap_factor} -\setvalue{\??scalefact\s!unknown}{\global\setfalse\c_grph_scale_swap_factor} - -% \setvalue{\??scalenorm\v!min }#1#2#3#4#5% an ugly hack -% {\ifdim\d_grph_scale_used_x_size>\d_grph_scale_h_size -% \d_grph_scale_used_y_size\vsize -% \else -% \d_grph_scale_used_x_size\hsize -% \fi} - -\setvalue{\??scalenorm\v!min}#1#2#3#4#5% an ugly hack - {\d_grph_scale_used_x_size\hsize - \d_grph_scale_used_y_size\vsize} - -\def\grph_scale_calculate_scales#1#2% - {\edef\m_grph_scale_used_x_scale{\luaexpr{\number#1/\number#2}}% - \let\m_grph_scale_used_y_scale\m_grph_scale_used_x_scale} - -\def\grph_scale_calculate_scale#1#2#3% - {\edef#1{\luaexpr{\number#2/\number#3}}} - -\def\grph_scale_apply_scale#1#2% #1 = parameter / scale can be empty - {% no overflow - \edef#1{\luaexpr - {\number - \ifx#2\empty - \ifempty\p_scale \plusthousand \else - \ifnum \p_scale=\zerocount \plusthousand \else - \p_scale \fi\fi - \orelse\ifnum#2=\zerocount - \ifempty\p_scale \plusthousand \else - \ifnum \p_scale=\zerocount \plusthousand \else - \p_scale \fi\fi - \else - #2% - \fi - /1000}}} - -\def\grph_scale_apply_size - {\ifempty\p_maxheight - \d_grph_scale_outer_v_size\textheight - \ifinner - \d_grph_scale_outer_v_size \vsize % \textheight =\vsize - \scratchdimen\vsize % \scratchdimen=\textheight - \orelse\ifinsidefloat - \d_grph_scale_outer_v_size \vsize % \textheight =\vsize - \scratchdimen\vsize % \scratchdimen=\textheight - \orelse\ifinpagebody - \d_grph_scale_outer_v_size \vsize % \textheight =\vsize - \scratchdimen\vsize % \scratchdimen=\textheight - \orelse\ifdim\pagegoal<\maxdimen - \ifdim\pagetotal<\pagegoal - \scratchdimen\dimexpr\pagegoal-\pagetotal\relax - \else - \scratchdimen\d_grph_scale_outer_v_size % \textheight - \fi - \else - \scratchdimen\d_grph_scale_outer_v_size % \textheight - \fi - \else - \scratchdimen\p_maxheight - \d_grph_scale_outer_v_size\scratchdimen - \fi - \ifempty\p_height - \d_grph_scale_v_size\scratchdimen - \else - \d_grph_scale_v_size\p_height - \fi - \ifempty\p_width - \d_grph_scale_h_size\hsize - \else - \d_grph_scale_h_size\p_width - \fi} - -% \startcombination -% {\externalfigure[cow.pdf] [frame=on,height=3cm,equalwidth=6cm]} {a cow} -% {\externalfigure[mill.png][frame=on,height=3cm,equalwidth=6cm]} {a mill} -% \stopcombination - -\def\grph_scale_position - {\ifempty\p_equalwidth \else - \scratchdimen\p_equalwidth\relax - \ifdim\d_grph_scale_wd<\scratchdimen - \setbox\nextbox\naturalhpack to \scratchdimen{\hss\box\nextbox\hss}% - \fi - \fi - \ifempty\p_equalheight \else - \scratchdimen\p_equalheight\relax - \ifdim\d_grph_scale_ht<\scratchdimen - \setbox\nextbox\naturalvpack to \scratchdimen{\vss\box\nextbox\vss}% - \fi - \fi} - -\permanent\protected\def\fastscale#1% - {\ifnum#1=1000\relax - \expandafter\grph_scale_fast_nop - \else - \expandafter\grph_scale_fast_yes - \fi{#1}} - -\def\grph_scale_fast_nop#1% - {\hbox} - -\def\grph_scale_fast_yes#1% - {\edef\finalscaleboxxscale{\withoutpt\the\dimexpr#1\onepoint/1000\relax}% brrr - \let\finalscaleboxyscale\finalscaleboxxscale - \dowithnextboxcs\grph_scale_fast_finish\hbox} - -\def\grph_scale_fast_finish - {\grph_scale_apply - \box\nextbox - \endgroup} - -\permanent\protected\def\fastsxsy#1#2% - {\bgroup - \edef\p_sx{#1}% - \edef\p_sy{#2}% - \dowithnextboxcs\grph_scale_fast_sx_xy_finish\hbox} - -\def\grph_scale_fast_sx_xy_finish - {\grph_scale_check_sx_sy - \d_grph_scale_wd\wd\nextbox - \d_grph_scale_ht\ht\nextbox - \d_grph_scale_dp\dp\nextbox - \grph_scale_calculations_nop - \grph_scale_apply - \box\nextbox - \egroup} - -%D \macros -%D {clip, setupclipping} -%D -%D Although related to figures, clipping can be applied to arbitrary content. We can -%D use \METAPOST\ to provide a non rectangular clipping path. -%D -%D \starttyping -%D \startMPclip{fun} -%D clip currentpicture to fullcircle -%D shifted (.5,.5) xscaled \width yscaled \height ; -%D \stopMPclip -%D \stoptyping -%D -%D We get a rectangular piece of the figure when we say: -%D -%D \starttyping -%D \clip[x=2,y=1]{\externalfigure[photo]} -%D \stoptyping -%D -%D When we want to clip to the oval we defined a few lines ago, we say: -%D -%D \starttyping -%D \clip[nx=1,ny=1,x=1,y=1,mp=fun]{\externalfigure[photo]} -%D \stoptyping -%D -%D The general characteristics of clipping can be set up with -%D -%D \showsetup{setupclipping} - -\installcorenamespace{clipping} - -\installdirectcommandhandler \??clipping {clipping} - -\permanent\tolerant\protected\def\clip[#1]% nb top->bottom left->right - {\bgroup - \ifparameter#1\or - \setupcurrentclipping[#1]% - \fi - \dowithnextboxcs\grph_clip_finish\hbox} - -\def\grph_clip_finish - {\doifelse{\clippingparameter\c!state}\v!start - \grph_clip_yes_finish - \grph_clip_nop_finish} - -\def\grph_clip_yes_finish - {\ifdim\clippingparameter\c!width>\zeropoint - \scratchwidth \clippingparameter\c!width - \scratchxoffset\clippingparameter\c!hoffset - \else - \scratchwidth\dimexpr\wd\nextbox/\clippingparameter\c!nx\relax - \scratchxoffset\dimexpr\clippingparameter\c!x\scratchwidth-\scratchwidth\relax - \scratchwidth\clippingparameter\c!sx\scratchwidth - \fi - \relax % sure - \ifdim\clippingparameter\c!height>\zeropoint - \scratchheight\clippingparameter\c!height - \scratchyoffset\dimexpr\ht\nextbox-\clippingparameter\c!voffset-\scratchheight\relax - \else - \scratchheight\dimexpr\ht\nextbox/\clippingparameter\c!ny\relax - \scratchyoffset\dimexpr-\clippingparameter\c!y\scratchheight-\clippingparameter\c!sy\scratchheight+\scratchheight\relax - \scratchheight\clippingparameter\c!sy\scratchheight - \advance\scratchyoffset \ht\nextbox - \fi - \setbox\nextbox\naturalhpack - {\advance\scratchxoffset -\clippingparameter\c!leftoffset \relax - \advance\scratchyoffset -\clippingparameter\c!bottomoffset\relax - \hskip-\scratchxoffset - \lower\scratchyoffset - \box\nextbox}% - \wd\nextbox\zeropoint - \ht\nextbox\zeropoint - \dp\nextbox\zeropoint - \setbox\nextbox\naturalhpack - {\advance\scratchwidth \dimexpr\clippingparameter\c!leftoffset +\clippingparameter\c!rightoffset\relax - \advance\scratchheight\dimexpr\clippingparameter\c!bottomoffset+\clippingparameter\c!topoffset \relax - \dostartclipping{\clippingparameter\c!mp}\scratchwidth\scratchheight - \box\nextbox - \dostopclipping}% - \setbox\nextbox\naturalhpack - {\hskip-\clippingparameter\c!leftoffset - \lower \clippingparameter\c!bottomoffset - \box\nextbox}% - \wd\nextbox\scratchwidth - \ht\nextbox\scratchheight - \dp\nextbox\zeropoint - \box\nextbox - \egroup} - -\def\grph_clip_nop_finish - {\box\nextbox - \egroup} - -\setupclipping - [\c!state=\v!start, - \c!n=\plusone, % was \plustwo - \c!nx=\clippingparameter\c!n,\c!x=\plusone,\c!sx=\plusone, - \c!ny=\clippingparameter\c!n,\c!y=\plusone,\c!sy=\plusone, - \c!width=\zeropoint, - \c!height=\zeropoint, - \c!hoffset=\zeropoint, - \c!voffset=\zeropoint, - \c!offset=\zeropoint, - \c!leftoffset=\clippingparameter\c!offset, - \c!rightoffset=\clippingparameter\c!offset, - \c!topoffset=\clippingparameter\c!offset, - \c!bottomoffset=\clippingparameter\c!offset, - \c!mp=] - -%D \startbuffer -%D \startuseMPgraphic{test} -%D path p ; p := fullcircle scaled 4cm ; -%D draw p withpen pencircle scaled 1cm ; -%D setbounds currentpicture to boundingbox p ; -%D \stopuseMPgraphic -%D -%D \hbox to \hsize \bgroup -%D \hss -%D \ruledhbox{\useMPgraphic{test}}% -%D \hss -%D \ruledhbox{\clip{\useMPgraphic{test}}}% -%D \hss -%D \egroup -%D \stopbuffer -%D -%D \typebuffer \getbuffer - -%D Mirroring. - -\permanent\protected\def\mirror - {\bgroup - \dowithnextboxcs\grph_mirror_finish\hbox} - -\def\grph_mirror_finish - {\scratchdimen\wd\nextbox - % better use an hbox (if no \forgetall, leftskip etc may creep in) - %\setbox\nextbox\vbox{\forgetall\dostartmirroring\hskip-\wd\nextbox\box\nextbox\dostopmirroring}% - \setbox\nextbox\naturalhpack - {\dostartmirroring - \hskip-\wd\nextbox - \box\nextbox - \dostopmirroring}% - \wd\nextbox\scratchdimen - \box\nextbox - \egroup} - -%D A couple of examples, demonstrating how the depth is taken care of: -%D -%D \startbuffer -%D test\rotate[frame=on, rotation=0] {gans}% -%D test\rotate[frame=on, rotation=90] {gans}% -%D test\rotate[frame=on, rotation=180]{gans}% -%D test\rotate[frame=on, rotation=270]{gans}% -%D test -%D \stopbuffer -%D -%D \typebuffer \getbuffer -%D -%D When we rotate over arbitrary angles, we need to relocate the resulting box -%D because rotation brings that box onto the negative axis. The calculations (mostly -%D sin and cosine) need to be tuned for the way a box is packages (i.e. the refence -%D point). A typical example of drawing, scribbling, and going back to the days of -%D school math. -%D -%D We do a bit more calculations than needed, simply because that way it's easier to -%D debug the code. - -\installcorenamespace {rotate} -\installcorenamespace {rotatelocation} -\installcorenamespace {rotatepreset} - -% todo: scratchcounters - -\newdimen\d_grph_rotate_x_size -\newdimen\d_grph_rotate_y_size -\newdimen\d_grph_rotate_x_offset -\newdimen\d_grph_rotate_y_offset -\newdimen\d_grph_rotate_x_position -\newdimen\d_grph_rotate_y_position - -\newdimen\d_grph_rotate_used_height - -\newdimen\d_grph_rotate_width -\newdimen\d_grph_rotate_height -\newdimen\d_grph_rotate_depth - -\newdimen\d_grph_rotate_saved_width -\newdimen\d_grph_rotate_saved_height -\newdimen\d_grph_rotate_saved_depth - -\newdimen\d_grph_rotate_new_width -\newdimen\d_grph_rotate_new_height -\newdimen\d_grph_rotate_new_depth - -\newconditional\c_grph_rotate_obey_depth -\newconditional\c_grph_rotate_not_fit -\newconditional\c_grph_rotate_center - -\installframedcommandhandler \??rotate {rotate} \??rotate - -\setuprotate - [\c!rotation=90, - \c!location=\v!normal, - \c!width=\v!fit, - \c!height=\v!fit, - \c!offset=\v!overlay, - \c!frame=\v!off] - -\let\p_rotation_location\empty -\let\p_rotation_rotation\empty - -\permanent\tolerant\protected\def\rotate[#1]% \bgroup: \rotate kan argument zijn - {\bgroup - \ifparameter#1\or - \setupcurrentrotate[#1]% - \fi - \edef\p_rotation_location{\rotateparameter\c!location}% - \edef\p_rotation_rotation{\rotateparameter\c!rotation}% - \csname\??rotatelocation - \ifcsname\??rotatelocation\p_rotation_location\endcsname\p_rotation_location\else\v!default\fi - \endcsname} - -\def\grph_rotate_framed - {\resetrotateparameter\c!location - \dowithnextboxcs\grph_rotate_finish\vbox - \inheritedrotateframed} - -\def\grph_rotate_normal - {\dowithnextboxcs\grph_rotate_finish\vbox} - -\def\grph_rotate_finish - {\grph_rotate_finish_indeed - \egroup} - -\setvalue{\??rotatelocation\v!depth}% - {\setfalse\c_grph_rotate_not_fit - \setfalse\c_grph_rotate_center - \settrue \c_grph_rotate_obey_depth - \grph_rotate_normal} - -\setvalue{\??rotatelocation\v!fit}% - {\settrue \c_grph_rotate_not_fit - \setfalse\c_grph_rotate_center - \settrue \c_grph_rotate_obey_depth - \grph_rotate_normal} - -\setvalue{\??rotatelocation\v!broad}% - {\setfalse\c_grph_rotate_not_fit - \setfalse\c_grph_rotate_center - \setfalse\c_grph_rotate_obey_depth - \grph_rotate_normal} - -\setvalue{\??rotatelocation\v!high}% - {\setfalse\c_grph_rotate_not_fit - \setfalse\c_grph_rotate_center - \setfalse\c_grph_rotate_obey_depth - \grph_rotate_framed} - -\setvalue{\??rotatelocation\v!middle}% - {\setfalse\c_grph_rotate_not_fit - \settrue \c_grph_rotate_center - \setfalse\c_grph_rotate_obey_depth % hm, depth ? - \grph_rotate_normal} - -\setvalue{\??rotatelocation\v!default}% - {\setfalse\c_grph_rotate_not_fit - \setfalse\c_grph_rotate_center - \settrue \c_grph_rotate_obey_depth - \grph_rotate_framed} - -\protected\def\dorotatebox#1% {angle} \hbox/\vbox/\vtop % a fast low level one - {\ifcase#1\relax - \expandafter\gobbleoneargument - \else - \expandafter\grph_rotate_box - \fi{#1}} - -\def\grph_rotate_box#1% {angle} \hbox/\vbox/\vtop - {\bgroup - \hbox\bgroup % compatibility hack - \edef\p_rotation_rotation{#1}% - \dowithnextboxcs\grph_rotate_finish_box} - -\def\grph_rotate_finish_box - {\setfalse\c_grph_rotate_not_fit % this is the same as broad but - \setfalse\c_grph_rotate_center % without the following grab as - \setfalse\c_grph_rotate_obey_depth % we call finish directly - \grph_rotate_finish_indeed - \egroup - \egroup} - -\def\grph_rotate_finish_indeed - {\naturalhpack\bgroup - \ifempty\p_rotation_rotation - \grph_rotate_finish_nop - \else - \grph_rotate_finish_yes - \fi - \egroup} - -\def\grph_rotate_finish_nop - {\boxcursor\box\nextbox} - -\setvalue{\??rotatepreset\v!left}% - {\edef\p_rotation_rotation{90}} - -\setvalue{\??rotatepreset\v!right}% - {\edef\p_rotation_rotation{270}} - -\setvalue{\??rotatepreset\v!inner}% - {\signalrightpage - \doifelserightpage{\def\p_rotation_rotation{270}}{\def\p_rotation_rotation{90}}} - -\setvalue{\??rotatepreset\v!outer}% - {\signalrightpage - \doifelserightpage{\def\p_rotation_rotation{90}}{\def\p_rotation_rotation{270}}} - -\setvalue{\??rotatepreset\v!default}% - {} - -\def\grph_rotate_finish_yes - {\begincsname\??rotatepreset\p_rotation_rotation\endcsname - \setbox\nextbox\naturalvpack{\box\nextbox}% not really needed - \dontcomplain - \ifconditional\c_grph_rotate_center - \d_grph_rotate_saved_width \wd\nextbox - \d_grph_rotate_saved_height\ht\nextbox - \d_grph_rotate_saved_depth \dp\nextbox - \setbox\nextbox\naturalhpack{\hskip-.5\wd\nextbox\lower.5\ht\nextbox\box\nextbox}% - \smashbox\nextbox - \fi - % - \d_grph_rotate_width \wd\nextbox - \d_grph_rotate_height\ht\nextbox - \d_grph_rotate_depth \dp\nextbox - % - \setbox\nextbox\naturalvpack{\naturalhpack{\raise\dp\nextbox\box\nextbox}}% can we do without - % - \d_grph_rotate_used_height\ht\nextbox - % - \clf_analyzerotate % rather accurate - \p_rotation_rotation\space - \d_grph_rotate_width - \d_grph_rotate_height - \d_grph_rotate_depth - \d_grph_rotate_used_height - \c_grph_rotate_not_fit - \c_grph_rotate_obey_depth - \relax - % - \setbox\nextbox\naturalvpack to \d_grph_rotate_y_size - {\vfilll - \naturalhpack to \d_grph_rotate_x_size - {\dostartrotation\p_rotation_rotation - \wd\nextbox\zeropoint - \ht\nextbox\zeropoint - \box\nextbox - \dostoprotation - \hfill}% - \kern\d_grph_rotate_y_position}% - % - \setbox\nextbox\naturalhpack - {\kern\dimexpr\d_grph_rotate_x_position+\d_grph_rotate_x_offset\relax - \lower\d_grph_rotate_y_offset - \box\nextbox}% - % - \ifconditional\c_grph_rotate_center - \setbox\nextbox\naturalhpack{\hskip.5\d_grph_rotate_saved_width\lower-.5\d_grph_rotate_saved_height\box\nextbox}% - \wd\nextbox\d_grph_rotate_saved_width - \ht\nextbox\d_grph_rotate_saved_height - \dp\nextbox\d_grph_rotate_saved_depth - \else - \wd\nextbox\d_grph_rotate_new_width - \ht\nextbox\d_grph_rotate_new_height - \dp\nextbox\d_grph_rotate_new_depth - \fi - % - \boxcursor\box\nextbox} - -% \dostepwiserecurse{0}{360}{10} -% {\startlinecorrection[blank] -% \hbox -% {\expanded{\setuprotate[rotation=\recurselevel]}% -% \traceboxplacementtrue -% \hbox to .2\hsize{\hss\ruledhbox{\rotate[location=depth] {\ruledhbox{\bfb (depth)}}}}% -% \hbox to .2\hsize{\hss\ruledhbox{\rotate[location=fit] {\ruledhbox{\bfb (fit)}}}}% -% \hbox to .2\hsize{\hss\ruledhbox{\rotate[location=broad] {\ruledhbox{\bfb (broad)}}}}% -% \hbox to .2\hsize{\hss\ruledhbox{\rotate[location=normal]{\ruledhbox{\bfb (normal)}}}}% -% \hbox to .2\hsize{\hss\ruledhbox{\rotate[location=high] {\ruledhbox{\bfb (high)}}}}} -% \stoplinecorrection} - -% \def\Test{\ruledhbox{% -% \def\DemoX{\vl\kern.5\emwidth\vl}% -% \kern\emwidth\ruledhpack{\green\rotate[rotation=20] {\ruledhpack{\DemoX}}}% -% \kern\emwidth\ruledhpack{\blue \rotate[rotation=0] {\ruledhpack{\DemoX}}}% -% \kern\emwidth\ruledhpack{\red \rotate[rotation=-20] {\ruledhpack{\DemoX}}}% -% \kern\emwidth\ruledhpack{\green\rotate[rotation=200] {\ruledhpack{\DemoX}}}% -% \kern\emwidth\ruledhpack{\blue \rotate[rotation=180] {\ruledhpack{\DemoX}}}% -% \kern\emwidth\ruledhpack{\red \rotate[rotation=-200]{\ruledhpack{\DemoX}}}% -% \kern\emwidth}} - -% \startTEXpage[offset=10pt,align=middle] -% \setuprotate[location=fit] \Test \par {\infofont\setstrut\strut fit} \par -% \setuprotate[location=depth] \Test \par {\infofont\setstrut\strut depth} \par -% \setuprotate[location=broad] \Test \par {\infofont\setstrut\strut broad} \par -% \setuprotate[location=high] \Test \par {\infofont\setstrut\strut high} \par -% \setuprotate[location=middle] \Test \par {\infofont\setstrut\strut middle} \par -% \setuprotate[location=default] \Test \par {\infofont\setstrut\strut default} \par -% \stopTEXpage - -\protect \endinput |