From f4985ae53c0eadd7f40507f26535c21a01c3d846 Mon Sep 17 00:00:00 2001 From: potassium Date: Wed, 1 May 2024 15:50:36 +0300 Subject: [PATCH] just for test, and after then rewrite concat's At function --- concat.go | 129 ++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 102 insertions(+), 27 deletions(-) diff --git a/concat.go b/concat.go index 9477d6c..9385201 100644 --- a/concat.go +++ b/concat.go @@ -1,4 +1,5 @@ //go:build todo + package imageutils import ( @@ -7,10 +8,21 @@ import ( "image/draw" ) +type Side int + +const ( + Left Side = iota + Right + Up + Down +) + type pair struct { first, second image.Image + side Side } +// Takes color.Model of the first Image. func (p pair) ColorModel() color.Model { return p.first.ColorModel() } func (p pair) Bounds() image.Rectangle { @@ -19,38 +31,101 @@ func (p pair) Bounds() image.Rectangle { b2 = p.second.Bounds() ) - return image.Rectangle{ - image.ZP, - image.Point{ - X: b1.Dx() + b2.Dx(), - Y: max(b1.Dy(), b2.Dy()), - }, + rect := image.Rectangle{} + switch p.side { + case Left: + fallthrough + case Right: + rect = image.Rectangle{ + image.ZP, + image.Point{ + X: b1.Dx() + b2.Dx(), + Y: max(b1.Dy(), b2.Dy()), + }, + } + case Up: + fallthrough + case Down: + rect = image.Rectangle{ + image.ZP, + image.Point{ + X: max(b1.Dx(), b2.Dx()), + Y: b1.Dy() + b2.Dy(), + }, + } } + return rect } func (p pair) At(x, y int) color.Color { rgbaImg := image.NewRGBA(p.Bounds()) - draw.Draw( - rgbaImg, - rgbaImg.Bounds(), - p.first, - image.ZP, - draw.Src, - ) - draw.Draw( - rgbaImg, - p.Bounds(), - p.second, - image.Point{ - p.first.Bounds().Dx(), - 0, - }, - draw.Src, - ) - return rgbaImg + + switch p.side { + case Left: + draw.Draw( + rgbaImg, rgbaImg.Bounds(), + p.second, + image.ZP, draw.Src, + ) + draw.Draw( + rgbaImg, p.Bounds(), + p.first, + image.Point{ + p.second.Bounds().Dx(), + 0, + }, + draw.Src, + ) + case Right: + draw.Draw( + rgbaImg, rgbaImg.Bounds(), + p.first, + image.ZP, draw.Src, + ) + draw.Draw( + rgbaImg, p.Bounds(), + p.second, + image.Point{ + p.first.Bounds().Dx(), + 0, + }, + draw.Src, + ) + case Up: + draw.Draw( + rgbaImg, rgbaImg.Bounds() + p.first, + image.ZP, draw.Src + ) + draw.Draw( + rgbaImg, p.Bounds(), + p.second, + image.Point{ + 0, + p.first.Bounds().Dy() + }, + draw.Src, + ) + case Down: + draw.Draw( + rgbaImg, rgbaImg.Bounds() + p.second, + image.ZP, draw.Src + ) + draw.Draw( + rgbaImg, p.Bounds(), + p.first, + image.Point{ + 0, + p.second.Bounds().Dy() + }, + draw.Src, + ) + } + return rgbaImg.At(x, y) } -// Concat concatenates second image to the right side of first. -func Concat(i1, i2 image.Image) image.Image { - return pair{i1, i2} +// Concat concatenates second image on a given side. +func Concat(i1, i2 image.Image, s Side) image.Image { + return pair{i1, i2, s} }