MinikinInternal.cpp revision 77f488345316fba46c271fc04bea470819ae1712
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