Small clean
This commit is contained in:
1 parent
8785ad08ce
commit
73bcce5cd8
4 files changed
+72
-55
No files matched your search
@@ -4,7 +4,6 @@ import android.graphics.RenderEffect
|
||||
import android.graphics.RuntimeShader
|
||||
import android.os.Build
|
||||
import androidx.annotation.RequiresApi
|
||||
import androidx.compose.foundation.shape.CornerBasedShape
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableFloatStateOf
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
@@ -25,23 +24,6 @@ interface BackdropEffectScope : Density {
|
||||
|
||||
var renderEffect: RenderEffect?
|
||||
|
||||
val cornerRadii: FloatArray
|
||||
get() {
|
||||
val shape = shape
|
||||
require(shape is CornerBasedShape) { "Only CornerBasedShape is supported." }
|
||||
val isLtr = layoutDirection == LayoutDirection.Ltr
|
||||
return floatArrayOf(
|
||||
if (isLtr) shape.topStart.toPx(size, this)
|
||||
else shape.topEnd.toPx(size, this),
|
||||
if (isLtr) shape.topEnd.toPx(size, this)
|
||||
else shape.topStart.toPx(size, this),
|
||||
if (isLtr) shape.bottomEnd.toPx(size, this)
|
||||
else shape.bottomStart.toPx(size, this),
|
||||
if (isLtr) shape.bottomStart.toPx(size, this)
|
||||
else shape.bottomEnd.toPx(size, this)
|
||||
)
|
||||
}
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
|
||||
fun obtainRuntimeShader(key: String, string: String): RuntimeShader
|
||||
}
|
||||
|
||||
@@ -15,9 +15,7 @@ internal interface BackdropShapeProvider {
|
||||
}
|
||||
|
||||
@Immutable
|
||||
internal class CachedBackdropShapeProvider(
|
||||
val shapeProvider: () -> Shape
|
||||
) : BackdropShapeProvider {
|
||||
internal class CachedBackdropShapeProvider(val shapeProvider: () -> Shape) : BackdropShapeProvider {
|
||||
|
||||
private var _outline: Outline? = null
|
||||
private var _size: Size = Size.Unspecified
|
||||
|
||||
File renamed without changes.
@@ -2,6 +2,8 @@ package com.kyant.backdrop.effects
|
||||
|
||||
import android.graphics.RenderEffect
|
||||
import android.os.Build
|
||||
import androidx.compose.foundation.shape.CornerBasedShape
|
||||
import androidx.compose.ui.unit.LayoutDirection
|
||||
import com.kyant.backdrop.BackdropEffectScope
|
||||
import com.kyant.backdrop.DispersionShaderString
|
||||
import com.kyant.backdrop.RefractionShaderString
|
||||
@@ -14,15 +16,21 @@ fun BackdropEffectScope.refraction(
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) return
|
||||
if (height <= 0f || amount <= 0f) return
|
||||
|
||||
val shader = obtainRuntimeShader("Refraction", RefractionShaderString).apply {
|
||||
setFloatUniform("size", size.width, size.height)
|
||||
setFloatUniform("cornerRadii", cornerRadii)
|
||||
setFloatUniform("refractionHeight", height)
|
||||
setFloatUniform("refractionAmount", -amount)
|
||||
setFloatUniform("depthEffect", if (hasDepthEffect) 1f else 0f)
|
||||
}
|
||||
val cornerRadii = cornerRadii
|
||||
val effect =
|
||||
if (cornerRadii != null) {
|
||||
val shader = obtainRuntimeShader("Refraction", RefractionShaderString).apply {
|
||||
setFloatUniform("size", size.width, size.height)
|
||||
setFloatUniform("cornerRadii", cornerRadii)
|
||||
setFloatUniform("refractionHeight", height)
|
||||
setFloatUniform("refractionAmount", -amount)
|
||||
setFloatUniform("depthEffect", if (hasDepthEffect) 1f else 0f)
|
||||
}
|
||||
RenderEffect.createRuntimeShaderEffect(shader, "image")
|
||||
} else {
|
||||
throwUnsupportedSDFException()
|
||||
}
|
||||
|
||||
val effect = RenderEffect.createRuntimeShaderEffect(shader, "image")
|
||||
effect(effect)
|
||||
}
|
||||
|
||||
@@ -33,14 +41,19 @@ fun BackdropEffectScope.dispersion(
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) return
|
||||
if (height <= 0f || amount <= 0f) return
|
||||
|
||||
val shader = obtainRuntimeShader("Dispersion", DispersionShaderString).apply {
|
||||
setFloatUniform("size", size.width, size.height)
|
||||
setFloatUniform("cornerRadii", cornerRadii)
|
||||
setFloatUniform("dispersionHeight", height)
|
||||
setFloatUniform("dispersionAmount", amount)
|
||||
}
|
||||
|
||||
val effect = RenderEffect.createRuntimeShaderEffect(shader, "image")
|
||||
val cornerRadii = cornerRadii
|
||||
val effect =
|
||||
if (cornerRadii != null) {
|
||||
val shader = obtainRuntimeShader("Dispersion", DispersionShaderString).apply {
|
||||
setFloatUniform("size", size.width, size.height)
|
||||
setFloatUniform("cornerRadii", cornerRadii)
|
||||
setFloatUniform("dispersionHeight", height)
|
||||
setFloatUniform("dispersionAmount", amount)
|
||||
}
|
||||
RenderEffect.createRuntimeShaderEffect(shader, "image")
|
||||
} else {
|
||||
throwUnsupportedSDFException()
|
||||
}
|
||||
effect(effect)
|
||||
}
|
||||
|
||||
@@ -54,24 +67,48 @@ fun BackdropEffectScope.refractionWithDispersion(
|
||||
if (height <= 0f || amount <= 0f) return
|
||||
|
||||
val cornerRadii = cornerRadii
|
||||
val effect =
|
||||
if (cornerRadii != null) {
|
||||
val refractionShader = obtainRuntimeShader("Refraction", RefractionShaderString).apply {
|
||||
setFloatUniform("size", size.width, size.height)
|
||||
setFloatUniform("cornerRadii", cornerRadii)
|
||||
setFloatUniform("refractionHeight", height)
|
||||
setFloatUniform("refractionAmount", -amount)
|
||||
setFloatUniform("depthEffect", if (hasDepthEffect) 1f else 0f)
|
||||
}
|
||||
val dispersionShader = obtainRuntimeShader("Dispersion", DispersionShaderString).apply {
|
||||
setFloatUniform("size", size.width, size.height)
|
||||
setFloatUniform("cornerRadii", cornerRadii)
|
||||
setFloatUniform("dispersionHeight", height * dispersionIntensity)
|
||||
setFloatUniform("dispersionAmount", amount * dispersionIntensity)
|
||||
}
|
||||
RenderEffect.createChainEffect(
|
||||
RenderEffect.createRuntimeShaderEffect(dispersionShader, "image"),
|
||||
RenderEffect.createRuntimeShaderEffect(refractionShader, "image")
|
||||
)
|
||||
} else {
|
||||
throwUnsupportedSDFException()
|
||||
}
|
||||
|
||||
val refractionShader = obtainRuntimeShader("Refraction", RefractionShaderString).apply {
|
||||
setFloatUniform("size", size.width, size.height)
|
||||
setFloatUniform("cornerRadii", cornerRadii)
|
||||
setFloatUniform("refractionHeight", height)
|
||||
setFloatUniform("refractionAmount", -amount)
|
||||
setFloatUniform("depthEffect", if (hasDepthEffect) 1f else 0f)
|
||||
}
|
||||
val dispersionShader = obtainRuntimeShader("Dispersion", DispersionShaderString).apply {
|
||||
setFloatUniform("size", size.width, size.height)
|
||||
setFloatUniform("cornerRadii", cornerRadii)
|
||||
setFloatUniform("dispersionHeight", height * dispersionIntensity)
|
||||
setFloatUniform("dispersionAmount", amount * dispersionIntensity)
|
||||
}
|
||||
|
||||
val effect = RenderEffect.createChainEffect(
|
||||
RenderEffect.createRuntimeShaderEffect(dispersionShader, "image"),
|
||||
RenderEffect.createRuntimeShaderEffect(refractionShader, "image")
|
||||
)
|
||||
effect(effect)
|
||||
}
|
||||
|
||||
private val BackdropEffectScope.cornerRadii: FloatArray?
|
||||
get() {
|
||||
val shape = shape as? CornerBasedShape ?: return null
|
||||
val isLtr = layoutDirection == LayoutDirection.Ltr
|
||||
return floatArrayOf(
|
||||
if (isLtr) shape.topStart.toPx(size, this)
|
||||
else shape.topEnd.toPx(size, this),
|
||||
if (isLtr) shape.topEnd.toPx(size, this)
|
||||
else shape.topStart.toPx(size, this),
|
||||
if (isLtr) shape.bottomEnd.toPx(size, this)
|
||||
else shape.bottomStart.toPx(size, this),
|
||||
if (isLtr) shape.bottomStart.toPx(size, this)
|
||||
else shape.bottomEnd.toPx(size, this)
|
||||
)
|
||||
}
|
||||
|
||||
private fun throwUnsupportedSDFException(): Nothing {
|
||||
throw UnsupportedOperationException("Only CornerBasedShape is supported in lens effects.")
|
||||
}
|
||||
Reference in new issue
Block a user