1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
228be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2010 The Android Open Source Project
428be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
8ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
928be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org
10c12e1b138e736f70d698f14a3ffc74af6f3d8621tomhudson@google.com#include "SkMath.h"
1128be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org#include "SkScalar.h"
1228be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org
1328be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.orgSkScalar SkScalarInterpFunc(SkScalar searchKey, const SkScalar keys[],
1428be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org                            const SkScalar values[], int length) {
1528be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org    SkASSERT(length > 0);
1628be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org    SkASSERT(keys != NULL);
1728be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org    SkASSERT(values != NULL);
1828be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org#ifdef SK_DEBUG
1928be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org    for (int i = 1; i < length; i++)
2028be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org        SkASSERT(keys[i] >= keys[i-1]);
2128be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org#endif
2228be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org    int right = 0;
2328be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org    while (right < length && searchKey > keys[right])
2428be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org        right++;
2528be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org    // Could use sentinel values to eliminate conditionals, but since the
2628be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org    // tables are taken as input, a simpler format is better.
2728be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org    if (length == right)
2828be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org        return values[length-1];
2928be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org    if (0 == right)
3028be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org        return values[0];
3128be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org    // Otherwise, interpolate between right - 1 and right.
3228be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org    SkScalar rightKey = keys[right];
3328be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org    SkScalar leftKey = keys[right-1];
3428be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org    SkScalar fract = SkScalarDiv(searchKey-leftKey,rightKey-leftKey);
3528be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org    return SkScalarInterp(values[right-1], values[right], fract);
3628be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org}
37