func (f *Full) newButtonMinimize() *piece { imgA := render.NewBorder(f.X, 0, render.NoColor, f.theme.ATitleColor, f.theme.TitleSize, f.theme.TitleSize, render.GradientVert, render.GradientRegular) imgI := render.NewBorder(f.X, 0, render.NoColor, f.theme.ITitleColor, f.theme.TitleSize, f.theme.TitleSize, render.GradientVert, render.GradientRegular) xgraphics.Blend(imgA.Image, f.theme.AMinimizeButton, image.ZP) xgraphics.Blend(imgI.Image, f.theme.IMinimizeButton, image.ZP) win := f.newPieceWindow("minimize", 0) win.MROpt(fY|fW|fH, 0, f.theme.BorderSize, f.theme.TitleSize, f.theme.TitleSize) return newPiece(win, imgA.Image, imgI.Image) }
// blend the RGBA original icon against the background of Icon.Parent // Allows us to simulate transparency func (icn *Icon) Blend() { // get pixels "parent-pixels" of Parent that are behind Window bg := icn.getBackground() // copy "parent-pixels" into buffer "ximage", overwriting existing completely xgraphics.Blend(icn.ximage, bg, image.Point{0, 0}) // alpha-blend Image into buffer "ximage" xgraphics.Blend(icn.ximage, icn.Image, image.Point{0, 0}) // swap ximage into Window as background icn.ximage.XSurfaceSet(icn.Window.Id) icn.ximage.XDraw() icn.ximage.XPaint(icn.Window.Id) // free the pixbuff memory! icn.ximage.Destroy() }
func (f *Full) UpdateIcon() { size := f.theme.TitleSize imgA := render.NewBorder(f.X, 0, render.NoColor, f.theme.ATitleColor, size, size, render.GradientVert, render.GradientRegular) imgI := render.NewBorder(f.X, 0, render.NoColor, f.theme.ITitleColor, size, size, render.GradientVert, render.GradientRegular) img := f.client.Icon(size-4, size-4) sub := image.Rect(2, 2, size-2, size-2) xgraphics.Blend(imgA.SubImage(sub), img, image.ZP) xgraphics.Blend(imgI.SubImage(sub), img, image.ZP) f.icon.Create(imgA.Image, imgI.Image) if f.client.State() == Active { f.icon.Active() } else { f.icon.Inactive() } }
// drawGopher draws the gopher image to the canvas. func drawGopher(canvas *xgraphics.Image, gopher image.Image, win *xwindow.Window, x, y int) { // Find the rectangle of the canvas where we're going to draw the gopher. gopherRect := midRect(x, y, gopherWidth, gopherHeight, width, height) // If the rectangle contains no pixels, don't draw anything. if gopherRect.Empty() { return } // Output a little message. log.Printf("Drawing gopher at (%d, %d)", x, y) // Get a subimage of the gopher that's in sync with gopherRect. gopherPt := image.Pt(gopher.Bounds().Min.X, gopher.Bounds().Min.Y) if gopherRect.Min.X == 0 { gopherPt.X = gopherWidth - gopherRect.Dx() } if gopherRect.Min.Y == 0 { gopherPt.Y = gopherHeight - gopherRect.Dy() } // Create the canvas subimage. subCanvas := canvas.SubImage(gopherRect) // Blend the gopher image into the sub-canvas. // This does alpha blending. xgraphics.Blend(subCanvas, gopher, gopherPt) // Now draw the changes to the pixmap. subCanvas.XDraw() // And paint them to the window. subCanvas.XPaint(win.Id) }