mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-01 07:35:40 +00:00
ae8a377cda
The funcs replace stack.Push and macro.Record, which become private. This makes stack and macro faster to write, in particular for stacks where you can just write the following line to save and restore the state : defer op.Push(ops).Pop() This usage requires Push to return a pointer (since Pop has a pointer receiver), or else the code doesn't compile. For consistancy, I tried to do the same for op.Record, but this implied to turn all the MacroOp fields into pointers, and this caused some panics. As a result, op.Record doesn't return a pointer. An other side effect pointed by Larry Clapp: StackOp and MacroOp are not re-usable any more, you have to allocate a new one for each usage, using the described funcs above. Signed-off-by: Thomas Bruyelle <thomas.bruyelle@gmail.com>
43 lines
1.0 KiB
Go
43 lines
1.0 KiB
Go
// SPDX-License-Identifier: Unlicense OR MIT
|
|
|
|
package widget
|
|
|
|
import (
|
|
"image"
|
|
|
|
"gioui.org/f32"
|
|
"gioui.org/layout"
|
|
"gioui.org/op"
|
|
"gioui.org/op/clip"
|
|
"gioui.org/op/paint"
|
|
"gioui.org/unit"
|
|
)
|
|
|
|
// Image is a widget that displays an image.
|
|
type Image struct {
|
|
// Src is the image to display.
|
|
Src paint.ImageOp
|
|
// Scale is the ratio of image pixels to
|
|
// dps. If Scale is zero Image falls back to
|
|
// a scale that match a standard 72 DPI.
|
|
Scale float32
|
|
}
|
|
|
|
func (im Image) Layout(gtx layout.Context) layout.Dimensions {
|
|
scale := im.Scale
|
|
if scale == 0 {
|
|
scale = 160.0 / 72.0
|
|
}
|
|
size := im.Src.Rect.Size()
|
|
wf, hf := float32(size.X), float32(size.Y)
|
|
w, h := gtx.Px(unit.Dp(wf*scale)), gtx.Px(unit.Dp(hf*scale))
|
|
cs := gtx.Constraints
|
|
d := cs.Constrain(image.Pt(w, h))
|
|
stack := op.Push(gtx.Ops)
|
|
clip.Rect{Rect: f32.Rectangle{Max: layout.FPt(d)}}.Op(gtx.Ops).Add(gtx.Ops)
|
|
im.Src.Add(gtx.Ops)
|
|
paint.PaintOp{Rect: f32.Rectangle{Max: f32.Point{X: float32(w), Y: float32(h)}}}.Add(gtx.Ops)
|
|
stack.Pop()
|
|
return layout.Dimensions{Size: d}
|
|
}
|