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