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
|
/*
* Copyright 2009, Google Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following disclaimer
* in the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Google Inc. nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
// This file contains the declaration for the CanvasShader class.
#ifndef O3D_CORE_CROSS_CANVAS_SHADER_H_
#define O3D_CORE_CROSS_CANVAS_SHADER_H_
#include <vector>
#include "core/cross/param_object.h"
#include "core/cross/param.h"
#include "SkColor.h"
#include "SkPoint.h"
class SkShader;
namespace o3d {
// This is the base class for 2D gradient shaders that can be applied to a
// CanvasPaint. The shaders affect both text and primitive drawing in the
// canvas.
class CanvasShader : public ParamObject {
public:
enum TileMode {
CLAMP, /* copy the edge color if the shader draws outside of its bounds */
REPEAT, /* repeat horizontally and vertically outside its bounds */
MIRROR /* same, alternating mirror images */
};
typedef SmartPointer<CanvasShader> Ref;
explicit CanvasShader(ServiceLocator* service_locator);
virtual ~CanvasShader();
// Returns a pointer to the native (SKIA) shader object.
SkShader* GetNativeShader();
protected:
// Creates a new native (SKIA) shader object using the parameter values
// stored in the object.
virtual SkShader* MakeNativeShader() = 0;
SkShader* native_shader_;
bool needs_update_;
private:
O3D_DECL_CLASS(CanvasShader, ParamObject)
DISALLOW_COPY_AND_ASSIGN(CanvasShader);
};
// A shader that generates a linear gradient between two specified points.
// Two or more colors need to be specified for the gradient.
class CanvasLinearGradient : public CanvasShader {
public:
typedef SmartPointer<CanvasLinearGradient> Ref;
virtual ~CanvasLinearGradient();
// Sets the start point of the gradient.
void set_start_point(Float2 start_point) {
start_point_ = start_point;
}
// Returns the start point of the gradient.
Float2 start_point() {
return start_point_;
}
// Sets the end point of the gradient.
void set_end_point(Float2 end_point) {
end_point_ = end_point;
}
// Returns the end point of the gradient.
Float2 end_point() {
return end_point_;
}
// Sets the relative positions corresponding to the colors in the color array.
// If the positions list is empty then the colors will be spread evenly.
// Otherwise, position values should start with 0 and end with 1.0 and their
// count should be equal to the length of the colors_ array.
void set_positions(std::vector<float> positions) {
positions_ = positions;
needs_update_ = true;
}
std::vector<float> positions() {
return positions_;
}
// Sets the array of colors used by the gradient.
void set_colors(std::vector<Float4> colors) {
colors_ = colors;
needs_update_ = true;
}
// Returns the color array.
std::vector<Float4> colors() {
return colors_;
}
// Sets the tiling mode for the gradient which specifies how the shader
// repeats for values beyond the start and end points.
void set_tile_mode(CanvasShader::TileMode tile_mode) {
tile_mode_ = tile_mode;
needs_update_ = true;
}
// Returns the tile mode.
TileMode tile_mode() { return tile_mode_; }
protected:
explicit CanvasLinearGradient(ServiceLocator* service_locator);
virtual SkShader* MakeNativeShader();
private:
friend class IClassManager;
static ObjectBase::Ref Create(ServiceLocator* service_locator);
// Start and end points for the gradient.
Float2 start_point_;
Float2 end_point_;
// Array of colors.
std::vector<Float4> colors_;
// Array of positions corresponding to colors.
std::vector<float> positions_;
CanvasShader::TileMode tile_mode_;
O3D_DECL_CLASS(CanvasLinearGradient, CanvasShader)
DISALLOW_COPY_AND_ASSIGN(CanvasLinearGradient);
};
} // namespace o3d
#endif // O3D_CORE_CROSS_CANVAS_SHADER_H_
|