blob: d387fb24ca6bc949ae817add265c5d02339b36bb [file] [log] [blame]
/*
* Copyright 2020 Google LLC
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkCustomTypeface_DEFINED
#define SkCustomTypeface_DEFINED
#include "include/core/SkDrawable.h"
#include "include/core/SkFontMetrics.h"
#include "include/core/SkFontStyle.h"
#include "include/core/SkPath.h"
#include "include/core/SkRect.h"
#include "include/core/SkRefCnt.h"
#include "include/core/SkTypeface.h"
#include "include/core/SkTypes.h"
#include <memory>
#include <vector>
class SkStream;
class SkStreamAsset;
struct SkFontArguments;
class SK_API SkCustomTypefaceBuilder {
public:
SkCustomTypefaceBuilder();
void setGlyph(SkGlyphID, float advance, const SkPath&);
void setGlyph(SkGlyphID, float advance, sk_sp<SkDrawable>, const SkRect& bounds);
void setMetrics(const SkFontMetrics& fm, float scale = 1);
void setFontStyle(SkFontStyle);
sk_sp<SkTypeface> detach();
static constexpr SkTypeface::FactoryId FactoryId = SkSetFourByteTag('u','s','e','r');
static sk_sp<SkTypeface> MakeFromStream(std::unique_ptr<SkStreamAsset>, const SkFontArguments&);
private:
struct GlyphRec {
// logical union
SkPath fPath;
sk_sp<SkDrawable> fDrawable;
SkRect fBounds = {0,0,0,0}; // only used for drawable glyphs atm
float fAdvance = 0;
bool isDrawable() const {
SkASSERT(!fDrawable || fPath.isEmpty());
return fDrawable != nullptr;
}
};
std::vector<GlyphRec> fGlyphRecs;
SkFontMetrics fMetrics;
SkFontStyle fStyle;
GlyphRec& ensureStorage(SkGlyphID);
static sk_sp<SkTypeface> Deserialize(SkStream*);
friend class SkTypeface;
friend class SkUserTypeface;
};
#endif