Home | History | Annotate | Download | only in gpu
      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 : 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     // Actually sends the texture data to the GPU. This is called from
    105     // toTexture with the data filled in depending on the texture config.
    106     void sendTextureData(GrTexture *texture, const GrTextureDesc& desc,
    107                          const void *data, int rowbytes);
    108 
    109     typedef SkNoncopyable INHERITED;
    110 };
    111 
    112 #endif // GrSWMaskHelper_DEFINED
    113