1 /*
2 * Copyright (c) 2023 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 "core/components_ng/pattern/text/text_overlay_modifier.h"
17
18 #include "core/common/container.h"
19 #include "core/components_ng/render/drawing.h"
20 #include "core/components_ng/render/drawing_prop_convertor.h"
21
22 namespace OHOS::Ace::NG {
TextOverlayModifier()23 TextOverlayModifier::TextOverlayModifier()
24 {
25 paintOffset_ = AceType::MakeRefPtr<PropertyOffsetF>(OffsetF());
26 AttachProperty(paintOffset_);
27 selectedColor_ = AceType::MakeRefPtr<PropertyInt>(0);
28 AttachProperty(selectedColor_);
29 changeSelectedRects_ = AceType::MakeRefPtr<PropertyBool>(false);
30 AttachProperty(changeSelectedRects_);
31 if (Container::LessThanAPITargetVersion(PlatformVersion::VERSION_TWELVE)) {
32 isClip_ = MakeRefPtr<PropertyBool>(true);
33 } else {
34 isClip_ = MakeRefPtr<PropertyBool>(false);
35 }
36 AttachProperty(isClip_);
37 showSelect_ = AceType::MakeRefPtr<PropertyBool>(false);
38 AttachProperty(showSelect_);
39 }
40
onDraw(DrawingContext & drawingContext)41 void TextOverlayModifier::onDraw(DrawingContext& drawingContext)
42 {
43 if (!showSelect_->Get()) {
44 return;
45 }
46 drawingContext.canvas.Save();
47 RSBrush brush;
48 brush.SetAntiAlias(true);
49 brush.SetColor(selectedColor_->Get());
50 drawingContext.canvas.AttachBrush(brush);
51
52 if (contentRect_.has_value() && isClip_ && isClip_->Get()) {
53 drawingContext.canvas.ClipRect(ToRSRect(contentRect_.value()), RSClipOp::INTERSECT);
54 }
55
56 auto paintOffset = paintOffset_->Get();
57 for (const auto& selectedRect : selectedRects_) {
58 auto rect = selectedRect;
59 if (contentRect_.has_value()) {
60 if (rect.Right() > contentRect_.value().Right()) {
61 rect.SetWidth(std::max(contentRect_.value().Right() - rect.Left(), 0.0f));
62 }
63 }
64 drawingContext.canvas.DrawRect(RSRect(paintOffset.GetX() + rect.Left(), paintOffset.GetY() + rect.Top(),
65 paintOffset.GetX() + rect.Right(), paintOffset.GetY() + rect.Bottom()));
66 }
67 drawingContext.canvas.DetachBrush();
68 drawingContext.canvas.Restore();
69 }
70
SetPrintOffset(const OffsetF & paintOffset)71 void TextOverlayModifier::SetPrintOffset(const OffsetF& paintOffset)
72 {
73 CHECK_NULL_VOID(paintOffset_);
74 paintOffset_->Set(paintOffset);
75 }
76
SetSelectedColor(uint32_t selectedColor)77 void TextOverlayModifier::SetSelectedColor(uint32_t selectedColor)
78 {
79 CHECK_NULL_VOID(selectedColor_);
80 selectedColor_->Set(static_cast<int32_t>(selectedColor));
81 }
82
SetSelectedRects(const std::vector<RectF> & selectedRects)83 void TextOverlayModifier::SetSelectedRects(const std::vector<RectF>& selectedRects)
84 {
85 changeSelectedRects_->Set(!changeSelectedRects_->Get());
86 selectedRects_ = selectedRects;
87 }
88
IsSelectedRectsChanged(const std::vector<RectF> & selectedRects)89 bool TextOverlayModifier::IsSelectedRectsChanged(const std::vector<RectF>& selectedRects)
90 {
91 bool result = false;
92 if (selectedRects.size() == selectedRects_.size()) {
93 for (unsigned int ii = 0; ii < selectedRects.size(); ii++) {
94 if (selectedRects[ii] != selectedRects_[ii]) {
95 result = true;
96 break;
97 }
98 }
99 } else {
100 result = true;
101 }
102 return result;
103 }
SetShowSelect(bool value)104 void TextOverlayModifier::SetShowSelect(bool value)
105 {
106 showSelect_->Set(value);
107 }
108
GetSelectedRects() const109 std::vector<RectF> TextOverlayModifier::GetSelectedRects() const
110 {
111 return selectedRects_;
112 }
113 } // namespace OHOS::Ace::NG