2021-10-11 18:37:13 -03:00

326 lines
10 KiB
C

/*
* Copyright (c) 1986, 1987, 1988, 1989 by Sun Microsystems, Inc.
* Permission to use, copy, modify, and distribute this software for any
* purpose and without fee is hereby granted, provided that the above
* copyright notice appear in all copies and that both that copyright
* notice and this permission notice are retained, and that the name
* of Sun Microsystems, Inc., not be used in advertising or publicity
* pertaining to this software without specific, written prior permission.
* Sun Microsystems, Inc., makes no representations about the suitability
* of this software or the interface defined in this software for any
* purpose. It is provided "as is" without express or implied warranty.
*/
#ifndef lint
static char sccsid[] = "@(#)polygon2.c 1.1 94/10/31 Copyr 1985 Sun Micro";
#endif
/*
* Copyright (c) 1985 by Sun Microsystems, Inc.
*/
#include "coretypes.h"
#include "corevars.h"
#include <sunwindow/window_hs.h>
#include <stdio.h>
/****************************************************************************/
/* */
/* FUNCTION: polygon_rel_2 */
/* */
/* PURPOSE: Fill an n sided region with the current color. Clip to */
/* the current window, scale to the viewport, and output to DD. */
/* */
/****************************************************************************/
polygon_rel_2( xlist, ylist, n)
register float *xlist, *ylist;
short n;
{
char *funcname;
short i;
register float x, y, *xptr, *yptr;
float xlistabs[MAXPOLY], ylistabs[MAXPOLY];
funcname = "polygon_rel_2";
if (! _core_osexists) {
_core_errhand(funcname,21);
return(1);
}
if ( n > MAXPOLY) {
_core_errhand(funcname,81);
return(81);
}
if (n < 3) {
_core_errhand(funcname,115);
return(115);
}
xptr = xlistabs;
yptr = ylistabs;
x = _core_cp.x;
y = _core_cp.y;
for (i=0; i<n; i++) {
x += *xlist++;
*xptr++ = x;
y += *ylist++;
*yptr++ = y;
}
(void)polygon_abs_2(xlistabs, ylistabs, n);
return (0);
}
/****************************************************************************/
/* */
/* FUNCTION: polygon_abs_2 */
/* */
/* PURPOSE: Fill an n sided region with the current color. Clip to */
/* the current window, scale to the viewport, and output to DD. */
/* */
/****************************************************************************/
polygon_abs_2( xlist, ylist, n)
float *xlist, *ylist;
int n;
{
char *funcname;
short i;
pt_type p1, p2;
funcname = "polygon_abs_2";
if (! _core_osexists) {
_core_errhand(funcname,21);
return(1);
}
if ( n > MAXPOLY) {
_core_errhand(funcname,81);
return(81);
}
if (n < 3) {
_core_errhand(funcname,115);
return(115);
}
if (_core_fastflag)
{
viewsurf *surfp;
int (*surfdd)();
ddargtype ddstruct;
_core_critflag++;
_core_cp.x = *xlist; _core_cp.y = *ylist;
_core_cpchang = TRUE;
for (i = 0; i < _core_openseg->vsurfnum; i++) {
surfp = _core_openseg->vsurfptr[i];
surfdd = surfp->vsurf.dd;
ddstruct.instance = surfp->vsurf.instance;
if (_core_fillcflag || _core_ropflag || _core_polatt) {
ddstruct.opcode = SETFCOL; /* color changed */
ddstruct.int1 = _core_current.fillindx;
ddstruct.int2 =
(_core_xorflag)?XORROP:_core_current.rasterop;
ddstruct.int3 = FALSE;
(*surfdd)(&ddstruct);
}
if (_core_pisflag || _core_polatt ) {
/* polygon interior changed */
ddstruct.opcode = SETPISTYL;
ddstruct.int1 = _core_current.polyintstyl;
(*surfdd)(&ddstruct);
}
ddstruct.opcode = WLDPLYGNTOSCREEN;
ddstruct.logical = TWOD;
ddstruct.int1 = n;
ddstruct.int2 = (int) &_core_cp;
ddstruct.ptr1 = (char *) xlist;
ddstruct.ptr2 = (char *) ylist;
(*surfdd)(&ddstruct);
}
_core_fillcflag = FALSE;
_core_ropflag = FALSE;
_core_pisflag = FALSE;
_core_pesflag = FALSE;
_core_polatt = FALSE;
if (--_core_critflag == 0 && _core_updatewin && _core_sighandle)
(*_core_sighandle)();
return(0);
}
if (_core_xformvs)
{
ddargtype ddstruct;
_core_critflag++;
_core_cp.x = *xlist; _core_cp.y = *ylist;
_core_cpchang = TRUE;
ddstruct.opcode = WLDPLYGNTONDC;
ddstruct.instance = _core_xformvs->instance;
ddstruct.logical = TWOD;
ddstruct.int1 = n;
ddstruct.int2 = (int) &_core_cp;
/* M -- max # of vertices in output list */
ddstruct.int3 = 2*n;
ddstruct.ptr1 = (char *) xlist;
ddstruct.ptr2 = (char *) ylist;
*((vtxtype **) &ddstruct.float1) = _core_vtxlist; /* output list */
(*_core_xformvs->dd)(&ddstruct);
if (--_core_critflag == 0 && _core_updatewin && _core_sighandle)
(*_core_sighandle)();
if (ddstruct.int3 > 0)
{
(void)pgnall2( 0, ddstruct.int3);
return(0);
}
if (ddstruct.int3 == 0)
return(0); /* polygon not visible or clipped polygon has
more than M vertices */
}
/* get here if !_core_fastflag || !_core_xformvs || too many vertices for
_core_xformvs (ddstruct.int3 return value < 0 above */
/*------------ View transform and clip boundary list --------*/
p1 = _core_cp;
move_abs_2( *xlist, *ylist); /* first point is current point */
_core_vtxcount = 0;
for (i=0; i<n; i++) {
p1.x = *xlist++;
p1.y = *ylist++;
_core_tranpt2( &p1.x, &p2.x); /* transform to NDC */
/* convert to integer points */
_core_pt2cnvrt( &p2.x, &_core_vtxlist[_core_vtxcount++].x);
}
if (_core_wndwclip) {
for (i=0; i<n; i++) /* clip to view window */
_core_clpvtx2( &_core_vtxlist[i]);
_core_clpend2();
for (i=n; i<_core_vtxcount; i++) /* scale to viewport */
_core_vwpscale( (ipt_type *)&_core_vtxlist[i]);
if (_core_vtxcount > n)
(void)pgnall2( n, _core_vtxcount-n);
return(0);
}
for (i=0; i<n; i++) /* scale to viewport */
_core_vwpscale( (ipt_type *)&_core_vtxlist[i]);
(void)pgnall2( 0, n);
return (0);
}
/************************************************************************/
static pgnall2( indx, nvtx) short indx, nvtx;
{
ipt_type ip3;
short ptype, i;
viewsurf *surfp;
int (*surfdd)();
ddargtype ddstruct;
/*---------------- Write polygon stuff out to PDF --------------*/
_core_critflag++;
if (_core_openseg->type >= RETAIN) {
ptype = PDFPICKID;
_core_pdfwrite(SHORT, &ptype);
_core_pdfwrite(FLOAT, (short *)&_core_current.pickid);
_core_pdfwrite(SHORT, &nvtx); /* generate pick extents */
for (i=indx; i<nvtx+indx; i++) {
_core_pdfwrite( FLOAT*3, (short *)&_core_vtxlist[i]);
_core_update_segbndbox(_core_openseg, (ipt_type *)&_core_vtxlist[i]);
}
if (_core_ropflag) { /* color changed */
ptype = PDFROP; _core_pdfwrite(SHORT,&ptype);
_core_pdfwrite(FLOAT,(short *)&_core_current.rasterop);
}
if (_core_fillcflag) { /* color changed */
ptype = PDFFCOLOR; _core_pdfwrite(SHORT,&ptype);
_core_pdfwrite(FLOAT,(short *)&_core_current.fillindx);
}
if (_core_pisflag) { /* color changed */
ptype = PDFPISTYLE; _core_pdfwrite(SHORT,&ptype);
_core_pdfwrite(FLOAT,(short *)&_core_current.polyintstyl);
}
if (_core_pesflag) { /* color changed */
ptype = PDFPESTYLE; _core_pdfwrite(SHORT,&ptype);
_core_pdfwrite(FLOAT,(short *)&_core_current.polyedgstyl);
}
ptype = PDFPOL2; /* put clipped polygon in PDF */
_core_pdfwrite(SHORT,&ptype);
_core_pdfwrite(SHORT,&nvtx);
for (i=indx; i<nvtx+indx; i++) {
_core_pdfwrite( FLOAT*4, (short *)&_core_vtxlist[i]);
}
}
/*--------- Write polygons on all selected surfaces ------------*/
for (i = 0; i < _core_openseg->vsurfnum; i++) {
surfp = _core_openseg->vsurfptr[i];
surfdd = surfp->vsurf.dd;
ddstruct.instance = surfp->vsurf.instance;
if (_core_fillcflag || _core_ropflag || _core_polatt) {
ddstruct.opcode = SETFCOL; /* color changed */
ddstruct.int1 = _core_current.fillindx;
ddstruct.int2 = (_core_xorflag)?XORROP:_core_current.rasterop;
ddstruct.int3 = FALSE;
(*surfdd)(&ddstruct);
}
if (_core_pisflag || _core_polatt ) { /* polygon interior changed */
ddstruct.opcode = SETPISTYL;
ddstruct.int1 = _core_current.polyintstyl;
(*surfdd)(&ddstruct);
}
if ( surfp->hphardwr ) {
if (_core_openseg->segats.visbilty) {
ddstruct.opcode = POLYGN2; /* paint the polygon */
ddstruct.int1 = nvtx;
ddstruct.ptr1 = (char*)(&_core_vtxlist[indx]);
ddstruct.ptr2 = (char*)(&_core_ddvtxlist[indx]);
(*surfdd)(&ddstruct);
}
}
else {
/* image transform the polygon */
if(! _core_openseg->idenflag) {
if(_core_openseg->type == XLATE2) {
for (i=indx; i<nvtx+indx; i++) { /* translate only */
_core_vtxlist[i].x += _core_openseg->imxform[3][0];
_core_vtxlist[i].y += _core_openseg->imxform[3][1];
}
}
else if(_core_openseg->type == XFORM2) {
for (i=indx; i<nvtx+indx; i++) { /* full transform */
_core_moveword( (short *)&_core_vtxlist[i], (short *)&ip3, 8);
_core_imxfrm2( _core_openseg, &ip3, (ipt_type *)&_core_vtxlist[i]);
}
}
}
if (_core_outpclip) {
_core_vtxcount = nvtx + indx;
for (i=indx; i<nvtx+indx; i++) { /* clip to viewport */
_core_oclpvtx2(&_core_vtxlist[i],&_core_vwstate.viewport);
}
_core_oclpend2();
i = nvtx;
nvtx = _core_vtxcount - nvtx - indx;
indx = i + indx;
}
if (_core_openseg->segats.visbilty) {
if (nvtx > 0) {
ddstruct.opcode = POLYGN2; /* paint the polygon */
ddstruct.int1 = nvtx;
ddstruct.ptr1 = (char*)(&_core_vtxlist[indx]);
ddstruct.ptr2 = (char*)(&_core_ddvtxlist[indx]);
(*surfdd)(&ddstruct);
}
}
}
}
_core_fillcflag = FALSE;
_core_ropflag = FALSE;
_core_pisflag = FALSE;
_core_pesflag = FALSE;
_core_polatt = FALSE;
if (--_core_critflag == 0 && _core_updatewin && _core_sighandle)
(*_core_sighandle)();
return(0);
}