| 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 |