1bafb9395Sopenharmony_ci/*
2bafb9395Sopenharmony_ci * Copyright (c) 2020-2021 Huawei Device Co., Ltd.
3bafb9395Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4bafb9395Sopenharmony_ci * you may not use this file except in compliance with the License.
5bafb9395Sopenharmony_ci * You may obtain a copy of the License at
6bafb9395Sopenharmony_ci *
7bafb9395Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8bafb9395Sopenharmony_ci *
9bafb9395Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10bafb9395Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11bafb9395Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12bafb9395Sopenharmony_ci * See the License for the specific language governing permissions and
13bafb9395Sopenharmony_ci * limitations under the License.
14bafb9395Sopenharmony_ci */
15bafb9395Sopenharmony_ci
16bafb9395Sopenharmony_ci#include "gfx_utils/diagram/common/paint.h"
17bafb9395Sopenharmony_cinamespace OHOS {
18bafb9395Sopenharmony_civoid Paint::InitDash(const Paint& paint)
19bafb9395Sopenharmony_ci{
20bafb9395Sopenharmony_ci#if defined(GRAPHIC_ENABLE_DASH_GENERATE_FLAG) && GRAPHIC_ENABLE_DASH_GENERATE_FLAG
21bafb9395Sopenharmony_ci    if (isDashMode_ && ndashes_ > 0) {
22bafb9395Sopenharmony_ci        dashArray_ = new float[ndashes_];
23bafb9395Sopenharmony_ci        if (dashArray_) {
24bafb9395Sopenharmony_ci            if (memset_s(dashArray_, ndashes_ * sizeof(float), 0, ndashes_ * sizeof(float)) != EOF) {
25bafb9395Sopenharmony_ci            }
26bafb9395Sopenharmony_ci            for (uint32_t i = 0; i < ndashes_; i++) {
27bafb9395Sopenharmony_ci                dashArray_[i] = paint.dashArray_[i];
28bafb9395Sopenharmony_ci            }
29bafb9395Sopenharmony_ci        } else {
30bafb9395Sopenharmony_ci            ndashes_ = 0;
31bafb9395Sopenharmony_ci            dashOffset_ = 0;
32bafb9395Sopenharmony_ci            isDashMode_ = false;
33bafb9395Sopenharmony_ci        }
34bafb9395Sopenharmony_ci    } else {
35bafb9395Sopenharmony_ci        dashArray_ = nullptr;
36bafb9395Sopenharmony_ci    }
37bafb9395Sopenharmony_ci#endif
38bafb9395Sopenharmony_ci}
39bafb9395Sopenharmony_ci
40bafb9395Sopenharmony_ci/*
41bafb9395Sopenharmony_ci * Initialize data members.
42bafb9395Sopenharmony_ci * style_:       paint style.
43bafb9395Sopenharmony_ci * fillColor_:   Sets the fill color of the pen.
44bafb9395Sopenharmony_ci * strokeColor_: Sets the line color of the pen.
45bafb9395Sopenharmony_ci * opacity_:     Set transparency.
46bafb9395Sopenharmony_ci * strokeWidth_: Set lineweight.
47bafb9395Sopenharmony_ci * lineCap_:     Set pen cap.
48bafb9395Sopenharmony_ci * lineJoin_:    Sets the style at the path connection of the pen.
49bafb9395Sopenharmony_ci * miterLimit_:  Sets the spacing limit for sharp corners at path connections.
50bafb9395Sopenharmony_ci * dashOffset:   dash Point offset.
51bafb9395Sopenharmony_ci * isDrawDash:   Whether to draw dotted line.
52bafb9395Sopenharmony_ci * dashArray:    dash Point group.
53bafb9395Sopenharmony_ci * ndashes:      Number of dotted lines.
54bafb9395Sopenharmony_ci * globalAlpha:  Set element Global alpha.
55bafb9395Sopenharmony_ci * shadowBlurRadius:  Sets the shadow blur radius.
56bafb9395Sopenharmony_ci * shadowOffsetX:     Sets the abscissa offset of the shadow.
57bafb9395Sopenharmony_ci * shadowOffsetY:     Sets the shadow ordinate offset.
58bafb9395Sopenharmony_ci * shadowColor:       Set shadow color.
59bafb9395Sopenharmony_ci */
60bafb9395Sopenharmony_civoid Paint::Init(const Paint& paint)
61bafb9395Sopenharmony_ci{
62bafb9395Sopenharmony_ci    style_ = paint.style_;
63bafb9395Sopenharmony_ci    fillColor_ = paint.fillColor_;
64bafb9395Sopenharmony_ci    strokeColor_ = paint.strokeColor_;
65bafb9395Sopenharmony_ci    strokeWidth_ = paint.strokeWidth_;
66bafb9395Sopenharmony_ci    opacity_ = paint.opacity_;
67bafb9395Sopenharmony_ci#if defined(GRAPHIC_ENABLE_LINECAP_FLAG) && GRAPHIC_ENABLE_LINECAP_FLAG
68bafb9395Sopenharmony_ci    lineCap_ = paint.lineCap_;
69bafb9395Sopenharmony_ci#endif
70bafb9395Sopenharmony_ci#if defined(GRAPHIC_ENABLE_LINEJOIN_FLAG) && GRAPHIC_ENABLE_LINEJOIN_FLAG
71bafb9395Sopenharmony_ci    lineJoin_ = paint.lineJoin_;
72bafb9395Sopenharmony_ci#endif
73bafb9395Sopenharmony_ci#if defined(GRAPHIC_ENABLE_DASH_GENERATE_FLAG) && GRAPHIC_ENABLE_DASH_GENERATE_FLAG
74bafb9395Sopenharmony_ci    isDashMode_ = paint.isDashMode_;
75bafb9395Sopenharmony_ci    dashOffset_ = paint.dashOffset_;
76bafb9395Sopenharmony_ci    dashArray_ = paint.dashArray_;
77bafb9395Sopenharmony_ci    ndashes_ = paint.ndashes_;
78bafb9395Sopenharmony_ci#endif
79bafb9395Sopenharmony_ci    changeFlag_ = paint.changeFlag_;
80bafb9395Sopenharmony_ci    scaleRadioX_ = paint.scaleRadioX_;
81bafb9395Sopenharmony_ci    scaleRadioY_ = paint.scaleRadioY_;
82bafb9395Sopenharmony_ci    translationX_ = paint.translationX_;
83bafb9395Sopenharmony_ci    translationY_ = paint.translationY_;
84bafb9395Sopenharmony_ci    InitDash(paint);
85bafb9395Sopenharmony_ci#if defined(GRAPHIC_ENABLE_LINEJOIN_FLAG) && GRAPHIC_ENABLE_LINEJOIN_FLAG
86bafb9395Sopenharmony_ci    miterLimit_ = paint.miterLimit_;
87bafb9395Sopenharmony_ci#endif
88bafb9395Sopenharmony_ci#if defined(GRAPHIC_ENABLE_GRADIENT_FILL_FLAG) && GRAPHIC_ENABLE_GRADIENT_FILL_FLAG
89bafb9395Sopenharmony_ci    linearGradientPoint_ = paint.linearGradientPoint_;
90bafb9395Sopenharmony_ci    radialGradientPoint_ = paint.radialGradientPoint_;
91bafb9395Sopenharmony_ci    stopAndColors_ = paint.stopAndColors_;
92bafb9395Sopenharmony_ci    gradientflag_ = paint.gradientflag_;
93bafb9395Sopenharmony_ci#endif
94bafb9395Sopenharmony_ci#if defined(GRAPHIC_ENABLE_PATTERN_FILL_FLAG) && GRAPHIC_ENABLE_PATTERN_FILL_FLAG
95bafb9395Sopenharmony_ci    patternRepeat_ = paint.patternRepeat_;
96bafb9395Sopenharmony_ci#endif
97bafb9395Sopenharmony_ci#if defined(GRAPHIC_ENABLE_SHADOW_EFFECT_FLAG) && GRAPHIC_ENABLE_SHADOW_EFFECT_FLAG
98bafb9395Sopenharmony_ci    shadowBlurRadius_ = paint.shadowBlurRadius_;
99bafb9395Sopenharmony_ci    shadowOffsetX_ = paint.shadowOffsetX_;
100bafb9395Sopenharmony_ci    shadowOffsetY_ = paint.shadowOffsetY_;
101bafb9395Sopenharmony_ci    shadowColor_ = paint.shadowColor_;
102bafb9395Sopenharmony_ci    haveShadow_ = paint.haveShadow_;
103bafb9395Sopenharmony_ci#endif
104bafb9395Sopenharmony_ci    globalAlpha_ = paint.globalAlpha_;
105bafb9395Sopenharmony_ci    globalCompositeOperation_ = paint.globalCompositeOperation_;
106bafb9395Sopenharmony_ci    rotateAngle_ = paint.rotateAngle_;
107bafb9395Sopenharmony_ci    transfrom_ = paint.transfrom_;
108bafb9395Sopenharmony_ci    haveComposite_ = paint.haveComposite_;
109bafb9395Sopenharmony_ci}
110bafb9395Sopenharmony_ci
111bafb9395Sopenharmony_civoid Paint::SetStrokeStyle(ColorType color)
112bafb9395Sopenharmony_ci{
113bafb9395Sopenharmony_ci    SetStyle(Paint::STROKE_STYLE);
114bafb9395Sopenharmony_ci    SetStrokeColor(color);
115bafb9395Sopenharmony_ci}
116bafb9395Sopenharmony_ci
117bafb9395Sopenharmony_civoid Paint::SetFillStyle(ColorType color)
118bafb9395Sopenharmony_ci{
119bafb9395Sopenharmony_ci    SetStyle(Paint::FILL_STYLE);
120bafb9395Sopenharmony_ci    SetFillColor(color);
121bafb9395Sopenharmony_ci}
122bafb9395Sopenharmony_ci
123bafb9395Sopenharmony_civoid Paint::SetStrokeColor(ColorType color)
124bafb9395Sopenharmony_ci{
125bafb9395Sopenharmony_ci    strokeColor_ = color;
126bafb9395Sopenharmony_ci    changeFlag_ = true;
127bafb9395Sopenharmony_ci}
128bafb9395Sopenharmony_ci
129bafb9395Sopenharmony_civoid Paint::SetFillColor(ColorType color)
130bafb9395Sopenharmony_ci{
131bafb9395Sopenharmony_ci    fillColor_ = color;
132bafb9395Sopenharmony_ci    changeFlag_ = true;
133bafb9395Sopenharmony_ci}
134bafb9395Sopenharmony_ci
135bafb9395Sopenharmony_ci#if defined(GRAPHIC_ENABLE_LINECAP_FLAG) && GRAPHIC_ENABLE_LINECAP_FLAG
136bafb9395Sopenharmony_civoid Paint::SetLineCap(LineCap lineCap)
137bafb9395Sopenharmony_ci{
138bafb9395Sopenharmony_ci    lineCap_ = lineCap;
139bafb9395Sopenharmony_ci    changeFlag_ = true;
140bafb9395Sopenharmony_ci}
141bafb9395Sopenharmony_ci#endif
142bafb9395Sopenharmony_ci
143bafb9395Sopenharmony_ci#if defined(GRAPHIC_ENABLE_LINEJOIN_FLAG) && GRAPHIC_ENABLE_LINEJOIN_FLAG
144bafb9395Sopenharmony_civoid Paint::SetLineJoin(LineJoin lineJoin)
145bafb9395Sopenharmony_ci{
146bafb9395Sopenharmony_ci    lineJoin_ = lineJoin;
147bafb9395Sopenharmony_ci    changeFlag_ = true;
148bafb9395Sopenharmony_ci}
149bafb9395Sopenharmony_ci#endif
150bafb9395Sopenharmony_ci
151bafb9395Sopenharmony_ci#if defined(GRAPHIC_ENABLE_LINEJOIN_FLAG) && GRAPHIC_ENABLE_LINEJOIN_FLAG
152bafb9395Sopenharmony_civoid Paint::SetMiterLimit(float miterLimit)
153bafb9395Sopenharmony_ci{
154bafb9395Sopenharmony_ci    miterLimit_ = miterLimit;
155bafb9395Sopenharmony_ci    changeFlag_ = true;
156bafb9395Sopenharmony_ci}
157bafb9395Sopenharmony_ci#endif
158bafb9395Sopenharmony_ci
159bafb9395Sopenharmony_ci#if defined(GRAPHIC_ENABLE_DASH_GENERATE_FLAG) && GRAPHIC_ENABLE_DASH_GENERATE_FLAG
160bafb9395Sopenharmony_civoid Paint::SetLineDash(float* lineDashs, const uint32_t ndash)
161bafb9395Sopenharmony_ci{
162bafb9395Sopenharmony_ci    ClearLineDash();
163bafb9395Sopenharmony_ci    if (lineDashs == nullptr || ndash == 0) {
164bafb9395Sopenharmony_ci        return;
165bafb9395Sopenharmony_ci    }
166bafb9395Sopenharmony_ci    ndashes_ = ndash;
167bafb9395Sopenharmony_ci    isDashMode_ = true;
168bafb9395Sopenharmony_ci    dashArray_ = new float[ndashes_];
169bafb9395Sopenharmony_ci    if (dashArray_) {
170bafb9395Sopenharmony_ci        if (memset_s(dashArray_, ndashes_ * sizeof(float), 0, ndashes_ * sizeof(float)) != EOF) {
171bafb9395Sopenharmony_ci        }
172bafb9395Sopenharmony_ci        for (uint32_t iIndex = 0; iIndex < ndashes_; iIndex++) {
173bafb9395Sopenharmony_ci            dashArray_[iIndex] = lineDashs[iIndex];
174bafb9395Sopenharmony_ci        }
175bafb9395Sopenharmony_ci    } else {
176bafb9395Sopenharmony_ci        ndashes_ = 0;
177bafb9395Sopenharmony_ci        dashOffset_ = 0;
178bafb9395Sopenharmony_ci        isDashMode_ = false;
179bafb9395Sopenharmony_ci    }
180bafb9395Sopenharmony_ci    changeFlag_ = true;
181bafb9395Sopenharmony_ci}
182bafb9395Sopenharmony_ci
183bafb9395Sopenharmony_civoid Paint::SetLineDashOffset(float offset)
184bafb9395Sopenharmony_ci{
185bafb9395Sopenharmony_ci    dashOffset_ = offset;
186bafb9395Sopenharmony_ci    changeFlag_ = true;
187bafb9395Sopenharmony_ci    isDashMode_ = true;
188bafb9395Sopenharmony_ci}
189bafb9395Sopenharmony_ci
190bafb9395Sopenharmony_civoid Paint::ClearLineDash(void)
191bafb9395Sopenharmony_ci{
192bafb9395Sopenharmony_ci    dashOffset_ = 0;
193bafb9395Sopenharmony_ci    ndashes_ = 0;
194bafb9395Sopenharmony_ci    isDashMode_ = false;
195bafb9395Sopenharmony_ci    if (dashArray_ != nullptr) {
196bafb9395Sopenharmony_ci        delete[] dashArray_;
197bafb9395Sopenharmony_ci        dashArray_ = nullptr;
198bafb9395Sopenharmony_ci    }
199bafb9395Sopenharmony_ci}
200bafb9395Sopenharmony_ci#endif
201bafb9395Sopenharmony_ci
202bafb9395Sopenharmony_ci#if defined(GRAPHIC_ENABLE_GRADIENT_FILL_FLAG) && GRAPHIC_ENABLE_GRADIENT_FILL_FLAG
203bafb9395Sopenharmony_civoid Paint::createLinearGradient(float startx, float starty, float endx, float endy)
204bafb9395Sopenharmony_ci{
205bafb9395Sopenharmony_ci    gradientflag_ = Linear;
206bafb9395Sopenharmony_ci    linearGradientPoint_.x0 = startx;
207bafb9395Sopenharmony_ci    linearGradientPoint_.y0 = starty;
208bafb9395Sopenharmony_ci    linearGradientPoint_.x1 = endx;
209bafb9395Sopenharmony_ci    linearGradientPoint_.y1 = endy;
210bafb9395Sopenharmony_ci    changeFlag_ = true;
211bafb9395Sopenharmony_ci}
212bafb9395Sopenharmony_ci
213bafb9395Sopenharmony_civoid Paint::addColorStop(float stop, ColorType color)
214bafb9395Sopenharmony_ci{
215bafb9395Sopenharmony_ci    StopAndColor stopAndColor;
216bafb9395Sopenharmony_ci    stopAndColor.stop = stop;
217bafb9395Sopenharmony_ci    stopAndColor.color = color;
218bafb9395Sopenharmony_ci    stopAndColors_.PushBack(stopAndColor);
219bafb9395Sopenharmony_ci}
220bafb9395Sopenharmony_ci
221bafb9395Sopenharmony_civoid Paint::createRadialGradient(float start_x, float start_y, float start_r, float end_x, float end_y, float end_r)
222bafb9395Sopenharmony_ci{
223bafb9395Sopenharmony_ci    gradientflag_ = Radial;
224bafb9395Sopenharmony_ci    radialGradientPoint_.x0 = start_x;
225bafb9395Sopenharmony_ci    radialGradientPoint_.y0 = start_y;
226bafb9395Sopenharmony_ci    radialGradientPoint_.r0 = start_r;
227bafb9395Sopenharmony_ci    radialGradientPoint_.x1 = end_x;
228bafb9395Sopenharmony_ci    radialGradientPoint_.y1 = end_y;
229bafb9395Sopenharmony_ci    radialGradientPoint_.r1 = end_r;
230bafb9395Sopenharmony_ci    changeFlag_ = true;
231bafb9395Sopenharmony_ci}
232bafb9395Sopenharmony_ci#endif
233bafb9395Sopenharmony_ci
234bafb9395Sopenharmony_ci#if defined(GRAPHIC_ENABLE_PATTERN_FILL_FLAG) && GRAPHIC_ENABLE_PATTERN_FILL_FLAG
235bafb9395Sopenharmony_civoid Paint::CreatePattern(const char* img, PatternRepeatMode patternRepeat)
236bafb9395Sopenharmony_ci{
237bafb9395Sopenharmony_ci    image_ = img;
238bafb9395Sopenharmony_ci    patternRepeat_ = patternRepeat;
239bafb9395Sopenharmony_ci    changeFlag_ = true;
240bafb9395Sopenharmony_ci}
241bafb9395Sopenharmony_ci#endif
242bafb9395Sopenharmony_ci
243bafb9395Sopenharmony_ci#if defined(GRAPHIC_ENABLE_SHADOW_EFFECT_FLAG) && GRAPHIC_ENABLE_SHADOW_EFFECT_FLAG
244bafb9395Sopenharmony_civoid Paint::SetShadowBlur(uint16_t radius)
245bafb9395Sopenharmony_ci{
246bafb9395Sopenharmony_ci    shadowBlurRadius_ = radius;
247bafb9395Sopenharmony_ci    changeFlag_ = true;
248bafb9395Sopenharmony_ci}
249bafb9395Sopenharmony_ci
250bafb9395Sopenharmony_civoid Paint::SetShadowOffsetX(float offset)
251bafb9395Sopenharmony_ci{
252bafb9395Sopenharmony_ci    shadowOffsetX_ = offset;
253bafb9395Sopenharmony_ci    changeFlag_ = true;
254bafb9395Sopenharmony_ci}
255bafb9395Sopenharmony_ci
256bafb9395Sopenharmony_civoid Paint::SetShadowOffsetY(float offset)
257bafb9395Sopenharmony_ci{
258bafb9395Sopenharmony_ci    shadowOffsetY_ = offset;
259bafb9395Sopenharmony_ci    changeFlag_ = true;
260bafb9395Sopenharmony_ci}
261bafb9395Sopenharmony_ci
262bafb9395Sopenharmony_civoid Paint::SetShadowColor(ColorType color)
263bafb9395Sopenharmony_ci{
264bafb9395Sopenharmony_ci    shadowColor_ = color;
265bafb9395Sopenharmony_ci    changeFlag_ = true;
266bafb9395Sopenharmony_ci    haveShadow_ = true;
267bafb9395Sopenharmony_ci}
268bafb9395Sopenharmony_ci#endif
269bafb9395Sopenharmony_ci
270bafb9395Sopenharmony_civoid Paint::SetGlobalAlpha(float alphaPercentage)
271bafb9395Sopenharmony_ci{
272bafb9395Sopenharmony_ci    if (alphaPercentage > 1) {
273bafb9395Sopenharmony_ci        globalAlpha_ = 1.0;
274bafb9395Sopenharmony_ci        return;
275bafb9395Sopenharmony_ci    }
276bafb9395Sopenharmony_ci    if (alphaPercentage < 0) {
277bafb9395Sopenharmony_ci        globalAlpha_ = 0.0;
278bafb9395Sopenharmony_ci        return;
279bafb9395Sopenharmony_ci    }
280bafb9395Sopenharmony_ci    globalAlpha_ = alphaPercentage;
281bafb9395Sopenharmony_ci    changeFlag_ = true;
282bafb9395Sopenharmony_ci}
283bafb9395Sopenharmony_ci
284bafb9395Sopenharmony_civoid Paint::SetGlobalCompositeOperation(GlobalCompositeOperation globalCompositeOperation)
285bafb9395Sopenharmony_ci{
286bafb9395Sopenharmony_ci    globalCompositeOperation_ = globalCompositeOperation;
287bafb9395Sopenharmony_ci    changeFlag_ = true;
288bafb9395Sopenharmony_ci    if (globalCompositeOperation != SOURCE_OVER) {
289bafb9395Sopenharmony_ci        haveComposite_ = true;
290bafb9395Sopenharmony_ci    }
291bafb9395Sopenharmony_ci}
292bafb9395Sopenharmony_ci
293bafb9395Sopenharmony_civoid Paint::Scale(float scaleX, float scaleY)
294bafb9395Sopenharmony_ci{
295bafb9395Sopenharmony_ci    this->scaleRadioX_ *= scaleX;
296bafb9395Sopenharmony_ci    this->scaleRadioY_ *= scaleX;
297bafb9395Sopenharmony_ci    if (rotateAngle_ > 0.0f || rotateAngle_ < 0) {
298bafb9395Sopenharmony_ci        transfrom_.Rotate(-rotateAngle_ * PI / BOXER);
299bafb9395Sopenharmony_ci        transfrom_.Scale(scaleX, scaleY);
300bafb9395Sopenharmony_ci        transfrom_.Rotate(rotateAngle_ * PI / BOXER);
301bafb9395Sopenharmony_ci    } else {
302bafb9395Sopenharmony_ci        transfrom_.Scale(scaleX, scaleY);
303bafb9395Sopenharmony_ci    }
304bafb9395Sopenharmony_ci    changeFlag_ = true;
305bafb9395Sopenharmony_ci}
306bafb9395Sopenharmony_ci
307bafb9395Sopenharmony_civoid Paint::Rotate(float angle)
308bafb9395Sopenharmony_ci{
309bafb9395Sopenharmony_ci    changeFlag_ = true;
310bafb9395Sopenharmony_ci    transfrom_.Rotate(angle * PI / BOXER);
311bafb9395Sopenharmony_ci    rotateAngle_ += angle;
312bafb9395Sopenharmony_ci}
313bafb9395Sopenharmony_ci
314bafb9395Sopenharmony_civoid Paint::Rotate(float angle, int16_t x, int16_t y)
315bafb9395Sopenharmony_ci{
316bafb9395Sopenharmony_ci    transfrom_.Translate(-x, -y);
317bafb9395Sopenharmony_ci    transfrom_.Rotate(angle * PI / BOXER);
318bafb9395Sopenharmony_ci    rotateAngle_ += angle;
319bafb9395Sopenharmony_ci    transfrom_.Translate(x, y);
320bafb9395Sopenharmony_ci    changeFlag_ = true;
321bafb9395Sopenharmony_ci}
322bafb9395Sopenharmony_ci
323bafb9395Sopenharmony_civoid Paint::Translate(int16_t x, int16_t y)
324bafb9395Sopenharmony_ci{
325bafb9395Sopenharmony_ci    changeFlag_ = true;
326bafb9395Sopenharmony_ci    transfrom_.Translate(x, y);
327bafb9395Sopenharmony_ci    this->translationX_ += x;
328bafb9395Sopenharmony_ci    this->translationY_ += y;
329bafb9395Sopenharmony_ci}
330bafb9395Sopenharmony_ci
331bafb9395Sopenharmony_civoid Paint::SetTransform(float scaleX, float shearX, float shearY,
332bafb9395Sopenharmony_ci                         float scaleY, int16_t transLateX, int16_t transLateY)
333bafb9395Sopenharmony_ci{
334bafb9395Sopenharmony_ci    transfrom_.Reset();
335bafb9395Sopenharmony_ci    rotateAngle_ = 0;
336bafb9395Sopenharmony_ci    Transform(scaleX, shearX, shearY, scaleY, transLateX, transLateY);
337bafb9395Sopenharmony_ci    changeFlag_ = true;
338bafb9395Sopenharmony_ci}
339bafb9395Sopenharmony_ci
340bafb9395Sopenharmony_civoid Paint::Transform(float scaleX, float shearX, float shearY, float scaleY, int16_t transLateX, int16_t transLateY)
341bafb9395Sopenharmony_ci{
342bafb9395Sopenharmony_ci    changeFlag_ = true;
343bafb9395Sopenharmony_ci    this->translationX_ += transLateX;
344bafb9395Sopenharmony_ci    this->translationY_ += transLateY;
345bafb9395Sopenharmony_ci    transLateX += transfrom_.GetData()[2];
346bafb9395Sopenharmony_ci    transLateY += transfrom_.GetData()[5];
347bafb9395Sopenharmony_ci    transfrom_.Translate(-transfrom_.GetData()[2], -transfrom_.GetData()[5]);
348bafb9395Sopenharmony_ci    Scale(scaleX, scaleY);
349bafb9395Sopenharmony_ci    transfrom_.Translate(transLateX, transLateY);
350bafb9395Sopenharmony_ci    transfrom_.SetData(1, transfrom_.GetData()[1] + shearX);
351bafb9395Sopenharmony_ci    transfrom_.SetData(3, transfrom_.GetData()[3] + shearY);
352bafb9395Sopenharmony_ci}
353bafb9395Sopenharmony_ci} // namespace OHOS