diff --git a/orx-image-fit/README.md b/orx-image-fit/README.md index 0587f658..19860d56 100644 --- a/orx-image-fit/README.md +++ b/orx-image-fit/README.md @@ -2,11 +2,12 @@ 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 +`orx-image-fit` provides an extension function`imageFit` for `Drawer`. + +## Usage `imageFit(img: ColorBuffer, x: Double, y: Double, w: Double, h: Double, fitMethod, horizontalPosition:Double, verticalPosition:Double)` - fitMethod - `contain` - `cover` @@ -17,4 +18,21 @@ horizontal values vertical values - top ... bottom - - `-1.0` ... `1.0` \ No newline at end of file + - `-1.0` ... `1.0` + +## Example + +A quick example that fits an image to the window rectangle with a 10 pixel margin. By default +`imageFit` uses the cover mode, which fills the target rectangle with an image. + +```kotlin +fun main() = application { + program { + val image = loadImage("data/images/pm5544.png") + extend { + drawer.imageFit(10.0, 10.0, width - 20.0, height - 20.0) + } + } +} +``` + \ No newline at end of file diff --git a/orx-image-fit/src/main/kotlin/ImageFit.kt b/orx-image-fit/src/main/kotlin/ImageFit.kt index 62a4cfae..d6048265 100644 --- a/orx-image-fit/src/main/kotlin/ImageFit.kt +++ b/orx-image-fit/src/main/kotlin/ImageFit.kt @@ -11,7 +11,16 @@ enum class FitMethod { 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) { +fun Drawer.imageFit( + img: ColorBuffer, + x: Double = 0.0, + y: Double = 0.0, + width: Double = img.width.toDouble(), + height: Double = img.height.toDouble(), + fitMethod: FitMethod = FitMethod.Cover, + horizontalPosition: Double = 0.0, + verticalPosition: Double = 0.0 +) { val sourceWidth = img.width.toDouble() val sourceHeight = img.height.toDouble() @@ -26,23 +35,23 @@ fun Drawer.imageFit(img: ColorBuffer, x: Double = 0.0, y: Double = 0.0, w: Doubl when (fitMethod) { FitMethod.Contain -> { - targetWidth = w - targetHeight = h + targetWidth = width + targetHeight = height - if (w <= targetWidth) { - targetWidth = w - targetHeight = (sourceHeight / sourceWidth) * w + if (width <= targetWidth) { + targetWidth = width + targetHeight = (sourceHeight / sourceWidth) * width } - if (h <= targetHeight) { - targetHeight = h - targetWidth = (sourceWidth / sourceHeight) * h + if (height <= targetHeight) { + targetHeight = height + targetWidth = (sourceWidth / sourceHeight) * height } val left = x - val right = x + w - targetWidth + val right = x + width - targetWidth val top = y - val bottom = y + h - targetHeight + val bottom = y + height - targetHeight targetX = map(-1.0, 1.0, left, right, horizontalPosition) targetY = map(-1.0, 1.0, top, bottom, verticalPosition) @@ -57,12 +66,12 @@ fun Drawer.imageFit(img: ColorBuffer, x: Double = 0.0, y: Double = 0.0, w: Doubl if (sourceWidth <= targetWidth) { targetWidth = sourceWidth - targetHeight = (h / w) * sourceWidth + targetHeight = (height / width) * sourceWidth } if (sourceHeight <= targetHeight) { targetHeight = sourceHeight - targetWidth = (w / h) * sourceHeight + targetWidth = (width / height) * sourceHeight } val left = 0.0 @@ -74,7 +83,7 @@ fun Drawer.imageFit(img: ColorBuffer, x: Double = 0.0, y: Double = 0.0, w: Doubl targetY = map(-1.0, 1.0, top, bottom, verticalPosition) source = Rectangle(targetX, targetY, targetWidth, targetHeight) - target = Rectangle(x, y, w, h) + target = Rectangle(x, y, width, height) } }