Revert of For *ToFixed, in debug mode, assert that the value is in range. (patchset #6 id:140001 of https://codereview.chromium.org/1824733002/ )
Reason for revert: Asserts in Blink rolls: https://storage.googleapis.com/chromium-layout-test-archives/linux_blink_rel/84520/layout-test-results/results.html STDERR: [1:1:0407/120919:1455366829:INFO:SkFixed.h(88)] ../../third_party/skia/include/private/SkFixed.h:88: fatal error: ""truncf(x * (1 << 16)) == static_cast<float> Original issue's description: > For *ToFixed, in debug mode, assert that the value is in range. > > Use SkFloatPinToFixed in SkTwoPointConicalGradient.cpp because it is failing in DM. fmalita is working on replacing this code with the 4f version, so I'm not bothering to fix it. (The beginnings of a real fix are in https://codereview.chromium.org/1767163003, which I do not plan to commit.) > > BUG=skia:4632 > GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1824733002 > > Committed: https://skia.googlesource.com/skia/+/93dc33972cd6a418e84270298b856d2de08d9c1c TBR=mtklein@google.com,reed@google.com,benjaminwagner@google.com # Skipping CQ checks because original CL landed less than 1 days ago. NOPRESUBMIT=true NOTREECHECKS=true NOTRY=true BUG=skia:4632 Review URL: https://codereview.chromium.org/1868933004
This commit is contained in:
parent
e2e71c2df4
commit
e7365065ac
@ -31,63 +31,7 @@ typedef int32_t SkFixed;
|
||||
#define SK_FixedRoot2Over2 (0xB505)
|
||||
|
||||
#define SkFixedToFloat(x) ((x) * 1.52587890625e-5f)
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// ASM alternatives for our portable versions.
|
||||
|
||||
#if defined(SK_CPU_ARM32)
|
||||
/* This guy does not handle NaN or other obscurities, but is faster than
|
||||
than (int)(x*65536). When built on Android with -Os, needs forcing
|
||||
to inline or we lose the speed benefit.
|
||||
*/
|
||||
SK_ALWAYS_INLINE SkFixed SkFloatToFixed_arm(float x)
|
||||
{
|
||||
int32_t y, z;
|
||||
asm("movs %1, %3, lsl #1 \n"
|
||||
"mov %2, #0x8E \n"
|
||||
"sub %1, %2, %1, lsr #24 \n"
|
||||
"mov %2, %3, lsl #8 \n"
|
||||
"orr %2, %2, #0x80000000 \n"
|
||||
"mov %1, %2, lsr %1 \n"
|
||||
"it cs \n"
|
||||
"rsbcs %1, %1, #0 \n"
|
||||
: "=r"(x), "=&r"(y), "=&r"(z)
|
||||
: "r"(x)
|
||||
: "cc"
|
||||
);
|
||||
return y;
|
||||
}
|
||||
inline SkFixed SkFixedMul_arm(SkFixed x, SkFixed y)
|
||||
{
|
||||
int32_t t;
|
||||
asm("smull %0, %2, %1, %3 \n"
|
||||
"mov %0, %0, lsr #16 \n"
|
||||
"orr %0, %0, %2, lsl #16 \n"
|
||||
: "=r"(x), "=&r"(y), "=r"(t)
|
||||
: "r"(x), "1"(y)
|
||||
:
|
||||
);
|
||||
return x;
|
||||
}
|
||||
|
||||
#define SkFixedMul(x, y) SkFixedMul_arm(x, y)
|
||||
#define SkFloatToFixed_Unsafe(x) SkFloatToFixed_arm(x)
|
||||
#else
|
||||
inline SkFixed SkFixedMul_longlong(SkFixed a, SkFixed b) {
|
||||
return (SkFixed)((int64_t)a * b >> 16);
|
||||
}
|
||||
|
||||
#define SkFixedMul(x, y) SkFixedMul_longlong(x, y)
|
||||
#define SkFloatToFixed_Unsafe(x) ((SkFixed)((x) * SK_Fixed1))
|
||||
#endif
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
static inline SkFixed SkFloatToFixed(float x) {
|
||||
const SkFixed result = SkFloatToFixed_Unsafe(x);
|
||||
SkASSERT(truncf(x * SK_Fixed1) == static_cast<float>(result));
|
||||
return result;
|
||||
}
|
||||
#define SkFloatToFixed(x) ((SkFixed)((x) * SK_Fixed1))
|
||||
|
||||
// Pins over/under flows to SK_FixedMax/SK_FixedMin (slower than just a cast).
|
||||
static inline SkFixed SkFloatPinToFixed(float x) {
|
||||
@ -100,14 +44,19 @@ static inline SkFixed SkFloatPinToFixed(float x) {
|
||||
return result;
|
||||
}
|
||||
|
||||
#define SkFixedToDouble(x) ((x) * 1.52587890625e-5)
|
||||
#define SkDoubleToFixed_Unsafe(x) ((SkFixed)((x) * SK_Fixed1))
|
||||
#ifdef SK_DEBUG
|
||||
static inline SkFixed SkFloatToFixed_Check(float x) {
|
||||
int64_t n64 = (int64_t)(x * SK_Fixed1);
|
||||
SkFixed n32 = (SkFixed)n64;
|
||||
SkASSERT(n64 == n32);
|
||||
return n32;
|
||||
}
|
||||
#else
|
||||
#define SkFloatToFixed_Check(x) SkFloatToFixed(x)
|
||||
#endif
|
||||
|
||||
static inline SkFixed SkDoubleToFixed(double x) {
|
||||
const SkFixed result = SkDoubleToFixed_Unsafe(x);
|
||||
SkASSERT(trunc(x * SK_Fixed1) == static_cast<double>(result));
|
||||
return result;
|
||||
}
|
||||
#define SkFixedToDouble(x) ((x) * 1.52587890625e-5)
|
||||
#define SkDoubleToFixed(x) ((SkFixed)((x) * SK_Fixed1))
|
||||
|
||||
// Pins over/under flows to SK_FixedMax/SK_FixedMin (slower than just a cast).
|
||||
static inline SkFixed SkDoublePinToFixed(double x) {
|
||||
@ -158,6 +107,56 @@ static inline SkFixed SkDoublePinToFixed(double x) {
|
||||
SkToS32(SkTPin<int64_t>((SkLeftShift((int64_t)numer, 16) / denom), SK_MinS32, SK_MaxS32))
|
||||
#endif
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Now look for ASM overrides for our portable versions (should consider putting this in its own file)
|
||||
|
||||
inline SkFixed SkFixedMul_longlong(SkFixed a, SkFixed b) {
|
||||
return (SkFixed)((int64_t)a * b >> 16);
|
||||
}
|
||||
#define SkFixedMul(a,b) SkFixedMul_longlong(a,b)
|
||||
|
||||
|
||||
#if defined(SK_CPU_ARM32)
|
||||
/* This guy does not handle NaN or other obscurities, but is faster than
|
||||
than (int)(x*65536). When built on Android with -Os, needs forcing
|
||||
to inline or we lose the speed benefit.
|
||||
*/
|
||||
SK_ALWAYS_INLINE SkFixed SkFloatToFixed_arm(float x)
|
||||
{
|
||||
int32_t y, z;
|
||||
asm("movs %1, %3, lsl #1 \n"
|
||||
"mov %2, #0x8E \n"
|
||||
"sub %1, %2, %1, lsr #24 \n"
|
||||
"mov %2, %3, lsl #8 \n"
|
||||
"orr %2, %2, #0x80000000 \n"
|
||||
"mov %1, %2, lsr %1 \n"
|
||||
"it cs \n"
|
||||
"rsbcs %1, %1, #0 \n"
|
||||
: "=r"(x), "=&r"(y), "=&r"(z)
|
||||
: "r"(x)
|
||||
: "cc"
|
||||
);
|
||||
return y;
|
||||
}
|
||||
inline SkFixed SkFixedMul_arm(SkFixed x, SkFixed y)
|
||||
{
|
||||
int32_t t;
|
||||
asm("smull %0, %2, %1, %3 \n"
|
||||
"mov %0, %0, lsr #16 \n"
|
||||
"orr %0, %0, %2, lsl #16 \n"
|
||||
: "=r"(x), "=&r"(y), "=r"(t)
|
||||
: "r"(x), "1"(y)
|
||||
:
|
||||
);
|
||||
return x;
|
||||
}
|
||||
#undef SkFixedMul
|
||||
#define SkFixedMul(x, y) SkFixedMul_arm(x, y)
|
||||
|
||||
#undef SkFloatToFixed
|
||||
#define SkFloatToFixed(x) SkFloatToFixed_arm(x)
|
||||
#endif
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#if SK_SCALAR_IS_FLOAT
|
||||
@ -178,18 +177,11 @@ static inline SkFixed SkDoublePinToFixed(double x) {
|
||||
|
||||
typedef int64_t SkFixed3232; // 32.32
|
||||
|
||||
#define SK_Fixed3232_1 (static_cast<SkFixed3232>(1) << 32)
|
||||
#define SkIntToFixed3232(x) (SkLeftShift((SkFixed3232)(x), 32))
|
||||
#define SkFixed3232ToInt(x) ((int)((x) >> 32))
|
||||
#define SkFixedToFixed3232(x) (SkLeftShift((SkFixed3232)(x), 16))
|
||||
#define SkFixed3232ToFixed(x) ((SkFixed)((x) >> 16))
|
||||
#define SkFloatToFixed3232_Unsafe(x) (static_cast<SkFixed3232>((x) * SK_Fixed3232_1))
|
||||
|
||||
static inline SkFixed3232 SkFloatToFixed3232(float x) {
|
||||
const SkFixed3232 result = SkFloatToFixed3232_Unsafe(x);
|
||||
SkASSERT(truncf(x * SK_Fixed3232_1) == static_cast<float>(result));
|
||||
return result;
|
||||
}
|
||||
#define SkIntToFixed3232(x) (SkLeftShift((SkFixed3232)(x), 32))
|
||||
#define SkFixed3232ToInt(x) ((int)((x) >> 32))
|
||||
#define SkFixedToFixed3232(x) (SkLeftShift((SkFixed3232)(x), 16))
|
||||
#define SkFixed3232ToFixed(x) ((SkFixed)((x) >> 16))
|
||||
#define SkFloatToFixed3232(x) ((SkFixed3232)((x) * (65536.0f * 65536.0f)))
|
||||
|
||||
#define SkScalarToFixed3232(x) SkFloatToFixed3232(x)
|
||||
|
||||
|
@ -93,7 +93,7 @@ static inline void XRect_set(SkXRect* xr, const SkIRect& src) {
|
||||
}
|
||||
|
||||
/** Assign an SkXRect from a SkRect, by promoting the src rect's coordinates
|
||||
from SkScalar to SkFixed. Behavior is undefined if the src coordinates
|
||||
from SkScalar to SkFixed. Does not check for overflow if the src coordinates
|
||||
exceed 32K
|
||||
*/
|
||||
static inline void XRect_set(SkXRect* xr, const SkRect& src) {
|
||||
|
@ -129,7 +129,7 @@ SkFixed TwoPtRadialContext::nextT() {
|
||||
return TwoPtRadial::kDontDrawT;
|
||||
}
|
||||
}
|
||||
return SkFloatPinToFixed(t);
|
||||
return SkFloatToFixed(t);
|
||||
}
|
||||
|
||||
typedef void (*TwoPointConicalProc)(TwoPtRadialContext* rec, SkPMColor* dstC,
|
||||
|
Loading…
Reference in New Issue
Block a user