1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2012 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkOTUtils_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define SkOTUtils_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypeface.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "src/sfnt/SkOTTableTypes.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "src/sfnt/SkOTTable_OS_2_V4.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "src/sfnt/SkOTTable_name.h" 15*c8dee2aaSAndroid Build Coastguard Worker 16*c8dee2aaSAndroid Build Coastguard Worker class SkData; 17*c8dee2aaSAndroid Build Coastguard Worker class SkStream; 18*c8dee2aaSAndroid Build Coastguard Worker struct SkAdvancedTypefaceMetrics; 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker struct SkOTUtils { 21*c8dee2aaSAndroid Build Coastguard Worker /** 22*c8dee2aaSAndroid Build Coastguard Worker * Calculates the OpenType checksum for data. 23*c8dee2aaSAndroid Build Coastguard Worker */ 24*c8dee2aaSAndroid Build Coastguard Worker static uint32_t CalcTableChecksum(SK_OT_ULONG *data, size_t length); 25*c8dee2aaSAndroid Build Coastguard Worker 26*c8dee2aaSAndroid Build Coastguard Worker /** 27*c8dee2aaSAndroid Build Coastguard Worker * Renames an sfnt font. On failure (invalid data or not an sfnt font) 28*c8dee2aaSAndroid Build Coastguard Worker * returns nullptr. 29*c8dee2aaSAndroid Build Coastguard Worker * 30*c8dee2aaSAndroid Build Coastguard Worker * Essentially, this removes any existing 'name' table and replaces it 31*c8dee2aaSAndroid Build Coastguard Worker * with a new one in which FontFamilyName, FontSubfamilyName, 32*c8dee2aaSAndroid Build Coastguard Worker * UniqueFontIdentifier, FullFontName, and PostscriptName are fontName. 33*c8dee2aaSAndroid Build Coastguard Worker * 34*c8dee2aaSAndroid Build Coastguard Worker * The new 'name' table records will be written with the Windows, 35*c8dee2aaSAndroid Build Coastguard Worker * UnicodeBMPUCS2, and English_UnitedStates settings. 36*c8dee2aaSAndroid Build Coastguard Worker * 37*c8dee2aaSAndroid Build Coastguard Worker * fontName and fontNameLen must be specified in terms of ASCII chars. 38*c8dee2aaSAndroid Build Coastguard Worker * 39*c8dee2aaSAndroid Build Coastguard Worker * Does not affect fontData's ownership. 40*c8dee2aaSAndroid Build Coastguard Worker */ 41*c8dee2aaSAndroid Build Coastguard Worker static SkData* RenameFont(SkStreamAsset* fontData, const char* fontName, int fontNameLen); 42*c8dee2aaSAndroid Build Coastguard Worker 43*c8dee2aaSAndroid Build Coastguard Worker /** An implementation of LocalizedStrings which obtains it's data from a 'name' table. */ 44*c8dee2aaSAndroid Build Coastguard Worker class LocalizedStrings_NameTable : public SkTypeface::LocalizedStrings { 45*c8dee2aaSAndroid Build Coastguard Worker public: 46*c8dee2aaSAndroid Build Coastguard Worker /** Takes ownership of the nameTableData and will free it with SK_DELETE. */ LocalizedStrings_NameTableSkOTUtils47*c8dee2aaSAndroid Build Coastguard Worker LocalizedStrings_NameTable(std::unique_ptr<uint8_t[]> nameTableData, size_t size, 48*c8dee2aaSAndroid Build Coastguard Worker SK_OT_USHORT types[], 49*c8dee2aaSAndroid Build Coastguard Worker int typesCount) 50*c8dee2aaSAndroid Build Coastguard Worker : fTypes(types), fTypesCount(typesCount), fTypesIndex(0) 51*c8dee2aaSAndroid Build Coastguard Worker , fNameTableData(std::move(nameTableData)) 52*c8dee2aaSAndroid Build Coastguard Worker , fFamilyNameIter(fNameTableData.get(), size, fTypes[fTypesIndex]) 53*c8dee2aaSAndroid Build Coastguard Worker { } 54*c8dee2aaSAndroid Build Coastguard Worker 55*c8dee2aaSAndroid Build Coastguard Worker /** Creates an iterator over all data in the 'name' table of a typeface. 56*c8dee2aaSAndroid Build Coastguard Worker * If no valid 'name' table can be found, returns nullptr. 57*c8dee2aaSAndroid Build Coastguard Worker */ 58*c8dee2aaSAndroid Build Coastguard Worker static sk_sp<LocalizedStrings_NameTable> Make( 59*c8dee2aaSAndroid Build Coastguard Worker const SkTypeface& typeface, 60*c8dee2aaSAndroid Build Coastguard Worker SK_OT_USHORT types[], 61*c8dee2aaSAndroid Build Coastguard Worker int typesCount); 62*c8dee2aaSAndroid Build Coastguard Worker 63*c8dee2aaSAndroid Build Coastguard Worker /** Creates an iterator over all the family names in the 'name' table of a typeface. 64*c8dee2aaSAndroid Build Coastguard Worker * If no valid 'name' table can be found, returns nullptr. 65*c8dee2aaSAndroid Build Coastguard Worker */ 66*c8dee2aaSAndroid Build Coastguard Worker static sk_sp<LocalizedStrings_NameTable> MakeForFamilyNames(const SkTypeface& typeface); 67*c8dee2aaSAndroid Build Coastguard Worker 68*c8dee2aaSAndroid Build Coastguard Worker bool next(SkTypeface::LocalizedString* localizedString) override; 69*c8dee2aaSAndroid Build Coastguard Worker private: 70*c8dee2aaSAndroid Build Coastguard Worker static SK_OT_USHORT familyNameTypes[3]; 71*c8dee2aaSAndroid Build Coastguard Worker 72*c8dee2aaSAndroid Build Coastguard Worker SK_OT_USHORT* fTypes; 73*c8dee2aaSAndroid Build Coastguard Worker int fTypesCount; 74*c8dee2aaSAndroid Build Coastguard Worker int fTypesIndex; 75*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<uint8_t[]> fNameTableData; 76*c8dee2aaSAndroid Build Coastguard Worker SkOTTableName::Iterator fFamilyNameIter; 77*c8dee2aaSAndroid Build Coastguard Worker }; 78*c8dee2aaSAndroid Build Coastguard Worker 79*c8dee2aaSAndroid Build Coastguard Worker /** An implementation of LocalizedStrings which has one name. */ 80*c8dee2aaSAndroid Build Coastguard Worker class LocalizedStrings_SingleName : public SkTypeface::LocalizedStrings { 81*c8dee2aaSAndroid Build Coastguard Worker public: LocalizedStrings_SingleNameSkOTUtils82*c8dee2aaSAndroid Build Coastguard Worker LocalizedStrings_SingleName(SkString name, SkString language) 83*c8dee2aaSAndroid Build Coastguard Worker : fName(std::move(name)), fLanguage(std::move(language)), fHasNext(true) {} 84*c8dee2aaSAndroid Build Coastguard Worker nextSkOTUtils85*c8dee2aaSAndroid Build Coastguard Worker bool next(SkTypeface::LocalizedString* localizedString) override { 86*c8dee2aaSAndroid Build Coastguard Worker localizedString->fString = fName; 87*c8dee2aaSAndroid Build Coastguard Worker localizedString->fLanguage = fLanguage; 88*c8dee2aaSAndroid Build Coastguard Worker 89*c8dee2aaSAndroid Build Coastguard Worker bool hadNext = fHasNext; 90*c8dee2aaSAndroid Build Coastguard Worker fHasNext = false; 91*c8dee2aaSAndroid Build Coastguard Worker return hadNext; 92*c8dee2aaSAndroid Build Coastguard Worker } 93*c8dee2aaSAndroid Build Coastguard Worker 94*c8dee2aaSAndroid Build Coastguard Worker private: 95*c8dee2aaSAndroid Build Coastguard Worker SkString fName; 96*c8dee2aaSAndroid Build Coastguard Worker SkString fLanguage; 97*c8dee2aaSAndroid Build Coastguard Worker bool fHasNext; 98*c8dee2aaSAndroid Build Coastguard Worker }; 99*c8dee2aaSAndroid Build Coastguard Worker 100*c8dee2aaSAndroid Build Coastguard Worker static void SetAdvancedTypefaceFlags(SkOTTableOS2_V4::Type fsType, 101*c8dee2aaSAndroid Build Coastguard Worker SkAdvancedTypefaceMetrics* info); 102*c8dee2aaSAndroid Build Coastguard Worker }; 103*c8dee2aaSAndroid Build Coastguard Worker 104*c8dee2aaSAndroid Build Coastguard Worker #endif 105