diff --git a/webp/nycbcra/nycbcra.go b/webp/nycbcra/nycbcra.go deleted file mode 100644 index 101c41f..0000000 --- a/webp/nycbcra/nycbcra.go +++ /dev/null @@ -1,194 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package nycbcra provides non-alpha-premultiplied Y'CbCr-with-alpha image and -// color types. -// -// Deprecated: as of Go 1.6. Use the standard image and image/color packages -// instead. -package nycbcra // import "golang.org/x/image/webp/nycbcra" - -import ( - "image" - "image/color" -) - -func init() { - println("The golang.org/x/image/webp/nycbcra package is deprecated, as of Go 1.6. " + - "Use the standard image and image/color packages instead.") -} - -// TODO: move this to the standard image and image/color packages, so that the -// image/draw package can have fast-path code. Moving would rename: -// nycbcra.Color to color.NYCbCrA -// nycbcra.ColorModel to color.NYCbCrAModel -// nycbcra.Image to image.NYCbCrA - -// Color represents a non-alpha-premultiplied Y'CbCr-with-alpha color, having -// 8 bits each for one luma, two chroma and one alpha component. -type Color struct { - color.YCbCr - A uint8 -} - -func (c Color) RGBA() (r, g, b, a uint32) { - r8, g8, b8 := color.YCbCrToRGB(c.Y, c.Cb, c.Cr) - a = uint32(c.A) * 0x101 - r = uint32(r8) * 0x101 * a / 0xffff - g = uint32(g8) * 0x101 * a / 0xffff - b = uint32(b8) * 0x101 * a / 0xffff - return -} - -// ColorModel is the Model for non-alpha-premultiplied Y'CbCr-with-alpha colors. -var ColorModel color.Model = color.ModelFunc(nYCbCrAModel) - -func nYCbCrAModel(c color.Color) color.Color { - switch c := c.(type) { - case Color: - return c - case color.YCbCr: - return Color{c, 0xff} - } - r, g, b, a := c.RGBA() - - // Convert from alpha-premultiplied to non-alpha-premultiplied. - if a != 0 { - r = (r * 0xffff) / a - g = (g * 0xffff) / a - b = (b * 0xffff) / a - } - - y, u, v := color.RGBToYCbCr(uint8(r>>8), uint8(g>>8), uint8(b>>8)) - return Color{color.YCbCr{Y: y, Cb: u, Cr: v}, uint8(a >> 8)} -} - -// Image is an in-memory image of non-alpha-premultiplied Y'CbCr-with-alpha -// colors. A and AStride are analogous to the Y and YStride fields of the -// embedded YCbCr. -type Image struct { - image.YCbCr - A []uint8 - AStride int -} - -func (p *Image) ColorModel() color.Model { - return ColorModel -} - -func (p *Image) At(x, y int) color.Color { - return p.NYCbCrAAt(x, y) -} - -func (p *Image) NYCbCrAAt(x, y int) Color { - if !(image.Point{X: x, Y: y}.In(p.Rect)) { - return Color{} - } - yi := p.YOffset(x, y) - ci := p.COffset(x, y) - ai := p.AOffset(x, y) - return Color{ - color.YCbCr{ - Y: p.Y[yi], - Cb: p.Cb[ci], - Cr: p.Cr[ci], - }, - p.A[ai], - } -} - -// AOffset returns the index of the first element of A that corresponds to -// the pixel at (x, y). -func (p *Image) AOffset(x, y int) int { - return (y-p.Rect.Min.Y)*p.AStride + (x - p.Rect.Min.X) -} - -// SubImage returns an image representing the portion of the image p visible -// through r. The returned value shares pixels with the original image. -func (p *Image) SubImage(r image.Rectangle) image.Image { - // TODO: share code with image.NewYCbCr when this type moves into the - // standard image package. - r = r.Intersect(p.Rect) - // If r1 and r2 are Rectangles, r1.Intersect(r2) is not guaranteed to be inside - // either r1 or r2 if the intersection is empty. Without explicitly checking for - // this, the Pix[i:] expression below can panic. - if r.Empty() { - return &Image{ - YCbCr: image.YCbCr{ - SubsampleRatio: p.SubsampleRatio, - }, - } - } - yi := p.YOffset(r.Min.X, r.Min.Y) - ci := p.COffset(r.Min.X, r.Min.Y) - ai := p.AOffset(r.Min.X, r.Min.Y) - return &Image{ - YCbCr: image.YCbCr{ - Y: p.Y[yi:], - Cb: p.Cb[ci:], - Cr: p.Cr[ci:], - SubsampleRatio: p.SubsampleRatio, - YStride: p.YStride, - CStride: p.CStride, - Rect: r, - }, - A: p.A[ai:], - AStride: p.AStride, - } -} - -// Opaque scans the entire image and reports whether it is fully opaque. -func (p *Image) Opaque() bool { - if p.Rect.Empty() { - return true - } - i0, i1 := 0, p.Rect.Dx() - for y := p.Rect.Min.Y; y < p.Rect.Max.Y; y++ { - for _, a := range p.A[i0:i1] { - if a != 0xff { - return false - } - } - i0 += p.AStride - i1 += p.AStride - } - return true -} - -// New returns a new Image with the given bounds and subsample ratio. -func New(r image.Rectangle, subsampleRatio image.YCbCrSubsampleRatio) *Image { - // TODO: share code with image.NewYCbCr when this type moves into the - // standard image package. - w, h, cw, ch := r.Dx(), r.Dy(), 0, 0 - switch subsampleRatio { - case image.YCbCrSubsampleRatio422: - cw = (r.Max.X+1)/2 - r.Min.X/2 - ch = h - case image.YCbCrSubsampleRatio420: - cw = (r.Max.X+1)/2 - r.Min.X/2 - ch = (r.Max.Y+1)/2 - r.Min.Y/2 - case image.YCbCrSubsampleRatio440: - cw = w - ch = (r.Max.Y+1)/2 - r.Min.Y/2 - default: - // Default to 4:4:4 subsampling. - cw = w - ch = h - } - b := make([]byte, 2*w*h+2*cw*ch) - // TODO: use s[i:j:k] notation to set the cap. - return &Image{ - YCbCr: image.YCbCr{ - Y: b[:w*h], - Cb: b[w*h+0*cw*ch : w*h+1*cw*ch], - Cr: b[w*h+1*cw*ch : w*h+2*cw*ch], - SubsampleRatio: subsampleRatio, - YStride: w, - CStride: cw, - Rect: r, - }, - A: b[w*h+2*cw*ch:], - AStride: w, - } -}