1cb93a386Sopenharmony_ci/*
2cb93a386Sopenharmony_ci * Copyright 2010 The Android Open Source Project
3cb93a386Sopenharmony_ci *
4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be
5cb93a386Sopenharmony_ci * found in the LICENSE file.
6cb93a386Sopenharmony_ci */
7cb93a386Sopenharmony_ci
8cb93a386Sopenharmony_ci
9cb93a386Sopenharmony_ci#include "include/core/SkMath.h"
10cb93a386Sopenharmony_ci#include "include/core/SkScalar.h"
11cb93a386Sopenharmony_ci
12cb93a386Sopenharmony_ciSkScalar SkScalarInterpFunc(SkScalar searchKey, const SkScalar keys[],
13cb93a386Sopenharmony_ci                            const SkScalar values[], int length) {
14cb93a386Sopenharmony_ci    SkASSERT(length > 0);
15cb93a386Sopenharmony_ci    SkASSERT(keys != nullptr);
16cb93a386Sopenharmony_ci    SkASSERT(values != nullptr);
17cb93a386Sopenharmony_ci#ifdef SK_DEBUG
18cb93a386Sopenharmony_ci    for (int i = 1; i < length; i++) {
19cb93a386Sopenharmony_ci        SkASSERT(keys[i-1] <= keys[i]);
20cb93a386Sopenharmony_ci    }
21cb93a386Sopenharmony_ci#endif
22cb93a386Sopenharmony_ci    int right = 0;
23cb93a386Sopenharmony_ci    while (right < length && keys[right] < searchKey) {
24cb93a386Sopenharmony_ci        ++right;
25cb93a386Sopenharmony_ci    }
26cb93a386Sopenharmony_ci    // Could use sentinel values to eliminate conditionals, but since the
27cb93a386Sopenharmony_ci    // tables are taken as input, a simpler format is better.
28cb93a386Sopenharmony_ci    if (right == length) {
29cb93a386Sopenharmony_ci        return values[length-1];
30cb93a386Sopenharmony_ci    }
31cb93a386Sopenharmony_ci    if (right == 0) {
32cb93a386Sopenharmony_ci        return values[0];
33cb93a386Sopenharmony_ci    }
34cb93a386Sopenharmony_ci    // Otherwise, interpolate between right - 1 and right.
35cb93a386Sopenharmony_ci    SkScalar leftKey = keys[right-1];
36cb93a386Sopenharmony_ci    SkScalar rightKey = keys[right];
37cb93a386Sopenharmony_ci    SkScalar fract = (searchKey - leftKey) / (rightKey - leftKey);
38cb93a386Sopenharmony_ci    return SkScalarInterp(values[right-1], values[right], fract);
39cb93a386Sopenharmony_ci}
40