OLD | NEW |
(Empty) | |
| 1 /* ***** BEGIN LICENSE BLOCK ***** |
| 2 * |
| 3 * This Source Code Form is subject to the terms of the Mozilla Public |
| 4 * License, v. 2.0. If a copy of the MPL was not distributed with this |
| 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. |
| 6 * |
| 7 * ***** END LICENSE BLOCK ***** */ |
| 8 |
| 9 #include "platform/fonts/opentype/OpenTypeCapsSupport.h" |
| 10 |
| 11 #include <hb-ot.h> |
| 12 |
| 13 namespace blink { |
| 14 |
| 15 bool OpenTypeCapsSupport::supportsOpenTypeFeature( |
| 16 hb_script_t script, |
| 17 uint32_t tag) const |
| 18 { |
| 19 |
| 20 hb_face_t* face = m_harfBuzzFace->face(); |
| 21 ASSERT(face); |
| 22 |
| 23 ASSERT((tag == HB_TAG('s', 'm', 'c', 'p') |
| 24 || tag == HB_TAG('c', '2', 's', 'c') |
| 25 || tag == HB_TAG('p', 'c', 'a', 'p') |
| 26 || tag == HB_TAG('c', '2', 'p', 'c') |
| 27 || tag == HB_TAG('s', 'u', 'p', 's') |
| 28 || tag == HB_TAG('s', 'u', 'b', 's') |
| 29 || tag == HB_TAG('t', 'i', 't', 'l') |
| 30 || tag == HB_TAG('u', 'n', 'i', 'c') |
| 31 || tag == HB_TAG('v', 'e', 'r', 't'))); |
| 32 |
| 33 bool result = false; |
| 34 |
| 35 if (!hb_ot_layout_has_substitution(face)) |
| 36 return false; |
| 37 |
| 38 // Get the OpenType tag(s) that match this script code |
| 39 const size_t kMaxScriptTags = 4; |
| 40 hb_tag_t scriptTags[kMaxScriptTags] = { |
| 41 HB_TAG_NONE, |
| 42 HB_TAG_NONE, |
| 43 HB_TAG_NONE, |
| 44 HB_TAG_NONE |
| 45 }; |
| 46 hb_ot_tags_from_script(static_cast<hb_script_t>(script), |
| 47 &scriptTags[0], |
| 48 &scriptTags[1]); |
| 49 |
| 50 // Replace the first remaining NONE with DEFAULT |
| 51 for (size_t i = 0; i < kMaxScriptTags; ++i) { |
| 52 if (scriptTags[i] == HB_TAG_NONE) { |
| 53 scriptTags[i] = HB_OT_TAG_DEFAULT_SCRIPT; |
| 54 break; |
| 55 } |
| 56 } |
| 57 |
| 58 // Now check for 'smcp' under the first of those scripts that is present |
| 59 const hb_tag_t kGSUB = HB_TAG('G', 'S', 'U', 'B'); |
| 60 for (size_t j = 0; j < kMaxScriptTags; ++j) { |
| 61 if (scriptTags[j] == HB_TAG_NONE) |
| 62 break; |
| 63 |
| 64 unsigned scriptIndex; |
| 65 if (hb_ot_layout_table_find_script(face, |
| 66 kGSUB, |
| 67 scriptTags[j], |
| 68 &scriptIndex)) { |
| 69 if (hb_ot_layout_language_find_feature(face, kGSUB, |
| 70 scriptIndex, |
| 71 HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX, |
| 72 tag, nullptr)) { |
| 73 result = true; |
| 74 } |
| 75 break; |
| 76 } |
| 77 } |
| 78 return result; |
| 79 } |
| 80 |
| 81 } // namespace blink |
OLD | NEW |