hugo/resources/images/dither.go
2024-02-11 22:51:11 +02:00

72 lines
2.7 KiB
Go

// Copyright 2024 The Hugo Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package images
import (
"image"
"image/draw"
"github.com/disintegration/gift"
"github.com/makeworld-the-better-one/dither/v2"
)
var _ gift.Filter = (*ditherFilter)(nil)
type ditherFilter struct {
ditherer *dither.Ditherer
}
var ditherMethodsErrorDiffusion = map[string]dither.ErrorDiffusionMatrix{
"atkinson": dither.Atkinson,
"burkes": dither.Burkes,
"falsefloydsteinberg": dither.FalseFloydSteinberg,
"floydsteinberg": dither.FloydSteinberg,
"jarvisjudiceninke": dither.JarvisJudiceNinke,
"sierra": dither.Sierra,
"sierra2": dither.Sierra2,
"sierra2_4a": dither.Sierra2_4A,
"sierra3": dither.Sierra3,
"sierralite": dither.SierraLite,
"simple2d": dither.Simple2D,
"stevenpigeon": dither.StevenPigeon,
"stucki": dither.Stucki,
"tworowsierra": dither.TwoRowSierra,
}
var ditherMethodsOrdered = map[string]dither.OrderedDitherMatrix{
"clustereddot4x4": dither.ClusteredDot4x4,
"clustereddot6x6": dither.ClusteredDot6x6,
"clustereddot6x6_2": dither.ClusteredDot6x6_2,
"clustereddot6x6_3": dither.ClusteredDot6x6_3,
"clustereddot8x8": dither.ClusteredDot8x8,
"clustereddotdiagonal16x16": dither.ClusteredDotDiagonal16x16,
"clustereddotdiagonal6x6": dither.ClusteredDotDiagonal6x6,
"clustereddotdiagonal8x8": dither.ClusteredDotDiagonal8x8,
"clustereddotdiagonal8x8_2": dither.ClusteredDotDiagonal8x8_2,
"clustereddotdiagonal8x8_3": dither.ClusteredDotDiagonal8x8_3,
"clustereddothorizontalline": dither.ClusteredDotHorizontalLine,
"clustereddotspiral5x5": dither.ClusteredDotSpiral5x5,
"clustereddotverticalline": dither.ClusteredDotVerticalLine,
"horizontal3x5": dither.Horizontal3x5,
"vertical5x3": dither.Vertical5x3,
}
func (f ditherFilter) Draw(dst draw.Image, src image.Image, options *gift.Options) {
gift.New().Draw(dst, f.ditherer.Dither(src))
}
func (f ditherFilter) Bounds(srcBounds image.Rectangle) image.Rectangle {
return image.Rect(0, 0, srcBounds.Dx(), srcBounds.Dy())
}