| Index: ui/gfx/platform_font_pango.cc
|
| diff --git a/ui/gfx/platform_font_pango.cc b/ui/gfx/platform_font_pango.cc
|
| deleted file mode 100644
|
| index 1cac87ad29d65667f814720bc5890a7d3812898b..0000000000000000000000000000000000000000
|
| --- a/ui/gfx/platform_font_pango.cc
|
| +++ /dev/null
|
| @@ -1,346 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "ui/gfx/platform_font_pango.h"
|
| -
|
| -#include <pango/pango.h>
|
| -
|
| -#include <algorithm>
|
| -#include <string>
|
| -
|
| -#include "base/logging.h"
|
| -#include "base/strings/string_piece.h"
|
| -#include "base/strings/string_split.h"
|
| -#include "base/strings/utf_string_conversions.h"
|
| -#include "third_party/skia/include/core/SkPaint.h"
|
| -#include "third_party/skia/include/core/SkString.h"
|
| -#include "third_party/skia/include/core/SkTypeface.h"
|
| -#include "ui/gfx/canvas.h"
|
| -#include "ui/gfx/font.h"
|
| -#include "ui/gfx/font_list.h"
|
| -#include "ui/gfx/linux_font_delegate.h"
|
| -#include "ui/gfx/pango_util.h"
|
| -#include "ui/gfx/text_utils.h"
|
| -
|
| -namespace {
|
| -
|
| -// The font family name which is used when a user's application font for
|
| -// GNOME/KDE is a non-scalable one. The name should be listed in the
|
| -// IsFallbackFontAllowed function in skia/ext/SkFontHost_fontconfig_direct.cpp.
|
| -const char* kFallbackFontFamilyName = "sans";
|
| -
|
| -// Creates a SkTypeface for the passed-in Font::FontStyle and family. If a
|
| -// fallback typeface is used instead of the requested family, |family| will be
|
| -// updated to contain the fallback's family name.
|
| -skia::RefPtr<SkTypeface> CreateSkTypeface(int style, std::string* family) {
|
| - DCHECK(family);
|
| -
|
| - int skia_style = SkTypeface::kNormal;
|
| - if (gfx::Font::BOLD & style)
|
| - skia_style |= SkTypeface::kBold;
|
| - if (gfx::Font::ITALIC & style)
|
| - skia_style |= SkTypeface::kItalic;
|
| -
|
| - skia::RefPtr<SkTypeface> typeface = skia::AdoptRef(SkTypeface::CreateFromName(
|
| - family->c_str(), static_cast<SkTypeface::Style>(skia_style)));
|
| - if (!typeface) {
|
| - // A non-scalable font such as .pcf is specified. Fall back to a default
|
| - // scalable font.
|
| - typeface = skia::AdoptRef(SkTypeface::CreateFromName(
|
| - kFallbackFontFamilyName, static_cast<SkTypeface::Style>(skia_style)));
|
| - CHECK(typeface) << "Could not find any font: " << family << ", "
|
| - << kFallbackFontFamilyName;
|
| - *family = kFallbackFontFamilyName;
|
| - }
|
| - return typeface;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -namespace gfx {
|
| -
|
| -// static
|
| -Font* PlatformFontPango::default_font_ = NULL;
|
| -
|
| -#if defined(OS_CHROMEOS)
|
| -// static
|
| -std::string* PlatformFontPango::default_font_description_ = NULL;
|
| -#endif
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// PlatformFontPango, public:
|
| -
|
| -PlatformFontPango::PlatformFontPango() {
|
| - if (!default_font_) {
|
| - scoped_ptr<ScopedPangoFontDescription> description;
|
| -#if defined(OS_CHROMEOS)
|
| - CHECK(default_font_description_);
|
| - description.reset(
|
| - new ScopedPangoFontDescription(*default_font_description_));
|
| -#else
|
| - const gfx::LinuxFontDelegate* delegate = gfx::LinuxFontDelegate::instance();
|
| - if (delegate)
|
| - description = delegate->GetDefaultPangoFontDescription();
|
| -#endif
|
| - if (!description || !description->get())
|
| - description.reset(new ScopedPangoFontDescription("sans 10"));
|
| - default_font_ = new Font(description->get());
|
| - }
|
| -
|
| - InitFromPlatformFont(
|
| - static_cast<PlatformFontPango*>(default_font_->platform_font()));
|
| -}
|
| -
|
| -PlatformFontPango::PlatformFontPango(NativeFont native_font) {
|
| - FontRenderParamsQuery query(false);
|
| - base::SplitString(pango_font_description_get_family(native_font), ',',
|
| - &query.families);
|
| -
|
| - const int pango_size =
|
| - pango_font_description_get_size(native_font) / PANGO_SCALE;
|
| - if (pango_font_description_get_size_is_absolute(native_font))
|
| - query.pixel_size = pango_size;
|
| - else
|
| - query.point_size = pango_size;
|
| -
|
| - query.style = gfx::Font::NORMAL;
|
| - // TODO(davemoore): Support weights other than bold?
|
| - if (pango_font_description_get_weight(native_font) == PANGO_WEIGHT_BOLD)
|
| - query.style |= gfx::Font::BOLD;
|
| - // TODO(davemoore): What about PANGO_STYLE_OBLIQUE?
|
| - if (pango_font_description_get_style(native_font) == PANGO_STYLE_ITALIC)
|
| - query.style |= gfx::Font::ITALIC;
|
| -
|
| - std::string font_family;
|
| - const FontRenderParams params = gfx::GetFontRenderParams(query, &font_family);
|
| - InitFromDetails(skia::RefPtr<SkTypeface>(), font_family,
|
| - gfx::GetPangoFontSizeInPixels(native_font),
|
| - query.style, params);
|
| -}
|
| -
|
| -PlatformFontPango::PlatformFontPango(const std::string& font_name,
|
| - int font_size_pixels) {
|
| - FontRenderParamsQuery query(false);
|
| - query.families.push_back(font_name);
|
| - query.pixel_size = font_size_pixels;
|
| - query.style = gfx::Font::NORMAL;
|
| - InitFromDetails(skia::RefPtr<SkTypeface>(), font_name, font_size_pixels,
|
| - query.style, gfx::GetFontRenderParams(query, NULL));
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// PlatformFontPango, PlatformFont implementation:
|
| -
|
| -// static
|
| -void PlatformFontPango::ReloadDefaultFont() {
|
| - delete default_font_;
|
| - default_font_ = NULL;
|
| -}
|
| -
|
| -#if defined(OS_CHROMEOS)
|
| -// static
|
| -void PlatformFontPango::SetDefaultFontDescription(
|
| - const std::string& font_description) {
|
| - delete default_font_description_;
|
| - default_font_description_ = new std::string(font_description);
|
| -}
|
| -
|
| -#endif
|
| -
|
| -Font PlatformFontPango::DeriveFont(int size_delta, int style) const {
|
| - const int new_size = font_size_pixels_ + size_delta;
|
| - DCHECK_GT(new_size, 0);
|
| -
|
| - // If the style changed, we may need to load a new face.
|
| - std::string new_family = font_family_;
|
| - skia::RefPtr<SkTypeface> typeface =
|
| - (style == style_) ? typeface_ : CreateSkTypeface(style, &new_family);
|
| -
|
| - FontRenderParamsQuery query(false);
|
| - query.families.push_back(new_family);
|
| - query.pixel_size = new_size;
|
| - query.style = style;
|
| -
|
| - return Font(new PlatformFontPango(typeface, new_family, new_size, style,
|
| - gfx::GetFontRenderParams(query, NULL)));
|
| -}
|
| -
|
| -int PlatformFontPango::GetHeight() const {
|
| - return height_pixels_;
|
| -}
|
| -
|
| -int PlatformFontPango::GetBaseline() const {
|
| - return ascent_pixels_;
|
| -}
|
| -
|
| -int PlatformFontPango::GetCapHeight() const {
|
| - return cap_height_pixels_;
|
| -}
|
| -
|
| -int PlatformFontPango::GetExpectedTextWidth(int length) const {
|
| - double char_width = const_cast<PlatformFontPango*>(this)->GetAverageWidth();
|
| - return round(static_cast<float>(length) * char_width);
|
| -}
|
| -
|
| -int PlatformFontPango::GetStyle() const {
|
| - return style_;
|
| -}
|
| -
|
| -std::string PlatformFontPango::GetFontName() const {
|
| - return font_family_;
|
| -}
|
| -
|
| -std::string PlatformFontPango::GetActualFontNameForTesting() const {
|
| - SkString family_name;
|
| - typeface_->getFamilyName(&family_name);
|
| - return family_name.c_str();
|
| -}
|
| -
|
| -int PlatformFontPango::GetFontSize() const {
|
| - return font_size_pixels_;
|
| -}
|
| -
|
| -const FontRenderParams& PlatformFontPango::GetFontRenderParams() const {
|
| - return font_render_params_;
|
| -}
|
| -
|
| -NativeFont PlatformFontPango::GetNativeFont() const {
|
| - PangoFontDescription* pfd = pango_font_description_new();
|
| - pango_font_description_set_family(pfd, GetFontName().c_str());
|
| - // Set the absolute size to avoid overflowing UI elements.
|
| - // pango_font_description_set_absolute_size() takes a size in Pango units.
|
| - // There are PANGO_SCALE Pango units in one device unit. Screen output
|
| - // devices use pixels as their device units.
|
| - pango_font_description_set_absolute_size(
|
| - pfd, font_size_pixels_ * PANGO_SCALE);
|
| -
|
| - switch (GetStyle()) {
|
| - case gfx::Font::NORMAL:
|
| - // Nothing to do, should already be PANGO_STYLE_NORMAL.
|
| - break;
|
| - case gfx::Font::BOLD:
|
| - pango_font_description_set_weight(pfd, PANGO_WEIGHT_BOLD);
|
| - break;
|
| - case gfx::Font::ITALIC:
|
| - pango_font_description_set_style(pfd, PANGO_STYLE_ITALIC);
|
| - break;
|
| - case gfx::Font::UNDERLINE:
|
| - // TODO(deanm): How to do underline? Where do we use it? Probably have
|
| - // to paint it ourselves, see pango_font_metrics_get_underline_position.
|
| - break;
|
| - }
|
| -
|
| - return pfd;
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// PlatformFontPango, private:
|
| -
|
| -PlatformFontPango::PlatformFontPango(const skia::RefPtr<SkTypeface>& typeface,
|
| - const std::string& name,
|
| - int size_pixels,
|
| - int style,
|
| - const FontRenderParams& render_params) {
|
| - InitFromDetails(typeface, name, size_pixels, style, render_params);
|
| -}
|
| -
|
| -PlatformFontPango::~PlatformFontPango() {}
|
| -
|
| -void PlatformFontPango::InitFromDetails(
|
| - const skia::RefPtr<SkTypeface>& typeface,
|
| - const std::string& font_family,
|
| - int font_size_pixels,
|
| - int style,
|
| - const FontRenderParams& render_params) {
|
| - DCHECK_GT(font_size_pixels, 0);
|
| -
|
| - font_family_ = font_family;
|
| - typeface_ = typeface ? typeface : CreateSkTypeface(style, &font_family_);
|
| -
|
| - font_size_pixels_ = font_size_pixels;
|
| - style_ = style;
|
| - font_render_params_ = render_params;
|
| -
|
| - SkPaint paint;
|
| - SkPaint::FontMetrics metrics;
|
| - PaintSetup(&paint);
|
| - paint.getFontMetrics(&metrics);
|
| - ascent_pixels_ = SkScalarCeilToInt(-metrics.fAscent);
|
| - height_pixels_ = ascent_pixels_ + SkScalarCeilToInt(metrics.fDescent);
|
| - cap_height_pixels_ = SkScalarCeilToInt(metrics.fCapHeight);
|
| -
|
| - pango_metrics_inited_ = false;
|
| - average_width_pixels_ = 0.0f;
|
| -}
|
| -
|
| -void PlatformFontPango::InitFromPlatformFont(const PlatformFontPango* other) {
|
| - typeface_ = other->typeface_;
|
| - font_family_ = other->font_family_;
|
| - font_size_pixels_ = other->font_size_pixels_;
|
| - style_ = other->style_;
|
| - font_render_params_ = other->font_render_params_;
|
| - ascent_pixels_ = other->ascent_pixels_;
|
| - height_pixels_ = other->height_pixels_;
|
| - cap_height_pixels_ = other->cap_height_pixels_;
|
| - pango_metrics_inited_ = other->pango_metrics_inited_;
|
| - average_width_pixels_ = other->average_width_pixels_;
|
| -}
|
| -
|
| -void PlatformFontPango::PaintSetup(SkPaint* paint) const {
|
| - paint->setAntiAlias(false);
|
| - paint->setSubpixelText(false);
|
| - paint->setTextSize(font_size_pixels_);
|
| - paint->setTypeface(typeface_.get());
|
| - paint->setFakeBoldText((gfx::Font::BOLD & style_) && !typeface_->isBold());
|
| - paint->setTextSkewX((gfx::Font::ITALIC & style_) && !typeface_->isItalic() ?
|
| - -SK_Scalar1/4 : 0);
|
| -}
|
| -
|
| -void PlatformFontPango::InitPangoMetrics() {
|
| - if (!pango_metrics_inited_) {
|
| - pango_metrics_inited_ = true;
|
| - ScopedPangoFontDescription pango_desc(GetNativeFont());
|
| - PangoFontMetrics* pango_metrics = GetPangoFontMetrics(pango_desc.get());
|
| -
|
| - // First get the Pango-based width (converting from Pango units to pixels).
|
| - const double pango_width_pixels =
|
| - pango_font_metrics_get_approximate_char_width(pango_metrics) /
|
| - PANGO_SCALE;
|
| -
|
| - // Yes, this is how Microsoft recommends calculating the dialog unit
|
| - // conversions.
|
| - const int text_width_pixels = GetStringWidth(
|
| - base::ASCIIToUTF16(
|
| - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"),
|
| - FontList(Font(this)));
|
| - const double dialog_units_pixels = (text_width_pixels / 26 + 1) / 2;
|
| - average_width_pixels_ = std::min(pango_width_pixels, dialog_units_pixels);
|
| - }
|
| -}
|
| -
|
| -double PlatformFontPango::GetAverageWidth() const {
|
| - const_cast<PlatformFontPango*>(this)->InitPangoMetrics();
|
| - return average_width_pixels_;
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// PlatformFont, public:
|
| -
|
| -// static
|
| -PlatformFont* PlatformFont::CreateDefault() {
|
| - return new PlatformFontPango;
|
| -}
|
| -
|
| -// static
|
| -PlatformFont* PlatformFont::CreateFromNativeFont(NativeFont native_font) {
|
| - return new PlatformFontPango(native_font);
|
| -}
|
| -
|
| -// static
|
| -PlatformFont* PlatformFont::CreateFromNameAndSize(const std::string& font_name,
|
| - int font_size) {
|
| - return new PlatformFontPango(font_name, font_size);
|
| -}
|
| -
|
| -} // namespace gfx
|
|
|