From: Josh Bleecher Snyder Date: Sun, 17 Apr 2016 01:36:07 +0000 (-0700) Subject: image/draw: remove some bounds checks from DrawYCbCr X-Git-Tag: go1.7beta1~635 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=31da093c1e8b82bcba42846a4a8f670452df88f3;p=gostls13.git 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 TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- diff --git a/src/image/internal/imageutil/gen.go b/src/image/internal/imageutil/gen.go index b9158d0ce9..6792b28a45 100644 --- a/src/image/internal/imageutil/gen.go +++ b/src/image/internal/imageutil/gen.go @@ -133,10 +133,13 @@ const sratioCase = ` b = ^(b >> 31) } - dpix[x+0] = uint8(r) - dpix[x+1] = uint8(g) - dpix[x+2] = uint8(b) - dpix[x+3] = 255 + + // use a temp slice to hint to the compiler that a single bounds check suffices + rgba := dpix[x : x+4 : len(dpix)] + rgba[0] = uint8(r) + rgba[1] = uint8(g) + rgba[2] = uint8(b) + rgba[3] = 255 } } ` diff --git a/src/image/internal/imageutil/impl.go b/src/image/internal/imageutil/impl.go index 39b455fdfa..3696b08e41 100644 --- a/src/image/internal/imageutil/impl.go +++ b/src/image/internal/imageutil/impl.go @@ -82,10 +82,12 @@ func DrawYCbCr(dst *image.RGBA, r image.Rectangle, src *image.YCbCr, sp image.Po b = ^(b >> 31) } - dpix[x+0] = uint8(r) - dpix[x+1] = uint8(g) - dpix[x+2] = uint8(b) - dpix[x+3] = 255 + // use a temp slice to hint to the compiler that a single bounds check suffices + rgba := dpix[x : x+4 : len(dpix)] + rgba[0] = uint8(r) + 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) } - dpix[x+0] = uint8(r) - dpix[x+1] = uint8(g) - dpix[x+2] = uint8(b) - dpix[x+3] = 255 + // use a temp slice to hint to the compiler that a single bounds check suffices + rgba := dpix[x : x+4 : len(dpix)] + rgba[0] = uint8(r) + 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) } - dpix[x+0] = uint8(r) - dpix[x+1] = uint8(g) - dpix[x+2] = uint8(b) - dpix[x+3] = 255 + // use a temp slice to hint to the compiler that a single bounds check suffices + rgba := dpix[x : x+4 : len(dpix)] + rgba[0] = uint8(r) + 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) } - dpix[x+0] = uint8(r) - dpix[x+1] = uint8(g) - dpix[x+2] = uint8(b) - dpix[x+3] = 255 + // use a temp slice to hint to the compiler that a single bounds check suffices + rgba := dpix[x : x+4 : len(dpix)] + rgba[0] = uint8(r) + rgba[1] = uint8(g) + rgba[2] = uint8(b) + rgba[3] = 255 } }