blob: 1773e69ab6c38222e4d040be757f08488e706b4c [file] [log] [blame]
bungeman@google.com8ec99562012-02-07 21:30:21 +00001/*
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"
bungeman@google.coma9802692013-08-07 02:45:25 +000012#include "SkOTTable_name.h"
13#include "SkTypeface.h"
14
bungeman@google.coma544f292012-11-20 18:52:23 +000015class SkData;
bungeman@google.coma5501992012-05-18 19:06:41 +000016class SkStream;
bungeman@google.com8ec99562012-02-07 21:30:21 +000017
18struct SkOTUtils {
bungeman@google.coma5501992012-05-18 19:06:41 +000019 /**
20 * Calculates the OpenType checksum for data.
21 */
bungeman@google.com8ec99562012-02-07 21:30:21 +000022 static uint32_t CalcTableChecksum(SK_OT_ULONG *data, size_t length);
bungeman@google.coma5501992012-05-18 19:06:41 +000023
24 /**
25 * Renames an sfnt font. On failure (invalid data or not an sfnt font)
halcanary96fcdcc2015-08-27 07:41:13 -070026 * returns nullptr.
bungeman@google.coma5501992012-05-18 19:06:41 +000027 *
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.
scroggoa1193e42015-01-21 12:09:53 -080036 *
37 * Does not affect fontData's ownership.
bungeman@google.coma5501992012-05-18 19:06:41 +000038 */
bungeman5f213d92015-01-27 05:39:10 -080039 static SkData* RenameFont(SkStreamAsset* fontData, const char* fontName, int fontNameLen);
bungeman@google.coma9802692013-08-07 02:45:25 +000040
41 /** An implementation of LocalizedStrings which obtains it's data from a 'name' table. */
42 class LocalizedStrings_NameTable : public SkTypeface::LocalizedStrings {
43 public:
44 /** Takes ownership of the nameTableData and will free it with SK_DELETE. */
45 LocalizedStrings_NameTable(SkOTTableName* nameTableData,
46 SkOTTableName::Record::NameID::Predefined::Value types[],
47 int typesCount)
48 : fTypes(types), fTypesCount(typesCount), fTypesIndex(0)
49 , fNameTableData(nameTableData), fFamilyNameIter(*nameTableData, fTypes[fTypesIndex])
50 { }
51
52 /** Creates an iterator over all the family names in the 'name' table of a typeface.
halcanary96fcdcc2015-08-27 07:41:13 -070053 * If no valid 'name' table can be found, returns nullptr.
bungeman@google.coma9802692013-08-07 02:45:25 +000054 */
55 static LocalizedStrings_NameTable* CreateForFamilyNames(const SkTypeface& typeface);
56
mtklein36352bf2015-03-25 18:17:31 -070057 bool next(SkTypeface::LocalizedString* localizedString) override;
bungeman@google.coma9802692013-08-07 02:45:25 +000058 private:
59 static SkOTTableName::Record::NameID::Predefined::Value familyNameTypes[3];
60
61 SkOTTableName::Record::NameID::Predefined::Value* fTypes;
62 int fTypesCount;
63 int fTypesIndex;
64 SkAutoTDeleteArray<SkOTTableName> fNameTableData;
65 SkOTTableName::Iterator fFamilyNameIter;
66 };
67
68 /** An implementation of LocalizedStrings which has one name. */
69 class LocalizedStrings_SingleName : public SkTypeface::LocalizedStrings {
70 public:
71 LocalizedStrings_SingleName(SkString name, SkString language)
72 : fName(name), fLanguage(language), fHasNext(true)
73 { }
74
mtklein36352bf2015-03-25 18:17:31 -070075 bool next(SkTypeface::LocalizedString* localizedString) override {
bungeman@google.coma9802692013-08-07 02:45:25 +000076 localizedString->fString = fName;
77 localizedString->fLanguage = fLanguage;
78
79 bool hadNext = fHasNext;
80 fHasNext = false;
81 return hadNext;
82 }
83
84 private:
85 SkString fName;
86 SkString fLanguage;
87 bool fHasNext;
88 };
bungeman@google.com8ec99562012-02-07 21:30:21 +000089};
90
91#endif