mirror of https://github.com/gohugoio/hugo
72 lines
2.7 KiB
Go
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())
|
|
}
|