1 // Copyright 2013 The Flutter Authors. All rights reserved.
2 // Copyright (c) Huawei Technologies Co., Ltd. 2021. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5
6 #include "flutter/flow/ohos_layers/mask_layer.h"
7
8 #include "third_party/skia/include/core/SkCanvas.h"
9 #include "third_party/skia/include/core/SkMaskFilter.h"
10 #include "third_party/skia/include/effects/SkLumaColorFilter.h"
11
12 #include "flutter/flow/ohos_layers/paint_context.h"
13
14 namespace flutter::OHOS {
15
Paint(const PaintContext & paintContext) const16 void MaskLayer::Paint(const PaintContext& paintContext) const
17 {
18 if (isSvgMask_ && !svgDom_) {
19 return;
20 }
21
22 SkAutoCanvasRestore save(paintContext.skCanvas, true);
23 SkRect maskBounds = GetPaintBounds();
24 auto& skCanvas_ = paintContext.skCanvas;
25 skCanvas_->saveLayer(maskBounds, nullptr);
26 int tmpLayer = skCanvas_->getSaveCount();
27
28 SkPaint mask_filter;
29 #ifdef USE_SYSTEM_SKIA
30 auto filter = SkColorFilter::MakeComposeFilter(SkLumaColorFilter::Make(),
31 SkColorFilter::MakeSRGBToLinearGamma());
32 #else
33 auto filter = SkColorFilters::Compose(SkLumaColorFilter::Make(),
34 SkColorFilters::SRGBToLinearGamma());
35 #endif
36 mask_filter.setColorFilter(filter);
37 skCanvas_->saveLayer(maskBounds, &mask_filter);
38 if (isSvgMask_) {
39 SkAutoCanvasRestore maskSave(paintContext.skCanvas, true);
40 skCanvas_->translate(maskBounds.fLeft + svgX_, maskBounds.fTop + svgY_);
41 skCanvas_->scale(scaleX_, scaleY_);
42 svgDom_->render(skCanvas_);
43 } else if (isGradientMask_) {
44 SkAutoCanvasRestore maskSave(paintContext.skCanvas, true);
45 skCanvas_->translate(maskBounds.fLeft, maskBounds.fTop);
46 SkRect skRect = SkRect::MakeIWH(maskBounds.fRight - maskBounds.fLeft, maskBounds.fBottom - maskBounds.fTop);
47 skCanvas_->drawRect(skRect, maskPaint_);
48 } else if (isPathMask_) {
49 SkAutoCanvasRestore maskSave(paintContext.skCanvas, true);
50 skCanvas_->translate(maskBounds.fLeft, maskBounds.fTop);
51 skCanvas_->drawPath(maskPath_, maskPaint_);
52 }
53
54 // back to mask layer
55 skCanvas_->restoreToCount(tmpLayer);
56 // create content layer
57 SkPaint maskPaint;
58 maskPaint.setBlendMode(SkBlendMode::kSrcIn);
59 skCanvas_->saveLayer(maskBounds, &maskPaint);
60 skCanvas_->clipRect(maskBounds, true);
61 PaintChildren(paintContext);
62 }
63
64 } // namespace flutter::OHOS