blob: f973f7485f153211cfd2164e4908033ffc212ce2 [file] [log] [blame]
/*
* Copyright 2006 The Android Open Source Project
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkFontMgr_custom_DEFINED
#define SkFontMgr_custom_DEFINED
#include "include/core/SkFontMgr.h"
#include "include/core/SkFontStyle.h"
#include "include/core/SkRefCnt.h"
#include "include/core/SkString.h"
#include "include/core/SkTypes.h"
#include "include/private/SkTArray.h"
#include "src/ports/SkFontHost_FreeType_common.h"
class SkData;
class SkFontDescriptor;
class SkStreamAsset;
class SkTypeface;
/** The base SkTypeface implementation for the custom font manager. */
class SkTypeface_Custom : public SkTypeface_FreeType {
public:
SkTypeface_Custom(const SkFontStyle& style, bool isFixedPitch,
bool sysFont, const SkString familyName, int index);
bool isSysFont() const;
protected:
void onGetFamilyName(SkString* familyName) const override;
void onGetFontDescriptor(SkFontDescriptor* desc, bool* isLocal) const override;
int getIndex() const;
private:
const bool fIsSysFont;
const SkString fFamilyName;
const int fIndex;
using INHERITED = SkTypeface_FreeType;
};
/** The empty SkTypeface implementation for the custom font manager.
* Used as the last resort fallback typeface.
*/
class SkTypeface_Empty : public SkTypeface_Custom {
public:
SkTypeface_Empty() ;
protected:
std::unique_ptr<SkStreamAsset> onOpenStream(int*) const override;
sk_sp<SkTypeface> onMakeClone(const SkFontArguments& args) const override;
std::unique_ptr<SkFontData> onMakeFontData() const override;
private:
using INHERITED = SkTypeface_Custom;
};
/** The stream SkTypeface implementation for the custom font manager. */
class SkTypeface_Stream : public SkTypeface_Custom {
public:
SkTypeface_Stream(std::unique_ptr<SkFontData> fontData,
const SkFontStyle& style, bool isFixedPitch, bool sysFont,
const SkString familyName);
protected:
std::unique_ptr<SkStreamAsset> onOpenStream(int* ttcIndex) const override;
std::unique_ptr<SkFontData> onMakeFontData() const override;
sk_sp<SkTypeface> onMakeClone(const SkFontArguments& args) const override;
void onGetFontDescriptor(SkFontDescriptor* desc, bool* isLocal) const override;
private:
const std::unique_ptr<const SkFontData> fData;
using INHERITED = SkTypeface_Custom;
};
/** The file SkTypeface implementation for the custom font manager. */
class SkTypeface_File : public SkTypeface_Custom {
public:
SkTypeface_File(const SkFontStyle& style, bool isFixedPitch, bool sysFont,
const SkString familyName, const char path[], int index);
protected:
std::unique_ptr<SkStreamAsset> onOpenStream(int* ttcIndex) const override;
sk_sp<SkTypeface> onMakeClone(const SkFontArguments& args) const override;
std::unique_ptr<SkFontData> onMakeFontData() const override;
private:
SkString fPath;
using INHERITED = SkTypeface_Custom;
};
///////////////////////////////////////////////////////////////////////////////
/**
* SkFontStyleSet_Custom
*
* This class is used by SkFontMgr_Custom to hold SkTypeface_Custom families.
*/
class SkFontStyleSet_Custom : public SkFontStyleSet {
public:
explicit SkFontStyleSet_Custom(const SkString familyName);
/** Should only be called during the initial build phase. */
void appendTypeface(sk_sp<SkTypeface_Custom> typeface);
int count() override;
void getStyle(int index, SkFontStyle* style, SkString* name) override;
SkTypeface* createTypeface(int index) override;
SkTypeface* matchStyle(const SkFontStyle& pattern) override;
SkString getFamilyName();
private:
SkTArray<sk_sp<SkTypeface_Custom>> fStyles;
SkString fFamilyName;
friend class SkFontMgr_Custom;
};
/**
* SkFontMgr_Custom
*
* This class is essentially a collection of SkFontStyleSet_Custom,
* one SkFontStyleSet_Custom for each family. This class may be modified
* to load fonts from any source by changing the initialization.
*/
class SkFontMgr_Custom : public SkFontMgr {
public:
typedef SkTArray<sk_sp<SkFontStyleSet_Custom>> Families;
class SystemFontLoader {
public:
virtual ~SystemFontLoader() { }
virtual void loadSystemFonts(const SkTypeface_FreeType::Scanner&, Families*) const = 0;
};
explicit SkFontMgr_Custom(const SystemFontLoader& loader);
protected:
int onCountFamilies() const override;
void onGetFamilyName(int index, SkString* familyName) const override;
SkFontStyleSet_Custom* onCreateStyleSet(int index) const override;
SkFontStyleSet_Custom* onMatchFamily(const char familyName[]) const override;
SkTypeface* onMatchFamilyStyle(const char familyName[],
const SkFontStyle& fontStyle) const override;
SkTypeface* onMatchFamilyStyleCharacter(const char familyName[], const SkFontStyle&,
const char* bcp47[], int bcp47Count,
SkUnichar character) const override;
sk_sp<SkTypeface> onMakeFromData(sk_sp<SkData> data, int ttcIndex) const override;
sk_sp<SkTypeface> onMakeFromStreamIndex(std::unique_ptr<SkStreamAsset>, int ttcIndex) const override;
sk_sp<SkTypeface> onMakeFromStreamArgs(std::unique_ptr<SkStreamAsset>, const SkFontArguments&) const override;
sk_sp<SkTypeface> onMakeFromFile(const char path[], int ttcIndex) const override;
sk_sp<SkTypeface> onLegacyMakeTypeface(const char familyName[], SkFontStyle style) const override;
private:
Families fFamilies;
SkFontStyleSet_Custom* fDefaultFamily;
SkTypeface_FreeType::Scanner fScanner;
};
#endif