void SkDisplayString::executeFunction(SkDisplayable* target, int index, SkTDArray<SkScriptValue>& parameters, SkDisplayTypes type, SkScriptValue* scriptValue) { if (scriptValue == nullptr) return; SkASSERT(target == this); switch (index) { case SK_FUNCTION(slice): scriptValue->fType = SkType_String; SkASSERT(parameters[0].fType == SkType_Int); int start = parameters[0].fOperand.fS32; if (start < 0) start = (int) (value.size() - start); int end = (int) value.size(); if (parameters.count() > 1) { SkASSERT(parameters[1].fType == SkType_Int); end = parameters[1].fOperand.fS32; } //if (end >= 0 && end < (int) value.size()) if (end >= 0 && end <= (int) value.size()) scriptValue->fOperand.fString = new SkString(&value.c_str()[start], end - start); else scriptValue->fOperand.fString = new SkString(value); break; } }
void SkDrawPaint::executeFunction(SkDisplayable* target, int index, SkTDArray<SkScriptValue>& parameters, SkDisplayTypes type, SkScriptValue* scriptValue) { if (scriptValue == NULL) return; SkASSERT(target == this); switch (index) { case SK_FUNCTION(measureText): { SkASSERT(parameters.count() == 1); SkASSERT(type == SkType_Float); SkPaint paint; setupPaint(&paint); scriptValue->fType = SkType_Float; SkASSERT(parameters[0].fType == SkType_String); scriptValue->fOperand.fScalar = paint.measureText(parameters[0].fOperand.fString->c_str(), parameters[0].fOperand.fString->size()); // SkDebugf("measureText: %s = %g\n", parameters[0].fOperand.fString->c_str(), // scriptValue->fOperand.fScalar / 65536.0f); } break; default: SkASSERT(0); } }
* Copyright 2006 The Android Open Source Project * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "SkDrawPaint.h" #include "SkAnimateMaker.h" #include "SkDrawColor.h" #include "SkDrawShader.h" #include "SkMaskFilter.h" #include "SkPaintPart.h" #include "SkPathEffect.h" enum SkPaint_Functions { SK_FUNCTION(measureText) }; enum SkPaint_Properties { SK_PROPERTY(ascent), SK_PROPERTY(descent) }; // !!! in the future, this could be compiled by build-condensed-info into an array of parameters // with a lookup table to find the first parameter -- for now, it is iteratively searched through const SkFunctionParamType SkDrawPaint::fFunctionParameters[] = { (SkFunctionParamType) SkType_String, (SkFunctionParamType) 0 // terminator for parameter list (there may be multiple parameter lists) };
void SkDisplayMath::executeFunction(SkDisplayable* target, int index, SkTDArray<SkScriptValue>& parameters, SkDisplayTypes type, SkScriptValue* scriptValue) { if (scriptValue == NULL) return; SkASSERT(target == this); SkScriptValue* array = parameters.begin(); SkScriptValue* end = parameters.end(); SkScalar input = parameters[0].fOperand.fScalar; SkScalar scalarResult; switch (index) { case SK_FUNCTION(abs): scalarResult = SkScalarAbs(input); break; case SK_FUNCTION(acos): scalarResult = SkScalarACos(input); break; case SK_FUNCTION(asin): scalarResult = SkScalarASin(input); break; case SK_FUNCTION(atan): scalarResult = SkScalarATan2(input, SK_Scalar1); break; case SK_FUNCTION(atan2): scalarResult = SkScalarATan2(input, parameters[1].fOperand.fScalar); break; case SK_FUNCTION(ceil): scalarResult = SkIntToScalar(SkScalarCeil(input)); break; case SK_FUNCTION(cos): scalarResult = SkScalarCos(input); break; case SK_FUNCTION(exp): scalarResult = SkScalarExp(input); break; case SK_FUNCTION(floor): scalarResult = SkIntToScalar(SkScalarFloor(input)); break; case SK_FUNCTION(log): scalarResult = SkScalarLog(input); break; case SK_FUNCTION(max): scalarResult = -SK_ScalarMax; while (array < end) { scalarResult = SkMaxScalar(scalarResult, array->fOperand.fScalar); array++; } break; case SK_FUNCTION(min): scalarResult = SK_ScalarMax; while (array < end) { scalarResult = SkMinScalar(scalarResult, array->fOperand.fScalar); array++; } break; case SK_FUNCTION(pow): // not the greatest -- but use x^y = e^(y * ln(x)) scalarResult = SkScalarLog(input); scalarResult = SkScalarMul(parameters[1].fOperand.fScalar, scalarResult); scalarResult = SkScalarExp(scalarResult); break; case SK_FUNCTION(random): scalarResult = fRandom.nextUScalar1(); break; case SK_FUNCTION(round): scalarResult = SkIntToScalar(SkScalarRound(input)); break; case SK_FUNCTION(sin): scalarResult = SkScalarSin(input); break; case SK_FUNCTION(sqrt): { SkASSERT(parameters.count() == 1); SkASSERT(type == SkType_Float); scalarResult = SkScalarSqrt(input); } break; case SK_FUNCTION(tan): scalarResult = SkScalarTan(input); break; default: SkASSERT(0); scalarResult = SK_ScalarNaN; } scriptValue->fOperand.fScalar = scalarResult; scriptValue->fType = SkType_Float; }
0.707106781f, // SQRT1_2 1.414213562f // SQRT2 #else 0x2B7E1, // E 0x24D76, // LN10 0xB172, // LN2 0x6F2E, // LOG10E 0x17154, // LOG2E 0x3243F, // PI 0xB505, // SQRT1_2 0x16A0A // SQRT2 #endif }; enum SkDisplayMath_Functions { SK_FUNCTION(abs), SK_FUNCTION(acos), SK_FUNCTION(asin), SK_FUNCTION(atan), SK_FUNCTION(atan2), SK_FUNCTION(ceil), SK_FUNCTION(cos), SK_FUNCTION(exp), SK_FUNCTION(floor), SK_FUNCTION(log), SK_FUNCTION(max), SK_FUNCTION(min), SK_FUNCTION(pow), SK_FUNCTION(random), SK_FUNCTION(round), SK_FUNCTION(sin),
DEFINE_GET_MEMBER(SkDisplayFloat); SkDisplayFloat::SkDisplayFloat() : value(0) { } #ifdef SK_DUMP_ENABLED void SkDisplayFloat::dump(SkAnimateMaker* maker) { dumpBase(maker); SkDebugf("value=\"%g\" />\n", SkScalarToFloat(value)); } #endif // SkString enum SkDisplayString_Functions { SK_FUNCTION(slice) }; enum SkDisplayString_Properties { SK_PROPERTY(length) }; const SkFunctionParamType SkDisplayString::fFunctionParameters[] = { (SkFunctionParamType) SkType_Int, // slice (SkFunctionParamType) SkType_Int, (SkFunctionParamType) 0 }; #if SK_USE_CONDENSED_INFO == 0 const SkMemberInfo SkDisplayString::fInfo[] = {