michael@0: michael@0: /* michael@0: * Copyright 2010 The Android Open Source Project michael@0: * michael@0: * Use of this source code is governed by a BSD-style license that can be michael@0: * found in the LICENSE file. michael@0: */ michael@0: michael@0: michael@0: #include "SkMath.h" michael@0: #include "SkScalar.h" michael@0: michael@0: SkScalar SkScalarInterpFunc(SkScalar searchKey, const SkScalar keys[], michael@0: const SkScalar values[], int length) { michael@0: SkASSERT(length > 0); michael@0: SkASSERT(keys != NULL); michael@0: SkASSERT(values != NULL); michael@0: #ifdef SK_DEBUG michael@0: for (int i = 1; i < length; i++) michael@0: SkASSERT(keys[i] >= keys[i-1]); michael@0: #endif michael@0: int right = 0; michael@0: while (right < length && searchKey > keys[right]) michael@0: right++; michael@0: // Could use sentinel values to eliminate conditionals, but since the michael@0: // tables are taken as input, a simpler format is better. michael@0: if (length == right) michael@0: return values[length-1]; michael@0: if (0 == right) michael@0: return values[0]; michael@0: // Otherwise, interpolate between right - 1 and right. michael@0: SkScalar rightKey = keys[right]; michael@0: SkScalar leftKey = keys[right-1]; michael@0: SkScalar fract = SkScalarDiv(searchKey-leftKey,rightKey-leftKey); michael@0: return SkScalarInterp(values[right-1], values[right], fract); michael@0: }