make the error-propagation handling generic
This commit is contained in:
parent
088ba19e3c
commit
b8b7ff7167
22
quantizer.go
22
quantizer.go
@ -122,18 +122,28 @@ func bayerDithering(level int, invert bool) quantizerFunction {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func applyError(diffusionMatrix map[coord]float64, divisor float64, quantError float64, currentPixel coord, errMap map[coord]float64) {
|
||||||
|
for c, i := range diffusionMatrix {
|
||||||
|
target := coord{x: currentPixel.x + c.x, y: currentPixel.y + c.y}
|
||||||
|
errMap[target] = errMap[target] + (quantError * (i / divisor))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func simpleErrorDiffusion() quantizerFunction {
|
func simpleErrorDiffusion() quantizerFunction {
|
||||||
errMap := make(map[coord]float64)
|
errMap := make(map[coord]float64)
|
||||||
|
diffusionMatrix := map[coord]float64{
|
||||||
|
{x: 1, y: 0}: 1.0,
|
||||||
|
{x: 0, y: 1}: 1.0,
|
||||||
|
}
|
||||||
return func(x int, y int, c color.Color) color.Color {
|
return func(x int, y int, c color.Color) color.Color {
|
||||||
l := luminence(c) + errMap[coord{x: x, y: y}]
|
p := coord{x: x, y: y}
|
||||||
delete(errMap, coord{x: x, y: y}) // don't let the error map grow too big
|
l := luminence(c) + errMap[p]
|
||||||
|
delete(errMap, p) // don't let the error map grow too big
|
||||||
if l > 0.5 {
|
if l > 0.5 {
|
||||||
errMap[coord{x: x + 1, y: y}] = errMap[coord{x: x + 1, y: y}] + ((l - 1.0) / 2.0)
|
applyError(diffusionMatrix, 2.0, l-1.0, p, errMap)
|
||||||
errMap[coord{x: x, y: y + 1}] = errMap[coord{x: x, y: y + 1}] + ((l - 1.0) / 2.0)
|
|
||||||
return color.White
|
return color.White
|
||||||
}
|
}
|
||||||
errMap[coord{x: x + 1, y: y}] = errMap[coord{x: x + 1, y: y}] + (l / 2.0)
|
applyError(diffusionMatrix, 2.0, l, p, errMap)
|
||||||
errMap[coord{x: x, y: y + 1}] = errMap[coord{x: x, y: y + 1}] + (l / 2.0)
|
|
||||||
return color.Black
|
return color.Black
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user