static void Interpolator_setKeyFrame(JNIEnv* env, jobject clazz, jlong interpHandle, jint index, jint msec, jfloatArray valueArray, jfloatArray blendArray) { SkInterpolator* interp = reinterpret_cast<SkInterpolator*>(interpHandle); SkScalar blendStorage[4]; SkScalar* blend = NULL; AutoJavaFloatArray autoValues(env, valueArray); float* values = autoValues.ptr(); int i, n = autoValues.length(); SkAutoSTMalloc<16, SkScalar> storage(n); SkScalar* scalars = storage.get(); for (i = 0; i < n; i++) scalars[i] = SkFloatToScalar(values[i]); if (blendArray != NULL) { AutoJavaFloatArray autoBlend(env, blendArray, 4); values = autoBlend.ptr(); for (i = 0; i < 4; i++) blendStorage[i] = SkFloatToScalar(values[i]); blend = blendStorage; } interp->setKeyFrame(index, msec, scalars, blend); }
static void Interpolator_setRepeatMirror(JNIEnv* env, jobject clazz, jlong interpHandle, jfloat repeatCount, jboolean mirror) { SkInterpolator* interp = reinterpret_cast<SkInterpolator*>(interpHandle); if (repeatCount > 32000) repeatCount = 32000; interp->setRepeatCount(SkFloatToScalar(repeatCount)); interp->setMirror(mirror != 0); }
void onDraw(SkCanvas* canvas) override { SkAutoCanvasRestore acr(canvas, false); SkPaint paint; paint.setAntiAlias(true); if (fInterp) { SkScalar values[5]; SkInterpolator::Result res = fInterp->timeToValues(fTime, values); fColor = floats_to_color(values); canvas->save(); canvas->rotate(values[4], fR.centerX(), fR.centerY()); switch (res) { case SkInterpolator::kFreezeEnd_Result: delete fInterp; fInterp = nullptr; break; default: break; } } paint.setColor(fColor); canvas->drawRect(fR, paint); }
static jint Interpolator_timeToValues(JNIEnv* env, jobject clazz, jlong interpHandle, jint msec, jfloatArray valueArray) { SkInterpolator* interp = reinterpret_cast<SkInterpolator*>(interpHandle); SkInterpolatorBase::Result result; float* values = valueArray ? env->GetFloatArrayElements(valueArray, NULL) : NULL; result = interp->timeToValues(msec, (SkScalar*)values); if (valueArray) { int n = env->GetArrayLength(valueArray); for (int i = 0; i < n; i++) { values[i] = SkScalarToFloat(*(SkScalar*)&values[i]); } env->ReleaseFloatArrayElements(valueArray, values, 0); } return static_cast<jint>(result); }
FilterQualityView() : fImage(make_image()), fTrans(2, 2), fShowFatBits(true) { fCell.set(256, 256); fScale.set(1, SK_Scalar1 / 8, 1); fAngle.setMod(0, 360); SkScalar values[2]; fTrans.setMirror(true); fTrans.setReset(true); fCurrTime = 0; fTrans.setRepeatCount(999); values[0] = values[1] = 0; fTrans.setKeyFrame(0, fCurrTime, values); values[0] = values[1] = 1; fTrans.setKeyFrame(1, fCurrTime + 2000, values); }
void spawnAnimation(SkMSec now) { this->setTime(now); delete fInterp; fInterp = new SkInterpolator(5, 3); SkScalar values[5]; color_to_floats(fColor, values); values[4] = 0; fInterp->setKeyFrame(0, now, values); values[0] = 0; values[4] = 180; fInterp->setKeyFrame(1, now + 1000, values); color_to_floats(rand_opaque_color(fColor), values); values[4] = 360; fInterp->setKeyFrame(2, now + 2000, values); fInterp->setMirror(true); fInterp->setRepeatCount(3); this->notifyDrawingChanged(); }
void onDrawContent(SkCanvas* canvas) override { fCell.set(this->height() / 2, this->height() / 2); SkScalar trans[2]; fTrans.timeToValues(fCurrTime, trans); for (int y = 0; y < 2; ++y) { for (int x = 0; x < 2; ++x) { int index = y * 2 + x; SkAutoCanvasRestore acr(canvas, true); canvas->translate(fCell.width() * x, fCell.height() * y); SkRect r = SkRect::MakeWH(fCell.width(), fCell.height()); r.inset(4, 4); canvas->clipRect(r); this->drawHere(canvas, SkFilterQuality(index), trans[0], trans[1]); } } this->drawBorders(canvas); const SkScalar textX = fCell.width() * 2 + 30; SkPaint paint; paint.setAntiAlias(true); paint.setTextSize(36); SkString str; str.appendScalar(fScale); canvas->drawText(str.c_str(), str.size(), textX, 100, paint); str.reset(); str.appendScalar(fAngle); canvas->drawText(str.c_str(), str.size(), textX, 150, paint); str.reset(); str.appendScalar(trans[0]); canvas->drawText(str.c_str(), str.size(), textX, 200, paint); str.reset(); str.appendScalar(trans[1]); canvas->drawText(str.c_str(), str.size(), textX, 250, paint); }
static void Interpolator_reset(JNIEnv* env, jobject clazz, jlong interpHandle, jint valueCount, jint frameCount) { SkInterpolator* interp = reinterpret_cast<SkInterpolator*>(interpHandle); interp->reset(valueCount, frameCount); }