Skip to content

Commit

Permalink
fix more stuff
Browse files Browse the repository at this point in the history
  • Loading branch information
chabad360 committed May 9, 2024
1 parent fcb965d commit ae76493
Show file tree
Hide file tree
Showing 10 changed files with 61 additions and 26 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ fyne-cross

### JetBrains
.idea
*.iml

### VSCode
.vscode
Expand Down
18 changes: 18 additions & 0 deletions driver/software/canvas.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package software

import (
"fyne.io/fyne/v2/internal/driver/software"
painter "fyne.io/fyne/v2/internal/painter/software"
)

// NewCanvas creates a new canvas in memory that can render without hardware support.
func NewCanvas() software.WindowlessCanvas {
return software.NewCanvasWithPainter(painter.NewPainter())
}

// NewTransparentCanvas creates a new canvas in memory that can render without hardware support without a background color.
//
// Since: 2.2
func NewTransparentCanvas() software.WindowlessCanvas {
return software.NewTransparentCanvasWithPainter(painter.NewPainter())
}
4 changes: 4 additions & 0 deletions driver/software/render.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ func RenderCanvas(c fyne.Canvas, t fyne.Theme) image.Image {
fyne.CurrentApp().Settings().SetTheme(t)
app.ApplyThemeTo(c.Content(), c)

if sc, ok := c.(*software.SoftwareCanvas); ok {
sc.Clear()
}
return c.Capture()
}

Expand All @@ -29,5 +32,6 @@ func Render(obj fyne.CanvasObject, t fyne.Theme) image.Image {
c.SetContent(obj)

app.ApplyThemeTo(obj, c)
c.Clear()
return c.Capture()
}
4 changes: 1 addition & 3 deletions driver/software/render_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@ import (
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/canvas"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/internal/driver/software"
painter "fyne.io/fyne/v2/internal/painter/software"
internalTest "fyne.io/fyne/v2/internal/test"
"fyne.io/fyne/v2/test"

Expand Down Expand Up @@ -46,7 +44,7 @@ func TestRenderCanvas(t *testing.T) {
widget.NewButton("Button", func() {}),
)))

c := software.NewCanvasWithPainter(painter.NewPainter())
c := NewCanvas()
c.SetContent(obj)

