github.com/neohugo/neohugo@v0.123.8/resources/images/padding.go (about) 1 // Copyright 2024 The Hugo Authors. All rights reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // http://www.apache.org/licenses/LICENSE-2.0 7 // 8 // Unless required by applicable law or agreed to in writing, software 9 // distributed under the License is distributed on an "AS IS" BASIS, 10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 // See the License for the specific language governing permissions and 12 // limitations under the License. 13 14 package images 15 16 import ( 17 "image" 18 "image/color" 19 "image/draw" 20 21 "github.com/disintegration/gift" 22 ) 23 24 var _ gift.Filter = (*paddingFilter)(nil) 25 26 type paddingFilter struct { 27 top, right, bottom, left int 28 ccolor color.Color // canvas color 29 } 30 31 func (f paddingFilter) Draw(dst draw.Image, src image.Image, options *gift.Options) { 32 w := src.Bounds().Dx() + f.left + f.right 33 h := src.Bounds().Dy() + f.top + f.bottom 34 35 if w < 1 { 36 panic("final image width will be less than 1 pixel: check padding values") 37 } 38 if h < 1 { 39 panic("final image height will be less than 1 pixel: check padding values") 40 } 41 42 i := image.NewRGBA(image.Rect(0, 0, w, h)) 43 draw.Draw(i, i.Bounds(), image.NewUniform(f.ccolor), image.Point{}, draw.Src) 44 gift.New().Draw(dst, i) 45 gift.New().DrawAt(dst, src, image.Pt(f.left, f.top), gift.OverOperator) 46 } 47 48 func (f paddingFilter) Bounds(srcBounds image.Rectangle) image.Rectangle { 49 return image.Rect(0, 0, srcBounds.Dx()+f.left+f.right, srcBounds.Dy()+f.top+f.bottom) 50 }