// Copyright 2016 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package imageutil implements some image utility functions. package imageutil import ( "image" ) // TODO: move Border into the standard library's package image? // Border returns four rectangles that together contain those points between r // and r.Inset(inset). Visually: // // 00000000 // 00000000 // 11....22 // 11....22 // 11....22 // 33333333 // 33333333 // // The inset may be negative, in which case the points will be outside r. // // Some of the returned rectangles may be empty. None of the returned // rectangles will overlap. func Border(r image.Rectangle, inset int) [4]image.Rectangle { if inset == 0 { return [4]image.Rectangle{} } if r.Dx() <= 2*inset || r.Dy() <= 2*inset { return [4]image.Rectangle{r} } x := [4]int{ r.Min.X, r.Min.X + inset, r.Max.X - inset, r.Max.X, } y := [4]int{ r.Min.Y, r.Min.Y + inset, r.Max.Y - inset, r.Max.Y, } if inset < 0 { x[0], x[1] = x[1], x[0] x[2], x[3] = x[3], x[2] y[0], y[1] = y[1], y[0] y[2], y[3] = y[3], y[2] } // The top and bottom sections are responsible for filling the corners. // The top and bottom sections go from x[0] to x[3], across the y's. // The left and right sections go from y[1] to y[2], across the x's. return [4]image.Rectangle{{ // Top section. Min: image.Point{ X: x[0], Y: y[0], }, Max: image.Point{ X: x[3], Y: y[1], }, }, { // Left section. Min: image.Point{ X: x[0], Y: y[1], }, Max: image.Point{ X: x[1], Y: y[2], }, }, { // Right section. Min: image.Point{ X: x[2], Y: y[1], }, Max: image.Point{ X: x[3], Y: y[2], }, }, { // Bottom section. Min: image.Point{ X: x[0], Y: y[2], }, Max: image.Point{ X: x[3], Y: y[3], }, }} }