2 * Copyright 2012 Google Inc.
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
8 #ifndef GrSWMaskHelper_DEFINED
9 #define GrSWMaskHelper_DEFINED
12 #include "GrDrawState.h"
16 #include "SkRasterClip.h"
20 class GrAutoScratchTexture;
28 * The GrSWMaskHelper helps generate clip masks using the software rendering
29 * path. It is intended to be used as:
31 * GrSWMaskHelper helper(context);
34 * draw one or more paths/rects specifying the required boolean ops
36 * toTexture(); // to get it from the internal bitmap to the GPU
38 * The result of this process will be the final mask (on the GPU) in the
39 * upper left hand corner of the texture.
41 class GrSWMaskHelper : SkNoncopyable {
43 GrSWMaskHelper(GrContext* context)
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
51 bool init(const SkIRect& resultBounds, const SkMatrix* matrix);
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);
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);
61 // Helper function to get a scratch texture suitable for capturing the
62 // result (i.e., right size & format)
63 bool getTexture(GrAutoScratchTexture* texture);
65 // Move the mask generation results from the internal bitmap to the gpu.
66 void toTexture(GrTexture* texture);
68 // Reset the internal bitmap
69 void clear(uint8_t alpha) {
70 fBM.eraseColor(SkColorSetARGB(alpha, alpha, alpha, alpha));
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,
77 const SkStrokeRec& stroke,
78 const SkIRect& resultBounds,
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,
102 SkRasterClip fRasterClip;
104 typedef SkNoncopyable INHERITED;
107 #endif // GrSWMaskHelper_DEFINED