diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/Robohash.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/Robohash.kt
index 7262646a3..58d206a40 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/Robohash.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/Robohash.kt
@@ -73,6 +73,7 @@ class HashImageFetcher(
}
}
+@Deprecated("Use the RobohashAssembler instead")
object RobohashImageRequest {
fun build(
context: Context,
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RobohashAsyncImage.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RobohashAsyncImage.kt
index 031fbf160..7dd55d343 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RobohashAsyncImage.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RobohashAsyncImage.kt
@@ -36,12 +36,12 @@ import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.graphics.DefaultAlpha
import androidx.compose.ui.graphics.FilterQuality
import androidx.compose.ui.graphics.drawscope.DrawScope
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalContext
import androidx.core.graphics.drawable.toDrawable
import coil.ImageLoader
import coil.compose.AsyncImage
-import coil.compose.AsyncImagePainter
import coil.compose.rememberAsyncImagePainter
import coil.decode.DataSource
import coil.fetch.DrawableResult
@@ -49,6 +49,7 @@ import coil.fetch.FetchResult
import coil.fetch.Fetcher
import coil.request.ImageRequest
import coil.request.Options
+import com.vitorpamplona.amethyst.commons.CachedRobohash
import com.vitorpamplona.amethyst.service.checkNotInMainThread
import com.vitorpamplona.amethyst.ui.theme.isLight
import java.util.Base64
@@ -58,31 +59,18 @@ fun RobohashAsyncImage(
robot: String,
modifier: Modifier = Modifier,
contentDescription: String? = null,
- transform: (AsyncImagePainter.State) -> AsyncImagePainter.State =
- AsyncImagePainter.DefaultTransform,
- onState: ((AsyncImagePainter.State) -> Unit)? = null,
- alignment: Alignment = Alignment.Center,
- contentScale: ContentScale = ContentScale.Fit,
- alpha: Float = DefaultAlpha,
- colorFilter: ColorFilter? = null,
- filterQuality: FilterQuality = DrawScope.DefaultFilterQuality,
) {
- val context = LocalContext.current
val isLightTheme = MaterialTheme.colorScheme.isLight
- val imageRequest = remember(robot) { RobohashImageRequest.build(context, robot, isLightTheme) }
+ val robotPainter =
+ remember(robot) {
+ CachedRobohash.get(robot, isLightTheme)
+ }
- AsyncImage(
- model = imageRequest,
+ Image(
+ imageVector = robotPainter,
contentDescription = contentDescription,
modifier = modifier,
- transform = transform,
- onState = onState,
- alignment = alignment,
- contentScale = contentScale,
- alpha = alpha,
- colorFilter = colorFilter,
- filterQuality = filterQuality,
)
}
@@ -101,10 +89,6 @@ fun RobohashFallbackAsyncImage(
) {
val context = LocalContext.current
val isLightTheme = MaterialTheme.colorScheme.isLight
- val painter =
- rememberAsyncImagePainter(
- model = RobohashImageRequest.build(context, robot, isLightTheme),
- )
if (model != null && loadProfilePicture) {
val isBase64 by remember { derivedStateOf { model.startsWith("data:image/jpeg;base64,") } }
@@ -124,6 +108,11 @@ fun RobohashFallbackAsyncImage(
colorFilter = colorFilter,
)
} else {
+ val painter =
+ rememberVectorPainter(
+ image = CachedRobohash.get(robot, isLightTheme),
+ )
+
AsyncImage(
model = model,
contentDescription = contentDescription,
@@ -139,8 +128,10 @@ fun RobohashFallbackAsyncImage(
)
}
} else {
+ val robotPainter = CachedRobohash.get(robot, isLightTheme)
+
Image(
- painter = painter,
+ imageVector = robotPainter,
contentDescription = contentDescription,
modifier = modifier,
alignment = alignment,
diff --git a/benchmark/build.gradle b/benchmark/build.gradle
index be097e2d7..3c15185d5 100644
--- a/benchmark/build.gradle
+++ b/benchmark/build.gradle
@@ -56,6 +56,8 @@ dependencies {
androidTestImplementation project(path: ':quartz')
androidTestImplementation project(path: ':commons')
+ androidTestImplementation libs.androidx.compose.foundation
+
// Add your dependencies here. Note that you cannot benchmark code
// in an app module this way - you will need to move any code you
// want to benchmark to a library module:
diff --git a/benchmark/src/androidTest/java/com/vitorpamplona/amethyst/benchmark/RobohashBenchmark.kt b/benchmark/src/androidTest/java/com/vitorpamplona/amethyst/benchmark/RobohashBenchmark.kt
index fe35c01d1..93b06efcd 100644
--- a/benchmark/src/androidTest/java/com/vitorpamplona/amethyst/benchmark/RobohashBenchmark.kt
+++ b/benchmark/src/androidTest/java/com/vitorpamplona/amethyst/benchmark/RobohashBenchmark.kt
@@ -24,7 +24,7 @@ import androidx.benchmark.junit4.BenchmarkRule
import androidx.benchmark.junit4.measureRepeated
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.vitorpamplona.amethyst.commons.Robohash
-import junit.framework.TestCase.assertEquals
+import com.vitorpamplona.amethyst.commons.RobohashAssembler
import okio.Buffer
import okio.buffer
import okio.source
@@ -45,162 +45,21 @@ class RobohashBenchmark {
val warmHex = "f4f016c739b8ec0d6313540a8b12cf48a72b485d38338627ec9d427583551f9a"
val testHex = "48a72b485d38338627ec9d427583551f9af4f016c739b8ec0d6313540a8b12cf"
- val expectedTestSVG =
- ""
@Test
- fun createSVG() {
+ fun createSVGInString() {
// warm up
Robohash.assemble(warmHex, true)
benchmarkRule.measureRepeated {
- val result = Robohash.assemble(testHex, true)
- assertEquals(expectedTestSVG, result)
+ Robohash.assemble(testHex, true)
+ }
+ }
+
+ @Test
+ fun createSVGFromPaths() {
+ // warm up
+ benchmarkRule.measureRepeated {
+ RobohashAssembler().build(testHex, true)
}
}
diff --git a/benchmark/src/androidTest/java/com/vitorpamplona/amethyst/benchmark/RobohashPartsBenchmark.kt b/benchmark/src/androidTest/java/com/vitorpamplona/amethyst/benchmark/RobohashPartsBenchmark.kt
new file mode 100644
index 000000000..66759f6f4
--- /dev/null
+++ b/benchmark/src/androidTest/java/com/vitorpamplona/amethyst/benchmark/RobohashPartsBenchmark.kt
@@ -0,0 +1,403 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.benchmark
+
+import androidx.benchmark.junit4.BenchmarkRule
+import androidx.benchmark.junit4.measureRepeated
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.roboBuilder
+import com.vitorpamplona.amethyst.commons.robohashparts.accessory0Seven
+import com.vitorpamplona.amethyst.commons.robohashparts.accessory1Nose
+import com.vitorpamplona.amethyst.commons.robohashparts.accessory2HornRed
+import com.vitorpamplona.amethyst.commons.robohashparts.accessory3Button
+import com.vitorpamplona.amethyst.commons.robohashparts.accessory4Satellite
+import com.vitorpamplona.amethyst.commons.robohashparts.accessory5Mustache
+import com.vitorpamplona.amethyst.commons.robohashparts.accessory6Hat
+import com.vitorpamplona.amethyst.commons.robohashparts.accessory7Antenna
+import com.vitorpamplona.amethyst.commons.robohashparts.accessory8Brush
+import com.vitorpamplona.amethyst.commons.robohashparts.accessory9Horn
+import com.vitorpamplona.amethyst.commons.robohashparts.body0Trooper
+import com.vitorpamplona.amethyst.commons.robohashparts.body1Thin
+import com.vitorpamplona.amethyst.commons.robohashparts.body2Thinnest
+import com.vitorpamplona.amethyst.commons.robohashparts.body3Front
+import com.vitorpamplona.amethyst.commons.robohashparts.body4Round
+import com.vitorpamplona.amethyst.commons.robohashparts.body5Neck
+import com.vitorpamplona.amethyst.commons.robohashparts.body6IronMan
+import com.vitorpamplona.amethyst.commons.robohashparts.body7NeckThinner
+import com.vitorpamplona.amethyst.commons.robohashparts.body8Big
+import com.vitorpamplona.amethyst.commons.robohashparts.body9Huge
+import com.vitorpamplona.amethyst.commons.robohashparts.eyes0Squint
+import com.vitorpamplona.amethyst.commons.robohashparts.eyes1Round
+import com.vitorpamplona.amethyst.commons.robohashparts.eyes2Single
+import com.vitorpamplona.amethyst.commons.robohashparts.eyes3Scott
+import com.vitorpamplona.amethyst.commons.robohashparts.eyes4RoundSingle
+import com.vitorpamplona.amethyst.commons.robohashparts.eyes5RoundSmall
+import com.vitorpamplona.amethyst.commons.robohashparts.eyes6WallE
+import com.vitorpamplona.amethyst.commons.robohashparts.eyes7Bar
+import com.vitorpamplona.amethyst.commons.robohashparts.eyes8SmallBar
+import com.vitorpamplona.amethyst.commons.robohashparts.eyes9Shield
+import com.vitorpamplona.amethyst.commons.robohashparts.face0C3po
+import com.vitorpamplona.amethyst.commons.robohashparts.face1Rock
+import com.vitorpamplona.amethyst.commons.robohashparts.face2Long
+import com.vitorpamplona.amethyst.commons.robohashparts.face3Oval
+import com.vitorpamplona.amethyst.commons.robohashparts.face4Cylinder
+import com.vitorpamplona.amethyst.commons.robohashparts.face5Baloon
+import com.vitorpamplona.amethyst.commons.robohashparts.face6Triangle
+import com.vitorpamplona.amethyst.commons.robohashparts.face7Bent
+import com.vitorpamplona.amethyst.commons.robohashparts.face8TriangleInv
+import com.vitorpamplona.amethyst.commons.robohashparts.face9Square
+import com.vitorpamplona.amethyst.commons.robohashparts.mouth0Horz
+import com.vitorpamplona.amethyst.commons.robohashparts.mouth1Cylinder
+import com.vitorpamplona.amethyst.commons.robohashparts.mouth2Teeth
+import com.vitorpamplona.amethyst.commons.robohashparts.mouth3Grid
+import com.vitorpamplona.amethyst.commons.robohashparts.mouth4Vert
+import com.vitorpamplona.amethyst.commons.robohashparts.mouth5MidOpen
+import com.vitorpamplona.amethyst.commons.robohashparts.mouth6Cell
+import com.vitorpamplona.amethyst.commons.robohashparts.mouth7Happy
+import com.vitorpamplona.amethyst.commons.robohashparts.mouth8Buttons
+import com.vitorpamplona.amethyst.commons.robohashparts.mouth9Closed
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/**
+ * Benchmark, which will execute on an Android device.
+ *
+ * The body of [test] is measured in a loop, and Studio will output the
+ * result. Modify your code to see how it affects performance.
+ */
+@RunWith(AndroidJUnit4::class)
+class RobohashPartsBenchmark {
+ @get:Rule val benchmarkRule = BenchmarkRule()
+
+ val fgColor: SolidColor = Black
+
+ fun test(function: (builder: ImageVector.Builder) -> Unit) {
+ benchmarkRule.measureRepeated {
+ roboBuilder("Test") {
+ function(this)
+ }
+ }
+ }
+
+ @Test
+ fun body0Trooper(): Unit =
+ test {
+ body0Trooper(fgColor, it)
+ }
+
+ @Test
+ fun body1Thin(): Unit =
+ test {
+ body1Thin(fgColor, it)
+ }
+
+ @Test
+ fun body2Thinnest(): Unit =
+ test {
+ body2Thinnest(fgColor, it)
+ }
+
+ @Test
+ fun body3Front(): Unit =
+ test {
+ body3Front(fgColor, it)
+ }
+
+ @Test
+ fun body4Round(): Unit =
+ test {
+ body4Round(fgColor, it)
+ }
+
+ @Test
+ fun body5Neck(): Unit =
+ test {
+ body5Neck(fgColor, it)
+ }
+
+ @Test
+ fun body6IronMan(): Unit =
+ test {
+ body6IronMan(fgColor, it)
+ }
+
+ @Test
+ fun body7NeckThinner(): Unit =
+ test {
+ body7NeckThinner(fgColor, it)
+ }
+
+ @Test
+ fun body8Big(): Unit =
+ test {
+ body8Big(fgColor, it)
+ }
+
+ @Test
+ fun body9Huge(): Unit =
+ test {
+ body9Huge(fgColor, it)
+ }
+
+ @Test
+ fun face0C3po(): Unit =
+ test {
+ face0C3po(fgColor, it)
+ }
+
+ @Test
+ fun face1Rock(): Unit =
+ test {
+ face1Rock(fgColor, it)
+ }
+
+ @Test
+ fun face2Long(): Unit =
+ test {
+ face2Long(fgColor, it)
+ }
+
+ @Test
+ fun face3Oval(): Unit =
+ test {
+ face3Oval(fgColor, it)
+ }
+
+ @Test
+ fun face4Cylinder(): Unit =
+ test {
+ face4Cylinder(fgColor, it)
+ }
+
+ @Test
+ fun face5Baloon(): Unit =
+ test {
+ face5Baloon(fgColor, it)
+ }
+
+ @Test
+ fun face6Triangle(): Unit =
+ test {
+ face6Triangle(fgColor, it)
+ }
+
+ @Test
+ fun face7Bent(): Unit =
+ test {
+ face7Bent(fgColor, it)
+ }
+
+ @Test
+ fun face8TriangleInv(): Unit =
+ test {
+ face8TriangleInv(fgColor, it)
+ }
+
+ @Test
+ fun face9Square(): Unit =
+ test {
+ face9Square(fgColor, it)
+ }
+
+ @Test
+ fun eyes0Squint(): Unit =
+ test {
+ eyes0Squint(fgColor, it)
+ }
+
+ @Test
+ fun eyes1Round(): Unit =
+ test {
+ eyes1Round(fgColor, it)
+ }
+
+ @Test
+ fun eyes2Single(): Unit =
+ test {
+ eyes2Single(fgColor, it)
+ }
+
+ @Test
+ fun eyes3Scott(): Unit =
+ test {
+ eyes3Scott(fgColor, it)
+ }
+
+ @Test
+ fun eyes4RoundSingle(): Unit =
+ test {
+ eyes4RoundSingle(fgColor, it)
+ }
+
+ @Test
+ fun eyes5RoundSmall(): Unit =
+ test {
+ eyes5RoundSmall(fgColor, it)
+ }
+
+ @Test
+ fun eyes6WallE(): Unit =
+ test {
+ eyes6WallE(fgColor, it)
+ }
+
+ @Test
+ fun eyes7Bar(): Unit =
+ test {
+ eyes7Bar(fgColor, it)
+ }
+
+ @Test
+ fun eyes8SmallBar(): Unit =
+ test {
+ eyes8SmallBar(fgColor, it)
+ }
+
+ @Test
+ fun eyes9Shield(): Unit =
+ test {
+ eyes9Shield(fgColor, it)
+ }
+
+ @Test
+ fun mouth0Horz(): Unit =
+ test {
+ mouth0Horz(fgColor, it)
+ }
+
+ @Test
+ fun mouth1Cylinder(): Unit =
+ test {
+ mouth1Cylinder(fgColor, it)
+ }
+
+ @Test
+ fun mouth2Teeth(): Unit =
+ test {
+ mouth2Teeth(fgColor, it)
+ }
+
+ @Test
+ fun mouth3Grid(): Unit =
+ test {
+ mouth3Grid(fgColor, it)
+ }
+
+ @Test
+ fun mouth4Vert(): Unit =
+ test {
+ mouth4Vert(fgColor, it)
+ }
+
+ @Test
+ fun mouth5MidOpen(): Unit =
+ test {
+ mouth5MidOpen(fgColor, it)
+ }
+
+ @Test
+ fun mouth6Cell(): Unit =
+ test {
+ mouth6Cell(fgColor, it)
+ }
+
+ @Test
+ fun mouth7Happy(): Unit =
+ test {
+ mouth7Happy(fgColor, it)
+ }
+
+ @Test
+ fun mouth8Buttons(): Unit =
+ test {
+ mouth8Buttons(fgColor, it)
+ }
+
+ @Test
+ fun mouth9Closed(): Unit =
+ test {
+ mouth9Closed(fgColor, it)
+ }
+
+ @Test
+ fun accessory0Seven(): Unit =
+ test {
+ accessory0Seven(fgColor, it)
+ }
+
+ @Test
+ fun accessory1Nose(): Unit =
+ test {
+ accessory1Nose(fgColor, it)
+ }
+
+ @Test
+ fun accessory2HornRed(): Unit =
+ test {
+ accessory2HornRed(fgColor, it)
+ }
+
+ @Test
+ fun accessory3Button(): Unit =
+ test {
+ accessory3Button(fgColor, it)
+ }
+
+ @Test
+ fun accessory4Satellite(): Unit =
+ test {
+ accessory4Satellite(fgColor, it)
+ }
+
+ @Test
+ fun accessory5Mustache(): Unit =
+ test {
+ accessory5Mustache(fgColor, it)
+ }
+
+ @Test
+ fun accessory6Hat(): Unit =
+ test {
+ accessory6Hat(fgColor, it)
+ }
+
+ @Test
+ fun accessory7Antenna(): Unit =
+ test {
+ accessory7Antenna(fgColor, it)
+ }
+
+ @Test
+ fun accessory8Brush(): Unit =
+ test {
+ accessory8Brush(fgColor, it)
+ }
+
+ @Test
+ fun accessory9Horn(): Unit =
+ test {
+ accessory9Horn(fgColor, it)
+ }
+}
diff --git a/commons/build.gradle b/commons/build.gradle
index 6adfe0abd..932c62c85 100644
--- a/commons/build.gradle
+++ b/commons/build.gradle
@@ -32,6 +32,14 @@ android {
jvmTarget = '17'
freeCompilerArgs += "-Xstring-concat=inline"
}
+
+ buildFeatures {
+ compose true
+ }
+ composeOptions {
+ // Should match compose version : https://developer.android.com/jetpack/androidx/releases/compose-kotlin
+ kotlinCompilerExtensionVersion "1.5.8"
+ }
}
dependencies {
@@ -40,6 +48,10 @@ dependencies {
// Import @Immutable and @Stable
implementation platform(libs.androidx.compose.bom)
implementation libs.androidx.ui
+ implementation libs.androidx.compose.foundation
+
+ debugImplementation libs.androidx.ui.tooling
+ implementation libs.androidx.ui.tooling.preview
// immutable collections to avoid recomposition
api libs.kotlinx.collections.immutable
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/CachedRobohash.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/CachedRobohash.kt
new file mode 100644
index 000000000..a88f9318b
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/CachedRobohash.kt
@@ -0,0 +1,63 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons
+
+import android.util.LruCache
+import androidx.compose.ui.graphics.vector.ImageVector
+
+object CachedRobohash {
+ var cacheIsForLightTheme: Boolean? = null
+ val cache = LruCache(100)
+ val assembler = RobohashAssembler()
+
+ fun cached(
+ msg: String,
+ isLightTheme: Boolean,
+ ): ImageVector? {
+ // resets cache on theme change
+ if (cacheIsForLightTheme != null && cacheIsForLightTheme != isLightTheme) {
+ cache.evictAll()
+ }
+
+ return cache[msg]
+ }
+
+ fun get(
+ msg: String,
+ isLightTheme: Boolean,
+ ): ImageVector {
+ // resets cache on theme change
+ if (cacheIsForLightTheme == null) {
+ cacheIsForLightTheme = isLightTheme
+ } else if (cacheIsForLightTheme != isLightTheme) {
+ cacheIsForLightTheme = isLightTheme
+ cache.evictAll()
+ }
+
+ cache[msg]?.let { return it }
+
+ val vector = assembler.build(msg, isLightTheme)
+
+ cache.put(msg, vector)
+
+ return vector
+ }
+}
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/RobohashAssembler.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/RobohashAssembler.kt
new file mode 100644
index 000000000..667da8f89
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/RobohashAssembler.kt
@@ -0,0 +1,280 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons
+
+import android.util.Log
+import androidx.compose.foundation.Image
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.shape.CircleShape
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.dp
+import com.vitorpamplona.amethyst.commons.robohashparts.accessory0Seven
+import com.vitorpamplona.amethyst.commons.robohashparts.accessory1Nose
+import com.vitorpamplona.amethyst.commons.robohashparts.accessory2HornRed
+import com.vitorpamplona.amethyst.commons.robohashparts.accessory3Button
+import com.vitorpamplona.amethyst.commons.robohashparts.accessory4Satellite
+import com.vitorpamplona.amethyst.commons.robohashparts.accessory5Mustache
+import com.vitorpamplona.amethyst.commons.robohashparts.accessory6Hat
+import com.vitorpamplona.amethyst.commons.robohashparts.accessory7Antenna
+import com.vitorpamplona.amethyst.commons.robohashparts.accessory8Brush
+import com.vitorpamplona.amethyst.commons.robohashparts.accessory9Horn
+import com.vitorpamplona.amethyst.commons.robohashparts.body0Trooper
+import com.vitorpamplona.amethyst.commons.robohashparts.body1Thin
+import com.vitorpamplona.amethyst.commons.robohashparts.body2Thinnest
+import com.vitorpamplona.amethyst.commons.robohashparts.body3Front
+import com.vitorpamplona.amethyst.commons.robohashparts.body4Round
+import com.vitorpamplona.amethyst.commons.robohashparts.body5Neck
+import com.vitorpamplona.amethyst.commons.robohashparts.body6IronMan
+import com.vitorpamplona.amethyst.commons.robohashparts.body7NeckThinner
+import com.vitorpamplona.amethyst.commons.robohashparts.body8Big
+import com.vitorpamplona.amethyst.commons.robohashparts.body9Huge
+import com.vitorpamplona.amethyst.commons.robohashparts.eyes0Squint
+import com.vitorpamplona.amethyst.commons.robohashparts.eyes1Round
+import com.vitorpamplona.amethyst.commons.robohashparts.eyes2Single
+import com.vitorpamplona.amethyst.commons.robohashparts.eyes3Scott
+import com.vitorpamplona.amethyst.commons.robohashparts.eyes4RoundSingle
+import com.vitorpamplona.amethyst.commons.robohashparts.eyes5RoundSmall
+import com.vitorpamplona.amethyst.commons.robohashparts.eyes6WallE
+import com.vitorpamplona.amethyst.commons.robohashparts.eyes7Bar
+import com.vitorpamplona.amethyst.commons.robohashparts.eyes8SmallBar
+import com.vitorpamplona.amethyst.commons.robohashparts.eyes9Shield
+import com.vitorpamplona.amethyst.commons.robohashparts.face0C3po
+import com.vitorpamplona.amethyst.commons.robohashparts.face1Rock
+import com.vitorpamplona.amethyst.commons.robohashparts.face2Long
+import com.vitorpamplona.amethyst.commons.robohashparts.face3Oval
+import com.vitorpamplona.amethyst.commons.robohashparts.face4Cylinder
+import com.vitorpamplona.amethyst.commons.robohashparts.face5Baloon
+import com.vitorpamplona.amethyst.commons.robohashparts.face6Triangle
+import com.vitorpamplona.amethyst.commons.robohashparts.face7Bent
+import com.vitorpamplona.amethyst.commons.robohashparts.face8TriangleInv
+import com.vitorpamplona.amethyst.commons.robohashparts.face9Square
+import com.vitorpamplona.amethyst.commons.robohashparts.mouth0Horz
+import com.vitorpamplona.amethyst.commons.robohashparts.mouth1Cylinder
+import com.vitorpamplona.amethyst.commons.robohashparts.mouth2Teeth
+import com.vitorpamplona.amethyst.commons.robohashparts.mouth3Grid
+import com.vitorpamplona.amethyst.commons.robohashparts.mouth4Vert
+import com.vitorpamplona.amethyst.commons.robohashparts.mouth5MidOpen
+import com.vitorpamplona.amethyst.commons.robohashparts.mouth6Cell
+import com.vitorpamplona.amethyst.commons.robohashparts.mouth7Happy
+import com.vitorpamplona.amethyst.commons.robohashparts.mouth8Buttons
+import com.vitorpamplona.amethyst.commons.robohashparts.mouth9Closed
+import com.vitorpamplona.quartz.crypto.CryptoUtils
+import com.vitorpamplona.quartz.encoders.Hex
+import com.vitorpamplona.quartz.encoders.HexValidator
+
+val Black = SolidColor(Color.Black)
+val Gray = SolidColor(Color(0xFF6d6e70))
+val Yellow = SolidColor(Color(0xFFf9ec31))
+val LightYellow = SolidColor(Color(0xFFfff100))
+val Brown = SolidColor(Color(0xFF461917))
+val DarkYellow = SolidColor(Color(0xFFfaaf40))
+val OrangeThree = SolidColor(Color(0xFFf6921e))
+
+val LightRed = SolidColor(Color(0xFFec1c24))
+val OrangeOne = SolidColor(Color(0xFFee4036))
+val OrangeTwo = SolidColor(Color(0xFFf05a28))
+
+val LightBrown = SolidColor(Color(0xFFbe1e2d))
+val LightGray = SolidColor(Color(0xFFe6e7e8))
+val MediumGray = SolidColor(Color(0xFFd0d2d3))
+
+val DefaultSize = 55.dp
+const val VIEWPORT_SIZE = 300f
+
+@Preview
+@Composable
+fun RobohashPreview() {
+ val assembler = RobohashAssembler()
+ Row {
+ Image(
+ painter =
+ rememberVectorPainter(
+ assembler.build(
+ msg = "460c25e682fda7832b52d1f22d3d22b3176d972f60dcdc3212ed8c92ef85065c",
+ isLightTheme = false,
+ ),
+ ),
+ contentDescription = "",
+ modifier = Modifier.padding(5.dp).clip(CircleShape),
+ )
+ Image(
+ painter =
+ rememberVectorPainter(
+ assembler.build(
+ msg = "460c25e682fda7832b52d1f22d3d22b3176d972f60dcdc3212ed8c92ef85065c",
+ isLightTheme = true,
+ ),
+ ),
+ contentDescription = "",
+ modifier = Modifier.padding(5.dp).clip(CircleShape),
+ )
+ }
+}
+
+class RobohashAssembler {
+ private fun byteMod10(byte: Byte): Int {
+ return byte.toUByte().toInt() % 10
+ }
+
+ private fun reduce(
+ start: Int,
+ channel: Byte,
+ ) = (start + (channel.toUByte().toInt() * 0.3906f)).toInt()
+
+ private fun bytesToColor(
+ r: Byte,
+ g: Byte,
+ b: Byte,
+ makeLight: Boolean,
+ ): Color {
+ return if (makeLight) {
+ // > 150-256 color channels
+ Color(reduce(150, r), reduce(150, g), reduce(150, b))
+ } else {
+ // < 50-100 color channels
+ Color(reduce(50, r), reduce(50, g), reduce(50, b))
+ }
+ }
+
+ fun build(
+ msg: String,
+ isLightTheme: Boolean,
+ ): ImageVector {
+ val hash =
+ if (HexValidator.isHex(msg)) {
+ Hex.decode(msg)
+ } else {
+ Log.w("Robohash", "$msg is not a hex")
+ CryptoUtils.sha256(msg.toByteArray())
+ }
+
+ val bgColor = SolidColor(bytesToColor(hash[0], hash[1], hash[2], isLightTheme))
+ val fgColor = SolidColor(bytesToColor(hash[3], hash[4], hash[5], !isLightTheme))
+
+ return roboBuilder(msg) {
+ // Background
+ addPath(
+ fill = bgColor,
+ pathData = BACKGROUND,
+ )
+
+ when (byteMod10(hash[6])) {
+ 0 -> body0Trooper(fgColor, this)
+ 1 -> body1Thin(fgColor, this)
+ 2 -> body2Thinnest(fgColor, this)
+ 3 -> body3Front(fgColor, this)
+ 4 -> body4Round(fgColor, this)
+ 5 -> body5Neck(fgColor, this)
+ 6 -> body6IronMan(fgColor, this)
+ 7 -> body7NeckThinner(fgColor, this)
+ 8 -> body8Big(fgColor, this)
+ 9 -> body9Huge(fgColor, this)
+ }
+
+ when (byteMod10(hash[7])) {
+ 0 -> face0C3po(fgColor, this)
+ 1 -> face1Rock(fgColor, this)
+ 2 -> face2Long(fgColor, this)
+ 3 -> face3Oval(fgColor, this)
+ 4 -> face4Cylinder(fgColor, this)
+ 5 -> face5Baloon(fgColor, this)
+ 6 -> face6Triangle(fgColor, this)
+ 7 -> face7Bent(fgColor, this)
+ 8 -> face8TriangleInv(fgColor, this)
+ 9 -> face9Square(fgColor, this)
+ }
+
+ when (byteMod10(hash[8])) {
+ 0 -> eyes0Squint(fgColor, this)
+ 1 -> eyes1Round(fgColor, this)
+ 2 -> eyes2Single(fgColor, this)
+ 3 -> eyes3Scott(fgColor, this)
+ 4 -> eyes4RoundSingle(fgColor, this)
+ 5 -> eyes5RoundSmall(fgColor, this)
+ 6 -> eyes6WallE(fgColor, this)
+ 7 -> eyes7Bar(fgColor, this)
+ 8 -> eyes8SmallBar(fgColor, this)
+ 9 -> eyes9Shield(fgColor, this)
+ }
+
+ when (byteMod10(hash[9])) {
+ 0 -> mouth0Horz(fgColor, this)
+ 1 -> mouth1Cylinder(fgColor, this)
+ 2 -> mouth2Teeth(fgColor, this)
+ 3 -> mouth3Grid(fgColor, this)
+ 4 -> mouth4Vert(fgColor, this)
+ 5 -> mouth5MidOpen(fgColor, this)
+ 6 -> mouth6Cell(fgColor, this)
+ 7 -> mouth7Happy(fgColor, this)
+ 8 -> mouth8Buttons(fgColor, this)
+ 9 -> mouth9Closed(fgColor, this)
+ }
+
+ when (byteMod10(hash[10])) {
+ 0 -> accessory0Seven(fgColor, this)
+ 1 -> accessory1Nose(fgColor, this)
+ 2 -> accessory2HornRed(fgColor, this)
+ 3 -> accessory3Button(fgColor, this)
+ 4 -> accessory4Satellite(fgColor, this)
+ 5 -> accessory5Mustache(fgColor, this)
+ 6 -> accessory6Hat(fgColor, this)
+ 7 -> accessory7Antenna(fgColor, this)
+ 8 -> accessory8Brush(fgColor, this)
+ 9 -> accessory9Horn(fgColor, this)
+ }
+ }
+ }
+
+ companion object {
+ val BACKGROUND =
+ PathData {
+ moveTo(0.0f, 0.0f)
+ horizontalLineToRelative(VIEWPORT_SIZE)
+ verticalLineToRelative(VIEWPORT_SIZE)
+ horizontalLineToRelative(-VIEWPORT_SIZE)
+ close()
+ }
+ }
+}
+
+inline fun roboBuilder(
+ name: String = "",
+ autoMirror: Boolean = false,
+ block: ImageVector.Builder.() -> Unit,
+) = ImageVector.Builder(
+ name = name,
+ defaultWidth = DefaultSize,
+ defaultHeight = DefaultSize,
+ viewportWidth = VIEWPORT_SIZE,
+ viewportHeight = VIEWPORT_SIZE,
+ autoMirror = autoMirror,
+).apply {
+ block()
+}.build()
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Accessory0Seven.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Accessory0Seven.kt
new file mode 100644
index 000000000..0c3a73fb4
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Accessory0Seven.kt
@@ -0,0 +1,96 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Accessory0SevenPreview() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ accessory0Seven(SolidColor(Color.Blue), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun accessory0Seven(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ builder.addPath(pathData1, fill = fgColor, stroke = Black, strokeLineWidth = 1.0f)
+ builder.addPath(pathData3, fill = Black, stroke = Black, fillAlpha = 0.4f, strokeLineWidth = 0.75f)
+ builder.addPath(pathData7, fill = Black, stroke = Black, fillAlpha = 0.2f, strokeLineWidth = 0.5f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(141.5f, 79.5f)
+ reflectiveCurveToRelative(-1.0f, 11.0f, -1.0f, 17.0f)
+ verticalLineToRelative(8.0f)
+ reflectiveCurveToRelative(-11.0f, 3.0f, -15.0f, 3.0f)
+ horizontalLineToRelative(-10.0f)
+ reflectiveCurveToRelative(-1.0f, -11.0f, -1.0f, -15.0f)
+ reflectiveCurveToRelative(-2.0f, -10.0f, 6.0f, -13.0f)
+ arcToRelative(138.0f, 138.0f, 0.0f, false, true, 14.0f, -1.0f)
+ curveTo(140.5f, 78.5f, 141.5f, 79.5f, 141.5f, 79.5f)
+ close()
+ }
+private val pathData3 =
+ PathData {
+ moveTo(116.5f, 106.5f)
+ reflectiveCurveToRelative(22.0f, -2.67f, 24.0f, -3.33f)
+ verticalLineToRelative(1.33f)
+ reflectiveCurveToRelative(-11.42f, 2.74f, -13.21f, 2.87f)
+ reflectiveCurveToRelative(-11.79f, 0.13f, -11.79f, 0.13f)
+ verticalLineToRelative(-0.94f)
+ lineToRelative(1.0f, -0.06f)
+ }
+private val pathData7 =
+ PathData {
+ moveTo(117.0f, 88.0f)
+ horizontalLineToRelative(3.0f)
+ arcToRelative(3.49f, 3.49f, 0.0f, false, true, 2.0f, -1.0f)
+ curveToRelative(1.0f, 0.0f, 9.5f, -1.5f, 9.5f, -1.5f)
+ reflectiveCurveToRelative(-9.0f, 7.0f, -10.0f, 13.0f)
+ verticalLineToRelative(4.0f)
+ lineToRelative(7.0f, -1.0f)
+ reflectiveCurveToRelative(-1.0f, -6.0f, 2.0f, -10.0f)
+ arcToRelative(22.28f, 22.28f, 0.0f, false, true, 7.0f, -6.0f)
+ verticalLineToRelative(-3.0f)
+ lineToRelative(-1.0f, -1.0f)
+ lineToRelative(-18.0f, 2.0f)
+ lineToRelative(-1.0f, 1.0f)
+ close()
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Accessory1Nose.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Accessory1Nose.kt
new file mode 100644
index 000000000..1e930c8c4
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Accessory1Nose.kt
@@ -0,0 +1,85 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Accessory1NosePreview() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ accessory1Nose(SolidColor(Color.Blue), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun accessory1Nose(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ builder.addPath(pathData1, fill = fgColor, stroke = Black, strokeLineWidth = 1.0f)
+ builder.addPath(pathData2, fill = Black, fillAlpha = 0.2f)
+ builder.addPath(pathData4, stroke = Black, strokeLineWidth = 0.75f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(103.5f, 165.5f)
+ reflectiveCurveToRelative(11.0f, -4.0f, 15.0f, -6.0f)
+ arcToRelative(59.46f, 59.46f, 0.0f, false, true, 7.0f, -3.0f)
+ reflectiveCurveToRelative(5.0f, 0.0f, 6.0f, 3.0f)
+ reflectiveCurveToRelative(0.0f, 5.0f, -1.0f, 6.0f)
+ reflectiveCurveToRelative(-23.0f, 8.0f, -23.0f, 8.0f)
+ arcToRelative(4.45f, 4.45f, 0.0f, false, true, -5.0f, -2.0f)
+ curveTo(99.5f, 166.5f, 103.5f, 165.5f, 103.5f, 165.5f)
+ close()
+ }
+private val pathData2 =
+ PathData {
+ moveTo(102.0f, 167.0f)
+ curveToRelative(-1.07f, 1.3f, 1.29f, 6.38f, 2.64f, 6.19f)
+ reflectiveCurveToRelative(6.07f, 0.81f, 4.36f, -4.12f)
+ curveTo(107.18f, 165.0f, 103.05f, 165.72f, 102.0f, 167.0f)
+ close()
+ }
+private val pathData4 =
+ PathData {
+ moveTo(106.5f, 173.5f)
+ curveToRelative(3.0f, -1.0f, 3.0f, -3.0f, 2.0f, -5.0f)
+ curveToRelative(-3.0f, -4.0f, -6.0f, -2.0f, -6.0f, -2.24f)
+ moveTo(109.1f, 163.4f)
+ reflectiveCurveToRelative(4.4f, 0.1f, 5.4f, 3.1f)
+ arcToRelative(5.22f, 5.22f, 0.0f, false, true, -0.78f, 5.0f)
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Accessory2HornRed.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Accessory2HornRed.kt
new file mode 100644
index 000000000..d3a822e8b
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Accessory2HornRed.kt
@@ -0,0 +1,180 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.Brown
+import com.vitorpamplona.amethyst.commons.LightBrown
+import com.vitorpamplona.amethyst.commons.LightGray
+import com.vitorpamplona.amethyst.commons.LightRed
+import com.vitorpamplona.amethyst.commons.MediumGray
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Accessory2HornRedPreview() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ accessory2HornRed(SolidColor(Color.Blue), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun accessory2HornRed(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ builder.addPath(pathData1, fill = fgColor, stroke = Black, strokeLineWidth = 1.0f)
+ builder.addPath(pathData2, fill = LightBrown, stroke = Black, strokeLineWidth = 1.0f)
+ builder.addPath(pathData3, fill = Brown)
+ builder.addPath(pathData4, fill = LightRed)
+ builder.addPath(pathData6, fill = Black, stroke = Black, fillAlpha = 0.2f, strokeLineWidth = 0.75f)
+ builder.addPath(pathData8, fill = Black, fillAlpha = 0.2f)
+ builder.addPath(pathData9, fill = LightGray, stroke = Black, strokeLineWidth = 1.0f)
+ builder.addPath(pathData10, fill = MediumGray)
+ builder.addPath(pathData11, stroke = Black, strokeLineWidth = 1.0f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(122.5f, 94.5f)
+ reflectiveCurveToRelative(4.0f, 3.0f, 13.0f, 3.0f)
+ reflectiveCurveToRelative(16.0f, -6.0f, 16.0f, -6.0f)
+ arcToRelative(26.39f, 26.39f, 0.0f, false, false, -1.0f, -7.0f)
+ curveToRelative(-1.0f, -3.0f, -10.49f, -2.87f, -15.74f, -1.93f)
+ reflectiveCurveToRelative(-11.26f, 0.93f, -12.26f, 3.93f)
+ close()
+ }
+private val pathData2 =
+ PathData {
+ moveTo(125.5f, 26.0f)
+ arcToRelative(7.5f, 6.5f, 0.0f, true, false, 15.0f, 0.0f)
+ arcToRelative(7.5f, 6.5f, 0.0f, true, false, -15.0f, 0.0f)
+ close()
+ }
+private val pathData3 =
+ PathData {
+ moveTo(140.0f, 25.0f)
+ curveToRelative(0.19f, 0.68f, -5.51f, 8.12f, -11.57f, 6.27f)
+ arcToRelative(8.65f, 8.65f, 0.0f, false, false, 7.91f, 0.53f)
+ curveTo(141.0f, 30.0f, 140.0f, 25.0f, 140.0f, 25.0f)
+ close()
+ }
+private val pathData4 =
+ PathData {
+ moveTo(126.856f, 25.249f)
+ arcToRelative(2.238f, 4.475f, 60.113f, true, false, 7.76f, -4.46f)
+ arcToRelative(2.238f, 4.475f, 60.113f, true, false, -7.76f, 4.46f)
+ close()
+ }
+private val pathData5 =
+ PathData {
+ moveTo(125.5f, 26.0f)
+ arcToRelative(7.5f, 6.5f, 0.0f, true, false, 15.0f, 0.0f)
+ arcToRelative(7.5f, 6.5f, 0.0f, true, false, -15.0f, 0.0f)
+ close()
+ }
+private val pathData6 =
+ PathData {
+ moveTo(135.5f, 82.5f)
+ reflectiveCurveToRelative(-13.0f, 1.0f, -13.0f, 4.0f)
+ reflectiveCurveToRelative(9.0f, 4.0f, 13.0f, 4.0f)
+ reflectiveCurveToRelative(15.0f, -2.0f, 15.0f, -6.0f)
+ reflectiveCurveTo(135.5f, 82.5f, 135.5f, 82.5f)
+ close()
+ }
+private val pathData7 =
+ PathData {
+ moveTo(122.5f, 94.5f)
+ reflectiveCurveToRelative(4.0f, 3.0f, 13.0f, 3.0f)
+ reflectiveCurveToRelative(16.0f, -6.0f, 16.0f, -6.0f)
+ arcToRelative(26.39f, 26.39f, 0.0f, false, false, -1.0f, -7.0f)
+ curveToRelative(-1.0f, -3.0f, -10.49f, -2.87f, -15.74f, -1.93f)
+ reflectiveCurveToRelative(-11.26f, 0.93f, -12.26f, 3.93f)
+ close()
+ }
+private val pathData8 =
+ PathData {
+ moveTo(148.19f, 93.77f)
+ curveToRelative(0.31f, -1.27f, -0.69f, -6.27f, -0.69f, -6.27f)
+ reflectiveCurveToRelative(-7.41f, -2.59f, -8.2f, -2.3f)
+ reflectiveCurveToRelative(1.86f, -0.8f, 2.0f, -1.75f)
+ reflectiveCurveToRelative(0.23f, -1.43f, 0.23f, -1.43f)
+ reflectiveCurveToRelative(3.12f, 0.0f, 5.53f, 0.25f)
+ reflectiveCurveToRelative(3.41f, 1.47f, 3.41f, 2.35f)
+ lineToRelative(0.64f, 2.58f)
+ lineToRelative(0.36f, 4.29f)
+ lineToRelative(-3.0f, 2.0f)
+ }
+private val pathData9 =
+ PathData {
+ moveTo(133.0f, 29.24f)
+ reflectiveCurveToRelative(-7.5f, 13.21f, -6.5f, 28.88f)
+ arcToRelative(245.78f, 245.78f, 0.0f, false, false, 3.0f, 26.43f)
+ reflectiveCurveToRelative(0.0f, 2.0f, 4.0f, 2.0f)
+ arcToRelative(14.0f, 14.0f, 0.0f, false, false, 7.0f, -2.0f)
+ arcToRelative(3.4f, 3.4f, 0.0f, false, false, 1.0f, -2.0f)
+ curveToRelative(0.0f, -1.0f, -11.0f, -18.6f, -8.0f, -48.94f)
+ curveTo(133.5f, 33.64f, 134.5f, 27.77f, 133.0f, 29.24f)
+ close()
+ }
+private val pathData10 =
+ PathData {
+ moveTo(130.5f, 46.5f)
+ arcToRelative(94.41f, 94.41f, 0.0f, false, false, 2.0f, 18.0f)
+ arcToRelative(145.29f, 145.29f, 0.0f, false, false, 6.0f, 19.0f)
+ lineToRelative(0.52f, 1.8f)
+ reflectiveCurveToRelative(2.48f, -0.8f, 2.48f, -2.8f)
+ curveToRelative(0.0f, 0.0f, -6.45f, -14.41f, -7.23f, -22.71f)
+ reflectiveCurveTo(132.5f, 39.5f, 133.5f, 33.5f)
+ curveToRelative(0.0f, 0.0f, -0.08f, -3.33f, 0.21f, -2.91f)
+ reflectiveCurveTo(130.0f, 38.0f, 130.5f, 46.5f)
+ close()
+ }
+private val pathData11 =
+ PathData {
+ moveTo(133.0f, 29.24f)
+ reflectiveCurveToRelative(-7.5f, 13.21f, -6.5f, 28.88f)
+ arcToRelative(245.78f, 245.78f, 0.0f, false, false, 3.0f, 26.43f)
+ reflectiveCurveToRelative(0.0f, 2.0f, 4.0f, 2.0f)
+ arcToRelative(14.0f, 14.0f, 0.0f, false, false, 7.0f, -2.0f)
+ arcToRelative(3.4f, 3.4f, 0.0f, false, false, 1.0f, -2.0f)
+ curveToRelative(0.0f, -1.0f, -11.0f, -18.6f, -8.0f, -48.94f)
+ curveTo(133.5f, 33.64f, 134.5f, 27.77f, 133.0f, 29.24f)
+ close()
+ moveTo(126.0f, 46.0f)
+ reflectiveCurveToRelative(-9.0f, 1.0f, -9.0f, 6.0f)
+ reflectiveCurveToRelative(10.0f, 5.0f, 13.0f, 5.0f)
+ reflectiveCurveToRelative(12.0f, -1.0f, 12.0f, -6.0f)
+ reflectiveCurveToRelative(-8.0f, -5.0f, -8.0f, -5.0f)
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Accessory3Button.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Accessory3Button.kt
new file mode 100644
index 000000000..0acec5f88
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Accessory3Button.kt
@@ -0,0 +1,150 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.LightRed
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Accessory3ButtonPreview() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ accessory3Button(SolidColor(Color.Blue), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun accessory3Button(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ builder.addPath(pathData1, fill = fgColor, stroke = Black, strokeLineWidth = 1.0f)
+ builder.addPath(pathData2, fill = Black, stroke = Black, fillAlpha = 0.2f, strokeLineWidth = 0.75f)
+ builder.addPath(pathData3, fill = Black, fillAlpha = 0.2f)
+ builder.addPath(pathData5, fill = LightRed, stroke = Black, strokeLineWidth = 1.0f)
+ builder.addPath(pathData6, fill = Black, fillAlpha = 0.1f)
+ builder.addPath(pathData9, fill = Black, fillAlpha = 0.4f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(136.5f, 83.5f)
+ curveToRelative(-3.39f, 0.31f, -11.0f, 2.0f, -13.0f, 4.0f)
+ arcToRelative(4.38f, 4.38f, 0.0f, false, false, -1.0f, 3.0f)
+ verticalLineToRelative(5.0f)
+ arcToRelative(18.26f, 18.26f, 0.0f, false, false, 13.0f, 3.0f)
+ curveToRelative(8.0f, -1.0f, 16.0f, -6.0f, 16.0f, -6.0f)
+ reflectiveCurveToRelative(0.0f, -6.0f, -1.0f, -7.0f)
+ reflectiveCurveToRelative(-1.0f, -2.0f, -5.0f, -2.0f)
+ reflectiveCurveTo(138.74f, 83.3f, 136.5f, 83.5f)
+ close()
+ }
+private val pathData2 =
+ PathData {
+ moveTo(125.7f, 86.16f)
+ reflectiveCurveToRelative(-2.2f, 1.34f, -1.2f, 3.34f)
+ reflectiveCurveToRelative(7.0f, 3.0f, 12.0f, 2.0f)
+ arcToRelative(53.37f, 53.37f, 0.0f, false, false, 11.0f, -4.0f)
+ reflectiveCurveToRelative(3.57f, -2.09f, 1.29f, -3.54f)
+ reflectiveCurveTo(131.89f, 82.83f, 125.7f, 86.16f)
+ close()
+ }
+private val pathData3 =
+ PathData {
+ moveTo(125.7f, 86.16f)
+ reflectiveCurveToRelative(-2.2f, 1.34f, -1.2f, 3.34f)
+ reflectiveCurveToRelative(7.0f, 3.0f, 12.0f, 2.0f)
+ arcTo(55.23f, 55.23f, 0.0f, false, false, 145.11f, 89.0f)
+ curveToRelative(-1.11f, -2.0f, -8.42f, -5.89f, -8.42f, -5.89f)
+ reflectiveCurveTo(129.47f, 84.13f, 125.7f, 86.16f)
+ close()
+ moveTo(144.5f, 88.5f)
+ curveToRelative(1.0f, 1.0f, 0.0f, 7.3f, 0.0f, 7.3f)
+ lineToRelative(7.0f, -3.3f)
+ reflectiveCurveToRelative(0.0f, -6.14f, -1.5f, -7.57f)
+ curveTo(148.0f, 88.0f, 147.0f, 88.0f, 144.5f, 88.5f)
+ close()
+ }
+private val pathData4 =
+ PathData {
+ moveTo(136.5f, 83.5f)
+ curveToRelative(-3.39f, 0.31f, -11.0f, 2.0f, -13.0f, 4.0f)
+ arcToRelative(4.38f, 4.38f, 0.0f, false, false, -1.0f, 3.0f)
+ verticalLineToRelative(5.0f)
+ arcToRelative(18.26f, 18.26f, 0.0f, false, false, 13.0f, 3.0f)
+ curveToRelative(8.0f, -1.0f, 16.0f, -6.0f, 16.0f, -6.0f)
+ reflectiveCurveToRelative(0.0f, -6.0f, -1.0f, -7.0f)
+ reflectiveCurveToRelative(-1.0f, -2.0f, -5.0f, -2.0f)
+ reflectiveCurveTo(138.74f, 83.3f, 136.5f, 83.5f)
+ close()
+ }
+private val pathData5 =
+ PathData {
+ moveTo(134.5f, 73.5f)
+ reflectiveCurveToRelative(-5.0f, 1.0f, -5.0f, 6.0f)
+ reflectiveCurveToRelative(1.0f, 7.0f, 1.0f, 7.0f)
+ arcToRelative(18.58f, 18.58f, 0.0f, false, false, 8.0f, 0.0f)
+ curveToRelative(4.0f, -1.0f, 5.0f, -3.0f, 5.0f, -3.0f)
+ reflectiveCurveTo(142.5f, 73.5f, 134.5f, 73.5f)
+ close()
+ }
+private val pathData6 =
+ PathData {
+ moveTo(139.5f, 75.5f)
+ reflectiveCurveToRelative(2.0f, 3.0f, 1.0f, 6.0f)
+ reflectiveCurveToRelative(-6.0f, 5.0f, -6.0f, 5.0f)
+ reflectiveCurveToRelative(8.0f, -1.0f, 9.0f, -3.0f)
+ reflectiveCurveTo(140.5f, 76.5f, 139.5f, 75.5f)
+ close()
+ }
+private val pathData7 =
+ PathData {
+ moveTo(134.5f, 73.5f)
+ reflectiveCurveToRelative(-5.0f, 1.0f, -5.0f, 6.0f)
+ reflectiveCurveToRelative(1.0f, 7.0f, 1.0f, 7.0f)
+ arcToRelative(18.58f, 18.58f, 0.0f, false, false, 8.0f, 0.0f)
+ curveToRelative(4.0f, -1.0f, 5.0f, -3.0f, 5.0f, -3.0f)
+ reflectiveCurveTo(142.5f, 73.5f, 134.5f, 73.5f)
+ close()
+ }
+private val pathData9 =
+ PathData {
+ moveTo(133.5f, 75.5f)
+ arcToRelative(1.0f, 1.0f, 0.0f, false, true, 1.0f, 1.0f)
+ curveToRelative(0.0f, 1.0f, 0.0f, 6.0f, -2.0f, 6.0f)
+ reflectiveCurveToRelative(-3.0f, 0.0f, -2.0f, -4.0f)
+ reflectiveCurveTo(133.5f, 75.5f, 133.5f, 75.5f)
+ close()
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Accessory4Satellite.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Accessory4Satellite.kt
new file mode 100644
index 000000000..57eb5b494
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Accessory4Satellite.kt
@@ -0,0 +1,141 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.LightRed
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Accessory4SatellitePreview() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ accessory4Satellite(SolidColor(Color.Blue), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun accessory4Satellite(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ builder.addPath(pathData1, fill = fgColor, stroke = Black, strokeLineWidth = 1.0f)
+ builder.addPath(pathData3, stroke = Black, strokeLineWidth = 0.75f)
+ builder.addPath(pathData4, fill = Black, fillAlpha = 0.4f)
+ builder.addPath(pathData6, fill = LightRed, stroke = Black, strokeLineWidth = 0.75f)
+ builder.addPath(pathData9, fill = Black, fillAlpha = 0.4f)
+ builder.addPath(pathData7, fill = Black, fillAlpha = 0.2f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(139.5f, 51.5f)
+ reflectiveCurveToRelative(-24.0f, -2.0f, -32.0f, 33.0f)
+ curveToRelative(0.0f, 0.0f, -6.0f, 25.0f, 20.0f, 25.0f)
+ reflectiveCurveToRelative(32.0f, -17.0f, 34.0f, -32.0f)
+ reflectiveCurveTo(149.5f, 51.5f, 139.5f, 51.5f)
+ close()
+ }
+private val pathData2 =
+ PathData {
+ moveTo(139.5f, 51.5f)
+ curveToRelative(-15.88f, 0.08f, -26.77f, 10.62f, -32.0f, 33.0f)
+ curveToRelative(0.0f, 0.0f, -5.0f, 26.0f, 20.0f, 25.0f)
+ reflectiveCurveToRelative(34.0f, -18.0f, 34.0f, -32.0f)
+ curveTo(161.5f, 60.5f, 149.5f, 51.5f, 139.5f, 51.5f)
+ close()
+ }
+private val pathData3 =
+ PathData {
+ moveTo(143.5f, 53.5f)
+ reflectiveCurveToRelative(14.0f, 7.0f, 10.0f, 29.0f)
+ reflectiveCurveToRelative(-26.0f, 25.0f, -33.0f, 24.0f)
+ reflectiveCurveToRelative(-18.0f, -7.0f, -10.34f, -30.84f)
+ curveTo(114.5f, 59.5f, 130.5f, 47.5f, 143.5f, 53.5f)
+ close()
+ moveTo(130.09f, 76.5f)
+ lineToRelative(4.46f, 2.0f)
+ reflectiveCurveToRelative(0.89f, 2.0f, 0.0f, 3.0f)
+ arcToRelative(4.07f, 4.07f, 0.0f, false, true, -2.67f, 1.0f)
+ lineTo(129.0f, 80.79f)
+ arcTo(5.22f, 5.22f, 0.0f, false, false, 130.09f, 76.5f)
+ close()
+ }
+private val pathData4 =
+ PathData {
+ moveTo(121.5f, 63.5f)
+ curveToRelative(-3.0f, 1.87f, -8.0f, 6.0f, -9.0f, 11.0f)
+ reflectiveCurveToRelative(-1.0f, 14.0f, 0.0f, 16.0f)
+ reflectiveCurveToRelative(4.0f, 1.0f, 4.0f, -2.0f)
+ reflectiveCurveToRelative(0.0f, -17.0f, 5.0f, -21.0f)
+ reflectiveCurveTo(123.4f, 62.32f, 121.5f, 63.5f)
+ close()
+ moveTo(128.5f, 57.5f)
+ reflectiveCurveToRelative(-6.0f, 4.0f, -3.0f, 5.0f)
+ reflectiveCurveToRelative(6.0f, -3.0f, 6.0f, -3.0f)
+ reflectiveCurveTo(133.5f, 56.5f, 128.5f, 57.5f)
+ close()
+ }
+private val pathData6 =
+ PathData {
+ moveTo(125.5f, 71.5f)
+ reflectiveCurveToRelative(-7.0f, -2.0f, -10.0f, 1.0f)
+ curveToRelative(-1.88f, 2.07f, 0.0f, 8.0f, 5.0f, 10.0f)
+ reflectiveCurveToRelative(8.0f, -1.0f, 9.0f, -4.0f)
+ reflectiveCurveTo(127.5f, 71.5f, 125.5f, 71.5f)
+ close()
+ }
+private val pathData7 =
+ PathData {
+ moveTo(131.0f, 79.0f)
+ lineToRelative(4.0f, 2.0f)
+ lineToRelative(-0.38f, -2.33f)
+ lineToRelative(-4.24f, -2.04f)
+ lineToRelative(-0.32f, 1.97f)
+ lineToRelative(0.94f, 0.4f)
+ close()
+ moveTo(123.5f, 71.5f)
+ reflectiveCurveToRelative(5.0f, 2.0f, 4.0f, 6.0f)
+ reflectiveCurveToRelative(-6.49f, 4.82f, -8.25f, 4.41f)
+ reflectiveCurveToRelative(7.54f, 3.33f, 9.89f, -2.54f)
+ reflectiveCurveTo(127.0f, 72.0f, 123.5f, 71.5f)
+ close()
+ }
+private val pathData9 =
+ PathData {
+ moveTo(117.5f, 75.5f)
+ arcToRelative(2.5f, 2.0f, 0.0f, true, false, 5.0f, 0.0f)
+ arcToRelative(2.5f, 2.0f, 0.0f, true, false, -5.0f, 0.0f)
+ close()
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Accessory5Mustache.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Accessory5Mustache.kt
new file mode 100644
index 000000000..e3b17a292
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Accessory5Mustache.kt
@@ -0,0 +1,85 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Accessory5MustachePreview() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ accessory5Mustache(SolidColor(Color.Yellow), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun accessory5Mustache(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ builder.addPath(pathData1, fill = fgColor)
+ builder.addPath(pathData2, fill = Black, stroke = Black, fillAlpha = 0.4f, strokeLineWidth = 1.0f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(125.5f, 157.5f)
+ reflectiveCurveToRelative(8.0f, -4.0f, 15.0f, -3.0f)
+ reflectiveCurveToRelative(20.0f, 8.0f, 26.0f, 5.0f)
+ lineToRelative(8.0f, -4.0f)
+ reflectiveCurveToRelative(-3.0f, 13.0f, -14.0f, 14.0f)
+ reflectiveCurveToRelative(-29.0f, -3.0f, -35.0f, -2.0f)
+ reflectiveCurveToRelative(-25.0f, 7.0f, -30.0f, 6.0f)
+ reflectiveCurveToRelative(-10.0f, -1.0f, -12.0f, -11.0f)
+ curveToRelative(0.0f, 0.0f, -1.0f, -3.0f, 3.0f, 0.0f)
+ reflectiveCurveToRelative(11.0f, 4.0f, 18.0f, -1.0f)
+ reflectiveCurveTo(119.5f, 153.5f, 125.5f, 157.5f)
+ close()
+ }
+private val pathData2 =
+ PathData {
+ moveTo(125.5f, 157.5f)
+ reflectiveCurveToRelative(8.0f, -4.0f, 15.0f, -3.0f)
+ reflectiveCurveToRelative(20.0f, 8.0f, 26.0f, 5.0f)
+ lineToRelative(8.0f, -4.0f)
+ reflectiveCurveToRelative(-3.0f, 13.0f, -14.0f, 14.0f)
+ reflectiveCurveToRelative(-29.0f, -3.0f, -35.0f, -2.0f)
+ reflectiveCurveToRelative(-25.0f, 7.0f, -30.0f, 6.0f)
+ reflectiveCurveToRelative(-10.0f, -1.0f, -12.0f, -11.0f)
+ curveToRelative(0.0f, 0.0f, -1.0f, -3.0f, 3.0f, 0.0f)
+ reflectiveCurveToRelative(11.0f, 4.0f, 18.0f, -1.0f)
+ reflectiveCurveTo(119.5f, 153.5f, 125.5f, 157.5f)
+ close()
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Accessory6Hat.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Accessory6Hat.kt
new file mode 100644
index 000000000..859686158
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Accessory6Hat.kt
@@ -0,0 +1,139 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.LightRed
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Accessory6Hat() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ accessory6Hat(SolidColor(Color.Yellow), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun accessory6Hat(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ builder.addPath(pathData1, fill = fgColor, stroke = Black, strokeLineWidth = 1.0f)
+ builder.addPath(pathData2, fill = Black, fillAlpha = 0.2f)
+ builder.addPath(pathData6, fill = LightRed, stroke = Black, strokeLineWidth = 0.75f)
+ builder.addPath(pathData9, stroke = Black, strokeLineWidth = 1.0f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(131.0f, 59.0f)
+ reflectiveCurveToRelative(-13.0f, 1.0f, -14.0f, 6.0f)
+ arcToRelative(2.62f, 2.62f, 0.0f, false, false, 0.5f, 2.5f)
+ curveToRelative(1.0f, 1.0f, 3.0f, 5.0f, 4.0f, 8.0f)
+ reflectiveCurveToRelative(2.0f, 5.0f, 0.0f, 5.0f)
+ reflectiveCurveToRelative(-8.0f, 2.0f, -10.0f, 4.0f)
+ reflectiveCurveToRelative(-1.0f, 5.0f, -1.0f, 5.0f)
+ lineToRelative(1.0f, 9.0f)
+ arcToRelative(33.15f, 33.15f, 0.0f, false, false, 18.0f, 5.0f)
+ curveToRelative(16.5f, 0.5f, 34.0f, -9.0f, 35.0f, -10.0f)
+ reflectiveCurveToRelative(-1.0f, -11.0f, -1.0f, -11.0f)
+ curveToRelative(0.16f, -0.17f, -2.84f, -5.17f, -4.0f, -5.0f)
+ curveToRelative(-1.0f, 0.14f, -12.0f, 0.0f, -12.0f, 0.0f)
+ reflectiveCurveToRelative(0.0f, -15.0f, -1.0f, -16.0f)
+ reflectiveCurveTo(141.5f, 58.5f, 131.0f, 59.0f)
+ close()
+ }
+private val pathData2 =
+ PathData {
+ moveTo(151.5f, 88.5f)
+ reflectiveCurveToRelative(1.14f, 9.54f, 0.57f, 10.77f)
+ curveToRelative(0.0f, 0.0f, 12.43f, -4.77f, 12.43f, -5.77f)
+ reflectiveCurveToRelative(0.0f, -9.0f, -1.0f, -11.0f)
+ arcToRelative(27.36f, 27.36f, 0.0f, false, false, -4.0f, -5.0f)
+ reflectiveCurveToRelative(1.59f, 1.44f, -0.21f, 3.72f)
+ reflectiveCurveToRelative(-5.36f, 6.31f, -8.08f, 6.3f)
+ close()
+ moveTo(121.5f, 80.5f)
+ reflectiveCurveToRelative(-7.3f, 1.22f, -8.65f, 3.11f)
+ reflectiveCurveToRelative(0.21f, 5.68f, 3.93f, 6.29f)
+ reflectiveCurveToRelative(12.31f, 2.13f, 27.0f, -0.63f)
+ lineToRelative(7.42f, -1.75f)
+ lineToRelative(-10.71f, -4.0f)
+ arcTo(38.39f, 38.39f, 0.0f, false, false, 121.5f, 80.5f)
+ close()
+ moveTo(137.0f, 67.0f)
+ lineToRelative(3.87f, 16.18f)
+ reflectiveCurveTo(147.0f, 80.0f, 147.0f, 77.0f)
+ reflectiveCurveToRelative(0.0f, -13.73f, 0.0f, -13.73f)
+ reflectiveCurveTo(145.09f, 67.0f, 137.0f, 67.0f)
+ close()
+ moveTo(136.18f, 59.0f)
+ lineToRelative(0.82f, 8.0f)
+ reflectiveCurveToRelative(-18.0f, 2.0f, -20.0f, -2.0f)
+ reflectiveCurveTo(130.36f, 58.0f, 136.18f, 59.0f)
+ close()
+ }
+private val pathData6 =
+ PathData {
+ moveTo(121.5f, 75.5f)
+ reflectiveCurveToRelative(0.0f, 2.0f, 6.0f, 3.0f)
+ reflectiveCurveToRelative(13.0f, -2.0f, 16.0f, -4.0f)
+ reflectiveCurveToRelative(3.33f, -3.41f, 3.33f, -3.41f)
+ lineToRelative(0.67f, 6.41f)
+ arcToRelative(10.67f, 10.67f, 0.0f, false, true, -8.0f, 6.0f)
+ curveToRelative(-13.0f, 3.0f, -16.91f, -3.58f, -16.91f, -3.58f)
+ close()
+ }
+private val pathData9 =
+ PathData {
+ moveTo(132.5f, 67.5f)
+ reflectiveCurveToRelative(15.0f, -1.0f, 14.0f, -5.0f)
+ reflectiveCurveToRelative(-14.0f, -3.56f, -14.0f, -3.56f)
+ reflectiveCurveTo(118.0f, 60.0f, 117.26f, 64.25f)
+ reflectiveCurveTo(132.5f, 67.5f, 132.5f, 67.5f)
+ close()
+
+ moveTo(113.16f, 83.3f)
+ reflectiveCurveToRelative(-6.66f, 9.2f, 23.18f, 7.0f)
+ curveToRelative(25.17f, -1.75f, 23.8f, -12.39f, 23.8f, -12.39f)
+ lineToRelative(3.36f, 4.64f)
+ reflectiveCurveToRelative(2.0f, 10.0f, 1.0f, 11.0f)
+ reflectiveCurveToRelative(-18.0f, 10.0f, -33.68f, 10.0f)
+ arcToRelative(45.47f, 45.47f, 0.0f, false, true, -16.46f, -3.35f)
+ arcToRelative(7.75f, 7.75f, 0.0f, false, true, -2.86f, -1.61f)
+ lineToRelative(-1.2f, -10.0f)
+ arcTo(5.34f, 5.34f, 0.0f, false, true, 113.16f, 83.3f)
+ close()
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Accessory7Antenna.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Accessory7Antenna.kt
new file mode 100644
index 000000000..43de23742
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Accessory7Antenna.kt
@@ -0,0 +1,263 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Accessory7Antenna() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ accessory7Antenna(SolidColor(Color.Blue), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun accessory7Antenna(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ // Blye support
+ builder.addPath(pathData1, fill = fgColor)
+
+ // Blue Countour
+ builder.addPath(pathData8, stroke = Black, strokeLineWidth = 1.0f)
+
+ // Column Contour
+ builder.addPath(pathData11, fill = Black, stroke = Black, fillAlpha = 0.2f, strokeLineWidth = 1.0f)
+
+ // Stickts
+ builder.addPath(pathData14, fill = Black)
+
+ // Curved Stick
+ builder.addPath(pathData23, stroke = Black, strokeLineWidth = 1.5f)
+
+ // Shades
+ builder.addPath(pathData22, fill = Black, fillAlpha = 0.2f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(128.5f, 86.5f)
+ arcToRelative(3.49f, 3.49f, 0.0f, false, false, -1.0f, 2.0f)
+ verticalLineToRelative(3.0f)
+ reflectiveCurveToRelative(3.0f, 3.0f, 9.0f, 3.0f)
+ reflectiveCurveToRelative(12.0f, -4.0f, 12.0f, -4.0f)
+ verticalLineToRelative(-5.0f)
+ reflectiveCurveToRelative(-1.0f, -1.0f, -6.0f, -1.0f)
+ reflectiveCurveTo(131.5f, 84.5f, 128.5f, 86.5f)
+ close()
+ moveTo(173.5f, 21.5f)
+ lineToRelative(-35.0f, 17.0f)
+ reflectiveCurveToRelative(-0.57f, 2.41f, 0.22f, 3.71f)
+ lineToRelative(0.78f, 1.29f)
+ lineToRelative(37.0f, -18.0f)
+ reflectiveCurveTo(178.5f, 20.5f, 173.5f, 21.5f)
+ close()
+ moveTo(96.5f, 58.5f)
+ reflectiveCurveToRelative(-2.0f, 2.0f, -1.0f, 3.0f)
+ reflectiveCurveToRelative(3.0f, 0.0f, 3.0f, 0.0f)
+ lineToRelative(33.66f, -15.9f)
+ arcToRelative(6.44f, 6.44f, 0.0f, false, true, -0.66f, -3.1f)
+ close()
+ moveTo(134.5f, 47.5f)
+ lineToRelative(-1.0f, 37.0f)
+ arcToRelative(4.33f, 4.33f, 0.0f, false, false, 4.0f, 2.0f)
+ arcToRelative(7.65f, 7.65f, 0.0f, false, false, 5.0f, -2.0f)
+ lineToRelative(-2.0f, -40.0f)
+ reflectiveCurveTo(135.5f, 44.5f, 134.5f, 47.5f)
+ close()
+ moveTo(136.5f, 38.5f)
+ lineToRelative(-4.0f, 2.0f)
+ arcToRelative(3.76f, 3.76f, 0.0f, false, false, -0.81f, 1.55f)
+ arcToRelative(5.34f, 5.34f, 0.0f, false, false, -0.19f, 1.45f)
+ curveToRelative(0.0f, 2.0f, 2.0f, 4.0f, 3.0f, 4.0f)
+ curveToRelative(0.0f, 0.0f, -0.17f, -0.54f, 1.42f, -1.77f)
+ arcToRelative(8.26f, 8.26f, 0.0f, false, true, 4.32f, -1.22f)
+ horizontalLineToRelative(0.26f)
+ reflectiveCurveToRelative(-2.0f, -2.0f, -2.0f, -3.0f)
+ verticalLineToRelative(-3.0f)
+ close()
+ }
+private val pathData8 =
+ PathData {
+ moveTo(134.5f, 47.5f)
+ lineToRelative(-1.0f, 37.0f)
+ arcToRelative(4.33f, 4.33f, 0.0f, false, false, 4.0f, 2.0f)
+ arcToRelative(7.65f, 7.65f, 0.0f, false, false, 5.0f, -2.0f)
+ lineToRelative(-2.0f, -40.0f)
+ reflectiveCurveTo(135.5f, 44.5f, 134.5f, 47.5f)
+ close()
+ moveTo(128.5f, 86.5f)
+ arcToRelative(3.49f, 3.49f, 0.0f, false, false, -1.0f, 2.0f)
+ verticalLineToRelative(3.0f)
+ reflectiveCurveToRelative(3.0f, 3.0f, 9.0f, 3.0f)
+ reflectiveCurveToRelative(12.0f, -4.0f, 12.0f, -4.0f)
+ verticalLineToRelative(-5.0f)
+ reflectiveCurveToRelative(-0.8f, -1.0f, -5.8f, -1.0f)
+ arcToRelative(7.15f, 7.15f, 0.0f, false, true, -4.57f, 2.0f)
+ curveToRelative(-1.63f, 0.0f, -4.17f, 0.0f, -4.63f, -1.72f)
+ arcTo(10.71f, 10.71f, 0.0f, false, false, 128.5f, 86.5f)
+ close()
+ moveTo(136.5f, 38.5f)
+ lineToRelative(-4.0f, 2.0f)
+ arcToRelative(3.76f, 3.76f, 0.0f, false, false, -0.81f, 1.55f)
+ arcToRelative(5.34f, 5.34f, 0.0f, false, false, -0.19f, 1.45f)
+ curveToRelative(0.0f, 2.0f, 2.0f, 4.0f, 3.0f, 4.0f)
+ curveToRelative(0.0f, 0.0f, -0.17f, -0.54f, 1.42f, -1.77f)
+ arcToRelative(8.26f, 8.26f, 0.0f, false, true, 4.32f, -1.22f)
+ horizontalLineToRelative(0.26f)
+ reflectiveCurveToRelative(-2.0f, -2.0f, -2.0f, -3.0f)
+ verticalLineToRelative(-3.0f)
+ close()
+ }
+private val pathData11 =
+ PathData {
+ moveTo(128.5f, 87.5f)
+ reflectiveCurveToRelative(0.0f, 2.0f, 6.0f, 2.0f)
+ reflectiveCurveToRelative(11.0f, -1.0f, 13.0f, -3.0f)
+ curveToRelative(0.48f, -0.55f, 0.5f, -1.75f, -2.25f, -1.87f)
+ curveToRelative(-1.0f, 0.0f, -3.15f, 0.0f, -3.15f, 0.0f)
+ arcToRelative(6.77f, 6.77f, 0.0f, false, true, -4.1f, 1.8f)
+ curveToRelative(-3.5f, 0.1f, -4.31f, -1.6f, -4.31f, -1.6f)
+ reflectiveCurveTo(128.5f, 85.5f, 128.5f, 87.5f)
+ close()
+ moveTo(96.5f, 58.5f)
+ reflectiveCurveToRelative(-2.0f, 2.0f, -1.0f, 3.0f)
+ reflectiveCurveToRelative(3.0f, 0.0f, 3.0f, 0.0f)
+ lineToRelative(33.8f, -15.6f)
+ arcToRelative(7.45f, 7.45f, 0.0f, false, true, -0.8f, -3.4f)
+ close()
+ moveTo(173.5f, 21.5f)
+ lineToRelative(-35.0f, 17.0f)
+ reflectiveCurveToRelative(-0.57f, 2.41f, 0.22f, 3.71f)
+ lineToRelative(0.78f, 1.29f)
+ lineToRelative(37.0f, -18.0f)
+ curveTo(177.52f, 25.52f, 179.49f, 20.53f, 173.5f, 21.5f)
+ close()
+ moveTo(175.5f, 23.5f)
+ moveToRelative(-2.0f, 0.0f)
+ arcToRelative(2.0f, 2.0f, 0.0f, true, true, 4.0f, 0.0f)
+ arcToRelative(2.0f, 2.0f, 0.0f, true, true, -4.0f, 0.0f)
+ }
+private val pathData14 =
+ PathData {
+ moveTo(137.5f, 5.5f)
+ reflectiveCurveToRelative(-2.0f, 0.0f, 1.0f, 2.0f)
+ reflectiveCurveToRelative(32.0f, 15.0f, 32.0f, 15.0f)
+ lineToRelative(2.0f, -1.0f)
+ lineToRelative(-33.0f, -15.0f)
+ close()
+ moveTo(56.72f, 44.0f)
+ arcToRelative(1.7f, 1.7f, 0.0f, false, false, 1.2f, 1.19f)
+ lineTo(96.29f, 58.83f)
+ lineToRelative(1.89f, -1.2f)
+ lineTo(58.81f, 44.1f)
+ reflectiveCurveTo(56.44f, 43.0f, 56.72f, 44.0f)
+ close()
+ moveTo(114.5f, 17.5f)
+ reflectiveCurveToRelative(-2.0f, 0.0f, 1.0f, 2.0f)
+ reflectiveCurveToRelative(32.0f, 15.0f, 32.0f, 15.0f)
+ lineToRelative(2.0f, -1.0f)
+ lineToRelative(-33.0f, -15.0f)
+ close()
+ moveTo(102.0f, 26.53f)
+ reflectiveCurveToRelative(-2.0f, 0.12f, 1.12f, 1.94f)
+ reflectiveCurveTo(133.0f, 40.2f, 133.0f, 40.2f)
+ lineToRelative(1.91f, -0.77f)
+ lineToRelative(-30.83f, -12.0f)
+ close()
+ moveTo(177.5f, 24.19f)
+ lineTo(212.0f, 41.0f)
+ curveToRelative(1.0f, 1.0f, 0.39f, 1.37f, -2.0f, 1.0f)
+ lineTo(176.5f, 25.5f)
+ reflectiveCurveTo(177.0f, 25.38f, 177.5f, 24.19f)
+ close()
+ moveTo(154.91f, 35.41f)
+ lineToRelative(35.6f, 14.34f)
+ reflectiveCurveTo(192.0f, 51.0f, 188.58f, 50.88f)
+ lineTo(154.0f, 36.79f)
+ close()
+ moveTo(102.89f, 59.02f)
+ lineToRelative(31.45f, 9.67f)
+ lineToRelative(-0.69f, 1.29f)
+ lineToRelative(-32.65f, -10.0f)
+ lineToRelative(1.89f, -0.96f)
+ close()
+ moveTo(142.0f, 42.54f)
+ lineToRelative(35.55f, 13.0f)
+ curveToRelative(2.4f, 0.9f, 0.47f, 2.47f, -2.0f, 1.19f)
+ lineTo(140.2f, 43.79f)
+ close()
+ }
+private val pathData22 =
+ PathData {
+ moveTo(136.0f, 38.75f)
+ arcToRelative(5.37f, 5.37f, 0.0f, false, false, -0.5f, 2.75f)
+ curveToRelative(0.0f, 2.0f, 2.22f, 3.37f, 2.22f, 3.37f)
+ lineToRelative(1.8f, 40.84f)
+ lineTo(144.0f, 88.34f)
+ verticalLineToRelative(4.0f)
+ lineToRelative(4.46f, -1.89f)
+ verticalLineToRelative(-5.0f)
+ arcToRelative(35.36f, 35.36f, 0.0f, false, false, -6.0f, -1.0f)
+ lineToRelative(-2.0f, -40.0f)
+ arcToRelative(3.7f, 3.7f, 0.0f, false, true, -2.0f, -3.0f)
+ verticalLineToRelative(-3.0f)
+ close()
+ }
+private val pathData23 =
+ PathData {
+ moveTo(119.5f, 47.5f)
+ lineToRelative(-32.0f, -12.0f)
+ reflectiveCurveToRelative(-3.0f, -1.0f, -4.0f, 1.0f)
+ reflectiveCurveToRelative(0.0f, 3.0f, 2.0f, 4.0f)
+ reflectiveCurveToRelative(27.0f, 10.0f, 27.0f, 10.0f)
+ moveTo(116.05f, 49.09f)
+ lineTo(83.95f, 37.51f)
+ moveTo(125.5f, 49.2f)
+ lineTo(134.36f, 52.57f)
+ moveTo(117.9f, 52.66f)
+ lineTo(134.0f, 59.0f)
+ moveTo(121.42f, 50.93f)
+ lineTo(134.27f, 55.83f)
+ moveTo(141.0f, 54.57f)
+ lineTo(158.0f, 62.0f)
+ reflectiveCurveToRelative(4.0f, 2.0f, 3.0f, 4.0f)
+ reflectiveCurveToRelative(-5.0f, 1.0f, -6.0f, 1.0f)
+ reflectiveCurveToRelative(-13.65f, -5.5f, -13.65f, -5.5f)
+ moveTo(141.18f, 58.12f)
+ lineTo(160.5f, 66.5f)
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Accessory8Brush.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Accessory8Brush.kt
new file mode 100644
index 000000000..518583370
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Accessory8Brush.kt
@@ -0,0 +1,176 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Accessory8Brush() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ accessory8Brush(SolidColor(Color.Blue), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun accessory8Brush(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ builder.addPath(pathData1, fill = fgColor)
+ builder.addPath(pathData2, stroke = Black, strokeLineWidth = 1.0f)
+ builder.addPath(pathData3, fill = Black, stroke = Black, fillAlpha = 0.2f, strokeLineWidth = 1.0f)
+ builder.addPath(pathData4, fill = Black, fillAlpha = 0.2f)
+ builder.addPath(pathData5, fill = SolidColor(Color(0xFF716558)), stroke = Black, strokeLineWidth = 1.0f)
+ builder.addPath(pathData6, fill = SolidColor(Color(0xFF9a8479)), stroke = Black, strokeLineWidth = 1.0f)
+ builder.addPath(pathData7, fill = SolidColor(Color(0xFF716558)), stroke = Black, strokeLineWidth = 1.0f)
+ builder.addPath(pathData8, fill = SolidColor(Color(0xFFc1b49a)), stroke = Black, strokeLineWidth = 1.0f)
+ builder.addPath(pathData9, fill = SolidColor(Color(0xFFc1b49a)), stroke = Black, strokeLineWidth = 1.0f)
+ builder.addPath(pathData10, fill = Black, fillAlpha = 0.2f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(135.0f, 83.0f)
+ reflectiveCurveToRelative(-13.0f, 2.0f, -13.0f, 5.0f)
+ arcToRelative(54.33f, 54.33f, 0.0f, false, false, 0.5f, 6.5f)
+ reflectiveCurveToRelative(4.0f, 4.0f, 13.0f, 3.0f)
+ arcToRelative(37.83f, 37.83f, 0.0f, false, false, 16.0f, -6.0f)
+ verticalLineToRelative(-5.0f)
+ lineToRelative(-3.0f, -4.0f)
+ reflectiveCurveTo(143.5f, 81.5f, 135.0f, 83.0f)
+ close()
+ }
+private val pathData2 =
+ PathData {
+ moveTo(135.0f, 83.0f)
+ reflectiveCurveToRelative(-13.0f, 2.0f, -13.0f, 5.0f)
+ arcToRelative(54.33f, 54.33f, 0.0f, false, false, 0.5f, 6.5f)
+ reflectiveCurveToRelative(4.0f, 4.0f, 13.0f, 3.0f)
+ arcToRelative(37.83f, 37.83f, 0.0f, false, false, 16.0f, -6.0f)
+ verticalLineToRelative(-5.0f)
+ lineToRelative(-3.0f, -4.0f)
+ reflectiveCurveTo(143.5f, 81.5f, 135.0f, 83.0f)
+ close()
+ }
+private val pathData3 =
+ PathData {
+ moveTo(123.5f, 88.5f)
+ reflectiveCurveToRelative(2.0f, 3.0f, 10.0f, 2.0f)
+ reflectiveCurveToRelative(14.0f, -3.0f, 15.0f, -5.0f)
+ reflectiveCurveToRelative(1.19f, -2.37f, -1.41f, -3.18f)
+ reflectiveCurveToRelative(-13.22f, 0.86f, -16.41f, 1.52f)
+ reflectiveCurveTo(122.5f, 85.5f, 123.5f, 88.5f)
+ close()
+ }
+private val pathData4 =
+ PathData {
+ moveTo(123.5f, 88.5f)
+ reflectiveCurveToRelative(2.0f, 3.0f, 10.0f, 2.0f)
+ arcToRelative(47.41f, 47.41f, 0.0f, false, false, 11.86f, -2.78f)
+ curveToRelative(-0.38f, 0.16f, -4.11f, -2.4f, -4.11f, -2.4f)
+ reflectiveCurveToRelative(1.43f, -3.14f, 2.0f, -3.18f)
+ arcToRelative(105.65f, 105.65f, 0.0f, false, false, -12.56f, 1.69f)
+ curveTo(127.5f, 84.5f, 122.5f, 85.5f, 123.5f, 88.5f)
+ close()
+ }
+private val pathData5 =
+ PathData {
+ moveTo(139.5f, 66.5f)
+ reflectiveCurveToRelative(-4.0f, -16.0f, 3.0f, -27.0f)
+ curveToRelative(0.0f, 0.0f, -2.0f, -7.0f, -6.0f, -3.0f)
+ curveToRelative(0.0f, 0.0f, -4.0f, 3.0f, -5.0f, 15.0f)
+ arcToRelative(66.0f, 66.0f, 0.0f, false, false, 2.0f, 22.0f)
+ reflectiveCurveTo(138.5f, 73.5f, 139.5f, 66.5f)
+ close()
+ }
+private val pathData6 =
+ PathData {
+ moveTo(119.5f, 36.5f)
+ reflectiveCurveToRelative(1.0f, 13.0f, 3.0f, 19.0f)
+ reflectiveCurveToRelative(4.0f, 11.0f, 6.0f, 16.0f)
+ reflectiveCurveToRelative(5.0f, 7.0f, 6.0f, 5.0f)
+ reflectiveCurveToRelative(0.0f, -3.0f, -2.0f, -10.0f)
+ reflectiveCurveToRelative(-5.0f, -18.0f, -5.0f, -25.0f)
+ verticalLineToRelative(-7.0f)
+ arcToRelative(10.34f, 10.34f, 0.0f, false, false, -4.0f, -1.0f)
+ curveTo(121.5f, 33.5f, 119.5f, 34.5f, 119.5f, 36.5f)
+ close()
+ }
+private val pathData7 =
+ PathData {
+ moveTo(110.5f, 50.5f)
+ reflectiveCurveToRelative(8.0f, 8.0f, 10.0f, 13.0f)
+ reflectiveCurveToRelative(5.0f, 13.0f, 6.0f, 10.0f)
+ reflectiveCurveToRelative(-3.0f, -18.0f, -6.0f, -22.0f)
+ arcToRelative(61.22f, 61.22f, 0.0f, false, false, -5.0f, -6.0f)
+ reflectiveCurveTo(110.5f, 45.5f, 110.5f, 50.5f)
+ close()
+ }
+private val pathData8 =
+ PathData {
+ moveTo(136.5f, 86.5f)
+ reflectiveCurveToRelative(-5.0f, -19.0f, -19.0f, -28.0f)
+ reflectiveCurveToRelative(-20.0f, -7.0f, -20.0f, -7.0f)
+ reflectiveCurveToRelative(-4.0f, 3.0f, 1.0f, 6.0f)
+ reflectiveCurveToRelative(12.0f, 5.0f, 18.0f, 10.0f)
+ reflectiveCurveToRelative(12.0f, 14.0f, 12.0f, 16.0f)
+ reflectiveCurveTo(131.5f, 88.5f, 136.5f, 86.5f)
+ close()
+ }
+private val pathData9 =
+ PathData {
+ moveTo(134.5f, 73.5f)
+ reflectiveCurveToRelative(6.0f, -25.0f, 16.0f, -32.0f)
+ reflectiveCurveToRelative(9.0f, 2.0f, 9.0f, 2.0f)
+ verticalLineToRelative(4.0f)
+ reflectiveCurveToRelative(-4.0f, -2.0f, -8.0f, 5.0f)
+ reflectiveCurveToRelative(-9.0f, 19.0f, -9.0f, 23.0f)
+ verticalLineToRelative(8.0f)
+ reflectiveCurveToRelative(-4.0f, 5.0f, -6.0f, 3.0f)
+ curveToRelative(0.0f, 0.0f, -3.24f, -7.59f, -3.12f, -8.3f)
+ reflectiveCurveTo(134.5f, 73.5f, 134.5f, 73.5f)
+ close()
+ }
+private val pathData10 =
+ PathData {
+ moveTo(144.36f, 88.12f)
+ verticalLineToRelative(7.11f)
+ lineToRelative(7.14f, -3.73f)
+ lineToRelative(0.07f, -4.64f)
+ lineTo(150.0f, 84.0f)
+ arcTo(11.59f, 11.59f, 0.0f, false, true, 144.36f, 88.12f)
+ close()
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Accessory9Horn.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Accessory9Horn.kt
new file mode 100644
index 000000000..9b8bafce1
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Accessory9Horn.kt
@@ -0,0 +1,143 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.MediumGray
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Accessory9Horn() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ accessory9Horn(SolidColor(Color.Blue), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun accessory9Horn(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ builder.addPath(pathData1, fill = fgColor, stroke = Black, strokeLineWidth = 1.0f)
+ builder.addPath(pathData3, fill = Black, fillAlpha = 0.2f)
+ builder.addPath(pathData4, stroke = Black, strokeLineWidth = 1.0f)
+ builder.addPath(pathData5, fill = Black, stroke = Black, strokeLineWidth = 1.0f)
+ builder.addPath(pathData6, fill = MediumGray)
+ builder.addPath(pathData7, stroke = Black, strokeLineWidth = 1.0f)
+ builder.addPath(pathData8, fill = Black, fillAlpha = 0.4f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(122.5f, 88.5f)
+ verticalLineToRelative(6.0f)
+ reflectiveCurveToRelative(3.0f, 4.0f, 13.0f, 3.0f)
+ curveToRelative(12.5f, -0.5f, 16.0f, -5.0f, 16.0f, -5.0f)
+ verticalLineToRelative(-6.0f)
+ lineToRelative(-2.0f, -3.0f)
+ arcToRelative(63.26f, 63.26f, 0.0f, false, false, -15.0f, 0.0f)
+ curveTo(126.5f, 84.5f, 122.5f, 85.5f, 122.5f, 88.5f)
+ close()
+ }
+private val pathData2 =
+ PathData {
+ moveTo(122.5f, 88.5f)
+ verticalLineToRelative(6.0f)
+ reflectiveCurveToRelative(2.0f, 3.0f, 13.0f, 3.0f)
+ reflectiveCurveToRelative(16.0f, -5.0f, 16.0f, -5.0f)
+ verticalLineToRelative(-6.0f)
+ lineToRelative(-2.0f, -3.0f)
+ arcToRelative(63.26f, 63.26f, 0.0f, false, false, -15.0f, 0.0f)
+ curveTo(126.5f, 84.5f, 122.5f, 85.5f, 122.5f, 88.5f)
+ close()
+ }
+private val pathData3 =
+ PathData {
+ moveTo(142.5f, 89.5f)
+ curveToRelative(0.2f, -0.05f, 1.28f, -0.44f, 1.5f, -0.5f)
+ curveToRelative(-0.63f, -1.83f, -4.53f, -5.64f, -5.5f, -5.7f)
+ curveToRelative(-7.0f, -0.41f, -11.66f, 1.0f, -13.22f, 2.0f)
+ curveToRelative(-1.78f, 1.16f, -3.78f, 2.16f, 1.22f, 4.16f)
+ curveTo(129.5f, 90.5f, 138.5f, 90.5f, 142.5f, 89.5f)
+ close()
+ }
+private val pathData4 =
+ PathData {
+ moveTo(142.5f, 89.5f)
+ curveToRelative(4.0f, -1.0f, 10.83f, -4.83f, 3.92f, -5.92f)
+ reflectiveCurveToRelative(-19.36f, 0.59f, -21.14f, 1.75f)
+ reflectiveCurveToRelative(-3.78f, 2.16f, 1.22f, 4.16f)
+ curveTo(129.5f, 90.5f, 138.5f, 90.5f, 142.5f, 89.5f)
+ close()
+ }
+private val pathData5 =
+ PathData {
+ moveTo(130.5f, 52.5f)
+ lineTo(128.24f, 84.0f)
+ reflectiveCurveToRelative(1.26f, 3.47f, 7.26f, 2.47f)
+ reflectiveCurveToRelative(7.33f, -3.44f, 7.33f, -3.44f)
+ lineTo(132.5f, 54.5f)
+ reflectiveCurveTo(131.5f, 51.5f, 130.5f, 52.5f)
+ close()
+ }
+private val pathData6 =
+ PathData {
+ moveTo(131.5f, 55.5f)
+ lineToRelative(7.06f, 30.26f)
+ reflectiveCurveToRelative(3.94f, -0.26f, 3.94f, -2.26f)
+ reflectiveCurveToRelative(-10.0f, -29.0f, -10.0f, -29.0f)
+ reflectiveCurveTo(130.5f, 50.5f, 131.5f, 55.5f)
+ close()
+ }
+private val pathData7 =
+ PathData {
+ moveTo(130.5f, 52.5f)
+ lineTo(128.24f, 84.0f)
+ reflectiveCurveToRelative(1.26f, 3.47f, 7.26f, 2.47f)
+ reflectiveCurveToRelative(7.33f, -3.44f, 7.33f, -3.44f)
+ lineTo(132.5f, 54.5f)
+ reflectiveCurveTo(131.5f, 51.5f, 130.5f, 52.5f)
+ close()
+ }
+private val pathData8 =
+ PathData {
+ moveTo(144.09f, 88.72f)
+ verticalLineToRelative(8.0f)
+ lineToRelative(7.41f, -4.26f)
+ verticalLineToRelative(-6.0f)
+ lineToRelative(-2.0f, -3.0f)
+ curveTo(150.0f, 85.88f, 147.82f, 87.51f, 144.09f, 88.72f)
+ close()
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Body0Trooper.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Body0Trooper.kt
new file mode 100644
index 000000000..fbddfe950
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Body0Trooper.kt
@@ -0,0 +1,174 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.Gray
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Body0TropperPreview() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ body0Trooper(SolidColor(Color.Blue), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun body0Trooper(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ // body
+ builder.addPath(pathData1, fill = fgColor, stroke = Black, strokeLineWidth = 1.2f)
+
+ // body shades
+ builder.addPath(pathData4, fill = Black, fillAlpha = 0.4f)
+ builder.addPath(pathData6, fill = Black, stroke = Black, fillAlpha = 0.2f, strokeLineWidth = 1.0f)
+
+ // neck Circle
+ builder.addPath(pathData12, stroke = Black, strokeLineWidth = 1.0f)
+
+ // neck
+ builder.addPath(pathData13, fill = Gray, stroke = Black, strokeLineWidth = 1.0f)
+
+ // Joints
+ builder.addPath(pathData14, stroke = Black, strokeLineWidth = 1.0f)
+
+ // Joint shade
+ builder.addPath(pathData25, fill = Black, fillAlpha = 0.2f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(106.0f, 247.52f)
+ reflectiveCurveToRelative(-34.47f, 3.0f, -50.47f, 32.0f)
+ curveToRelative(0.0f, 0.0f, -5.0f, 9.0f, -6.0f, 23.0f)
+ horizontalLineToRelative(27.0f)
+ reflectiveCurveTo(77.43f, 272.54f, 106.0f, 247.52f)
+ close()
+ moveTo(226.5f, 236.5f)
+ reflectiveCurveToRelative(-6.0f, -10.0f, -26.0f, -12.0f)
+ reflectiveCurveToRelative(-56.0f, -2.0f, -81.0f, 13.0f)
+ reflectiveCurveToRelative(-43.0f, 44.0f, -43.0f, 65.0f)
+ horizontalLineToRelative(115.0f)
+ reflectiveCurveToRelative(3.0f, -31.0f, 22.0f, -53.0f)
+ curveToRelative(0.0f, 0.0f, 8.88f, -7.45f, 14.44f, -9.22f)
+ curveTo(227.94f, 240.28f, 228.5f, 239.5f, 226.5f, 236.5f)
+ close()
+ moveTo(286.5f, 302.5f)
+ reflectiveCurveToRelative(4.0f, -50.0f, -16.0f, -59.0f)
+ reflectiveCurveToRelative(-44.0f, -8.0f, -57.0f, 6.0f)
+ reflectiveCurveToRelative(-22.0f, 43.0f, -22.0f, 53.0f)
+ close()
+ }
+
+private val pathData4 =
+ PathData {
+ moveTo(91.18f, 264.0f)
+ reflectiveCurveToRelative(5.32f, 0.48f, 3.32f, 9.48f)
+ reflectiveCurveToRelative(-5.0f, 7.0f, -7.0f, 17.0f)
+ reflectiveCurveToRelative(-2.5f, 12.0f, -2.5f, 12.0f)
+ horizontalLineTo(76.5f)
+ reflectiveCurveTo(75.85f, 285.54f, 91.18f, 264.0f)
+ close()
+ moveTo(80.61f, 255.48f)
+ reflectiveCurveToRelative(2.89f, 2.0f, -6.11f, 12.0f)
+ arcToRelative(94.0f, 94.0f, 0.0f, false, false, -17.0f, 26.0f)
+ curveToRelative(-3.0f, 7.0f, -1.75f, 9.0f, -1.75f, 9.0f)
+ horizontalLineTo(49.5f)
+ reflectiveCurveTo(50.73f, 270.47f, 80.61f, 255.48f)
+ close()
+ }
+private val pathData6 =
+ PathData {
+ moveTo(268.5f, 247.5f)
+ reflectiveCurveToRelative(-8.0f, 8.0f, -11.0f, 26.0f)
+ reflectiveCurveToRelative(-2.25f, 29.0f, -2.25f, 29.0f)
+ horizontalLineTo(286.5f)
+ reflectiveCurveToRelative(3.84f, -41.79f, -12.58f, -56.9f)
+ curveTo(273.92f, 245.6f, 271.5f, 244.5f, 268.5f, 247.5f)
+ close()
+ moveTo(218.22f, 229.55f)
+ reflectiveCurveToRelative(-18.72f, 0.95f, -31.72f, 20.95f)
+ reflectiveCurveToRelative(-17.0f, 37.0f, -17.5f, 52.0f)
+ horizontalLineToRelative(22.5f)
+ curveToRelative(-1.42f, 0.12f, 8.08f, -36.84f, 16.0f, -45.5f)
+ curveToRelative(10.0f, -15.5f, 21.0f, -16.5f, 21.0f, -16.5f)
+ reflectiveCurveTo(228.93f, 235.6f, 218.22f, 229.55f)
+ close()
+ }
+private val pathData12 =
+ PathData {
+ moveTo(153.5f, 251.5f)
+ curveToRelative(7.6f, -0.12f, 26.0f, -2.0f, 27.0f, -14.0f)
+ reflectiveCurveToRelative(-27.0f, -8.0f, -27.0f, -8.0f)
+ reflectiveCurveToRelative(-22.0f, 1.0f, -22.0f, 11.0f)
+ reflectiveCurveTo(147.35f, 251.6f, 153.5f, 251.5f)
+ close()
+ }
+private val pathData13 =
+ PathData {
+ moveTo(138.5f, 166.5f)
+ reflectiveCurveToRelative(12.0f, 33.0f, 4.0f, 72.0f)
+ curveToRelative(0.0f, 0.0f, 1.0f, 6.0f, 12.0f, 5.0f)
+ reflectiveCurveToRelative(12.0f, -5.0f, 12.0f, -5.0f)
+ reflectiveCurveToRelative(6.0f, -37.0f, -10.0f, -75.0f)
+ curveTo(156.5f, 163.5f, 145.5f, 166.5f, 138.5f, 166.5f)
+ close()
+ }
+
+private val pathData14 =
+ PathData {
+ moveTo(161.0f, 176.0f)
+ arcToRelative(15.59f, 15.59f, 0.0f, false, true, -7.53f, 3.51f)
+ curveToRelative(-5.0f, 1.0f, -9.0f, 1.0f, -11.52f, 0.0f)
+ moveTo(163.66f, 185.38f)
+ curveToRelative(-1.18f, 2.51f, -2.36f, 7.71f, -20.0f, 5.42f)
+ moveTo(166.32f, 200.74f)
+ reflectiveCurveToRelative(-4.63f, 7.77f, -21.23f, 3.27f)
+ moveTo(167.42f, 213.41f)
+ reflectiveCurveToRelative(-3.73f, 9.13f, -22.33f, 4.11f)
+ moveTo(167.42f, 227.17f)
+ reflectiveCurveToRelative(-7.75f, 9.36f, -23.34f, 1.85f)
+ }
+private val pathData25 =
+ PathData {
+ moveTo(150.5f, 164.5f)
+ reflectiveCurveToRelative(10.5f, 29.5f, 11.0f, 45.0f)
+ arcToRelative(328.75f, 328.75f, 0.0f, false, true, -1.0f, 33.0f)
+ lineToRelative(6.0f, -3.0f)
+ curveToRelative(3.29f, -1.87f, 0.5f, -61.5f, -10.0f, -76.0f)
+ close()
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Body1Thin.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Body1Thin.kt
new file mode 100644
index 000000000..57d3019a4
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Body1Thin.kt
@@ -0,0 +1,204 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.Gray
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Body1ThinPreview() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ body1Thin(SolidColor(Color.Yellow), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun body1Thin(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ // Body
+ builder.addPath(pathData1, fill = fgColor, stroke = Black, strokeLineWidth = 1.0f)
+
+ // Body shade, must stay before grays
+ builder.addPath(pathData2, fill = Black, fillAlpha = 0.4f)
+ builder.addPath(pathData13, fill = Black, fillAlpha = 0.2f)
+
+ // Gray legs and neck
+ builder.addPath(pathData6, fill = Gray, stroke = Black, strokeLineWidth = 1.0f)
+
+ // Shades Legs and neck
+ builder.addPath(pathData15, fill = Black, fillAlpha = 0.2f)
+
+ // Joints
+ builder.addPath(pathData16, stroke = Black, strokeLineWidth = 1.0f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(160.5f, 246.5f)
+ reflectiveCurveToRelative(-14.0f, -3.0f, -27.0f, 13.0f)
+ reflectiveCurveToRelative(-22.0f, 45.0f, -22.0f, 45.0f)
+ horizontalLineToRelative(108.0f)
+ reflectiveCurveToRelative(-20.0f, -35.0f, -25.0f, -40.0f)
+ reflectiveCurveTo(176.5f, 247.5f, 160.5f, 246.5f)
+ close()
+ }
+private val pathData2 =
+ PathData {
+ moveTo(121.5f, 303.5f)
+ reflectiveCurveToRelative(5.0f, -24.0f, 10.0f, -33.0f)
+ reflectiveCurveToRelative(3.28f, -8.07f, 7.64f, -8.53f)
+ reflectiveCurveToRelative(15.13f, -1.22f, 23.75f, 2.66f)
+ reflectiveCurveToRelative(8.18f, 3.25f, 8.18f, 3.25f)
+ lineToRelative(13.12f, -12.15f)
+ reflectiveCurveToRelative(-12.68f, -9.66f, -26.18f, -9.44f)
+ reflectiveCurveToRelative(-23.5f, 12.22f, -26.5f, 15.22f)
+ reflectiveCurveToRelative(-14.17f, 23.45f, -19.09f, 40.22f)
+ close()
+ }
+private val pathData6 =
+ PathData {
+ moveTo(149.0f, 192.0f)
+ reflectiveCurveToRelative(1.0f, 62.0f, 2.0f, 64.0f)
+ arcToRelative(11.16f, 11.16f, 0.0f, false, false, 9.06f, 3.21f)
+ curveToRelative(5.44f, -0.71f, 6.44f, -2.71f, 6.94f, -5.21f)
+ curveToRelative(0.0f, 0.0f, -2.5f, -48.5f, -2.5f, -62.5f)
+ close()
+ moveTo(193.5f, 272.5f)
+ arcToRelative(6.85f, 6.85f, 0.0f, false, false, -2.0f, 8.0f)
+ curveToRelative(2.0f, 5.0f, 8.0f, 6.0f, 8.0f, 6.0f)
+ reflectiveCurveToRelative(7.0f, -6.0f, 15.0f, -2.0f)
+ reflectiveCurveToRelative(9.0f, 7.0f, 9.0f, 15.0f)
+ reflectiveCurveToRelative(14.0f, 3.0f, 14.0f, 3.0f)
+ lineToRelative(2.0f, -2.0f)
+ reflectiveCurveToRelative(4.0f, -21.0f, -19.0f, -31.0f)
+ curveTo(220.5f, 269.5f, 209.5f, 265.5f, 193.5f, 272.5f)
+ close()
+ moveTo(127.07f, 268.36f)
+ reflectiveCurveTo(108.5f, 263.5f, 98.5f, 279.5f)
+ curveToRelative(0.0f, 0.0f, -5.0f, 9.0f, 1.0f, 20.0f)
+ reflectiveCurveToRelative(7.0f, 4.0f, 7.0f, 4.0f)
+ lineToRelative(7.0f, -5.25f)
+ reflectiveCurveToRelative(-6.0f, -7.75f, -2.0f, -13.75f)
+ curveToRelative(0.0f, 0.0f, 2.75f, -4.25f, 8.88f, -3.12f)
+ close()
+ }
+private val pathData7 =
+ PathData {
+ }
+private val pathData13 =
+ PathData {
+ moveTo(195.58f, 301.91f)
+ horizontalLineTo(218.0f)
+ reflectiveCurveTo(203.0f, 275.78f, 198.73f, 270.14f)
+ reflectiveCurveTo(186.5f, 256.5f, 184.5f, 255.5f)
+ lineToRelative(-13.0f, 12.0f)
+ reflectiveCurveToRelative(8.0f, 4.69f, 10.48f, 8.84f)
+ reflectiveCurveTo(192.66f, 293.32f, 195.58f, 301.91f)
+ close()
+ }
+
+private val pathData15 =
+ PathData {
+ moveTo(159.5f, 191.5f)
+ reflectiveCurveToRelative(3.0f, 36.0f, 3.0f, 40.0f)
+ reflectiveCurveToRelative(1.0f, 27.0f, 1.0f, 27.0f)
+ lineToRelative(3.0f, -1.0f)
+ lineToRelative(-2.0f, -66.0f)
+ close()
+ moveTo(196.5f, 284.5f)
+ arcToRelative(25.68f, 25.68f, 0.0f, false, true, 18.0f, -5.0f)
+ curveToRelative(11.0f, 1.0f, 16.0f, 9.0f, 18.0f, 17.0f)
+ reflectiveCurveToRelative(-4.0f, 10.0f, -4.0f, 10.0f)
+ lineToRelative(-5.0f, -7.0f)
+ reflectiveCurveToRelative(0.05f, -13.88f, -10.0f, -15.44f)
+ reflectiveCurveToRelative(-14.0f, 2.44f, -14.0f, 2.44f)
+ reflectiveCurveTo(195.5f, 286.5f, 196.5f, 284.5f)
+ close()
+ moveTo(123.53f, 274.89f)
+ reflectiveCurveToRelative(-7.0f, -2.39f, -13.0f, 0.61f)
+ reflectiveCurveToRelative(-9.0f, 7.0f, -9.0f, 12.0f)
+ reflectiveCurveToRelative(5.0f, 12.0f, 7.0f, 14.0f)
+ reflectiveCurveToRelative(4.83f, -3.86f, 4.83f, -3.86f)
+ reflectiveCurveToRelative(-3.83f, -5.14f, -2.83f, -11.14f)
+ curveToRelative(0.0f, 0.0f, 1.0f, -6.0f, 10.0f, -5.0f)
+ close()
+ }
+private val pathData16 =
+ PathData {
+ moveTo(145.5f, 261.5f)
+ reflectiveCurveToRelative(28.0f, 1.0f, 38.0f, 17.0f)
+ reflectiveCurveToRelative(13.0f, 26.0f, 13.0f, 26.0f)
+ horizontalLineToRelative(-86.0f)
+ reflectiveCurveToRelative(13.77f, -34.15f, 18.39f, -38.57f)
+ reflectiveCurveTo(144.5f, 261.5f, 145.5f, 261.5f)
+ close()
+
+ moveTo(166.0f, 234.5f)
+ reflectiveCurveToRelative(-0.5f, 3.0f, -5.5f, 3.0f)
+ arcToRelative(64.39f, 64.39f, 0.0f, false, true, -10.3f, -1.0f)
+ moveTo(165.8f, 225.5f)
+ arcToRelative(10.11f, 10.11f, 0.0f, false, true, -6.3f, 2.0f)
+ curveToRelative(-4.0f, 0.0f, -7.65f, -0.2f, -9.82f, -2.1f)
+ moveTo(165.5f, 214.5f)
+ arcToRelative(12.68f, 12.68f, 0.0f, false, true, -6.0f, 2.0f)
+ curveToRelative(-3.0f, 0.0f, -7.0f, 0.25f, -10.0f, -1.37f)
+ moveTo(164.5f, 203.5f)
+ arcToRelative(8.76f, 8.76f, 0.0f, false, true, -6.0f, 2.0f)
+ curveToRelative(-4.0f, 0.0f, -8.0f, 0.0f, -9.0f, -1.0f)
+ moveTo(166.5f, 245.5f)
+ reflectiveCurveToRelative(-1.0f, 3.0f, -6.0f, 3.0f)
+ arcToRelative(21.51f, 21.51f, 0.0f, false, true, -10.0f, -2.0f)
+ moveTo(206.0f, 268.82f)
+ arcToRelative(2.89f, 2.89f, 0.0f, false, false, -1.5f, 2.68f)
+ curveToRelative(0.0f, 2.0f, 0.1f, 8.87f, 7.0f, 11.94f)
+ moveTo(229.44f, 274.89f)
+ reflectiveCurveToRelative(-3.94f, -1.39f, -5.94f, 1.61f)
+ reflectiveCurveToRelative(-3.62f, 9.25f, -2.81f, 12.13f)
+ moveTo(223.56f, 300.34f)
+ curveToRelative(-0.06f, 0.16f, 0.94f, -2.84f, 5.94f, -2.84f)
+ arcToRelative(21.66f, 21.66f, 0.0f, false, true, 10.09f, 2.37f)
+ moveTo(119.5f, 281.5f)
+ reflectiveCurveToRelative(2.0f, -7.0f, 1.0f, -10.0f)
+ arcToRelative(5.45f, 5.45f, 0.0f, false, false, -3.56f, -3.62f)
+ moveTo(111.5f, 284.5f)
+ arcToRelative(14.54f, 14.54f, 0.0f, false, false, -8.0f, -5.0f)
+ curveToRelative(-5.0f, -1.0f, -5.44f, 0.94f, -5.44f, 0.94f)
+ moveTo(111.0f, 293.56f)
+ arcToRelative(10.89f, 10.89f, 0.0f, false, false, -7.48f, 0.94f)
+ curveToRelative(-4.0f, 2.0f, -4.0f, 5.0f, -4.0f, 5.0f)
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Body2Thinnest.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Body2Thinnest.kt
new file mode 100644
index 000000000..8e1a1bc61
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Body2Thinnest.kt
@@ -0,0 +1,209 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.Gray
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Body2ThinnestPreview() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ body2Thinnest(SolidColor(Color.Blue), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun body2Thinnest(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ // blue
+ builder.addPath(pathData1, fill = fgColor, stroke = Black, strokeLineWidth = 1.0f)
+
+ // Gray arms and legs
+ builder.addPath(pathData8, fill = Gray, stroke = Black, strokeLineWidth = 1.0f)
+
+ // right side shade
+ builder.addPath(pathData11, fill = Black, stroke = Black, fillAlpha = 0.2f, strokeLineWidth = 1.0f)
+
+ // Joints
+ builder.addPath(pathData18, stroke = Black, strokeLineWidth = 1.0f)
+
+ // Shades
+ builder.addPath(pathData4, fill = Black, fillAlpha = 0.4f)
+ builder.addPath(pathData6, fill = Black, fillAlpha = 0.2f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(180.45f, 252.21f)
+ reflectiveCurveToRelative(-17.95f, -2.71f, -29.95f, 2.29f)
+ reflectiveCurveToRelative(-15.0f, 8.0f, -16.0f, 24.0f)
+ curveToRelative(0.0f, 0.0f, 1.0f, 27.0f, 1.0f, 28.0f)
+ reflectiveCurveToRelative(49.0f, 1.0f, 49.0f, 1.0f)
+ verticalLineToRelative(-9.0f)
+ arcToRelative(27.15f, 27.15f, 0.0f, false, true, -3.0f, -13.0f)
+ curveToRelative(0.0f, -8.0f, 7.0f, -6.16f, 7.0f, -6.16f)
+ reflectiveCurveTo(177.0f, 279.0f, 177.24f, 263.25f)
+ arcTo(16.2f, 16.2f, 0.0f, false, true, 180.45f, 252.21f)
+ close()
+ moveTo(133.5f, 277.5f)
+ reflectiveCurveToRelative(-6.92f, -1.5f, -8.0f, -5.25f)
+ lineToRelative(-0.68f, -1.62f)
+ curveToRelative(-0.37f, -6.66f, 1.07f, -12.0f, 5.72f, -15.0f)
+ curveToRelative(0.0f, 0.0f, 5.17f, -4.37f, 11.55f, -4.24f)
+ curveToRelative(0.0f, 0.0f, 5.37f, 0.13f, 7.37f, 3.13f)
+ curveToRelative(0.0f, 0.0f, -9.0f, 3.6f, -12.0f, 9.3f)
+ reflectiveCurveToRelative(-3.09f, 13.32f, -3.0f, 14.0f)
+ close()
+ moveTo(188.5f, 247.5f)
+ reflectiveCurveToRelative(-8.0f, 2.0f, -10.0f, 8.0f)
+ reflectiveCurveToRelative(-3.0f, 19.0f, 8.0f, 23.0f)
+ reflectiveCurveToRelative(19.0f, -7.0f, 19.0f, -17.0f)
+ reflectiveCurveTo(201.5f, 245.5f, 188.5f, 247.5f)
+ close()
+ }
+private val pathData4 =
+ PathData {
+ moveTo(134.5f, 254.5f)
+ reflectiveCurveToRelative(3.0f, -1.0f, 3.0f, 0.0f)
+ reflectiveCurveToRelative(-6.0f, 5.0f, -7.0f, 10.0f)
+ reflectiveCurveToRelative(0.0f, 8.0f, -2.0f, 8.0f)
+ reflectiveCurveToRelative(-4.67f, 0.09f, -2.84f, -10.45f)
+ arcTo(13.0f, 13.0f, 0.0f, false, true, 134.5f, 254.5f)
+ close()
+ moveTo(142.5f, 259.5f)
+ arcToRelative(2.19f, 2.19f, 0.0f, false, true, 3.0f, 1.0f)
+ quadToRelative(1.5f, 3.0f, -3.0f, 9.0f)
+ curveToRelative(-3.0f, 4.0f, -3.0f, 14.0f, -2.0f, 19.0f)
+ reflectiveCurveToRelative(2.0f, 10.0f, 2.0f, 13.0f)
+ horizontalLineToRelative(-7.16f)
+ reflectiveCurveTo(134.0f, 284.0f, 134.75f, 275.26f)
+ reflectiveCurveToRelative(2.49f, -12.37f, 6.12f, -15.56f)
+ close()
+ }
+private val pathData6 =
+ PathData {
+ moveTo(189.5f, 248.5f)
+ reflectiveCurveToRelative(9.0f, 0.0f, 9.0f, 10.0f)
+ reflectiveCurveToRelative(-4.0f, 16.0f, -9.0f, 17.0f)
+ reflectiveCurveToRelative(-7.0f, 0.77f, -7.0f, 0.77f)
+ arcToRelative(12.77f, 12.77f, 0.0f, false, false, 8.0f, 3.07f)
+ curveToRelative(5.0f, 0.16f, 15.0f, -4.84f, 15.0f, -17.84f)
+ reflectiveCurveToRelative(-7.26f, -14.64f, -14.13f, -14.32f)
+ reflectiveCurveTo(188.5f, 248.5f, 189.5f, 248.5f)
+ close()
+ moveTo(197.5f, 279.5f)
+ reflectiveCurveToRelative(5.0f, 8.0f, 6.0f, 15.0f)
+ reflectiveCurveToRelative(0.0f, 9.0f, 0.0f, 9.0f)
+ horizontalLineToRelative(8.0f)
+ reflectiveCurveTo(213.0f, 293.0f, 206.76f, 280.74f)
+ curveToRelative(0.0f, 0.0f, -3.26f, -6.24f, -5.26f, -7.24f)
+ arcToRelative(22.0f, 22.0f, 0.0f, false, true, -4.74f, 4.65f)
+ close()
+ moveTo(159.0f, 191.5f)
+ horizontalLineToRelative(6.5f)
+ verticalLineToRelative(10.0f)
+ reflectiveCurveToRelative(1.0f, 20.0f, 0.89f, 29.33f)
+ arcTo(182.26f, 182.26f, 0.0f, false, false, 168.0f, 252.75f)
+ horizontalLineToRelative(0.0f)
+ curveToRelative(-0.5f, 4.25f, -5.5f, 5.75f, -5.5f, 5.75f)
+ verticalLineToRelative(-2.0f)
+ curveToRelative(0.0f, -2.0f, 1.0f, -15.0f, 1.0f, -23.0f)
+ reflectiveCurveToRelative(-4.0f, -40.0f, -4.0f, -40.0f)
+ close()
+ }
+private val pathData8 =
+ PathData {
+ moveTo(201.86f, 273.17f)
+ reflectiveCurveToRelative(9.64f, 10.33f, 9.64f, 28.33f)
+ horizontalLineToRelative(-13.0f)
+ reflectiveCurveToRelative(2.74f, -14.31f, -7.13f, -22.15f)
+ arcTo(11.59f, 11.59f, 0.0f, false, false, 201.86f, 273.17f)
+ close()
+ moveTo(130.17f, 276.81f)
+ arcToRelative(64.62f, 64.62f, 0.0f, false, true, -1.51f, 10.87f)
+ curveToRelative(-1.2f, 5.22f, -3.35f, 11.0f, -7.16f, 13.82f)
+ lineToRelative(13.79f, -0.59f)
+ reflectiveCurveToRelative(-0.79f, -21.41f, -0.79f, -22.41f)
+ close()
+ moveTo(150.0f, 192.0f)
+ reflectiveCurveToRelative(1.0f, 61.0f, 2.0f, 64.0f)
+ curveToRelative(0.0f, 0.0f, 2.0f, 5.0f, 10.0f, 3.0f)
+ curveToRelative(0.0f, 0.0f, 6.0f, -1.0f, 6.0f, -7.0f)
+ curveToRelative(0.0f, 0.0f, -3.5f, -40.5f, -2.5f, -60.5f)
+ curveTo(165.5f, 191.5f, 152.5f, 191.5f, 150.0f, 192.0f)
+ close()
+ }
+private val pathData11 =
+ PathData {
+ moveTo(169.5f, 304.5f)
+ reflectiveCurveToRelative(-7.0f, -21.0f, 0.0f, -42.0f)
+ curveToRelative(0.0f, 0.0f, 3.39f, -7.79f, 10.2f, -10.39f)
+ lineToRelative(0.8f, 0.39f)
+ reflectiveCurveToRelative(-3.64f, 3.11f, -3.32f, 10.06f)
+ reflectiveCurveToRelative(2.16f, 14.4f, 9.74f, 16.17f)
+ arcToRelative(5.19f, 5.19f, 0.0f, false, false, -5.0f, 3.77f)
+ curveToRelative(-1.44f, 4.0f, 0.38f, 11.28f, 1.47f, 13.64f)
+ arcTo(13.05f, 13.05f, 0.0f, false, true, 184.5f, 301.0f)
+ close()
+ }
+private val pathData18 =
+ PathData {
+ moveTo(134.5f, 290.5f)
+ reflectiveCurveToRelative(-2.86f, -2.88f, -5.93f, -2.44f)
+ moveTo(124.0f, 299.0f)
+ reflectiveCurveToRelative(5.55f, -1.48f, 9.0f, 2.0f)
+ moveTo(164.5f, 202.5f)
+ reflectiveCurveToRelative(0.0f, 3.0f, -5.0f, 3.0f)
+ reflectiveCurveToRelative(-8.56f, -1.0f, -9.28f, -1.5f)
+ moveTo(165.0f, 214.5f)
+ reflectiveCurveToRelative(-1.0f, 2.0f, -5.18f, 2.0f)
+ arcToRelative(39.35f, 39.35f, 0.0f, false, true, -9.38f, -1.58f)
+ moveTo(166.0f, 224.5f)
+ reflectiveCurveToRelative(0.0f, 2.0f, -4.62f, 3.0f)
+ reflectiveCurveToRelative(-10.38f, -1.0f, -10.38f, -1.0f)
+ moveTo(166.0f, 233.5f)
+ reflectiveCurveToRelative(0.0f, 2.0f, -3.21f, 3.0f)
+ arcToRelative(16.53f, 16.53f, 0.0f, false, true, -11.79f, -1.0f)
+ moveTo(167.0f, 244.5f)
+ arcToRelative(7.0f, 7.0f, 0.0f, false, true, -5.17f, 4.0f)
+ curveToRelative(-4.13f, 1.0f, -10.48f, -1.51f, -10.48f, -1.51f)
+ moveTo(207.0f, 281.6f)
+ reflectiveCurveToRelative(-4.0f, -2.4f, -12.0f, 2.4f)
+ moveTo(211.42f, 296.16f)
+ reflectiveCurveToRelative(-2.24f, -4.33f, -12.58f, 1.51f)
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Body3Front.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Body3Front.kt
new file mode 100644
index 000000000..dae8065d7
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Body3Front.kt
@@ -0,0 +1,184 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.Gray
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Body3FrontPreview() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ body3Front(SolidColor(Color.Blue), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun body3Front(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ // body
+ builder.addPath(pathData1, fill = fgColor, stroke = Black, strokeLineWidth = 1.0f)
+
+ // body shades
+ builder.addPath(pathData3, fill = Black, fillAlpha = 0.4f)
+ builder.addPath(pathData11, fill = Black, fillAlpha = 0.2f)
+
+ // Gray neck and arms
+ builder.addPath(pathData13, fill = Gray, stroke = Black, strokeLineWidth = 1.0f)
+
+ // chest
+ // Joints
+ builder.addPath(pathData24, stroke = Black, strokeLineWidth = 1.0f)
+
+ // Shades
+ builder.addPath(pathData25, fill = Black, fillAlpha = 0.2f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(148.46f, 242.82f)
+ reflectiveCurveToRelative(-35.0f, 5.68f, -33.0f, 23.68f)
+ curveToRelative(0.0f, 0.0f, -1.0f, 7.0f, 9.0f, 20.0f)
+ reflectiveCurveToRelative(13.0f, 20.0f, 13.0f, 20.0f)
+ lineToRelative(51.0f, -2.0f)
+ reflectiveCurveToRelative(1.0f, -7.0f, 9.0f, -18.0f)
+ reflectiveCurveToRelative(11.0f, -13.0f, 11.0f, -24.0f)
+ reflectiveCurveToRelative(-13.09f, -25.36f, -60.0f, -19.68f)
+ }
+private val pathData3 =
+ PathData {
+ moveTo(131.83f, 247.83f)
+ reflectiveCurveToRelative(-6.33f, 4.67f, -7.33f, 12.67f)
+ curveToRelative(0.0f, 0.0f, -3.0f, 7.0f, 4.0f, 14.0f)
+ reflectiveCurveToRelative(13.0f, 18.0f, 14.0f, 25.0f)
+ reflectiveCurveToRelative(-7.56f, 2.2f, -7.56f, 2.2f)
+ reflectiveCurveToRelative(-5.72f, -8.89f, -11.08f, -16.0f)
+ reflectiveCurveToRelative(-10.81f, -14.18f, -7.58f, -25.17f)
+ curveTo(116.28f, 260.49f, 118.17f, 254.17f, 131.83f, 247.83f)
+ close()
+ }
+private val pathData11 =
+ PathData {
+ moveTo(193.33f, 245.17f)
+ reflectiveCurveToRelative(-1.83f, 5.33f, 1.17f, 8.33f)
+ reflectiveCurveToRelative(4.0f, 4.0f, 2.0f, 8.0f)
+ arcToRelative(21.05f, 21.05f, 0.0f, false, false, -3.72f, 4.0f)
+ curveToRelative(-1.28f, 2.0f, 0.72f, 4.0f, -1.28f, 9.0f)
+ reflectiveCurveToRelative(-15.0f, 28.0f, -15.0f, 28.0f)
+ lineToRelative(12.74f, -0.81f)
+ reflectiveCurveToRelative(-0.74f, -2.19f, 8.26f, -15.19f)
+ reflectiveCurveToRelative(13.0f, -17.33f, 10.0f, -29.17f)
+ curveTo(207.5f, 257.33f, 204.17f, 249.83f, 193.33f, 245.17f)
+ close()
+ }
+private val pathData13 =
+ PathData {
+ moveTo(166.5f, 205.5f)
+ horizontalLineToRelative(-14.0f)
+ arcToRelative(12.13f, 12.13f, 0.0f, false, false, -5.0f, 1.0f)
+ lineToRelative(1.0f, 38.0f)
+ reflectiveCurveToRelative(0.0f, 11.0f, 10.0f, 11.0f)
+ reflectiveCurveToRelative(11.0f, -9.0f, 11.0f, -9.0f)
+ reflectiveCurveToRelative(-3.0f, -17.0f, -3.0f, -27.0f)
+ close()
+ moveTo(197.5f, 286.5f)
+ reflectiveCurveToRelative(12.0f, 3.0f, 14.0f, 13.0f)
+ reflectiveCurveToRelative(16.0f, 4.0f, 16.0f, 4.0f)
+ reflectiveCurveToRelative(4.0f, -1.0f, -2.0f, -15.0f)
+ arcTo(31.19f, 31.19f, 0.0f, false, false, 207.19f, 271.0f)
+ arcToRelative(29.16f, 29.16f, 0.0f, false, true, -5.19f, 9.56f)
+ arcTo(32.56f, 32.56f, 0.0f, false, false, 197.5f, 286.5f)
+ close()
+ moveTo(117.31f, 275.57f)
+ reflectiveCurveTo(103.5f, 282.5f, 100.5f, 301.5f)
+ reflectiveCurveToRelative(17.0f, 0.0f, 17.0f, 0.0f)
+ reflectiveCurveToRelative(1.85f, -8.67f, 8.92f, -12.34f)
+ curveTo(126.42f, 289.16f, 118.13f, 278.64f, 117.31f, 275.57f)
+ close()
+ }
+private val pathData24 =
+ PathData {
+ // Chest
+ moveTo(116.5f, 272.83f)
+ reflectiveCurveToRelative(-2.0f, -6.33f, 6.0f, -8.33f)
+ reflectiveCurveToRelative(19.0f, -5.0f, 40.0f, -5.0f)
+ reflectiveCurveToRelative(41.0f, 6.0f, 40.0f, 18.0f)
+ arcToRelative(10.0f, 10.0f, 0.0f, false, true, -2.17f, 5.0f)
+
+ // Joints
+ moveTo(166.0f, 224.5f)
+ reflectiveCurveToRelative(-2.06f, 3.0f, -9.25f, 3.0f)
+ reflectiveCurveToRelative(-9.25f, -1.5f, -9.25f, -1.5f)
+ moveTo(166.0f, 212.5f)
+ reflectiveCurveToRelative(-2.06f, 3.0f, -9.25f, 3.0f)
+ reflectiveCurveToRelative(-9.25f, -1.5f, -9.25f, -1.5f)
+ moveTo(167.0f, 238.5f)
+ reflectiveCurveToRelative(-2.06f, 3.0f, -9.25f, 3.0f)
+ reflectiveCurveToRelative(-9.25f, -1.5f, -9.25f, -1.5f)
+ moveTo(219.5f, 279.5f)
+ reflectiveCurveToRelative(-11.86f, 4.53f, -11.93f, 12.76f)
+ moveTo(228.5f, 296.5f)
+ arcToRelative(15.7f, 15.7f, 0.0f, false, false, -17.0f, 4.0f)
+ moveTo(109.0f, 283.0f)
+ reflectiveCurveToRelative(7.48f, 11.61f, 11.58f, 11.55f)
+ moveTo(102.0f, 296.0f)
+ reflectiveCurveToRelative(6.9f, 7.76f, 11.5f, 6.47f)
+ }
+private val pathData25 =
+ PathData {
+ moveTo(159.17f, 205.5f)
+ reflectiveCurveToRelative(-0.67f, 9.0f, 1.33f, 15.0f)
+ reflectiveCurveToRelative(4.0f, 15.0f, 3.0f, 21.0f)
+ reflectiveCurveToRelative(-1.0f, 12.74f, -3.0f, 13.87f)
+ reflectiveCurveToRelative(8.0f, -0.87f, 9.0f, -8.87f)
+ arcToRelative(168.89f, 168.89f, 0.0f, false, true, -3.0f, -28.92f)
+ verticalLineTo(205.5f)
+ close()
+ moveTo(224.0f, 304.64f)
+ lineToRelative(4.82f, -4.14f)
+ reflectiveCurveToRelative(-2.14f, -16.5f, -11.0f, -23.0f)
+ reflectiveCurveToRelative(-10.33f, -6.0f, -10.33f, -6.0f)
+ lineToRelative(-3.27f, 6.0f)
+ reflectiveCurveTo(222.47f, 286.77f, 224.0f, 304.64f)
+ close()
+ moveTo(119.5f, 283.5f)
+ reflectiveCurveToRelative(-13.0f, 7.0f, -12.0f, 21.0f)
+ reflectiveCurveToRelative(10.64f, -5.12f, 10.64f, -5.12f)
+ reflectiveCurveToRelative(6.36f, -8.88f, 8.36f, -9.88f)
+ lineToRelative(-5.5f, -7.0f)
+ close()
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Body4Round.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Body4Round.kt
new file mode 100644
index 000000000..23eb003d3
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Body4Round.kt
@@ -0,0 +1,209 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.Gray
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Body4RoundPreview() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ body4Round(SolidColor(Color.Blue), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun body4Round(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ // Blue
+ builder.addPath(pathData1, fill = fgColor, stroke = Black, strokeLineWidth = 1.0f)
+
+ // Gray arms and legs
+ builder.addPath(pathData7, fill = Gray, stroke = Black, strokeLineWidth = 1.0f)
+
+ // Joints
+ builder.addPath(pathData26, stroke = Black, strokeLineWidth = 1.0f)
+
+ // Shades
+ builder.addPath(pathData11, fill = Black, fillAlpha = 0.2f)
+
+ // Stronger Shades
+ builder.addPath(pathData9, fill = Black, fillAlpha = 0.4f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(137.41f, 252.15f)
+ reflectiveCurveToRelative(-0.91f, -4.65f, -11.91f, -3.65f)
+ reflectiveCurveToRelative(-13.0f, 12.0f, -13.0f, 18.0f)
+ reflectiveCurveToRelative(4.0f, 13.0f, 12.0f, 14.0f)
+ curveToRelative(0.0f, 0.0f, 3.0f, 0.0f, 3.0f, -1.0f)
+ curveToRelative(0.0f, 0.0f, -3.17f, -6.44f, 0.41f, -16.72f)
+ curveTo(127.91f, 262.78f, 133.33f, 254.8f, 137.41f, 252.15f)
+ close()
+ moveTo(194.5f, 244.5f)
+ reflectiveCurveToRelative(-19.0f, 1.0f, -19.0f, 17.0f)
+ reflectiveCurveToRelative(11.0f, 21.0f, 17.0f, 21.0f)
+ reflectiveCurveToRelative(20.0f, -2.0f, 19.0f, -20.0f)
+ reflectiveCurveTo(194.5f, 244.5f, 194.5f, 244.5f)
+ close()
+ moveTo(181.5f, 247.5f)
+ arcToRelative(39.32f, 39.32f, 0.0f, false, false, -24.0f, -4.0f)
+ curveToRelative(-14.0f, 2.0f, -28.0f, 14.0f, -30.0f, 19.0f)
+ reflectiveCurveToRelative(-3.0f, 9.0f, 0.0f, 17.0f)
+ reflectiveCurveToRelative(3.0f, 20.0f, 1.0f, 22.0f)
+ horizontalLineToRelative(68.0f)
+ reflectiveCurveToRelative(0.68f, -18.41f, -0.66f, -19.2f)
+ curveToRelative(0.0f, 0.0f, -21.34f, 1.2f, -20.34f, -19.8f)
+ arcToRelative(13.88f, 13.88f, 0.0f, false, true, 6.67f, -13.88f)
+ close()
+ }
+private val pathData7 =
+ PathData {
+ moveTo(195.5f, 282.5f)
+ reflectiveCurveToRelative(7.0f, 11.0f, 6.0f, 19.0f)
+ horizontalLineToRelative(12.0f)
+ reflectiveCurveToRelative(2.5f, -15.0f, -7.25f, -23.5f)
+ curveTo(206.25f, 278.0f, 203.5f, 282.5f, 195.5f, 282.5f)
+ close()
+ moveTo(119.36f, 278.79f)
+ reflectiveCurveToRelative(-3.86f, 5.71f, -4.86f, 10.71f)
+ reflectiveCurveToRelative(1.0f, 12.0f, 1.0f, 12.0f)
+ horizontalLineToRelative(10.0f)
+ reflectiveCurveToRelative(-1.0f, -7.0f, 1.0f, -12.0f)
+ reflectiveCurveToRelative(2.48f, -4.68f, 2.48f, -4.68f)
+ lineToRelative(-1.48f, -5.32f)
+ reflectiveCurveToRelative(-1.27f, 1.4f, -4.63f, 0.7f)
+ reflectiveCurveToRelative(-3.87f, -1.4f, -3.87f, -1.4f)
+ moveTo(147.0f, 200.0f)
+ reflectiveCurveToRelative(-1.0f, 42.0f, 2.0f, 50.0f)
+ curveToRelative(0.0f, 0.0f, 12.0f, 9.0f, 20.0f, -2.0f)
+ curveToRelative(0.0f, 0.0f, -3.5f, -26.5f, -3.5f, -48.5f)
+ arcTo(77.11f, 77.11f, 0.0f, false, false, 147.0f, 200.0f)
+ close()
+ }
+private val pathData9 =
+ PathData {
+ moveTo(136.5f, 260.5f)
+ arcToRelative(3.1f, 3.1f, 0.0f, false, false, -2.0f, 1.0f)
+ curveToRelative(-1.0f, 1.0f, -3.0f, 5.0f, 0.0f, 5.0f)
+ reflectiveCurveToRelative(4.0f, -1.0f, 4.0f, -3.0f)
+ reflectiveCurveTo(137.5f, 260.5f, 136.5f, 260.5f)
+ close()
+ moveTo(133.5f, 270.5f)
+ arcToRelative(4.33f, 4.33f, 0.0f, false, false, -2.0f, 4.0f)
+ curveToRelative(0.0f, 3.0f, 1.0f, 6.0f, 2.0f, 12.0f)
+ reflectiveCurveToRelative(0.67f, 14.0f, -1.67f, 15.0f)
+ reflectiveCurveToRelative(6.67f, 0.0f, 6.67f, 0.0f)
+ reflectiveCurveToRelative(4.0f, -16.0f, 0.0f, -25.0f)
+ curveTo(138.5f, 276.5f, 136.5f, 269.5f, 133.5f, 270.5f)
+ close()
+ }
+private val pathData11 =
+ PathData {
+ moveTo(195.5f, 245.5f)
+ reflectiveCurveToRelative(8.0f, 5.0f, 6.0f, 18.0f)
+ reflectiveCurveToRelative(-9.78f, 17.77f, -14.39f, 17.89f)
+ curveToRelative(0.0f, 0.0f, 21.41f, 6.8f, 24.4f, -15.54f)
+ curveTo(211.51f, 265.84f, 212.5f, 245.5f, 195.5f, 245.5f)
+ close()
+ moveTo(161.5f, 253.5f)
+ reflectiveCurveToRelative(9.0f, 2.0f, 11.0f, 10.0f)
+ reflectiveCurveToRelative(2.0f, 28.0f, 2.0f, 28.0f)
+ verticalLineToRelative(12.0f)
+ lineToRelative(22.0f, 1.0f)
+ verticalLineToRelative(-19.0f)
+ arcToRelative(4.38f, 4.38f, 0.0f, false, false, -1.0f, -3.0f)
+ reflectiveCurveToRelative(-22.0f, -1.0f, -20.0f, -21.0f)
+ curveToRelative(0.0f, 0.0f, 0.0f, -9.0f, 7.0f, -13.0f)
+ arcToRelative(35.0f, 35.0f, 0.0f, false, false, -14.06f, -5.07f)
+ lineToRelative(0.06f, 5.07f)
+ arcTo(10.39f, 10.39f, 0.0f, false, true, 161.5f, 253.5f)
+ close()
+ moveTo(118.5f, 252.5f)
+ reflectiveCurveToRelative(5.0f, -3.0f, 3.0f, 1.0f)
+ reflectiveCurveToRelative(-5.0f, 5.0f, -6.0f, 11.0f)
+ reflectiveCurveToRelative(4.0f, 11.0f, 4.0f, 11.0f)
+ reflectiveCurveToRelative(2.0f, 2.0f, -1.0f, 2.0f)
+ reflectiveCurveToRelative(-7.7f, -8.0f, -5.35f, -17.0f)
+ arcTo(16.51f, 16.51f, 0.0f, false, true, 118.5f, 252.5f)
+ close()
+ moveTo(125.0f, 280.39f)
+ reflectiveCurveToRelative(-4.48f, 3.61f, -3.22f, 21.11f)
+ horizontalLineTo(125.0f)
+ reflectiveCurveToRelative(-1.0f, -11.5f, 4.0f, -16.5f)
+ lineToRelative(-1.58f, -5.08f)
+ close()
+ moveTo(202.0f, 281.28f)
+ reflectiveCurveTo(209.0f, 293.0f, 209.0f, 302.0f)
+ reflectiveCurveToRelative(4.79f, -1.37f, 4.79f, -1.37f)
+ reflectiveCurveTo(215.0f, 286.0f, 206.0f, 278.0f)
+ arcTo(6.19f, 6.19f, 0.0f, false, true, 202.0f, 281.28f)
+ close()
+ moveTo(158.67f, 199.17f)
+ reflectiveCurveToRelative(0.83f, 11.33f, 1.83f, 18.33f)
+ reflectiveCurveToRelative(2.0f, 15.0f, 2.0f, 20.0f)
+ reflectiveCurveToRelative(0.33f, 13.93f, -1.33f, 16.0f)
+ curveToRelative(0.0f, 0.0f, 4.33f, 0.0f, 7.33f, -6.0f)
+ curveToRelative(0.0f, 0.0f, -3.0f, -26.0f, -3.0f, -33.0f)
+ verticalLineToRelative(-15.0f)
+ close()
+ }
+private val pathData26 =
+ PathData {
+ moveTo(211.55f, 285.39f)
+ reflectiveCurveToRelative(0.73f, 7.21f, -11.66f, 6.16f)
+ moveTo(141.34f, 249.41f)
+ reflectiveCurveToRelative(3.16f, 11.09f, 16.16f, 11.09f)
+ reflectiveCurveToRelative(19.07f, -10.0f, 19.0f, -15.0f)
+ moveTo(144.5f, 301.5f)
+ reflectiveCurveToRelative(2.0f, -12.0f, 1.0f, -18.0f)
+ lineToRelative(23.0f, -1.0f)
+ reflectiveCurveToRelative(1.0f, 17.0f, 0.0f, 19.0f)
+ moveTo(114.92f, 286.75f)
+ reflectiveCurveToRelative(3.58f, 4.75f, 11.58f, 2.75f)
+ moveTo(166.0f, 211.5f)
+ reflectiveCurveToRelative(-1.08f, 3.0f, -8.68f, 3.0f)
+ reflectiveCurveToRelative(-10.48f, -1.37f, -10.48f, -1.37f)
+ moveTo(166.0f, 223.5f)
+ reflectiveCurveToRelative(-1.08f, 3.0f, -8.68f, 3.0f)
+ reflectiveCurveToRelative(-10.48f, -1.37f, -10.48f, -1.37f)
+ moveTo(147.5f, 238.5f)
+ arcToRelative(15.39f, 15.39f, 0.0f, false, false, 8.0f, 2.0f)
+ curveToRelative(5.0f, 0.0f, 11.32f, -1.58f, 12.16f, -4.29f)
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Body5Neck.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Body5Neck.kt
new file mode 100644
index 000000000..2e5bd18f3
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Body5Neck.kt
@@ -0,0 +1,154 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.Gray
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Body5NeckPreview() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ body5Neck(SolidColor(Color.Blue), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun body5Neck(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ // Body
+ builder.addPath(pathData1, fill = fgColor, stroke = Black, strokeLineWidth = 1.0f)
+
+ // Neck circle
+ builder.addPath(pathData2, fill = Black, stroke = Black, fillAlpha = 0.2f, strokeLineWidth = 1.0f)
+
+ // Neck
+ builder.addPath(pathData9, fill = Gray, stroke = Black, strokeLineWidth = 1.0f)
+
+ // Shades
+ builder.addPath(pathData4, fill = Black, fillAlpha = 0.2f)
+
+ // Joints
+ builder.addPath(pathData11, stroke = Black, strokeLineWidth = 1.0f)
+
+ // Body shade
+ builder.addPath(pathData17, fill = Black, fillAlpha = 0.2f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(145.5f, 301.5f)
+ reflectiveCurveToRelative(-1.0f, -18.0f, -1.0f, -23.0f)
+ curveToRelative(0.0f, 0.0f, 0.37f, -3.41f, 15.68f, -2.2f)
+ reflectiveCurveToRelative(10.15f, -0.26f, 10.15f, -0.26f)
+ reflectiveCurveToRelative(5.17f, -0.54f, 5.17f, 2.46f)
+ reflectiveCurveToRelative(0.0f, 19.0f, 3.0f, 23.0f)
+ close()
+ }
+private val pathData2 =
+ PathData {
+ moveTo(159.5f, 286.5f)
+ reflectiveCurveToRelative(16.0f, -1.0f, 16.0f, -8.0f)
+ curveToRelative(0.0f, 0.0f, 4.0f, -3.0f, -14.0f, -2.0f)
+ horizontalLineToRelative(-12.0f)
+ reflectiveCurveToRelative(-5.0f, 0.0f, -5.0f, 2.0f)
+ reflectiveCurveTo(143.5f, 285.5f, 159.5f, 286.5f)
+ close()
+ }
+private val pathData4 =
+ PathData {
+ moveTo(167.5f, 282.5f)
+ lineToRelative(4.79f, 0.67f)
+ lineToRelative(0.55f, 18.33f)
+ horizontalLineToRelative(5.66f)
+ reflectiveCurveToRelative(-2.64f, -3.0f, -2.82f, -15.0f)
+ lineToRelative(-0.18f, -8.0f)
+ reflectiveCurveToRelative(-1.0f, -3.0f, -4.0f, -2.5f)
+ verticalLineToRelative(3.5f)
+ arcTo(6.93f, 6.93f, 0.0f, false, true, 167.5f, 282.5f)
+ close()
+ moveTo(161.5f, 200.5f)
+ reflectiveCurveToRelative(0.0f, 20.0f, 1.0f, 27.0f)
+ reflectiveCurveToRelative(3.0f, 24.0f, 4.0f, 35.0f)
+ arcToRelative(166.5f, 166.5f, 0.0f, false, true, 0.61f, 20.0f)
+ reflectiveCurveToRelative(4.39f, -2.0f, 4.39f, -3.0f)
+ reflectiveCurveToRelative(-1.38f, -41.67f, -1.69f, -48.33f)
+ reflectiveCurveToRelative(-0.31f, -31.67f, -0.31f, -31.67f)
+ horizontalLineToRelative(-8.0f)
+ close()
+ }
+private val pathData9 =
+ PathData {
+ moveTo(146.0f, 200.0f)
+ reflectiveCurveToRelative(3.0f, 68.0f, 2.0f, 79.0f)
+ curveToRelative(0.0f, 0.0f, 2.0f, 6.0f, 12.0f, 5.0f)
+ reflectiveCurveToRelative(11.5f, -4.5f, 11.5f, -4.5f)
+ reflectiveCurveToRelative(-3.0f, -75.0f, -2.0f, -80.0f)
+ curveTo(169.5f, 199.5f, 151.5f, 199.5f, 146.0f, 200.0f)
+ close()
+ }
+private val pathData11 =
+ PathData {
+ moveTo(146.43f, 210.28f)
+ arcToRelative(31.28f, 31.28f, 0.0f, false, false, 13.07f, 3.22f)
+ curveToRelative(7.0f, 0.0f, 9.83f, -3.22f, 9.83f, -3.22f)
+ moveTo(147.43f, 222.28f)
+ arcToRelative(31.28f, 31.28f, 0.0f, false, false, 13.07f, 3.22f)
+ curveToRelative(7.0f, 0.0f, 9.83f, -3.22f, 9.83f, -3.22f)
+ moveTo(147.43f, 234.28f)
+ arcToRelative(31.28f, 31.28f, 0.0f, false, false, 13.07f, 3.22f)
+ curveToRelative(7.0f, 0.0f, 9.83f, -3.22f, 9.83f, -3.22f)
+ moveTo(147.43f, 246.28f)
+ arcToRelative(31.28f, 31.28f, 0.0f, false, false, 13.07f, 3.22f)
+ curveToRelative(7.0f, 0.0f, 9.83f, -3.22f, 9.83f, -3.22f)
+ moveTo(148.43f, 259.28f)
+ arcToRelative(31.28f, 31.28f, 0.0f, false, false, 13.07f, 3.22f)
+ curveToRelative(7.0f, 0.0f, 9.83f, -3.22f, 9.83f, -3.22f)
+ moveTo(148.43f, 271.28f)
+ arcToRelative(31.28f, 31.28f, 0.0f, false, false, 13.07f, 3.22f)
+ curveToRelative(7.0f, 0.0f, 9.83f, -3.22f, 9.83f, -3.22f)
+ }
+private val pathData17 =
+ PathData {
+ moveTo(144.5f, 281.5f)
+ lineToRelative(2.0f, 21.0f)
+ lineToRelative(33.0f, -1.0f)
+ reflectiveCurveToRelative(-4.0f, -6.0f, -4.0f, -23.0f)
+ curveToRelative(0.0f, 0.0f, -1.0f, 8.0f, -15.0f, 8.0f)
+ reflectiveCurveTo(145.5f, 282.5f, 144.5f, 281.5f)
+ close()
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Body6Ironman.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Body6Ironman.kt
new file mode 100644
index 000000000..c58f5aee2
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Body6Ironman.kt
@@ -0,0 +1,184 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.Gray
+import com.vitorpamplona.amethyst.commons.Yellow
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Body6IronManPreview() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ body6IronMan(SolidColor(Color.Blue), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun body6IronMan(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ builder.addPath(pathData1, fill = fgColor, stroke = Black, strokeLineWidth = 1.0f)
+
+ // Body shades
+ builder.addPath(pathData5, fill = Black, fillAlpha = 0.2f)
+ builder.addPath(pathData7, fill = Black, fillAlpha = 0.4f)
+
+ // Iron man circle
+ builder.addPath(pathData12, fill = Black, stroke = Black, fillAlpha = 0.2f, strokeLineWidth = 1.0f)
+ builder.addPath(pathData14, fill = Yellow, stroke = Black, strokeLineWidth = 1.0f)
+
+ // Gray neck
+ builder.addPath(pathData19, fill = Gray, stroke = Black, strokeLineWidth = 1.0f)
+
+ // Neck Shades
+ builder.addPath(pathData20, fill = Black, fillAlpha = 0.2f)
+
+ // Joints
+ builder.addPath(pathData21, stroke = Black, strokeLineWidth = 1.0f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(158.5f, 234.5f)
+ reflectiveCurveToRelative(-59.0f, 1.0f, -84.0f, 42.0f)
+ reflectiveCurveToRelative(23.0f, 42.0f, 23.0f, 42.0f)
+ lineToRelative(132.0f, -13.0f)
+ reflectiveCurveToRelative(-5.0f, -16.0f, 5.0f, -27.0f)
+ reflectiveCurveToRelative(19.0f, -6.0f, 19.0f, -6.0f)
+ reflectiveCurveTo(219.5f, 231.5f, 158.5f, 234.5f)
+ close()
+ moveTo(277.5f, 301.5f)
+ curveToRelative(-0.33f, -7.3f, -4.07f, -15.56f, -12.0f, -25.0f)
+ curveToRelative(0.0f, 0.0f, -11.5f, -7.5f, -25.28f, -2.69f)
+ curveToRelative(-7.72f, 4.69f, -13.72f, 11.69f, -11.72f, 28.69f)
+ close()
+ moveTo(74.5f, 276.5f)
+ arcToRelative(29.05f, 29.05f, 0.0f, false, false, -26.0f, 16.0f)
+ curveToRelative(-9.0f, 17.0f, 10.0f, 17.0f, 10.0f, 17.0f)
+ lineToRelative(8.79f, -9.5f)
+ reflectiveCurveTo(64.5f, 293.5f, 74.5f, 276.5f)
+ close()
+ }
+private val pathData5 =
+ PathData {
+ moveTo(215.0f, 245.0f)
+ reflectiveCurveToRelative(6.5f, 1.46f, -0.5f, 16.46f)
+ reflectiveCurveToRelative(-13.0f, 26.0f, -10.0f, 41.0f)
+ reflectiveCurveToRelative(24.32f, 0.0f, 24.32f, 0.0f)
+ reflectiveCurveToRelative(-3.6f, -15.79f, 7.0f, -25.4f)
+ curveToRelative(12.91f, -11.65f, 19.71f, -3.56f, 16.64f, -5.6f)
+ curveTo(252.5f, 271.5f, 235.49f, 253.58f, 215.0f, 245.0f)
+ close()
+ moveTo(261.5f, 304.5f)
+ reflectiveCurveToRelative(4.0f, -7.0f, 3.0f, -15.0f)
+ reflectiveCurveToRelative(-8.36f, -16.57f, -8.36f, -16.57f)
+ arcToRelative(25.86f, 25.86f, 0.0f, false, true, 18.77f, 16.29f)
+ arcToRelative(27.17f, 27.17f, 0.0f, false, true, 2.58f, 15.29f)
+ close()
+ }
+private val pathData7 =
+ PathData {
+ moveTo(62.5f, 280.5f)
+ reflectiveCurveToRelative(5.0f, 0.0f, 0.0f, 9.0f)
+ reflectiveCurveToRelative(-8.0f, 11.0f, -9.0f, 14.0f)
+ reflectiveCurveToRelative(-6.5f, -2.33f, -6.5f, -2.33f)
+ reflectiveCurveToRelative(-3.23f, -4.81f, 5.63f, -14.74f)
+ curveTo(52.63f, 286.43f, 57.5f, 280.5f, 62.5f, 280.5f)
+ close()
+ moveTo(77.5f, 301.5f)
+ reflectiveCurveToRelative(0.0f, -19.0f, 13.0f, -30.0f)
+ reflectiveCurveToRelative(16.0f, -5.0f, 15.0f, -2.0f)
+ reflectiveCurveToRelative(-14.0f, 24.0f, -14.0f, 32.0f)
+ reflectiveCurveTo(77.5f, 301.5f, 77.5f, 301.5f)
+ close()
+ }
+private val pathData12 =
+ PathData {
+ moveTo(103.5f, 303.5f)
+ reflectiveCurveToRelative(2.0f, -30.0f, 41.0f, -29.0f)
+ reflectiveCurveToRelative(41.0f, 29.0f, 41.0f, 29.0f)
+ horizontalLineTo(174.25f)
+ curveToRelative(-0.75f, -2.0f, -12.12f, -18.58f, -30.75f, -18.0f)
+ curveToRelative(-15.88f, -0.37f, -26.93f, 4.64f, -30.5f, 18.0f)
+ close()
+
+ moveTo(113.5f, 301.5f)
+ reflectiveCurveToRelative(3.0f, -16.0f, 28.0f, -16.0f)
+ reflectiveCurveToRelative(32.0f, 17.0f, 32.0f, 17.0f)
+ close()
+ }
+private val pathData14 =
+ PathData {
+ moveTo(118.5f, 300.5f)
+ reflectiveCurveToRelative(9.0f, -12.0f, 24.0f, -11.0f)
+ reflectiveCurveToRelative(24.0f, 12.0f, 24.0f, 12.0f)
+ close()
+ }
+private val pathData19 =
+ PathData {
+ moveTo(147.0f, 200.0f)
+ reflectiveCurveToRelative(0.0f, 44.0f, 1.0f, 45.0f)
+ arcToRelative(14.41f, 14.41f, 0.0f, false, false, 14.0f, 4.0f)
+ curveToRelative(8.0f, -2.0f, 7.0f, -7.0f, 7.0f, -7.0f)
+ arcToRelative(144.32f, 144.32f, 0.0f, false, true, -2.5f, -24.5f)
+ verticalLineToRelative(-19.0f)
+ reflectiveCurveTo(148.5f, 198.5f, 147.0f, 200.0f)
+ close()
+ }
+private val pathData20 =
+ PathData {
+ moveTo(159.5f, 202.5f)
+ reflectiveCurveToRelative(1.0f, 17.0f, 2.0f, 23.0f)
+ reflectiveCurveToRelative(2.0f, 22.83f, -2.0f, 23.91f)
+ curveToRelative(0.0f, 0.0f, 9.62f, -0.9f, 9.31f, -8.41f)
+ reflectiveCurveToRelative(-2.43f, -19.17f, -2.37f, -30.34f)
+ reflectiveCurveToRelative(0.06f, -12.17f, 0.06f, -12.17f)
+ lineToRelative(-7.0f, 0.11f)
+ close()
+ }
+private val pathData21 =
+ PathData {
+ moveTo(147.0f, 233.5f)
+ reflectiveCurveToRelative(1.08f, 3.0f, 5.4f, 3.0f)
+ reflectiveCurveToRelative(12.83f, -1.33f, 15.0f, -4.66f)
+ moveTo(147.5f, 219.32f)
+ reflectiveCurveToRelative(1.0f, 2.68f, 5.0f, 2.68f)
+ reflectiveCurveToRelative(11.89f, -1.18f, 13.94f, -4.16f)
+ moveTo(147.5f, 208.07f)
+ reflectiveCurveToRelative(1.0f, 1.93f, 5.0f, 1.93f)
+ reflectiveCurveToRelative(11.89f, -0.85f, 13.94f, -3.0f)
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Body7Neckthinner.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Body7Neckthinner.kt
new file mode 100644
index 000000000..b83734c72
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Body7Neckthinner.kt
@@ -0,0 +1,172 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.Gray
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Body7NeckThinnerPreview() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ body7NeckThinner(SolidColor(Color.Blue), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun body7NeckThinner(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ // Body
+ builder.addPath(pathData1, fill = fgColor, stroke = Black, strokeLineWidth = 1.0f)
+
+ // Darker neck
+ builder.addPath(pathData6, fill = Black, stroke = Black, fillAlpha = 0.4f, strokeLineWidth = 1.0f)
+
+ // Body shades
+ builder.addPath(pathData9, fill = Black, fillAlpha = 0.4f)
+
+ // gray neck
+ builder.addPath(pathData12, fill = Gray, stroke = Black, strokeLineWidth = 1.0f)
+
+ // neck shades
+ builder.addPath(pathData13, fill = Black, fillAlpha = 0.2f)
+
+ // Joints
+ builder.addPath(pathData14, stroke = Black, strokeLineWidth = 1.0f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(125.5f, 286.5f)
+ reflectiveCurveToRelative(-5.0f, 5.0f, -4.0f, 15.0f)
+ lineToRelative(83.0f, 1.0f)
+ reflectiveCurveToRelative(-2.0f, -19.0f, -13.0f, -22.0f)
+ reflectiveCurveToRelative(-16.0f, -1.95f, -16.0f, -1.95f)
+ horizontalLineToRelative(-0.39f)
+ lineToRelative(0.39f, 3.95f)
+ reflectiveCurveToRelative(-4.64f, 7.17f, -15.82f, 7.08f)
+ reflectiveCurveToRelative(-13.57f, -2.76f, -15.87f, -5.92f)
+ curveToRelative(0.0f, 0.0f, -1.3f, -4.45f, -0.8f, -6.81f)
+ curveTo(143.0f, 276.85f, 135.5f, 277.5f, 125.5f, 286.5f)
+ close()
+ moveTo(143.5f, 282.5f)
+ reflectiveCurveToRelative(0.0f, 6.0f, 14.0f, 7.0f)
+ reflectiveCurveToRelative(18.0f, -7.0f, 18.0f, -7.0f)
+ lineToRelative(-1.0f, -10.0f)
+ reflectiveCurveToRelative(-0.12f, -5.0f, -15.56f, -5.0f)
+ reflectiveCurveToRelative(-14.44f, 4.0f, -15.44f, 6.0f)
+ arcToRelative(10.07f, 10.07f, 0.0f, false, false, -0.43f, 4.0f)
+ curveTo(143.14f, 280.0f, 143.5f, 282.5f, 143.5f, 282.5f)
+ close()
+ }
+private val pathData6 =
+ PathData {
+ moveTo(143.5f, 272.5f)
+ arcToRelative(4.87f, 4.87f, 0.0f, false, false, -0.19f, 1.41f)
+ curveToRelative(0.0f, 2.53f, 1.69f, 7.59f, 15.19f, 7.59f)
+ curveToRelative(18.0f, 0.0f, 16.0f, -9.0f, 16.0f, -9.0f)
+ reflectiveCurveToRelative(-1.0f, -5.0f, -13.0f, -5.0f)
+ reflectiveCurveTo(145.5f, 268.5f, 143.5f, 272.5f)
+ close()
+ }
+private val pathData9 =
+ PathData {
+ moveTo(134.5f, 281.5f)
+ reflectiveCurveToRelative(5.0f, -1.0f, 3.0f, 2.0f)
+ reflectiveCurveToRelative(-7.0f, 4.0f, -9.0f, 9.0f)
+ arcToRelative(17.55f, 17.55f, 0.0f, false, false, -1.2f, 9.07f)
+ lineToRelative(-5.8f, -0.07f)
+ reflectiveCurveTo(120.0f, 288.59f, 129.74f, 283.0f)
+ arcTo(12.58f, 12.58f, 0.0f, false, true, 134.5f, 281.5f)
+ close()
+ moveTo(168.21f, 288.58f)
+ reflectiveCurveToRelative(15.29f, -5.08f, 20.29f, -1.08f)
+ reflectiveCurveToRelative(5.0f, 12.0f, 5.0f, 14.0f)
+ reflectiveCurveToRelative(11.0f, 0.0f, 11.0f, 0.0f)
+ reflectiveCurveToRelative(-2.7f, -17.32f, -10.85f, -20.16f)
+ arcToRelative(50.64f, 50.64f, 0.0f, false, false, -18.15f, -2.84f)
+ horizontalLineToRelative(0.0f)
+ verticalLineToRelative(4.0f)
+ reflectiveCurveTo(169.92f, 288.67f, 168.21f, 288.58f)
+ close()
+ moveTo(170.33f, 279.34f)
+ verticalLineToRelative(7.9f)
+ reflectiveCurveToRelative(5.17f, -3.74f, 5.17f, -4.74f)
+ reflectiveCurveToRelative(-0.94f, -9.36f, -0.94f, -9.36f)
+ reflectiveCurveTo(175.16f, 277.17f, 170.33f, 279.34f)
+ close()
+ }
+private val pathData12 =
+ PathData {
+ moveTo(143.0f, 201.0f)
+ reflectiveCurveToRelative(8.0f, 21.0f, 7.0f, 38.0f)
+ reflectiveCurveToRelative(-2.0f, 35.0f, -2.0f, 35.0f)
+ reflectiveCurveToRelative(0.5f, 3.5f, 10.5f, 3.5f)
+ reflectiveCurveToRelative(13.0f, -5.0f, 13.0f, -5.0f)
+ reflectiveCurveToRelative(0.0f, -37.0f, -3.0f, -53.0f)
+ reflectiveCurveToRelative(-8.0f, -22.0f, -8.0f, -22.0f)
+ reflectiveCurveTo(147.5f, 200.5f, 143.0f, 201.0f)
+ close()
+ }
+private val pathData13 =
+ PathData {
+ moveTo(153.89f, 199.0f)
+ reflectiveCurveToRelative(6.61f, 15.53f, 8.61f, 28.53f)
+ reflectiveCurveToRelative(4.0f, 24.0f, 4.0f, 33.0f)
+ verticalLineToRelative(15.63f)
+ reflectiveCurveToRelative(5.0f, -1.63f, 5.0f, -3.63f)
+ reflectiveCurveToRelative(1.23f, -37.53f, -5.39f, -62.77f)
+ curveToRelative(0.0f, 0.0f, -3.61f, -10.23f, -5.61f, -12.23f)
+ close()
+ }
+private val pathData14 =
+ PathData {
+ moveTo(150.0f, 226.5f)
+ reflectiveCurveToRelative(14.89f, 2.35f, 18.24f, -8.32f)
+ moveTo(150.5f, 237.5f)
+ reflectiveCurveToRelative(1.0f, 4.0f, 8.0f, 3.0f)
+ reflectiveCurveToRelative(11.0f, -4.0f, 12.0f, -6.0f)
+ moveTo(149.63f, 250.63f)
+ reflectiveCurveToRelative(0.88f, 3.88f, 6.88f, 3.88f)
+ reflectiveCurveTo(170.0f, 251.0f, 171.24f, 248.74f)
+ moveTo(147.5f, 213.5f)
+ reflectiveCurveToRelative(1.0f, 2.0f, 6.0f, 2.0f)
+ reflectiveCurveToRelative(12.85f, -4.58f, 12.43f, -6.29f)
+ moveTo(149.0f, 262.5f)
+ reflectiveCurveToRelative(0.0f, 5.0f, 8.18f, 4.0f)
+ reflectiveCurveToRelative(12.77f, -3.62f, 14.06f, -6.31f)
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Body8Big.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Body8Big.kt
new file mode 100644
index 000000000..11151c546
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Body8Big.kt
@@ -0,0 +1,225 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.Gray
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Body8BigPreview() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ body8Big(SolidColor(Color.Blue), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun body8Big(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ // body
+ builder.addPath(pathData1, fill = fgColor, stroke = Black, strokeLineWidth = 1.0f)
+
+ // neck base
+ builder.addPath(pathData4, stroke = Black, strokeLineWidth = 1.0f)
+ builder.addPath(pathData7, fill = Black, stroke = Black, fillAlpha = 0.4f, strokeLineWidth = 1.0f)
+
+ // Body shades
+ builder.addPath(pathData5, fill = Black, fillAlpha = 0.4f)
+
+ // Neck and arms
+ builder.addPath(pathData32, fill = Gray, stroke = Black, strokeLineWidth = 1.0f)
+
+ // Joints
+ builder.addPath(pathData33, stroke = Black, strokeLineWidth = 1.0f)
+
+ // Shades
+ builder.addPath(pathData20, fill = Black, fillAlpha = 0.2f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(95.13f, 227.69f)
+ reflectiveCurveTo(74.5f, 232.5f, 73.5f, 248.5f)
+ curveToRelative(-0.44f, 7.05f, 4.25f, 12.09f, 9.63f, 15.53f)
+ arcToRelative(52.45f, 52.45f, 0.0f, false, false, 14.79f, 6.13f)
+ reflectiveCurveToRelative(-3.16f, -18.66f, -2.79f, -30.66f)
+ reflectiveCurveTo(95.13f, 227.69f, 95.13f, 227.69f)
+ close()
+ moveTo(97.5f, 301.5f)
+ reflectiveCurveToRelative(2.0f, -21.0f, 0.0f, -35.0f)
+ reflectiveCurveToRelative(-2.0f, -29.0f, -2.0f, -36.0f)
+ reflectiveCurveToRelative(14.0f, -26.11f, 46.0f, -28.05f)
+ reflectiveCurveToRelative(59.0f, -1.95f, 63.0f, 18.05f)
+ reflectiveCurveToRelative(3.0f, 30.0f, 3.0f, 30.0f)
+ reflectiveCurveToRelative(2.0f, 53.0f, 0.0f, 55.0f)
+ reflectiveCurveTo(97.5f, 301.5f, 97.5f, 301.5f)
+ close()
+ moveTo(204.5f, 220.5f)
+ reflectiveCurveToRelative(28.0f, 1.0f, 29.0f, 23.0f)
+ reflectiveCurveTo(216.6f, 267.0f, 208.0f, 268.24f)
+ curveTo(208.0f, 268.24f, 209.5f, 233.5f, 204.5f, 220.5f)
+ close()
+ }
+private val pathData4 =
+ PathData {
+ moveTo(95.5f, 230.5f)
+ reflectiveCurveToRelative(-7.0f, 20.0f, 40.0f, 23.0f)
+ reflectiveCurveToRelative(69.0f, -15.69f, 69.51f, -30.35f)
+ reflectiveCurveToRelative(-12.33f, -22.39f, -48.92f, -21.52f)
+ reflectiveCurveTo(100.5f, 212.5f, 95.5f, 230.5f)
+ close()
+ }
+private val pathData5 =
+ PathData {
+ moveTo(87.5f, 232.5f)
+ reflectiveCurveToRelative(-9.0f, 9.0f, -9.0f, 14.0f)
+ reflectiveCurveToRelative(6.0f, 16.0f, 2.0f, 15.0f)
+ reflectiveCurveToRelative(-7.57f, -12.0f, -5.79f, -18.48f)
+ reflectiveCurveTo(86.5f, 229.5f, 87.5f, 232.5f)
+ close()
+ moveTo(104.5f, 263.5f)
+ arcToRelative(4.45f, 4.45f, 0.0f, false, false, 2.0f, 5.0f)
+ curveToRelative(3.0f, 2.0f, 7.0f, 0.0f, 6.0f, -2.0f)
+ reflectiveCurveTo(106.5f, 260.5f, 104.5f, 263.5f)
+ close()
+ moveTo(109.5f, 276.5f)
+ reflectiveCurveToRelative(-5.0f, -1.0f, -5.0f, 9.0f)
+ arcToRelative(161.75f, 161.75f, 0.0f, false, false, 1.0f, 18.0f)
+ lineToRelative(11.0f, 1.0f)
+ reflectiveCurveToRelative(-3.0f, -5.0f, -3.0f, -14.0f)
+ reflectiveCurveTo(112.5f, 278.5f, 109.5f, 276.5f)
+ close()
+ }
+private val pathData7 =
+ PathData {
+ moveTo(102.5f, 227.5f)
+ reflectiveCurveToRelative(-4.0f, 22.0f, 38.0f, 21.0f)
+ curveToRelative(0.0f, 0.0f, 56.0f, 2.0f, 57.0f, -26.0f)
+ reflectiveCurveToRelative(-69.0f, -14.0f, -69.0f, -14.0f)
+ reflectiveCurveTo(106.5f, 214.5f, 102.5f, 227.5f)
+ close()
+ }
+private val pathData20 =
+ PathData {
+ moveTo(217.85f, 223.44f)
+ reflectiveCurveToRelative(9.65f, 6.06f, 7.65f, 17.06f)
+ reflectiveCurveToRelative(-8.0f, 16.09f, -17.0f, 18.54f)
+ verticalLineToRelative(9.46f)
+ reflectiveCurveToRelative(24.08f, -0.06f, 25.0f, -22.53f)
+ curveTo(233.54f, 246.0f, 236.21f, 233.39f, 217.85f, 223.44f)
+ close()
+ moveTo(90.5f, 270.5f)
+ reflectiveCurveToRelative(7.0f, 25.0f, 0.0f, 32.0f)
+ lineToRelative(7.0f, -1.0f)
+ verticalLineToRelative(-31.0f)
+ lineToRelative(-8.76f, -3.76f)
+ close()
+ moveTo(85.5f, 273.5f)
+ reflectiveCurveToRelative(5.0f, 22.0f, -2.0f, 29.0f)
+ reflectiveCurveToRelative(-4.6f, -3.27f, -4.6f, -3.27f)
+ reflectiveCurveToRelative(4.73f, -4.71f, 5.66f, -15.22f)
+ lineToRelative(0.94f, -10.51f)
+ moveTo(225.8f, 272.89f)
+ reflectiveCurveToRelative(-12.3f, -6.39f, -12.3f, 0.61f)
+ reflectiveCurveToRelative(11.0f, 28.0f, 14.0f, 31.0f)
+ reflectiveCurveToRelative(-6.0f, 0.0f, -6.0f, 0.0f)
+ reflectiveCurveToRelative(-10.71f, -12.76f, -12.36f, -19.88f)
+ reflectiveCurveToRelative(-0.64f, -16.12f, -0.64f, -16.12f)
+ lineToRelative(16.4f, -5.2f)
+ close()
+ moveTo(197.51f, 304.5f)
+ reflectiveCurveToRelative(4.0f, -34.0f, 0.0f, -53.0f)
+ curveToRelative(-2.39f, -11.36f, -2.58f, -11.5f, -2.55f, -11.32f)
+ curveToRelative(0.0f, 0.0f, 8.57f, -4.37f, 10.06f, -17.0f)
+ reflectiveCurveToRelative(3.49f, 45.35f, 3.49f, 45.35f)
+ verticalLineToRelative(37.0f)
+ close()
+
+ moveTo(151.5f, 183.5f)
+ arcToRelative(14.82f, 14.82f, 0.0f, false, false, 0.0f, 10.0f)
+ curveToRelative(2.0f, 5.0f, 5.0f, 18.0f, 4.0f, 24.0f)
+ arcToRelative(61.38f, 61.38f, 0.0f, false, true, -2.35f, 9.74f)
+ reflectiveCurveToRelative(9.35f, -4.74f, 8.35f, -9.74f)
+ reflectiveCurveToRelative(-2.37f, -8.51f, -3.18f, -17.76f)
+ arcToRelative(104.59f, 104.59f, 0.0f, false, true, 0.18f, -18.24f)
+ horizontalLineToRelative(-6.4f)
+ close()
+ }
+private val pathData32 =
+ PathData {
+ moveTo(224.9f, 263.3f)
+ reflectiveCurveToRelative(-1.4f, 20.2f, 16.6f, 39.2f)
+ horizontalLineToRelative(-22.0f)
+ reflectiveCurveToRelative(-7.35f, -6.33f, -11.18f, -20.67f)
+ lineToRelative(0.18f, -13.33f)
+ reflectiveCurveTo(218.3f, 268.1f, 224.9f, 263.3f)
+ close()
+ moveTo(76.5f, 302.5f)
+ reflectiveCurveToRelative(9.0f, -10.0f, 8.0f, -24.0f)
+ lineToRelative(-1.0f, -14.0f)
+ lineToRelative(14.0f, 6.0f)
+ reflectiveCurveToRelative(2.0f, 24.0f, 0.0f, 31.0f)
+ reflectiveCurveTo(76.5f, 302.5f, 76.5f, 302.5f)
+ close()
+ moveTo(139.5f, 181.5f)
+ lineToRelative(1.0f, 39.0f)
+ reflectiveCurveToRelative(0.0f, 7.0f, 10.0f, 7.0f)
+ reflectiveCurveToRelative(11.0f, -10.0f, 11.0f, -10.0f)
+ arcToRelative(155.16f, 155.16f, 0.0f, false, true, -3.0f, -16.0f)
+ curveToRelative(-1.0f, -8.0f, 0.0f, -20.0f, 0.0f, -20.0f)
+ horizontalLineToRelative(-19.0f)
+ close()
+ }
+private val pathData33 =
+ PathData {
+ moveTo(158.0f, 185.5f)
+ reflectiveCurveToRelative(0.33f, 3.92f, -18.35f, 2.0f)
+ moveTo(158.0f, 197.5f)
+ reflectiveCurveToRelative(0.0f, 6.0f, -17.5f, 1.0f)
+ moveTo(160.0f, 210.5f)
+ reflectiveCurveToRelative(-2.35f, 7.0f, -20.0f, 2.0f)
+ moveTo(215.68f, 298.0f)
+ reflectiveCurveToRelative(4.82f, -4.52f, 10.82f, -4.52f)
+ arcToRelative(18.1f, 18.1f, 0.0f, false, true, 9.41f, 2.26f)
+ moveTo(208.5f, 281.5f)
+ arcToRelative(10.58f, 10.58f, 0.0f, false, true, 11.0f, -6.0f)
+ curveToRelative(8.0f, 1.0f, 7.71f, 3.0f, 7.71f, 3.0f)
+ moveTo(97.5f, 298.5f)
+ reflectiveCurveToRelative(-2.26f, -5.48f, -16.63f, -2.74f)
+ moveTo(97.5f, 282.5f)
+ reflectiveCurveToRelative(-3.87f, -3.0f, -12.94f, -1.0f)
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Body9Huge.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Body9Huge.kt
new file mode 100644
index 000000000..dca2c4f31
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Body9Huge.kt
@@ -0,0 +1,346 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.Gray
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Body9HugePreview() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ body9Huge(SolidColor(Color.Yellow), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun body9Huge(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ // body
+ builder.addPath(pathData4, fill = fgColor)
+ builder.addPath(pathData1, fill = fgColor, stroke = Black, strokeLineWidth = 1.0f)
+
+ // base neck
+ builder.addPath(pathData7, fill = Black, stroke = Black, fillAlpha = 0.6f, strokeLineWidth = 1.0f)
+
+ // neck
+ builder.addPath(pathData11, fill = Gray, stroke = Black, strokeLineWidth = 1.0f)
+ builder.addPath(pathData10, fill = SolidColor(Color.White), fillAlpha = 0.7f)
+
+ // neck base shade
+ builder.addPath(pathData17, fill = Black, fillAlpha = 0.4f)
+
+ // left body shade
+ builder.addPath(pathData18, fill = SolidColor(Color.White), fillAlpha = 0.7f)
+
+ // left arm shades
+ builder.addPath(pathData20, fill = Black, fillAlpha = 0.4f)
+ builder.addPath(pathData23, fill = Black, fillAlpha = 0.4f)
+ builder.addPath(pathData22, fill = Black, fillAlpha = 0.2f, stroke = Black, strokeAlpha = 0.1f, strokeLineWidth = 1f)
+
+ // right arm shade
+ builder.addPath(pathData24, fill = Black, fillAlpha = 0.4f, stroke = Black, strokeLineWidth = 1.0f)
+
+ // right body shade
+ builder.addPath(pathData26, fill = Black, fillAlpha = 0.4f)
+
+ // Neck shade
+ builder.addPath(pathData12, fill = SolidColor(Color(0xFF58595b)))
+
+ // Shoulder lines
+ builder.addPath(pathData21, stroke = Black, strokeLineWidth = 0.75f)
+
+ // Joints and body divisions
+ builder.addPath(pathData13, stroke = Black, strokeLineWidth = 1.0f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(222.5f, 301.5f)
+ reflectiveCurveToRelative(-10.0f, -35.0f, 11.0f, -53.0f)
+ reflectiveCurveToRelative(58.0f, -15.0f, 70.0f, 2.0f)
+ reflectiveCurveToRelative(2.0f, 51.0f, 2.0f, 51.0f)
+ close()
+ moveTo(83.5f, 254.5f)
+ reflectiveCurveToRelative(-6.0f, 28.0f, 67.0f, 26.0f)
+ reflectiveCurveToRelative(77.0f, -30.0f, 76.0f, -36.0f)
+ reflectiveCurveToRelative(-12.3f, -10.12f, -26.0f, -13.0f)
+ curveToRelative(0.0f, 5.0f, 1.0f, 22.0f, 1.0f, 22.0f)
+ reflectiveCurveToRelative(-8.0f, 13.0f, -46.0f, 17.0f)
+ curveToRelative(-29.0f, 1.0f, -45.0f, -9.0f, -45.0f, -9.0f)
+ reflectiveCurveToRelative(-1.5f, -16.0f, -2.5f, -23.13f)
+ curveTo(96.5f, 241.75f, 85.5f, 247.5f, 83.5f, 254.5f)
+ close()
+ moveTo(110.5f, 261.5f)
+ reflectiveCurveToRelative(20.0f, 11.0f, 44.0f, 9.0f)
+ reflectiveCurveToRelative(36.0f, -7.0f, 47.0f, -17.0f)
+ lineToRelative(-1.0f, -24.0f)
+ arcToRelative(10.53f, 10.53f, 0.0f, false, true, -0.31f, 4.41f)
+ curveToRelative(-0.69f, 1.59f, -4.63f, 16.78f, -42.16f, 19.68f)
+ reflectiveCurveToRelative(-47.0f, -4.1f, -50.0f, -16.1f)
+ close()
+ moveTo(108.0f, 237.0f)
+ reflectiveCurveToRelative(-1.0f, 20.0f, 45.0f, 17.0f)
+ reflectiveCurveToRelative(48.5f, -20.5f, 47.5f, -24.5f)
+ curveToRelative(-0.91f, -3.63f, -13.68f, -10.56f, -39.0f, -9.56f)
+ curveToRelative(0.0f, 0.56f, 0.26f, 3.3f, 0.26f, 3.3f)
+ curveToRelative(1.74f, 9.26f, 0.74f, 15.26f, -9.26f, 16.26f)
+ curveToRelative(-3.41f, 0.33f, -10.0f, -5.0f, -10.0f, -5.0f)
+ reflectiveCurveToRelative(-1.0f, -8.0f, -1.0f, -13.0f)
+ curveTo(120.38f, 224.59f, 108.41f, 230.0f, 108.0f, 237.0f)
+ close()
+
+ moveTo(87.5f, 247.5f)
+ reflectiveCurveToRelative(-19.0f, -10.0f, -37.0f, -5.0f)
+ reflectiveCurveToRelative(-29.0f, 20.0f, -32.0f, 37.0f)
+ curveToRelative(-1.0f, 11.0f, 1.0f, 16.0f, 3.0f, 20.0f)
+ horizontalLineToRelative(64.0f)
+ reflectiveCurveToRelative(2.0f, -5.0f, 0.0f, -16.0f)
+ reflectiveCurveToRelative(-3.0f, -23.0f, -2.0f, -29.0f)
+ reflectiveCurveTo(87.5f, 247.5f, 87.5f, 247.5f)
+ close()
+ }
+private val pathData4 =
+ PathData {
+ moveTo(83.5f, 250.0f)
+ horizontalLineToRelative(143.5f)
+ verticalLineToRelative(58.5f)
+ horizontalLineToRelative(-143.5f)
+ close()
+ }
+private val pathData7 =
+ PathData {
+ moveTo(108.0f, 237.0f)
+ reflectiveCurveToRelative(-1.0f, 20.0f, 45.0f, 17.0f)
+ reflectiveCurveToRelative(48.5f, -20.5f, 47.5f, -24.5f)
+ curveToRelative(-0.91f, -3.63f, -13.68f, -10.56f, -39.0f, -9.56f)
+ curveToRelative(0.0f, 0.56f, 0.26f, 3.3f, 0.26f, 3.3f)
+ curveToRelative(1.74f, 9.26f, 0.74f, 15.26f, -9.26f, 16.26f)
+ curveToRelative(-3.41f, 0.33f, -10.0f, -5.0f, -10.0f, -5.0f)
+ reflectiveCurveToRelative(-1.0f, -8.0f, -1.0f, -13.0f)
+ curveTo(120.38f, 224.59f, 108.41f, 230.0f, 108.0f, 237.0f)
+ close()
+ }
+private val pathData9 =
+ PathData {
+ moveTo(193.37f, 260.15f)
+ curveToRelative(-6.66f, 3.83f, -18.28f, 8.29f, -37.87f, 10.35f)
+ curveToRelative(-29.0f, 1.0f, -45.0f, -9.0f, -45.0f, -9.0f)
+ reflectiveCurveToRelative(-1.5f, -16.0f, -2.5f, -23.13f)
+ curveToRelative(-11.5f, 3.38f, -22.5f, 9.13f, -24.5f, 16.13f)
+ curveToRelative(0.0f, 0.0f, -6.0f, 28.0f, 67.0f, 26.0f)
+ curveToRelative(29.58f, -0.81f, 47.84f, -5.89f, 59.0f, -12.0f)
+ close()
+ }
+private val pathData10 =
+ PathData {
+ moveTo(83.5f, 254.5f)
+ reflectiveCurveToRelative(-6.0f, 28.0f, 67.0f, 26.0f)
+ curveToRelative(29.58f, -0.81f, 47.84f, -5.89f, 59.0f, -12.0f)
+ curveToRelative(-5.5f, -2.5f, -10.5f, -5.5f, -16.13f, -8.35f)
+ curveToRelative(-6.66f, 3.83f, -18.28f, 8.29f, -37.87f, 10.35f)
+ curveToRelative(-29.0f, 1.0f, -45.0f, -9.0f, -45.0f, -9.0f)
+ reflectiveCurveToRelative(-1.5f, -16.0f, -2.5f, -23.13f)
+ curveTo(96.5f, 241.75f, 85.5f, 247.5f, 83.5f, 254.5f)
+ close()
+ }
+private val pathData11 =
+ PathData {
+ moveTo(141.5f, 190.5f)
+ verticalLineToRelative(29.0f)
+ arcToRelative(142.25f, 142.25f, 0.0f, false, false, 1.0f, 15.0f)
+ arcToRelative(9.78f, 9.78f, 0.0f, false, false, 10.0f, 5.0f)
+ curveToRelative(7.0f, -1.0f, 11.0f, -4.0f, 10.0f, -11.0f)
+ curveToRelative(-0.36f, -2.54f, -0.73f, -5.0f, -1.0f, -7.56f)
+ arcToRelative(138.9f, 138.9f, 0.0f, false, true, -1.0f, -17.44f)
+ verticalLineToRelative(-14.0f)
+ arcTo(69.37f, 69.37f, 0.0f, false, false, 141.5f, 190.5f)
+ close()
+ }
+private val pathData12 =
+ PathData {
+ moveTo(152.5f, 190.5f)
+ reflectiveCurveToRelative(0.0f, 7.0f, 2.0f, 12.0f)
+ arcToRelative(55.9f, 55.9f, 0.0f, false, true, 3.13f, 17.34f)
+ curveToRelative(-0.12f, 3.66f, 0.88f, 15.66f, -3.12f, 17.66f)
+ reflectiveCurveToRelative(-2.0f, 2.0f, -2.0f, 2.0f)
+ reflectiveCurveToRelative(7.0f, -1.57f, 8.48f, -3.79f)
+ reflectiveCurveToRelative(1.94f, -3.24f, 1.23f, -9.23f)
+ arcToRelative(177.33f, 177.33f, 0.0f, false, true, -1.71f, -24.86f)
+ verticalLineTo(189.5f)
+ arcToRelative(37.46f, 37.46f, 0.0f, false, false, -6.17f, -0.25f)
+ lineToRelative(-1.83f, 0.25f)
+ close()
+ }
+private val pathData13 =
+ PathData {
+ moveTo(141.5f, 190.5f)
+ verticalLineToRelative(29.0f)
+ arcToRelative(142.25f, 142.25f, 0.0f, false, false, 1.0f, 15.0f)
+ arcToRelative(9.78f, 9.78f, 0.0f, false, false, 10.0f, 5.0f)
+ curveToRelative(7.0f, -1.0f, 11.0f, -4.0f, 10.0f, -11.0f)
+ curveToRelative(-0.36f, -2.54f, -0.73f, -5.0f, -1.0f, -7.56f)
+ arcToRelative(138.9f, 138.9f, 0.0f, false, true, -1.0f, -17.44f)
+ verticalLineToRelative(-14.0f)
+ arcTo(69.37f, 69.37f, 0.0f, false, false, 141.5f, 190.5f)
+ close()
+ moveTo(161.25f, 222.25f)
+ reflectiveCurveToRelative(-2.67f, 3.25f, -9.51f, 3.25f)
+ reflectiveCurveToRelative(-10.13f, -2.0f, -10.13f, -2.0f)
+ moveTo(160.0f, 208.5f)
+ reflectiveCurveToRelative(-3.0f, 3.0f, -9.06f, 3.0f)
+ reflectiveCurveTo(142.0f, 210.0f, 142.0f, 210.0f)
+ moveTo(160.0f, 197.5f)
+ reflectiveCurveToRelative(-2.0f, 2.0f, -8.06f, 2.0f)
+ arcTo(86.48f, 86.48f, 0.0f, false, true, 142.0f, 199.0f)
+
+ // body
+ moveTo(209.51f, 268.45f)
+ reflectiveCurveToRelative(18.0f, -9.0f, 17.0f, -24.0f)
+ lineToRelative(0.74f, 11.0f)
+ arcToRelative(39.65f, 39.65f, 0.0f, false, false, -7.12f, 24.19f)
+ curveToRelative(0.38f, 14.81f, 2.38f, 21.81f, 2.38f, 21.81f)
+ horizontalLineToRelative(-12.0f)
+ moveTo(83.5f, 254.5f)
+ reflectiveCurveToRelative(-6.0f, 28.0f, 67.0f, 26.0f)
+ reflectiveCurveToRelative(77.0f, -30.0f, 76.0f, -36.0f)
+ reflectiveCurveToRelative(-12.3f, -10.12f, -26.0f, -13.0f)
+ curveToRelative(0.0f, 5.0f, 1.0f, 22.0f, 1.0f, 22.0f)
+ reflectiveCurveToRelative(-8.0f, 13.0f, -46.0f, 17.0f)
+ curveToRelative(-29.0f, 1.0f, -45.0f, -9.0f, -45.0f, -9.0f)
+ reflectiveCurveToRelative(-1.5f, -16.0f, -2.5f, -23.13f)
+ curveTo(96.5f, 241.75f, 85.5f, 247.5f, 83.5f, 254.5f)
+ close()
+ }
+private val pathData17 =
+ PathData {
+ moveTo(188.0f, 246.51f)
+ lineTo(189.52f, 262.0f)
+ reflectiveCurveToRelative(6.63f, -4.0f, 9.06f, -6.0f)
+ lineToRelative(2.42f, -2.0f)
+ reflectiveCurveToRelative(0.72f, 0.24f, 0.36f, -3.88f)
+ reflectiveCurveToRelative(-0.79f, -17.93f, -0.79f, -17.93f)
+ reflectiveCurveTo(200.0f, 240.0f, 188.0f, 246.51f)
+ close()
+ }
+private val pathData18 =
+ PathData {
+ moveTo(84.0f, 273.63f)
+ reflectiveCurveTo(97.0f, 277.0f, 97.0f, 285.0f)
+ reflectiveCurveToRelative(-1.0f, 9.0f, 0.0f, 14.0f)
+ reflectiveCurveToRelative(0.0f, 4.0f, 0.0f, 4.0f)
+ horizontalLineTo(84.0f)
+ reflectiveCurveToRelative(3.32f, -3.0f, 2.41f, -11.26f)
+ reflectiveCurveTo(85.0f, 279.5f, 85.0f, 279.5f)
+ close()
+ }
+private val pathData19 =
+ PathData {
+ moveTo(87.5f, 247.5f)
+ reflectiveCurveToRelative(-19.0f, -10.0f, -37.0f, -5.0f)
+ reflectiveCurveToRelative(-29.0f, 20.0f, -32.0f, 37.0f)
+ curveToRelative(-1.0f, 11.0f, 1.0f, 16.0f, 3.0f, 20.0f)
+ horizontalLineToRelative(64.0f)
+ reflectiveCurveToRelative(2.0f, -5.0f, 0.0f, -16.0f)
+ reflectiveCurveToRelative(-3.0f, -23.0f, -2.0f, -29.0f)
+ reflectiveCurveTo(87.5f, 247.5f, 87.5f, 247.5f)
+ close()
+ }
+private val pathData20 =
+ PathData {
+ moveTo(87.5f, 247.5f)
+ arcToRelative(63.65f, 63.65f, 0.0f, false, false, -25.06f, -6.39f)
+ curveToRelative(7.06f, 2.39f, 3.06f, 8.39f, -8.94f, 13.39f)
+ curveToRelative(-11.0f, 6.0f, -23.0f, 10.0f, -27.5f, 32.5f)
+ curveToRelative(-0.67f, 7.37f, 0.84f, 13.18f, 1.5f, 14.5f)
+ lineToRelative(58.0f, -2.0f)
+ reflectiveCurveToRelative(2.0f, -5.0f, 0.0f, -16.0f)
+ reflectiveCurveToRelative(-3.0f, -23.0f, -2.0f, -29.0f)
+ reflectiveCurveTo(87.5f, 247.5f, 87.5f, 247.5f)
+ close()
+ }
+private val pathData21 =
+ PathData {
+ moveTo(33.5f, 299.5f)
+ reflectiveCurveToRelative(-7.0f, -19.0f, -3.0f, -35.0f)
+ arcToRelative(28.63f, 28.63f, 0.0f, false, true, 17.0f, -21.06f)
+ moveTo(292.5f, 241.5f)
+ reflectiveCurveToRelative(-12.0f, -1.0f, -13.0f, 15.0f)
+ curveToRelative(-1.0f, 14.0f, 4.0f, 41.0f, 7.0f, 45.0f)
+ }
+private val pathData22 =
+ PathData {
+ moveTo(62.44f, 241.12f)
+ arcToRelative(3.46f, 3.46f, 0.0f, false, true, 3.06f, 3.38f)
+ curveToRelative(0.0f, 3.0f, 0.0f, 4.0f, -10.0f, 9.0f)
+ reflectiveCurveToRelative(-21.45f, 10.0f, -26.22f, 21.0f)
+ reflectiveCurveToRelative(-2.62f, 25.0f, -2.62f, 25.0f)
+ horizontalLineTo(21.5f)
+ lineToRelative(-3.0f, -20.0f)
+ reflectiveCurveTo(27.38f, 241.73f, 62.44f, 241.12f)
+ close()
+ }
+private val pathData23 =
+ PathData {
+ moveTo(84.26f, 275.62f)
+ arcTo(31.64f, 31.64f, 0.0f, false, true, 80.5f, 290.5f)
+ arcToRelative(19.71f, 19.71f, 0.0f, false, true, -11.14f, 8.83f)
+ lineToRelative(16.14f, 0.17f)
+ reflectiveCurveToRelative(1.42f, -2.62f, 0.71f, -10.81f)
+ arcTo(90.57f, 90.57f, 0.0f, false, false, 84.26f, 275.62f)
+ close()
+ }
+private val pathData24 =
+ PathData {
+ moveTo(222.5f, 301.5f)
+ reflectiveCurveToRelative(-10.0f, -35.0f, 11.0f, -53.0f)
+ reflectiveCurveToRelative(58.0f, -15.0f, 70.0f, 2.0f)
+ reflectiveCurveToRelative(2.0f, 51.0f, 2.0f, 51.0f)
+ close()
+ }
+private val pathData26 =
+ PathData {
+ moveTo(226.5f, 244.5f)
+ lineToRelative(0.74f, 11.0f)
+ arcToRelative(39.65f, 39.65f, 0.0f, false, false, -7.12f, 24.19f)
+ curveToRelative(0.38f, 14.81f, 2.38f, 21.81f, 2.38f, 21.81f)
+ horizontalLineToRelative(-12.0f)
+ reflectiveCurveToRelative(1.0f, -9.0f, 0.5f, -14.5f)
+ reflectiveCurveToRelative(-1.49f, -18.55f, -1.49f, -18.55f)
+ reflectiveCurveTo(227.5f, 259.5f, 226.5f, 244.5f)
+ close()
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Eyes0Squint.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Eyes0Squint.kt
new file mode 100644
index 000000000..ce27ce547
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Eyes0Squint.kt
@@ -0,0 +1,115 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.Brown
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Eyes0Squint() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ eyes0Squint(SolidColor(Color.Blue), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun eyes0Squint(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ builder.addPath(pathData1, fill = fgColor)
+ builder.addPath(pathData3, fill = Black, stroke = Black, fillAlpha = 0.4f, strokeLineWidth = 1.0f)
+ builder.addPath(pathData4, fill = Brown, stroke = Black, strokeLineWidth = 0.5f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(144.5f, 141.5f)
+ reflectiveCurveToRelative(5.0f, 9.0f, 9.0f, 7.0f)
+ reflectiveCurveToRelative(13.0f, -9.0f, 13.0f, -9.0f)
+ verticalLineToRelative(-9.0f)
+ reflectiveCurveToRelative(-2.0f, -1.0f, -7.0f, 0.0f)
+ reflectiveCurveToRelative(-14.0f, 5.0f, -14.0f, 5.0f)
+ reflectiveCurveTo(142.5f, 137.5f, 144.5f, 141.5f)
+ close()
+ moveTo(118.0f, 141.0f)
+ lineToRelative(-5.0f, 10.0f)
+ reflectiveCurveToRelative(-7.5f, -2.5f, -10.5f, -4.5f)
+ reflectiveCurveToRelative(-4.0f, -3.0f, -4.0f, -6.0f)
+ lineToRelative(1.0f, -3.0f)
+ arcToRelative(13.6f, 13.6f, 0.0f, false, true, 7.0f, 0.0f)
+ curveToRelative(4.0f, 1.0f, 11.0f, 2.0f, 11.0f, 2.0f)
+ reflectiveCurveTo(118.5f, 139.5f, 118.0f, 141.0f)
+ close()
+ }
+private val pathData3 =
+ PathData {
+ moveTo(144.5f, 141.5f)
+ reflectiveCurveToRelative(5.0f, 9.0f, 9.0f, 7.0f)
+ reflectiveCurveToRelative(13.0f, -9.0f, 13.0f, -9.0f)
+ verticalLineToRelative(-9.0f)
+ reflectiveCurveToRelative(-2.0f, -1.0f, -7.0f, 0.0f)
+ reflectiveCurveToRelative(-14.0f, 5.0f, -14.0f, 5.0f)
+ reflectiveCurveTo(142.5f, 137.5f, 144.5f, 141.5f)
+ close()
+ moveTo(118.0f, 141.0f)
+ lineToRelative(-5.0f, 10.0f)
+ reflectiveCurveToRelative(-7.5f, -2.5f, -10.5f, -4.5f)
+ reflectiveCurveToRelative(-4.0f, -3.0f, -4.0f, -6.0f)
+ lineToRelative(1.0f, -3.0f)
+ arcToRelative(13.6f, 13.6f, 0.0f, false, true, 7.0f, 0.0f)
+ arcToRelative(37.46f, 37.46f, 0.0f, false, false, 8.0f, 1.0f)
+ reflectiveCurveTo(118.5f, 139.5f, 118.0f, 141.0f)
+ close()
+ }
+private val pathData4 =
+ PathData {
+ moveTo(144.5f, 139.5f)
+ reflectiveCurveToRelative(2.0f, 2.0f, 6.0f, 1.0f)
+ reflectiveCurveToRelative(10.0f, -6.0f, 12.0f, -7.0f)
+ arcToRelative(18.66f, 18.66f, 0.0f, false, false, 4.0f, -3.0f)
+ reflectiveCurveToRelative(-3.22f, -1.0f, -9.11f, 0.52f)
+ arcToRelative(67.92f, 67.92f, 0.0f, false, false, -11.89f, 4.48f)
+ reflectiveCurveTo(142.5f, 137.5f, 144.5f, 139.5f)
+ close()
+ moveTo(100.5f, 139.5f)
+ lineToRelative(6.0f, 3.0f)
+ curveToRelative(2.0f, 1.0f, 9.7f, 2.6f, 11.35f, -1.2f)
+ reflectiveCurveToRelative(-11.6f, -4.69f, -16.0f, -4.24f)
+ curveToRelative(0.0f, 0.0f, -3.0f, -0.17f, -2.67f, 0.94f)
+ arcTo(2.3f, 2.3f, 0.0f, false, false, 100.5f, 139.5f)
+ close()
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Eyes1Round.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Eyes1Round.kt
new file mode 100644
index 000000000..700dac56f
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Eyes1Round.kt
@@ -0,0 +1,137 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.Brown
+import com.vitorpamplona.amethyst.commons.DarkYellow
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Eyes1Round() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ eyes1Round(SolidColor(Color.Blue), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun eyes1Round(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ builder.addPath(pathData1, fill = fgColor)
+ builder.addPath(pathData3, fill = Black, stroke = Black, fillAlpha = 0.2f, strokeLineWidth = 0.5f)
+ builder.addPath(pathData4, fill = Black, stroke = Black, fillAlpha = 0.4f, strokeLineWidth = 1.0f)
+ builder.addPath(pathData7, fill = Brown, stroke = Black, strokeLineWidth = 0.5f)
+ builder.addPath(pathData9, fill = DarkYellow)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(110.5f, 122.5f)
+ curveToRelative(-4.0f, 0.0f, -17.0f, 2.0f, -17.0f, 17.0f)
+ reflectiveCurveToRelative(10.0f, 17.0f, 17.0f, 17.0f)
+ reflectiveCurveToRelative(15.0f, -5.0f, 15.0f, -18.0f)
+ reflectiveCurveTo(114.5f, 122.5f, 110.5f, 122.5f)
+ close()
+ moveTo(153.5f, 121.5f)
+ curveToRelative(-4.0f, 0.0f, -17.5f, 2.5f, -17.5f, 17.5f)
+ reflectiveCurveToRelative(10.5f, 16.5f, 17.5f, 16.5f)
+ reflectiveCurveToRelative(16.0f, -5.0f, 16.0f, -18.0f)
+ curveTo(167.0f, 122.0f, 157.5f, 121.5f, 153.5f, 121.5f)
+ close()
+ }
+private val pathData3 =
+ PathData {
+ moveTo(110.5f, 126.5f)
+ reflectiveCurveToRelative(-13.0f, 0.0f, -13.0f, 12.0f)
+ reflectiveCurveToRelative(10.0f, 13.0f, 13.0f, 13.0f)
+ reflectiveCurveToRelative(12.0f, -2.0f, 12.0f, -14.52f)
+ curveTo(122.5f, 137.0f, 121.5f, 127.5f, 110.5f, 126.5f)
+ close()
+ moveTo(140.1f, 137.73f)
+ reflectiveCurveToRelative(-2.0f, 13.2f, 12.18f, 13.2f)
+ reflectiveCurveToRelative(14.22f, -10.15f, 14.22f, -13.2f)
+ reflectiveCurveToRelative(-3.0f, -12.18f, -12.18f, -12.18f)
+ reflectiveCurveTo(140.1f, 132.65f, 140.1f, 137.73f)
+ close()
+ }
+private val pathData4 =
+ PathData {
+ moveTo(154.5f, 121.5f)
+ reflectiveCurveToRelative(-20.0f, 0.0f, -19.0f, 18.0f)
+ reflectiveCurveToRelative(19.0f, 16.0f, 19.0f, 16.0f)
+ reflectiveCurveToRelative(16.0f, -2.0f, 15.0f, -17.0f)
+ reflectiveCurveTo(158.5f, 121.5f, 154.5f, 121.5f)
+ close()
+ moveTo(110.5f, 122.5f)
+ curveToRelative(-4.0f, 0.0f, -17.0f, 2.0f, -17.0f, 17.0f)
+ reflectiveCurveToRelative(10.0f, 17.0f, 17.0f, 17.0f)
+ reflectiveCurveToRelative(15.0f, -5.0f, 15.0f, -18.0f)
+ reflectiveCurveTo(114.5f, 122.5f, 110.5f, 122.5f)
+ close()
+ }
+private val pathData7 =
+ PathData {
+ moveTo(109.0f, 127.0f)
+ reflectiveCurveToRelative(-9.0f, 1.0f, -9.0f, 9.0f)
+ reflectiveCurveToRelative(2.5f, 12.5f, 10.5f, 12.5f)
+ reflectiveCurveToRelative(12.0f, -5.0f, 12.0f, -10.0f)
+ reflectiveCurveTo(117.5f, 126.5f, 109.0f, 127.0f)
+ close()
+ moveTo(154.0f, 126.0f)
+ reflectiveCurveToRelative(-10.5f, 0.52f, -11.0f, 9.4f)
+ reflectiveCurveTo(147.0f, 149.0f, 154.0f, 149.0f)
+ reflectiveCurveToRelative(12.0f, -6.26f, 12.0f, -11.49f)
+ reflectiveCurveTo(161.5f, 125.51f, 154.0f, 126.0f)
+ close()
+ }
+private val pathData9 =
+ PathData {
+ moveTo(110.26f, 134.06f)
+ arcToRelative(0.92f, 0.92f, 0.0f, false, false, -0.24f, 0.05f)
+ curveToRelative(-0.36f, 0.13f, -1.0f, 0.61f, -1.0f, 2.31f)
+ curveToRelative(0.0f, 2.36f, 0.0f, 3.54f, 1.26f, 3.54f)
+ reflectiveCurveToRelative(2.51f, 0.0f, 2.51f, -3.54f)
+ curveTo(112.77f, 134.06f, 111.12f, 133.86f, 110.26f, 134.06f)
+ close()
+ moveTo(154.26f, 134.06f)
+ arcToRelative(0.92f, 0.92f, 0.0f, false, false, -0.24f, 0.05f)
+ curveToRelative(-0.36f, 0.13f, -1.0f, 0.61f, -1.0f, 2.31f)
+ curveToRelative(0.0f, 2.36f, 0.0f, 3.54f, 1.26f, 3.54f)
+ reflectiveCurveToRelative(2.51f, 0.0f, 2.51f, -3.54f)
+ curveTo(156.77f, 134.06f, 155.12f, 133.86f, 154.26f, 134.06f)
+ close()
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Eyes2Single.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Eyes2Single.kt
new file mode 100644
index 000000000..3aea7c3c4
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Eyes2Single.kt
@@ -0,0 +1,153 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.Brown
+import com.vitorpamplona.amethyst.commons.LightRed
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Eyes2Single() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ eyes2Single(SolidColor(Color.Blue), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun eyes2Single(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ builder.addPath(pathData1, fill = fgColor)
+ builder.addPath(pathData2, fill = Black, fillAlpha = 0.4f, strokeAlpha = 0.4f)
+ builder.addPath(pathData3, fill = Black)
+ builder.addPath(pathData4, fill = Brown, stroke = Black, strokeLineWidth = 0.5f)
+ builder.addPath(pathData5, fill = LightRed, stroke = Black, strokeLineWidth = 0.5f)
+ builder.addPath(pathData6, fill = Black)
+ builder.addPath(pathData7, stroke = Black, strokeLineWidth = 0.75f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(135.5f, 123.5f)
+ reflectiveCurveToRelative(-34.0f, 1.0f, -35.0f, 17.0f)
+ reflectiveCurveToRelative(23.0f, 12.0f, 23.0f, 12.0f)
+ reflectiveCurveToRelative(23.0f, -2.0f, 28.0f, -3.0f)
+ reflectiveCurveToRelative(18.0f, -5.0f, 18.0f, -14.0f)
+ reflectiveCurveToRelative(-8.0f, -13.0f, -17.0f, -13.0f)
+ reflectiveCurveTo(139.5f, 123.5f, 135.5f, 123.5f)
+ close()
+ }
+private val pathData2 =
+ PathData {
+ moveTo(117.31f, 152.44f)
+ curveToRelative(-4.51f, 0.0f, -10.59f, -0.74f, -13.91f, -4.27f)
+ arcToRelative(9.8f, 9.8f, 0.0f, false, true, -2.41f, -7.64f)
+ curveToRelative(1.0f, -15.37f, 34.18f, -16.52f, 34.52f, -16.53f)
+ horizontalLineToRelative(0.0f)
+ curveToRelative(1.61f, 0.0f, 3.25f, -0.16f, 5.15f, -0.35f)
+ arcTo(107.89f, 107.89f, 0.0f, false, true, 152.5f, 123.0f)
+ curveToRelative(8.0f, 0.0f, 16.5f, 3.28f, 16.5f, 12.5f)
+ curveToRelative(0.0f, 9.71f, -15.8f, 13.15f, -17.6f, 13.51f)
+ curveToRelative(-4.92f, 1.0f, -27.72f, 3.0f, -27.95f, 3.0f)
+ arcToRelative(42.0f, 42.0f, 0.0f, false, true, -6.14f, 0.44f)
+ close()
+ }
+private val pathData3 =
+ PathData {
+ moveTo(152.5f, 123.5f)
+ curveToRelative(7.73f, 0.0f, 16.0f, 3.15f, 16.0f, 12.0f)
+ curveToRelative(0.0f, 7.56f, -10.81f, 11.74f, -17.2f, 13.0f)
+ curveToRelative(-4.89f, 1.0f, -27.66f, 3.0f, -27.89f, 3.0f)
+ horizontalLineToRelative(-0.08f)
+ arcToRelative(41.19f, 41.19f, 0.0f, false, true, -6.0f, 0.43f)
+ curveToRelative(-4.41f, 0.0f, -10.35f, -0.71f, -13.54f, -4.12f)
+ arcToRelative(9.32f, 9.32f, 0.0f, false, true, -2.27f, -7.27f)
+ curveToRelative(0.93f, -14.91f, 33.7f, -16.05f, 34.0f, -16.06f)
+ curveToRelative(1.65f, 0.0f, 3.3f, -0.17f, 5.22f, -0.36f)
+ arcToRelative(107.45f, 107.45f, 0.0f, false, true, 11.78f, -0.64f)
+ moveToRelative(0.0f, -1.0f)
+ curveToRelative(-9.0f, 0.0f, -13.0f, 1.0f, -17.0f, 1.0f)
+ curveToRelative(0.0f, 0.0f, -34.0f, 1.0f, -35.0f, 17.0f)
+ curveToRelative(-0.67f, 10.67f, 9.78f, 12.44f, 16.81f, 12.44f)
+ arcToRelative(41.73f, 41.73f, 0.0f, false, false, 6.19f, -0.44f)
+ reflectiveCurveToRelative(23.0f, -2.0f, 28.0f, -3.0f)
+ reflectiveCurveToRelative(18.0f, -5.0f, 18.0f, -14.0f)
+ reflectiveCurveToRelative(-8.0f, -13.0f, -17.0f, -13.0f)
+ close()
+ }
+private val pathData4 =
+ PathData {
+ moveTo(106.5f, 132.5f)
+ reflectiveCurveToRelative(-2.0f, 2.0f, -1.0f, 6.0f)
+ reflectiveCurveToRelative(2.0f, 9.0f, 16.0f, 8.0f)
+ arcToRelative(306.78f, 306.78f, 0.0f, false, false, 31.0f, -4.0f)
+ curveToRelative(6.0f, -1.0f, 16.0f, -1.5f, 17.0f, -6.25f)
+ reflectiveCurveToRelative(-2.18f, -11.89f, -12.09f, -13.32f)
+ reflectiveCurveToRelative(-12.93f, -0.11f, -16.92f, 0.23f)
+ reflectiveCurveToRelative(-8.25f, 0.45f, -11.62f, 0.89f)
+ reflectiveCurveToRelative(-16.37f, 2.44f, -22.37f, 8.44f)
+ }
+private val pathData5 =
+ PathData {
+ moveTo(134.0f, 124.0f)
+ reflectiveCurveToRelative(-4.0f, 2.0f, -4.0f, 6.0f)
+ reflectiveCurveToRelative(3.5f, 11.5f, 10.5f, 10.5f)
+ reflectiveCurveToRelative(9.0f, -5.0f, 9.0f, -11.0f)
+ reflectiveCurveToRelative(-6.58f, -6.54f, -6.58f, -6.54f)
+ reflectiveCurveToRelative(-3.42f, 0.54f, -4.42f, 0.54f)
+ reflectiveCurveTo(134.0f, 124.0f, 134.0f, 124.0f)
+ close()
+ }
+private val pathData6 =
+ PathData {
+ moveTo(138.0f, 130.5f)
+ arcToRelative(2.0f, 2.5f, 0.0f, true, false, 4.0f, 0.0f)
+ arcToRelative(2.0f, 2.5f, 0.0f, true, false, -4.0f, 0.0f)
+ close()
+ }
+private val pathData7 =
+ PathData {
+ moveTo(107.5f, 131.5f)
+ reflectiveCurveToRelative(-3.0f, 2.0f, -2.0f, 7.0f)
+ curveToRelative(1.0f, 4.0f, 2.0f, 9.0f, 16.0f, 8.0f)
+ arcToRelative(306.78f, 306.78f, 0.0f, false, false, 31.0f, -4.0f)
+ curveToRelative(6.0f, -1.0f, 16.0f, -1.5f, 17.0f, -6.25f)
+ reflectiveCurveToRelative(-2.18f, -11.89f, -12.09f, -13.32f)
+ reflectiveCurveToRelative(-12.93f, -0.11f, -16.92f, 0.23f)
+ reflectiveCurveToRelative(-8.25f, 0.45f, -11.62f, 0.89f)
+ reflectiveCurveToRelative(-15.37f, 1.44f, -21.37f, 7.44f)
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Eyes3Scott.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Eyes3Scott.kt
new file mode 100644
index 000000000..3d5ae3593
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Eyes3Scott.kt
@@ -0,0 +1,113 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.LightRed
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Eyes3Scott() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ eyes3Scott(SolidColor(Color.Blue), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun eyes3Scott(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ builder.addPath(pathData1, fill = fgColor)
+ builder.addPath(pathData2, fill = Black, fillAlpha = 0.4f)
+ builder.addPath(pathData3, fill = Black, stroke = Black, fillAlpha = 0.2f, strokeLineWidth = 1.0f)
+ builder.addPath(pathData4, stroke = Black, strokeLineWidth = 0.75f)
+ builder.addPath(pathData5, fill = LightRed, stroke = Black, strokeLineWidth = 0.75f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(127.5f, 127.5f)
+ curveToRelative(11.08f, -0.53f, 43.0f, -2.0f, 43.0f, 11.0f)
+ curveToRelative(1.0f, 15.0f, -16.69f, 15.0f, -23.34f, 15.52f)
+ reflectiveCurveToRelative(-37.66f, 1.48f, -47.66f, 0.48f)
+ reflectiveCurveToRelative(-15.0f, -4.0f, -15.0f, -12.0f)
+ reflectiveCurveToRelative(8.0f, -11.0f, 17.0f, -13.0f)
+ reflectiveCurveTo(121.0f, 127.81f, 127.5f, 127.5f)
+ close()
+ }
+private val pathData2 =
+ PathData {
+ moveTo(94.39f, 132.09f)
+ reflectiveCurveToRelative(2.78f, -4.25f, 37.95f, -4.92f)
+ reflectiveCurveToRelative(37.17f, 6.33f, 38.17f, 11.33f)
+ reflectiveCurveToRelative(-3.0f, 10.76f, -6.0f, 11.88f)
+ curveToRelative(0.0f, 0.0f, 5.52f, -6.38f, -2.24f, -11.63f)
+ reflectiveCurveToRelative(-22.72f, -6.58f, -29.74f, -6.91f)
+ reflectiveCurveToRelative(-24.86f, -0.88f, -27.94f, -0.61f)
+ reflectiveCurveTo(96.28f, 131.67f, 94.39f, 132.09f)
+ close()
+ }
+private val pathData3 =
+ PathData {
+ moveTo(127.5f, 127.5f)
+ curveToRelative(11.08f, -0.53f, 43.0f, -2.0f, 43.0f, 11.0f)
+ curveToRelative(1.0f, 15.0f, -16.69f, 15.0f, -23.34f, 15.52f)
+ reflectiveCurveToRelative(-37.66f, 1.48f, -47.66f, 0.48f)
+ reflectiveCurveToRelative(-15.0f, -4.0f, -15.0f, -12.0f)
+ reflectiveCurveToRelative(8.0f, -11.0f, 17.0f, -13.0f)
+ reflectiveCurveTo(121.0f, 127.81f, 127.5f, 127.5f)
+ close()
+ }
+private val pathData4 =
+ PathData {
+ moveTo(121.5f, 131.5f)
+ curveToRelative(-19.0f, 0.0f, -36.0f, -3.0f, -37.0f, 11.0f)
+ reflectiveCurveToRelative(19.0f, 12.0f, 40.0f, 12.0f)
+ reflectiveCurveToRelative(42.0f, 0.0f, 42.0f, -9.0f)
+ curveTo(166.5f, 134.5f, 140.5f, 131.5f, 121.5f, 131.5f)
+ close()
+ }
+private val pathData5 =
+ PathData {
+ moveTo(121.5f, 140.5f)
+ reflectiveCurveToRelative(29.0f, 0.0f, 32.0f, 1.0f)
+ reflectiveCurveToRelative(2.0f, 4.0f, -1.0f, 4.0f)
+ reflectiveCurveToRelative(-22.0f, -1.0f, -31.0f, -1.0f)
+ reflectiveCurveToRelative(-22.0f, 1.0f, -26.0f, 0.0f)
+ reflectiveCurveToRelative(-1.0f, -2.0f, 11.0f, -3.0f)
+ reflectiveCurveTo(121.5f, 140.5f, 121.5f, 140.5f)
+ close()
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Eyes4Roundsingle.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Eyes4Roundsingle.kt
new file mode 100644
index 000000000..bfffc81e9
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Eyes4Roundsingle.kt
@@ -0,0 +1,123 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.Brown
+import com.vitorpamplona.amethyst.commons.LightRed
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Eyes4RoundSingle() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ eyes4RoundSingle(SolidColor(Color.Blue), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun eyes4RoundSingle(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ builder.addPath(pathData1, fill = fgColor)
+ builder.addPath(pathData2, fill = Black, stroke = Black, fillAlpha = 0.4f, strokeLineWidth = 0.75f)
+ builder.addPath(pathData3, fill = Black, stroke = Black, fillAlpha = 0.4f, strokeLineWidth = 0.75f)
+ builder.addPath(pathData4, fill = Brown, stroke = Black, strokeLineWidth = 0.5f)
+ builder.addPath(pathData5, fill = LightRed)
+ builder.addPath(pathData6, fill = Brown, stroke = Black, strokeLineWidth = 0.75f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(131.5f, 119.5f)
+ curveToRelative(-5.0f, 0.0f, -19.0f, 2.0f, -19.0f, 16.0f)
+ curveToRelative(0.0f, 15.0f, 10.0f, 18.0f, 18.0f, 18.0f)
+ reflectiveCurveToRelative(17.0f, -7.0f, 16.0f, -19.0f)
+ reflectiveCurveTo(136.5f, 119.5f, 131.5f, 119.5f)
+ close()
+ }
+private val pathData2 =
+ PathData {
+ moveTo(131.5f, 119.5f)
+ curveToRelative(-5.0f, 0.0f, -19.0f, 2.0f, -19.0f, 16.0f)
+ curveToRelative(0.0f, 15.0f, 10.0f, 18.0f, 18.0f, 18.0f)
+ reflectiveCurveToRelative(17.0f, -7.0f, 16.0f, -19.0f)
+ reflectiveCurveTo(136.5f, 119.5f, 131.5f, 119.5f)
+ close()
+ }
+private val pathData3 =
+ PathData {
+ moveTo(132.0f, 124.0f)
+ lineToRelative(-0.5f, 0.0f)
+ curveToRelative(-2.51f, 0.0f, -13.61f, 0.38f, -14.5f, 11.0f)
+ curveToRelative(-1.0f, 12.0f, 8.5f, 13.5f, 12.5f, 13.5f)
+ reflectiveCurveToRelative(13.0f, -3.0f, 13.0f, -13.0f)
+ curveTo(142.5f, 124.5f, 132.0f, 124.0f, 132.0f, 124.0f)
+ close()
+ }
+private val pathData4 =
+ PathData {
+ moveTo(130.5f, 124.5f)
+ reflectiveCurveToRelative(-10.0f, 1.0f, -10.0f, 10.0f)
+ reflectiveCurveToRelative(5.0f, 11.0f, 11.0f, 11.0f)
+ arcToRelative(11.1f, 11.1f, 0.0f, false, false, 11.0f, -11.0f)
+ curveTo(142.5f, 128.5f, 136.5f, 124.5f, 130.5f, 124.5f)
+ close()
+ }
+private val pathData5 =
+ PathData {
+ moveTo(129.5f, 134.5f)
+ arcToRelative(2.0f, 3.0f, 0.0f, true, false, 4.0f, 0.0f)
+ arcToRelative(2.0f, 3.0f, 0.0f, true, false, -4.0f, 0.0f)
+ close()
+ }
+private val pathData6 =
+ PathData {
+ moveTo(147.5f, 133.5f)
+ horizontalLineToRelative(6.0f)
+ reflectiveCurveToRelative(1.0f, 0.0f, 0.0f, 1.0f)
+ arcToRelative(7.69f, 7.69f, 0.0f, false, true, -3.0f, 2.0f)
+ horizontalLineToRelative(-4.0f)
+ verticalLineToRelative(-2.0f)
+ close()
+ moveTo(112.49f, 135.15f)
+ arcToRelative(29.28f, 29.28f, 0.0f, false, true, -3.29f, 0.35f)
+ curveToRelative(-1.1f, 0.0f, -1.7f, 1.0f, -2.2f, 2.0f)
+ arcToRelative(0.79f, 0.79f, 0.0f, false, false, 0.2f, 0.57f)
+ arcToRelative(1.56f, 1.56f, 0.0f, false, false, 0.94f, 0.36f)
+ arcToRelative(18.66f, 18.66f, 0.0f, false, false, 2.15f, 0.07f)
+ curveToRelative(2.2f, 0.0f, 2.32f, -0.35f, 2.32f, -0.35f)
+ close()
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Eyes5Roundsmall.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Eyes5Roundsmall.kt
new file mode 100644
index 000000000..f5e0e7e0d
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Eyes5Roundsmall.kt
@@ -0,0 +1,119 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.Brown
+import com.vitorpamplona.amethyst.commons.LightRed
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Eyes5RoundSmall() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ eyes5RoundSmall(SolidColor(Color.Blue), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun eyes5RoundSmall(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ builder.addPath(pathData1, fill = fgColor)
+ builder.addPath(pathData3, fill = Black, stroke = Black, fillAlpha = 0.55f, strokeLineWidth = 0.75f)
+ builder.addPath(pathData4, fill = Brown, stroke = Black, strokeLineWidth = 0.5f)
+ builder.addPath(pathData5, fill = LightRed)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(112.71f, 130.0f)
+ lineToRelative(-0.49f, 0.0f)
+ curveToRelative(-2.46f, 0.0f, -13.35f, 0.38f, -14.22f, 11.0f)
+ curveToRelative(-1.0f, 12.0f, 8.33f, 13.5f, 12.26f, 13.5f)
+ reflectiveCurveToRelative(12.75f, -3.0f, 12.75f, -13.0f)
+ curveTo(123.0f, 130.5f, 112.71f, 130.0f, 112.71f, 130.0f)
+ close()
+ moveTo(156.71f, 130.0f)
+ lineToRelative(-0.49f, 0.0f)
+ curveToRelative(-2.46f, 0.0f, -13.35f, 0.38f, -14.22f, 11.0f)
+ curveToRelative(-1.0f, 12.0f, 8.33f, 13.5f, 12.26f, 13.5f)
+ reflectiveCurveToRelative(12.75f, -3.0f, 12.75f, -13.0f)
+ curveTo(167.0f, 130.5f, 156.71f, 130.0f, 156.71f, 130.0f)
+ close()
+ }
+private val pathData3 =
+ PathData {
+ moveTo(112.71f, 130.0f)
+ lineToRelative(-0.49f, 0.0f)
+ curveToRelative(-2.46f, 0.0f, -13.35f, 0.38f, -14.22f, 11.0f)
+ curveToRelative(-1.0f, 12.0f, 8.33f, 13.5f, 12.26f, 13.5f)
+ reflectiveCurveToRelative(12.75f, -3.0f, 12.75f, -13.0f)
+ curveTo(123.0f, 130.5f, 112.71f, 130.0f, 112.71f, 130.0f)
+ close()
+ moveTo(156.71f, 130.0f)
+ lineToRelative(-0.49f, 0.0f)
+ curveToRelative(-2.46f, 0.0f, -13.35f, 0.38f, -14.22f, 11.0f)
+ curveToRelative(-1.0f, 12.0f, 8.33f, 13.5f, 12.26f, 13.5f)
+ reflectiveCurveToRelative(12.75f, -3.0f, 12.75f, -13.0f)
+ curveTo(167.0f, 130.5f, 156.71f, 130.0f, 156.71f, 130.0f)
+ close()
+ }
+private val pathData4 =
+ PathData {
+ moveTo(111.23f, 130.5f)
+ reflectiveCurveToRelative(-9.8f, 1.0f, -9.8f, 10.0f)
+ reflectiveCurveToRelative(4.9f, 11.0f, 10.78f, 11.0f)
+ arcToRelative(11.0f, 11.0f, 0.0f, false, false, 10.78f, -11.0f)
+ curveTo(123.0f, 134.5f, 117.12f, 130.5f, 111.23f, 130.5f)
+ close()
+ moveTo(155.23f, 130.5f)
+ reflectiveCurveToRelative(-9.8f, 1.0f, -9.8f, 10.0f)
+ reflectiveCurveToRelative(4.9f, 11.0f, 10.78f, 11.0f)
+ arcToRelative(11.0f, 11.0f, 0.0f, false, false, 10.78f, -11.0f)
+ curveTo(167.0f, 134.5f, 161.12f, 130.5f, 155.23f, 130.5f)
+ close()
+ }
+private val pathData5 =
+ PathData {
+ moveTo(110.26f, 140.5f)
+ arcToRelative(1.96f, 3.0f, 0.0f, true, false, 3.92f, 0.0f)
+ arcToRelative(1.96f, 3.0f, 0.0f, true, false, -3.92f, 0.0f)
+ close()
+ moveTo(154.26f, 140.5f)
+ arcToRelative(1.96f, 3.0f, 0.0f, true, false, 3.92f, 0.0f)
+ arcToRelative(1.96f, 3.0f, 0.0f, true, false, -3.92f, 0.0f)
+ close()
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Eyes6Walle.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Eyes6Walle.kt
new file mode 100644
index 000000000..87ef6bc27
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Eyes6Walle.kt
@@ -0,0 +1,148 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.Brown
+import com.vitorpamplona.amethyst.commons.LightYellow
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Eyes6WallE() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ eyes6WallE(SolidColor(Color.Blue), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun eyes6WallE(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ builder.addPath(pathData1, fill = fgColor)
+ builder.addPath(pathData2, fill = Black, stroke = Black, fillAlpha = 0.6f, strokeLineWidth = 1.0f)
+ builder.addPath(pathData3, fill = Brown, stroke = Black, strokeLineWidth = 0.5f)
+ builder.addPath(pathData4, fill = LightYellow, stroke = Black, strokeLineWidth = 0.5f)
+ builder.addPath(pathData6, fill = Black)
+ builder.addPath(pathData8, stroke = Black, strokeLineWidth = 1.0f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(99.5f, 142.5f)
+ reflectiveCurveToRelative(0.0f, -10.0f, 12.0f, -14.0f)
+ reflectiveCurveToRelative(26.0f, -4.0f, 26.0f, -4.0f)
+ reflectiveCurveToRelative(20.0f, -1.0f, 25.0f, 2.0f)
+ reflectiveCurveToRelative(5.0f, 9.0f, 5.0f, 11.0f)
+ reflectiveCurveToRelative(-2.0f, 11.0f, -19.0f, 13.0f)
+ reflectiveCurveToRelative(-33.0f, 3.0f, -33.0f, 3.0f)
+ reflectiveCurveTo(99.5f, 153.5f, 99.5f, 142.5f)
+ close()
+ }
+private val pathData2 =
+ PathData {
+ moveTo(99.5f, 142.5f)
+ reflectiveCurveToRelative(0.0f, -10.0f, 12.0f, -14.0f)
+ reflectiveCurveToRelative(26.0f, -4.0f, 26.0f, -4.0f)
+ reflectiveCurveToRelative(20.0f, -1.0f, 25.0f, 2.0f)
+ reflectiveCurveToRelative(5.0f, 9.0f, 5.0f, 11.0f)
+ reflectiveCurveToRelative(-2.0f, 11.0f, -19.0f, 13.0f)
+ reflectiveCurveToRelative(-33.0f, 3.0f, -33.0f, 3.0f)
+ reflectiveCurveTo(99.5f, 153.5f, 99.5f, 142.5f)
+ close()
+ }
+private val pathData3 =
+ PathData {
+ moveTo(107.16f, 130.47f)
+ reflectiveCurveTo(105.0f, 133.0f, 105.0f, 138.0f)
+ reflectiveCurveToRelative(2.0f, 9.0f, 8.0f, 10.0f)
+ reflectiveCurveToRelative(20.5f, -1.5f, 20.5f, -1.5f)
+ reflectiveCurveToRelative(11.0f, -2.0f, 18.0f, -2.0f)
+ reflectiveCurveToRelative(15.74f, -2.78f, 15.87f, -5.89f)
+ reflectiveCurveToRelative(-0.17f, -7.11f, -2.52f, -10.11f)
+ reflectiveCurveToRelative(-7.12f, -3.56f, -10.24f, -3.78f)
+ reflectiveCurveToRelative(-12.52f, -0.54f, -14.82f, -0.38f)
+ reflectiveCurveToRelative(-10.17f, 0.47f, -12.23f, 0.81f)
+ reflectiveCurveToRelative(-7.31f, 1.1f, -7.31f, 1.1f)
+ lineToRelative(-7.61f, 1.87f)
+ reflectiveCurveTo(107.83f, 129.44f, 107.16f, 130.47f)
+ close()
+ }
+private val pathData4 =
+ PathData {
+ moveTo(109.0f, 135.0f)
+ reflectiveCurveToRelative(-1.0f, 11.0f, 10.0f, 10.0f)
+ reflectiveCurveToRelative(10.0f, -10.0f, 10.0f, -10.0f)
+ reflectiveCurveToRelative(0.0f, -6.0f, -3.0f, -8.0f)
+ reflectiveCurveToRelative(-2.85f, -1.25f, -2.85f, -1.25f)
+ reflectiveCurveToRelative(-11.28f, 2.64f, -12.21f, 2.94f)
+ reflectiveCurveTo(109.0f, 133.0f, 109.0f, 135.0f)
+ close()
+ moveTo(142.0f, 125.0f)
+ reflectiveCurveToRelative(-3.0f, 2.0f, -3.0f, 7.0f)
+ reflectiveCurveToRelative(3.5f, 10.5f, 9.5f, 10.5f)
+ reflectiveCurveToRelative(12.0f, -4.0f, 12.0f, -10.0f)
+ reflectiveCurveToRelative(-3.66f, -7.5f, -3.66f, -7.5f)
+ lineToRelative(-4.78f, -0.47f)
+ lineToRelative(-4.22f, -0.16f)
+ horizontalLineToRelative(-3.44f)
+ lineToRelative(-1.91f, 0.13f)
+ close()
+ }
+private val pathData6 =
+ PathData {
+ moveTo(119.42f, 133.0f)
+ reflectiveCurveToRelative(-1.17f, 0.0f, -1.17f, 2.5f)
+ reflectiveCurveToRelative(1.17f, 2.5f, 1.17f, 2.5f)
+ arcToRelative(2.51f, 2.51f, 0.0f, false, false, 0.0f, -5.0f)
+ close()
+ moveTo(150.08f, 130.0f)
+ arcToRelative(1.8f, 1.8f, 0.0f, false, false, -1.82f, 1.94f)
+ curveToRelative(-0.07f, 2.0f, 0.78f, 3.0f, 1.65f, 3.06f)
+ reflectiveCurveToRelative(1.78f, -0.94f, 1.85f, -2.94f)
+ arcToRelative(1.8f, 1.8f, 0.0f, false, false, -1.68f, -2.06f)
+ }
+private val pathData8 =
+ PathData {
+ moveTo(99.5f, 142.5f)
+ reflectiveCurveToRelative(0.0f, -10.0f, 12.0f, -14.0f)
+ reflectiveCurveToRelative(26.0f, -4.0f, 26.0f, -4.0f)
+ reflectiveCurveToRelative(20.0f, -1.0f, 25.0f, 2.0f)
+ reflectiveCurveToRelative(5.0f, 9.0f, 5.0f, 11.0f)
+ reflectiveCurveToRelative(-2.0f, 11.0f, -19.0f, 13.0f)
+ reflectiveCurveToRelative(-33.0f, 3.0f, -33.0f, 3.0f)
+ reflectiveCurveTo(99.5f, 153.5f, 99.5f, 142.5f)
+ close()
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Eyes7Bar.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Eyes7Bar.kt
new file mode 100644
index 000000000..a0a4e19ff
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Eyes7Bar.kt
@@ -0,0 +1,97 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.Brown
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Eyes7Bar() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ eyes7Bar(SolidColor(Color.Blue), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun eyes7Bar(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ builder.addPath(pathData1, fill = fgColor)
+ builder.addPath(pathData2, fill = Black, stroke = Black, fillAlpha = 0.4f, strokeLineWidth = 1.0f)
+ builder.addPath(pathData3, fill = Brown, stroke = Black, strokeLineWidth = 0.5f)
+ builder.addPath(pathData4, fill = Brown, stroke = Black, strokeLineWidth = 0.75f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(110.0f, 135.0f)
+ reflectiveCurveToRelative(-1.5f, 6.5f, 0.5f, 6.5f)
+ horizontalLineToRelative(45.0f)
+ verticalLineToRelative(-6.0f)
+ reflectiveCurveToRelative(0.0f, -2.0f, -3.0f, -2.0f)
+ horizontalLineToRelative(-38.0f)
+ curveTo(111.5f, 133.5f, 110.5f, 133.5f, 110.0f, 135.0f)
+ close()
+ }
+private val pathData2 =
+ PathData {
+ moveTo(110.0f, 135.0f)
+ reflectiveCurveToRelative(-1.5f, 6.5f, 0.5f, 6.5f)
+ horizontalLineToRelative(45.0f)
+ verticalLineToRelative(-6.0f)
+ reflectiveCurveToRelative(0.0f, -2.0f, -3.0f, -2.0f)
+ horizontalLineToRelative(-38.0f)
+ curveTo(111.5f, 133.5f, 110.5f, 133.5f, 110.0f, 135.0f)
+ close()
+ }
+private val pathData3 =
+ PathData {
+ moveTo(110.83f, 133.88f)
+ arcToRelative(25.17f, 25.17f, 0.0f, false, false, 2.67f, 4.62f)
+ curveToRelative(1.0f, 1.0f, 5.0f, 0.0f, 9.0f, 0.0f)
+ horizontalLineToRelative(31.0f)
+ reflectiveCurveToRelative(2.0f, -0.12f, 2.0f, 0.94f)
+ verticalLineTo(135.5f)
+ reflectiveCurveToRelative(0.0f, -2.0f, -3.0f, -2.0f)
+ horizontalLineTo(113.31f)
+ close()
+ }
+private val pathData4 =
+ PathData {
+ moveTo(113.5f, 138.5f)
+ lineTo(109.9f, 141.21f)
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Eyes8Smallbar.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Eyes8Smallbar.kt
new file mode 100644
index 000000000..03ed61991
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Eyes8Smallbar.kt
@@ -0,0 +1,128 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.Brown
+import com.vitorpamplona.amethyst.commons.LightYellow
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Eyes8SmallBar() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ eyes8SmallBar(SolidColor(Color.Blue), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun eyes8SmallBar(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ builder.addPath(pathData1, fill = fgColor)
+ builder.addPath(pathData2, stroke = Black, strokeLineWidth = 0.75f)
+ builder.addPath(pathData3, fill = Brown, stroke = Black, strokeLineWidth = 0.5f)
+ builder.addPath(pathData4, fill = Black, stroke = Black, fillAlpha = 0.4f, strokeLineWidth = 0.75f)
+ builder.addPath(pathData5, fill = LightYellow)
+ builder.addPath(pathData7, fill = Black, stroke = Black, fillAlpha = 0.2f, strokeLineWidth = 0.75f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(127.5f, 124.5f)
+ reflectiveCurveToRelative(-43.0f, -1.0f, -45.0f, 16.0f)
+ curveToRelative(-1.5f, 15.5f, 25.0f, 13.0f, 25.0f, 13.0f)
+ horizontalLineToRelative(35.0f)
+ reflectiveCurveToRelative(27.0f, 0.0f, 27.0f, -13.0f)
+ reflectiveCurveTo(158.5f, 123.5f, 127.5f, 124.5f)
+ close()
+ }
+
+private val pathData2 =
+ PathData {
+ moveTo(127.5f, 124.5f)
+ reflectiveCurveToRelative(-43.0f, -1.0f, -45.0f, 16.0f)
+ curveToRelative(-1.0f, 15.0f, 21.0f, 13.0f, 25.0f, 13.0f)
+ horizontalLineToRelative(35.0f)
+ reflectiveCurveToRelative(27.0f, 0.0f, 27.0f, -13.0f)
+ reflectiveCurveTo(158.5f, 123.5f, 127.5f, 124.5f)
+ close()
+ }
+
+private val pathData3 =
+ PathData {
+ moveTo(126.0f, 132.0f)
+ curveToRelative(-15.5f, 0.5f, -28.5f, -1.5f, -30.5f, 6.5f)
+ curveToRelative(-2.0f, 9.0f, 16.0f, 7.0f, 22.0f, 7.0f)
+ reflectiveCurveToRelative(27.0f, -1.0f, 30.0f, -1.0f)
+ reflectiveCurveToRelative(10.0f, -1.0f, 10.0f, -3.0f)
+ curveTo(157.5f, 133.5f, 142.5f, 131.5f, 126.0f, 132.0f)
+ close()
+ }
+
+private val pathData4 =
+ PathData {
+ moveTo(90.5f, 140.5f)
+ curveToRelative(0.0f, 1.0f, -5.0f, 9.0f, 32.0f, 8.0f)
+ reflectiveCurveToRelative(35.0f, -4.33f, 35.0f, -7.67f)
+ reflectiveCurveToRelative(-8.64f, -9.23f, -21.32f, -8.78f)
+ reflectiveCurveTo(95.5f, 128.5f, 90.5f, 140.5f)
+ close()
+ }
+
+private val pathData5 =
+ PathData {
+ moveTo(109.5f, 139.0f)
+ arcToRelative(2.5f, 3.5f, 0.0f, true, false, 5.0f, 0.0f)
+ arcToRelative(2.5f, 3.5f, 0.0f, true, false, -5.0f, 0.0f)
+ close()
+ moveTo(135.5f, 139.0f)
+ arcToRelative(2.5f, 3.5f, 0.0f, true, false, 5.0f, 0.0f)
+ arcToRelative(2.5f, 3.5f, 0.0f, true, false, -5.0f, 0.0f)
+ close()
+ }
+
+private val pathData7 =
+ PathData {
+ moveTo(93.5f, 129.5f)
+ reflectiveCurveToRelative(27.0f, -3.0f, 41.0f, -2.0f)
+ curveToRelative(11.0f, 0.0f, 24.0f, 3.0f, 29.0f, 10.0f)
+ reflectiveCurveToRelative(1.39f, 10.59f, -0.3f, 11.8f)
+ reflectiveCurveToRelative(6.3f, -2.8f, 6.3f, -8.8f)
+ reflectiveCurveToRelative(-1.61f, -11.29f, -14.3f, -14.65f)
+ reflectiveCurveToRelative(-30.2f, -1.18f, -33.95f, -1.26f)
+ reflectiveCurveTo(98.5f, 126.5f, 93.5f, 129.5f)
+ close()
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Eyes9Shield.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Eyes9Shield.kt
new file mode 100644
index 000000000..6f2de8777
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Eyes9Shield.kt
@@ -0,0 +1,106 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Eyes9Shield() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ eyes9Shield(SolidColor(Color.Blue), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun eyes9Shield(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ builder.addPath(pathData1, fill = fgColor, stroke = Black, strokeLineWidth = 1.0f)
+ builder.addPath(pathData2, fill = Black, fillAlpha = 0.4f)
+ builder.addPath(pathData3, fill = Black, fillAlpha = 0.4f)
+ builder.addPath(pathData6, fill = Black, stroke = Black, fillAlpha = 0.4f, strokeLineWidth = 0.75f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(129.5f, 123.5f)
+ reflectiveCurveToRelative(-30.0f, 3.0f, -31.0f, 15.0f)
+ reflectiveCurveToRelative(8.0f, 13.0f, 15.0f, 14.0f)
+ reflectiveCurveToRelative(20.0f, -2.0f, 26.0f, -3.0f)
+ reflectiveCurveToRelative(25.0f, 1.0f, 27.0f, -13.0f)
+ reflectiveCurveToRelative(-17.0f, -14.0f, -17.0f, -14.0f)
+ close()
+ }
+private val pathData2 =
+ PathData {
+ moveTo(116.92f, 125.8f)
+ reflectiveCurveToRelative(-15.42f, 2.7f, -16.42f, 12.7f)
+ reflectiveCurveToRelative(15.5f, 13.0f, 24.25f, 10.5f)
+ arcTo(97.37f, 97.37f, 0.0f, false, true, 150.0f, 145.44f)
+ curveToRelative(6.5f, 0.06f, 16.78f, -3.69f, 16.64f, -11.31f)
+ reflectiveCurveTo(157.5f, 122.5f, 149.5f, 122.5f)
+ reflectiveCurveToRelative(-21.12f, 1.13f, -21.12f, 1.13f)
+ close()
+ }
+private val pathData3 =
+ PathData {
+ moveTo(130.5f, 123.5f)
+ lineToRelative(-8.0f, 25.5f)
+ curveToRelative(1.6f, -0.06f, 5.38f, -0.65f, 9.0f, -1.2f)
+ lineToRelative(7.0f, -24.8f)
+ arcTo(47.26f, 47.26f, 0.0f, false, true, 130.5f, 123.5f)
+ close()
+ moveTo(120.77f, 124.91f)
+ lineToRelative(-7.77f, 25.09f)
+ lineToRelative(5.0f, 0.0f)
+ lineToRelative(7.41f, -25.94f)
+ lineToRelative(-4.64f, 0.85f)
+ close()
+ }
+private val pathData6 =
+ PathData {
+ moveTo(106.61f, 129.46f)
+ reflectiveCurveToRelative(-6.11f, 3.0f, -6.11f, 9.0f)
+ reflectiveCurveToRelative(5.0f, 13.0f, 20.0f, 11.0f)
+ reflectiveCurveToRelative(23.0f, -4.0f, 28.0f, -4.0f)
+ reflectiveCurveToRelative(17.29f, -2.5f, 18.15f, -10.25f)
+ curveToRelative(0.0f, 0.0f, 0.3f, 10.92f, -14.42f, 13.09f)
+ reflectiveCurveToRelative(-16.25f, 1.2f, -21.0f, 2.68f)
+ reflectiveCurveToRelative(-28.06f, 4.23f, -32.4f, -7.15f)
+ curveTo(98.84f, 143.87f, 95.71f, 134.43f, 106.61f, 129.46f)
+ close()
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Face0C3po.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Face0C3po.kt
new file mode 100644
index 000000000..87fe2550a
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Face0C3po.kt
@@ -0,0 +1,120 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Face0C3po() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ face0C3po(SolidColor(Color.Blue), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun face0C3po(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ builder.addPath(pathData1, fill = fgColor, stroke = Black, strokeLineWidth = 1.5f)
+ builder.addPath(pathData2, fill = Black, fillAlpha = 0.4f)
+ builder.addPath(pathData5, fill = Black, fillAlpha = 0.2f)
+ builder.addPath(pathData6, stroke = Black, strokeLineWidth = 1.0f)
+ builder.addPath(pathData7, fill = Black, stroke = Black, fillAlpha = 0.2f, strokeLineWidth = 0.75f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(144.5f, 87.5f)
+ reflectiveCurveToRelative(-51.0f, 3.0f, -53.0f, 55.0f)
+ curveToRelative(0.0f, 0.0f, 0.0f, 27.0f, 5.0f, 42.0f)
+ reflectiveCurveToRelative(10.0f, 38.0f, 10.0f, 38.0f)
+ lineToRelative(16.0f, 16.0f)
+ lineToRelative(1.0f, 5.0f)
+ reflectiveCurveToRelative(13.5f, -1.5f, 19.0f, -1.0f)
+ reflectiveCurveToRelative(14.0f, 2.0f, 14.0f, 2.0f)
+ reflectiveCurveToRelative(6.0f, -13.0f, 19.0f, -19.0f)
+ reflectiveCurveToRelative(18.0f, -8.0f, 18.0f, -8.0f)
+ reflectiveCurveToRelative(-4.0f, -35.0f, -4.0f, -52.0f)
+ reflectiveCurveTo(201.5f, 88.5f, 144.5f, 87.5f)
+ close()
+ }
+private val pathData2 =
+ PathData {
+ moveTo(115.14f, 97.69f)
+ reflectiveCurveToRelative(6.36f, 5.81f, -2.64f, 14.81f)
+ reflectiveCurveToRelative(-16.0f, 23.0f, -13.0f, 44.0f)
+ reflectiveCurveToRelative(10.0f, 40.0f, 10.0f, 50.0f)
+ reflectiveCurveToRelative(-0.67f, 18.19f, -0.67f, 18.19f)
+ lineToRelative(-2.33f, -2.19f)
+ reflectiveCurveToRelative(-15.0f, -45.0f, -15.0f, -76.5f)
+ reflectiveCurveTo(115.14f, 97.69f, 115.14f, 97.69f)
+ close()
+ }
+private val pathData5 =
+ PathData {
+ moveTo(158.5f, 92.5f)
+ reflectiveCurveToRelative(20.0f, 15.0f, 18.0f, 32.0f)
+ reflectiveCurveToRelative(-8.0f, 28.0f, -12.0f, 29.0f)
+ arcToRelative(19.27f, 19.27f, 0.0f, false, true, 8.0f, 16.0f)
+ curveToRelative(0.0f, 11.0f, 1.0f, 50.0f, 1.0f, 50.0f)
+ lineToRelative(0.34f, 6.83f)
+ lineToRelative(19.66f, -8.83f)
+ reflectiveCurveToRelative(-3.77f, -39.0f, -3.38f, -63.49f)
+ reflectiveCurveToRelative(1.38f, -55.13f, -31.62f, -64.82f)
+ curveTo(158.5f, 89.19f, 155.5f, 90.5f, 158.5f, 92.5f)
+ close()
+ }
+private val pathData6 =
+ PathData {
+ moveTo(124.5f, 211.5f)
+ lineToRelative(37.0f, -1.0f)
+ lineToRelative(4.76f, 21.18f)
+ reflectiveCurveToRelative(-8.76f, 8.82f, -8.76f, 11.82f)
+ curveToRelative(-2.0f, 1.0f, -10.0f, -1.0f, -18.0f, -1.0f)
+ arcToRelative(147.84f, 147.84f, 0.0f, false, false, -16.0f, 1.0f)
+ reflectiveCurveTo(118.5f, 224.5f, 124.5f, 211.5f)
+ close()
+ }
+private val pathData7 =
+ PathData {
+ moveTo(159.5f, 212.5f)
+ arcToRelative(19.89f, 19.89f, 0.0f, false, false, -4.0f, 14.0f)
+ curveToRelative(1.0f, 8.0f, 2.0f, 17.0f, 2.0f, 17.0f)
+ lineToRelative(9.0f, -12.0f)
+ lineToRelative(-5.0f, -21.0f)
+ close()
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Face1Rock.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Face1Rock.kt
new file mode 100644
index 000000000..ef7a1f015
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Face1Rock.kt
@@ -0,0 +1,126 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Face1Rock() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ face1Rock(SolidColor(Color.Yellow), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun face1Rock(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ builder.addPath(pathData1, fill = fgColor, stroke = Black, strokeLineWidth = 1.5f)
+ builder.addPath(pathData2, fill = Black, fillAlpha = 0.2f)
+ builder.addPath(pathData5, fill = Black, stroke = Black, fillAlpha = 0.2f, strokeLineWidth = 0.75f)
+ builder.addPath(pathData7, fill = Black, fillAlpha = 0.4f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(147.5f, 88.5f)
+ reflectiveCurveToRelative(-64.0f, 9.0f, -63.0f, 72.0f)
+ curveToRelative(0.0f, 0.0f, -6.0f, 51.0f, 54.0f, 50.0f)
+ curveToRelative(0.0f, 0.0f, 66.0f, -6.0f, 65.0f, -53.0f)
+ reflectiveCurveTo(172.0f, 87.0f, 147.5f, 88.5f)
+ close()
+ }
+private val pathData2 =
+ PathData {
+ moveTo(154.5f, 90.5f)
+ reflectiveCurveToRelative(18.0f, 12.0f, 25.0f, 47.0f)
+ reflectiveCurveToRelative(2.0f, 48.0f, -7.0f, 55.0f)
+ reflectiveCurveToRelative(-24.12f, 17.37f, -42.56f, 17.68f)
+ curveToRelative(0.0f, 0.0f, 56.6f, 1.84f, 70.58f, -33.42f)
+ curveToRelative(0.73f, -1.85f, 1.84f, -5.7f, 1.84f, -5.7f)
+ reflectiveCurveTo(185.5f, 158.5f, 183.17f, 137.0f)
+ curveToRelative(-1.67f, -14.45f, 2.33f, -24.45f, 6.49f, -24.63f)
+ arcToRelative(7.0f, 7.0f, 0.0f, false, false, -0.63f, -1.08f)
+ curveTo(179.68f, 98.0f, 160.0f, 87.0f, 154.5f, 90.5f)
+ close()
+ }
+private val pathData3 =
+ PathData {
+ moveTo(147.5f, 87.5f)
+ reflectiveCurveToRelative(-64.0f, 9.0f, -63.0f, 72.0f)
+ curveToRelative(0.0f, 0.0f, -6.0f, 51.0f, 54.0f, 50.0f)
+ curveToRelative(0.0f, 0.0f, 66.0f, -6.0f, 65.0f, -53.0f)
+ reflectiveCurveTo(170.5f, 85.5f, 147.5f, 87.5f)
+ close()
+ }
+private val pathData4 =
+ PathData {
+ moveTo(147.5f, 88.5f)
+ reflectiveCurveToRelative(-64.0f, 9.0f, -63.0f, 72.0f)
+ curveToRelative(0.0f, 0.0f, -6.0f, 51.0f, 54.0f, 50.0f)
+ curveToRelative(0.0f, 0.0f, 66.0f, -6.0f, 65.0f, -53.0f)
+ reflectiveCurveTo(171.5f, 86.5f, 147.5f, 88.5f)
+ close()
+ }
+private val pathData5 =
+ PathData {
+ moveTo(92.22f, 125.67f)
+ reflectiveCurveToRelative(2.28f, 14.83f, 0.28f, 24.83f)
+ reflectiveCurveToRelative(-7.67f, 21.0f, -7.67f, 21.0f)
+ reflectiveCurveTo(80.94f, 147.85f, 92.22f, 125.67f)
+ close()
+ moveTo(187.5f, 113.5f)
+ reflectiveCurveToRelative(-7.0f, 10.0f, -4.0f, 26.0f)
+ reflectiveCurveToRelative(12.0f, 27.67f, 18.5f, 29.83f)
+ curveToRelative(0.0f, 0.0f, 5.83f, -35.17f, -12.83f, -57.0f)
+ close()
+ }
+private val pathData7 =
+ PathData {
+ moveTo(112.5f, 112.5f)
+ reflectiveCurveToRelative(-5.0f, -1.0f, -10.0f, 6.0f)
+ reflectiveCurveToRelative(-6.0f, 11.0f, -5.0f, 13.0f)
+ reflectiveCurveToRelative(7.0f, 1.0f, 11.0f, -7.0f)
+ reflectiveCurveTo(114.5f, 114.5f, 112.5f, 112.5f)
+ close()
+ moveTo(117.5f, 102.5f)
+ reflectiveCurveToRelative(-5.0f, 4.0f, -2.0f, 7.0f)
+ arcToRelative(6.31f, 6.31f, 0.0f, false, false, 9.0f, 0.0f)
+ curveToRelative(2.0f, -2.0f, 2.0f, -6.0f, -1.0f, -7.0f)
+ arcTo(10.56f, 10.56f, 0.0f, false, false, 117.5f, 102.5f)
+ close()
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Face2Long.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Face2Long.kt
new file mode 100644
index 000000000..4d6cc799c
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Face2Long.kt
@@ -0,0 +1,101 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Face2Long() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ face2Long(SolidColor(Color.Blue), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun face2Long(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ builder.addPath(pathData1, fill = fgColor, stroke = Black, strokeLineWidth = 1.5f)
+ builder.addPath(pathData4, fill = Black, fillAlpha = 0.2f)
+ builder.addPath(pathData5, fill = Black, fillAlpha = 0.4f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(147.0f, 88.0f)
+ curveToRelative(-20.15f, -0.5f, -56.5f, 14.5f, -56.5f, 57.5f)
+ curveToRelative(0.0f, 0.0f, 1.0f, 22.0f, 6.0f, 41.0f)
+ reflectiveCurveToRelative(10.0f, 34.0f, 10.0f, 37.0f)
+ curveToRelative(0.0f, 0.0f, 3.0f, 12.0f, 25.0f, 11.0f)
+ reflectiveCurveToRelative(62.0f, -15.0f, 62.0f, -15.0f)
+ reflectiveCurveToRelative(-2.0f, -31.0f, -3.0f, -49.0f)
+ reflectiveCurveTo(196.79f, 89.24f, 147.0f, 88.0f)
+ close()
+ }
+private val pathData4 =
+ PathData {
+ moveTo(135.5f, 96.5f)
+ reflectiveCurveToRelative(36.0f, -4.0f, 45.0f, 43.0f)
+ curveToRelative(0.0f, 0.0f, 3.0f, 24.0f, 3.0f, 35.0f)
+ reflectiveCurveToRelative(-1.0f, 25.0f, 1.0f, 36.0f)
+ lineToRelative(2.0f, 11.0f)
+ lineToRelative(7.0f, -2.0f)
+ reflectiveCurveToRelative(-2.53f, -55.76f, -3.27f, -70.88f)
+ reflectiveCurveTo(188.5f, 90.81f, 150.0f, 88.16f)
+ curveToRelative(0.0f, 0.0f, -19.78f, -1.0f, -33.64f, 8.7f)
+ curveToRelative(0.0f, 0.0f, -4.86f, 4.65f, 0.14f, 2.65f)
+ reflectiveCurveTo(132.5f, 96.5f, 135.5f, 96.5f)
+ close()
+ }
+private val pathData5 =
+ PathData {
+ moveTo(122.5f, 104.5f)
+ reflectiveCurveToRelative(-4.0f, 1.0f, -4.0f, 4.0f)
+ reflectiveCurveToRelative(2.0f, 7.0f, 5.0f, 6.0f)
+ reflectiveCurveToRelative(5.0f, -5.0f, 4.0f, -7.0f)
+ reflectiveCurveTo(125.5f, 103.5f, 122.5f, 104.5f)
+ close()
+ moveTo(115.5f, 111.5f)
+ reflectiveCurveToRelative(-9.0f, -6.0f, -17.0f, 12.0f)
+ reflectiveCurveToRelative(-1.0f, 37.0f, -1.0f, 37.0f)
+ reflectiveCurveToRelative(2.0f, 6.0f, 8.0f, 6.0f)
+ reflectiveCurveToRelative(4.0f, -9.0f, 4.0f, -9.0f)
+ reflectiveCurveToRelative(-4.0f, -13.0f, -1.0f, -24.0f)
+ reflectiveCurveToRelative(7.0f, -13.0f, 7.0f, -13.0f)
+ reflectiveCurveTo(120.5f, 115.5f, 115.5f, 111.5f)
+ close()
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Face3Oval.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Face3Oval.kt
new file mode 100644
index 000000000..3e68aee6c
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Face3Oval.kt
@@ -0,0 +1,98 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Face3Oval() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ face3Oval(SolidColor(Color.Blue), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun face3Oval(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ builder.addPath(pathData1, fill = fgColor, stroke = Black, strokeLineWidth = 1.5f)
+ builder.addPath(pathData2, fill = Black, fillAlpha = 0.2f)
+ builder.addPath(pathData3, fill = Black, fillAlpha = 0.4f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(148.0f, 87.0f)
+ reflectiveCurveToRelative(-56.5f, 0.5f, -56.5f, 63.93f)
+ reflectiveCurveToRelative(33.0f, 84.57f, 48.0f, 84.57f)
+ reflectiveCurveToRelative(45.0f, -8.05f, 51.0f, -41.28f)
+ curveToRelative(0.0f, 0.0f, 1.0f, -16.11f, 0.0f, -25.17f)
+ reflectiveCurveToRelative(-1.0f, -29.2f, -1.0f, -32.22f)
+ reflectiveCurveTo(186.5f, 88.51f, 148.0f, 87.0f)
+ close()
+ }
+private val pathData2 =
+ PathData {
+ moveTo(151.5f, 92.5f)
+ reflectiveCurveToRelative(17.0f, 12.0f, 22.0f, 42.0f)
+ reflectiveCurveToRelative(7.0f, 44.0f, 3.0f, 63.0f)
+ reflectiveCurveTo(167.0f, 226.0f, 161.75f, 229.25f)
+ reflectiveCurveToRelative(21.67f, -4.94f, 26.71f, -26.84f)
+ reflectiveCurveToRelative(1.77f, -35.94f, 1.77f, -35.94f)
+ lineToRelative(-1.0f, -32.24f)
+ reflectiveCurveToRelative(-5.0f, -35.64f, -26.88f, -43.18f)
+ curveToRelative(0.0f, 0.0f, -11.87f, -4.54f, -17.37f, -3.0f)
+ reflectiveCurveTo(148.5f, 89.5f, 151.5f, 92.5f)
+ close()
+ }
+private val pathData3 =
+ PathData {
+ moveTo(113.5f, 110.5f)
+ reflectiveCurveToRelative(-4.0f, 0.0f, -4.0f, 4.0f)
+ reflectiveCurveToRelative(4.0f, 7.0f, 7.0f, 5.0f)
+ reflectiveCurveToRelative(5.0f, -5.0f, 4.0f, -7.0f)
+ reflectiveCurveTo(118.5f, 108.5f, 113.5f, 110.5f)
+ close()
+ moveTo(108.5f, 123.5f)
+ reflectiveCurveToRelative(-4.0f, -1.0f, -7.0f, 5.0f)
+ reflectiveCurveToRelative(-4.0f, 15.0f, -3.0f, 24.0f)
+ arcToRelative(33.42f, 33.42f, 0.0f, false, false, 8.0f, 18.0f)
+ curveToRelative(2.0f, 2.0f, 6.0f, 3.0f, 5.0f, -4.0f)
+ reflectiveCurveToRelative(-5.0f, -14.0f, -4.0f, -25.0f)
+ reflectiveCurveTo(114.5f, 124.5f, 108.5f, 123.5f)
+ close()
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Face4Cylinder.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Face4Cylinder.kt
new file mode 100644
index 000000000..1431deec0
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Face4Cylinder.kt
@@ -0,0 +1,106 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Face4Cylinder() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ face4Cylinder(SolidColor(Color.Blue), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun face4Cylinder(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ builder.addPath(pathData1, fill = fgColor, stroke = Black, strokeLineWidth = 1.5f)
+ builder.addPath(pathData2, fill = Black, fillAlpha = 0.4f)
+ builder.addPath(pathData3, fill = Black, stroke = Black, fillAlpha = 0.2f, strokeLineWidth = 1.0f)
+ builder.addPath(pathData5, fill = Black, fillAlpha = 0.2f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(91.5f, 107.5f)
+ reflectiveCurveToRelative(4.0f, 64.0f, 4.0f, 77.0f)
+ reflectiveCurveToRelative(1.0f, 38.0f, 1.0f, 38.0f)
+ reflectiveCurveToRelative(4.0f, 11.0f, 22.0f, 10.0f)
+ curveToRelative(36.5f, 0.5f, 60.0f, -11.0f, 66.0f, -16.0f)
+ curveToRelative(0.0f, 0.0f, -3.0f, -106.0f, -3.0f, -116.0f)
+ reflectiveCurveToRelative(4.0f, -20.0f, -36.0f, -22.0f)
+ curveToRelative(0.0f, 0.0f, -35.59f, 1.45f, -44.8f, 8.73f)
+ curveToRelative(0.0f, 0.0f, -10.2f, 2.27f, -9.2f, 7.27f)
+ reflectiveCurveTo(91.5f, 107.5f, 91.5f, 107.5f)
+ close()
+ }
+private val pathData2 =
+ PathData {
+ moveTo(95.8f, 102.0f)
+ reflectiveCurveToRelative(2.7f, 53.53f, 3.7f, 68.53f)
+ reflectiveCurveToRelative(5.0f, 42.0f, 5.0f, 45.0f)
+ verticalLineToRelative(14.71f)
+ reflectiveCurveToRelative(-7.0f, -3.71f, -8.0f, -7.71f)
+ reflectiveCurveToRelative(-3.65f, -88.21f, -3.83f, -95.61f)
+ reflectiveCurveTo(91.5f, 107.5f, 91.5f, 107.5f)
+ verticalLineToRelative(-13.0f)
+ reflectiveCurveTo(91.1f, 100.43f, 95.8f, 102.0f)
+ close()
+ }
+private val pathData3 =
+ PathData {
+ moveTo(145.5f, 78.5f)
+ reflectiveCurveToRelative(-53.0f, 5.0f, -54.0f, 16.0f)
+ reflectiveCurveToRelative(23.0f, 14.0f, 37.0f, 13.0f)
+ reflectiveCurveToRelative(52.0f, -7.0f, 53.0f, -16.0f)
+ reflectiveCurveTo(156.5f, 77.5f, 145.5f, 78.5f)
+ close()
+ }
+private val pathData5 =
+ PathData {
+ moveTo(168.5f, 103.5f)
+ reflectiveCurveToRelative(1.0f, 49.0f, 1.0f, 57.0f)
+ reflectiveCurveToRelative(1.0f, 35.0f, 1.0f, 41.0f)
+ reflectiveCurveToRelative(-1.0f, 22.92f, -1.0f, 22.92f)
+ lineToRelative(15.0f, -7.92f)
+ reflectiveCurveToRelative(-2.94f, -96.67f, -3.0f, -100.83f)
+ reflectiveCurveToRelative(0.0f, -25.17f, 0.0f, -25.17f)
+ curveToRelative(0.34f, 3.51f, -3.36f, 6.57f, -11.0f, 9.17f)
+ lineToRelative(-2.0f, 0.72f)
+ close()
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Face5Baloon.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Face5Baloon.kt
new file mode 100644
index 000000000..32c656a40
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Face5Baloon.kt
@@ -0,0 +1,110 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Face5Baloon() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ face5Baloon(SolidColor(Color.Blue), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun face5Baloon(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ builder.addPath(pathData1, fill = fgColor, stroke = Black, strokeLineWidth = 1.5f)
+ builder.addPath(pathData4, fill = Black, fillAlpha = 0.2f)
+ builder.addPath(pathData5, fill = Black, fillAlpha = 0.4f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(156.0f, 83.0f)
+ reflectiveCurveToRelative(-55.0f, 5.0f, -66.0f, 53.0f)
+ reflectiveCurveToRelative(9.5f, 66.5f, 9.5f, 66.5f)
+ reflectiveCurveToRelative(9.0f, 8.0f, 12.0f, 8.0f)
+ reflectiveCurveToRelative(2.0f, -2.0f, 1.0f, -4.0f)
+ arcToRelative(7.47f, 7.47f, 0.0f, false, false, -3.0f, -3.0f)
+ reflectiveCurveToRelative(4.0f, 1.0f, 5.0f, 10.0f)
+ reflectiveCurveToRelative(1.0f, 32.0f, 1.0f, 38.0f)
+ verticalLineToRelative(12.0f)
+ reflectiveCurveToRelative(2.0f, 8.0f, 17.0f, 8.0f)
+ reflectiveCurveToRelative(30.0f, -7.0f, 30.0f, -7.0f)
+ reflectiveCurveToRelative(-4.0f, -34.0f, -2.0f, -41.0f)
+ reflectiveCurveToRelative(9.0f, -20.0f, 15.0f, -26.0f)
+ reflectiveCurveToRelative(3.0f, -1.0f, 0.0f, 2.0f)
+ arcToRelative(50.18f, 50.18f, 0.0f, false, false, -6.0f, 8.0f)
+ reflectiveCurveToRelative(17.0f, -7.0f, 23.0f, -14.0f)
+ reflectiveCurveToRelative(15.0f, -10.0f, 16.0f, -33.0f)
+ reflectiveCurveTo(214.5f, 81.5f, 156.0f, 83.0f)
+ close()
+ }
+private val pathData4 =
+ PathData {
+ moveTo(181.5f, 93.5f)
+ reflectiveCurveToRelative(18.0f, 16.0f, 16.0f, 44.0f)
+ reflectiveCurveToRelative(-6.0f, 41.0f, -28.0f, 54.0f)
+ curveToRelative(0.0f, 0.0f, -16.0f, 3.0f, -19.0f, 28.0f)
+ reflectiveCurveToRelative(0.0f, 49.27f, 0.0f, 49.27f)
+ lineToRelative(12.0f, -4.27f)
+ reflectiveCurveToRelative(-6.87f, -36.09f, 0.07f, -46.54f)
+ reflectiveCurveToRelative(7.21f, -11.15f, 17.07f, -15.3f)
+ reflectiveCurveToRelative(30.94f, -21.59f, 29.4f, -50.87f)
+ reflectiveCurveToRelative(-0.09f, -56.0f, -35.32f, -67.16f)
+ lineToRelative(-3.94f, -0.77f)
+ reflectiveCurveTo(168.5f, 84.5f, 181.5f, 93.5f)
+ close()
+ }
+private val pathData5 =
+ PathData {
+ moveTo(110.5f, 117.5f)
+ reflectiveCurveToRelative(-7.0f, 1.0f, -10.0f, 11.0f)
+ reflectiveCurveToRelative(-11.0f, 25.0f, -8.0f, 35.0f)
+ reflectiveCurveToRelative(7.0f, 10.0f, 9.0f, 5.0f)
+ reflectiveCurveToRelative(1.0f, -17.0f, 5.0f, -28.0f)
+ reflectiveCurveTo(116.5f, 119.5f, 110.5f, 117.5f)
+ close()
+ moveTo(122.5f, 99.5f)
+ reflectiveCurveToRelative(-9.0f, 6.0f, -9.0f, 9.0f)
+ reflectiveCurveToRelative(0.0f, 4.0f, 5.0f, 4.0f)
+ reflectiveCurveToRelative(13.0f, -4.0f, 13.0f, -9.0f)
+ reflectiveCurveTo(128.5f, 96.5f, 122.5f, 99.5f)
+ close()
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Face6Triangle.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Face6Triangle.kt
new file mode 100644
index 000000000..5020079b2
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Face6Triangle.kt
@@ -0,0 +1,125 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Face6Triangle() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ face6Triangle(SolidColor(Color.Blue), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun face6Triangle(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ builder.addPath(pathData1, fill = fgColor, stroke = Black, strokeLineWidth = 2.0f)
+ builder.addPath(pathData2, fill = Black, fillAlpha = 0.4f)
+ builder.addPath(pathData4, stroke = Black, strokeLineWidth = 1.0f)
+ builder.addPath(pathData19, fill = Black, fillAlpha = 0.2f)
+ builder.addPath(pathData20, fill = Black, fillAlpha = 0.2f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(71.5f, 130.5f)
+ arcToRelative(51.83f, 51.83f, 0.0f, false, false, 6.0f, 29.0f)
+ curveToRelative(8.0f, 15.0f, 39.0f, 71.0f, 66.0f, 70.0f)
+ reflectiveCurveToRelative(76.0f, -50.0f, 76.0f, -93.0f)
+ reflectiveCurveToRelative(-38.0f, -54.0f, -77.0f, -53.0f)
+ reflectiveCurveTo(73.5f, 102.5f, 71.5f, 130.5f)
+ close()
+ }
+private val pathData2 =
+ PathData {
+ moveTo(116.5f, 88.0f)
+ reflectiveCurveToRelative(-24.18f, 5.5f, -35.59f, 20.5f)
+ reflectiveCurveToRelative(-9.79f, 26.0f, -9.1f, 34.48f)
+ reflectiveCurveToRelative(8.2f, 22.55f, 14.44f, 33.0f)
+ reflectiveCurveToRelative(18.64f, 28.81f, 22.95f, 32.65f)
+ reflectiveCurveToRelative(11.3f, 11.84f, 11.3f, 11.84f)
+ reflectiveCurveToRelative(0.3f, -6.17f, -5.85f, -18.58f)
+ reflectiveCurveTo(83.5f, 164.0f, 81.5f, 143.74f)
+ reflectiveCurveTo(87.5f, 101.49f, 116.5f, 88.0f)
+ close()
+ }
+private val pathData3 =
+ PathData {
+ moveTo(71.5f, 130.5f)
+ arcToRelative(51.83f, 51.83f, 0.0f, false, false, 6.0f, 29.0f)
+ curveToRelative(8.0f, 15.0f, 39.0f, 71.0f, 66.0f, 70.0f)
+ reflectiveCurveToRelative(76.0f, -50.0f, 76.0f, -93.0f)
+ reflectiveCurveToRelative(-38.0f, -54.0f, -77.0f, -53.0f)
+ reflectiveCurveTo(73.5f, 102.5f, 71.5f, 130.5f)
+ close()
+ }
+private val pathData4 =
+ PathData {
+ moveTo(75.44f, 115.88f)
+ reflectiveCurveTo(108.5f, 100.5f, 140.5f, 101.5f)
+ reflectiveCurveToRelative(65.0f, 7.0f, 67.0f, 30.0f)
+ reflectiveCurveToRelative(-3.0f, 34.0f, -9.0f, 50.0f)
+ arcToRelative(89.16f, 89.16f, 0.0f, false, true, -16.32f, 27.0f)
+ }
+private val pathData19 =
+ PathData {
+ moveTo(199.5f, 115.5f)
+ lineToRelative(-9.0f, -5.07f)
+ reflectiveCurveTo(188.0f, 110.0f, 191.0f, 120.0f)
+ reflectiveCurveToRelative(6.5f, 25.5f, 4.5f, 40.5f)
+ reflectiveCurveToRelative(-7.0f, 27.0f, -19.0f, 40.0f)
+ reflectiveCurveToRelative(-17.37f, 20.78f, -17.19f, 23.89f)
+ reflectiveCurveTo(184.5f, 208.5f, 188.5f, 202.5f)
+ reflectiveCurveToRelative(11.93f, -23.83f, 16.0f, -39.0f)
+ reflectiveCurveTo(211.5f, 124.5f, 199.5f, 115.5f)
+ close()
+ }
+private val pathData20 =
+ PathData {
+ moveTo(201.0f, 100.0f)
+ lineToRelative(-10.0f, 10.0f)
+ reflectiveCurveToRelative(-23.39f, -8.18f, -41.7f, -8.09f)
+ reflectiveCurveToRelative(-33.49f, -1.25f, -53.4f, 6.42f)
+ lineTo(76.0f, 116.0f)
+ reflectiveCurveToRelative(-0.08f, -2.83f, 6.71f, -9.66f)
+ reflectiveCurveToRelative(18.0f, -18.34f, 48.89f, -22.09f)
+ reflectiveCurveToRelative(49.94f, 2.2f, 58.92f, 6.73f)
+ reflectiveCurveToRelative(12.0f, 7.09f, 12.0f, 7.09f)
+ close()
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Face7Bent.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Face7Bent.kt
new file mode 100644
index 000000000..eed584908
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Face7Bent.kt
@@ -0,0 +1,98 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Face7Bent() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ face7Bent(SolidColor(Color.Blue), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun face7Bent(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ builder.addPath(pathData1, fill = fgColor, stroke = Black, strokeLineWidth = 1.5f)
+ builder.addPath(pathData2, fill = Black, fillAlpha = 0.4f)
+ builder.addPath(pathData5, fill = Black, stroke = Black, fillAlpha = 0.2f, strokeLineWidth = 1.0f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(212.5f, 90.5f)
+ reflectiveCurveToRelative(-19.5f, -20.5f, -55.0f, -12.0f)
+ curveToRelative(-31.0f, 8.0f, -61.0f, 14.0f, -64.0f, 60.0f)
+ arcToRelative(122.71f, 122.71f, 0.0f, false, false, 4.0f, 35.0f)
+ curveToRelative(5.0f, 19.0f, 11.0f, 42.0f, 12.0f, 45.0f)
+ curveToRelative(0.0f, 0.0f, 8.0f, 9.0f, 25.0f, 9.0f)
+ reflectiveCurveToRelative(56.0f, -10.0f, 56.0f, -10.0f)
+ reflectiveCurveToRelative(11.0f, -5.0f, 12.0f, -6.0f)
+ reflectiveCurveToRelative(-20.0f, -60.0f, -11.0f, -86.0f)
+ curveToRelative(0.0f, 0.0f, 3.0f, -7.0f, 14.0f, -8.0f)
+ reflectiveCurveToRelative(14.0f, 0.0f, 14.0f, 0.0f)
+ reflectiveCurveTo(217.5f, 96.5f, 212.5f, 90.5f)
+ close()
+ }
+private val pathData2 =
+ PathData {
+ moveTo(130.5f, 88.5f)
+ reflectiveCurveToRelative(-9.0f, 6.0f, -12.0f, 9.0f)
+ reflectiveCurveToRelative(-16.0f, 15.0f, -18.0f, 28.0f)
+ reflectiveCurveToRelative(2.0f, 38.0f, 4.0f, 46.0f)
+ reflectiveCurveToRelative(5.0f, 21.0f, 4.0f, 26.0f)
+ reflectiveCurveToRelative(-2.93f, 6.66f, -2.93f, 6.66f)
+ reflectiveCurveTo(99.5f, 183.5f, 97.5f, 173.5f)
+ reflectiveCurveToRelative(-6.0f, -27.0f, -1.52f, -51.0f)
+ reflectiveCurveTo(130.5f, 85.5f, 130.5f, 88.5f)
+ close()
+ }
+private val pathData5 =
+ PathData {
+ moveTo(209.5f, 92.5f)
+ reflectiveCurveToRelative(-15.0f, 0.0f, -21.0f, 6.0f)
+ reflectiveCurveToRelative(-16.0f, 16.0f, -13.0f, 41.0f)
+ reflectiveCurveToRelative(12.0f, 65.0f, 12.0f, 65.0f)
+ lineToRelative(3.0f, 13.0f)
+ lineToRelative(12.0f, -6.0f)
+ reflectiveCurveToRelative(-22.77f, -76.47f, -7.39f, -90.23f)
+ curveToRelative(0.0f, 0.0f, 2.39f, -4.77f, 24.39f, -3.77f)
+ curveToRelative(0.0f, 0.0f, -0.4f, -21.0f, -5.7f, -25.0f)
+ close()
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Face8TriangleInv.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Face8TriangleInv.kt
new file mode 100644
index 000000000..37cde3b2f
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Face8TriangleInv.kt
@@ -0,0 +1,131 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Face8TriangleInv() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ face8TriangleInv(SolidColor(Color.Yellow), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun face8TriangleInv(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ // face
+ builder.addPath(pathData1, fill = fgColor, stroke = Black, strokeLineWidth = 1.0f)
+
+ // shades
+ builder.addPath(pathData5, fill = Black, fillAlpha = 0.2f)
+ builder.addPath(pathData6, fill = Black, fillAlpha = 0.1f)
+ builder.addPath(pathData7, fill = Black, fillAlpha = 0.4f)
+
+ // outer line
+ builder.addPath(pathData2, stroke = Black, strokeLineWidth = 1.0f)
+
+ // inner line
+ builder.addPath(pathData20, stroke = Black, strokeLineWidth = 1.0f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(143.0f, 89.0f)
+ reflectiveCurveToRelative(-39.0f, 6.0f, -64.0f, 66.0f)
+ reflectiveCurveToRelative(15.5f, 70.5f, 34.5f, 74.5f)
+ reflectiveCurveToRelative(85.0f, 13.0f, 102.0f, -27.0f)
+ reflectiveCurveTo(175.5f, 85.5f, 143.0f, 89.0f)
+ close()
+ }
+private val pathData2 =
+ PathData {
+ moveTo(143.0f, 88.0f)
+ reflectiveCurveToRelative(-39.0f, 6.0f, -64.0f, 66.0f)
+ reflectiveCurveToRelative(15.5f, 70.5f, 34.5f, 74.5f)
+ reflectiveCurveToRelative(85.0f, 13.0f, 102.0f, -27.0f)
+ reflectiveCurveTo(175.5f, 84.5f, 143.0f, 88.0f)
+ close()
+ }
+private val pathData5 =
+ PathData {
+ moveTo(161.38f, 106.09f)
+ arcToRelative(20.31f, 20.31f, 0.0f, false, false, -1.88f, 4.41f)
+ curveToRelative(-1.0f, 6.0f, 2.0f, 11.0f, 9.0f, 19.0f)
+ reflectiveCurveToRelative(20.0f, 27.0f, 21.0f, 45.0f)
+ reflectiveCurveToRelative(1.0f, 35.0f, -13.0f, 45.0f)
+ reflectiveCurveToRelative(-24.21f, 14.08f, -24.21f, 14.08f)
+ reflectiveCurveToRelative(34.71f, 0.42f, 47.8f, -19.51f)
+ curveToRelative(11.41f, -15.58f, 10.59f, -36.0f, 0.0f, -59.77f)
+ curveToRelative(-11.09f, -27.31f, -33.81f, -44.6f, -33.81f, -44.6f)
+ close()
+ }
+private val pathData6 =
+ PathData {
+ moveTo(167.41f, 97.44f)
+ curveToRelative(-2.41f, -0.44f, -5.91f, 9.06f, -5.91f, 9.06f)
+ reflectiveCurveToRelative(27.0f, 14.0f, 39.0f, 48.0f)
+ reflectiveCurveToRelative(8.86f, 41.0f, 5.43f, 50.0f)
+ reflectiveCurveToRelative(-17.62f, 24.63f, -36.0f, 27.81f)
+ reflectiveCurveToRelative(37.6f, -2.82f, 45.6f, -29.82f)
+ curveToRelative(11.5f, -39.5f, -22.87f, -80.23f, -22.87f, -80.23f)
+ reflectiveCurveTo(175.0f, 101.0f, 167.41f, 97.44f)
+ close()
+ }
+private val pathData7 =
+ PathData {
+ moveTo(91.5f, 140.5f)
+ reflectiveCurveToRelative(-14.0f, 24.0f, -12.0f, 43.0f)
+ reflectiveCurveToRelative(12.0f, 26.0f, 19.0f, 31.0f)
+ reflectiveCurveToRelative(9.2f, 13.33f, 9.2f, 13.33f)
+ reflectiveCurveTo(72.0f, 224.0f, 71.08f, 186.84f)
+ curveToRelative(0.0f, 0.0f, 3.19f, -39.76f, 30.31f, -68.55f)
+ lineTo(113.22f, 108.0f)
+ reflectiveCurveTo(95.5f, 132.5f, 91.5f, 140.5f)
+ close()
+ }
+private val pathData20 =
+ PathData {
+ moveTo(139.5f, 98.5f)
+ reflectiveCurveToRelative(35.0f, 3.0f, 57.0f, 48.0f)
+ reflectiveCurveToRelative(13.83f, 72.0f, -24.08f, 85.0f)
+ curveToRelative(-54.92f, 7.0f, -79.92f, -7.0f, -91.0f, -16.46f)
+ curveToRelative(-1.5f, 0.92f, -21.0f, -20.3f, -3.0f, -60.55f)
+ curveTo(95.74f, 116.0f, 122.5f, 97.5f, 139.5f, 98.5f)
+ close()
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Face9Square.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Face9Square.kt
new file mode 100644
index 000000000..02f34907e
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Face9Square.kt
@@ -0,0 +1,91 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Face9Square() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ face9Square(SolidColor(Color.Blue), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun face9Square(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ builder.addPath(pathData1, fill = fgColor, stroke = Black, strokeLineWidth = 2.0f)
+ builder.addPath(pathData2, fill = Black, fillAlpha = 0.4f)
+ builder.addPath(pathData5, fill = Black, stroke = Black, fillAlpha = 0.2f, strokeLineWidth = 0.75f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(177.0f, 71.0f)
+ reflectiveCurveToRelative(-73.0f, -2.0f, -82.0f, 51.0f)
+ curveToRelative(0.0f, 0.0f, -4.5f, 17.5f, 1.5f, 40.5f)
+ reflectiveCurveToRelative(14.0f, 50.0f, 14.0f, 50.0f)
+ reflectiveCurveToRelative(6.0f, 10.0f, 46.0f, 6.0f)
+ reflectiveCurveToRelative(75.0f, -25.0f, 75.0f, -25.0f)
+ reflectiveCurveToRelative(-10.0f, -100.0f, -16.0f, -108.0f)
+ reflectiveCurveTo(203.0f, 72.0f, 177.0f, 71.0f)
+ close()
+ }
+private val pathData2 =
+ PathData {
+ moveTo(135.5f, 78.5f)
+ reflectiveCurveToRelative(1.0f, 4.0f, -5.0f, 9.0f)
+ reflectiveCurveToRelative(-20.0f, 12.0f, -25.0f, 31.0f)
+ reflectiveCurveToRelative(0.0f, 29.0f, 2.0f, 37.0f)
+ reflectiveCurveToRelative(7.0f, 25.0f, 6.0f, 35.0f)
+ reflectiveCurveToRelative(-4.75f, 16.0f, -4.75f, 16.0f)
+ reflectiveCurveToRelative(-21.38f, -60.92f, -12.82f, -89.0f)
+ reflectiveCurveTo(129.0f, 81.0f, 135.5f, 78.5f)
+ close()
+ }
+private val pathData5 =
+ PathData {
+ moveTo(205.5f, 86.5f)
+ reflectiveCurveToRelative(-27.0f, 2.0f, -29.0f, 28.0f)
+ reflectiveCurveToRelative(9.0f, 73.0f, 9.0f, 73.0f)
+ lineToRelative(5.38f, 23.67f)
+ lineTo(231.5f, 193.5f)
+ reflectiveCurveToRelative(-8.0f, -94.0f, -15.0f, -106.0f)
+ curveTo(216.48f, 87.51f, 208.5f, 86.5f, 205.5f, 86.5f)
+ close()
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Mouth0Horz.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Mouth0Horz.kt
new file mode 100644
index 000000000..4de7beca0
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Mouth0Horz.kt
@@ -0,0 +1,85 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Mouth0Horz() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ mouth0Horz(SolidColor(Color.Blue), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun mouth0Horz(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ builder.addPath(pathData1, fill = fgColor)
+ builder.addPath(pathData2, fill = Black, stroke = Black, fillAlpha = 0.4f, strokeLineWidth = 1.0f)
+ builder.addPath(pathData3, fill = Black)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(123.0f, 183.0f)
+ lineToRelative(-1.0f, 9.0f)
+ arcToRelative(26.74f, 26.74f, 0.0f, false, false, 3.5f, 0.5f)
+ curveToRelative(2.0f, 0.44f, 22.0f, 0.35f, 23.0f, -1.0f)
+ lineToRelative(-1.0f, -9.0f)
+ reflectiveCurveTo(132.5f, 181.5f, 123.0f, 183.0f)
+ close()
+ }
+private val pathData2 =
+ PathData {
+ moveTo(123.0f, 183.0f)
+ lineToRelative(-1.0f, 9.0f)
+ arcToRelative(26.74f, 26.74f, 0.0f, false, false, 3.5f, 0.5f)
+ curveToRelative(2.0f, 0.44f, 22.0f, 0.35f, 23.0f, -1.0f)
+ lineToRelative(-1.0f, -9.0f)
+ reflectiveCurveTo(132.5f, 181.5f, 123.0f, 183.0f)
+ close()
+ }
+private val pathData3 =
+ PathData {
+ moveTo(123.5f, 183.34f)
+ reflectiveCurveToRelative(3.07f, 2.66f, 12.26f, 2.66f)
+ reflectiveCurveTo(147.0f, 182.45f, 147.0f, 182.45f)
+ arcToRelative(113.13f, 113.13f, 0.0f, false, false, -12.2f, -0.28f)
+ curveTo(129.63f, 182.45f, 124.52f, 182.45f, 123.5f, 183.34f)
+ close()
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Mouth1Cylinder.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Mouth1Cylinder.kt
new file mode 100644
index 000000000..3dbdb298a
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Mouth1Cylinder.kt
@@ -0,0 +1,97 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Mouth1Cylinder() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ mouth1Cylinder(SolidColor(Color.Blue), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun mouth1Cylinder(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ builder.addPath(pathData1, fill = fgColor, stroke = Black, strokeLineWidth = 1.0f)
+ builder.addPath(pathData3, fill = Black, stroke = Black, fillAlpha = 0.4f, strokeLineWidth = 0.75f)
+ builder.addPath(pathData5, stroke = Black, strokeLineWidth = 0.75f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(126.0f, 180.0f)
+ arcToRelative(129.54f, 129.54f, 0.0f, false, true, 3.0f, 25.0f)
+ arcToRelative(19.93f, 19.93f, 0.0f, false, false, 10.0f, 1.0f)
+ arcToRelative(24.23f, 24.23f, 0.0f, false, false, 8.5f, -3.5f)
+ reflectiveCurveToRelative(-4.0f, -23.0f, -4.0f, -25.0f)
+ curveToRelative(0.0f, 0.0f, -6.0f, 2.0f, -9.0f, 2.0f)
+ curveToRelative(-1.54f, 0.0f, -3.73f, 0.13f, -5.51f, 0.26f)
+ reflectiveCurveTo(126.0f, 180.0f, 126.0f, 180.0f)
+ close()
+ }
+private val pathData3 =
+ PathData {
+ moveTo(131.5f, 190.71f)
+ arcToRelative(113.49f, 113.49f, 0.0f, false, true, 1.0f, 12.25f)
+ lineToRelative(-3.0f, 1.54f)
+ reflectiveCurveToRelative(-1.0f, -14.0f, -2.28f, -18.07f)
+ curveToRelative(-0.72f, -2.86f, -1.15f, -6.11f, -1.15f, -6.11f)
+ lineToRelative(3.43f, 0.18f)
+ reflectiveCurveTo(130.5f, 182.55f, 131.5f, 190.71f)
+ close()
+ moveTo(129.29f, 205.11f)
+ lineToRelative(3.21f, -1.61f)
+ arcToRelative(32.0f, 32.0f, 0.0f, false, false, 7.0f, -1.0f)
+ arcToRelative(53.36f, 53.36f, 0.0f, false, false, 7.56f, -2.57f)
+ lineToRelative(0.44f, 2.57f)
+ reflectiveCurveToRelative(-4.93f, 3.27f, -7.0f, 3.14f)
+ reflectiveCurveTo(138.07f, 207.71f, 129.29f, 205.11f)
+ close()
+ }
+private val pathData5 =
+ PathData {
+ moveTo(131.81f, 193.42f)
+ curveToRelative(0.93f, 0.47f, 1.84f, 0.92f, 1.69f, -0.92f)
+ curveToRelative(0.0f, 0.0f, 0.0f, -2.0f, 1.0f, -2.0f)
+ reflectiveCurveToRelative(7.0f, -1.0f, 7.0f, -1.0f)
+ arcToRelative(1.0f, 1.0f, 0.0f, false, true, 1.0f, 1.0f)
+ curveToRelative(0.0f, 1.0f, 0.0f, 3.0f, 1.0f, 2.0f)
+ arcToRelative(3.44f, 3.44f, 0.0f, false, true, 2.12f, -1.0f)
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Mouth2Teeth.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Mouth2Teeth.kt
new file mode 100644
index 000000000..1265448ff
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Mouth2Teeth.kt
@@ -0,0 +1,142 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.DarkYellow
+import com.vitorpamplona.amethyst.commons.OrangeOne
+import com.vitorpamplona.amethyst.commons.OrangeTwo
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Mouth2Teeth() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ mouth2Teeth(SolidColor(Color.Blue), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun mouth2Teeth(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ builder.addPath(pathData1, fill = fgColor, stroke = Black, strokeLineWidth = 2.0f)
+ builder.addPath(pathData3, fill = OrangeOne)
+ builder.addPath(pathData4, fill = OrangeTwo)
+ builder.addPath(pathData5, fill = Black, stroke = Black, fillAlpha = 0.4f, strokeLineWidth = 1.0f)
+ builder.addPath(pathData6, fill = DarkYellow, stroke = Black, strokeLineWidth = 0.75f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(170.5f, 168.5f)
+ reflectiveCurveTo(151.0f, 177.0f, 141.0f, 179.0f)
+ lineToRelative(-1.0f, 0.2f)
+ arcToRelative(112.0f, 112.0f, 0.0f, false, true, -32.68f, 1.74f)
+ quadToRelative(-1.88f, -0.18f, -3.82f, -0.44f)
+ lineToRelative(6.0f, 20.0f)
+ arcToRelative(51.86f, 51.86f, 0.0f, false, false, 26.0f, 5.0f)
+ curveToRelative(15.0f, -1.0f, 35.0f, -7.0f, 41.0f, -15.0f)
+ close()
+ }
+private val pathData3 =
+ PathData {
+ moveTo(118.0f, 181.0f)
+ reflectiveCurveToRelative(3.13f, 7.7f, 4.06f, 9.85f)
+ reflectiveCurveToRelative(2.31f, 5.09f, 2.12f, 7.12f)
+ horizontalLineToRelative(0.0f)
+ lineToRelative(0.19f, 4.0f)
+ arcToRelative(72.8f, 72.8f, 0.0f, false, true, 7.93f, 0.57f)
+ curveTo(135.0f, 203.0f, 144.0f, 201.0f, 144.0f, 201.0f)
+ arcToRelative(14.36f, 14.36f, 0.0f, false, true, -0.15f, -3.0f)
+ curveToRelative(0.15f, -1.0f, -3.27f, -16.16f, -3.27f, -16.16f)
+ lineToRelative(-1.0f, -2.27f)
+ lineTo(135.0f, 180.0f)
+ lineToRelative(-9.08f, 1.13f)
+ close()
+ }
+private val pathData4 =
+ PathData {
+ moveTo(155.48f, 174.52f)
+ lineTo(159.0f, 185.15f)
+ lineToRelative(2.0f, 9.85f)
+ verticalLineToRelative(2.0f)
+ reflectiveCurveToRelative(10.25f, -4.55f, 12.63f, -6.27f)
+ lineTo(176.0f, 189.0f)
+ lineToRelative(-3.63f, -13.65f)
+ lineToRelative(-1.85f, -6.79f)
+ close()
+ }
+private val pathData5 =
+ PathData {
+ moveTo(110.5f, 199.5f)
+ lineToRelative(2.0f, -2.0f)
+ reflectiveCurveToRelative(-3.0f, -10.0f, -4.0f, -13.0f)
+ reflectiveCurveToRelative(-1.87f, -3.63f, -1.87f, -3.63f)
+ lineToRelative(-3.13f, -0.37f)
+ lineToRelative(3.38f, 11.26f)
+ lineToRelative(2.5f, 8.33f)
+ close()
+
+ moveTo(113.5f, 198.5f)
+ reflectiveCurveToRelative(2.0f, 3.0f, 14.0f, 4.0f)
+ reflectiveCurveToRelative(35.0f, -6.0f, 35.0f, -6.0f)
+ reflectiveCurveTo(174.56f, 191.0f, 176.0f, 188.77f)
+ lineToRelative(0.47f, 1.73f)
+ reflectiveCurveToRelative(-7.38f, 11.0f, -40.69f, 15.0f)
+ curveToRelative(0.0f, 0.0f, -16.31f, 1.0f, -26.31f, -5.0f)
+ lineToRelative(3.0f, -3.0f)
+ close()
+ }
+private val pathData6 =
+ PathData {
+ moveTo(119.94f, 181.44f)
+ reflectiveCurveToRelative(2.56f, 10.06f, 3.56f, 13.06f)
+ arcToRelative(27.84f, 27.84f, 0.0f, false, true, 0.88f, 7.67f)
+ reflectiveCurveToRelative(-7.88f, 0.33f, -11.88f, -4.67f)
+ lineToRelative(-5.0f, -15.0f)
+ arcToRelative(5.38f, 5.38f, 0.0f, false, false, -1.0f, -1.7f)
+ arcTo(80.36f, 80.36f, 0.0f, false, false, 119.94f, 181.44f)
+ close()
+ moveTo(140.5f, 181.5f)
+ curveToRelative(0.0f, 0.14f, 4.14f, 18.0f, 3.56f, 19.5f)
+ curveToRelative(0.0f, 0.0f, 15.93f, -2.76f, 17.18f, -4.13f)
+ curveToRelative(0.0f, 0.0f, -1.75f, -10.37f, -2.75f, -13.37f)
+ reflectiveCurveToRelative(-3.0f, -9.0f, -3.0f, -9.0f)
+ reflectiveCurveToRelative(-7.82f, 3.0f, -10.4f, 3.47f)
+ arcToRelative(54.09f, 54.09f, 0.0f, false, false, -5.58f, 1.51f)
+ arcTo(6.0f, 6.0f, 0.0f, false, true, 140.5f, 181.5f)
+ close()
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Mouth3Grid.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Mouth3Grid.kt
new file mode 100644
index 000000000..587b2fcb1
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Mouth3Grid.kt
@@ -0,0 +1,171 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.DarkYellow
+import com.vitorpamplona.amethyst.commons.Yellow
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Mouth3Grid() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ mouth3Grid(SolidColor(Color.Blue), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun mouth3Grid(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ builder.addPath(pathData1, fill = fgColor, stroke = Black, strokeLineWidth = 1.8f)
+ builder.addPath(pathData2, fill = Yellow)
+ builder.addPath(pathData3, fill = DarkYellow)
+ builder.addPath(pathData7, fill = Black, stroke = Black, fillAlpha = 0.4f, strokeLineWidth = 0.75f)
+ builder.addPath(pathData9, stroke = Black, strokeLineWidth = 0.75f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(104.0f, 173.0f)
+ reflectiveCurveToRelative(5.5f, 23.5f, 5.5f, 27.5f)
+ curveToRelative(0.0f, 0.0f, 6.0f, 5.0f, 24.0f, 5.0f)
+ reflectiveCurveToRelative(41.0f, -10.0f, 43.0f, -14.0f)
+ curveToRelative(0.0f, 0.0f, -4.0f, -29.0f, -5.0f, -30.0f)
+ curveToRelative(0.0f, 0.0f, -25.0f, 11.0f, -45.0f, 12.0f)
+ curveToRelative(-10.61f, 0.62f, -16.74f, 0.27f, -19.85f, -0.08f)
+ arcTo(20.06f, 20.06f, 0.0f, false, true, 104.0f, 173.0f)
+ close()
+ }
+private val pathData2 =
+ PathData {
+ moveTo(106.65f, 173.42f)
+ reflectiveCurveToRelative(3.08f, 5.1f, 4.72f, 14.34f)
+ reflectiveCurveToRelative(1.0f, 10.85f, 1.0f, 10.85f)
+ reflectiveCurveTo(123.0f, 203.0f, 128.0f, 203.0f)
+ arcToRelative(73.0f, 73.0f, 0.0f, false, false, 18.0f, -1.77f)
+ arcToRelative(131.07f, 131.07f, 0.0f, false, false, 22.47f, -7.33f)
+ lineToRelative(7.93f, -3.29f)
+ lineToRelative(-3.18f, -21.13f)
+ lineToRelative(-1.7f, -8.0f)
+ reflectiveCurveToRelative(-26.0f, 11.0f, -45.0f, 12.0f)
+ reflectiveCurveToRelative(-20.0f, 0.0f, -20.0f, 0.0f)
+ }
+private val pathData3 =
+ PathData {
+ moveTo(142.5f, 181.5f)
+ verticalLineTo(190.0f)
+ lineToRelative(17.5f, -4.0f)
+ lineToRelative(1.0f, 6.0f)
+ verticalLineToRelative(4.9f)
+ lineToRelative(15.0f, -5.9f)
+ lineToRelative(-3.0f, -20.5f)
+ curveTo(173.15f, 170.88f, 153.19f, 178.85f, 142.5f, 181.5f)
+ close()
+ moveTo(142.4f, 190.0f)
+ arcToRelative(38.22f, 38.22f, 0.0f, false, false, 2.1f, 11.5f)
+ reflectiveCurveToRelative(-10.5f, 1.5f, -17.0f, 1.0f)
+ reflectiveCurveTo(113.0f, 199.0f, 113.0f, 199.0f)
+ lineToRelative(-2.5f, -15.5f)
+ horizontalLineToRelative(11.0f)
+ lineTo(123.0f, 191.0f)
+ arcTo(122.0f, 122.0f, 0.0f, false, false, 142.4f, 190.0f)
+ close()
+ moveTo(118.0f, 174.0f)
+ lineToRelative(3.5f, 9.0f)
+ curveToRelative(7.62f, 0.33f, 21.0f, -1.5f, 21.0f, -1.5f)
+ reflectiveCurveToRelative(-1.13f, -7.27f, -2.5f, -9.5f)
+ close()
+ }
+private val pathData6 =
+ PathData {
+ moveTo(104.0f, 173.0f)
+ reflectiveCurveToRelative(5.5f, 23.5f, 5.5f, 27.5f)
+ curveToRelative(0.0f, 0.0f, 6.0f, 5.0f, 24.0f, 5.0f)
+ reflectiveCurveToRelative(41.0f, -10.0f, 43.0f, -14.0f)
+ curveToRelative(0.0f, 0.0f, -4.0f, -29.0f, -5.0f, -30.0f)
+ curveToRelative(0.0f, 0.0f, -25.0f, 11.0f, -45.0f, 12.0f)
+ curveToRelative(-10.61f, 0.62f, -16.74f, 0.27f, -19.85f, -0.08f)
+ arcTo(20.06f, 20.06f, 0.0f, false, true, 104.0f, 173.0f)
+ close()
+ }
+private val pathData7 =
+ PathData {
+ moveTo(112.33f, 198.61f)
+ reflectiveCurveTo(122.0f, 203.0f, 130.0f, 203.0f)
+ reflectiveCurveToRelative(23.5f, -2.5f, 32.5f, -6.5f)
+ reflectiveCurveToRelative(13.88f, -5.89f, 13.88f, -5.89f)
+ lineToRelative(0.12f, 0.89f)
+ arcToRelative(31.45f, 31.45f, 0.0f, false, true, -8.77f, 5.75f)
+ curveToRelative(-5.23f, 2.25f, -19.73f, 8.25f, -35.48f, 8.25f)
+ reflectiveCurveToRelative(-22.75f, -5.0f, -22.75f, -5.0f)
+ lineToRelative(2.83f, -1.89f)
+
+ moveTo(107.5f, 174.5f)
+ arcToRelative(93.08f, 93.08f, 0.0f, false, true, 4.0f, 14.0f)
+ arcToRelative(67.34f, 67.34f, 0.0f, false, true, 1.0f, 10.0f)
+ lineToRelative(-3.0f, 2.0f)
+ reflectiveCurveToRelative(-2.2f, -15.2f, -4.6f, -23.6f)
+ lineToRelative(-0.9f, -3.69f)
+ lineToRelative(2.93f, 0.25f)
+ close()
+ }
+private val pathData9 =
+ PathData {
+ moveTo(124.61f, 202.46f)
+ curveToRelative(0.11f, -5.0f, -2.11f, -16.0f, -4.11f, -22.0f)
+ reflectiveCurveToRelative(-3.42f, -6.66f, -3.42f, -6.66f)
+ moveTo(140.25f, 171.58f)
+ reflectiveCurveToRelative(2.25f, 5.92f, 2.25f, 9.92f)
+ verticalLineToRelative(8.0f)
+ reflectiveCurveToRelative(0.33f, 10.83f, 2.67f, 11.92f)
+ moveTo(112.0f, 191.0f)
+ reflectiveCurveToRelative(17.0f, 1.0f, 30.0f, -1.0f)
+ reflectiveCurveToRelative(30.0f, -7.0f, 30.0f, -7.0f)
+ lineToRelative(3.0f, -1.0f)
+ moveTo(142.5f, 181.5f)
+ verticalLineToRelative(8.42f)
+ lineToRelative(17.51f, -3.7f)
+ lineToRelative(1.0f, 8.28f)
+ verticalLineTo(197.0f)
+ reflectiveCurveToRelative(-1.0f, -9.0f, -2.0f, -14.0f)
+ reflectiveCurveToRelative(-2.84f, -12.76f, -2.84f, -12.76f)
+ moveTo(176.5f, 190.5f)
+ lineTo(173.0f, 170.0f)
+ curveToRelative(-1.23f, 1.23f, -7.76f, 4.0f, -15.16f, 6.6f)
+ curveToRelative(-4.63f, 1.64f, -9.61f, 3.24f, -13.84f, 4.4f)
+ curveToRelative(-11.0f, 3.0f, -33.55f, 2.5f, -33.55f, 2.5f)
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Mouth4Vert.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Mouth4Vert.kt
new file mode 100644
index 000000000..b71d9a0ce
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Mouth4Vert.kt
@@ -0,0 +1,102 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.Brown
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Mouth4Vert() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ mouth4Vert(SolidColor(Color.Blue), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun mouth4Vert(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ builder.addPath(pathData1, fill = fgColor, stroke = Black, strokeLineWidth = 1.0f)
+ builder.addPath(pathData3, fill = Black, fillAlpha = 0.4f, strokeAlpha = 0.4f)
+ builder.addPath(pathData5, fill = Brown, stroke = Black, strokeLineWidth = 0.5f)
+ builder.addPath(pathData7, fill = Black, stroke = Black, fillAlpha = 0.4f, strokeLineWidth = 0.75f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(130.5f, 175.5f)
+ verticalLineToRelative(15.0f)
+ arcToRelative(73.09f, 73.09f, 0.0f, false, false, 1.0f, 13.0f)
+ reflectiveCurveToRelative(6.0f, 1.0f, 6.0f, 0.0f)
+ reflectiveCurveToRelative(-1.0f, -28.0f, -1.0f, -28.0f)
+ curveTo(134.18f, 175.38f, 131.28f, 175.06f, 130.5f, 175.5f)
+ close()
+ }
+private val pathData3 =
+ PathData {
+ moveTo(131.65f, 203.0f)
+ arcToRelative(75.68f, 75.68f, 0.0f, false, true, -1.4f, -15.06f)
+ arcToRelative(102.33f, 102.33f, 0.0f, false, true, 0.48f, -12.27f)
+ arcToRelative(3.0f, 3.0f, 0.0f, false, true, 1.25f, -0.25f)
+ arcToRelative(5.33f, 5.33f, 0.0f, false, true, 1.0f, 0.1f)
+ lineToRelative(0.43f, 0.2f)
+ horizontalLineToRelative(0.0f)
+ reflectiveCurveToRelative(0.0f, 0.16f, -0.13f, 0.72f)
+ arcToRelative(138.49f, 138.49f, 0.0f, false, false, -1.0f, 14.06f)
+ arcToRelative(64.14f, 64.14f, 0.0f, false, false, 1.0f, 10.92f)
+ close()
+ }
+private val pathData5 =
+ PathData {
+ moveTo(137.19f, 201.56f)
+ arcToRelative(5.59f, 5.59f, 0.0f, false, false, -2.48f, -0.65f)
+ arcToRelative(3.64f, 3.64f, 0.0f, false, false, -1.34f, 0.25f)
+ arcToRelative(39.16f, 39.16f, 0.0f, false, true, -1.12f, -9.0f)
+ curveToRelative(0.0f, -4.56f, 1.26f, -14.93f, 1.47f, -16.62f)
+ lineToRelative(2.54f, 0.17f)
+ lineToRelative(0.56f, 15.47f)
+ close()
+ }
+private val pathData7 =
+ PathData {
+ moveTo(137.5f, 201.5f)
+ verticalLineToRelative(2.0f)
+ lineToRelative(-5.7f, 0.0f)
+ lineToRelative(1.7f, -2.0f)
+ reflectiveCurveTo(134.5f, 199.5f, 137.5f, 201.5f)
+ close()
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Mouth5Midopen.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Mouth5Midopen.kt
new file mode 100644
index 000000000..51f9a9284
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Mouth5Midopen.kt
@@ -0,0 +1,94 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.Brown
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Mouth5MidOpen() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ mouth5MidOpen(SolidColor(Color.Yellow), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun mouth5MidOpen(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ builder.addPath(pathData1, fill = fgColor)
+ builder.addPath(pathData2, fill = Black, stroke = Black, fillAlpha = 0.4f, strokeLineWidth = 1.0f)
+ builder.addPath(pathData3, fill = Brown, stroke = Black, strokeLineWidth = 0.5f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(149.0f, 179.0f)
+ reflectiveCurveToRelative(-12.0f, 2.0f, -15.0f, 2.0f)
+ reflectiveCurveToRelative(-13.5f, 1.5f, -15.5f, 5.5f)
+ reflectiveCurveToRelative(-1.0f, 11.5f, 8.0f, 10.5f)
+ reflectiveCurveToRelative(12.0f, -1.5f, 20.0f, -2.5f)
+ reflectiveCurveToRelative(13.0f, -4.0f, 14.0f, -6.0f)
+ reflectiveCurveToRelative(0.0f, -5.0f, -2.0f, -7.0f)
+ reflectiveCurveTo(154.5f, 178.5f, 149.0f, 179.0f)
+ close()
+ }
+private val pathData2 =
+ PathData {
+ moveTo(149.0f, 179.0f)
+ reflectiveCurveToRelative(-12.0f, 2.0f, -15.0f, 2.0f)
+ reflectiveCurveToRelative(-11.5f, 0.5f, -14.5f, 4.5f)
+ curveToRelative(-4.0f, 4.0f, -2.0f, 11.5f, 7.0f, 11.5f)
+ curveToRelative(8.0f, 0.0f, 12.0f, -1.5f, 20.0f, -2.5f)
+ reflectiveCurveToRelative(13.0f, -4.0f, 14.0f, -6.0f)
+ reflectiveCurveToRelative(0.0f, -5.0f, -2.0f, -7.0f)
+ reflectiveCurveTo(154.5f, 178.5f, 149.0f, 179.0f)
+ close()
+ }
+private val pathData3 =
+ PathData {
+ moveTo(121.5f, 184.5f)
+ reflectiveCurveToRelative(-3.0f, 4.0f, -1.0f, 6.0f)
+ reflectiveCurveToRelative(4.0f, 3.0f, 12.0f, 2.0f)
+ reflectiveCurveToRelative(13.0f, -3.0f, 18.0f, -3.0f)
+ reflectiveCurveToRelative(10.83f, -2.26f, 9.42f, -6.13f)
+ reflectiveCurveToRelative(-5.75f, -5.12f, -8.58f, -4.5f)
+ reflectiveCurveToRelative(-12.7f, 1.53f, -16.26f, 2.08f)
+ reflectiveCurveToRelative(-6.7f, -0.1f, -10.63f, 1.73f)
+ reflectiveCurveTo(121.5f, 184.5f, 121.5f, 184.5f)
+ close()
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Mouth6Cell.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Mouth6Cell.kt
new file mode 100644
index 000000000..24ddbed70
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Mouth6Cell.kt
@@ -0,0 +1,183 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.Brown
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Mouth6Cell() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ mouth6Cell(SolidColor(Color.Yellow), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun mouth6Cell(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ builder.addPath(pathData1, fill = fgColor, stroke = Black, strokeLineWidth = 1.0f)
+ builder.addPath(pathData5, fill = Black, fillAlpha = 0.4f)
+ builder.addPath(pathData7, fill = Brown, stroke = Black, strokeLineWidth = 0.5f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(122.0f, 180.0f)
+ reflectiveCurveToRelative(1.0f, 10.0f, 2.0f, 14.0f)
+ reflectiveCurveToRelative(1.5f, 6.5f, 1.5f, 6.5f)
+ reflectiveCurveToRelative(3.0f, 0.0f, 4.0f, -1.0f)
+ reflectiveCurveToRelative(-2.0f, -17.0f, -2.0f, -18.0f)
+ verticalLineToRelative(-2.0f)
+ reflectiveCurveToRelative(-1.49f, 0.0f, -3.0f, 0.11f)
+ arcTo(12.0f, 12.0f, 0.0f, false, false, 122.0f, 180.0f)
+ close()
+ moveTo(131.0f, 179.0f)
+ reflectiveCurveToRelative(1.0f, 10.0f, 2.0f, 14.0f)
+ reflectiveCurveToRelative(1.5f, 6.5f, 1.5f, 6.5f)
+ reflectiveCurveToRelative(3.0f, 0.0f, 4.0f, -1.0f)
+ reflectiveCurveToRelative(-2.0f, -17.0f, -2.0f, -18.0f)
+ verticalLineToRelative(-2.0f)
+ reflectiveCurveToRelative(-1.49f, 0.0f, -3.0f, 0.11f)
+ arcTo(12.0f, 12.0f, 0.0f, false, false, 131.0f, 179.0f)
+ close()
+ moveTo(141.0f, 179.0f)
+ reflectiveCurveToRelative(1.0f, 10.0f, 2.0f, 14.0f)
+ reflectiveCurveToRelative(1.5f, 6.5f, 1.5f, 6.5f)
+ reflectiveCurveToRelative(3.0f, 0.0f, 4.0f, -1.0f)
+ reflectiveCurveToRelative(-2.0f, -17.0f, -2.0f, -18.0f)
+ verticalLineToRelative(-2.0f)
+ reflectiveCurveToRelative(-1.49f, 0.0f, -3.0f, 0.11f)
+ arcTo(12.0f, 12.0f, 0.0f, false, false, 141.0f, 179.0f)
+ close()
+ moveTo(149.0f, 178.0f)
+ reflectiveCurveToRelative(1.0f, 10.0f, 2.0f, 14.0f)
+ reflectiveCurveToRelative(1.5f, 6.5f, 1.5f, 6.5f)
+ reflectiveCurveToRelative(3.0f, 0.0f, 4.0f, -1.0f)
+ reflectiveCurveToRelative(-2.0f, -17.0f, -2.0f, -18.0f)
+ verticalLineToRelative(-2.0f)
+ reflectiveCurveToRelative(-1.49f, 0.0f, -3.0f, 0.11f)
+ arcTo(12.0f, 12.0f, 0.0f, false, false, 149.0f, 178.0f)
+ close()
+ }
+private val pathData5 =
+ PathData {
+ moveTo(122.0f, 180.0f)
+ reflectiveCurveToRelative(1.0f, 10.0f, 2.0f, 14.0f)
+ reflectiveCurveToRelative(1.5f, 6.5f, 1.5f, 6.5f)
+ reflectiveCurveToRelative(3.0f, 0.0f, 4.0f, -1.0f)
+ reflectiveCurveToRelative(-2.0f, -17.0f, -2.0f, -18.0f)
+ verticalLineToRelative(-2.0f)
+ reflectiveCurveToRelative(-1.49f, 0.0f, -3.0f, 0.11f)
+ arcTo(12.0f, 12.0f, 0.0f, false, false, 122.0f, 180.0f)
+ close()
+ moveTo(131.0f, 179.0f)
+ reflectiveCurveToRelative(1.0f, 10.0f, 2.0f, 14.0f)
+ reflectiveCurveToRelative(1.5f, 6.5f, 1.5f, 6.5f)
+ reflectiveCurveToRelative(3.0f, 0.0f, 4.0f, -1.0f)
+ reflectiveCurveToRelative(-2.0f, -17.0f, -2.0f, -18.0f)
+ verticalLineToRelative(-2.0f)
+ reflectiveCurveToRelative(-1.49f, 0.0f, -3.0f, 0.11f)
+ arcTo(12.0f, 12.0f, 0.0f, false, false, 131.0f, 179.0f)
+ close()
+ moveTo(141.0f, 179.0f)
+ reflectiveCurveToRelative(1.0f, 10.0f, 2.0f, 14.0f)
+ reflectiveCurveToRelative(1.5f, 6.5f, 1.5f, 6.5f)
+ reflectiveCurveToRelative(3.0f, 0.0f, 4.0f, -1.0f)
+ reflectiveCurveToRelative(-2.0f, -17.0f, -2.0f, -18.0f)
+ verticalLineToRelative(-2.0f)
+ reflectiveCurveToRelative(-1.49f, 0.0f, -3.0f, 0.11f)
+ arcTo(12.0f, 12.0f, 0.0f, false, false, 141.0f, 179.0f)
+ close()
+ moveTo(149.0f, 178.0f)
+ reflectiveCurveToRelative(1.0f, 10.0f, 2.0f, 14.0f)
+ reflectiveCurveToRelative(1.5f, 6.5f, 1.5f, 6.5f)
+ reflectiveCurveToRelative(3.0f, 0.0f, 4.0f, -1.0f)
+ reflectiveCurveToRelative(-2.0f, -17.0f, -2.0f, -18.0f)
+ verticalLineToRelative(-2.0f)
+ reflectiveCurveToRelative(-1.49f, 0.0f, -3.0f, 0.11f)
+ arcTo(12.0f, 12.0f, 0.0f, false, false, 149.0f, 178.0f)
+ close()
+ }
+
+private val pathData7 =
+ PathData {
+ moveTo(124.5f, 180.5f)
+ reflectiveCurveToRelative(1.0f, 11.0f, 2.0f, 14.0f)
+ arcToRelative(15.77f, 15.77f, 0.0f, false, true, 1.0f, 4.0f)
+ reflectiveCurveToRelative(2.34f, -0.11f, 2.17f, 0.44f)
+ arcToRelative(31.0f, 31.0f, 0.0f, false, false, -0.82f, -8.63f)
+ arcToRelative(59.0f, 59.0f, 0.0f, false, true, -1.35f, -10.07f)
+ verticalLineToRelative(-0.75f)
+ horizontalLineToRelative(-3.0f)
+ close()
+ moveTo(125.85f, 200.49f)
+ lineTo(127.5f, 198.5f)
+ moveTo(133.5f, 179.5f)
+ reflectiveCurveToRelative(1.0f, 11.0f, 2.0f, 14.0f)
+ arcToRelative(15.77f, 15.77f, 0.0f, false, true, 1.0f, 4.0f)
+ reflectiveCurveToRelative(2.34f, -0.11f, 2.17f, 0.44f)
+ arcToRelative(31.0f, 31.0f, 0.0f, false, false, -0.82f, -8.63f)
+ arcToRelative(59.0f, 59.0f, 0.0f, false, true, -1.35f, -10.07f)
+ verticalLineToRelative(-0.75f)
+ horizontalLineToRelative(-3.0f)
+ close()
+ moveTo(134.85f, 199.49f)
+ lineTo(136.5f, 197.5f)
+ moveTo(143.5f, 179.5f)
+ reflectiveCurveToRelative(1.0f, 11.0f, 2.0f, 14.0f)
+ arcToRelative(15.77f, 15.77f, 0.0f, false, true, 1.0f, 4.0f)
+ reflectiveCurveToRelative(2.34f, -0.11f, 2.17f, 0.44f)
+ arcToRelative(31.0f, 31.0f, 0.0f, false, false, -0.82f, -8.63f)
+ arcToRelative(59.0f, 59.0f, 0.0f, false, true, -1.35f, -10.07f)
+ verticalLineToRelative(-0.75f)
+ horizontalLineToRelative(-3.0f)
+ close()
+ moveTo(144.85f, 199.49f)
+ lineTo(146.5f, 197.5f)
+ moveTo(151.5f, 178.5f)
+ reflectiveCurveToRelative(1.0f, 11.0f, 2.0f, 14.0f)
+ arcToRelative(15.77f, 15.77f, 0.0f, false, true, 1.0f, 4.0f)
+ reflectiveCurveToRelative(2.34f, -0.11f, 2.17f, 0.44f)
+ arcToRelative(31.0f, 31.0f, 0.0f, false, false, -0.82f, -8.63f)
+ arcToRelative(59.0f, 59.0f, 0.0f, false, true, -1.35f, -10.07f)
+ verticalLineToRelative(-0.75f)
+ horizontalLineToRelative(-3.0f)
+ close()
+ moveTo(152.85f, 198.49f)
+ lineTo(154.5f, 196.5f)
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Mouth7Happy.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Mouth7Happy.kt
new file mode 100644
index 000000000..4dd33110d
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Mouth7Happy.kt
@@ -0,0 +1,104 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.OrangeThree
+import com.vitorpamplona.amethyst.commons.Yellow
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Mouth7Happy() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ mouth7Happy(SolidColor(Color.Blue), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun mouth7Happy(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ builder.addPath(pathData1, fill = fgColor)
+ builder.addPath(pathData2, fill = Black, stroke = Black, fillAlpha = 0.4f, strokeLineWidth = 1.0f)
+ builder.addPath(pathData3, fill = OrangeThree, stroke = Black, strokeLineWidth = 1.0f)
+ builder.addPath(pathData4, fill = Yellow, stroke = Black, strokeLineWidth = 0.75f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(148.0f, 175.0f)
+ reflectiveCurveToRelative(-6.5f, 0.5f, -12.5f, 1.5f)
+ arcToRelative(83.3f, 83.3f, 0.0f, false, true, -12.0f, 1.0f)
+ verticalLineToRelative(14.0f)
+ curveToRelative(0.0f, 2.0f, 3.0f, 13.0f, 13.0f, 12.0f)
+ reflectiveCurveToRelative(13.0f, -7.0f, 13.0f, -11.0f)
+ reflectiveCurveToRelative(-1.0f, -17.0f, -1.0f, -17.0f)
+ horizontalLineToRelative(0.0f)
+ reflectiveCurveTo(148.5f, 174.5f, 148.0f, 175.0f)
+ close()
+ }
+private val pathData2 =
+ PathData {
+ moveTo(148.0f, 175.0f)
+ reflectiveCurveToRelative(-6.5f, 0.5f, -12.5f, 1.5f)
+ arcToRelative(83.3f, 83.3f, 0.0f, false, true, -12.0f, 1.0f)
+ verticalLineToRelative(14.0f)
+ curveToRelative(0.0f, 2.0f, 3.0f, 13.0f, 13.0f, 12.0f)
+ reflectiveCurveToRelative(13.0f, -7.0f, 13.0f, -11.0f)
+ reflectiveCurveToRelative(-1.0f, -17.0f, -1.0f, -17.0f)
+ horizontalLineToRelative(0.0f)
+ reflectiveCurveTo(148.5f, 174.5f, 148.0f, 175.0f)
+ close()
+ }
+private val pathData3 =
+ PathData {
+ moveTo(129.59f, 177.21f)
+ lineTo(130.0f, 191.0f)
+ reflectiveCurveToRelative(1.0f, 7.0f, 7.0f, 8.0f)
+ reflectiveCurveToRelative(12.0f, -0.83f, 12.5f, -4.92f)
+ reflectiveCurveToRelative(-1.0f, -19.58f, -1.0f, -19.58f)
+ lineToRelative(-10.88f, 1.67f)
+ curveTo(135.5f, 176.5f, 129.59f, 177.21f, 129.59f, 177.21f)
+ close()
+ }
+private val pathData4 =
+ PathData {
+ moveTo(137.25f, 176.19f)
+ lineToRelative(0.22f, 22.88f)
+ reflectiveCurveToRelative(-7.0f, -0.57f, -7.39f, -7.64f)
+ curveToRelative(-0.58f, -4.93f, -0.58f, -13.93f, -0.58f, -13.93f)
+ close()
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Mouth8Buttons.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Mouth8Buttons.kt
new file mode 100644
index 000000000..6b94e63bd
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Mouth8Buttons.kt
@@ -0,0 +1,143 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.OrangeThree
+import com.vitorpamplona.amethyst.commons.OrangeTwo
+import com.vitorpamplona.amethyst.commons.Yellow
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Mouth8Buttons() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ mouth8Buttons(SolidColor(Color.Blue), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun mouth8Buttons(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ builder.addPath(pathData1, fill = fgColor, stroke = Black, strokeLineWidth = 1.0f)
+ builder.addPath(pathData2, fill = Black, fillAlpha = 0.4f, strokeAlpha = 0.4f)
+ builder.addPath(pathData4, stroke = Black, strokeLineWidth = 0.5f)
+ builder.addPath(pathData7, fill = OrangeThree, stroke = Black, strokeLineWidth = 1.2f)
+ builder.addPath(pathData8, fill = Yellow, stroke = Black, strokeLineWidth = 0.75f)
+ builder.addPath(pathData10, fill = OrangeTwo, stroke = Black, strokeLineWidth = 0.75f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(109.5f, 197.5f)
+ curveToRelative(0.0f, 4.0f, 1.0f, 5.0f, 1.0f, 5.0f)
+ horizontalLineToRelative(34.0f)
+ curveToRelative(10.0f, 0.0f, 21.0f, -1.0f, 21.0f, -1.0f)
+ verticalLineToRelative(-23.0f)
+ lineToRelative(-1.0f, -4.0f)
+ horizontalLineToRelative(-2.0f)
+ curveToRelative(-2.0f, 0.0f, -54.5f, 0.5f, -54.5f, 0.5f)
+ verticalLineToRelative(11.0f)
+ close()
+ }
+private val pathData2 =
+ PathData {
+ moveTo(163.5f, 174.5f)
+ verticalLineToRelative(25.0f)
+ reflectiveCurveToRelative(-52.0f, 1.5f, -53.75f, 1.0f)
+ lineToRelative(0.61f, 1.79f)
+ lineToRelative(28.9f, 0.21f)
+ reflectiveCurveToRelative(19.65f, -0.79f, 21.7f, -0.65f)
+ arcTo(9.0f, 9.0f, 0.0f, false, false, 165.0f, 201.0f)
+ lineToRelative(0.41f, -22.84f)
+ reflectiveCurveTo(164.0f, 174.0f, 163.5f, 174.5f)
+ close()
+ }
+private val pathData4 =
+ PathData {
+ moveTo(113.5f, 200.5f)
+ horizontalLineToRelative(27.0f)
+ curveToRelative(10.0f, 0.0f, 23.0f, -1.0f, 23.0f, -1.0f)
+ verticalLineToRelative(-24.0f)
+ moveTo(163.5f, 199.5f)
+ lineTo(165.0f, 201.0f)
+ moveTo(162.0f, 177.0f)
+ verticalLineToRelative(12.0f)
+ }
+
+private val pathData7 =
+ PathData {
+ moveTo(112.5f, 177.5f)
+ horizontalLineToRelative(27.0f)
+ curveToRelative(9.0f, 0.0f, 20.0f, -1.0f, 20.0f, -1.0f)
+ verticalLineToRelative(20.0f)
+ lineToRelative(-54.0f, 1.0f)
+ arcToRelative(34.21f, 34.21f, 0.0f, false, true, 2.0f, -11.0f)
+ arcTo(44.27f, 44.27f, 0.0f, false, true, 112.5f, 177.5f)
+ close()
+ }
+private val pathData8 =
+ PathData {
+ moveTo(159.0f, 176.5f)
+ reflectiveCurveToRelative(-3.0f, 7.5f, -4.0f, 11.5f)
+ arcToRelative(87.0f, 87.0f, 0.0f, false, false, -1.59f, 8.61f)
+ lineToRelative(-12.91f, 0.19f)
+ reflectiveCurveToRelative(-1.0f, -2.3f, 1.0f, -7.3f)
+ reflectiveCurveToRelative(5.0f, -12.0f, 5.0f, -12.0f)
+ reflectiveCurveTo(157.5f, 177.0f, 159.0f, 176.5f)
+ close()
+ moveTo(128.5f, 196.89f)
+ horizontalLineToRelative(-11.0f)
+ arcToRelative(19.28f, 19.28f, 0.0f, false, true, 2.0f, -11.22f)
+ curveToRelative(3.0f, -6.12f, 3.75f, -8.16f, 3.75f, -8.16f)
+ horizontalLineToRelative(11.56f)
+ reflectiveCurveToRelative(-1.31f, 3.06f, -2.31f, 6.12f)
+ reflectiveCurveToRelative(-4.0f, 6.12f, -4.0f, 10.2f)
+ close()
+ }
+private val pathData10 =
+ PathData {
+ moveTo(135.13f, 177.5f)
+ horizontalLineTo(146.5f)
+ lineToRelative(-5.43f, 13.25f)
+ arcToRelative(8.08f, 8.08f, 0.0f, false, false, -0.82f, 4.0f)
+ curveToRelative(0.25f, 1.89f, 0.0f, 2.25f, 0.0f, 2.25f)
+ horizontalLineTo(128.5f)
+ arcToRelative(23.82f, 23.82f, 0.0f, false, true, 0.92f, -7.35f)
+ curveToRelative(1.08f, -3.08f, 2.1f, -3.0f, 3.59f, -7.58f)
+ reflectiveCurveTo(135.13f, 177.5f, 135.13f, 177.5f)
+ close()
+ }
diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Mouth9Closed.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Mouth9Closed.kt
new file mode 100644
index 000000000..e4aa64b98
--- /dev/null
+++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/robohashparts/Mouth9Closed.kt
@@ -0,0 +1,136 @@
+/**
+ * Copyright (c) 2024 Vitor Pamplona
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package com.vitorpamplona.amethyst.commons.robohashparts
+
+import androidx.compose.foundation.Image
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.vector.ImageVector.Builder
+import androidx.compose.ui.graphics.vector.PathData
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.tooling.preview.Preview
+import com.vitorpamplona.amethyst.commons.Black
+import com.vitorpamplona.amethyst.commons.roboBuilder
+
+@Preview
+@Composable
+fun Mouth9Closed() {
+ Image(
+ painter =
+ rememberVectorPainter(
+ roboBuilder {
+ mouth9Closed(SolidColor(Color.Blue), this)
+ },
+ ),
+ contentDescription = "",
+ )
+}
+
+fun mouth9Closed(
+ fgColor: SolidColor,
+ builder: Builder,
+) {
+ builder.addPath(pathData1, fill = fgColor, stroke = Black, strokeLineWidth = 1.0f)
+ builder.addPath(pathData3, fill = Black, stroke = Black, fillAlpha = 0.1f, strokeAlpha = 0.1f, strokeLineWidth = 1.0f)
+ builder.addPath(pathData4, fill = Black, fillAlpha = 0.4f, strokeAlpha = 1f, stroke = Black, strokeLineWidth = 1.0f)
+ builder.addPath(pathData6, fill = Black, stroke = Black, fillAlpha = 0.4f, strokeLineWidth = 0.75f)
+ builder.addPath(pathData7, stroke = Black, strokeLineWidth = 1.0f)
+}
+
+private val pathData1 =
+ PathData {
+ moveTo(105.5f, 180.5f)
+ reflectiveCurveToRelative(18.0f, 3.0f, 32.0f, 0.0f)
+ reflectiveCurveToRelative(32.0f, -11.0f, 32.0f, -11.0f)
+ horizontalLineToRelative(1.33f)
+ arcToRelative(1.13f, 1.13f, 0.0f, false, true, 0.85f, 0.65f)
+ lineToRelative(4.82f, 17.35f)
+ verticalLineToRelative(3.0f)
+ arcToRelative(3.73f, 3.73f, 0.0f, false, true, -0.94f, 1.67f)
+ curveToRelative(-2.53f, 1.85f, -9.8f, 6.88f, -17.06f, 9.3f)
+ arcToRelative(72.67f, 72.67f, 0.0f, false, true, -25.0f, 4.0f)
+ curveToRelative(-8.1f, 0.0f, -21.07f, -4.05f, -23.57f, -4.86f)
+ lineToRelative(-0.43f, -0.14f)
+ lineToRelative(-5.0f, -19.0f)
+ arcTo(1.0f, 1.0f, 0.0f, false, true, 105.5f, 180.5f)
+ close()
+ }
+private val pathData3 =
+ PathData {
+ moveTo(105.5f, 180.5f)
+ reflectiveCurveToRelative(18.0f, 3.0f, 32.0f, 0.0f)
+ reflectiveCurveToRelative(32.0f, -11.0f, 32.0f, -11.0f)
+ horizontalLineToRelative(1.33f)
+ arcToRelative(1.13f, 1.13f, 0.0f, false, true, 0.85f, 0.65f)
+ lineToRelative(4.82f, 17.35f)
+ verticalLineToRelative(3.0f)
+ arcToRelative(3.73f, 3.73f, 0.0f, false, true, -0.94f, 1.67f)
+ curveToRelative(-2.53f, 1.85f, -9.8f, 6.88f, -17.06f, 9.3f)
+ arcToRelative(72.67f, 72.67f, 0.0f, false, true, -25.0f, 4.0f)
+ curveToRelative(-8.1f, 0.0f, -21.07f, -4.05f, -23.57f, -4.86f)
+ lineToRelative(-0.43f, -0.14f)
+ lineToRelative(-5.0f, -19.0f)
+ arcTo(1.0f, 1.0f, 0.0f, false, true, 105.5f, 180.5f)
+ close()
+ }
+private val pathData4 =
+ PathData {
+ moveTo(108.33f, 195.83f)
+ curveToRelative(0.0f, -0.11f, -2.8f, -10.45f, -3.4f, -12.94f)
+ arcToRelative(6.79f, 6.79f, 0.0f, false, true, -0.3f, -2.0f)
+ arcToRelative(2.1f, 2.1f, 0.0f, false, true, 0.46f, 0.0f)
+ arcToRelative(3.0f, 3.0f, 0.0f, false, true, 1.77f, 0.84f)
+ curveToRelative(0.32f, 0.85f, 3.0f, 8.16f, 4.0f, 11.88f)
+ arcToRelative(31.56f, 31.56f, 0.0f, false, true, 1.0f, 5.64f)
+ lineToRelative(-2.35f, 0.78f)
+ close()
+ }
+private val pathData6 =
+ PathData {
+ moveTo(111.5f, 199.5f)
+ reflectiveCurveToRelative(17.0f, 6.0f, 36.0f, 2.0f)
+ reflectiveCurveToRelative(29.0f, -11.87f, 29.0f, -11.87f)
+ verticalLineToRelative(0.88f)
+ lineToRelative(-0.36f, 0.94f)
+ lineToRelative(-0.44f, 0.64f)
+ lineTo(174.0f, 193.33f)
+ lineToRelative(-7.0f, 4.33f)
+ lineTo(159.9f, 201.0f)
+ lineToRelative(-10.68f, 3.0f)
+ lineToRelative(-4.63f, 0.79f)
+ lineToRelative(-5.34f, 0.51f)
+ lineToRelative(-5.75f, 0.16f)
+ lineToRelative(-5.06f, -0.39f)
+ lineTo(121.0f, 203.7f)
+ lineTo(114.57f, 202.0f)
+ lineToRelative(-5.07f, -1.54f)
+ lineToRelative(-0.12f, -0.67f)
+ close()
+ }
+private val pathData7 =
+ PathData {
+ moveTo(116.51f, 200.51f)
+ curveToRelative(1.0f, -3.0f, 3.0f, -11.0f, 3.0f, -11.0f)
+ reflectiveCurveToRelative(4.0f, 2.0f, 13.0f, 2.0f)
+ reflectiveCurveToRelative(27.0f, -7.0f, 27.0f, -7.0f)
+ reflectiveCurveToRelative(7.0f, 6.0f, 8.0f, 10.0f)
+ }
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 6ac65c0e2..8ffad6262 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -57,6 +57,7 @@ androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", versi
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" }
androidx-fragment-ktx = { group = "androidx.fragment", name = "fragment-ktx", version.ref = "fragmentKtx" }
+androidx-compose-foundation = { group = "androidx.compose.foundation", name = "foundation" }
androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "androidxJunit" }
androidx-junit-ktx = { group = "androidx.test.ext", name = "junit-ktx", version.ref = "androidxJunit" }
androidx-lifecycle-livedata-ktx = { group = "androidx.lifecycle", name = "lifecycle-livedata-ktx", version.ref = "androidLifecycle" }