1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
|
// Copyright (c) 2006-2008 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.
#ifndef CHROME_COMMON_GFX_CHROME_CANVAS_H_
#define CHROME_COMMON_GFX_CHROME_CANVAS_H_
#if defined(OS_WIN)
#include <windows.h>
#endif
#include <string>
#include "base/basictypes.h"
#include "skia/ext/platform_canvas.h"
class ChromeFont;
namespace gfx {
class Rect;
}
// ChromeCanvas is the SkCanvas used by Views for all painting. It
// provides a handful of methods for the common operations used throughout
// Views. With few exceptions, you should NOT create a ChromeCanvas directly,
// rather one will be passed to you via the various paint methods in view.
//
// All methods that take integer arguments (as is used throughout views)
// end with Int. If you need to use methods provided by the superclass
// you'll need to do a conversion. In particular you'll need to use
// macro SkIntToScalar(xxx), or if converting from a scalar to an integer
// SkScalarRound.
//
// A handful of methods in this class are overloaded providing an additional
// argument of type SkPorterDuff::Mode. SkPorterDuff::Mode specifies how the
// source and destination colors are combined. Unless otherwise specified,
// the variant that does not take a SkPorterDuff::Mode uses a transfer mode
// of kSrcOver_Mode.
class ChromeCanvas : public skia::PlatformCanvas {
public:
// Specifies the alignment for text rendered with the DrawStringInt method.
enum {
TEXT_ALIGN_LEFT = 1,
TEXT_ALIGN_CENTER = 2,
TEXT_ALIGN_RIGHT = 4,
TEXT_VALIGN_TOP = 8,
TEXT_VALIGN_MIDDLE = 16,
TEXT_VALIGN_BOTTOM = 32,
// Specifies the text consists of multiple lines.
MULTI_LINE = 64,
// By default DrawStringInt does not process the prefix ('&') character
// specially. That is, the string "&foo" is rendered as "&foo". When
// rendering text from a resource that uses the prefix character for
// mnemonics, the prefix should be processed and can be rendered as an
// underline (SHOW_PREFIX), or not rendered at all (HIDE_PREFIX).
SHOW_PREFIX = 128,
HIDE_PREFIX = 256,
// Prevent ellipsizing
NO_ELLIPSIS = 512,
};
// Creates an empty ChromeCanvas. Callers must use initialize before using
// the canvas.
ChromeCanvas();
ChromeCanvas(int width, int height, bool is_opaque);
virtual ~ChromeCanvas();
// Retrieves the clip rectangle and sets it in the specified rectangle if any.
// Returns true if the clip rect is non-empty.
bool GetClipRect(gfx::Rect* clip_rect);
// Wrapper function that takes integer arguments.
// Returns true if the clip is non-empty.
// See clipRect for specifics.
bool ClipRectInt(int x, int y, int w, int h);
// Test whether the provided rectangle intersects the current clip rect.
bool IntersectsClipRectInt(int x, int y, int w, int h);
// Wrapper function that takes integer arguments.
// See translate() for specifics.
void TranslateInt(int x, int y);
// Wrapper function that takes integer arguments.
// See scale() for specifics.
void ScaleInt(int x, int y);
// Fills the given rectangle with the given paint's parameters.
void FillRectInt(int x, int y, int w, int h, const SkPaint& paint);
// Fills the specified region with the specified color using a transfer
// mode of SkPorterDuff::kSrcOver_Mode.
void FillRectInt(const SkColor& color, int x, int y, int w, int h);
// Draws a single pixel line in the specified region with the specified
// color, using a transfer mode of SkPorterDuff::kSrcOver_Mode.
void DrawRectInt(const SkColor& color, int x, int y, int w, int h);
// Draws a single pixel line in the specified region with the specified
// color and transfer mode.
void DrawRectInt(const SkColor& color, int x, int y, int w, int h,
SkPorterDuff::Mode mode);
// Draws a bitmap with the origin at the specified location. The upper left
// corner of the bitmap is rendered at the specified location.
void DrawBitmapInt(const SkBitmap& bitmap, int x, int y);
// Draws a bitmap with the origin at the specified location, using the
// specified paint. The upper left corner of the bitmap is rendered at the
// specified location.
void DrawBitmapInt(const SkBitmap& bitmap, int x, int y,
const SkPaint& paint);
// Draws a portion of a bitmap in the specified location. The src parameters
// correspond to the region of the bitmap to draw in the region defined
// by the dest coordinates.
//
// If the width or height of the source differs from that of the destination,
// the bitmap will be scaled. When scaling down, it is highly recommended
// that you call buildMipMap(false) on your bitmap to ensure that it has
// a mipmap, which will result in much higher-quality output. Set |filter|
// to use filtering for bitmaps, otherwise the nearest-neighbor algorithm
// is used for resampling.
//
// An optional custom SkPaint can be provided.
void DrawBitmapInt(const SkBitmap& bitmap, int src_x, int src_y, int src_w,
int src_h, int dest_x, int dest_y, int dest_w, int dest_h,
bool filter);
void DrawBitmapInt(const SkBitmap& bitmap, int src_x, int src_y, int src_w,
int src_h, int dest_x, int dest_y, int dest_w, int dest_h,
bool filter, const SkPaint& paint);
// Draws text with the specified color, font and location. The text is
// aligned to the left, vertically centered, clipped to the region. If the
// text is too big, it is truncated and '...' is added to the end.
void DrawStringInt(const std::wstring& text, const ChromeFont& font,
const SkColor& color, int x, int y, int w, int h);
// Draws text with the specified color, font and location. The last argument
// specifies flags for how the text should be rendered. It can be one of
// TEXT_ALIGN_CENTER, TEXT_ALIGN_RIGHT or TEXT_ALIGN_LEFT.
void DrawStringInt(const std::wstring& text, const ChromeFont& font,
const SkColor& color, int x, int y, int w, int h,
int flags);
#ifdef OS_WIN // Only implemented on Windows for now.
// Draws text with a 1-pixel halo around it of the given color. It allows
// ClearType to be drawn to an otherwise transparenct bitmap for drag images.
// Drag images have only 1-bit of transparency, so we don't do any fancy
// blurring.
void DrawStringWithHalo(const std::wstring& text, const ChromeFont& font,
const SkColor& text_color, const SkColor& halo_color,
int x, int y, int w, int h, int flags);
#endif
// Draws a dotted gray rectangle used for focus purposes.
void DrawFocusRect(int x, int y, int width, int height);
// Tiles the image in the specified region.
void TileImageInt(const SkBitmap& bitmap, int x, int y, int w, int h);
void TileImageInt(const SkBitmap& bitmap, int src_x, int src_y,
int dest_x, int dest_y, int w, int h);
// Extracts a bitmap from the contents of this canvas.
SkBitmap ExtractBitmap();
// Compute the size required to draw some text with the provided font.
// Attempts to fit the text with the provided width and height. Increases
// height and then width as needed to make the text fit. This method
// supports multiple lines.
static void SizeStringInt(const std::wstring& test, const ChromeFont& font,
int *width, int* height, int flags);
private:
#if defined(OS_WIN)
// Draws text with the specified color, font and location. The text is
// aligned to the left, vertically centered, clipped to the region. If the
// text is too big, it is truncated and '...' is added to the end.
void DrawStringInt(const std::wstring& text, HFONT font,
const SkColor& color, int x, int y, int w, int h,
int flags);
#endif
DISALLOW_EVIL_CONSTRUCTORS(ChromeCanvas);
};
#if defined(OS_WIN) || defined(TOOLKIT_GTK)
typedef skia::CanvasPaintT<ChromeCanvas> ChromeCanvasPaint;
#endif
#endif // CHROME_COMMON_GFX_CHROME_CANVAS_H_
|