From bba1bf608722f52bc38ce25c8756aa9cd3d0643f Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Thu, 14 May 2020 12:59:09 +0100 Subject: [PATCH] Update to Compose SNAPSHOT #6492492 --- build.gradle | 1 + .../accompanist/buildsrc/dependencies.kt | 2 +- .../dev/chrisbanes/accompanist/coil/Coil.kt | 45 +++++++++++-------- 3 files changed, 28 insertions(+), 20 deletions(-) diff --git a/build.gradle b/build.gradle index 1548ae408..2d99d185f 100644 --- a/build.gradle +++ b/build.gradle @@ -38,6 +38,7 @@ plugins { subprojects { repositories { google() + maven { url 'https://androidx.dev/snapshots/builds/6492492/artifacts/ui/repository' } jcenter() } diff --git a/buildSrc/src/main/java/dev/chrisbanes/accompanist/buildsrc/dependencies.kt b/buildSrc/src/main/java/dev/chrisbanes/accompanist/buildsrc/dependencies.kt index 78e86cdfc..5e7fe89e8 100644 --- a/buildSrc/src/main/java/dev/chrisbanes/accompanist/buildsrc/dependencies.kt +++ b/buildSrc/src/main/java/dev/chrisbanes/accompanist/buildsrc/dependencies.kt @@ -46,7 +46,7 @@ object Libs { object UI { const val kotlinCompilerVersion = "1.3.70-dev-withExperimentalGoogleExtensions-20200424" - const val version = "0.1.0-dev10" + const val version = "0.1.0-SNAPSHOT" const val composeRuntime = "androidx.compose:compose-runtime:$version" const val framework = "androidx.ui:ui-framework:$version" diff --git a/coil/src/main/java/dev/chrisbanes/accompanist/coil/Coil.kt b/coil/src/main/java/dev/chrisbanes/accompanist/coil/Coil.kt index 6644d1e79..775aafa2f 100644 --- a/coil/src/main/java/dev/chrisbanes/accompanist/coil/Coil.kt +++ b/coil/src/main/java/dev/chrisbanes/accompanist/coil/Coil.kt @@ -16,6 +16,7 @@ package dev.chrisbanes.accompanist.coil +import android.graphics.ColorMatrix import android.graphics.ColorMatrixColorFilter import android.graphics.drawable.Drawable import androidx.animation.FloatPropKey @@ -27,6 +28,7 @@ import androidx.compose.remember import androidx.compose.setValue import androidx.compose.stateFor import androidx.core.graphics.drawable.toBitmap +import androidx.core.util.Pools import androidx.ui.animation.Transition import androidx.ui.core.Alignment import androidx.ui.core.Constraints @@ -40,13 +42,15 @@ import androidx.ui.core.hasFixedHeight import androidx.ui.core.hasFixedWidth import androidx.ui.foundation.Image import androidx.ui.geometry.Offset -import androidx.ui.graphics.Canvas +import androidx.ui.geometry.Size import androidx.ui.graphics.ColorFilter import androidx.ui.graphics.ImageAsset import androidx.ui.graphics.Paint import androidx.ui.graphics.asImageAsset +import androidx.ui.graphics.painter.CanvasScope import androidx.ui.graphics.painter.ImagePainter import androidx.ui.graphics.painter.Painter +import androidx.ui.graphics.painter.drawCanvas import androidx.ui.unit.IntPx import androidx.ui.unit.PxSize import coil.Coil @@ -133,8 +137,10 @@ fun CoilImageWithCrossfade( crossfadeDuration: Int = defaultTransitionDuration, modifier: Modifier = Modifier ) { - WithConstraints(modifier) { constraints, _ -> - var imgLoadState by stateFor(request) { ImageLoadState.Empty } + WithConstraints(modifier) { + // We key off the data, for the same reasons as executeAsComposable() + // below + var imgLoadState by stateFor(request.data) { ImageLoadState.Empty } val transitionDef = remember(crossfadeDuration) { transitionDefinition { @@ -190,11 +196,8 @@ fun CoilImageWithCrossfade( matrix.alphaFraction = transitionState[alpha] matrix.brightnessFraction = transitionState[brightness] - // Unfortunately ColorMatrixColorFilter is not mutable so we have to create a new - // instance every time - val cf = ColorMatrixColorFilter(matrix) Image( - painter = AndroidColorMatrixImagePainter(image, cf), + painter = ColorMatrixImagePainter(image, colorMatrix = matrix), contentScale = contentScale, alignment = alignment, modifier = modifier @@ -255,7 +258,7 @@ fun CoilImage( colorFilter: ColorFilter? = null, modifier: Modifier = Modifier ) { - WithConstraints(modifier) { constraints, _ -> + WithConstraints(modifier) { // Execute the request using executeAsComposable(), which guards the actual execution // so that the request is only run if the request changes. val result = if (request.sizeResolver != null) { @@ -284,25 +287,29 @@ fun CoilImage( } } +private val paintPool = Pools.SimplePool(2) + /** * An [ImagePainter] which draws the image with the given Android framework - * [android.graphics.ColorFilter]. + * [android.graphics.ColorMatrix]. */ -private class AndroidColorMatrixImagePainter( +private class ColorMatrixImagePainter( private val image: ImageAsset, - colorFilter: android.graphics.ColorFilter + private val srcOffset: Offset = Offset.zero, + private val srcSize: Size = Size(image.width.toFloat(), image.height.toFloat()), + private val colorMatrix: ColorMatrix? = null ) : Painter() { - private val paint = Paint() private val size = PxSize(IntPx(image.width), IntPx(image.height)) - init { - paint.asFrameworkPaint().colorFilter = colorFilter - } + override fun CanvasScope.onDraw() { + val paint = paintPool.acquire() ?: Paint() + paint.asFrameworkPaint().colorFilter = colorMatrix?.let(::ColorMatrixColorFilter) + + drawCanvas { canvas, _ -> + canvas.drawImageRect(image, srcOffset, srcSize, Offset.zero, size, paint) + } - override fun onDraw(canvas: Canvas, bounds: PxSize) { - // Always draw the image in the top left as we expect it to be translated and scaled - // in the appropriate position - canvas.drawImage(image, Offset.zero, paint) + paintPool.release(paint) } /**