mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-04 17:05:38 +00:00
widget: fix image scaling
Commit 94d242d broke the widget.Image's Scale field so
that it no longer had any effect on the actual size of
the displayed image. This commit fixes that, as well as
adding tests to confirm that the widget.Image type
scales appropriately with DPI changes and its own Scale
field.
Signed-off-by: Chris Waldon <christopher.waldon.dev@gmail.com>
This commit is contained in:
+6
-1
@@ -5,6 +5,7 @@ package widget
|
||||
import (
|
||||
"image"
|
||||
|
||||
"gioui.org/f32"
|
||||
"gioui.org/layout"
|
||||
"gioui.org/op"
|
||||
"gioui.org/op/clip"
|
||||
@@ -22,10 +23,12 @@ type Image struct {
|
||||
Scale float32
|
||||
}
|
||||
|
||||
const defaultScale = float32(160.0 / 72.0)
|
||||
|
||||
func (im Image) Layout(gtx layout.Context) layout.Dimensions {
|
||||
scale := im.Scale
|
||||
if scale == 0 {
|
||||
scale = 160.0 / 72.0
|
||||
scale = defaultScale
|
||||
}
|
||||
size := im.Src.Size()
|
||||
wf, hf := float32(size.X), float32(size.Y)
|
||||
@@ -33,6 +36,8 @@ func (im Image) Layout(gtx layout.Context) layout.Dimensions {
|
||||
cs := gtx.Constraints
|
||||
d := cs.Constrain(image.Pt(w, h))
|
||||
stack := op.Save(gtx.Ops)
|
||||
pixelScale := scale * gtx.Metric.PxPerDp
|
||||
op.Affine(f32.Affine2D{}.Scale(f32.Point{}, f32.Pt(pixelScale, pixelScale))).Add(gtx.Ops)
|
||||
clip.Rect(image.Rectangle{Max: d}).Add(gtx.Ops)
|
||||
im.Src.Add(gtx.Ops)
|
||||
paint.PaintOp{}.Add(gtx.Ops)
|
||||
|
||||
Reference in New Issue
Block a user