Merge branch 'main' into main

This commit is contained in:
greenart7c3
2024-03-13 07:17:52 -03:00
committed by GitHub
121 changed files with 8672 additions and 7635 deletions
@@ -27,18 +27,12 @@ import android.util.Log
import androidx.compose.runtime.Immutable
import com.fasterxml.jackson.module.kotlin.readValue
import com.vitorpamplona.amethyst.model.Account
import com.vitorpamplona.amethyst.model.BooleanType
import com.vitorpamplona.amethyst.model.ConnectivityType
import com.vitorpamplona.amethyst.model.DefaultReactions
import com.vitorpamplona.amethyst.model.DefaultZapAmounts
import com.vitorpamplona.amethyst.model.GLOBAL_FOLLOWS
import com.vitorpamplona.amethyst.model.KIND3_FOLLOWS
import com.vitorpamplona.amethyst.model.RelaySetupInfo
import com.vitorpamplona.amethyst.model.Settings
import com.vitorpamplona.amethyst.model.ThemeType
import com.vitorpamplona.amethyst.model.parseBooleanType
import com.vitorpamplona.amethyst.model.parseConnectivityType
import com.vitorpamplona.amethyst.model.parseThemeType
import com.vitorpamplona.amethyst.service.HttpClientManager
import com.vitorpamplona.amethyst.service.Nip96MediaServers
import com.vitorpamplona.amethyst.service.checkNotInMainThread
@@ -356,15 +350,6 @@ object LocalPreferences {
return currentAccount()?.let { loadCurrentAccountFromEncryptedStorage(it) }
}
suspend fun migrateOldSharedSettings(): Settings? {
val prefs = encryptedPreferences()
loadOldSharedSettings(prefs)?.let {
saveSharedSettings(it, prefs)
return it
}
return null
}
suspend fun saveSharedSettings(
sharedSettings: Settings,
prefs: SharedPreferences = encryptedPreferences(),
@@ -392,67 +377,6 @@ object LocalPreferences {
}
}
@Deprecated("Turned into a single JSON object")
suspend fun loadOldSharedSettings(prefs: SharedPreferences = encryptedPreferences()): Settings? {
with(prefs) {
if (!contains(PrefKeys.AUTOMATICALLY_START_PLAYBACK)) {
return null
}
val automaticallyShowImages =
if (contains(PrefKeys.AUTOMATICALLY_SHOW_IMAGES)) {
parseConnectivityType(getBoolean(PrefKeys.AUTOMATICALLY_SHOW_IMAGES, false))
} else {
ConnectivityType.ALWAYS
}
val automaticallyStartPlayback =
if (contains(PrefKeys.AUTOMATICALLY_START_PLAYBACK)) {
parseConnectivityType(getBoolean(PrefKeys.AUTOMATICALLY_START_PLAYBACK, false))
} else {
ConnectivityType.ALWAYS
}
val automaticallyShowUrlPreview =
if (contains(PrefKeys.AUTOMATICALLY_LOAD_URL_PREVIEW)) {
parseConnectivityType(getBoolean(PrefKeys.AUTOMATICALLY_LOAD_URL_PREVIEW, false))
} else {
ConnectivityType.ALWAYS
}
val automaticallyHideNavigationBars =
if (contains(PrefKeys.AUTOMATICALLY_HIDE_NAV_BARS)) {
parseBooleanType(getBoolean(PrefKeys.AUTOMATICALLY_HIDE_NAV_BARS, false))
} else {
BooleanType.ALWAYS
}
val automaticallyShowProfilePictures =
if (contains(PrefKeys.AUTOMATICALLY_SHOW_PROFILE_PICTURE)) {
parseConnectivityType(getBoolean(PrefKeys.AUTOMATICALLY_SHOW_PROFILE_PICTURE, false))
} else {
ConnectivityType.ALWAYS
}
val themeType =
if (contains(PrefKeys.THEME)) {
parseThemeType(getInt(PrefKeys.THEME, ThemeType.SYSTEM.screenCode))
} else {
ThemeType.SYSTEM
}
return Settings(
themeType,
getString(PrefKeys.PREFERRED_LANGUAGE, null)?.ifBlank { null },
automaticallyShowImages,
automaticallyStartPlayback,
automaticallyShowUrlPreview,
automaticallyHideNavigationBars,
automaticallyShowProfilePictures,
false,
false,
)
}
}
val mutex = Mutex()
suspend fun loadCurrentAccountFromEncryptedStorage(npub: String): Account? =
@@ -572,7 +572,7 @@ class Account(
if (!isWriteable()) return
MetadataEvent.updateFromPast(
latest = userProfile().info?.latestMetadata,
latest = userProfile().latestMetadata,
name = name,
picture = picture,
banner = banner,
@@ -27,6 +27,7 @@ import com.vitorpamplona.quartz.utils.TimeUtils
@Stable
class Chatroom() {
var authors: Set<User> = setOf()
var roomMessages: Set<Note> = setOf()
var subject: String? = null
var subjectCreatedAt: Long? = null
@@ -38,6 +39,12 @@ class Chatroom() {
if (msg !in roomMessages) {
roomMessages = roomMessages + msg
msg.author?.let { author ->
if (author !in authors) {
authors += author
}
}
val newSubject = msg.event?.subject()
if (newSubject != null && (msg.createdAt() ?: 0) > (subjectCreatedAt ?: 0)) {
@@ -51,8 +58,8 @@ class Chatroom() {
fun removeMessageSync(msg: Note) {
checkNotInMainThread()
if (msg !in roomMessages) {
roomMessages = roomMessages + msg
if (msg in roomMessages) {
roomMessages = roomMessages - msg
roomMessages
.filter { it.event?.subject() != null }
@@ -66,7 +73,7 @@ class Chatroom() {
}
fun senderIntersects(keySet: Set<HexKey>): Boolean {
return roomMessages.any { it.author?.pubkeyHex in keySet }
return authors.any { it.pubkeyHex in keySet }
}
fun pruneMessagesToTheLatestOnly(): Set<Note> {
@@ -21,162 +21,74 @@
package com.vitorpamplona.amethyst.model
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Immutable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.commons.HashTagSegment
import com.vitorpamplona.amethyst.commons.RegularTextSegment
import com.vitorpamplona.amethyst.ui.components.HashTag
import com.vitorpamplona.amethyst.ui.components.RenderRegular
import com.vitorpamplona.amethyst.ui.theme.ThemeComparisonColumn
import com.vitorpamplona.quartz.events.EmptyTagList
fun checkForHashtagWithIcon(
tag: String,
primary: Color,
): HashtagIcon? {
@Preview
@Composable
fun RenderHashTagIcons() {
val nav: (String) -> Unit = {}
ThemeComparisonColumn {
RenderRegular(
"Testing rendering of hashtags: #Bitcoin, #nostr, #lightning, #zap, #amethyst, #cashu, #plebs, #coffee, #skullofsatoshi, #grownostr, #footstr, #tunestr, #weed",
EmptyTagList,
) { word, state ->
when (word) {
is HashTagSegment -> HashTag(word, nav)
is RegularTextSegment -> Text(word.segmentText)
}
}
}
}
fun checkForHashtagWithIcon(tag: String): HashtagIcon? {
return when (tag.lowercase()) {
"₿itcoin",
"bitcoin",
"btc",
"timechain",
"bitcoiner",
"bitcoiners",
->
HashtagIcon(
R.drawable.ht_btc,
"Bitcoin",
Color.Unspecified,
Modifier.padding(2.dp, 2.dp, 0.dp, 0.dp),
)
"nostr",
"nostrich",
"nostriches",
"thenostr",
->
HashtagIcon(
R.drawable.ht_nostr,
"Nostr",
Color.Unspecified,
Modifier.padding(1.dp, 2.dp, 0.dp, 0.dp),
)
"lightning",
"lightningnetwork",
->
HashtagIcon(
R.drawable.ht_lightning,
"Lightning",
Color.Unspecified,
Modifier.padding(1.dp, 3.dp, 0.dp, 0.dp),
)
"zap",
"zaps",
"zapper",
"zappers",
"zapping",
"zapped",
"zapathon",
"zapraiser",
"zaplife",
"zapchain",
->
HashtagIcon(
R.drawable.zap,
"Zap",
Color.Unspecified,
Modifier.padding(1.dp, 3.dp, 0.dp, 0.dp),
)
"amethyst" ->
HashtagIcon(
R.drawable.amethyst,
"Amethyst",
Color.Unspecified,
Modifier.padding(3.dp, 2.dp, 0.dp, 0.dp),
)
"onyx" ->
HashtagIcon(
R.drawable.black_heart,
"Onyx",
Color.Unspecified,
Modifier.padding(1.dp, 3.dp, 0.dp, 0.dp),
)
"cashu",
"ecash",
"nut",
"nuts",
"deeznuts",
->
HashtagIcon(
R.drawable.cashu,
"Cashu",
Color.Unspecified,
Modifier.padding(1.dp, 3.dp, 0.dp, 0.dp),
)
"plebs",
"pleb",
"plebchain",
->
HashtagIcon(
R.drawable.plebs,
"Pleb",
Color.Unspecified,
Modifier.padding(2.dp, 2.dp, 0.dp, 1.dp),
)
"coffee",
"coffeechain",
"cafe",
->
HashtagIcon(
R.drawable.coffee,
"Coffee",
Color.Unspecified,
Modifier.padding(2.dp, 2.dp, 0.dp, 0.dp),
)
"skullofsatoshi" ->
HashtagIcon(
R.drawable.skull,
"SkullofSatoshi",
Color.Unspecified,
Modifier.padding(2.dp, 1.dp, 0.dp, 0.dp),
)
"grownostr",
"gardening",
"garden",
->
HashtagIcon(
R.drawable.grownostr,
"GrowNostr",
Color.Unspecified,
Modifier.padding(0.dp, 1.dp, 0.dp, 1.dp),
)
"footstr" ->
HashtagIcon(
R.drawable.footstr,
"Footstr",
Color.Unspecified,
Modifier.padding(1.dp, 1.dp, 0.dp, 0.dp),
)
"tunestr",
"music",
"nowplaying",
->
HashtagIcon(R.drawable.tunestr, "Tunestr", primary, Modifier.padding(0.dp, 3.dp, 0.dp, 1.dp))
"weed",
"weedstr",
"420",
"cannabis",
"marijuana",
->
HashtagIcon(
R.drawable.weed,
"Weed",
Color.Unspecified,
Modifier.padding(0.dp, 0.dp, 0.dp, 0.dp),
)
"₿itcoin", "bitcoin", "btc", "timechain", "bitcoiner", "bitcoiners" -> bitcoin
"nostr", "nostrich", "nostriches", "thenostr" -> nostr
"lightning", "lightningnetwork" -> lightning
"zap", "zaps", "zapper", "zappers", "zapping", "zapped", "zapathon", "zapraiser", "zaplife", "zapchain" -> zap
"amethyst" -> amethyst
"cashu", "ecash", "nut", "nuts", "deeznuts" -> cashu
"plebs", "pleb", "plebchain" -> plebs
"coffee", "coffeechain", "cafe" -> coffee
"skullofsatoshi" -> skull
"grownostr", "gardening", "garden" -> growstr
"footstr" -> footstr
"tunestr", "music", "nowplaying" -> tunestr
"weed", "weedstr", "420", "cannabis", "marijuana" -> weed
else -> null
}
}
val bitcoin = HashtagIcon(R.drawable.ht_btc, "Bitcoin", Modifier.padding(start = 1.dp, bottom = 1.dp, top = 1.dp))
val nostr = HashtagIcon(R.drawable.ht_nostr, "Nostr", Modifier.padding(start = 1.dp, bottom = 1.dp, top = 1.dp))
val lightning = HashtagIcon(R.drawable.lightning, "Lightning", Modifier.padding(start = 1.dp, bottom = 1.dp, top = 1.dp))
val zap = HashtagIcon(R.drawable.zap, "Zap", Modifier.padding(start = 1.dp, bottom = 1.dp, top = 1.dp))
val amethyst = HashtagIcon(R.drawable.amethyst, "Amethyst", Modifier.padding(start = 2.dp, bottom = 1.dp, top = 1.dp))
val cashu = HashtagIcon(R.drawable.cashu, "Cashu", Modifier.padding(start = 1.dp, bottom = 1.dp, top = 1.dp))
val plebs = HashtagIcon(R.drawable.plebs, "Pleb", Modifier.padding(start = 2.dp, bottom = 1.dp, top = 1.dp))
val coffee = HashtagIcon(R.drawable.coffee, "Coffee", Modifier.padding(start = 3.dp, bottom = 1.dp, top = 1.dp))
val skull = HashtagIcon(R.drawable.skull, "SkullofSatoshi", Modifier.padding(start = 1.dp, bottom = 1.dp, top = 1.dp))
val growstr = HashtagIcon(R.drawable.grownostr, "GrowNostr", Modifier.padding(start = 1.dp, bottom = 1.dp, top = 1.dp))
val footstr = HashtagIcon(R.drawable.footstr, "Footstr", Modifier.padding(start = 2.dp, bottom = 1.dp, top = 1.dp))
val tunestr = HashtagIcon(R.drawable.tunestr, "Tunestr", Modifier.padding(start = 1.dp, bottom = 1.dp, top = 1.dp))
val weed = HashtagIcon(R.drawable.weed, "Weed", Modifier.padding(start = 1.dp, bottom = 0.dp, top = 0.dp))
@Immutable
class HashtagIcon(
val icon: Int,
val description: String,
val color: Color,
val modifier: Modifier,
val modifier: Modifier = Modifier,
)
@@ -304,15 +304,22 @@ object LocalCache {
return note
}
fun consume(event: MetadataEvent) {
fun consume(
event: MetadataEvent,
relay: Relay?,
) {
// new event
val oldUser = getOrCreateUser(event.pubKey)
if (oldUser.info == null || event.createdAt > oldUser.info!!.updatedMetadataAt) {
val currentMetadata = oldUser.latestMetadata
if (currentMetadata == null || event.createdAt > currentMetadata.createdAt) {
oldUser.latestMetadata = event
val newUserMetadata = event.contactMetaData()
if (newUserMetadata != null) {
oldUser.updateUserInfo(newUserMetadata, event)
}
// Log.d("MT", "New User Metadata ${oldUser.pubkeyDisplayHex} ${oldUser.toBestDisplayName()}")
// Log.d("MT", "New User Metadata ${oldUser.pubkeyDisplayHex()} ${oldUser.toBestDisplayName()} from ${relay?.url}")
} else {
// Log.d("MT","Relay sent a previous Metadata Event ${oldUser.toBestDisplayName()}
// ${formattedDateTime(event.createdAt)} > ${formattedDateTime(oldUser.updatedAt)}")
@@ -2099,7 +2106,7 @@ object LocalCache {
is LnZapPaymentRequestEvent -> consume(event)
is LnZapPaymentResponseEvent -> consume(event)
is LongTextNoteEvent -> consume(event, relay)
is MetadataEvent -> consume(event)
is MetadataEvent -> consume(event, relay)
is MuteListEvent -> consume(event, relay)
is NNSEvent -> comsume(event, relay)
is OtsEvent -> consume(event, relay)
@@ -34,6 +34,7 @@ data class Settings(
val automaticallyShowProfilePictures: ConnectivityType = ConnectivityType.ALWAYS,
val dontShowPushNotificationSelector: Boolean = false,
val dontAskForNotificationPermissions: Boolean = false,
val featureSet: FeatureSetType = FeatureSetType.COMPLETE,
)
enum class ThemeType(val screenCode: Int, val resourceId: Int) {
@@ -59,6 +60,11 @@ enum class ConnectivityType(val prefCode: Boolean?, val screenCode: Int, val res
NEVER(false, 2, R.string.connectivity_type_never),
}
enum class FeatureSetType(val screenCode: Int, val resourceId: Int) {
COMPLETE(0, R.string.ui_feature_set_type_complete),
SIMPLIFIED(1, R.string.ui_feature_set_type_simplified),
}
fun parseConnectivityType(code: Boolean?): ConnectivityType {
return when (code) {
ConnectivityType.ALWAYS.prefCode -> ConnectivityType.ALWAYS
@@ -81,6 +87,16 @@ fun parseConnectivityType(screenCode: Int): ConnectivityType {
}
}
fun parseFeatureSetType(screenCode: Int): FeatureSetType {
return when (screenCode) {
FeatureSetType.COMPLETE.screenCode -> FeatureSetType.COMPLETE
FeatureSetType.SIMPLIFIED.screenCode -> FeatureSetType.SIMPLIFIED
else -> {
FeatureSetType.COMPLETE
}
}
}
enum class BooleanType(val prefCode: Boolean?, val screenCode: Int, val reourceId: Int) {
ALWAYS(null, 0, R.string.connectivity_type_always),
NEVER(false, 1, R.string.connectivity_type_never),
@@ -52,6 +52,7 @@ import java.math.BigDecimal
class User(val pubkeyHex: String) {
var info: UserMetadata? = null
var latestMetadata: MetadataEvent? = null
var latestContactList: ContactListEvent? = null
var latestBookmarkList: BookmarkListEvent? = null
@@ -80,7 +81,7 @@ class User(val pubkeyHex: String) {
override fun toString(): String = pubkeyHex
fun toBestShortFirstName(): String {
val fullName = bestDisplayName() ?: bestUsername() ?: return pubkeyDisplayHex()
val fullName = toBestDisplayName()
val names = fullName.split(' ')
@@ -96,23 +97,14 @@ class User(val pubkeyHex: String) {
}
fun toBestDisplayName(): String {
return bestDisplayName() ?: bestUsername() ?: pubkeyDisplayHex()
}
fun bestUsername(): String? {
return info?.name?.ifBlank { null } ?: info?.username?.ifBlank { null }
}
fun bestDisplayName(): String? {
return info?.displayName?.ifBlank { null }
return info?.bestName() ?: pubkeyDisplayHex()
}
fun nip05(): String? {
return info?.nip05?.ifBlank { null }
return info?.nip05
}
fun profilePicture(): String? {
if (info?.picture.isNullOrBlank()) info?.picture = null
return info?.picture
}
@@ -307,8 +299,6 @@ class User(val pubkeyHex: String) {
latestMetadata: MetadataEvent,
) {
info = newUserInfo
info?.latestMetadata = latestMetadata
info?.updatedMetadataAt = latestMetadata.createdAt
info?.tags = latestMetadata.tags.toImmutableListOfLists()
info?.cleanBlankNames()
@@ -394,7 +384,7 @@ class User(val pubkeyHex: String) {
fun hasSentMessagesTo(key: ChatroomKey?): Boolean {
val messagesToUser = privateChatrooms[key] ?: return false
return messagesToUser.roomMessages.any { this.pubkeyHex == it.author?.pubkeyHex }
return messagesToUser.authors.any { this == it }
}
fun hasReport(
@@ -35,7 +35,7 @@ object NostrSingleUserDataSource : NostrDataSource("SingleUserFeed") {
fun createUserMetadataFilter(): List<TypedFilter>? {
if (usersToWatch.isEmpty()) return null
val firstTimers = usersToWatch.filter { it.info?.latestMetadata == null }.map { it.pubkeyHex }
val firstTimers = usersToWatch.filter { it.latestMetadata == null }.map { it.pubkeyHex }
if (firstTimers.isEmpty()) return null
@@ -54,7 +54,7 @@ object NostrSingleUserDataSource : NostrDataSource("SingleUserFeed") {
fun createUserMetadataStatusReportFilter(): List<TypedFilter>? {
if (usersToWatch.isEmpty()) return null
val secondTimers = usersToWatch.filter { it.info?.latestMetadata != null }
val secondTimers = usersToWatch.filter { it.latestMetadata != null }
if (secondTimers.isEmpty()) return null
@@ -91,7 +91,7 @@ object NostrSingleUserDataSource : NostrDataSource("SingleUserFeed") {
checkNotInMainThread()
usersToWatch.forEach {
if (it.info?.latestMetadata != null) {
if (it.latestMetadata != null) {
val eose = it.latestEOSEs[relayUrl]
if (eose == null) {
it.latestEOSEs = it.latestEOSEs + Pair(relayUrl, EOSETime(time))
@@ -35,144 +35,29 @@ object Constants {
val defaultRelays =
arrayOf(
// Free relays for only DMs and Follows due to the amount of spam
// Free relays for only DMs, Chats and Follows due to the amount of spam
RelaySetupInfo("wss://nostr.bitcoiner.social", read = true, write = true, feedTypes = activeTypesChats),
RelaySetupInfo("wss://relay.nostr.bg", read = true, write = true, feedTypes = activeTypesChats),
RelaySetupInfo("wss://nostr.oxtr.dev", read = true, write = true, feedTypes = activeTypesChats),
RelaySetupInfo("wss://nostr.orangepill.dev", read = true, write = true, feedTypes = activeTypes),
RelaySetupInfo("wss://nostr.fmt.wiz.biz", read = true, write = false, feedTypes = activeTypesChats),
RelaySetupInfo("wss://relay.damus.io", read = true, write = true, feedTypes = activeTypes),
// Chats
RelaySetupInfo(
"wss://nostr.bitcoiner.social",
read = true,
write = true,
feedTypes = activeTypesChats,
),
RelaySetupInfo(
"wss://relay.nostr.bg",
read = true,
write = true,
feedTypes = activeTypesChats,
),
RelaySetupInfo(
"wss://nostr.oxtr.dev",
read = true,
write = true,
feedTypes = activeTypesChats,
),
RelaySetupInfo(
"wss://nostr-pub.wellorder.net",
read = true,
write = true,
feedTypes = activeTypesChats,
),
// Global
RelaySetupInfo("wss://nostr.mom", read = true, write = true, feedTypes = activeTypesGlobalChats),
RelaySetupInfo("wss://nos.lol", read = true, write = true, feedTypes = activeTypesGlobalChats),
// Less Reliable
// NewRelayListViewModel.Relay("wss://nostr.orangepill.dev", read = true, write = true,
// feedTypes = activeTypes),
// NewRelayListViewModel.Relay("wss://nostr.onsats.org", read = true, write = true, feedTypes
// = activeTypes),
// NewRelayListViewModel.Relay("wss://nostr.sandwich.farm", read = true, write = true,
// feedTypes = activeTypes),
// NewRelayListViewModel.Relay("wss://relay.nostr.ch", read = true, write = true, feedTypes =
// activeTypes),
// NewRelayListViewModel.Relay("wss://nostr.zebedee.cloud", read = true, write = true,
// feedTypes = activeTypes),
// NewRelayListViewModel.Relay("wss://nostr.rocks", read = true, write = true, feedTypes =
// activeTypes),
// NewRelayListViewModel.Relay("wss://nostr.fmt.wiz.biz", read = true, write = true, feedTypes
// = activeTypes),
// NewRelayListViewModel.Relay("wss://brb.io", read = true, write = true, feedTypes =
// activeTypes),
// Paid relays
RelaySetupInfo(
"wss://relay.snort.social",
read = true,
write = false,
feedTypes = activeTypesGlobalChats,
),
RelaySetupInfo(
"wss://relay.nostr.com.au",
read = true,
write = false,
feedTypes = activeTypesGlobalChats,
),
RelaySetupInfo(
"wss://eden.nostr.land",
read = true,
write = false,
feedTypes = activeTypesGlobalChats,
),
RelaySetupInfo(
"wss://nostr.milou.lol",
read = true,
write = false,
feedTypes = activeTypesGlobalChats,
),
RelaySetupInfo(
"wss://puravida.nostr.land",
read = true,
write = false,
feedTypes = activeTypesGlobalChats,
),
RelaySetupInfo(
"wss://nostr.wine",
read = true,
write = false,
feedTypes = activeTypesGlobalChats,
),
RelaySetupInfo(
"wss://nostr.inosta.cc",
read = true,
write = false,
feedTypes = activeTypesGlobalChats,
),
RelaySetupInfo(
"wss://atlas.nostr.land",
read = true,
write = false,
feedTypes = activeTypesGlobalChats,
),
RelaySetupInfo(
"wss://relay.orangepill.dev",
read = true,
write = false,
feedTypes = activeTypesGlobalChats,
),
RelaySetupInfo(
"wss://relay.nostrati.com",
read = true,
write = false,
feedTypes = activeTypesGlobalChats,
),
RelaySetupInfo("wss://nostr.wine", read = true, write = false, feedTypes = activeTypesGlobalChats),
// Supporting NIP-50
RelaySetupInfo(
"wss://relay.nostr.band",
read = true,
write = false,
feedTypes = activeTypesSearch,
),
RelaySetupInfo("wss://relay.nostr.band", read = true, write = false, feedTypes = activeTypesSearch),
RelaySetupInfo("wss://nostr.wine", read = true, write = false, feedTypes = activeTypesSearch),
RelaySetupInfo(
"wss://relay.noswhere.com",
read = true,
write = false,
feedTypes = activeTypesSearch,
),
RelaySetupInfo("wss://relay.noswhere.com", read = true, write = false, feedTypes = activeTypesSearch),
)
val forcedRelayForSearch =
arrayOf(
RelaySetupInfo(
"wss://relay.nostr.band",
read = true,
write = false,
feedTypes = activeTypesSearch,
),
RelaySetupInfo("wss://relay.nostr.band", read = true, write = false, feedTypes = activeTypesSearch),
RelaySetupInfo("wss://nostr.wine", read = true, write = false, feedTypes = activeTypesSearch),
RelaySetupInfo(
"wss://relay.noswhere.com",
read = true,
write = false,
feedTypes = activeTypesSearch,
),
RelaySetupInfo("wss://relay.noswhere.com", read = true, write = false, feedTypes = activeTypesSearch),
)
val forcedRelaysForSearchSet = forcedRelayForSearch.map { it.url }
}
@@ -56,8 +56,6 @@ import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowForwardIos
import androidx.compose.material.icons.automirrored.outlined.ArrowForwardIos
import androidx.compose.material.icons.filled.Bolt
import androidx.compose.material.icons.filled.CurrencyBitcoin
import androidx.compose.material.icons.filled.LocationOff
@@ -149,6 +147,7 @@ import com.vitorpamplona.amethyst.ui.note.NoteCompose
import com.vitorpamplona.amethyst.ui.note.PollIcon
import com.vitorpamplona.amethyst.ui.note.RegularPostIcon
import com.vitorpamplona.amethyst.ui.note.UsernameDisplay
import com.vitorpamplona.amethyst.ui.note.ZapSplitIcon
import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
import com.vitorpamplona.amethyst.ui.screen.loggedIn.MyTextField
import com.vitorpamplona.amethyst.ui.screen.loggedIn.ShowUserSuggestionList
@@ -171,7 +170,6 @@ import com.vitorpamplona.amethyst.ui.theme.placeholderText
import com.vitorpamplona.amethyst.ui.theme.replyModifier
import com.vitorpamplona.amethyst.ui.theme.subtleBorder
import com.vitorpamplona.quartz.events.ClassifiedsEvent
import com.vitorpamplona.quartz.events.toImmutableListOfLists
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.CancellationException
@@ -1085,30 +1083,7 @@ fun FowardZapTo(
.fillMaxWidth()
.padding(bottom = 10.dp),
) {
Box(
Modifier
.height(20.dp)
.width(25.dp),
) {
Icon(
imageVector = Icons.Outlined.Bolt,
contentDescription = stringResource(id = R.string.zaps),
modifier =
Modifier
.size(20.dp)
.align(Alignment.CenterStart),
tint = BitcoinOrange,
)
Icon(
imageVector = Icons.AutoMirrored.Outlined.ArrowForwardIos,
contentDescription = stringResource(id = R.string.zaps),
modifier =
Modifier
.size(13.dp)
.align(Alignment.CenterEnd),
tint = BitcoinOrange,
)
}
ZapSplitIcon()
Text(
text = stringResource(R.string.zap_split_title),
@@ -1292,8 +1267,7 @@ fun Notifying(
mentions.forEachIndexed { idx, user ->
val innerUserState by user.live().metadata.observeAsState()
innerUserState?.user?.let { myUser ->
val tags =
remember(innerUserState) { myUser.info?.latestMetadata?.tags?.toImmutableListOfLists() }
val tags = myUser.info?.tags
Button(
shape = ButtonBorder,
@@ -1447,51 +1421,11 @@ private fun ForwardZapTo(
) {
IconButton(
onClick = { onClick() },
) {
Box(
Modifier
.height(20.dp)
.width(25.dp),
) {
if (!postViewModel.wantsForwardZapTo) {
Icon(
imageVector = Icons.Default.Bolt,
contentDescription = stringResource(R.string.add_zap_split),
modifier =
Modifier
.size(20.dp)
.align(Alignment.CenterStart),
tint = MaterialTheme.colorScheme.onBackground,
)
Icon(
imageVector = Icons.AutoMirrored.Filled.ArrowForwardIos,
contentDescription = null,
modifier =
Modifier
.size(13.dp)
.align(Alignment.CenterEnd),
tint = MaterialTheme.colorScheme.onBackground,
)
ZapSplitIcon(tint = MaterialTheme.colorScheme.onBackground)
} else {
Icon(
imageVector = Icons.Outlined.Bolt,
contentDescription = stringResource(id = R.string.cancel_zap_split),
modifier =
Modifier
.size(20.dp)
.align(Alignment.CenterStart),
tint = BitcoinOrange,
)
Icon(
imageVector = Icons.AutoMirrored.Outlined.ArrowForwardIos,
contentDescription = null,
modifier =
Modifier
.size(13.dp)
.align(Alignment.CenterEnd),
tint = BitcoinOrange,
)
}
ZapSplitIcon(tint = BitcoinOrange)
}
}
}
@@ -68,7 +68,7 @@ class NewUserMetadataViewModel : ViewModel() {
account.userProfile().let {
// userName.value = it.bestUsername() ?: ""
displayName.value = it.bestDisplayName() ?: ""
displayName.value = it.info?.bestName() ?: ""
about.value = it.info?.about ?: ""
picture.value = it.info?.picture ?: ""
banner.value = it.info?.banner ?: ""
@@ -82,7 +82,7 @@ class NewUserMetadataViewModel : ViewModel() {
mastodon.value = ""
// TODO: Validate Telegram input, somehow.
it.info?.latestMetadata?.identityClaims()?.forEach {
it.latestMetadata?.identityClaims()?.forEach {
when (it) {
is TwitterIdentity -> twitter.value = it.toProofUrl()
is GitHubIdentity -> github.value = it.toProofUrl()
@@ -65,10 +65,10 @@ import com.vitorpamplona.quartz.encoders.HexKey
import com.vitorpamplona.quartz.encoders.Nip19Bech32
import com.vitorpamplona.quartz.encoders.Nip30CustomEmoji
import com.vitorpamplona.quartz.events.ChannelCreateEvent
import com.vitorpamplona.quartz.events.EmptyTagList
import com.vitorpamplona.quartz.events.Event
import com.vitorpamplona.quartz.events.ImmutableListOfLists
import com.vitorpamplona.quartz.events.PrivateDmEvent
import com.vitorpamplona.quartz.events.toImmutableListOfLists
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.ImmutableMap
@@ -286,29 +286,17 @@ private fun RenderUserAsClickableText(
additionalChars: String,
nav: (String) -> Unit,
) {
val userState by baseUser.live().metadata.observeAsState()
val route = remember { "User/${baseUser.pubkeyHex}" }
val userState by baseUser.live().userMetadataInfo.observeAsState()
val userDisplayName by
remember(userState) { derivedStateOf { userState?.user?.toBestDisplayName() } }
val userTags by
remember(userState) {
derivedStateOf { userState?.user?.info?.latestMetadata?.tags?.toImmutableListOfLists() }
}
userDisplayName?.let {
userState?.bestName()?.let {
CreateClickableTextWithEmoji(
clickablePart = it,
suffix = additionalChars.ifBlank { null },
maxLines = 1,
route = route,
route = "User/${baseUser.pubkeyHex}",
nav = nav,
tags = userTags,
tags = userState?.tags ?: EmptyTagList,
)
additionalChars.ifBlank { null }?.let {
Text(text = it, maxLines = 1)
}
}
}
@@ -587,6 +575,7 @@ fun CreateClickableTextWithEmoji(
@Composable
fun CreateClickableTextWithEmoji(
clickablePart: String,
suffix: String? = null,
maxLines: Int = Int.MAX_VALUE,
overrideColor: Color? = null,
fontWeight: FontWeight = FontWeight.Normal,
@@ -599,9 +588,16 @@ fun CreateClickableTextWithEmoji(
text = clickablePart,
tags = tags,
onRegularText = {
CreateClickableText(it, null, maxLines, overrideColor, fontWeight, fontSize, route, nav)
CreateClickableText(it, suffix, maxLines, overrideColor, fontWeight, fontSize, route, nav)
},
onEmojiText = {
val nonClickablePartStyle =
SpanStyle(
fontSize = fontSize,
color = overrideColor ?: MaterialTheme.colorScheme.onBackground,
fontWeight = fontWeight,
)
val clickablePartStyle =
SpanStyle(
fontSize = fontSize,
@@ -613,6 +609,8 @@ fun CreateClickableTextWithEmoji(
it,
maxLines,
clickablePartStyle,
suffix,
nonClickablePartStyle,
) {
nav(route)
}
@@ -625,6 +623,8 @@ fun ClickableInLineIconRenderer(
wordsInOrder: ImmutableList<Nip30CustomEmoji.Renderable>,
maxLines: Int = Int.MAX_VALUE,
style: SpanStyle,
suffix: String? = null,
nonClickableStype: SpanStyle? = null,
onClick: (Int) -> Unit,
) {
val placeholderSize =
@@ -652,7 +652,10 @@ fun ClickableInLineIconRenderer(
AsyncImage(
model = value.url,
contentDescription = null,
modifier = Modifier.fillMaxSize().padding(1.dp),
modifier =
Modifier
.fillMaxSize()
.padding(1.dp),
)
},
)
@@ -675,6 +678,12 @@ fun ClickableInLineIconRenderer(
}
}
}
if (suffix != null && nonClickableStype != null) {
withStyle(nonClickableStype) {
append(suffix)
}
}
}
val layoutResult = remember { mutableStateOf<TextLayoutResult?>(null) }
@@ -728,7 +737,10 @@ fun InLineIconRenderer(
AsyncImage(
model = value.url,
contentDescription = null,
modifier = Modifier.fillMaxSize().padding(horizontal = 0.dp),
modifier =
Modifier
.fillMaxSize()
.padding(horizontal = 0.dp),
)
},
)
@@ -304,7 +304,7 @@ private fun RenderRegular(
@OptIn(ExperimentalLayoutApi::class)
@Composable
private fun RenderRegular(
fun RenderRegular(
content: String,
tags: ImmutableListOfLists<String>,
wordRenderer: @Composable (Segment, RichTextViewerState) -> Unit,
@@ -712,46 +712,38 @@ fun HashTag(
) {
val primary = MaterialTheme.colorScheme.primary
val background = MaterialTheme.colorScheme.onBackground
val hashtagIcon: HashtagIcon? =
remember(segment.segmentText) { checkForHashtagWithIcon(segment.hashtag, primary) }
val regularText = remember { SpanStyle(color = background) }
val clickableTextStyle = remember { SpanStyle(color = primary) }
val hashtagIcon: HashtagIcon? = checkForHashtagWithIcon(segment.hashtag)
val annotatedTermsString =
remember(segment.segmentText) {
buildAnnotatedString {
withStyle(clickableTextStyle) {
withStyle(SpanStyle(color = primary)) {
pushStringAnnotation("routeToHashtag", "")
append("#${segment.hashtag}")
pop()
}
if (hashtagIcon != null) {
withStyle(clickableTextStyle) {
withStyle(SpanStyle(color = primary)) {
pushStringAnnotation("routeToHashtag", "")
appendInlineContent("inlineContent", "[icon]")
pop()
}
}
segment.extras?.let { withStyle(regularText) { append(it) } }
segment.extras?.let { withStyle(SpanStyle(color = background)) { append(it) } }
}
}
val inlineContent =
Text(
text = annotatedTermsString,
modifier = remember { Modifier.clickable { nav("Hashtag/${segment.hashtag}") } },
inlineContent =
if (hashtagIcon != null) {
mapOf("inlineContent" to InlineIcon(hashtagIcon))
} else {
emptyMap()
}
val pressIndicator = remember { Modifier.clickable { nav("Hashtag/${segment.hashtag}") } }
Text(
text = annotatedTermsString,
modifier = pressIndicator,
inlineContent = inlineContent,
},
)
}
@@ -767,7 +759,7 @@ private fun InlineIcon(hashtagIcon: HashtagIcon) =
Icon(
painter = painterResource(hashtagIcon.icon),
contentDescription = hashtagIcon.description,
tint = hashtagIcon.color,
tint = Color.Unspecified,
modifier = hashtagIcon.modifier,
)
}
@@ -866,18 +858,14 @@ private fun DisplayUserFromTag(
baseUser: User,
nav: (String) -> Unit,
) {
val route = remember { "User/${baseUser.pubkeyHex}" }
val hex = remember { baseUser.pubkeyDisplayHex() }
val meta by baseUser.live().userMetadataInfo.observeAsState(baseUser.info)
Crossfade(targetState = meta, label = "DisplayUserFromTag") {
Row {
val displayName = remember(it) { it?.bestDisplayName() ?: it?.bestUsername() ?: hex }
CreateClickableTextWithEmoji(
clickablePart = displayName,
clickablePart = remember(meta) { it?.bestName() ?: baseUser.pubkeyDisplayHex() },
maxLines = 1,
route = route,
route = "User/${baseUser.pubkeyHex}",
nav = nav,
tags = it?.tags,
)
@@ -73,6 +73,7 @@ class HashImageFetcher(
}
}
@Deprecated("Use the RobohashAssembler instead")
object RobohashImageRequest {
fun build(
context: Context,
@@ -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,
@@ -74,7 +74,6 @@ class HomeNewThreadFeedFilter(val account: Account) : AdditiveFeedFilter<Note>()
val followingCommunities = account.liveHomeFollowLists.value?.communities ?: emptySet()
val oneMinuteInTheFuture = TimeUtils.now() + (1 * 60) // one minute in the future.
val oneHr = 60 * 60
return collection
.asSequence()
@@ -104,25 +103,18 @@ class HomeNewThreadFeedFilter(val account: Account) : AdditiveFeedFilter<Note>()
// acceptable
(isHiddenList || it.author?.let { !account.isHidden(it.pubkeyHex) } ?: true) &&
((it.event?.createdAt() ?: 0) < oneMinuteInTheFuture) &&
it.isNewThread() &&
(
(noteEvent !is RepostEvent && noteEvent !is GenericRepostEvent) || // not a repost
(
it.replyTo?.lastOrNull()?.author?.pubkeyHex !in followingKeySet ||
(
noteEvent.createdAt() >
(
it.replyTo?.lastOrNull()?.createdAt()
?: 0
) + oneHr
)
) // or a repost of by a non-follower's post (likely not seen yet)
)
it.isNewThread()
}
.toSet()
}
override fun sort(collection: Set<Note>): List<Note> {
return collection.sortedWith(compareBy({ it.createdAt() }, { it.idHex })).reversed()
return collection.distinctBy {
if (it.event is RepostEvent || it.event is GenericRepostEvent) {
it.replyTo?.lastOrNull()?.idHex ?: it.idHex // only the most recent repost per feed.
} else {
it.idHex
}
}.sortedWith(compareBy({ it.createdAt() }, { it.idHex })).reversed()
}
}
@@ -57,10 +57,7 @@ import com.vitorpamplona.amethyst.ui.theme.placeholderText
@Composable
@Preview
fun LeftPictureLayoutPreview() {
ThemeComparisonColumn(
onDark = { LeftPictureLayoutPreviewCard() },
onLight = { LeftPictureLayoutPreviewCard() },
)
ThemeComparisonColumn { LeftPictureLayoutPreviewCard() }
}
@Composable
@@ -61,7 +61,6 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog
import androidx.compose.ui.window.DialogProperties
import androidx.lifecycle.map
import com.vitorpamplona.amethyst.AccountInfo
import com.vitorpamplona.amethyst.LocalPreferences
import com.vitorpamplona.amethyst.R
@@ -78,7 +77,6 @@ import com.vitorpamplona.amethyst.ui.theme.AccountPictureModifier
import com.vitorpamplona.amethyst.ui.theme.Size10dp
import com.vitorpamplona.amethyst.ui.theme.Size55dp
import com.vitorpamplona.quartz.encoders.decodePublicKeyAsHexOrNull
import com.vitorpamplona.quartz.events.toImmutableListOfLists
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
@@ -95,7 +93,10 @@ fun AccountSwitchBottomSheet(
Column(modifier = Modifier.verticalScroll(scrollState)) {
Row(
modifier = Modifier.fillMaxWidth().padding(Size10dp),
modifier =
Modifier
.fillMaxWidth()
.padding(Size10dp),
horizontalArrangement = Arrangement.Center,
verticalAlignment = Alignment.CenterVertically,
) {
@@ -103,7 +104,10 @@ fun AccountSwitchBottomSheet(
}
accounts.forEach { acc -> DisplayAccount(acc, accountViewModel, accountStateViewModel) }
Row(
modifier = Modifier.fillMaxWidth().padding(top = Size10dp, bottom = Size55dp),
modifier =
Modifier
.fillMaxWidth()
.padding(top = Size10dp, bottom = Size55dp),
horizontalArrangement = Arrangement.Center,
verticalAlignment = Alignment.CenterVertically,
) {
@@ -167,7 +171,8 @@ fun DisplayAccount(
baseUser?.let {
Row(
modifier =
Modifier.fillMaxWidth()
Modifier
.fillMaxWidth()
.clickable { accountStateViewModel.switchUser(acc) }
.padding(16.dp, 16.dp),
verticalAlignment = Alignment.CenterVertically,
@@ -181,7 +186,10 @@ fun DisplayAccount(
verticalAlignment = Alignment.CenterVertically,
) {
Box(
modifier = Modifier.width(55.dp).padding(0.dp),
modifier =
Modifier
.width(55.dp)
.padding(0.dp),
) {
val automaticallyShowProfilePicture =
remember {
@@ -241,23 +249,18 @@ private fun AccountName(
acc: AccountInfo,
user: User,
) {
val displayName by user.live().metadata.map { user.bestDisplayName() }.observeAsState()
val info by user.live().userMetadataInfo.observeAsState()
val tags by
user
.live()
.metadata
.map { user.info?.latestMetadata?.tags?.toImmutableListOfLists() }
.observeAsState()
displayName?.let {
info?.let {
it.bestName()?.let { name ->
CreateTextWithEmoji(
text = it,
tags = tags,
text = name,
tags = it.tags,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
)
}
}
Text(
text = remember(user) { acc.npub.toShortenHex() },
@@ -993,7 +993,7 @@ fun debugState(context: Context) {
"Users: " +
LocalCache.userListCache.filter { it.liveSet != null }.size +
" / " +
LocalCache.userListCache.filter { it.info?.latestMetadata != null }.size +
LocalCache.userListCache.filter { it.latestMetadata != null }.size +
" / " +
LocalCache.userListCache.size,
)
@@ -206,7 +206,7 @@ fun ProfileContent(
profilePubHex = baseAccountUser.pubkeyHex,
profileBanner = userInfo?.banner,
profilePicture = userInfo?.profilePicture(),
bestDisplayName = userInfo?.bestDisplayName(),
bestDisplayName = userInfo?.bestName(),
tags = userInfo?.tags,
modifier = modifier,
accountViewModel = accountViewModel,
@@ -54,10 +54,7 @@ import kotlinx.collections.immutable.persistentSetOf
@Composable
@Preview
fun BlankNotePreview() {
ThemeComparisonColumn(
onDark = { BlankNote() },
onLight = { BlankNote() },
)
ThemeComparisonColumn { BlankNote() }
}
@Composable
@@ -106,15 +103,7 @@ fun HiddenNotePreview() {
val nav: (String) -> Unit = {}
ThemeComparisonColumn(
onDark = {
HiddenNote(
reports = persistentSetOf<Note>(),
isHiddenAuthor = true,
accountViewModel = accountViewModel,
nav = nav,
) {}
},
onLight = {
toPreview = {
HiddenNote(
reports = persistentSetOf<Note>(),
isHiddenAuthor = true,
@@ -194,8 +183,7 @@ fun HiddenNote(
@Composable
fun HiddenNoteByMePreview() {
ThemeComparisonColumn(
onDark = { HiddenNoteByMe {} },
onLight = { HiddenNoteByMe {} },
toPreview = { HiddenNoteByMe {} },
)
}
@@ -218,6 +206,7 @@ fun HiddenNoteByMe(
Text(
text = stringResource(R.string.post_was_hidden),
color = Color.Gray,
textAlign = TextAlign.Center,
)
Button(
@@ -374,7 +374,9 @@ private fun RenderBubble(
val bubbleModifier =
remember {
Modifier.padding(start = 10.dp, end = 5.dp, bottom = 5.dp).onSizeChanged {
Modifier
.padding(start = 10.dp, end = 5.dp, bottom = 5.dp)
.onSizeChanged {
if (bubbleSize.intValue != it.width) {
bubbleSize.intValue = it.width
}
@@ -555,7 +557,8 @@ private fun ConstrainedStatusRow(
horizontalArrangement = Arrangement.SpaceBetween,
modifier =
with(LocalDensity.current) {
Modifier.padding(top = Size5dp)
Modifier
.padding(top = Size5dp)
.height(Size20dp)
.widthIn(
bubbleSize.value.toDp(),
@@ -589,7 +592,10 @@ fun IncognitoBadge(baseNote: Note) {
Icon(
painter = painterResource(id = R.drawable.incognito),
null,
modifier = Modifier.padding(top = 1.dp).size(14.dp),
modifier =
Modifier
.padding(top = 1.dp)
.size(14.dp),
tint = MaterialTheme.colorScheme.placeholderText,
)
Spacer(modifier = StdHorzSpacer)
@@ -597,7 +603,10 @@ fun IncognitoBadge(baseNote: Note) {
Icon(
painter = painterResource(id = R.drawable.incognito_off),
null,
modifier = Modifier.padding(top = 1.dp).size(14.dp),
modifier =
Modifier
.padding(top = 1.dp)
.size(14.dp),
tint = MaterialTheme.colorScheme.placeholderText,
)
Spacer(modifier = StdHorzSpacer)
@@ -678,7 +687,7 @@ private fun RenderChangeChannelMetadataNote(note: Note) {
CreateTextWithEmoji(
text = text,
tags = remember { note.author?.info?.latestMetadata?.tags?.toImmutableListOfLists() },
tags = note.author?.info?.tags,
)
}
@@ -699,7 +708,7 @@ private fun RenderCreateChannelNote(note: Note) {
CreateTextWithEmoji(
text = text,
tags = remember { note.author?.info?.latestMetadata?.tags?.toImmutableListOfLists() },
tags = note.author?.info?.tags,
)
}
@@ -735,25 +744,17 @@ private fun WatchAndDisplayUser(
loadProfilePicture: Boolean,
nav: (String) -> Unit,
) {
val pubkeyHex = remember { author.pubkeyHex }
val route = remember { "User/${author.pubkeyHex}" }
val route = "User/${author.pubkeyHex}"
val userState by author.live().metadata.observeAsState()
val userState by author.live().userMetadataInfo.observeAsState()
val userDisplayName by
remember(userState) { derivedStateOf { userState?.user?.toBestDisplayName() } }
UserIcon(author.pubkeyHex, userState?.picture, loadProfilePicture, nav, route)
val userProfilePicture by
remember(userState) { derivedStateOf { userState?.user?.profilePicture() } }
val userTags by
remember(userState) {
derivedStateOf { userState?.user?.info?.latestMetadata?.tags?.toImmutableListOfLists() }
userState?.let {
it.bestName()?.let { name ->
DisplayMessageUsername(name, it.tags, route, nav)
}
}
UserIcon(pubkeyHex, userProfilePicture, loadProfilePicture, nav, route)
userDisplayName?.let { DisplayMessageUsername(it, userTags, route, nav) }
}
@Composable
@@ -771,7 +772,8 @@ private fun UserIcon(
loadProfilePicture = loadProfilePicture,
modifier =
remember {
Modifier.width(Size25dp)
Modifier
.width(Size25dp)
.height(Size25dp)
.clip(shape = CircleShape)
.clickable(onClick = { nav(route) })
@@ -796,7 +798,4 @@ private fun DisplayMessageUsername(
route = route,
nav = nav,
)
Spacer(modifier = StdHorzSpacer)
DrawPlayName(userDisplayName)
}
@@ -20,7 +20,11 @@
*/
package com.vitorpamplona.amethyst.ui.note
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material.icons.automirrored.filled.OpenInNew
@@ -38,17 +42,25 @@ import androidx.compose.material.icons.filled.Link
import androidx.compose.material.icons.filled.MoreVert
import androidx.compose.material.icons.filled.PushPin
import androidx.compose.material.icons.filled.Report
import androidx.compose.material.icons.materialIcon
import androidx.compose.material.icons.materialPath
import androidx.compose.material.icons.outlined.ArrowForwardIos
import androidx.compose.material.icons.outlined.BarChart
import androidx.compose.material.icons.outlined.Bolt
import androidx.compose.material.icons.outlined.PlayCircle
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.ui.theme.BitcoinOrange
import com.vitorpamplona.amethyst.ui.theme.Size18Modifier
@@ -73,7 +85,7 @@ fun FollowingIcon(iconSize: Dp) {
Icon(
painter = painterResource(R.drawable.following),
contentDescription = stringResource(id = R.string.following),
modifier = remember(iconSize) { Modifier.size(iconSize) },
modifier = Modifier.size(iconSize),
tint = Color.Unspecified,
)
}
@@ -506,3 +518,75 @@ fun IncognitoIconOff(
tint = tint,
)
}
@Composable
fun ZapSplitIcon(
modifier: Modifier = Size20Modifier,
tint: Color = BitcoinOrange,
) {
Icon(
imageVector = ZapSplitVector,
contentDescription = stringResource(id = R.string.zap_split_title),
modifier = modifier,
tint = tint,
)
}
@Preview
@Composable
fun ZapSplitPreview() {
Column(horizontalAlignment = Alignment.CenterHorizontally) {
Box(
Modifier.height(20.dp).width(25.dp),
) {
Icon(
imageVector = Icons.Outlined.Bolt,
contentDescription = stringResource(id = R.string.zaps),
modifier = Modifier.size(20.dp).align(Alignment.CenterStart),
tint = BitcoinOrange,
)
Icon(
imageVector = Icons.Outlined.ArrowForwardIos,
contentDescription = stringResource(id = R.string.zaps),
modifier = Modifier.size(13.dp).align(Alignment.CenterEnd),
tint = BitcoinOrange,
)
}
ZapSplitIcon(tint = BitcoinOrange)
}
}
public val ZapSplitVector: ImageVector
get() {
if (zapSplit != null) {
return zapSplit!!
}
zapSplit =
materialIcon(name = "ZapSplit") {
materialPath {
moveTo(7.0f, 21.0f)
horizontalLineToRelative(-1.0f)
lineToRelative(1.0f, -7.0f)
horizontalLineTo(3.5f)
curveToRelative(-0.88f, 0.0f, -0.33f, -0.75f, -0.31f, -0.78f)
curveTo(4.48f, 10.94f, 6.42f, 7.54f, 9.01f, 3.0f)
horizontalLineToRelative(1.0f)
lineToRelative(-1.0f, 7.0f)
horizontalLineToRelative(3.51f)
curveToRelative(0.4f, 0.0f, 0.62f, 0.19f, 0.4f, 0.66f)
curveTo(8.97f, 17.55f, 7.0f, 21.0f, 7.0f, 21.0f)
close()
moveTo(14.59f, 16.59f)
lineTo(19.17f, 12.0f)
lineTo(14.59f, 7.41f)
lineTo(16.0f, 6.0f)
lineToRelative(6.0f, 6.0f)
lineToRelative(-6.0f, 6.0f)
lineToRelative(-1.41f, -1.41f)
close()
}
}
return zapSplit!!
}
private var zapSplit: ImageVector? = null
@@ -58,6 +58,7 @@ import androidx.lifecycle.map
import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.model.AddressableNote
import com.vitorpamplona.amethyst.model.Channel
import com.vitorpamplona.amethyst.model.FeatureSetType
import com.vitorpamplona.amethyst.model.Note
import com.vitorpamplona.amethyst.ui.components.GenericLoadable
import com.vitorpamplona.amethyst.ui.components.ObserveDisplayNip05Status
@@ -665,10 +666,8 @@ fun InnerNoteWithReactions(
Column(Modifier.fillMaxWidth()) {
val showSecondRow =
baseNote.event !is RepostEvent &&
baseNote.event !is GenericRepostEvent &&
!isBoostedNote &&
!isQuotedNote
baseNote.event !is RepostEvent && baseNote.event !is GenericRepostEvent &&
!isBoostedNote && !isQuotedNote && accountViewModel.settings.featureSet != FeatureSetType.SIMPLIFIED
NoteBody(
baseNote = baseNote,
showAuthorPicture = isQuotedNote,
@@ -1234,12 +1233,14 @@ private fun BadgeBox(
accountViewModel: AccountViewModel,
nav: (String) -> Unit,
) {
if (accountViewModel.settings.featureSet != FeatureSetType.SIMPLIFIED) {
if (baseNote.event is RepostEvent || baseNote.event is GenericRepostEvent) {
baseNote.replyTo?.lastOrNull()?.let { RelayBadges(it, accountViewModel, nav) }
} else {
RelayBadges(baseNote, accountViewModel, nav)
}
}
}
@Composable
private fun RenderAuthorImages(
@@ -23,7 +23,6 @@ package com.vitorpamplona.amethyst.ui.note
import androidx.compose.foundation.layout.ExperimentalLayoutApi
import androidx.compose.foundation.layout.FlowRow
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.text.ClickableText
import androidx.compose.material3.LocalTextStyle
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
@@ -35,10 +34,8 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.unit.sp
import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.model.LocalCache
import com.vitorpamplona.amethyst.model.Note
import com.vitorpamplona.amethyst.model.User
import com.vitorpamplona.amethyst.ui.components.CreateClickableTextWithEmoji
@@ -46,112 +43,8 @@ import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
import com.vitorpamplona.amethyst.ui.theme.StdVertSpacer
import com.vitorpamplona.amethyst.ui.theme.lessImportantLink
import com.vitorpamplona.amethyst.ui.theme.placeholderText
import com.vitorpamplona.quartz.events.toImmutableListOfLists
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
@Composable
fun ReplyInformation(
replyTo: ImmutableList<Note>?,
mentions: ImmutableList<String>,
accountViewModel: AccountViewModel,
nav: (String) -> Unit,
) {
var sortedMentions by remember { mutableStateOf<ImmutableList<User>?>(null) }
LaunchedEffect(Unit) {
launch(Dispatchers.IO) {
sortedMentions =
mentions
.mapNotNull { LocalCache.checkGetOrCreateUser(it) }
.toSet()
.sortedBy { !accountViewModel.account.userProfile().isFollowingCached(it) }
.toImmutableList()
}
}
if (sortedMentions != null) {
ReplyInformation(replyTo, sortedMentions) { nav("User/${it.pubkeyHex}") }
}
}
@OptIn(ExperimentalLayoutApi::class)
@Composable
private fun ReplyInformation(
replyTo: ImmutableList<Note>?,
sortedMentions: ImmutableList<User>?,
prefix: String = "",
onUserTagClick: (User) -> Unit,
) {
var expanded by remember { mutableStateOf((sortedMentions?.size ?: 0) <= 2) }
FlowRow {
if (sortedMentions != null && sortedMentions.isNotEmpty()) {
if (replyTo != null && replyTo.isNotEmpty()) {
val repliesToDisplay = if (expanded) sortedMentions else sortedMentions.take(2)
Text(
stringResource(R.string.replying_to),
fontSize = 13.sp,
color = MaterialTheme.colorScheme.placeholderText,
)
repliesToDisplay.forEachIndexed { idx, user ->
ReplyInfoMention(user, prefix, onUserTagClick)
if (expanded) {
if (idx < repliesToDisplay.size - 2) {
Text(
", ",
fontSize = 13.sp,
color = MaterialTheme.colorScheme.placeholderText,
)
} else if (idx < repliesToDisplay.size - 1) {
Text(
stringResource(R.string.and),
fontSize = 13.sp,
color = MaterialTheme.colorScheme.placeholderText,
)
}
} else {
if (idx < repliesToDisplay.size - 1) {
Text(
", ",
fontSize = 13.sp,
color = MaterialTheme.colorScheme.placeholderText,
)
} else if (idx < repliesToDisplay.size) {
Text(
stringResource(R.string.and),
fontSize = 13.sp,
color = MaterialTheme.colorScheme.placeholderText,
)
ClickableText(
AnnotatedString("${sortedMentions.size - 2}"),
style =
LocalTextStyle.current.copy(
color = MaterialTheme.colorScheme.lessImportantLink,
fontSize = 13.sp,
),
onClick = { expanded = true },
)
Text(
" ${stringResource(R.string.others)}",
fontSize = 13.sp,
color = MaterialTheme.colorScheme.placeholderText,
)
}
}
}
}
}
}
}
@Composable
fun ReplyInformationChannel(
@@ -225,15 +118,11 @@ private fun ReplyInfoMention(
prefix: String,
onUserTagClick: (User) -> Unit,
) {
val innerUserState by user.live().metadata.observeAsState()
val innerUserState by user.live().userMetadataInfo.observeAsState()
CreateClickableTextWithEmoji(
clickablePart =
remember(innerUserState) { "$prefix${innerUserState?.user?.toBestDisplayName()}" },
tags =
remember(innerUserState) {
innerUserState?.user?.info?.latestMetadata?.tags?.toImmutableListOfLists()
},
clickablePart = "$prefix${innerUserState?.bestName()}",
tags = innerUserState?.tags,
style =
LocalTextStyle.current.copy(
color = MaterialTheme.colorScheme.lessImportantLink,
@@ -28,11 +28,9 @@ import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.combinedClickable
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.ripple.rememberRipple
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.derivedStateOf
@@ -162,9 +160,6 @@ fun ClickableUserPicture(
onClick: ((User) -> Unit)? = null,
onLongClick: ((User) -> Unit)? = null,
) {
val interactionSource = remember { MutableInteractionSource() }
val ripple = rememberRipple(bounded = false, radius = size)
// BaseUser is the same reference as accountState.user
val myModifier =
remember {
@@ -174,16 +169,12 @@ fun ClickableUserPicture(
onClick = { onClick(baseUser) },
onLongClick = { onLongClick(baseUser) },
role = Role.Button,
interactionSource = interactionSource,
indication = ripple,
)
} else if (onClick != null) {
Modifier.size(size)
.clickable(
onClick = { onClick(baseUser) },
role = Role.Button,
interactionSource = interactionSource,
indication = ripple,
)
} else {
Modifier.size(size)
@@ -345,7 +336,7 @@ fun LoadUserProfilePicture(
) {
val userProfile by baseUser.live().userMetadataInfo.observeAsState(baseUser.info)
innerContent(userProfile?.profilePicture(), userProfile?.bestDisplayName() ?: userProfile?.bestDisplayName())
innerContent(userProfile?.profilePicture(), userProfile?.bestName())
}
@Composable
@@ -23,8 +23,6 @@ package com.vitorpamplona.amethyst.ui.note
import android.content.Context
import android.util.Log
import androidx.compose.animation.Crossfade
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
@@ -32,7 +30,6 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
@@ -45,7 +42,6 @@ import com.vitorpamplona.amethyst.model.User
import com.vitorpamplona.amethyst.service.tts.TextToSpeechHelper
import com.vitorpamplona.amethyst.ui.components.CreateTextWithEmoji
import com.vitorpamplona.amethyst.ui.theme.StdButtonSizeModifier
import com.vitorpamplona.amethyst.ui.theme.StdHorzSpacer
import com.vitorpamplona.amethyst.ui.theme.placeholderText
import com.vitorpamplona.quartz.events.ImmutableListOfLists
@@ -74,9 +70,9 @@ fun UsernameDisplay(
val userMetadata by baseUser.live().userMetadataInfo.observeAsState(baseUser.info)
Crossfade(targetState = userMetadata, modifier = weight, label = "UsernameDisplay") {
val name = it?.bestDisplayName() ?: it?.bestUsername()
val name = it?.bestName()
if (name != null) {
UserDisplay(name, it?.tags, weight, showPlayButton, fontWeight, textColor)
UserDisplay(name, it.tags, weight, showPlayButton, fontWeight, textColor)
} else {
NPubDisplay(baseUser, weight, fontWeight, textColor)
}
@@ -109,7 +105,6 @@ private fun UserDisplay(
fontWeight: FontWeight = FontWeight.Bold,
textColor: Color = Color.Unspecified,
) {
Row(modifier = modifier, verticalAlignment = Alignment.CenterVertically) {
CreateTextWithEmoji(
text = bestDisplayName,
tags = tags,
@@ -119,12 +114,6 @@ private fun UserDisplay(
modifier = modifier,
color = textColor,
)
if (showPlayButton) {
Spacer(StdHorzSpacer)
DrawPlayName(bestDisplayName)
}
}
}
@Composable
@@ -186,22 +186,13 @@ fun ZapTheDevsCardPreview() {
accountViewModel,
) { releaseNote ->
if (releaseNote != null) {
ThemeComparisonColumn(
onDark = {
ThemeComparisonColumn {
ZapTheDevsCard(
releaseNote,
accountViewModel,
nav = {},
)
},
onLight = {
ZapTheDevsCard(
releaseNote,
accountViewModel,
nav = {},
)
},
)
}
}
}
}
@@ -40,8 +40,7 @@ import com.vitorpamplona.amethyst.ui.theme.ThemeComparisonColumn
@Composable
@Preview
fun AddButtonPreview() {
ThemeComparisonColumn(
onDark = {
ThemeComparisonColumn {
Row {
Column {
AddButton(isActive = true) {}
@@ -53,21 +52,7 @@ fun AddButtonPreview() {
RemoveButton(isActive = false) {}
}
}
},
onLight = {
Row {
Column {
AddButton(isActive = true) {}
AddButton(isActive = false) {}
}
Column {
RemoveButton(isActive = true) {}
RemoveButton(isActive = false) {}
}
}
},
)
}
@Composable
@@ -34,8 +34,7 @@ import com.vitorpamplona.amethyst.ui.theme.lessImportantLink
@Preview
fun DisplayPoWPreview() {
ThemeComparisonColumn(
onDark = { DisplayPoW(pow = 24) },
onLight = { DisplayPoW(pow = 24) },
toPreview = { DisplayPoW(pow = 24) },
)
}
@@ -20,30 +20,21 @@
*/
package com.vitorpamplona.amethyst.ui.note.elements
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.ExperimentalLayoutApi
import androidx.compose.foundation.layout.FlowRow
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.text.ClickableText
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.ArrowForwardIos
import androidx.compose.material.icons.outlined.Bolt
import androidx.compose.material3.Icon
import androidx.compose.material3.LocalTextStyle
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.ui.note.UserPicture
import com.vitorpamplona.amethyst.ui.note.ZapSplitIcon
import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
import com.vitorpamplona.amethyst.ui.theme.BitcoinOrange
import com.vitorpamplona.amethyst.ui.theme.Size25dp
@@ -78,22 +69,7 @@ fun DisplayZapSplits(
if (list.isEmpty()) return
Row(verticalAlignment = Alignment.CenterVertically) {
Box(
Modifier.height(20.dp).width(25.dp),
) {
Icon(
imageVector = Icons.Outlined.Bolt,
contentDescription = stringResource(id = R.string.zaps),
modifier = Modifier.size(20.dp).align(Alignment.CenterStart),
tint = BitcoinOrange,
)
Icon(
imageVector = Icons.Outlined.ArrowForwardIos,
contentDescription = stringResource(id = R.string.zaps),
modifier = Modifier.size(13.dp).align(Alignment.CenterEnd),
tint = BitcoinOrange,
)
}
ZapSplitIcon(tint = BitcoinOrange)
Spacer(modifier = StdHorzSpacer)
@@ -45,7 +45,6 @@ import com.vitorpamplona.amethyst.ui.theme.Font14SP
import com.vitorpamplona.amethyst.ui.theme.StdHorzSpacer
import com.vitorpamplona.amethyst.ui.theme.nip05
import com.vitorpamplona.quartz.events.BaseTextNoteEvent
import com.vitorpamplona.quartz.events.toImmutableListOfLists
@Composable
fun ShowForkInformation(
@@ -107,7 +106,7 @@ fun ForkInformationRowLightColor(
val userState by author.live().metadata.observeAsState()
val userDisplayName = remember(userState) { userState?.user?.toBestDisplayName() }
val userTags =
remember(userState) { userState?.user?.info?.latestMetadata?.tags?.toImmutableListOfLists() }
remember(userState) { userState?.user?.info?.tags }
if (userDisplayName != null) {
CreateClickableTextWithEmoji(
@@ -133,18 +132,20 @@ fun ForkInformationRow(
) {
val noteState by originalVersion.live().metadata.observeAsState()
val note = noteState?.note ?: return
val author = note.author ?: return
val route = remember(note) { routeFor(note, accountViewModel.userProfile()) }
if (route != null) {
Row(modifier) {
val author = note.author ?: return
val meta by author.live().userMetadataInfo.observeAsState(author.info)
Text(stringResource(id = R.string.forked_from))
Spacer(modifier = StdHorzSpacer)
val userMetadata by author.live().userMetadataInfo.observeAsState()
CreateClickableTextWithEmoji(
clickablePart = userMetadata?.bestDisplayName() ?: userMetadata?.bestUsername() ?: author.pubkeyDisplayHex(),
clickablePart = remember(meta) { meta?.bestName() ?: author.pubkeyDisplayHex() },
maxLines = 1,
route = route,
nav = nav,
@@ -144,7 +144,7 @@ private fun DisplayQuoteAuthor(
val userMetadata by userBase.live().userMetadataInfo.observeAsState()
CreateClickableTextWithEmoji(
clickablePart = userMetadata?.bestDisplayName() ?: userMetadata?.bestUsername() ?: userBase.pubkeyDisplayHex(),
clickablePart = userMetadata?.bestName() ?: userBase.pubkeyDisplayHex(),
maxLines = 1,
route = "User/${userBase.pubkeyHex}",
nav = nav,
@@ -59,7 +59,6 @@ import com.vitorpamplona.amethyst.ui.components.CreateTextWithEmoji
import com.vitorpamplona.amethyst.ui.components.RobohashFallbackAsyncImage
import com.vitorpamplona.amethyst.ui.theme.Size35dp
import com.vitorpamplona.quartz.events.UserMetadata
import com.vitorpamplona.quartz.events.toImmutableListOfLists
@Preview
@Composable
@@ -134,8 +133,8 @@ fun ShowQRDialog(
modifier = Modifier.fillMaxWidth().padding(top = 5.dp),
) {
CreateTextWithEmoji(
text = user.bestDisplayName() ?: user.bestUsername() ?: "",
tags = user.info?.latestMetadata?.tags?.toImmutableListOfLists(),
text = user.info?.bestName() ?: "",
tags = user.info?.tags,
fontWeight = FontWeight.Bold,
fontSize = 18.sp,
)
@@ -35,6 +35,7 @@ import androidx.window.layout.DisplayFeature
import com.vitorpamplona.amethyst.LocalPreferences
import com.vitorpamplona.amethyst.model.BooleanType
import com.vitorpamplona.amethyst.model.ConnectivityType
import com.vitorpamplona.amethyst.model.FeatureSetType
import com.vitorpamplona.amethyst.model.Settings
import com.vitorpamplona.amethyst.model.ThemeType
import kotlinx.coroutines.Dispatchers
@@ -52,6 +53,7 @@ class SettingsState() {
var automaticallyShowProfilePictures by mutableStateOf(ConnectivityType.ALWAYS)
var dontShowPushNotificationSelector by mutableStateOf<Boolean>(false)
var dontAskForNotificationPermissions by mutableStateOf<Boolean>(false)
var featureSet by mutableStateOf(FeatureSetType.COMPLETE)
var isOnMobileData: State<Boolean> = mutableStateOf(false)
@@ -102,8 +104,7 @@ class SharedPreferencesViewModel : ViewModel() {
fun init() {
viewModelScope.launch(Dispatchers.IO) {
val savedSettings =
LocalPreferences.loadSharedSettings()
?: LocalPreferences.migrateOldSharedSettings() ?: Settings()
LocalPreferences.loadSharedSettings() ?: Settings()
sharedPrefs.theme = savedSettings.theme
sharedPrefs.language = savedSettings.preferredLanguage
@@ -113,8 +114,8 @@ class SharedPreferencesViewModel : ViewModel() {
sharedPrefs.automaticallyHideNavigationBars = savedSettings.automaticallyHideNavigationBars
sharedPrefs.automaticallyShowProfilePictures = savedSettings.automaticallyShowProfilePictures
sharedPrefs.dontShowPushNotificationSelector = savedSettings.dontShowPushNotificationSelector
sharedPrefs.dontAskForNotificationPermissions =
savedSettings.dontAskForNotificationPermissions
sharedPrefs.dontAskForNotificationPermissions = savedSettings.dontAskForNotificationPermissions
sharedPrefs.featureSet = savedSettings.featureSet
updateLanguageInTheUI()
}
@@ -181,6 +182,13 @@ class SharedPreferencesViewModel : ViewModel() {
}
}
fun updateFeatureSetType(newFeatureSetType: FeatureSetType) {
if (sharedPrefs.featureSet != newFeatureSetType) {
sharedPrefs.featureSet = newFeatureSetType
saveSharedSettings()
}
}
fun dontShowPushNotificationSelector() {
if (sharedPrefs.dontShowPushNotificationSelector == false) {
sharedPrefs.dontShowPushNotificationSelector = true
@@ -226,6 +234,7 @@ class SharedPreferencesViewModel : ViewModel() {
sharedPrefs.automaticallyShowProfilePictures,
sharedPrefs.dontShowPushNotificationSelector,
sharedPrefs.dontAskForNotificationPermissions,
sharedPrefs.featureSet,
),
)
}
@@ -757,7 +757,7 @@ private fun RenderClassifiedsReaderForThread(
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically,
) {
val sellerName = note.author?.bestDisplayName() ?: note.author?.bestUsername()
val sellerName = note.author?.info?.bestName()
val msg =
if (sellerName != null) {
@@ -872,8 +872,7 @@ private fun RenderWikiHeaderForThreadPreview() {
}
LoadNote(baseNoteHex = "277f982a4cd3f67cc47ad9282176acabee1713848f547d6021e0c155572078e1", accountViewModel = accountViewModel) { baseNote ->
ThemeComparisonColumn(
onDark = {
ThemeComparisonColumn {
val bg = MaterialTheme.colorScheme.background
val backgroundColor =
remember {
@@ -892,28 +891,7 @@ private fun RenderWikiHeaderForThreadPreview() {
nav,
)
}
},
onLight = {
val bg = MaterialTheme.colorScheme.background
val backgroundColor =
remember {
mutableStateOf(bg)
}
Column {
RenderWikiHeaderForThread(noteEvent = event, accountViewModel = accountViewModel, nav)
RenderTextEvent(
baseNote!!,
false,
true,
backgroundColor,
editState,
accountViewModel,
nav,
)
}
},
)
}
}
@@ -228,8 +228,7 @@ fun HomeFeeds(
@Composable
fun HomeFeedEmptyPreview() {
ThemeComparisonRow(
onDark = { HomeFeedEmpty {} },
onLight = { HomeFeedEmpty {} },
toPreview = { HomeFeedEmpty {} },
)
}
@@ -131,6 +131,7 @@ import com.vitorpamplona.amethyst.ui.components.ZoomableImageDialog
import com.vitorpamplona.amethyst.ui.dal.UserProfileReportsFeedFilter
import com.vitorpamplona.amethyst.ui.navigation.routeToMessage
import com.vitorpamplona.amethyst.ui.note.ClickableUserPicture
import com.vitorpamplona.amethyst.ui.note.DrawPlayName
import com.vitorpamplona.amethyst.ui.note.ErrorMessageDialog
import com.vitorpamplona.amethyst.ui.note.LightningAddressIcon
import com.vitorpamplona.amethyst.ui.note.LoadAddressableNote
@@ -159,6 +160,7 @@ import com.vitorpamplona.amethyst.ui.theme.Size15Modifier
import com.vitorpamplona.amethyst.ui.theme.Size16Modifier
import com.vitorpamplona.amethyst.ui.theme.Size25Modifier
import com.vitorpamplona.amethyst.ui.theme.Size35dp
import com.vitorpamplona.amethyst.ui.theme.StdHorzSpacer
import com.vitorpamplona.amethyst.ui.theme.ZeroPadding
import com.vitorpamplona.amethyst.ui.theme.placeholderText
import com.vitorpamplona.quartz.encoders.ATag
@@ -174,7 +176,6 @@ import com.vitorpamplona.quartz.events.PayInvoiceSuccessResponse
import com.vitorpamplona.quartz.events.ReportEvent
import com.vitorpamplona.quartz.events.TelegramIdentity
import com.vitorpamplona.quartz.events.TwitterIdentity
import com.vitorpamplona.quartz.events.toImmutableListOfLists
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.Dispatchers
@@ -959,8 +960,7 @@ private fun DrawAdditionalInfo(
) {
val userState by baseUser.live().metadata.observeAsState()
val user = remember(userState) { userState?.user } ?: return
val tags =
remember(userState) { userState?.user?.info?.latestMetadata?.tags?.toImmutableListOfLists() }
val tags = userState?.user?.info?.tags
val uri = LocalUriHandler.current
val clipboardManager = LocalClipboardManager.current
@@ -971,13 +971,15 @@ private fun DrawAdditionalInfo(
}
user.toBestDisplayName().let {
Row(verticalAlignment = Alignment.Bottom, modifier = Modifier.padding(top = 7.dp)) {
Row(verticalAlignment = Alignment.CenterVertically, modifier = Modifier.padding(top = 7.dp)) {
CreateTextWithEmoji(
text = it,
tags = tags,
fontWeight = FontWeight.Bold,
fontSize = 25.sp,
)
Spacer(StdHorzSpacer)
DrawPlayName(it)
}
}
@@ -1067,7 +1069,7 @@ private fun DrawAdditionalInfo(
val pubkeyHex = remember { baseUser.pubkeyHex }
DisplayLNAddress(lud16, pubkeyHex, accountViewModel, nav)
val identities = user.info?.latestMetadata?.identityClaims()
val identities = user.latestMetadata?.identityClaims()
if (!identities.isNullOrEmpty()) {
identities.forEach { identity: IdentityClaim ->
Row(verticalAlignment = Alignment.CenterVertically) {
@@ -47,9 +47,11 @@ import androidx.compose.ui.unit.dp
import androidx.core.os.LocaleListCompat
import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.model.ConnectivityType
import com.vitorpamplona.amethyst.model.FeatureSetType
import com.vitorpamplona.amethyst.model.ThemeType
import com.vitorpamplona.amethyst.model.parseBooleanType
import com.vitorpamplona.amethyst.model.parseConnectivityType
import com.vitorpamplona.amethyst.model.parseFeatureSetType
import com.vitorpamplona.amethyst.model.parseThemeType
import com.vitorpamplona.amethyst.ui.components.PushNotificationSettingsRow
import com.vitorpamplona.amethyst.ui.screen.SharedPreferencesViewModel
@@ -141,6 +143,12 @@ fun SettingsScreen(sharedPreferencesViewModel: SharedPreferencesViewModel) {
TitleExplainer(stringResource(ConnectivityType.NEVER.resourceId)),
)
val featureItems =
persistentListOf(
TitleExplainer(stringResource(FeatureSetType.COMPLETE.resourceId)),
TitleExplainer(stringResource(FeatureSetType.SIMPLIFIED.resourceId)),
)
val showImagesIndex = sharedPreferencesViewModel.sharedPrefs.automaticallyShowImages.screenCode
val videoIndex = sharedPreferencesViewModel.sharedPrefs.automaticallyStartPlayback.screenCode
val linkIndex = sharedPreferencesViewModel.sharedPrefs.automaticallyShowUrlPreview.screenCode
@@ -156,6 +164,9 @@ fun SettingsScreen(sharedPreferencesViewModel: SharedPreferencesViewModel) {
val languageList = remember { languageEntries.keys.map { TitleExplainer(it) }.toImmutableList() }
val languageIndex = getLanguageIndex(languageEntries, sharedPreferencesViewModel)
val featureSetIndex =
sharedPreferencesViewModel.sharedPrefs.featureSet.screenCode
Column(
Modifier.fillMaxSize()
.padding(top = Size10dp, start = Size20dp, end = Size20dp)
@@ -237,6 +248,17 @@ fun SettingsScreen(sharedPreferencesViewModel: SharedPreferencesViewModel) {
Spacer(modifier = HalfVertSpacer)
SettingsRow(
R.string.ui_style,
R.string.ui_style_description,
featureItems,
featureSetIndex,
) {
sharedPreferencesViewModel.updateFeatureSetType(parseFeatureSetType(it))
}
Spacer(modifier = HalfVertSpacer)
PushNotificationSettingsRow(sharedPreferencesViewModel)
}
}
@@ -115,10 +115,7 @@ fun LoginPage() {
val accountViewModel: AccountStateViewModel = viewModel()
ThemeComparisonRow(
onDark = {
LoginPage(accountViewModel, true) {}
},
onLight = {
toPreview = {
LoginPage(accountViewModel, true) {}
},
)
@@ -83,10 +83,7 @@ fun SignUpPage() {
val accountViewModel: AccountStateViewModel = viewModel()
ThemeComparisonRow(
onDark = {
SignUpPage(accountViewModel) {}
},
onLight = {
toPreview = {
SignUpPage(accountViewModel) {}
},
)
@@ -451,16 +451,13 @@ fun AmethystTheme(
}
@Composable
fun ThemeComparisonColumn(
onDark: @Composable () -> Unit,
onLight: @Composable () -> Unit,
) {
fun ThemeComparisonColumn(toPreview: @Composable () -> Unit) {
Column {
Box {
val darkTheme: SharedPreferencesViewModel = viewModel()
darkTheme.updateTheme(ThemeType.DARK)
AmethystTheme(darkTheme) {
Surface(color = MaterialTheme.colorScheme.background) { onDark() }
Surface(color = MaterialTheme.colorScheme.background) { toPreview() }
}
}
@@ -468,23 +465,20 @@ fun ThemeComparisonColumn(
val lightTheme: SharedPreferencesViewModel = viewModel()
lightTheme.updateTheme(ThemeType.LIGHT)
AmethystTheme(lightTheme) {
Surface(color = MaterialTheme.colorScheme.background) { onLight() }
Surface(color = MaterialTheme.colorScheme.background) { toPreview() }
}
}
}
}
@Composable
fun ThemeComparisonRow(
onDark: @Composable () -> Unit,
onLight: @Composable () -> Unit,
) {
fun ThemeComparisonRow(toPreview: @Composable () -> Unit) {
Row {
Box(modifier = Modifier.weight(1f)) {
val darkTheme: SharedPreferencesViewModel = viewModel()
darkTheme.updateTheme(ThemeType.DARK)
AmethystTheme(darkTheme) {
Surface(color = MaterialTheme.colorScheme.background) { onDark() }
Surface(color = MaterialTheme.colorScheme.background) { toPreview() }
}
}
@@ -492,7 +486,7 @@ fun ThemeComparisonRow(
val lightTheme: SharedPreferencesViewModel = viewModel()
lightTheme.updateTheme(ThemeType.LIGHT)
AmethystTheme(lightTheme) {
Surface(color = MaterialTheme.colorScheme.background) { onLight() }
Surface(color = MaterialTheme.colorScheme.background) { toPreview() }
}
}
}
@@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="236dp"
android:height="236dp"
android:viewportWidth="236"
android:viewportHeight="236">
<path
android:fillColor="#E102C2"
android:strokeWidth="1"
android:pathData="M168,2 C166.799,8.18727,164.947,14.0171,163,20 L173,19 C172.51,13.3852,171.014,6.79588,168,2 M180,142 C184.601,142.041,190.655,144.838,194.96,143.242 C198.824,141.81,201.214,137.39,203.124,134 C210.078,121.662,205.608,109.019,208.529,96 C209.595,91.2476,211.618,86.9521,211.907,82 C212.185,77.2133,210.665,72.7095,210.17,68 C209.701,63.5467,209.857,58.574,205.786,55.608 C201.265,52.3132,197.605,56.5867,197.109,61.0008 C196.625,65.3034,197.297,69.6886,196.896,74 C196.545,77.7718,195.281,81.1715,195.192,85 C195.122,88.0362,193.994,92.9444,190,92.9444 C182.816,92.9444,184.436,81.2708,183.471,77 C181.705,69.1818,178.855,62.145,178.174,54 C177.671,47.9876,179.574,42.0776,178.815,36 C178.301,31.8835,176.341,26.0742,171.957,24.6474 C165.913,22.6804,163.112,29.2432,163.019,34 C162.92,39.1355,164.73,43.9125,164.961,49 C165.331,57.1618,165.938,65.6008,166.06,73.7145 C166.102,76.5167,164.978,79.1797,165.148,82.0008 C165.401,86.2009,171.219,91.7501,168.342,95.6366 C164.867,100.33,159.865,95.1623,157.698,91.9992 C153.406,85.7334,150.568,78.4766,146.637,72.0193 C144.788,68.9835,141.904,66.4794,138.105,67.4529 C127.951,70.0551,136.163,83.457,139.475,88 C148.178,99.9397,155.763,112.385,165.069,124 C170.248,130.463,177.624,133.778,180,142 M201,31 C201.873,37.4822,203,43.4025,203,50 L211,53 C210.634,44.6039,207.808,36.2575,201,31 M134,45 C130.221,51.7137,128.788,59.5176,131,67 C133.684,65.6449,136.047,64.5637,139,64 C138.115,58.0095,136.467,50.4928,134,45 M69,46 C67.7386,52.0951,65.8947,58.0744,64,64 L75,65 C73.0087,58.8781,72.0169,51.6331,69,46 M58,187 C60.1785,179.456,65.298,178.506,69.5756,172.891 C76.4258,163.899,83.8065,155.158,90.3627,146 C93.3233,141.864,95.3809,137.163,98.3634,133 C101.618,128.457,110.219,115.016,99.9452,112.453 C96.1093,111.496,93.2422,113.949,91.3627,117.019 C87.4224,123.456,84.5515,130.765,80.3009,136.999 C78.2049,140.073,73.9249,144.782,70.3727,140.793 C66.7916,136.772,72.5283,131.392,72.8765,127 C73.1057,124.109,72.0273,121.426,71.99,118.576 C71.8412,107.222,73.1025,95.215,74.6998,84 C75.461,78.656,74.6292,66.8531,66.0432,69.6474 C61.6591,71.0742,59.6995,76.8835,59.1852,81 C58.5106,86.3994,60.0712,91.6669,59.6752,97 C59.0126,105.922,56.2059,113.456,54.3897,122 C53.4709,126.322,55.3265,137.793,48,137.793 C43.4396,137.793,42.7212,132.308,42.7153,129 C42.7089,125.453,41.0904,122.469,40.814,119 C40.4715,114.701,41.3203,110.323,40.9414,106.001 C40.5785,101.862,36.9418,97.2305,32.3904,100.032 C28.1086,102.668,28.2839,108.688,27.8302,113 C27.371,117.365,25.9672,121.574,26.054,126 C26.1513,130.962,27.9426,135.298,29.2153,140 C32.8567,153.455,27.7081,166.117,35.0432,179 C37.0472,182.52,39.8521,187.101,44.0008,188.303 C47.9872,189.459,53.7392,187.036,58,187 M36,76 C30.3783,82.2632,27.1802,89.5415,27,98 C29.653,96.7567,32.1579,95.7118,35,95 C35,89.2612,37.5867,81.2251,36,76 M103,90 C102.725,96.2961,100.405,101.927,99,108 C101.839,109.086,104.364,110.488,107,112 C109.117,104.839,108.468,95.4737,103,90 M180.108,151.742 C169.428,156.306,179.297,171.326,188.907,167.141 C201.335,161.729,191.315,146.953,180.108,151.742 M172,170 C172,176.766,171.53,183.278,171,190 C175.401,185.315,179.315,179.294,183,174 C179.113,173.098,175.607,171.693,172,170 M49.0046,196.533 C37.7274,199.326,45.4118,214.867,55,212.412 C61.5523,210.735,65.5024,202.582,59.581,197.603 C56.911,195.359,52.1706,195.749,49.0046,196.533 M65,215 C61.7705,216.818,58.5543,217.97,55,219 C59.1283,224.051,63.1959,229.072,66,235 C67.2105,229.96,67.0167,219.806,65,215 Z" />
</vector>
@@ -1,64 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="128dp"
android:height="128dp"
android:viewportWidth="128"
android:viewportHeight="128">
<path
android:fillColor="#FF3700B3"
android:strokeWidth="1"
android:pathData="M18,1 C18.9992,13.6607,22.1338,27.7425,34,34.6366 C40.7028,38.5308,48.5179,39.5903,56,41 C54.3404,31.8037,49.5418,30.0009,41,30 L41,27 L48,27 C43.5259,17.4059,36.6076,16,27,16 L27,13 L34,13 C32.6931,11.3029,31.5948,10.0267,31,8 C26.6436,5.68091,22.6182,2.74787,18,1 Z" />
<path
android:fillColor="#FF6200EE"
android:strokeWidth="1"
android:pathData="M20,1 C23.7028,5.01085,28.4333,6.60192,33,9.37886 C37.2327,11.9527,40.6939,15.5138,45,18 C45,16.2032,45.0143,16.4785,46,15 C49.1978,22.5154,52.8144,28.929,57,36 C58.7383,31.8481,57.6225,27.1823,56.2508,23 C50.9595,6.86786,35.7333,1.01042,20,1 Z" />
<path
android:fillColor="#818181"
android:strokeWidth="1"
android:pathData="M39,4 L40,5 L39,4 Z" />
<path
android:fillColor="#35b458"
android:strokeWidth="1"
android:pathData="M30,9 C31.3926,10.4336,32.2328,11.0449,34,12 C31.5819,12.7224,29.5283,12.9481,27,13 L27,16 C36.9436,16,42.0965,18.6193,48,27 L41,27 L41,30 C44.205,30.0025,47.9651,29.5304,50.6713,31.6034 C54.7802,34.7509,55.7328,40.3378,57.0108,45 C60.2954,56.9827,62,69.5839,62,82 C62,87.7274,59.4347,99.821,66,102 C66,95.3343,66.0617,88.6654,66,82 C65.9762,79.4328,65.067,76.5127,65.5556,74 C66.6821,68.2063,71.7932,59.9436,75.0278,55 C76.5417,52.6862,78.2725,50.2574,81,49.3333 C84.7977,48.0467,89.9365,50.9632,91,46 L81,47 C87.2435,39.3331,91.8803,35.0279,102,35 L102,33 L95,33 L99,28 C92.7626,28.2768,88.8779,34.5639,84,38 C83.7893,35.2614,83.6975,34.578,81,34 C81.9074,41.9128,77.8444,45.756,73.5046,52 C70.4878,56.3406,67.7521,61.3024,64,65 C63.9237,55.7794,62.0513,45.3541,58.0193,37 C55.6122,32.0127,52.0583,27.809,49.4151,23 C47.9915,20.4099,47.5242,17.5234,46,15 C45.3152,16.2483,45.2512,16.5484,45,18 C40.5825,14.4148,35.9467,8.78864,30,9 Z" />
<path
android:fillColor="#818181"
android:strokeWidth="1"
android:pathData="M47,9 L48,10 L47,9 Z" />
<path
android:fillColor="#FF6200EE"
android:strokeWidth="1"
android:pathData="M70,57 C76.3094,50.934,82.6356,42.9806,81,34 C83.0347,35.2259,83.3265,35.7026,84,38 C90.3127,35.0562,94.6995,29.2957,101,26.0247 C103.882,24.5284,105.934,22.6997,109,24 C109.683,22.494,109.826,21.6852,110,20 C92.9496,20.3519,76.459,26.2355,71.2091,44 C69.9432,48.2837,70.0005,52.5793,70,57 Z" />
<path
android:fillColor="#818181"
android:strokeWidth="1"
android:pathData="M96,21 L97,22 L96,21 Z" />
<path
android:fillColor="#FF3700B3"
android:strokeWidth="1"
android:pathData="M98,27 C97.4257,29.3388,96.3153,30.952,95,33 L102,33 L102,35 C91.9916,35.0066,86.152,38.087,81,47 C84.4218,46.9717,87.6368,46.6245,91,46 C88.2508,50.2406,84.2142,47.9848,80.0401,49.6034 C75.8011,51.2471,73.6765,56.1154,72,60 C93.0315,59.0947,111.529,44.7797,109,22 C104.967,22.9474,101.721,25.2426,98,27 Z" />
<path
android:fillColor="#01ff01"
android:strokeWidth="1"
android:pathData="M23,23 L24,24 L23,23 M85,25 L86,26 L85,25 Z" />
<path
android:fillColor="#818181"
android:strokeWidth="1"
android:pathData="M72,40 L73,41 L72,40 Z" />
<path
android:fillColor="#f99721"
android:strokeWidth="1"
android:pathData="M18,127 C24.7416,127,33.546,128.5,40,126.437 C43.9557,125.172,46.9708,122.016,51,120.8 C53.8127,119.952,57.0165,120.515,59.7145,119.397 C66.4359,116.613,70.376,110.812,78,109 C73.2583,102.431,64.8777,99.3157,57,102.667 C53.9866,103.95,51.8253,106.485,49,108.066 C46.1443,109.665,42.7844,109.921,40.0147,111.727 C37.7156,113.226,36.0905,115.611,33.7145,116.977 C27.2551,120.69,22.0281,119.305,18,127 Z" />
<path
android:fillColor="#857f2d"
android:strokeWidth="1"
android:pathData="M62,101 L63,102 L62,101 Z" />
<path
android:fillColor="#ffff01"
android:strokeWidth="1"
android:pathData="M52,105 L53,106 L52,105 M75,105 L76,106 L75,105 Z" />
<path
android:fillColor="#df7f07"
android:strokeWidth="1"
android:pathData="M41,127 L110,127 C105.972,119.305,100.745,120.69,94.2855,116.977 C87.4988,113.076,83.904,107.518,75,109.53 C68.1753,111.072,64.8143,116.981,58.8302,119.397 C51.9278,122.185,46.424,120.458,41,127 Z" />
</vector>
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+5
View File
@@ -0,0 +1,5 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:autoMirrored="true" android:height="30dp" android:viewportHeight="236" android:viewportWidth="236" android:width="30dp">
<path android:fillColor="#e102c2" android:pathData="M172.02,18.47 L184.05,17.34C183.46,10.98 181.09,5.5 177.47,0.07M192.47,156.68c15.59,0.84 18.54,6.44 27.81,-9.06 8.36,-13.98 2.99,-28.3 6.5,-43.05 1.28,-5.38 3.72,-10.25 4.06,-15.86 0.33,-5.42 -1.49,-10.52 -2.09,-15.86 -0.56,-5.04 -0.38,-10.68 -5.27,-14.04 -5.44,-3.73 -9.84,1.11 -10.44,6.11 -0.58,4.87 0.23,9.84 -0.26,14.73 -0.42,4.27 -1.94,8.12 -2.05,12.46 -0.08,3.44 -1.44,9 -6.24,9 -8.64,0 -6.69,-13.22 -7.85,-18.06 -2.12,-8.86 -5.55,-16.83 -6.37,-26.06 -0.61,-6.81 1.68,-13.51 0.77,-20.39 -0.62,-4.66 -2.98,-11.24 -8.25,-12.86 -7.27,-2.23 -10.64,5.21 -10.75,10.6 -0.12,5.82 2.06,11.23 2.34,16.99 0.45,9.25 1.18,18.81 1.32,28 0.05,3.17 -1.3,6.19 -1.1,9.39 0.3,4.76 7.3,11.04 3.84,15.45 -4.18,5.32 -10.2,-0.54 -12.8,-4.12 -5.16,-7.1 -8.58,-15.32 -13.3,-22.63 -2.22,-3.44 -5.69,-6.28 -10.26,-5.17 -12.21,2.95 -2.34,18.13 1.65,23.28 10.47,13.53 19.59,27.62 30.78,40.78 6.23,7.32 15.1,11.08 17.96,20.39m25.26,-125.75c1.05,7.34 2.41,14.05 2.41,21.52l9.62,3.4c-0.44,-9.51 -3.84,-18.97 -12.03,-24.92m-80.59,15.86c-4.55,7.61 -6.27,16.45 -3.61,24.92 3.23,-1.54 6.07,-2.76 9.62,-3.4 -1.06,-6.79 -3.05,-15.3 -6.01,-21.52m-78.18,1.13c-1.52,6.9 -3.73,13.68 -6.01,20.39L66.18,69.45C63.78,62.51 62.59,54.31 58.96,47.92M45.73,207.66c2.62,-8.55 8.78,-9.62 13.92,-15.98 8.24,-10.19 17.12,-20.09 25,-30.46 3.56,-4.69 6.04,-10.01 9.62,-14.73 3.92,-5.15 14.26,-20.37 1.9,-23.28 -4.61,-1.08 -8.06,1.69 -10.32,5.17 -4.74,7.29 -8.19,15.57 -13.31,22.63 -2.52,3.48 -7.67,8.82 -11.94,4.3 -4.31,-4.56 2.59,-10.65 3.01,-15.63 0.28,-3.28 -1.02,-6.31 -1.07,-9.54 -0.18,-12.86 1.34,-26.46 3.26,-39.17 0.92,-6.05 -0.09,-19.43 -10.41,-16.26 -5.27,1.62 -7.63,8.2 -8.25,12.86 -0.81,6.12 1.07,12.08 0.59,18.13 -0.8,10.11 -4.17,18.64 -6.36,28.32 -1.11,4.9 1.13,17.89 -7.69,17.89 -5.48,0 -6.35,-6.21 -6.36,-9.96 -0.01,-4.02 -1.95,-7.4 -2.29,-11.33 -0.41,-4.87 0.61,-9.83 0.15,-14.73 -0.44,-4.69 -4.81,-9.94 -10.29,-6.76 -5.15,2.99 -4.94,9.81 -5.48,14.69 -0.55,4.94 -2.24,9.71 -2.14,14.73 0.12,5.62 2.27,10.53 3.8,15.86 4.38,15.24 -1.81,29.59 7.01,44.18 2.41,3.99 5.78,9.18 10.77,10.54 4.79,1.31 11.71,-1.44 16.84,-1.48M19.27,81.91C12.51,89.01 8.66,97.25 8.44,106.83c3.19,-1.41 6.2,-2.59 9.62,-3.4 0,-6.5 3.11,-15.61 1.2,-21.52m80.59,15.86c-0.33,7.13 -3.12,13.51 -4.81,20.39 3.41,1.23 6.45,2.82 9.62,4.53 2.55,-8.11 1.77,-18.72 -4.81,-24.92m92.75,69.95c-12.85,5.17 -0.98,22.19 10.58,17.44 14.95,-6.13 2.9,-22.87 -10.58,-17.44m-9.75,20.68c0,7.66 -0.57,15.04 -1.2,22.66 5.29,-5.31 10,-12.13 14.43,-18.13 -4.68,-1.02 -8.89,-2.61 -13.23,-4.53M34.91,218.46c-13.57,3.16 -4.32,20.77 7.21,17.99 7.88,-1.9 12.63,-11.14 5.51,-16.78 -3.21,-2.54 -8.91,-2.1 -12.72,-1.21" android:strokeWidth="1.16731"/>
</vector>
+31
View File
@@ -0,0 +1,31 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:autoMirrored="true" android:height="30dp" android:viewportHeight="128" android:viewportWidth="128" android:width="30dp">
<path android:fillColor="#6200ee" android:pathData="M9.22,0.49C32.03,17.55 41.73,30.89 55.97,46.5 58.13,41.35 55.87,32.95 54.17,27.76 47.61,7.76 28.73,0.5 9.22,0.49Z" android:strokeWidth="1.23984"/>
<path android:fillColor="#6200ee" android:pathData="M71.43,71.77C80.15,58.93 119.83,33.38 120.81,24.04 99.67,24.48 79.22,31.77 72.71,53.8c-1.57,5.31 -1.28,12.49 -1.28,17.98z" android:strokeWidth="1.23984"/>
<path android:fillColor="#3700b3" android:pathData="M106.9,34.15C85.73,55.38 83.29,51.88 72.93,73.42 99.01,72.3 124.1,52.45 120.96,24.2c-6.39,2.87 -10.26,5.06 -14.06,9.95z" android:strokeWidth="1.23984"/>
<path android:fillColor="#3700b3" android:pathData="M8.75,0.49C9.99,16.18 11.87,33.64 26.58,42.19c8.31,4.83 18,6.14 27.28,7.89C51.37,34.85 52.38,36.2 23.79,11.48 19.47,7.83 15.87,4.35 8.75,0.49Z" android:strokeWidth="1.23984"/>
<path android:fillColor="#818181" android:pathData="m32.78,4.21 l1.24,1.24z" android:strokeWidth="1.23984"/>
<path android:fillColor="#35b458" android:pathData="m21.62,10.4c1.73,1.78 2.77,2.54 4.96,3.72 -3,0.9 -5.54,1.18 -8.68,1.24v3.72c12.33,0 18.72,3.25 26.04,13.64h-8.68v3.72c3.97,0 8.64,-0.58 11.99,1.99 5.09,3.9 6.28,10.83 7.86,16.61 4.07,14.86 6.19,30.48 6.19,45.87 0,7.1 -12.14,35.85 4.96,24.8 2.2,-11.69 -0.79,-24.1 -0.55,-34.72 3.59,-12.15 10.48,-24.1 19.15,-30.58 4.71,-1.59 11.08,2.02 12.4,-4.13L84.85,57.52C92.59,48.01 98.34,42.67 110.89,42.64v-2.48h-8.68l4.96,-6.2C99.44,34.3 94.62,42.1 88.57,46.36 88.31,42.96 88.2,42.12 84.85,41.4 84.47,54.13 72.01,71.54 63.78,79.84 63.68,68.4 61.36,55.48 56.36,45.12 53.38,38.94 48.97,33.72 45.69,27.76c-1.76,-3.21 -2.34,-6.79 -4.23,-9.92 -0.85,1.55 -0.93,1.92 -1.24,3.72C34.74,17.12 29,10.14 21.62,10.4Z" android:strokeWidth="1.23984"/>
<path android:fillColor="#818181" android:pathData="m42.7,10.4 l1.24,1.24z" android:strokeWidth="1.23984"/>
<path android:fillColor="#818181" android:pathData="m103.45,25.28 l1.24,1.24z" android:strokeWidth="1.23984"/>
<path android:fillColor="#01ff01" android:pathData="m12.94,27.76 l1.24,1.24 -1.24,-1.24m76.87,2.48 l1.24,1.24z" android:strokeWidth="1.23984"/>
<path android:fillColor="#818181" android:pathData="m73.7,48.84 l1.24,1.24z" android:strokeWidth="1.23984"/>
<path android:fillColor="#f99721" android:pathData="m0.08,127.88c9.29,0 23.31,0 33.06,-0.19 18.28,-0.22 37.95,-11.49 49.61,-18.06 -6.53,-6.66 -21.68,-9.69 -28.93,-6.42 -6.34,4.41 -16.53,6.01 -23.4,9.19 -10.62,8.43 -25.2,8.66 -30.33,15.49z" android:strokeWidth="1.18196"/>
<path android:fillColor="#857f2d" android:pathData="m61.97,101.52 l1.01,1.01z" android:strokeWidth="1.01399"/>
<path android:fillColor="#ffff01" android:pathData="m51.83,105.57 l1.01,1.01 -1.01,-1.01m23.32,0 l1.01,1.01z" android:strokeWidth="1.01399"/>
<path android:fillColor="#df7f07" android:pathData="m31.33,127.88h96.76c-5.65,-7.8 -12.98,-6.4 -22.04,-10.16 -9.52,-3.96 -14.56,-9.59 -27.04,-7.55 -9.57,1.56 -14.28,7.56 -22.67,10.01 -9.68,2.83 -17.4,1.08 -25,7.71z" android:strokeWidth="1.19243"/>
</vector>
@@ -1,32 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="512dp"
android:height="512dp"
android:viewportWidth="512"
android:viewportHeight="512">
<path
android:fillColor="#feb804"
android:strokeWidth="1"
android:pathData="M392,12 L391.976,13.6713 L391.619,15.1605 L390.801,17.0247 L390.249,18.0046 L388.992,20 L388.332,21 L386.333,24 L381,32 L376.975,38 L372.709,44 L363.421,57 L360.579,61 L357.72,65 L353.573,71 L348.424,78 L346.291,81 L343.421,85 L340.576,89 L335.424,96 L331.849,101 L327.424,107 L323.116,113 L317.151,121 L312.116,128 L306.884,135 L302.576,141 L299.626,145 L295.151,151 L290.849,157 L284.884,165 L279.849,172 L276.873,176 L271.627,183 L267.151,189 L262.849,195 C261.637,196.665,260.386,198.301,259.221,200 C258.36,201.254,257.561,202.579,257.005,204 L256.399,206 L256.233,207 L256.191,208.995 L256.333,209.981 L256.607,210.941 L257.603,212.682 L259.148,213.972 L261.019,214.682 L262.005,214.852 L263.001,214.941 L265,214.995 L267,215 L271,215 L274,214.995 L274.999,214.981 C275.991,214.925,276.988,214.923,277.96,214.682 L279.816,213.972 L280.674,213.397 L282.239,211.852 L282.957,210.941 L284.304,208.995 C285.178,207.689,285.982,206.337,286.808,205 L289.319,201 L291.797,197 L295.424,191 L298.576,186 L300.424,183 L303.576,178 L305.424,175 L307.319,172 L310.424,167 L313.576,162 L315.424,159 L318.576,154 L320.424,151 L323.576,146 L325.424,143 L328.576,138 L330.424,135 L333.576,130 L335.424,127 L338.576,122 L340.424,119 L343.576,114 L345.424,111 L348.576,106 L353.424,98 L355.95,94 L358.424,90 L361.576,85 L363.424,82 L366.576,77 L368.424,74 L370.319,71 L373.424,66 L376.576,61 L378.424,58 L381.576,53 L386.424,45 L389.576,40 L392.681,35 L394.576,32 L395.792,30 L396.946,28 L397.939,26 L398.336,25 L398.906,23 L399.087,22 L399.207,21 L399.259,20.0008 L399.145,18.0154 L398.697,16.1088 L398.333,15.2284 L397.858,14.4337 L397.276,13.7423 L396.595,13.179 L395.052,12.4344 L394.115,12.2261 L393.655,12.1181 L392,12 Z" />
<path
android:fillColor="#ffc927"
android:strokeWidth="1"
android:pathData="M77,273 C78.6797,272.986,80.3507,272.994,82.0247,272.83 L86,272.285 L88,272.09 L90,272.015 L93,272 L97,272 L111,272 L116,271.999 L119,271.961 L121,271.83 L122,271.715 L125,271.285 L126,271.17 L128,271.039 L131,271.001 L136,271 L151,271 L156,271 L159,270.985 C160,270.961,161.004,270.939,162,270.83 L164,270.576 L166,270.285 C166.999,270.162,167.994,270.083,169,270.039 C170.331,269.981,171.668,270.001,173,270 L179,270 L197,270 L225,270 C226.334,270.003,227.666,269.998,228.999,270.059 L230.985,270.318 L231.956,270.603 L233.772,271.603 L234.566,272.318 L235.806,274.059 L236.462,276.005 L236.562,277.001 L236.512,278 C236.409,279.034,236.08,280.021,235.752,281 L234.981,283 L234.56,284 L233.627,285.996 L232.536,287.961 C231.982,288.919,231.32,289.813,230.681,290.715 L229.424,292.424 L227.576,295.09 C225.628,298.003,223.806,300.997,222,304 L217.8,311 L206.4,330 L187.8,361 L180.6,373 L177.603,378 L173.576,385 L171.799,388 L160.4,407 L137.6,445 L125.6,465 L121.4,472 L118.424,477 L116.719,480 L115.001,483 L113.309,486 L112.274,488 L111.353,489.995 L110.966,490.975 L110.391,492.84 L110.114,494.329 L110,496 L111.671,495.759 L113.16,495.296 L115.025,494.427 L117.002,493.196 L118,492.467 L120,490.819 L123,488.075 L125,486.285 L129,482.831 L133,479.086 L135,477.285 L139,473.834 L142,471.075 L144,469.285 L148,465.831 L153,461.169 L158,456.834 L162,453.166 L167,448.834 L171,445.166 L176,440.834 L180,437.166 L185,432.834 L188,430.075 L191,427.424 L194,424.834 L198,421.166 L203,416.831 L208,412.169 L213,407.834 L217,404.166 L219,402.424 L221,400.715 L223,398.925 L226,396.166 L231,391.834 L235,388.166 L240,383.831 L245,379.169 L250,374.834 L253,372.075 L255,370.285 L259,366.831 L264,362.169 L269,357.831 L274,353.169 L279,348.831 L284,344.169 L289,339.83 C291.39,337.669,293.61,335.331,296,333.17 L301,328.83 L307,323.17 L311,319.715 L313,317.91 C315.027,316.025,316.946,314.027,319,312.17 L324,307.83 C326.39,305.669,328.61,303.331,331,301.17 L336,296.83 C338.054,294.973,339.973,292.975,342,291.09 C342.981,290.178,343.985,289.298,345,288.424 L348,285.83 C350.054,283.973,351.973,281.975,354,280.09 C356.28,277.969,358.72,276.031,361,273.91 C363.028,272.025,364.946,270.027,367,268.17 L370,265.576 C371.015,264.702,372.019,263.822,373,262.91 C375.027,261.025,376.946,259.027,379,257.17 L384,252.83 C386.389,250.669,388.61,248.331,391,246.17 L394,243.576 C395.015,242.702,396.02,241.822,397,240.91 L402,236.09 C404.28,233.969,406.721,232.033,409,229.91 C411.371,227.703,413.597,225.345,416,223.17 L418.995,220.577 L420.941,218.855 L422.679,217.121 L423.914,215.667 L425,214 L341,214 L313,214 L304,214 L301,214.001 L298,214.039 L296,214.17 L295,214.285 L292,214.715 L291,214.83 L289,214.96 C287.668,215.012,286.331,214.986,285,214.925 C283.666,214.865,282.335,214.728,281,214.71 C278.996,214.683,277.002,214.901,275,214.965 L272,214.999 L268,215 C266.666,214.997,265.333,215.002,264,214.941 L262.005,214.682 L261.019,214.397 L259.148,213.397 L258.319,212.682 L257.043,210.941 L256.647,209.981 L256.362,207.999 L256.671,206 L257.443,204 L258.562,202 L259.914,200 L261.374,198 L262.849,196 L267.884,189 L271.627,184 L276.873,177 L279.116,174 L284.151,167 L289.37,160 L291.576,157 L295.151,152 L301.116,144 L306.884,136 L312.116,129 L317.151,122 L323.116,114 L327.424,108 L331.849,102 L335.424,97 L340.576,90 L342.709,87 L345.579,83 L348.424,79 L353.573,72 L357.025,67 L359.86,63 L368.421,51 L370.579,48 L373.421,44 L376.975,39 C378.796,36.3575,380.553,33.6703,382.333,31 L387.667,23 L389.651,20.0015 L390.891,18.0247 L391.908,16.1605 L392.544,14.6713 L393,13 L391.329,13.3272 L389.84,13.9391 L387.975,15.0178 C386.962,15.6948,385.984,16.4137,385,17.1312 L381,20.1296 L378,22.4244 L372,27.1998 L364,33.6003 L358,38.4244 L353,42.5756 L347,47.4244 L342,51.5756 L336,56.4244 L326,64.75 L319,70.4244 L314,74.5864 L304,82.9197 L263,117.08 L246,131.247 L237,138.75 L229,145.25 L225,148.586 L217,155.247 L213,158.576 L204,165.803 L196,172.389 L186,180.424 L175,189.576 L169,194.424 L166,196.92 L163,199.424 L158,203.728 C155.026,206.265,152.003,208.745,149,211.247 L134,223.753 L126,230.424 L121,234.728 L113,241.424 L108,245.728 L102,250.754 L99,253.272 L95,256.728 L88,262.586 L83.0046,266.752 C81.7535,267.812,80.4927,268.86,79.321,270.009 L78.517,270.93 L78.0864,271.37 L77,273 Z" />
<path
android:fillColor="#ffe567"
android:strokeWidth="1"
android:pathData="M295.999,97.743 C294.923,98.1238,293.944,98.7126,293,99.3441 C291.958,100.041,290.976,100.834,290,101.62 C287.932,103.283,285.978,105.078,284,106.845 L282,108.576 L280,110.271 L276,113.729 L273,116.271 L269,119.729 L266,122.282 L262,125.845 L258,129.271 L253,133.579 L251,135.271 L247,138.729 L244,141.282 L239,145.718 L236,148.271 L232,151.729 L229,154.282 L224,158.718 L220,162.13 L217,164.729 L214,167.271 L210,170.729 L207,173.271 L203,176.729 L200,179.271 L196,182.728 L187,190.272 L182,194.576 L179,197.08 L172,202.92 L168,206.272 L164,209.729 L161,212.271 L158,214.87 L154,218.271 L150,221.729 L148,223.421 L143,227.729 L139,231.155 L136,233.845 L131,238.17 C129.971,239.086,128.985,240.052,128,241.015 L126.004,243.001 L124.044,245 L123.109,246 L122.228,247 L121.434,248 L120.179,250 L119.438,252 L119.244,253 L119.153,255 L119.244,256 L119.743,257.996 C120.694,260.486,122.651,262.604,125.015,263.821 C126.562,264.617,128.275,264.896,130,264.863 C131.705,264.829,133.393,264.442,135,263.892 C137.897,262.9,140.568,261.317,143,259.475 C144.736,258.16,146.347,256.685,148,255.271 C149.681,253.832,151.38,252.419,153,250.91 C155.384,248.69,157.616,246.31,160,244.09 C162.279,241.967,164.721,240.033,167,237.91 C168.365,236.639,169.68,235.316,171,233.999 L175,230 L186,219 L190,215.001 L193,212.039 L195,210.17 L200,205.83 L202,203.961 C203.697,202.338,205.34,200.659,207,199 L216,190 L219,187.001 L222,184.039 L224,182.17 L229,177.83 L231,175.961 L234,172.999 L237,170 L246,161 C247.66,159.341,249.303,157.662,251,156.039 L253,154.17 L258,149.83 L260,147.961 L263,144.999 L267,141 L278.999,129 C280.634,127.357,282.275,125.719,283.83,124 L287.285,120 C288.181,118.978,289.1,117.982,290.039,117 L295.985,111 C296.945,110.014,297.891,109.022,298.811,108 L300.427,106 L301.677,104.001 L302.123,103.005 L302.427,102.019 L302.549,100.148 L301.954,98.6042 L300.681,97.6188 L299.852,97.3619 L297.981,97.287 L295.999,97.743 Z" />
<path
android:fillColor="#feb804"
android:strokeWidth="1"
android:pathData="M110,496 L110.315,498.115 L110.604,499.052 L111.028,499.816 L112.318,501.262 L114.059,502.254 L115.019,502.551 L116.005,502.728 L118,502.742 L120,502.343 L122,501.547 L124,500.387 L126,498.956 C127.354,497.912,128.681,496.838,130,495.75 L133,493.247 L140,487.414 L150,479.08 L153,476.576 L159,471.424 L172,460.576 L177,456.272 L183,451.246 L186,448.728 L190,445.271 L194,441.87 L197,439.272 L205,432.576 L211,427.424 L219,420.728 L223,417.271 L226,414.729 L230,411.271 L233,408.729 L237,405.272 L246,397.728 L249,395.13 L253,391.729 L257,388.271 L260,385.729 L264,382.271 L267,379.729 L271,376.271 L274,373.729 L278,370.271 L281,367.729 L285,364.271 L288,361.729 L292,358.271 L296,354.87 L299,352.271 L302,349.729 L306,346.271 L309,343.729 L313,340.271 L316,337.729 L320,334.271 L323,331.729 L327,328.271 L330,325.718 L335,321.282 L338,318.729 L342,315.271 L345,312.718 L350,308.282 L353,305.729 L357,302.271 L360,299.718 L364,296.155 L368,292.718 L372,289.155 L376,285.729 L380,282.271 L384,278.834 L388,275.166 L392,271.718 L396,268.155 L400,264.715 L405,260.166 L410,255.831 L415,251.169 L420,246.83 C422.068,244.959,424.027,242.97,426,241 L428.999,238 C430.309,236.681,431.647,235.382,432.891,234 C433.746,233.051,434.581,232.077,435.272,231 L436.346,229 L436.732,228 L437.042,227 L437.438,225 L437.514,224 L437.497,223 L437.157,221.005 L436.424,219.055 L435.91,218.133 L435.297,217.279 L434.581,216.514 L432.892,215.318 L430.985,214.577 L429.996,214.363 L428,214.242 L427,214.358 L425,215.031 L423,216.303 L422,217.109 L420,218.85 L418,220.576 C416.649,221.729,415.3,222.879,414,224.09 L408,229.91 C407.02,230.823,406.015,231.702,405,232.576 L402,235.17 C399.946,237.027,398.027,239.025,396,240.91 C395.019,241.822,394.015,242.702,393,243.576 L390,246.17 C387.946,248.027,386.027,250.025,384,251.91 C381.72,254.031,379.28,255.969,377,258.09 C374.973,259.975,373.054,261.973,371,263.83 L368,266.424 C366.986,267.298,365.981,268.178,365,269.09 L360,273.91 C359.026,274.829,358.01,275.698,357,276.576 C355.659,277.74,354.292,278.87,353,280.09 C350.987,281.989,349.053,283.973,347,285.83 L344,288.424 C342.985,289.298,341.981,290.178,341,291.09 C338.973,292.975,337.054,294.973,335,296.83 L330,301.17 C327.61,303.331,325.389,305.669,323,307.83 L318,312.17 C315.61,314.331,313.39,316.669,311,318.83 L306,323.17 L300,328.83 L295,333.17 C292.61,335.331,290.39,337.669,288,339.83 L283,344.169 L278,348.831 L273,353.169 L268,357.831 L263,362.169 L258,366.831 L254,370.285 L252,372.075 L249,374.834 L244,379.169 L239,383.831 L234,388.166 L230,391.834 L225,396.166 L221,399.834 L216,404.166 L212,407.834 L207,412.169 L202,416.831 L197,421.166 L193,424.834 L188,429.166 L184,432.834 L180,436.285 L178,438.075 L175,440.834 L170,445.166 L166,448.834 L161,453.166 L158,455.925 L156,457.715 L152,461.169 L147,465.831 L142,470.166 L139,472.925 L137,474.715 L133,478.169 L128,482.831 L123,487.166 L119,490.819 L117.002,492.467 C115.807,493.413,114.503,494.192,113.16,494.904 L111.671,495.544 L110,496 M231,292 L231.857,290.329 L232.134,289.841 L233.645,286.975 C234.295,285.686,234.865,284.348,235.38,283 C235.994,281.393,236.605,279.729,236.746,278 L236.728,276.005 L236.551,275.019 L236.254,274.059 L235.82,273.148 L234.566,271.603 L233.772,271.028 C232.338,270.151,230.625,270.09,228.999,270.019 L226,270 L222,270 L196,270 L178,270 L172,270 C170.668,270.001,169.331,269.981,168,270.039 C166.994,270.083,165.999,270.162,165,270.285 L163,270.576 L161,270.83 C160.004,270.939,159,270.961,158,270.985 L155,271 L150,271 L135,271 L131,271 L128,271.015 L126,271.09 L124,271.285 L120,271.83 C118.005,272.02,116.001,271.997,114,272 L97,272 L92,272 C90.332,272.003,88.6661,271.999,87,272.09 C85.9928,272.144,84.9987,272.293,84,272.424 L82,272.715 L80,272.93 L78.0008,273.133 L77.0039,273.314 L75.0432,274.028 L73.2137,275.318 L72.3943,276.148 L71.6528,277.059 L70.4576,279.005 L69.6682,281 L69.4375,282 L69.3187,282.999 L69.4375,284.985 L70.0131,286.906 L70.4576,287.811 L71.0093,288.656 L71.6528,289.427 L72.3943,290.106 L74.1049,291.142 C75.6475,291.836,77.3388,291.917,79,291.981 L81,291.999 L84,292 L101,292 L125,292 L167,292 L183,292 L189,291.999 C190.333,291.996,191.669,292.002,193,291.91 C195.348,291.75,197.652,291.25,200,291.09 C201.663,290.976,203.334,291.003,205,291 L213,291 L220,291 C221.992,291.003,223.991,290.972,225.975,291.169 C227.666,291.337,229.332,291.69,231,292 Z" />
<path
android:fillColor="#ffd84b"
android:strokeWidth="1"
android:pathData="M265,273.668 C263.155,274.192,261.504,275.231,260.001,276.394 L258.015,278.105 C257.04,279.044,256.085,279.993,255.184,281.004 C254.329,281.965,253.527,282.967,252.76,284 C252.033,284.979,251.358,285.993,250.671,287 L248,291 L242.667,299 L239.344,304 L233.656,313 L229,320 L221,332 L217.003,338 L214.424,342 L211.308,347 L208,352 L204,358 L201.344,362 L199.424,365 L196.308,370 L193,375 L188.333,382 C187.011,383.988,185.692,385.976,184.424,388 L181.308,393 L176.692,400 L173.576,405 L170.452,410 L169.312,412 L168.785,413 L167.8,415 L166.981,417 L166.681,417.999 L166.441,419.981 L166.785,421.851 L167.746,423.381 L169.228,424.288 L171.044,424.418 L173,423.802 L173.986,423.253 L174.961,422.566 L176.826,420.891 L178.536,418.985 L180.87,416 L186.873,408 L198.873,392 L246.873,328 L263.373,306 L268.626,299 L270.844,296 L272.239,294 C273.273,292.417,274.214,290.781,274.867,289 C275.572,287.075,275.908,285.047,275.944,283 L275.887,281.004 L275.771,280.015 L275.258,278.105 L274.258,276.394 L273.566,275.653 L271.891,274.458 L270.956,274.013 L268.996,273.438 L267.999,273.319 L267,273.319 L265,273.668 Z" />
<path
android:fillColor="#ffd84b"
android:strokeWidth="1"
android:pathData="M276,279 L276,285 L276.582,283.918 L276.628,283.502 L276.806,282.738 L276.806,281.262 L276.628,280.498 L276.582,280.082 L276,279 Z" />
</vector>
+14 -11
View File
@@ -1,12 +1,15 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="280dp"
android:height="280dp"
android:viewportWidth="280"
android:viewportHeight="280">
<path
android:pathData="M7,140.5C7,66.77 66.77,7 140.5,7C214.23,7 274,66.77 274,140.5C274,214.23 214.23,274 140.5,274C66.77,274 7,214.23 7,140.5Z"
android:fillColor="#f7931a"/>
<path
android:pathData="M161.19,51.5C153.23,72.16 145.28,94.41 135.72,116.66C135.72,116.66 135.72,119.84 138.91,119.84L204.17,119.84C204.17,119.84 204.17,121.43 205.77,123.02L110.25,229.5C108.66,227.91 108.66,226.32 108.66,224.73L142.09,153.21L142.09,146.86L75.23,146.86L75.23,140.5L156.42,51.5L161.19,51.5Z"
android:fillColor="#ffffff"/>
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:autoMirrored="true" android:height="512dp" android:viewportHeight="512" android:viewportWidth="512" android:width="512dp">
<path android:fillColor="#feb804" android:pathData="M405.81,0.32C398.49,10.85 392.37,18.66 387.21,28.1 347.37,84.64 306.07,140.12 265.2,195.92c-6.72,6.21 -2.23,18.18 7.3,15.63 15.68,3.42 21.45,-10.42 21.45,-10.42 0,0 77.89,-124.01 115.84,-186.59 2.59,-5.52 4.24,-14.8 -3.99,-14.23z" android:strokeWidth="1.04238"/>
<path android:fillColor="#ffc927" android:pathData="m134.11,269.93 l84.15,-1.04 23.28,8.34 -22.14,38.79 -109.77,188.45 3.59,0.32 279.74,-251.78 45.05,-42.48 -136.78,0.48 -35.28,-0.67L406.13,0.17c0,0 -223.08,181.66 -329.74,270.15l-1.05,0.84z" android:strokeWidth="1.04238"/>
<path android:fillColor="#feb804" android:pathData="m109.66,504.46c0.64,10.48 14.14,7.32 18.78,1.43 110.11,-98.52 227.42,-195.83 322.37,-283.08 2.86,-9.82 -3.79,-12.45 -12.85,-12.17 -78.5,71.81 -160.72,147.93 -240.44,218.41 -26.97,23.78 -53.64,47.9 -80.56,71.73 -2.16,1.7 -4.6,3.11 -7.3,3.68zM233.74,290.74c6.73,-10.68 15.61,-23.14 -0.04,-21.83 -52.45,-0 -100.96,0.79 -149.97,2.26 -7.99,-0.01 -8.92,-2.35 -12.91,9.06 -4.91,14.03 13.18,11.66 21.97,11.6 42.7,-0.17 85.45,0.63 128.07,-1.04 5,-0.01 7.71,-0.11 12.88,-0.04z" android:strokeWidth="1.04238"/>
<path android:fillColor="#ffe567" android:pathData="m296,97.74c-8.58,4.87 -15.26,12.45 -23,18.53 -35.76,30.9 -71.36,61.98 -107.63,92.28C151.57,220.67 137.06,232.03 124.04,245c-4.43,3.73 -6.85,10.69 -2.84,15.61 5.44,7.37 15.93,3.73 21.79,-1.14 10.01,-8.23 19.2,-17.38 28.7,-26.18 10.02,-9.86 19.61,-20.18 30.3,-29.34 9.8,-9.67 19.3,-19.67 29.71,-28.7 9.65,-9.6 19.13,-19.36 29.35,-28.35 10.46,-10.35 20.91,-20.72 30.73,-31.68 3.95,-4.61 10.41,-8.49 10.76,-15.09 -0.53,-3.16 -4.13,-3.24 -6.55,-2.4z" android:strokeWidth="1"/>
<path android:fillColor="#ffd84b" android:pathData="m265,273.67c-10.03,4.07 -14.76,14.57 -20.73,22.92 -7.91,12 -15.59,24.15 -23.69,36.03 -6.85,10.4 -13.5,20.93 -20.45,31.26 -7.07,11.27 -14.61,22.23 -21.71,33.48 -4.09,6.76 -9.12,13.12 -11.75,20.64 -1.05,3.04 1.15,7.25 4.72,6.31 5.83,-1.77 8.7,-7.81 12.38,-12.19 29.29,-39.13 58.73,-78.14 87.92,-117.34 3.73,-5 6.11,-12.68 2.56,-18.38 -2.25,-2.58 -5.96,-3.68 -9.26,-2.73z" android:strokeWidth="1"/>
<path android:fillColor="#ffd84b" android:pathData="M276,279L276,285L276.58,283.92L276.63,283.5L276.81,282.74L276.81,281.26L276.63,280.5L276.58,280.08L276,279Z" android:strokeWidth="1"/>
</vector>
+9 -258
View File
@@ -1,260 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="512dp"
android:height="512dp"
android:viewportWidth="512"
android:viewportHeight="512">
<path
android:fillColor="#226699"
android:strokeWidth="1"
android:pathData="M253,232 C249.539,230.337,245.815,230.079,242,230 C242,224.586,240.672,217.126,242.603,212.015 C244.333,207.438,249.664,204.587,252.791,200.996 C258.239,194.741,263.328,187.324,267.218,180 C278.855,158.093,282.595,133.579,280.91,109 C276.709,47.7074,222.184,-13.4762,157,2.89508 C147.623,5.25024,139.001,9.27115,131,14.6713 C121.697,20.9507,113.903,28.8335,107.439,38 C99.6161,49.0935,94.3378,61.8562,91.1296,75 C86.6971,93.16,86.5001,111.638,89.5864,130 C92.9116,149.783,100.852,168.916,112.895,185 C116.695,190.075,120.685,195.561,126,199.15 C130.774,202.373,136.691,203.883,142,206 C152.299,210.107,162.615,214.166,173,218.05 C187.556,223.495,202.492,229.483,218,231.7 C229.709,233.374,241.286,232.924,253,232 Z" />
<path
android:fillColor="#55acee"
android:strokeWidth="1"
android:pathData="M270,229 C262.979,229.907,256.024,232.342,249,232.907 C230.493,234.394,211.514,231.715,194,225.656 C173.184,218.455,152.286,210.346,132,201.769 C118.336,195.991,105.159,188.982,90,189 C79.1651,189.013,64.2573,191.166,56.213,199.213 C43.5001,211.931,45.5853,239.035,56.3287,251.999 C64.3267,261.65,77.0228,266.758,88,272.247 C111.899,284.197,136.7,294.145,161,305.231 C171.316,309.937,187.02,314.064,194.387,323.105 C202.778,333.401,203.737,352.257,204,365 C213.824,365,224.338,365.432,234,363.486 C259.64,358.323,282.792,344.918,305,331.6 C324.64,319.823,348.51,300.129,373,308.962 C394.493,316.714,402.192,342.196,393.099,362 C388.622,371.75,380.357,378.526,372,384.87 C324.047,421.272,265.612,446,205,446 L205,490 C205,495.135,203.457,503.423,206.742,507.772 C209.232,511.068,214.192,511.461,218,511.83 C228.173,512.815,238.781,512,249,512 L375,512 L449,512 C457.367,512,470.25,514.254,471.811,503 C473.994,487.263,472,469.894,472,454 C472,412.03,469.731,370.692,465.05,329 C463.735,317.285,461.725,305.556,459.4,294 C457.271,283.422,454.465,272.581,445.96,265.152 C439.55,259.553,427.231,267.26,420,269.255 C400.607,274.604,366.264,277.336,357.21,254 C347.877,229.946,371.153,214.202,385.999,199.961 C390.771,195.383,395.116,190.273,399.102,185 C421.964,154.753,430.652,110.677,420.575,74 C415.608,55.9222,407.232,38.5901,393.83,25.1698 C364.694,-4.00598,319.282,-7.10132,285,14.6952 C275.539,20.7104,262.624,29.6409,257.569,40 C254.859,45.5525,262.156,52.3918,264.688,57 C272.486,71.1904,277.565,86.0757,280.385,102 C284.407,124.71,280.595,148.903,271.573,170 C269.028,175.951,265.942,181.634,262.329,187 C260.605,189.561,257.201,192.802,256.907,196 C256.364,201.907,265.527,205.855,268.397,210.09 C271.63,214.86,270,223.473,270,229 Z" />
<path
android:fillColor="#00ffff"
android:strokeWidth="1"
android:pathData="M340,0 L341,1 L340,0 Z" />
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:autoMirrored="true" android:height="30dp" android:viewportHeight="512" android:viewportWidth="512" android:width="30dp">
<path android:fillColor="#226699" android:pathData="m240.08,212.39c36.87,-40.18 42.78,-59.05 41.13,-100.9C277,50.2 219.66,-13.1 154.47,3.27 98.99,29.17 78.41,76.67 87.06,130.37c3.33,19.78 11.27,38.92 23.31,55 3.8,5.07 7.79,10.56 13.1,14.15 29.58,11.55 63.27,28.18 92,32.55 49.4,5.06 16.32,4.07 24.6,-19.68z" android:strokeWidth="1"/>
<path android:fillColor="#55acee" android:pathData="m267.47,229.37c-25.72,6.13 -53.18,4.36 -76,-3.34 -20.82,-7.2 -41.71,-15.31 -62,-23.89 -13.66,-5.78 -26.84,-12.79 -42,-12.77 -10.84,0.01 -25.74,2.17 -33.79,10.21 -12.71,12.72 -10.63,39.82 0.12,52.79 8,9.65 20.69,14.76 31.67,20.25 23.9,11.95 48.7,21.9 73,32.98 10.32,4.71 26.02,8.83 33.39,17.87 8.39,10.3 7.94,31.97 8.2,44.72 9.82,0 21.75,-2.39 31.41,-4.33 25.64,-5.16 48.79,-18.57 71,-31.89 19.64,-11.78 43.51,-31.47 68,-22.64 21.49,7.75 29.19,33.23 20.1,53.04 -4.48,9.75 -12.74,16.53 -21.1,22.87 -47.95,36.4 -106.39,61.13 -167,61.13v44c0.57,13.76 -3.29,20.25 13,21.83 77.7,0.66 162.39,0.17 231,0.17 8.37,0 21.25,2.25 22.81,-9 2.18,-15.74 0.19,-33.11 0.19,-49 -0.45,-63.01 -2.27,-108.37 -12.6,-160 -2.13,-10.58 -4.93,-21.42 -13.44,-28.85 -6.41,-5.6 -18.73,2.11 -25.96,4.1 -19.39,5.35 -53.74,8.08 -62.79,-15.26 -9.33,-24.05 13.94,-39.8 28.79,-54.04 33.42,-27.88 43.86,-89.36 34.58,-125.96 -19.6,-76.14 -102.29,-105.04 -163.01,-34 -2.71,5.55 4.59,12.39 7.12,17 7.8,14.19 12.88,29.08 15.7,45 4.02,22.71 0.21,46.9 -8.81,68 -1.2,8.8 -13.79,19.12 -14.67,26 -0.54,5.91 8.62,9.85 11.49,14.09 3.23,4.77 1.6,13.38 1.6,18.91z" android:strokeWidth="1"/>
<path android:fillColor="#226699" android:pathData="m359.66,263.19c19.06,20.66 79.63,9.79 95.85,-13.82 8.68,-13.52 9.7,-39.1 -3.13,-50.67 -38.38,-27.49 -128.22,26.09 -92.72,64.49z" android:strokeWidth="1"/>
<path android:fillColor="#226699" android:pathData="m202.93,505.36c0.59,-18.53 -1.14,-37.92 -0.75,-57.16 14.33,0 28.11,-2.78 42.29,-5.14 44.72,-7.45 88.98,-29.99 125,-57.05 8.09,-6.07 16.01,-12.4 20.62,-21.63 9.25,-18.5 3.95,-45.81 -16.62,-54.07 -20,-8.03 -39.1,1.93 -56,12.07 -23.17,13.9 -46.41,28.64 -72,37.69 -10.64,2.62 -32.58,8.46 -41.85,4.71 -3.52,-16.69 -3.3,-31.8 -11.76,-42.18 -24.67,-17.17 -70.54,-35.84 -115.39,-54.99 -2.59,-1.37 -5.91,-4.18 -9,-3.97 -4.75,0.33 -8.88,7.11 -11.07,10.75 -22.39,67.4 -18.92,158.86 -18.93,219 0.22,13.62 -0.39,18.98 15,19h30c23.68,-4.03 130.22,11.25 120.46,-7.01z" android:strokeWidth="1"/>
<path
android:fillColor="#0000ff"
android:strokeWidth="1"
android:pathData="M163,1 L164,2 L163,1 M131,14 L132,15 L131,14 M122,21 L123,22 L122,21 Z" />
<path
android:fillColor="#00ffff"
android:strokeWidth="1"
android:pathData="M390,22 L391,23 L390,22 M396,28 L397,29 L396,28 Z" />
<path
android:fillColor="#0000ff"
android:strokeWidth="1"
android:pathData="M114,29 L115,30 L114,29 Z" />
<path
android:fillColor="#00ffff"
android:strokeWidth="1"
android:pathData="M401,34 L402,35 L401,34 M259,37 L260,38 L259,37 M416,61 L417,62 L416,61 M419,70 L420,71 L419,70 Z" />
<path
android:fillColor="#0000ff"
android:strokeWidth="1"
android:pathData="M89,82 L90,83 L89,82 Z" />
<path
android:fillColor="#3682bb"
android:strokeWidth="1"
android:pathData="M276.333,84.6667 C276.278,84.7223,276.222,85.7777,276.667,85.3333 C276.722,85.2778,276.778,84.2222,276.333,84.6667 Z" />
<path
android:fillColor="#337eb6"
android:strokeWidth="1"
android:pathData="M277.333,88.6667 C277.278,88.7222,277.222,89.7778,277.667,89.3333 C277.722,89.2779,277.778,88.2222,277.333,88.6667 Z" />
<path
android:fillColor="#3682bb"
android:strokeWidth="1"
android:pathData="M278.333,92.6667 C278.278,92.7223,278.222,93.7777,278.667,93.3333 C278.722,93.2778,278.778,92.2222,278.333,92.6667 Z" />
<path
android:fillColor="#3885be"
android:strokeWidth="1"
android:pathData="M279.333,97.6667 C279.278,97.7223,279.222,98.7777,279.667,98.3333 C279.722,98.2778,279.778,97.2222,279.333,97.6667 Z" />
<path
android:fillColor="#3581b9"
android:strokeWidth="1"
android:pathData="M280,102 L280,106 C280.71,104.24,280.71,103.759,280,102 Z" />
<path
android:fillColor="#3985be"
android:strokeWidth="1"
android:pathData="M281,110 L281,129 C283.02,124.187,283.02,114.813,281,110 Z" />
<path
android:fillColor="#0000ff"
android:strokeWidth="1"
android:pathData="M89,129 L90,130 L89,129 Z" />
<path
android:fillColor="#3885be"
android:strokeWidth="1"
android:pathData="M279,143 L279,146 C279.696,144.446,279.696,144.554,279,143 Z" />
<path
android:fillColor="#3986bf"
android:strokeWidth="1"
android:pathData="M278,148 L278,151 C278.696,149.446,278.696,149.554,278,148 Z" />
<path
android:fillColor="#00ffff"
android:strokeWidth="1"
android:pathData="M407,171 L408,172 L407,171 Z" />
<path
android:fillColor="#226699"
android:strokeWidth="1"
android:pathData="M413,189.465 C393.693,192.946,369.613,207.476,360.327,225 C354.592,235.824,352.834,253.447,362.185,262.815 C368.509,269.15,378.286,271.576,387,271.961 C395.955,272.356,405.158,272.218,414,270.679 C429.374,268.003,449.153,262.83,458.038,248.999 C466.722,235.482,467.739,209.898,454.906,198.329 C444.877,189.288,425.864,187.145,413,189.465 Z" />
<path
android:fillColor="#00ffff"
android:strokeWidth="1"
android:pathData="M393,191 L394,192 L393,191 M68,192 L69,193 L68,192 Z" />
<path
android:fillColor="#0000ff"
android:strokeWidth="1"
android:pathData="M403,192 L404,193 L403,192 Z" />
<path
android:fillColor="#00ffff"
android:strokeWidth="1"
android:pathData="M114,194 L115,195 L114,194 Z" />
<path
android:fillColor="#0000ff"
android:strokeWidth="1"
android:pathData="M394,196 L395,197 L394,196 M255,197 L256,198 L255,197 Z" />
<path
android:fillColor="#0000ff"
android:strokeWidth="1"
android:pathData="M388,199 L389,200 L388,199 M458,202 L459,203 L458,202 Z" />
<path
android:fillColor="#00ffff"
android:strokeWidth="1"
android:pathData="M266,207 L267,208 L266,207 Z" />
<path
android:fillColor="#337db5"
android:strokeWidth="1"
android:pathData="M196.667,226.333 C196.222,226.778,197.278,226.722,197.333,226.667 C197.778,226.222,196.722,226.278,196.667,226.333 Z" />
<path
android:fillColor="#3681ba"
android:strokeWidth="1"
android:pathData="M199.667,227.333 C199.222,227.778,200.278,227.722,200.333,227.667 C200.778,227.222,199.722,227.278,199.667,227.333 Z" />
<path
android:fillColor="#347fb7"
android:strokeWidth="1"
android:pathData="M203.667,228.333 C203.222,228.778,204.278,228.722,204.333,228.667 C204.778,228.222,203.722,228.278,203.667,228.333 Z" />
<path
android:fillColor="#3681ba"
android:strokeWidth="1"
android:pathData="M207.667,229.333 C207.222,229.778,208.278,229.722,208.333,229.667 C208.778,229.222,207.722,229.278,207.667,229.333 Z" />
<path
android:fillColor="#3d8bc6"
android:strokeWidth="1"
android:pathData="M211.667,230.333 C211.222,230.778,212.278,230.722,212.333,230.667 C212.778,230.222,211.722,230.278,211.667,230.333 Z" />
<path
android:fillColor="#347fb7"
android:strokeWidth="1"
android:pathData="M357.333,231.667 C357.278,231.722,357.222,232.778,357.667,232.333 C357.722,232.278,357.778,231.222,357.333,231.667 Z" />
<path
android:fillColor="#3884be"
android:strokeWidth="1"
android:pathData="M223,232 C225.052,232.874,226.747,232.953,229,233 C226.948,232.126,225.253,232.047,223,232 Z" />
<path
android:fillColor="#3f8fca"
android:strokeWidth="1"
android:pathData="M248,232 C249.769,232.779,251.036,232.912,253,233 C251.231,232.221,249.964,232.088,248,232 Z" />
<path
android:fillColor="#3c8ac4"
android:strokeWidth="1"
android:pathData="M355,239 L355,250 C356.431,246.59,356.431,242.41,355,239 Z" />
<path
android:fillColor="#0000ff"
android:strokeWidth="1"
android:pathData="M453,254 L454,255 L453,254 M451,256 L452,257 L451,256 Z" />
<path
android:fillColor="#226699"
android:strokeWidth="1"
android:pathData="M212,512 C209.618,509.823,206.969,507.93,205.457,504.985 C202.348,498.928,204,489.624,204,483 L204,445 C218.334,445,232.816,445.04,247,442.676 C291.725,435.222,335.978,412.683,372,385.625 C380.087,379.551,388.01,373.227,392.623,364 C401.873,345.501,396.569,318.191,376,309.93 C356.005,301.899,336.899,311.86,320,322 C296.827,335.905,273.592,350.636,248,359.691 C237.983,363.236,227.63,364.999,217,365 C213.707,365,209.237,365.745,206.148,364.397 C201.892,362.538,202.965,355.804,202.421,352 C201.069,342.564,200.937,329.775,194.387,322.213 C187.714,314.508,174.132,310.549,165,306.576 C143.629,297.278,122.072,288.172,101,278.219 C93.6039,274.726,86.2347,271.036,79,267.219 C76.4078,265.852,73.0867,263.04,70,263.252 C65.2519,263.579,61.1158,270.357,58.9298,274 C51.6269,286.172,50.8003,303.236,48.5895,317 C41.1082,363.577,40,410.929,40,458 L40,493 C40,497.669,39.0665,503.791,41.858,507.867 C44.846,512.229,50.3023,511.992,55,512 L85,512 L212,512 Z" />
<path
android:fillColor="#408ec9"
android:strokeWidth="1"
android:pathData="M418.667,269.333 C418.222,269.778,419.278,269.722,419.333,269.667 C419.778,269.222,418.722,269.278,418.667,269.333 Z" />
<path
android:fillColor="#0000ff"
android:strokeWidth="1"
android:pathData="M61,270 L62,271 L61,270 Z" />
<path
android:fillColor="#3580b9"
android:strokeWidth="1"
android:pathData="M376.667,270.333 C376.222,270.778,377.278,270.722,377.333,270.667 C377.778,270.222,376.722,270.278,376.667,270.333 Z" />
<path
android:fillColor="#3c8bc5"
android:strokeWidth="1"
android:pathData="M380,271 C381.248,271.685,381.548,271.749,383,272 C381.752,271.315,381.452,271.251,380,271 Z" />
<path
android:fillColor="#3d8cc6"
android:strokeWidth="1"
android:pathData="M386,272 C389.697,273.552,394.017,273,398,273 C394.302,271.448,389.983,272,386,272 Z" />
<path
android:fillColor="#00ffff"
android:strokeWidth="1"
android:pathData="M452,273 L453,274 L452,273 Z" />
<path
android:fillColor="#347fb7"
android:strokeWidth="1"
android:pathData="M352,307 C353.506,307.683,354.315,307.826,356,308 C354.494,307.317,353.685,307.174,352,307 Z" />
<path
android:fillColor="#3d8cc6"
android:strokeWidth="1"
android:pathData="M347.667,308.333 C347.222,308.778,348.278,308.722,348.333,308.667 C348.778,308.222,347.722,308.278,347.667,308.333 Z" />
<path
android:fillColor="#4292cd"
android:strokeWidth="1"
android:pathData="M371.667,308.333 C371.222,308.778,372.278,308.722,372.333,308.667 C372.778,308.222,371.722,308.278,371.667,308.333 Z" />
<path
android:fillColor="#337db5"
android:strokeWidth="1"
android:pathData="M199.333,333.667 C199.278,333.722,199.222,334.778,199.667,334.333 C199.722,334.278,199.778,333.222,199.333,333.667 Z" />
<path
android:fillColor="#317bb4"
android:strokeWidth="1"
android:pathData="M396,336 L396,340 C396.71,338.24,396.71,337.76,396,336 Z" />
<path
android:fillColor="#3884bd"
android:strokeWidth="1"
android:pathData="M200.333,337.667 C200.278,337.722,200.222,338.778,200.667,338.333 C200.722,338.278,200.778,337.222,200.333,337.667 Z" />
<path
android:fillColor="#2f79af"
android:strokeWidth="1"
android:pathData="M201,342 L201,346 C201.71,344.241,201.71,343.76,201,342 Z" />
<path
android:fillColor="#3d8cc6"
android:strokeWidth="1"
android:pathData="M202,348 L202,353 C202.83,350.969,202.83,350.031,202,348 Z" />
<path
android:fillColor="#0000ff"
android:strokeWidth="1"
android:pathData="M44,350 L45,351 L44,350 Z" />
<path
android:fillColor="#4596d3"
android:strokeWidth="1"
android:pathData="M203,358 L203,364 C203.951,361.715,203.951,360.285,203,358 Z" />
<path
android:fillColor="#347eb5"
android:strokeWidth="1"
android:pathData="M242.667,361.333 C242.222,361.778,243.278,361.722,243.333,361.667 C243.778,361.222,242.722,361.278,242.667,361.333 Z" />
<path
android:fillColor="#3e8dc9"
android:strokeWidth="1"
android:pathData="M237,362 C238.248,362.685,238.548,362.749,240,363 C238.752,362.315,238.452,362.251,237,362 Z" />
<path
android:fillColor="#3985be"
android:strokeWidth="1"
android:pathData="M222,364 C224.052,364.874,225.747,364.953,228,365 C225.948,364.126,224.253,364.047,222,364 Z" />
<path
android:fillColor="#4291ce"
android:strokeWidth="1"
android:pathData="M269.667,437.333 C269.222,437.778,270.278,437.722,270.333,437.667 C270.778,437.222,269.722,437.278,269.667,437.333 Z" />
<path
android:fillColor="#3d8cc6"
android:strokeWidth="1"
android:pathData="M257.667,440.333 C257.222,440.778,258.278,440.722,258.333,440.667 C258.778,440.222,257.722,440.278,257.667,440.333 Z" />
<path
android:fillColor="#347fb7"
android:strokeWidth="1"
android:pathData="M251,441 C252.248,441.685,252.548,441.749,254,442 C252.752,441.315,252.452,441.251,251,441 Z" />
<path
android:fillColor="#3c89c3"
android:strokeWidth="1"
android:pathData="M239,443 C240.248,443.685,240.548,443.749,242,444 C240.752,443.315,240.452,443.251,239,443 Z" />
<path
android:fillColor="#4393ce"
android:strokeWidth="1"
android:pathData="M228,444 C230.052,444.874,231.747,444.953,234,445 C231.948,444.126,230.253,444.047,228,444 Z" />
<path
android:fillColor="#2b72a8"
android:strokeWidth="1"
android:pathData="M204,445 L204,504 C205.769,499.785,205,494.536,205,490 L205,461 C205,455.92,205.981,449.72,204,445 Z" />
<path
android:fillColor="#4190cc"
android:strokeWidth="1"
android:pathData="M205,445 C209.974,447.087,216.638,446,222,446 C217.026,443.913,210.362,445,205,445 Z" />
<path
android:fillColor="#4798d6"
android:strokeWidth="1"
android:pathData="M212,511 C213.506,511.683,214.315,511.826,216,512 C214.494,511.317,213.685,511.174,212,511 Z" />
</vector>
File diff suppressed because it is too large Load Diff
+5 -5
View File
@@ -5,27 +5,27 @@
android:viewportHeight="600">
<path
android:pathData="m171.93,82.63 l405.17,-82.63 0,112.99 -405.17,82.63z"
android:fillColor="#712F8F"
android:fillColor="#EB3C27"
android:strokeColor="#00000000"
android:fillType="nonZero"/>
<path
android:pathData="M171.93,82.54l65.23,0l0,422.37l-65.23,0z"
android:fillColor="#712F8F"
android:fillColor="#EB3C27"
android:strokeColor="#00000000"
android:fillType="nonZero"/>
<path
android:pathData="m235.04,488.2c11.66,43.5 -25.91,91.36 -83.91,106.9 -58,15.54 -114.46,-7.12 -126.12,-50.62 -11.66,-43.5 25.91,-91.36 83.91,-106.9 58,-15.54 114.46,7.12 126.12,50.62z"
android:fillColor="#712F8F"
android:fillColor="#EB3C27"
android:strokeColor="#00000000"
android:fillType="nonZero"/>
<path
android:pathData="M511.87,13.54l65.23,0l0,422.37l-65.23,0z"
android:fillColor="#712F8F"
android:fillColor="#EB3C27"
android:strokeColor="#00000000"
android:fillType="nonZero"/>
<path
android:pathData="m574.98,419.21c11.66,43.5 -25.91,91.36 -83.91,106.9 -58,15.54 -114.46,-7.12 -126.12,-50.62 -11.66,-43.5 25.91,-91.36 83.91,-106.9 58,-15.54 114.46,7.12 126.12,50.62z"
android:fillColor="#712F8F"
android:fillColor="#EB3C27"
android:strokeColor="#00000000"
android:fillType="nonZero"/>
</vector>
File diff suppressed because one or more lines are too long
+7 -30
View File
@@ -1,32 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="512dp"
android:height="512dp"
android:viewportWidth="512"
android:viewportHeight="512">
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:autoMirrored="true" android:height="30dp" android:viewportHeight="512" android:viewportWidth="512" android:width="30dp">
<path android:fillColor="#feb804" android:pathData="M402.13,1.26C394.81,11.79 388.68,19.61 383.52,29.04 343.68,85.58 302.38,141.06 261.52,196.86c-6.72,6.21 -2.23,18.18 7.3,15.63 15.68,3.42 21.45,-10.42 21.45,-10.42 0,0 77.89,-124.01 115.84,-186.59 2.59,-5.52 4.24,-14.8 -3.99,-14.23z" android:strokeWidth="1.04238"/>
<path android:fillColor="#9c59ff" android:pathData="m130.42,270.87 l84.15,-1.04 23.28,8.34 -22.14,38.79 -109.77,188.45 3.59,0.32 279.74,-251.78 45.05,-42.48 -136.78,0.48 -35.28,-0.67L402.44,1.11c0,0 -223.08,181.66 -329.74,270.15l-1.05,0.84z" android:strokeWidth="1.04238"/>
<path android:fillColor="#feb804" android:pathData="m105.97,505.41c0.64,10.48 14.14,7.32 18.78,1.43 110.11,-98.52 227.42,-195.83 322.37,-283.08 2.86,-9.82 -3.79,-12.45 -12.85,-12.17 -78.5,71.81 -160.72,147.93 -240.44,218.41 -26.97,23.78 -53.64,47.9 -80.56,71.73 -2.16,1.7 -4.6,3.11 -7.3,3.68zM230.06,291.68c6.73,-10.68 15.61,-23.14 -0.04,-21.83 -52.45,-0 -100.96,0.79 -149.97,2.26 -7.99,-0.01 -8.92,-2.35 -12.91,9.06 -4.91,14.03 13.18,11.66 21.97,11.6 42.7,-0.17 85.45,0.63 128.07,-1.04 5,-0.01 7.71,-0.11 12.88,-0.04z" android:strokeWidth="1.04238"/>
<path
android:fillColor="#feb804"
android:strokeWidth="1"
android:pathData="M392,12 L391.976,13.6713 L391.619,15.1605 L390.801,17.0247 L390.249,18.0046 L388.992,20 L388.332,21 L386.333,24 L381,32 L376.975,38 L372.709,44 L363.421,57 L360.579,61 L357.72,65 L353.573,71 L348.424,78 L346.291,81 L343.421,85 L340.576,89 L335.424,96 L331.849,101 L327.424,107 L323.116,113 L317.151,121 L312.116,128 L306.884,135 L302.576,141 L299.626,145 L295.151,151 L290.849,157 L284.884,165 L279.849,172 L276.873,176 L271.627,183 L267.151,189 L262.849,195 C261.637,196.665,260.386,198.301,259.221,200 C258.36,201.254,257.561,202.579,257.005,204 L256.399,206 L256.233,207 L256.191,208.995 L256.333,209.981 L256.607,210.941 L257.603,212.682 L259.148,213.972 L261.019,214.682 L262.005,214.852 L263.001,214.941 L265,214.995 L267,215 L271,215 L274,214.995 L274.999,214.981 C275.991,214.925,276.988,214.923,277.96,214.682 L279.816,213.972 L280.674,213.397 L282.239,211.852 L282.957,210.941 L284.304,208.995 C285.178,207.689,285.982,206.337,286.808,205 L289.319,201 L291.797,197 L295.424,191 L298.576,186 L300.424,183 L303.576,178 L305.424,175 L307.319,172 L310.424,167 L313.576,162 L315.424,159 L318.576,154 L320.424,151 L323.576,146 L325.424,143 L328.576,138 L330.424,135 L333.576,130 L335.424,127 L338.576,122 L340.424,119 L343.576,114 L345.424,111 L348.576,106 L353.424,98 L355.95,94 L358.424,90 L361.576,85 L363.424,82 L366.576,77 L368.424,74 L370.319,71 L373.424,66 L376.576,61 L378.424,58 L381.576,53 L386.424,45 L389.576,40 L392.681,35 L394.576,32 L395.792,30 L396.946,28 L397.939,26 L398.336,25 L398.906,23 L399.087,22 L399.207,21 L399.259,20.0008 L399.145,18.0154 L398.697,16.1088 L398.333,15.2284 L397.858,14.4337 L397.276,13.7423 L396.595,13.179 L395.052,12.4344 L394.115,12.2261 L393.655,12.1181 L392,12 Z" />
<path
android:fillColor="#9C59FF"
android:strokeWidth="1"
android:pathData="M77,273 C78.6797,272.986,80.3507,272.994,82.0247,272.83 L86,272.285 L88,272.09 L90,272.015 L93,272 L97,272 L111,272 L116,271.999 L119,271.961 L121,271.83 L122,271.715 L125,271.285 L126,271.17 L128,271.039 L131,271.001 L136,271 L151,271 L156,271 L159,270.985 C160,270.961,161.004,270.939,162,270.83 L164,270.576 L166,270.285 C166.999,270.162,167.994,270.083,169,270.039 C170.331,269.981,171.668,270.001,173,270 L179,270 L197,270 L225,270 C226.334,270.003,227.666,269.998,228.999,270.059 L230.985,270.318 L231.956,270.603 L233.772,271.603 L234.566,272.318 L235.806,274.059 L236.462,276.005 L236.562,277.001 L236.512,278 C236.409,279.034,236.08,280.021,235.752,281 L234.981,283 L234.56,284 L233.627,285.996 L232.536,287.961 C231.982,288.919,231.32,289.813,230.681,290.715 L229.424,292.424 L227.576,295.09 C225.628,298.003,223.806,300.997,222,304 L217.8,311 L206.4,330 L187.8,361 L180.6,373 L177.603,378 L173.576,385 L171.799,388 L160.4,407 L137.6,445 L125.6,465 L121.4,472 L118.424,477 L116.719,480 L115.001,483 L113.309,486 L112.274,488 L111.353,489.995 L110.966,490.975 L110.391,492.84 L110.114,494.329 L110,496 L111.671,495.759 L113.16,495.296 L115.025,494.427 L117.002,493.196 L118,492.467 L120,490.819 L123,488.075 L125,486.285 L129,482.831 L133,479.086 L135,477.285 L139,473.834 L142,471.075 L144,469.285 L148,465.831 L153,461.169 L158,456.834 L162,453.166 L167,448.834 L171,445.166 L176,440.834 L180,437.166 L185,432.834 L188,430.075 L191,427.424 L194,424.834 L198,421.166 L203,416.831 L208,412.169 L213,407.834 L217,404.166 L219,402.424 L221,400.715 L223,398.925 L226,396.166 L231,391.834 L235,388.166 L240,383.831 L245,379.169 L250,374.834 L253,372.075 L255,370.285 L259,366.831 L264,362.169 L269,357.831 L274,353.169 L279,348.831 L284,344.169 L289,339.83 C291.39,337.669,293.61,335.331,296,333.17 L301,328.83 L307,323.17 L311,319.715 L313,317.91 C315.027,316.025,316.946,314.027,319,312.17 L324,307.83 C326.39,305.669,328.61,303.331,331,301.17 L336,296.83 C338.054,294.973,339.973,292.975,342,291.09 C342.981,290.178,343.985,289.298,345,288.424 L348,285.83 C350.054,283.973,351.973,281.975,354,280.09 C356.28,277.969,358.72,276.031,361,273.91 C363.028,272.025,364.946,270.027,367,268.17 L370,265.576 C371.015,264.702,372.019,263.822,373,262.91 C375.027,261.025,376.946,259.027,379,257.17 L384,252.83 C386.389,250.669,388.61,248.331,391,246.17 L394,243.576 C395.015,242.702,396.02,241.822,397,240.91 L402,236.09 C404.28,233.969,406.721,232.033,409,229.91 C411.371,227.703,413.597,225.345,416,223.17 L418.995,220.577 L420.941,218.855 L422.679,217.121 L423.914,215.667 L425,214 L341,214 L313,214 L304,214 L301,214.001 L298,214.039 L296,214.17 L295,214.285 L292,214.715 L291,214.83 L289,214.96 C287.668,215.012,286.331,214.986,285,214.925 C283.666,214.865,282.335,214.728,281,214.71 C278.996,214.683,277.002,214.901,275,214.965 L272,214.999 L268,215 C266.666,214.997,265.333,215.002,264,214.941 L262.005,214.682 L261.019,214.397 L259.148,213.397 L258.319,212.682 L257.043,210.941 L256.647,209.981 L256.362,207.999 L256.671,206 L257.443,204 L258.562,202 L259.914,200 L261.374,198 L262.849,196 L267.884,189 L271.627,184 L276.873,177 L279.116,174 L284.151,167 L289.37,160 L291.576,157 L295.151,152 L301.116,144 L306.884,136 L312.116,129 L317.151,122 L323.116,114 L327.424,108 L331.849,102 L335.424,97 L340.576,90 L342.709,87 L345.579,83 L348.424,79 L353.573,72 L357.025,67 L359.86,63 L368.421,51 L370.579,48 L373.421,44 L376.975,39 C378.796,36.3575,380.553,33.6703,382.333,31 L387.667,23 L389.651,20.0015 L390.891,18.0247 L391.908,16.1605 L392.544,14.6713 L393,13 L391.329,13.3272 L389.84,13.9391 L387.975,15.0178 C386.962,15.6948,385.984,16.4137,385,17.1312 L381,20.1296 L378,22.4244 L372,27.1998 L364,33.6003 L358,38.4244 L353,42.5756 L347,47.4244 L342,51.5756 L336,56.4244 L326,64.75 L319,70.4244 L314,74.5864 L304,82.9197 L263,117.08 L246,131.247 L237,138.75 L229,145.25 L225,148.586 L217,155.247 L213,158.576 L204,165.803 L196,172.389 L186,180.424 L175,189.576 L169,194.424 L166,196.92 L163,199.424 L158,203.728 C155.026,206.265,152.003,208.745,149,211.247 L134,223.753 L126,230.424 L121,234.728 L113,241.424 L108,245.728 L102,250.754 L99,253.272 L95,256.728 L88,262.586 L83.0046,266.752 C81.7535,267.812,80.4927,268.86,79.321,270.009 L78.517,270.93 L78.0864,271.37 L77,273 Z" />
<path
android:fillColor="#9C59FF"
android:strokeWidth="1"
android:pathData="M295.999,97.743 C294.923,98.1238,293.944,98.7126,293,99.3441 C291.958,100.041,290.976,100.834,290,101.62 C287.932,103.283,285.978,105.078,284,106.845 L282,108.576 L280,110.271 L276,113.729 L273,116.271 L269,119.729 L266,122.282 L262,125.845 L258,129.271 L253,133.579 L251,135.271 L247,138.729 L244,141.282 L239,145.718 L236,148.271 L232,151.729 L229,154.282 L224,158.718 L220,162.13 L217,164.729 L214,167.271 L210,170.729 L207,173.271 L203,176.729 L200,179.271 L196,182.728 L187,190.272 L182,194.576 L179,197.08 L172,202.92 L168,206.272 L164,209.729 L161,212.271 L158,214.87 L154,218.271 L150,221.729 L148,223.421 L143,227.729 L139,231.155 L136,233.845 L131,238.17 C129.971,239.086,128.985,240.052,128,241.015 L126.004,243.001 L124.044,245 L123.109,246 L122.228,247 L121.434,248 L120.179,250 L119.438,252 L119.244,253 L119.153,255 L119.244,256 L119.743,257.996 C120.694,260.486,122.651,262.604,125.015,263.821 C126.562,264.617,128.275,264.896,130,264.863 C131.705,264.829,133.393,264.442,135,263.892 C137.897,262.9,140.568,261.317,143,259.475 C144.736,258.16,146.347,256.685,148,255.271 C149.681,253.832,151.38,252.419,153,250.91 C155.384,248.69,157.616,246.31,160,244.09 C162.279,241.967,164.721,240.033,167,237.91 C168.365,236.639,169.68,235.316,171,233.999 L175,230 L186,219 L190,215.001 L193,212.039 L195,210.17 L200,205.83 L202,203.961 C203.697,202.338,205.34,200.659,207,199 L216,190 L219,187.001 L222,184.039 L224,182.17 L229,177.83 L231,175.961 L234,172.999 L237,170 L246,161 C247.66,159.341,249.303,157.662,251,156.039 L253,154.17 L258,149.83 L260,147.961 L263,144.999 L267,141 L278.999,129 C280.634,127.357,282.275,125.719,283.83,124 L287.285,120 C288.181,118.978,289.1,117.982,290.039,117 L295.985,111 C296.945,110.014,297.891,109.022,298.811,108 L300.427,106 L301.677,104.001 L302.123,103.005 L302.427,102.019 L302.549,100.148 L301.954,98.6042 L300.681,97.6188 L299.852,97.3619 L297.981,97.287 L295.999,97.743 Z" />
<path
android:fillColor="#feb804"
android:strokeWidth="1"
android:pathData="M110,496 L110.315,498.115 L110.604,499.052 L111.028,499.816 L112.318,501.262 L114.059,502.254 L115.019,502.551 L116.005,502.728 L118,502.742 L120,502.343 L122,501.547 L124,500.387 L126,498.956 C127.354,497.912,128.681,496.838,130,495.75 L133,493.247 L140,487.414 L150,479.08 L153,476.576 L159,471.424 L172,460.576 L177,456.272 L183,451.246 L186,448.728 L190,445.271 L194,441.87 L197,439.272 L205,432.576 L211,427.424 L219,420.728 L223,417.271 L226,414.729 L230,411.271 L233,408.729 L237,405.272 L246,397.728 L249,395.13 L253,391.729 L257,388.271 L260,385.729 L264,382.271 L267,379.729 L271,376.271 L274,373.729 L278,370.271 L281,367.729 L285,364.271 L288,361.729 L292,358.271 L296,354.87 L299,352.271 L302,349.729 L306,346.271 L309,343.729 L313,340.271 L316,337.729 L320,334.271 L323,331.729 L327,328.271 L330,325.718 L335,321.282 L338,318.729 L342,315.271 L345,312.718 L350,308.282 L353,305.729 L357,302.271 L360,299.718 L364,296.155 L368,292.718 L372,289.155 L376,285.729 L380,282.271 L384,278.834 L388,275.166 L392,271.718 L396,268.155 L400,264.715 L405,260.166 L410,255.831 L415,251.169 L420,246.83 C422.068,244.959,424.027,242.97,426,241 L428.999,238 C430.309,236.681,431.647,235.382,432.891,234 C433.746,233.051,434.581,232.077,435.272,231 L436.346,229 L436.732,228 L437.042,227 L437.438,225 L437.514,224 L437.497,223 L437.157,221.005 L436.424,219.055 L435.91,218.133 L435.297,217.279 L434.581,216.514 L432.892,215.318 L430.985,214.577 L429.996,214.363 L428,214.242 L427,214.358 L425,215.031 L423,216.303 L422,217.109 L420,218.85 L418,220.576 C416.649,221.729,415.3,222.879,414,224.09 L408,229.91 C407.02,230.823,406.015,231.702,405,232.576 L402,235.17 C399.946,237.027,398.027,239.025,396,240.91 C395.019,241.822,394.015,242.702,393,243.576 L390,246.17 C387.946,248.027,386.027,250.025,384,251.91 C381.72,254.031,379.28,255.969,377,258.09 C374.973,259.975,373.054,261.973,371,263.83 L368,266.424 C366.986,267.298,365.981,268.178,365,269.09 L360,273.91 C359.026,274.829,358.01,275.698,357,276.576 C355.659,277.74,354.292,278.87,353,280.09 C350.987,281.989,349.053,283.973,347,285.83 L344,288.424 C342.985,289.298,341.981,290.178,341,291.09 C338.973,292.975,337.054,294.973,335,296.83 L330,301.17 C327.61,303.331,325.389,305.669,323,307.83 L318,312.17 C315.61,314.331,313.39,316.669,311,318.83 L306,323.17 L300,328.83 L295,333.17 C292.61,335.331,290.39,337.669,288,339.83 L283,344.169 L278,348.831 L273,353.169 L268,357.831 L263,362.169 L258,366.831 L254,370.285 L252,372.075 L249,374.834 L244,379.169 L239,383.831 L234,388.166 L230,391.834 L225,396.166 L221,399.834 L216,404.166 L212,407.834 L207,412.169 L202,416.831 L197,421.166 L193,424.834 L188,429.166 L184,432.834 L180,436.285 L178,438.075 L175,440.834 L170,445.166 L166,448.834 L161,453.166 L158,455.925 L156,457.715 L152,461.169 L147,465.831 L142,470.166 L139,472.925 L137,474.715 L133,478.169 L128,482.831 L123,487.166 L119,490.819 L117.002,492.467 C115.807,493.413,114.503,494.192,113.16,494.904 L111.671,495.544 L110,496 M231,292 L231.857,290.329 L232.134,289.841 L233.645,286.975 C234.295,285.686,234.865,284.348,235.38,283 C235.994,281.393,236.605,279.729,236.746,278 L236.728,276.005 L236.551,275.019 L236.254,274.059 L235.82,273.148 L234.566,271.603 L233.772,271.028 C232.338,270.151,230.625,270.09,228.999,270.019 L226,270 L222,270 L196,270 L178,270 L172,270 C170.668,270.001,169.331,269.981,168,270.039 C166.994,270.083,165.999,270.162,165,270.285 L163,270.576 L161,270.83 C160.004,270.939,159,270.961,158,270.985 L155,271 L150,271 L135,271 L131,271 L128,271.015 L126,271.09 L124,271.285 L120,271.83 C118.005,272.02,116.001,271.997,114,272 L97,272 L92,272 C90.332,272.003,88.6661,271.999,87,272.09 C85.9928,272.144,84.9987,272.293,84,272.424 L82,272.715 L80,272.93 L78.0008,273.133 L77.0039,273.314 L75.0432,274.028 L73.2137,275.318 L72.3943,276.148 L71.6528,277.059 L70.4576,279.005 L69.6682,281 L69.4375,282 L69.3187,282.999 L69.4375,284.985 L70.0131,286.906 L70.4576,287.811 L71.0093,288.656 L71.6528,289.427 L72.3943,290.106 L74.1049,291.142 C75.6475,291.836,77.3388,291.917,79,291.981 L81,291.999 L84,292 L101,292 L125,292 L167,292 L183,292 L189,291.999 C190.333,291.996,191.669,292.002,193,291.91 C195.348,291.75,197.652,291.25,200,291.09 C201.663,290.976,203.334,291.003,205,291 L213,291 L220,291 C221.992,291.003,223.991,290.972,225.975,291.169 C227.666,291.337,229.332,291.69,231,292 Z" />
<path
android:fillColor="#9C59FF"
android:strokeWidth="1"
android:pathData="M265,273.668 C263.155,274.192,261.504,275.231,260.001,276.394 L258.015,278.105 C257.04,279.044,256.085,279.993,255.184,281.004 C254.329,281.965,253.527,282.967,252.76,284 C252.033,284.979,251.358,285.993,250.671,287 L248,291 L242.667,299 L239.344,304 L233.656,313 L229,320 L221,332 L217.003,338 L214.424,342 L211.308,347 L208,352 L204,358 L201.344,362 L199.424,365 L196.308,370 L193,375 L188.333,382 C187.011,383.988,185.692,385.976,184.424,388 L181.308,393 L176.692,400 L173.576,405 L170.452,410 L169.312,412 L168.785,413 L167.8,415 L166.981,417 L166.681,417.999 L166.441,419.981 L166.785,421.851 L167.746,423.381 L169.228,424.288 L171.044,424.418 L173,423.802 L173.986,423.253 L174.961,422.566 L176.826,420.891 L178.536,418.985 L180.87,416 L186.873,408 L198.873,392 L246.873,328 L263.373,306 L268.626,299 L270.844,296 L272.239,294 C273.273,292.417,274.214,290.781,274.867,289 C275.572,287.075,275.908,285.047,275.944,283 L275.887,281.004 L275.771,280.015 L275.258,278.105 L274.258,276.394 L273.566,275.653 L271.891,274.458 L270.956,274.013 L268.996,273.438 L267.999,273.319 L267,273.319 L265,273.668 Z" />
<path
android:fillColor="#ffd84b"
android:strokeWidth="1"
android:pathData="M276,279 L276,285 L276.582,283.918 L276.628,283.502 L276.806,282.738 L276.806,281.262 L276.628,280.498 L276.582,280.082 L276,279 Z" />
</vector>
@@ -3,8 +3,10 @@
<string name="point_to_the_qr_code">QR কোডের দিকে নির্দেশ করুন</string>
<string name="show_qr">QR দেখান</string>
<string name="profile_image">প্রোফাইল ছবি</string>
<string name="your_profile_image">প্রোফাইল ছবি</string>
<string name="scan_qr">QR স্ক্যান করুন</string>
<string name="show_anyway">যাহোক, দেখান</string>
<string name="post_was_hidden">এই পোস্টটি লুকানো ছিল কারণ এটি আপনার লুকানো ব্যবহারকারী বা শব্দ উল্লেখ করে</string>
<string name="post_was_flagged_as_inappropriate_by">পোস্টটি কারো দ্বারা অভিযুক্ত হয়েছে</string>
<string name="post_not_found">ইভেন্টটি লোড হচ্ছে অথবা আপনার রিলে তালিকায় এটি পাওয়া যাচ্ছে না</string>
<string name="channel_image">চ্যানেল ইমেজ</string>
@@ -15,6 +17,7 @@
<string name="spam">স্প্যাম</string>
<string name="impersonation">ছদ্মবেশ</string>
<string name="illegal_behavior">বেআইনী আচরণ</string>
<string name="other">অন্যান্য</string>
<string name="unknown">অচেনা</string>
<string name="relay_icon">রিলে আইকন</string>
<string name="unknown_author">অজ্ঞাত-পরিচয় লেখক</string>
@@ -36,10 +39,15 @@
<string name="login_with_a_private_key_to_be_able_to_send_zaps">কাউকে জ্যাপ পাঠাতে ব্যক্তিগত চাবি দিয়ে লগ ইন করুন</string>
<string name="login_with_a_private_key_to_be_able_to_follow">কাউকে অনুসরণ করতে ব্যক্তিগত চাবি দিয়ে লগইন করুন</string>
<string name="login_with_a_private_key_to_be_able_to_unfollow">কাউকে আনফলো করতে ব্যক্তিগত চাবি দিয়ে লগ ইন করুন</string>
<string name="login_with_a_private_key_to_be_able_to_hide_word">পোস্টগুলি বুস্ট করতে ব্যক্তিগত চাবি দিয়ে লগ ইন করুন</string>
<string name="login_with_a_private_key_to_be_able_to_show_word">পোস্টগুলি বুস্ট করতে ব্যক্তিগত চাবি দিয়ে লগ ইন করুন</string>
<string name="zaps">জ্যাপস</string>
<string name="view_count">পরিমাণ দেখুন</string>
<string name="boost">বুস্ট</string>
<string name="boosted">বুস্ট করা হয়েছে</string>
<string name="edited">সম্পাদিত</string>
<string name="edited_number">সম্পাদনা #%1$s</string>
<string name="original">মূল</string>
<string name="quote">উদ্ধৃতি দিন</string>
<string name="new_amount_in_sats">স্যাটে নতুন পরিমাণ যুক্ত হয়েছে</string>
<string name="add">যুক্ত করুন</string>
@@ -137,11 +145,19 @@
<string name="show_password">পাসওয়ার্ড দেখান</string>
<string name="hide_password">পাসওয়ার্ড লুকান</string>
<string name="invalid_key">অকেজো চাবি</string>
<string name="invalid_key_with_message">ভুল চাবি: %1$s</string>
<string name="i_accept_the">"আমি এটা মেনে নিচ্ছি "</string>
<string name="terms_of_use">ব্যবহারের শর্তাবলী</string>
<string name="acceptance_of_terms_is_required">প্রদত্ত শর্তাবলী কবুল করা আবশ্যক</string>
<string name="password_is_required">একটি পাসওয়ার্ড প্রয়োজন.</string>
<string name="key_is_required">চাবি প্রয়োজন</string>
<string name="name_is_required">নাম প্রদান আবশ্যক</string>
<string name="login">লগ ইন</string>
<string name="sign_up">সাইন আপ করুন</string>
<string name="create_account">অ্যাকাউন্ট খুলুন</string>
<string name="don_t_have_an_account">একটি Nostr অ্যাকাউন্ট নেই?</string>
<string name="already_have_an_account">ইতিমধ্যে একটি Nostr অ্যাকাউন্ট আছে?</string>
<string name="create_a_new_account">একটি নতুন অ্যাকাউন্ট তৈরি করুন</string>
<string name="generate_a_new_key">একটি নতুন চাবি তৈরি করুন</string>
<string name="loading_feed">পাতাটি লোড করা হচ্ছে</string>
<string name="error_loading_replies">"প্রতিউত্তরগুলি লোড করা যাচ্ছে না: "</string>
@@ -473,4 +489,13 @@
<string name="wallet_number">ওয়ালেট %1$s</string>
<string name="error_opening_external_signer">স্বাক্ষরের অ্যাপ খোলা যাচ্ছে না</string>
<string name="sign_request_rejected">স্বাক্ষরের অনুরোধ প্রত্যাখ্যান করা হয়েছে</string>
<string name="classifieds_title_placeholder">iPhone 13</string>
<string name="classifieds_condition">শর্ত</string>
<string name="classifieds_category">ক্যাটাগরি</string>
<string name="classifieds_price_placeholder">1000</string>
<string name="classifieds_condition_new">নতুন</string>
<string name="classifieds_condition_good">ভাল</string>
<string name="classifieds_condition_fair">ন্যায্য</string>
<string name="invalid_nip19_uri">ঠিকানা সঠিক নয়</string>
<string name="accessibility_scan_qr_code">QR কোড স্ক্যান করুন</string>
</resources>
@@ -3,8 +3,10 @@
<string name="point_to_the_qr_code">Point to the QR Code</string>
<string name="show_qr">Show QR</string>
<string name="profile_image">Profile Image</string>
<string name="your_profile_image">Your Profile Picture</string>
<string name="scan_qr">Scan QR</string>
<string name="show_anyway">Show Anyway</string>
<string name="post_was_hidden">This post was hidden because it mentions your hidden users or words</string>
<string name="post_was_flagged_as_inappropriate_by">Post was muted or reported by</string>
<string name="post_not_found">Event is loading or can\'t be found in your relay list</string>
<string name="channel_image">Channel Image</string>
@@ -12,4 +14,5 @@
<string name="could_not_decrypt_the_message">Could not decrypt the message</string>
<string name="group_picture">Group Picture</string>
<string name="explicit_content">Explicit Content</string>
<string name="spam">Spam</string>
</resources>
+11 -2
View File
@@ -49,7 +49,7 @@
<string name="boost">Boost</string>
<string name="boosted">boosté</string>
<string name="edited">modifié</string>
<string name="edited_number">éditer #%1$s</string>
<string name="edited_number">modification #%1$s</string>
<string name="original">original</string>
<string name="quote">Citation</string>
<string name="fork">Fork</string>
@@ -499,7 +499,7 @@
<string name="lightning_wallets_not_found">Erreur d\'analyse du message d\'erreur</string>
<string name="poll_zap_value_min_max_explainer">Les votes sont pondérés par le montant du zap. Vous pouvez définir un montant minimum pour éviter les spammeurs et un montant maximum pour éviter qu\'un grand nombre de zappeurs ne prenne le contrôle du sondage. Utilisez le même montant dans les deux champs pour vous assurer que chaque vote a la même valeur. Laissez le champ vide pour accepter n\'importe quel montant.</string>
<string name="error_dialog_zap_error">Impossible d\'envoyer un zap</string>
<string name="error_dialog_talk_to_user">Contacter l\'Utilisateur</string>
<string name="error_dialog_talk_to_user">Contacter l\'utilisateur</string>
<string name="error_dialog_button_ok">Ok</string>
<string name="relay_information_document_error_assemble_url">Impossible d\'atteindre %1$s: %2$s</string>
<string name="relay_information_document_error_reach_server">Impossible d\'atteindre %1$s: %2$s</string>
@@ -680,4 +680,13 @@
<string name="message_to_author">Récapitulatif des modifications</string>
<string name="message_to_author_placeholder">Corrections rapides ...</string>
<string name="accept_the_suggestion">Accepter la Suggestion</string>
<string name="accessibility_download_for_offline">Télécharger</string>
<string name="accessibility_lyrics_on">Paroles activées</string>
<string name="accessibility_lyrics_off">Paroles désactivées</string>
<string name="accessibility_turn_on_sealed_message">Message scellé désactivé. Cliquer pour activer le message scellé</string>
<string name="accessibility_turn_off_sealed_message">Message scellé activé. Cliquer pour désactiver le message scellé</string>
<string name="accessibility_send">Envoyer</string>
<string name="accessibility_play_username">Écouter le nom d\'utilisateur</string>
<string name="accessibility_scan_qr_code">Scanner le QR code</string>
<string name="accessibility_navigate_to_alby">Accéder au fournisseur de portefeuille tiers Alby</string>
</resources>
+17
View File
@@ -6,6 +6,7 @@
<string name="your_profile_image">Jouw profielfoto</string>
<string name="scan_qr">Scan QR</string>
<string name="show_anyway">Laat toch zien</string>
<string name="post_was_hidden">Dit bericht is verborgen omdat het je verborgen gebruikers of woorden noemt</string>
<string name="post_was_flagged_as_inappropriate_by">Bericht gemarkeerd als ongepast door</string>
<string name="post_not_found">Bericht niet gevonden</string>
<string name="channel_image">Kanaalafbeelding</string>
@@ -48,9 +49,11 @@
<string name="boost">Boost</string>
<string name="boosted">boosted</string>
<string name="edited">gewijzigd</string>
<string name="edited_number">bewerk #%1$s</string>
<string name="original">origineel</string>
<string name="quote">Citaat</string>
<string name="fork">Fork</string>
<string name="propose_an_edit">Stel een bewerking voor</string>
<string name="new_amount_in_sats">Nieuw bedrag in sats</string>
<string name="add">Toevoegen</string>
<string name="replying_to">"reageert op "</string>
@@ -664,6 +667,7 @@
<string name="thank_you">Bedankt!</string>
<string name="max_limit">Max. limiet</string>
<string name="restricted_writes">Beperkte schrijfrechten</string>
<string name="forked_from">Geforked van</string>
<string name="forked_tag">FORK</string>
<string name="git_repository">Git Repository: %1$s</string>
<string name="git_web_address">Web:</string>
@@ -672,4 +676,17 @@
<string name="ots_info_title">Bewijs van tijdstempel</string>
<string name="ots_info_description">Er is bewijs dat dit bericht enige tijd voor %1$sis getekend. Het bewijs is op dat tijdstip en op dat moment getypeerd in de Bitcoin-blockchain.</string>
<string name="edit_post">Bericht wijzigen</string>
<string name="proposal_to_edit">Voorstel om een bericht te verbeteren</string>
<string name="message_to_author">Samenvatting van wijzigingen</string>
<string name="message_to_author_placeholder">Snelle oplossingen...</string>
<string name="accept_the_suggestion">Accepteer de suggestie</string>
<string name="accessibility_download_for_offline">Downloaden</string>
<string name="accessibility_lyrics_on">Songteksten aan</string>
<string name="accessibility_lyrics_off">Songteksten uit</string>
<string name="accessibility_turn_on_sealed_message">Verzegeld bericht uit. Klik om Verzegeld bericht aan te zetten</string>
<string name="accessibility_turn_off_sealed_message">Verzegeld bericht aan. Klik om Verzegeld bericht uit te zetten</string>
<string name="accessibility_send">Verzenden</string>
<string name="accessibility_play_username">Speel gebruikersnaam af als audio</string>
<string name="accessibility_scan_qr_code">Scan de QR-code</string>
<string name="accessibility_navigate_to_alby">Navigeer naar de externe wallet provider Alby</string>
</resources>
+62 -1
View File
@@ -27,6 +27,7 @@
<string name="broadcast">เพยแพร่</string>
<string name="timestamp_it">ประทับเวลา</string>
<string name="timestamp_pending">กำลังรอยืนยันการประทับเวลา</string>
<string name="timestamp_pending_short">กำลังดำเนินการ</string>
<string name="request_deletion">ส่งคำขอให้ลบ</string>
<string name="block_report">บล๊อก / รายงาน</string>
<string name="block_hide_user"><![CDATA[บล๊อก & ซ่อนผู้ใช้นี้]]></string>
@@ -47,7 +48,12 @@
<string name="view_count">ยอดเข้าชม</string>
<string name="boost">แชร์</string>
<string name="boosted">แชร์</string>
<string name="edited">แก้ไขแล้ว</string>
<string name="edited_number">แก้ไข #%1$s</string>
<string name="original">ต้นฉบับ</string>
<string name="quote">โควท</string>
<string name="fork">สำเนาโน๊ต</string>
<string name="propose_an_edit">เสนอการแก้ไข</string>
<string name="new_amount_in_sats">ตั้งค่าจำนวนในหน่วย sat</string>
<string name="add">เพิ่ม</string>
<string name="replying_to">"ตอบกลับถึง "</string>
@@ -95,6 +101,8 @@
<string name="add_a_relay">เพิ่มรีเลย์</string>
<string name="display_name">ชื่อที่แสดง</string>
<string name="my_display_name">ชื่อที่แสดงของฉัน</string>
<string name="my_awesome_name">ปลาอานนท์ สุดหล่อ</string>
<string name="welcome">ยินดีต้อนรับนะอานนท์!</string>
<string name="username">ชื่อผู้ใช้</string>
<string name="my_username">ชื่อผู้ใช้ของฉัน</string>
<string name="about_me">เกี่ยวกับฉัน</string>
@@ -141,14 +149,24 @@
<string name="clear">เคลียร์</string>
<string name="app_logo">โลโก้</string>
<string name="nsec_npub_hex_private_key">nsec.. or npub..</string>
<string name="ncryptsec_password">รหัสสำหรับเปิดใช้ nsec</string>
<string name="show_password">แสดงรหัสผ่าน</string>
<string name="hide_password">ซ่อนรหัสผ่าน</string>
<string name="invalid_key">key ไม่ถูกต้อง</string>
<string name="invalid_key_with_message">รหัสลับไม่ถูกต้อง: %1$s</string>
<string name="i_accept_the">"ฉันยอมรับ "</string>
<string name="terms_of_use">เงื่อนไขการใช้งาน</string>
<string name="acceptance_of_terms_is_required">จําเป็นต้องยอมรับข้อกําหนด</string>
<string name="password_is_required">ต้องป้อนรหัสผ่าน</string>
<string name="key_is_required">ต้องใช้ key</string>
<string name="name_is_required">ต้องระบุชื่อ</string>
<string name="login">เข้าสู่ระบบ</string>
<string name="sign_up">ลงทะเบียน</string>
<string name="create_account">สร้างบัญชี</string>
<string name="how_should_we_call_you">ใช้ชื่อเล่นว่าอะไรดีเอ่ย?</string>
<string name="don_t_have_an_account">ยังไม่มีบัญชี Nostr หรือ?</string>
<string name="already_have_an_account">มีบัญชี Nostr อยู่แล้ว?</string>
<string name="create_a_new_account">สร้างบัญชีผู้ใช้ใหม่</string>
<string name="generate_a_new_key">สร้าง key ใหม่</string>
<string name="loading_feed">กำลังดาวน์โหลดฟีด</string>
<string name="loading_account">กำลังโหลดข้อมูลบัญชี</string>
@@ -190,8 +208,18 @@
<string name="mark_all_new_as_read">ทำเครื่องหมายว่าอ่านแล้วทั้งหมดสำหรับข้อความใหม่</string>
<string name="mark_all_as_read">ทพเครื่องหมายว่าอ่านแล้วทั้งหมด</string>
<string name="backup_keys">สำรองข้อมูลรหัสลับ</string>
<string name="account_backup_tips2_md" tools:ignore="Typos"> ## เคล็ดลับการสำรองข้อมูลและความปลอดภัยที่สำคัญ
\n\nบัญชีของคุณได้รับการรักษาความปลอดภัยด้วยคีย์ลับ คีย์เป็นรหัสชุดตัวอักษรยาวขึ้นต้นด้วย **nsec1** ใครก็ตามที่สามารถเข้าถึงรหัสชุดนี้ได้ จะสามารถโพสต์และเปลี่ยนแปลงข้อมูลประจำตัวของคุณได้
\n\n- **ห้าม** ใส่รหัสชุดนี้ในเว็บไซต์หรือซอฟต์แวร์ที่คุณไม่ไว้ใจ
\n- ทีมพัฒนา Amethyst **จะไม่มีวัน** ขอรหัสชุดนี้ของคุณ
\n- **ควร** สำรองข้อมูลรหัสชุดนี้ไว้เพื่อกู้คืนบัญชีของคุณ เราแนะนำให้ใช้โปรแกรมจัดการรหัสผ่าน</string>
<string name="account_backup_tips3_md" tools:ignore="Typos"> สำหรับการรักษาความปลอดภัยเพิ่มเติม คุณสามารถเข้ารหัสคีย์ของคุณด้วยรหัสผ่าน คีย์นี้ขึ้นต้นด้วย **ncryptsec1** และไม่สามารถใช้งานได้หากไม่มีรหัสผ่านของคุณ
\n\n**แต่** หากคุณสูญหายรหัสผ่าน คุณจะไม่สามารถกู้คืนคีย์ของคุณได้ </string>
<string name="failed_to_encrypt_key">การเข้ารหัสคีย์ส่วนตัวของคุณล้มเหลว</string>
<string name="secret_key_copied_to_clipboard">คัดลอก Secret key (nsec) ลงคลิปบอร์ด</string>
<string name="copy_my_secret_key">คัดลอก secret key ของฉัน</string>
<string name="encrypt_and_copy_my_secret_key">เข้ารหัสและคัดลอกคีย์ความปลอดภัยของฉัน</string>
<string name="biometric_authentication_failed"> เกิดข้อผิดพลาดในการตรวจสอบ</string>
<string name="biometric_authentication_failed_explainer">เกิดข้อผิดพลาดจากการยืนยันตนด้วยชีวภาพ</string>
<string name="biometric_authentication_failed_explainer_with_error">เกิดข้อผิดพลาดจากการยืนยันตนด้วยชีวภาพ: Error: %1$s</string>
@@ -443,6 +471,7 @@
<string name="new_feature_nip24_might_not_be_available_description">การเปิดใช้งานโหมดนี้ต้องใช้ Amethyst เพื่อส่งข้อความ NIP-24 (GiftWrapped, Sealed Direct และ Group Messages) NIP-24 เป็นของใหม่และไคลเอ็นต์ส่วนใหญ่ยังไม่ได้รองรับ ตรวจสอบให้แน่ใจว่าเครื่องรับใช้ไคลเอ็นต์ที่รองรับ</string>
<string name="new_feature_nip24_activate">เปิดใช้งาน</string>
<string name="messages_create_public_chat">สาธรณะ</string>
<string name="messages_create_public_private_chat_desription">สร้างกลุ่มสาธารณะ/ส่วนตัว</string>
<string name="messages_new_message">ส่วนตัว</string>
<string name="messages_new_message_to">ถึง</string>
<string name="messages_new_message_subject">ชื่อเรื่อง</string>
@@ -459,6 +488,7 @@
<string name="automatically_show_url_preview_description">แสดงจัวอย่าง URL</string>
<string name="load_image_description">ควรโหลดรูปภาพเมื่อใด</string>
<string name="copy_to_clipboard">คัดลอก</string>
<string name="copy_npub_to_clipboard">คัดลอก npub ไปยังคลิปบอร์ด</string>
<string name="copy_url_to_clipboard">คัดลอก URL ลงคลิปบอร์ด</string>
<string name="copy_the_note_id_to_the_clipboard">คัดลอก โน้ต ID ลงคลิปบอร์ดd</string>
<string name="created_at">สร้างโดย</string>
@@ -522,6 +552,7 @@
<string name="could_not_assemble_lnurl_from_lightning_address_check_the_user_s_setup">ไม่สามารถสร้าง LNUrl จากที่อยู่ Lightning ได้ \"%1$s\" โปรดตรวจสอบการตั้งค่า</string>
<string name="the_receiver_s_lightning_service_at_is_not_available_it_was_calculated_from_the_lightning_address_error_check_if_the_server_is_up_and_if_the_lightning_address_is_correct">บริการ Lightning ของ %1$s แลจะไม่พร้อมใช้งานจาก \"%2$s\". Error: %3$s. โปรดตรวจสอบผู้ให้บริการ หรือที่อยู่ Lightning ให้ถูกตต้อง</string>
<string name="could_not_resolve_check_if_you_are_connected_if_the_server_is_up_and_if_the_lightning_address_is_correct">เกิดข้อผิดพลาด %1$s. โปรดตรวจสอบเครือข่ายเน็ต และทบทวนว่า %2$s นั้นถูกต้อง</string>
<string name="could_not_resolve_check_if_you_are_connected_if_the_server_is_up_and_if_the_lightning_address_is_correct_exception">เกิดข้อผิดพลาด %1$s. โปรดตรวจสอบเครือข่ายเน็ต และทบทวนว่า %2$s นั้นถูกต้อง\n\nข้อผิดพลาด : %3$s</string>
<string name="could_not_fetch_invoice_from">ไม่สามารถสร้างบิลจาก %1$s</string>
<string name="error_parsing_json_from_lightning_address_check_the_user_s_lightning_setup">เกิดข้อผิดพลาดในการอ่าน JSON จากที่อยู่ Lightning โปรดตรวจสอบว่าที่อยู่นั้นถูกต้อง</string>
<string name="callback_url_not_found_in_the_user_s_lightning_address_server_configuration">ไม่พบ Callback URL จากที่อยู่ Lightning นี้ โปรดตรวจสอบการตั้งค่าระบบ Lightning ของท่าน</string>
@@ -530,7 +561,7 @@
<string name="unable_to_create_a_lightning_invoice_before_sending_the_zap_the_receiver_s_lightning_wallet_sent_the_following_error">ไม่สามารถสร้างบิลชำระในการส่ง zap ได้ โดยเกิดข้อผิดพลาด %1$s จากกระเป๋าของผู้รับ</string>
<string name="unable_to_create_a_lightning_invoice_before_sending_the_zap_element_pr_not_found_in_the_resulting_json">ไม่สามารถสร้างบิลชำระในการส่ง zap ได้ ไม่พบข้อมูล pr จากข้อมูลที่อยู่ผู้รับ</string>
<string name="read_only_user">ดูอย่างเดียว</string>
<string name="no_reactions_setup">ไม่มีรายการปฏิสัมพันธ์</string>
<string name="no_reactions_setup">ไม่มีรายการ reaction</string>
<string name="select_push_server">เลือกแอพ UnifiedPush</string>
<string name="push_server_title">การแจ้งเตือน</string>
<string name="push_server_explainer">จากแอพ UnifiedPush ที่ติดตั้ง</string>
@@ -584,4 +615,34 @@
<string name="server_did_not_provide_a_url_after_uploading">เซอเวอร์ไม่ตอบสนองหลังจากอัพโหลดแล้ว</string>
<string name="could_not_download_from_the_server">ไม่สามารถโหลดข้อมูลสื่อได้</string>
<string name="could_not_prepare_local_file_to_upload">ไม่สามารถเตรียมข้อมูลสำหรับอัพโหลด : %1$s</string>
<string name="login_with_qr_code">เข้าสู่ระบบด้วย qr code</string>
<string name="route">เส้นทาง</string>
<string name="route_home">หน้าแรก</string>
<string name="route_search">ค้นหา</string>
<string name="route_discover">สำรวจ</string>
<string name="route_messages">ข้อความ</string>
<string name="route_notifications">การแจ้งเตือน</string>
<string name="route_global">ทั่วโลก</string>
<string name="route_video">Shorts</string>
<string name="route_security_filters">ตัวกรองความปลอดภัย</string>
<string name="new_post">โพสต์ใหม่</string>
<string name="new_short">สร้าง Shorts: รูปภาพ/วิดีโอ</string>
<string name="new_community_note">สร้างโน๊ตสำหรับชุมชม</string>
<string name="open_all_reactions_to_this_post">แสดง Reactions ทั้งหมด</string>
<string name="close_all_reactions_to_this_post">ปิดการสดง Reactions</string>
<string name="reply_description">ตอบกลับ</string>
<string name="boost_or_quote_description">แชร์/โควท</string>
<string name="like_description">ไลค์</string>
<string name="zap_description">Zap</string>
<string name="profile_image_of_user">รูปโปร์ไฟล์ของ %1$s</string>
<string name="relay_info">รีเลย์ %1$s</string>
<string name="expand_relay_list">แสดงรายการรีเลย์</string>
<string name="note_options">ตัวเลือกเพิ่มเติม</string>
<string name="poll">โพลล์</string>
<string name="show_npub_as_a_qr_code">แสดง npub เป็น qr code</string>
<string name="thank_you">ขอบคุณ!</string>
<string name="edit_post">แก้ไขโพสต์</string>
<string name="accessibility_download_for_offline">ดาวน์โหลด</string>
<string name="accessibility_send">ส่ง</string>
<string name="accessibility_scan_qr_code">สแกนคิวอาร์โค้ด</string>
</resources>
+7
View File
@@ -505,6 +505,9 @@
<string name="connectivity_type_wifi_only">Wifi-only</string>
<string name="connectivity_type_never">Never</string>
<string name="ui_feature_set_type_complete">Complete</string>
<string name="ui_feature_set_type_simplified">Simplified</string>
<string name="system">System</string>
<string name="light">Light</string>
<string name="dark">Dark</string>
@@ -516,6 +519,10 @@
<string name="automatically_show_url_preview">URL Preview</string>
<string name="automatically_hide_nav_bars">Immersive Scrolling</string>
<string name="automatically_hide_nav_bars_description">Hide Nav Bars when Scrolling</string>
<string name="ui_style">UI Mode</string>
<string name="ui_style_description">Choose the post style</string>
<string name="load_image">Load Image</string>
<string name="spamming_users">Spammers</string>
+2
View File
@@ -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:
@@ -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 =
"<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 300 300\">" +
"<defs>" +
"<style>" +
".cls-bg{fill:#b2d7a6;}.cls-fill-1{fill:#4e5647;}.cls-fill-2{fill:#4e5647;}" +
".cls-11-2{fill:#fff;}.cls-11-2,.cls-11-6{fill-opacity:0.2;}.cls-11-3{fill:none;}" +
".cls-11-3,.cls-11-4{stroke:#000;stroke-miterlimit:10;}.cls-11-4{fill:#6d6e70;}" +
".cls-11-5{opacity:0.2;}.cls-34-2,.cls-34-3{fill:#fff;}.cls-34-2{fill-opacity:0.4;}" +
".cls-34-3,.cls-34-5{fill-opacity:0.2;}.cls-34-3,.cls-34-4{stroke:#000;stroke-miterlimit:10;}" +
".cls-34-4{fill:none;}.cls-29-2{fill:#fff;}.cls-29-2,.cls-29-4{fill-opacity:0.4;}" +
".cls-29-3{fill:none;}.cls-29-3,.cls-29-4{stroke:#000;stroke-linecap:round;stroke-linejoin:round;}" +
".cls-29-4{stroke-width:0.75px;}.cls-46-2{fill-opacity:0.4;}.cls-46-3{fill:none;}" +
".cls-46-3,.cls-46-4{stroke:#000;stroke-linecap:round;stroke-linejoin:round;}" +
".cls-46-4{fill:#461917;stroke-width:0.5px;}.cls-07-10,.cls-07-2,.cls-07-4,.cls-07-8,.cls-07-9{fill:none;}" +
".cls-07-10,.cls-07-2,.cls-07-3,.cls-07-4,.cls-07-5,.cls-07-6,.cls-07-8,.cls-07-9{stroke:#000;}" +
".cls-07-2,.cls-07-3,.cls-07-4,.cls-07-5,.cls-07-6,.cls-07-8{stroke-linecap:round;}" +
".cls-07-2,.cls-07-3,.cls-07-4,.cls-07-5,.cls-07-6,.cls-07-8,.cls-07-9{stroke-linejoin:round;}" +
".cls-07-3,.cls-07-5{fill:#fff;}.cls-07-3,.cls-07-5,.cls-07-6,.cls-07-7{fill-opacity:0.2;}" +
".cls-07-3,.cls-07-4{stroke-width:0.75px;}.cls-07-10,.cls-07-8,.cls-07-9{stroke-width:1.5px;}" +
".cls-07-10{stroke-miterlimit:10;}" +
"</style>" +
"</defs>" +
"<rect width=\"300\" height=\"300\" class=\"cls-bg\" /><g>" +
"<path class=\"cls-fill-1\" d=\"M160.5,246.5s-14-3-27,13-22,45-22,45h108s-20-35-25-40S176.5,247.5,160.5,246.5Z\"/>" +
"<path class=\"cls-11-2\" d=\"M121.5,303.5s5-24,10-33,3.28-8.07,7.64-8.53,15.13-1.22,23.75,2.66,8.18,3.25," +
"8.18,3.25l13.12-12.15s-12.68-9.66-26.18-9.44-23.5,12.22-26.5,15.22-14.17,23.45-19.09,40.22Z\"/>" +
"<path class=\"cls-11-3\" d=\"M145.5,261.5s28,1,38,17,13,26,13,26h-86s13.77-34.15,18.39-38.57S144.5,261.5,145.5,261.5Z\"/>" +
"<path class=\"cls-11-2\" d=\"M121.5,303.5s5-24,10-33,3.28-8.07,7.64-8.53c22.36-1.47," +
"31.93,5.9,31.93,5.9l13.12-12.15s-12.68-9.66-26.18-9.44-23.5,12.22-26.5,15.22-14.17," +
"23.45-19.09,40.22Z\"/>" +
"<path class=\"cls-11-3\" d=\"M160.5,246.5s-14-3-27,13-22,45-22,45h108s-20-35-25-40S176.5," +
"247.5,160.5,246.5Z\"/><path class=\"cls-11-4\" d=\"M149,192s1,62,2,64a11.16,11.16,0,0,0," +
"9.06,3.21c5.44-.71,6.44-2.71,6.94-5.21,0,0-2.5-48.5-2.5-62.5Z\"/>" +
"<path class=\"cls-11-5\" d=\"M159.5,191.5s3,36,3,40,1,27,1,27l3-1-2-66Z\"/>" +
"<path class=\"cls-11-3\" d=\"M164.5,203.5a8.76,8.76,0,0,1-6,2c-4,0-8,0-9-1\"/>" +
"<path class=\"cls-11-3\" d=\"M165.5,214.5a12.68,12.68,0,0,1-6,2c-3,0-7,.25-10-1.37\"/>" +
"<path class=\"cls-11-3\" d=\"M165.8,225.5a10.11,10.11,0,0,1-6.3,2c-4,0-7.65-.2-9.82-2.1\"/>" +
"<path class=\"cls-11-3\" d=\"M166,234.5s-.5,3-5.5,3a64.39,64.39,0,0,1-10.3-1\"/>" +
"<path class=\"cls-11-3\" d=\"M166.5,245.5s-1,3-6,3a21.51,21.51,0,0,1-10-2\"/>" +
"<path class=\"cls-11-6\" d=\"M195.58,301.91H218S203,275.78,198.73,270.14,186.5,256.5,184.5," +
"255.5l-13,12s8,4.69,10.48,8.84S192.66,293.32,195.58,301.91Z\"/>" +
"<path class=\"cls-11-4\" d=\"M193.5,272.5a6.85,6.85,0,0,0-2,8c2,5,8,6,8,6s7-6,15-2,9,7,9,15," +
"14,3,14,3l2-2s4-21-19-31C220.5,269.5,209.5,265.5,193.5,272.5Z\"/>" +
"<path class=\"cls-11-6\" d=\"M196.5,284.5a25.68,25.68,0,0,1,18-5c11,1,16,9,18,17s-4,10-4," +
"10l-5-7s.05-13.88-10-15.44-14,2.44-14,2.44S195.5,286.5,196.5,284.5Z\"/>" +
"<path class=\"cls-11-3\" d=\"M206,268.82a2.89,2.89,0,0,0-1.5,2.68c0,2,.1,8.87,7,11.94\"/>" +
"<path class=\"cls-11-3\" d=\"M229.44,274.89s-3.94-1.39-5.94,1.61-3.62,9.25-2.81,12.13\"/>" +
"<path class=\"cls-11-3\" d=\"M223.56,300.34c-.06.16.94-2.84,5.94-2.84a21.66,21.66," +
"0,0,1,10.09,2.37\"/>" +
"<path class=\"cls-11-4\" d=\"M127.07,268.36S108.5,263.5,98.5,279.5c0,0-5,9,1,20s7,4,7," +
"4l7-5.25s-6-7.75-2-13.75c0,0,2.75-4.25,8.88-3.12Z\"/>" +
"<path class=\"cls-11-3\" d=\"M119.5,281.5s2-7,1-10a5.45,5.45,0,0,0-3.56-3.62\"/>" +
"<path class=\"cls-11-3\" d=\"M111.5,284.5a14.54,14.54,0,0,0-8-5c-5-1-5.44.94-5.44.94\"/>" +
"<path class=\"cls-11-3\" d=\"M111,293.56a10.89,10.89,0,0,0-7.48.94c-4,2-4,5-4,5\"/>" +
"<path class=\"cls-11-6\" d=\"M123.53,274.89s-7-2.39-13,.61-9,7-9,12,5,12,7,14,4.83-3.86," +
"4.83-3.86-3.83-5.14-2.83-11.14c0,0,1-6,10-5Z\"/>" +
"<circle cx=\"145\" cy=\"266\" r=\"1.5\"/>" +
"<circle cx=\"160.5\" cy=\"268.5\" r=\"1.5\"/>" +
"<circle cx=\"173.5\" cy=\"274.5\" r=\"1.5\"/>" +
"<circle cx=\"182.5\" cy=\"285.5\" r=\"1.5\"/>" +
"<circle cx=\"188.5\" cy=\"296.5\" r=\"1.5\"/>" +
"<circle cx=\"133.5\" cy=\"266.5\" r=\"1.5\"/>" +
"</g><g>" +
"" +
"<path class=\"cls-fill-1\" d=\"M91.5,107.5s4,64,4,77,1,38,1,38,4,11,22,10c36.5.5,60-11," +
"66-16,0,0-3-106-3-116s4-20-36-22c0,0-35.59,1.45-44.8,8.73,0,0-10.2,2.27-9.2,7.27S91.5," +
"107.5,91.5,107.5Z\"/>" +
"<path class=\"cls-34-2\" d=\"M95.8,102s2.7,53.53,3.7,68.53,5,42,5," +
"45v14.71s-7-3.71-8-7.71-3.65-88.21-3.83-95.61S91.5,107.5,91.5,107.5v-13S91.1," +
"100.43,95.8,102Z\"/>" +
"<path class=\"cls-34-3\" d=\"M145.5,78.5s-53,5-54,16,23,14,37,13,52-7,53-16S156.5,77.5,145.5,78.5Z\"/>" +
"<path class=\"cls-34-4\" d=\"M91.5,107.5s4,64,4,77,1,38,1,38,3,9,22,10c32,2,60-11,66-16," +
"0,0-3-106-3-116s4-20-36-22c-16,.67-31.14,3.13-44.8,8.73-4.7,1.42-7.78,3.83-9.2,7.27Z\"/>" +
"<path class=\"cls-34-5\" d=\"M168.5,103.5s1,49,1,57,1,35,1,41-1,22.92-1," +
"22.92l15-7.92s-2.94-96.67-3-100.83,0-25.17,0-25.17c.34,3.51-3.36,6.57-11,9.17l-2,.72Z\"/>" +
"<circle cx=\"148\" cy=\"114\" r=\"1.5\"/><circle cx=\"130.5\" cy=\"116.5\" r=\"1.5\"/>" +
"<circle cx=\"114.5\" cy=\"117.5\" r=\"1.5\"/><circle cx=\"116.5\" cy=\"225.5\" r=\"1.5\"/>" +
"<circle cx=\"101.5\" cy=\"220.5\" r=\"1.5\"/><circle cx=\"132.5\" cy=\"225.5\" r=\"1.5\"/>" +
"<circle cx=\"150.5\" cy=\"221.5\" r=\"1.5\"/><circle cx=\"166.5\" cy=\"217.5\" r=\"1.5\"/>" +
"<circle cx=\"179.5\" cy=\"212.5\" r=\"1.5\"/><circle cx=\"99.5\" cy=\"112.5\" r=\"1.5\"/>" +
"<circle cx=\"164.5\" cy=\"109.5\" r=\"1.5\"/><circle cx=\"177.5\" cy=\"104.5\" r=\"1.5\"/>" +
"</g><path class=\"cls-fill-1\" d=\"M129.5,123.5s-30,3-31,15,8,13,15,14,20-2,26-3,25,1,27-13-17-14-17-14Z\"/>" +
"<path class=\"cls-29-2\" d=\"M116.92,125.8s-15.42,2.7-16.42,12.7,15.5,13,24.25,10.5A97.37,97.37," +
"0,0,1,150,145.44c6.5.06,16.78-3.69,16.64-11.31S157.5,122.5,149.5,122.5s-21.12,1.13-21.12,1.13Z\"/>" +
"<path class=\"cls-29-2\" d=\"M130.5,123.5l-8,25.5c1.6-.06,5.38-.65,9-1.2l7-24.8A47.26,47.26,0,0,1," +
"130.5,123.5Z\"/>" +
"<polygon class=\"cls-29-2\" points=\"120.77 124.91 113 150 118 150 125.41 124.06 120.77 124.91\"/>" +
"<path class=\"cls-29-3\" d=\"M129.5,123.5s-30,3-31,15,8,13,15,14,20-2,26-3,25,1,27-13-17-14-17-14Z\"/>" +
"<path class=\"cls-29-4\" d=\"M106.61,129.46s-6.11,3-6.11,9,5,13,20,11,23-4,28-4,17.29-2.5," +
"18.15-10.25c0,0,.3,10.92-14.42,13.09s-16.25,1.2-21,2.68-28.06,4.23-32.4-7.15C98.84,143.87," +
"95.71,134.43,106.61,129.46Z\"/><g><g>" +
"<path class=\"cls-fill-1\" d=\"M122,180s1,10,2,14,1.5,6.5,1.5,6.5,3,0,4-1-2-17-2-18v-2s-1.49,0-3,.11A12,12,0,0,0,122,180Z\"/>" +
"<path class=\"cls-fill-1\" d=\"M131,179s1,10,2,14,1.5,6.5,1.5,6.5,3,0,4-1-2-17-2-18v-2s-1.49,0-3,.11A12,12,0,0,0,131,179Z\"/>" +
"<path class=\"cls-fill-1\" d=\"M141,179s1,10,2,14,1.5,6.5,1.5,6.5,3,0,4-1-2-17-2-18v-2s-1.49,0-3,.11A12,12,0,0,0,141,179Z\"/>" +
"<path class=\"cls-fill-1\" d=\"M149,178s1,10,2,14,1.5,6.5,1.5,6.5,3,0,4-1-2-17-2-18v-2s-1.49,0-3,.11A12,12,0,0,0,149,178Z\"/>" +
"</g>" +
"<path class=\"cls-46-2\" d=\"M122,180s1,10,2,14,1.5,6.5,1.5,6.5,3,0,4-1-2-17-2-18v-2s-1.49,0-3,.11A12,12,0,0,0,122,180Z\"/>" +
"<path class=\"cls-46-3\" d=\"M122,180s1,10,2,14,1.5,6.5,1.5,6.5,3,0,4-1-2-17-2-18v-2s-1.49,0-3,.11A12,12,0,0,0,122,180Z\"/>" +
"<path class=\"cls-46-4\" d=\"M124.5,180.5s1,11,2,14a15.77,15.77,0,0,1,1,4s2.34-.11,2.17.44a31,31,0,0,0-.82-8.63,59,59,0,0,1-1.35-10.07v-.75h-3Z\"/>" +
"<line class=\"cls-46-4\" x1=\"125.85\" y1=\"200.49\" x2=\"127.5\" y2=\"198.5\"/>" +
"<path class=\"cls-46-2\" d=\"M131,179s1,10,2,14,1.5,6.5,1.5,6.5,3,0,4-1-2-17-2-18v-2s-1.49,0-3,.11A12,12,0,0,0,131,179Z\"/>" +
"<path class=\"cls-46-3\" d=\"M131,179s1,10,2,14,1.5,6.5,1.5,6.5,3,0,4-1-2-17-2-18v-2s-1.49,0-3,.11A12,12,0,0,0,131,179Z\"/>" +
"<path class=\"cls-46-4\" d=\"M133.5,179.5s1,11,2,14a15.77,15.77,0,0,1,1,4s2.34-.11,2.17.44a31,31,0,0,0-.82-8.63,59,59,0,0,1-1.35-10.07v-.75h-3Z\"/>" +
"<line class=\"cls-46-4\" x1=\"134.85\" y1=\"199.49\" x2=\"136.5\" y2=\"197.5\"/>" +
"<path class=\"cls-46-2\" d=\"M141,179s1,10,2,14,1.5,6.5,1.5,6.5,3,0,4-1-2-17-2-18v-2s-1.49,0-3,.11A12,12,0,0,0,141,179Z\"/>" +
"<path class=\"cls-46-3\" d=\"M141,179s1,10,2,14,1.5,6.5,1.5,6.5,3,0,4-1-2-17-2-18v-2s-1.49,0-3,.11A12,12,0,0,0,141,179Z\"/>" +
"<path class=\"cls-46-4\" d=\"M143.5,179.5s1,11,2,14a15.77,15.77,0,0,1,1,4s2.34-.11,2.17.44a31,31,0,0,0-.82-8.63,59,59,0,0,1-1.35-10.07v-.75h-3Z\"/>" +
"<line class=\"cls-46-4\" x1=\"144.85\" y1=\"199.49\" x2=\"146.5\" y2=\"197.5\"/>" +
"<path class=\"cls-46-2\" d=\"M149,178s1,10,2,14,1.5,6.5,1.5,6.5,3,0,4-1-2-17-2-18v-2s-1.49,0-3,.11A12,12,0,0,0,149,178Z\"/>" +
"<path class=\"cls-46-3\" d=\"M149,178s1,10,2,14,1.5,6.5,1.5,6.5,3,0,4-1-2-17-2-18v-2s-1.49,0-3,.11A12,12,0,0,0,149,178Z\"/>" +
"<path class=\"cls-46-4\" d=\"M151.5,178.5s1,11,2,14a15.77,15.77,0,0,1,1,4s2.34-.11,2.17.44a31,31,0,0,0-.82-8.63,59,59,0,0,1-1.35-10.07v-.75h-3Z\"/>" +
"<line class=\"cls-46-4\" x1=\"152.85\" y1=\"198.49\" x2=\"154.5\" y2=\"196.5\"/></g><g><g>" +
"<path class=\"cls-fill-1\" d=\"M128.5,86.5a3.49,3.49,0,0,0-1,2v3s3,3,9,3,12-4,12-4v-5s-1-1-6-1S131.5,84.5,128.5,86.5Z\"/>" +
"<path class=\"cls-fill-1\" d=\"M173.5,21.5l-35,17s-.57,2.41.22,3.71l.78,1.29,37-18S178.5,20.5,173.5,21.5Z\"/>" +
"<path class=\"cls-fill-1\" d=\"M96.5,58.5s-2,2-1,3,3,0,3,0l33.66-15.9a6.44,6.44,0,0,1-.66-3.1Z\"/>" +
"<path class=\"cls-fill-1\" d=\"M134.5,47.5l-1,37a4.33,4.33,0,0,0,4,2,7.65,7.65,0,0,0,5-2l-2-40S135.5,44.5,134.5,47.5Z\"/>" +
"<path class=\"cls-fill-1\" d=\"M136.5,38.5l-4,2a3.76,3.76,0,0,0-.81,1.55,5.34,5.34,0,0,0-.19,1.45c0," +
"2,2,4,3,4,0,0-.17-.54,1.42-1.77a8.26,8.26,0,0,1,4.32-1.22h.26s-2-2-2-3v-3Z\"/></g>" +
"<path class=\"cls-07-2\" d=\"M134.5,47.5l-1,37a4.33,4.33,0,0,0,4,2,7.65,7.65,0,0,0,5-2l-2-40S135.5,44.5,134.5,47.5Z\"/>" +
"<path class=\"cls-07-3\" d=\"M128.5,87.5s0,2,6,2,11-1,13-3c.48-.55.5-1.75-2.25-1.87-1,0-3.15,0-3.15,0a6.77," +
"6.77,0,0,1-4.1,1.8c-3.5.1-4.31-1.6-4.31-1.6S128.5,85.5,128.5,87.5Z\"/>" +
"<path class=\"cls-07-2\" d=\"M128.5,86.5a3.49,3.49,0,0,0-1,2v3s3,3,9,3,12-4,12-4v-5s-.8-1-5.8-1a7.15,7.15," +
"0,0,1-4.57,2c-1.63,0-4.17,0-4.63-1.72A10.71,10.71,0,0,0,128.5,86.5Z\"/>" +
"<path class=\"cls-07-4\" d=\"M128.5,86.5a3.49,3.49,0,0,0-1,2v3s3,3,9,3,12-4,12-4v-5c-.63-.65-1.9-1.15-6-1a6.16," +
"6.16,0,0,1-4.17,1.8c-3.83.2-4.41-1.46-4.41-1.46S129.5,85.5,128.5,86.5Z\"/>" +
"<path class=\"cls-07-2\" d=\"M136.5,38.5l-4,2a3.76,3.76,0,0,0-.81,1.55,5.34,5.34,0,0,0-.19,1.45c0,2," +
"2,4,3,4,0,0-.17-.54,1.42-1.77a8.26,8.26,0,0,1,4.32-1.22h.26s-2-2-2-3v-3Z\"/>" +
"<path class=\"cls-07-5\" d=\"M96.5,58.5s-2,2-1,3,3,0,3,0l33.8-15.6a7.45,7.45,0,0,1-.8-3.4Z\"/>" +
"<path class=\"cls-07-5\" d=\"M173.5,21.5l-35,17s-.57,2.41.22,3.71l.78,1.29,37-18C177.52,25.52,179.49,20.53,173.5,21.5Z\"/>" +
"<circle class=\"cls-07-6\" cx=\"175.5\" cy=\"23.5\" r=\"2\"/><path d=\"M137.5,5.5s-2,0,1,2,32,15,32,15l2-1-33-15Z\"/>" +
"<path d=\"M56.72,44a1.7,1.7,0,0,0,1.2,1.19L96.29,58.83l1.89-1.2L58.81,44.1S56.44,43,56.72,44Z\"/>" +
"<path d=\"M114.5,17.5s-2,0,1,2,32,15,32,15l2-1-33-15Z\"/>" +
"<path d=\"M102,26.53s-2,.12,1.12,1.94S133,40.2,133,40.2l1.91-.77-30.83-12Z\"/>" +
"<path d=\"M177.5,24.19,212,41c1,1,.39,1.37-2,1L176.5,25.5S177,25.38,177.5,24.19Z\"/>" +
"<path d=\"M154.91,35.41l35.6,14.34S192,51,188.58,50.88L154,36.79Z\"/>" +
"<polygon points=\"102.89 59.02 134.34 68.69 133.65 69.98 101 59.98 102.89 59.02\"/>" +
"<path d=\"M142,42.54l35.55,13c2.4.9.47,2.47-2,1.19L140.2,43.79Z\"/>" +
"<path class=\"cls-07-7\" d=\"M136,38.75a5.37,5.37,0,0,0-.5,2.75c0,2,2.22,3.37,2.22,3.37l1.8,40.84L144," +
"88.34v4l4.46-1.89v-5a35.36,35.36,0,0,0-6-1l-2-40a3.7,3.7,0,0,1-2-3v-3Z\"/>" +
"<path class=\"cls-07-8\" d=\"M119.5,47.5l-32-12s-3-1-4,1,0,3,2,4,27,10,27,10\"/>" +
"<line class=\"cls-07-8\" x1=\"116.05\" y1=\"49.09\" x2=\"83.95\" y2=\"37.51\"/>" +
"<line class=\"cls-07-9\" x1=\"125.5\" y1=\"49.2\" x2=\"134.36\" y2=\"52.57\"/>" +
"<line class=\"cls-07-10\" x1=\"117.9\" y1=\"52.66\" x2=\"134\" y2=\"59\"/>" +
"<line class=\"cls-07-10\" x1=\"121.42\" y1=\"50.93\" x2=\"134.27\" y2=\"55.83\"/>" +
"<path class=\"cls-07-10\" d=\"M141,54.57,158,62s4,2,3,4-5,1-6,1-13.65-5.5-13.65-5.5\"/>" +
"<line class=\"cls-07-9\" x1=\"141.18\" y1=\"58.12\" x2=\"160.5\" y2=\"66.5\"/>" +
"</g>" +
"</svg>"
@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)
}
}
@@ -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)
}
}
+12
View File
@@ -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
@@ -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<String, ImageVector>(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
}
}
@@ -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.encoders.Hex
import com.vitorpamplona.quartz.encoders.HexValidator
import java.security.MessageDigest
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")
MessageDigest.getInstance("SHA-256").digest(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()
@@ -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()
}
@@ -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)
}
@@ -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)
}
@@ -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()
}
@@ -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()
}
@@ -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()
}
@@ -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()
}
@@ -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)
}
@@ -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()
}
@@ -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()
}
@@ -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()
}
@@ -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)
}
@@ -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)
}
@@ -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()
}
@@ -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)
}
@@ -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()
}
@@ -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)
}
@@ -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)
}
@@ -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)
}
@@ -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()
}
@@ -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()
}
@@ -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()
}
@@ -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)
}
@@ -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()
}
@@ -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()
}
@@ -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()
}
@@ -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()
}
@@ -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)
}
@@ -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()
}
@@ -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()
}
@@ -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()
}
@@ -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()
}
@@ -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()
}

Some files were not shown because too many files have changed in this diff Show More