LCOV - code coverage report
Current view: top level - gfx/skia/skia/src/gpu/text - GrStencilAndCoverTextContext.h (source / functions) Hit Total Coverage
Test: output.info Lines: 0 17 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 9 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :  * Copyright 2014 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 GrStencilAndCoverTextContext_DEFINED
       9             : #define GrStencilAndCoverTextContext_DEFINED
      10             : 
      11             : #include "GrRenderTargetContext.h"
      12             : #include "GrStyle.h"
      13             : #include "SkDrawFilter.h"
      14             : #include "SkOpts.h"
      15             : #include "SkTHash.h"
      16             : #include "SkTInternalLList.h"
      17             : #include "SkTLList.h"
      18             : #include "SkTextBlob.h"
      19             : #include "ops/GrDrawPathOp.h"
      20             : 
      21             : class GrAtlasTextContext;
      22             : class GrTextStrike;
      23             : class GrPath;
      24             : class SkSurfaceProps;
      25             : 
      26             : /*
      27             :  * This class implements text rendering using stencil and cover path rendering
      28             :  * (by the means of GrOpList::drawPath).
      29             :  */
      30             : class GrStencilAndCoverTextContext {
      31             : public:
      32             :     static GrStencilAndCoverTextContext* Create(GrAtlasTextContext* fallbackTextContext);
      33             : 
      34             :     void drawText(GrContext*, GrRenderTargetContext* rtc, const GrClip&, const SkPaint&,
      35             :                   const SkMatrix& viewMatrix, const SkSurfaceProps&, const char text[],
      36             :                   size_t byteLength, SkScalar x, SkScalar y, const SkIRect& clipBounds);
      37             :     void drawPosText(GrContext*, GrRenderTargetContext*, const GrClip&, const SkPaint&,
      38             :                      const SkMatrix& viewMatrix, const SkSurfaceProps&, const char text[],
      39             :                      size_t byteLength, const SkScalar pos[], int scalarsPerPosition,
      40             :                      const SkPoint& offset, const SkIRect& clipBounds);
      41             :     void drawTextBlob(GrContext*, GrRenderTargetContext*, const GrClip&, const SkPaint&,
      42             :                       const SkMatrix& viewMatrix, const SkSurfaceProps&, const SkTextBlob*,
      43             :                       SkScalar x, SkScalar y,
      44             :                       SkDrawFilter*, const SkIRect& clipBounds);
      45             : 
      46             :     virtual ~GrStencilAndCoverTextContext();
      47             : 
      48             : private:
      49             :     GrStencilAndCoverTextContext(GrAtlasTextContext* fallbackTextContext);
      50             : 
      51           0 :     bool canDraw(const SkPaint& skPaint, const SkMatrix&) {
      52           0 :         return this->internalCanDraw(skPaint);
      53             :     }
      54             : 
      55             :     bool internalCanDraw(const SkPaint&);
      56             : 
      57             :     void uncachedDrawTextBlob(GrContext*, GrRenderTargetContext* rtc,
      58             :                               const GrClip& clip, const SkPaint& skPaint,
      59             :                               const SkMatrix& viewMatrix,
      60             :                               const SkSurfaceProps&,
      61             :                               const SkTextBlob* blob,
      62             :                               SkScalar x, SkScalar y,
      63             :                               SkDrawFilter* drawFilter,
      64             :                               const SkIRect& clipBounds);
      65             : 
      66             :     class FallbackBlobBuilder;
      67             : 
      68             :     class TextRun {
      69             :     public:
      70             :         TextRun(const SkPaint& fontAndStroke);
      71             :         ~TextRun();
      72             : 
      73             :         void setText(const char text[], size_t byteLength, SkScalar x, SkScalar y);
      74             : 
      75             :         void setPosText(const char text[], size_t byteLength, const SkScalar pos[],
      76             :                         int scalarsPerPosition, const SkPoint& offset);
      77             : 
      78             :         void draw(GrContext*, GrRenderTargetContext*, const GrClip&, const SkMatrix&,
      79             :                   const SkSurfaceProps&, SkScalar x, SkScalar y, const SkIRect& clipBounds,
      80             :                   GrAtlasTextContext* fallbackTextContext, const SkPaint& originalSkPaint) const;
      81             : 
      82             :         void releaseGlyphCache() const;
      83             : 
      84             :         size_t computeSizeInCache() const;
      85             : 
      86           0 :         GrAA aa() const { return fFont.isAntiAlias() ? GrAA::kYes : GrAA::kNo; }
      87             : 
      88             :     private:
      89             :         typedef GrDrawPathRangeOp::InstanceData InstanceData;
      90             : 
      91             :         SkGlyphCache* getGlyphCache() const;
      92             :         GrPathRange* createGlyphs(GrResourceProvider*) const;
      93             :         void appendGlyph(const SkGlyph&, const SkPoint&, FallbackBlobBuilder*);
      94             : 
      95             :         GrStyle                         fStyle;
      96             :         SkPaint                         fFont;
      97             :         SkScalar                        fTextRatio;
      98             :         float                           fTextInverseRatio;
      99             :         bool                            fUsingRawGlyphPaths;
     100             :         GrUniqueKey                     fGlyphPathsKey;
     101             :         int                             fTotalGlyphCount;
     102             :         sk_sp<InstanceData>             fInstanceData;
     103             :         int                             fFallbackGlyphCount;
     104             :         sk_sp<SkTextBlob>               fFallbackTextBlob;
     105             :         mutable SkGlyphCache*           fDetachedGlyphCache;
     106             :         mutable GrGpuResource::UniqueID fLastDrawnGlyphsID;
     107             :     };
     108             : 
     109             :     // Text blobs/caches.
     110             : 
     111           0 :     class TextBlob : public SkTLList<TextRun, 1> {
     112             :     public:
     113             :         typedef SkTArray<uint32_t, true> Key;
     114             : 
     115           0 :         static const Key& GetKey(const TextBlob* blob) { return blob->key(); }
     116             : 
     117           0 :         static uint32_t Hash(const Key& key) {
     118           0 :             SkASSERT(key.count() > 1); // 1-length keys should be using the blob-id hash map.
     119           0 :             return SkOpts::hash(key.begin(), sizeof(uint32_t) * key.count());
     120             :         }
     121             : 
     122           0 :         TextBlob(uint32_t blobId, const SkTextBlob* skBlob, const SkPaint& skPaint)
     123           0 :             : fKey(&blobId, 1) { this->init(skBlob, skPaint); }
     124             : 
     125           0 :         TextBlob(const Key& key, const SkTextBlob* skBlob, const SkPaint& skPaint)
     126           0 :             : fKey(key) {
     127             :             // 1-length keys are unterstood to be the blob id and must use the other constructor.
     128           0 :             SkASSERT(fKey.count() > 1);
     129           0 :             this->init(skBlob, skPaint);
     130           0 :         }
     131             : 
     132           0 :         const Key& key() const { return fKey; }
     133             : 
     134           0 :         size_t cpuMemorySize() const { return fCpuMemorySize; }
     135             : 
     136             :     private:
     137             :         void init(const SkTextBlob*, const SkPaint&);
     138             : 
     139             :         const SkSTArray<1, uint32_t, true>   fKey;
     140             :         size_t                               fCpuMemorySize;
     141             : 
     142             :         SK_DECLARE_INTERNAL_LLIST_INTERFACE(TextBlob);
     143             :     };
     144             : 
     145             :     const TextBlob& findOrCreateTextBlob(const SkTextBlob*, const SkPaint&);
     146             :     void purgeToFit(const TextBlob&);
     147             : 
     148             :     GrAtlasTextContext*                                       fFallbackTextContext;
     149             :     SkTHashMap<uint32_t, TextBlob*>                           fBlobIdCache;
     150             :     SkTHashTable<TextBlob*, const TextBlob::Key&, TextBlob>   fBlobKeyCache;
     151             :     SkTInternalLList<TextBlob>                                fLRUList;
     152             :     size_t                                                    fCacheSize;
     153             : };
     154             : 
     155             : #endif

Generated by: LCOV version 1.13