Index: contour.cpp
===================================================================
--- contour.cpp	(revision 17600)
+++ contour.cpp	(working copy)
@@ -58,15 +58,18 @@
     double *padfX;
     double *padfY;
 
+	int bLeftIsHigh; //HGP
+
     double dfTailX;
 
     GDALContourItem( double dfLevel );
     ~GDALContourItem();
 
     int    AddSegment( double dfXStart, double dfYStart,
-                       double dfXEnd, double dfYEnd );
+                       double dfXEnd, double dfYEnd, int bLeftHigh );
     void   MakeRoomFor( int );
     int    Merge( GDALContourItem * );
+	void   PrepareEjection();
 };
 
 /************************************************************************/
@@ -120,7 +123,7 @@
 
     CPLErr AddSegment( double dfLevel, 
                        double dfXStart, double dfYStart,
-                       double dfXEnd, double dfYEnd );
+                       double dfXEnd, double dfYEnd, int bLeftHigh );
 
     CPLErr ProcessPixel( int iPixel );
     CPLErr ProcessRect( double, double, double, 
@@ -527,15 +530,22 @@
         double adfX[4], adfY[4];
         CPLErr eErr;
 
+		// Logs how many points we have af left + bottom, and left + bottom + right.
+		int nPoints1 = 0, nPoints2 = 0, nPoints3 = 0; // HGP
+
+
         Intersect( dfUpLeft, dfUpLeftX, dfUpLeftY,
                    dfLoLeft, dfLoLeftX, dfLoLeftY,
                    dfLoRight, dfLevel, &nPoints, adfX, adfY );
+		nPoints1 = nPoints;
         Intersect( dfLoLeft, dfLoLeftX, dfLoLeftY,
                    dfLoRight, dfLoRightX, dfLoRightY,
                    dfUpRight, dfLevel, &nPoints, adfX, adfY );
+		nPoints2 = nPoints; //hgp
         Intersect( dfLoRight, dfLoRightX, dfLoRightY,
                    dfUpRight, dfUpRightX, dfUpRightY,
                    dfUpLeft, dfLevel, &nPoints, adfX, adfY );
+		nPoints3 = nPoints; //hgp
         Intersect( dfUpRight, dfUpRightX, dfUpRightY,
                    dfUpLeft, dfUpLeftX, dfUpLeftY,
                    dfLoLeft, dfLevel, &nPoints, adfX, adfY );
@@ -545,7 +555,14 @@
 
         if( nPoints >= 2 )
         {
-            eErr = AddSegment( dfLevel, adfX[0], adfY[0], adfX[1], adfY[1] );
+			if( 
+				( ((nPoints1 == 1 && nPoints2 == 2) || (nPoints1 == 1 && nPoints3 == 2 ) || (nPoints1 == 1 && nPoints == 2)) && dfUpLeft > dfLoLeft ) ||
+				( ((nPoints2 == 1 && nPoints3 == 2) || (nPoints2 == 1 && nPoints == 2 ) ) && dfLoLeft > dfLoRight )  ||
+				( (nPoints3 == 1 && nPoints == 2) && dfLoRight > dfUpRight )
+				)
+				eErr = AddSegment( dfLevel, adfX[0], adfY[0], adfX[1], adfY[1], TRUE );
+			else
+				eErr = AddSegment( dfLevel, adfX[0], adfY[0], adfX[1], adfY[1], FALSE );
 
             if( eErr != CE_None )
                 return eErr;
@@ -553,7 +570,8 @@
 
         if( nPoints == 4 )
         {
-            eErr = AddSegment( dfLevel, adfX[2], adfY[2], adfX[3], adfY[3] );
+			// HGP: If we get here, we know the first was left+bottom, so we are at right+top, therefore "left is high" if loRight is larger than up right...
+            eErr = AddSegment( dfLevel, adfX[2], adfY[2], adfX[3], adfY[3], ( dfLoRight > dfUpRight) );
             if( eErr != CE_None )
                 return eErr;
         }
@@ -603,7 +621,8 @@
 
 CPLErr GDALContourGenerator::AddSegment( double dfLevel, 
                                          double dfX1, double dfY1,
-                                         double dfX2, double dfY2 )
+                                         double dfX2, double dfY2,
+										 int bLeftHigh) // HGP
 
 {
     GDALContourLevel *poLevel = FindLevel( dfLevel );
@@ -625,7 +644,7 @@
     {
         poTarget = poLevel->GetContour( iTarget );
 
-        poTarget->AddSegment( dfX1, dfY1, dfX2, dfY2 );
+        poTarget->AddSegment( dfX1, dfY1, dfX2, dfY2, bLeftHigh );
 
         poLevel->AdjustContour( iTarget );
         
@@ -637,7 +656,7 @@
 /* -------------------------------------------------------------------- */
     poTarget = new GDALContourItem( dfLevel );
 
-    poTarget->AddSegment( dfX1, dfY1, dfX2, dfY2 );
+    poTarget->AddSegment( dfX1, dfY1, dfX2, dfY2, bLeftHigh );
 
     poLevel->InsertContour( poTarget );
 
@@ -786,6 +805,10 @@
             {
                 if( pfnWriter != NULL )
                 {
+					// HGP:
+					// If direction is wrong, then reverse before ejecting:
+					poTarget->PrepareEjection();
+
                     eErr = pfnWriter( poTarget->dfLevel, poTarget->nPoints, 
                                       poTarget->padfX, poTarget->padfY, 
                                       pWriterCBData );
@@ -1040,6 +1063,8 @@
     padfX = NULL;
     padfY = NULL;
     
+	bLeftIsHigh = FALSE; // HGP
+
     dfTailX = 0.0;
 }
 
@@ -1059,7 +1084,8 @@
 /************************************************************************/
 
 int GDALContourItem::AddSegment( double dfXStart, double dfYStart, 
-                                 double dfXEnd, double dfYEnd )
+                                 double dfXEnd, double dfYEnd,
+								 int bLeftHigh) // HGP
 
 {
     MakeRoomFor( nPoints + 1 );
@@ -1079,6 +1105,9 @@
 
         dfTailX = padfX[1];
 
+		// Here we know that the left of this vector is the high side
+		bLeftIsHigh = bLeftHigh; // HGP
+
         return TRUE;
     }
 
@@ -1233,6 +1262,40 @@
 }
 
 /************************************************************************/
+/*                          PrepareEjection()                           */
+/************************************************************************/
+
+void GDALContourItem::PrepareEjection( ) //HGP
+
+{
+	// If left side is the high side, then reverse (to get curve normal pointing downwards)
+	if( this->bLeftIsHigh )
+    {
+		double* padfTmpX = (double *) CPLCalloc(sizeof(double), this->nPoints);
+		double* padfTmpY = (double *) CPLCalloc(sizeof(double), this->nPoints);
+
+		int i;
+
+		// Reverse the arrays
+		for( i = 0; i < this->nPoints; i++ )
+        {
+            padfTmpX[i] = this->padfX[ this->nPoints - i - 1];
+            padfTmpY[i] = this->padfY[ this->nPoints - i - 1];
+        }
+
+		// Copy back and release memory
+        memmove( this->padfX, padfTmpX, sizeof(double) * this->nPoints );
+		memmove( this->padfY, padfTmpY, sizeof(double) * this->nPoints );
+		CPLFree( padfTmpX );
+		CPLFree( padfTmpY );
+    }
+}
+
+
+
+
+
+/************************************************************************/
 /* ==================================================================== */
 /*                   Additional C Callable Functions                    */
 /* ==================================================================== */
@@ -1261,8 +1324,8 @@
         OGR_F_SetFieldDouble( hFeat, poInfo->nElevField, dfLevel );
     
     hGeom = OGR_G_CreateGeometry( wkbLineString );
-    
-    for( iPoint = nPoints-1; iPoint >= 0; iPoint-- )
+    	
+	for( iPoint = nPoints-1; iPoint >= 0; iPoint-- )
     {
         OGR_G_SetPoint( hGeom, iPoint,
                         poInfo->adfGeoTransform[0] 

