• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 GrPathRendering_DEFINED
9 #define GrPathRendering_DEFINED
10 
11 #include "SkPath.h"
12 #include "GrPathRange.h"
13 #include "GrPipeline.h"
14 
15 class SkDescriptor;
16 class SkTypeface;
17 class GrGpu;
18 class GrPath;
19 class GrStencilSettings;
20 class GrStyle;
21 
22 /**
23  * Abstract class wrapping HW path rendering API.
24  *
25  * The subclasses of this class use the possible HW API to render paths (as opposed to path
26  * rendering implemented in Skia on top of a "3d" HW API).
27  * The subclasses hold the global state needed to render paths, including shadow of the global HW
28  * API state. Similar to GrGpu.
29  *
30  * It is expected that the lifetimes of GrGpuXX and GrXXPathRendering are the same. The call context
31  * interface (eg.  * the concrete instance of GrGpu subclass) should be provided to the instance
32  * during construction.
33  */
34 class GrPathRendering {
35 public:
~GrPathRendering()36     virtual ~GrPathRendering() { }
37 
38     typedef GrPathRange::PathIndexType PathIndexType;
39 
40     enum PathTransformType {
41         kNone_PathTransformType,        //!< []
42         kTranslateX_PathTransformType,  //!< [kMTransX]
43         kTranslateY_PathTransformType,  //!< [kMTransY]
44         kTranslate_PathTransformType,   //!< [kMTransX, kMTransY]
45         kAffine_PathTransformType,      //!< [kMScaleX, kMSkewX, kMTransX, kMSkewY, kMScaleY, kMTransY]
46 
47         kLast_PathTransformType = kAffine_PathTransformType
48     };
49 
PathTransformSize(PathTransformType type)50     static inline int PathTransformSize(PathTransformType type) {
51         switch (type) {
52             case kNone_PathTransformType:
53                 return 0;
54             case kTranslateX_PathTransformType:
55             case kTranslateY_PathTransformType:
56                 return 1;
57             case kTranslate_PathTransformType:
58                 return 2;
59             case kAffine_PathTransformType:
60                 return 6;
61 
62             default:
63                 SkFAIL("Unknown path transform type");
64                 return 0;
65         }
66     }
67 
68     // No native support for inverse at this time
69     enum FillType {
70         /** Specifies that "inside" is computed by a non-zero sum of signed
71             edge crossings
72         */
73         kWinding_FillType,
74         /** Specifies that "inside" is computed by an odd number of edge
75             crossings
76         */
77         kEvenOdd_FillType,
78     };
79 
80     static const GrUserStencilSettings& GetStencilPassSettings(FillType);
81 
82     /**
83      * Creates a new gpu path, based on the specified path and stroke and returns it.
84      *
85      * @param SkPath    the geometry.
86      * @param GrStyle   the style applied to the path. Styles with non-dash path effects are not
87      *                  allowed.
88      * @return a new GPU path object.
89      */
90     virtual sk_sp<GrPath> createPath(const SkPath&, const GrStyle&) = 0;
91 
92     /**
93      * Creates a range of gpu paths with a common style.
94      *
95      * @param PathGenerator class that generates SkPath objects for each path in the range.
96      * @param GrStyle   the common style applied to each path in the range. Styles with non-dash
97      *                  path effects are not allowed.
98      * @return a new path range.
99      */
100     virtual sk_sp<GrPathRange> createPathRange(GrPathRange::PathGenerator*, const GrStyle&) = 0;
101 
102     /**
103      * Creates a range of glyph paths, indexed by glyph id. The glyphs will have an
104      * inverted y-direction in order to match the raw font path data.
105      *
106      * @param SkTypeface   Typeface that defines the glyphs.
107      *                     If null, the default typeface will be used.
108      *
109      * @param SkDescriptor Additional font configuration that specifies the font's size,
110      *                     stroke, and other flags. This will generally come from an
111      *                     SkGlyphCache.
112      *
113      *                     It is recommended to leave this value null when possible, in
114      *                     which case the glyphs will be loaded directly from the font's
115      *                     raw path data and sized at SkPaint::kCanonicalTextSizeForPaths.
116      *                     This will result in less memory usage and more efficient paths.
117      *
118      *                     If non-null, the glyph paths will match the font descriptor,
119      *                     including with the stroke information baked directly into
120      *                     the outlines.
121      *
122      * @param GrStyle      Common style that the GPU will apply to every path. Note that
123      *                     if the glyph outlines contain baked-in styles from the font
124      *                     descriptor, the GPU style will be applied on top of those
125      *                     outlines.
126      *
127      * @return a new path range populated with glyphs.
128      */
129     sk_sp<GrPathRange> createGlyphs(const SkTypeface*, const SkScalerContextEffects&,
130                                     const SkDescriptor*, const GrStyle&);
131 
132     /** None of these params are optional, pointers used just to avoid making copies. */
133     struct StencilPathArgs {
StencilPathArgsStencilPathArgs134         StencilPathArgs(bool useHWAA,
135                         GrRenderTarget* renderTarget,
136                         const SkMatrix* viewMatrix,
137                         const GrScissorState* scissor,
138                         const GrStencilSettings* stencil)
139             : fUseHWAA(useHWAA)
140             , fRenderTarget(renderTarget)
141             , fViewMatrix(viewMatrix)
142             , fScissor(scissor)
143             , fStencil(stencil) {
144         }
145         bool fUseHWAA;
146         GrRenderTarget* fRenderTarget;
147         const SkMatrix* fViewMatrix;
148         const GrScissorState* fScissor;
149         const GrStencilSettings* fStencil;
150     };
151 
152     void stencilPath(const StencilPathArgs& args, const GrPath* path);
153 
154     void drawPath(const GrPipeline& pipeline,
155                   const GrPrimitiveProcessor& primProc,
156                   const GrStencilSettings& stencilPassSettings, // Cover pass settings in pipeline.
157                   const GrPath* path);
158 
159     void drawPaths(const GrPipeline& pipeline,
160                    const GrPrimitiveProcessor& primProc,
161                    const GrStencilSettings& stencilPassSettings, // Cover pass settings in pipeline.
162                    const GrPathRange* pathRange,
163                    const void* indices,
164                    PathIndexType indexType,
165                    const float transformValues[],
166                    PathTransformType transformType,
167                    int count);
168 
169 protected:
GrPathRendering(GrGpu * gpu)170     GrPathRendering(GrGpu* gpu) : fGpu(gpu) { }
171 
172     virtual void onStencilPath(const StencilPathArgs&, const GrPath*) = 0;
173     virtual void onDrawPath(const GrPipeline&,
174                             const GrPrimitiveProcessor&,
175                             const GrStencilSettings&,
176                             const GrPath*) = 0;
177     virtual void onDrawPaths(const GrPipeline&,
178                              const GrPrimitiveProcessor&,
179                              const GrStencilSettings&,
180                              const GrPathRange*,
181                              const void* indices,
182                              PathIndexType,
183                              const float transformValues[],
184                              PathTransformType,
185                              int count) = 0;
186 
187     GrGpu* fGpu;
188 private:
189     GrPathRendering& operator=(const GrPathRendering&);
190 };
191 
192 #endif
193