draw: update the inlined YCbCr.RGBA code to use 16 bit color.

This matches the standard library change at
https://go-review.googlesource.com/#/c/8073/

Change-Id: I216028e18678a70e449167cd9ab910c63d37adcc
Reviewed-on: https://go-review.googlesource.com/8075
Reviewed-by: Rob Pike <r@golang.org>
diff --git a/draw/gen.go b/draw/gen.go
index 3ff3d84..1acae2e 100644
--- a/draw/gen.go
+++ b/draw/gen.go
@@ -479,16 +479,10 @@
 			fmt.Fprintf(buf, ""+
 				"%si := %s\n"+
 				"%sj := %s\n"+
-				"%s\n"+
-				"%sr%s := uint32(%sr8) * 0x101\n"+
-				"%sg%s := uint32(%sg8) * 0x101\n"+
-				"%sb%s := uint32(%sb8) * 0x101\n",
+				"%s\n",
 				lhs, pixOffset("src", args[0], args[1], "", "*src.YStride"),
 				lhs, cOffset(args[0], args[1], d.sratio),
-				ycbcrToRGB(lhs),
-				lhs, tmp, lhs,
-				lhs, tmp, lhs,
-				lhs, tmp, lhs,
+				ycbcrToRGB(lhs, tmp),
 			)
 		}
 
@@ -643,34 +637,34 @@
 	return fmt.Sprintf("unsupported sratio %q", sratio)
 }
 
