@@ -99,21 +99,44 @@ object Kernel {
9999 private val minY = - height / 2
100100
101101 /** Convolution function to use.
102- * All color channels are handled the same way, with the alpha channel being forced to 255.
102+ * All color channels are handled the same way, with the alpha channel being forced to 255.
103103 *
104104 * Use as `plane.coflatMap(kernel)`
105105 */
106+ /* def apply(getPixel: (Int, Int) => Color): Color = {
107+ var acc: LongColor = LongColor(constant, constant, constant, constant)
108+
109+ var dMY = 0
110+ while (dMY < height) {
111+ val dy = minY + dMY
112+ var dMX = 0
113+ val line = matrix(dMY)
114+ while (dMX < width) {
115+ val weight = line(dMX)
116+ if (weight != 0) {
117+ val dx = minX + dMX
118+ val color = getPixel(dx, dy)
119+ val c2 = LongColor.weight(LongColor(color), (weight * 255 / normalization).toByte)
120+ acc = LongColor.sumClamp(acc, c2)
121+ }
122+ dMX += 1
123+ }
124+ dMY += 1
125+ }
126+ acc.toColor*/
127+
106128 def apply (getPixel : (Int , Int ) => Color ): Color = {
107- var accR : Int = 0
108- var accG : Int = 0
109- var accB : Int = 0
129+ var accR : Int = constant
130+ var accG : Int = constant
131+ var accB : Int = constant
110132
111133 var dMY = 0
112134 while (dMY < height) {
113- val dy = minY + dMY
114- var dMX = 0
135+ val dy = minY + dMY
136+ var dMX = 0
137+ val line = matrix(dMY)
115138 while (dMX < width) {
116- val weight = matrix(dMY) (dMX)
139+ val weight = line (dMX)
117140 if (weight != 0 ) {
118141 val dx = minX + dMX
119142 val color = getPixel(dx, dy)
@@ -128,12 +151,11 @@ object Kernel {
128151
129152 if (normalization != 1 )
130153 Color (
131- constant + ( accR / normalization) ,
132- constant + ( accG / normalization) ,
133- constant + ( accB / normalization)
154+ accR / normalization,
155+ accG / normalization,
156+ accB / normalization
134157 )
135- else
136- Color (constant + accR, constant + accG, constant + accB)
158+ else Color (accR, accG, accB)
137159 }
138160
139161 /** Creates a kernel equivalent to this one, but resized (keeping the center unchanged).
@@ -208,20 +230,24 @@ object Kernel {
208230 private val minY = - height / 2
209231
210232 def apply (getPixel : (Int , Int ) => Color ): Color = {
211- var accR : Int = 0
212- var accG : Int = 0
213- var accB : Int = 0
214- var accA : Int = 0
233+ var accR : Int = kernelR.constant
234+ var accG : Int = kernelG.constant
235+ var accB : Int = kernelB.constant
236+ var accA : Int = kernelA.constant
215237
216238 var dMY = 0
217239 while (dMY < height) {
218- val dy = minY + dMY
219- var dMX = 0
240+ val dy = minY + dMY
241+ var dMX = 0
242+ val lineR = matrixR(dMY)
243+ val lineG = matrixG(dMY)
244+ val lineB = matrixB(dMY)
245+ val lineA = matrixA(dMY)
220246 while (dMX < width) {
221- val weightR = matrixR(dMY) (dMX)
222- val weightG = matrixG(dMY) (dMX)
223- val weightB = matrixB(dMY) (dMX)
224- val weightA = matrixA(dMY) (dMX)
247+ val weightR = lineR (dMX)
248+ val weightG = lineG (dMX)
249+ val weightB = lineB (dMX)
250+ val weightA = lineA (dMX)
225251 if (weightR != 0 || weightG != 0 || weightB != 0 || weightA != 0 ) {
226252 val dx = minX + dMX
227253 val color = getPixel(dx, dy)
@@ -236,10 +262,10 @@ object Kernel {
236262 }
237263
238264 Color (
239- kernelR.constant + ( accR / kernelR.normalization) ,
240- kernelG.constant + ( accG / kernelG.normalization) ,
241- kernelB.constant + ( accB / kernelB.normalization) ,
242- kernelA.constant + ( accA / kernelA.normalization)
265+ accR / kernelR.normalization,
266+ accG / kernelG.normalization,
267+ accB / kernelB.normalization,
268+ accA / kernelA.normalization
243269 )
244270 }
245271 }
0 commit comments