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 "SkAndroidFrameworkUtils.h" 9 #include "SkCanvas.h" 10 #include "SkDevice.h" 11 #include "SkSurface_Base.h" 12 13 #if SK_SUPPORT_GPU 14 #include "GrStyle.h" 15 #include "GrClip.h" 16 #include "GrRenderTargetContext.h" 17 #include "GrUserStencilSettings.h" 18 #include "effects/GrDisableColorXP.h" 19 #endif //SK_SUPPORT_GPU 20 21 #ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK 22 23 #include <log/log.h> 24 25 #if SK_SUPPORT_GPU 26 bool SkAndroidFrameworkUtils::clipWithStencil(SkCanvas* canvas) { 27 SkRegion clipRegion; 28 canvas->temporary_internal_getRgnClip(&clipRegion); 29 if (clipRegion.isEmpty()) { 30 return false; 31 } 32 SkBaseDevice* device = canvas->getDevice(); 33 if (!device) { 34 return false; 35 } 36 GrRenderTargetContext* rtc = device->accessRenderTargetContext(); 37 if (!rtc) { 38 return false; 39 } 40 GrPaint grPaint; 41 grPaint.setXPFactory(GrDisableColorXPFactory::Get()); 42 GrNoClip noClip; 43 static constexpr GrUserStencilSettings kDrawToStencil( 44 GrUserStencilSettings::StaticInit< 45 0x1, 46 GrUserStencilTest::kAlways, 47 0x1, 48 GrUserStencilOp::kReplace, 49 GrUserStencilOp::kReplace, 50 0x1>() 51 ); 52 rtc->drawRegion(noClip, std::move(grPaint), GrAA::kNo, SkMatrix::I(), clipRegion, 53 GrStyle::SimpleFill(), &kDrawToStencil); 54 return true; 55 } 56 #endif //SK_SUPPORT_GPU 57 58 void SkAndroidFrameworkUtils::SafetyNetLog(const char* bugNumber) { 59 android_errorWriteLog(0x534e4554, bugNumber); 60 } 61 62 sk_sp<SkSurface> SkAndroidFrameworkUtils::getSurfaceFromCanvas(SkCanvas* canvas) { 63 sk_sp<SkSurface> surface(SkSafeRef(canvas->getSurfaceBase())); 64 return surface; 65 } 66 67 int SkAndroidFrameworkUtils::SaveBehind(SkCanvas* canvas, const SkRect* subset) { 68 return canvas->only_axis_aligned_saveBehind(subset); 69 } 70 #endif // SK_BUILD_FOR_ANDROID_FRAMEWORK 71 72