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 GRAPHIC_LTE_VERTEX_GENERATE_STROKE_H 17 #define GRAPHIC_LTE_VERTEX_GENERATE_STROKE_H 18 19 #include "gfx_utils/diagram/vertexprimitive/geometry_math_stroke.h" 20 namespace OHOS { 21 class VertexGenerateStroke { 22 enum Status { 23 /** init state */ 24 INITIAL, 25 /** ready state */ 26 READY, 27 /** linecap start draw state */ 28 LINECAP_START, 29 /** linecap end draw state */ 30 LINECAP_END, 31 /** linejoin start draw state */ 32 LINEJOIN_START, 33 /** close first curve state */ 34 CLOSE_FIRST, 35 /** linejoin end draw state */ 36 LINEJOIN_END, 37 /** closing end state */ 38 OUT_VERTICES, 39 /** Clockwise needle end polygon */ 40 CLOCKWISE_ENDPOLY, 41 /** Clockwise needle end polygon */ 42 ANTI_CLOCKWISE_ENDPOLY, 43 /** end drawing state */ 44 STOP 45 }; 46 47 public: 48 VertexGenerateStroke(); 49 50 #if defined(GRAPHIC_ENABLE_LINECAP_FLAG) && GRAPHIC_ENABLE_LINECAP_FLAG SetLineCap(LineCap lc)51 void SetLineCap(LineCap lc) 52 { 53 stroker_.SetLineCap(lc); 54 } GetLineCap()55 LineCap GetLineCap() const 56 { 57 return stroker_.GetLineCap(); 58 } 59 #endif 60 #if defined(GRAPHIC_ENABLE_LINEJOIN_FLAG) && GRAPHIC_ENABLE_LINEJOIN_FLAG SetLineJoin(LineJoin lj)61 void SetLineJoin(LineJoin lj) 62 { 63 stroker_.SetLineJoin(lj); 64 } 65 SetMiterLimit(float ml)66 void SetMiterLimit(float ml) 67 { 68 stroker_.SetMiterLimit(ml); 69 } GetLineJoin()70 LineJoin GetLineJoin() const 71 { 72 return stroker_.GetLineJoin(); 73 } GetMiterLimit()74 float GetMiterLimit() const 75 { 76 return stroker_.GetMiterLimit(); 77 } 78 #endif SetWidth(float width)79 void SetWidth(float width) 80 { 81 stroker_.SetWidth(width); 82 } 83 SetApproximationScale(float approximationScale)84 void SetApproximationScale(float approximationScale) 85 { 86 stroker_.SetApproximationScale(approximationScale); 87 } 88 GetWidth()89 float GetWidth() const 90 { 91 return stroker_.GetWidth(); 92 } 93 GetApproximationScale()94 float GetApproximationScale() const 95 { 96 return stroker_.GetApproximationScale(); 97 } 98 SetStrokeShorten(float strokeShorten)99 void SetStrokeShorten(float strokeShorten) 100 { 101 strokeShorten_ = strokeShorten; 102 } 103 GetStrokeShorten()104 float GetStrokeShorten() const 105 { 106 return strokeShorten_; 107 } 108 109 void RemoveAll(); 110 111 void AddVertex(float x, float y, uint32_t cmd); 112 113 void Rewind(uint32_t pathId); 114 uint32_t GenerateVertex(float* x, float* y); GetGenerateFlags()115 VertexGenerateFlags GetGenerateFlags() 116 { 117 return GENERATE_STROKE; 118 } 119 private: 120 VertexGenerateStroke(const VertexGenerateStroke&); 121 const VertexGenerateStroke& operator=(const VertexGenerateStroke&); 122 GeometryMathStroke stroker_; 123 GeometryVertexSequence srcVertices_; 124 Graphic::Vector<PointF> outVertices_; 125 float strokeShorten_; 126 uint32_t closed_; 127 Status status_; 128 Status prevStatus_; 129 uint32_t srcVertex_; 130 uint32_t outVertex_; 131 132 void VertexReady(const uint32_t& verticesNum, uint32_t& cmd); 133 void VertexLineCapStart(); 134 void VertexLineCapEnd(const uint32_t& verticesNum); 135 void VertexLineJoinStart(); 136 void VertexLineJoinEnd(); 137 void VertexCloseFirst(uint32_t& cmd); 138 bool IsVertexOutVertices(float* x, float* y); 139 }; 140 } // namespace OHOS 141 142 #endif 143