1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2017 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 SkAndroidFrameworkUtils_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define SkAndroidFrameworkUtils_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/SkRefCnt.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTileMode.h" 15*c8dee2aaSAndroid Build Coastguard Worker 16*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK 17*c8dee2aaSAndroid Build Coastguard Worker 18*c8dee2aaSAndroid Build Coastguard Worker class SkCanvas; 19*c8dee2aaSAndroid Build Coastguard Worker struct SkIRect; 20*c8dee2aaSAndroid Build Coastguard Worker struct SkRect; 21*c8dee2aaSAndroid Build Coastguard Worker class SkSurface; 22*c8dee2aaSAndroid Build Coastguard Worker class SkShader; 23*c8dee2aaSAndroid Build Coastguard Worker 24*c8dee2aaSAndroid Build Coastguard Worker /** 25*c8dee2aaSAndroid Build Coastguard Worker * SkAndroidFrameworkUtils expose private APIs used only by Android framework. 26*c8dee2aaSAndroid Build Coastguard Worker */ 27*c8dee2aaSAndroid Build Coastguard Worker class SkAndroidFrameworkUtils { 28*c8dee2aaSAndroid Build Coastguard Worker public: 29*c8dee2aaSAndroid Build Coastguard Worker 30*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_GANESH) 31*c8dee2aaSAndroid Build Coastguard Worker /** 32*c8dee2aaSAndroid Build Coastguard Worker * clipWithStencil draws the current clip into a stencil buffer with reference value and mask 33*c8dee2aaSAndroid Build Coastguard Worker * set to 0x1. This function works only on a GPU canvas. 34*c8dee2aaSAndroid Build Coastguard Worker * 35*c8dee2aaSAndroid Build Coastguard Worker * @param canvas A GPU canvas that has a non-empty clip. 36*c8dee2aaSAndroid Build Coastguard Worker * 37*c8dee2aaSAndroid Build Coastguard Worker * @return true on success or false if clip is empty or not a GPU canvas. 38*c8dee2aaSAndroid Build Coastguard Worker */ 39*c8dee2aaSAndroid Build Coastguard Worker static bool clipWithStencil(SkCanvas* canvas); 40*c8dee2aaSAndroid Build Coastguard Worker #endif //defined(SK_GANESH) 41*c8dee2aaSAndroid Build Coastguard Worker 42*c8dee2aaSAndroid Build Coastguard Worker static void SafetyNetLog(const char*); 43*c8dee2aaSAndroid Build Coastguard Worker 44*c8dee2aaSAndroid Build Coastguard Worker static sk_sp<SkSurface> getSurfaceFromCanvas(SkCanvas* canvas); 45*c8dee2aaSAndroid Build Coastguard Worker 46*c8dee2aaSAndroid Build Coastguard Worker static int SaveBehind(SkCanvas* canvas, const SkRect* subset); 47*c8dee2aaSAndroid Build Coastguard Worker 48*c8dee2aaSAndroid Build Coastguard Worker // Operating within the canvas' clip stack, this resets the geometry of the clip to be wide 49*c8dee2aaSAndroid Build Coastguard Worker // open modula any device clip restriction that was set outside of the clip stack. 50*c8dee2aaSAndroid Build Coastguard Worker static void ResetClip(SkCanvas* canvas); 51*c8dee2aaSAndroid Build Coastguard Worker 52*c8dee2aaSAndroid Build Coastguard Worker /** 53*c8dee2aaSAndroid Build Coastguard Worker * Unrolls a chain of nested SkPaintFilterCanvas to return the base wrapped canvas. 54*c8dee2aaSAndroid Build Coastguard Worker * 55*c8dee2aaSAndroid Build Coastguard Worker * @param canvas A SkPaintFilterCanvas or any other SkCanvas subclass. 56*c8dee2aaSAndroid Build Coastguard Worker * 57*c8dee2aaSAndroid Build Coastguard Worker * @return SkCanvas that was found in the innermost SkPaintFilterCanvas. 58*c8dee2aaSAndroid Build Coastguard Worker */ 59*c8dee2aaSAndroid Build Coastguard Worker static SkCanvas* getBaseWrappedCanvas(SkCanvas* canvas); 60*c8dee2aaSAndroid Build Coastguard Worker 61*c8dee2aaSAndroid Build Coastguard Worker /** 62*c8dee2aaSAndroid Build Coastguard Worker * If the shader represents a linear gradient ShaderAsALinearGradient 63*c8dee2aaSAndroid Build Coastguard Worker * returns true and if info is not null, ShaderAsALinearGradient populates 64*c8dee2aaSAndroid Build Coastguard Worker * info with the parameters for the gradient. fColorCount is both an input 65*c8dee2aaSAndroid Build Coastguard Worker * and output parameter. On input, it indicates how many entries in 66*c8dee2aaSAndroid Build Coastguard Worker * fColors and fColorOffsets can be used, if they are not nullptr. After 67*c8dee2aaSAndroid Build Coastguard Worker * asAGradient has run, fColorCount indicates how many color-offset pairs 68*c8dee2aaSAndroid Build Coastguard Worker * there are in the gradient. fColorOffsets specifies where on the range of 69*c8dee2aaSAndroid Build Coastguard Worker * 0 to 1 to transition to the given color. fPoints represent the endpoints 70*c8dee2aaSAndroid Build Coastguard Worker * of the gradient. 71*c8dee2aaSAndroid Build Coastguard Worker */ 72*c8dee2aaSAndroid Build Coastguard Worker struct LinearGradientInfo { 73*c8dee2aaSAndroid Build Coastguard Worker int fColorCount = 0; //!< In-out parameter, specifies passed size 74*c8dee2aaSAndroid Build Coastguard Worker // of fColors/fColorOffsets on input, and 75*c8dee2aaSAndroid Build Coastguard Worker // actual number of colors/offsets on 76*c8dee2aaSAndroid Build Coastguard Worker // output. 77*c8dee2aaSAndroid Build Coastguard Worker SkColor* fColors = nullptr; //!< The colors in the gradient. 78*c8dee2aaSAndroid Build Coastguard Worker SkScalar* fColorOffsets = nullptr; //!< The unit offset for color transitions. 79*c8dee2aaSAndroid Build Coastguard Worker SkPoint fPoints[2]; //!< Type specific, see above. 80*c8dee2aaSAndroid Build Coastguard Worker SkTileMode fTileMode; 81*c8dee2aaSAndroid Build Coastguard Worker uint32_t fGradientFlags = 0; //!< see SkGradientShader::Flags 82*c8dee2aaSAndroid Build Coastguard Worker }; 83*c8dee2aaSAndroid Build Coastguard Worker 84*c8dee2aaSAndroid Build Coastguard Worker static bool ShaderAsALinearGradient(SkShader* shader, LinearGradientInfo*); 85*c8dee2aaSAndroid Build Coastguard Worker }; 86*c8dee2aaSAndroid Build Coastguard Worker 87*c8dee2aaSAndroid Build Coastguard Worker #endif // SK_BUILD_FOR_ANDROID_ANDROID 88*c8dee2aaSAndroid Build Coastguard Worker 89*c8dee2aaSAndroid Build Coastguard Worker #endif // SkAndroidFrameworkUtils_DEFINED 90