Home | History | Annotate | Download | only in text
      1 /*
      2  * Copyright 2015 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 GrAtlasTextContext_DEFINED
      9 #define GrAtlasTextContext_DEFINED
     10 
     11 #include "GrAtlasTextBlob.h"
     12 #include "GrDistanceFieldAdjustTable.h"
     13 #include "GrGeometryProcessor.h"
     14 #include "GrTextUtils.h"
     15 #include "SkTextBlobRunIterator.h"
     16 
     17 #if GR_TEST_UTILS
     18 #include "GrDrawOpTest.h"
     19 #endif
     20 
     21 class GrDrawOp;
     22 class GrTextBlobCache;
     23 class SkGlyph;
     24 
     25 /*
     26  * Renders text using some kind of an atlas, ie BitmapText or DistanceField text
     27  */
     28 class GrAtlasTextContext {
     29 public:
     30     struct Options {
     31         /**
     32          * Below this size (in device space) distance field text will not be used. Negative means
     33          * use a default value.
     34          */
     35         SkScalar fMinDistanceFieldFontSize = -1.f;
     36         /**
     37          * Above this size (in device space) distance field text will not be used and glyphs will
     38          * be rendered from outline as individual paths. Negative means use a default value.
     39          */
     40         SkScalar fMaxDistanceFieldFontSize = -1.f;
     41         /** Forces all distance field vertices to use 3 components, not just when in perspective. */
     42         bool fDistanceFieldVerticesAlwaysHaveW = false;
     43     };
     44 
     45     static std::unique_ptr<GrAtlasTextContext> Make(const Options& options);
     46 
     47     bool canDraw(const GrAtlasGlyphCache* fontCache, const SkPaint&, const SkMatrix& viewMatrix,
     48                  const SkSurfaceProps&, const GrShaderCaps&);
     49 
     50     void drawText(GrContext*, GrTextUtils::Target*, const GrClip&, const SkPaint&,
     51                   const SkMatrix& viewMatrix, const SkSurfaceProps&, const char text[],
     52                   size_t byteLength, SkScalar x, SkScalar y, const SkIRect& regionClipBounds);
     53     void drawPosText(GrContext*, GrTextUtils::Target*, const GrClip&, const SkPaint&,
     54                      const SkMatrix& viewMatrix, const SkSurfaceProps&, const char text[],
     55                      size_t byteLength, const SkScalar pos[], int scalarsPerPosition,
     56                      const SkPoint& offset, const SkIRect& regionClipBounds);
     57     void drawTextBlob(GrContext*, GrTextUtils::Target*, const GrClip&, const SkPaint&,
     58                       const SkMatrix& viewMatrix, const SkSurfaceProps&, const SkTextBlob*,
     59                       SkScalar x, SkScalar y, SkDrawFilter*, const SkIRect& clipBounds);
     60 
     61 private:
     62     GrAtlasTextContext(const Options& options);
     63 
     64     // sets up the descriptor on the blob and returns a detached cache.  Client must attach
     65     static SkColor ComputeCanonicalColor(const SkPaint&, bool lcd);
     66     // Determines if we need to use fake gamma (and contrast boost):
     67     static SkScalerContextFlags ComputeScalerContextFlags(const GrColorSpaceInfo&);
     68     void regenerateTextBlob(GrAtlasTextBlob* bmp,
     69                             GrAtlasGlyphCache*,
     70                             const GrShaderCaps&,
     71                             const GrTextUtils::Paint&,
     72                             SkScalerContextFlags scalerContextFlags,
     73                             const SkMatrix& viewMatrix,
     74                             const SkSurfaceProps&,
     75                             const SkTextBlob* blob, SkScalar x, SkScalar y,
     76                             SkDrawFilter* drawFilter) const;
     77 
     78     static bool HasLCD(const SkTextBlob*);
     79 
     80     sk_sp<GrAtlasTextBlob> makeDrawTextBlob(GrTextBlobCache*, GrAtlasGlyphCache*,
     81                                             const GrShaderCaps&,
     82                                             const GrTextUtils::Paint&,
     83                                             SkScalerContextFlags scalerContextFlags,
     84                                             const SkMatrix& viewMatrix,
     85                                             const SkSurfaceProps&,
     86                                             const char text[], size_t byteLength,
     87                                             SkScalar x, SkScalar y) const;
     88 
     89     sk_sp<GrAtlasTextBlob> makeDrawPosTextBlob(GrTextBlobCache*, GrAtlasGlyphCache*,
     90                                                const GrShaderCaps&,
     91                                                const GrTextUtils::Paint&,
     92                                                SkScalerContextFlags scalerContextFlags,
     93                                                const SkMatrix& viewMatrix,
     94                                                const SkSurfaceProps&,
     95                                                const char text[], size_t byteLength,
     96                                                const SkScalar pos[],
     97                                                int scalarsPerPosition,
     98                                                const SkPoint& offset) const;
     99 
    100     // Functions for appending BMP text to GrAtlasTextBlob
    101     static void DrawBmpText(GrAtlasTextBlob*, int runIndex, GrAtlasGlyphCache*,
    102                             const SkSurfaceProps&, const GrTextUtils::Paint& paint,
    103                             SkScalerContextFlags scalerContextFlags, const SkMatrix& viewMatrix,
    104                             const char text[], size_t byteLength, SkScalar x, SkScalar y);
    105 
    106     static void DrawBmpPosText(GrAtlasTextBlob*, int runIndex, GrAtlasGlyphCache*,
    107                                const SkSurfaceProps&, const GrTextUtils::Paint& paint,
    108                                SkScalerContextFlags scalerContextFlags, const SkMatrix& viewMatrix,
    109                                const char text[], size_t byteLength, const SkScalar pos[],
    110                                int scalarsPerPosition, const SkPoint& offset,
    111                                SkScalar textRatio);
    112 
    113     // functions for appending distance field text
    114     bool canDrawAsDistanceFields(const SkPaint& skPaint, const SkMatrix& viewMatrix,
    115                                  const SkSurfaceProps& props, const GrShaderCaps& caps) const;
    116 
    117     void drawDFText(GrAtlasTextBlob* blob, int runIndex, GrAtlasGlyphCache*, const SkSurfaceProps&,
    118                     const GrTextUtils::Paint& paint, SkScalerContextFlags scalerContextFlags,
    119                     const SkMatrix& viewMatrix, const char text[], size_t byteLength, SkScalar x,
    120                     SkScalar y) const;
    121 
    122     void drawDFPosText(GrAtlasTextBlob* blob, int runIndex, GrAtlasGlyphCache*,
    123                        const SkSurfaceProps&, const GrTextUtils::Paint& paint,
    124                        SkScalerContextFlags scalerContextFlags,
    125                        const SkMatrix& viewMatrix, const char text[],
    126                        size_t byteLength, const SkScalar pos[], int scalarsPerPosition,
    127                        const SkPoint& offset) const;
    128 
    129     void initDistanceFieldPaint(GrAtlasTextBlob* blob,
    130                                 SkPaint* skPaint,
    131                                 SkScalar* textRatio,
    132                                 const SkMatrix& viewMatrix) const;
    133 
    134     static void BmpAppendGlyph(GrAtlasTextBlob*, int runIndex, GrAtlasGlyphCache*,
    135                                GrAtlasTextStrike**, const SkGlyph&, SkScalar sx, SkScalar sy,
    136                                GrColor color, SkGlyphCache*, SkScalar textRatio);
    137 
    138     static void DfAppendGlyph(GrAtlasTextBlob*, int runIndex, GrAtlasGlyphCache*,
    139                               GrAtlasTextStrike**, const SkGlyph&, SkScalar sx, SkScalar sy,
    140                               GrColor color, SkGlyphCache* cache, SkScalar textRatio);
    141 
    142     const GrDistanceFieldAdjustTable* dfAdjustTable() const { return fDistanceAdjustTable.get(); }
    143 
    144     sk_sp<const GrDistanceFieldAdjustTable> fDistanceAdjustTable;
    145 
    146     SkScalar fMinDistanceFieldFontSize;
    147     SkScalar fMaxDistanceFieldFontSize;
    148     bool fDistanceFieldVerticesAlwaysHaveW;
    149 
    150 #if GR_TEST_UTILS
    151     static const SkScalerContextFlags kTextBlobOpScalerContextFlags =
    152             SkScalerContextFlags::kFakeGammaAndBoostContrast;
    153     GR_DRAW_OP_TEST_FRIEND(GrAtlasTextOp);
    154 #endif
    155 };
    156 
    157 #endif
    158