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