package xcanvas import "image" import "github.com/jezek/xgbutil/xgraphics" type plottingContext struct { image *xgraphics.Image color xgraphics.BGRA weight int } func (context plottingContext) square (center image.Point) (square image.Rectangle) { return image.Rect(0, 0, context.weight, context.weight). Sub(image.Pt(context.weight / 2, context.weight / 2)). Add(center). Intersect(context.image.Bounds()) } func (context plottingContext) plot (center image.Point) { square := context.square(center) if context.color.A == 255 { for y := square.Min.Y; y < square.Max.Y; y ++ { for x := square.Min.X; x < square.Max.X; x ++ { index := context.image.PixOffset(x, y) context.image.Pix[index + 0] = context.color.B context.image.Pix[index + 1] = context.color.G context.image.Pix[index + 2] = context.color.R context.image.Pix[index + 3] = context.color.A }} } else { for y := square.Min.Y; y < square.Max.Y; y ++ { for x := square.Min.X; x < square.Max.X; x ++ { index := context.image.PixOffset(x, y) pixel := blendPremultipliedBGRA(xgraphics.BGRA { B: context.image.Pix[index + 0], G: context.image.Pix[index + 1], R: context.image.Pix[index + 2], A: context.image.Pix[index + 3], }, context.color) context.image.Pix[index + 0] = pixel.B context.image.Pix[index + 1] = pixel.G context.image.Pix[index + 2] = pixel.R context.image.Pix[index + 3] = pixel.A }} } }