* 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 "include/core/SkPaint.h"
#include "include/core/SkPoint.h"
#include "include/core/SkTypes.h"
#include "src/core/SkGlyph.h"
#include "src/core/SkSpan.h"
#include <memory>
class SkDescriptor;
class SkGlyph;
class SkMaskFilter;
class SkPathEffect;
class SkTypeface;
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;
};
struct SkGlyphPos {
size_t index;
const SkGlyph* glyph;
SkPoint position;
};
struct SkPathPos {
const SkPath* path;
SkPoint position;
};
class SkStrikeInterface {
public:
virtual ~SkStrikeInterface() = default;
virtual const SkDescriptor& getDescriptor() const = 0;
enum PreparationDetail {
kBoundsOnly,
kImageIfNeeded,
};
virtual SkSpan<const SkGlyphPos>
prepareForDrawingRemoveEmpty(const SkPackedGlyphID packedGlyphIDs[],
const SkPoint positions[],
size_t n,
int maxDimension,
PreparationDetail detail,
SkGlyphPos results[]) = 0;
virtual SkVector rounding() const = 0;
virtual SkIPoint subpixelMask() const = 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