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