Home | History | Annotate | Download | only in core
      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