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_NG_PATTERN_SHAPE_PAINT_PROPERTY_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_SHAPE_PAINT_PROPERTY_H 18 19 #include <array> 20 #include <string> 21 #include "base/geometry/dimension.h" 22 #include "core/components/common/properties/color.h" 23 #include "core/components/common/properties/paint_state.h" 24 #include "core/components_ng/layout/layout_property.h" 25 #include "core/components_ng/property/property.h" 26 #include "core/components_ng/render/paint_property.h" 27 28 namespace OHOS::Ace::NG { 29 30 class ACE_EXPORT ShapePaintProperty : public PaintProperty { 31 DECLARE_ACE_TYPE(ShapePaintProperty, PaintProperty); 32 33 public: 34 static constexpr double FILL_OPACITY_DEFAULT = 1.0f; 35 static constexpr double STROKE_MITERLIMIT_DEFAULT = 4.0f; 36 static constexpr double STROKE_MITERLIMIT_MIN = 1.0f; 37 static constexpr double STROKE_OPACITY_DEFAULT = 1.0f; 38 static constexpr Dimension STROKE_WIDTH_DEFAULT = 1.0_vp; 39 static constexpr bool ANTIALIAS_DEFAULT = true; 40 static constexpr int SQUARE_CAP = 2; 41 static constexpr int DEFAULT_LINE_JOIN=0; 42 43 ShapePaintProperty() = default; 44 ~ShapePaintProperty() override = default; Clone()45 RefPtr<PaintProperty> Clone() const override 46 { 47 auto value = MakeRefPtr<ShapePaintProperty>(); 48 value->PaintProperty::UpdatePaintProperty(DynamicCast<PaintProperty>(this)); 49 value->propFill_ = CloneFill(); 50 value->propFillOpacity_ = CloneFillOpacity(); 51 value->propStroke_ = CloneStroke(); 52 value->propStrokeWidth_ = CloneStrokeWidth(); 53 value->propStrokeOpacity_ = CloneStrokeOpacity(); 54 value->propStrokeDashArray_ = CloneStrokeDashArray(); 55 value->propStrokeDashOffset_ = CloneStrokeDashOffset(); 56 value->propStrokeLineCap_ = CloneStrokeLineCap(); 57 value->propStrokeLineJoin_ = CloneStrokeLineJoin(); 58 value->propStrokeMiterLimit_ = CloneStrokeMiterLimit(); 59 value->propAntiAlias_ = CloneAntiAlias(); 60 return value; 61 } 62 Reset()63 void Reset() override 64 { 65 PaintProperty::Reset(); 66 ResetAntiAlias(); 67 ResetFill(); 68 ResetFillOpacity(); 69 ResetStroke(); 70 ResetStrokeWidth(); 71 ResetStrokeDashArray(); 72 ResetStrokeDashOffset(); 73 ResetStrokeLineCap(); 74 ResetStrokeLineJoin(); 75 ResetStrokeMiterLimit(); 76 ResetStrokeOpacity(); 77 } 78 ToJsonValue(std::unique_ptr<JsonValue> & json)79 void ToJsonValue(std::unique_ptr<JsonValue>& json) const override 80 { 81 PaintProperty::ToJsonValue(json); 82 json->Put("stroke", propStroke_.value_or(Color::BLACK).ColorToString().c_str()); 83 json->Put("strokeWidth", propStrokeWidth_.value_or(Dimension()).ConvertToPx()); 84 json->Put("strokeOpacity", std::to_string(propStrokeOpacity_.value_or(STROKE_OPACITY_DEFAULT)).c_str()); 85 json->Put("strokeDashOffset", propStrokeDashOffset_.value_or(Dimension()).ToString().c_str()); 86 87 auto jsonDashArray = JsonUtil::CreateArray(true); 88 std::vector<Dimension> array = propStrokeDashArray_.value_or(std::vector<Dimension>()); 89 for (size_t i = 0; i < array.size(); i++) { 90 auto index = std::to_string(i); 91 auto value = array[i].ToString(); 92 jsonDashArray->Put(index.c_str(), value.c_str()); 93 } 94 json->Put("strokeDashArray", jsonDashArray); 95 96 std::array<std::string, 3> lineCap = { "LineCapStyle.Butt", "LineCapStyle.Round", "LineCapStyle.Square" }; 97 json->Put("strokeLineCap", lineCap.at(propStrokeLineCap_.value_or(0) % 3).c_str()); 98 std::array<std::string, 3> lineJoin = { "LineJoinStyle.Miter", "LineJoinStyle.Round", "LineJoinStyle.Bevel" }; 99 json->Put("strokeLineJoin", lineJoin.at(propStrokeLineJoin_.value_or(0) % 3).c_str()); 100 json->Put("strokeMiterLimit", 101 std::to_string(propStrokeMiterLimit_.value_or(STROKE_MITERLIMIT_DEFAULT)).c_str()); 102 json->Put("fill", propFill_.value_or(Color::BLACK).ColorToString().c_str()); 103 json->Put("fillOpacity", std::to_string(propFillOpacity_.value_or(FILL_OPACITY_DEFAULT)).c_str()); 104 json->Put("antiAlias", propAntiAlias_.value_or(ANTIALIAS_DEFAULT) ? "true" : "false"); 105 } 106 107 void UpdateShapeProperty(const RefPtr<ShapePaintProperty>& target); 108 109 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(Fill, Color, PROPERTY_UPDATE_RENDER); 110 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(FillOpacity, double, PROPERTY_UPDATE_RENDER); 111 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(Stroke, Color, PROPERTY_UPDATE_RENDER); 112 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(StrokeDashArray, std::vector<Ace::Dimension>, PROPERTY_UPDATE_RENDER); 113 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(StrokeDashOffset, Dimension, PROPERTY_UPDATE_RENDER); 114 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(StrokeLineCap, int, PROPERTY_UPDATE_RENDER); 115 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(StrokeLineJoin, int, PROPERTY_UPDATE_RENDER); 116 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(StrokeMiterLimit, double, PROPERTY_UPDATE_RENDER); 117 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(StrokeOpacity, double, PROPERTY_UPDATE_RENDER); 118 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(StrokeWidth, Ace::Dimension, PROPERTY_UPDATE_RENDER); 119 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(AntiAlias, bool, PROPERTY_UPDATE_RENDER); 120 121 private: 122 ACE_DISALLOW_COPY_AND_MOVE(ShapePaintProperty); 123 }; 124 } // namespace OHOS::Ace::NG 125 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_SHAPE_PAINT_PROPERTY_H