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 "SkMatrix.h" 13 #include "GrNoncopyable.h" 14 #include "SkBitmap.h" 15 #include "SkDraw.h" 16 #include "SkRasterClip.h" 17 #include "SkRegion.h" 18 #include "GrDrawState.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 GrNoncopyable { 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 GrIRect& resultBounds, const SkMatrix* matrix); 52 53 // Draw a single rect into the accumulation bitmap using the specified op 54 void draw(const GrRect& 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 // The space outside of the mask is cleared using "alpha" 67 void toTexture(GrTexture* texture, uint8_t alpha); 68 69 // Reset the internal bitmap 70 void clear(uint8_t alpha) { 71 fBM.eraseColor(SkColorSetARGB(alpha, alpha, alpha, alpha)); 72 } 73 74 // Canonical usage utility that draws a single path and uploads it 75 // to the GPU. The result is returned in "result". 76 static GrTexture* DrawPathMaskToTexture(GrContext* context, 77 const SkPath& path, 78 const SkStrokeRec& stroke, 79 const GrIRect& resultBounds, 80 bool antiAlias, 81 SkMatrix* matrix); 82 83 // This utility routine is used to add a path's mask to some other draw. 84 // The ClipMaskManager uses it to accumulate clip masks while the 85 // GrSoftwarePathRenderer uses it to fulfill a drawPath call. 86 // It draws with "texture" as a path mask into "target" using "rect" as 87 // geometry and the current drawState. The current drawState is altered to 88 // accommodate the mask. 89 // Note that this method assumes that the GrPaint::kTotalStages slot in 90 // the draw state can be used to hold the mask texture stage. 91 // This method is really only intended to be used with the 92 // output of DrawPathMaskToTexture. 93 static void DrawToTargetWithPathMask(GrTexture* texture, 94 GrDrawTarget* target, 95 const GrIRect& rect); 96 97 protected: 98 private: 99 GrContext* fContext; 100 SkMatrix fMatrix; 101 SkBitmap fBM; 102 SkDraw fDraw; 103 SkRasterClip fRasterClip; 104 105 typedef GrNoncopyable INHERITED; 106 }; 107 108 #endif // GrSWMaskHelper_DEFINED 109