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