Fix image scaling.
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
import os, sets, random, httpClient, json, strutils, strformat, options, deques, times
|
import os, sets, random, httpClient, json, strutils, strformat, options, deques, times
|
||||||
|
from lenientops import `*`
|
||||||
import gintro/[gdkpixbuf, gobject]
|
import gintro/[gdkpixbuf, gobject]
|
||||||
import common
|
import common
|
||||||
|
|
||||||
@@ -57,6 +58,19 @@ proc log(ip: ImageProvider, things: varargs[string, `$`]) =
|
|||||||
if ip.verbose:
|
if ip.verbose:
|
||||||
echo things.join()
|
echo things.join()
|
||||||
|
|
||||||
|
func calcImageSize(maxWidth, maxHeight, imgWidth, imgHeight: int): tuple[width: int, height: int] =
|
||||||
|
## Calculate the best fit for an image on the give screen size.
|
||||||
|
## This should keep the image aspect ratio
|
||||||
|
let
|
||||||
|
ratioMax = maxWidth / maxHeight
|
||||||
|
ratioImg = imgWidth / imgHeight
|
||||||
|
if (ratioMax > ratioImg):
|
||||||
|
result.width = (imgWidth * (maxHeight / imgHeight)).toInt
|
||||||
|
result.height = maxHeight
|
||||||
|
else:
|
||||||
|
result.width = maxWidth
|
||||||
|
result.height = (imgHeight * (maxWidth / imgWidth)).toInt
|
||||||
|
|
||||||
########################
|
########################
|
||||||
# Image Provider procs
|
# Image Provider procs
|
||||||
########################
|
########################
|
||||||
@@ -130,7 +144,7 @@ proc getFileName(ip: var ImageProvider): FileOpResult =
|
|||||||
# Exported procs
|
# Exported procs
|
||||||
########################
|
########################
|
||||||
|
|
||||||
proc next*(ip: var ImageProvider, width, height: int): FileOpResult =
|
proc next*(ip: var ImageProvider, maxWidth, maxHeight: int): FileOpResult =
|
||||||
## Uses the image provider to get a new image ready to display.
|
## Uses the image provider to get a new image ready to display.
|
||||||
## `width` and `height` should be the size of the window.
|
## `width` and `height` should be the size of the window.
|
||||||
if ip.mode == Mode.None:
|
if ip.mode == Mode.None:
|
||||||
@@ -140,16 +154,11 @@ proc next*(ip: var ImageProvider, width, height: int): FileOpResult =
|
|||||||
if not op.success: return op
|
if not op.success: return op
|
||||||
|
|
||||||
var rawPixbuf = newPixbufFromFile(op.file)
|
var rawPixbuf = newPixbufFromFile(op.file)
|
||||||
# resize the pixbuf to best fit on screen
|
# Resize the pixbuf to best fit on screen
|
||||||
var w, h: int
|
let size = calcImageSize(maxWidth, maxHeight, rawPixbuf.width, rawPixbuf.height)
|
||||||
if (width > height):
|
ip.log "Scale image to: ", size
|
||||||
h = height
|
|
||||||
w = ((rawPixbuf.width * h) / rawPixbuf.height).toInt
|
|
||||||
else:
|
|
||||||
w = width
|
|
||||||
h = ((rawPixbuf.height * w) / rawPixbuf.width).toInt
|
|
||||||
let then = now()
|
let then = now()
|
||||||
var pixbuf = rawPixbuf.scaleSimple(w, h, InterpType.nearest)
|
var pixbuf = rawPixbuf.scaleSimple(size.width, size.height, InterpType.nearest)
|
||||||
let now = now()
|
let now = now()
|
||||||
ip.log "Image scaled. Time: ", (now - then).inMilliseconds, "ms"
|
ip.log "Image scaled. Time: ", (now - then).inMilliseconds, "ms"
|
||||||
# The pixbuf is written to disk and loaded again once because
|
# The pixbuf is written to disk and loaded again once because
|
||||||
|
|||||||
Reference in New Issue
Block a user