
net.peanuuutz.fork.ui.foundation.draw.Overlay.kt Maven / Gradle / Ivy
package net.peanuuutz.fork.ui.foundation.draw
import androidx.compose.runtime.Stable
import net.peanuuutz.fork.ui.foundation.draw.painter.BrushPainter
import net.peanuuutz.fork.ui.foundation.draw.painter.ColorPainter
import net.peanuuutz.fork.ui.foundation.draw.painter.TexturePainter
import net.peanuuutz.fork.ui.inspection.InspectInfo
import net.peanuuutz.fork.ui.ui.draw.ContentDrawScope
import net.peanuuutz.fork.ui.ui.draw.Painter
import net.peanuuutz.fork.ui.ui.draw.ScaleFactor
import net.peanuuutz.fork.ui.ui.draw.shading.Brush
import net.peanuuutz.fork.ui.ui.draw.shading.TextureRegion
import net.peanuuutz.fork.ui.ui.draw.shading.TextureSpec
import net.peanuuutz.fork.ui.ui.draw.shading.createFullRegion
import net.peanuuutz.fork.ui.ui.modifier.Modifier
import net.peanuuutz.fork.ui.ui.modifier.ModifierNodeElement
import net.peanuuutz.fork.ui.ui.node.DrawModifierNode
import net.peanuuutz.fork.ui.ui.node.ModifierNode
import net.peanuuutz.fork.util.common.Color
@Stable
fun Modifier.overlay(
color: Color,
alpha: Float = 1.0f
): Modifier {
val painter = ColorPainter(
color = color,
alpha = alpha
)
return overlay(painter)
}
@Stable
fun Modifier.overlay(
brush: Brush,
alpha: Float = 1.0f
): Modifier {
val painter = BrushPainter(
brush = brush,
alpha = alpha
)
return overlay(painter)
}
@Stable
fun Modifier.overlay(
spec: TextureSpec,
region: TextureRegion = spec.createFullRegion(),
scaleFactor: ScaleFactor = ScaleFactor.Unchanged,
tintColor: Color = Color.White,
alpha: Float = 1.0f
): Modifier {
val painter = TexturePainter(
spec = spec,
region = region,
scaleFactor = scaleFactor,
tintColor = tintColor,
alpha = alpha
)
return overlay(painter)
}
@Stable
fun Modifier.overlay(painter: Painter): Modifier {
return this then OverlayModifier(painter)
}
// ======== Internal ========
private data class OverlayModifier(
val painter: Painter
) : ModifierNodeElement() {
override fun create(): OverlayModifierNode {
return OverlayModifierNode(painter)
}
override fun update(node: OverlayModifierNode) {
node.painter = painter
}
override fun InspectInfo.inspect() {
set("painter", painter)
}
}
private class OverlayModifierNode(
var painter: Painter
) : ModifierNode(), DrawModifierNode {
override fun ContentDrawScope.draw() {
drawContent()
with(painter) {
onDraw()
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy