forked from joejulian/gio
widget: [API] correct default scaling of images
When no scale factor is set, scale by 1.0, mapping one image pixel to one device-independent pixel. This matches the behavior of CSS and other frameworks. The old code attempted to convert to Dp while taking the image's DPI into account. This was wrong in two ways: - It assumed that the default display DPI is 160, but this is only true for Android. Other platforms use 96, 162, or leave it undefined. Thus image.Layout's idea of a dp didn't match that of Gio on most platforms. - It tried to account for image DPI, and assumed a default of 72. This was wrong in that DPI in images is merely metadata meant for printing, not display. The vast majority of software such as image viewers and image editors do not take DPI into account, mapping one image pixel either to one physical pixel or to one device-independent pixel. That is, users would expect their images to either display 1 to 1, or scaled based on PxPerDp, but not scaled based on the image's DPI. We default to a scale of 1 to stay consistent with other parts of Gio that scale by default. Users who don't want any scaling can continue to set the scale to the inverse of PxPerDp. While we're here we clarify the documentation of the Scale field. This change is backwards incompatible for users that relied on the default scale. Signed-off-by: Dominik Honnef <dominik@honnef.co>
This commit is contained in:
committed by
Elias Naur
parent
fa34121f00
commit
51b11486c5
+5
-6
@@ -23,18 +23,17 @@ type Image struct {
|
|||||||
// Position specifies where to position the image within
|
// Position specifies where to position the image within
|
||||||
// the constraints.
|
// the constraints.
|
||||||
Position layout.Direction
|
Position layout.Direction
|
||||||
// Scale is the ratio of image pixels to
|
// Scale is the factor used for converting image pixels to dp.
|
||||||
// dps. If Scale is zero Image falls back to
|
// If Scale is zero it defaults to 1.
|
||||||
// a scale that match a standard 72 DPI.
|
//
|
||||||
|
// To map one image pixel to one output pixel, set Scale to 1.0 / gtx.Metric.PxPerDp.
|
||||||
Scale float32
|
Scale float32
|
||||||
}
|
}
|
||||||
|
|
||||||
const defaultScale = float32(160.0 / 72.0)
|
|
||||||
|
|
||||||
func (im Image) Layout(gtx layout.Context) layout.Dimensions {
|
func (im Image) Layout(gtx layout.Context) layout.Dimensions {
|
||||||
scale := im.Scale
|
scale := im.Scale
|
||||||
if scale == 0 {
|
if scale == 0 {
|
||||||
scale = defaultScale
|
scale = 1
|
||||||
}
|
}
|
||||||
|
|
||||||
size := im.Src.Size()
|
size := im.Src.Size()
|
||||||
|
|||||||
@@ -26,8 +26,8 @@ func TestImageScale(t *testing.T) {
|
|||||||
// Ensure the default scales correctly.
|
// Ensure the default scales correctly.
|
||||||
dims := Image{Src: imgOp}.Layout(gtx)
|
dims := Image{Src: imgOp}.Layout(gtx)
|
||||||
expectedSize := imgSize
|
expectedSize := imgSize
|
||||||
expectedSize.X = int(float32(expectedSize.X) * defaultScale)
|
expectedSize.X = int(float32(expectedSize.X))
|
||||||
expectedSize.Y = int(float32(expectedSize.Y) * defaultScale)
|
expectedSize.Y = int(float32(expectedSize.Y))
|
||||||
if dims.Size != expectedSize {
|
if dims.Size != expectedSize {
|
||||||
t.Fatalf("non-scaled image is wrong size, expected %v, got %v", expectedSize, dims.Size)
|
t.Fatalf("non-scaled image is wrong size, expected %v, got %v", expectedSize, dims.Size)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user