Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(10)

Side by Side Diff: ui/gfx/pango_util.cc

Issue 382273002: ui/gfx: Allow for font-specific rendering settings. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix fontconfig leak Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « ui/gfx/font_render_params_linux.cc ('k') | ui/gfx/platform_font.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/pango_util.h" 5 #include "ui/gfx/pango_util.h"
6 6
7 #include <cairo/cairo.h> 7 #include <cairo/cairo.h>
8 #include <pango/pango.h> 8 #include <pango/pango.h>
9 #include <pango/pangocairo.h> 9 #include <pango/pangocairo.h>
10 #include <string> 10 #include <string>
11 11
12 #include <algorithm> 12 #include <algorithm>
13 #include <map> 13 #include <map>
14 14
15 #include "base/logging.h" 15 #include "base/logging.h"
16 #include "base/strings/utf_string_conversions.h" 16 #include "base/strings/utf_string_conversions.h"
17 #include "ui/gfx/canvas.h" 17 #include "ui/gfx/canvas.h"
18 #include "ui/gfx/font_list.h" 18 #include "ui/gfx/font_list.h"
19 #include "ui/gfx/font_render_params.h" 19 #include "ui/gfx/font_render_params.h"
20 #include "ui/gfx/platform_font_pango.h"
20 #include "ui/gfx/text_utils.h" 21 #include "ui/gfx/text_utils.h"
21 22
22 namespace gfx { 23 namespace gfx {
23 24
24 namespace { 25 namespace {
25 26
26 // Marker for accelerators in the text. 27 // Marker for accelerators in the text.
27 const gunichar kAcceleratorChar = '&'; 28 const gunichar kAcceleratorChar = '&';
28 29
29 // Creates and returns a PangoContext. The caller owns the context. 30 // Creates and returns a PangoContext. The caller owns the context.
30 PangoContext* GetPangoContext() { 31 PangoContext* GetPangoContext() {
31 PangoFontMap* font_map = pango_cairo_font_map_get_default(); 32 PangoFontMap* font_map = pango_cairo_font_map_get_default();
32 return pango_font_map_create_context(font_map); 33 return pango_font_map_create_context(font_map);
33 } 34 }
34 35
35 // Returns a static cairo_font_options_t. If needed, allocates and updates it. 36 // Creates a new cairo_font_options_t based on |params|.
36 // TODO(derat): Return font-specific options: http://crbug.com/125235 37 cairo_font_options_t* CreateCairoFontOptions(const FontRenderParams& params) {
37 cairo_font_options_t* GetCairoFontOptions() { 38 cairo_font_options_t* cairo_font_options = cairo_font_options_create();
38 // Font settings that we initialize once and then use when drawing text.
39 static cairo_font_options_t* cairo_font_options = NULL;
40 if (cairo_font_options)
41 return cairo_font_options;
42 39
43 cairo_font_options = cairo_font_options_create();
44
45 const FontRenderParams& params = GetDefaultFontRenderParams();
46 FontRenderParams::SubpixelRendering subpixel = params.subpixel_rendering; 40 FontRenderParams::SubpixelRendering subpixel = params.subpixel_rendering;
47 if (!params.antialiasing) { 41 if (!params.antialiasing) {
48 cairo_font_options_set_antialias(cairo_font_options, CAIRO_ANTIALIAS_NONE); 42 cairo_font_options_set_antialias(cairo_font_options, CAIRO_ANTIALIAS_NONE);
49 } else if (subpixel == FontRenderParams::SUBPIXEL_RENDERING_NONE) { 43 } else if (subpixel == FontRenderParams::SUBPIXEL_RENDERING_NONE) {
50 cairo_font_options_set_antialias(cairo_font_options, CAIRO_ANTIALIAS_GRAY); 44 cairo_font_options_set_antialias(cairo_font_options, CAIRO_ANTIALIAS_GRAY);
51 } else { 45 } else {
52 cairo_font_options_set_antialias(cairo_font_options, 46 cairo_font_options_set_antialias(cairo_font_options,
53 CAIRO_ANTIALIAS_SUBPIXEL); 47 CAIRO_ANTIALIAS_SUBPIXEL);
54 cairo_subpixel_order_t cairo_subpixel_order = CAIRO_SUBPIXEL_ORDER_DEFAULT; 48 cairo_subpixel_order_t cairo_subpixel_order = CAIRO_SUBPIXEL_ORDER_DEFAULT;
55 if (subpixel == FontRenderParams::SUBPIXEL_RENDERING_RGB) 49 if (subpixel == FontRenderParams::SUBPIXEL_RENDERING_RGB)
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
126 } 120 }
127 121
128 } // namespace 122 } // namespace
129 123
130 void SetUpPangoLayout( 124 void SetUpPangoLayout(
131 PangoLayout* layout, 125 PangoLayout* layout,
132 const base::string16& text, 126 const base::string16& text,
133 const FontList& font_list, 127 const FontList& font_list,
134 base::i18n::TextDirection text_direction, 128 base::i18n::TextDirection text_direction,
135 int flags) { 129 int flags) {
136 // TODO(derat): Use rendering parameters from |font_list| instead of defaults. 130 cairo_font_options_t* cairo_font_options = CreateCairoFontOptions(
137 cairo_font_options_t* cairo_font_options = GetCairoFontOptions(); 131 font_list.GetPrimaryFont().GetFontRenderParams());
138 132
139 // If we got an explicit request to turn off subpixel rendering, disable it on 133 // If we got an explicit request to turn off subpixel rendering, disable it.
140 // a copy of the static font options object.
141 bool copied_cairo_font_options = false;
142 if ((flags & Canvas::NO_SUBPIXEL_RENDERING) && 134 if ((flags & Canvas::NO_SUBPIXEL_RENDERING) &&
143 (cairo_font_options_get_antialias(cairo_font_options) == 135 (cairo_font_options_get_antialias(cairo_font_options) ==
144 CAIRO_ANTIALIAS_SUBPIXEL)) { 136 CAIRO_ANTIALIAS_SUBPIXEL))
145 cairo_font_options = cairo_font_options_copy(cairo_font_options);
146 copied_cairo_font_options = true;
147 cairo_font_options_set_antialias(cairo_font_options, CAIRO_ANTIALIAS_GRAY); 137 cairo_font_options_set_antialias(cairo_font_options, CAIRO_ANTIALIAS_GRAY);
148 }
149 138
150 // This needs to be done early on; it has no effect when called just before 139 // This needs to be done early on; it has no effect when called just before
151 // pango_cairo_show_layout(). 140 // pango_cairo_show_layout().
152 pango_cairo_context_set_font_options( 141 pango_cairo_context_set_font_options(
153 pango_layout_get_context(layout), cairo_font_options); 142 pango_layout_get_context(layout), cairo_font_options);
154 143 cairo_font_options_destroy(cairo_font_options);
155 if (copied_cairo_font_options) { 144 cairo_font_options = NULL;
156 cairo_font_options_destroy(cairo_font_options);
157 cairo_font_options = NULL;
158 }
159 145
160 // Set Pango's base text direction explicitly from |text_direction|. 146 // Set Pango's base text direction explicitly from |text_direction|.
161 pango_layout_set_auto_dir(layout, FALSE); 147 pango_layout_set_auto_dir(layout, FALSE);
162 pango_context_set_base_dir(pango_layout_get_context(layout), 148 pango_context_set_base_dir(pango_layout_get_context(layout),
163 (text_direction == base::i18n::RIGHT_TO_LEFT ? 149 (text_direction == base::i18n::RIGHT_TO_LEFT ?
164 PANGO_DIRECTION_RTL : PANGO_DIRECTION_LTR)); 150 PANGO_DIRECTION_RTL : PANGO_DIRECTION_LTR));
165 151
166 if (flags & Canvas::TEXT_ALIGN_CENTER) { 152 if (flags & Canvas::TEXT_ALIGN_CENTER) {
167 // We don't support center aligned w/ eliding. 153 // We don't support center aligned w/ eliding.
168 DCHECK(gfx::Canvas::NO_ELLIPSIS); 154 DCHECK(gfx::Canvas::NO_ELLIPSIS);
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
259 245
260 if (i == desc_to_metrics->end()) { 246 if (i == desc_to_metrics->end()) {
261 PangoFontMetrics* metrics = pango_context_get_metrics(context, desc, NULL); 247 PangoFontMetrics* metrics = pango_context_get_metrics(context, desc, NULL);
262 desc_to_metrics->insert(std::make_pair(desc_hash, metrics)); 248 desc_to_metrics->insert(std::make_pair(desc_hash, metrics));
263 return metrics; 249 return metrics;
264 } 250 }
265 return i->second; 251 return i->second;
266 } 252 }
267 253
268 } // namespace gfx 254 } // namespace gfx
OLDNEW
« no previous file with comments | « ui/gfx/font_render_params_linux.cc ('k') | ui/gfx/platform_font.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698