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