OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 The Android Open Source Project |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 | 9 |
10 #include "SkDrawGradient.h" | 10 #include "SkDrawGradient.h" |
11 #include "SkAnimateMaker.h" | 11 #include "SkAnimateMaker.h" |
12 #include "SkAnimatorScript.h" | 12 #include "SkAnimatorScript.h" |
13 #include "SkGradientShader.h" | 13 #include "SkGradientShader.h" |
14 #include "SkUnitMapper.h" | |
15 | |
16 static SkScalar SkUnitToScalar(U16CPU x) { | |
17 return x / 65535.0f; | |
18 } | |
19 | |
20 static U16CPU SkScalarToUnit(SkScalar x) { | |
21 SkScalar pin = SkScalarPin(x, 0, SK_Scalar1); | |
22 return (int) (pin * 65535.0f); | |
23 } | |
24 | |
25 class SkDrawGradientUnitMapper : public SkUnitMapper { | |
26 public: | |
27 SkDrawGradientUnitMapper(SkAnimateMaker* maker, const char* script) : fMaker
(maker), fScript(script) { | |
28 } | |
29 | |
30 SK_DECLARE_UNFLATTENABLE_OBJECT() | |
31 | |
32 protected: | |
33 virtual uint16_t mapUnit16(uint16_t x) { | |
34 fUnit = SkUnitToScalar(x); | |
35 SkScriptValue value; | |
36 SkAnimatorScript engine(*fMaker, NULL, SkType_Float); | |
37 engine.propertyCallBack(GetUnitValue, &fUnit); | |
38 if (engine.evaluate(fScript, &value, SkType_Float)) | |
39 x = SkScalarToUnit(value.fOperand.fScalar); | |
40 return x; | |
41 } | |
42 | |
43 static bool GetUnitValue(const char* token, size_t len, void* unitPtr, SkScr
iptValue* value) { | |
44 if (SK_LITERAL_STR_EQUAL("unit", token, len)) { | |
45 value->fOperand.fScalar = *(SkScalar*) unitPtr; | |
46 value->fType = SkType_Float; | |
47 return true; | |
48 } | |
49 return false; | |
50 } | |
51 | |
52 SkAnimateMaker* fMaker; | |
53 const char* fScript; | |
54 SkScalar fUnit; | |
55 }; | |
56 | |
57 | 14 |
58 #if SK_USE_CONDENSED_INFO == 0 | 15 #if SK_USE_CONDENSED_INFO == 0 |
59 | 16 |
60 const SkMemberInfo SkDrawGradient::fInfo[] = { | 17 const SkMemberInfo SkDrawGradient::fInfo[] = { |
61 SK_MEMBER_INHERITED, | 18 SK_MEMBER_INHERITED, |
62 SK_MEMBER_ARRAY(offsets, Float), | 19 SK_MEMBER_ARRAY(offsets, Float), |
63 SK_MEMBER(unitMapper, String) | 20 SK_MEMBER(unitMapper, String) |
64 }; | 21 }; |
65 | 22 |
66 #endif | 23 #endif |
67 | 24 |
68 DEFINE_GET_MEMBER(SkDrawGradient); | 25 DEFINE_GET_MEMBER(SkDrawGradient); |
69 | 26 |
70 SkDrawGradient::SkDrawGradient() : fUnitMapper(NULL) { | 27 SkDrawGradient::SkDrawGradient() { |
71 } | 28 } |
72 | 29 |
73 SkDrawGradient::~SkDrawGradient() { | 30 SkDrawGradient::~SkDrawGradient() { |
74 for (int index = 0; index < fDrawColors.count(); index++) | 31 for (int index = 0; index < fDrawColors.count(); index++) |
75 delete fDrawColors[index]; | 32 delete fDrawColors[index]; |
76 delete fUnitMapper; | |
77 } | 33 } |
78 | 34 |
79 bool SkDrawGradient::addChild(SkAnimateMaker& , SkDisplayable* child) { | 35 bool SkDrawGradient::addChild(SkAnimateMaker& , SkDisplayable* child) { |
80 SkASSERT(child); | 36 SkASSERT(child); |
81 if (child->isColor()) { | 37 if (child->isColor()) { |
82 SkDrawColor* color = (SkDrawColor*) child; | 38 SkDrawColor* color = (SkDrawColor*) child; |
83 *fDrawColors.append() = color; | 39 *fDrawColors.append() = color; |
84 return true; | 40 return true; |
85 } | 41 } |
86 return false; | 42 return false; |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
131 if (offsets[i] <= offsets[i-1]) { | 87 if (offsets[i] <= offsets[i-1]) { |
132 maker.setErrorCode(SkDisplayXMLParserError::kGradientOffsetsMust
Increase); | 88 maker.setErrorCode(SkDisplayXMLParserError::kGradientOffsetsMust
Increase); |
133 return; | 89 return; |
134 } | 90 } |
135 if (offsets[i] > SK_Scalar1) { | 91 if (offsets[i] > SK_Scalar1) { |
136 maker.setErrorCode(SkDisplayXMLParserError::kGradientOffsetsMust
BeNoMoreThanOne); | 92 maker.setErrorCode(SkDisplayXMLParserError::kGradientOffsetsMust
BeNoMoreThanOne); |
137 return; | 93 return; |
138 } | 94 } |
139 } | 95 } |
140 } | 96 } |
141 if (unitMapper.size() > 0) | |
142 fUnitMapper = new SkDrawGradientUnitMapper(&maker, unitMapper.c_str()); | |
143 INHERITED::onEndElement(maker); | 97 INHERITED::onEndElement(maker); |
144 } | 98 } |
145 | 99 |
146 #if SK_USE_CONDENSED_INFO == 0 | 100 #if SK_USE_CONDENSED_INFO == 0 |
147 | 101 |
148 const SkMemberInfo SkDrawLinearGradient::fInfo[] = { | 102 const SkMemberInfo SkDrawLinearGradient::fInfo[] = { |
149 SK_MEMBER_INHERITED, | 103 SK_MEMBER_INHERITED, |
150 SK_MEMBER_ARRAY(points, Float), | 104 SK_MEMBER_ARRAY(points, Float), |
151 }; | 105 }; |
152 | 106 |
(...skipping 16 matching lines...) Expand all Loading... |
169 dumpBase(maker); | 123 dumpBase(maker); |
170 dumpRest(maker); | 124 dumpRest(maker); |
171 } | 125 } |
172 #endif | 126 #endif |
173 | 127 |
174 SkShader* SkDrawLinearGradient::getShader() { | 128 SkShader* SkDrawLinearGradient::getShader() { |
175 if (addPrelude() == 0 || points.count() != 4) | 129 if (addPrelude() == 0 || points.count() != 4) |
176 return NULL; | 130 return NULL; |
177 SkShader* shader = SkGradientShader::CreateLinear((SkPoint*)points.begin(), | 131 SkShader* shader = SkGradientShader::CreateLinear((SkPoint*)points.begin(), |
178 fColors.begin(), offsets.begin(), fColors.count(), (SkShader::TileMode)
tileMode, | 132 fColors.begin(), offsets.begin(), fColors.count(), (SkShader::TileMode)
tileMode, |
179 fUnitMapper, 0, getMatrix()); | 133 0, getMatrix()); |
180 SkAutoTDelete<SkShader> autoDel(shader); | 134 SkAutoTDelete<SkShader> autoDel(shader); |
181 (void)autoDel.detach(); | 135 (void)autoDel.detach(); |
182 return shader; | 136 return shader; |
183 } | 137 } |
184 | 138 |
185 | 139 |
186 #if SK_USE_CONDENSED_INFO == 0 | 140 #if SK_USE_CONDENSED_INFO == 0 |
187 | 141 |
188 const SkMemberInfo SkDrawRadialGradient::fInfo[] = { | 142 const SkMemberInfo SkDrawRadialGradient::fInfo[] = { |
189 SK_MEMBER_INHERITED, | 143 SK_MEMBER_INHERITED, |
(...skipping 14 matching lines...) Expand all Loading... |
204 dumpBase(maker); | 158 dumpBase(maker); |
205 dumpRest(maker); | 159 dumpRest(maker); |
206 } | 160 } |
207 #endif | 161 #endif |
208 | 162 |
209 SkShader* SkDrawRadialGradient::getShader() { | 163 SkShader* SkDrawRadialGradient::getShader() { |
210 if (addPrelude() == 0) | 164 if (addPrelude() == 0) |
211 return NULL; | 165 return NULL; |
212 SkShader* shader = SkGradientShader::CreateRadial(center, | 166 SkShader* shader = SkGradientShader::CreateRadial(center, |
213 radius, fColors.begin(), offsets.begin(), fColors.count(), (SkShader::Ti
leMode) tileMode, | 167 radius, fColors.begin(), offsets.begin(), fColors.count(), (SkShader::Ti
leMode) tileMode, |
214 fUnitMapper, 0, getMatrix()); | 168 0, getMatrix()); |
215 SkAutoTDelete<SkShader> autoDel(shader); | 169 SkAutoTDelete<SkShader> autoDel(shader); |
216 (void)autoDel.detach(); | 170 (void)autoDel.detach(); |
217 return shader; | 171 return shader; |
218 } | 172 } |
OLD | NEW |