• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 GrDrawContext_DEFINED
9 #define GrDrawContext_DEFINED
10 
11 #include "GrColor.h"
12 #include "GrRenderTarget.h"
13 #include "SkRefCnt.h"
14 #include "SkSurfaceProps.h"
15 #include "../private/GrSingleOwner.h"
16 
17 class GrAtlasTextContext;
18 class GrAuditTrail;
19 class GrClip;
20 class GrContext;
21 class GrDrawBatch;
22 class GrDrawPathBatchBase;
23 class GrDrawingManager;
24 class GrDrawTarget;
25 class GrPaint;
26 class GrPathProcessor;
27 class GrPipelineBuilder;
28 class GrRenderTarget;
29 class GrStrokeInfo;
30 class GrSurface;
31 class SkDrawFilter;
32 struct SkIPoint;
33 struct SkIRect;
34 class SkMatrix;
35 class SkPaint;
36 class SkPath;
37 struct SkPoint;
38 struct SkRect;
39 class SkRRect;
40 struct SkRSXform;
41 class SkTextBlob;
42 
43 /*
44  * A helper object to orchestrate draws
45  */
46 class SK_API GrDrawContext : public SkRefCnt {
47 public:
48     ~GrDrawContext() override;
49 
50     bool copySurface(GrSurface* src, const SkIRect& srcRect, const SkIPoint& dstPoint);
51 
52     // TODO: it is odd that we need both the SkPaint in the following 3 methods.
53     // We should extract the text parameters from SkPaint and pass them separately
54     // akin to GrStrokeInfo (GrTextInfo?)
55     virtual void drawText(const GrClip&,  const GrPaint&, const SkPaint&,
56                           const SkMatrix& viewMatrix, const char text[], size_t byteLength,
57                           SkScalar x, SkScalar y, const SkIRect& clipBounds);
58     virtual void drawPosText(const GrClip&, const GrPaint&, const SkPaint&,
59                              const SkMatrix& viewMatrix, const char text[], size_t byteLength,
60                              const SkScalar pos[], int scalarsPerPosition,
61                              const SkPoint& offset, const SkIRect& clipBounds);
62     virtual void drawTextBlob(const GrClip&, const SkPaint&,
63                               const SkMatrix& viewMatrix, const SkTextBlob*,
64                               SkScalar x, SkScalar y,
65                               SkDrawFilter*, const SkIRect& clipBounds);
66 
67     /**
68      * Provides a perfomance hint that the render target's contents are allowed
69      * to become undefined.
70      */
71     void discard();
72 
73     /**
74      * Clear the entire or rect of the render target, ignoring any clips.
75      * @param rect  the rect to clear or the whole thing if rect is NULL.
76      * @param color the color to clear to.
77      * @param canIgnoreRect allows partial clears to be converted to whole
78      *                      clears on platforms for which that is cheap
79      */
80     void clear(const SkIRect* rect, GrColor color, bool canIgnoreRect);
81 
82     /**
83      *  Draw everywhere (respecting the clip) with the paint.
84      */
85     void drawPaint(const GrClip&, const GrPaint&, const SkMatrix& viewMatrix);
86 
87     /**
88      *  Draw the rect using a paint.
89      *  @param paint        describes how to color pixels.
90      *  @param viewMatrix   transformation matrix
91      *  @param strokeInfo   the stroke information (width, join, cap), and.
92      *                      the dash information (intervals, count, phase).
93      *                      If strokeInfo == NULL, then the rect is filled.
94      *                      Otherwise, if stroke width == 0, then the stroke
95      *                      is always a single pixel thick, else the rect is
96      *                      mitered/beveled stroked based on stroke width.
97      *  The rects coords are used to access the paint (through texture matrix)
98      */
99     void drawRect(const GrClip&,
100                   const GrPaint& paint,
101                   const SkMatrix& viewMatrix,
102                   const SkRect&,
103                   const GrStrokeInfo* strokeInfo = NULL);
104 
105     /**
106      * Maps a rectangle of shader coordinates to a rectangle and fills that rectangle.
107      *
108      * @param paint         describes how to color pixels.
109      * @param viewMatrix    transformation matrix which applies to rectToDraw
110      * @param rectToDraw    the rectangle to draw
111      * @param localRect     the rectangle of shader coordinates applied to rectToDraw
112      */
113     void fillRectToRect(const GrClip&,
114                         const GrPaint& paint,
115                         const SkMatrix& viewMatrix,
116                         const SkRect& rectToDraw,
117                         const SkRect& localRect);
118 
119     /**
120      * Fills a rect with a paint and a localMatrix.
121      */
122     void fillRectWithLocalMatrix(const GrClip& clip,
123                                  const GrPaint& paint,
124                                  const SkMatrix& viewMatrix,
125                                  const SkRect& rect,
126                                  const SkMatrix& localMatrix);
127 
128     /**
129      *  Draw a roundrect using a paint.
130      *
131      *  @param paint        describes how to color pixels.
132      *  @param viewMatrix   transformation matrix
133      *  @param rrect        the roundrect to draw
134      *  @param strokeInfo   the stroke information (width, join, cap) and
135      *                      the dash information (intervals, count, phase).
136      */
137     void drawRRect(const GrClip&,
138                    const GrPaint&,
139                    const SkMatrix& viewMatrix,
140                    const SkRRect& rrect,
141                    const GrStrokeInfo&);
142 
143     /**
144      * Draws a path.
145      *
146      * @param paint         describes how to color pixels.
147      * @param viewMatrix    transformation matrix
148      * @param path          the path to draw
149      * @param strokeInfo    the stroke information (width, join, cap) and
150      *                      the dash information (intervals, count, phase).
151      */
152     void drawPath(const GrClip&,
153                   const GrPaint&,
154                   const SkMatrix& viewMatrix,
155                   const SkPath&,
156                   const GrStrokeInfo&);
157 
158     /**
159      * Draws vertices with a paint.
160      *
161      * @param   paint           describes how to color pixels.
162      * @param   viewMatrix      transformation matrix
163      * @param   primitiveType   primitives type to draw.
164      * @param   vertexCount     number of vertices.
165      * @param   positions       array of vertex positions, required.
166      * @param   texCoords       optional array of texture coordinates used
167      *                          to access the paint.
168      * @param   colors          optional array of per-vertex colors, supercedes
169      *                          the paint's color field.
170      * @param   indices         optional array of indices. If NULL vertices
171      *                          are drawn non-indexed.
172      * @param   indexCount      if indices is non-null then this is the
173      *                          number of indices.
174      */
175     void drawVertices(const GrClip&,
176                       const GrPaint& paint,
177                       const SkMatrix& viewMatrix,
178                       GrPrimitiveType primitiveType,
179                       int vertexCount,
180                       const SkPoint positions[],
181                       const SkPoint texs[],
182                       const GrColor colors[],
183                       const uint16_t indices[],
184                       int indexCount);
185 
186     /**
187      * Draws textured sprites from an atlas with a paint.
188      *
189      * @param   paint           describes how to color pixels.
190      * @param   viewMatrix      transformation matrix
191      * @param   spriteCount     number of sprites.
192      * @param   xform           array of compressed transformation data, required.
193      * @param   texRect         array of texture rectangles used to access the paint.
194      * @param   colors          optional array of per-sprite colors, supercedes
195      *                          the paint's color field.
196      */
197     void drawAtlas(const GrClip&,
198                    const GrPaint& paint,
199                    const SkMatrix& viewMatrix,
200                    int spriteCount,
201                    const SkRSXform xform[],
202                    const SkRect texRect[],
203                    const SkColor colors[]);
204 
205     /**
206      * Draws an oval.
207      *
208      * @param paint         describes how to color pixels.
209      * @param viewMatrix    transformation matrix
210      * @param oval          the bounding rect of the oval.
211      * @param strokeInfo    the stroke information (width, join, cap) and
212      *                      the dash information (intervals, count, phase).
213      */
214     void drawOval(const GrClip&,
215                   const GrPaint& paint,
216                   const SkMatrix& viewMatrix,
217                   const SkRect& oval,
218                   const GrStrokeInfo& strokeInfo);
219 
220     /**
221      *  Draw the image stretched differentially to fit into dst.
222      *  center is a rect within the image, and logically divides the image
223      *  into 9 sections (3x3). For example, if the middle pixel of a [5x5]
224      *  image is the "center", then the center-rect should be [2, 2, 3, 3].
225      *
226      *  If the dst is >= the image size, then...
227      *  - The 4 corners are not stretched at all.
228      *  - The sides are stretched in only one axis.
229      *  - The center is stretched in both axes.
230      * Else, for each axis where dst < image,
231      *  - The corners shrink proportionally
232      *  - The sides (along the shrink axis) and center are not drawn
233      */
234     void drawImageNine(const GrClip&,
235                        const GrPaint& paint,
236                        const SkMatrix& viewMatrix,
237                        int imageWidth,
238                        int imageHeight,
239                        const SkIRect& center,
240                        const SkRect& dst);
241 
242     /**
243      * Draws a batch
244      *
245      * @param paint    describes how to color pixels.
246      * @param batch    the batch to draw
247      */
248     void drawBatch(const GrClip&, const GrPaint&, GrDrawBatch*);
249 
250     /**
251      * Draws a path batch. This needs to be separate from drawBatch because we install path stencil
252      * settings late.
253      *
254      * TODO: Figure out a better model that allows us to roll this method into drawBatch.
255      */
256     void drawPathBatch(const GrPipelineBuilder&, GrDrawPathBatchBase*);
257 
width()258     int width() const { return fRenderTarget->width(); }
height()259     int height() const { return fRenderTarget->height(); }
numColorSamples()260     int numColorSamples() const { return fRenderTarget->numColorSamples(); }
261 
accessRenderTarget()262     GrRenderTarget* accessRenderTarget() { return fRenderTarget; }
263 
264     ///////////////////////////////////////////////////////////////////////////////////////////////
265     // Functions intended for internal use only.
266     void internal_drawBatch(const GrPipelineBuilder& pipelineBuilder, GrDrawBatch* batch);
267 
268 protected:
269     GrDrawContext(GrContext*, GrDrawingManager*, GrRenderTarget*,
270                   const SkSurfaceProps* surfaceProps, GrAuditTrail*, GrSingleOwner*);
271 
drawingManager()272     GrDrawingManager* drawingManager() { return fDrawingManager; }
auditTrail()273     GrAuditTrail* auditTrail() { return fAuditTrail; }
surfaceProps()274     const SkSurfaceProps& surfaceProps() const { return fSurfaceProps; }
275 
276     SkDEBUGCODE(GrSingleOwner* singleOwner() { return fSingleOwner; })
277     SkDEBUGCODE(void validate() const;)
278 
279 private:
280     friend class GrAtlasTextBlob; // for access to drawBatch
281     friend class GrDrawingManager; // for ctor
282 
283     void internalDrawPath(GrPipelineBuilder*,
284                           const SkMatrix& viewMatrix,
285                           GrColor,
286                           bool useAA,
287                           const SkPath&,
288                           const GrStrokeInfo&);
289 
290     // This entry point allows the GrTextContext-derived classes to add their batches to
291     // the drawTarget.
292     void drawBatch(GrPipelineBuilder* pipelineBuilder, GrDrawBatch* batch);
293 
294     GrDrawTarget* getDrawTarget();
295 
296     GrDrawingManager*                 fDrawingManager;
297     GrRenderTarget*                   fRenderTarget;
298 
299     // In MDB-mode the drawTarget can be closed by some other drawContext that has picked
300     // it up. For this reason, the drawTarget should only ever be accessed via 'getDrawTarget'.
301     GrDrawTarget*                     fDrawTarget;
302     SkAutoTDelete<GrAtlasTextContext> fAtlasTextContext;
303     GrContext*                        fContext;
304 
305     SkSurfaceProps                    fSurfaceProps;
306     GrAuditTrail*                     fAuditTrail;
307 
308     // In debug builds we guard against improper thread handling
309     SkDEBUGCODE(mutable GrSingleOwner* fSingleOwner;)
310 };
311 
312 #endif
313