Index: ui/gfx/font_render_params_linux.cc |
diff --git a/ui/gfx/font_render_params_linux.cc b/ui/gfx/font_render_params_linux.cc |
deleted file mode 100644 |
index f52872142c5494e5b5bb54542f9f6a08db01d62d..0000000000000000000000000000000000000000 |
--- a/ui/gfx/font_render_params_linux.cc |
+++ /dev/null |
@@ -1,256 +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/font_render_params.h" |
- |
-#include <fontconfig/fontconfig.h> |
- |
-#include "base/command_line.h" |
-#include "base/containers/mru_cache.h" |
-#include "base/hash.h" |
-#include "base/lazy_instance.h" |
-#include "base/logging.h" |
-#include "base/macros.h" |
-#include "base/strings/string_util.h" |
-#include "base/strings/stringprintf.h" |
-#include "base/synchronization/lock.h" |
-#include "ui/gfx/font.h" |
-#include "ui/gfx/linux_font_delegate.h" |
-#include "ui/gfx/switches.h" |
- |
-namespace gfx { |
- |
-namespace { |
- |
-#if defined(OS_CHROMEOS) |
-// A device scale factor for an internal display (if any) |
-// that is used to determine if subpixel positioning should be used. |
-float device_scale_factor_for_internal_display = 1.0f; |
-#endif |
- |
-// Number of recent GetFontRenderParams() results to cache. |
-const size_t kCacheSize = 20; |
- |
-// Cached result from a call to GetFontRenderParams(). |
-struct QueryResult { |
- QueryResult(const FontRenderParams& params, const std::string& family) |
- : params(params), |
- family(family) { |
- } |
- ~QueryResult() {} |
- |
- FontRenderParams params; |
- std::string family; |
-}; |
- |
-// Keyed by hashes of FontRenderParamQuery structs from |
-// HashFontRenderParamsQuery(). |
-typedef base::MRUCache<uint32, QueryResult> Cache; |
- |
-// A cache and the lock that must be held while accessing it. |
-// GetFontRenderParams() is called by both the UI thread and the sandbox IPC |
-// thread. |
-struct SynchronizedCache { |
- SynchronizedCache() : cache(kCacheSize) {} |
- |
- base::Lock lock; |
- Cache cache; |
-}; |
- |
-base::LazyInstance<SynchronizedCache>::Leaky g_synchronized_cache = |
- LAZY_INSTANCE_INITIALIZER; |
- |
-bool IsBrowserTextSubpixelPositioningEnabled() { |
-#if defined(OS_CHROMEOS) |
- return device_scale_factor_for_internal_display > 1.0f; |
-#else |
- return false; |
-#endif |
-} |
- |
-// Converts Fontconfig FC_HINT_STYLE to FontRenderParams::Hinting. |
-FontRenderParams::Hinting ConvertFontconfigHintStyle(int hint_style) { |
- switch (hint_style) { |
- case FC_HINT_SLIGHT: return FontRenderParams::HINTING_SLIGHT; |
- case FC_HINT_MEDIUM: return FontRenderParams::HINTING_MEDIUM; |
- case FC_HINT_FULL: return FontRenderParams::HINTING_FULL; |
- default: return FontRenderParams::HINTING_NONE; |
- } |
-} |
- |
-// Converts Fontconfig FC_RGBA to FontRenderParams::SubpixelRendering. |
-FontRenderParams::SubpixelRendering ConvertFontconfigRgba(int rgba) { |
- switch (rgba) { |
- case FC_RGBA_RGB: return FontRenderParams::SUBPIXEL_RENDERING_RGB; |
- case FC_RGBA_BGR: return FontRenderParams::SUBPIXEL_RENDERING_BGR; |
- case FC_RGBA_VRGB: return FontRenderParams::SUBPIXEL_RENDERING_VRGB; |
- case FC_RGBA_VBGR: return FontRenderParams::SUBPIXEL_RENDERING_VBGR; |
- default: return FontRenderParams::SUBPIXEL_RENDERING_NONE; |
- } |
-} |
- |
-// Queries Fontconfig for rendering settings and updates |params_out| and |
-// |family_out| (if non-NULL). Returns false on failure. |
-bool QueryFontconfig(const FontRenderParamsQuery& query, |
- FontRenderParams* params_out, |
- std::string* family_out) { |
- FcPattern* pattern = FcPatternCreate(); |
- CHECK(pattern); |
- |
- FcPatternAddBool(pattern, FC_SCALABLE, FcTrue); |
- |
- for (std::vector<std::string>::const_iterator it = query.families.begin(); |
- it != query.families.end(); ++it) { |
- FcPatternAddString( |
- pattern, FC_FAMILY, reinterpret_cast<const FcChar8*>(it->c_str())); |
- } |
- if (query.pixel_size > 0) |
- FcPatternAddDouble(pattern, FC_PIXEL_SIZE, query.pixel_size); |
- if (query.point_size > 0) |
- FcPatternAddInteger(pattern, FC_SIZE, query.point_size); |
- if (query.style >= 0) { |
- FcPatternAddInteger(pattern, FC_SLANT, |
- (query.style & Font::ITALIC) ? FC_SLANT_ITALIC : FC_SLANT_ROMAN); |
- FcPatternAddInteger(pattern, FC_WEIGHT, |
- (query.style & Font::BOLD) ? FC_WEIGHT_BOLD : FC_WEIGHT_NORMAL); |
- } |
- |
- FcConfigSubstitute(NULL, pattern, FcMatchPattern); |
- FcDefaultSubstitute(pattern); |
- FcResult result; |
- FcPattern* match = FcFontMatch(NULL, pattern, &result); |
- FcPatternDestroy(pattern); |
- if (!match) |
- return false; |
- |
- if (family_out) { |
- FcChar8* family = NULL; |
- FcPatternGetString(match, FC_FAMILY, 0, &family); |
- if (family) |
- family_out->assign(reinterpret_cast<const char*>(family)); |
- } |
- |
- if (params_out) { |
- FcBool fc_antialias = 0; |
- if (FcPatternGetBool(match, FC_ANTIALIAS, 0, &fc_antialias) == |
- FcResultMatch) { |
- params_out->antialiasing = fc_antialias; |
- } |
- |
- FcBool fc_autohint = 0; |
- if (FcPatternGetBool(match, FC_AUTOHINT, 0, &fc_autohint) == |
- FcResultMatch) { |
- params_out->autohinter = fc_autohint; |
- } |
- |
- FcBool fc_bitmap = 0; |
- if (FcPatternGetBool(match, FC_EMBEDDED_BITMAP, 0, &fc_bitmap) == |
- FcResultMatch) { |
- params_out->use_bitmaps = fc_bitmap; |
- } |
- |
- FcBool fc_hinting = 0; |
- if (FcPatternGetBool(match, FC_HINTING, 0, &fc_hinting) == FcResultMatch) { |
- int fc_hint_style = FC_HINT_NONE; |
- if (fc_hinting) |
- FcPatternGetInteger(match, FC_HINT_STYLE, 0, &fc_hint_style); |
- params_out->hinting = ConvertFontconfigHintStyle(fc_hint_style); |
- } |
- |
- int fc_rgba = FC_RGBA_NONE; |
- if (FcPatternGetInteger(match, FC_RGBA, 0, &fc_rgba) == FcResultMatch) |
- params_out->subpixel_rendering = ConvertFontconfigRgba(fc_rgba); |
- } |
- |
- FcPatternDestroy(match); |
- return true; |
-} |
- |
-// Serialize |query| into a string and hash it to a value suitable for use as a |
-// cache key. |
-uint32 HashFontRenderParamsQuery(const FontRenderParamsQuery& query) { |
- return base::Hash(base::StringPrintf("%d|%d|%d|%d|%s", |
- query.for_web_contents, query.pixel_size, query.point_size, query.style, |
- JoinString(query.families, ',').c_str())); |
-} |
- |
-} // namespace |
- |
-FontRenderParams GetFontRenderParams(const FontRenderParamsQuery& query, |
- std::string* family_out) { |
- const uint32 hash = HashFontRenderParamsQuery(query); |
- SynchronizedCache* synchronized_cache = g_synchronized_cache.Pointer(); |
- |
- { |
- // Try to find a cached result so Fontconfig doesn't need to be queried. |
- base::AutoLock lock(synchronized_cache->lock); |
- Cache::const_iterator it = synchronized_cache->cache.Get(hash); |
- if (it != synchronized_cache->cache.end()) { |
- DVLOG(1) << "Returning cached params for " << hash; |
- const QueryResult& result = it->second; |
- if (family_out) |
- *family_out = result.family; |
- return result.params; |
- } |
- } |
- |
- DVLOG(1) << "Computing params for " << hash; |
- if (family_out) |
- family_out->clear(); |
- |
- // Start with the delegate's settings, but let Fontconfig have the final say. |
- FontRenderParams params; |
- const LinuxFontDelegate* delegate = LinuxFontDelegate::instance(); |
- if (delegate) |
- params = delegate->GetDefaultFontRenderParams(); |
- QueryFontconfig(query, ¶ms, family_out); |
- if (!params.antialiasing) { |
- // Cairo forces full hinting when antialiasing is disabled, since anything |
- // less than that looks awful; do the same here. Requesting subpixel |
- // rendering or positioning doesn't make sense either. |
- params.hinting = FontRenderParams::HINTING_FULL; |
- params.subpixel_rendering = FontRenderParams::SUBPIXEL_RENDERING_NONE; |
- params.subpixel_positioning = false; |
- } else { |
- // Fontconfig doesn't support configuring subpixel positioning; check a |
- // flag. |
- params.subpixel_positioning = |
- query.for_web_contents ? |
- base::CommandLine::ForCurrentProcess()->HasSwitch( |
- switches::kEnableWebkitTextSubpixelPositioning) : |
- IsBrowserTextSubpixelPositioningEnabled(); |
- |
- // To enable subpixel positioning, we need to disable hinting. |
- if (params.subpixel_positioning) |
- params.hinting = FontRenderParams::HINTING_NONE; |
- } |
- |
- // Use the first family from the list if Fontconfig didn't suggest a family. |
- if (family_out && family_out->empty() && !query.families.empty()) |
- *family_out = query.families[0]; |
- |
- { |
- // Store the result. It's fine if this overwrites a result that was cached |
- // by a different thread in the meantime; the values should be identical. |
- base::AutoLock lock(synchronized_cache->lock); |
- synchronized_cache->cache.Put(hash, |
- QueryResult(params, family_out ? *family_out : std::string())); |
- } |
- |
- return params; |
-} |
- |
-void ClearFontRenderParamsCacheForTest() { |
- SynchronizedCache* synchronized_cache = g_synchronized_cache.Pointer(); |
- base::AutoLock lock(synchronized_cache->lock); |
- synchronized_cache->cache.Clear(); |
-} |
- |
-#if defined(OS_CHROMEOS) |
-void SetFontRenderParamsDeviceScaleFactor(float device_scale_factor) { |
- device_scale_factor_for_internal_display = device_scale_factor; |
-} |
-#endif |
- |
-} // namespace gfx |