1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/skia/trunk/src/animator/SkDrawPaint.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,269 @@ 1.4 + 1.5 +/* 1.6 + * Copyright 2006 The Android Open Source Project 1.7 + * 1.8 + * Use of this source code is governed by a BSD-style license that can be 1.9 + * found in the LICENSE file. 1.10 + */ 1.11 + 1.12 + 1.13 +#include "SkDrawPaint.h" 1.14 +#include "SkAnimateMaker.h" 1.15 +#include "SkDrawColor.h" 1.16 +#include "SkDrawShader.h" 1.17 +#include "SkMaskFilter.h" 1.18 +#include "SkPaintParts.h" 1.19 +#include "SkPathEffect.h" 1.20 + 1.21 +enum SkPaint_Functions { 1.22 + SK_FUNCTION(measureText) 1.23 +}; 1.24 + 1.25 +enum SkPaint_Properties { 1.26 + SK_PROPERTY(ascent), 1.27 + SK_PROPERTY(descent) 1.28 +}; 1.29 + 1.30 +// !!! in the future, this could be compiled by build-condensed-info into an array of parameters 1.31 +// with a lookup table to find the first parameter -- for now, it is iteratively searched through 1.32 +const SkFunctionParamType SkDrawPaint::fFunctionParameters[] = { 1.33 + (SkFunctionParamType) SkType_String, 1.34 + (SkFunctionParamType) 0 // terminator for parameter list (there may be multiple parameter lists) 1.35 +}; 1.36 + 1.37 + 1.38 +#if SK_USE_CONDENSED_INFO == 0 1.39 + 1.40 +const SkMemberInfo SkDrawPaint::fInfo[] = { 1.41 + SK_MEMBER(antiAlias, Boolean), 1.42 + SK_MEMBER_PROPERTY(ascent, Float), 1.43 + SK_MEMBER(color, Color), 1.44 + SK_MEMBER_PROPERTY(descent, Float), 1.45 + SK_MEMBER(fakeBold, Boolean), 1.46 + SK_MEMBER(filterBitmap, Boolean), 1.47 + SK_MEMBER(linearText, Boolean), 1.48 + SK_MEMBER(maskFilter, MaskFilter), 1.49 + SK_MEMBER_FUNCTION(measureText, Float), 1.50 + SK_MEMBER(pathEffect, PathEffect), 1.51 + SK_MEMBER(shader, Shader), 1.52 + SK_MEMBER(strikeThru, Boolean), 1.53 + SK_MEMBER(stroke, Boolean), 1.54 + SK_MEMBER(strokeCap, Cap), 1.55 + SK_MEMBER(strokeJoin, Join), 1.56 + SK_MEMBER(strokeMiter, Float), 1.57 + SK_MEMBER(strokeWidth, Float), 1.58 + SK_MEMBER(style, Style), 1.59 + SK_MEMBER(textAlign, Align), 1.60 + SK_MEMBER(textScaleX, Float), 1.61 + SK_MEMBER(textSize, Float), 1.62 + SK_MEMBER(textSkewX, Float), 1.63 + SK_MEMBER(typeface, Typeface), 1.64 + SK_MEMBER(underline, Boolean), 1.65 + SK_MEMBER(xfermode, Xfermode) 1.66 +}; 1.67 + 1.68 +#endif 1.69 + 1.70 +DEFINE_GET_MEMBER(SkDrawPaint); 1.71 + 1.72 +SkDrawPaint::SkDrawPaint() : antiAlias(-1), color(NULL), fakeBold(-1), filterBitmap(-1), 1.73 + linearText(-1), maskFilter((SkDrawMaskFilter*) -1), pathEffect((SkDrawPathEffect*) -1), 1.74 + shader((SkDrawShader*) -1), strikeThru(-1), stroke(-1), 1.75 + strokeCap((SkPaint::Cap) -1), strokeJoin((SkPaint::Join) -1), strokeMiter(SK_ScalarNaN), 1.76 + strokeWidth(SK_ScalarNaN), style((SkPaint::Style) -1), 1.77 + textAlign((SkPaint::Align) -1), textScaleX(SK_ScalarNaN), textSize(SK_ScalarNaN), 1.78 + textSkewX(SK_ScalarNaN), typeface((SkDrawTypeface*) -1), 1.79 + underline(-1), xfermode((SkXfermode::Mode) -1), fOwnsColor(false), fOwnsMaskFilter(false), 1.80 + fOwnsPathEffect(false), fOwnsShader(false), fOwnsTypeface(false) { 1.81 +} 1.82 + 1.83 +SkDrawPaint::~SkDrawPaint() { 1.84 + if (fOwnsColor) 1.85 + delete color; 1.86 + if (fOwnsMaskFilter) 1.87 + delete maskFilter; 1.88 + if (fOwnsPathEffect) 1.89 + delete pathEffect; 1.90 + if (fOwnsShader) 1.91 + delete shader; 1.92 + if (fOwnsTypeface) 1.93 + delete typeface; 1.94 +} 1.95 + 1.96 +bool SkDrawPaint::add(SkAnimateMaker* maker, SkDisplayable* child) { 1.97 + SkASSERT(child && child->isPaintPart()); 1.98 + SkPaintPart* part = (SkPaintPart*) child; 1.99 + if (part->add() && maker) 1.100 + maker->setErrorCode(SkDisplayXMLParserError::kErrorAddingToPaint); 1.101 + return true; 1.102 +} 1.103 + 1.104 +SkDisplayable* SkDrawPaint::deepCopy(SkAnimateMaker* maker) { 1.105 + SkDrawColor* tempColor = color; 1.106 + color = NULL; 1.107 + SkDrawPaint* copy = (SkDrawPaint*) INHERITED::deepCopy(maker); 1.108 + color = tempColor; 1.109 + tempColor = (SkDrawColor*) color->deepCopy(maker); 1.110 + tempColor->setParent(copy); 1.111 + tempColor->add(); 1.112 + copy->fOwnsColor = true; 1.113 + return copy; 1.114 +} 1.115 + 1.116 +bool SkDrawPaint::draw(SkAnimateMaker& maker) { 1.117 + SkPaint* paint = maker.fPaint; 1.118 + setupPaint(paint); 1.119 + return false; 1.120 +} 1.121 + 1.122 +#ifdef SK_DUMP_ENABLED 1.123 +void SkDrawPaint::dump(SkAnimateMaker* maker) { 1.124 + dumpBase(maker); 1.125 + dumpAttrs(maker); 1.126 + bool closedYet = false; 1.127 + SkDisplayList::fIndent +=4; 1.128 + //should i say if (maskFilter && ...? 1.129 + if (maskFilter != (SkDrawMaskFilter*)-1) { 1.130 + SkDebugf(">\n"); 1.131 + maskFilter->dump(maker); 1.132 + closedYet = true; 1.133 + } 1.134 + if (pathEffect != (SkDrawPathEffect*) -1) { 1.135 + if (closedYet == false) { 1.136 + SkDebugf(">\n"); 1.137 + closedYet = true; 1.138 + } 1.139 + pathEffect->dump(maker); 1.140 + } 1.141 + if (fOwnsTypeface) { 1.142 + if (closedYet == false) { 1.143 + SkDebugf(">\n"); 1.144 + closedYet = true; 1.145 + } 1.146 + typeface->dump(maker); 1.147 + } 1.148 + SkDisplayList::fIndent -= 4; 1.149 + dumpChildren(maker, closedYet); 1.150 +} 1.151 +#endif 1.152 + 1.153 +void SkDrawPaint::executeFunction(SkDisplayable* target, int index, 1.154 + SkTDArray<SkScriptValue>& parameters, SkDisplayTypes type, 1.155 + SkScriptValue* scriptValue) { 1.156 + if (scriptValue == NULL) 1.157 + return; 1.158 + SkASSERT(target == this); 1.159 + switch (index) { 1.160 + case SK_FUNCTION(measureText): { 1.161 + SkASSERT(parameters.count() == 1); 1.162 + SkASSERT(type == SkType_Float); 1.163 + SkPaint paint; 1.164 + setupPaint(&paint); 1.165 + scriptValue->fType = SkType_Float; 1.166 + SkASSERT(parameters[0].fType == SkType_String); 1.167 + scriptValue->fOperand.fScalar = paint.measureText(parameters[0].fOperand.fString->c_str(), 1.168 + parameters[0].fOperand.fString->size()); 1.169 +// SkDebugf("measureText: %s = %g\n", parameters[0].fOperand.fString->c_str(), 1.170 +// scriptValue->fOperand.fScalar / 65536.0f); 1.171 + } break; 1.172 + default: 1.173 + SkASSERT(0); 1.174 + } 1.175 +} 1.176 + 1.177 +const SkFunctionParamType* SkDrawPaint::getFunctionsParameters() { 1.178 + return fFunctionParameters; 1.179 +} 1.180 + 1.181 +bool SkDrawPaint::getProperty(int index, SkScriptValue* value) const { 1.182 + SkPaint::FontMetrics metrics; 1.183 + SkPaint paint; 1.184 + setupPaint(&paint); 1.185 + paint.getFontMetrics(&metrics); 1.186 + switch (index) { 1.187 + case SK_PROPERTY(ascent): 1.188 + value->fOperand.fScalar = metrics.fAscent; 1.189 + break; 1.190 + case SK_PROPERTY(descent): 1.191 + value->fOperand.fScalar = metrics.fDescent; 1.192 + break; 1.193 + // should consider returning fLeading as well (or roll it into ascent/descent somehow 1.194 + default: 1.195 + SkASSERT(0); 1.196 + return false; 1.197 + } 1.198 + value->fType = SkType_Float; 1.199 + return true; 1.200 +} 1.201 + 1.202 +bool SkDrawPaint::resolveIDs(SkAnimateMaker& maker, SkDisplayable* origDisp, SkApply* ) { 1.203 + SkASSERT(origDisp->isPaint()); 1.204 + SkDrawPaint* original = (SkDrawPaint*) origDisp; 1.205 + if (fOwnsColor && maker.resolveID(color, original->color) == false) 1.206 + return true; 1.207 + if (fOwnsMaskFilter && maker.resolveID(maskFilter, original->maskFilter) == false) 1.208 + return true; 1.209 + if (fOwnsPathEffect && maker.resolveID(pathEffect, original->pathEffect) == false) 1.210 + return true; 1.211 + if (fOwnsShader && maker.resolveID(shader, original->shader) == false) 1.212 + return true; 1.213 + if (fOwnsTypeface && maker.resolveID(typeface, original->typeface) == false) 1.214 + return true; 1.215 + return false; // succeeded 1.216 +} 1.217 + 1.218 +void SkDrawPaint::setupPaint(SkPaint* paint) const { 1.219 + if (antiAlias != -1) 1.220 + paint->setAntiAlias(SkToBool(antiAlias)); 1.221 + if (color != NULL) 1.222 + paint->setColor(color->getColor()); 1.223 + if (fakeBold != -1) 1.224 + paint->setFakeBoldText(SkToBool(fakeBold)); 1.225 + if (filterBitmap != -1) 1.226 + paint->setFilterLevel(filterBitmap ? SkPaint::kLow_FilterLevel : SkPaint::kNone_FilterLevel); 1.227 + // stroke is legacy; style setting if present overrides stroke 1.228 + if (stroke != -1) 1.229 + paint->setStyle(SkToBool(stroke) ? SkPaint::kStroke_Style : SkPaint::kFill_Style); 1.230 + if (style != -1) 1.231 + paint->setStyle((SkPaint::Style) style); 1.232 + if (linearText != -1) 1.233 + paint->setLinearText(SkToBool(linearText)); 1.234 + if (maskFilter == NULL) 1.235 + paint->setMaskFilter(NULL); 1.236 + else if (maskFilter != (SkDrawMaskFilter*) -1) 1.237 + SkSafeUnref(paint->setMaskFilter(maskFilter->getMaskFilter())); 1.238 + if (pathEffect == NULL) 1.239 + paint->setPathEffect(NULL); 1.240 + else if (pathEffect != (SkDrawPathEffect*) -1) 1.241 + SkSafeUnref(paint->setPathEffect(pathEffect->getPathEffect())); 1.242 + if (shader == NULL) 1.243 + paint->setShader(NULL); 1.244 + else if (shader != (SkDrawShader*) -1) 1.245 + SkSafeUnref(paint->setShader(shader->getShader())); 1.246 + if (strikeThru != -1) 1.247 + paint->setStrikeThruText(SkToBool(strikeThru)); 1.248 + if (strokeCap != -1) 1.249 + paint->setStrokeCap((SkPaint::Cap) strokeCap); 1.250 + if (strokeJoin != -1) 1.251 + paint->setStrokeJoin((SkPaint::Join) strokeJoin); 1.252 + if (SkScalarIsNaN(strokeMiter) == false) 1.253 + paint->setStrokeMiter(strokeMiter); 1.254 + if (SkScalarIsNaN(strokeWidth) == false) 1.255 + paint->setStrokeWidth(strokeWidth); 1.256 + if (textAlign != -1) 1.257 + paint->setTextAlign((SkPaint::Align) textAlign); 1.258 + if (SkScalarIsNaN(textScaleX) == false) 1.259 + paint->setTextScaleX(textScaleX); 1.260 + if (SkScalarIsNaN(textSize) == false) 1.261 + paint->setTextSize(textSize); 1.262 + if (SkScalarIsNaN(textSkewX) == false) 1.263 + paint->setTextSkewX(textSkewX); 1.264 + if (typeface == NULL) 1.265 + paint->setTypeface(NULL); 1.266 + else if (typeface != (SkDrawTypeface*) -1) 1.267 + SkSafeUnref(paint->setTypeface(typeface->getTypeface())); 1.268 + if (underline != -1) 1.269 + paint->setUnderlineText(SkToBool(underline)); 1.270 + if (xfermode != -1) 1.271 + paint->setXfermodeMode((SkXfermode::Mode) xfermode); 1.272 +}