15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/tests/test_browser_font.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include <string.h> 8a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/tests/test_utils.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/tests/testing_instance.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/image_data.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/trusted/browser_font_trusted.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)REGISTER_TEST_CASE(BrowserFont); 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestBrowserFont::Init() { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestBrowserFont::RunTests(const std::string& filter) { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RUN_TEST(FontFamilies, filter); 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RUN_TEST(Measure, filter); 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RUN_TEST(MeasureRTL, filter); 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RUN_TEST(CharPos, filter); 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This test is disabled. It doesn't currently pass. See the 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // CharacterOffsetForPixel API. 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) //RUN_TEST(CharPosRTL, filter); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RUN_TEST(Draw, filter); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Just tests that GetFontFamilies is hooked up & returns something. 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestBrowserFont::TestFontFamilies() { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This function is only supported out-of-process. 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const PPB_Testing_Private* testing_interface = GetTestingInterface(); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (testing_interface && !testing_interface->IsOutOfProcess()) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::Var families = pp::BrowserFont_Trusted::GetFontFamilies(instance_); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(families.is_string()); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(!families.AsString().empty()); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that measuring text behaves reasonably. We aren't sure if the browser 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// will be doing kerning or something for the particular default font, so we 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// just make a string that we're pretty sure should be more than twice as long 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// as another one, and verify that condition. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestBrowserFont::TestMeasure() { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::BrowserFontDescription desc; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::BrowserFont_Trusted font(instance_, desc); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t length1 = font.MeasureText(pp::BrowserFontTextRun("WWW")); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(length1 > 0); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t length2 = font.MeasureText(pp::BrowserFontTextRun("WWWWWWWW")); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(length2 >= length1 * 2); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestBrowserFont::TestMeasureRTL() { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::BrowserFontDescription desc; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::BrowserFont_Trusted font(instance_, desc); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Mixed string, two chars of LTR, two of RTL, then two of LTR. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note this is in UTF-8 so has more than 6 bytes. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string mixed("AB\xd7\x94\xd7\x97ZZ"); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kNumChars = 6; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::BrowserFontTextRun run(mixed); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that since this is UTF-8, the two RTL chars are two bytes each. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t len[kNumChars]; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) len[0] = font.PixelOffsetForCharacter(run, 0); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) len[1] = font.PixelOffsetForCharacter(run, 1); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) len[2] = font.PixelOffsetForCharacter(run, 2); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) len[3] = font.PixelOffsetForCharacter(run, 3); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) len[4] = font.PixelOffsetForCharacter(run, 4); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) len[5] = font.PixelOffsetForCharacter(run, 5); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // First three chars should be increasing. 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(len[0] >= 0); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(len[1] > len[0]); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(len[3] > len[1]); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(len[2] > len[3]); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(len[4] > len[2]); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(len[5] > len[4]); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test the same sequence with force LTR. The offsets should appear in 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // sequence. 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::BrowserFontTextRun forced_run(mixed, false, true); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) len[0] = font.PixelOffsetForCharacter(forced_run, 0); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) len[1] = font.PixelOffsetForCharacter(forced_run, 1); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) len[2] = font.PixelOffsetForCharacter(forced_run, 2); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) len[3] = font.PixelOffsetForCharacter(forced_run, 3); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) len[4] = font.PixelOffsetForCharacter(forced_run, 4); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) len[5] = font.PixelOffsetForCharacter(forced_run, 5); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 1; i < kNumChars; i++) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(len[i] > len[i - 1]); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the character/pixel offset functions correctly round-trip. 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestBrowserFont::TestCharPos() { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::BrowserFontDescription desc; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::BrowserFont_Trusted font(instance_, desc); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::BrowserFontTextRun run("Hello, world"); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t original_char = 3; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t pixel_offset = font.PixelOffsetForCharacter(run, original_char); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(pixel_offset > 0); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t computed_char = font.CharacterOffsetForPixel( 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) run, static_cast<int32_t>(pixel_offset)); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(computed_char == original_char); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we can get character positions in a mixed LTR/RTL run. 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestBrowserFont::TestCharPosRTL() { 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::BrowserFontDescription desc; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::BrowserFont_Trusted font(instance_, desc); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Mixed string, two chars of LTR, two of RTL, than two of LTR. 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note this is in UTF-8 so has more than 6 bytes. 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string mixed("AB\xd7\x94\xd7\x97ZZ"); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::BrowserFontTextRun run(mixed); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kNumChars = 6; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_char_sequence[kNumChars] = { 0, 1, 3, 2, 4, 5 }; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that the characters appear in the order we expect. 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int pixel_width = font.MeasureText(pp::BrowserFontTextRun(mixed)); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int last_sequence = 0; // Index into expected_char_sequence. 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int x = 0; x < pixel_width; x++) { 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cur_char = font.CharacterOffsetForPixel(run, x); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur_char != expected_char_sequence[last_sequence]) { 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This pixel has a different character. It should be the next one in 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the sequence for it to be correct. 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_sequence++; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(last_sequence < kNumChars); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(cur_char == expected_char_sequence[last_sequence]); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try the same string with force LTR. The characters should all appear in 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // sequence. 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::BrowserFontTextRun forced_run(mixed, false, true); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int last_forced_char = 0; // Char index into the forced sequence. 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int x = 0; x < pixel_width; x++) { 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cur_char = font.CharacterOffsetForPixel(forced_run, x); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur_char != last_forced_char) { 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_forced_char++; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(cur_char == last_forced_char); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that drawing some text produces "some" output. 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestBrowserFont::TestDraw() { 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::BrowserFontDescription desc; 165a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) desc.set_family(PP_BROWSERFONT_TRUSTED_FAMILY_MONOSPACE); 166a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) desc.set_size(10); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::BrowserFont_Trusted font(instance_, desc); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 169a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const pp::Size kSize(30, 10); 170a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) pp::ImageData image(instance_, 171a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PP_IMAGEDATAFORMAT_BGRA_PREMUL, // 0xAARRGGBB 172a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) kSize, 173a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) false); // init_to_zero 174a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_FALSE(image.is_null()); 175a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 176a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Draw black text on white canvas. 177a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) memset(image.data(), 0xFF, 4 * kSize.GetArea()); 178a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) font.DrawSimpleText(&image, 179a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) "Hello", 180a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) pp::Point(0, 10), // Baseline position. 181a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0xFF000000, // Black text. 182a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) true); // image_data_is_opaque. 183a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 184a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Expect that at least a few pixels are non-white (text). 185a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Due to blending, there may be rounding errors and 186a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // checking for exact black may not be correct. 187a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Also expect that all pixels are opaque. 188a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const uint32_t kRGBMask = 0x00FFFFFF; 189a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const uint32_t kAlphaMask = 0xFF000000; 190a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int text_pixels = 0, opaque_pixels = 0; 191a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const uint32_t* pixels = static_cast<const uint32_t*>(image.data()); 192a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) for (int i = 0; i < kSize.GetArea(); ++i) { 193a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if ((pixels[i] & kRGBMask) != kRGBMask) 194a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ++text_pixels; 195a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if ((pixels[i] & kAlphaMask) == kAlphaMask) 196a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ++opaque_pixels; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 198a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_GT(text_pixels, 0); 199a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_EQ(opaque_pixels, kSize.GetArea()); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 202