48 lines
1.4 KiB
Go
48 lines
1.4 KiB
Go
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
|
|
}}
|
|
}
|
|
}
|