| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "Test.h" | 8 #include "Test.h" |
| 9 #include "SkPaint.h" | 9 #include "SkPaint.h" |
| 10 #include "SkFontStream.h" | 10 #include "SkFontStream.h" |
| 11 #include "SkOSFile.h" |
| 11 #include "SkStream.h" | 12 #include "SkStream.h" |
| 12 #include "SkTypeface.h" | 13 #include "SkTypeface.h" |
| 13 #include "SkEndian.h" | 14 #include "SkEndian.h" |
| 14 | 15 |
| 15 //#define DUMP_TABLES | 16 //#define DUMP_TABLES |
| 16 //#define DUMP_TTC_TABLES | 17 //#define DUMP_TTC_TABLES |
| 17 | 18 |
| 18 #define kFontTableTag_head SkSetFourByteTag('h', 'e', 'a', 'd') | 19 #define kFontTableTag_head SkSetFourByteTag('h', 'e', 'a', 'd') |
| 19 #define kFontTableTag_hhea SkSetFourByteTag('h', 'h', 'e', 'a') | 20 #define kFontTableTag_hhea SkSetFourByteTag('h', 'h', 'e', 'a') |
| 20 #define kFontTableTag_maxp SkSetFourByteTag('m', 'a', 'x', 'p') | 21 #define kFontTableTag_maxp SkSetFourByteTag('m', 'a', 'x', 'p') |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 65 } | 66 } |
| 66 | 67 |
| 67 if (tableGlyphs >= 0) { | 68 if (tableGlyphs >= 0) { |
| 68 REPORTER_ASSERT(reporter, tableGlyphs == nativeGlyphs); | 69 REPORTER_ASSERT(reporter, tableGlyphs == nativeGlyphs); |
| 69 } else { | 70 } else { |
| 70 // not sure this is a bug, but lets report it for now as info. | 71 // not sure this is a bug, but lets report it for now as info. |
| 71 SkDebugf("--- typeface returned 0 glyphs [%X]\n", face->uniqueID()); | 72 SkDebugf("--- typeface returned 0 glyphs [%X]\n", face->uniqueID()); |
| 72 } | 73 } |
| 73 } | 74 } |
| 74 | 75 |
| 76 // Test that SkPaint::textToGlyphs agrees with SkTypeface::charsToGlyphs. |
| 77 static void test_charsToGlyphs(skiatest::Reporter* reporter, SkTypeface* face) { |
| 78 const char text[5] = "ABCD"; |
| 79 const size_t textLength = SK_ARRAY_COUNT(text)-1; |
| 80 |
| 81 uint16_t paintGlyphIds[textLength]; |
| 82 SkPaint paint; |
| 83 paint.setTypeface(face); |
| 84 paint.setTextEncoding(SkPaint::kUTF8_TextEncoding); |
| 85 paint.textToGlyphs(text, textLength, paintGlyphIds); |
| 86 |
| 87 uint16_t faceGlyphIds[textLength]; |
| 88 face->charsToGlyphs(text, SkTypeface::kUTF8_Encoding, faceGlyphIds, textLeng
th); |
| 89 |
| 90 for (size_t i = 0; i < textLength; ++i) { |
| 91 SkString name; |
| 92 face->getFamilyName(&name); |
| 93 SkString a; |
| 94 a.appendf("paintGlyphIds[%d] = %d, faceGlyphIds[%d] = %d, name = %s", |
| 95 (int)i, (int)paintGlyphIds[i], (int)i, (int)faceGlyphIds[i
], name.c_str()); |
| 96 REPORTER_ASSERT_MESSAGE(reporter, paintGlyphIds[i] == faceGlyphIds[i], a
.c_str()); |
| 97 } |
| 98 } |
| 99 |
| 75 static void test_fontstream(skiatest::Reporter* reporter, | 100 static void test_fontstream(skiatest::Reporter* reporter, |
| 76 SkStream* stream, int ttcIndex) { | 101 SkStream* stream, int ttcIndex) { |
| 77 int n = SkFontStream::GetTableTags(stream, ttcIndex, NULL); | 102 int n = SkFontStream::GetTableTags(stream, ttcIndex, NULL); |
| 78 SkAutoTArray<SkFontTableTag> array(n); | 103 SkAutoTArray<SkFontTableTag> array(n); |
| 79 | 104 |
| 80 int n2 = SkFontStream::GetTableTags(stream, ttcIndex, array.get()); | 105 int n2 = SkFontStream::GetTableTags(stream, ttcIndex, array.get()); |
| 81 REPORTER_ASSERT(reporter, n == n2); | 106 REPORTER_ASSERT(reporter, n == n2); |
| 82 | 107 |
| 83 for (int i = 0; i < n; ++i) { | 108 for (int i = 0; i < n; ++i) { |
| 84 #ifdef DUMP_TTC_TABLES | 109 #ifdef DUMP_TTC_TABLES |
| (...skipping 18 matching lines...) Expand all Loading... |
| 103 int count = SkFontStream::CountTTCEntries(stream); | 128 int count = SkFontStream::CountTTCEntries(stream); |
| 104 #ifdef DUMP_TTC_TABLES | 129 #ifdef DUMP_TTC_TABLES |
| 105 SkDebugf("CountTTCEntries %d\n", count); | 130 SkDebugf("CountTTCEntries %d\n", count); |
| 106 #endif | 131 #endif |
| 107 for (int i = 0; i < count; ++i) { | 132 for (int i = 0; i < count; ++i) { |
| 108 test_fontstream(reporter, stream, i); | 133 test_fontstream(reporter, stream, i); |
| 109 } | 134 } |
| 110 } | 135 } |
| 111 | 136 |
| 112 static void test_fontstream(skiatest::Reporter* reporter) { | 137 static void test_fontstream(skiatest::Reporter* reporter) { |
| 113 // TODO: replace when we get a tools/resources/fonts/test.ttc | 138 // This test cannot run if there is no resource path. |
| 114 const char* name = "/AmericanTypewriter.ttc"; | 139 SkString resourcePath = skiatest::Test::GetResourcePath(); |
| 115 SkFILEStream stream(name); | 140 if (resourcePath.isEmpty()) { |
| 141 SkDebugf("Could not run fontstream test because resourcePath not specifi
ed."); |
| 142 return; |
| 143 } |
| 144 SkString filename = SkOSPath::SkPathJoin(resourcePath.c_str(), "test.ttc"); |
| 145 |
| 146 SkFILEStream stream(filename.c_str()); |
| 116 if (stream.isValid()) { | 147 if (stream.isValid()) { |
| 117 test_fontstream(reporter, &stream); | 148 test_fontstream(reporter, &stream); |
| 149 } else { |
| 150 SkDebugf("Could not run fontstream test because test.ttc not found."); |
| 118 } | 151 } |
| 119 } | 152 } |
| 120 | 153 |
| 121 static void test_tables(skiatest::Reporter* reporter, SkTypeface* face) { | 154 static void test_tables(skiatest::Reporter* reporter, SkTypeface* face) { |
| 122 if (false) { // avoid bit rot, suppress warning | 155 if (false) { // avoid bit rot, suppress warning |
| 123 SkFontID fontID = face->uniqueID(); | 156 SkFontID fontID = face->uniqueID(); |
| 124 REPORTER_ASSERT(reporter, fontID); | 157 REPORTER_ASSERT(reporter, fontID); |
| 125 } | 158 } |
| 126 | 159 |
| 127 int count = face->countTables(); | 160 int count = face->countTables(); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 162 } | 195 } |
| 163 | 196 |
| 164 static void test_tables(skiatest::Reporter* reporter) { | 197 static void test_tables(skiatest::Reporter* reporter) { |
| 165 static const char* const gNames[] = { | 198 static const char* const gNames[] = { |
| 166 NULL, // default font | 199 NULL, // default font |
| 167 "Arial", "Times", "Times New Roman", "Helvetica", "Courier", | 200 "Arial", "Times", "Times New Roman", "Helvetica", "Courier", |
| 168 "Courier New", "Terminal", "MS Sans Serif", | 201 "Courier New", "Terminal", "MS Sans Serif", |
| 169 }; | 202 }; |
| 170 | 203 |
| 171 for (size_t i = 0; i < SK_ARRAY_COUNT(gNames); ++i) { | 204 for (size_t i = 0; i < SK_ARRAY_COUNT(gNames); ++i) { |
| 172 SkTypeface* face = SkTypeface::CreateFromName(gNames[i], | 205 SkAutoTUnref<SkTypeface> face(SkTypeface::CreateFromName(gNames[i], SkTy
peface::kNormal)); |
| 173 SkTypeface::kNormal); | |
| 174 if (face) { | 206 if (face) { |
| 175 #ifdef DUMP_TABLES | 207 #ifdef DUMP_TABLES |
| 176 SkDebugf("%s\n", gNames[i]); | 208 SkDebugf("%s\n", gNames[i]); |
| 177 #endif | 209 #endif |
| 178 test_tables(reporter, face); | 210 test_tables(reporter, face); |
| 179 test_unitsPerEm(reporter, face); | 211 test_unitsPerEm(reporter, face); |
| 180 test_countGlyphs(reporter, face); | 212 test_countGlyphs(reporter, face); |
| 181 face->unref(); | 213 test_charsToGlyphs(reporter, face); |
| 182 } | 214 } |
| 183 } | 215 } |
| 184 } | 216 } |
| 185 | 217 |
| 186 /* | 218 /* |
| 187 * Verifies that the advance values returned by generateAdvance and | 219 * Verifies that the advance values returned by generateAdvance and |
| 188 * generateMetrics match. | 220 * generateMetrics match. |
| 189 */ | 221 */ |
| 190 static void test_advances(skiatest::Reporter* reporter) { | 222 static void test_advances(skiatest::Reporter* reporter) { |
| 191 static const char* const faces[] = { | 223 static const char* const faces[] = { |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 257 static void TestFontHost(skiatest::Reporter* reporter) { | 289 static void TestFontHost(skiatest::Reporter* reporter) { |
| 258 test_tables(reporter); | 290 test_tables(reporter); |
| 259 test_fontstream(reporter); | 291 test_fontstream(reporter); |
| 260 test_advances(reporter); | 292 test_advances(reporter); |
| 261 } | 293 } |
| 262 | 294 |
| 263 // need tests for SkStrSearch | 295 // need tests for SkStrSearch |
| 264 | 296 |
| 265 #include "TestClassDef.h" | 297 #include "TestClassDef.h" |
| 266 DEFINE_TESTCLASS("FontHost", FontHostTestClass, TestFontHost) | 298 DEFINE_TESTCLASS("FontHost", FontHostTestClass, TestFontHost) |
| OLD | NEW |