Merge pull request #16093 from zfox23/emoteTweaks

BUGZ-1346: Tons of changes to Emote/Emoji system
This commit is contained in:
Zach Fox 2019-08-26 10:15:03 -07:00 committed by GitHub
commit 83ef260941
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
26 changed files with 180 additions and 87 deletions

View file

@ -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", "");
}
}

View file

@ -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);
});
}

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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();

View file

@ -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") {

View file

@ -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

View file

@ -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 }
});
}
}
}
}
}

View file

@ -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

View file

@ -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