11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2010 The Android Open Source Project
440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkMath.h"
1140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger#include "SkScalar.h"
1240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
1340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek SollenbergerSkScalar SkScalarInterpFunc(SkScalar searchKey, const SkScalar keys[],
1440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger                            const SkScalar values[], int length) {
1540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    SkASSERT(length > 0);
1640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    SkASSERT(keys != NULL);
1740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    SkASSERT(values != NULL);
1840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger#ifdef SK_DEBUG
1940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    for (int i = 1; i < length; i++)
2040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger        SkASSERT(keys[i] >= keys[i-1]);
2140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger#endif
2240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    int right = 0;
2340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    while (right < length && searchKey > keys[right])
2440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger        right++;
2540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    // Could use sentinel values to eliminate conditionals, but since the
2640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    // tables are taken as input, a simpler format is better.
2740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    if (length == right)
2840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger        return values[length-1];
2940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    if (0 == right)
3040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger        return values[0];
3140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    // Otherwise, interpolate between right - 1 and right.
3240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    SkScalar rightKey = keys[right];
3340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    SkScalar leftKey = keys[right-1];
3440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    SkScalar fract = SkScalarDiv(searchKey-leftKey,rightKey-leftKey);
3540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    return SkScalarInterp(values[right-1], values[right], fract);
3640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger}
37