Chromium Code Reviews

Side by Side Diff: app/gfx/font.h

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

Powered by Google App Engine