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