skia2/include/private
mtklein 785a5b941a Clean up SkFloatBits
- remove dead code
- rewrite float -> int converters

The strategy for the new converters is:
   - convert input to double
   - floor/ceil/round in double space
   - pin that double to [SK_MinS32, SK_MaxS32]
   - truncate that double to int32_t

This simpler strategy does not work:
   - floor/ceil/round in float space
   - pin that float to [SK_MinS32, SK_MaxS32]
   - truncate that float to int32_t

SK_MinS32 and SK_MaxS32 are not representable as floats:
they round to the nearest float, ±2^31, which makes the
pin insufficient for floats near SK_MinS32 (-2^31+1) or
SK_MaxS32 (+2^31-1).

float only has 24 bits of precision, and we need 31.
double can represent all integers up to 50-something bits.

An alternative is to pin in float to ±2147483520, the last
exactly representable float before SK_MaxS32 (127 too small).

Our tests test that we round as floor(x+0.5), which can
return different numbers than round(x) for negative x.
So this CL explicitly uses floor(x+0.5).

I've updated the tests with ±inf and ±NaN, and tried to
make them a little clearer, especially using SK_MinS32
instead of -SK_MaxS32.

I have not timed anything here.  I have never seen any of these
methods in a profile.

BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2012333003

Review-Url: https://codereview.chromium.org/2012333003
2016-05-27 10:47:32 -07:00
..
GrAuditTrail.h Fix up GrAuditTrail to allow arbitrary reordering 2016-03-08 10:43:42 -08:00
GrRenderTargetProxy.h Add Gr*Proxy classes 2016-05-04 12:47:41 -07:00
GrSingleOwner.h Reland of Make a single GrSingleOwner in GrContext (patchset #1 id:1 of https://codereview.chromium.org/1565303003/ ) 2016-01-08 10:09:13 -08:00
GrSurfaceProxy.h Add Gr*Proxy classes 2016-05-04 12:47:41 -07:00
GrTextureProxy.h Add Gr*Proxy classes 2016-05-04 12:47:41 -07:00
SkAtomics.h Convert SkRefCnt to std::atomic. 2016-04-08 06:58:52 -07:00
SkChecksum.h Switch uses of SkChecksum::Compute to Murmur3. 2015-11-16 11:16:23 -08:00
SkFixed.h Remove Sk(Float|Double)PinToFixed functions, only used in tests. 2016-05-06 11:45:55 -07:00
SkFloatBits.h Clean up SkFloatBits 2016-05-27 10:47:32 -07:00
SkFloatingPoint.h Add SkScalarTruncToScalar and speed up SkScalarFraction. 2016-03-10 13:39:30 -08:00
SkGpuFenceSync.h Implement vulkan fence syncs for nanobench 2016-05-16 14:09:56 -07:00
SkImageInfoPriv.h SkDefaultColorProfile: Hide gDefaultProfileIsSRGB 2016-04-25 10:32:23 -07:00
SkMiniRecorder.h return pictures as sk_sp 2016-03-18 07:25:55 -07:00
SkMutex.h Modernize SkMutex and SkSemaphore. 2016-05-05 10:57:37 -07:00
SkOnce.h Simplify implementation of SkOnce to not need so many comments. 2016-05-04 13:57:30 -07:00
SkRecords.h Move annotations to canvas virtual (patchset #8 id:140001 of https://codereview.chromium.org/1744103002/ )" 2016-03-04 16:36:20 -08:00
SkSemaphore.h Modernize SkMutex and SkSemaphore. 2016-05-05 10:57:37 -07:00
SkSpinlock.h Add reminders that these classes have constexpr default constructors. 2016-04-29 13:58:18 -07:00
SkTArray.h Fix indentation and casts in SkTArray. 2016-04-21 10:52:03 -07:00
SkTDArray.h detach -> release 2016-03-16 13:53:35 -07:00
SkTDict.h move SkTDict and SkTSearch into private 2016-01-03 18:36:05 -08:00
SkTemplates.h Remove transitional explicit operator bool. 2016-03-21 09:35:33 -07:00
SkTFitsIn.h Templatize SkToXXX. 2016-03-19 15:06:56 -07:00
SkTHash.h SkTHash: hash from fnptr to functor type 2015-10-15 12:23:02 -07:00
SkThreadID.h Unify ThreadID. 2015-09-29 14:38:01 -07:00
SkTLogic.h Remove skstd::is_function. 2016-04-29 08:27:14 -07:00
SkTSearch.h move SkTDict and SkTSearch into private 2016-01-03 18:36:05 -08:00
SkWeakRefCnt.h Convert SkRefCnt to std::atomic. 2016-04-08 06:58:52 -07:00