1b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien/*
2b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien * Copyright (C) 2014 The Android Open Source Project
3b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien *
4b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien * Licensed under the Apache License, Version 2.0 (the "License");
5b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien * you may not use this file except in compliance with the License.
6b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien * You may obtain a copy of the License at
7b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien *
8b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien *      http://www.apache.org/licenses/LICENSE-2.0
9b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien *
10b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien * Unless required by applicable law or agreed to in writing, software
11b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien * distributed under the License is distributed on an "AS IS" BASIS,
12b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien * See the License for the specific language governing permissions and
14b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien * limitations under the License.
15b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien */
16b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien
17b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien// Definitions internal to Minikin
18b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien
19b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien#include "MinikinInternal.h"
20aaa4e3470270496e6eb80704eadecb2cb7c56bf0Raph Levien#include "HbFontCache.h"
2177f488345316fba46c271fc04bea470819ae1712Seigo Nonaka#include "generated/UnicodeData.h"
22b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien
23fb0d396929e534a3686469b474d4f670864aa5acSeigo Nonaka#include <cutils/log.h>
24fb0d396929e534a3686469b474d4f670864aa5acSeigo Nonaka
25b80c1f19c58b927820a8a24bf2218e5645724608Raph Leviennamespace android {
26b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien
27b80c1f19c58b927820a8a24bf2218e5645724608Raph LevienMutex gMinikinLock;
28b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien
29fb0d396929e534a3686469b474d4f670864aa5acSeigo Nonakavoid assertMinikinLocked() {
30a6f5c46836090d1197e453c15c7f04c3c796a7abSeigo Nonaka#ifdef ENABLE_RACE_DETECTION
31a6f5c46836090d1197e453c15c7f04c3c796a7abSeigo Nonaka    LOG_ALWAYS_FATAL_IF(gMinikinLock.tryLock() == 0);
32a6f5c46836090d1197e453c15c7f04c3c796a7abSeigo Nonaka#endif
33fb0d396929e534a3686469b474d4f670864aa5acSeigo Nonaka}
34fb0d396929e534a3686469b474d4f670864aa5acSeigo Nonaka
3577f488345316fba46c271fc04bea470819ae1712Seigo Nonakabool isEmoji(uint32_t c) {
3677f488345316fba46c271fc04bea470819ae1712Seigo Nonaka    const size_t length = sizeof(generated::EMOJI_LIST) / sizeof(generated::EMOJI_LIST[0]);
3777f488345316fba46c271fc04bea470819ae1712Seigo Nonaka    return std::binary_search(generated::EMOJI_LIST, generated::EMOJI_LIST + length, c);
3877f488345316fba46c271fc04bea470819ae1712Seigo Nonaka}
3977f488345316fba46c271fc04bea470819ae1712Seigo Nonaka
400036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka// Based on Modifiers from http://www.unicode.org/L2/L2016/16011-data-file.txt
410036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonakabool isEmojiModifier(uint32_t c) {
420036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka    return (0x1F3FB <= c && c <= 0x1F3FF);
430036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka}
440036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka
450036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka// Based on Emoji_Modifier_Base from
460036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka// http://www.unicode.org/Public/emoji/3.0/emoji-data.txt
470036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonakabool isEmojiBase(uint32_t c) {
480036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka    if (0x261D <= c && c <= 0x270D) {
490036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka        return (c == 0x261D || c == 0x26F9 || (0x270A <= c && c <= 0x270D));
500036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka    } else if (0x1F385 <= c && c <= 0x1F93E) {
510036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka        return (c == 0x1F385
521934c2c3cb2c93aa12f852f95915190f8ac81facRaph Levien                || (0x1F3C3 <= c && c <= 0x1F3C4)
531934c2c3cb2c93aa12f852f95915190f8ac81facRaph Levien                || (0x1F3CA <= c && c <= 0x1F3CB)
541934c2c3cb2c93aa12f852f95915190f8ac81facRaph Levien                || (0x1F442 <= c && c <= 0x1F443)
551934c2c3cb2c93aa12f852f95915190f8ac81facRaph Levien                || (0x1F446 <= c && c <= 0x1F450)
561934c2c3cb2c93aa12f852f95915190f8ac81facRaph Levien                || (0x1F466 <= c && c <= 0x1F469)
570036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka                || c == 0x1F46E
581934c2c3cb2c93aa12f852f95915190f8ac81facRaph Levien                || (0x1F470 <= c && c <= 0x1F478)
590036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka                || c == 0x1F47C
601934c2c3cb2c93aa12f852f95915190f8ac81facRaph Levien                || (0x1F481 <= c && c <= 0x1F483)
611934c2c3cb2c93aa12f852f95915190f8ac81facRaph Levien                || (0x1F485 <= c && c <= 0x1F487)
620036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka                || c == 0x1F4AA
630036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka                || c == 0x1F575
640036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka                || c == 0x1F57A
650036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka                || c == 0x1F590
661934c2c3cb2c93aa12f852f95915190f8ac81facRaph Levien                || (0x1F595 <= c && c <= 0x1F596)
671934c2c3cb2c93aa12f852f95915190f8ac81facRaph Levien                || (0x1F645 <= c && c <= 0x1F647)
681934c2c3cb2c93aa12f852f95915190f8ac81facRaph Levien                || (0x1F64B <= c && c <= 0x1F64F)
690036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka                || c == 0x1F6A3
701934c2c3cb2c93aa12f852f95915190f8ac81facRaph Levien                || (0x1F6B4 <= c && c <= 0x1F6B6)
710036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka                || c == 0x1F6C0
721934c2c3cb2c93aa12f852f95915190f8ac81facRaph Levien                || (0x1F918 <= c && c <= 0x1F91E)
730036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka                || c == 0x1F926
740036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka                || c == 0x1F930
751934c2c3cb2c93aa12f852f95915190f8ac81facRaph Levien                || (0x1F933 <= c && c <= 0x1F939)
761934c2c3cb2c93aa12f852f95915190f8ac81facRaph Levien                || (0x1F93B <= c && c <= 0x1F93E));
770036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka    } else {
780036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka        return false;
790036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka    }
800036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka}
810036da164e3b25f1ac29c840c1fe15b03dc6677fSeigo Nonaka
82aaa4e3470270496e6eb80704eadecb2cb7c56bf0Raph Levienhb_blob_t* getFontTable(MinikinFont* minikinFont, uint32_t tag) {
83aaa4e3470270496e6eb80704eadecb2cb7c56bf0Raph Levien    assertMinikinLocked();
84aaa4e3470270496e6eb80704eadecb2cb7c56bf0Raph Levien    hb_font_t* font = getHbFontLocked(minikinFont);
85aaa4e3470270496e6eb80704eadecb2cb7c56bf0Raph Levien    hb_face_t* face = hb_font_get_face(font);
86aaa4e3470270496e6eb80704eadecb2cb7c56bf0Raph Levien    hb_blob_t* blob = hb_face_reference_table(face, tag);
87aaa4e3470270496e6eb80704eadecb2cb7c56bf0Raph Levien    hb_font_destroy(font);
88aaa4e3470270496e6eb80704eadecb2cb7c56bf0Raph Levien    return blob;
89aaa4e3470270496e6eb80704eadecb2cb7c56bf0Raph Levien}
90aaa4e3470270496e6eb80704eadecb2cb7c56bf0Raph Levien
91b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien}
92