Skip to content

Commit 2993c7b

Browse files
authored
Merge pull request #11 from ararslan/aa/nanmath
Add dependency on NaNMath for IEEE min/max
2 parents 615dbd4 + b9e593d commit 2993c7b

2 files changed

Lines changed: 18 additions & 25 deletions

File tree

REQUIRE

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
julia 0.4
22
Colors
33
Compat 0.17.0
4+
NaNMath 0.2.4

src/Graphics.jl

Lines changed: 17 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ module Graphics
55
import Base: +, -, *, /, &, fill, norm
66
using Colors
77
using Compat
8+
using NaNMath
89

910
if isdefined(Base, :scale)
1011
import Base: scale
@@ -56,15 +57,6 @@ export
5657
# TODO: rendering pipeline API
5758

5859

59-
# Utilities
60-
61-
# IEEE754 compliant min/max (prefers value over quiet NaN)
62-
nanmin(x, y) = ifelse((y < x) | (signbit(y) > signbit(x)),
63-
ifelse(isnan(y), x, y), ifelse(isnan(x), y, x))
64-
nanmax(x, y) = ifelse((y > x) | (signbit(y) < signbit(x)),
65-
ifelse(isnan(y), x, y), ifelse(isnan(x), y, x))
66-
67-
6860
# Part 1. geometric primitives
6961

7062
immutable Vec2
@@ -103,21 +95,21 @@ BoundingBox() = BoundingBox(NaN, NaN, NaN, NaN)
10395
function BoundingBox(p0::Point, points::Point...)
10496
xmin, xmax, ymin, ymax = p0.x, p0.x, p0.y, p0.y
10597
for p in points
106-
xmin = nanmin(xmin, p.x)
107-
xmax = nanmax(xmax, p.x)
108-
ymin = nanmin(ymin, p.y)
109-
ymax = nanmax(ymax, p.y)
98+
xmin = NaNMath.min(xmin, p.x)
99+
xmax = NaNMath.max(xmax, p.x)
100+
ymin = NaNMath.min(ymin, p.y)
101+
ymax = NaNMath.max(ymax, p.y)
110102
end
111103
return BoundingBox(xmin, xmax, ymin, ymax)
112104
end
113105

114106
function BoundingBox(bb0::BoundingBox, bboxes::BoundingBox...)
115107
xmin, xmax, ymin, ymax = bb0.xmin, bb0.xmax, bb0.ymin, bb0.ymax
116108
for bb in bboxes
117-
xmin = nanmin(xmin, bb.xmin)
118-
xmax = nanmax(xmax, bb.xmax)
119-
ymin = nanmin(ymin, bb.ymin)
120-
ymax = nanmax(ymax, bb.ymax)
109+
xmin = NaNMath.min(xmin, bb.xmin)
110+
xmax = NaNMath.max(xmax, bb.xmax)
111+
ymin = NaNMath.min(ymin, bb.ymin)
112+
ymax = NaNMath.max(ymax, bb.ymax)
121113
end
122114
return BoundingBox(xmin, xmax, ymin, ymax)
123115
end
@@ -137,17 +129,17 @@ xrange(x) = xmin(x), xmax(x)
137129
yrange(x) = ymin(x), ymax(x)
138130

139131
function (+)(bb1::BoundingBox, bb2::BoundingBox)
140-
BoundingBox(nanmin(bb1.xmin, bb2.xmin),
141-
nanmax(bb1.xmax, bb2.xmax),
142-
nanmin(bb1.ymin, bb2.ymin),
143-
nanmax(bb1.ymax, bb2.ymax))
132+
BoundingBox(NaNMath.min(bb1.xmin, bb2.xmin),
133+
NaNMath.max(bb1.xmax, bb2.xmax),
134+
NaNMath.min(bb1.ymin, bb2.ymin),
135+
NaNMath.max(bb1.ymax, bb2.ymax))
144136
end
145137

146138
function (&)(bb1::BoundingBox, bb2::BoundingBox)
147-
BoundingBox(nanmax(bb1.xmin, bb2.xmin),
148-
nanmin(bb1.xmax, bb2.xmax),
149-
nanmax(bb1.ymin, bb2.ymin),
150-
nanmin(bb1.ymax, bb2.ymax))
139+
BoundingBox(NaNMath.max(bb1.xmin, bb2.xmin),
140+
NaNMath.min(bb1.xmax, bb2.xmax),
141+
NaNMath.max(bb1.ymin, bb2.ymin),
142+
NaNMath.min(bb1.ymax, bb2.ymax))
151143
end
152144

153145
function deform(bb::BoundingBox, dl, dr, dt, db)

0 commit comments

Comments
 (0)