1 /* 2 * Copyright (c) 2022 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_CORE_PROPERTIES_BORDER_IMAGE_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_CORE_PROPERTIES_BORDER_IMAGE_H 18 19 #include <cstdint> 20 21 #include "base/geometry/dimension.h" 22 #include "base/geometry/offset.h" 23 #include "base/geometry/size.h" 24 #include "base/utils/utils.h" 25 #include "core/components/common/layout/constants.h" 26 #include "core/components/common/properties/border_image_edge.h" 27 #include "core/components/common/properties/color.h" 28 #include "core/components/common/properties/radius.h" 29 30 namespace OHOS::Ace { 31 32 class ACE_EXPORT BorderImage final : public AceType { 33 DECLARE_ACE_TYPE(BorderImage, AceType); 34 35 public: 36 const static uint8_t OUTSET_BIT = 1 << 0; 37 const static uint8_t REPEAT_BIT = 1 << 1; 38 const static uint8_t SLICE_BIT = 1 << 2; 39 const static uint8_t SOURCE_BIT = 1 << 3; 40 const static uint8_t WIDTH_BIT = 1 << 4; 41 const static uint8_t GRADIENT_BIT = 1 << 5; 42 43 BorderImage() = default; BorderImage(const std::string & src)44 explicit BorderImage(const std::string& src) 45 { 46 src_ = src; 47 } 48 49 ~BorderImage() override = default; 50 GetSrc()51 const std::string& GetSrc() const 52 { 53 return src_; 54 } 55 SetSrc(const std::string & src)56 void SetSrc(const std::string& src) 57 { 58 src_ = src; 59 } 60 GetBundleName()61 const std::string& GetBundleName() 62 { 63 return bundleName_; 64 } 65 SetBundleName(const std::string & bundleName)66 void SetBundleName(const std::string& bundleName) 67 { 68 bundleName_ = bundleName; 69 } 70 GetModuleName()71 const std::string& GetModuleName() 72 { 73 return moduleName_; 74 } 75 SetModuleName(const std::string & moduleName)76 void SetModuleName(const std::string& moduleName) 77 { 78 moduleName_ = moduleName; 79 } 80 SliceToString()81 std::string SliceToString() 82 { 83 std::string str; 84 if (borderImageLeft_.GetBorderImageSlice() == borderImageRight_.GetBorderImageSlice() && 85 borderImageRight_.GetBorderImageSlice() == borderImageTop_.GetBorderImageSlice() && 86 borderImageTop_.GetBorderImageSlice() == borderImageBottom_.GetBorderImageSlice()) { 87 str.append(borderImageLeft_.GetBorderImageSlice().ToString()); 88 } else { 89 str.append("left: [").append(borderImageLeft_.GetBorderImageSlice().ToString()).append("] "); 90 str.append("right: [").append(borderImageRight_.GetBorderImageSlice().ToString()).append("] "); 91 str.append("top: [").append(borderImageTop_.GetBorderImageSlice().ToString()).append("] "); 92 str.append("bottom: [").append(borderImageBottom_.GetBorderImageSlice().ToString()).append("]"); 93 } 94 return str; 95 } 96 OutsetToString()97 std::string OutsetToString() 98 { 99 std::string str; 100 if (borderImageLeft_.GetBorderImageOutset() == borderImageRight_.GetBorderImageOutset() && 101 borderImageRight_.GetBorderImageOutset() == borderImageTop_.GetBorderImageOutset() && 102 borderImageTop_.GetBorderImageOutset() == borderImageBottom_.GetBorderImageOutset()) { 103 str.append(borderImageLeft_.GetBorderImageOutset().ToString()); 104 } else { 105 str.append("left: [").append(borderImageLeft_.GetBorderImageOutset().ToString()).append("] "); 106 str.append("right: [").append(borderImageRight_.GetBorderImageOutset().ToString()).append("] "); 107 str.append("top: [").append(borderImageTop_.GetBorderImageOutset().ToString()).append("] "); 108 str.append("bottom: [").append(borderImageBottom_.GetBorderImageOutset().ToString()).append("]"); 109 } 110 return str; 111 } 112 WidthToString()113 std::string WidthToString() 114 { 115 std::string str; 116 if (borderImageLeft_.GetBorderImageWidth() == borderImageRight_.GetBorderImageWidth() && 117 borderImageRight_.GetBorderImageWidth() == borderImageTop_.GetBorderImageWidth() && 118 borderImageTop_.GetBorderImageWidth() == borderImageBottom_.GetBorderImageWidth()) { 119 str.append(borderImageLeft_.GetBorderImageWidth().ToString()); 120 } else { 121 str.append("left: [").append(borderImageLeft_.GetBorderImageWidth().ToString()).append("] "); 122 str.append("right: [").append(borderImageRight_.GetBorderImageWidth().ToString()).append("] "); 123 str.append("top: [").append(borderImageTop_.GetBorderImageWidth().ToString()).append("] "); 124 str.append("bottom: [").append(borderImageBottom_.GetBorderImageWidth().ToString()).append("]"); 125 } 126 return str; 127 } 128 129 struct BorderImageOption { 130 std::optional<Dimension> leftDimension; 131 std::optional<Dimension> rightDimension; 132 std::optional<Dimension> topDimension; 133 std::optional<Dimension> bottomDimension; 134 std::optional<Dimension> startDimension; 135 std::optional<Dimension> endDimension; 136 }; 137 138 void SetEdgeSlice(BorderImageDirection direction, const Dimension& sliceDimension); 139 140 void SetEdgeOutset(BorderImageDirection direction, const Dimension& outsetDimension); 141 142 void SetEdgeWidth(BorderImageDirection direction, const Dimension& widthDimension); 143 SetRepeatMode(BorderImageRepeat repeatMode)144 void SetRepeatMode(BorderImageRepeat repeatMode) 145 { 146 repeatMode_ = repeatMode; 147 } 148 GetRepeatMode()149 BorderImageRepeat GetRepeatMode() 150 { 151 return repeatMode_; 152 } 153 SetNeedFillCenter(bool needFillCenter)154 void SetNeedFillCenter(bool needFillCenter) 155 { 156 needFillCenter_ = needFillCenter; 157 } 158 GetNeedFillCenter()159 bool GetNeedFillCenter() const 160 { 161 return needFillCenter_; 162 } 163 164 BorderImageEdge& GetBorderImageEdge(BorderImageDirection direction); 165 HasBorderImageWidth()166 bool HasBorderImageWidth() const 167 { 168 return hasBorderImageWidth_; 169 } 170 171 std::optional<BorderImageEdge> borderImageStart_; 172 std::optional<BorderImageEdge> borderImageEnd_; 173 private: 174 std::string src_; 175 std::string bundleName_; 176 std::string moduleName_; 177 BorderImageEdge borderImageLeft_; 178 BorderImageEdge borderImageTop_; 179 BorderImageEdge borderImageRight_; 180 BorderImageEdge borderImageBottom_; 181 BorderImageRepeat repeatMode_ = BorderImageRepeat::STRETCH; 182 bool needFillCenter_ = false; 183 bool hasBorderImageWidth_ = false; 184 }; 185 186 } // namespace OHOS::Ace 187 188 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_CORE_PROPERTIES_BORDER_IMAGE_H 189