123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- /*
- * 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;
- // 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;
- };
- 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,
- };
- // prepareForDrawing takes glyphIDs, and position, and returns a list of SkGlyphs and
- // positions where all the data to draw the glyph has been created. The maxDimension
- // parameter determines if the mask/SDF version will be created, or an alternate drawing
- // format should be used. For path-only drawing set maxDimension to 0, and for bitmap-device
- // drawing (where there is no upper limit to the glyph in the cache) use INT_MAX.
- // * PreparationDetail determines, in the mask case, if the mask/SDF should be generated.
- // This does not affect the path or fallback cases.
- virtual SkSpan<const SkGlyphPos>
- prepareForDrawing(const SkPackedGlyphID packedGlyphIDs[],
- const SkPoint positions[],
- size_t n,
- int maxDimension,
- PreparationDetail detail,
- SkGlyphPos results[]) = 0;
- // rounding() and subpixelMask are used to calculate the subpixel position of a glyph.
- // The per component (x or y) calculation is:
- //
- // subpixelOffset = (floor((viewportPosition + rounding) & mask) >> 14) & 3
- //
- // where mask is either 0 or ~0, and rounding is either
- // 1/2 for non-subpixel or 1/8 for subpixel.
- virtual SkVector rounding() const = 0;
- virtual SkIPoint subpixelMask() const = 0;
- // Used with SkScopedStrike to take action at the end of a scope.
- 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
|