-// TODO: should we have a color.YCbCrToRGB48 function that returns 16-bit
-// color?
-
-func ycbcrToRGB(lhs string) string {
-	return strings.Replace(`
-		// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+func ycbcrToRGB(lhs, tmp string) string {
+	s := `
+		// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 		$yy1 := int(src.Y[$i])<<16 + 1<<15
 		$cb1 := int(src.Cb[$j]) - 128
 		$cr1 := int(src.Cr[$j]) - 128
-		$r8 := ($yy1 + 91881*$cr1) >> 16
-		$g8 := ($yy1 - 22554*$cb1 - 46802*$cr1) >> 16
-		$b8 := ($yy1 + 116130*$cb1) >> 16
-		if $r8 < 0 {
-			$r8 = 0
-		} else if $r8 > 0xff {
-			$r8 = 0xff
+		$r@ := ($yy1 + 91881*$cr1) >> 8
+		$g@ := ($yy1 - 22554*$cb1 - 46802*$cr1) >> 8
+		$b@ := ($yy1 + 116130*$cb1) >> 8
+		if $r@ < 0 {
+			$r@ = 0
+		} else if $r@ > 0xffff {
+			$r@ = 0xffff
 		}
-		if $g8 < 0 {
-			$g8 = 0
-		} else if $g8 > 0xff {
-			$g8 = 0xff
+		if $g@ < 0 {
+			$g@ = 0
+		} else if $g@ > 0xffff {
+			$g@ = 0xffff
 		}
-		if $b8 < 0 {
-			$b8 = 0
-		} else if $b8 > 0xff {
-			$b8 = 0xff
+		if $b@ < 0 {
+			$b@ = 0
+		} else if $b@ > 0xffff {
+			$b@ = 0xffff
 		}
-	`, "$", lhs, -1)
+	`
+	s = strings.Replace(s, "$", lhs, -1)
+	s = strings.Replace(s, "@", tmp, -1)
+	return s
 }
 
 func split(s, sep string) (string, string) {
diff --git a/draw/impl.go b/draw/impl.go
index f144531..6278c92 100644
--- a/draw/impl.go
+++ b/draw/impl.go
@@ -204,32 +204,28 @@
 			pi := (sr.Min.Y+int(sy)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx) - src.Rect.Min.X)
 			pj := (sr.Min.Y+int(sy)-src.Rect.Min.Y)*src.CStride + (sr.Min.X + int(sx) - src.Rect.Min.X)
 
-			// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+			// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 			pyy1 := int(src.Y[pi])<<16 + 1<<15
 			pcb1 := int(src.Cb[pj]) - 128
 			pcr1 := int(src.Cr[pj]) - 128
-			pr8 := (pyy1 + 91881*pcr1) >> 16
-			pg8 := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 16
-			pb8 := (pyy1 + 116130*pcb1) >> 16
-			if pr8 < 0 {
-				pr8 = 0
-			} else if pr8 > 0xff {
-				pr8 = 0xff
+			pr := (pyy1 + 91881*pcr1) >> 8
+			pg := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8
+			pb := (pyy1 + 116130*pcb1) >> 8
+			if pr < 0 {
+				pr = 0
+			} else if pr > 0xffff {
+				pr = 0xffff
 			}
-			if pg8 < 0 {
-				pg8 = 0
-			} else if pg8 > 0xff {
-				pg8 = 0xff
+			if pg < 0 {
+				pg = 0
+			} else if pg > 0xffff {
+				pg = 0xffff
 			}
-			if pb8 < 0 {
-				pb8 = 0
-			} else if pb8 > 0xff {
-				pb8 = 0xff
+			if pb < 0 {
+				pb = 0
+			} else if pb > 0xffff {
+				pb = 0xffff
 			}
-
-			pr := uint32(pr8) * 0x101
-			pg := uint32(pg8) * 0x101
-			pb := uint32(pb8) * 0x101
 			dst.Pix[d+0] = uint8(uint32(pr) >> 8)
 			dst.Pix[d+1] = uint8(uint32(pg) >> 8)
 			dst.Pix[d+2] = uint8(uint32(pb) >> 8)
@@ -251,32 +247,28 @@
 			pi := (sr.Min.Y+int(sy)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx) - src.Rect.Min.X)
 			pj := (sr.Min.Y+int(sy)-src.Rect.Min.Y)*src.CStride + ((sr.Min.X+int(sx))/2 - src.Rect.Min.X/2)
 
-			// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+			// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 			pyy1 := int(src.Y[pi])<<16 + 1<<15
 			pcb1 := int(src.Cb[pj]) - 128
 			pcr1 := int(src.Cr[pj]) - 128
-			pr8 := (pyy1 + 91881*pcr1) >> 16
-			pg8 := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 16
-			pb8 := (pyy1 + 116130*pcb1) >> 16
-			if pr8 < 0 {
-				pr8 = 0
-			} else if pr8 > 0xff {
-				pr8 = 0xff
+			pr := (pyy1 + 91881*pcr1) >> 8
+			pg := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8
+			pb := (pyy1 + 116130*pcb1) >> 8
+			if pr < 0 {
+				pr = 0
+			} else if pr > 0xffff {
+				pr = 0xffff
 			}
-			if pg8 < 0 {
-				pg8 = 0
-			} else if pg8 > 0xff {
-				pg8 = 0xff
+			if pg < 0 {
+				pg = 0
+			} else if pg > 0xffff {
+				pg = 0xffff
 			}
-			if pb8 < 0 {
-				pb8 = 0
-			} else if pb8 > 0xff {
-				pb8 = 0xff
+			if pb < 0 {
+				pb = 0
+			} else if pb > 0xffff {
+				pb = 0xffff
 			}
-
-			pr := uint32(pr8) * 0x101
-			pg := uint32(pg8) * 0x101
-			pb := uint32(pb8) * 0x101
 			dst.Pix[d+0] = uint8(uint32(pr) >> 8)
 			dst.Pix[d+1] = uint8(uint32(pg) >> 8)
 			dst.Pix[d+2] = uint8(uint32(pb) >> 8)
@@ -298,32 +290,28 @@
 			pi := (sr.Min.Y+int(sy)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx) - src.Rect.Min.X)
 			pj := ((sr.Min.Y+int(sy))/2-src.Rect.Min.Y/2)*src.CStride + ((sr.Min.X+int(sx))/2 - src.Rect.Min.X/2)
 
-			// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+			// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 			pyy1 := int(src.Y[pi])<<16 + 1<<15
 			pcb1 := int(src.Cb[pj]) - 128
 			pcr1 := int(src.Cr[pj]) - 128
-			pr8 := (pyy1 + 91881*pcr1) >> 16
-			pg8 := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 16
-			pb8 := (pyy1 + 116130*pcb1) >> 16
-			if pr8 < 0 {
-				pr8 = 0
-			} else if pr8 > 0xff {
-				pr8 = 0xff
+			pr := (pyy1 + 91881*pcr1) >> 8
+			pg := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8
+			pb := (pyy1 + 116130*pcb1) >> 8
+			if pr < 0 {
+				pr = 0
+			} else if pr > 0xffff {
+				pr = 0xffff
 			}
-			if pg8 < 0 {
-				pg8 = 0
-			} else if pg8 > 0xff {
-				pg8 = 0xff
+			if pg < 0 {
+				pg = 0
+			} else if pg > 0xffff {
+				pg = 0xffff
 			}
-			if pb8 < 0 {
-				pb8 = 0
-			} else if pb8 > 0xff {
-				pb8 = 0xff
+			if pb < 0 {
+				pb = 0
+			} else if pb > 0xffff {
+				pb = 0xffff
 			}
-
-			pr := uint32(pr8) * 0x101
-			pg := uint32(pg8) * 0x101
-			pb := uint32(pb8) * 0x101
 			dst.Pix[d+0] = uint8(uint32(pr) >> 8)
 			dst.Pix[d+1] = uint8(uint32(pg) >> 8)
 			dst.Pix[d+2] = uint8(uint32(pb) >> 8)
@@ -345,32 +333,28 @@
 			pi := (sr.Min.Y+int(sy)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx) - src.Rect.Min.X)
 			pj := ((sr.Min.Y+int(sy))/2-src.Rect.Min.Y/2)*src.CStride + (sr.Min.X + int(sx) - src.Rect.Min.X)
 
-			// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+			// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 			pyy1 := int(src.Y[pi])<<16 + 1<<15
 			pcb1 := int(src.Cb[pj]) - 128
 			pcr1 := int(src.Cr[pj]) - 128
-			pr8 := (pyy1 + 91881*pcr1) >> 16
-			pg8 := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 16
-			pb8 := (pyy1 + 116130*pcb1) >> 16
-			if pr8 < 0 {
-				pr8 = 0
-			} else if pr8 > 0xff {
-				pr8 = 0xff
+			pr := (pyy1 + 91881*pcr1) >> 8
+			pg := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8
+			pb := (pyy1 + 116130*pcb1) >> 8
+			if pr < 0 {
+				pr = 0
+			} else if pr > 0xffff {
+				pr = 0xffff
 			}
-			if pg8 < 0 {
-				pg8 = 0
-			} else if pg8 > 0xff {
-				pg8 = 0xff
+			if pg < 0 {
+				pg = 0
+			} else if pg > 0xffff {
+				pg = 0xffff
 			}
-			if pb8 < 0 {
-				pb8 = 0
-			} else if pb8 > 0xff {
-				pb8 = 0xff
+			if pb < 0 {
+				pb = 0
+			} else if pb > 0xffff {
+				pb = 0xffff
 			}
-
-			pr := uint32(pr8) * 0x101
-			pg := uint32(pg8) * 0x101
-			pb := uint32(pb8) * 0x101
 			dst.Pix[d+0] = uint8(uint32(pr) >> 8)
 			dst.Pix[d+1] = uint8(uint32(pg) >> 8)
 			dst.Pix[d+2] = uint8(uint32(pb) >> 8)
@@ -503,32 +487,28 @@
 			pi := (sy0-src.Rect.Min.Y)*src.YStride + (sx0 - src.Rect.Min.X)
 			pj := (sy0-src.Rect.Min.Y)*src.CStride + (sx0 - src.Rect.Min.X)
 
-			// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+			// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 			pyy1 := int(src.Y[pi])<<16 + 1<<15
 			pcb1 := int(src.Cb[pj]) - 128
 			pcr1 := int(src.Cr[pj]) - 128
-			pr8 := (pyy1 + 91881*pcr1) >> 16
-			pg8 := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 16
-			pb8 := (pyy1 + 116130*pcb1) >> 16
-			if pr8 < 0 {
-				pr8 = 0
-			} else if pr8 > 0xff {
-				pr8 = 0xff
+			pr := (pyy1 + 91881*pcr1) >> 8
+			pg := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8
+			pb := (pyy1 + 116130*pcb1) >> 8
+			if pr < 0 {
+				pr = 0
+			} else if pr > 0xffff {
+				pr = 0xffff
 			}
-			if pg8 < 0 {
-				pg8 = 0
-			} else if pg8 > 0xff {
-				pg8 = 0xff
+			if pg < 0 {
+				pg = 0
+			} else if pg > 0xffff {
+				pg = 0xffff
 			}
-			if pb8 < 0 {
-				pb8 = 0
-			} else if pb8 > 0xff {
-				pb8 = 0xff
+			if pb < 0 {
+				pb = 0
+			} else if pb > 0xffff {
+				pb = 0xffff
 			}
-
-			pr := uint32(pr8) * 0x101
-			pg := uint32(pg8) * 0x101
-			pb := uint32(pb8) * 0x101
 			dst.Pix[d+0] = uint8(uint32(pr) >> 8)
 			dst.Pix[d+1] = uint8(uint32(pg) >> 8)
 			dst.Pix[d+2] = uint8(uint32(pb) >> 8)
@@ -551,32 +531,28 @@
 			pi := (sy0-src.Rect.Min.Y)*src.YStride + (sx0 - src.Rect.Min.X)
 			pj := (sy0-src.Rect.Min.Y)*src.CStride + ((sx0)/2 - src.Rect.Min.X/2)
 
-			// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+			// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 			pyy1 := int(src.Y[pi])<<16 + 1<<15
 			pcb1 := int(src.Cb[pj]) - 128
 			pcr1 := int(src.Cr[pj]) - 128
-			pr8 := (pyy1 + 91881*pcr1) >> 16
-			pg8 := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 16
-			pb8 := (pyy1 + 116130*pcb1) >> 16
-			if pr8 < 0 {
-				pr8 = 0
-			} else if pr8 > 0xff {
-				pr8 = 0xff
+			pr := (pyy1 + 91881*pcr1) >> 8
+			pg := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8
+			pb := (pyy1 + 116130*pcb1) >> 8
+			if pr < 0 {
+				pr = 0
+			} else if pr > 0xffff {
+				pr = 0xffff
 			}
-			if pg8 < 0 {
-				pg8 = 0
-			} else if pg8 > 0xff {
-				pg8 = 0xff
+			if pg < 0 {
+				pg = 0
+			} else if pg > 0xffff {
+				pg = 0xffff
 			}
-			if pb8 < 0 {
-				pb8 = 0
-			} else if pb8 > 0xff {
-				pb8 = 0xff
+			if pb < 0 {
+				pb = 0
+			} else if pb > 0xffff {
+				pb = 0xffff
 			}
-
-			pr := uint32(pr8) * 0x101
-			pg := uint32(pg8) * 0x101
-			pb := uint32(pb8) * 0x101
 			dst.Pix[d+0] = uint8(uint32(pr) >> 8)
 			dst.Pix[d+1] = uint8(uint32(pg) >> 8)
 			dst.Pix[d+2] = uint8(uint32(pb) >> 8)
@@ -599,32 +575,28 @@
 			pi := (sy0-src.Rect.Min.Y)*src.YStride + (sx0 - src.Rect.Min.X)
 			pj := ((sy0)/2-src.Rect.Min.Y/2)*src.CStride + ((sx0)/2 - src.Rect.Min.X/2)
 
-			// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+			// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 			pyy1 := int(src.Y[pi])<<16 + 1<<15
 			pcb1 := int(src.Cb[pj]) - 128
 			pcr1 := int(src.Cr[pj]) - 128
-			pr8 := (pyy1 + 91881*pcr1) >> 16
-			pg8 := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 16
-			pb8 := (pyy1 + 116130*pcb1) >> 16
-			if pr8 < 0 {
-				pr8 = 0
-			} else if pr8 > 0xff {
-				pr8 = 0xff
+			pr := (pyy1 + 91881*pcr1) >> 8
+			pg := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8
+			pb := (pyy1 + 116130*pcb1) >> 8
+			if pr < 0 {
+				pr = 0
+			} else if pr > 0xffff {
+				pr = 0xffff
 			}
-			if pg8 < 0 {
-				pg8 = 0
-			} else if pg8 > 0xff {
-				pg8 = 0xff
+			if pg < 0 {
+				pg = 0
+			} else if pg > 0xffff {
+				pg = 0xffff
 			}
-			if pb8 < 0 {
-				pb8 = 0
-			} else if pb8 > 0xff {
-				pb8 = 0xff
+			if pb < 0 {
+				pb = 0
+			} else if pb > 0xffff {
+				pb = 0xffff
 			}
-
-			pr := uint32(pr8) * 0x101
-			pg := uint32(pg8) * 0x101
-			pb := uint32(pb8) * 0x101
 			dst.Pix[d+0] = uint8(uint32(pr) >> 8)
 			dst.Pix[d+1] = uint8(uint32(pg) >> 8)
 			dst.Pix[d+2] = uint8(uint32(pb) >> 8)
@@ -647,32 +619,28 @@
 			pi := (sy0-src.Rect.Min.Y)*src.YStride + (sx0 - src.Rect.Min.X)
 			pj := ((sy0)/2-src.Rect.Min.Y/2)*src.CStride + (sx0 - src.Rect.Min.X)
 
-			// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+			// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 			pyy1 := int(src.Y[pi])<<16 + 1<<15
 			pcb1 := int(src.Cb[pj]) - 128
 			pcr1 := int(src.Cr[pj]) - 128
-			pr8 := (pyy1 + 91881*pcr1) >> 16
-			pg8 := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 16
-			pb8 := (pyy1 + 116130*pcb1) >> 16
-			if pr8 < 0 {
-				pr8 = 0
-			} else if pr8 > 0xff {
-				pr8 = 0xff
+			pr := (pyy1 + 91881*pcr1) >> 8
+			pg := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8
+			pb := (pyy1 + 116130*pcb1) >> 8
+			if pr < 0 {
+				pr = 0
+			} else if pr > 0xffff {
+				pr = 0xffff
 			}
-			if pg8 < 0 {
-				pg8 = 0
-			} else if pg8 > 0xff {
-				pg8 = 0xff
+			if pg < 0 {
+				pg = 0
+			} else if pg > 0xffff {
+				pg = 0xffff
 			}
-			if pb8 < 0 {
-				pb8 = 0
-			} else if pb8 > 0xff {
-				pb8 = 0xff
+			if pb < 0 {
+				pb = 0
+			} else if pb > 0xffff {
+				pb = 0xffff
 			}
-
-			pr := uint32(pr8) * 0x101
-			pg := uint32(pg8) * 0x101
-			pb := uint32(pb8) * 0x101
 			dst.Pix[d+0] = uint8(uint32(pr) >> 8)
 			dst.Pix[d+1] = uint8(uint32(pg) >> 8)
 			dst.Pix[d+2] = uint8(uint32(pb) >> 8)
@@ -1132,64 +1100,58 @@
 			s00i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx0) - src.Rect.Min.X)
 			s00j := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.CStride + (sr.Min.X + int(sx0) - src.Rect.Min.X)
 
-			// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+			// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 			s00yy1 := int(src.Y[s00i])<<16 + 1<<15
 			s00cb1 := int(src.Cb[s00j]) - 128
 			s00cr1 := int(src.Cr[s00j]) - 128
-			s00r8 := (s00yy1 + 91881*s00cr1) >> 16
-			s00g8 := (s00yy1 - 22554*s00cb1 - 46802*s00cr1) >> 16
-			s00b8 := (s00yy1 + 116130*s00cb1) >> 16
-			if s00r8 < 0 {
-				s00r8 = 0
-			} else if s00r8 > 0xff {
-				s00r8 = 0xff
+			s00ru := (s00yy1 + 91881*s00cr1) >> 8
+			s00gu := (s00yy1 - 22554*s00cb1 - 46802*s00cr1) >> 8
+			s00bu := (s00yy1 + 116130*s00cb1) >> 8
+			if s00ru < 0 {
+				s00ru = 0
+			} else if s00ru > 0xffff {
+				s00ru = 0xffff
 			}
-			if s00g8 < 0 {
-				s00g8 = 0
-			} else if s00g8 > 0xff {
-				s00g8 = 0xff
+			if s00gu < 0 {
+				s00gu = 0
+			} else if s00gu > 0xffff {
+				s00gu = 0xffff
 			}
-			if s00b8 < 0 {
-				s00b8 = 0
-			} else if s00b8 > 0xff {
-				s00b8 = 0xff
+			if s00bu < 0 {
+				s00bu = 0
+			} else if s00bu > 0xffff {
+				s00bu = 0xffff
 			}
 
-			s00ru := uint32(s00r8) * 0x101
-			s00gu := uint32(s00g8) * 0x101
-			s00bu := uint32(s00b8) * 0x101
 			s00r := float64(s00ru)
 			s00g := float64(s00gu)
 			s00b := float64(s00bu)
 			s10i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx1) - src.Rect.Min.X)
 			s10j := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.CStride + (sr.Min.X + int(sx1) - src.Rect.Min.X)
 
-			// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+			// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 			s10yy1 := int(src.Y[s10i])<<16 + 1<<15
 			s10cb1 := int(src.Cb[s10j]) - 128
 			s10cr1 := int(src.Cr[s10j]) - 128
-			s10r8 := (s10yy1 + 91881*s10cr1) >> 16
-			s10g8 := (s10yy1 - 22554*s10cb1 - 46802*s10cr1) >> 16
-			s10b8 := (s10yy1 + 116130*s10cb1) >> 16
-			if s10r8 < 0 {
-				s10r8 = 0
-			} else if s10r8 > 0xff {
-				s10r8 = 0xff
+			s10ru := (s10yy1 + 91881*s10cr1) >> 8
+			s10gu := (s10yy1 - 22554*s10cb1 - 46802*s10cr1) >> 8
+			s10bu := (s10yy1 + 116130*s10cb1) >> 8
+			if s10ru < 0 {
+				s10ru = 0
+			} else if s10ru > 0xffff {
+				s10ru = 0xffff
 			}
-			if s10g8 < 0 {
-				s10g8 = 0
-			} else if s10g8 > 0xff {
-				s10g8 = 0xff
+			if s10gu < 0 {
+				s10gu = 0
+			} else if s10gu > 0xffff {
+				s10gu = 0xffff
 			}
-			if s10b8 < 0 {
-				s10b8 = 0
-			} else if s10b8 > 0xff {
-				s10b8 = 0xff
+			if s10bu < 0 {
+				s10bu = 0
+			} else if s10bu > 0xffff {
+				s10bu = 0xffff
 			}
 
-			s10ru := uint32(s10r8) * 0x101
-			s10gu := uint32(s10g8) * 0x101
-			s10bu := uint32(s10b8) * 0x101
 			s10r := float64(s10ru)
 			s10g := float64(s10gu)
 			s10b := float64(s10bu)
@@ -1199,64 +1161,58 @@
 			s01i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx0) - src.Rect.Min.X)
 			s01j := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.CStride + (sr.Min.X + int(sx0) - src.Rect.Min.X)
 
-			// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+			// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 			s01yy1 := int(src.Y[s01i])<<16 + 1<<15
 			s01cb1 := int(src.Cb[s01j]) - 128
 			s01cr1 := int(src.Cr[s01j]) - 128
-			s01r8 := (s01yy1 + 91881*s01cr1) >> 16
-			s01g8 := (s01yy1 - 22554*s01cb1 - 46802*s01cr1) >> 16
-			s01b8 := (s01yy1 + 116130*s01cb1) >> 16
-			if s01r8 < 0 {
-				s01r8 = 0
-			} else if s01r8 > 0xff {
-				s01r8 = 0xff
+			s01ru := (s01yy1 + 91881*s01cr1) >> 8
+			s01gu := (s01yy1 - 22554*s01cb1 - 46802*s01cr1) >> 8
+			s01bu := (s01yy1 + 116130*s01cb1) >> 8
+			if s01ru < 0 {
+				s01ru = 0
+			} else if s01ru > 0xffff {
+				s01ru = 0xffff
 			}
-			if s01g8 < 0 {
-				s01g8 = 0
-			} else if s01g8 > 0xff {
-				s01g8 = 0xff
+			if s01gu < 0 {
+				s01gu = 0
+			} else if s01gu > 0xffff {
+				s01gu = 0xffff
 			}
-			if s01b8 < 0 {
-				s01b8 = 0
-			} else if s01b8 > 0xff {
-				s01b8 = 0xff
+			if s01bu < 0 {
+				s01bu = 0
+			} else if s01bu > 0xffff {
+				s01bu = 0xffff
 			}
 
-			s01ru := uint32(s01r8) * 0x101
-			s01gu := uint32(s01g8) * 0x101
-			s01bu := uint32(s01b8) * 0x101
 			s01r := float64(s01ru)
 			s01g := float64(s01gu)
 			s01b := float64(s01bu)
 			s11i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx1) - src.Rect.Min.X)
 			s11j := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.CStride + (sr.Min.X + int(sx1) - src.Rect.Min.X)
 
-			// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+			// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 			s11yy1 := int(src.Y[s11i])<<16 + 1<<15
 			s11cb1 := int(src.Cb[s11j]) - 128
 			s11cr1 := int(src.Cr[s11j]) - 128
-			s11r8 := (s11yy1 + 91881*s11cr1) >> 16
-			s11g8 := (s11yy1 - 22554*s11cb1 - 46802*s11cr1) >> 16
-			s11b8 := (s11yy1 + 116130*s11cb1) >> 16
-			if s11r8 < 0 {
-				s11r8 = 0
-			} else if s11r8 > 0xff {
-				s11r8 = 0xff
+			s11ru := (s11yy1 + 91881*s11cr1) >> 8
+			s11gu := (s11yy1 - 22554*s11cb1 - 46802*s11cr1) >> 8
+			s11bu := (s11yy1 + 116130*s11cb1) >> 8
+			if s11ru < 0 {
+				s11ru = 0
+			} else if s11ru > 0xffff {
+				s11ru = 0xffff
 			}
-			if s11g8 < 0 {
-				s11g8 = 0
-			} else if s11g8 > 0xff {
-				s11g8 = 0xff
+			if s11gu < 0 {
+				s11gu = 0
+			} else if s11gu > 0xffff {
+				s11gu = 0xffff
 			}
-			if s11b8 < 0 {
-				s11b8 = 0
-			} else if s11b8 > 0xff {
-				s11b8 = 0xff
+			if s11bu < 0 {
+				s11bu = 0
+			} else if s11bu > 0xffff {
+				s11bu = 0xffff
 			}
 
-			s11ru := uint32(s11r8) * 0x101
-			s11gu := uint32(s11g8) * 0x101
-			s11bu := uint32(s11b8) * 0x101
 			s11r := float64(s11ru)
 			s11g := float64(s11gu)
 			s11b := float64(s11bu)
@@ -1316,64 +1272,58 @@
 			s00i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx0) - src.Rect.Min.X)
 			s00j := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.CStride + ((sr.Min.X+int(sx0))/2 - src.Rect.Min.X/2)
 
-			// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+			// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 			s00yy1 := int(src.Y[s00i])<<16 + 1<<15
 			s00cb1 := int(src.Cb[s00j]) - 128
 			s00cr1 := int(src.Cr[s00j]) - 128
-			s00r8 := (s00yy1 + 91881*s00cr1) >> 16
-			s00g8 := (s00yy1 - 22554*s00cb1 - 46802*s00cr1) >> 16
-			s00b8 := (s00yy1 + 116130*s00cb1) >> 16
-			if s00r8 < 0 {
-				s00r8 = 0
-			} else if s00r8 > 0xff {
-				s00r8 = 0xff
+			s00ru := (s00yy1 + 91881*s00cr1) >> 8
+			s00gu := (s00yy1 - 22554*s00cb1 - 46802*s00cr1) >> 8
+			s00bu := (s00yy1 + 116130*s00cb1) >> 8
+			if s00ru < 0 {
+				s00ru = 0
+			} else if s00ru > 0xffff {
+				s00ru = 0xffff
 			}
-			if s00g8 < 0 {
-				s00g8 = 0
-			} else if s00g8 > 0xff {
-				s00g8 = 0xff
+			if s00gu < 0 {
+				s00gu = 0
+			} else if s00gu > 0xffff {
+				s00gu = 0xffff
 			}
-			if s00b8 < 0 {
-				s00b8 = 0
-			} else if s00b8 > 0xff {
-				s00b8 = 0xff
+			if s00bu < 0 {
+				s00bu = 0
+			} else if s00bu > 0xffff {
+				s00bu = 0xffff
 			}
 
-			s00ru := uint32(s00r8) * 0x101
-			s00gu := uint32(s00g8) * 0x101
-			s00bu := uint32(s00b8) * 0x101
 			s00r := float64(s00ru)
 			s00g := float64(s00gu)
 			s00b := float64(s00bu)
 			s10i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx1) - src.Rect.Min.X)
 			s10j := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.CStride + ((sr.Min.X+int(sx1))/2 - src.Rect.Min.X/2)
 
-			// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+			// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 			s10yy1 := int(src.Y[s10i])<<16 + 1<<15
 			s10cb1 := int(src.Cb[s10j]) - 128
 			s10cr1 := int(src.Cr[s10j]) - 128
-			s10r8 := (s10yy1 + 91881*s10cr1) >> 16
-			s10g8 := (s10yy1 - 22554*s10cb1 - 46802*s10cr1) >> 16
-			s10b8 := (s10yy1 + 116130*s10cb1) >> 16
-			if s10r8 < 0 {
-				s10r8 = 0
-			} else if s10r8 > 0xff {
-				s10r8 = 0xff
+			s10ru := (s10yy1 + 91881*s10cr1) >> 8
+			s10gu := (s10yy1 - 22554*s10cb1 - 46802*s10cr1) >> 8
+			s10bu := (s10yy1 + 116130*s10cb1) >> 8
+			if s10ru < 0 {
+				s10ru = 0
+			} else if s10ru > 0xffff {
+				s10ru = 0xffff
 			}
-			if s10g8 < 0 {
-				s10g8 = 0
-			} else if s10g8 > 0xff {
-				s10g8 = 0xff
+			if s10gu < 0 {
+				s10gu = 0
+			} else if s10gu > 0xffff {
+				s10gu = 0xffff
 			}
-			if s10b8 < 0 {
-				s10b8 = 0
-			} else if s10b8 > 0xff {
-				s10b8 = 0xff
+			if s10bu < 0 {
+				s10bu = 0
+			} else if s10bu > 0xffff {
+				s10bu = 0xffff
 			}
 
-			s10ru := uint32(s10r8) * 0x101
-			s10gu := uint32(s10g8) * 0x101
-			s10bu := uint32(s10b8) * 0x101
 			s10r := float64(s10ru)
 			s10g := float64(s10gu)
 			s10b := float64(s10bu)
@@ -1383,64 +1333,58 @@
 			s01i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx0) - src.Rect.Min.X)
 			s01j := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.CStride + ((sr.Min.X+int(sx0))/2 - src.Rect.Min.X/2)
 
-			// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+			// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 			s01yy1 := int(src.Y[s01i])<<16 + 1<<15
 			s01cb1 := int(src.Cb[s01j]) - 128
 			s01cr1 := int(src.Cr[s01j]) - 128
-			s01r8 := (s01yy1 + 91881*s01cr1) >> 16
-			s01g8 := (s01yy1 - 22554*s01cb1 - 46802*s01cr1) >> 16
-			s01b8 := (s01yy1 + 116130*s01cb1) >> 16
-			if s01r8 < 0 {
-				s01r8 = 0
-			} else if s01r8 > 0xff {
-				s01r8 = 0xff
+			s01ru := (s01yy1 + 91881*s01cr1) >> 8
+			s01gu := (s01yy1 - 22554*s01cb1 - 46802*s01cr1) >> 8
+			s01bu := (s01yy1 + 116130*s01cb1) >> 8
+			if s01ru < 0 {
+				s01ru = 0
+			} else if s01ru > 0xffff {
+				s01ru = 0xffff
 			}
-			if s01g8 < 0 {
-				s01g8 = 0
-			} else if s01g8 > 0xff {
-				s01g8 = 0xff
+			if s01gu < 0 {
+				s01gu = 0
+			} else if s01gu > 0xffff {
+				s01gu = 0xffff
 			}
-			if s01b8 < 0 {
-				s01b8 = 0
-			} else if s01b8 > 0xff {
-				s01b8 = 0xff
+			if s01bu < 0 {
+				s01bu = 0
+			} else if s01bu > 0xffff {
+				s01bu = 0xffff
 			}
 
-			s01ru := uint32(s01r8) * 0x101
-			s01gu := uint32(s01g8) * 0x101
-			s01bu := uint32(s01b8) * 0x101
 			s01r := float64(s01ru)
 			s01g := float64(s01gu)
 			s01b := float64(s01bu)
 			s11i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx1) - src.Rect.Min.X)
 			s11j := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.CStride + ((sr.Min.X+int(sx1))/2 - src.Rect.Min.X/2)
 
-			// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+			// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 			s11yy1 := int(src.Y[s11i])<<16 + 1<<15
 			s11cb1 := int(src.Cb[s11j]) - 128
 			s11cr1 := int(src.Cr[s11j]) - 128
-			s11r8 := (s11yy1 + 91881*s11cr1) >> 16
-			s11g8 := (s11yy1 - 22554*s11cb1 - 46802*s11cr1) >> 16
-			s11b8 := (s11yy1 + 116130*s11cb1) >> 16
-			if s11r8 < 0 {
-				s11r8 = 0
-			} else if s11r8 > 0xff {
-				s11r8 = 0xff
+			s11ru := (s11yy1 + 91881*s11cr1) >> 8
+			s11gu := (s11yy1 - 22554*s11cb1 - 46802*s11cr1) >> 8
+			s11bu := (s11yy1 + 116130*s11cb1) >> 8
+			if s11ru < 0 {
+				s11ru = 0
+			} else if s11ru > 0xffff {
+				s11ru = 0xffff
 			}
-			if s11g8 < 0 {
-				s11g8 = 0
-			} else if s11g8 > 0xff {
-				s11g8 = 0xff
+			if s11gu < 0 {
+				s11gu = 0
+			} else if s11gu > 0xffff {
+				s11gu = 0xffff
 			}
-			if s11b8 < 0 {
-				s11b8 = 0
-			} else if s11b8 > 0xff {
-				s11b8 = 0xff
+			if s11bu < 0 {
+				s11bu = 0
+			} else if s11bu > 0xffff {
+				s11bu = 0xffff
 			}
 
-			s11ru := uint32(s11r8) * 0x101
-			s11gu := uint32(s11g8) * 0x101
-			s11bu := uint32(s11b8) * 0x101
 			s11r := float64(s11ru)
 			s11g := float64(s11gu)
 			s11b := float64(s11bu)
@@ -1500,64 +1444,58 @@
 			s00i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx0) - src.Rect.Min.X)
 			s00j := ((sr.Min.Y+int(sy0))/2-src.Rect.Min.Y/2)*src.CStride + ((sr.Min.X+int(sx0))/2 - src.Rect.Min.X/2)
 
-			// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+			// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 			s00yy1 := int(src.Y[s00i])<<16 + 1<<15
 			s00cb1 := int(src.Cb[s00j]) - 128
 			s00cr1 := int(src.Cr[s00j]) - 128
-			s00r8 := (s00yy1 + 91881*s00cr1) >> 16
-			s00g8 := (s00yy1 - 22554*s00cb1 - 46802*s00cr1) >> 16
-			s00b8 := (s00yy1 + 116130*s00cb1) >> 16
-			if s00r8 < 0 {
-				s00r8 = 0
-			} else if s00r8 > 0xff {
-				s00r8 = 0xff
+			s00ru := (s00yy1 + 91881*s00cr1) >> 8
+			s00gu := (s00yy1 - 22554*s00cb1 - 46802*s00cr1) >> 8
+			s00bu := (s00yy1 + 116130*s00cb1) >> 8
+			if s00ru < 0 {
+				s00ru = 0
+			} else if s00ru > 0xffff {
+				s00ru = 0xffff
 			}
-			if s00g8 < 0 {
-				s00g8 = 0
-			} else if s00g8 > 0xff {
-				s00g8 = 0xff
+			if s00gu < 0 {
+				s00gu = 0
+			} else if s00gu > 0xffff {
+				s00gu = 0xffff
 			}
-			if s00b8 < 0 {
-				s00b8 = 0
-			} else if s00b8 > 0xff {
-				s00b8 = 0xff
+			if s00bu < 0 {
+				s00bu = 0
+			} else if s00bu > 0xffff {
+				s00bu = 0xffff
 			}
 
-			s00ru := uint32(s00r8) * 0x101
-			s00gu := uint32(s00g8) * 0x101
-			s00bu := uint32(s00b8) * 0x101
 			s00r := float64(s00ru)
 			s00g := float64(s00gu)
 			s00b := float64(s00bu)
 			s10i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx1) - src.Rect.Min.X)
 			s10j := ((sr.Min.Y+int(sy0))/2-src.Rect.Min.Y/2)*src.CStride + ((sr.Min.X+int(sx1))/2 - src.Rect.Min.X/2)
 
-			// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+			// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 			s10yy1 := int(src.Y[s10i])<<16 + 1<<15
 			s10cb1 := int(src.Cb[s10j]) - 128
 			s10cr1 := int(src.Cr[s10j]) - 128
-			s10r8 := (s10yy1 + 91881*s10cr1) >> 16
-			s10g8 := (s10yy1 - 22554*s10cb1 - 46802*s10cr1) >> 16
-			s10b8 := (s10yy1 + 116130*s10cb1) >> 16
-			if s10r8 < 0 {
-				s10r8 = 0
-			} else if s10r8 > 0xff {
-				s10r8 = 0xff
+			s10ru := (s10yy1 + 91881*s10cr1) >> 8
+			s10gu := (s10yy1 - 22554*s10cb1 - 46802*s10cr1) >> 8
+			s10bu := (s10yy1 + 116130*s10cb1) >> 8
+			if s10ru < 0 {
+				s10ru = 0
+			} else if s10ru > 0xffff {
+				s10ru = 0xffff
 			}
-			if s10g8 < 0 {
-				s10g8 = 0
-			} else if s10g8 > 0xff {
-				s10g8 = 0xff
+			if s10gu < 0 {
+				s10gu = 0
+			} else if s10gu > 0xffff {
+				s10gu = 0xffff
 			}
-			if s10b8 < 0 {
-				s10b8 = 0
-			} else if s10b8 > 0xff {
-				s10b8 = 0xff
+			if s10bu < 0 {
+				s10bu = 0
+			} else if s10bu > 0xffff {
+				s10bu = 0xffff
 			}
 
-			s10ru := uint32(s10r8) * 0x101
-			s10gu := uint32(s10g8) * 0x101
-			s10bu := uint32(s10b8) * 0x101
 			s10r := float64(s10ru)
 			s10g := float64(s10gu)
 			s10b := float64(s10bu)
@@ -1567,64 +1505,58 @@
 			s01i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx0) - src.Rect.Min.X)
 			s01j := ((sr.Min.Y+int(sy1))/2-src.Rect.Min.Y/2)*src.CStride + ((sr.Min.X+int(sx0))/2 - src.Rect.Min.X/2)
 
-			// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+			// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 			s01yy1 := int(src.Y[s01i])<<16 + 1<<15
 			s01cb1 := int(src.Cb[s01j]) - 128
 			s01cr1 := int(src.Cr[s01j]) - 128
-			s01r8 := (s01yy1 + 91881*s01cr1) >> 16
-			s01g8 := (s01yy1 - 22554*s01cb1 - 46802*s01cr1) >> 16
-			s01b8 := (s01yy1 + 116130*s01cb1) >> 16
-			if s01r8 < 0 {
-				s01r8 = 0
-			} else if s01r8 > 0xff {
-				s01r8 = 0xff
+			s01ru := (s01yy1 + 91881*s01cr1) >> 8
+			s01gu := (s01yy1 - 22554*s01cb1 - 46802*s01cr1) >> 8
+			s01bu := (s01yy1 + 116130*s01cb1) >> 8
+			if s01ru < 0 {
+				s01ru = 0
+			} else if s01ru > 0xffff {
+				s01ru = 0xffff
 			}
-			if s01g8 < 0 {
-				s01g8 = 0
-			} else if s01g8 > 0xff {
-				s01g8 = 0xff
+			if s01gu < 0 {
+				s01gu = 0
+			} else if s01gu > 0xffff {
+				s01gu = 0xffff
 			}
-			if s01b8 < 0 {
-				s01b8 = 0
-			} else if s01b8 > 0xff {
-				s01b8 = 0xff
+			if s01bu < 0 {
+				s01bu = 0
+			} else if s01bu > 0xffff {
+				s01bu = 0xffff
 			}
 
-			s01ru := uint32(s01r8) * 0x101
-			s01gu := uint32(s01g8) * 0x101
-			s01bu := uint32(s01b8) * 0x101
 			s01r := float64(s01ru)
 			s01g := float64(s01gu)
 			s01b := float64(s01bu)
 			s11i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx1) - src.Rect.Min.X)
 			s11j := ((sr.Min.Y+int(sy1))/2-src.Rect.Min.Y/2)*src.CStride + ((sr.Min.X+int(sx1))/2 - src.Rect.Min.X/2)
 
-			// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+			// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 			s11yy1 := int(src.Y[s11i])<<16 + 1<<15
 			s11cb1 := int(src.Cb[s11j]) - 128
 			s11cr1 := int(src.Cr[s11j]) - 128
-			s11r8 := (s11yy1 + 91881*s11cr1) >> 16
-			s11g8 := (s11yy1 - 22554*s11cb1 - 46802*s11cr1) >> 16
-			s11b8 := (s11yy1 + 116130*s11cb1) >> 16
-			if s11r8 < 0 {
-				s11r8 = 0
-			} else if s11r8 > 0xff {
-				s11r8 = 0xff
+			s11ru := (s11yy1 + 91881*s11cr1) >> 8
+			s11gu := (s11yy1 - 22554*s11cb1 - 46802*s11cr1) >> 8
+			s11bu := (s11yy1 + 116130*s11cb1) >> 8
+			if s11ru < 0 {
+				s11ru = 0
+			} else if s11ru > 0xffff {
+				s11ru = 0xffff
 			}
-			if s11g8 < 0 {
-				s11g8 = 0
-			} else if s11g8 > 0xff {
-				s11g8 = 0xff
+			if s11gu < 0 {
+				s11gu = 0
+			} else if s11gu > 0xffff {
+				s11gu = 0xffff
 			}
-			if s11b8 < 0 {
-				s11b8 = 0
-			} else if s11b8 > 0xff {
-				s11b8 = 0xff
+			if s11bu < 0 {
+				s11bu = 0
+			} else if s11bu > 0xffff {
+				s11bu = 0xffff
 			}
 
-			s11ru := uint32(s11r8) * 0x101
-			s11gu := uint32(s11g8) * 0x101
-			s11bu := uint32(s11b8) * 0x101
 			s11r := float64(s11ru)
 			s11g := float64(s11gu)
 			s11b := float64(s11bu)
@@ -1684,64 +1616,58 @@
 			s00i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx0) - src.Rect.Min.X)
 			s00j := ((sr.Min.Y+int(sy0))/2-src.Rect.Min.Y/2)*src.CStride + (sr.Min.X + int(sx0) - src.Rect.Min.X)
 
-			// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+			// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 			s00yy1 := int(src.Y[s00i])<<16 + 1<<15
 			s00cb1 := int(src.Cb[s00j]) - 128
 			s00cr1 := int(src.Cr[s00j]) - 128
-			s00r8 := (s00yy1 + 91881*s00cr1) >> 16
-			s00g8 := (s00yy1 - 22554*s00cb1 - 46802*s00cr1) >> 16
-			s00b8 := (s00yy1 + 116130*s00cb1) >> 16
-			if s00r8 < 0 {
-				s00r8 = 0
-			} else if s00r8 > 0xff {
-				s00r8 = 0xff
+			s00ru := (s00yy1 + 91881*s00cr1) >> 8
+			s00gu := (s00yy1 - 22554*s00cb1 - 46802*s00cr1) >> 8
+			s00bu := (s00yy1 + 116130*s00cb1) >> 8
+			if s00ru < 0 {
+				s00ru = 0
+			} else if s00ru > 0xffff {
+				s00ru = 0xffff
 			}
-			if s00g8 < 0 {
-				s00g8 = 0
-			} else if s00g8 > 0xff {
-				s00g8 = 0xff
+			if s00gu < 0 {
+				s00gu = 0
+			} else if s00gu > 0xffff {
+				s00gu = 0xffff
 			}
-			if s00b8 < 0 {
-				s00b8 = 0
-			} else if s00b8 > 0xff {
-				s00b8 = 0xff
+			if s00bu < 0 {
+				s00bu = 0
+			} else if s00bu > 0xffff {
+				s00bu = 0xffff
 			}
 
-			s00ru := uint32(s00r8) * 0x101
-			s00gu := uint32(s00g8) * 0x101
-			s00bu := uint32(s00b8) * 0x101
 			s00r := float64(s00ru)
 			s00g := float64(s00gu)
 			s00b := float64(s00bu)
 			s10i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx1) - src.Rect.Min.X)
 			s10j := ((sr.Min.Y+int(sy0))/2-src.Rect.Min.Y/2)*src.CStride + (sr.Min.X + int(sx1) - src.Rect.Min.X)
 
-			// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+			// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 			s10yy1 := int(src.Y[s10i])<<16 + 1<<15
 			s10cb1 := int(src.Cb[s10j]) - 128
 			s10cr1 := int(src.Cr[s10j]) - 128
-			s10r8 := (s10yy1 + 91881*s10cr1) >> 16
-			s10g8 := (s10yy1 - 22554*s10cb1 - 46802*s10cr1) >> 16
-			s10b8 := (s10yy1 + 116130*s10cb1) >> 16
-			if s10r8 < 0 {
-				s10r8 = 0
-			} else if s10r8 > 0xff {
-				s10r8 = 0xff
+			s10ru := (s10yy1 + 91881*s10cr1) >> 8
+			s10gu := (s10yy1 - 22554*s10cb1 - 46802*s10cr1) >> 8
+			s10bu := (s10yy1 + 116130*s10cb1) >> 8
+			if s10ru < 0 {
+				s10ru = 0
+			} else if s10ru > 0xffff {
+				s10ru = 0xffff
 			}
-			if s10g8 < 0 {
-				s10g8 = 0
-			} else if s10g8 > 0xff {
-				s10g8 = 0xff
+			if s10gu < 0 {
+				s10gu = 0
+			} else if s10gu > 0xffff {
+				s10gu = 0xffff
 			}
-			if s10b8 < 0 {
-				s10b8 = 0
-			} else if s10b8 > 0xff {
-				s10b8 = 0xff
+			if s10bu < 0 {
+				s10bu = 0
+			} else if s10bu > 0xffff {
+				s10bu = 0xffff
 			}
 
-			s10ru := uint32(s10r8) * 0x101
-			s10gu := uint32(s10g8) * 0x101
-			s10bu := uint32(s10b8) * 0x101
 			s10r := float64(s10ru)
 			s10g := float64(s10gu)
 			s10b := float64(s10bu)
@@ -1751,64 +1677,58 @@
 			s01i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx0) - src.Rect.Min.X)
 			s01j := ((sr.Min.Y+int(sy1))/2-src.Rect.Min.Y/2)*src.CStride + (sr.Min.X + int(sx0) - src.Rect.Min.X)
 
-			// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+			// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 			s01yy1 := int(src.Y[s01i])<<16 + 1<<15
 			s01cb1 := int(src.Cb[s01j]) - 128
 			s01cr1 := int(src.Cr[s01j]) - 128
-			s01r8 := (s01yy1 + 91881*s01cr1) >> 16
-			s01g8 := (s01yy1 - 22554*s01cb1 - 46802*s01cr1) >> 16
-			s01b8 := (s01yy1 + 116130*s01cb1) >> 16
-			if s01r8 < 0 {
-				s01r8 = 0
-			} else if s01r8 > 0xff {
-				s01r8 = 0xff
+			s01ru := (s01yy1 + 91881*s01cr1) >> 8
+			s01gu := (s01yy1 - 22554*s01cb1 - 46802*s01cr1) >> 8
+			s01bu := (s01yy1 + 116130*s01cb1) >> 8
+			if s01ru < 0 {
+				s01ru = 0
+			} else if s01ru > 0xffff {
+				s01ru = 0xffff
 			}
-			if s01g8 < 0 {
-				s01g8 = 0
-			} else if s01g8 > 0xff {
-				s01g8 = 0xff
+			if s01gu < 0 {
+				s01gu = 0
+			} else if s01gu > 0xffff {
+				s01gu = 0xffff
 			}
-			if s01b8 < 0 {
-				s01b8 = 0
-			} else if s01b8 > 0xff {
-				s01b8 = 0xff
+			if s01bu < 0 {
+				s01bu = 0
+			} else if s01bu > 0xffff {
+				s01bu = 0xffff
 			}
 
-			s01ru := uint32(s01r8) * 0x101
-			s01gu := uint32(s01g8) * 0x101
-			s01bu := uint32(s01b8) * 0x101
 			s01r := float64(s01ru)
 			s01g := float64(s01gu)
 			s01b := float64(s01bu)
 			s11i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx1) - src.Rect.Min.X)
 			s11j := ((sr.Min.Y+int(sy1))/2-src.Rect.Min.Y/2)*src.CStride + (sr.Min.X + int(sx1) - src.Rect.Min.X)
 
-			// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+			// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 			s11yy1 := int(src.Y[s11i])<<16 + 1<<15
 			s11cb1 := int(src.Cb[s11j]) - 128
 			s11cr1 := int(src.Cr[s11j]) - 128
-			s11r8 := (s11yy1 + 91881*s11cr1) >> 16
-			s11g8 := (s11yy1 - 22554*s11cb1 - 46802*s11cr1) >> 16
-			s11b8 := (s11yy1 + 116130*s11cb1) >> 16
-			if s11r8 < 0 {
-				s11r8 = 0
-			} else if s11r8 > 0xff {
-				s11r8 = 0xff
+			s11ru := (s11yy1 + 91881*s11cr1) >> 8
+			s11gu := (s11yy1 - 22554*s11cb1 - 46802*s11cr1) >> 8
+			s11bu := (s11yy1 + 116130*s11cb1) >> 8
+			if s11ru < 0 {
+				s11ru = 0
+			} else if s11ru > 0xffff {
+				s11ru = 0xffff
 			}
-			if s11g8 < 0 {
-				s11g8 = 0
-			} else if s11g8 > 0xff {
-				s11g8 = 0xff
+			if s11gu < 0 {
+				s11gu = 0
+			} else if s11gu > 0xffff {
+				s11gu = 0xffff
 			}
-			if s11b8 < 0 {
-				s11b8 = 0
-			} else if s11b8 > 0xff {
-				s11b8 = 0xff
+			if s11bu < 0 {
+				s11bu = 0
+			} else if s11bu > 0xffff {
+				s11bu = 0xffff
 			}
 
-			s11ru := uint32(s11r8) * 0x101
-			s11gu := uint32(s11g8) * 0x101
-			s11bu := uint32(s11b8) * 0x101
 			s11r := float64(s11ru)
 			s11g := float64(s11gu)
 			s11b := float64(s11bu)
@@ -2285,64 +2205,58 @@
 			s00i := (sy0-src.Rect.Min.Y)*src.YStride + (sx0 - src.Rect.Min.X)
 			s00j := (sy0-src.Rect.Min.Y)*src.CStride + (sx0 - src.Rect.Min.X)
 
-			// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+			// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 			s00yy1 := int(src.Y[s00i])<<16 + 1<<15
 			s00cb1 := int(src.Cb[s00j]) - 128
 			s00cr1 := int(src.Cr[s00j]) - 128
-			s00r8 := (s00yy1 + 91881*s00cr1) >> 16
-			s00g8 := (s00yy1 - 22554*s00cb1 - 46802*s00cr1) >> 16
-			s00b8 := (s00yy1 + 116130*s00cb1) >> 16
-			if s00r8 < 0 {
-				s00r8 = 0
-			} else if s00r8 > 0xff {
-				s00r8 = 0xff
+			s00ru := (s00yy1 + 91881*s00cr1) >> 8
+			s00gu := (s00yy1 - 22554*s00cb1 - 46802*s00cr1) >> 8
+			s00bu := (s00yy1 + 116130*s00cb1) >> 8
+			if s00ru < 0 {
+				s00ru = 0
+			} else if s00ru > 0xffff {
+				s00ru = 0xffff
 			}
-			if s00g8 < 0 {
-				s00g8 = 0
-			} else if s00g8 > 0xff {
-				s00g8 = 0xff
+			if s00gu < 0 {
+				s00gu = 0
+			} else if s00gu > 0xffff {
+				s00gu = 0xffff
 			}
-			if s00b8 < 0 {
-				s00b8 = 0
-			} else if s00b8 > 0xff {
-				s00b8 = 0xff
+			if s00bu < 0 {
+				s00bu = 0
+			} else if s00bu > 0xffff {
+				s00bu = 0xffff
 			}
 
-			s00ru := uint32(s00r8) * 0x101
-			s00gu := uint32(s00g8) * 0x101
-			s00bu := uint32(s00b8) * 0x101
 			s00r := float64(s00ru)
 			s00g := float64(s00gu)
 			s00b := float64(s00bu)
 			s10i := (sy0-src.Rect.Min.Y)*src.YStride + (sx1 - src.Rect.Min.X)
 			s10j := (sy0-src.Rect.Min.Y)*src.CStride + (sx1 - src.Rect.Min.X)
 
-			// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+			// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 			s10yy1 := int(src.Y[s10i])<<16 + 1<<15
 			s10cb1 := int(src.Cb[s10j]) - 128
 			s10cr1 := int(src.Cr[s10j]) - 128
-			s10r8 := (s10yy1 + 91881*s10cr1) >> 16
-			s10g8 := (s10yy1 - 22554*s10cb1 - 46802*s10cr1) >> 16
-			s10b8 := (s10yy1 + 116130*s10cb1) >> 16
-			if s10r8 < 0 {
-				s10r8 = 0
-			} else if s10r8 > 0xff {
-				s10r8 = 0xff
+			s10ru := (s10yy1 + 91881*s10cr1) >> 8
+			s10gu := (s10yy1 - 22554*s10cb1 - 46802*s10cr1) >> 8
+			s10bu := (s10yy1 + 116130*s10cb1) >> 8
+			if s10ru < 0 {
+				s10ru = 0
+			} else if s10ru > 0xffff {
+				s10ru = 0xffff
 			}
-			if s10g8 < 0 {
-				s10g8 = 0
-			} else if s10g8 > 0xff {
-				s10g8 = 0xff
+			if s10gu < 0 {
+				s10gu = 0
+			} else if s10gu > 0xffff {
+				s10gu = 0xffff
 			}
-			if s10b8 < 0 {
-				s10b8 = 0
-			} else if s10b8 > 0xff {
-				s10b8 = 0xff
+			if s10bu < 0 {
+				s10bu = 0
+			} else if s10bu > 0xffff {
+				s10bu = 0xffff
 			}
 
-			s10ru := uint32(s10r8) * 0x101
-			s10gu := uint32(s10g8) * 0x101
-			s10bu := uint32(s10b8) * 0x101
 			s10r := float64(s10ru)
 			s10g := float64(s10gu)
 			s10b := float64(s10bu)
@@ -2352,64 +2266,58 @@
 			s01i := (sy1-src.Rect.Min.Y)*src.YStride + (sx0 - src.Rect.Min.X)
 			s01j := (sy1-src.Rect.Min.Y)*src.CStride + (sx0 - src.Rect.Min.X)
 
-			// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+			// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 			s01yy1 := int(src.Y[s01i])<<16 + 1<<15
 			s01cb1 := int(src.Cb[s01j]) - 128
 			s01cr1 := int(src.Cr[s01j]) - 128
-			s01r8 := (s01yy1 + 91881*s01cr1) >> 16
-			s01g8 := (s01yy1 - 22554*s01cb1 - 46802*s01cr1) >> 16
-			s01b8 := (s01yy1 + 116130*s01cb1) >> 16
-			if s01r8 < 0 {
-				s01r8 = 0
-			} else if s01r8 > 0xff {
-				s01r8 = 0xff
+			s01ru := (s01yy1 + 91881*s01cr1) >> 8
+			s01gu := (s01yy1 - 22554*s01cb1 - 46802*s01cr1) >> 8
+			s01bu := (s01yy1 + 116130*s01cb1) >> 8
+			if s01ru < 0 {
+				s01ru = 0
+			} else if s01ru > 0xffff {
+				s01ru = 0xffff
 			}
-			if s01g8 < 0 {
-				s01g8 = 0
-			} else if s01g8 > 0xff {
-				s01g8 = 0xff
+			if s01gu < 0 {
+				s01gu = 0
+			} else if s01gu > 0xffff {
+				s01gu = 0xffff
 			}
-			if s01b8 < 0 {
-				s01b8 = 0
-			} else if s01b8 > 0xff {
-				s01b8 = 0xff
+			if s01bu < 0 {
+				s01bu = 0
+			} else if s01bu > 0xffff {
+				s01bu = 0xffff
 			}
 
-			s01ru := uint32(s01r8) * 0x101
-			s01gu := uint32(s01g8) * 0x101
-			s01bu := uint32(s01b8) * 0x101
 			s01r := float64(s01ru)
 			s01g := float64(s01gu)
 			s01b := float64(s01bu)
 			s11i := (sy1-src.Rect.Min.Y)*src.YStride + (sx1 - src.Rect.Min.X)
 			s11j := (sy1-src.Rect.Min.Y)*src.CStride + (sx1 - src.Rect.Min.X)
 
-			// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+			// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 			s11yy1 := int(src.Y[s11i])<<16 + 1<<15
 			s11cb1 := int(src.Cb[s11j]) - 128
 			s11cr1 := int(src.Cr[s11j]) - 128
-			s11r8 := (s11yy1 + 91881*s11cr1) >> 16
-			s11g8 := (s11yy1 - 22554*s11cb1 - 46802*s11cr1) >> 16
-			s11b8 := (s11yy1 + 116130*s11cb1) >> 16
-			if s11r8 < 0 {
-				s11r8 = 0
-			} else if s11r8 > 0xff {
-				s11r8 = 0xff
+			s11ru := (s11yy1 + 91881*s11cr1) >> 8
+			s11gu := (s11yy1 - 22554*s11cb1 - 46802*s11cr1) >> 8
+			s11bu := (s11yy1 + 116130*s11cb1) >> 8
+			if s11ru < 0 {
+				s11ru = 0
+			} else if s11ru > 0xffff {
+				s11ru = 0xffff
 			}
-			if s11g8 < 0 {
-				s11g8 = 0
-			} else if s11g8 > 0xff {
-				s11g8 = 0xff
+			if s11gu < 0 {
+				s11gu = 0
+			} else if s11gu > 0xffff {
+				s11gu = 0xffff
 			}
-			if s11b8 < 0 {
-				s11b8 = 0
-			} else if s11b8 > 0xff {
-				s11b8 = 0xff
+			if s11bu < 0 {
+				s11bu = 0
+			} else if s11bu > 0xffff {
+				s11bu = 0xffff
 			}
 
-			s11ru := uint32(s11r8) * 0x101
-			s11gu := uint32(s11g8) * 0x101
-			s11bu := uint32(s11b8) * 0x101
 			s11r := float64(s11ru)
 			s11g := float64(s11gu)
 			s11b := float64(s11bu)
@@ -2470,64 +2378,58 @@
 			s00i := (sy0-src.Rect.Min.Y)*src.YStride + (sx0 - src.Rect.Min.X)
 			s00j := (sy0-src.Rect.Min.Y)*src.CStride + ((sx0)/2 - src.Rect.Min.X/2)
 
-			// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+			// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 			s00yy1 := int(src.Y[s00i])<<16 + 1<<15
 			s00cb1 := int(src.Cb[s00j]) - 128
 			s00cr1 := int(src.Cr[s00j]) - 128
-			s00r8 := (s00yy1 + 91881*s00cr1) >> 16
-			s00g8 := (s00yy1 - 22554*s00cb1 - 46802*s00cr1) >> 16
-			s00b8 := (s00yy1 + 116130*s00cb1) >> 16
-			if s00r8 < 0 {
-				s00r8 = 0
-			} else if s00r8 > 0xff {
-				s00r8 = 0xff
+			s00ru := (s00yy1 + 91881*s00cr1) >> 8
+			s00gu := (s00yy1 - 22554*s00cb1 - 46802*s00cr1) >> 8
+			s00bu := (s00yy1 + 116130*s00cb1) >> 8
+			if s00ru < 0 {
+				s00ru = 0
+			} else if s00ru > 0xffff {
+				s00ru = 0xffff
 			}
-			if s00g8 < 0 {
-				s00g8 = 0
-			} else if s00g8 > 0xff {
-				s00g8 = 0xff
+			if s00gu < 0 {
+				s00gu = 0
+			} else if s00gu > 0xffff {
+				s00gu = 0xffff
 			}
-			if s00b8 < 0 {
-				s00b8 = 0
-			} else if s00b8 > 0xff {
-				s00b8 = 0xff
+			if s00bu < 0 {
+				s00bu = 0
+			} else if s00bu > 0xffff {
+				s00bu = 0xffff
 			}
 
-			s00ru := uint32(s00r8) * 0x101
-			s00gu := uint32(s00g8) * 0x101
-			s00bu := uint32(s00b8) * 0x101
 			s00r := float64(s00ru)
 			s00g := float64(s00gu)
 			s00b := float64(s00bu)
 			s10i := (sy0-src.Rect.Min.Y)*src.YStride + (sx1 - src.Rect.Min.X)
 			s10j := (sy0-src.Rect.Min.Y)*src.CStride + ((sx1)/2 - src.Rect.Min.X/2)
 
-			// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+			// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 			s10yy1 := int(src.Y[s10i])<<16 + 1<<15
 			s10cb1 := int(src.Cb[s10j]) - 128
 			s10cr1 := int(src.Cr[s10j]) - 128
-			s10r8 := (s10yy1 + 91881*s10cr1) >> 16
-			s10g8 := (s10yy1 - 22554*s10cb1 - 46802*s10cr1) >> 16
-			s10b8 := (s10yy1 + 116130*s10cb1) >> 16
-			if s10r8 < 0 {
-				s10r8 = 0
-			} else if s10r8 > 0xff {
-				s10r8 = 0xff
+			s10ru := (s10yy1 + 91881*s10cr1) >> 8
+			s10gu := (s10yy1 - 22554*s10cb1 - 46802*s10cr1) >> 8
+			s10bu := (s10yy1 + 116130*s10cb1) >> 8
+			if s10ru < 0 {
+				s10ru = 0
+			} else if s10ru > 0xffff {
+				s10ru = 0xffff
 			}
-			if s10g8 < 0 {
-				s10g8 = 0
-			} else if s10g8 > 0xff {
-				s10g8 = 0xff
+			if s10gu < 0 {
+				s10gu = 0
+			} else if s10gu > 0xffff {
+				s10gu = 0xffff
 			}
-			if s10b8 < 0 {
-				s10b8 = 0
-			} else if s10b8 > 0xff {
-				s10b8 = 0xff
+			if s10bu < 0 {
+				s10bu = 0
+			} else if s10bu > 0xffff {
+				s10bu = 0xffff
 			}
 
-			s10ru := uint32(s10r8) * 0x101
-			s10gu := uint32(s10g8) * 0x101
-			s10bu := uint32(s10b8) * 0x101
 			s10r := float64(s10ru)
 			s10g := float64(s10gu)
 			s10b := float64(s10bu)
@@ -2537,64 +2439,58 @@
 			s01i := (sy1-src.Rect.Min.Y)*src.YStride + (sx0 - src.Rect.Min.X)
 			s01j := (sy1-src.Rect.Min.Y)*src.CStride + ((sx0)/2 - src.Rect.Min.X/2)
 
-			// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+			// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 			s01yy1 := int(src.Y[s01i])<<16 + 1<<15
 			s01cb1 := int(src.Cb[s01j]) - 128
 			s01cr1 := int(src.Cr[s01j]) - 128
-			s01r8 := (s01yy1 + 91881*s01cr1) >> 16
-			s01g8 := (s01yy1 - 22554*s01cb1 - 46802*s01cr1) >> 16
-			s01b8 := (s01yy1 + 116130*s01cb1) >> 16
-			if s01r8 < 0 {
-				s01r8 = 0
-			} else if s01r8 > 0xff {
-				s01r8 = 0xff
+			s01ru := (s01yy1 + 91881*s01cr1) >> 8
+			s01gu := (s01yy1 - 22554*s01cb1 - 46802*s01cr1) >> 8
+			s01bu := (s01yy1 + 116130*s01cb1) >> 8
+			if s01ru < 0 {
+				s01ru = 0
+			} else if s01ru > 0xffff {
+				s01ru = 0xffff
 			}
-			if s01g8 < 0 {
-				s01g8 = 0
-			} else if s01g8 > 0xff {
-				s01g8 = 0xff
+			if s01gu < 0 {
+				s01gu = 0
+			} else if s01gu > 0xffff {
+				s01gu = 0xffff
 			}
-			if s01b8 < 0 {
-				s01b8 = 0
-			} else if s01b8 > 0xff {
-				s01b8 = 0xff
+			if s01bu < 0 {
+				s01bu = 0
+			} else if s01bu > 0xffff {
+				s01bu = 0xffff
 			}
 
-			s01ru := uint32(s01r8) * 0x101
-			s01gu := uint32(s01g8) * 0x101
-			s01bu := uint32(s01b8) * 0x101
 			s01r := float64(s01ru)
 			s01g := float64(s01gu)
 			s01b := float64(s01bu)
 			s11i := (sy1-src.Rect.Min.Y)*src.YStride + (sx1 - src.Rect.Min.X)
 			s11j := (sy1-src.Rect.Min.Y)*src.CStride + ((sx1)/2 - src.Rect.Min.X/2)
 
-			// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+			// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 			s11yy1 := int(src.Y[s11i])<<16 + 1<<15
 			s11cb1 := int(src.Cb[s11j]) - 128
 			s11cr1 := int(src.Cr[s11j]) - 128
-			s11r8 := (s11yy1 + 91881*s11cr1) >> 16
-			s11g8 := (s11yy1 - 22554*s11cb1 - 46802*s11cr1) >> 16
-			s11b8 := (s11yy1 + 116130*s11cb1) >> 16
-			if s11r8 < 0 {
-				s11r8 = 0
-			} else if s11r8 > 0xff {
-				s11r8 = 0xff
+			s11ru := (s11yy1 + 91881*s11cr1) >> 8
+			s11gu := (s11yy1 - 22554*s11cb1 - 46802*s11cr1) >> 8
+			s11bu := (s11yy1 + 116130*s11cb1) >> 8
+			if s11ru < 0 {
+				s11ru = 0
+			} else if s11ru > 0xffff {
+				s11ru = 0xffff
 			}
-			if s11g8 < 0 {
-				s11g8 = 0
-			} else if s11g8 > 0xff {
-				s11g8 = 0xff
+			if s11gu < 0 {
+				s11gu = 0
+			} else if s11gu > 0xffff {
+				s11gu = 0xffff
 			}
-			if s11b8 < 0 {
-				s11b8 = 0
-			} else if s11b8 > 0xff {
-				s11b8 = 0xff
+			if s11bu < 0 {
+				s11bu = 0
+			} else if s11bu > 0xffff {
+				s11bu = 0xffff
 			}
 
-			s11ru := uint32(s11r8) * 0x101
-			s11gu := uint32(s11g8) * 0x101
-			s11bu := uint32(s11b8) * 0x101
 			s11r := float64(s11ru)
 			s11g := float64(s11gu)
 			s11b := float64(s11bu)
@@ -2655,64 +2551,58 @@
 			s00i := (sy0-src.Rect.Min.Y)*src.YStride + (sx0 - src.Rect.Min.X)
 			s00j := ((sy0)/2-src.Rect.Min.Y/2)*src.CStride + ((sx0)/2 - src.Rect.Min.X/2)
 
-			// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+			// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 			s00yy1 := int(src.Y[s00i])<<16 + 1<<15
 			s00cb1 := int(src.Cb[s00j]) - 128
 			s00cr1 := int(src.Cr[s00j]) - 128
-			s00r8 := (s00yy1 + 91881*s00cr1) >> 16
-			s00g8 := (s00yy1 - 22554*s00cb1 - 46802*s00cr1) >> 16
-			s00b8 := (s00yy1 + 116130*s00cb1) >> 16
-			if s00r8 < 0 {
-				s00r8 = 0
-			} else if s00r8 > 0xff {
-				s00r8 = 0xff
+			s00ru := (s00yy1 + 91881*s00cr1) >> 8
+			s00gu := (s00yy1 - 22554*s00cb1 - 46802*s00cr1) >> 8
+			s00bu := (s00yy1 + 116130*s00cb1) >> 8
+			if s00ru < 0 {
+				s00ru = 0
+			} else if s00ru > 0xffff {
+				s00ru = 0xffff
 			}
-			if s00g8 < 0 {
-				s00g8 = 0
-			} else if s00g8 > 0xff {
-				s00g8 = 0xff
+			if s00gu < 0 {
+				s00gu = 0
+			} else if s00gu > 0xffff {
+				s00gu = 0xffff
 			}
-			if s00b8 < 0 {
-				s00b8 = 0
-			} else if s00b8 > 0xff {
-				s00b8 = 0xff
+			if s00bu < 0 {
+				s00bu = 0
+			} else if s00bu > 0xffff {
+				s00bu = 0xffff
 			}
 
-			s00ru := uint32(s00r8) * 0x101
-			s00gu := uint32(s00g8) * 0x101
-			s00bu := uint32(s00b8) * 0x101
 			s00r := float64(s00ru)
 			s00g := float64(s00gu)
 			s00b := float64(s00bu)
 			s10i := (sy0-src.Rect.Min.Y)*src.YStride + (sx1 - src.Rect.Min.X)
 			s10j := ((sy0)/2-src.Rect.Min.Y/2)*src.CStride + ((sx1)/2 - src.Rect.Min.X/2)
 
-			// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+			// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 			s10yy1 := int(src.Y[s10i])<<16 + 1<<15
 			s10cb1 := int(src.Cb[s10j]) - 128
 			s10cr1 := int(src.Cr[s10j]) - 128
-			s10r8 := (s10yy1 + 91881*s10cr1) >> 16
-			s10g8 := (s10yy1 - 22554*s10cb1 - 46802*s10cr1) >> 16
-			s10b8 := (s10yy1 + 116130*s10cb1) >> 16
-			if s10r8 < 0 {
-				s10r8 = 0
-			} else if s10r8 > 0xff {
-				s10r8 = 0xff
+			s10ru := (s10yy1 + 91881*s10cr1) >> 8
+			s10gu := (s10yy1 - 22554*s10cb1 - 46802*s10cr1) >> 8
+			s10bu := (s10yy1 + 116130*s10cb1) >> 8
+			if s10ru < 0 {
+				s10ru = 0
+			} else if s10ru > 0xffff {
+				s10ru = 0xffff
 			}
-			if s10g8 < 0 {
-				s10g8 = 0
-			} else if s10g8 > 0xff {
-				s10g8 = 0xff
+			if s10gu < 0 {
+				s10gu = 0
+			} else if s10gu > 0xffff {
+				s10gu = 0xffff
 			}
-			if s10b8 < 0 {
-				s10b8 = 0
-			} else if s10b8 > 0xff {
-				s10b8 = 0xff
+			if s10bu < 0 {
+				s10bu = 0
+			} else if s10bu > 0xffff {
+				s10bu = 0xffff
 			}
 
-			s10ru := uint32(s10r8) * 0x101
-			s10gu := uint32(s10g8) * 0x101
-			s10bu := uint32(s10b8) * 0x101
 			s10r := float64(s10ru)
 			s10g := float64(s10gu)
 			s10b := float64(s10bu)
@@ -2722,64 +2612,58 @@
 			s01i := (sy1-src.Rect.Min.Y)*src.YStride + (sx0 - src.Rect.Min.X)
 			s01j := ((sy1)/2-src.Rect.Min.Y/2)*src.CStride + ((sx0)/2 - src.Rect.Min.X/2)
 
-			// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+			// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 			s01yy1 := int(src.Y[s01i])<<16 + 1<<15
 			s01cb1 := int(src.Cb[s01j]) - 128
 			s01cr1 := int(src.Cr[s01j]) - 128
-			s01r8 := (s01yy1 + 91881*s01cr1) >> 16
-			s01g8 := (s01yy1 - 22554*s01cb1 - 46802*s01cr1) >> 16
-			s01b8 := (s01yy1 + 116130*s01cb1) >> 16
-			if s01r8 < 0 {
-				s01r8 = 0
-			} else if s01r8 > 0xff {
-				s01r8 = 0xff
+			s01ru := (s01yy1 + 91881*s01cr1) >> 8
+			s01gu := (s01yy1 - 22554*s01cb1 - 46802*s01cr1) >> 8
+			s01bu := (s01yy1 + 116130*s01cb1) >> 8
+			if s01ru < 0 {
+				s01ru = 0
+			} else if s01ru > 0xffff {
+				s01ru = 0xffff
 			}
-			if s01g8 < 0 {
-				s01g8 = 0
-			} else if s01g8 > 0xff {
-				s01g8 = 0xff
+			if s01gu < 0 {
+				s01gu = 0
+			} else if s01gu > 0xffff {
+				s01gu = 0xffff
 			}
-			if s01b8 < 0 {
-				s01b8 = 0
-			} else if s01b8 > 0xff {
-				s01b8 = 0xff
+			if s01bu < 0 {
+				s01bu = 0
+			} else if s01bu > 0xffff {
+				s01bu = 0xffff
 			}
 
-			s01ru := uint32(s01r8) * 0x101
-			s01gu := uint32(s01g8) * 0x101
-			s01bu := uint32(s01b8) * 0x101
 			s01r := float64(s01ru)
 			s01g := float64(s01gu)
 			s01b := float64(s01bu)
 			s11i := (sy1-src.Rect.Min.Y)*src.YStride + (sx1 - src.Rect.Min.X)
 			s11j := ((sy1)/2-src.Rect.Min.Y/2)*src.CStride + ((sx1)/2 - src.Rect.Min.X/2)
 
-			// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+			// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 			s11yy1 := int(src.Y[s11i])<<16 + 1<<15
 			s11cb1 := int(src.Cb[s11j]) - 128
 			s11cr1 := int(src.Cr[s11j]) - 128
-			s11r8 := (s11yy1 + 91881*s11cr1) >> 16
-			s11g8 := (s11yy1 - 22554*s11cb1 - 46802*s11cr1) >> 16
-			s11b8 := (s11yy1 + 116130*s11cb1) >> 16
-			if s11r8 < 0 {
-				s11r8 = 0
-			} else if s11r8 > 0xff {
-				s11r8 = 0xff
+			s11ru := (s11yy1 + 91881*s11cr1) >> 8
+			s11gu := (s11yy1 - 22554*s11cb1 - 46802*s11cr1) >> 8
+			s11bu := (s11yy1 + 116130*s11cb1) >> 8
+			if s11ru < 0 {
+				s11ru = 0
+			} else if s11ru > 0xffff {
+				s11ru = 0xffff
 			}
-			if s11g8 < 0 {
-				s11g8 = 0
-			} else if s11g8 > 0xff {
-				s11g8 = 0xff
+			if s11gu < 0 {
+				s11gu = 0
+			} else if s11gu > 0xffff {
+				s11gu = 0xffff
 			}
-			if s11b8 < 0 {
-				s11b8 = 0
-			} else if s11b8 > 0xff {
-				s11b8 = 0xff
+			if s11bu < 0 {
+				s11bu = 0
+			} else if s11bu > 0xffff {
+				s11bu = 0xffff
 			}
 
-			s11ru := uint32(s11r8) * 0x101
-			s11gu := uint32(s11g8) * 0x101
-			s11bu := uint32(s11b8) * 0x101
 			s11r := float64(s11ru)
 			s11g := float64(s11gu)
 			s11b := float64(s11bu)
@@ -2840,64 +2724,58 @@
 			s00i := (sy0-src.Rect.Min.Y)*src.YStride + (sx0 - src.Rect.Min.X)
 			s00j := ((sy0)/2-src.Rect.Min.Y/2)*src.CStride + (sx0 - src.Rect.Min.X)
 
-			// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+			// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 			s00yy1 := int(src.Y[s00i])<<16 + 1<<15
 			s00cb1 := int(src.Cb[s00j]) - 128
 			s00cr1 := int(src.Cr[s00j]) - 128
-			s00r8 := (s00yy1 + 91881*s00cr1) >> 16
-			s00g8 := (s00yy1 - 22554*s00cb1 - 46802*s00cr1) >> 16
-			s00b8 := (s00yy1 + 116130*s00cb1) >> 16
-			if s00r8 < 0 {
-				s00r8 = 0
-			} else if s00r8 > 0xff {
-				s00r8 = 0xff
+			s00ru := (s00yy1 + 91881*s00cr1) >> 8
+			s00gu := (s00yy1 - 22554*s00cb1 - 46802*s00cr1) >> 8
+			s00bu := (s00yy1 + 116130*s00cb1) >> 8
+			if s00ru < 0 {
+				s00ru = 0
+			} else if s00ru > 0xffff {
+				s00ru = 0xffff
 			}
-			if s00g8 < 0 {
-				s00g8 = 0
-			} else if s00g8 > 0xff {
-				s00g8 = 0xff
+			if s00gu < 0 {
+				s00gu = 0
+			} else if s00gu > 0xffff {
+				s00gu = 0xffff
 			}
-			if s00b8 < 0 {
-				s00b8 = 0
-			} else if s00b8 > 0xff {
-				s00b8 = 0xff
+			if s00bu < 0 {
+				s00bu = 0
+			} else if s00bu > 0xffff {
+				s00bu = 0xffff
 			}
 
-			s00ru := uint32(s00r8) * 0x101
-			s00gu := uint32(s00g8) * 0x101
-			s00bu := uint32(s00b8) * 0x101
 			s00r := float64(s00ru)
 			s00g := float64(s00gu)
 			s00b := float64(s00bu)
 			s10i := (sy0-src.Rect.Min.Y)*src.YStride + (sx1 - src.Rect.Min.X)
 			s10j := ((sy0)/2-src.Rect.Min.Y/2)*src.CStride + (sx1 - src.Rect.Min.X)
 
-			// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+			// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 			s10yy1 := int(src.Y[s10i])<<16 + 1<<15
 			s10cb1 := int(src.Cb[s10j]) - 128
 			s10cr1 := int(src.Cr[s10j]) - 128
-			s10r8 := (s10yy1 + 91881*s10cr1) >> 16
-			s10g8 := (s10yy1 - 22554*s10cb1 - 46802*s10cr1) >> 16
-			s10b8 := (s10yy1 + 116130*s10cb1) >> 16
-			if s10r8 < 0 {
-				s10r8 = 0
-			} else if s10r8 > 0xff {
-				s10r8 = 0xff
+			s10ru := (s10yy1 + 91881*s10cr1) >> 8
+			s10gu := (s10yy1 - 22554*s10cb1 - 46802*s10cr1) >> 8
+			s10bu := (s10yy1 + 116130*s10cb1) >> 8
+			if s10ru < 0 {
+				s10ru = 0
+			} else if s10ru > 0xffff {
+				s10ru = 0xffff
 			}
-			if s10g8 < 0 {
-				s10g8 = 0
-			} else if s10g8 > 0xff {
-				s10g8 = 0xff
+			if s10gu < 0 {
+				s10gu = 0
+			} else if s10gu > 0xffff {
+				s10gu = 0xffff
 			}
-			if s10b8 < 0 {
-				s10b8 = 0
-			} else if s10b8 > 0xff {
-				s10b8 = 0xff
+			if s10bu < 0 {
+				s10bu = 0
+			} else if s10bu > 0xffff {
+				s10bu = 0xffff
 			}
 
-			s10ru := uint32(s10r8) * 0x101
-			s10gu := uint32(s10g8) * 0x101
-			s10bu := uint32(s10b8) * 0x101
 			s10r := float64(s10ru)
 			s10g := float64(s10gu)
 			s10b := float64(s10bu)
@@ -2907,64 +2785,58 @@
 			s01i := (sy1-src.Rect.Min.Y)*src.YStride + (sx0 - src.Rect.Min.X)
 			s01j := ((sy1)/2-src.Rect.Min.Y/2)*src.CStride + (sx0 - src.Rect.Min.X)
 
-			// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+			// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 			s01yy1 := int(src.Y[s01i])<<16 + 1<<15
 			s01cb1 := int(src.Cb[s01j]) - 128
 			s01cr1 := int(src.Cr[s01j]) - 128
-			s01r8 := (s01yy1 + 91881*s01cr1) >> 16
-			s01g8 := (s01yy1 - 22554*s01cb1 - 46802*s01cr1) >> 16
-			s01b8 := (s01yy1 + 116130*s01cb1) >> 16
-			if s01r8 < 0 {
-				s01r8 = 0
-			} else if s01r8 > 0xff {
-				s01r8 = 0xff
+			s01ru := (s01yy1 + 91881*s01cr1) >> 8
+			s01gu := (s01yy1 - 22554*s01cb1 - 46802*s01cr1) >> 8
+			s01bu := (s01yy1 + 116130*s01cb1) >> 8
+			if s01ru < 0 {
+				s01ru = 0
+			} else if s01ru > 0xffff {
+				s01ru = 0xffff
 			}
-			if s01g8 < 0 {
-				s01g8 = 0
-			} else if s01g8 > 0xff {
-				s01g8 = 0xff
+			if s01gu < 0 {
+				s01gu = 0
+			} else if s01gu > 0xffff {
+				s01gu = 0xffff
 			}
-			if s01b8 < 0 {
-				s01b8 = 0
-			} else if s01b8 > 0xff {
-				s01b8 = 0xff
+			if s01bu < 0 {
+				s01bu = 0
+			} else if s01bu > 0xffff {
+				s01bu = 0xffff
 			}
 
-			s01ru := uint32(s01r8) * 0x101
-			s01gu := uint32(s01g8) * 0x101
-			s01bu := uint32(s01b8) * 0x101
 			s01r := float64(s01ru)
 			s01g := float64(s01gu)
 			s01b := float64(s01bu)
 			s11i := (sy1-src.Rect.Min.Y)*src.YStride + (sx1 - src.Rect.Min.X)
 			s11j := ((sy1)/2-src.Rect.Min.Y/2)*src.CStride + (sx1 - src.Rect.Min.X)
 
-			// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+			// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 			s11yy1 := int(src.Y[s11i])<<16 + 1<<15
 			s11cb1 := int(src.Cb[s11j]) - 128
 			s11cr1 := int(src.Cr[s11j]) - 128
-			s11r8 := (s11yy1 + 91881*s11cr1) >> 16
-			s11g8 := (s11yy1 - 22554*s11cb1 - 46802*s11cr1) >> 16
-			s11b8 := (s11yy1 + 116130*s11cb1) >> 16
-			if s11r8 < 0 {
-				s11r8 = 0
-			} else if s11r8 > 0xff {
-				s11r8 = 0xff
+			s11ru := (s11yy1 + 91881*s11cr1) >> 8
+			s11gu := (s11yy1 - 22554*s11cb1 - 46802*s11cr1) >> 8
+			s11bu := (s11yy1 + 116130*s11cb1) >> 8
+			if s11ru < 0 {
+				s11ru = 0
+			} else if s11ru > 0xffff {
+				s11ru = 0xffff
 			}
-			if s11g8 < 0 {
-				s11g8 = 0
-			} else if s11g8 > 0xff {
-				s11g8 = 0xff
+			if s11gu < 0 {
+				s11gu = 0
+			} else if s11gu > 0xffff {
+				s11gu = 0xffff
 			}
-			if s11b8 < 0 {
-				s11b8 = 0
-			} else if s11b8 > 0xff {
-				s11b8 = 0xff
+			if s11bu < 0 {
+				s11bu = 0
+			} else if s11bu > 0xffff {
+				s11bu = 0xffff
 			}
 
-			s11ru := uint32(s11r8) * 0x101
-			s11gu := uint32(s11g8) * 0x101
-			s11bu := uint32(s11b8) * 0x101
 			s11r := float64(s11ru)
 			s11g := float64(s11gu)
 			s11b := float64(s11bu)
@@ -3369,32 +3241,29 @@
 				pi := (sr.Min.Y+int(y)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(c.coord) - src.Rect.Min.X)
 				pj := (sr.Min.Y+int(y)-src.Rect.Min.Y)*src.CStride + (sr.Min.X + int(c.coord) - src.Rect.Min.X)
 
-				// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+				// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 				pyy1 := int(src.Y[pi])<<16 + 1<<15
 				pcb1 := int(src.Cb[pj]) - 128
 				pcr1 := int(src.Cr[pj]) - 128
-				pr8 := (pyy1 + 91881*pcr1) >> 16
-				pg8 := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 16
-				pb8 := (pyy1 + 116130*pcb1) >> 16
-				if pr8 < 0 {
-					pr8 = 0
-				} else if pr8 > 0xff {
-					pr8 = 0xff
+				pru := (pyy1 + 91881*pcr1) >> 8
+				pgu := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8
+				pbu := (pyy1 + 116130*pcb1) >> 8
+				if pru < 0 {
+					pru = 0
+				} else if pru > 0xffff {
+					pru = 0xffff
 				}
-				if pg8 < 0 {
-					pg8 = 0
-				} else if pg8 > 0xff {
-					pg8 = 0xff
+				if pgu < 0 {
+					pgu = 0
+				} else if pgu > 0xffff {
+					pgu = 0xffff
 				}
-				if pb8 < 0 {
-					pb8 = 0
-				} else if pb8 > 0xff {
-					pb8 = 0xff
+				if pbu < 0 {
+					pbu = 0
+				} else if pbu > 0xffff {
+					pbu = 0xffff
 				}
 
-				pru := uint32(pr8) * 0x101
-				pgu := uint32(pg8) * 0x101
-				pbu := uint32(pb8) * 0x101
 				pr += float64(pru) * c.weight
 				pg += float64(pgu) * c.weight
 				pb += float64(pbu) * c.weight
@@ -3419,32 +3288,29 @@
 				pi := (sr.Min.Y+int(y)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(c.coord) - src.Rect.Min.X)
 				pj := (sr.Min.Y+int(y)-src.Rect.Min.Y)*src.CStride + ((sr.Min.X+int(c.coord))/2 - src.Rect.Min.X/2)
 
-				// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+				// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 				pyy1 := int(src.Y[pi])<<16 + 1<<15
 				pcb1 := int(src.Cb[pj]) - 128
 				pcr1 := int(src.Cr[pj]) - 128
-				pr8 := (pyy1 + 91881*pcr1) >> 16
-				pg8 := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 16
-				pb8 := (pyy1 + 116130*pcb1) >> 16
-				if pr8 < 0 {
-					pr8 = 0
-				} else if pr8 > 0xff {
-					pr8 = 0xff
+				pru := (pyy1 + 91881*pcr1) >> 8
+				pgu := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8
+				pbu := (pyy1 + 116130*pcb1) >> 8
+				if pru < 0 {
+					pru = 0
+				} else if pru > 0xffff {
+					pru = 0xffff
 				}
-				if pg8 < 0 {
-					pg8 = 0
-				} else if pg8 > 0xff {
-					pg8 = 0xff
+				if pgu < 0 {
+					pgu = 0
+				} else if pgu > 0xffff {
+					pgu = 0xffff
 				}
-				if pb8 < 0 {
-					pb8 = 0
-				} else if pb8 > 0xff {
-					pb8 = 0xff
+				if pbu < 0 {
+					pbu = 0
+				} else if pbu > 0xffff {
+					pbu = 0xffff
 				}
 
-				pru := uint32(pr8) * 0x101
-				pgu := uint32(pg8) * 0x101
-				pbu := uint32(pb8) * 0x101
 				pr += float64(pru) * c.weight
 				pg += float64(pgu) * c.weight
 				pb += float64(pbu) * c.weight
@@ -3469,32 +3335,29 @@
 				pi := (sr.Min.Y+int(y)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(c.coord) - src.Rect.Min.X)
 				pj := ((sr.Min.Y+int(y))/2-src.Rect.Min.Y/2)*src.CStride + ((sr.Min.X+int(c.coord))/2 - src.Rect.Min.X/2)
 
-				// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+				// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 				pyy1 := int(src.Y[pi])<<16 + 1<<15
 				pcb1 := int(src.Cb[pj]) - 128
 				pcr1 := int(src.Cr[pj]) - 128
-				pr8 := (pyy1 + 91881*pcr1) >> 16
-				pg8 := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 16
-				pb8 := (pyy1 + 116130*pcb1) >> 16
-				if pr8 < 0 {
-					pr8 = 0
-				} else if pr8 > 0xff {
-					pr8 = 0xff
+				pru := (pyy1 + 91881*pcr1) >> 8
+				pgu := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8
+				pbu := (pyy1 + 116130*pcb1) >> 8
+				if pru < 0 {
+					pru = 0
+				} else if pru > 0xffff {
+					pru = 0xffff
 				}
-				if pg8 < 0 {
-					pg8 = 0
-				} else if pg8 > 0xff {
-					pg8 = 0xff
+				if pgu < 0 {
+					pgu = 0
+				} else if pgu > 0xffff {
+					pgu = 0xffff
 				}
-				if pb8 < 0 {
-					pb8 = 0
-				} else if pb8 > 0xff {
-					pb8 = 0xff
+				if pbu < 0 {
+					pbu = 0
+				} else if pbu > 0xffff {
+					pbu = 0xffff
 				}
 
-				pru := uint32(pr8) * 0x101
-				pgu := uint32(pg8) * 0x101
-				pbu := uint32(pb8) * 0x101
 				pr += float64(pru) * c.weight
 				pg += float64(pgu) * c.weight
 				pb += float64(pbu) * c.weight
@@ -3519,32 +3382,29 @@
 				pi := (sr.Min.Y+int(y)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(c.coord) - src.Rect.Min.X)
 				pj := ((sr.Min.Y+int(y))/2-src.Rect.Min.Y/2)*src.CStride + (sr.Min.X + int(c.coord) - src.Rect.Min.X)
 
-				// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+				// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 				pyy1 := int(src.Y[pi])<<16 + 1<<15
 				pcb1 := int(src.Cb[pj]) - 128
 				pcr1 := int(src.Cr[pj]) - 128
-				pr8 := (pyy1 + 91881*pcr1) >> 16
-				pg8 := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 16
-				pb8 := (pyy1 + 116130*pcb1) >> 16
-				if pr8 < 0 {
-					pr8 = 0
-				} else if pr8 > 0xff {
-					pr8 = 0xff
+				pru := (pyy1 + 91881*pcr1) >> 8
+				pgu := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8
+				pbu := (pyy1 + 116130*pcb1) >> 8
+				if pru < 0 {
+					pru = 0
+				} else if pru > 0xffff {
+					pru = 0xffff
 				}
-				if pg8 < 0 {
-					pg8 = 0
-				} else if pg8 > 0xff {
-					pg8 = 0xff
+				if pgu < 0 {
+					pgu = 0
+				} else if pgu > 0xffff {
+					pgu = 0xffff
 				}
-				if pb8 < 0 {
-					pb8 = 0
-				} else if pb8 > 0xff {
-					pb8 = 0xff
+				if pbu < 0 {
+					pbu = 0
+				} else if pbu > 0xffff {
+					pbu = 0xffff
 				}
 
-				pru := uint32(pr8) * 0x101
-				pgu := uint32(pg8) * 0x101
-				pbu := uint32(pb8) * 0x101
 				pr += float64(pru) * c.weight
 				pg += float64(pgu) * c.weight
 				pb += float64(pbu) * c.weight
@@ -4019,32 +3879,29 @@
 							pi := (ky-src.Rect.Min.Y)*src.YStride + (kx - src.Rect.Min.X)
 							pj := (ky-src.Rect.Min.Y)*src.CStride + (kx - src.Rect.Min.X)
 
-							// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+							// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 							pyy1 := int(src.Y[pi])<<16 + 1<<15
 							pcb1 := int(src.Cb[pj]) - 128
 							pcr1 := int(src.Cr[pj]) - 128
-							pr8 := (pyy1 + 91881*pcr1) >> 16
-							pg8 := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 16
-							pb8 := (pyy1 + 116130*pcb1) >> 16
-							if pr8 < 0 {
-								pr8 = 0
-							} else if pr8 > 0xff {
-								pr8 = 0xff
+							pru := (pyy1 + 91881*pcr1) >> 8
+							pgu := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8
+							pbu := (pyy1 + 116130*pcb1) >> 8
+							if pru < 0 {
+								pru = 0
+							} else if pru > 0xffff {
+								pru = 0xffff
 							}
-							if pg8 < 0 {
-								pg8 = 0
-							} else if pg8 > 0xff {
-								pg8 = 0xff
+							if pgu < 0 {
+								pgu = 0
+							} else if pgu > 0xffff {
+								pgu = 0xffff
 							}
-							if pb8 < 0 {
-								pb8 = 0
-							} else if pb8 > 0xff {
-								pb8 = 0xff
+							if pbu < 0 {
+								pbu = 0
+							} else if pbu > 0xffff {
+								pbu = 0xffff
 							}
 
-							pru := uint32(pr8) * 0x101
-							pgu := uint32(pg8) * 0x101
-							pbu := uint32(pb8) * 0x101
 							pr += float64(pru) * w
 							pg += float64(pgu) * w
 							pb += float64(pbu) * w
@@ -4146,32 +4003,29 @@
 							pi := (ky-src.Rect.Min.Y)*src.YStride + (kx - src.Rect.Min.X)
 							pj := (ky-src.Rect.Min.Y)*src.CStride + ((kx)/2 - src.Rect.Min.X/2)
 
-							// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+							// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 							pyy1 := int(src.Y[pi])<<16 + 1<<15
 							pcb1 := int(src.Cb[pj]) - 128
 							pcr1 := int(src.Cr[pj]) - 128
-							pr8 := (pyy1 + 91881*pcr1) >> 16
-							pg8 := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 16
-							pb8 := (pyy1 + 116130*pcb1) >> 16
-							if pr8 < 0 {
-								pr8 = 0
-							} else if pr8 > 0xff {
-								pr8 = 0xff
+							pru := (pyy1 + 91881*pcr1) >> 8
+							pgu := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8
+							pbu := (pyy1 + 116130*pcb1) >> 8
+							if pru < 0 {
+								pru = 0
+							} else if pru > 0xffff {
+								pru = 0xffff
 							}
-							if pg8 < 0 {
-								pg8 = 0
-							} else if pg8 > 0xff {
-								pg8 = 0xff
+							if pgu < 0 {
+								pgu = 0
+							} else if pgu > 0xffff {
+								pgu = 0xffff
 							}
-							if pb8 < 0 {
-								pb8 = 0
-							} else if pb8 > 0xff {
-								pb8 = 0xff
+							if pbu < 0 {
+								pbu = 0
+							} else if pbu > 0xffff {
+								pbu = 0xffff
 							}
 
-							pru := uint32(pr8) * 0x101
-							pgu := uint32(pg8) * 0x101
-							pbu := uint32(pb8) * 0x101
 							pr += float64(pru) * w
 							pg += float64(pgu) * w
 							pb += float64(pbu) * w
@@ -4273,32 +4127,29 @@
 							pi := (ky-src.Rect.Min.Y)*src.YStride + (kx - src.Rect.Min.X)
 							pj := ((ky)/2-src.Rect.Min.Y/2)*src.CStride + ((kx)/2 - src.Rect.Min.X/2)
 
-							// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+							// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 							pyy1 := int(src.Y[pi])<<16 + 1<<15
 							pcb1 := int(src.Cb[pj]) - 128
 							pcr1 := int(src.Cr[pj]) - 128
-							pr8 := (pyy1 + 91881*pcr1) >> 16
-							pg8 := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 16
-							pb8 := (pyy1 + 116130*pcb1) >> 16
-							if pr8 < 0 {
-								pr8 = 0
-							} else if pr8 > 0xff {
-								pr8 = 0xff
+							pru := (pyy1 + 91881*pcr1) >> 8
+							pgu := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8
+							pbu := (pyy1 + 116130*pcb1) >> 8
+							if pru < 0 {
+								pru = 0
+							} else if pru > 0xffff {
+								pru = 0xffff
 							}
-							if pg8 < 0 {
-								pg8 = 0
-							} else if pg8 > 0xff {
-								pg8 = 0xff
+							if pgu < 0 {
+								pgu = 0
+							} else if pgu > 0xffff {
+								pgu = 0xffff
 							}
-							if pb8 < 0 {
-								pb8 = 0
-							} else if pb8 > 0xff {
-								pb8 = 0xff
+							if pbu < 0 {
+								pbu = 0
+							} else if pbu > 0xffff {
+								pbu = 0xffff
 							}
 
-							pru := uint32(pr8) * 0x101
-							pgu := uint32(pg8) * 0x101
-							pbu := uint32(pb8) * 0x101
 							pr += float64(pru) * w
 							pg += float64(pgu) * w
 							pb += float64(pbu) * w
@@ -4400,32 +4251,29 @@
 							pi := (ky-src.Rect.Min.Y)*src.YStride + (kx - src.Rect.Min.X)
 							pj := ((ky)/2-src.Rect.Min.Y/2)*src.CStride + (kx - src.Rect.Min.X)
 
-							// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
+							// This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method.
 							pyy1 := int(src.Y[pi])<<16 + 1<<15
 							pcb1 := int(src.Cb[pj]) - 128
 							pcr1 := int(src.Cr[pj]) - 128
-							pr8 := (pyy1 + 91881*pcr1) >> 16
-							pg8 := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 16
-							pb8 := (pyy1 + 116130*pcb1) >> 16
-							if pr8 < 0 {
-								pr8 = 0
-							} else if pr8 > 0xff {
-								pr8 = 0xff
+							pru := (pyy1 + 91881*pcr1) >> 8
+							pgu := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8
+							pbu := (pyy1 + 116130*pcb1) >> 8
+							if pru < 0 {
+								pru = 0
+							} else if pru > 0xffff {
+								pru = 0xffff
 							}
-							if pg8 < 0 {
-								pg8 = 0
-							} else if pg8 > 0xff {
-								pg8 = 0xff
+							if pgu < 0 {
+								pgu = 0
+							} else if pgu > 0xffff {
+								pgu = 0xffff
 							}
-							if pb8 < 0 {
-								pb8 = 0
-							} else if pb8 > 0xff {
-								pb8 = 0xff
+							if pbu < 0 {
+								pbu = 0
+							} else if pbu > 0xffff {
+								pbu = 0xffff
 							}
 
-							pru := uint32(pr8) * 0x101
-							pgu := uint32(pg8) * 0x101
-							pbu := uint32(pb8) * 0x101
 							pr += float64(pru) * w
 							pg += float64(pgu) * w
 							pb += float64(pbu) * w
diff --git a/testdata/go-turns-two-down-ab.png b/testdata/go-turns-two-down-ab.png
index c7a1170..62c2995 100644
--- a/testdata/go-turns-two-down-ab.png
+++ b/testdata/go-turns-two-down-ab.png
Binary files differ
diff --git a/testdata/go-turns-two-down-bl.png b/testdata/go-turns-two-down-bl.png
index 97176b7..280af36 100644
--- a/testdata/go-turns-two-down-bl.png
+++ b/testdata/go-turns-two-down-bl.png
Binary files differ
diff --git a/testdata/go-turns-two-down-cr.png b/testdata/go-turns-two-down-cr.png
index 5ba1f87..ef00abe 100644
--- a/testdata/go-turns-two-down-cr.png
+++ b/testdata/go-turns-two-down-cr.png
Binary files differ