Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2437)

Unified Diff: Source/platform/fonts/Character.cpp

Issue 1206883002: Fix default text orientation that do not conform Unicode Technical Report #50 (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/platform/fonts/Character.h ('k') | Source/platform/fonts/Font.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/platform/fonts/Character.cpp
diff --git a/Source/platform/fonts/Character.cpp b/Source/platform/fonts/Character.cpp
index bade6b5f8803fb16f81740d070e3b0984146082b..0e5548fe082f2168bdf4bd4bdd238a5ccb935fb0 100644
--- a/Source/platform/fonts/Character.cpp
+++ b/Source/platform/fonts/Character.cpp
@@ -165,83 +165,135 @@ CodePath Character::characterRangeCodePath(const UChar* characters, unsigned len
return result;
}
-bool Character::shouldIgnoreRotation(UChar32 character)
+bool Character::isUprightInMixedVertical(UChar32 character)
{
- if (character == 0x000A7 || character == 0x000A9 || character == 0x000AE)
- return true;
-
- if (character == 0x000B6 || character == 0x000BC || character == 0x000BD || character == 0x000BE)
- return true;
-
- if (isInRange(character, 0x002E5, 0x002EB))
- return true;
-
- if (isInRange(character, 0x01100, 0x011FF) || isInRange(character, 0x01401, 0x0167F) || isInRange(character, 0x018B0, 0x018FF))
- return true;
-
- if (character == 0x02016 || character == 0x02018 || character == 0x02019 || character == 0x02020 || character == 0x02021
- || character == 0x2030 || character == 0x02031)
- return true;
-
- if (isInRange(character, 0x0203B, 0x0203D) || character == 0x02042 || character == 0x02044 || character == 0x02047
- || character == 0x02048 || character == 0x02049 || character == 0x2051)
- return true;
-
- if (isInRange(character, 0x02065, 0x02069) || isInRange(character, 0x020DD, 0x020E0)
- || isInRange(character, 0x020E2, 0x020E4) || isInRange(character, 0x02100, 0x02117)
- || isInRange(character, 0x02119, 0x02131) || isInRange(character, 0x02133, 0x0213F))
- return true;
-
- if (isInRange(character, 0x02145, 0x0214A) || character == 0x0214C || character == 0x0214D
- || isInRange(character, 0x0214F, 0x0218F))
- return true;
-
- if (isInRange(character, 0x02300, 0x02307) || isInRange(character, 0x0230C, 0x0231F)
- || isInRange(character, 0x02322, 0x0232B) || isInRange(character, 0x0237D, 0x0239A)
- || isInRange(character, 0x023B4, 0x023B6) || isInRange(character, 0x023BA, 0x023CF)
- || isInRange(character, 0x023D1, 0x023DB) || isInRange(character, 0x023E2, 0x024FF))
- return true;
-
- if (isInRange(character, 0x025A0, 0x02619) || isInRange(character, 0x02620, 0x02767)
- || isInRange(character, 0x02776, 0x02793) || isInRange(character, 0x02B12, 0x02B2F)
- || isInRange(character, 0x02B4D, 0x02BFF) || isInRange(character, 0x02E80, 0x03007))
- return true;
-
- if (character == 0x03012 || character == 0x03013 || isInRange(character, 0x03020, 0x0302F)
- || isInRange(character, 0x03031, 0x0309F) || isInRange(character, 0x030A1, 0x030FB)
- || isInRange(character, 0x030FD, 0x0A4CF))
- return true;
-
- if (isInRange(character, 0x0A960, 0x0A97F)
- || isInRange(character, 0x0AC00, 0x0D7FF) || isInRange(character, 0x0E000, 0x0FAFF))
- return true;
-
- if (isInRange(character, 0x0FE10, 0x0FE1F) || isInRange(character, 0x0FE30, 0x0FE48)
- || isInRange(character, 0x0FE50, 0x0FE57) || isInRange(character, 0x0FE5F, 0x0FE62)
- || isInRange(character, 0x0FE67, 0x0FE6F))
- return true;
+ // Fast path for common non-CJK
+ if (character < 0x000A7)
+ return false;
- if (isInRange(character, 0x0FF01, 0x0FF07) || isInRange(character, 0x0FF0A, 0x0FF0C)
- || isInRange(character, 0x0FF0E, 0x0FF19) || isInRange(character, 0x0FF1F, 0x0FF3A))
+ // Fast path for common CJK
+ if (isInRange(character, 0x02E80, 0x0A4CF))
return true;
- if (character == 0x0FF3C || character == 0x0FF3E)
- return true;
+ if (isInRange(character, 0x0FF01, 0x0FFE7)) {
+ if (character <= 0x0FF0C || isInRange(character, 0x0FF0E, 0x0FF1B)
+ || isInRange(character, 0x0FF1F, 0x0FF60) || character >= 0x0FFE0)
+ return true;
+ return false;
+ }
- if (isInRange(character, 0x0FF40, 0x0FF5A) || isInRange(character, 0x0FFE0, 0x0FFE2)
- || isInRange(character, 0x0FFE4, 0x0FFE7) || isInRange(character, 0x0FFF0, 0x0FFF8)
- || character == 0x0FFFD)
+ // Fast path for medium-common non-CJK
+ if (character == 0x000A7 || character == 0x000A9 || character == 0x000AE)
return true;
-
- if (isInRange(character, 0x13000, 0x1342F) || isInRange(character, 0x1B000, 0x1B0FF)
- || isInRange(character, 0x1D000, 0x1D1FF) || isInRange(character, 0x1D300, 0x1D37F)
- || isInRange(character, 0x1F000, 0x1F64F) || isInRange(character, 0x1F680, 0x1F77F))
+ if (character == 0x000B1 || character == 0x000BC || character == 0x000BD || character == 0x000BE)
return true;
-
- if (isInRange(character, 0x20000, 0x2FFFD) || isInRange(character, 0x30000, 0x3FFFD))
+ if (character == 0x000D7 || character == 0x000F7)
return true;
+ if (character < 0x002EA)
+ return false;
- return false;
+ static const UChar32 uprightRanges[] = {
+ // Spacing Modifier Letters (Part of)
+ 0x002EA, 0x002EB,
+ // Hangul Jamo
+ 0x01100, 0x011FF,
+ // Unified Canadian Aboriginal Syllabics
+ 0x01401, 0x0167F,
+ // Unified Canadian Aboriginal Syllabics Extended
+ 0x018B0, 0x018FF,
+ // General Punctuation (Part of)
+ 0x02016, 0x02016,
+ 0x02020, 0x02021,
+ 0x02030, 0x02031,
+ 0x0203B, 0x0203C,
+ 0x02042, 0x02042,
+ 0x02047, 0x02049,
+ 0x02051, 0x02051,
+ 0x02065, 0x02069,
+ // Combining Diacritical Marks for Symbols (Part of)
+ 0x020DD, 0x020E0,
+ 0x020E2, 0x020E4,
+ // Letterlike Symbols (Part of)/Number Forms
+ 0x02100, 0x02101,
+ 0x02103, 0x02109,
+ 0x0210F, 0x0210F,
+ 0x02113, 0x02114,
+ 0x02116, 0x02117,
+ 0x0211E, 0x02123,
+ 0x02125, 0x02125,
+ 0x02127, 0x02127,
+ 0x02129, 0x02129,
+ 0x0212E, 0x0212E,
+ 0x02135, 0x0213F,
+ 0x02145, 0x0214A,
+ 0x0214C, 0x0214D,
+ 0x0214F, 0x0218F,
+ // Mathematical Operators (Part of)
+ 0x0221E, 0x0221E,
+ 0x02234, 0x02235,
+ // Miscellaneous Technical (Part of)
+ 0x02300, 0x02307,
+ 0x0230C, 0x0231F,
+ 0x02324, 0x0232B,
+ 0x0237D, 0x0239A,
+ 0x023BE, 0x023CD,
+ 0x023CF, 0x023CF,
+ 0x023D1, 0x023DB,
+ 0x023E2, 0x02422,
+ // Control Pictures (Part of)/Optical Character Recognition/Enclosed Alphanumerics
+ 0x02424, 0x024FF,
+ // Geometric Shapes/Miscellaneous Symbols (Part of)
+ 0x025A0, 0x02619,
+ 0x02620, 0x02767,
+ 0x02776, 0x02793,
+ // Miscellaneous Symbols and Arrows (Part of)
+ 0x02B12, 0x02B2F,
+ 0x02B50, 0x02B59,
+ 0x02BB8, 0x02BFF,
+ // Hangul Jamo Extended-A
+ 0x0A960, 0x0A97F,
+ // Hangul Syllables/Hangul Jamo Extended-B
+ 0x0AC00, 0x0D7FF,
+ // Private Use Area/CJK Compatibility Ideographs
+ 0x0E000, 0x0FAFF,
+ // Vertical Forms
+ 0x0FE10, 0x0FE1F,
+ // CJK Compatibility Forms (Part of)
+ 0x0FE30, 0x0FE48,
+ // Small Form Variants (Part of)
+ 0x0FE50, 0x0FE57,
+ 0x0FE59, 0x0FE62,
+ 0x0FE67, 0x0FE6F,
+ // Specials (Part of)
+ 0x0FFF0, 0x0FFF8,
+ 0x0FFFC, 0x0FFFD,
+ // Meroitic Hieroglyphs
+ 0x10980, 0x1099F,
+ // Siddham
+ 0x11580, 0x115FF,
+ // Egyptian Hieroglyphs
+ 0x13000, 0x1342F,
+ // Kana Supplement
+ 0x1B000, 0x1B0FF,
+ // Byzantine Musical Symbols/Musical Symbols
+ 0x1D000, 0x1D1FF,
+ // Tai Xuan Jing Symbols/Counting Rod Numerals
+ 0x1D300, 0x1D37F,
+ // Mahjong Tiles/Domino Tiles/Playing Cards/Enclosed Alphanumeric Supplement
+ // Enclosed Ideographic Supplement/Enclosed Ideographic Supplement
+ // Emoticons/Ornamental Dingbats/Transport and Map Symbols/Alchemical Symbols
+ // Alchemical Symbols
+ 0x1F000, 0x1F7FF,
+ // CJK Unified Ideographs Extension B/C/D
+ // CJK Compatibility Ideographs Supplement
+ 0x20000, 0x2FFFD,
+ 0x30000, 0x3FFFD,
+ // Supplementary Private Use Area-A
+ 0xF0000, 0xFFFFD,
+ // Supplementary Private Use Area-B
+ 0x100000, 0x10FFFD,
+ };
+ return valueInIntervalList(uprightRanges, character);
}
bool Character::isCJKIdeograph(UChar32 c)
« no previous file with comments | « Source/platform/fonts/Character.h ('k') | Source/platform/fonts/Font.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698