OLD | NEW |
| (Empty) |
1 /* libs/graphics/animator/SkDrawPaint.cpp | |
2 ** | |
3 ** Copyright 2006, The Android Open Source Project | |
4 ** | |
5 ** Licensed under the Apache License, Version 2.0 (the "License"); | |
6 ** you may not use this file except in compliance with the License. | |
7 ** You may obtain a copy of the License at | |
8 ** | |
9 ** http://www.apache.org/licenses/LICENSE-2.0 | |
10 ** | |
11 ** Unless required by applicable law or agreed to in writing, software | |
12 ** distributed under the License is distributed on an "AS IS" BASIS, | |
13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
14 ** See the License for the specific language governing permissions and | |
15 ** limitations under the License. | |
16 */ | |
17 | |
18 #include "SkDrawPaint.h" | |
19 #include "SkAnimateMaker.h" | |
20 #include "SkDrawColor.h" | |
21 #include "SkDrawShader.h" | |
22 #include "SkMaskFilter.h" | |
23 #include "SkPaintParts.h" | |
24 #include "SkPathEffect.h" | |
25 | |
26 enum SkPaint_Functions { | |
27 SK_FUNCTION(measureText) | |
28 }; | |
29 | |
30 enum SkPaint_Properties { | |
31 SK_PROPERTY(ascent), | |
32 SK_PROPERTY(descent) | |
33 }; | |
34 | |
35 // !!! in the future, this could be compiled by build-condensed-info into an arr
ay of parameters | |
36 // with a lookup table to find the first parameter -- for now, it is iteratively
searched through | |
37 const SkFunctionParamType SkDrawPaint::fFunctionParameters[] = { | |
38 (SkFunctionParamType) SkType_String, | |
39 (SkFunctionParamType) 0 // terminator for parameter list (there may be multi
ple parameter lists) | |
40 }; | |
41 | |
42 | |
43 #if SK_USE_CONDENSED_INFO == 0 | |
44 | |
45 const SkMemberInfo SkDrawPaint::fInfo[] = { | |
46 SK_MEMBER(antiAlias, Boolean), | |
47 SK_MEMBER_PROPERTY(ascent, Float), | |
48 SK_MEMBER(color, Color), | |
49 SK_MEMBER_PROPERTY(descent, Float), | |
50 SK_MEMBER(fakeBold, Boolean), | |
51 SK_MEMBER(filterBitmap, Boolean), | |
52 SK_MEMBER(linearText, Boolean), | |
53 SK_MEMBER(maskFilter, MaskFilter), | |
54 SK_MEMBER_FUNCTION(measureText, Float), | |
55 SK_MEMBER(pathEffect, PathEffect), | |
56 SK_MEMBER(shader, Shader), | |
57 SK_MEMBER(strikeThru, Boolean), | |
58 SK_MEMBER(stroke, Boolean), | |
59 SK_MEMBER(strokeCap, Cap), | |
60 SK_MEMBER(strokeJoin, Join), | |
61 SK_MEMBER(strokeMiter, Float), | |
62 SK_MEMBER(strokeWidth, Float), | |
63 SK_MEMBER(style, Style), | |
64 SK_MEMBER(textAlign, Align), | |
65 SK_MEMBER(textScaleX, Float), | |
66 SK_MEMBER(textSize, Float), | |
67 SK_MEMBER(textSkewX, Float), | |
68 SK_MEMBER(typeface, Typeface), | |
69 SK_MEMBER(underline, Boolean), | |
70 SK_MEMBER(xfermode, Xfermode) | |
71 }; | |
72 | |
73 #endif | |
74 | |
75 DEFINE_GET_MEMBER(SkDrawPaint); | |
76 | |
77 SkDrawPaint::SkDrawPaint() : antiAlias(-1), color(NULL), fakeBold(-1), filterBit
map(-1), | |
78 linearText(-1), maskFilter((SkDrawMaskFilter*) -1), pathEffect((SkDrawPathEf
fect*) -1), | |
79 shader((SkDrawShader*) -1), strikeThru(-1), stroke(-1), | |
80 strokeCap((SkPaint::Cap) -1), strokeJoin((SkPaint::Join) -1), strokeMiter(SK
_ScalarNaN), | |
81 strokeWidth(SK_ScalarNaN), style((SkPaint::Style) -1), | |
82 textAlign((SkPaint::Align) -1), textScaleX(SK_ScalarNaN), textSize(SK_Scalar
NaN), | |
83 textSkewX(SK_ScalarNaN), typeface((SkDrawTypeface*) -1), | |
84 underline(-1), xfermode((SkPorterDuff::Mode) -1), fOwnsColor(false), fOwnsMa
skFilter(false), | |
85 fOwnsPathEffect(false), fOwnsShader(false), fOwnsTypeface(false) { | |
86 } | |
87 | |
88 SkDrawPaint::~SkDrawPaint() { | |
89 if (fOwnsColor) | |
90 delete color; | |
91 if (fOwnsMaskFilter) | |
92 delete maskFilter; | |
93 if (fOwnsPathEffect) | |
94 delete pathEffect; | |
95 if (fOwnsShader) | |
96 delete shader; | |
97 if (fOwnsTypeface) | |
98 delete typeface; | |
99 } | |
100 | |
101 bool SkDrawPaint::add(SkAnimateMaker& maker, SkDisplayable* child) { | |
102 SkASSERT(child && child->isPaintPart()); | |
103 SkPaintPart* part = (SkPaintPart*) child; | |
104 if (part->add()) | |
105 maker.setErrorCode(SkDisplayXMLParserError::kErrorAddingToPaint); | |
106 return true; | |
107 } | |
108 | |
109 SkDisplayable* SkDrawPaint::deepCopy(SkAnimateMaker* maker) { | |
110 SkDrawColor* tempColor = color; | |
111 color = NULL; | |
112 SkDrawPaint* copy = (SkDrawPaint*) INHERITED::deepCopy(maker); | |
113 color = tempColor; | |
114 tempColor = (SkDrawColor*) color->deepCopy(maker); | |
115 tempColor->setParent(copy); | |
116 tempColor->add(); | |
117 copy->fOwnsColor = true; | |
118 return copy; | |
119 } | |
120 | |
121 bool SkDrawPaint::draw(SkAnimateMaker& maker) { | |
122 SkPaint* paint = maker.fPaint; | |
123 setupPaint(paint); | |
124 return false; | |
125 } | |
126 | |
127 #ifdef SK_DUMP_ENABLED | |
128 void SkDrawPaint::dump(SkAnimateMaker* maker) { | |
129 dumpBase(maker); | |
130 dumpAttrs(maker); | |
131 bool closedYet = false; | |
132 SkDisplayList::fIndent +=4; | |
133 //should i say if (maskFilter && ...? | |
134 if (maskFilter != (SkDrawMaskFilter*)-1) { | |
135 SkDebugf(">\n"); | |
136 maskFilter->dump(maker); | |
137 closedYet = true; | |
138 } | |
139 if (pathEffect != (SkDrawPathEffect*) -1) { | |
140 if (closedYet == false) { | |
141 SkDebugf(">\n"); | |
142 closedYet = true; | |
143 } | |
144 pathEffect->dump(maker); | |
145 } | |
146 if (fOwnsTypeface) { | |
147 if (closedYet == false) { | |
148 SkDebugf(">\n"); | |
149 closedYet = true; | |
150 } | |
151 typeface->dump(maker); | |
152 } | |
153 SkDisplayList::fIndent -= 4; | |
154 dumpChildren(maker, closedYet); | |
155 } | |
156 #endif | |
157 | |
158 void SkDrawPaint::executeFunction(SkDisplayable* target, int index, | |
159 SkTDArray<SkScriptValue>& parameters, SkDisplayTypes type, | |
160 SkScriptValue* scriptValue) { | |
161 if (scriptValue == NULL) | |
162 return; | |
163 SkASSERT(target == this); | |
164 switch (index) { | |
165 case SK_FUNCTION(measureText): { | |
166 SkASSERT(parameters.count() == 1); | |
167 SkASSERT(type == SkType_Float); | |
168 SkPaint paint; | |
169 setupPaint(&paint); | |
170 scriptValue->fType = SkType_Float; | |
171 SkASSERT(parameters[0].fType == SkType_String); | |
172 scriptValue->fOperand.fScalar = paint.measureText(parameters[0].fOpe
rand.fString->c_str(), | |
173 parameters[0].fOperand.fString->size()); | |
174 // SkDebugf("measureText: %s = %g\n", parameters[0].fOperand.fString->c
_str(), | |
175 // scriptValue->fOperand.fScalar / 65536.0f); | |
176 } break; | |
177 default: | |
178 SkASSERT(0); | |
179 } | |
180 } | |
181 | |
182 const SkFunctionParamType* SkDrawPaint::getFunctionsParameters() { | |
183 return fFunctionParameters; | |
184 } | |
185 | |
186 bool SkDrawPaint::getProperty(int index, SkScriptValue* value) const { | |
187 SkPaint::FontMetrics metrics; | |
188 SkPaint paint; | |
189 setupPaint(&paint); | |
190 paint.getFontMetrics(&metrics); | |
191 switch (index) { | |
192 case SK_PROPERTY(ascent): | |
193 value->fOperand.fScalar = metrics.fAscent; | |
194 break; | |
195 case SK_PROPERTY(descent): | |
196 value->fOperand.fScalar = metrics.fDescent; | |
197 break; | |
198 // should consider returning fLeading as well (or roll it into ascent/de
scent somehow | |
199 default: | |
200 SkASSERT(0); | |
201 return false; | |
202 } | |
203 value->fType = SkType_Float; | |
204 return true; | |
205 } | |
206 | |
207 bool SkDrawPaint::resolveIDs(SkAnimateMaker& maker, SkDisplayable* origDisp, SkA
pply* ) { | |
208 SkASSERT(origDisp->isPaint()); | |
209 SkDrawPaint* original = (SkDrawPaint*) origDisp; | |
210 if (fOwnsColor && maker.resolveID(color, original->color) == false) | |
211 return true; | |
212 if (fOwnsMaskFilter && maker.resolveID(maskFilter, original->maskFilter) ==
false) | |
213 return true; | |
214 if (fOwnsPathEffect && maker.resolveID(pathEffect, original->pathEffect) ==
false) | |
215 return true; | |
216 if (fOwnsShader && maker.resolveID(shader, original->shader) == false) | |
217 return true; | |
218 if (fOwnsTypeface && maker.resolveID(typeface, original->typeface) == false) | |
219 return true; | |
220 return false; // succeeded | |
221 } | |
222 | |
223 void SkDrawPaint::setupPaint(SkPaint* paint) const { | |
224 if (antiAlias != -1) | |
225 paint->setAntiAlias(SkToBool(antiAlias)); | |
226 if (color != NULL) | |
227 paint->setColor(color->getColor()); | |
228 if (fakeBold != -1) | |
229 paint->setFakeBoldText(SkToBool(fakeBold)); | |
230 if (filterBitmap != -1) | |
231 paint->setFilterBitmap(SkToBool(filterBitmap)); | |
232 // stroke is legacy; style setting if present overrides stroke | |
233 if (stroke != -1) | |
234 paint->setStyle(SkToBool(stroke) ? SkPaint::kStroke_Style : SkPaint::kFi
ll_Style); | |
235 if (style != (SkPaint::Style) -1) | |
236 paint->setStyle((SkPaint::Style) style); | |
237 if (linearText != -1) | |
238 paint->setLinearText(SkToBool(linearText)); | |
239 if (maskFilter == NULL) | |
240 paint->setMaskFilter(NULL); | |
241 else if (maskFilter != (SkDrawMaskFilter*) -1) | |
242 paint->setMaskFilter(maskFilter->getMaskFilter())->safeUnref(); | |
243 if (pathEffect == NULL) | |
244 paint->setPathEffect(NULL); | |
245 else if (pathEffect != (SkDrawPathEffect*) -1) | |
246 paint->setPathEffect(pathEffect->getPathEffect())->safeUnref(); | |
247 if (shader == NULL) | |
248 paint->setShader(NULL); | |
249 else if (shader != (SkDrawShader*) -1) | |
250 paint->setShader(shader->getShader())->safeUnref(); | |
251 if (strikeThru != -1) | |
252 paint->setStrikeThruText(SkToBool(strikeThru)); | |
253 if (strokeCap != (SkPaint::Cap) -1) | |
254 paint->setStrokeCap((SkPaint::Cap) strokeCap); | |
255 if (strokeJoin != (SkPaint::Join) -1) | |
256 paint->setStrokeJoin((SkPaint::Join) strokeJoin); | |
257 if (SkScalarIsNaN(strokeMiter) == false) | |
258 paint->setStrokeMiter(strokeMiter); | |
259 if (SkScalarIsNaN(strokeWidth) == false) | |
260 paint->setStrokeWidth(strokeWidth); | |
261 if (textAlign != (SkPaint::Align) -1) | |
262 paint->setTextAlign((SkPaint::Align) textAlign); | |
263 if (SkScalarIsNaN(textScaleX) == false) | |
264 paint->setTextScaleX(textScaleX); | |
265 if (SkScalarIsNaN(textSize) == false) | |
266 paint->setTextSize(textSize); | |
267 if (SkScalarIsNaN(textSkewX) == false) | |
268 paint->setTextSkewX(textSkewX); | |
269 if (typeface == NULL) | |
270 paint->setTypeface(NULL); | |
271 else if (typeface != (SkDrawTypeface*) -1) | |
272 paint->setTypeface(typeface->getTypeface())->safeUnref(); | |
273 if (underline != -1) | |
274 paint->setUnderlineText(SkToBool(underline)); | |
275 if (xfermode != (SkPorterDuff::Mode) -1) | |
276 paint->setPorterDuffXfermode((SkPorterDuff::Mode) xfermode); | |
277 } | |
OLD | NEW |