1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 228be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2010 The Android Open Source Project 428be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 8ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 928be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org 10c12e1b138e736f70d698f14a3ffc74af6f3d8621tomhudson@google.com#include "SkMath.h" 1128be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org#include "SkScalar.h" 1228be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org 1328be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.orgSkScalar SkScalarInterpFunc(SkScalar searchKey, const SkScalar keys[], 1428be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org const SkScalar values[], int length) { 1528be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org SkASSERT(length > 0); 1628be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org SkASSERT(keys != NULL); 1728be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org SkASSERT(values != NULL); 1828be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org#ifdef SK_DEBUG 1928be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org for (int i = 1; i < length; i++) 2028be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org SkASSERT(keys[i] >= keys[i-1]); 2128be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org#endif 2228be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org int right = 0; 2328be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org while (right < length && searchKey > keys[right]) 2428be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org right++; 2528be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org // Could use sentinel values to eliminate conditionals, but since the 2628be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org // tables are taken as input, a simpler format is better. 2728be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org if (length == right) 2828be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org return values[length-1]; 2928be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org if (0 == right) 3028be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org return values[0]; 3128be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org // Otherwise, interpolate between right - 1 and right. 3228be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org SkScalar rightKey = keys[right]; 3328be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org SkScalar leftKey = keys[right-1]; 3428be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org SkScalar fract = SkScalarDiv(searchKey-leftKey,rightKey-leftKey); 3528be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org return SkScalarInterp(values[right-1], values[right], fract); 3628be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org} 37