]> Cypherpunks repositories - gostls13.git/commitdiff
image: add Uniform.RGBA64At and Rectangle.RGBA64At
authorNigel Tao <nigeltao@golang.org>
Tue, 29 Jun 2021 06:53:44 +0000 (16:53 +1000)
committerNigel Tao <nigeltao@golang.org>
Wed, 30 Jun 2021 02:00:49 +0000 (02:00 +0000)
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>
api/go1.17.txt
doc/go1.17.html
src/image/geom.go
src/image/image_test.go
src/image/names.go

index c5eb381708cc6bb71d24b7b71a39c31ed98e4892..8e4c0f5624b93dff090a316edf4184f74f691455 100644 (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 (*RGBA) RGBA64At(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 (Rectangle) RGBA64At(int, int) color.RGBA64
 pkg image, type RGBA64Image interface { At, Bounds, ColorModel, RGBA64At }
 pkg image, type RGBA64Image interface, At(int, int) color.Color
 pkg image, type RGBA64Image interface, Bounds() Rectangle
index 3551ba46c8c595a43d52999832ee3551078821c1..b72752d77d8738492d219bdaa1a7efec306a4c5b 100644 (file)
@@ -811,8 +811,8 @@ func Foo() bool {
     <p><!-- CL 311129 -->
       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>
-      interface. Those concrete types, other than the chroma-subsampling
-      related <code>YCbCr</code> and <code>NYCbCrA</code>, also now implement
+      interface. The concrete types that previously implemented
+      <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
       new interface in the <code>image/draw</code> package.
     </p>
index 78e9e49d4f6995ddcc52c42dff8d0e6e4d829b74..e71aa611872c539a6512674eb099db52f02f34e2 100644 (file)
@@ -246,6 +246,14 @@ func (r Rectangle) At(x, y int) color.Color {
        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.
 func (r Rectangle) Bounds() Rectangle {
        return r
index c64b6107b740e5c570ad3a38334e4697a8f1f54c..7f41bcb6c7086f1eb737fdd33cac1cd8135c488a 100644 (file)
@@ -213,7 +213,9 @@ func TestRGBA64Image(t *testing.T) {
                NewPaletted(r, palette.Plan9),
                NewRGBA(r),
                NewRGBA64(r),
+               NewUniform(color.RGBA64{}),
                NewYCbCr(r, YCbCrSubsampleRatio444),
+               r,
        }
        for _, tc := range testCases {
                switch tc := tc.(type) {
@@ -226,6 +228,9 @@ func TestRGBA64Image(t *testing.T) {
                // means that setting one pixel can modify neighboring pixels. They
                // don't have Set or SetRGBA64 methods because that side effect could
                // 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 {
                        SetRGBA64(x, y int, c color.RGBA64)
                }:
@@ -237,11 +242,18 @@ func TestRGBA64Image(t *testing.T) {
                        memset(tc.YCbCr.Cr, 0x99)
                        memset(tc.A, 0xAA)
 
+               case *Uniform:
+                       tc.C = color.RGBA64{0x7FFF, 0x3FFF, 0x0000, 0x7FFF}
+
                case *YCbCr:
                        memset(tc.Y, 0x77)
                        memset(tc.Cb, 0x88)
                        memset(tc.Cr, 0x99)
 
+               case Rectangle:
+                       // No-op. Rectangle pixels' colors are immutable. They're always
+                       // color.Opaque.
+
                default:
                        t.Errorf("could not initialize pixels for %T", tc)
                        continue
index 8595a35014db0d568471defe31a7f02e98485519..17b06588ac52e597067a7491046b56e7e6cf7d62 100644 (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) 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.
 func (c *Uniform) Opaque() bool {
        _, _, _, a := c.C.RGBA()