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