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

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

Issue 11299262: ui: Use skia::RefPtr<T> for implicit safe reference counting. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: winbuild Created 8 years 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 | Annotate | Revision Log
« no previous file with comments | « ui/gfx/platform_font_pango.h ('k') | ui/gfx/render_text.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_pango.h" 5 #include "ui/gfx/platform_font_pango.h"
6 6
7 #include <fontconfig/fontconfig.h> 7 #include <fontconfig/fontconfig.h>
8 #include <pango/pango.h> 8 #include <pango/pango.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
167 style_)); 167 style_));
168 } 168 }
169 169
170 // If the style has changed we may need to load a new face 170 // If the style has changed we may need to load a new face
171 int skstyle = SkTypeface::kNormal; 171 int skstyle = SkTypeface::kNormal;
172 if (gfx::Font::BOLD & style) 172 if (gfx::Font::BOLD & style)
173 skstyle |= SkTypeface::kBold; 173 skstyle |= SkTypeface::kBold;
174 if (gfx::Font::ITALIC & style) 174 if (gfx::Font::ITALIC & style)
175 skstyle |= SkTypeface::kItalic; 175 skstyle |= SkTypeface::kItalic;
176 176
177 SkTypeface* typeface = SkTypeface::CreateFromName( 177 skia::RefPtr<SkTypeface> typeface = skia::AdoptRef(
178 font_family_.c_str(), 178 SkTypeface::CreateFromName(
179 static_cast<SkTypeface::Style>(skstyle)); 179 font_family_.c_str(),
180 SkAutoUnref tf_helper(typeface); 180 static_cast<SkTypeface::Style>(skstyle)));
181 181
182 return Font(new PlatformFontPango(typeface, 182 return Font(new PlatformFontPango(typeface,
183 font_family_, 183 font_family_,
184 font_size_pixels_ + size_delta, 184 font_size_pixels_ + size_delta,
185 style)); 185 style));
186 } 186 }
187 187
188 int PlatformFontPango::GetHeight() const { 188 int PlatformFontPango::GetHeight() const {
189 return height_pixels_; 189 return height_pixels_;
190 } 190 }
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
245 // to paint it ourselves, see pango_font_metrics_get_underline_position. 245 // to paint it ourselves, see pango_font_metrics_get_underline_position.
246 break; 246 break;
247 } 247 }
248 248
249 return pfd; 249 return pfd;
250 } 250 }
251 251
252 //////////////////////////////////////////////////////////////////////////////// 252 ////////////////////////////////////////////////////////////////////////////////
253 // PlatformFontPango, private: 253 // PlatformFontPango, private:
254 254
255 PlatformFontPango::PlatformFontPango(SkTypeface* typeface, 255 PlatformFontPango::PlatformFontPango(const skia::RefPtr<SkTypeface>& typeface,
256 const std::string& name, 256 const std::string& name,
257 int size, 257 int size,
258 int style) { 258 int style) {
259 InitWithTypefaceNameSizeAndStyle(typeface, name, size, style); 259 InitWithTypefaceNameSizeAndStyle(typeface, name, size, style);
260 } 260 }
261 261
262 PlatformFontPango::~PlatformFontPango() {} 262 PlatformFontPango::~PlatformFontPango() {}
263 263
264 void PlatformFontPango::InitWithNameAndSize(const std::string& font_name, 264 void PlatformFontPango::InitWithNameAndSize(const std::string& font_name,
265 int font_size) { 265 int font_size) {
266 DCHECK_GT(font_size, 0); 266 DCHECK_GT(font_size, 0);
267 std::string fallback; 267 std::string fallback;
268 268
269 SkTypeface* typeface = SkTypeface::CreateFromName( 269 skia::RefPtr<SkTypeface> typeface = skia::AdoptRef(
270 font_name.c_str(), SkTypeface::kNormal); 270 SkTypeface::CreateFromName(font_name.c_str(), SkTypeface::kNormal));
271 if (!typeface) { 271 if (!typeface) {
272 // A non-scalable font such as .pcf is specified. Falls back to a default 272 // A non-scalable font such as .pcf is specified. Falls back to a default
273 // scalable font. 273 // scalable font.
274 typeface = SkTypeface::CreateFromName( 274 typeface = skia::AdoptRef(
275 kFallbackFontFamilyName, SkTypeface::kNormal); 275 SkTypeface::CreateFromName(
276 kFallbackFontFamilyName, SkTypeface::kNormal));
276 CHECK(typeface) << "Could not find any font: " 277 CHECK(typeface) << "Could not find any font: "
277 << font_name 278 << font_name
278 << ", " << kFallbackFontFamilyName; 279 << ", " << kFallbackFontFamilyName;
279 fallback = kFallbackFontFamilyName; 280 fallback = kFallbackFontFamilyName;
280 } 281 }
281 SkAutoUnref typeface_helper(typeface);
282 282
283 InitWithTypefaceNameSizeAndStyle(typeface, 283 InitWithTypefaceNameSizeAndStyle(typeface,
284 fallback.empty() ? font_name : fallback, 284 fallback.empty() ? font_name : fallback,
285 font_size, 285 font_size,
286 gfx::Font::NORMAL); 286 gfx::Font::NORMAL);
287 } 287 }
288 288
289 void PlatformFontPango::InitWithTypefaceNameSizeAndStyle( 289 void PlatformFontPango::InitWithTypefaceNameSizeAndStyle(
290 SkTypeface* typeface, 290 const skia::RefPtr<SkTypeface>& typeface,
291 const std::string& font_family, 291 const std::string& font_family,
292 int font_size, 292 int font_size,
293 int style) { 293 int style) {
294 typeface_helper_.reset(new SkAutoUnref(typeface));
295 typeface_ = typeface; 294 typeface_ = typeface;
296 typeface_->ref();
297 font_family_ = font_family; 295 font_family_ = font_family;
298 font_size_pixels_ = font_size; 296 font_size_pixels_ = font_size;
299 style_ = style; 297 style_ = style;
300 pango_metrics_inited_ = false; 298 pango_metrics_inited_ = false;
301 average_width_pixels_ = 0.0f; 299 average_width_pixels_ = 0.0f;
302 underline_position_pixels_ = 0.0f; 300 underline_position_pixels_ = 0.0f;
303 underline_thickness_pixels_ = 0.0f; 301 underline_thickness_pixels_ = 0.0f;
304 302
305 SkPaint paint; 303 SkPaint paint;
306 SkPaint::FontMetrics metrics; 304 SkPaint::FontMetrics metrics;
307 PaintSetup(&paint); 305 PaintSetup(&paint);
308 paint.getFontMetrics(&metrics); 306 paint.getFontMetrics(&metrics);
309 307
310 ascent_pixels_ = SkScalarCeil(-metrics.fAscent); 308 ascent_pixels_ = SkScalarCeil(-metrics.fAscent);
311 height_pixels_ = ascent_pixels_ + SkScalarCeil(metrics.fDescent); 309 height_pixels_ = ascent_pixels_ + SkScalarCeil(metrics.fDescent);
312 } 310 }
313 311
314 void PlatformFontPango::InitFromPlatformFont(const PlatformFontPango* other) { 312 void PlatformFontPango::InitFromPlatformFont(const PlatformFontPango* other) {
315 typeface_helper_.reset(new SkAutoUnref(other->typeface_));
316 typeface_ = other->typeface_; 313 typeface_ = other->typeface_;
317 typeface_->ref();
318 font_family_ = other->font_family_; 314 font_family_ = other->font_family_;
319 font_size_pixels_ = other->font_size_pixels_; 315 font_size_pixels_ = other->font_size_pixels_;
320 style_ = other->style_; 316 style_ = other->style_;
321 height_pixels_ = other->height_pixels_; 317 height_pixels_ = other->height_pixels_;
322 ascent_pixels_ = other->ascent_pixels_; 318 ascent_pixels_ = other->ascent_pixels_;
323 pango_metrics_inited_ = other->pango_metrics_inited_; 319 pango_metrics_inited_ = other->pango_metrics_inited_;
324 average_width_pixels_ = other->average_width_pixels_; 320 average_width_pixels_ = other->average_width_pixels_;
325 underline_position_pixels_ = other->underline_position_pixels_; 321 underline_position_pixels_ = other->underline_position_pixels_;
326 underline_thickness_pixels_ = other->underline_thickness_pixels_; 322 underline_thickness_pixels_ = other->underline_thickness_pixels_;
327 } 323 }
328 324
329 void PlatformFontPango::PaintSetup(SkPaint* paint) const { 325 void PlatformFontPango::PaintSetup(SkPaint* paint) const {
330 paint->setAntiAlias(false); 326 paint->setAntiAlias(false);
331 paint->setSubpixelText(false); 327 paint->setSubpixelText(false);
332 paint->setTextSize(font_size_pixels_); 328 paint->setTextSize(font_size_pixels_);
333 paint->setTypeface(typeface_); 329 paint->setTypeface(typeface_.get());
334 paint->setFakeBoldText((gfx::Font::BOLD & style_) && !typeface_->isBold()); 330 paint->setFakeBoldText((gfx::Font::BOLD & style_) && !typeface_->isBold());
335 paint->setTextSkewX((gfx::Font::ITALIC & style_) && !typeface_->isItalic() ? 331 paint->setTextSkewX((gfx::Font::ITALIC & style_) && !typeface_->isItalic() ?
336 -SK_Scalar1/4 : 0); 332 -SK_Scalar1/4 : 0);
337 } 333 }
338 334
339 void PlatformFontPango::InitPangoMetrics() { 335 void PlatformFontPango::InitPangoMetrics() {
340 if (!pango_metrics_inited_) { 336 if (!pango_metrics_inited_) {
341 pango_metrics_inited_ = true; 337 pango_metrics_inited_ = true;
342 ScopedPangoFontDescription pango_desc(GetNativeFont()); 338 ScopedPangoFontDescription pango_desc(GetNativeFont());
343 PangoFontMetrics* pango_metrics = GetPangoFontMetrics(pango_desc.get()); 339 PangoFontMetrics* pango_metrics = GetPangoFontMetrics(pango_desc.get());
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
388 return new PlatformFontPango(native_font); 384 return new PlatformFontPango(native_font);
389 } 385 }
390 386
391 // static 387 // static
392 PlatformFont* PlatformFont::CreateFromNameAndSize(const std::string& font_name, 388 PlatformFont* PlatformFont::CreateFromNameAndSize(const std::string& font_name,
393 int font_size) { 389 int font_size) {
394 return new PlatformFontPango(font_name, font_size); 390 return new PlatformFontPango(font_name, font_size);
395 } 391 }
396 392
397 } // namespace gfx 393 } // namespace gfx
OLDNEW
« no previous file with comments | « ui/gfx/platform_font_pango.h ('k') | ui/gfx/render_text.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698