mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-04-08 21:03:06 +02:00
Merge pull request #16093 from zfox23/emoteTweaks
BUGZ-1346: Tons of changes to Emote/Emoji system
This commit is contained in:
commit
83ef260941
26 changed files with 180 additions and 87 deletions
|
@ -3562,6 +3562,9 @@ void Application::setupQmlSurface(QQmlContext* surfaceContext, bool setAdditiona
|
|||
surfaceContext->setContextProperty("WalletScriptingInterface", DependencyManager::get<WalletScriptingInterface>().data());
|
||||
surfaceContext->setContextProperty("ResourceRequestObserver", DependencyManager::get<ResourceRequestObserver>().data());
|
||||
surfaceContext->setContextProperty("PlatformInfo", PlatformInfoScriptingInterface::getInstance());
|
||||
// This `module` context property is blank for the QML scripting interface so that we don't get log errors when importing
|
||||
// certain JS files from both scripts (in the JS context) and QML (in the QML context).
|
||||
surfaceContext->setContextProperty("module", "");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -225,6 +225,7 @@ InteractiveWindow::InteractiveWindow(const QString& sourceUrl, const QVariantMap
|
|||
QObject::connect(_dockWidget.get(), SIGNAL(onResizeEvent()), this, SLOT(emitMainWindowResizeEvent()));
|
||||
|
||||
_dockWidget->setSource(QUrl(sourceUrl));
|
||||
_dockWidget->setObjectName("DockedWidget");
|
||||
mainWindow->addDockWidget(dockArea, _dockWidget.get());
|
||||
} else {
|
||||
auto offscreenUi = DependencyManager::get<OffscreenUi>();
|
||||
|
@ -283,6 +284,7 @@ InteractiveWindow::InteractiveWindow(const QString& sourceUrl, const QVariantMap
|
|||
if (!KNOWN_SCHEMES.contains(sourceURL.scheme(), Qt::CaseInsensitive)) {
|
||||
sourceURL = QUrl::fromLocalFile(sourceURL.toString()).toString();
|
||||
}
|
||||
object->setObjectName("InteractiveWindow");
|
||||
object->setProperty(SOURCE_PROPERTY, sourceURL);
|
||||
});
|
||||
}
|
||||
|
|
|
@ -8,10 +8,7 @@ var customEmojiList = [
|
|||
]
|
||||
}
|
||||
]
|
||||
try {
|
||||
if (module) {
|
||||
module.exports = customEmojiList;
|
||||
}
|
||||
} catch (e) {
|
||||
console.log("error exporting:\n", e);
|
||||
|
||||
if (module.exports) {
|
||||
module.exports = customEmojiList;
|
||||
}
|
|
@ -2987,8 +2987,7 @@ var emojiList = [
|
|||
"shortName": "unamused face",
|
||||
"keywords": [
|
||||
"face",
|
||||
"unamused",
|
||||
"unhappy"
|
||||
"unamused"
|
||||
],
|
||||
"mainCategory": "Smileys & Emotion",
|
||||
"subCategory": "face-neutral-skeptical",
|
||||
|
@ -38734,10 +38733,7 @@ var emojiList = [
|
|||
}
|
||||
}
|
||||
]
|
||||
try {
|
||||
if (module) {
|
||||
module.exports = emojiList;
|
||||
}
|
||||
} catch (e) {
|
||||
console.log("error exporting:\n", e);
|
||||
|
||||
if (module.exports) {
|
||||
module.exports = emojiList;
|
||||
}
|
|
@ -102,7 +102,6 @@ function startTimeoutDelete() {
|
|||
|
||||
|
||||
// The QML has a property called archEnd on the pie chart that controls how much pie is showing
|
||||
var COUNT_DOWN_INTERVAL_MS = 100;
|
||||
function beginCountDownTimer() {
|
||||
_this._avimojiQMLWindow.sendToQml({
|
||||
"source": "simplifiedEmoji.js",
|
||||
|
@ -128,9 +127,9 @@ function resetEmojis() {
|
|||
clearCountDownTimerHandler();
|
||||
if (currentEmoji) {
|
||||
Entities.deleteEntity(currentEmoji);
|
||||
currentEmoji = false;
|
||||
selectedEmojiFilename = null;
|
||||
}
|
||||
currentEmoji = false;
|
||||
selectedEmojiFilename = null;
|
||||
}
|
||||
|
||||
|
||||
|
@ -315,7 +314,7 @@ function playPopAnimation() {
|
|||
} else {
|
||||
// Start with the pop sound on the out
|
||||
currentPopScale = finalInPopScale ? finalInPopScale : MAX_POP_SCALE;
|
||||
playSound(emojiDestroySound);
|
||||
playSound(emojiDestroySound, DEFAULT_VOLUME, MyAvatar.position, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -360,11 +359,11 @@ function playPopAnimation() {
|
|||
Entities.editEntity(currentEmoji, {"dimensions": dimensions});
|
||||
}
|
||||
} else {
|
||||
// make sure there is a currentEmoji entity before trying to delete
|
||||
pruneOldAvimojis();
|
||||
if (currentEmoji) {
|
||||
Entities.deleteEntity(currentEmoji);
|
||||
currentEmoji = false;
|
||||
}
|
||||
currentEmoji = false;
|
||||
finalInPopScale = null;
|
||||
selectedEmojiFilename = null;
|
||||
clearCountDownTimerHandler();
|
||||
|
|
|
@ -31,6 +31,9 @@ Rectangle {
|
|||
// if this is true, then hovering doesn't allow showing other icons
|
||||
property bool isSelected: false
|
||||
|
||||
KeyNavigation.backtab: emojiSearchTextField
|
||||
KeyNavigation.tab: emojiSearchTextField
|
||||
|
||||
// Update the selected emoji image whenever the code property is changed.
|
||||
onCurrentCodeChanged: {
|
||||
mainEmojiImage.source = emojiBaseURL + currentCode;
|
||||
|
@ -209,6 +212,18 @@ Rectangle {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If this MouseArea is hit, the user is clicking on an area not handled
|
||||
// by any other MouseArea
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
onClicked: {
|
||||
// The grid will forward keypresses to the main Interface window
|
||||
grid.forceActiveFocus();
|
||||
// Necessary to get keyboard keyPress/keyRelease forwarding to work. See `Application::hasFocus()`;
|
||||
Window.setFocus();
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: emojiIndicatorContainer
|
||||
|
@ -302,6 +317,7 @@ Rectangle {
|
|||
MouseArea {
|
||||
hoverEnabled: enabled
|
||||
anchors.fill: parent
|
||||
propagateComposedEvents: false
|
||||
onEntered: {
|
||||
grid.currentIndex = index
|
||||
// don't allow a hover image change of the main emoji image
|
||||
|
@ -313,6 +329,10 @@ Rectangle {
|
|||
}
|
||||
onClicked: {
|
||||
root.selectEmoji(model.code.utf);
|
||||
// The grid will forward keypresses to the main Interface window
|
||||
grid.forceActiveFocus();
|
||||
// Necessary to get keyboard keyPress/keyRelease forwarding to work. See `Application::hasFocus()`;
|
||||
Window.setFocus();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -330,6 +350,10 @@ Rectangle {
|
|||
if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter) {
|
||||
root.selectEmoji(grid.model.get(grid.currentIndex).code.utf);
|
||||
}
|
||||
root.keyPressEvent(event.key, event.modifiers);
|
||||
}
|
||||
Keys.onReleased: {
|
||||
root.keyReleaseEvent(event.key, event.modifiers);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -429,6 +453,7 @@ Rectangle {
|
|||
id: attributionMouseArea
|
||||
hoverEnabled: enabled
|
||||
anchors.fill: parent
|
||||
propagateComposedEvents: false
|
||||
onClicked: {
|
||||
popupContainer.visible = true;
|
||||
}
|
||||
|
@ -458,8 +483,15 @@ Rectangle {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
signal sendToScript(var message);
|
||||
signal sendToScript(var message)
|
||||
signal keyPressEvent(int key, int modifiers)
|
||||
signal keyReleaseEvent(int key, int modifiers)
|
||||
Keys.onPressed: {
|
||||
root.keyPressEvent(event.key, event.modifiers);
|
||||
}
|
||||
Keys.onReleased: {
|
||||
root.keyReleaseEvent(event.key, event.modifiers);
|
||||
}
|
||||
|
||||
function fromScript(message) {
|
||||
if (message.source !== "simplifiedEmoji.js") {
|
||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -127,14 +127,51 @@ function getSounds() {
|
|||
}
|
||||
|
||||
|
||||
// Returns the first valid joint position from the list of supplied test joint positions.
|
||||
// If none are valid, returns MyAvatar.position.
|
||||
function getValidJointPosition(jointsToTest) {
|
||||
var currentJointIndex;
|
||||
|
||||
for (var i = 0; i < jointsToTest.length; i++) {
|
||||
currentJointIndex = MyAvatar.getJointIndex(jointsToTest[i]);
|
||||
|
||||
if (currentJointIndex > -1) {
|
||||
return MyAvatar.getJointPosition(jointsToTest[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return Vec3.sum(MyAvatar.position, Vec3.multiply(0.25, Quat.getForward(MyAvatar.orientation)));
|
||||
}
|
||||
|
||||
|
||||
// Returns the world position halfway between the user's hands
|
||||
var HALF = 0.5;
|
||||
function getClapPosition() {
|
||||
var validLeftJoints = ["LeftHandMiddle2", "LeftHand", "LeftArm"];
|
||||
var leftPosition = getValidJointPosition(validLeftJoints);
|
||||
|
||||
var validRightJoints = ["RightHandMiddle2", "RightHand", "RightArm"];;
|
||||
var rightPosition = getValidJointPosition(validRightJoints);
|
||||
|
||||
var centerPosition = Vec3.sum(leftPosition, rightPosition);
|
||||
centerPosition = Vec3.multiply(centerPosition, HALF);
|
||||
|
||||
return centerPosition;
|
||||
}
|
||||
|
||||
|
||||
var clapSoundInterval = false;
|
||||
var CLAP_SOUND_INTERVAL_MS = 260; // Must match the clap animation interval
|
||||
var CLAP_SOUND_INTERVAL_MS_FLOOR = 260;
|
||||
var CLAP_SOUND_INTERVAL_MS_CEIL = 320;
|
||||
function startClappingSounds() {
|
||||
maybeClearClapSoundInterval();
|
||||
|
||||
// Compute a random clap sound interval to avoid strange echos between many people clapping simultaneously
|
||||
var clapSoundIntervalMS = Math.floor(randomFloat(CLAP_SOUND_INTERVAL_MS_FLOOR, CLAP_SOUND_INTERVAL_MS_CEIL));
|
||||
|
||||
clapSoundInterval = Script.setInterval(function() {
|
||||
playSound(clapSounds[Math.floor(Math.random() * clapSounds.length)], MyAvatar.position, true);
|
||||
}, CLAP_SOUND_INTERVAL_MS);
|
||||
playSound(clapSounds[Math.floor(Math.random() * clapSounds.length)], getClapPosition(), true);
|
||||
}, clapSoundIntervalMS);
|
||||
}
|
||||
|
||||
|
||||
|
@ -151,10 +188,8 @@ function toggleReaction(reaction) {
|
|||
|
||||
if (reactionEnding) {
|
||||
endReactionWrapper(reaction);
|
||||
updateEmoteIndicatorIcon("images/emote_Icon.svg");
|
||||
} else {
|
||||
beginReactionWrapper(reaction);
|
||||
updateEmoteIndicatorIcon("images/" + reaction + "_Icon.svg");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -169,6 +204,8 @@ function beginReactionWrapper(reaction) {
|
|||
if (MyAvatar.beginReaction(reaction)) {
|
||||
reactionsBegun.push(reaction);
|
||||
}
|
||||
|
||||
updateEmoteIndicatorIcon("images/" + reaction + "_Icon.svg");
|
||||
|
||||
// Insert reaction-specific logic here:
|
||||
switch (reaction) {
|
||||
|
@ -235,10 +272,10 @@ function mouseMoveEvent(event) {
|
|||
Entities.editEntity(pointReticle, { position: reticlePosition });
|
||||
} else if (reticlePosition) {
|
||||
pointReticle = Entities.addEntity({
|
||||
type: "Sphere",
|
||||
type: "Box",
|
||||
name: "Point Reticle",
|
||||
position: reticlePosition,
|
||||
dimensions: { x: 0.1, y: 0.1, z: 0.1 },
|
||||
dimensions: { x: 0.075, y: 0.075, z: 0.075 },
|
||||
color: { red: 255, green: 0, blue: 0 },
|
||||
collisionless: true,
|
||||
ignorePickIntersection: true,
|
||||
|
@ -275,6 +312,8 @@ function endReactionWrapper(reaction) {
|
|||
reactionsBegun.splice(reactionsBegunIndex, 1);
|
||||
}
|
||||
}
|
||||
|
||||
updateEmoteIndicatorIcon("images/emote_Icon.svg");
|
||||
|
||||
// Insert reaction-specific logic here:
|
||||
switch (reaction) {
|
||||
|
@ -301,19 +340,35 @@ function onMessageFromEmoteAppBar(message) {
|
|||
}
|
||||
switch (message.method) {
|
||||
case "positive":
|
||||
if (!message.data.isPressingAndHolding) {
|
||||
return;
|
||||
}
|
||||
triggerReactionWrapper("positive");
|
||||
updateEmoteIndicatorIcon("images/" + message.method + "_Icon.svg");
|
||||
break;
|
||||
case "negative":
|
||||
if (!message.data.isPressingAndHolding) {
|
||||
return;
|
||||
}
|
||||
triggerReactionWrapper("negative");
|
||||
updateEmoteIndicatorIcon("images/" + message.method + "_Icon.svg");
|
||||
break;
|
||||
case "raiseHand":
|
||||
case "applaud":
|
||||
if (message.data.isPressingAndHolding) {
|
||||
beginReactionWrapper(message.method);
|
||||
} else {
|
||||
endReactionWrapper(message.method);
|
||||
}
|
||||
break;
|
||||
case "point":
|
||||
case "raiseHand":
|
||||
if (!message.data.isPressingAndHolding) {
|
||||
return;
|
||||
}
|
||||
toggleReaction(message.method);
|
||||
break;
|
||||
case "toggleEmojiApp":
|
||||
if (!message.data.isPressingAndHolding) {
|
||||
return;
|
||||
}
|
||||
toggleEmojiApp();
|
||||
break;
|
||||
default:
|
||||
|
@ -363,8 +418,8 @@ function onWindowMinimizedChanged(isMinimized) {
|
|||
// for the tooltips to match the actual keys.
|
||||
var POSITIVE_KEY = "z";
|
||||
var NEGATIVE_KEY = "x";
|
||||
var RAISE_HAND_KEY = "c";
|
||||
var APPLAUD_KEY = "v";
|
||||
var APPLAUD_KEY = "c";
|
||||
var RAISE_HAND_KEY = "v";
|
||||
var POINT_KEY = "b";
|
||||
var EMOTE_WINDOW = "f";
|
||||
function keyPressHandler(event) {
|
||||
|
@ -383,7 +438,7 @@ function keyPressHandler(event) {
|
|||
toggleReaction("applaud");
|
||||
} else if (event.text === POINT_KEY) {
|
||||
toggleReaction("point");
|
||||
} else if (event.text === EMOTE_WINDOW) {
|
||||
} else if (event.text === EMOTE_WINDOW && !(Settings.getValue("io.highfidelity.isEditing", false))) {
|
||||
toggleEmojiApp();
|
||||
}
|
||||
}
|
||||
|
@ -392,18 +447,10 @@ function keyPressHandler(event) {
|
|||
|
||||
function keyReleaseHandler(event) {
|
||||
if (!event.isAutoRepeat) {
|
||||
if (event.text === RAISE_HAND_KEY) {
|
||||
if (reactionsBegun.indexOf("raiseHand") > -1) {
|
||||
toggleReaction("raiseHand");
|
||||
}
|
||||
} else if (event.text === APPLAUD_KEY) {
|
||||
if (event.text === APPLAUD_KEY) {
|
||||
if (reactionsBegun.indexOf("applaud") > -1) {
|
||||
toggleReaction("applaud");
|
||||
}
|
||||
} else if (event.text === POINT_KEY) {
|
||||
if (reactionsBegun.indexOf("point") > -1) {
|
||||
toggleReaction("point");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -657,7 +704,6 @@ var EMOJI_APP_WINDOW_FLAGS = 0x00000001 | // Qt::Window
|
|||
0x00008000 | // Qt::WindowMaximizeButtonHint
|
||||
0x00004000; // Qt::WindowMinimizeButtonHint
|
||||
var emojiAppWindow = false;
|
||||
var POPOUT_SAFE_MARGIN_X = 30;
|
||||
var POPOUT_SAFE_MARGIN_Y = 30;
|
||||
var emojiAppWindowSignalsConnected = false;
|
||||
function toggleEmojiApp() {
|
||||
|
@ -678,7 +724,7 @@ function toggleEmojiApp() {
|
|||
y: EMOJI_APP_HEIGHT_PX
|
||||
},
|
||||
position: {
|
||||
x: Math.max(Window.x + POPOUT_SAFE_MARGIN_X, Window.x + Window.innerWidth / 2 - EMOJI_APP_WIDTH_PX / 2),
|
||||
x: Window.x + EMOTE_APP_BAR_LEFT_MARGIN,
|
||||
y: Math.max(Window.y + POPOUT_SAFE_MARGIN_Y, Window.y + Window.innerHeight / 2 - EMOJI_APP_HEIGHT_PX / 2)
|
||||
},
|
||||
overrideFlags: EMOJI_APP_WINDOW_FLAGS
|
||||
|
|
|
@ -171,10 +171,10 @@ Rectangle {
|
|||
id: buttonsModel
|
||||
ListElement { imageURL: "images/positive_Icon.svg"; hotkey: "Z"; method: "positive" }
|
||||
ListElement { imageURL: "images/negative_Icon.svg"; hotkey: "X"; method: "negative" }
|
||||
ListElement { imageURL: "images/raiseHand_Icon.svg"; hotkey: "C"; method: "raiseHand" }
|
||||
ListElement { imageURL: "images/applaud_Icon.svg"; hotkey: "V"; method: "applaud" }
|
||||
ListElement { imageURL: "images/applaud_Icon.svg"; hotkey: "C"; method: "applaud" }
|
||||
ListElement { imageURL: "images/raiseHand_Icon.svg"; hotkey: "V"; method: "raiseHand" }
|
||||
ListElement { imageURL: "images/point_Icon.svg"; hotkey: "B"; method: "point" }
|
||||
ListElement { imageURL: "images/emote_Icon.svg"; hotkey: "F"; method: "toggleEmojiApp" }
|
||||
ListElement { imageURL: "images/emoji_Icon.svg"; hotkey: "F"; method: "toggleEmojiApp" }
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
|
@ -211,7 +211,7 @@ Rectangle {
|
|||
opacity: 0.8
|
||||
radius: 4
|
||||
|
||||
HifiStylesUit.GraphikRegular {
|
||||
HifiStylesUit.GraphikSemiBold {
|
||||
id: toolTipText
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 2
|
||||
|
@ -222,7 +222,7 @@ Rectangle {
|
|||
verticalAlignment: TextInput.AlignBottom
|
||||
horizontalAlignment: TextInput.AlignLeft
|
||||
color: simplifiedUI.colors.text.white
|
||||
size: 22
|
||||
size: 20
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -230,17 +230,37 @@ Rectangle {
|
|||
id: emoteTrayMouseArea
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
onClicked: {
|
||||
Tablet.playSound(TabletEnums.ButtonClick);
|
||||
sendToScript({
|
||||
"source": "EmoteAppBar.qml",
|
||||
"method": model.method
|
||||
});
|
||||
}
|
||||
|
||||
onEntered: {
|
||||
Tablet.playSound(TabletEnums.ButtonHover);
|
||||
}
|
||||
|
||||
onPressed: {
|
||||
Tablet.playSound(TabletEnums.ButtonClick);
|
||||
sendToScript({
|
||||
"source": "EmoteAppBar.qml",
|
||||
"method": model.method,
|
||||
"data": { "isPressingAndHolding": true }
|
||||
});
|
||||
}
|
||||
|
||||
onReleased: {
|
||||
sendToScript({
|
||||
"source": "EmoteAppBar.qml",
|
||||
"method": model.method,
|
||||
"data": { "isPressingAndHolding": false }
|
||||
});
|
||||
}
|
||||
|
||||
onExited: {
|
||||
if (pressed) {
|
||||
sendToScript({
|
||||
"source": "EmoteAppBar.qml",
|
||||
"method": model.method,
|
||||
"data": { "isPressingAndHolding": false }
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.6, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 128 128" style="enable-background:new 0 0 128 128;" xml:space="preserve">
|
||||
<path d="M64,0C28.7,0,0,28.7,0,64s28.7,64,64,64s64-28.7,64-64S99.3,0,64,0z M64,124.1C30.8,124.1,3.9,97.2,3.9,64S30.8,3.9,64,3.9
|
||||
s60.1,26.9,60.1,60.1S97.2,124.1,64,124.1z M88.8,63.5c-3.8,0-7,3.2-7,7c0,9.5-7.6,5.7-17.8,5.7c-10.2,0-17.8,3.8-17.8-5.7
|
||||
c0-3.8-3.2-7-7-7s-7,3.2-7,7c0,17.8,14,32.4,31.7,32.4s31.7-14.6,31.7-32.4C95.7,66.7,92.6,63.5,88.8,63.5z M40.5,41.9
|
||||
c5.1,0,9.5-1.9,9.5,3.2c0,1.9,1.9,3.8,3.8,3.8c2.5,0,4.4-1.9,4.4-3.8c0-9.5-7.6-17.1-17.1-17.1S24,35.6,24,45.1
|
||||
c0,1.9,1.3,3.8,3.8,3.8c1.9,0,3.8-1.9,3.8-3.8C31.6,40,35.4,41.9,40.5,41.9z M86.9,28c-9.5,0-17.1,7.6-17.1,17.1
|
||||
c0,1.9,1.9,3.8,3.8,3.8s3.8-1.9,3.8-3.8c0-5.1,4.4-3.2,9.5-3.2c5.1,0,9.5-1.9,9.5,3.2c0,1.9,1.9,3.8,3.8,3.8c2.5,0,3.8-1.9,3.8-3.8
|
||||
C104,35.6,96.4,28,86.9,28z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 1.1 KiB |
|
@ -1,29 +1,15 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 94 128" style="enable-background:new 0 0 94 128;" xml:space="preserve">
|
||||
<path d="M47,74.3c25.3,0,45.9-16.6,45.9-37.2S72.3,0,47,0S1.1,16.6,1.1,37.2S21.6,74.3,47,74.3z M65.3,24.7c2.7,0,4.9,1.8,4.9,4
|
||||
s-2.2,4-4.9,4c-2.7,0-4.9-1.8-4.9-4S62.6,24.7,65.3,24.7z M36.4,43.5c2.6,2.6,6.5,4,10.6,4c4.1,0,8-1.5,10.6-4
|
||||
c0.9-0.9,2.6-1,3.7-0.3c1.1,0.7,1.3,2.1,0.3,3c-3.6,3.5-8.9,5.5-14.6,5.5c-5.7,0-11-2-14.6-5.5c-0.9-0.9-0.8-2.2,0.3-3
|
||||
C33.8,42.5,35.4,42.6,36.4,43.5z M28.6,24.7c2.7,0,4.9,1.8,4.9,4c0,2.2-2.2,4-4.9,4c-2.7,0-4.9-1.8-4.9-4
|
||||
C23.7,26.5,25.9,24.7,28.6,24.7z M47,101.1c21.2,0,39.4-10.9,46.8-26.4C83.2,87.1,66.2,95.1,47,95.1S10.7,87.1,0.2,74.7
|
||||
C7.6,90.2,25.7,101.1,47,101.1z M47,108.6c-19.2,0-36.3-8.1-46.8-20.4c7.4,15.5,25.5,26.4,46.8,26.4s39.4-10.9,46.8-26.4
|
||||
C83.2,100.5,66.2,108.6,47,108.6z M47,122c-19.2,0-36.3-8.1-46.8-20.4c1.8,3.9,4.4,7.4,7.4,10.6c0,0,0,0,0,0
|
||||
c0.4,0.4,0.7,0.7,1.1,1.1c0.1,0.1,0.1,0.1,0.2,0.2c1.1,1.1,2.3,2.1,3.5,3.1c0.1,0.1,0.1,0.1,0.2,0.2c0.4,0.3,0.7,0.6,1.1,0.8
|
||||
c0.2,0.1,0.3,0.2,0.5,0.3c0.4,0.3,0.7,0.5,1.1,0.8c0.1,0.1,0.3,0.2,0.5,0.3c0.7,0.4,1.4,0.9,2,1.3c0.2,0.1,0.4,0.2,0.6,0.4
|
||||
c0.3,0.2,0.7,0.4,1,0.6c0.3,0.1,0.5,0.3,0.8,0.4c0.3,0.2,0.7,0.3,1,0.5c0.3,0.2,0.6,0.3,1,0.5c0.3,0.2,0.7,0.3,1,0.5
|
||||
c0.5,0.2,1.1,0.5,1.6,0.7c0.3,0.1,0.6,0.2,0.9,0.3c0.4,0.1,0.8,0.3,1.2,0.4c0.3,0.1,0.6,0.2,0.9,0.3c0.4,0.1,0.9,0.3,1.3,0.4
|
||||
c0.2,0.1,0.5,0.2,0.7,0.2c0.7,0.2,1.3,0.4,2,0.6c0.2,0.1,0.4,0.1,0.6,0.2c0.5,0.1,1,0.2,1.5,0.4c0.3,0.1,0.5,0.1,0.8,0.2
|
||||
c0.5,0.1,1,0.2,1.5,0.3c0.2,0,0.5,0.1,0.7,0.1c0.7,0.1,1.5,0.2,2.2,0.3c0.1,0,0.3,0,0.4,0c0.6,0.1,1.3,0.1,1.9,0.2
|
||||
c0.2,0,0.5,0,0.7,0.1c0.6,0,1.1,0.1,1.7,0.1c0.2,0,0.5,0,0.7,0c0.8,0,1.6,0,2.3,0c0.8,0,1.6,0,2.3,0c0.2,0,0.5,0,0.7,0
|
||||
c0.6,0,1.1-0.1,1.7-0.1c0.2,0,0.5,0,0.7-0.1c0.6-0.1,1.3-0.1,1.9-0.2c0.1,0,0.3,0,0.4,0c0.7-0.1,1.5-0.2,2.2-0.3
|
||||
c0.2,0,0.5-0.1,0.7-0.1c0.5-0.1,1-0.2,1.5-0.3c0.3-0.1,0.5-0.1,0.8-0.2c0.5-0.1,1-0.2,1.5-0.4c0.2-0.1,0.4-0.1,0.6-0.2
|
||||
c0.7-0.2,1.3-0.4,2-0.6c0.2-0.1,0.5-0.2,0.7-0.2c0.4-0.1,0.9-0.3,1.3-0.4c0.3-0.1,0.6-0.2,0.9-0.3c0.4-0.1,0.8-0.3,1.2-0.4
|
||||
c0.3-0.1,0.6-0.2,0.9-0.3c0.6-0.2,1.1-0.5,1.6-0.7c0.3-0.2,0.7-0.3,1-0.5c0.3-0.2,0.6-0.3,1-0.5c0.3-0.2,0.7-0.3,1-0.5
|
||||
c0.3-0.1,0.5-0.3,0.8-0.4c0.3-0.2,0.7-0.4,1-0.6c0.2-0.1,0.4-0.2,0.6-0.4c0.7-0.4,1.4-0.8,2.1-1.3c0.1-0.1,0.3-0.2,0.4-0.3
|
||||
c0.4-0.2,0.7-0.5,1.1-0.8c0.2-0.1,0.3-0.2,0.5-0.3c0.4-0.3,0.7-0.5,1.1-0.8c0.1-0.1,0.1-0.1,0.2-0.2c1.2-1,2.4-2,3.5-3.1
|
||||
c0.1-0.1,0.1-0.1,0.2-0.2c0.4-0.4,0.7-0.7,1.1-1.1c0,0,0,0,0,0c3.1-3.2,5.6-6.8,7.4-10.6c0,0,0,0,0,0C83.2,113.9,66.2,122,47,122z
|
||||
M62,80c-0.3,0.1-0.7,0.2-1,0.2c-4.5,1-9.2,1.6-14,1.6c-4.8,0-9.5-0.5-14-1.5c-0.4-0.1-0.8-0.2-1.2-0.3c0,0-0.1,0-0.1,0
|
||||
c-11-2.6-20.8-7.9-28.1-15c-0.3,0.4-0.5,0.7-0.8,1.1c8.6,13,25.1,21.7,44.1,21.7s35.6-8.8,44.1-21.7c-0.2-0.4-0.5-0.7-0.8-1.1
|
||||
c-7.3,7.1-17,12.4-28,15C62.2,79.9,62.1,80,62,80z"/>
|
||||
</svg>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.6, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 93.7 127.8" style="enable-background:new 0 0 93.7 127.8;" xml:space="preserve">
|
||||
<path d="M91.9,97c-7.6,9.6-17.8,16.7-29.3,20.3h-0.1c-0.4,0.1-0.8,0.3-1.3,0.4c-4.6,1.3-9.5,2-14.4,2c-4.9,0-9.8-0.7-14.4-2
|
||||
c-0.4-0.1-0.8-0.3-1.3-0.4h-0.1C19.6,113.8,9.4,106.6,1.8,97c0,0-0.5-0.5-0.9,0.1C0.6,97.6,1,98.5,1,98.5
|
||||
C9.9,116,27,127.8,46.8,127.8l0,0c0,0,0.1,0,0.1,0c0,0,0.1,0,0.1,0l0,0c19.7-0.1,36.8-11.8,45.8-29.3c0,0,0.4-0.9,0.1-1.4
|
||||
C92.4,96.6,91.9,97,91.9,97z M91.9,78.8C84.3,88.4,74.1,95.5,62.6,99h-0.1c-0.4,0.1-0.8,0.3-1.3,0.4c-4.6,1.3-9.5,2-14.4,2
|
||||
c-4.9,0-9.8-0.7-14.4-2c-0.4-0.1-0.8-0.3-1.3-0.4h-0.1C19.6,95.5,9.4,88.4,1.8,78.8c0,0-0.5-0.5-0.9,0.1C0.6,79.3,1,80.2,1,80.2
|
||||
c8.9,17.5,26.1,29.2,45.8,29.3l0,0c0,0,0.1,0,0.1,0c0,0,0.1,0,0.1,0l0,0c19.7-0.1,36.8-11.8,45.8-29.3c0,0,0.4-0.9,0.1-1.4
|
||||
C92.4,78.3,91.9,78.8,91.9,78.8z M46.9,92.7c25.8,0,46.9-20.7,46.9-46.4S72.7,0,46.9,0S0,20.7,0,46.4S20.9,92.7,46.9,92.7z
|
||||
M65.5,30.8c2.8,0,5,2.2,5,5s-2.2,5-5,5c-2.8,0-5-2.2-5-5S62.8,30.8,65.5,30.8z M36,54.3c2.7,3.2,6.6,5,10.8,5s8.2-1.9,10.8-5
|
||||
c0.9-1.1,2.7-1.2,3.8-0.4c1.1,0.9,1.3,2.6,0.3,3.7c-3.7,4.4-9.1,6.9-14.9,6.9c-5.8,0-11.2-2.5-14.9-6.9c-0.9-1.1-0.8-2.7,0.3-3.7
|
||||
C33.4,53.1,35,53.2,36,54.3z M28.1,30.8c2.8,0,5,2.2,5,5s-2.2,5-5,5c-2.8,0-5-2.2-5-5S25.3,30.8,28.1,30.8z"/>
|
||||
</svg>
|
||||
|
|
Before Width: | Height: | Size: 3 KiB After Width: | Height: | Size: 1.5 KiB |
Loading…
Reference in a new issue