1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2012 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef GrSWMaskHelper_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define GrSWMaskHelper_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColor.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPoint.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkNoncopyable.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkAutoPixmapStorage.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkDrawBase.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkRasterClip.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxyView.h" 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint> 21*c8dee2aaSAndroid Build Coastguard Worker 22*c8dee2aaSAndroid Build Coastguard Worker class GrRecordingContext; 23*c8dee2aaSAndroid Build Coastguard Worker class GrShape; 24*c8dee2aaSAndroid Build Coastguard Worker class GrStyledShape; 25*c8dee2aaSAndroid Build Coastguard Worker class SkMatrix; 26*c8dee2aaSAndroid Build Coastguard Worker class SkRRect; 27*c8dee2aaSAndroid Build Coastguard Worker enum class GrAA : bool; 28*c8dee2aaSAndroid Build Coastguard Worker enum class SkBackingFit; 29*c8dee2aaSAndroid Build Coastguard Worker struct SkIRect; 30*c8dee2aaSAndroid Build Coastguard Worker struct SkRect; 31*c8dee2aaSAndroid Build Coastguard Worker 32*c8dee2aaSAndroid Build Coastguard Worker /** 33*c8dee2aaSAndroid Build Coastguard Worker * The GrSWMaskHelper helps generate clip masks using the software rendering 34*c8dee2aaSAndroid Build Coastguard Worker * path. It is intended to be used as: 35*c8dee2aaSAndroid Build Coastguard Worker * 36*c8dee2aaSAndroid Build Coastguard Worker * GrSWMaskHelper helper(context); 37*c8dee2aaSAndroid Build Coastguard Worker * helper.init(...); 38*c8dee2aaSAndroid Build Coastguard Worker * 39*c8dee2aaSAndroid Build Coastguard Worker * draw one or more paths/rects specifying the required boolean ops 40*c8dee2aaSAndroid Build Coastguard Worker * 41*c8dee2aaSAndroid Build Coastguard Worker * toTextureView(); // to get it from the internal bitmap to the GPU 42*c8dee2aaSAndroid Build Coastguard Worker * 43*c8dee2aaSAndroid Build Coastguard Worker * The result of this process will be the final mask (on the GPU) in the 44*c8dee2aaSAndroid Build Coastguard Worker * upper left hand corner of the texture. 45*c8dee2aaSAndroid Build Coastguard Worker */ 46*c8dee2aaSAndroid Build Coastguard Worker class GrSWMaskHelper : SkNoncopyable { 47*c8dee2aaSAndroid Build Coastguard Worker public: 48*c8dee2aaSAndroid Build Coastguard Worker GrSWMaskHelper(SkAutoPixmapStorage* pixels = nullptr) 49*c8dee2aaSAndroid Build Coastguard Worker : fPixels(pixels ? pixels : &fPixelsStorage) { } 50*c8dee2aaSAndroid Build Coastguard Worker 51*c8dee2aaSAndroid Build Coastguard Worker // set up the internal state in preparation for draws. Since many masks 52*c8dee2aaSAndroid Build Coastguard Worker // may be accumulated in the helper during creation, "resultBounds" 53*c8dee2aaSAndroid Build Coastguard Worker // allows the caller to specify the region of interest - to limit the 54*c8dee2aaSAndroid Build Coastguard Worker // amount of work. 55*c8dee2aaSAndroid Build Coastguard Worker bool init(const SkIRect& resultBounds); 56*c8dee2aaSAndroid Build Coastguard Worker 57*c8dee2aaSAndroid Build Coastguard Worker // Draw a single rect into the accumulation bitmap using the specified op 58*c8dee2aaSAndroid Build Coastguard Worker void drawRect(const SkRect& rect, const SkMatrix& matrix, GrAA, uint8_t alpha); 59*c8dee2aaSAndroid Build Coastguard Worker 60*c8dee2aaSAndroid Build Coastguard Worker // Draw a single rrect into the accumulation bitmap using the specified op 61*c8dee2aaSAndroid Build Coastguard Worker void drawRRect(const SkRRect& rrect, const SkMatrix& matrix, GrAA, 62*c8dee2aaSAndroid Build Coastguard Worker uint8_t alpha); 63*c8dee2aaSAndroid Build Coastguard Worker 64*c8dee2aaSAndroid Build Coastguard Worker // Draw a single path into the accumuation bitmap using the specified op 65*c8dee2aaSAndroid Build Coastguard Worker void drawShape(const GrStyledShape&, const SkMatrix& matrix, GrAA, 66*c8dee2aaSAndroid Build Coastguard Worker uint8_t alpha); 67*c8dee2aaSAndroid Build Coastguard Worker // Like the GrStyledShape variant, but assumes a simple fill style 68*c8dee2aaSAndroid Build Coastguard Worker void drawShape(const GrShape&, const SkMatrix& matrix, GrAA, uint8_t alpha); 69*c8dee2aaSAndroid Build Coastguard Worker 70*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceProxyView toTextureView(GrRecordingContext*, SkBackingFit fit); 71*c8dee2aaSAndroid Build Coastguard Worker 72*c8dee2aaSAndroid Build Coastguard Worker // Reset the internal bitmap clear(uint8_t alpha)73*c8dee2aaSAndroid Build Coastguard Worker void clear(uint8_t alpha) { 74*c8dee2aaSAndroid Build Coastguard Worker fPixels->erase(SkColorSetARGB(alpha, 0xFF, 0xFF, 0xFF)); 75*c8dee2aaSAndroid Build Coastguard Worker } 76*c8dee2aaSAndroid Build Coastguard Worker 77*c8dee2aaSAndroid Build Coastguard Worker private: 78*c8dee2aaSAndroid Build Coastguard Worker SkVector fTranslate; 79*c8dee2aaSAndroid Build Coastguard Worker SkAutoPixmapStorage* fPixels; 80*c8dee2aaSAndroid Build Coastguard Worker SkAutoPixmapStorage fPixelsStorage; 81*c8dee2aaSAndroid Build Coastguard Worker SkDrawBase fDraw; 82*c8dee2aaSAndroid Build Coastguard Worker SkRasterClip fRasterClip; 83*c8dee2aaSAndroid Build Coastguard Worker 84*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = SkNoncopyable; 85*c8dee2aaSAndroid Build Coastguard Worker }; 86*c8dee2aaSAndroid Build Coastguard Worker 87*c8dee2aaSAndroid Build Coastguard Worker #endif // GrSWMaskHelper_DEFINED 88