1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2006 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#ifndef SkMath_DEFINED 9cb93a386Sopenharmony_ci#define SkMath_DEFINED 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_ci#include "include/core/SkTypes.h" 12cb93a386Sopenharmony_ci 13cb93a386Sopenharmony_ci// 64bit -> 32bit utilities 14cb93a386Sopenharmony_ci 15cb93a386Sopenharmony_ci// Handy util that can be passed two ints, and will automatically promote to 16cb93a386Sopenharmony_ci// 64bits before the multiply, so the caller doesn't have to remember to cast 17cb93a386Sopenharmony_ci// e.g. (int64_t)a * b; 18cb93a386Sopenharmony_cistatic inline int64_t sk_64_mul(int64_t a, int64_t b) { 19cb93a386Sopenharmony_ci return a * b; 20cb93a386Sopenharmony_ci} 21cb93a386Sopenharmony_ci 22cb93a386Sopenharmony_ci/////////////////////////////////////////////////////////////////////////////// 23cb93a386Sopenharmony_ci 24cb93a386Sopenharmony_ci/** 25cb93a386Sopenharmony_ci * Returns true if value is a power of 2. Does not explicitly check for 26cb93a386Sopenharmony_ci * value <= 0. 27cb93a386Sopenharmony_ci */ 28cb93a386Sopenharmony_citemplate <typename T> constexpr inline bool SkIsPow2(T value) { 29cb93a386Sopenharmony_ci return (value & (value - 1)) == 0; 30cb93a386Sopenharmony_ci} 31cb93a386Sopenharmony_ci 32cb93a386Sopenharmony_ci/////////////////////////////////////////////////////////////////////////////// 33cb93a386Sopenharmony_ci 34cb93a386Sopenharmony_ci/** 35cb93a386Sopenharmony_ci * Return a*b/((1 << shift) - 1), rounding any fractional bits. 36cb93a386Sopenharmony_ci * Only valid if a and b are unsigned and <= 32767 and shift is > 0 and <= 8 37cb93a386Sopenharmony_ci */ 38cb93a386Sopenharmony_cistatic inline unsigned SkMul16ShiftRound(U16CPU a, U16CPU b, int shift) { 39cb93a386Sopenharmony_ci SkASSERT(a <= 32767); 40cb93a386Sopenharmony_ci SkASSERT(b <= 32767); 41cb93a386Sopenharmony_ci SkASSERT(shift > 0 && shift <= 8); 42cb93a386Sopenharmony_ci unsigned prod = a*b + (1 << (shift - 1)); 43cb93a386Sopenharmony_ci return (prod + (prod >> shift)) >> shift; 44cb93a386Sopenharmony_ci} 45cb93a386Sopenharmony_ci 46cb93a386Sopenharmony_ci/** 47cb93a386Sopenharmony_ci * Return a*b/255, rounding any fractional bits. 48cb93a386Sopenharmony_ci * Only valid if a and b are unsigned and <= 32767. 49cb93a386Sopenharmony_ci */ 50cb93a386Sopenharmony_cistatic inline U8CPU SkMulDiv255Round(U16CPU a, U16CPU b) { 51cb93a386Sopenharmony_ci return SkMul16ShiftRound(a,b,8); 52cb93a386Sopenharmony_ci} 53cb93a386Sopenharmony_ci 54cb93a386Sopenharmony_ci#endif 55