/*
|
* Copyright 2019 Google Inc.
|
*
|
* Use of this source code is governed by a BSD-style license that can be
|
* found in the LICENSE file.
|
*/
|
|
#ifndef SkStrikeInterface_DEFINED
|
#define SkStrikeInterface_DEFINED
|
|
#include <memory>
|
|
#include "SkPoint.h"
|
#include "SkSpan.h"
|
#include "SkTypes.h"
|
|
class SkDescriptor;
|
class SkGlyph;
|
class SkMaskFilter;
|
class SkPathEffect;
|
class SkTypeface;
|
|
// TODO: rename SkScalerContextEffects -> SkStrikeEffects
|
struct SkScalerContextEffects {
|
SkScalerContextEffects() : fPathEffect(nullptr), fMaskFilter(nullptr) {}
|
SkScalerContextEffects(SkPathEffect* pe, SkMaskFilter* mf)
|
: fPathEffect(pe), fMaskFilter(mf) {}
|
explicit SkScalerContextEffects(const SkPaint& paint)
|
: fPathEffect(paint.getPathEffect())
|
, fMaskFilter(paint.getMaskFilter()) {}
|
|
SkPathEffect* fPathEffect;
|
SkMaskFilter* fMaskFilter;
|
};
|
|
class SkStrikeSpec {
|
public:
|
SkStrikeSpec(const SkDescriptor& desc,
|
const SkTypeface& typeface,
|
const SkScalerContextEffects& effects)
|
: fDesc{desc}
|
, fTypeface{typeface}
|
, fEffects{effects} {}
|
|
const SkDescriptor& desc() const { return fDesc; }
|
const SkTypeface& typeface() const { return fTypeface; }
|
SkScalerContextEffects effects() const {return fEffects; }
|
|
private:
|
const SkDescriptor& fDesc;
|
const SkTypeface& fTypeface;
|
const SkScalerContextEffects fEffects;
|
};
|
|
struct SkGlyphPos {
|
const SkGlyph* glyph;
|
SkPoint position;
|
};
|
|
struct SkPathPos {
|
const SkPath* path;
|
SkPoint position;
|
};
|
|
class SkStrikeInterface {
|
public:
|
virtual ~SkStrikeInterface() = default;
|
virtual SkVector rounding() const = 0;
|
virtual const SkDescriptor& getDescriptor() const = 0;
|
virtual SkStrikeSpec strikeSpec() const = 0;
|
|
// glyphMetrics writes its results to result, but only returns a subspan of result.
|
virtual int glyphMetrics(const SkGlyphID[], const SkPoint[], int n, SkGlyphPos result[]) = 0;
|
virtual const SkGlyph& getGlyphMetrics(SkGlyphID glyphID, SkPoint position) = 0;
|
virtual bool decideCouldDrawFromPath(const SkGlyph& glyph) = 0;
|
virtual void onAboutToExitScope() = 0;
|
|
struct Deleter {
|
void operator()(SkStrikeInterface* ptr) const {
|
ptr->onAboutToExitScope();
|
}
|
};
|
};
|
|
using SkScopedStrike = std::unique_ptr<SkStrikeInterface, SkStrikeInterface::Deleter>;
|
|
class SkStrikeCacheInterface {
|
public:
|
virtual ~SkStrikeCacheInterface() = default;
|
virtual SkScopedStrike findOrCreateScopedStrike(const SkDescriptor& desc,
|
const SkScalerContextEffects& effects,
|
const SkTypeface& typeface) = 0;
|
};
|
|
#endif //SkStrikeInterface_DEFINED
|