1 /*
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "drawable/rs_render_node_shadow_drawable.h"
17 
18 #include "params/rs_render_params.h"
19 #include "pipeline/rs_render_node.h"
20 #include "platform/common/rs_log.h"
21 
22 namespace OHOS::Rosen::DrawableV2 {
23 
RSRenderNodeShadowDrawable(std::shared_ptr<const RSRenderNode> node,std::shared_ptr<RSRenderNodeDrawableAdapter> nodeDrawable)24 RSRenderNodeShadowDrawable::RSRenderNodeShadowDrawable(
25     std::shared_ptr<const RSRenderNode> node, std::shared_ptr<RSRenderNodeDrawableAdapter> nodeDrawable)
26     : RSRenderNodeDrawableAdapter(std::move(node)), nodeDrawable_(std::move(nodeDrawable))
27 {
28     // tell associated RSRenderNodeDrawableAdapter to skip shadow, as we take care of drawing shadow
29     // Planning: directly set skip type (a RT flag!) here may cause shadow display error in some cases
30     nodeDrawable_->SetSkip(SkipType::SKIP_SHADOW);
31 }
32 
Draw(Drawing::Canvas & canvas)33 void RSRenderNodeShadowDrawable::Draw(Drawing::Canvas& canvas)
34 {
35     // rect is not directly used, make a dummy rect
36     static const Drawing::Rect rect;
37 
38     auto shadowIndex = nodeDrawable_->drawCmdIndex_.shadowIndex_;
39     if (shadowIndex == -1) {
40         return;
41     }
42 
43     const auto& params = nodeDrawable_->GetRenderParams();
44     if (!params) {
45         RS_LOGE("params is nullptr");
46         return;
47     }
48     if (!params->GetShouldPaint()) {
49         return;
50     }
51     auto paintFilterCanvas = static_cast<RSPaintFilterCanvas*>(&canvas);
52     RSAutoCanvasRestore acr(paintFilterCanvas, RSPaintFilterCanvas::SaveType::kCanvasAndAlpha);
53     params->ApplyAlphaAndMatrixToCanvas(*paintFilterCanvas);
54 
55     // PLANNING: add support for op drop
56 
57     for (auto i = 0; i <= shadowIndex; i++) {
58         nodeDrawable_->drawCmdList_[i](&canvas, &rect);
59     }
60 }
61 
DumpDrawableTree(int32_t depth,std::string & out,const RSContext & context) const62 void RSRenderNodeShadowDrawable::DumpDrawableTree(int32_t depth, std::string& out, const RSContext& context) const
63 {
64     for (int32_t i = 0; i < depth; ++i) {
65         out += "  ";
66     }
67     RSRenderNode::DumpNodeType(nodeType_, out);
68     out += "[" + std::to_string(nodeId_) + "] Draw Shadow Only\n";
69 }
70 } // namespace OHOS::Rosen::DrawableV2
71