if fyne.CurrentDevice().IsMobile() {
Expand Down
32 changes: 18 additions & 14 deletions internal/driver/software/canvas.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,8 @@ type WindowlessCanvas interface {
SetPadded(bool)
SetScale(float32)

Initialize(common.SizeableCanvas, func())
// Initialize(common.SizeableCanvas, func())
Clear()
}

type SoftwareCanvas struct {
Expand Down Expand Up @@ -57,7 +58,7 @@ func (c *SoftwareCanvas) MinSize() fyne.Size {
func Canvas() WindowlessCanvas {
if dummyCanvas == nil {
dummyCanvas = NewCanvasWithPainter(software.NewPainter())
dummyCanvas.Initialize(dummyCanvas, nil)
dummyCanvas.(*SoftwareCanvas).Initialize(dummyCanvas, nil)
}

return dummyCanvas
Expand Down Expand Up @@ -99,9 +100,11 @@ func NewTransparentCanvasWithPainter(painter painter.Painter) WindowlessCanvas {
func (c *SoftwareCanvas) Capture() image.Image {
cache.Clean(true)
bounds := image.Rect(0, 0, scale.ToScreenCoordinate(c, c.Size().Width), scale.ToScreenCoordinate(c, c.Size().Height))
var img *image.NRGBA
c.FreeDirtyTextures()
var img *image.NRGBA
if !c.transparent {
// TODO: this makes the cache useless, we need to find a better way to let the painter know we want it to paint everything
c.Clear()
img = image.NewNRGBA(bounds)
// TODO: this is slow, and is slower if the bg color is not color.NRGBA
draw.Draw(img, bounds, image.NewUniform(theme.BackgroundColor()), image.Point{}, draw.Src)
Expand All @@ -120,6 +123,16 @@ func (c *SoftwareCanvas) Capture() image.Image {
return img
}

func (c *SoftwareCanvas) Clear() {
driver.WalkCompleteObjectTree(c.content, func(obj fyne.CanvasObject, _, _ fyne.Position, _ fyne.Size) bool {
cache.DeleteTexture(obj)
return false
}, nil)
if c.Painter() != nil {
c.Painter().Clear()
}
}

func (c *SoftwareCanvas) Content() fyne.CanvasObject {
c.RLock()
defer c.RUnlock()
Expand Down Expand Up @@ -236,11 +249,8 @@ func (c *SoftwareCanvas) Scale() float32 {
}

func (c *SoftwareCanvas) SetContent(content fyne.CanvasObject) {
// if content != nil {
// content.Resize(content.MinSize())
// }

c.Lock()
// newSize := c.size.Max(c.canvasSize(content.MinSize()))
c.setContent(content)
c.Unlock()

Expand All @@ -253,6 +263,7 @@ func (c *SoftwareCanvas) SetContent(content fyne.CanvasObject) {
padding = fyne.NewSquareSize(theme.Padding() * 2)
}
c.Resize(content.MinSize().Add(padding))
// c.Resize(newSize)
c.SetDirty()
}

Expand Down Expand Up @@ -464,10 +475,3 @@ func (c *SoftwareCanvas) tapUp(pos fyne.Position, tapID int,
// }
// }
}

// NewTransparentCanvas creates a new canvas in memory that can render without hardware support without a background color.
//
// Since: 2.2
func NewTransparentCanvas() WindowlessCanvas {
return NewTransparentCanvasWithPainter(software.NewPainter())
}
12 changes: 10 additions & 2 deletions internal/painter/software/painter.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,9 @@ func NewPainterWithCanvas(canvas fyne.Canvas) *Painter {
// image containing the result of rendering.
func (p *Painter) Capture(c fyne.Canvas) image.Image {
t := time.Now()
if p.canvas == nil {
p.canvas = c
}

bounds := image.Rect(0, 0, scale.ToScreenCoordinate(c, c.Size().Width), scale.ToScreenCoordinate(c, c.Size().Height))
base := image.NewNRGBA(bounds)
Expand All @@ -58,6 +61,7 @@ func (p *Painter) Capture(c fyne.Canvas) image.Image {

if shouldTest {
// TODO: This breaks a bunch of tests, because by default it'll return mostly blank images
// (which is an issue when it's not painting on a transparent bg)
shouldPaint = driver.WalkVisibleObjectTree(obj, func(obj fyne.CanvasObject, _, _ fyne.Position, _ fyne.Size) bool {
switch obj.(type) {
case *fyne.Container, fyne.Widget:
Expand Down Expand Up @@ -116,8 +120,12 @@ func (p *Painter) Init() {
}

func (p *Painter) Clear() {
// TODO implement me
panic("implement me")
if p.canvas != nil {
driver.WalkCompleteObjectTree(p.canvas.Content(), func(obj fyne.CanvasObject, _, _ fyne.Position, _ fyne.Size) bool {
cache.DeleteTexture(obj)
return false
}, nil)
}
}

func (p *Painter) Free(object fyne.CanvasObject) {
Expand Down
4 changes: 2 additions & 2 deletions test/markup_renderer.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import (
"fyne.io/fyne/v2/internal/cache"
col "fyne.io/fyne/v2/internal/color"
"fyne.io/fyne/v2/internal/driver"
canvas2 "fyne.io/fyne/v2/internal/driver/software"
"fyne.io/fyne/v2/internal/driver/software"
"fyne.io/fyne/v2/layout"
"fyne.io/fyne/v2/theme"
)
Expand Down Expand Up @@ -199,7 +199,7 @@ func (r *markupRenderer) setStringAttr(attrs map[string]*string, name string, s
func (r *markupRenderer) writeCanvas(c fyne.Canvas) {
attrs := map[string]*string{}
r.setSizeAttr(attrs, "size", c.Size())
if tc, ok := c.(canvas2.WindowlessCanvas); ok {
if tc, ok := c.(software.WindowlessCanvas); ok {
r.setBoolAttr(attrs, "padded", tc.Padded())
}
r.writeTag("canvas", false, attrs)
Expand Down
8 changes: 4 additions & 4 deletions test/markup_renderer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import (
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/canvas"
"fyne.io/fyne/v2/container"
canvas2 "fyne.io/fyne/v2/internal/driver/software"
"fyne.io/fyne/v2/internal/driver/software"
"fyne.io/fyne/v2/layout"
"fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget"
Expand Down Expand Up @@ -480,7 +480,7 @@ func Test_snapshot(t *testing.T) {
},
} {
t.Run(name, func(t *testing.T) {
c := canvas2.NewCanvas()
c := software.NewCanvas()
c.SetPadded(false)
c.SetContent(tt.content)
c.Resize(fyne.NewSize(100, 100))
Expand All @@ -495,7 +495,7 @@ func Test_snapshot(t *testing.T) {
}

t.Run("canvas with padding", func(t *testing.T) {
c := canvas2.NewCanvas()
c := software.NewCanvas()
c.SetPadded(true)
c.SetContent(canvas.NewCircle(color.Black))
c.Resize(fyne.NewSize(100, 100))
Expand All @@ -511,7 +511,7 @@ func Test_snapshot(t *testing.T) {
})

t.Run("canvas with overlays", func(t *testing.T) {
c := canvas2.NewCanvas()
c := software.NewCanvas()
c.SetPadded(true)
c.SetContent(canvas.NewCircle(color.Black))
c.Overlays().Add(canvas.NewRectangle(color.NRGBA{R: 250, G: 250, B: 250, A: 250}))
Expand Down
2 changes: 2 additions & 0 deletions widget/form_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,8 @@ func TestForm_EntryValidation_FirstTypeValid(t *testing.T) {
entry1.Refresh()
w = software.NewWindow(form)

assert.Equal(t, "H", entry1.Text)

test.AssertImageMatches(t, "form/validation_entry_first_type_valid.png", w.Canvas().Capture())

entry1.SetText("")
Expand Down
2 changes: 1 addition & 1 deletion widget/slider_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -296,7 +296,7 @@ func TestSlider_FocusDesktop(t *testing.T) {
return
}
slider := NewSlider(0, 10)
win := test.NewWindow(slider)
win := software.NewWindow(slider)
test.Tap(slider)

assert.Equal(t, win.Canvas().Focused(), slider)
Expand Down

0 comments on commit ae76493

Please sign in to comment.