| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- package software
- import (
- "image"
- "fyne.io/fyne/v2"
- "fyne.io/fyne/v2/canvas"
- "fyne.io/fyne/v2/internal"
- "fyne.io/fyne/v2/internal/driver"
- )
- // Painter is a simple software painter that can paint a canvas in memory.
- type Painter struct {
- }
- // NewPainter creates a new Painter.
- func NewPainter() *Painter {
- return &Painter{}
- }
- // Paint is the main entry point for a simple software painter.
- // The canvas to be drawn is passed in as a parameter and the return is an
- // image containing the result of rendering.
- func (*Painter) Paint(c fyne.Canvas) image.Image {
- bounds := image.Rect(0, 0, internal.ScaleInt(c, c.Size().Width), internal.ScaleInt(c, c.Size().Height))
- base := image.NewNRGBA(bounds)
- paint := func(obj fyne.CanvasObject, pos, clipPos fyne.Position, clipSize fyne.Size) bool {
- w := fyne.Min(clipPos.X+clipSize.Width, c.Size().Width)
- h := fyne.Min(clipPos.Y+clipSize.Height, c.Size().Height)
- clip := image.Rect(
- internal.ScaleInt(c, clipPos.X),
- internal.ScaleInt(c, clipPos.Y),
- internal.ScaleInt(c, w),
- internal.ScaleInt(c, h),
- )
- switch o := obj.(type) {
- case *canvas.Image:
- drawImage(c, o, pos, base, clip)
- case *canvas.Text:
- drawText(c, o, pos, base, clip)
- case gradient:
- drawGradient(c, o, pos, base, clip)
- case *canvas.Circle:
- drawCircle(c, o, pos, base, clip)
- case *canvas.Line:
- drawLine(c, o, pos, base, clip)
- case *canvas.Raster:
- drawRaster(c, o, pos, base, clip)
- case *canvas.Rectangle:
- drawRectangle(c, o, pos, base, clip)
- }
- return false
- }
- driver.WalkVisibleObjectTree(c.Content(), paint, nil)
- for _, o := range c.Overlays().List() {
- driver.WalkVisibleObjectTree(o, paint, nil)
- }
- return base
- }
|