Index: ppapi/tests/test_browser_font.cc |
diff --git a/ppapi/tests/test_browser_font.cc b/ppapi/tests/test_browser_font.cc |
index 9f3a2e07044d742670063a50c36f5e56ab4356eb..7c6614662254a023af1c467b876affa655079935 100644 |
--- a/ppapi/tests/test_browser_font.cc |
+++ b/ppapi/tests/test_browser_font.cc |
@@ -4,8 +4,6 @@ |
#include "ppapi/tests/test_browser_font.h" |
-#include <stdio.h>// ERASEME |
- |
#include "ppapi/tests/test_utils.h" |
#include "ppapi/tests/testing_instance.h" |
#include "ppapi/cpp/image_data.h" |
@@ -20,6 +18,7 @@ bool TestBrowserFont::Init() { |
void TestBrowserFont::RunTests(const std::string& filter) { |
RUN_TEST(FontFamilies, filter); |
RUN_TEST(Measure, filter); |
+ RUN_TEST(MeasureRTL, filter); |
RUN_TEST(CharPos, filter); |
RUN_TEST(Draw, filter); |
viettrungluu
2012/06/27 20:34:28
You forgot CharPosRTL.
|
} |
@@ -54,6 +53,52 @@ std::string TestBrowserFont::TestMeasure() { |
PASS(); |
} |
+std::string TestBrowserFont::TestMeasureRTL() { |
+ pp::BrowserFontDescription desc; |
+ pp::BrowserFont_Trusted font(instance_, desc); |
+ |
+ // Mixed string, two chars of LTR, two of RTL, than two of LTR. |
viettrungluu
2012/06/27 20:33:58
s/than/then/
|
+ // Note this is in UTF-8 so has more than 6 bytes. |
+ std::string mixed("AB\xd7\x94\xd7\x97ZZ"); |
+ const int kNumChars = 6; |
+ pp::BrowserFontTextRun run(mixed); |
+ |
+ // Note that since this is UTF8, the two RTL chars are two bytes each. |
viettrungluu
2012/06/27 20:33:58
Nit: "UTF8" or "UTF-8"?
|
+ int32_t len[kNumChars]; |
+ len[0] = font.PixelOffsetForCharacter(run, 0); |
+ len[1] = font.PixelOffsetForCharacter(run, 1); |
+ len[2] = font.PixelOffsetForCharacter(run, 2); |
+ len[3] = font.PixelOffsetForCharacter(run, 3); |
+ len[4] = font.PixelOffsetForCharacter(run, 4); |
+ len[5] = font.PixelOffsetForCharacter(run, 5); |
+ |
+ // First three chars should be increasing. |
+ ASSERT_TRUE(len[0] >= 0); |
+ ASSERT_TRUE(len[1] > len[0]); |
+ ASSERT_TRUE(len[2] > len[1]); |
viettrungluu
2012/06/27 20:33:58
Instead of this convoluted logic, I don't see why
|
+ |
+ // Next char should be between the previous two (since it's going RTL). |
+ ASSERT_TRUE(len[3] < len[2] && len[3] > len[1]); |
+ |
+ // Last two chars should be increasing again. |
+ ASSERT_TRUE(len[4] > len[2] && len[4] > len[3]); |
+ ASSERT_TRUE(len[4] > len[3]); |
+ |
+ // Test the same sequence with force LTR. The offsets should appear in |
+ // sequence. |
+ pp::BrowserFontTextRun forced_run(mixed, false, true); |
+ len[0] = font.PixelOffsetForCharacter(forced_run, 0); |
+ len[1] = font.PixelOffsetForCharacter(forced_run, 1); |
+ len[2] = font.PixelOffsetForCharacter(forced_run, 2); |
+ len[3] = font.PixelOffsetForCharacter(forced_run, 3); |
+ len[4] = font.PixelOffsetForCharacter(forced_run, 4); |
+ len[5] = font.PixelOffsetForCharacter(forced_run, 5); |
+ for (int i = 1; i < kNumChars; i++) |
+ ASSERT_TRUE(len[i] > len[i - 1]); |
+ |
+ PASS(); |
+} |
+ |
// Tests that the character/pixel offset functions correctly round-trip. |
std::string TestBrowserFont::TestCharPos() { |
pp::BrowserFontDescription desc; |
@@ -71,6 +116,48 @@ std::string TestBrowserFont::TestCharPos() { |
PASS(); |
} |
+// Tests that we can get character positions in a mixed LTR/RTL run. |
+std::string TestBrowserFont::TestCharPosRTL() { |
+ pp::BrowserFontDescription desc; |
+ pp::BrowserFont_Trusted font(instance_, desc); |
+ |
+ // Mixed string, two chars of LTR, two of RTL, than two of LTR. |
+ // Note this is in UTF-8 so has more than 6 bytes. |
+ std::string mixed("AB\xd7\x94\xd7\x97ZZ"); |
+ |
+ pp::BrowserFontTextRun run(mixed); |
+ static const int kNumChars = 6; |
+ int expected_char_sequence[kNumChars] = { 0, 1, 3, 2, 4, 5 }; |
+ |
+ // Check that the characters appear in the order we expect. |
+ int pixel_width = font.MeasureText(pp::BrowserFontTextRun(mixed)); |
+ int last_sequence = 0; // Index into expected_char_sequence. |
+ for (int x = 0; x < pixel_width; x++) { |
+ int cur_char = font.CharacterOffsetForPixel(run, x); |
+ if (cur_char != expected_char_sequence[cur_char]) { |
+ // This pixel has a different character. It should be the next one in |
+ // the sequence for it to be correct. |
+ last_sequence++; |
+ ASSERT_TRUE(last_sequence < kNumChars); |
+ ASSERT_TRUE(cur_char == expected_char_sequence[last_sequence]); |
+ } |
+ } |
+ |
+ // Try the same string with force LTR. The characters should all appear in |
+ // sequence. |
+ pp::BrowserFontTextRun forced_run(mixed, false, true); |
+ int last_forced_char = 0; // Char index into the forced sequence. |
+ for (int x = 0; x < pixel_width; x++) { |
+ int cur_char = font.CharacterOffsetForPixel(forced_run, x); |
+ if (cur_char != last_forced_char) { |
+ last_forced_char++; |
+ ASSERT_TRUE(cur_char == last_forced_char); |
+ } |
+ } |
+ |
+ PASS(); |
+} |
+ |
// Tests that drawing some text produces "some" output. |
std::string TestBrowserFont::TestDraw() { |
pp::BrowserFontDescription desc; |