improvements to orx-object-fit -> orx-image-fit

This commit is contained in:
pfs-15
2020-02-10 19:27:53 +01:00
parent aea681446e
commit 3c3e6eed08
4 changed files with 86 additions and 87 deletions

20
orx-image-fit/README.md Normal file
View File

@@ -0,0 +1,20 @@
# orx-image-fit
Fits images in frames with two options, contain and cover. Similar to CSS object-fit (https://www.w3schools.com/css/css3_object-fit.asp)
## usage
`imageFit(img: ColorBuffer, x: Double, y: Double, w: Double, h: Double, fitMethod, horizontalPosition:Double, verticalPosition:Double)`
fitMethod
- `contain`
- `cover`
horizontal values
- left ... right
- `-1.0` ... `1.0`
vertical values
- top ... bottom
- `-1.0` ... `1.0`

View File

@@ -0,0 +1,82 @@
package org.openrndr.extras.imageFit
import org.openrndr.draw.ColorBuffer
import org.openrndr.draw.Drawer
import org.openrndr.math.map
import org.openrndr.shape.Rectangle
enum class FitMethod {
Cover,
Contain
}
fun Drawer.imageFit(img: ColorBuffer, x: Double = 0.0, y: Double = 0.0, w: Double, h: Double, fitMethod:FitMethod = FitMethod.Cover, horizontalPosition:Double = 0.0, verticalPosition:Double = 0.0) {
val sourceWidth = img.width.toDouble()
val sourceHeight = img.height.toDouble()
var targetX = x
var targetY = y
var targetWidth: Double
var targetHeight: Double
val source: Rectangle
val target: Rectangle
when (fitMethod) {
FitMethod.Contain -> {
targetWidth = w
targetHeight = h
if (w <= targetWidth) {
targetWidth = w
targetHeight = (sourceHeight / sourceWidth) * w
}
if (h <= targetHeight) {
targetHeight = h
targetWidth = (sourceWidth / sourceHeight) * h
}
val left = x
val right = x + w - targetWidth
val top = y
val bottom = y + h - targetHeight
targetX = map(-1.0, 1.0, left, right, horizontalPosition)
targetY = map(-1.0, 1.0, top, bottom, verticalPosition)
source = Rectangle(0.0, 0.0, sourceWidth, sourceHeight)
target = Rectangle(targetX, targetY, targetWidth, targetHeight)
}
FitMethod.Cover -> {
targetWidth = sourceWidth
targetHeight = sourceHeight
if (sourceWidth <= targetWidth) {
targetWidth = sourceWidth
targetHeight = (h / w) * sourceWidth
}
if (sourceHeight <= targetHeight) {
targetHeight = sourceHeight
targetWidth = (w / h) * sourceHeight
}
val left = 0.0
val right = sourceWidth - targetWidth
val top = 0.0
val bottom = sourceHeight - targetHeight
targetX = map(-1.0, 1.0, left, right, horizontalPosition)
targetY = map(-1.0, 1.0, top, bottom, verticalPosition)
source = Rectangle(targetX, targetY, targetWidth, targetHeight)
target = Rectangle(x, y, w, h)
}
}
image(img, source, target)
}