Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'extern/bFTGL/src/FTContour.cpp')
-rw-r--r--extern/bFTGL/src/FTContour.cpp149
1 files changed, 149 insertions, 0 deletions
diff --git a/extern/bFTGL/src/FTContour.cpp b/extern/bFTGL/src/FTContour.cpp
new file mode 100644
index 00000000000..6b0cf8a23e1
--- /dev/null
+++ b/extern/bFTGL/src/FTContour.cpp
@@ -0,0 +1,149 @@
+#include "FTContour.h"
+
+static const float BEZIER_STEP_SIZE = 0.2f;
+
+
+void FTContour::AddPoint( FTPoint point)
+{
+ if( pointList.empty() || point != pointList[pointList.size() - 1])
+ {
+ pointList.push_back( point);
+ }
+}
+
+
+void FTContour::AddPoint( float x, float y)
+{
+ AddPoint( FTPoint( x, y, 0.0f));
+}
+
+
+void FTContour::evaluateQuadraticCurve()
+{
+ for( unsigned int i = 0; i <= ( 1.0f / BEZIER_STEP_SIZE); i++)
+ {
+ float bezierValues[2][2];
+
+ float t = static_cast<float>(i) * BEZIER_STEP_SIZE;
+
+ bezierValues[0][0] = (1.0f - t) * controlPoints[0][0] + t * controlPoints[1][0];
+ bezierValues[0][1] = (1.0f - t) * controlPoints[0][1] + t * controlPoints[1][1];
+
+ bezierValues[1][0] = (1.0f - t) * controlPoints[1][0] + t * controlPoints[2][0];
+ bezierValues[1][1] = (1.0f - t) * controlPoints[1][1] + t * controlPoints[2][1];
+
+ bezierValues[0][0] = (1.0f - t) * bezierValues[0][0] + t * bezierValues[1][0];
+ bezierValues[0][1] = (1.0f - t) * bezierValues[0][1] + t * bezierValues[1][1];
+
+ AddPoint( bezierValues[0][0], bezierValues[0][1]);
+ }
+}
+
+void FTContour::evaluateCubicCurve()
+{
+ for( unsigned int i = 0; i <= ( 1.0f / BEZIER_STEP_SIZE); i++)
+ {
+ float bezierValues[3][2];
+
+ float t = static_cast<float>(i) * BEZIER_STEP_SIZE;
+
+ bezierValues[0][0] = (1.0f - t) * controlPoints[0][0] + t * controlPoints[1][0];
+ bezierValues[0][1] = (1.0f - t) * controlPoints[0][1] + t * controlPoints[1][1];
+
+ bezierValues[1][0] = (1.0f - t) * controlPoints[1][0] + t * controlPoints[2][0];
+ bezierValues[1][1] = (1.0f - t) * controlPoints[1][1] + t * controlPoints[2][1];
+
+ bezierValues[2][0] = (1.0f - t) * controlPoints[2][0] + t * controlPoints[3][0];
+ bezierValues[2][1] = (1.0f - t) * controlPoints[2][1] + t * controlPoints[3][1];
+
+ bezierValues[0][0] = (1.0f - t) * bezierValues[0][0] + t * bezierValues[1][0];
+ bezierValues[0][1] = (1.0f - t) * bezierValues[0][1] + t * bezierValues[1][1];
+
+ bezierValues[1][0] = (1.0f - t) * bezierValues[1][0] + t * bezierValues[2][0];
+ bezierValues[1][1] = (1.0f - t) * bezierValues[1][1] + t * bezierValues[2][1];
+
+ bezierValues[0][0] = (1.0f - t) * bezierValues[0][0] + t * bezierValues[1][0];
+ bezierValues[0][1] = (1.0f - t) * bezierValues[0][1] + t * bezierValues[1][1];
+
+ AddPoint( bezierValues[0][0], bezierValues[0][1]);
+ }
+}
+
+
+FTContour::FTContour( FT_Vector* contour, char* pointTags, unsigned int numberOfPoints)
+{
+ for( unsigned int pointIndex = 0; pointIndex < numberOfPoints; ++ pointIndex)
+ {
+ char pointTag = pointTags[pointIndex];
+
+ if( pointTag == FT_Curve_Tag_On || numberOfPoints < 2)
+ {
+ AddPoint( contour[pointIndex].x, contour[pointIndex].y);
+ continue;
+ }
+
+ FTPoint controlPoint( contour[pointIndex]);
+ FTPoint previousPoint = ( 0 == pointIndex)
+ ? FTPoint( contour[numberOfPoints - 1])
+ : pointList[pointList.size() - 1];
+
+ FTPoint nextPoint = ( pointIndex == numberOfPoints - 1)
+ ? pointList[0]
+ : FTPoint( contour[pointIndex + 1]);
+
+ if( pointTag == FT_Curve_Tag_Conic)
+ {
+ char nextPointTag = ( pointIndex == numberOfPoints - 1)
+ ? pointTags[0]
+ : pointTags[pointIndex + 1];
+
+ while( nextPointTag == FT_Curve_Tag_Conic)
+ {
+ nextPoint = FTPoint( static_cast<float>( controlPoint.x + nextPoint.x) * 0.5f,
+ static_cast<float>( controlPoint.y + nextPoint.y) * 0.5f,
+ 0);
+
+ controlPoints[0][0] = previousPoint.x; controlPoints[0][1] = previousPoint.y;
+ controlPoints[1][0] = controlPoint.x; controlPoints[1][1] = controlPoint.y;
+ controlPoints[2][0] = nextPoint.x; controlPoints[2][1] = nextPoint.y;
+
+ evaluateQuadraticCurve();
+ ++pointIndex;
+
+ previousPoint = nextPoint;
+ controlPoint = FTPoint( contour[pointIndex]);
+ nextPoint = ( pointIndex == numberOfPoints - 1)
+ ? pointList[0]
+ : FTPoint( contour[pointIndex + 1]);
+ nextPointTag = ( pointIndex == numberOfPoints - 1)
+ ? pointTags[0]
+ : pointTags[pointIndex + 1];
+ }
+
+ controlPoints[0][0] = previousPoint.x; controlPoints[0][1] = previousPoint.y;
+ controlPoints[1][0] = controlPoint.x; controlPoints[1][1] = controlPoint.y;
+ controlPoints[2][0] = nextPoint.x; controlPoints[2][1] = nextPoint.y;
+
+ evaluateQuadraticCurve();
+ continue;
+ }
+
+ if( pointTag == FT_Curve_Tag_Cubic)
+ {
+ FTPoint controlPoint2 = nextPoint;
+
+ FTPoint nextPoint = ( pointIndex == numberOfPoints - 2)
+ ? pointList[0]
+ : FTPoint( contour[pointIndex + 2]);
+
+ controlPoints[0][0] = previousPoint.x; controlPoints[0][1] = previousPoint.y;
+ controlPoints[1][0] = controlPoint.x; controlPoints[1][1] = controlPoint.y;
+ controlPoints[2][0] = controlPoint2.x; controlPoints[2][1] = controlPoint2.y;
+ controlPoints[3][0] = nextPoint.x; controlPoints[3][1] = nextPoint.y;
+
+ evaluateCubicCurve();
+ ++pointIndex;
+ continue;
+ }
+ }
+}