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" }