platform/cc/shaper/FontRunIterator.hh (78 lines of code) (raw):
#pragma once
#include "SkShaper.h"
#include "unicode/ubrk.h"
#include "unicode/utext.h"
class FontRunIterator final: public SkShaper::FontRunIterator {
public:
FontRunIterator(const char* utf8,
size_t utf8Bytes,
const SkFont& font,
sk_sp<SkFontMgr> fallbackMgr,
const char* requestName,
SkFontStyle requestStyle,
const SkShaper::LanguageRunIterator* lang,
std::shared_ptr<UBreakIterator> graphemeIter,
bool approximateSpaces,
bool approximatePunctuation)
: fCurrent(utf8)
, fBegin(utf8)
, fEnd(fCurrent + utf8Bytes)
, fFallbackMgr(std::move(fallbackMgr))
, fFont(font)
, fFallbackFont(fFont)
, fCurrentFont(nullptr)
, fRequestName(requestName)
, fRequestStyle(requestStyle)
, fLanguage(lang)
, fGraphemeIter(graphemeIter)
, fApproximateSpaces(approximateSpaces)
, fApproximatePunctuation(approximatePunctuation)
{
fFont.setTypeface(font.refTypefaceOrDefault());
fFallbackFont.setTypeface(nullptr);
}
FontRunIterator(const char* utf8,
size_t utf8Bytes,
const SkFont& font,
sk_sp<SkFontMgr> fallbackMgr,
std::shared_ptr<UBreakIterator> graphemeIter,
bool approximateSpaces,
bool approximatePunctuation)
: FontRunIterator(utf8,
utf8Bytes,
font,
std::move(fallbackMgr),
nullptr,
font.refTypefaceOrDefault()->fontStyle(),
nullptr,
graphemeIter,
approximateSpaces,
approximatePunctuation) {
}
~FontRunIterator() {
}
void consume() override;
size_t endOfCurrentRun() const override {
return fCurrent - fBegin;
}
bool atEnd() const override {
return fCurrent == fEnd;
}
const SkFont& currentFont() const override {
return *fCurrentFont;
}
private:
char const * fCurrent;
char const * const fBegin;
char const * const fEnd;
sk_sp<SkFontMgr> const fFallbackMgr;
SkFont fFont;
SkFont fFallbackFont;
SkFont* fCurrentFont;
char const * const fRequestName;
SkFontStyle const fRequestStyle;
SkShaper::LanguageRunIterator const * const fLanguage;
std::shared_ptr<UBreakIterator> fGraphemeIter;
bool fApproximateSpaces;
bool fApproximatePunctuation;
};