diff --git a/compose/foundation/foundation/src/skikoMain/kotlin/androidx/compose/foundation/BasicContextMenuRepresentation.skiko.kt b/compose/foundation/foundation/src/skikoMain/kotlin/androidx/compose/foundation/BasicContextMenuRepresentation.skiko.kt index bdc6a27e6a03e..5fe6015da985c 100644 --- a/compose/foundation/foundation/src/skikoMain/kotlin/androidx/compose/foundation/BasicContextMenuRepresentation.skiko.kt +++ b/compose/foundation/foundation/src/skikoMain/kotlin/androidx/compose/foundation/BasicContextMenuRepresentation.skiko.kt @@ -55,6 +55,7 @@ import androidx.compose.ui.input.key.type import androidx.compose.ui.semantics.semantics import androidx.compose.ui.text.TextStyle import androidx.compose.ui.unit.dp +import androidx.compose.ui.util.fastForEach import androidx.compose.ui.window.Popup import androidx.compose.ui.window.PopupPositionProvider import androidx.compose.ui.window.PopupProperties @@ -75,7 +76,7 @@ internal fun DefaultOpenContextMenu( Popup( properties = PopupProperties(focusable = true), - onDismissRequest = { session.close() }, + onDismissRequest = session::close, popupPositionProvider = popupPositionProvider, onKeyEvent = { if (it.type == KeyEventType.KeyDown) { @@ -105,7 +106,7 @@ internal fun DefaultOpenContextMenu( .width(IntrinsicSize.Max) .verticalScroll(rememberScrollState()) ) { - components.forEach { component -> + components.fastForEach { component -> when (component) { is TextContextMenuSeparator -> MenuSeparator(colors.textColor) diff --git a/compose/foundation/foundation/src/skikoMain/kotlin/androidx/compose/foundation/text/selection/SelectionHandles.skiko.kt b/compose/foundation/foundation/src/skikoMain/kotlin/androidx/compose/foundation/text/selection/SelectionHandles.skiko.kt index 1cb0d1e1af38b..ed1c345ed3fcb 100644 --- a/compose/foundation/foundation/src/skikoMain/kotlin/androidx/compose/foundation/text/selection/SelectionHandles.skiko.kt +++ b/compose/foundation/foundation/src/skikoMain/kotlin/androidx/compose/foundation/text/selection/SelectionHandles.skiko.kt @@ -29,9 +29,11 @@ import androidx.compose.ui.draw.drawWithCache import androidx.compose.ui.geometry.Offset import androidx.compose.ui.geometry.Size import androidx.compose.ui.geometry.isSpecified +import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.semantics.semantics import androidx.compose.ui.text.style.ResolvedTextDirection +import androidx.compose.ui.unit.Density import androidx.compose.ui.unit.DpSize import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Popup @@ -113,6 +115,7 @@ internal fun SelectionHandleIcon( isLeft: Boolean, ) { val density = LocalDensity.current + val handleColor = LocalTextSelectionColors.current.handleColor val lineHeightDp = with(density) { lineHeight.toDp() } Spacer( modifier @@ -120,21 +123,20 @@ internal fun SelectionHandleIcon( width = (PADDING + RADIUS) * 2, height = RADIUS * 2 + PADDING + lineHeightDp ) - .drawSelectionHandle(iconVisible, lineHeight, isLeft) + .drawSelectionHandle(iconVisible, lineHeight, isLeft, handleColor, density) ) } internal fun Modifier.drawSelectionHandle( iconVisible: () -> Boolean, lineHeight: Float, - isLeft: Boolean -): Modifier = composed { - val density = LocalDensity.current + isLeft: Boolean, + handleColor: Color, + density: Density +): Modifier = drawWithCache { val paddingPx = with(density) { PADDING.toPx() } val radiusPx = with(density) { RADIUS.toPx() } val thicknessPx = with(density) { THICKNESS.toPx() } - val handleColor = LocalTextSelectionColors.current.handleColor - this.drawWithCache { onDrawWithContent { drawContent() if (!iconVisible()) return@onDrawWithContent @@ -158,7 +160,6 @@ internal fun Modifier.drawSelectionHandle( ) } } -} @Composable internal fun HandlePopup( diff --git a/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaBackedCanvas.skiko.kt b/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaBackedCanvas.skiko.kt index 37813c4c9781f..614bd4acd2901 100644 --- a/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaBackedCanvas.skiko.kt +++ b/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaBackedCanvas.skiko.kt @@ -17,15 +17,12 @@ package androidx.compose.ui.graphics import androidx.compose.runtime.InternalComposeApi -import org.jetbrains.skia.ClipMode as SkClipMode -import org.jetbrains.skia.RRect as SkRRect -import org.jetbrains.skia.Rect as SkRect import androidx.compose.ui.geometry.Offset import androidx.compose.ui.geometry.Rect -import androidx.compose.ui.geometry.Size import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.IntSize import androidx.compose.ui.util.fastForEach +import org.jetbrains.skia.ClipMode as SkClipMode import org.jetbrains.skia.CubicResampler import org.jetbrains.skia.FilterMipmap import org.jetbrains.skia.FilterMode @@ -112,7 +109,14 @@ internal class SkiaBackedCanvas(val skia: org.jetbrains.skia.Canvas) : Canvas { override fun clipRect(left: Float, top: Float, right: Float, bottom: Float, clipOp: ClipOp) { val antiAlias = true - skia.clipRect(SkRect.makeLTRB(left, top, right, bottom), clipOp.toSkia(), antiAlias) + skia.clipRect( + left = left, + top = top, + right = right, + bottom = bottom, + mode = clipOp.toSkia(), + antiAlias = antiAlias + ) } override fun clipPath(path: Path, clipOp: ClipOp) { @@ -125,7 +129,7 @@ internal class SkiaBackedCanvas(val skia: org.jetbrains.skia.Canvas) : Canvas { } override fun drawRect(left: Float, top: Float, right: Float, bottom: Float, paint: Paint) { - skia.drawRect(SkRect.makeLTRB(left, top, right, bottom), paint.skia) + skia.drawRect(left = left, top = top, right = right, bottom = bottom, paint = paint.skia) } override fun drawRoundRect( @@ -138,20 +142,17 @@ internal class SkiaBackedCanvas(val skia: org.jetbrains.skia.Canvas) : Canvas { paint: Paint ) { skia.drawRRect( - SkRRect.makeLTRB( - left, - top, - right, - bottom, - radiusX, - radiusY - ), - paint.skia + left = left, + top = top, + right = right, + bottom = bottom, + radii = floatArrayOf(radiusX, radiusY), + paint = paint.skia ) } override fun drawOval(left: Float, top: Float, right: Float, bottom: Float, paint: Paint) { - skia.drawOval(SkRect.makeLTRB(left, top, right, bottom), paint.skia) + skia.drawOval(left = left, top = top, right = right, bottom = bottom, paint = paint.skia) } override fun drawCircle(center: Offset, radius: Float, paint: Paint) { @@ -185,8 +186,18 @@ internal class SkiaBackedCanvas(val skia: org.jetbrains.skia.Canvas) : Canvas { } override fun drawImage(image: ImageBitmap, topLeftOffset: Offset, paint: Paint) { - val size = Size(image.width.toFloat(), image.height.toFloat()) - drawImageRect(image, Offset.Zero, size, topLeftOffset, size, paint) + drawImageRect( + image, + 0f, + 0f, + image.width.toFloat(), + image.height.toFloat(), + topLeftOffset.x, + topLeftOffset.y, + image.width.toFloat(), + image.height.toFloat(), + paint + ) } override fun drawImageRect( @@ -198,22 +209,30 @@ internal class SkiaBackedCanvas(val skia: org.jetbrains.skia.Canvas) : Canvas { paint: Paint ) { drawImageRect( - image, - Offset(srcOffset.x.toFloat(), srcOffset.y.toFloat()), - Size(srcSize.width.toFloat(), srcSize.height.toFloat()), - Offset(dstOffset.x.toFloat(), dstOffset.y.toFloat()), - Size(dstSize.width.toFloat(), dstSize.height.toFloat()), - paint + image = image, + srcLeft = srcOffset.x.toFloat(), + srcTop = srcOffset.y.toFloat(), + srcRight = srcSize.width.toFloat(), + srcBottom = srcSize.height.toFloat(), + dstLeft = dstOffset.x.toFloat(), + dstTop = dstOffset.y.toFloat(), + dstRight = dstSize.width.toFloat(), + dstBottom = dstSize.height.toFloat(), + paint = paint ) } // TODO(demin): probably this method should be in the common Canvas private fun drawImageRect( image: ImageBitmap, - srcOffset: Offset, - srcSize: Size, - dstOffset: Offset, - dstSize: Size, + srcLeft: Float, + srcTop: Float, + srcRight: Float, + srcBottom: Float, + dstLeft: Float, + dstTop: Float, + dstRight: Float, + dstBottom: Float, paint: Paint ) { val bitmap = image.asSkiaBitmap() @@ -221,18 +240,14 @@ internal class SkiaBackedCanvas(val skia: org.jetbrains.skia.Canvas) : Canvas { Image.makeFromBitmap(bitmap).use { skiaImage -> skia.drawImageRect( skiaImage, - SkRect.makeXYWH( - srcOffset.x, - srcOffset.y, - srcSize.width, - srcSize.height - ), - SkRect.makeXYWH( - dstOffset.x, - dstOffset.y, - dstSize.width, - dstSize.height - ), + srcLeft, + srcTop, + srcRight, + srcBottom, + dstLeft, + dstTop, + dstRight, + dstBottom, paint.filterQuality.toSkia(), paint.skia, true