Skip to content

Commit bd3db5b

Browse files
authored
fixes fdiff for FixedPoint types (#21)
1 parent 12a7795 commit bd3db5b

File tree

3 files changed

+18
-2
lines changed

3 files changed

+18
-2
lines changed

src/ImageBase.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ using Reexport
2626
using Base.Cartesian: @nloops
2727
@reexport using ImageCore
2828
using ImageCore.OffsetArrays
29+
using ImageCore.MappedArrays: of_eltype
2930

3031
include("diff.jl")
3132
include("restrict.jl")

src/diff.jl

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ julia> fdiff(A, dims=2, boundary=:zero) # fill boundary with zeros
5353
5454
See also [`fdiff!`](@ref) for the in-place version.
5555
"""
56-
fdiff(A::AbstractArray; kwargs...) = fdiff!(similar(A), A; kwargs...)
56+
fdiff(A::AbstractArray; kwargs...) = fdiff!(similar(A, maybe_floattype(eltype(A))), A; kwargs...)
5757

5858
"""
5959
fdiff!(dst::AbstractArray, src::AbstractArray; dims::Int, rev=false, boundary=:periodic)
@@ -69,6 +69,7 @@ function fdiff!(dst::AbstractArray, src::AbstractArray;
6969
N = ndims(src)
7070
1 <= dims <= N || throw(ArgumentError("dimension $dims out of range (1:$N)"))
7171

72+
src = of_eltype(maybe_floattype(eltype(dst)), src)
7273
r = axes(src)
7374
r0 = ntuple(i -> i == dims ? UnitRange(first(r[i]), last(r[i]) - 1) : UnitRange(r[i]), N)
7475
r1 = ntuple(i -> i == dims ? UnitRange(first(r[i])+1, last(r[i])) : UnitRange(r[i]), N)
@@ -101,3 +102,7 @@ end
101102

102103
_fdiff_default_dims(A) = nothing
103104
_fdiff_default_dims(A::AbstractVector) = 1
105+
106+
maybe_floattype(::Type{T}) where T = T
107+
maybe_floattype(::Type{T}) where T<:FixedPoint = floattype(T)
108+
maybe_floattype(::Type{CT}) where CT<:Color = base_color_type(CT){maybe_floattype(eltype(CT))}

test/diff.jl

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
@testset "fdiff" begin
2+
# Base.diff doesn't promote integer to float
3+
@test ImageBase.maybe_floattype(Int) == Int
4+
@test ImageBase.maybe_floattype(N0f8) == Float32
5+
@test ImageBase.maybe_floattype(RGB{N0f8}) == RGB{Float32}
6+
27
@testset "API" begin
38
# fdiff! works the same as fdiff
49
mat_in = rand(3, 3, 3)
@@ -71,7 +76,7 @@
7176
sz = ntuple(_->5, N)
7277
A = rand(sz...)
7378
A_out = similar(A)
74-
79+
7580
for dims = 1:N
7681
out_base = diff(A; dims=dims)
7782
out = fdiff(A; dims=dims)
@@ -96,4 +101,9 @@
96101
@test axes(A_out) == (0:2, 0:2)
97102
@test A_out.parent == fdiff(parent(A), dims=1, rev=true)
98103
end
104+
105+
@testset "FixedPoint" begin
106+
A = rand(N0f8, 6, 6)
107+
@test fdiff(A, dims=1) == fdiff(float.(A), dims=1)
108+
end
99109
end

0 commit comments

Comments
 (0)