| #include <cppunit/extensions/HelperMacros.h> |
| #include <cppunit/TestCaller.h> |
| #include <cppunit/TestCase.h> |
| #include <cppunit/TestSuite.h> |
| #include <assert.h> |
| |
| #include "Fontdefs.h" |
| #include "FTVectoriser.h" |
| |
| |
| double testOutline[] = |
| { |
| 28, 0, 0.0, |
| 28, 4.53125, 0.0, |
| 26.4756, 2.54, 0.0, |
| 24.69, 0.99125, 0.0, |
| 22.6431, -0.115, 0.0, |
| 20.335, -0.77875, 0.0, |
| 17.7656, -1, 0.0, |
| 16.0434, -0.901563, 0.0, |
| 14.3769, -0.60625, 0.0, |
| 12.7659, -0.114062, 0.0, |
| 11.2106, 0.575, 0.0, |
| 9.71094, 1.46094, 0.0, |
| 8.30562, 2.52344, 0.0, |
| 7.03344, 3.74219, 0.0, |
| 5.89437, 5.11719, 0.0, |
| 4.88844, 6.64844, 0.0, |
| 4.01562, 8.33594, 0.0, |
| 3.29, 10.1538, 0.0, |
| 2.72563, 12.0759, 0.0, |
| 2.3225, 14.1025, 0.0, |
| 2.08063, 16.2334, 0.0, |
| 2, 18.4688, 0.0, |
| 2.07312, 20.6591, 0.0, |
| 2.2925, 22.7675, 0.0, |
| 2.65812, 24.7941, 0.0, |
| 3.17, 26.7388, 0.0, |
| 3.82812, 28.6016, 0.0, |
| 4.6325, 30.3381, 0.0, |
| 5.58313, 31.9041, 0.0, |
| 6.68, 33.2994, 0.0, |
| 7.92313, 34.5241, 0.0, |
| 9.3125, 35.5781, 0.0, |
| 10.8088, 36.45, 0.0, |
| 12.3725, 37.1281, 0.0, |
| 14.0038, 37.6125, 0.0, |
| 15.7025, 37.9031, 0.0, |
| 17.4688, 38, 0.0, |
| 18.7647, 37.9438, 0.0, |
| 20.0025, 37.775, 0.0, |
| 21.1822, 37.4938, 0.0, |
| 22.3038, 37.1, 0.0, |
| 23.3672, 36.5938, 0.0, |
| 24.3631, 35.9975, 0.0, |
| 25.2822, 35.3338, 0.0, |
| 26.1244, 34.6025, 0.0, |
| 26.8897, 33.8037, 0.0, |
| 27.5781, 32.9375, 0.0, |
| 27.5781, 51, 0.0, |
| 34, 51, 0.0, |
| 34, 0, 0.0, |
| 8.375, 18.4844, 0.0, |
| 8.49312, 15.7491, 0.0, |
| 8.8475, 13.3056, 0.0, |
| 9.43813, 11.1541, 0.0, |
| 10.265, 9.29437, 0.0, |
| 11.3281, 7.72656, 0.0, |
| 12.5519, 6.44688, 0.0, |
| 13.8606, 5.45156, 0.0, |
| 15.2544, 4.74062, 0.0, |
| 16.7331, 4.31406, 0.0, |
| 18.2969, 4.17188, 0.0, |
| 19.8669, 4.30781, 0.0, |
| 21.3394, 4.71563, 0.0, |
| 22.7144, 5.39531, 0.0, |
| 23.9919, 6.34688, 0.0, |
| 25.1719, 7.57031, 0.0, |
| 26.19, 9.07312, 0.0, |
| 26.9819, 10.8628, 0.0, |
| 27.5475, 12.9394, 0.0, |
| 27.8869, 15.3028, 0.0, |
| 28, 17.9531, 0.0, |
| 27.8847, 20.8591, 0.0, |
| 27.5388, 23.4394, 0.0, |
| 26.9622, 25.6941, 0.0, |
| 26.155, 27.6231, 0.0, |
| 25.1172, 29.2266, 0.0, |
| 23.9106, 30.5231, 0.0, |
| 22.5972, 31.5316, 0.0, |
| 21.1769, 32.2519, 0.0, |
| 19.6497, 32.6841, 0.0, |
| 18.0156, 32.8281, 0.0, |
| 16.4203, 32.69, 0.0, |
| 14.9344, 32.2756, 0.0, |
| 13.5578, 31.585, 0.0, |
| 12.2906, 30.6181, 0.0, |
| 11.1328, 29.375, 0.0, |
| 10.14, 27.8344, 0.0, |
| 9.36781, 25.975, 0.0, |
| 8.81625, 23.7969, 0.0, |
| 8.48531, 21.3, 0.0, |
| 8.375, 18.4844, 0.0 |
| }; |
| |
| |
| GLenum testMeshPolygonTypes[] = |
| { |
| GL_TRIANGLE_FAN, |
| GL_TRIANGLE_STRIP, |
| GL_TRIANGLE_STRIP, |
| GL_TRIANGLE_STRIP, |
| GL_TRIANGLE_STRIP, |
| GL_TRIANGLE_STRIP, |
| GL_TRIANGLE_FAN, |
| GL_TRIANGLE_FAN, |
| GL_TRIANGLE_FAN, |
| GL_TRIANGLE_STRIP, |
| GL_TRIANGLE_STRIP, |
| GL_TRIANGLE_FAN, |
| GL_TRIANGLE_STRIP, |
| GL_TRIANGLES |
| }; |
| |
| |
| unsigned int testMeshPointCount[] = |
| { |
| 8, 7, 7, 11, 7, 9, 5, 6, 6, 7, 17, 6, 19, 3, |
| }; |
| |
| |
| double testMesh[] = |
| { |
| 28, 4.53125, 0.0, |
| 28, 0, 0.0, |
| 34, 0, 0.0, |
| 28, 17.9531, 0.0, |
| 27.8869, 15.3028, 0.0, |
| 27.5475, 12.9394, 0.0, |
| 26.9819, 10.8628, 0.0, |
| 26.4756, 2.54, 0.0, |
| 26.9819, 10.8628, 0.0, |
| 26.19, 9.07312, 0.0, |
| 26.4756, 2.54, 0.0, |
| 25.1719, 7.57031, 0.0, |
| 24.69, 0.99125, 0.0, |
| 23.9919, 6.34688, 0.0, |
| 22.7144, 5.39531, 0.0, |
| 24.69, 0.99125, 0.0, |
| 22.7144, 5.39531, 0.0, |
| 22.6431, -0.115, 0.0, |
| 21.3394, 4.71563, 0.0, |
| 20.335, -0.77875, 0.0, |
| 19.8669, 4.30781, 0.0, |
| 18.2969, 4.17188, 0.0, |
| 20.335, -0.77875, 0.0, |
| 18.2969, 4.17188, 0.0, |
| 17.7656, -1, 0.0, |
| 16.7331, 4.31406, 0.0, |
| 16.0434, -0.901563, 0.0, |
| 15.2544, 4.74062, 0.0, |
| 14.3769, -0.60625, 0.0, |
| 13.8606, 5.45156, 0.0, |
| 12.7659, -0.114062, 0.0, |
| 12.5519, 6.44688, 0.0, |
| 11.3281, 7.72656, 0.0, |
| 12.7659, -0.114062, 0.0, |
| 11.3281, 7.72656, 0.0, |
| 11.2106, 0.575, 0.0, |
| 10.265, 9.29437, 0.0, |
| 9.71094, 1.46094, 0.0, |
| 9.43813, 11.1541, 0.0, |
| 8.8475, 13.3056, 0.0, |
| 8.81625, 23.7969, 0.0, |
| 9.3125, 35.5781, 0.0, |
| 8.48531, 21.3, 0.0, |
| 7.92313, 34.5241, 0.0, |
| 8.375, 18.4844, 0.0, |
| 8.30562, 2.52344, 0.0, |
| 8.49312, 15.7491, 0.0, |
| 9.71094, 1.46094, 0.0, |
| 8.8475, 13.3056, 0.0, |
| 34, 51, 0.0, |
| 27.5781, 51, 0.0, |
| 27.8847, 20.8591, 0.0, |
| 28, 17.9531, 0.0, |
| 34, 0, 0.0, |
| 27.5781, 32.9375, 0.0, |
| 26.8897, 33.8037, 0.0, |
| 26.9622, 25.6941, 0.0, |
| 27.5388, 23.4394, 0.0, |
| 27.8847, 20.8591, 0.0, |
| 27.5781, 51, 0.0, |
| 26.155, 27.6231, 0.0, |
| 26.9622, 25.6941, 0.0, |
| 26.8897, 33.8037, 0.0, |
| 26.1244, 34.6025, 0.0, |
| 25.2822, 35.3338, 0.0, |
| 25.1172, 29.2266, 0.0, |
| 22.3038, 37.1, 0.0, |
| 22.5972, 31.5316, 0.0, |
| 23.3672, 36.5938, 0.0, |
| 23.9106, 30.5231, 0.0, |
| 24.3631, 35.9975, 0.0, |
| 25.1172, 29.2266, 0.0, |
| 25.2822, 35.3338, 0.0, |
| 11.1328, 29.375, 0.0, |
| 12.2906, 30.6181, 0.0, |
| 12.3725, 37.1281, 0.0, |
| 13.5578, 31.585, 0.0, |
| 14.0038, 37.6125, 0.0, |
| 14.9344, 32.2756, 0.0, |
| 15.7025, 37.9031, 0.0, |
| 16.4203, 32.69, 0.0, |
| 17.4688, 38, 0.0, |
| 18.0156, 32.8281, 0.0, |
| 18.7647, 37.9438, 0.0, |
| 19.6497, 32.6841, 0.0, |
| 20.0025, 37.775, 0.0, |
| 21.1769, 32.2519, 0.0, |
| 21.1822, 37.4938, 0.0, |
| 22.5972, 31.5316, 0.0, |
| 22.3038, 37.1, 0.0, |
| 10.8088, 36.45, 0.0, |
| 9.3125, 35.5781, 0.0, |
| 9.36781, 25.975, 0.0, |
| 10.14, 27.8344, 0.0, |
| 11.1328, 29.375, 0.0, |
| 12.3725, 37.1281, 0.0, |
| 8.30562, 2.52344, 0.0, |
| 7.92313, 34.5241, 0.0, |
| 7.03344, 3.74219, 0.0, |
| 6.68, 33.2994, 0.0, |
| 5.89437, 5.11719, 0.0, |
| 5.58313, 31.9041, 0.0, |
| 4.88844, 6.64844, 0.0, |
| 4.6325, 30.3381, 0.0, |
| 4.01562, 8.33594, 0.0, |
| 3.82812, 28.6016, 0.0, |
| 3.29, 10.1538, 0.0, |
| 3.17, 26.7388, 0.0, |
| 2.72563, 12.0759, 0.0, |
| 2.65812, 24.7941, 0.0, |
| 2.3225, 14.1025, 0.0, |
| 2.2925, 22.7675, 0.0, |
| 2.08063, 16.2334, 0.0, |
| 2.07312, 20.6591, 0.0, |
| 2, 18.4688, 0.0, |
| 9.3125, 35.5781, 0.0, |
| 8.81625, 23.7969, 0.0, |
| 9.36781, 25.975, 0.0 |
| }; |
| |
| |
| class FTVectoriserTest : public CppUnit::TestCase |
| { |
| CPPUNIT_TEST_SUITE( FTVectoriserTest); |
| CPPUNIT_TEST( testFreetypeVersion); |
| CPPUNIT_TEST( testNullGlyphProcess); |
| CPPUNIT_TEST( testBadGlyphProcess); |
| CPPUNIT_TEST( testSimpleGlyphProcess); |
| CPPUNIT_TEST( testComplexGlyphProcess); |
| CPPUNIT_TEST( testGetContour); |
| CPPUNIT_TEST( testGetOutline); |
| CPPUNIT_TEST( testGetMesh); |
| CPPUNIT_TEST( testMakeMesh); |
| CPPUNIT_TEST_SUITE_END(); |
| |
| public: |
| FTVectoriserTest() : CppUnit::TestCase( "FTVectoriser Test") |
| {} |
| |
| FTVectoriserTest( const std::string& name) : CppUnit::TestCase(name) |
| {} |
| |
| |
| void testFreetypeVersion() |
| { |
| setUpFreetype( NULL_CHARACTER_INDEX); |
| |
| FT_Int major; |
| FT_Int minor; |
| FT_Int patch; |
| |
| FT_Library_Version( library, &major, &minor, &patch); |
| |
| // If you hit these asserts then you have the wrong library version to run the tests. |
| // You can still run the tests but some will fail because the hinter changed in 2.1.4 |
| CPPUNIT_ASSERT( major == 2); |
| CPPUNIT_ASSERT( minor == 1); |
| CPPUNIT_ASSERT( patch >= 4); |
| |
| tearDownFreetype(); |
| } |
| |
| |
| void testNullGlyphProcess() |
| { |
| FTVectoriser vectoriser( NULL); |
| CPPUNIT_ASSERT( vectoriser.ContourCount() == 0); |
| } |
| |
| |
| void testBadGlyphProcess() |
| { |
| setUpFreetype( NULL_CHARACTER_INDEX); |
| |
| FTVectoriser vectoriser( face->glyph); |
| CPPUNIT_ASSERT( vectoriser.ContourCount() == 0); |
| |
| tearDownFreetype(); |
| } |
| |
| |
| void testSimpleGlyphProcess() |
| { |
| setUpFreetype( SIMPLE_CHARACTER_INDEX); |
| |
| FTVectoriser vectoriser( face->glyph); |
| |
| CPPUNIT_ASSERT( vectoriser.ContourCount() == 2); |
| CPPUNIT_ASSERT( vectoriser.PointCount() == 8); |
| |
| tearDownFreetype(); |
| } |
| |
| |
| void testComplexGlyphProcess() |
| { |
| setUpFreetype( COMPLEX_CHARACTER_INDEX); |
| |
| FTVectoriser vectoriser( face->glyph); |
| |
| CPPUNIT_ASSERT( vectoriser.ContourCount() == 2); |
| CPPUNIT_ASSERT( vectoriser.PointCount() == 91); |
| |
| tearDownFreetype(); |
| } |
| |
| |
| void testGetContour() |
| { |
| setUpFreetype( SIMPLE_CHARACTER_INDEX); |
| |
| FTVectoriser vectoriser( face->glyph); |
| |
| CPPUNIT_ASSERT( vectoriser.Contour(1)); |
| CPPUNIT_ASSERT( vectoriser.Contour(99) == NULL); |
| |
| tearDownFreetype(); |
| } |
| |
| |
| void testGetOutline() |
| { |
| setUpFreetype( COMPLEX_CHARACTER_INDEX); |
| |
| FTVectoriser vectoriser( face->glyph); |
| |
| unsigned int d = 0; |
| for( size_t c = 0; c < vectoriser.ContourCount(); ++c) |
| { |
| const FTContour* contour = vectoriser.Contour(c); |
| |
| for( size_t p = 0; p < contour->PointCount(); ++p) |
| { |
| CPPUNIT_ASSERT_DOUBLES_EQUAL( *(testOutline + d), contour->Point(p).X() / 64.0f, 0.01); |
| CPPUNIT_ASSERT_DOUBLES_EQUAL( *(testOutline + d + 1), contour->Point(p).Y() / 64.0f, 0.01); |
| d += 3; |
| } |
| } |
| |
| tearDownFreetype(); |
| } |
| |
| |
| void testGetMesh() |
| { |
| setUpFreetype( SIMPLE_CHARACTER_INDEX); |
| |
| FTVectoriser vectoriser( face->glyph); |
| CPPUNIT_ASSERT( vectoriser.GetMesh() == NULL); |
| |
| vectoriser.MakeMesh( FTGL_FRONT_FACING); |
| |
| CPPUNIT_ASSERT( vectoriser.GetMesh()); |
| } |
| |
| |
| void testMakeMesh() |
| { |
| setUpFreetype( COMPLEX_CHARACTER_INDEX); |
| |
| FTVectoriser vectoriser( face->glyph); |
| |
| vectoriser.MakeMesh( FTGL_FRONT_FACING); |
| |
| int d = 0; |
| const FTMesh* mesh = vectoriser.GetMesh(); |
| unsigned int tesselations = mesh->TesselationCount(); |
| CPPUNIT_ASSERT( tesselations == 14); |
| |
| for( unsigned int index = 0; index < tesselations; ++index) |
| { |
| const FTTesselation* subMesh = mesh->Tesselation( index); |
| |
| unsigned int polyType = subMesh->PolygonType(); |
| CPPUNIT_ASSERT( testMeshPolygonTypes[index] == polyType); |
| |
| unsigned int numberOfVertices = subMesh->PointCount(); |
| CPPUNIT_ASSERT( testMeshPointCount[index] == numberOfVertices); |
| |
| for( unsigned int x = 0; x < numberOfVertices; ++x) |
| { |
| CPPUNIT_ASSERT_DOUBLES_EQUAL( *(testMesh + d), subMesh->Point(x).X() / 64, 0.01); |
| CPPUNIT_ASSERT_DOUBLES_EQUAL( *(testMesh + d + 1), subMesh->Point(x).Y() / 64, 0.01); |
| d += 3; |
| } |
| } |
| |
| tearDownFreetype(); |
| } |
| |
| |
| void setUp() |
| {} |
| |
| |
| void tearDown() |
| {} |
| |
| private: |
| FT_Library library; |
| FT_Face face; |
| |
| void setUpFreetype( unsigned int characterIndex) |
| { |
| FT_Error error = FT_Init_FreeType( &library); |
| assert(!error); |
| error = FT_New_Face( library, ARIAL_FONT_FILE, 0, &face); |
| assert(!error); |
| |
| loadGlyph( characterIndex); |
| } |
| |
| void loadGlyph( unsigned int characterIndex) |
| { |
| long glyphIndex = FT_Get_Char_Index( face, characterIndex); |
| |
| FT_Set_Char_Size( face, 0L, FONT_POINT_SIZE * 64, RESOLUTION, RESOLUTION); |
| |
| FT_Error error = FT_Load_Glyph( face, glyphIndex, FT_LOAD_DEFAULT); |
| assert(!error); |
| } |
| |
| void tearDownFreetype() |
| { |
| FT_Done_Face( face); |
| FT_Done_FreeType( library); |
| } |
| |
| }; |
| |
| CPPUNIT_TEST_SUITE_REGISTRATION( FTVectoriserTest); |
| |