1 /* 2 * Copyright 2012 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef SkOTUtils_DEFINED 9 #define SkOTUtils_DEFINED 10 11 #include "SkOTTableTypes.h" 12 #include "SkOTTable_name.h" 13 #include "SkTypeface.h" 14 15 class SkData; 16 class SkStream; 17 18 struct SkOTUtils { 19 /** 20 * Calculates the OpenType checksum for data. 21 */ 22 static uint32_t CalcTableChecksum(SK_OT_ULONG *data, size_t length); 23 24 /** 25 * Renames an sfnt font. On failure (invalid data or not an sfnt font) 26 * returns NULL. 27 * 28 * Essentially, this removes any existing 'name' table and replaces it 29 * with a new one in which FontFamilyName, FontSubfamilyName, 30 * UniqueFontIdentifier, FullFontName, and PostscriptName are fontName. 31 * 32 * The new 'name' table records will be written with the Windows, 33 * UnicodeBMPUCS2, and English_UnitedStates settings. 34 * 35 * fontName and fontNameLen must be specified in terms of ASCII chars. 36 */ 37 static SkData* RenameFont(SkStream* fontData, const char* fontName, int fontNameLen); 38 39 /** An implementation of LocalizedStrings which obtains it's data from a 'name' table. */ 40 class LocalizedStrings_NameTable : public SkTypeface::LocalizedStrings { 41 public: 42 /** Takes ownership of the nameTableData and will free it with SK_DELETE. */ LocalizedStrings_NameTableSkOTUtils43 LocalizedStrings_NameTable(SkOTTableName* nameTableData, 44 SkOTTableName::Record::NameID::Predefined::Value types[], 45 int typesCount) 46 : fTypes(types), fTypesCount(typesCount), fTypesIndex(0) 47 , fNameTableData(nameTableData), fFamilyNameIter(*nameTableData, fTypes[fTypesIndex]) 48 { } 49 50 /** Creates an iterator over all the family names in the 'name' table of a typeface. 51 * If no valid 'name' table can be found, returns NULL. 52 */ 53 static LocalizedStrings_NameTable* CreateForFamilyNames(const SkTypeface& typeface); 54 55 virtual bool next(SkTypeface::LocalizedString* localizedString) SK_OVERRIDE; 56 private: 57 static SkOTTableName::Record::NameID::Predefined::Value familyNameTypes[3]; 58 59 SkOTTableName::Record::NameID::Predefined::Value* fTypes; 60 int fTypesCount; 61 int fTypesIndex; 62 SkAutoTDeleteArray<SkOTTableName> fNameTableData; 63 SkOTTableName::Iterator fFamilyNameIter; 64 }; 65 66 /** An implementation of LocalizedStrings which has one name. */ 67 class LocalizedStrings_SingleName : public SkTypeface::LocalizedStrings { 68 public: LocalizedStrings_SingleNameSkOTUtils69 LocalizedStrings_SingleName(SkString name, SkString language) 70 : fName(name), fLanguage(language), fHasNext(true) 71 { } 72 nextSkOTUtils73 virtual bool next(SkTypeface::LocalizedString* localizedString) SK_OVERRIDE { 74 localizedString->fString = fName; 75 localizedString->fLanguage = fLanguage; 76 77 bool hadNext = fHasNext; 78 fHasNext = false; 79 return hadNext; 80 } 81 82 private: 83 SkString fName; 84 SkString fLanguage; 85 bool fHasNext; 86 }; 87 }; 88 89 #endif 90