Commit e4e4cdb3 authored by Russ Cox's avatar Russ Cox

image: avoid func comparison during ColorModel comparison

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
parent bbbd41f4
...@@ -134,13 +134,22 @@ type Model interface { ...@@ -134,13 +134,22 @@ type Model interface {
Convert(c Color) Color Convert(c Color) Color
} }
// ModelFunc is an adapter type to allow the use of a color conversion // ModelFunc returns a Model that invokes f to implement the conversion.
// function as a Model. If f is such a function, ModelFunc(f) is a Model that func ModelFunc(f func(Color) Color) Model {
// invokes f to implement the conversion. // Note: using *modelFunc as the implementation
type ModelFunc func(Color) Color // 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 { func (m *modelFunc) Convert(c Color) Color {
return f(c) return m.f(c)
} }
// RGBAModel is the Model for RGBA colors. // RGBAModel is the Model for RGBA colors.
......
...@@ -20,7 +20,7 @@ var ( ...@@ -20,7 +20,7 @@ var (
) )
// Uniform is an infinite-sized Image of uniform color. // 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 { type Uniform struct {
C color.Color C color.Color
} }
...@@ -30,7 +30,11 @@ func (c *Uniform) RGBA() (r, g, b, a uint32) { ...@@ -30,7 +30,11 @@ func (c *Uniform) RGBA() (r, g, b, a uint32) {
} }
func (c *Uniform) ColorModel() color.Model { 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}} } func (c *Uniform) Bounds() Rectangle { return Rectangle{Point{-1e9, -1e9}, Point{1e9, 1e9}} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment