1
0
mirror of https://github.com/golang/go synced 2024-11-05 18:56:10 -07:00

image/draw: remove some bounds checks from DrawYCbCr

It’d be nicer to write just

_ = dpix[x+3]

but the compiler isn’t able to reason about offsets
from symbols (yet).

image/draw benchmark:

YCbCr-8   722µs ± 3%   682µs ± 3%  -5.54%  (p=0.000 n=50+50)

Change-Id: Ia1e399496ed87c282bf0f9ca56c0b2d4948a0df9
Reviewed-on: https://go-review.googlesource.com/22146
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
Josh Bleecher Snyder 2016-04-16 18:36:07 -07:00 committed by Alexandru Moșoi
parent 2563b6f9fe
commit 31da093c1e
2 changed files with 31 additions and 20 deletions

View File

@ -133,10 +133,13 @@ const sratioCase = `
b = ^(b >> 31) b = ^(b >> 31)
} }
dpix[x+0] = uint8(r)
dpix[x+1] = uint8(g) // use a temp slice to hint to the compiler that a single bounds check suffices
dpix[x+2] = uint8(b) rgba := dpix[x : x+4 : len(dpix)]
dpix[x+3] = 255 rgba[0] = uint8(r)
rgba[1] = uint8(g)
rgba[2] = uint8(b)
rgba[3] = 255
} }
} }
` `

View File

@ -82,10 +82,12 @@ func DrawYCbCr(dst *image.RGBA, r image.Rectangle, src *image.YCbCr, sp image.Po
b = ^(b >> 31) b = ^(b >> 31)
} }
dpix[x+0] = uint8(r) // use a temp slice to hint to the compiler that a single bounds check suffices
dpix[x+1] = uint8(g) rgba := dpix[x : x+4 : len(dpix)]
dpix[x+2] = uint8(b) rgba[0] = uint8(r)
dpix[x+3] = 255 rgba[1] = uint8(g)
rgba[2] = uint8(b)
rgba[3] = 255
} }
} }
@ -137,10 +139,12 @@ func DrawYCbCr(dst *image.RGBA, r image.Rectangle, src *image.YCbCr, sp image.Po
b = ^(b >> 31) b = ^(b >> 31)
} }
dpix[x+0] = uint8(r) // use a temp slice to hint to the compiler that a single bounds check suffices
dpix[x+1] = uint8(g) rgba := dpix[x : x+4 : len(dpix)]
dpix[x+2] = uint8(b) rgba[0] = uint8(r)
dpix[x+3] = 255 rgba[1] = uint8(g)
rgba[2] = uint8(b)
rgba[3] = 255
} }
} }
@ -192,10 +196,12 @@ func DrawYCbCr(dst *image.RGBA, r image.Rectangle, src *image.YCbCr, sp image.Po
b = ^(b >> 31) b = ^(b >> 31)
} }
dpix[x+0] = uint8(r) // use a temp slice to hint to the compiler that a single bounds check suffices
dpix[x+1] = uint8(g) rgba := dpix[x : x+4 : len(dpix)]
dpix[x+2] = uint8(b) rgba[0] = uint8(r)
dpix[x+3] = 255 rgba[1] = uint8(g)
rgba[2] = uint8(b)
rgba[3] = 255
} }
} }
@ -246,10 +252,12 @@ func DrawYCbCr(dst *image.RGBA, r image.Rectangle, src *image.YCbCr, sp image.Po
b = ^(b >> 31) b = ^(b >> 31)
} }
dpix[x+0] = uint8(r) // use a temp slice to hint to the compiler that a single bounds check suffices
dpix[x+1] = uint8(g) rgba := dpix[x : x+4 : len(dpix)]
dpix[x+2] = uint8(b) rgba[0] = uint8(r)
dpix[x+3] = 255 rgba[1] = uint8(g)
rgba[2] = uint8(b)
rgba[3] = 255
} }
} }