// Code generated by go run gen.go; DO NOT EDIT.package imageutilimport ()// DrawYCbCr draws the YCbCr source image on the RGBA destination image with// r.Min in dst aligned with sp in src. It reports whether the draw was// successful. If it returns false, no dst pixels were changed.//// This function assumes that r is entirely within dst's bounds and the// translation of r from dst coordinate space to src coordinate space is// entirely within src's bounds.func ( *image.RGBA, image.Rectangle, *image.YCbCr, image.Point) ( bool) {// This function exists in the image/internal/imageutil package because it // is needed by both the image/draw and image/jpeg packages, but it doesn't // seem right for one of those two to depend on the other. // // Another option is to have this code be exported in the image package, // but we'd need to make sure we're totally happy with the API (for the // rest of Go 1 compatibility), and decide if we want to have a more // general purpose DrawToRGBA method for other image types. One possibility // is: // // func (src *YCbCr) CopyToRGBA(dst *RGBA, dr, sr Rectangle) (effectiveDr, effectiveSr Rectangle) // // in the spirit of the built-in copy function for 1-dimensional slices, // that also allowed a CopyFromRGBA method if needed. := (.Min.X - .Rect.Min.X) * 4 := (.Max.X - .Rect.Min.X) * 4 := .Min.Y - .Rect.Min.Y := .Max.Y - .Rect.Min.Yswitch .SubsampleRatio {caseimage.YCbCrSubsampleRatio444:for , := , .Y; != ; , = +1, +1 { := .Pix[*.Stride:] := (-.Rect.Min.Y)*.YStride + (.X - .Rect.Min.X) := (-.Rect.Min.Y)*.CStride + (.X - .Rect.Min.X)for := ; != ; , , = +4, +1, +1 {// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB. := int32(.Y[]) * 0x10101 := int32(.Cb[]) - 128 := int32(.Cr[]) - 128// The bit twiddling below is equivalent to // // r := (yy1 + 91881*cr1) >> 16 // if r < 0 { // r = 0 // } else if r > 0xff { // r = ^int32(0) // } // // but uses fewer branches and is faster. // Note that the uint8 type conversion in the return // statement will convert ^int32(0) to 0xff. // The code below to compute g and b uses a similar pattern. := + 91881*ifuint32()&0xff000000 == 0 { >>= 16 } else { = ^( >> 31) } := - 22554* - 46802*ifuint32()&0xff000000 == 0 { >>= 16 } else { = ^( >> 31) } := + 116130*ifuint32()&0xff000000 == 0 { >>= 16 } else { = ^( >> 31) }// use a temp slice to hint to the compiler that a single bounds check suffices := [ : +4 : len()] [0] = uint8() [1] = uint8() [2] = uint8() [3] = 255 } }caseimage.YCbCrSubsampleRatio422:for , := , .Y; != ; , = +1, +1 { := .Pix[*.Stride:] := (-.Rect.Min.Y)*.YStride + (.X - .Rect.Min.X) := (-.Rect.Min.Y)*.CStride - .Rect.Min.X/2for , := , .X; != ; , , = +4, +1, +1 { := + /2// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB. := int32(.Y[]) * 0x10101 := int32(.Cb[]) - 128 := int32(.Cr[]) - 128// The bit twiddling below is equivalent to // // r := (yy1 + 91881*cr1) >> 16 // if r < 0 { // r = 0 // } else if r > 0xff { // r = ^int32(0) // } // // but uses fewer branches and is faster. // Note that the uint8 type conversion in the return // statement will convert ^int32(0) to 0xff. // The code below to compute g and b uses a similar pattern. := + 91881*ifuint32()&0xff000000 == 0 { >>= 16 } else { = ^( >> 31) } := - 22554* - 46802*ifuint32()&0xff000000 == 0 { >>= 16 } else { = ^( >> 31) } := + 116130*ifuint32()&0xff000000 == 0 { >>= 16 } else { = ^( >> 31) }// use a temp slice to hint to the compiler that a single bounds check suffices := [ : +4 : len()] [0] = uint8() [1] = uint8() [2] = uint8() [3] = 255 } }caseimage.YCbCrSubsampleRatio420:for , := , .Y; != ; , = +1, +1 { := .Pix[*.Stride:] := (-.Rect.Min.Y)*.YStride + (.X - .Rect.Min.X) := (/2-.Rect.Min.Y/2)*.CStride - .Rect.Min.X/2for , := , .X; != ; , , = +4, +1, +1 { := + /2// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB. := int32(.Y[]) * 0x10101 := int32(.Cb[]) - 128 := int32(.Cr[]) - 128// The bit twiddling below is equivalent to // // r := (yy1 + 91881*cr1) >> 16 // if r < 0 { // r = 0 // } else if r > 0xff { // r = ^int32(0) // } // // but uses fewer branches and is faster. // Note that the uint8 type conversion in the return // statement will convert ^int32(0) to 0xff. // The code below to compute g and b uses a similar pattern. := + 91881*ifuint32()&0xff000000 == 0 { >>= 16 } else { = ^( >> 31) } := - 22554* - 46802*ifuint32()&0xff000000 == 0 { >>= 16 } else { = ^( >> 31) } := + 116130*ifuint32()&0xff000000 == 0 { >>= 16 } else { = ^( >> 31) }// use a temp slice to hint to the compiler that a single bounds check suffices := [ : +4 : len()] [0] = uint8() [1] = uint8() [2] = uint8() [3] = 255 } }caseimage.YCbCrSubsampleRatio440:for , := , .Y; != ; , = +1, +1 { := .Pix[*.Stride:] := (-.Rect.Min.Y)*.YStride + (.X - .Rect.Min.X) := (/2-.Rect.Min.Y/2)*.CStride + (.X - .Rect.Min.X)for := ; != ; , , = +4, +1, +1 {// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB. := int32(.Y[]) * 0x10101 := int32(.Cb[]) - 128 := int32(.Cr[]) - 128// The bit twiddling below is equivalent to // // r := (yy1 + 91881*cr1) >> 16 // if r < 0 { // r = 0 // } else if r > 0xff { // r = ^int32(0) // } // // but uses fewer branches and is faster. // Note that the uint8 type conversion in the return // statement will convert ^int32(0) to 0xff. // The code below to compute g and b uses a similar pattern. := + 91881*ifuint32()&0xff000000 == 0 { >>= 16 } else { = ^( >> 31) } := - 22554* - 46802*ifuint32()&0xff000000 == 0 { >>= 16 } else { = ^( >> 31) } := + 116130*ifuint32()&0xff000000 == 0 { >>= 16 } else { = ^( >> 31) }// use a temp slice to hint to the compiler that a single bounds check suffices := [ : +4 : len()] [0] = uint8() [1] = uint8() [2] = uint8() [3] = 255 } }default:returnfalse }returntrue}
The pages are generated with Goldsv0.7.0-preview. (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu.
PR and bug reports are welcome and can be submitted to the issue list.
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds.