1 /* 2 * Copyright (c) 2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #include <texgine/dynamic_file_font_provider.h> 17 #include <texgine/system_font_provider.h> 18 #include <texgine/typography_builder.h> 19 20 #include "feature_test_framework.h" 21 #include "text_define.h" 22 23 using namespace OHOS::Rosen::TextEngine; 24 25 namespace { 26 #define FAMILY1 WOMAN SKIN1 ZWJ RED_HEART ZWJ MAN SKIN0 27 #define FAMILY2 PERSON SKIN4 ZWJ RED_HEART ZWJ MAN ZWJ PERSON SKIN2 28 #define ROLE1 PERSON SKIN3 ZWJ AIRPLANE 29 #define ROLE2 PERSON SKIN1 ZWJ LAPTOP 30 #define GENERED1 BOUNCING_BALL SKIN2 ZWJ WOMAN_SPORT_VARIANT EMOJI_VARIANT 31 #define GENERED2 LIFTING_WEIGHTS SKIN0 ZWJ MAN_SPORT_VARIANT EMOJI_VARIANT 32 #define HAIR1 MAN SKIN2 ZWJ HAIR_BALD 33 #define HAIR2 PERSON SKIN4 ZWJ HAIR_CURLY 34 #define OTHER1 RED_HEART ZWJ "\U0001F525" 35 #define OTHER2 F_FLAG EMOJI_VARIANT ZWJ TRANSGENDER EMOJI_VARIANT 36 37 struct Emoji { 38 TextStyle style = { .fontSize = 32 }; 39 std::string emoji; 40 std::string title; 41 } g_emojis[] = { 42 { 43 .emoji = WATCH, 44 .title = "watch", 45 }, 46 { 47 .emoji = FAST_FORWARD_BUTTON, 48 .title = "fast forward button", 49 }, 50 { 51 .emoji = ALART_CLOCK, 52 .title = "alart clock", 53 }, 54 { 55 .emoji = UMBRELLA, 56 .title = "umbrella", 57 }, 58 { 59 .emoji = RED_CIRCLE, 60 .title = "red circle", 61 }, 62 { 63 .emoji = BLACK_LARGE_SQUARE, 64 .title = "black large square", 65 }, 66 { 67 .emoji = CURLY_LOOP, 68 .title = "curly loop", 69 }, 70 { 71 .emoji = PLUS, 72 .title = "plus", 73 }, 74 { 75 .emoji = SNOWMAN, 76 .title = "snowman", 77 }, 78 { 79 .emoji = VOLTAGE, 80 .title = "voltage", 81 }, 82 { 83 .emoji = COPYRIGHT, 84 .title = "copyright", 85 }, 86 { 87 .emoji = REGISTERED, 88 .title = "registered", 89 }, 90 { 91 .emoji = DOUBLE_EXCLAMATION_MARK, 92 .title = "double exclamation mark", 93 }, 94 { 95 .emoji = EXCLAMATION_QUESTION_MARK, 96 .title = "exclamation question mark", 97 }, 98 { 99 .emoji = WAVY_DASH, 100 .title = "wavy dash", 101 }, 102 { 103 .emoji = LEFT_ARROW, 104 .title = "left arrow", 105 }, 106 { 107 .emoji = RED_HEART, 108 .title = "red heart", 109 }, 110 { 111 .emoji = PENCIL, 112 .title = "pencil", 113 }, 114 { 115 .emoji = AIRPLANE, 116 .title = "airplan", 117 }, 118 { 119 .emoji = ATOM, 120 .title = "atom", 121 }, 122 { 123 .emoji = RED_DRAGON, 124 .title = "red dragon", 125 }, 126 { 127 .emoji = JOKER, 128 .title = "joker", 129 }, 130 { 131 .emoji = CYCLONE, 132 .title = "cyclone", 133 }, 134 { 135 .emoji = NEW_MOON_FACE, 136 .title = "new moon face", 137 }, 138 { 139 .emoji = CAT, 140 .title = "cat", 141 }, 142 { 143 .emoji = DOG, 144 .title = "dog", 145 }, 146 { 147 .emoji = BOY, 148 .title = "boy", 149 }, 150 { 151 .emoji = POST_BOX, 152 .title = "postbox", 153 }, 154 { 155 .emoji = GRINNING_FACE, 156 .title = "grinning face", 157 }, 158 { 159 .emoji = ROCKET, 160 .title = "rocket", 161 }, 162 { 163 .emoji = CLOUD_WITH_RAIN, 164 .title = "cloud with rain", 165 }, 166 { 167 .emoji = TORNADO, 168 .title = "tornado", 169 }, 170 { 171 .emoji = FOG, 172 .title = "fog", 173 }, 174 { 175 .emoji = PERSON_GOLFING, 176 .title = "person golfing", 177 }, 178 { 179 .emoji = MOTOR_CYCLE, 180 .title = "motorcycle", 181 }, 182 { 183 .emoji = CANDLE, 184 .title = "candle", 185 }, 186 { 187 .emoji = SPIDER, 188 .title = "spider", 189 }, 190 { 191 .emoji = BED, 192 .title = "bed", 193 }, 194 { 195 .emoji = WORLD_MAP, 196 .title = "world map", 197 }, 198 { 199 .emoji = SPEAKING_HEAD, 200 .title = "speaking head", 201 }, 202 { 203 .emoji = SHARP, 204 .title = "sharp", 205 }, 206 { 207 .emoji = ASTERISK, 208 .title = "asterisk", 209 }, 210 { 211 .emoji = ZERO, 212 .title = "zero", 213 }, 214 { 215 .emoji = ONE, 216 .title = "one", 217 }, 218 { 219 .emoji = TWO, 220 .title = "two", 221 }, 222 { 223 .emoji = THREE, 224 .title = "three", 225 }, 226 { 227 .emoji = FOUR, 228 .title = "four", 229 }, 230 { 231 .emoji = FIVE, 232 .title = "five", 233 }, 234 { 235 .emoji = SIX, 236 .title = "six", 237 }, 238 { 239 .emoji = SEVEN, 240 .title = "seven" 241 }, 242 { 243 .emoji = CHINA, 244 .title = "China", 245 }, 246 { 247 .emoji = AUSTRALIA, 248 .title = "Australia", 249 }, 250 { 251 .emoji = CANADA, 252 .title = "Canada", 253 }, 254 { 255 .emoji = FRANCE, 256 .title = "France", 257 }, 258 { 259 .emoji = IRELAND, 260 .title = "Ireland", 261 }, 262 { 263 .emoji = INDIA, 264 .title = "India", 265 }, 266 { 267 .emoji = ICELAND, 268 .title = "Iceland", 269 }, 270 { 271 .emoji = ITALY, 272 .title = "Italy", 273 }, 274 { 275 .emoji = JAPAN, 276 .title = "Japan", 277 }, 278 { 279 .emoji = RUSSIA, 280 .title = "Russia", 281 }, 282 { 283 .emoji = BOY0, 284 .title = "boy ligth", 285 }, 286 { 287 .emoji = BOY1, 288 .title = "boy medium light", 289 }, 290 { 291 .emoji = BOY2, 292 .title = "boy medium skin", 293 }, 294 { 295 .emoji = BOY3, 296 .title = "boy medium dark", 297 }, 298 { 299 .emoji = BOY4, 300 .title = "boy dark", 301 }, 302 { 303 .emoji = GIRL0, 304 .title = "girl ligth", 305 }, 306 { 307 .emoji = GIRL1, 308 .title = "girl medium light", 309 }, 310 { 311 .emoji = GIRL2, 312 .title = "girl medium skin", 313 }, 314 { 315 .emoji = GIRL3, 316 .title = "girl medium dark", 317 }, 318 { 319 .emoji = GIRL4, 320 .title = "girl dark", 321 }, 322 { 323 .emoji = FAMILY1, 324 .title = "family 1", 325 }, 326 { 327 .emoji = FAMILY2, 328 .title = "family 2", 329 }, 330 { 331 .emoji = ROLE1, 332 .title = "role 1", 333 }, 334 { 335 .emoji = ROLE2, 336 .title = "role 2", 337 }, 338 { 339 .emoji = GENERED1, 340 .title = "genered 1", 341 }, 342 { 343 .emoji = GENERED2, 344 .title = "genered 2", 345 }, 346 { 347 .emoji = HAIR1, 348 .title = "hair 1", 349 }, 350 { 351 .emoji = HAIR2, 352 .title = "hair 2", 353 }, 354 { 355 .emoji = OTHER1, 356 .title = "other 1", 357 }, 358 { 359 .emoji = OTHER2, 360 .title = "other 2", 361 } 362 }; 363 364 class EmojiTest : public TestFeature { 365 public: EmojiTest()366 EmojiTest() : TestFeature("EmojiTest") 367 { 368 } 369 Layout()370 void Layout() 371 { 372 for (auto &emoji : g_emojis) { 373 TypographyStyle tystyle; 374 auto dfProvider = DynamicFileFontProvider::Create(); 375 dfProvider->LoadFont("Segoe UI Emoji", RESOURCE_PATH_PREFIX "seguiemj.ttf"); 376 auto fps = FontProviders::Create(); 377 fps->AppendFontProvider(dfProvider); 378 fps->AppendFontProvider(SystemFontProvider::GetInstance()); 379 auto builder = TypographyBuilder::Create(tystyle, std::move(fps)); 380 381 emoji.style.fontFamilies = {"Segoe UI Emoji"}; 382 builder->PushStyle(emoji.style); 383 builder->AppendSpan(emoji.emoji); 384 builder->PopStyle(); 385 386 auto typography = builder->Build(); 387 double widthLimit = 100; 388 typography->Layout(widthLimit); 389 typographies_.push_back({ .typography = typography, .comment = emoji.title }); 390 } 391 } 392 } g_test; 393 } // namespace 394