// 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_linux.h" #include "base/command_line.h" #include "base/logging.h" #include "ui/gfx/display.h" #include "ui/gfx/switches.h" #include #if defined(OS_LINUX) && defined(USE_AURA) && !defined(OS_CHROMEOS) #include "ui/gfx/linux_font_delegate.h" #endif namespace gfx { namespace { bool SubpixelPositioningRequested(bool renderer) { const CommandLine* cl = CommandLine::ForCurrentProcess(); if (renderer) { // Text rendered by Blink in high-DPI mode is poorly-hinted unless subpixel // positioning is used (as opposed to each glyph being individually snapped // to the pixel grid). return cl->HasSwitch(switches::kEnableWebkitTextSubpixelPositioning) || (Display::HasForceDeviceScaleFactor() && Display::GetForcedDeviceScaleFactor() != 1.0); } return cl->HasSwitch(switches::kEnableBrowserTextSubpixelPositioning); } // Initializes |params| with the system's default settings. |renderer| is true // when setting WebKit renderer defaults. void LoadDefaults(FontRenderParams* params, bool renderer) { // For non-GTK builds (read: Aura), just use reasonable hardcoded values. params->antialiasing = true; params->autohinter = true; params->use_bitmaps = true; params->hinting = FontRenderParams::HINTING_SLIGHT; // Fetch default subpixel rendering settings from FontConfig. FcPattern* pattern = FcPatternCreate(); FcConfigSubstitute(NULL, pattern, FcMatchPattern); FcDefaultSubstitute(pattern); FcResult result; FcPattern* match = FcFontMatch(0, pattern, &result); DCHECK(match); int fc_rgba = FC_RGBA_RGB; FcPatternGetInteger(match, FC_RGBA, 0, &fc_rgba); FcPatternDestroy(pattern); FcPatternDestroy(match); switch (fc_rgba) { case FC_RGBA_RGB: params->subpixel_rendering = FontRenderParams::SUBPIXEL_RENDERING_RGB; break; case FC_RGBA_BGR: params->subpixel_rendering = FontRenderParams::SUBPIXEL_RENDERING_BGR; break; case FC_RGBA_VRGB: params->subpixel_rendering = FontRenderParams::SUBPIXEL_RENDERING_VRGB; break; case FC_RGBA_VBGR: params->subpixel_rendering = FontRenderParams::SUBPIXEL_RENDERING_VBGR; break; default: params->subpixel_rendering = FontRenderParams::SUBPIXEL_RENDERING_NONE; } #if defined(OS_LINUX) && defined(USE_AURA) && !defined(OS_CHROMEOS) const LinuxFontDelegate* delegate = LinuxFontDelegate::instance(); if (delegate) { params->antialiasing = delegate->UseAntialiasing(); params->hinting = delegate->GetHintingStyle(); params->subpixel_rendering = delegate->GetSubpixelRenderingStyle(); } #endif params->subpixel_positioning = SubpixelPositioningRequested(renderer); // To enable subpixel positioning, we need to disable hinting. if (params->subpixel_positioning) params->hinting = FontRenderParams::HINTING_NONE; } } // namespace const FontRenderParams& GetDefaultFontRenderParams() { static bool loaded_defaults = false; static FontRenderParams default_params; if (!loaded_defaults) LoadDefaults(&default_params, /* renderer */ false); loaded_defaults = true; return default_params; } const FontRenderParams& GetDefaultWebKitFontRenderParams() { static bool loaded_defaults = false; static FontRenderParams default_params; if (!loaded_defaults) LoadDefaults(&default_params, /* renderer */ true); loaded_defaults = true; return default_params; } bool GetDefaultWebkitSubpixelPositioning() { return SubpixelPositioningRequested(true); } } // namespace gfx