image: add Uniform.RGBA64At and Rectangle.RGBA64At

These types already implemented the Image interface. They should also
implement the RGBA64Image interface (new in Go 1.17)

Updates #44808

Change-Id: I9a2b13e305997088ae874efb95ad9e1648f94812
Reviewed-on: https://go-review.googlesource.com/c/go/+/331570
Trust: Nigel Tao <nigeltao@golang.org>
Run-TryBot: Nigel Tao <nigeltao@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Dmitri Shuralyov <dmitshur@golang.org>
This commit is contained in:
Nigel Tao 2021-06-29 16:53:44 +10:00
parent c45e800e0c
commit d19a53338f
5 changed files with 29 additions and 2 deletions

View file

@ -47,7 +47,9 @@ pkg image, method (*Paletted) RGBA64At(int, int) color.RGBA64
pkg image, method (*Paletted) SetRGBA64(int, int, color.RGBA64) pkg image, method (*Paletted) SetRGBA64(int, int, color.RGBA64)
pkg image, method (*RGBA) RGBA64At(int, int) color.RGBA64 pkg image, method (*RGBA) RGBA64At(int, int) color.RGBA64
pkg image, method (*RGBA) SetRGBA64(int, int, color.RGBA64) pkg image, method (*RGBA) SetRGBA64(int, int, color.RGBA64)
pkg image, method (*Uniform) RGBA64At(int, int) color.RGBA64
pkg image, method (*YCbCr) RGBA64At(int, int) color.RGBA64 pkg image, method (*YCbCr) RGBA64At(int, int) color.RGBA64
pkg image, method (Rectangle) RGBA64At(int, int) color.RGBA64
pkg image, type RGBA64Image interface { At, Bounds, ColorModel, RGBA64At } pkg image, type RGBA64Image interface { At, Bounds, ColorModel, RGBA64At }
pkg image, type RGBA64Image interface, At(int, int) color.Color pkg image, type RGBA64Image interface, At(int, int) color.Color
pkg image, type RGBA64Image interface, Bounds() Rectangle pkg image, type RGBA64Image interface, Bounds() Rectangle

View file

@ -811,8 +811,8 @@ func Foo() bool {
<p><!-- CL 311129 --> <p><!-- CL 311129 -->
The concrete image types (<code>RGBA</code>, <code>Gray16</code> and so on) The concrete image types (<code>RGBA</code>, <code>Gray16</code> and so on)
now implement a new <a href="/pkg/image/#RGBA64Image"><code>RGBA64Image</code></a> now implement a new <a href="/pkg/image/#RGBA64Image"><code>RGBA64Image</code></a>
interface. Those concrete types, other than the chroma-subsampling interface. The concrete types that previously implemented
related <code>YCbCr</code> and <code>NYCbCrA</code>, also now implement <a href="/pkg/image/draw/#Image"><code>draw.Image</code></a> now also implement
<a href="/pkg/image/draw/#RGBA64Image"><code>draw.RGBA64Image</code></a>, a <a href="/pkg/image/draw/#RGBA64Image"><code>draw.RGBA64Image</code></a>, a
new interface in the <code>image/draw</code> package. new interface in the <code>image/draw</code> package.
</p> </p>

View file

@ -246,6 +246,14 @@ func (r Rectangle) At(x, y int) color.Color {
return color.Transparent return color.Transparent
} }
// RGBA64At implements the RGBA64Image interface.
func (r Rectangle) RGBA64At(x, y int) color.RGBA64 {
if (Point{x, y}).In(r) {
return color.RGBA64{0xffff, 0xffff, 0xffff, 0xffff}
}
return color.RGBA64{}
}
// Bounds implements the Image interface. // Bounds implements the Image interface.
func (r Rectangle) Bounds() Rectangle { func (r Rectangle) Bounds() Rectangle {
return r return r

View file

@ -213,7 +213,9 @@ func TestRGBA64Image(t *testing.T) {
NewPaletted(r, palette.Plan9), NewPaletted(r, palette.Plan9),
NewRGBA(r), NewRGBA(r),
NewRGBA64(r), NewRGBA64(r),
NewUniform(color.RGBA64{}),
NewYCbCr(r, YCbCrSubsampleRatio444), NewYCbCr(r, YCbCrSubsampleRatio444),
r,
} }
for _, tc := range testCases { for _, tc := range testCases {
switch tc := tc.(type) { switch tc := tc.(type) {
@ -226,6 +228,9 @@ func TestRGBA64Image(t *testing.T) {
// means that setting one pixel can modify neighboring pixels. They // means that setting one pixel can modify neighboring pixels. They
// don't have Set or SetRGBA64 methods because that side effect could // don't have Set or SetRGBA64 methods because that side effect could
// be surprising. Here, we just memset the channel buffers instead. // be surprising. Here, we just memset the channel buffers instead.
//
// The Uniform and Rectangle types are also special-cased, as they
// don't have a Set or SetRGBA64 method.
case interface { case interface {
SetRGBA64(x, y int, c color.RGBA64) SetRGBA64(x, y int, c color.RGBA64)
}: }:
@ -237,11 +242,18 @@ func TestRGBA64Image(t *testing.T) {
memset(tc.YCbCr.Cr, 0x99) memset(tc.YCbCr.Cr, 0x99)
memset(tc.A, 0xAA) memset(tc.A, 0xAA)
case *Uniform:
tc.C = color.RGBA64{0x7FFF, 0x3FFF, 0x0000, 0x7FFF}
case *YCbCr: case *YCbCr:
memset(tc.Y, 0x77) memset(tc.Y, 0x77)
memset(tc.Cb, 0x88) memset(tc.Cb, 0x88)
memset(tc.Cr, 0x99) memset(tc.Cr, 0x99)
case Rectangle:
// No-op. Rectangle pixels' colors are immutable. They're always
// color.Opaque.
default: default:
t.Errorf("could not initialize pixels for %T", tc) t.Errorf("could not initialize pixels for %T", tc)
continue continue

View file

@ -41,6 +41,11 @@ func (c *Uniform) Bounds() Rectangle { return Rectangle{Point{-1e9, -1e9}, Point
func (c *Uniform) At(x, y int) color.Color { return c.C } func (c *Uniform) At(x, y int) color.Color { return c.C }
func (c *Uniform) RGBA64At(x, y int) color.RGBA64 {
r, g, b, a := c.C.RGBA()
return color.RGBA64{uint16(r), uint16(g), uint16(b), uint16(a)}
}
// Opaque scans the entire image and reports whether it is fully opaque. // Opaque scans the entire image and reports whether it is fully opaque.
func (c *Uniform) Opaque() bool { func (c *Uniform) Opaque() bool {
_, _, _, a := c.C.RGBA() _, _, _, a := c.C.RGBA()