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