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