summaryrefslogtreecommitdiff
path: root/xc/programs/Xserver/PEX5/ddpex/mi/level1/miPck1Prim.c
diff options
context:
space:
mode:
authordaryll <daryll>1999-12-05 00:59:08 +0000
committerdaryll <daryll>1999-12-05 00:59:08 +0000
commit504880db5611bf0f57206abe44835959c2729147 (patch)
treef22ff902680775b5a6fb49364d305b846606716a /xc/programs/Xserver/PEX5/ddpex/mi/level1/miPck1Prim.c
Initial revision
Diffstat (limited to 'xc/programs/Xserver/PEX5/ddpex/mi/level1/miPck1Prim.c')
-rw-r--r--xc/programs/Xserver/PEX5/ddpex/mi/level1/miPck1Prim.c403
1 files changed, 403 insertions, 0 deletions
diff --git a/xc/programs/Xserver/PEX5/ddpex/mi/level1/miPck1Prim.c b/xc/programs/Xserver/PEX5/ddpex/mi/level1/miPck1Prim.c
new file mode 100644
index 000000000..311ad9297
--- /dev/null
+++ b/xc/programs/Xserver/PEX5/ddpex/mi/level1/miPck1Prim.c
@@ -0,0 +1,403 @@
+/* $TOG: miPck1Prim.c /main/4 1998/02/10 12:40:00 kaleb $ */
+/*
+
+Copyright 1989, 1990, 1991, 1998 The Open Group
+
+All Rights Reserved.
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization
+from The Open Group.
+
+
+Copyright 1989, 1990, 1991 by Sun Microsystems, Inc.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation 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 appear in
+supporting documentation, and that the name of Sun Microsystems,
+not be used in advertising or publicity pertaining to distribution of
+the software without specific, written prior permission.
+
+SUN MICROSYSTEMS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT
+SHALL SUN MICROSYSTEMS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+*/
+
+#include "miRender.h"
+#include "misc.h"
+#include "miscstruct.h"
+#include "PEXErr.h"
+#include "miStruct.h"
+#include "miFont.h"
+#include "miWks.h"
+#include "miText.h"
+#include "miClip.h"
+
+
+/*++
+ |
+ | Function Name: miPick1PolyLine
+ |
+ | Function Description:
+ | Handles the level 1picking of Polyline 3D, Polyline 2D,
+ | Polyline 3D with data OCs.
+ |
+ | Note(s):
+ |
+ ++*/
+
+ddpex2rtn
+miPick1PolyLine(pRend, pddc, input_list)
+/* in */
+ ddRendererPtr pRend; /* renderer handle */
+ miDDContext *pddc;
+ miListHeader *input_list;
+{
+/* calls */
+
+ /* Check if anything is remaining. If so, the pick volume */
+ /* intersects the polyline(s). If not, everything has been */
+ /* clipped out. Accordingly, update the global Pick_Flag. */
+
+ if (input_list->numLists > 0) {
+ pddc->Static.pick.status = PEXOk;
+ }
+ return (Success);
+}
+
+
+/*++
+ |
+ | Function Name: miPick1Text
+ |
+ | Function Description:
+ | Handles the level 1 picking of Text OCs.
+ |
+ | Note(s):
+ |
+ ++*/
+
+ddpex2rtn
+miPick1Text(pRend, pddc, input_list)
+/* in */
+ ddRendererPtr pRend; /* renderer handle */
+ miDDContext *pddc;
+ miListHeader *input_list;
+/* out */
+{
+/* calls */
+
+ /* Check if anything is remaining. If so, the pick volume */
+ /* intersects the polyline(s). If not, everything has been */
+ /* clipped out. Accordingly, update the global Pick_Flag. */
+
+ if (input_list->numLists > 0) {
+ pddc->Static.pick.status = PEXOk;
+ }
+ return (Success);
+}
+
+
+/*++
+ |
+ | Function Name: miPick1Marker
+ |
+ | Function Description:
+ | Handles the level 1 picking of Marker OCs.
+ |
+ | Note(s):
+ |
+ ++*/
+
+ddpex2rtn
+miPick1Marker(pRend, pddc, input_list)
+/* in */
+ ddRendererPtr pRend; /* renderer handle */
+ miDDContext *pddc;
+ miListHeader *input_list;
+/* out */
+{
+/* calls */
+
+ /* Check if anything is remaining. If so, the pick volume */
+ /* intersects the polymarker(s). If not, everything has been*/
+ /* clipped out. Accordingly, update the global Pick_Flag. */
+
+ if (input_list->numLists > 0) {
+ pddc->Static.pick.status = PEXOk;
+ }
+ return (Success);
+}
+
+
+/*
+ * Function Name: CheckFillAreaPick
+ *
+ * Purpose: Check if the input set of points represents a polygon that
+ * is INSIDE or OUTSIDE of the pick aperture.
+ *
+ * Return: Success if the points represent a polygon that is inside.
+ * Otherwise, return a negative number indicating NO_PICK.
+ *
+ */
+static
+ddpex2rtn
+CheckFAreaPick1 (in_list)
+/* in */
+ miListHeader *in_list;
+/* out */
+{
+/* calls */
+
+/* Local variables */
+
+ listofddPoint *poly_list;
+ ddPointUnion pt_list;
+ int pt_size;
+ ddCoord2D v1, v2;
+ ddSHORT x_same, y_same;
+ int i, j;
+ int vcount, hcount;
+
+ /*----------------------Picking Algorithm-------------------------*/
+ /* */
+ /* The first step is to look for trivial acceptance. I.E., the re-*/
+ /* maining polygon is partially enclosed by the pick aperture and */
+ /* at least one point lies completely within the aperture. */
+ /* If not, we have a possible degenerate case wherein, the edges */
+ /* of the remaining polygon is coinciding with the faces of the */
+ /* pick aperture. This also means that all the edges are either */
+ /* horizontal or vertical. There can be no 3D diagonal edges. */
+ /* */
+ /* The algorithm implemented here uses the odd-even rule. The idea*/
+ /* is to treat the input points, a pair at a time as an edge of */
+ /* the polygon remaining. The edge is tested to see if it is hor- */
+ /* -izontal, or vertical or diagonal. Note that we use the 3D def-*/
+ /* inition of horizontal, vertical, and diagonal here. A horizon- */
+ /* edge is an edge parallel to X or Z axis, a vertical edge is one*/
+ /* being parallel to only Y axis, and a diagonal edge is one which*/
+ /* is NOT parallel to any of the three axes of the 3D aperture. */
+ /* */
+ /* Thus, clearly, any diagonal edge present means that the polygon*/
+ /* is intersecting the pick aperture and hence a PICK condition is*/
+ /* detected. However, if there are no diagonal edges, then we have*/
+ /* a degenerate situation with the vertical or horizontal edges at*/
+ /* or on the boundaries of the pick aperture. */
+ /* Using the odd-even rule it is clear that if there are an odd */
+ /* number of vertical edges either to the left or in front of the */
+ /* center of the pick aperture, or to the right or in back of the */
+ /* center of the pick aperture, then the pick is sorrounded by the*/
+ /* polygon and hence is picked. On the other hand, if the number */
+ /* of vertical edges is even, then we have the pick aperture OUT-*/
+ /* SIDE of the polygon, and thus is not picked. The horizontal */
+ /* edges testing come into picture when there are no vertical ones*/
+ /* present. The test once again is to check whether the count of */
+ /* horizontal edges either to the left or front, or right or back */
+ /* of the center of the aperture, is even or odd. If odd, detect */
+ /* a PICK, else, detect a NO_PICK. */
+ /* */
+ /*----------------------------------------------------------------*/
+
+ /* Test for trivial pick case. i.e., at least one point is fully */
+ /* contained within the converted pick aperture in CC. */
+
+ poly_list = in_list->ddList; /* Initialize poly list pointer */
+
+ DD_VertPointSize (in_list->type, pt_size); /* Get point size */
+
+ for (i=0; i<in_list->numLists; i++, poly_list++) {
+
+ /* Get the pointer to the next points list */
+
+ pt_list.ptr = poly_list->pts.ptr;
+
+ for (j=0; j<in_list->ddList->numPoints; j++) {
+
+ /* Update pt_list to point to next point */
+
+ pt_list.ptr += pt_size;
+
+ /* Test for containment within the pick aperture */
+
+ if ((pt_list.p2DSpt->x > -1) &&
+ (pt_list.p2DSpt->x < 1) &&
+ (pt_list.p2DSpt->y > -1) &&
+ (pt_list.p2DSpt->y < 1))
+
+ /* This point is fully within the pick aperture. */
+ /* No need to test further. Just detect PICK. */
+
+ return (Success);
+ }
+ }
+
+ /* We have a degenerate polygon. Test further to determine if the */
+ /* pick aperture is fully or partially enclosed by the polygon. */
+
+ /* Initialize the vertical and horizontal edge counters */
+
+ vcount = hcount = 0;
+
+ /* Set up a loop for testing edges and counting vertical edges */
+ /* and horizontal edges. */
+
+ poly_list = in_list->ddList; /* Initialize poly list pointer */
+
+ for (i=0; i<in_list->numLists; i++, poly_list++) { /* Do for all Polys */
+
+ /* Get the pointer to the next points list */
+
+ pt_list.ptr = poly_list->pts.ptr;
+
+ for (j=0; j<in_list->ddList->numPoints-1; j++) { /* Do for all edges */
+
+ /* Get the first vertex of current edge */
+
+ v1.x = pt_list.p2DSpt->x;
+ v1.y = pt_list.p2DSpt->y;
+
+ /* Update pt_list to point to next point */
+
+ pt_list.ptr += pt_size;
+
+ /* Get the next vertex of current edge */
+
+ v2.x = pt_list.p2DSpt->x;
+ v2.y = pt_list.p2DSpt->y;
+
+ /* Test the edge type and update the vcount and the hcount */
+
+ if (MI_NEAR_ZERO(v1.x-v2.x))
+ x_same = 1;
+ else
+ x_same = 0;
+
+ if (MI_NEAR_ZERO(v1.y-v2.y))
+ y_same = 1;
+ else
+ y_same = 0;
+
+ if ((x_same)&&(v1.x > 0))
+ /* Edge is parallel to Y axis AND is to the right */
+ /* of the center of pick aperture; Increment vcount*/
+
+ vcount++;
+
+ if ((y_same)&&(v1.y > 0))
+ /* Edge is parallel to X axis AND is to the top of */
+ /* the center of pick aperture; Increment the hcount*/
+
+ hcount++;
+
+ } /* Loop for all edges of current polygon */
+
+ /* Test if vcount = odd; if so, detect PICK */
+
+ if (vcount%2) {
+ return (Success);
+ }
+ else {
+
+ /* Else, if vcount == 0, test if hcount = odd; */
+ /* if so, detect PICK. */
+
+ if ((vcount == 0)&&(hcount%2)) return (Success);
+ }
+
+ continue; /* Try the next polygon for containment test */
+
+ } /* Loop for all polygons */
+
+ return (-1); /* Return negative to indicate NO_PICK */
+}
+
+
+/*++
+ |
+ | Function Name: miPick1FillArea
+ |
+ | Function Description:
+ | Handles the level 1 picking of FillArea OCs.
+ |
+ | Note(s):
+ |
+ ++*/
+
+ddpex2rtn
+miPick1FillArea(pRend, pddc, input_list, input_facet, shape, noedges)
+/* in */
+ ddRendererPtr pRend; /* renderer handle */
+ miDDContext *pddc;
+ miListHeader *input_list;
+ listofddFacet *input_facet;
+ ddBitmaskShort shape;
+ ddUCHAR noedges;
+/* out */
+{
+/* calls */
+
+ /* Check for successful polygon pick */
+
+ if (CheckFAreaPick1 (input_list) == Success) {
+ pddc->Static.pick.status = PEXOk;
+ }
+ return (Success);
+}
+
+
+/*++
+ |
+ | Function Name: miPick1TriStrip
+ |
+ | Function Description:
+ | Handles the level 1 picking of Triangle Strip OCs.
+ |
+ | Note(s):
+ |
+ ++*/
+
+ddpex2rtn
+miPick1TriStrip(pRend, pddc, input_list, input_facet)
+/* in */
+ ddRendererPtr pRend; /* renderer handle */
+ miDDContext *pddc;
+ miListHeader *input_list;
+ listofddFacet *input_facet;
+/* out */
+{
+/* calls */
+
+ /* Check for successful triangle strip pick. */
+ /* Note that clipper for triangle strips will*/
+ /* NOT generate dengenerate cases and hence */
+ /* any remaining vertices will constitute a */
+ /* Pick situation. */
+
+ if ((input_list->numLists) > 0) {
+ pddc->Static.pick.status = PEXOk;
+ }
+ return (Success);
+}
+
+