1 2 /* 3 * Copyright 2006 The Android Open Source Project 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 10 #ifndef SkFDot6_DEFINED 11 #define SkFDot6_DEFINED 12 13 #include "SkScalar.h" 14 #include "SkMath.h" 15 16 typedef int32_t SkFDot6; 17 18 #define SK_FDot6One (64) 19 #define SK_FDot6Half (32) 20 21 #ifdef SK_DEBUG 22 inline SkFDot6 SkIntToFDot6(S16CPU x) { 23 SkASSERT(SkToS16(x) == x); 24 return x << 6; 25 } 26 #else 27 #define SkIntToFDot6(x) ((x) << 6) 28 #endif 29 30 #define SkFDot6Floor(x) ((x) >> 6) 31 #define SkFDot6Ceil(x) (((x) + 63) >> 6) 32 #define SkFDot6Round(x) (((x) + 32) >> 6) 33 34 #define SkFixedToFDot6(x) ((x) >> 10) 35 36 inline SkFixed SkFDot6ToFixed(SkFDot6 x) { 37 SkASSERT((x << 10 >> 10) == x); 38 39 return x << 10; 40 } 41 42 #ifdef SK_SCALAR_IS_FLOAT 43 #define SkScalarToFDot6(x) (SkFDot6)((x) * 64) 44 #define SkFDot6ToScalar(x) ((SkScalar)(x) * 0.015625f) 45 #else 46 #define SkScalarToFDot6(x) ((x) >> 10) 47 #define SkFDot6ToScalar(x) ((x) << 10) 48 #endif 49 50 inline SkFixed SkFDot6Div(SkFDot6 a, SkFDot6 b) { 51 SkASSERT(b != 0); 52 53 if (a == (int16_t)a) { 54 return (a << 16) / b; 55 } else { 56 return SkFixedDiv(a, b); 57 } 58 } 59 60 #endif 61