% File `devguide.tex' is the Developers Guide for iTe.
% This guide is incomplete to the point of uselessness.
%
% Copyright (C) 1999 by Wolfgang Kuehn
\documentclass{article}
\newcommand{\iTe}{\textbf{\large iTe}}
\begin{document}
\begin{titlepage}
\begin{center}{\Large
\iTe, the interactive \TeX\ editor\\[6pt]
Developer's Guide Version 1.2\\[24pt]
Wolfgang K\"uhn\\[6pt]
February 1999}
\end{center}
\end{titlepage}
\section{Zooming}
Zooming is one of the trickier features of \iTe. Any (affine)
transformation matrix $T$ in PostScript can be written as
\[
T(x, y) = T_L (x, y)+ T_t,
\]
where $T_L$ is a $2\times 2$ matrix and $T_t$ is a translation vector.
Internally, $T$ is stored as a $6$-array
\[
T=[T_L(1,1)\ T_L(1,2)\ T_L(2,1)\ T_L(2,2)\ T_t(1)\ T_t(2)].
\]
Any point $(x, y)$ in user space is mapped to a point in device space
$(\tilde x, \tilde y)$ by a serie of 3 transformations:
\[
RZT(x, y)=(\tilde x, \tilde y).
\]
Here $R$ is the current transformation matrix before a page is
started, i.e., before \emph{bop} is issued. The transformation $RT$ is
the current transformation matrix after \emph{bop} has been issued
with a current zoom matrix $Z$ equals the idendity. The component
$Z_L$ of the zoom matrix $Z$ is given by the user supplied zoom factor
$f$,
\[
Z_L=[f\ 0\ 0\ f].
\]
The transformation $Z$ is issued via a $\emph{Z concat}$ immediately
before a page is started.
Now suppose the user wants to zoom with a new zoom factor $f^n$.
We need to find a new zoom matrix $Z^n$
\[
Z^n=[f^n\ 0\ 0\ f^n\ Z^n_t(1)\ Z^n_t(2)]
\]
with unknown translation vector $Z^n_t$ such that
\[
RZ^nT(x, y)=(\tilde x_c, \tilde y_c).
\]
Here $(\tilde x_c, \tilde y_c)$ is the center of the device and
$(x,y)$ the current point (location of current object) in user space.
Therefore
\[
Z^n_t=R^{-1}(\tilde x_c, \tilde y_c)-Z^n_L T(x,y)
=-Z^n_L Z^{-1}R^{-1}(\tilde x, \tilde y)
+R^{-1}(\tilde x_c, \tilde y_c).
\]
For given zoom matrix $Z$ the devices coordinates $(\tilde x, \tilde y)$ of
all objects on the page have to be computed via a \emph{currentpoint transform}.
These coordinates are then stored in the array \emph{pointinfo}.
Note that $R^{-1}(\tilde x_c, \tilde y_c)$ is the center of the initial
PostScript user space,
\[
R^{-1}(\tilde x_c, \tilde y_c) = (\textrm{\emph{DEVICEWIDTH}}/2,
\textrm{\emph{DEVICEHEIGHT}}/2).
\]
For A4 paper size, the default, \emph{DEVICEWIDTH}=596 and \emph{DEVICEHEIGHT}=842.
The construction of $Z^n$ is now accomplished with the following code:
\begin{verbatim}
/Z
[
f^n 0 0 f^n % define Z^n_L
% push (\tilde x, \tilde y) on stack
pointinfo object-number 2 mul 2 getinterval aload pop
R itransform Z itransform
[
-f^n 0 0 -f^n DEVICEWIDTH DEVICEHEIGHT
] transform
% now the translation vector Z^n_t is on top of the stack
] def % complete definition of Z
\end{verbatim}
\end{document}