|
1 /* |
|
2 * Copyright 2012 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 GrSWMaskHelper_DEFINED |
|
9 #define GrSWMaskHelper_DEFINED |
|
10 |
|
11 #include "GrColor.h" |
|
12 #include "GrDrawState.h" |
|
13 #include "SkBitmap.h" |
|
14 #include "SkDraw.h" |
|
15 #include "SkMatrix.h" |
|
16 #include "SkRasterClip.h" |
|
17 #include "SkRegion.h" |
|
18 #include "SkTypes.h" |
|
19 |
|
20 class GrAutoScratchTexture; |
|
21 class GrContext; |
|
22 class GrTexture; |
|
23 class SkPath; |
|
24 class SkStrokeRec; |
|
25 class GrDrawTarget; |
|
26 |
|
27 /** |
|
28 * The GrSWMaskHelper helps generate clip masks using the software rendering |
|
29 * path. It is intended to be used as: |
|
30 * |
|
31 * GrSWMaskHelper helper(context); |
|
32 * helper.init(...); |
|
33 * |
|
34 * draw one or more paths/rects specifying the required boolean ops |
|
35 * |
|
36 * toTexture(); // to get it from the internal bitmap to the GPU |
|
37 * |
|
38 * The result of this process will be the final mask (on the GPU) in the |
|
39 * upper left hand corner of the texture. |
|
40 */ |
|
41 class GrSWMaskHelper : public SkNoncopyable { |
|
42 public: |
|
43 GrSWMaskHelper(GrContext* context) |
|
44 : fContext(context) { |
|
45 } |
|
46 |
|
47 // set up the internal state in preparation for draws. Since many masks |
|
48 // may be accumulated in the helper during creation, "resultBounds" |
|
49 // allows the caller to specify the region of interest - to limit the |
|
50 // amount of work. |
|
51 bool init(const SkIRect& resultBounds, const SkMatrix* matrix); |
|
52 |
|
53 // Draw a single rect into the accumulation bitmap using the specified op |
|
54 void draw(const SkRect& rect, SkRegion::Op op, |
|
55 bool antiAlias, uint8_t alpha); |
|
56 |
|
57 // Draw a single path into the accumuation bitmap using the specified op |
|
58 void draw(const SkPath& path, const SkStrokeRec& stroke, SkRegion::Op op, |
|
59 bool antiAlias, uint8_t alpha); |
|
60 |
|
61 // Helper function to get a scratch texture suitable for capturing the |
|
62 // result (i.e., right size & format) |
|
63 bool getTexture(GrAutoScratchTexture* texture); |
|
64 |
|
65 // Move the mask generation results from the internal bitmap to the gpu. |
|
66 void toTexture(GrTexture* texture); |
|
67 |
|
68 // Reset the internal bitmap |
|
69 void clear(uint8_t alpha) { |
|
70 fBM.eraseColor(SkColorSetARGB(alpha, alpha, alpha, alpha)); |
|
71 } |
|
72 |
|
73 // Canonical usage utility that draws a single path and uploads it |
|
74 // to the GPU. The result is returned in "result". |
|
75 static GrTexture* DrawPathMaskToTexture(GrContext* context, |
|
76 const SkPath& path, |
|
77 const SkStrokeRec& stroke, |
|
78 const SkIRect& resultBounds, |
|
79 bool antiAlias, |
|
80 SkMatrix* matrix); |
|
81 |
|
82 // This utility routine is used to add a path's mask to some other draw. |
|
83 // The ClipMaskManager uses it to accumulate clip masks while the |
|
84 // GrSoftwarePathRenderer uses it to fulfill a drawPath call. |
|
85 // It draws with "texture" as a path mask into "target" using "rect" as |
|
86 // geometry and the current drawState. The current drawState is altered to |
|
87 // accommodate the mask. |
|
88 // Note that this method assumes that the GrPaint::kTotalStages slot in |
|
89 // the draw state can be used to hold the mask texture stage. |
|
90 // This method is really only intended to be used with the |
|
91 // output of DrawPathMaskToTexture. |
|
92 static void DrawToTargetWithPathMask(GrTexture* texture, |
|
93 GrDrawTarget* target, |
|
94 const SkIRect& rect); |
|
95 |
|
96 protected: |
|
97 private: |
|
98 GrContext* fContext; |
|
99 SkMatrix fMatrix; |
|
100 SkBitmap fBM; |
|
101 SkDraw fDraw; |
|
102 SkRasterClip fRasterClip; |
|
103 |
|
104 typedef SkNoncopyable INHERITED; |
|
105 }; |
|
106 |
|
107 #endif // GrSWMaskHelper_DEFINED |