| OLD | NEW |
| 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/font_render_params.h" | 5 #include "ui/gfx/font_render_params.h" |
| 6 | 6 |
| 7 #include <fontconfig/fontconfig.h> | 7 #include <fontconfig/fontconfig.h> |
| 8 | 8 |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/containers/mru_cache.h" | 10 #include "base/containers/mru_cache.h" |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 54 struct SynchronizedCache { | 54 struct SynchronizedCache { |
| 55 SynchronizedCache() : cache(kCacheSize) {} | 55 SynchronizedCache() : cache(kCacheSize) {} |
| 56 | 56 |
| 57 base::Lock lock; | 57 base::Lock lock; |
| 58 Cache cache; | 58 Cache cache; |
| 59 }; | 59 }; |
| 60 | 60 |
| 61 base::LazyInstance<SynchronizedCache>::Leaky g_synchronized_cache = | 61 base::LazyInstance<SynchronizedCache>::Leaky g_synchronized_cache = |
| 62 LAZY_INSTANCE_INITIALIZER; | 62 LAZY_INSTANCE_INITIALIZER; |
| 63 | 63 |
| 64 bool IsBrowserTextSubpixelPositioningEnabled() { | |
| 65 #if defined(OS_CHROMEOS) | |
| 66 return device_scale_factor_for_internal_display > 1.0f; | |
| 67 #else | |
| 68 return false; | |
| 69 #endif | |
| 70 } | |
| 71 | |
| 72 // Converts Fontconfig FC_HINT_STYLE to FontRenderParams::Hinting. | 64 // Converts Fontconfig FC_HINT_STYLE to FontRenderParams::Hinting. |
| 73 FontRenderParams::Hinting ConvertFontconfigHintStyle(int hint_style) { | 65 FontRenderParams::Hinting ConvertFontconfigHintStyle(int hint_style) { |
| 74 switch (hint_style) { | 66 switch (hint_style) { |
| 75 case FC_HINT_SLIGHT: return FontRenderParams::HINTING_SLIGHT; | 67 case FC_HINT_SLIGHT: return FontRenderParams::HINTING_SLIGHT; |
| 76 case FC_HINT_MEDIUM: return FontRenderParams::HINTING_MEDIUM; | 68 case FC_HINT_MEDIUM: return FontRenderParams::HINTING_MEDIUM; |
| 77 case FC_HINT_FULL: return FontRenderParams::HINTING_FULL; | 69 case FC_HINT_FULL: return FontRenderParams::HINTING_FULL; |
| 78 default: return FontRenderParams::HINTING_NONE; | 70 default: return FontRenderParams::HINTING_NONE; |
| 79 } | 71 } |
| 80 } | 72 } |
| 81 | 73 |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 179 // Serialize |query| into a string and hash it to a value suitable for use as a | 171 // Serialize |query| into a string and hash it to a value suitable for use as a |
| 180 // cache key. | 172 // cache key. |
| 181 uint32 HashFontRenderParamsQuery(const FontRenderParamsQuery& query) { | 173 uint32 HashFontRenderParamsQuery(const FontRenderParamsQuery& query) { |
| 182 return base::Hash(base::StringPrintf("%d|%d|%d|%d|%s", | 174 return base::Hash(base::StringPrintf("%d|%d|%d|%d|%s", |
| 183 query.for_web_contents, query.pixel_size, query.point_size, query.style, | 175 query.for_web_contents, query.pixel_size, query.point_size, query.style, |
| 184 JoinString(query.families, ',').c_str())); | 176 JoinString(query.families, ',').c_str())); |
| 185 } | 177 } |
| 186 | 178 |
| 187 } // namespace | 179 } // namespace |
| 188 | 180 |
| 189 FontRenderParams GetFontRenderParams(const FontRenderParamsQuery& query, | 181 FontRenderParams GetSystemFontRenderParams(const FontRenderParamsQuery& query, |
| 190 std::string* family_out) { | 182 std::string* family_out) { |
| 191 const uint32 hash = HashFontRenderParamsQuery(query); | 183 const uint32 hash = HashFontRenderParamsQuery(query); |
| 192 SynchronizedCache* synchronized_cache = g_synchronized_cache.Pointer(); | 184 SynchronizedCache* synchronized_cache = g_synchronized_cache.Pointer(); |
| 193 | 185 |
| 194 { | 186 { |
| 195 // Try to find a cached result so Fontconfig doesn't need to be queried. | 187 // Try to find a cached result so Fontconfig doesn't need to be queried. |
| 196 base::AutoLock lock(synchronized_cache->lock); | 188 base::AutoLock lock(synchronized_cache->lock); |
| 197 Cache::const_iterator it = synchronized_cache->cache.Get(hash); | 189 Cache::const_iterator it = synchronized_cache->cache.Get(hash); |
| 198 if (it != synchronized_cache->cache.end()) { | 190 if (it != synchronized_cache->cache.end()) { |
| 199 DVLOG(1) << "Returning cached params for " << hash; | 191 DVLOG(1) << "Returning cached params for " << hash; |
| 200 const QueryResult& result = it->second; | 192 const QueryResult& result = it->second; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 213 const LinuxFontDelegate* delegate = LinuxFontDelegate::instance(); | 205 const LinuxFontDelegate* delegate = LinuxFontDelegate::instance(); |
| 214 if (delegate) | 206 if (delegate) |
| 215 params = delegate->GetDefaultFontRenderParams(); | 207 params = delegate->GetDefaultFontRenderParams(); |
| 216 QueryFontconfig(query, ¶ms, family_out); | 208 QueryFontconfig(query, ¶ms, family_out); |
| 217 if (!params.antialiasing) { | 209 if (!params.antialiasing) { |
| 218 // Cairo forces full hinting when antialiasing is disabled, since anything | 210 // Cairo forces full hinting when antialiasing is disabled, since anything |
| 219 // less than that looks awful; do the same here. Requesting subpixel | 211 // less than that looks awful; do the same here. Requesting subpixel |
| 220 // rendering or positioning doesn't make sense either. | 212 // rendering or positioning doesn't make sense either. |
| 221 params.hinting = FontRenderParams::HINTING_FULL; | 213 params.hinting = FontRenderParams::HINTING_FULL; |
| 222 params.subpixel_rendering = FontRenderParams::SUBPIXEL_RENDERING_NONE; | 214 params.subpixel_rendering = FontRenderParams::SUBPIXEL_RENDERING_NONE; |
| 223 params.subpixel_positioning = false; | |
| 224 } else { | |
| 225 // Fontconfig doesn't support configuring subpixel positioning; check a | |
| 226 // flag. | |
| 227 params.subpixel_positioning = | |
| 228 query.for_web_contents ? | |
| 229 CommandLine::ForCurrentProcess()->HasSwitch( | |
| 230 switches::kEnableWebkitTextSubpixelPositioning) : | |
| 231 IsBrowserTextSubpixelPositioningEnabled(); | |
| 232 | |
| 233 // To enable subpixel positioning, we need to disable hinting. | |
| 234 if (params.subpixel_positioning) | |
| 235 params.hinting = FontRenderParams::HINTING_NONE; | |
| 236 } | 215 } |
| 216 params.subpixel_positioning = false; |
| 237 | 217 |
| 238 // Use the first family from the list if Fontconfig didn't suggest a family. | 218 // Use the first family from the list if Fontconfig didn't suggest a family. |
| 239 if (family_out && family_out->empty() && !query.families.empty()) | 219 if (family_out && family_out->empty() && !query.families.empty()) |
| 240 *family_out = query.families[0]; | 220 *family_out = query.families[0]; |
| 241 | 221 |
| 242 { | 222 { |
| 243 // Store the result. It's fine if this overwrites a result that was cached | 223 // Store the result. It's fine if this overwrites a result that was cached |
| 244 // by a different thread in the meantime; the values should be identical. | 224 // by a different thread in the meantime; the values should be identical. |
| 245 base::AutoLock lock(synchronized_cache->lock); | 225 base::AutoLock lock(synchronized_cache->lock); |
| 246 synchronized_cache->cache.Put(hash, | 226 synchronized_cache->cache.Put(hash, |
| 247 QueryResult(params, family_out ? *family_out : std::string())); | 227 QueryResult(params, family_out ? *family_out : std::string())); |
| 248 } | 228 } |
| 249 | 229 |
| 250 return params; | 230 return params; |
| 251 } | 231 } |
| 252 | 232 |
| 253 void ClearFontRenderParamsCacheForTest() { | 233 void ClearFontRenderParamsCacheForTest() { |
| 254 SynchronizedCache* synchronized_cache = g_synchronized_cache.Pointer(); | 234 SynchronizedCache* synchronized_cache = g_synchronized_cache.Pointer(); |
| 255 base::AutoLock lock(synchronized_cache->lock); | 235 base::AutoLock lock(synchronized_cache->lock); |
| 256 synchronized_cache->cache.Clear(); | 236 synchronized_cache->cache.Clear(); |
| 257 } | 237 } |
| 258 | 238 |
| 259 #if defined(OS_CHROMEOS) | 239 #if defined(OS_CHROMEOS) |
| 260 void SetFontRenderParamsDeviceScaleFactor(float device_scale_factor) { | 240 void SetFontRenderParamsDeviceScaleFactor(float device_scale_factor) { |
| 261 device_scale_factor_for_internal_display = device_scale_factor; | 241 device_scale_factor_for_internal_display = device_scale_factor; |
| 262 } | 242 } |
| 263 #endif | 243 #endif |
| 264 | 244 |
| 265 } // namespace gfx | 245 } // namespace gfx |
| OLD | NEW |