Commit 31da093c authored by Josh Bleecher Snyder's avatar Josh Bleecher Snyder Committed by Alexandru Moșoi

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: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
parent 2563b6f9
...@@ -133,10 +133,13 @@ const sratioCase = ` ...@@ -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
} }
} }
` `
......
...@@ -82,10 +82,12 @@ func DrawYCbCr(dst *image.RGBA, r image.Rectangle, src *image.YCbCr, sp image.Po ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment