SkInterpolatorBase::Result SkOperandInterpolator::timeToValues(SkMSec time, SkOperand values[]) const { SkScalar T; int index; SkBool exact; Result result = timeToT(time, &T, &index, &exact); if (values) { const SkOperand* nextSrc = &fValues[index * fElemCount]; if (exact) memcpy(values, nextSrc, fElemCount * sizeof(SkScalar)); else { SkASSERT(index > 0); const SkOperand* prevSrc = nextSrc - fElemCount; if (fType == SkType_Float || fType == SkType_3D_Point) { for (int i = fElemCount - 1; i >= 0; --i) values[i].fScalar = SkScalarInterp(prevSrc[i].fScalar, nextSrc[i].fScalar, T); } else if (fType == SkType_Int || fType == SkType_MSec) { for (int i = fElemCount - 1; i >= 0; --i) { int32_t a = prevSrc[i].fS32; int32_t b = nextSrc[i].fS32; values[i].fS32 = a + SkScalarRound((b - a) * T); } } else memcpy(values, prevSrc, sizeof(SkOperand) * fElemCount); } } return result; }
SkInterpolator::Result SkInterpolator::timeToValues(SkMSec time, SkScalar values[]) const { SkScalar T; int index; SkBool exact; Result result = timeToT(time, &T, &index, &exact); if (values) { const SkScalar* nextSrc = &fValues[index * fElemCount]; if (exact) { memcpy(values, nextSrc, fElemCount * sizeof(SkScalar)); } else { SkASSERT(index > 0); const SkScalar* prevSrc = nextSrc - fElemCount; for (int i = fElemCount - 1; i >= 0; --i) { values[i] = SkScalarInterp(prevSrc[i], nextSrc[i], T); } } } return result; }