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#ifndef MINIKIN_INTERNAL_H 20b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien#define MINIKIN_INTERNAL_H 21b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien 22aaa4e3470270496e6eb80704eadecb2cb7c56bf0Raph Levien#include <hb.h> 238fbcbda6f9a2ee254ad8d22a5fe025e094fd6ff0Seigo Nonaka#include <utils/Log.h> 24fd4124c53399581dd94eac5a9749bc07b474a294Seigo Nonaka#include <utils/Mutex.h> 2562ad565335d4774bc5b31ced462e92566b48d197Seigo Nonaka 26a22996e31226e3dcbfb0c57d03ca9ac54028fc28Seigo Nonaka#include "minikin/HbUtils.h" 271d461589869ee5b7102f96271b0ef0a776ab513cSeigo Nonaka#include "minikin/MinikinFont.h" 28aaa4e3470270496e6eb80704eadecb2cb7c56bf0Raph Levien 2914e2d136aaef271ba131f917cf5f27baa31ae5adSeigo Nonakanamespace minikin { 30b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien 318fbcbda6f9a2ee254ad8d22a5fe025e094fd6ff0Seigo Nonaka#ifdef ENABLE_ASSERTION 328fbcbda6f9a2ee254ad8d22a5fe025e094fd6ff0Seigo Nonaka#define MINIKIN_ASSERT(cond, ...) LOG_ALWAYS_FATAL_IF(!(cond), __VA_ARGS__) 338fbcbda6f9a2ee254ad8d22a5fe025e094fd6ff0Seigo Nonaka#else 348fbcbda6f9a2ee254ad8d22a5fe025e094fd6ff0Seigo Nonaka#define MINIKIN_ASSERT(cond, ...) ((void)0) 358fbcbda6f9a2ee254ad8d22a5fe025e094fd6ff0Seigo Nonaka#endif 368fbcbda6f9a2ee254ad8d22a5fe025e094fd6ff0Seigo Nonaka 3778aadd58c4500d73f266d34f1f2c1f88309987a6Seigo Nonaka#define MINIKIN_NOT_REACHED(...) MINIKIN_ASSERT(false, __VA_ARGS__); 3878aadd58c4500d73f266d34f1f2c1f88309987a6Seigo Nonaka 39818fbee83a72ca86f64527eb90b2f15ec9b28504Seigo Nonakaconstexpr uint32_t MAX_UNICODE_CODE_POINT = 0x10FFFF; 40818fbee83a72ca86f64527eb90b2f15ec9b28504Seigo Nonaka 41722841005f805a5023fd7edefc4016968d1fae10Seigo Nonakaconstexpr uint32_t VS1 = 0xFE00; 42722841005f805a5023fd7edefc4016968d1fae10Seigo Nonakaconstexpr uint32_t VS16 = 0xFE0F; 43722841005f805a5023fd7edefc4016968d1fae10Seigo Nonakaconstexpr uint32_t VS17 = 0xE0100; 44722841005f805a5023fd7edefc4016968d1fae10Seigo Nonakaconstexpr uint32_t VS256 = 0xE01EF; 45722841005f805a5023fd7edefc4016968d1fae10Seigo Nonaka 46722841005f805a5023fd7edefc4016968d1fae10Seigo Nonaka// Returns variation selector index. This is one unit less than the variation selector number. For 47722841005f805a5023fd7edefc4016968d1fae10Seigo Nonaka// example, VARIATION SELECTOR-25 maps to 24. 48722841005f805a5023fd7edefc4016968d1fae10Seigo Nonaka// [0x00-0x0F] for U+FE00..U+FE0F 49722841005f805a5023fd7edefc4016968d1fae10Seigo Nonaka// [0x10-0xFF] for U+E0100..U+E01EF 50722841005f805a5023fd7edefc4016968d1fae10Seigo Nonaka// INVALID_VS_INDEX for other input. 51722841005f805a5023fd7edefc4016968d1fae10Seigo Nonakaconstexpr uint16_t INVALID_VS_INDEX = 0xFFFF; 52722841005f805a5023fd7edefc4016968d1fae10Seigo Nonakauint16_t getVsIndex(uint32_t codePoint); 53722841005f805a5023fd7edefc4016968d1fae10Seigo Nonaka 54722841005f805a5023fd7edefc4016968d1fae10Seigo Nonaka// Returns true if the code point is a variation selector. 55722841005f805a5023fd7edefc4016968d1fae10Seigo Nonaka// Note that this function returns false for Mongolian free variation selectors. 56722841005f805a5023fd7edefc4016968d1fae10Seigo Nonakabool isVariationSelector(uint32_t codePoint); 57722841005f805a5023fd7edefc4016968d1fae10Seigo Nonaka 58a22996e31226e3dcbfb0c57d03ca9ac54028fc28Seigo Nonaka// An RAII accessor for hb_blob_t 59aaa4e3470270496e6eb80704eadecb2cb7c56bf0Raph Levienclass HbBlob { 60aaa4e3470270496e6eb80704eadecb2cb7c56bf0Raph Levienpublic: 61a22996e31226e3dcbfb0c57d03ca9ac54028fc28Seigo Nonaka HbBlob(const HbFaceUniquePtr& face, uint32_t tag) 62a22996e31226e3dcbfb0c57d03ca9ac54028fc28Seigo Nonaka : mBlob(hb_face_reference_table(face.get(), tag)) {} 63a22996e31226e3dcbfb0c57d03ca9ac54028fc28Seigo Nonaka HbBlob(const HbFontUniquePtr& font, uint32_t tag) 64a22996e31226e3dcbfb0c57d03ca9ac54028fc28Seigo Nonaka : mBlob(hb_face_reference_table(hb_font_get_face(font.get()), tag)) {} 65aaa4e3470270496e6eb80704eadecb2cb7c56bf0Raph Levien 66a22996e31226e3dcbfb0c57d03ca9ac54028fc28Seigo Nonaka inline const uint8_t* get() const { 67a22996e31226e3dcbfb0c57d03ca9ac54028fc28Seigo Nonaka return reinterpret_cast<const uint8_t*>(hb_blob_get_data(mBlob.get(), nullptr)); 684de86391218f9fa2d1ba15d78cd80514fb5ce43dSeigo Nonaka } 696c6954b40f7a6bd6dcf8a3d01c78600437c2e011Seigo Nonaka 70a22996e31226e3dcbfb0c57d03ca9ac54028fc28Seigo Nonaka inline size_t size() const { return (size_t)hb_blob_get_length(mBlob.get()); } 71a22996e31226e3dcbfb0c57d03ca9ac54028fc28Seigo Nonaka 72a22996e31226e3dcbfb0c57d03ca9ac54028fc28Seigo Nonaka inline operator bool() const { return size() > 0; } 73aaa4e3470270496e6eb80704eadecb2cb7c56bf0Raph Levien 74aaa4e3470270496e6eb80704eadecb2cb7c56bf0Raph Levienprivate: 75a22996e31226e3dcbfb0c57d03ca9ac54028fc28Seigo Nonaka HbBlobUniquePtr mBlob; 76aaa4e3470270496e6eb80704eadecb2cb7c56bf0Raph Levien}; 77aaa4e3470270496e6eb80704eadecb2cb7c56bf0Raph Levien 7814e2d136aaef271ba131f917cf5f27baa31ae5adSeigo Nonaka} // namespace minikin 79b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien 80b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien#endif // MINIKIN_INTERNAL_H 81