1 /* 2 * Copyright 2017 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 #include "include/android/SkAndroidFrameworkUtils.h" 9 #include "include/core/SkCanvas.h" 10 #include "include/utils/SkPaintFilterCanvas.h" 11 #include "src/core/SkDevice.h" 12 #include "src/image/SkSurface_Base.h" 13 #include "src/shaders/SkShaderBase.h" 14 15 #ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK 16 17 #include <log/log.h> 18 19 #if defined(SK_GANESH) clipWithStencil(SkCanvas * canvas)20bool SkAndroidFrameworkUtils::clipWithStencil(SkCanvas* canvas) { 21 return canvas->baseDevice()->android_utils_clipWithStencil(); 22 } 23 #endif 24 SafetyNetLog(const char * bugNumber)25void SkAndroidFrameworkUtils::SafetyNetLog(const char* bugNumber) { 26 android_errorWriteLog(0x534e4554, bugNumber); 27 } 28 getSurfaceFromCanvas(SkCanvas * canvas)29sk_sp<SkSurface> SkAndroidFrameworkUtils::getSurfaceFromCanvas(SkCanvas* canvas) { 30 sk_sp<SkSurface> surface(SkSafeRef(canvas->getSurfaceBase())); 31 return surface; 32 } 33 SaveBehind(SkCanvas * canvas,const SkRect * subset)34int SkAndroidFrameworkUtils::SaveBehind(SkCanvas* canvas, const SkRect* subset) { 35 return canvas->only_axis_aligned_saveBehind(subset); 36 } 37 ResetClip(SkCanvas * canvas)38void SkAndroidFrameworkUtils::ResetClip(SkCanvas* canvas) { 39 canvas->internal_private_resetClip(); 40 } 41 getBaseWrappedCanvas(SkCanvas * canvas)42SkCanvas* SkAndroidFrameworkUtils::getBaseWrappedCanvas(SkCanvas* canvas) { 43 auto pfc = canvas->internal_private_asPaintFilterCanvas(); 44 auto result = canvas; 45 while (pfc) { 46 result = pfc->proxy(); 47 pfc = result->internal_private_asPaintFilterCanvas(); 48 } 49 return result; 50 } 51 ShaderAsALinearGradient(SkShader * shader,LinearGradientInfo * info)52bool SkAndroidFrameworkUtils::ShaderAsALinearGradient(SkShader* shader, 53 LinearGradientInfo* info) { 54 SkASSERT(shader); 55 SkTLazy<SkShaderBase::GradientInfo> baseInfo; 56 if (info) { 57 baseInfo.init(); 58 baseInfo->fColorCount = info->fColorCount; 59 baseInfo->fColors = info->fColors; 60 baseInfo->fColorOffsets = info->fColorOffsets; 61 } 62 if (as_SB(shader)->asGradient(baseInfo.getMaybeNull()) != SkShaderBase::GradientType::kLinear) { 63 return false; 64 } 65 if (info) { 66 info->fColorCount = baseInfo->fColorCount; // this is inout in asGradient() 67 info->fPoints[0] = baseInfo->fPoint[0]; 68 info->fPoints[1] = baseInfo->fPoint[1]; 69 info->fTileMode = baseInfo->fTileMode; 70 info->fGradientFlags = baseInfo->fGradientFlags; 71 } 72 return true; 73 } 74 75 #endif // SK_BUILD_FOR_ANDROID_FRAMEWORK 76