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