Unrolled evaluate curve
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
diff --git a/include/FTContour.h b/include/FTContour.h
index c1eff54..b47e984 100644
--- a/include/FTContour.h
+++ b/include/FTContour.h
@@ -71,7 +71,8 @@ class FTGL_EXPORT FTContour
* @param curveOrder The order of the curve to be evaluated.
* <code>2</code> equals conic (quadratic) and <code>3</code> equals cubic
*/
- inline void evaluateCurve( const int curveOrder);
+ void evaluateQuadraticCurve();
+ void evaluateCubicCurve();
/**
* 2D array storing values of de Casteljau algorithm.
diff --git a/src/FTContour.cpp b/src/FTContour.cpp
index fbfccd9..3158aed 100644
--- a/src/FTContour.cpp
+++ b/src/FTContour.cpp
@@ -42,7 +42,7 @@ FTContour::FTContour( FT_Vector* contour, char* pointTags, unsigned int numberOf
bValues[1][0] = controlPoint.x; bValues[1][1] = controlPoint.y;
bValues[2][0] = nextPoint.x; bValues[2][1] = nextPoint.y;
- evaluateCurve( SECOND_DEGREE_CURVE);
+ evaluateQuadraticCurve();
++pointIndex;
previousPoint = nextPoint;
@@ -59,7 +59,7 @@ FTContour::FTContour( FT_Vector* contour, char* pointTags, unsigned int numberOf
bValues[1][0] = controlPoint.x; bValues[1][1] = controlPoint.y;
bValues[2][0] = nextPoint.x; bValues[2][1] = nextPoint.y;
- evaluateCurve( SECOND_DEGREE_CURVE);
+ evaluateQuadraticCurve();
continue;
}
@@ -76,7 +76,7 @@ FTContour::FTContour( FT_Vector* contour, char* pointTags, unsigned int numberOf
bValues[2][0] = controlPoint2.x; bValues[2][1] = controlPoint2.y;
bValues[3][0] = nextPoint.x; bValues[3][1] = nextPoint.y;
- evaluateCurve( THIRD_DEGREE_CURVE);
+ evaluateCubicCurve();
++pointIndex;
continue;
}
@@ -93,22 +93,54 @@ void FTContour::AddPoint( FTPoint point)
}
-void FTContour::evaluateCurve( const int curveDegree)
+void FTContour::evaluateQuadraticCurve()
{
for( unsigned int i = 0; i <= ( 1.0f / BEZIER_STEP_SIZE); i++)
{
+ float tempBValues[2][2];
+
float t = static_cast<float>(i) * BEZIER_STEP_SIZE;
- for( unsigned int m = curveDegree; m > 0; m--)
- {
- for ( unsigned int j = 0; j < m; j++)
- {
- bValues[j][0] = (1.0f - t) * bValues[j][0] + t * bValues[j + 1][0];
- bValues[j][1] = (1.0f - t) * bValues[j][1] + t * bValues[j + 1][1];
- }
- }
+ tempBValues[0][0] = (1.0f - t) * bValues[0][0] + t * bValues[1][0];
+ tempBValues[0][1] = (1.0f - t) * bValues[0][1] + t * bValues[1][1];
+
+ tempBValues[1][0] = (1.0f - t) * bValues[1][0] + t * bValues[2][0];
+ tempBValues[1][1] = (1.0f - t) * bValues[1][1] + t * bValues[2][1];
+
+ tempBValues[0][0] = (1.0f - t) * tempBValues[0][0] + t * tempBValues[1][0];
+ tempBValues[0][1] = (1.0f - t) * tempBValues[0][1] + t * tempBValues[1][1];
+
+ AddPoint( FTPoint( tempBValues[0][0], tempBValues[0][1], 0.0f));
+ }
+}
- AddPoint( FTPoint( bValues[0][0], bValues[0][1], 0.0f));
+void FTContour::evaluateCubicCurve()
+{
+ for( unsigned int i = 0; i <= ( 1.0f / BEZIER_STEP_SIZE); i++)
+ {
+ float tempBValues[3][2];
+
+ float t = static_cast<float>(i) * BEZIER_STEP_SIZE;
+
+ tempBValues[0][0] = (1.0f - t) * bValues[0][0] + t * bValues[1][0];
+ tempBValues[0][1] = (1.0f - t) * bValues[0][1] + t * bValues[1][1];
+
+ tempBValues[1][0] = (1.0f - t) * bValues[1][0] + t * bValues[2][0];
+ tempBValues[1][1] = (1.0f - t) * bValues[1][1] + t * bValues[2][1];
+
+ tempBValues[2][0] = (1.0f - t) * bValues[2][0] + t * bValues[3][0];
+ tempBValues[2][1] = (1.0f - t) * bValues[2][1] + t * bValues[3][1];
+
+ tempBValues[0][0] = (1.0f - t) * tempBValues[0][0] + t * tempBValues[1][0];
+ tempBValues[0][1] = (1.0f - t) * tempBValues[0][1] + t * tempBValues[1][1];
+
+ tempBValues[1][0] = (1.0f - t) * tempBValues[1][0] + t * tempBValues[2][0];
+ tempBValues[1][1] = (1.0f - t) * tempBValues[1][1] + t * tempBValues[2][1];
+
+ tempBValues[0][0] = (1.0f - t) * tempBValues[0][0] + t * tempBValues[1][0];
+ tempBValues[0][1] = (1.0f - t) * tempBValues[0][1] + t * tempBValues[1][1];
+
+ AddPoint( FTPoint( tempBValues[0][0], tempBValues[0][1], 0.0f));
}
}