1 /*
2  * Copyright (c) 2021 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 #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_BASE_POSITION_LAYOUT_UTILS_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_BASE_POSITION_LAYOUT_UTILS_H
18 
19 #include "core/pipeline/base/render_node.h"
20 
21 namespace OHOS::Ace {
22 
23 class PositionLayoutUtils final {
24 public:
GetAbsoluteOffset(const RefPtr<RenderNode> & parentNode,const RefPtr<RenderNode> & selfNode)25     static Offset GetAbsoluteOffset(const RefPtr<RenderNode>& parentNode, const RefPtr<RenderNode>& selfNode)
26     {
27         if (!parentNode || !selfNode) {
28             return Offset::Zero();
29         }
30         double deltaX = 0.0;
31         if (selfNode->HasLeft()) {
32             deltaX = selfNode->NormalizePercentToPx(selfNode->GetLeft(), false);
33         } else if (selfNode->HasRight()) {
34             deltaX = parentNode->GetLayoutSize().Width() - selfNode->NormalizePercentToPx(selfNode->GetRight(), false) -
35                      selfNode->GetLayoutSize().Width();
36         } else {
37             deltaX = 0.0;
38         }
39         deltaX = deltaX - selfNode->NormalizePercentToPx(selfNode->GetAnchorX(), false, true);
40         double deltaY = 0.0;
41         if (selfNode->HasTop()) {
42             deltaY = selfNode->NormalizePercentToPx(selfNode->GetTop(), true);
43         } else if (selfNode->HasBottom()) {
44             deltaY = parentNode->GetLayoutSize().Height() - selfNode->NormalizePercentToPx(selfNode->GetBottom(), true)
45                 - selfNode->GetLayoutSize().Height();
46         } else {
47             deltaY = 0.0;
48         }
49         deltaY = deltaY - selfNode->NormalizePercentToPx(selfNode->GetAnchorY(), true, true);
50         return Offset(deltaX, deltaY);
51     }
52 };
53 
54 } // namespace OHOS::Ace
55 
56 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_BASE_POSITION_LAYOUT_UTILS_H
57