Home | History | Annotate | Download | only in core
      1 /*
      2  * Copyright 2019 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #ifndef SkStrikeInterface_DEFINED
      9 #define SkStrikeInterface_DEFINED
     10 
     11 #include <memory>
     12 
     13 #include "SkPoint.h"
     14 #include "SkSpan.h"
     15 #include "SkTypes.h"
     16 
     17 class SkDescriptor;
     18 class SkGlyph;
     19 class SkMaskFilter;
     20 class SkPathEffect;
     21 class SkTypeface;
     22 
     23 // TODO: rename SkScalerContextEffects -> SkStrikeEffects
     24 struct SkScalerContextEffects {
     25     SkScalerContextEffects() : fPathEffect(nullptr), fMaskFilter(nullptr) {}
     26     SkScalerContextEffects(SkPathEffect* pe, SkMaskFilter* mf)
     27             : fPathEffect(pe), fMaskFilter(mf) {}
     28     explicit SkScalerContextEffects(const SkPaint& paint)
     29             : fPathEffect(paint.getPathEffect())
     30             , fMaskFilter(paint.getMaskFilter()) {}
     31 
     32     SkPathEffect*   fPathEffect;
     33     SkMaskFilter*   fMaskFilter;
     34 };
     35 
     36 class SkStrikeSpec {
     37 public:
     38     SkStrikeSpec(const SkDescriptor& desc,
     39                  const SkTypeface& typeface,
     40                  const SkScalerContextEffects& effects)
     41             : fDesc{desc}
     42             , fTypeface{typeface}
     43             , fEffects{effects} {}
     44 
     45     const SkDescriptor& desc() const { return fDesc; }
     46     const SkTypeface& typeface() const { return fTypeface; }
     47     SkScalerContextEffects effects() const {return fEffects; }
     48 
     49 private:
     50     const SkDescriptor& fDesc;
     51     const SkTypeface& fTypeface;
     52     const SkScalerContextEffects fEffects;
     53 };
     54 
     55 struct SkGlyphPos {
     56     const SkGlyph* glyph;
     57     SkPoint position;
     58 };
     59 
     60 struct SkPathPos {
     61     const SkPath* path;
     62     SkPoint position;
     63 };
     64 
     65 class SkStrikeInterface {
     66 public:
     67     virtual ~SkStrikeInterface() = default;
     68     virtual SkVector rounding() const = 0;
     69     virtual const SkDescriptor& getDescriptor() const = 0;
     70     virtual SkStrikeSpec strikeSpec() const = 0;
     71 
     72     // glyphMetrics writes its results to result, but only returns a subspan of result.
     73     virtual int glyphMetrics(const SkGlyphID[], const SkPoint[], int n, SkGlyphPos result[]) = 0;
     74     virtual const SkGlyph& getGlyphMetrics(SkGlyphID glyphID, SkPoint position) = 0;
     75     virtual bool decideCouldDrawFromPath(const SkGlyph& glyph) = 0;
     76     virtual void onAboutToExitScope() = 0;
     77 
     78     struct Deleter {
     79         void operator()(SkStrikeInterface* ptr) const {
     80             ptr->onAboutToExitScope();
     81         }
     82     };
     83 };
     84 
     85 using SkScopedStrike = std::unique_ptr<SkStrikeInterface, SkStrikeInterface::Deleter>;
     86 
     87 class SkStrikeCacheInterface {
     88 public:
     89     virtual ~SkStrikeCacheInterface() = default;
     90     virtual SkScopedStrike findOrCreateScopedStrike(const SkDescriptor& desc,
     91                                                     const SkScalerContextEffects& effects,
     92                                                     const SkTypeface& typeface) = 0;
     93 };
     94 
     95 #endif  //SkStrikeInterface_DEFINED
     96