Skip to content

Commit 0bfc0ff

Browse files
committed
Fix aliases adding and Android set rendering.
1 parent ed1473b commit 0bfc0ff

File tree

3 files changed

+75
-37
lines changed

3 files changed

+75
-37
lines changed

codegen/emoji/data.cpp

Lines changed: 40 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ std::map<InputId, InputId> FlagAliases = {
123123
};
124124

125125
std::map<Id, std::vector<Id>> Aliases; // original -> list of aliased
126+
std::set<Id> AliasesAdded;
126127

127128
void AddAlias(const Id &original, const Id &aliased) {
128129
auto &aliases = Aliases[original];
@@ -211,14 +212,16 @@ void append(Id &id, uint32 code) {
211212
return {};
212213
}
213214
for (const auto color : Colors) {
214-
auto sameWithColor = BareIdFromInput(same);
215-
sameWithColor[1] = color;
216-
auto differentWithColor = BareIdFromInput(different);
217-
for (auto &entry : differentWithColor) {
215+
auto copy = same;
216+
copy[1] = color;
217+
auto sameWithColor = BareIdFromInput(copy);
218+
copy = different;
219+
for (auto &entry : copy) {
218220
if (entry == Colors[0] || entry == Colors[1]) {
219221
entry = color;
220222
}
221223
}
224+
auto differentWithColor = BareIdFromInput(copy);
222225
AddAlias(sameWithColor, differentWithColor);
223226
}
224227
} else {
@@ -238,14 +241,16 @@ void append(Id &id, uint32 code) {
238241
// original: 1
239242
// add an alias to 'same' in the form of 'original + color'
240243
for (const auto color : Colors) {
241-
auto originalWithColor = BareIdFromInput(original);
242-
originalWithColor.push_back(color);
243-
auto sameWithColor = BareIdFromInput(same);
244-
for (auto &entry : sameWithColor) {
244+
auto copy = original;
245+
copy.push_back(color);
246+
auto originalWithColor = BareIdFromInput(copy);
247+
copy = same;
248+
for (auto &entry : copy) {
245249
if (entry == ColorMask) {
246250
entry = color;
247251
}
248252
}
253+
auto sameWithColor = BareIdFromInput(copy);
249254
AddAlias(originalWithColor, sameWithColor);
250255
}
251256
}
@@ -301,6 +306,7 @@ void appendCategory(
301306
it = result.map.emplace(bareId, index).first;
302307
result.list.push_back(move(emoji));
303308
if (const auto a = Aliases.find(bareId); a != end(Aliases)) {
309+
AliasesAdded.emplace(bareId);
304310
for (const auto &alias : a->second) {
305311
const auto ok = result.map.emplace(alias, index).second;
306312
if (!ok) {
@@ -365,6 +371,7 @@ void appendCategory(
365371
} else if (const auto d = doubleVariatedIds.find(bareId); d != end(doubleVariatedIds)) {
366372
//result.list[it->second].doubleVariated = true;
367373

374+
const auto baseId = bareId;
368375
const auto &different = d->second;
369376
if (different.size() < 4
370377
|| different[1] != Colors[0]
@@ -377,18 +384,18 @@ void appendCategory(
377384
for (auto color2 : Colors) {
378385
auto colored = Emoji();
379386
//colored.colored = true;
380-
// We filled those as aliases were applicable.
381-
// if (color1 == color2) {
382-
// colored.id = baseId;
383-
// append(colored.id, color1);
384-
// } else {
385-
auto copy = different;
386-
copy[1] = color1;
387-
copy[copy.size() - 1] = color2;
388-
for (const auto code : copy) {
389-
append(colored.id, code);
387+
if (color1 == color2 && baseId.size() == 2) {
388+
colored.id = baseId;
389+
append(colored.id, color1);
390+
} else {
391+
auto copy = different;
392+
copy[1] = color1;
393+
copy[copy.size() - 1] = color2;
394+
for (const auto code : copy) {
395+
append(colored.id, code);
396+
}
390397
}
391-
auto bareColoredId = BareIdFromInput(copy);
398+
auto bareColoredId = colored.id.replace(QChar(kPostfix), QString());
392399
if (addOne(bareColoredId, move(colored)) == result.map.end()) {
393400
return;
394401
}
@@ -711,6 +718,20 @@ Data PrepareData(const QString &dataPath, const std::vector<QString> &oldDataPat
711718
if (result.list.empty()) {
712719
return Data();
713720
}
721+
if (AliasesAdded.size() != Aliases.size()) {
722+
for (const auto &[key, list] : Aliases) {
723+
if (AliasesAdded.find(key) == AliasesAdded.end()) {
724+
QStringList expanded;
725+
for (const auto ch : key) {
726+
expanded.push_back(QString::number(ch.unicode()));
727+
}
728+
common::logError(kErrorBadData, "input")
729+
<< "Bad data: Not added aliases list for: "
730+
<< expanded.join(QChar(',')).toStdString();
731+
}
732+
}
733+
return Data();
734+
}
714735

715736
fillReplaces(result);
716737
if (result.list.empty()) {

codegen/emoji/generator.cpp

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,17 @@ QRect computeSourceRect(const QImage &image) {
4646
auto top = 1, bottom = 1, left = 1, right = 1;
4747
auto rgbBits = reinterpret_cast<const QRgb*>(image.constBits());
4848
for (auto i = 0; i != size; ++i) {
49-
if (rgbBits[i] > 0
50-
|| rgbBits[(size - 1) * size + i] > 0
51-
|| rgbBits[i * size] > 0
52-
|| rgbBits[i * size + (size - 1)] > 0) {
53-
logDataError() << "Bad border.";
49+
if (rgbBits[i] > 0) {
50+
logDataError() << "Bad top border.";
51+
return QRect();
52+
} else if (rgbBits[(size - 1) * size + i] > 0) {
53+
logDataError() << "Bad bottom border.";
54+
return QRect();
55+
} else if (rgbBits[i * size] > 0) {
56+
logDataError() << "Bad left border.";
57+
return QRect();
58+
} else if (rgbBits[i * size + (size - 1)] > 0) {
59+
logDataError() << "Bad right border.";
5460
return QRect();
5561
}
5662
if (rgbBits[1 * size + i] > 0) {
@@ -186,15 +192,15 @@ constexpr auto kEmojiRowsInFile = 16;
186192
constexpr auto kEmojiQuality = 99;
187193
constexpr auto kEmojiSize = 72;
188194
constexpr auto kEmojiFontSize = 72;
189-
constexpr auto kEmojiDelta = 67 - 4;
195+
constexpr auto kEmojiShiftTop = 67 - 4;
190196
constexpr auto kScaleFromLarge = true;
191197
constexpr auto kLargeEmojiSize = 180;
192198
constexpr auto kLargeEmojiFontSizeMac = 180;
193-
constexpr auto kLargeEmojiDeltaMac = 167 - 9;
194-
constexpr auto kEmojiShiftMac = 0;
199+
constexpr auto kLargeEmojiShiftTopMac = 167 - 9;
200+
constexpr auto kEmojiShiftLeftMac = 0;
195201
constexpr auto kLargeEmojiFontSizeAndroid = 178;
196-
constexpr auto kLargeEmojiDeltaAndroid = 140;
197-
constexpr auto kEmojiShiftAndroid = -4;
202+
constexpr auto kLargeEmojiShiftTopAndroid = 140;
203+
constexpr auto kEmojiShiftLeftAndroid = -4;
198204

199205
enum class ImageType {
200206
Mac,
@@ -220,15 +226,23 @@ bool PaintSingleFromFont(QPainter &p, QRect targetRect, const Emoji &data, QFont
220226
QPainter q(&singleImage);
221227
q.setPen(QColor(0, 0, 0, 255));
222228
q.setFont(font);
223-
const auto delta = !kScaleFromLarge
224-
? kEmojiDelta
229+
const auto shiftTop = !kScaleFromLarge
230+
? kEmojiShiftTop
225231
: (type == ImageType::Mac)
226-
? kLargeEmojiDeltaMac
227-
: kLargeEmojiDeltaAndroid;
228-
const auto shift = (type == ImageType::Mac)
229-
? kEmojiShiftMac
230-
: kEmojiShiftAndroid;
231-
q.drawText(2 + shift, 2 + delta, data.id);
232+
? kLargeEmojiShiftTopMac
233+
: kLargeEmojiShiftTopAndroid;
234+
const auto shiftLeft = (type == ImageType::Mac)
235+
? kEmojiShiftLeftMac
236+
: kEmojiShiftLeftAndroid;
237+
auto text = data.id;
238+
if (type == ImageType::Android) {
239+
if (text.size() > 2 && text.indexOf(QChar(0xFE0F)) >= 0) {
240+
// Some emoji, like "Kiss: Person, Person, Light Skin Tone, Medium Skin Tone",
241+
// aren't rendered correctly if string still contains 0xFE0F-s from Apple.
242+
text = text.replace(QChar(0xFE0F), QString());
243+
}
244+
}
245+
q.drawText(2 + shiftLeft, 2 + shiftTop, text);
232246
}
233247
auto sourceRect = computeSourceRect(singleImage);
234248
if (sourceRect.isEmpty()) {

codegen/emoji/replaces.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,9 @@ Replaces PrepareReplaces(const QString &filename) {
294294
}
295295

296296
bool CheckAndConvertReplaces(Replaces &replaces, const Data &data) {
297+
if (data.map.empty()) {
298+
return false;
299+
}
297300
auto result = Replaces(replaces.filename);
298301
auto sorted = QMultiMap<Id, Replace>();
299302
auto findId = [&](const Id &id) {

0 commit comments

Comments
 (0)