summaryrefslogtreecommitdiff
path: root/Build/source/texk/windvi/wintransf.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/windvi/wintransf.c')
-rw-r--r--Build/source/texk/windvi/wintransf.c201
1 files changed, 201 insertions, 0 deletions
diff --git a/Build/source/texk/windvi/wintransf.c b/Build/source/texk/windvi/wintransf.c
new file mode 100644
index 00000000000..ea90c10521b
--- /dev/null
+++ b/Build/source/texk/windvi/wintransf.c
@@ -0,0 +1,201 @@
+/*
+ wintransf.c : implementation file
+ Time-stamp: "03/05/21 23:50:21 popineau"
+
+ Copyright (C) 1999
+ Fabrice Popineau <Fabrice.Popineau@supelec.fr>
+
+ This file is part of Windvi.
+
+ Windvi is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ Windvi is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+ License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Windvi; if not, write to the Free Software Foundation, 59
+ Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#include "wingui.h"
+#include "xdvi-config.h"
+
+#define DEBUG_TRANSF 0
+
+#define XFRM_INITIAL 100
+
+XFORM xfrmTransf = {1.0, 0.0, 0.0, 1.0, 0.0, 0.0};
+XFORM xfrmUnit = {1.0, 0.0, 0.0, 1.0, 0.0, 0.0};
+
+typedef struct _xfrm_stack {
+ long dviptr;
+ XFORM xfrm;
+} xfrm_stack;
+
+xfrm_stack *xfrmStack;
+int top_xfrm;
+int xfrmStack_len;
+
+BOOL bTransfInUse = FALSE;
+XFORM xfrm_unit = { 1.0, 0.0, 0.0, 1.0, 0.0,0.0 };
+XFORM current_transf;
+
+void init_xfrm_stack()
+{
+ top_xfrm = 0;
+ xfrmStack_len = XFRM_INITIAL;
+ xfrmStack = xmalloc(sizeof(xfrm_stack)*XFRM_INITIAL);
+ current_transf = xfrm_unit;
+}
+
+void reset_xfrm_stack()
+{
+ XFORM xfrm;
+ top_xfrm = 0;
+#if DEBUG_TRANSF
+ fprintf(stderr, "Resetting transformation stack.\n");
+#endif
+ if (ModifyWorldTransform(foreGC, &xfrm, MWT_IDENTITY) == 0)
+ Win32Error("reset_xfrm_stack/ModifyWorldTransform");
+ bTransfInUse = FALSE;
+ current_transf = xfrm_unit;
+}
+
+void xfrm_dump_stack()
+{
+ int i;
+ for (i = 0; i < top_xfrm; i++) {
+ fprintf(stderr, "xfrmStack[%d] = [%f %f %f %f %f %f] pos = %ld\n", i,
+ xfrmStack[i].xfrm.eM11, xfrmStack[i].xfrm.eM12,
+ xfrmStack[i].xfrm.eM21, xfrmStack[i].xfrm.eM22,
+ xfrmStack[i].xfrm.eDx, xfrmStack[i].xfrm.eDy,
+ xfrmStack[i].dviptr);
+ }
+}
+
+void xfrm_record(XFORM *x)
+{
+#if 0
+ __asm int 3;
+#endif
+ int i;
+
+ if (!resource.use_xform || !x) return;
+
+ for (i = 0; i < top_xfrm; i++) {
+ if (xfrmStack[i].dviptr == currinf.pos) {
+ /* Already in there, return */
+ /* FIXME : should we do any check for the *same* transf ? */
+ return;
+ }
+ else if(xfrmStack[i].dviptr > currinf.pos) {
+ /* insert it at this position and move up everything else */
+ break;
+ }
+ }
+ if (top_xfrm+1 > xfrmStack_len) {
+ xfrmStack_len *= 2;
+ xfrmStack = xrealloc(xfrmStack, sizeof(xfrm_stack)*xfrmStack_len);
+ }
+ if (i == top_xfrm) {
+ xfrmStack[top_xfrm].dviptr = currinf.pos;
+ xfrmStack[top_xfrm].xfrm = *x;
+ top_xfrm++;
+ }
+ else {
+ memmove(xfrmStack+(i+1), xfrmStack+i, (top_xfrm - i)*sizeof(xfrm_stack));
+ xfrmStack[i].dviptr = currinf.pos;
+ xfrmStack[i].xfrm = *x;
+ top_xfrm++;
+ }
+#if DEBUG_TRANSF
+ fprintf(stderr, "inserting (pos = %ld) xfrmStack[%d] = [%f %f %f %f %f %f]\n",
+ currinf.pos, i,
+ xfrmStack[i].xfrm.eM11, xfrmStack[i].xfrm.eM12,
+ xfrmStack[i].xfrm.eM21, xfrmStack[i].xfrm.eM22,
+ xfrmStack[i].xfrm.eDx, xfrmStack[i].xfrm.eDy);
+ xfrm_dump_stack();
+#endif
+}
+
+void xfrm_apply()
+{
+ int i = -1;
+ long pos = currinf.pos;
+ POINT mane_points[3];
+ XFORM xfrm = xfrm_unit;
+#if 0
+ __asm int 3;
+ fprintf(stderr, "Entering xfrm_apply\n");
+#endif
+ if (!resource.use_xform) return;
+
+#if DEBUG_TRANSF
+ fprintf(stderr, "xfrm_apply: pos = %ld\n", pos);
+ xfrm_dump_stack();
+#endif
+ for (i = 0; i < top_xfrm; i++) {
+ if (pos == xfrmStack[i].dviptr) {
+ xfrm = xfrmStack[i].xfrm;
+ break;
+ }
+ }
+ if (i < top_xfrm) {
+ if (foreGC == magMemDC || foreGC == magDC) {
+ extern int magWidth, magHeight;
+#if 1
+ /* FIXME : I'm afraid it can be solved only by applying
+ transformations in XPutImage !
+ */
+
+#if 0
+ xfrm.eDx += ((xfrm.eM11 -1)*(currwin.base_x + magWidth) + xfrm.eM21*(currwin.base_y + magHeight))/mane.shrinkfactor;
+ xfrm.eDy += (xfrm.eM12*(currwin.base_x + magWidth) + (xfrm.eM22-1)*(currwin.base_y + magHeight))/mane.shrinkfactor;
+#endif
+ xfrm.eDx += (xfrm.eM11 -1)*(currwin.base_x) + xfrm.eM21*(currwin.base_y);
+ xfrm.eDy += xfrm.eM12*(currwin.base_x) + (xfrm.eM22-1)*(currwin.base_y);
+
+ bTransfInUse = (fabs(xfrm.eM11 - 1.0)
+ + fabs(xfrm.eM12)
+ + fabs(xfrm.eM21)
+ + fabs(xfrm.eM22 - 1.0)
+ + fabs(xfrm.eDx)
+ + fabs(xfrm.eDy)) > .0001 ;
+#else
+ bTransfInUse = FALSE;
+#endif
+ }
+ else {
+ bTransfInUse = (fabs(xfrm.eM11 - 1.0)
+ + fabs(xfrm.eM12)
+ + fabs(xfrm.eM21)
+ + fabs(xfrm.eM22 - 1.0)
+ + fabs(xfrm.eDx)
+ + fabs(xfrm.eDy)) > .0001 ;
+ }
+ if (!bTransfInUse) {
+ if (ModifyWorldTransform(foreGC, &xfrm, MWT_IDENTITY) == 0)
+ Win32Error("xfrm_apply/ModifyWorldTransform");
+ current_transf = xfrm_unit;
+ }
+ else {
+#if 0
+ fprintf(stderr, "Applying transf [%f %f %f %f %f %f] to foreGC\n",
+ xfrm.eM11, xfrm.eM12,
+ xfrm.eM21, xfrm.eM22,
+ xfrm.eDx, xfrm.eDy);
+ fprintf(stderr, "currwin orig: (%d %d)\n", currwin.base_x, currwin.base_y);
+#endif
+#if 0
+ if (SetWorldTransform(foreGC, &(xfrm)) == 0)
+ Win32Error("xfrm_apply/SetWorldTransform");
+#else
+ current_transf = xfrm;
+#endif
+ }
+ }
+}