Fix fit height to in new renderer and bump webgpuviewer (#3801)
This commit is contained in:
@@ -884,6 +884,7 @@ open class WebGpuViewer(
|
||||
oldImagePage.cleanup()
|
||||
}
|
||||
applyWideZoomIfNeeded(page)
|
||||
applyFitModeAnchor(page.imagePage)
|
||||
pager.state.invalidate()
|
||||
} else {
|
||||
if (pageInCache(page)) page.state = PageState.IDLE
|
||||
@@ -1018,6 +1019,69 @@ open class WebGpuViewer(
|
||||
}
|
||||
}
|
||||
|
||||
private fun applyFitModeAnchor(page: ImagePage) {
|
||||
if (page.homeScaleOverride != null) return
|
||||
|
||||
val scaleType = config.imageScaleType
|
||||
if (scaleType != 3 && scaleType != 4 && scaleType != 5) return
|
||||
|
||||
val image = page.image ?: return
|
||||
if (image.position != Image.Position.SINGLE) return
|
||||
|
||||
val screenW = pager.state.width
|
||||
val screenH = pager.state.height
|
||||
if (screenW <= 0 || screenH <= 0) return
|
||||
|
||||
val w = page.trimWidth.toFloat()
|
||||
val h = page.trimHeight.toFloat()
|
||||
if (w <= 0f || h <= 0f) return
|
||||
|
||||
val cutoutTopPx = pager.state.cutoutTopPx
|
||||
val contentW = screenW.toFloat()
|
||||
val contentH = if (pager.state.avoidCutout && cutoutTopPx > 0f) screenH - cutoutTopPx else screenH.toFloat()
|
||||
|
||||
val homeScale = when (scaleType) {
|
||||
3 -> contentW / w
|
||||
4 -> contentH / h
|
||||
else -> 1f // original size
|
||||
}.coerceAtLeast(0.01f)
|
||||
page.homeScaleOverride = homeScale
|
||||
|
||||
if (scaleType == 5) { // original size
|
||||
val minScaleComputed = minOf(contentW / page.width, contentH / page.height).coerceAtLeast(0.01f)
|
||||
if (homeScale < minScaleComputed) {
|
||||
page.minScale = homeScale
|
||||
}
|
||||
}
|
||||
|
||||
// zoom start for fit height/original size
|
||||
page.homeXOverride = if (scaleType == 4 || scaleType == 5) {
|
||||
val maxX = maxOf(0f, (page.width.toFloat() / screenW - 1f / homeScale) / 2f)
|
||||
when (config.imageZoomType) {
|
||||
ZoomStartPosition.LEFT -> maxX
|
||||
ZoomStartPosition.RIGHT -> -maxX
|
||||
ZoomStartPosition.CENTER -> 0f
|
||||
}
|
||||
} else {
|
||||
null
|
||||
}
|
||||
|
||||
// push below cutout for fit width/original size
|
||||
val trimTop = image.trim?.top ?: 0
|
||||
val imageTopY = (screenH - page.height * homeScale) / 2f
|
||||
val trimTopY = imageTopY + trimTop * homeScale
|
||||
page.homeYOverride = if ((scaleType == 3 || scaleType == 5) && h * homeScale > screenH) {
|
||||
val target = if (pager.state.avoidCutout && cutoutTopPx > 0f) {
|
||||
if (pager.state.alwaysAvoidCutout) cutoutTopPx / 2f else cutoutTopPx
|
||||
} else {
|
||||
0f
|
||||
}
|
||||
maxOf(0f, (target - trimTopY) / (homeScale * screenH))
|
||||
} else {
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Queue a page for decoding. If prioritize=true, moves existing queued page to front.
|
||||
*/
|
||||
|
||||
@@ -76,7 +76,7 @@ swipe = "1.3.0"
|
||||
tapmoc = "0.4.2"
|
||||
unifile = "08f224c8f9"
|
||||
voyager = "2.2.21-1.10.3"
|
||||
webgpuviewer = "25"
|
||||
webgpuviewer = "28"
|
||||
xmlutil = "1.0.2"
|
||||
|
||||
[libraries]
|
||||
|
||||
Reference in New Issue
Block a user