]> Cypherpunks repositories - gostls13.git/commitdiff
image: avoid func comparison during ColorModel comparison
authorRuss Cox <rsc@golang.org>
Tue, 6 Dec 2011 15:47:42 +0000 (10:47 -0500)
committerRuss Cox <rsc@golang.org>
Tue, 6 Dec 2011 15:47:42 +0000 (10:47 -0500)
When I disallowed map + func comparisons, I only did it
in the static case and missed the comparisons via == on
interface values.  Fixing that turned these up.

R=nigeltao, r
CC=golang-dev
https://golang.org/cl/5440103

src/pkg/image/color/color.go
src/pkg/image/names.go

index 4a0fae5a789f2555390d3fdc8559578aedca0521..2948db7f38cc49ac61a1aa989caf082bdac03328 100644 (file)
@@ -134,13 +134,22 @@ type Model interface {
        Convert(c Color) Color
 }
 
-// ModelFunc is an adapter type to allow the use of a color conversion
-// function as a Model. If f is such a function, ModelFunc(f) is a Model that
-// invokes f to implement the conversion.
-type ModelFunc func(Color) Color
+// ModelFunc returns a Model that invokes f to implement the conversion.
+func ModelFunc(f func(Color) Color) Model {
+       // Note: using *modelFunc as the implementation
+       // means that callers can still use comparisons
+       // like m == RGBAModel.  This is not possible if
+       // we use the func value directly, because funcs
+       // are no longer comparable.
+       return &modelFunc{f}
+}
+
+type modelFunc struct {
+       f func(Color) Color
+}
 
-func (f ModelFunc) Convert(c Color) Color {
-       return f(c)
+func (m *modelFunc) Convert(c Color) Color {
+       return m.f(c)
 }
 
 // RGBAModel is the Model for RGBA colors.
index a7ad51d53714922825a255a5065ec9785bb3ee44..a7d1a5798315d35b0cce25004b35695acf123485 100644 (file)
@@ -20,7 +20,7 @@ var (
 )
 
 // Uniform is an infinite-sized Image of uniform color.
-// It implements both the color.Color and Image interfaces.
+// It implements the color.Color, color.ColorModel, and Image interfaces.
 type Uniform struct {
        C color.Color
 }
@@ -30,7 +30,11 @@ func (c *Uniform) RGBA() (r, g, b, a uint32) {
 }
 
 func (c *Uniform) ColorModel() color.Model {
-       return color.ModelFunc(func(color.Color) color.Color { return c.C })
+       return c
+}
+
+func (c *Uniform) Convert(color.Color) color.Color {
+       return c.C
 }
 
 func (c *Uniform) Bounds() Rectangle { return Rectangle{Point{-1e9, -1e9}, Point{1e9, 1e9}} }