From 207dc30f13ac103a653d8b69ea61f563d34d037d Mon Sep 17 00:00:00 2001
From: Sandro Santilli <strk@keybit.net>
Date: Wed, 13 Oct 2004 18:39:39 +0000
Subject: [PATCH] Added a third argument to the buffer() function.

git-svn-id: http://svn.osgeo.org/postgis/trunk@993 b70326c6-7e19-0410-871a-916f4a2858ee
---
 lwgeom/lwgeom_geos.c           | 8 +++++---
 lwgeom/lwgeom_geos_wrapper.cpp | 7 ++++---
 lwgeom/lwpostgis.sql.in        | 5 +++++
 3 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/lwgeom/lwgeom_geos.c b/lwgeom/lwgeom_geos.c
index 9eb7de1b6..80c1df111 100644
--- a/lwgeom/lwgeom_geos.c
+++ b/lwgeom/lwgeom_geos.c
@@ -70,7 +70,7 @@ extern char *GEOSversion();
 extern char *GEOSjtsport();
 extern char GEOSisvalid(Geometry *g1);
 extern Geometry *GEOSIntersection(Geometry *g1, Geometry *g2);
-extern Geometry *GEOSBuffer(Geometry *g1,double width);
+extern Geometry *GEOSBuffer(Geometry *g1,double width, int quadsegs);
 extern Geometry *GEOSConvexHull(Geometry *g1);
 extern Geometry *GEOSDifference(Geometry *g1,Geometry *g2);
 extern Geometry *GEOSBoundary(Geometry *g1);
@@ -552,6 +552,7 @@ Datum buffer(PG_FUNCTION_ARGS)
 	double	size;
 	Geometry *g1,*g3;
 	PG_LWGEOM *result;
+	int quadsegs = 8; // the default
 
 #ifdef PROFILE
 	profstart(PROF_QRUN);
@@ -559,13 +560,14 @@ Datum buffer(PG_FUNCTION_ARGS)
 
 	geom1 = (PG_LWGEOM *)  PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
 	size = PG_GETARG_FLOAT8(1);
+	if ( PG_NARGS() > 2 ) quadsegs = PG_GETARG_INT32(3);
 
 	initGEOS(MAXIMUM_ALIGNOF);
 
 #ifdef PROFILE
 	profstart(PROF_P2G1);
 #endif
-	g1 = POSTGIS2GEOS(geom1 );
+	g1 = POSTGIS2GEOS(geom1);
 #ifdef PROFILE
 	profstop(PROF_P2G1);
 #endif
@@ -573,7 +575,7 @@ Datum buffer(PG_FUNCTION_ARGS)
 #ifdef PROFILE
 	profstart(PROF_GRUN);
 #endif
-	g3 = GEOSBuffer(g1,size);
+	g3 = GEOSBuffer(g1,size,quadsegs);
 #ifdef PROFILE
 	profstop(PROF_GRUN);
 #endif
diff --git a/lwgeom/lwgeom_geos_wrapper.cpp b/lwgeom/lwgeom_geos_wrapper.cpp
index 8be873902..950e6efea 100644
--- a/lwgeom/lwgeom_geos_wrapper.cpp
+++ b/lwgeom/lwgeom_geos_wrapper.cpp
@@ -123,7 +123,7 @@ extern "C" int GEOSGeometryTypeId(Geometry *g1);
 extern "C" char *throw_exception(Geometry *g);
 
 extern "C" Geometry *GEOSIntersection(Geometry *g1,Geometry *g1);
-extern "C" Geometry *GEOSBuffer(Geometry *g1,double width);
+extern "C" Geometry *GEOSBuffer(Geometry *g1,double width,int quadsegs);
 extern "C" Geometry *GEOSConvexHull(Geometry *g1);
 extern "C" Geometry *GEOSDifference(Geometry *g1,Geometry *g2);
 extern "C" Geometry *GEOSBoundary(Geometry *g1);
@@ -1113,11 +1113,12 @@ Geometry *GEOSIntersection(Geometry *g1,Geometry *g2)
 	}
 }
 
-Geometry *GEOSBuffer(Geometry *g1,double width)
+Geometry *
+GEOSBuffer(Geometry *g1, double width, int quadrantsegments)
 {
 	try
 	{
-		Geometry *g3 = g1->buffer(width);
+		Geometry *g3 = g1->buffer(width, quadrantsegments);
 		return g3;
 	}
 	catch (GEOSException *ge)
diff --git a/lwgeom/lwpostgis.sql.in b/lwgeom/lwpostgis.sql.in
index 4d9abfd20..2f0b3586a 100644
--- a/lwgeom/lwpostgis.sql.in
+++ b/lwgeom/lwpostgis.sql.in
@@ -2857,6 +2857,11 @@ CREATEFUNCTION buffer(geometry,float8)
    RETURNS geometry
    AS '@MODULE_FILENAME@','buffer'
    LANGUAGE 'C' WITH (isstrict);
+
+CREATEFUNCTION buffer(geometry,float8,integer)
+   RETURNS geometry
+   AS '@MODULE_FILENAME@','buffer'
+   LANGUAGE 'C' WITH (isstrict);
    
 CREATEFUNCTION convexhull(geometry)
 	RETURNS geometry
-- 
2.40.0