| /* |
| * 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 |