• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 array 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 multiple 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 
SkDrawPaint()77 SkDrawPaint::SkDrawPaint() : antiAlias(-1), color(NULL), fakeBold(-1), filterBitmap(-1),
78     linearText(-1), maskFilter((SkDrawMaskFilter*) -1), pathEffect((SkDrawPathEffect*) -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_ScalarNaN),
83     textSkewX(SK_ScalarNaN), typeface((SkDrawTypeface*) -1),
84     underline(-1), xfermode((SkXfermode::Mode) -1), fOwnsColor(false), fOwnsMaskFilter(false),
85     fOwnsPathEffect(false), fOwnsShader(false), fOwnsTypeface(false) {
86 }
87 
~SkDrawPaint()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 
add(SkAnimateMaker & maker,SkDisplayable * child)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 
deepCopy(SkAnimateMaker * maker)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 
draw(SkAnimateMaker & maker)121 bool SkDrawPaint::draw(SkAnimateMaker& maker) {
122     SkPaint* paint = maker.fPaint;
123     setupPaint(paint);
124     return false;
125 }
126 
127 #ifdef SK_DUMP_ENABLED
dump(SkAnimateMaker * maker)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 
executeFunction(SkDisplayable * target,int index,SkTDArray<SkScriptValue> & parameters,SkDisplayTypes type,SkScriptValue * scriptValue)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].fOperand.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 
getFunctionsParameters()182 const SkFunctionParamType* SkDrawPaint::getFunctionsParameters() {
183     return fFunctionParameters;
184 }
185 
getProperty(int index,SkScriptValue * value) const186 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/descent somehow
199         default:
200             SkASSERT(0);
201             return false;
202     }
203     value->fType = SkType_Float;
204     return true;
205 }
206 
resolveIDs(SkAnimateMaker & maker,SkDisplayable * origDisp,SkApply *)207 bool SkDrawPaint::resolveIDs(SkAnimateMaker& maker, SkDisplayable* origDisp, SkApply* ) {
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 
setupPaint(SkPaint * paint) const223 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::kFill_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 != (SkXfermode::Mode) -1)
276         paint->setXfermode((SkXfermode::Mode) xfermode);
277 }
278