205d46067a
Review URL: http://codereview.appspot.com/4449047/ git-svn-id: http://skia.googlecode.com/svn/trunk@1169 2bbb7eff-a529-9590-31e7-b0007b416f81
127 lines
3.6 KiB
C
127 lines
3.6 KiB
C
/*
|
|
Copyright 2010 Google Inc.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
|
|
#ifndef GrScalar_DEFINED
|
|
#define GrScalar_DEFINED
|
|
|
|
#include "GrTypes.h"
|
|
|
|
#include <float.h>
|
|
#include <math.h>
|
|
|
|
#define GR_Int32Max (0x7fffffff)
|
|
#define GR_Int32Min (0x80000000)
|
|
|
|
/**
|
|
* Convert an int to fixed point
|
|
*/
|
|
#if GR_DEBUG
|
|
inline GrFixed GrIntToFixed(int i) {
|
|
GrAssert(((i & 0xffff0000) == 0xffff0000) || ((i & 0xffff0000) == 0x0));
|
|
return i << 16;
|
|
}
|
|
#else
|
|
#define GrIntToFixed(i) (GrFixed)((i) << 16)
|
|
#endif
|
|
|
|
#define GR_Fixed1 (1 << 16)
|
|
#define GR_FixedHalf (1 << 15)
|
|
#define GR_FixedMax GR_Int32Max
|
|
#define GR_FixedMin GR_Int32Min
|
|
|
|
#define GrFixedFloorToFixed(x) ((x) & ~0xFFFF)
|
|
#define GrFixedFloorToInt(x) ((x) >> 16)
|
|
|
|
/**
|
|
* Convert fixed point to floating point
|
|
*/
|
|
#define GrFixedToFloat(x) ((x) * 0.0000152587890625f)
|
|
|
|
/**
|
|
* Convert floating point to fixed point
|
|
*/
|
|
#define GrFloatToFixed(x) ((GrFixed)((x) * GR_Fixed1))
|
|
|
|
static inline GrFixed GrFixedAbs(GrFixed x) {
|
|
int32_t s = (x & 0x80000000) >> 31;
|
|
return (GrFixed)(((int32_t)x ^ s) - s);
|
|
}
|
|
|
|
static inline bool GrFixedIsInt(GrFixed x) {
|
|
return 0 == (x & 0xffff);
|
|
}
|
|
|
|
static inline bool GrFloatIsInt(float x) {
|
|
return x == (float)(int)x;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
#if GR_SCALAR_IS_FIXED
|
|
typedef GrFixed GrScalar;
|
|
#define GrIntToScalar(x) GrIntToFixed(x)
|
|
#define GrFixedToScalar(x) (x)
|
|
#define GrScalarToFloat(x) GrFixedToFloat(x)
|
|
#define GrFloatToScalar(x) GrFloatToFixed(x)
|
|
#define GrScalarHalf(x) ((x) >> 1)
|
|
#define GrScalarAve(x,y) (((x)+(y)) >> 1)
|
|
#define GrScalarAbs(x) GrFixedAbs(x)
|
|
#define GrScalarIsInt GrFixedIsInt
|
|
#define GR_Scalar1 GR_Fixed1
|
|
#define GR_ScalarHalf GR_FixedHalf
|
|
#define GR_ScalarMax GR_FixedMax
|
|
#define GR_ScalarMin GR_FixedMin
|
|
#elif GR_SCALAR_IS_FLOAT
|
|
typedef float GrScalar;
|
|
#define GrIntToScalar(x) ((GrScalar)x)
|
|
#define GrFixedToScalar(x) GrFixedToFloat(x)
|
|
#define GrScalarToFloat(x) (x)
|
|
#define GrFloatToScalar(x) (x)
|
|
#define GrScalarHalf(x) ((x) * 0.5f)
|
|
#define GrScalarAbs(x) fabsf(x)
|
|
#define GrScalarAve(x,y) (((x) + (y)) * 0.5f)
|
|
#define GrScalarIsInt GrFloatIsInt
|
|
#define GR_Scalar1 1.f
|
|
#define GR_ScalarHalf 0.5f
|
|
#define GR_ScalarMax (FLT_MAX)
|
|
#define GR_ScalarMin (-FLT_MAX)
|
|
|
|
static inline int32_t GrScalarFloorToInt(float x) {
|
|
return (int32_t)::floorf(x);
|
|
}
|
|
static inline int32_t GrScalarCeilToInt(float x) {
|
|
return (int32_t)::ceilf(x);
|
|
}
|
|
#else
|
|
#error "Scalar type not defined"
|
|
#endif
|
|
|
|
/**
|
|
* Multiply two GrScalar values
|
|
*/
|
|
static inline GrScalar GrMul(GrScalar a, GrScalar b) {
|
|
#if GR_SCALAR_IS_FLOAT
|
|
return a * b;
|
|
#else
|
|
int64_t tmp = (int64_t)a * b;
|
|
return (tmp + GR_FixedHalf) >> 16;
|
|
#endif
|
|
}
|
|
|
|
#endif
|
|
|