/* * pushmatrix * * Push the top matrix of the stack down, placing a copy * of it on the top of the stack. * */ void pushmatrix(void) { Mstack *tmpmat; Token *p; if (vdevice.inobject) { p = newtokens(1); p->i = PUSHMATRIX; return; } if (msfree != (Mstack *)NULL) { tmpmat = vdevice.transmat; vdevice.transmat = msfree; msfree = msfree->back; vdevice.transmat->back = tmpmat; copymatrix(vdevice.transmat->m, tmpmat->m); } else { tmpmat = (Mstack *)vallocate(sizeof(Mstack)); tmpmat->back = vdevice.transmat; copymatrix(tmpmat->m, vdevice.transmat->m); vdevice.transmat = tmpmat; } }
/* * pushviewport * * pushes the current viewport on the viewport stack * */ void pushviewport() { Vstack *nvport; Token *tok; if (!vdevice.initialised) verror("pushviewport: vogle not initialised"); if (vdevice.inobject) { tok = newtokens(1); tok->i = PUSHVIEWPORT; return; } if (vsfree != (Vstack *)NULL) { nvport = vdevice.viewport; vdevice.viewport = vsfree; vsfree = vsfree->back; vdevice.viewport->back = nvport; vdevice.viewport->v.left = nvport->v.left; vdevice.viewport->v.right = nvport->v.right; vdevice.viewport->v.bottom = nvport->v.bottom; vdevice.viewport->v.top = nvport->v.top; } else { nvport = (Vstack *)vallocate(sizeof(Vstack)); nvport->back = vdevice.viewport; nvport->v.left = vdevice.viewport->v.left; nvport->v.right = vdevice.viewport->v.right; nvport->v.bottom = vdevice.viewport->v.bottom; nvport->v.top = vdevice.viewport->v.top; vdevice.viewport = nvport; } }