/*
   This file is part of the VRender library.
   Copyright (C) 2005 Cyril Soler (Cyril.Soler@imag.fr)
   Version 1.0.0, released on June 27, 2005.

   http://artis.imag.fr/Members/Cyril.Soler/VRender

   VRender 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 of the License, or
   (at your option) any later version.

   VRender 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 VRender; if not, write to the Free Software Foundation, Inc.,
   59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 */

/****************************************************************************

   Copyright (C) 2002-2008 Gilles Debunne. All rights reserved.

   This file is part of the QGLViewer library version 2.3.5.

   http://www.libqglviewer.com - contact@libqglviewer.com

   This file may be used under the terms of the GNU General Public License
   versions 2.0 or 3.0 as published by the Free Software Foundation and
   appearing in the LICENSE file included in the packaging of this file.
   In addition, as a special exception, Gilles Debunne gives you certain
   additional rights, described in the file GPL_EXCEPTION in this package.

   libQGLViewer uses dual licensing. Commercial/proprietary software must
   purchase a libQGLViewer Commercial License.

   This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
   WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.

 *****************************************************************************/

/*
   ===========================================================================

   Project:   Generic Polygon Clipper

           A new algorithm for calculating the difference, intersection,
           exclusive-or or union of arbitrary polygon sets.

   File:      gpc.h
   Author:    Alan Murta (email: gpc@cs.man.ac.uk)
   Version:   2.32
   Date:      17th December 2004

   Copyright: (C) 1997-2004, Advanced Interfaces Group,
           University of Manchester.

           This software is free for non-commercial use. It may be copied,
           modified, and redistributed provided that this copyright notice
           is preserved on all copies. The intellectual property rights of
           the algorithms used reside with the University of Manchester
           Advanced Interfaces Group.

           You may not use this software, in whole or in part, in support
           of any commercial product without the express consent of the
           author.

           There is no warranty or other guarantee of fitness of this
           software for any purpose. It is provided solely "as is".

   ===========================================================================
 */

#ifndef __gpc_h
#define __gpc_h

#include <stdio.h>

/*
   ===========================================================================
                               Constants
   ===========================================================================
 */

/* Increase GPC_EPSILON to encourage merging of near coincident edges    */

//#define GPC_EPSILON (DBL_EPSILON)
#define GPC_EPSILON 1e-7

#define GPC_VERSION "2.32"

/*
   ===========================================================================
                           Public Data Types
   ===========================================================================
 */

typedef enum /* Set operation type                */
{ GPC_DIFF,  /* Difference                        */
  GPC_INT,   /* Intersection                      */
  GPC_XOR,   /* Exclusive or                      */
  GPC_UNION  /* Union                             */
} gpc_op;

typedef struct /* Polygon vertex structure          */
{
  double x;   /* Vertex x component                */
  double y;   /* vertex y component                */
} gpc_vertex;

typedef struct /* Vertex list structure             */
{
  int num_vertices;     /* Number of vertices in list        */
  gpc_vertex* vertex;   /* Vertex array pointer              */
} gpc_vertex_list;

typedef struct /* Polygon set structure             */
{
  int num_contours;           /* Number of contours in polygon     */
  int* hole;                  /* Hole / external contour flags     */
  gpc_vertex_list* contour;   /* Contour array pointer             */
} gpc_polygon;

typedef struct /* Tristrip set structure            */
{
  int num_strips;           /* Number of tristrips               */
  gpc_vertex_list* strip;   /* Tristrip array pointer            */
} gpc_tristrip;

/*
   ===========================================================================
                       Public Function Prototypes
   ===========================================================================
 */

void gpc_read_polygon(FILE* infile_ptr, int read_hole_flags, gpc_polygon* polygon);

void gpc_write_polygon(FILE* outfile_ptr, int write_hole_flags, gpc_polygon* polygon);

void gpc_add_contour(gpc_polygon* polygon, gpc_vertex_list* contour, int hole);

void gpc_polygon_clip(gpc_op set_operation, gpc_polygon* subject_polygon, gpc_polygon* clip_polygon,
                      gpc_polygon* result_polygon);

void gpc_tristrip_clip(gpc_op set_operation, gpc_polygon* subject_polygon, gpc_polygon* clip_polygon,
                       gpc_tristrip* result_tristrip);

void gpc_polygon_to_tristrip(gpc_polygon* polygon, gpc_tristrip* tristrip);

void gpc_free_polygon(gpc_polygon* polygon);

void gpc_free_tristrip(gpc_tristrip* tristrip);

#endif

/*
   ===========================================================================
                           End of file: gpc.h
   ===========================================================================
 */
