bool GetU16FullName(mozilla::u16string& aU16FullName) { const TableDirEntry* dirEntry = GetDirEntry(TRUETYPE_TAG('n', 'a', 'm', 'e')); if (!dirEntry) { gfxWarning() << "Name table entry not found."; return false; } UniquePtr<SFNTNameTable> nameTable = SFNTNameTable::Create((mFontData + dirEntry->offset), dirEntry->length); if (!nameTable) { return false; } return nameTable->GetU16FullName(aU16FullName); }
/* static */ UniquePtr<SFNTData> SFNTData::Create(const uint8_t *aFontData, uint32_t aDataLength) { MOZ_ASSERT(aFontData); // Check to see if this is a font collection. if (aDataLength < sizeof(TTCHeader)) { gfxWarning() << "Font data too short."; return nullptr; } const TTCHeader *ttcHeader = reinterpret_cast<const TTCHeader*>(aFontData); if (ttcHeader->ttcTag == TRUETYPE_TAG('t', 't', 'c', 'f')) { uint32_t numFonts = ttcHeader->numFonts; if (aDataLength < sizeof(TTCHeader) + (numFonts * sizeof(BigEndianUint32))) { gfxWarning() << "Font data too short to contain full TTC Header."; return nullptr; } UniquePtr<SFNTData> sfntData(new SFNTData); const BigEndianUint32* offset = reinterpret_cast<const BigEndianUint32*>(aFontData + sizeof(TTCHeader)); const BigEndianUint32* endOfOffsets = offset + numFonts; while (offset != endOfOffsets) { if (!sfntData->AddFont(aFontData, aDataLength, *offset)) { return nullptr; } ++offset; } return Move(sfntData); } UniquePtr<SFNTData> sfntData(new SFNTData); if (!sfntData->AddFont(aFontData, aDataLength, 0)) { return nullptr; } return Move(sfntData); }
nsresult GDIFontEntry::ReadCMAP() { // skip non-SFNT fonts completely if (mFontType != GFX_FONT_TYPE_PS_OPENTYPE && mFontType != GFX_FONT_TYPE_TT_OPENTYPE && mFontType != GFX_FONT_TYPE_TRUETYPE) { return NS_ERROR_FAILURE; } // attempt this once, if errors occur leave a blank cmap if (mCmapInitialized) return NS_OK; mCmapInitialized = PR_TRUE; const PRUint32 kCmapTag = TRUETYPE_TAG('c','m','a','p'); AutoFallibleTArray<PRUint8,16384> buffer; if (GetFontTable(kCmapTag, buffer) != NS_OK) return NS_ERROR_FAILURE; PRUint8 *cmap = buffer.Elements(); PRPackedBool unicodeFont = PR_FALSE, symbolFont = PR_FALSE; nsresult rv = gfxFontUtils::ReadCMAP(cmap, buffer.Length(), mCharacterMap, mUVSOffset, unicodeFont, symbolFont); mUnicodeFont = unicodeFont; mSymbolFont = symbolFont; mHasCmapTable = NS_SUCCEEDED(rv); #ifdef PR_LOGGING LOG_FONTLIST(("(fontlist-cmap) name: %s, size: %d\n", NS_ConvertUTF16toUTF8(mName).get(), mCharacterMap.GetSize())); #endif return rv; }
void nsFont::AddFontFeaturesToStyle(gfxFontStyle *aStyle) const { // add in font-variant features gfxFontFeature setting; // -- kerning setting.mTag = TRUETYPE_TAG('k','e','r','n'); switch (kerning) { case NS_FONT_KERNING_NONE: setting.mValue = 0; aStyle->featureSettings.AppendElement(setting); break; case NS_FONT_KERNING_NORMAL: setting.mValue = 1; aStyle->featureSettings.AppendElement(setting); break; default: // auto case implies use user agent default break; } // -- alternates if (variantAlternates & NS_FONT_VARIANT_ALTERNATES_HISTORICAL) { setting.mValue = 1; setting.mTag = TRUETYPE_TAG('h','i','s','t'); aStyle->featureSettings.AppendElement(setting); } // -- copy font-specific alternate info into style // (this will be resolved after font-matching occurs) aStyle->alternateValues.AppendElements(alternateValues); aStyle->featureValueLookup = featureValueLookup; // -- caps setting.mValue = 1; switch (variantCaps) { case NS_FONT_VARIANT_CAPS_ALLSMALL: setting.mTag = TRUETYPE_TAG('c','2','s','c'); aStyle->featureSettings.AppendElement(setting); // fall through to the small-caps case case NS_FONT_VARIANT_CAPS_SMALLCAPS: setting.mTag = TRUETYPE_TAG('s','m','c','p'); aStyle->featureSettings.AppendElement(setting); break; case NS_FONT_VARIANT_CAPS_ALLPETITE: setting.mTag = TRUETYPE_TAG('c','2','p','c'); aStyle->featureSettings.AppendElement(setting); // fall through to the petite-caps case case NS_FONT_VARIANT_CAPS_PETITECAPS: setting.mTag = TRUETYPE_TAG('p','c','a','p'); aStyle->featureSettings.AppendElement(setting); break; case NS_FONT_VARIANT_CAPS_TITLING: setting.mTag = TRUETYPE_TAG('t','i','t','l'); aStyle->featureSettings.AppendElement(setting); break; case NS_FONT_VARIANT_CAPS_UNICASE: setting.mTag = TRUETYPE_TAG('u','n','i','c'); aStyle->featureSettings.AppendElement(setting); break; default: break; } // -- east-asian if (variantEastAsian) { AddFontFeaturesBitmask(variantEastAsian, NS_FONT_VARIANT_EAST_ASIAN_JIS78, NS_FONT_VARIANT_EAST_ASIAN_RUBY, eastAsianDefaults, aStyle->featureSettings); } // -- ligatures if (variantLigatures) { AddFontFeaturesBitmask(variantLigatures, NS_FONT_VARIANT_LIGATURES_COMMON, NS_FONT_VARIANT_LIGATURES_NO_CONTEXTUAL, ligDefaults, aStyle->featureSettings); // special case common ligs, which also enable/disable clig if (variantLigatures & NS_FONT_VARIANT_LIGATURES_COMMON) { setting.mTag = TRUETYPE_TAG('c','l','i','g'); setting.mValue = 1; aStyle->featureSettings.AppendElement(setting); } else if (variantLigatures & NS_FONT_VARIANT_LIGATURES_NO_COMMON) { setting.mTag = TRUETYPE_TAG('c','l','i','g'); setting.mValue = 0; aStyle->featureSettings.AppendElement(setting); } } // -- numeric if (variantNumeric) { AddFontFeaturesBitmask(variantNumeric, NS_FONT_VARIANT_NUMERIC_LINING, NS_FONT_VARIANT_NUMERIC_ORDINAL, numericDefaults, aStyle->featureSettings); } // -- position setting.mTag = 0; setting.mValue = 1; switch (variantPosition) { case NS_FONT_VARIANT_POSITION_SUPER: setting.mTag = TRUETYPE_TAG('s','u','p','s'); aStyle->featureSettings.AppendElement(setting); break; case NS_FONT_VARIANT_POSITION_SUB: setting.mTag = TRUETYPE_TAG('s','u','b','s'); aStyle->featureSettings.AppendElement(setting); break; default: break; } // add in features from font-feature-settings aStyle->featureSettings.AppendElements(fontFeatureSettings); // enable grayscale antialiasing for text if (smoothing == NS_FONT_SMOOTHING_GRAYSCALE) { aStyle->useGrayscaleAntialiasing = true; } }
return false; ++p; // may advance past p_end } return true; } // mapping from bitflag to font feature tag/value pair // // these need to be kept in sync with the constants listed // in gfxFontConstants.h (e.g. NS_FONT_VARIANT_EAST_ASIAN_JIS78) // NS_FONT_VARIANT_EAST_ASIAN_xxx values const gfxFontFeature eastAsianDefaults[] = { { TRUETYPE_TAG('j','p','7','8'), 1 }, { TRUETYPE_TAG('j','p','8','3'), 1 }, { TRUETYPE_TAG('j','p','9','0'), 1 }, { TRUETYPE_TAG('j','p','0','4'), 1 }, { TRUETYPE_TAG('s','m','p','l'), 1 }, { TRUETYPE_TAG('t','r','a','d'), 1 }, { TRUETYPE_TAG('f','w','i','d'), 1 }, { TRUETYPE_TAG('p','w','i','d'), 1 }, { TRUETYPE_TAG('r','u','b','y'), 1 } }; static_assert(NS_ARRAY_LENGTH(eastAsianDefaults) == eFeatureEastAsian_numFeatures, "eFeatureEastAsian_numFeatures should be correct"); // NS_FONT_VARIANT_LIGATURES_xxx values