فهرست منبع

Optimize bound checks.

Optimizing the bound checks resulted in an overall 14% increase in
conversion performance.
Charlie Vieth 11 سال پیش
والد
کامیت
d8255b0421
2فایلهای تغییر یافته به همراه30 افزوده شده و 30 حذف شده
  1. 21 21
      converter.go
  2. 9 9
      nearest.go

+ 21 - 21
converter.go

@@ -20,24 +20,24 @@ import "image"
 
 // Keep value in [0,255] range.
 func clampUint8(in int32) uint8 {
-	if in < 0 {
-		return 0
+	if uint32(in) < 256 {
+		return uint8(in)
 	}
 	if in > 255 {
 		return 255
 	}
-	return uint8(in)
+	return 0
 }
 
 // Keep value in [0,65535] range.
 func clampUint16(in int64) uint16 {
-	if in < 0 {
-		return 0
+	if uint64(in) < 65536 {
+		return uint16(in)
 	}
 	if in > 65535 {
 		return 65535
 	}
-	return uint16(in)
+	return 0
 }
 
 func resizeGeneric(in image.Image, out *image.RGBA64, scale float64, coeffs []int32, offset []int, filterLength int) {
@@ -102,12 +102,12 @@ func resizeRGBA(in *image.RGBA, out *image.RGBA, scale float64, coeffs []int16,
 				if coeff != 0 {
 					xi := start + i
 					switch {
-					case xi < 0:
-						xi = 0
+					case uint(xi) < uint(maxX):
+						xi *= 4
 					case xi >= maxX:
 						xi = 4 * maxX
 					default:
-						xi *= 4
+						xi = 0
 					}
 					rgba[0] += int32(coeff) * int32(row[xi+0])
 					rgba[1] += int32(coeff) * int32(row[xi+1])
@@ -142,12 +142,12 @@ func resizeRGBA64(in *image.RGBA64, out *image.RGBA64, scale float64, coeffs []i
 				if coeff != 0 {
 					xi := start + i
 					switch {
-					case xi < 0:
-						xi = 0
+					case uint(xi) < uint(maxX):
+						xi *= 8
 					case xi >= maxX:
 						xi = 8 * maxX
 					default:
-						xi *= 8
+						xi = 0
 					}
 					rgba[0] += int64(coeff) * int64(uint16(row[xi+0])<<8|uint16(row[xi+1]))
 					rgba[1] += int64(coeff) * int64(uint16(row[xi+2])<<8|uint16(row[xi+3]))
@@ -222,12 +222,12 @@ func resizeGray16(in *image.Gray16, out *image.Gray16, scale float64, coeffs []i
 				if coeff != 0 {
 					xi := start + i
 					switch {
-					case xi < 0:
-						xi = 0
+					case uint(xi) < uint(maxX):
+						xi *= 2
 					case xi >= maxX:
 						xi = 2 * maxX
 					default:
-						xi *= 2
+						xi = 0
 					}
 					gray += int64(coeff) * int64(uint16(row[xi+0])<<8|uint16(row[xi+1]))
 					sum += int64(coeff)
@@ -258,12 +258,12 @@ func resizeYCbCr(in *ycc, out *ycc, scale float64, coeffs []int16, offset []int,
 				if coeff != 0 {
 					xi := start + i
 					switch {
-					case xi < 0:
-						xi = 0
+					case uint(xi) < uint(maxX):
+						xi *= 3
 					case xi >= maxX:
 						xi = 3 * maxX
 					default:
-						xi *= 3
+						xi = 0
 					}
 					p[0] += int32(coeff) * int32(row[xi+0])
 					p[1] += int32(coeff) * int32(row[xi+1])
@@ -295,12 +295,12 @@ func nearestYCbCr(in *ycc, out *ycc, scale float64, coeffs []bool, offset []int,
 				if coeffs[ci+i] {
 					xi := start + i
 					switch {
-					case xi < 0:
-						xi = 0
+					case uint(xi) < uint(maxX):
+						xi *= 3
 					case xi >= maxX:
 						xi = 3 * maxX
 					default:
-						xi *= 3
+						xi = 0
 					}
 					p[0] += float32(row[xi+0])
 					p[1] += float32(row[xi+1])

+ 9 - 9
nearest.go

@@ -94,12 +94,12 @@ func nearestRGBA(in *image.RGBA, out *image.RGBA, scale float64, coeffs []bool,
 				if coeffs[ci+i] {
 					xi := start + i
 					switch {
-					case xi < 0:
-						xi = 0
+					case uint(xi) < uint(maxX):
+						xi *= 4
 					case xi >= maxX:
 						xi = 4 * maxX
 					default:
-						xi *= 4
+						xi = 0
 					}
 					rgba[0] += float32(row[xi+0])
 					rgba[1] += float32(row[xi+1])
@@ -133,12 +133,12 @@ func nearestRGBA64(in *image.RGBA64, out *image.RGBA64, scale float64, coeffs []
 				if coeffs[ci+i] {
 					xi := start + i
 					switch {
-					case xi < 0:
-						xi = 0
+					case uint(xi) < uint(maxX):
+						xi *= 8
 					case xi >= maxX:
 						xi = 8 * maxX
 					default:
-						xi *= 8
+						xi = 0
 					}
 					rgba[0] += float32(uint16(row[xi+0])<<8 | uint16(row[xi+1]))
 					rgba[1] += float32(uint16(row[xi+2])<<8 | uint16(row[xi+3]))
@@ -211,12 +211,12 @@ func nearestGray16(in *image.Gray16, out *image.Gray16, scale float64, coeffs []
 				if coeffs[ci+i] {
 					xi := start + i
 					switch {
-					case xi < 0:
-						xi = 0
+					case uint(xi) < uint(maxX):
+						xi *= 2
 					case xi >= maxX:
 						xi = 2 * maxX
 					default:
-						xi *= 2
+						xi = 0
 					}
 					gray += float32(uint16(row[xi+0])<<8 | uint16(row[xi+1]))
 					sum++