static bool
is_zero_width_char (hb_font_t *font,
                    hb_codepoint_t unicode)
{
  hb_codepoint_t glyph;
  return hb_font_get_glyph (font, unicode, 0, &glyph) && hb_font_get_glyph_h_advance (font, glyph) == 0;
}
bool FontPlatformData::hasSpaceInLigaturesOrKerning(
    TypesettingFeatures features) const
{
    const HarfBuzzFace* hbFace = harfBuzzFace();
    if (!hbFace)
        return false;

    hb_face_t* face = hbFace->face();
    ASSERT(face);
    OwnPtr<hb_font_t> font = adoptPtr(hbFace->createFont());
    ASSERT(font);

    hb_codepoint_t space;
    // If the space glyph isn't present in the font then each space character
    // will be rendering using a fallback font, which grantees that it cannot
    // affect the shape of the preceding word.
    if (!hb_font_get_glyph(font.get(), spaceCharacter, 0, &space))
        return false;

    if (!hb_ot_layout_has_substitution(face)
        && !hb_ot_layout_has_positioning(face)) {
        return false;
    }

    bool foundSpaceInTable = false;
    hb_set_t* glyphs = hb_set_create();
    if (features & Kerning)
        foundSpaceInTable = tableHasSpace(face, glyphs, HB_OT_TAG_GPOS, space);
    if (!foundSpaceInTable && (features & Ligatures))
        foundSpaceInTable = tableHasSpace(face, glyphs, HB_OT_TAG_GSUB, space);

    hb_set_destroy(glyphs);

    return foundSpaceInTable;
}
示例#3
0
bool FontFamily::hasGlyph(uint32_t codepoint,
                          uint32_t variationSelector) const {
  assertMinikinLocked();
  if (variationSelector != 0 && !mHasVSTable) {
    // Early exit if the variation selector is specified but the font doesn't
    // have a cmap format 14 subtable.
    return false;
  }

  const FontStyle defaultStyle;
  hb_font_t* font = getHbFontLocked(getClosestMatch(defaultStyle).font);
  uint32_t unusedGlyph;
  bool result =
      hb_font_get_glyph(font, codepoint, variationSelector, &unusedGlyph);
  hb_font_destroy(font);
  return result;
}