/* * Copyright 2012 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrSWMaskHelper_DEFINED #define GrSWMaskHelper_DEFINED #include "include/core/SkMatrix.h" #include "include/core/SkRegion.h" #include "include/core/SkTypes.h" #include "include/private/GrTypesPriv.h" #include "src/core/SkAutoPixmapStorage.h" #include "src/core/SkDraw.h" #include "src/core/SkRasterClip.h" #include "src/gpu/GrSurfaceProxyView.h" class GrShape; class GrStyledShape; class GrRecordingContext; class GrTextureProxy; /** * The GrSWMaskHelper helps generate clip masks using the software rendering * path. It is intended to be used as: * * GrSWMaskHelper helper(context); * helper.init(...); * * draw one or more paths/rects specifying the required boolean ops * * toTextureView(); // to get it from the internal bitmap to the GPU * * The result of this process will be the final mask (on the GPU) in the * upper left hand corner of the texture. */ class GrSWMaskHelper : SkNoncopyable { public: GrSWMaskHelper(SkAutoPixmapStorage* pixels = nullptr) : fPixels(pixels ? pixels : &fPixelsStorage) { } // set up the internal state in preparation for draws. Since many masks // may be accumulated in the helper during creation, "resultBounds" // allows the caller to specify the region of interest - to limit the // amount of work. bool init(const SkIRect& resultBounds); // Draw a single rect into the accumulation bitmap using the specified op void drawRect(const SkRect& rect, const SkMatrix& matrix, SkRegion::Op op, GrAA, uint8_t alpha); // Draw a single rrect into the accumulation bitmap using the specified op void drawRRect(const SkRRect& rrect, const SkMatrix& matrix, SkRegion::Op op, GrAA, uint8_t alpha); // Draw a single path into the accumuation bitmap using the specified op void drawShape(const GrStyledShape&, const SkMatrix& matrix, SkRegion::Op op, GrAA, uint8_t alpha); // Like the GrStyledShape variant, but assumes a simple fill style void drawShape(const GrShape&, const SkMatrix& matrix, SkRegion::Op op, GrAA, uint8_t alpha); GrSurfaceProxyView toTextureView(GrRecordingContext*, SkBackingFit fit); // Reset the internal bitmap void clear(uint8_t alpha) { fPixels->erase(SkColorSetARGB(alpha, 0xFF, 0xFF, 0xFF)); } private: SkVector fTranslate; SkAutoPixmapStorage* fPixels; SkAutoPixmapStorage fPixelsStorage; SkDraw fDraw; SkRasterClip fRasterClip; using INHERITED = SkNoncopyable; }; #endif // GrSWMaskHelper_DEFINED