Preventing division by 0
I did bench tests and I can't compute the denom before the if condition without taking a hit. After a few quick tests on my linux desktop, computing the 1st denom costs 6ms, the 2nd one 5ms and both together cost 9ms. The reason for this is that both if conditions here are exceptions and are expected to be false, so the denom computation should be skipped, if possible. The bench test I ran was : out/Release/bench --match Xfermode_Hue --config 8888 --minMs 1000 BUG= R=senorblanco@chromium.org, senorblanco@google.com, reed@google.com, sugoi@google.com Author: sugoi@chromium.org Review URL: https://codereview.chromium.org/114173002 git-svn-id: http://skia.googlecode.com/svn/trunk@12649 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
parent
baf5a3ba7b
commit
b85ebea526
@ -468,16 +468,18 @@ static inline void clipColor(int* r, int* g, int* b, int a) {
|
||||
int L = Lum(*r, *g, *b);
|
||||
int n = minimum(*r, *g, *b);
|
||||
int x = maximum(*r, *g, *b);
|
||||
if(n < 0) {
|
||||
*r = L + SkMulDiv(*r - L, L, L - n);
|
||||
*g = L + SkMulDiv(*g - L, L, L - n);
|
||||
*b = L + SkMulDiv(*b - L, L, L - n);
|
||||
int denom;
|
||||
if ((n < 0) && (denom = L - n)) { // Compute denom and make sure it's non zero
|
||||
*r = L + SkMulDiv(*r - L, L, denom);
|
||||
*g = L + SkMulDiv(*g - L, L, denom);
|
||||
*b = L + SkMulDiv(*b - L, L, denom);
|
||||
}
|
||||
|
||||
if (x > a) {
|
||||
*r = L + SkMulDiv(*r - L, a - L, x - L);
|
||||
*g = L + SkMulDiv(*g - L, a - L, x - L);
|
||||
*b = L + SkMulDiv(*b - L, a - L, x - L);
|
||||
if ((x > a) && (denom = x - L)) { // Compute denom and make sure it's non zero
|
||||
int numer = a - L;
|
||||
*r = L + SkMulDiv(*r - L, numer, denom);
|
||||
*g = L + SkMulDiv(*g - L, numer, denom);
|
||||
*b = L + SkMulDiv(*b - L, numer, denom);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user