• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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