home *** CD-ROM | disk | FTP | other *** search
- /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
- *
- * The contents of this file are subject to the Netscape Public License
- * Version 1.0 (the "NPL"); you may not use this file except in
- * compliance with the NPL. You may obtain a copy of the NPL at
- * http://www.mozilla.org/NPL/
- *
- * Software distributed under the NPL is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
- * for the specific language governing rights and limitations under the
- * NPL.
- *
- * The Initial Developer of this code under the NPL is Netscape
- * Communications Corporation. Portions created by Netscape are
- * Copyright (C) 1998 Netscape Communications Corporation. All Rights
- * Reserved.
- */
-
- #include "xp.h"
-
-
- Bool
- lo_is_location_in_poly(int32 x, int32 y, int32 *coords, int32 coord_cnt)
- {
- int32 totalv = 0;
- int32 totalc = 0;
- int32 intersects = 0;
- int32 wherex = x;
- int32 wherey = y;
- int32 xval, yval;
- int32 *pointer;
- int32 *end;
-
- totalv = coord_cnt / 2;
- totalc = totalv * 2;
-
- xval = coords[totalc - 2];
- yval = coords[totalc - 1];
- end = &coords[totalc];
-
- pointer = coords + 1;
-
- if ((yval >= wherey) != (*pointer >= wherey))
- if ((xval >= wherex) == (*coords >= wherex))
- intersects += (xval >= wherex);
- else
- intersects += (xval - (yval - wherey) *
- (*coords - xval) /
- (*pointer - yval)) >= wherex;
-
- while(pointer < end) {
- yval = *pointer;
- pointer += 2;
-
- if(yval >= wherey) {
- while((pointer < end) && (*pointer >= wherey))
- pointer+=2;
- if (pointer >= end)
- break;
- if( (*(pointer-3) >= wherex) == (*(pointer-1) >= wherex) )
- intersects += (*(pointer-3) >= wherex);
- else
- intersects += (*(pointer-3) - (*(pointer-2) - wherey) *
- (*(pointer-1) - *(pointer-3)) /
- (*pointer - *(pointer - 2))) >= wherex;
-
- } else {
- while((pointer < end) && (*pointer < wherey))
- pointer+=2;
- if (pointer >= end)
- break;
- if( (*(pointer-3) >= wherex) == (*(pointer-1) >= wherex) )
- intersects += (*(pointer-3) >= wherex);
- else
- intersects += (*(pointer-3) - (*(pointer-2) - wherey) *
- (*(pointer-1) - *(pointer-3)) /
- (*pointer - *(pointer - 2))) >= wherex;
- }
- }
- if (intersects & 1)
- return (TRUE);
- else
- return (FALSE);
- }
-
-
- /* #ifndef NO_TAB_NAVIGATION */
- Bool
- lo_find_location_in_poly(int32 *xx, int32 *yy, int32 *coords, int32 coord_cnt)
- {
- int32 x1, y1, x2, y2, px1, py1, px2, py2;
- int32 ii;
-
- /* get a edge of the polygon */
- x1 = y1 = x2 = y2 = 0;
- for( ii = 0; (ii <= coord_cnt-4) && (x1==x2) && (y1==y2); ii+=2 ) {
- x1 = coords[ii];
- y1 = coords[ii+1];
- x2 = coords[ii+2];
- y2 = coords[ii+3];
-
- if( (x1!=x2) || (y1!=y2) ) {
- /* got a good edge, try it. */
- /* get a point on each side of the edge, 2 pixels away, not too close */
- px1 = ( x1 + x2 ) / 2 + 2;
- px2 = px1 - 4;
- py1 = ( y1 + y2 ) / 2 + 2;
- py2 = py1 - 4;
-
- if( lo_is_location_in_poly( px1, py1, coords, coord_cnt) ) {
- *xx = px1;
- *yy = py1;
- return( TRUE );
- }
-
- if( lo_is_location_in_poly( px2, py2, coords, coord_cnt) ) {
- *xx = px2;
- *yy = py2;
- return( TRUE );
- }
- }
-
- }
-
-
- return( FALSE );
- }
- /* NO_TAB_NAVIGATION */
-
-