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

Side by Side Diff: gfx/font.h

Issue 3083022: Rework gfx::Font by moving platform-specific code into inner classes.... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 10 years, 4 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 | « gfx/canvas_skia_win.cc ('k') | gfx/font.cc » ('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) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 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 #ifndef GFX_FONT_H_ 5 #ifndef GFX_FONT_H_
6 #define GFX_FONT_H_ 6 #define GFX_FONT_H_
7 #pragma once 7 #pragma once
8 8
9 #include "build/build_config.h"
10
11 #include <string> 9 #include <string>
12 10
13 #if defined(OS_WIN)
14 typedef struct HFONT__* HFONT;
15 #elif !defined(OS_MACOSX)
16 #include "third_party/skia/include/core/SkRefCnt.h"
17 class SkPaint;
18 class SkTypeface;
19 #endif
20
21 #if defined(OS_WIN)
22 typedef struct HFONT__* NativeFont;
23 #elif defined(OS_MACOSX)
24 #ifdef __OBJC__
25 @class NSFont;
26 #else
27 class NSFont;
28 #endif
29 typedef NSFont* NativeFont;
30 #else
31 typedef struct _PangoFontDescription PangoFontDescription;
32 class SkTypeface;
33 typedef SkTypeface* NativeFont;
34 #endif
35
36 #include "base/basictypes.h"
37 #include "base/ref_counted.h" 11 #include "base/ref_counted.h"
38 #include "base/scoped_ptr.h" 12 #include "gfx/native_widget_types.h"
39 13
40 namespace gfx { 14 namespace gfx {
41 15
16 class PlatformFont;
17
42 // Font provides a wrapper around an underlying font. Copy and assignment 18 // Font provides a wrapper around an underlying font. Copy and assignment
43 // operators are explicitly allowed, and cheap. 19 // operators are explicitly allowed, and cheap.
44 class Font { 20 class Font {
45 public: 21 public:
46 // The following constants indicate the font style. 22 // The following constants indicate the font style.
47 enum { 23 enum FontStyle {
48 NORMAL = 0, 24 NORMAL = 0,
49 BOLD = 1, 25 BOLD = 1,
50 ITALIC = 2, 26 ITALIC = 2,
51 UNDERLINED = 4, 27 UNDERLINED = 4,
52 }; 28 };
53 29
54 // Creates a Font given font name (e.g. arial), font size (e.g. 12). 30 // Creates a font with the default name and style.
55 // Skia actually expects a family name and not a font name. 31 Font();
56 static Font CreateFont(const std::wstring& font_name, int font_size);
57 32
58 ~Font() { } 33 // Creates a font that is a clone of another font object.
34 Font(const Font& other);
35 gfx::Font& operator=(const Font& other);
36
37 // Creates a font from the specified native font.
38 explicit Font(NativeFont native_font);
39
40 // Construct a Font object with the specified PlatformFont object. The Font
41 // object takes ownership of the PlatformFont object.
42 explicit Font(PlatformFont* platform_font);
43
44 // Creates a font with the specified name and size.
45 Font(const std::wstring& font_name, int font_size);
46
47 ~Font();
59 48
60 // Returns a new Font derived from the existing font. 49 // Returns a new Font derived from the existing font.
61 // size_deta is the size to add to the current font. For example, a value 50 // size_deta is the size to add to the current font. For example, a value
62 // of 5 results in a font 5 units bigger than this font. 51 // of 5 results in a font 5 units bigger than this font.
63 Font DeriveFont(int size_delta) const { 52 Font DeriveFont(int size_delta) const;
64 return DeriveFont(size_delta, style());
65 }
66 53
67 // Returns a new Font derived from the existing font. 54 // Returns a new Font derived from the existing font.
68 // size_delta is the size to add to the current font. See the single 55 // size_delta is the size to add to the current font. See the single
69 // argument version of this method for an example. 56 // argument version of this method for an example.
70 // The style parameter specifies the new style for the font, and is a 57 // The style parameter specifies the new style for the font, and is a
71 // bitmask of the values: BOLD, ITALIC and UNDERLINED. 58 // bitmask of the values: BOLD, ITALIC and UNDERLINED.
72 Font DeriveFont(int size_delta, int style) const; 59 Font DeriveFont(int size_delta, int style) const;
73 60
74 // Returns the number of vertical pixels needed to display characters from 61 // Returns the number of vertical pixels needed to display characters from
75 // the specified font. This may include some leading, i.e. height may be 62 // the specified font. This may include some leading, i.e. height may be
76 // greater than just ascent + descent. Specifically, the Windows and Mac 63 // greater than just ascent + descent. Specifically, the Windows and Mac
77 // implementations include leading and the Linux one does not. This may 64 // implementations include leading and the Linux one does not. This may
78 // need to be revisited in the future. 65 // need to be revisited in the future.
79 int height() const; 66 int GetHeight() const;
80 67
81 // Returns the baseline, or ascent, of the font. 68 // Returns the baseline, or ascent, of the font.
82 int baseline() const; 69 int GetBaseline() const;
83 70
84 // Returns the average character width for the font. 71 // Returns the average character width for the font.
85 int ave_char_width() const; 72 int GetAverageCharacterWidth() const;
86 73
87 // Returns the number of horizontal pixels needed to display the specified 74 // Returns the number of horizontal pixels needed to display the specified
88 // string. 75 // string.
89 int GetStringWidth(const std::wstring& text) const; 76 int GetStringWidth(const std::wstring& text) const;
90 77
91 // Returns the expected number of horizontal pixels needed to display 78 // Returns the expected number of horizontal pixels needed to display the
92 // the specified length of characters. 79 // specified length of characters. Call GetStringWidth() to retrieve the
93 // Call GetStringWidth() to retrieve the actual number. 80 // actual number.
94 int GetExpectedTextWidth(int length) const; 81 int GetExpectedTextWidth(int length) const;
95 82
96 // Returns the style of the font. 83 // Returns the style of the font.
97 int style() const; 84 int GetStyle() const;
98 85
99 // Font Name. 86 // Returns the font name.
100 // It is actually a font family name, because Skia expects a family name 87 const std::wstring& GetFontName() const;
101 // and not a font name.
102 const std::wstring& FontName() const;
103 88
104 // Font Size. 89 // Returns the font size in pixels.
105 int FontSize(); 90 int GetFontSize() const;
106 91
107 NativeFont nativeFont() const; 92 // Returns the native font handle.
93 // Lifetime lore:
94 // Windows: This handle is owned by the Font object, and should not be
95 // destroyed by the caller.
96 // Mac: Caller must release this object.
97 // Gtk: This handle is created on demand, and must be freed by calling
98 // pango_font_description_free() when the caller is done using it.
99 NativeFont GetNativeFont() const;
108 100
109 // Creates a font with the default name and style. 101 // Raw access to the underlying platform font implementation. Can be
110 Font(); 102 // static_cast to a known implementation type if needed.
111 103 PlatformFont* platform_font() const { return platform_font_.get(); }
112 #if defined(OS_WIN)
113 // Creates a Font from the specified HFONT. The supplied HFONT is effectively
114 // copied.
115 static Font CreateFont(HFONT hfont);
116
117 // Returns the handle to the underlying HFONT. This is used by gfx::Canvas to
118 // draw text.
119 HFONT hfont() const { return font_ref_->hfont(); }
120
121 // Dialog units to pixels conversion.
122 // See http://support.microsoft.com/kb/145994 for details.
123 int horizontal_dlus_to_pixels(int dlus) {
124 return dlus * font_ref_->dlu_base_x() / 4;
125 }
126 int vertical_dlus_to_pixels(int dlus) {
127 return dlus * font_ref_->height() / 8;
128 }
129
130 // Callback that returns the minimum height that should be used for
131 // gfx::Fonts. Optional. If not specified, the minimum font size is 0.
132 typedef int (*GetMinimumFontSizeCallback)();
133 static GetMinimumFontSizeCallback get_minimum_font_size_callback;
134
135 // Callback that adjusts a LOGFONT to meet suitability requirements of the
136 // embedding application. Optional. If not specified, no adjustments are
137 // performed other than clamping to a minimum font height if
138 // |get_minimum_font_size_callback| is specified.
139 typedef void (*AdjustFontCallback)(LOGFONT* lf);
140 static AdjustFontCallback adjust_font_callback;
141
142 #elif !defined(OS_MACOSX)
143 static Font CreateFont(PangoFontDescription* desc);
144 // We need a copy constructor and assignment operator to deal with
145 // the Skia reference counting.
146 Font(const Font& other);
147 Font& operator=(const Font& other);
148 // Setup a Skia context to use the current typeface
149 void PaintSetup(SkPaint* paint) const;
150
151 // Converts |gfx_font| to a new pango font. Free the returned font with
152 // pango_font_description_free().
153 static PangoFontDescription* PangoFontFromGfxFont(const gfx::Font& gfx_font);
154
155 // Position as an offset from the height of the drawn text, used to draw
156 // an underline. This is a negative number, so the underline would be
157 // drawn at y + height + underline_position;
158 double underline_position() const;
159 // The thickness to draw the underline.
160 double underline_thickness() const;
161 #endif
162 104
163 private: 105 private:
164 106 // Wrapped platform font implementation.
165 #if defined(OS_WIN) 107 scoped_refptr<PlatformFont> platform_font_;
166 // Chrome text drawing bottoms out in the Windows GDI functions that take an
167 // HFONT (an opaque handle into Windows). To avoid lots of GDI object
168 // allocation and destruction, Font indirectly refers to the HFONT by way of
169 // an HFontRef. That is, every Font has an HFontRef, which has an HFONT.
170 //
171 // HFontRef is reference counted. Upon deletion, it deletes the HFONT.
172 // By making HFontRef maintain the reference to the HFONT, multiple
173 // HFontRefs can share the same HFONT, and Font can provide value semantics.
174 class HFontRef : public base::RefCounted<HFontRef> {
175 public:
176 // This constructor takes control of the HFONT, and will delete it when
177 // the HFontRef is deleted.
178 HFontRef(HFONT hfont,
179 int height,
180 int baseline,
181 int ave_char_width,
182 int style,
183 int dlu_base_x);
184
185 // Accessors
186 HFONT hfont() const { return hfont_; }
187 int height() const { return height_; }
188 int baseline() const { return baseline_; }
189 int ave_char_width() const { return ave_char_width_; }
190 int style() const { return style_; }
191 int dlu_base_x() const { return dlu_base_x_; }
192 const std::wstring& font_name() const { return font_name_; }
193
194 private:
195 friend class base::RefCounted<HFontRef>;
196
197 ~HFontRef();
198
199 const HFONT hfont_;
200 const int height_;
201 const int baseline_;
202 const int ave_char_width_;
203 const int style_;
204 // Constants used in converting dialog units to pixels.
205 const int dlu_base_x_;
206 std::wstring font_name_;
207
208 DISALLOW_COPY_AND_ASSIGN(HFontRef);
209 };
210
211 // Returns the base font ref. This should ONLY be invoked on the
212 // UI thread.
213 static HFontRef* GetBaseFontRef();
214
215 // Creates and returns a new HFONTRef from the specified HFONT.
216 static HFontRef* CreateHFontRef(HFONT font);
217
218 explicit Font(HFontRef* font_ref) : font_ref_(font_ref) { }
219
220 // Reference to the base font all fonts are derived from.
221 static HFontRef* base_font_ref_;
222
223 // Indirect reference to the HFontRef, which references the underlying HFONT.
224 scoped_refptr<HFontRef> font_ref_;
225 #elif !defined(OS_MACOSX)
226 explicit Font(SkTypeface* typeface, const std::wstring& name,
227 int size, int style);
228 // Calculate and cache the font metrics.
229 void calculateMetrics();
230 // Make |this| a copy of |other|.
231 void CopyFont(const Font& other);
232
233 // The default font, used for the default constructor.
234 static Font* default_font_;
235
236 // Return the scale factor for fonts that account for DPI.
237 static float GetPangoScaleFactor();
238
239 // The average width of a character, initialized and cached if needed.
240 double avg_width() const;
241
242 // Potentially slow call to get pango metrics (avg width, underline info).
243 void InitPangoMetrics();
244
245 // These two both point to the same SkTypeface. We use the SkAutoUnref to
246 // handle the reference counting, but without @typeface_ we would have to
247 // cast the SkRefCnt from @typeface_helper_ every time.
248 scoped_ptr<SkAutoUnref> typeface_helper_;
249 SkTypeface *typeface_;
250
251 // Additional information about the face
252 // Skia actually expects a family name and not a font name.
253 std::wstring font_family_;
254 int font_size_;
255 int style_;
256
257 // Cached metrics, generated at construction
258 int height_;
259 int ascent_;
260
261 // The pango metrics are much more expensive so we wait until we need them
262 // to compute them.
263 bool pango_metrics_inited_;
264 double avg_width_;
265 double underline_position_;
266 double underline_thickness_;
267 #else // OS_MACOSX
268 explicit Font(const std::wstring& font_name, int font_size, int style);
269
270 // Calculate and cache the font metrics.
271 void calculateMetrics();
272
273 std::wstring font_name_;
274 int font_size_;
275 int style_;
276
277 // Cached metrics, generated at construction
278 int height_;
279 int ascent_;
280 int avg_width_;
281 #endif
282
283 }; 108 };
284 109
285 } // namespace gfx 110 } // namespace gfx
286 111
287 #endif // GFX_FONT_H_ 112 #endif // GFX_FONT_H_
113
OLDNEW
« no previous file with comments | « gfx/canvas_skia_win.cc ('k') | gfx/font.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698