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

Side by Side Diff: third_party/WebKit/Source/platform/fonts/opentype/OpenTypeCapsSupport.cpp

Issue 1882063002: Add OpenTypeCapsSupport class (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@caseMapHbBufferFillerLand
Patch Set: Created 4 years, 8 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2015 The Chromium Authors. All rights reserved.
eae 2016/04/12 15:20:12 2016
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "platform/fonts/opentype/OpenTypeCapsSupport.h"
6
7 namespace blink {
8
9 OpenTypeCapsSupport::OpenTypeCapsSupport()
10 : m_harfBuzzFace(nullptr)
11 , m_requestedCaps(FontDescription::CapsNormal)
12 , m_fontSupport(FontSupport::Full)
13 , m_capsSynthesis(CapsSynthesis::None)
14 {
15 }
16
17 OpenTypeCapsSupport::OpenTypeCapsSupport(const HarfBuzzFace* harfBuzzFace,
18 FontDescription::FontVariantCaps requestedCaps,
19 hb_script_t script)
20 : m_harfBuzzFace(harfBuzzFace)
21 , m_requestedCaps(requestedCaps)
22 , m_fontSupport(FontSupport::Full)
23 , m_capsSynthesis(CapsSynthesis::None)
24 {
25 if (requestedCaps != FontDescription::CapsNormal)
26 determineFontSupport(script);
27 }
28
29 FontDescription::FontVariantCaps OpenTypeCapsSupport::fontFeatureToUse(
30 SmallCapsIterator::SmallCapsBehavior sourceTextCase)
31 {
32 if (m_fontSupport == FontSupport::Full)
33 return m_requestedCaps;
34
35 if (m_fontSupport == FontSupport::Fallback) {
36 if (m_requestedCaps == FontDescription::FontVariantCaps::AllPetiteCaps)
37 return FontDescription::FontVariantCaps::AllSmallCaps;
38
39 if (m_requestedCaps == FontDescription::FontVariantCaps::PetiteCaps
40 || (m_requestedCaps == FontDescription::FontVariantCaps::Unicase
41 && sourceTextCase == SmallCapsIterator::SmallCapsSameCase))
42 return FontDescription::FontVariantCaps::SmallCaps;
43 }
44
45 return FontDescription::FontVariantCaps::CapsNormal;
46 }
47
48 bool OpenTypeCapsSupport::needsRunCaseSplitting()
49 {
50 // Lack of titling case support is ignored, titling case is not synthesized.
51 return m_fontSupport != FontSupport::Full
52 && m_requestedCaps != FontDescription::TitlingCaps;
53 }
54
55 bool OpenTypeCapsSupport::needsSyntheticFont(
56 SmallCapsIterator::SmallCapsBehavior runCase)
57 {
58 if (m_fontSupport == FontSupport::Full)
59 return false;
60
61 if (m_requestedCaps == FontDescription::TitlingCaps)
62 return false;
63
64 if (m_fontSupport == FontSupport::None) {
65 if (runCase == SmallCapsIterator::SmallCapsUppercaseNeeded
66 && (m_capsSynthesis == CapsSynthesis::LowerToSmallCaps
67 || m_capsSynthesis == CapsSynthesis::BothToSmallCaps))
68 return true;
69
70 if (runCase == SmallCapsIterator::SmallCapsSameCase
71 && (m_capsSynthesis == CapsSynthesis::UpperToSmallCaps
72 || m_capsSynthesis == CapsSynthesis::BothToSmallCaps)) {
73 return true;
74 }
75 }
76
77 return false;
78 }
79
80 CaseMapIntend OpenTypeCapsSupport::needsCaseChange(
81 SmallCapsIterator::SmallCapsBehavior runCase)
82 {
83 CaseMapIntend caseMapIntend = CaseMapIntend::KeepSameCase;
84
85 if (m_fontSupport == FontSupport::Full)
86 return caseMapIntend;
87
88 switch (runCase) {
89 case SmallCapsIterator::SmallCapsSameCase:
90 caseMapIntend = m_fontSupport == FontSupport::Fallback
91 && (m_capsSynthesis == CapsSynthesis::BothToSmallCaps
92 || m_capsSynthesis == CapsSynthesis::UpperToSmallCaps)
93 ? CaseMapIntend::LowerCase
94 : CaseMapIntend::KeepSameCase;
95 break;
96 case SmallCapsIterator::SmallCapsUppercaseNeeded:
97 caseMapIntend = m_fontSupport != FontSupport::Fallback
98 && (m_capsSynthesis == CapsSynthesis::LowerToSmallCaps
99 || m_capsSynthesis == CapsSynthesis::BothToSmallCaps)
100 ? CaseMapIntend::UpperCase
101 : CaseMapIntend::KeepSameCase;
102 break;
103 default:
104 break;
105 }
106 return caseMapIntend;
107 }
108
109 void OpenTypeCapsSupport::determineFontSupport(hb_script_t script)
110 {
111 switch (m_requestedCaps) {
112 case FontDescription::SmallCaps:
113 if (!supportsOpenTypeFeature(script, HB_TAG('s', 'm', 'c', 'p'))) {
114 m_fontSupport = FontSupport::None;
115 m_capsSynthesis = CapsSynthesis::LowerToSmallCaps;
116 }
117 break;
118 case FontDescription::AllSmallCaps:
119 if (!(supportsOpenTypeFeature(script, HB_TAG('s', 'm', 'c', 'p'))
120 && supportsOpenTypeFeature(
121 script,
122 HB_TAG('c', '2', 's', 'c')))) {
123 m_fontSupport = FontSupport::None;
124 m_capsSynthesis = CapsSynthesis::BothToSmallCaps;
125 }
126 break;
127 case FontDescription::PetiteCaps:
128 if (!supportsOpenTypeFeature(script, HB_TAG('p', 'c', 'a', 'p'))) {
129 if (supportsOpenTypeFeature(script, HB_TAG('s', 'm', 'c', 'p'))) {
130 m_fontSupport = FontSupport::Fallback;
131 } else {
132 m_fontSupport = FontSupport::None;
133 m_capsSynthesis = CapsSynthesis::LowerToSmallCaps;
134 }
135 }
136 break;
137 case FontDescription::AllPetiteCaps:
138 if (!(supportsOpenTypeFeature(script, HB_TAG('p', 'c', 'a', 'p'))
139 && supportsOpenTypeFeature(
140 script,
141 HB_TAG('c', '2', 'p', 'c')))) {
142 if (supportsOpenTypeFeature(script, HB_TAG('s', 'm', 'c', 'p'))
143 && supportsOpenTypeFeature(
144 script,
145 HB_TAG('c', '2', 's', 'c'))) {
146 m_fontSupport = FontSupport::Fallback;
147 } else {
148 m_fontSupport = FontSupport::None;
149 m_capsSynthesis = CapsSynthesis::BothToSmallCaps;
150 }
151 }
152 break;
153 case FontDescription::Unicase:
154 if (!supportsOpenTypeFeature(script, HB_TAG('u', 'n', 'i', 'c'))) {
155 m_capsSynthesis = CapsSynthesis::UpperToSmallCaps;
156 if (supportsOpenTypeFeature(script, HB_TAG('s', 'm', 'c', 'p'))) {
157 m_fontSupport = FontSupport::Fallback;
158 } else {
159 m_fontSupport = FontSupport::None;
160 }
161 }
162 break;
163 case FontDescription::TitlingCaps:
164 if (!supportsOpenTypeFeature(script, HB_TAG('t', 'i', 't', 'l'))) {
165 m_fontSupport = FontSupport::None;
166 }
167 break;
168 default:
169 ASSERT_NOT_REACHED();
170 }
171 }
172
173 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698