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

Side by Side Diff: ui/gfx/platform_font_linux.cc

Issue 2031223003: Support underline on Linux again. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed the gtk2_ui as well. Created 4 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 unified diff | Download patch
« no previous file with comments | « ui/gfx/platform_font_linux.h ('k') | ui/gfx/platform_font_linux_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/gfx/platform_font_linux.h" 5 #include "ui/gfx/platform_font_linux.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 9
10 #include "base/lazy_instance.h" 10 #include "base/lazy_instance.h"
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
73 std::string* PlatformFontLinux::default_font_description_ = NULL; 73 std::string* PlatformFontLinux::default_font_description_ = NULL;
74 #endif 74 #endif
75 75
76 //////////////////////////////////////////////////////////////////////////////// 76 ////////////////////////////////////////////////////////////////////////////////
77 // PlatformFontLinux, public: 77 // PlatformFontLinux, public:
78 78
79 PlatformFontLinux::PlatformFontLinux() { 79 PlatformFontLinux::PlatformFontLinux() {
80 if (!g_default_font.Get()) { 80 if (!g_default_font.Get()) {
81 std::string family = kFallbackFontFamilyName; 81 std::string family = kFallbackFontFamilyName;
82 int size_pixels = 12; 82 int size_pixels = 12;
83 bool italic = false; 83 int style = Font::NORMAL;
84 Font::Weight weight = Font::Weight::NORMAL; 84 Font::Weight weight = Font::Weight::NORMAL;
85 FontRenderParams params; 85 FontRenderParams params;
86 86
87 #if defined(OS_CHROMEOS) 87 #if defined(OS_CHROMEOS)
88 // On Chrome OS, a FontList font description string is stored as a 88 // On Chrome OS, a FontList font description string is stored as a
89 // translatable resource and passed in via SetDefaultFontDescription(). 89 // translatable resource and passed in via SetDefaultFontDescription().
90 if (default_font_description_) { 90 if (default_font_description_) {
91 FontRenderParamsQuery query; 91 FontRenderParamsQuery query;
92 CHECK(FontList::ParseDescription(*default_font_description_, 92 CHECK(FontList::ParseDescription(*default_font_description_,
93 &query.families, &query.style, 93 &query.families, &query.style,
94 &query.pixel_size, &query.weight)) 94 &query.pixel_size, &query.weight))
95 << "Failed to parse font description " << *default_font_description_; 95 << "Failed to parse font description " << *default_font_description_;
96 params = gfx::GetFontRenderParams(query, &family); 96 params = gfx::GetFontRenderParams(query, &family);
97 size_pixels = query.pixel_size; 97 size_pixels = query.pixel_size;
98 italic = query.style & gfx::Font::ITALIC; 98 style = query.style;
99 weight = query.weight; 99 weight = query.weight;
100 } 100 }
101 #else 101 #else
102 // On Linux, LinuxFontDelegate is used to query the native toolkit (e.g. 102 // On Linux, LinuxFontDelegate is used to query the native toolkit (e.g.
103 // GTK+) for the default UI font. 103 // GTK+) for the default UI font.
104 const LinuxFontDelegate* delegate = LinuxFontDelegate::instance(); 104 const LinuxFontDelegate* delegate = LinuxFontDelegate::instance();
105 if (delegate) { 105 if (delegate) {
106 delegate->GetDefaultFontDescription(&family, &size_pixels, &italic, 106 delegate->GetDefaultFontDescription(&family, &size_pixels, &style,
107 &weight, &params); 107 &weight, &params);
108 } 108 }
109 #endif 109 #endif
110 110
111 g_default_font.Get() = 111 g_default_font.Get() = new PlatformFontLinux(
112 new PlatformFontLinux(CreateSkTypeface(italic, weight, &family), family, 112 CreateSkTypeface(style & Font::ITALIC, weight, &family), family,
113 size_pixels, italic, weight, params); 113 size_pixels, style, weight, params);
114 } 114 }
115 115
116 InitFromPlatformFont(g_default_font.Get().get()); 116 InitFromPlatformFont(g_default_font.Get().get());
117 } 117 }
118 118
119 PlatformFontLinux::PlatformFontLinux(const std::string& font_name, 119 PlatformFontLinux::PlatformFontLinux(const std::string& font_name,
120 int font_size_pixels) { 120 int font_size_pixels) {
121 FontRenderParamsQuery query; 121 FontRenderParamsQuery query;
122 query.families.push_back(font_name); 122 query.families.push_back(font_name);
123 query.pixel_size = font_size_pixels; 123 query.pixel_size = font_size_pixels;
124 query.weight = Font::Weight::NORMAL; 124 query.weight = Font::Weight::NORMAL;
125 InitFromDetails(nullptr, font_name, font_size_pixels, 125 InitFromDetails(nullptr, font_name, font_size_pixels,
126 false, query.weight, gfx::GetFontRenderParams(query, NULL)); 126 Font::NORMAL, query.weight,
127 gfx::GetFontRenderParams(query, NULL));
127 } 128 }
128 129
129 //////////////////////////////////////////////////////////////////////////////// 130 ////////////////////////////////////////////////////////////////////////////////
130 // PlatformFontLinux, PlatformFont implementation: 131 // PlatformFontLinux, PlatformFont implementation:
131 132
132 // static 133 // static
133 void PlatformFontLinux::ReloadDefaultFont() { 134 void PlatformFontLinux::ReloadDefaultFont() {
134 // Reset the scoped_refptr. 135 // Reset the scoped_refptr.
135 g_default_font.Get() = nullptr; 136 g_default_font.Get() = nullptr;
136 } 137 }
137 138
138 #if defined(OS_CHROMEOS) 139 #if defined(OS_CHROMEOS)
139 // static 140 // static
140 void PlatformFontLinux::SetDefaultFontDescription( 141 void PlatformFontLinux::SetDefaultFontDescription(
141 const std::string& font_description) { 142 const std::string& font_description) {
142 delete default_font_description_; 143 delete default_font_description_;
143 default_font_description_ = new std::string(font_description); 144 default_font_description_ = new std::string(font_description);
144 } 145 }
145 146
146 #endif 147 #endif
147 148
148 Font PlatformFontLinux::DeriveFont(int size_delta, 149 Font PlatformFontLinux::DeriveFont(int size_delta,
149 int style, 150 int style,
150 Font::Weight weight) const { 151 Font::Weight weight) const {
151 const int new_size = font_size_pixels_ + size_delta; 152 const int new_size = font_size_pixels_ + size_delta;
152 DCHECK_GT(new_size, 0); 153 DCHECK_GT(new_size, 0);
153 154
154 const int current_style = italic_ ? Font::ITALIC : Font::NORMAL;
155
156 // If the style changed, we may need to load a new face. 155 // If the style changed, we may need to load a new face.
157 std::string new_family = font_family_; 156 std::string new_family = font_family_;
158 sk_sp<SkTypeface> typeface = 157 sk_sp<SkTypeface> typeface =
159 (weight == weight_ && style == current_style) 158 (weight == weight_ && style == style_)
160 ? typeface_ 159 ? typeface_
161 : CreateSkTypeface(style, weight, &new_family); 160 : CreateSkTypeface(style, weight, &new_family);
162 161
163 FontRenderParamsQuery query; 162 FontRenderParamsQuery query;
164 query.families.push_back(new_family); 163 query.families.push_back(new_family);
165 query.pixel_size = new_size; 164 query.pixel_size = new_size;
166 // TODO(mboc): Support UNDERLINE on Linux, if possible. 165 query.style = style;
167 query.style = style & Font::ITALIC;
168 166
169 return Font(new PlatformFontLinux(std::move(typeface), new_family, new_size, 167 return Font(new PlatformFontLinux(std::move(typeface), new_family, new_size,
170 style & Font::ITALIC, weight, gfx::GetFontRenderParams(query, NULL))); 168 style, weight, gfx::GetFontRenderParams(query, NULL)));
171 } 169 }
172 170
173 int PlatformFontLinux::GetHeight() { 171 int PlatformFontLinux::GetHeight() {
174 ComputeMetricsIfNecessary(); 172 ComputeMetricsIfNecessary();
175 return height_pixels_; 173 return height_pixels_;
176 } 174 }
177 175
178 Font::Weight PlatformFontLinux::GetWeight() const { 176 Font::Weight PlatformFontLinux::GetWeight() const {
179 return weight_; 177 return weight_;
180 } 178 }
181 179
182 int PlatformFontLinux::GetBaseline() { 180 int PlatformFontLinux::GetBaseline() {
183 ComputeMetricsIfNecessary(); 181 ComputeMetricsIfNecessary();
184 return ascent_pixels_; 182 return ascent_pixels_;
185 } 183 }
186 184
187 int PlatformFontLinux::GetCapHeight() { 185 int PlatformFontLinux::GetCapHeight() {
188 ComputeMetricsIfNecessary(); 186 ComputeMetricsIfNecessary();
189 return cap_height_pixels_; 187 return cap_height_pixels_;
190 } 188 }
191 189
192 int PlatformFontLinux::GetExpectedTextWidth(int length) { 190 int PlatformFontLinux::GetExpectedTextWidth(int length) {
193 ComputeMetricsIfNecessary(); 191 ComputeMetricsIfNecessary();
194 return round(static_cast<float>(length) * average_width_pixels_); 192 return round(static_cast<float>(length) * average_width_pixels_);
195 } 193 }
196 194
197 int PlatformFontLinux::GetStyle() const { 195 int PlatformFontLinux::GetStyle() const {
198 return italic_ ? Font::ITALIC : Font::NORMAL; 196 return style_;
199 } 197 }
200 198
201 const std::string& PlatformFontLinux::GetFontName() const { 199 const std::string& PlatformFontLinux::GetFontName() const {
202 return font_family_; 200 return font_family_;
203 } 201 }
204 202
205 std::string PlatformFontLinux::GetActualFontNameForTesting() const { 203 std::string PlatformFontLinux::GetActualFontNameForTesting() const {
206 SkString family_name; 204 SkString family_name;
207 typeface_->getFamilyName(&family_name); 205 typeface_->getFamilyName(&family_name);
208 return family_name.c_str(); 206 return family_name.c_str();
209 } 207 }
210 208
211 int PlatformFontLinux::GetFontSize() const { 209 int PlatformFontLinux::GetFontSize() const {
212 return font_size_pixels_; 210 return font_size_pixels_;
213 } 211 }
214 212
215 const FontRenderParams& PlatformFontLinux::GetFontRenderParams() { 213 const FontRenderParams& PlatformFontLinux::GetFontRenderParams() {
216 float current_scale_factor = GetFontRenderParamsDeviceScaleFactor(); 214 float current_scale_factor = GetFontRenderParamsDeviceScaleFactor();
217 if (current_scale_factor != device_scale_factor_) { 215 if (current_scale_factor != device_scale_factor_) {
218 FontRenderParamsQuery query; 216 FontRenderParamsQuery query;
219 query.families.push_back(font_family_); 217 query.families.push_back(font_family_);
220 query.pixel_size = font_size_pixels_; 218 query.pixel_size = font_size_pixels_;
221 query.style = italic_ ? Font::ITALIC : Font::NORMAL; 219 query.style = style_;
222 query.weight = weight_; 220 query.weight = weight_;
223 query.device_scale_factor = current_scale_factor; 221 query.device_scale_factor = current_scale_factor;
224 font_render_params_ = gfx::GetFontRenderParams(query, nullptr); 222 font_render_params_ = gfx::GetFontRenderParams(query, nullptr);
225 device_scale_factor_ = current_scale_factor; 223 device_scale_factor_ = current_scale_factor;
226 } 224 }
227 return font_render_params_; 225 return font_render_params_;
228 } 226 }
229 227
230 //////////////////////////////////////////////////////////////////////////////// 228 ////////////////////////////////////////////////////////////////////////////////
231 // PlatformFontLinux, private: 229 // PlatformFontLinux, private:
232 230
233 PlatformFontLinux::PlatformFontLinux(sk_sp<SkTypeface> typeface, 231 PlatformFontLinux::PlatformFontLinux(sk_sp<SkTypeface> typeface,
234 const std::string& family, 232 const std::string& family,
235 int size_pixels, 233 int size_pixels,
236 bool italic, 234 int style,
237 Font::Weight weight, 235 Font::Weight weight,
238 const FontRenderParams& render_params) { 236 const FontRenderParams& render_params) {
239 InitFromDetails(std::move(typeface), family, size_pixels, italic, weight, 237 InitFromDetails(std::move(typeface), family, size_pixels, style, weight,
240 render_params); 238 render_params);
241 } 239 }
242 240
243 PlatformFontLinux::~PlatformFontLinux() {} 241 PlatformFontLinux::~PlatformFontLinux() {}
244 242
245 void PlatformFontLinux::InitFromDetails( 243 void PlatformFontLinux::InitFromDetails(
246 sk_sp<SkTypeface> typeface, 244 sk_sp<SkTypeface> typeface,
247 const std::string& font_family, 245 const std::string& font_family,
248 int font_size_pixels, 246 int font_size_pixels,
249 bool italic, 247 int style,
250 Font::Weight weight, 248 Font::Weight weight,
251 const FontRenderParams& render_params) { 249 const FontRenderParams& render_params) {
252 DCHECK_GT(font_size_pixels, 0); 250 DCHECK_GT(font_size_pixels, 0);
253 251
254 font_family_ = font_family; 252 font_family_ = font_family;
255 typeface_ = typeface ? std::move(typeface) : 253 typeface_ = typeface ? std::move(typeface) :
256 CreateSkTypeface(italic, weight, &font_family_); 254 CreateSkTypeface(style & Font::ITALIC, weight, &font_family_);
257 255
258 font_size_pixels_ = font_size_pixels; 256 font_size_pixels_ = font_size_pixels;
259 italic_ = italic; 257 style_ = style;
260 weight_ = weight; 258 weight_ = weight;
261 device_scale_factor_ = GetFontRenderParamsDeviceScaleFactor(); 259 device_scale_factor_ = GetFontRenderParamsDeviceScaleFactor();
262 font_render_params_ = render_params; 260 font_render_params_ = render_params;
263 } 261 }
264 262
265 void PlatformFontLinux::InitFromPlatformFont(const PlatformFontLinux* other) { 263 void PlatformFontLinux::InitFromPlatformFont(const PlatformFontLinux* other) {
266 typeface_ = other->typeface_; 264 typeface_ = other->typeface_;
267 font_family_ = other->font_family_; 265 font_family_ = other->font_family_;
268 font_size_pixels_ = other->font_size_pixels_; 266 font_size_pixels_ = other->font_size_pixels_;
269 italic_ = other->italic_; 267 style_ = other->style_;
270 weight_ = other->weight_; 268 weight_ = other->weight_;
271 device_scale_factor_ = other->device_scale_factor_; 269 device_scale_factor_ = other->device_scale_factor_;
272 font_render_params_ = other->font_render_params_; 270 font_render_params_ = other->font_render_params_;
273 271
274 if (!other->metrics_need_computation_) { 272 if (!other->metrics_need_computation_) {
275 metrics_need_computation_ = false; 273 metrics_need_computation_ = false;
276 ascent_pixels_ = other->ascent_pixels_; 274 ascent_pixels_ = other->ascent_pixels_;
277 height_pixels_ = other->height_pixels_; 275 height_pixels_ = other->height_pixels_;
278 cap_height_pixels_ = other->cap_height_pixels_; 276 cap_height_pixels_ = other->cap_height_pixels_;
279 average_width_pixels_ = other->average_width_pixels_; 277 average_width_pixels_ = other->average_width_pixels_;
280 } 278 }
281 } 279 }
282 280
283 void PlatformFontLinux::ComputeMetricsIfNecessary() { 281 void PlatformFontLinux::ComputeMetricsIfNecessary() {
284 if (metrics_need_computation_) { 282 if (metrics_need_computation_) {
285 metrics_need_computation_ = false; 283 metrics_need_computation_ = false;
286 284
287 SkPaint paint; 285 SkPaint paint;
288 paint.setAntiAlias(false); 286 paint.setAntiAlias(false);
289 paint.setSubpixelText(false); 287 paint.setSubpixelText(false);
290 paint.setTextSize(font_size_pixels_); 288 paint.setTextSize(font_size_pixels_);
291 paint.setTypeface(typeface_.get()); 289 paint.setTypeface(typeface_.get());
292 paint.setFakeBoldText(weight_ >= Font::Weight::BOLD && 290 paint.setFakeBoldText(weight_ >= Font::Weight::BOLD &&
293 !typeface_->isBold()); 291 !typeface_->isBold());
294 paint.setTextSkewX(italic_ && !typeface_->isItalic() ? -SK_Scalar1 / 4 : 0); 292 paint.setTextSkewX((Font::ITALIC & style_) && !typeface_->isItalic() ?
293 -SK_Scalar1/4 : 0);
295 SkPaint::FontMetrics metrics; 294 SkPaint::FontMetrics metrics;
296 paint.getFontMetrics(&metrics); 295 paint.getFontMetrics(&metrics);
297 ascent_pixels_ = SkScalarCeilToInt(-metrics.fAscent); 296 ascent_pixels_ = SkScalarCeilToInt(-metrics.fAscent);
298 height_pixels_ = ascent_pixels_ + SkScalarCeilToInt(metrics.fDescent); 297 height_pixels_ = ascent_pixels_ + SkScalarCeilToInt(metrics.fDescent);
299 cap_height_pixels_ = SkScalarCeilToInt(metrics.fCapHeight); 298 cap_height_pixels_ = SkScalarCeilToInt(metrics.fCapHeight);
300 average_width_pixels_ = SkScalarToDouble(metrics.fAvgCharWidth); 299 average_width_pixels_ = SkScalarToDouble(metrics.fAvgCharWidth);
301 } 300 }
302 } 301 }
303 302
304 //////////////////////////////////////////////////////////////////////////////// 303 ////////////////////////////////////////////////////////////////////////////////
305 // PlatformFont, public: 304 // PlatformFont, public:
306 305
307 // static 306 // static
308 PlatformFont* PlatformFont::CreateDefault() { 307 PlatformFont* PlatformFont::CreateDefault() {
309 return new PlatformFontLinux; 308 return new PlatformFontLinux;
310 } 309 }
311 310
312 // static 311 // static
313 PlatformFont* PlatformFont::CreateFromNameAndSize(const std::string& font_name, 312 PlatformFont* PlatformFont::CreateFromNameAndSize(const std::string& font_name,
314 int font_size) { 313 int font_size) {
315 return new PlatformFontLinux(font_name, font_size); 314 return new PlatformFontLinux(font_name, font_size);
316 } 315 }
317 316
318 } // namespace gfx 317 } // namespace gfx
OLDNEW
« no previous file with comments | « ui/gfx/platform_font_linux.h ('k') | ui/gfx/platform_font_linux_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698