Home | History | Annotate | Download | only in core
      1 /*
      2  * Copyright 2018 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 SkRemoteGlyphCacheImpl_DEFINED
      9 #define SkRemoteGlyphCacheImpl_DEFINED
     10 
     11 #include "SkArenaAlloc.h"
     12 #include "SkDescriptor.h"
     13 #include "SkGlyphRun.h"
     14 #include "SkGlyphRunPainter.h"
     15 #include "SkRemoteGlyphCache.h"
     16 
     17 class SkStrikeServer::SkGlyphCacheState : public SkStrikeInterface {
     18 public:
     19     // N.B. SkGlyphCacheState is not valid until ensureScalerContext is called.
     20     SkGlyphCacheState(const SkDescriptor& descriptor,
     21                       std::unique_ptr<SkScalerContext> context,
     22                       SkDiscardableHandleId discardableHandleId);
     23     ~SkGlyphCacheState() override;
     24 
     25     void addGlyph(SkPackedGlyphID, bool pathOnly);
     26     void writePendingGlyphs(Serializer* serializer);
     27     SkDiscardableHandleId discardableHandleId() const { return fDiscardableHandleId; }
     28 
     29     bool isSubpixel() const { return fIsSubpixel; }
     30     SkAxisAlignment axisAlignmentForHText() const { return fAxisAlignmentForHText; }
     31 
     32     const SkDescriptor& getDescriptor() const override {
     33         return *fDescriptor.getDesc();
     34     }
     35 
     36     SkStrikeSpec strikeSpec() const override {
     37         return SkStrikeSpec(this->getDescriptor(), *fTypeface, fEffects);
     38     }
     39 
     40     void setTypefaceAndEffects(const SkTypeface* typeface, SkScalerContextEffects effects);
     41 
     42     SkVector rounding() const override;
     43 
     44     const SkGlyph& getGlyphMetrics(SkGlyphID glyphID, SkPoint position) override;
     45 
     46     int glyphMetrics(const SkGlyphID[], const SkPoint[], int n, SkGlyphPos result[]) override;
     47 
     48     bool decideCouldDrawFromPath(const SkGlyph& glyph) override;
     49 
     50     void onAboutToExitScope() override {}
     51 
     52 private:
     53     bool hasPendingGlyphs() const {
     54         return !fPendingGlyphImages.empty() || !fPendingGlyphPaths.empty();
     55     }
     56     void writeGlyphPath(const SkPackedGlyphID& glyphID, Serializer* serializer) const;
     57 
     58     void ensureScalerContext();
     59     void resetScalerContext();
     60 
     61     // The set of glyphs cached on the remote client.
     62     SkTHashSet<SkPackedGlyphID> fCachedGlyphImages;
     63     SkTHashSet<SkPackedGlyphID> fCachedGlyphPaths;
     64 
     65     // The set of glyphs which has not yet been serialized and sent to the
     66     // remote client.
     67     std::vector<SkPackedGlyphID> fPendingGlyphImages;
     68     std::vector<SkPackedGlyphID> fPendingGlyphPaths;
     69 
     70     const SkAutoDescriptor fDescriptor;
     71 
     72     const SkDiscardableHandleId fDiscardableHandleId;
     73 
     74     // Values saved from the initial context.
     75     const bool fIsSubpixel;
     76     const SkAxisAlignment fAxisAlignmentForHText;
     77 
     78     // The context built using fDescriptor
     79     std::unique_ptr<SkScalerContext> fContext;
     80 
     81     // These fields are set everytime getOrCreateCache. This allows the code to maintain the
     82     // fContext as lazy as possible.
     83     const SkTypeface* fTypeface{nullptr};
     84     SkScalerContextEffects fEffects;
     85 
     86     class GlyphMapHashTraits {
     87     public:
     88         static SkPackedGlyphID GetKey(const SkGlyph* glyph) {
     89             return glyph->getPackedID();
     90         }
     91         static uint32_t Hash(SkPackedGlyphID glyphId) {
     92             return glyphId.hash();
     93         }
     94     };
     95 
     96     // FallbackTextHelper cases require glyph metrics when analyzing a glyph run, in which case
     97     // we cache them here.
     98     SkTHashTable<SkGlyph*, SkPackedGlyphID, GlyphMapHashTraits> fGlyphMap;
     99 
    100     SkArenaAlloc fAlloc{256};
    101 };
    102 
    103 class SkTextBlobCacheDiffCanvas::TrackLayerDevice : public SkNoPixelsDevice {
    104 public:
    105     TrackLayerDevice(const SkIRect& bounds, const SkSurfaceProps& props, SkStrikeServer* server,
    106                      sk_sp<SkColorSpace> colorSpace,
    107                      const SkTextBlobCacheDiffCanvas::Settings& settings);
    108 
    109     SkBaseDevice* onCreateDevice(const CreateInfo& cinfo, const SkPaint*) override;
    110 
    111 protected:
    112     void drawGlyphRunList(const SkGlyphRunList& glyphRunList) override;
    113 
    114 private:
    115     SkStrikeServer* const fStrikeServer;
    116     const SkTextBlobCacheDiffCanvas::Settings fSettings;
    117     SkGlyphRunListPainter fPainter;
    118 };
    119 
    120 #endif // SkRemoteGlyphCacheImpl_DEFINED
    121