/* * Copyright 2015 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "include/core/SkPoint3.h" #include "include/private/base/SkFloatingPoint.h" #include <cmath> // Returns the square of the Euclidian distance to (x,y,z). static inline float get_length_squared(float x, float y, float z) { … } // Calculates the square of the Euclidian distance to (x,y,z) and stores it in // *lengthSquared. Returns true if the distance is judged to be "nearly zero". // // This logic is encapsulated in a helper method to make it explicit that we // always perform this check in the same manner, to avoid inconsistencies // (see http://code.google.com/p/skia/issues/detail?id=560 ). static inline bool is_length_nearly_zero(float x, float y, float z, float *lengthSquared) { … } SkScalar SkPoint3::Length(SkScalar x, SkScalar y, SkScalar z) { … } /* * We have to worry about 2 tricky conditions: * 1. underflow of magSq (compared against nearlyzero^2) * 2. overflow of magSq (compared w/ isfinite) * * If we underflow, we return false. If we overflow, we compute again using * doubles, which is much slower (3x in a desktop test) but will not overflow. */ bool SkPoint3::normalize() { … }