// 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/switches.h" #if defined(TOOLKIT_GTK) #include <gtk/gtk.h> #else #include <fontconfig/fontconfig.h> #endif namespace gfx { namespace { bool SubpixelPositioningRequested(bool renderer) { return CommandLine::ForCurrentProcess()->HasSwitch( renderer ? switches::kEnableWebkitTextSubpixelPositioning : switches::kEnableBrowserTextSubpixelPositioning); } // Initializes |params| with the system's default settings. |renderer| is true // when setting WebKit renderer defaults. void LoadDefaults(FontRenderParams* params, bool renderer) { #if defined(TOOLKIT_GTK) params->antialiasing = true; // TODO(wangxianzhu): autohinter is now true to keep original behavior // of WebKit, but it might not be the best value. params->autohinter = true; params->use_bitmaps = true; params->hinting = FontRenderParams::HINTING_SLIGHT; params->subpixel_rendering = FontRenderParams::SUBPIXEL_RENDERING_NONE; GtkSettings* gtk_settings = gtk_settings_get_default(); CHECK(gtk_settings); gint gtk_antialias = 0; gint gtk_hinting = 0; gchar* gtk_hint_style = NULL; gchar* gtk_rgba = NULL; g_object_get(gtk_settings, "gtk-xft-antialias", >k_antialias, "gtk-xft-hinting", >k_hinting, "gtk-xft-hintstyle", >k_hint_style, "gtk-xft-rgba", >k_rgba, NULL); // g_object_get() doesn't tell us whether the properties were present or not, // but if they aren't (because gnome-settings-daemon isn't running), we'll get // NULL values for the strings. if (gtk_hint_style && gtk_rgba) { params->antialiasing = gtk_antialias; if (gtk_hinting == 0 || strcmp(gtk_hint_style, "hintnone") == 0) params->hinting = FontRenderParams::HINTING_NONE; else if (strcmp(gtk_hint_style, "hintslight") == 0) params->hinting = FontRenderParams::HINTING_SLIGHT; else if (strcmp(gtk_hint_style, "hintmedium") == 0) params->hinting = FontRenderParams::HINTING_MEDIUM; else if (strcmp(gtk_hint_style, "hintfull") == 0) params->hinting = FontRenderParams::HINTING_FULL; if (strcmp(gtk_rgba, "none") == 0) params->subpixel_rendering = FontRenderParams::SUBPIXEL_RENDERING_NONE; else if (strcmp(gtk_rgba, "rgb") == 0) params->subpixel_rendering = FontRenderParams::SUBPIXEL_RENDERING_RGB; else if (strcmp(gtk_rgba, "bgr") == 0) params->subpixel_rendering = FontRenderParams::SUBPIXEL_RENDERING_BGR; else if (strcmp(gtk_rgba, "vrgb") == 0) params->subpixel_rendering = FontRenderParams::SUBPIXEL_RENDERING_VRGB; else if (strcmp(gtk_rgba, "vbgr") == 0) params->subpixel_rendering = FontRenderParams::SUBPIXEL_RENDERING_VBGR; } g_free(gtk_hint_style); g_free(gtk_rgba); #else // 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; } #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