Skip to content

Commit 81c9ada

Browse files
authored
Add support for hadamard() for TransparentGray/TransparentRGB (#162)
1 parent bd8f1a2 commit 81c9ada

File tree

2 files changed

+44
-11
lines changed

2 files changed

+44
-11
lines changed

src/ColorVectorSpace.jl

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -187,10 +187,12 @@ copy(c::MathTypes) = c
187187
(/)(c::MathTypes, f::Integer) = (one(eltype(c))/f)*c
188188
abs(c::MathTypes) = mapc(abs, c)
189189
norm(c::MathTypes, p::Real=2) = (cc = channels(c); norm(cc, p)/(p == 0 ? length(cc) : length(cc)^(1/p)))
190+
()(a::C, b::C) where {C<:MathTypes} = mapc(*, a, b)
190191

191192
## Mixed types
192193
(+)(a::MathTypes, b::MathTypes) = (+)(promote(a, b)...)
193194
(-)(a::MathTypes, b::MathTypes) = (-)(promote(a, b)...)
195+
()(a::MathTypes, b::MathTypes) = ()(promote(a, b)...)
194196

195197

196198
# Scalar RGB
@@ -220,8 +222,6 @@ end
220222
# New multiplication operators
221223
()(x::AbstractRGB, y::AbstractRGB) = (T = acctype(eltype(x), eltype(y)); T(red(x))*T(red(y)) + T(green(x))*T(green(y)) + T(blue(x))*T(blue(y)))/3
222224
()(x::Union{AbstractRGB,AbstractGray}, y::Union{AbstractRGB,AbstractGray}) = (promote(x, y)...)
223-
()(x::C, y::C) where C<:AbstractRGB = base_color_type(C)(red(x)*red(y), green(x)*green(y), blue(x)*blue(y))
224-
()(x::Union{AbstractRGB,AbstractGray}, y::Union{AbstractRGB,AbstractGray}) = (promote(x, y)...)
225225
# ⊗ defined below
226226

227227

@@ -278,9 +278,7 @@ middle(x::C, y::C) where {C<:AbstractGray} = arith_colorant_type(C)(middle(gray(
278278
(-)(a::Number, b::AbstractGray) = base_color_type(b)(a-gray(b))
279279

280280
()(x::AbstractGray, y::AbstractGray) = gray(x)*gray(y)
281-
()(x::C, y::C) where C<:AbstractGray = base_color_type(C)(gray(x)*gray(y))
282-
()(x::AbstractGray, y::AbstractGray) = (promote(x, y)...)
283-
()(x::AbstractGray, y::AbstractGray) = (x, y)
281+
()(x::AbstractGray, y::AbstractGray) = x y
284282

285283
max(a::T, b::T) where {T<:AbstractGray} = T(max(gray(a),gray(b)))
286284
max(a::AbstractGray, b::AbstractGray) = max(promote(a,b)...)
@@ -304,7 +302,7 @@ if !hasmethod(isless, Tuple{AbstractGray,Real}) # planned for ColorTypes 0.11
304302
isless(r::Real, c::AbstractGray) = isless(r, gray(c))
305303
end
306304

307-
dotc(x::T, y::T) where {T<:AbstractGray} = acc(gray(x))*acc(gray(y))
305+
dotc(x::C, y::C) where {C<:AbstractGray} = acc(gray(x))*acc(gray(y))
308306
dotc(x::AbstractGray, y::AbstractGray) = dotc(promote(x, y)...)
309307

310308
typemin(::Type{C}) where {C<:AbstractGray} = C(typemin(eltype(C)))

test/runtests.jl

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,15 @@ ColorTypes.comp2(c::RGBA32) = alpha(c)
315315
@test @inferred(GrayA32(0.8,0.2)/2) === GrayA(0.5f0*N0f8(0.8),0.5f0*N0f8(0.2))
316316
@test @inferred(GrayA32(0.8,0.2)/2.0) === GrayA(0.4,0.1)
317317
@test @inferred(GrayA32(1, 0.4) - GrayA32(0.2, 0.2)) === GrayA32(0.8, 0.2)
318+
319+
# Multiplication
320+
cf = AGray{Float32}(0.8, 0.2)
321+
@test_throws MethodError cf * cf
322+
@test_throws MethodError cf cf
323+
@test_throws MethodError cf cf
324+
cf64 = mapc(Float64, cf)
325+
@test @inferred(cf cf) === AGray{Float32}(0.8f0^2, 0.2f0^2)
326+
@test @inferred(cf cf64) === AGray{Float64}(0.8f0*(0.8f0*1.0), 0.2f0*(0.2f0*1.0))
318327
end
319328

320329
@testset "Arithemtic with RGB" begin
@@ -508,6 +517,15 @@ ColorTypes.comp2(c::RGBA32) = alpha(c)
508517
@test @inferred(RGBA32(1,0,0,0.8)/2) === RGBA(0.5f0,0,0,0.5f0*N0f8(0.8))
509518
@test @inferred(RGBA32(1,0,0,0.8)/2.0) === RGBA(0.5,0,0,0.4)
510519
@test @inferred(RGBA32(1, 0, 0, 0.2) + RGBA32(0, 0, 1, 0.2)) === RGBA32(1, 0, 1, 0.4)
520+
521+
# Multiplication
522+
@test_throws MethodError cf * cf
523+
@test_throws MethodError cf cf
524+
@test_throws MethodError cf cf
525+
cf64 = mapc(Float64, cf)
526+
@test @inferred(cf cf) === RGBA{Float32}(0.1f0^2, 0.2f0^2, 0.3f0^2, 0.4f0^2)
527+
@test @inferred(cf cf64) === RGBA{Float64}(0.1f0*(0.1f0*1.0), 0.2f0*(0.2f0*1.0),
528+
0.3f0*(0.3f0*1.0), 0.4f0*(0.4f0*1.0))
511529
end
512530

513531
@testset "Mixed-type arithmetic" begin
@@ -524,11 +542,28 @@ ColorTypes.comp2(c::RGBA32) = alpha(c)
524542
@test ARGB32(0.4, 0, 0.2, 0.5) + Gray24(0.4) === ARGB32(0.8, 0.4, 0.6, 0.5N0f8+1N0f8)
525543
@test ARGB32(0.4, 0, 0.2, 0.5) + AGray32(0.4, 0.2) === ARGB32(0.8, 0.4, 0.6, 0.5N0f8+0.2N0f8)
526544

527-
g, rgb = Gray(0.2), RGB(0.1, 0.2, 0.3)
528-
@test g rgb == rgb g 0.2*(0.1 + 0.2 + 0.3)/3
529-
@test g rgb == rgb g RGB(0.2*0.1, 0.2^2, 0.2*0.3)
530-
@test g rgb == RGB(g) rgb
531-
@test rgb g == rgb RGB(g)
545+
g, rgb = Gray{Float32}(0.2), RGB{Float64}(0.1, 0.2, 0.3)
546+
ag, argb = AGray{Float64}(0.2, 0.8), ARGB{Float32}(0.1, 0.2, 0.3, 0.4)
547+
@test g rgb === rgb g === 0.2f0*(0.1 + 0.2 + 0.3)/3
548+
@test_throws MethodError g ag
549+
@test_throws MethodError g argb
550+
@test_throws MethodError ag rgb
551+
@test_throws MethodError ag argb
552+
@test_throws MethodError rgb argb
553+
@test g rgb === rgb g === RGB{Float64}(0.2f0*0.1, 0.2f0*0.2, 0.2f0*0.3)
554+
@test g ag === ag g === AGray{Float64}(0.2f0*0.2, 1.0f0*0.8)
555+
@test g argb === argb g === ARGB{Float32}(0.2f0*0.1f0, 0.2f0*0.2f0, 0.2f0*0.3f0, 1.0f0*0.4f0)
556+
@test ag rgb === rgb ag === ARGB{Float64}(0.2*0.1, 0.2*0.2, 0.2*0.3, 0.8*1.0)
557+
@test ag argb === argb ag === ARGB{Float64}(0.2*0.1f0, 0.2*0.2f0, 0.2*0.3f0, 0.8*0.4f0)
558+
@test rgb argb === argb rgb === ARGB{Float64}(0.1*0.1f0, 0.2*0.2f0, 0.3*0.3f0, 1.0*0.4f0)
559+
@test g rgb === RGB(g) rgb
560+
@test rgb g === rgb RGB(g)
561+
@test Matrix(g rgb) == Matrix(rgb g)'
562+
@test_throws MethodError g ag
563+
@test_throws MethodError g argb
564+
@test_throws MethodError ag rgb
565+
@test_throws MethodError ag argb
566+
@test_throws MethodError rgb argb
532567
end
533568

534569
@testset "Custom RGB arithmetic" begin # see also the `RGBA32` cases above

0 commit comments

Comments
 (0)