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 "SkAutoPixmapStorage.h" 12#include "SkDraw.h" 13#include "SkMatrix.h" 14#include "SkRasterClip.h" 15#include "SkRegion.h" 16#include "SkTypes.h" 17 18class GrShape; 19class GrTextureProxy; 20 21/** 22 * The GrSWMaskHelper helps generate clip masks using the software rendering 23 * path. It is intended to be used as: 24 * 25 * GrSWMaskHelper helper(context); 26 * helper.init(...); 27 * 28 * draw one or more paths/rects specifying the required boolean ops 29 * 30 * toTextureProxy(); // to get it from the internal bitmap to the GPU 31 * 32 * The result of this process will be the final mask (on the GPU) in the 33 * upper left hand corner of the texture. 34 */ 35class GrSWMaskHelper : SkNoncopyable { 36public: 37 GrSWMaskHelper(SkAutoPixmapStorage* pixels = nullptr) 38 : fPixels(pixels ? pixels : &fPixelsStorage) { } 39 40 // set up the internal state in preparation for draws. Since many masks 41 // may be accumulated in the helper during creation, "resultBounds" 42 // allows the caller to specify the region of interest - to limit the 43 // amount of work. 44 bool init(const SkIRect& resultBounds); 45 46 // Draw a single rect into the accumulation bitmap using the specified op 47 void drawRect(const SkRect& rect, const SkMatrix& matrix, SkRegion::Op op, GrAA, uint8_t alpha); 48 49 // Draw a single path into the accumuation bitmap using the specified op 50 void drawShape(const GrShape&, const SkMatrix& matrix, SkRegion::Op op, GrAA, uint8_t alpha); 51 52 sk_sp<GrTextureProxy> toTextureProxy(GrContext*, SkBackingFit fit); 53 54 // Reset the internal bitmap 55 void clear(uint8_t alpha) { 56 fPixels->erase(SkColorSetARGB(alpha, 0xFF, 0xFF, 0xFF)); 57 } 58 59private: 60 SkVector fTranslate; 61 SkAutoPixmapStorage* fPixels; 62 SkAutoPixmapStorage fPixelsStorage; 63 SkDraw fDraw; 64 SkRasterClip fRasterClip; 65 66 typedef SkNoncopyable INHERITED; 67}; 68 69#endif // GrSWMaskHelper_DEFINED 70