1 /*
2 * Copyright (c) 2021-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 "pipeline/rs_draw_cmd.h"
17
18 #include "pixel_map_rosen_utils.h"
19 #include "rs_trace.h"
20 #include "securec.h"
21
22 #include "pipeline/rs_paint_filter_canvas.h"
23 #include "pipeline/rs_root_render_node.h"
24 #include "platform/common/rs_log.h"
25 #include "platform/common/rs_system_properties.h"
26
27 namespace OHOS {
28 namespace Rosen {
29 namespace {
30 constexpr int32_t CORNER_SIZE = 4;
SimplifyPaint(uint32_t color,SkPaint * paint)31 void SimplifyPaint(uint32_t color, SkPaint* paint)
32 {
33 paint->setColor(color);
34 paint->setShader(nullptr);
35 paint->setColorFilter(nullptr);
36 paint->setStrokeWidth(1.04); // 1.04 is empirical value
37 paint->setStrokeJoin(SkPaint::kRound_Join);
38 }
39 } // namespace
40
GenerateCachedOpItem(SkSurface * surface) const41 std::unique_ptr<OpItem> OpItem::GenerateCachedOpItem(SkSurface* surface) const
42 {
43 // check if this opItem can be cached
44 auto optionalBounds = GetCacheBounds();
45 if (!optionalBounds.has_value() || optionalBounds.value().isEmpty()) {
46 return nullptr;
47 }
48 auto& bounds = optionalBounds.value();
49
50 // create surface & canvas to draw onto
51 auto offscreenInfo =
52 SkImageInfo::Make(bounds.width(), bounds.height(), kRGBA_8888_SkColorType, kPremul_SkAlphaType);
53 sk_sp<SkSurface> offscreenSurface;
54 if (surface != nullptr) {
55 // create GPU accelerated surface
56 offscreenSurface = surface->makeSurface(offscreenInfo);
57 } else {
58 // create CPU raster surface
59 offscreenSurface = SkSurface::MakeRaster(offscreenInfo);
60 }
61 if (offscreenSurface == nullptr) {
62 RS_LOGW("OpItem::GenerateCachedOpItem Failed to create offscreen surface, abort caching");
63 return nullptr;
64 }
65 auto offscreenCanvas = RSPaintFilterCanvas(offscreenSurface.get());
66
67 // align draw op to [0, 0]
68 if (bounds.left() != 0 || bounds.top() != 0) {
69 SkMatrix matrix;
70 matrix.setTranslate(-bounds.left(), -bounds.top());
71 offscreenCanvas.concat(matrix);
72 }
73
74 // draw on the bitmap. NOTE: we cannot cache draw ops depending on rect, because the rect may be changed
75 Draw(offscreenCanvas, nullptr);
76 // flush to make sure all drawing commands are executed, maybe unnecessary
77 offscreenCanvas.flush();
78
79 // generate BitmapOpItem with correct offset
80 SkPaint paint;
81 paint.setAntiAlias(true);
82 return std::make_unique<BitmapOpItem>(offscreenSurface->makeImageSnapshot(), bounds.x(), bounds.y(), &paint);
83 }
84
RectOpItem(SkRect rect,const SkPaint & paint)85 RectOpItem::RectOpItem(SkRect rect, const SkPaint& paint) : OpItemWithPaint(sizeof(RectOpItem)), rect_(rect)
86 {
87 paint_ = paint;
88 }
89
Draw(RSPaintFilterCanvas & canvas,const SkRect *) const90 void RectOpItem::Draw(RSPaintFilterCanvas& canvas, const SkRect*) const
91 {
92 canvas.drawRect(rect_, paint_);
93 }
94
RoundRectOpItem(const SkRRect & rrect,const SkPaint & paint)95 RoundRectOpItem::RoundRectOpItem(const SkRRect& rrect, const SkPaint& paint)
96 : OpItemWithPaint(sizeof(RoundRectOpItem)), rrect_(rrect)
97 {
98 paint_ = paint;
99 }
100
Draw(RSPaintFilterCanvas & canvas,const SkRect *) const101 void RoundRectOpItem::Draw(RSPaintFilterCanvas& canvas, const SkRect*) const
102 {
103 canvas.drawRRect(rrect_, paint_);
104 }
105
DRRectOpItem(const SkRRect & outer,const SkRRect & inner,const SkPaint & paint)106 DRRectOpItem::DRRectOpItem(const SkRRect& outer, const SkRRect& inner, const SkPaint& paint)
107 : OpItemWithPaint(sizeof(DRRectOpItem))
108 {
109 outer_ = outer;
110 inner_ = inner;
111 paint_ = paint;
112 }
113
Draw(RSPaintFilterCanvas & canvas,const SkRect *) const114 void DRRectOpItem::Draw(RSPaintFilterCanvas& canvas, const SkRect*) const
115 {
116 canvas.drawDRRect(outer_, inner_, paint_);
117 }
118
OvalOpItem(SkRect rect,const SkPaint & paint)119 OvalOpItem::OvalOpItem(SkRect rect, const SkPaint& paint) : OpItemWithPaint(sizeof(OvalOpItem)), rect_(rect)
120 {
121 paint_ = paint;
122 }
123
Draw(RSPaintFilterCanvas & canvas,const SkRect *) const124 void OvalOpItem::Draw(RSPaintFilterCanvas& canvas, const SkRect*) const
125 {
126 canvas.drawOval(rect_, paint_);
127 }
128
RegionOpItem(SkRegion region,const SkPaint & paint)129 RegionOpItem::RegionOpItem(SkRegion region, const SkPaint& paint) : OpItemWithPaint(sizeof(RegionOpItem))
130 {
131 region_ = region;
132 paint_ = paint;
133 }
134
Draw(RSPaintFilterCanvas & canvas,const SkRect *) const135 void RegionOpItem::Draw(RSPaintFilterCanvas& canvas, const SkRect*) const
136 {
137 canvas.drawRegion(region_, paint_);
138 }
139
ArcOpItem(const SkRect & rect,float startAngle,float sweepAngle,bool useCenter,const SkPaint & paint)140 ArcOpItem::ArcOpItem(const SkRect& rect, float startAngle, float sweepAngle, bool useCenter, const SkPaint& paint)
141 : OpItemWithPaint(sizeof(ArcOpItem)), rect_(rect), startAngle_(startAngle), sweepAngle_(sweepAngle),
142 useCenter_(useCenter)
143 {
144 paint_ = paint;
145 }
146
Draw(RSPaintFilterCanvas & canvas,const SkRect *) const147 void ArcOpItem::Draw(RSPaintFilterCanvas& canvas, const SkRect*) const
148 {
149 canvas.drawArc(rect_, startAngle_, sweepAngle_, useCenter_, paint_);
150 }
151
SaveOpItem()152 SaveOpItem::SaveOpItem() : OpItem(sizeof(SaveOpItem)) {}
153
Draw(RSPaintFilterCanvas & canvas,const SkRect *) const154 void SaveOpItem::Draw(RSPaintFilterCanvas& canvas, const SkRect*) const
155 {
156 canvas.save();
157 }
158
RestoreOpItem()159 RestoreOpItem::RestoreOpItem() : OpItem(sizeof(RestoreOpItem)) {}
160
Draw(RSPaintFilterCanvas & canvas,const SkRect *) const161 void RestoreOpItem::Draw(RSPaintFilterCanvas& canvas, const SkRect*) const
162 {
163 canvas.restore();
164 }
165
FlushOpItem()166 FlushOpItem::FlushOpItem() : OpItem(sizeof(FlushOpItem)) {}
167
Draw(RSPaintFilterCanvas & canvas,const SkRect *) const168 void FlushOpItem::Draw(RSPaintFilterCanvas& canvas, const SkRect*) const
169 {
170 canvas.flush();
171 }
172
MatrixOpItem(const SkMatrix & matrix)173 MatrixOpItem::MatrixOpItem(const SkMatrix& matrix) : OpItem(sizeof(MatrixOpItem)), matrix_(matrix) {}
174
Draw(RSPaintFilterCanvas & canvas,const SkRect *) const175 void MatrixOpItem::Draw(RSPaintFilterCanvas& canvas, const SkRect*) const
176 {
177 canvas.setMatrix(matrix_);
178 }
179
ClipRectOpItem(const SkRect & rect,SkClipOp op,bool doAA)180 ClipRectOpItem::ClipRectOpItem(const SkRect& rect, SkClipOp op, bool doAA)
181 : OpItem(sizeof(ClipRectOpItem)), rect_(rect), clipOp_(op), doAA_(doAA)
182 {}
183
Draw(RSPaintFilterCanvas & canvas,const SkRect *) const184 void ClipRectOpItem::Draw(RSPaintFilterCanvas& canvas, const SkRect*) const
185 {
186 canvas.clipRect(rect_, clipOp_, doAA_);
187 }
188
ClipRRectOpItem(const SkRRect & rrect,SkClipOp op,bool doAA)189 ClipRRectOpItem::ClipRRectOpItem(const SkRRect& rrect, SkClipOp op, bool doAA)
190 : OpItem(sizeof(ClipRRectOpItem)), rrect_(rrect), clipOp_(op), doAA_(doAA)
191 {}
192
Draw(RSPaintFilterCanvas & canvas,const SkRect *) const193 void ClipRRectOpItem::Draw(RSPaintFilterCanvas& canvas, const SkRect*) const
194 {
195 canvas.clipRRect(rrect_, clipOp_, doAA_);
196 }
197
ClipRegionOpItem(const SkRegion & region,SkClipOp op)198 ClipRegionOpItem::ClipRegionOpItem(const SkRegion& region, SkClipOp op)
199 : OpItem(sizeof(ClipRegionOpItem)), region_(region), clipOp_(op)
200 {}
201
Draw(RSPaintFilterCanvas & canvas,const SkRect *) const202 void ClipRegionOpItem::Draw(RSPaintFilterCanvas& canvas, const SkRect*) const
203 {
204 canvas.clipRegion(region_, clipOp_);
205 }
206
TranslateOpItem(float distanceX,float distanceY)207 TranslateOpItem::TranslateOpItem(float distanceX, float distanceY)
208 : OpItem(sizeof(TranslateOpItem)), distanceX_(distanceX), distanceY_(distanceY)
209 {}
210
Draw(RSPaintFilterCanvas & canvas,const SkRect *) const211 void TranslateOpItem::Draw(RSPaintFilterCanvas& canvas, const SkRect*) const
212 {
213 canvas.translate(distanceX_, distanceY_);
214 }
215
TextBlobOpItem(const sk_sp<SkTextBlob> textBlob,float x,float y,const SkPaint & paint)216 TextBlobOpItem::TextBlobOpItem(const sk_sp<SkTextBlob> textBlob, float x, float y, const SkPaint& paint)
217 : OpItemWithPaint(sizeof(TextBlobOpItem)), textBlob_(textBlob), x_(x), y_(y)
218 {
219 paint_ = paint;
220 }
221
Draw(RSPaintFilterCanvas & canvas,const SkRect *) const222 void TextBlobOpItem::Draw(RSPaintFilterCanvas& canvas, const SkRect*) const
223 {
224 bool isHighContrastEnabled = canvas.isHighContrastEnabled();
225 if (isHighContrastEnabled) {
226 ROSEN_LOGD("TextBlobOpItem::Draw highContrastEnabled");
227 uint32_t color = paint_.getColor();
228 uint32_t channelSum = SkColorGetR(color) + SkColorGetG(color) + SkColorGetB(color);
229 bool flag = channelSum < 384; // 384 is empirical value
230
231 SkPaint outlinePaint(paint_);
232 SimplifyPaint(flag ? SK_ColorWHITE : SK_ColorBLACK, &outlinePaint);
233 outlinePaint.setStyle(SkPaint::kStrokeAndFill_Style);
234 canvas.drawTextBlob(textBlob_, x_, y_, outlinePaint);
235
236 SkPaint innerPaint(paint_);
237 SimplifyPaint(SK_ColorBLACK, &innerPaint);
238 innerPaint.setStyle(SkPaint::kFill_Style);
239 canvas.drawTextBlob(textBlob_, x_, y_, innerPaint);
240 } else {
241 canvas.drawTextBlob(textBlob_, x_, y_, paint_);
242 }
243 }
244
BitmapOpItem(const sk_sp<SkImage> bitmapInfo,float left,float top,const SkPaint * paint)245 BitmapOpItem::BitmapOpItem(const sk_sp<SkImage> bitmapInfo, float left, float top, const SkPaint* paint)
246 : OpItemWithPaint(sizeof(BitmapOpItem)), left_(left), top_(top)
247 {
248 if (bitmapInfo != nullptr) {
249 bitmapInfo_ = bitmapInfo;
250 }
251 if (paint) {
252 paint_ = *paint;
253 }
254 }
255
Draw(RSPaintFilterCanvas & canvas,const SkRect *) const256 void BitmapOpItem::Draw(RSPaintFilterCanvas& canvas, const SkRect*) const
257 {
258 canvas.drawImage(bitmapInfo_, left_, top_, &paint_);
259 }
260
BitmapRectOpItem(const sk_sp<SkImage> bitmapInfo,const SkRect * rectSrc,const SkRect & rectDst,const SkPaint * paint)261 BitmapRectOpItem::BitmapRectOpItem(
262 const sk_sp<SkImage> bitmapInfo, const SkRect* rectSrc, const SkRect& rectDst, const SkPaint* paint)
263 : OpItemWithPaint(sizeof(BitmapRectOpItem)), rectDst_(rectDst)
264 {
265 if (bitmapInfo != nullptr) {
266 rectSrc_ = (rectSrc == nullptr) ? SkRect::MakeWH(bitmapInfo->width(), bitmapInfo->height()) : *rectSrc;
267 bitmapInfo_ = bitmapInfo;
268 } else {
269 if (rectSrc != nullptr) {
270 rectSrc_ = *rectSrc;
271 }
272 }
273 if (paint) {
274 paint_ = *paint;
275 }
276 }
277
Draw(RSPaintFilterCanvas & canvas,const SkRect *) const278 void BitmapRectOpItem::Draw(RSPaintFilterCanvas& canvas, const SkRect*) const
279 {
280 canvas.drawImageRect(bitmapInfo_, rectSrc_, rectDst_, &paint_);
281 }
282
PixelMapOpItem(const std::shared_ptr<Media::PixelMap> & pixelmap,float left,float top,const SkPaint * paint)283 PixelMapOpItem::PixelMapOpItem(
284 const std::shared_ptr<Media::PixelMap>& pixelmap, float left, float top, const SkPaint* paint)
285 : OpItemWithPaint(sizeof(PixelMapOpItem)), pixelmap_(pixelmap), left_(left), top_(top)
286 {
287 if (paint) {
288 paint_ = *paint;
289 }
290 }
291
Draw(RSPaintFilterCanvas & canvas,const SkRect *) const292 void PixelMapOpItem::Draw(RSPaintFilterCanvas& canvas, const SkRect*) const
293 {
294 sk_sp<SkImage> skImage = Media::PixelMapRosenUtils::ExtractSkImage(pixelmap_);
295 canvas.drawImage(skImage, left_, top_, &paint_);
296 }
297
PixelMapRectOpItem(const std::shared_ptr<Media::PixelMap> & pixelmap,const SkRect & src,const SkRect & dst,const SkPaint * paint)298 PixelMapRectOpItem::PixelMapRectOpItem(
299 const std::shared_ptr<Media::PixelMap>& pixelmap, const SkRect& src, const SkRect& dst, const SkPaint* paint)
300 : OpItemWithPaint(sizeof(PixelMapRectOpItem)), pixelmap_(pixelmap), src_(src), dst_(dst)
301 {
302 if (paint) {
303 paint_ = *paint;
304 }
305 }
306
Draw(RSPaintFilterCanvas & canvas,const SkRect *) const307 void PixelMapRectOpItem::Draw(RSPaintFilterCanvas& canvas, const SkRect*) const
308 {
309 sk_sp<SkImage> skImage = Media::PixelMapRosenUtils::ExtractSkImage(pixelmap_);
310 canvas.drawImageRect(skImage, src_, dst_, &paint_);
311 }
312
BitmapNineOpItem(const sk_sp<SkImage> bitmapInfo,const SkIRect & center,const SkRect & rectDst,const SkPaint * paint)313 BitmapNineOpItem::BitmapNineOpItem(
314 const sk_sp<SkImage> bitmapInfo, const SkIRect& center, const SkRect& rectDst, const SkPaint* paint)
315 : OpItemWithPaint(sizeof(BitmapNineOpItem)), center_(center), rectDst_(rectDst)
316 {
317 if (bitmapInfo != nullptr) {
318 bitmapInfo_ = bitmapInfo;
319 }
320 if (paint) {
321 paint_ = *paint;
322 }
323 }
324
Draw(RSPaintFilterCanvas & canvas,const SkRect *) const325 void BitmapNineOpItem::Draw(RSPaintFilterCanvas& canvas, const SkRect*) const
326 {
327 canvas.drawImageNine(bitmapInfo_, center_, rectDst_, &paint_);
328 }
329
AdaptiveRRectOpItem(float radius,const SkPaint & paint)330 AdaptiveRRectOpItem::AdaptiveRRectOpItem(float radius, const SkPaint& paint)
331 : OpItemWithPaint(sizeof(AdaptiveRRectOpItem)), radius_(radius), paint_(paint)
332 {}
333
Draw(RSPaintFilterCanvas & canvas,const SkRect * rect) const334 void AdaptiveRRectOpItem::Draw(RSPaintFilterCanvas& canvas, const SkRect* rect) const
335 {
336 if (!rect) {
337 ROSEN_LOGE("AdaptiveRRectOpItem::Draw, skrect is null");
338 return;
339 }
340 SkRRect rrect = SkRRect::MakeRectXY(*rect, radius_, radius_);
341 canvas.drawRRect(rrect, paint_);
342 }
343
AdaptiveRRectScaleOpItem(float radiusRatio,const SkPaint & paint)344 AdaptiveRRectScaleOpItem::AdaptiveRRectScaleOpItem(float radiusRatio, const SkPaint& paint)
345 : OpItemWithPaint(sizeof(AdaptiveRRectScaleOpItem)), radiusRatio_(radiusRatio), paint_(paint)
346 {}
347
Draw(RSPaintFilterCanvas & canvas,const SkRect * rect) const348 void AdaptiveRRectScaleOpItem::Draw(RSPaintFilterCanvas& canvas, const SkRect* rect) const
349 {
350 if (!rect) {
351 ROSEN_LOGE("AdaptiveRRectScaleOpItem::Draw, skrect is null");
352 return;
353 }
354 SkRRect rrect = SkRRect::MakeRectXY(*rect, radiusRatio_ * (*rect).height(), radiusRatio_ * (*rect).height());
355 canvas.drawRRect(rrect, paint_);
356 }
357
ClipAdaptiveRRectOpItem(const SkVector radius[])358 ClipAdaptiveRRectOpItem::ClipAdaptiveRRectOpItem(const SkVector radius[])
359 : OpItem(sizeof(ClipAdaptiveRRectOpItem))
360 {
361 errno_t ret = memcpy_s(radius_, CORNER_SIZE * sizeof(SkVector), radius, CORNER_SIZE * sizeof(SkVector));
362 if (ret != EOK) {
363 ROSEN_LOGE("ClipAdaptiveRRectOpItem: memcpy failed!");
364 }
365 }
366
Draw(RSPaintFilterCanvas & canvas,const SkRect * rect) const367 void ClipAdaptiveRRectOpItem::Draw(RSPaintFilterCanvas& canvas, const SkRect* rect) const
368 {
369 if (!rect) {
370 ROSEN_LOGE("ClipAdaptiveRRectOpItem::Draw skrect is null");
371 return;
372 }
373 SkRRect rrect = SkRRect::MakeEmpty();
374 rrect.setRectRadii(*rect, radius_);
375 canvas.clipRRect(rrect, true);
376 }
377
ClipOutsetRectOpItem(float dx,float dy)378 ClipOutsetRectOpItem::ClipOutsetRectOpItem(float dx, float dy)
379 : OpItem(sizeof(ClipOutsetRectOpItem)), dx_(dx), dy_(dy)
380 {}
381
Draw(RSPaintFilterCanvas & canvas,const SkRect * rect) const382 void ClipOutsetRectOpItem::Draw(RSPaintFilterCanvas& canvas, const SkRect* rect) const
383 {
384 auto clipRect = canvas.getLocalClipBounds().makeOutset(dx_, dy_);
385 canvas.clipRect(clipRect, SkClipOp::kExtraEnumNeedInternallyPleaseIgnoreWillGoAway5, true);
386 }
387
PathOpItem(const SkPath & path,const SkPaint & paint)388 PathOpItem::PathOpItem(const SkPath& path, const SkPaint& paint) : OpItemWithPaint(sizeof(PathOpItem))
389 {
390 path_ = path;
391 paint_ = paint;
392 }
393
Draw(RSPaintFilterCanvas & canvas,const SkRect *) const394 void PathOpItem::Draw(RSPaintFilterCanvas& canvas, const SkRect*) const
395 {
396 canvas.drawPath(path_, paint_);
397 }
398
ClipPathOpItem(const SkPath & path,SkClipOp clipOp,bool doAA)399 ClipPathOpItem::ClipPathOpItem(const SkPath& path, SkClipOp clipOp, bool doAA)
400 : OpItem(sizeof(ClipPathOpItem)), path_(path), clipOp_(clipOp), doAA_(doAA)
401 {}
402
Draw(RSPaintFilterCanvas & canvas,const SkRect *) const403 void ClipPathOpItem::Draw(RSPaintFilterCanvas& canvas, const SkRect*) const
404 {
405 canvas.clipPath(path_, clipOp_, doAA_);
406 }
407
PaintOpItem(const SkPaint & paint)408 PaintOpItem::PaintOpItem(const SkPaint& paint) : OpItemWithPaint(sizeof(PaintOpItem))
409 {
410 paint_ = paint;
411 }
412
Draw(RSPaintFilterCanvas & canvas,const SkRect *) const413 void PaintOpItem::Draw(RSPaintFilterCanvas& canvas, const SkRect*) const
414 {
415 canvas.drawPaint(paint_);
416 }
417
ImageWithParmOpItem(const sk_sp<SkImage> img,const sk_sp<SkData> data,const RsImageInfo & rsimageInfo,const SkPaint & paint)418 ImageWithParmOpItem::ImageWithParmOpItem(const sk_sp<SkImage> img, const sk_sp<SkData> data,
419 const RsImageInfo& rsimageInfo, const SkPaint& paint)
420 : OpItemWithPaint(sizeof(ImageWithParmOpItem))
421 {
422 rsImage_ = std::make_shared<RSImage>();
423 rsImage_->SetImage(img);
424 rsImage_->SetCompressData(data, rsimageInfo.uniqueId_, rsimageInfo.width_, rsimageInfo.height_);
425 rsImage_->SetImageFit(rsimageInfo.fitNum_);
426 rsImage_->SetImageRepeat(rsimageInfo.repeatNum_);
427 rsImage_->SetRadius(rsimageInfo.radius_);
428 rsImage_->SetScale(rsimageInfo.scale_);
429 paint_ = paint;
430 }
431
ImageWithParmOpItem(const std::shared_ptr<Media::PixelMap> & pixelmap,const RsImageInfo & rsimageInfo,const SkPaint & paint)432 ImageWithParmOpItem::ImageWithParmOpItem(
433 const std::shared_ptr<Media::PixelMap>& pixelmap, const RsImageInfo& rsimageInfo, const SkPaint& paint)
434 : OpItemWithPaint(sizeof(ImageWithParmOpItem))
435 {
436 rsImage_ = std::make_shared<RSImage>();
437 rsImage_->SetPixelMap(pixelmap);
438 rsImage_->SetImageFit(rsimageInfo.fitNum_);
439 rsImage_->SetImageRepeat(rsimageInfo.repeatNum_);
440 rsImage_->SetRadius(rsimageInfo.radius_);
441 rsImage_->SetScale(rsimageInfo.scale_);
442 paint_ = paint;
443 }
444
ImageWithParmOpItem(const std::shared_ptr<RSImage> & rsImage,const SkPaint & paint)445 ImageWithParmOpItem::ImageWithParmOpItem(const std::shared_ptr<RSImage>& rsImage, const SkPaint& paint)
446 : OpItemWithPaint(sizeof(ImageWithParmOpItem)), rsImage_(rsImage)
447 {
448 paint_ = paint;
449 }
450
Draw(RSPaintFilterCanvas & canvas,const SkRect * rect) const451 void ImageWithParmOpItem::Draw(RSPaintFilterCanvas& canvas, const SkRect* rect) const
452 {
453 if (!rect) {
454 ROSEN_LOGE("ImageWithParmOpItem: no rect");
455 return;
456 }
457 rsImage_->CanvasDrawImage(canvas, *rect, paint_);
458 }
459
ConcatOpItem(const SkMatrix & matrix)460 ConcatOpItem::ConcatOpItem(const SkMatrix& matrix) : OpItem(sizeof(ConcatOpItem)), matrix_(matrix) {}
461
Draw(RSPaintFilterCanvas & canvas,const SkRect *) const462 void ConcatOpItem::Draw(RSPaintFilterCanvas& canvas, const SkRect*) const
463 {
464 canvas.concat(matrix_);
465 }
466
SaveLayerOpItem(const SkCanvas::SaveLayerRec & rec)467 SaveLayerOpItem::SaveLayerOpItem(const SkCanvas::SaveLayerRec& rec) : OpItemWithPaint(sizeof(SaveLayerOpItem))
468 {
469 if (rec.fBounds) {
470 rect_ = *rec.fBounds;
471 rectPtr_ = &rect_;
472 }
473 if (rec.fPaint) {
474 paint_ = *rec.fPaint;
475 }
476 backdrop_ = sk_ref_sp(rec.fBackdrop);
477 mask_ = sk_ref_sp(rec.fClipMask);
478 matrix_ = rec.fClipMatrix ? *(rec.fClipMatrix) : SkMatrix::I();
479 flags_ = rec.fSaveLayerFlags;
480 }
481
Draw(RSPaintFilterCanvas & canvas,const SkRect *) const482 void SaveLayerOpItem::Draw(RSPaintFilterCanvas& canvas, const SkRect*) const
483 {
484 canvas.saveLayer(
485 { rectPtr_, &paint_, backdrop_.get(), mask_.get(), matrix_.isIdentity() ? nullptr : &matrix_, flags_ });
486 }
487
DrawableOpItem(SkDrawable * drawable,const SkMatrix * matrix)488 DrawableOpItem::DrawableOpItem(SkDrawable* drawable, const SkMatrix* matrix) : OpItem(sizeof(DrawableOpItem))
489 {
490 drawable_ = sk_ref_sp(drawable);
491 if (matrix) {
492 matrix_ = *matrix;
493 }
494 }
495
Draw(RSPaintFilterCanvas & canvas,const SkRect *) const496 void DrawableOpItem::Draw(RSPaintFilterCanvas& canvas, const SkRect*) const
497 {
498 canvas.drawDrawable(drawable_.get(), &matrix_);
499 }
500
PictureOpItem(const sk_sp<SkPicture> picture,const SkMatrix * matrix,const SkPaint * paint)501 PictureOpItem::PictureOpItem(const sk_sp<SkPicture> picture, const SkMatrix* matrix, const SkPaint* paint)
502 : OpItemWithPaint(sizeof(PictureOpItem)), picture_(picture)
503 {
504 if (matrix) {
505 matrix_ = *matrix;
506 }
507 if (paint) {
508 paint_ = *paint;
509 }
510 }
511
Draw(RSPaintFilterCanvas & canvas,const SkRect *) const512 void PictureOpItem::Draw(RSPaintFilterCanvas& canvas, const SkRect*) const
513 {
514 canvas.drawPicture(picture_, &matrix_, &paint_);
515 }
516
PointsOpItem(SkCanvas::PointMode mode,int count,const SkPoint processedPoints[],const SkPaint & paint)517 PointsOpItem::PointsOpItem(SkCanvas::PointMode mode, int count, const SkPoint processedPoints[], const SkPaint& paint)
518 : OpItemWithPaint(sizeof(PointsOpItem)), mode_(mode), count_(count), processedPoints_(new SkPoint[count])
519 {
520 errno_t ret = memcpy_s(processedPoints_, count * sizeof(SkPoint), processedPoints, count * sizeof(SkPoint));
521 if (ret != EOK) {
522 ROSEN_LOGE("PointsOpItem: memcpy failed!");
523 }
524 paint_ = paint;
525 }
526
Draw(RSPaintFilterCanvas & canvas,const SkRect *) const527 void PointsOpItem::Draw(RSPaintFilterCanvas& canvas, const SkRect*) const
528 {
529 canvas.drawPoints(mode_, count_, processedPoints_, paint_);
530 }
531
VerticesOpItem(const SkVertices * vertices,const SkVertices::Bone bones[],int boneCount,SkBlendMode mode,const SkPaint & paint)532 VerticesOpItem::VerticesOpItem(const SkVertices* vertices, const SkVertices::Bone bones[],
533 int boneCount, SkBlendMode mode, const SkPaint& paint)
534 : OpItemWithPaint(sizeof(VerticesOpItem)), vertices_(sk_ref_sp(const_cast<SkVertices*>(vertices))),
535 bones_(new SkVertices::Bone[boneCount]), boneCount_(boneCount), mode_(mode)
536 {
537 errno_t ret = memcpy_s(bones_, boneCount * sizeof(SkVertices::Bone), bones, boneCount * sizeof(SkVertices::Bone));
538 if (ret != EOK) {
539 ROSEN_LOGE("VerticesOpItem: memcpy failed!");
540 }
541 paint_ = paint;
542 }
543
~VerticesOpItem()544 VerticesOpItem::~VerticesOpItem()
545 {
546 delete[] bones_;
547 }
548
Draw(RSPaintFilterCanvas & canvas,const SkRect *) const549 void VerticesOpItem::Draw(RSPaintFilterCanvas& canvas, const SkRect*) const
550 {
551 canvas.drawVertices(vertices_, bones_, boneCount_, mode_, paint_);
552 }
553
ShadowRecOpItem(const SkPath & path,const SkDrawShadowRec & rec)554 ShadowRecOpItem::ShadowRecOpItem(const SkPath& path, const SkDrawShadowRec& rec)
555 : OpItem(sizeof(ShadowRecOpItem)), path_(path), rec_(rec)
556 {}
557
Draw(RSPaintFilterCanvas & canvas,const SkRect *) const558 void ShadowRecOpItem::Draw(RSPaintFilterCanvas& canvas, const SkRect*) const
559 {
560 auto rec = rec_;
561 if (canvas.GetAlpha() < 1.f) {
562 rec.fAmbientColor = SkColorSetA(rec_.fAmbientColor,
563 static_cast<unsigned>(canvas.GetAlpha() * SkColorGetA(rec_.fAmbientColor)));
564 rec.fSpotColor = SkColorSetA(rec_.fSpotColor,
565 static_cast<unsigned>(canvas.GetAlpha() * SkColorGetA(rec_.fSpotColor)));
566 }
567 canvas.private_draw_shadow_rec(path_, rec);
568 }
569
MultiplyAlphaOpItem(float alpha)570 MultiplyAlphaOpItem::MultiplyAlphaOpItem(float alpha) : OpItem(sizeof(MultiplyAlphaOpItem)), alpha_(alpha) {}
571
Draw(RSPaintFilterCanvas & canvas,const SkRect *) const572 void MultiplyAlphaOpItem::Draw(RSPaintFilterCanvas& canvas, const SkRect*) const
573 {
574 canvas.MultiplyAlpha(alpha_);
575 }
576
SaveAlphaOpItem()577 SaveAlphaOpItem::SaveAlphaOpItem() : OpItem(sizeof(SaveAlphaOpItem)) {}
578
Draw(RSPaintFilterCanvas & canvas,const SkRect *) const579 void SaveAlphaOpItem::Draw(RSPaintFilterCanvas& canvas, const SkRect*) const
580 {
581 canvas.SaveAlpha();
582 }
583
RestoreAlphaOpItem()584 RestoreAlphaOpItem::RestoreAlphaOpItem() : OpItem(sizeof(RestoreAlphaOpItem)) {}
585
Draw(RSPaintFilterCanvas & canvas,const SkRect *) const586 void RestoreAlphaOpItem::Draw(RSPaintFilterCanvas& canvas, const SkRect*) const
587 {
588 canvas.RestoreAlpha();
589 }
590
591 // RectOpItem
Marshalling(Parcel & parcel) const592 bool RectOpItem::Marshalling(Parcel& parcel) const
593 {
594 bool success = RSMarshallingHelper::Marshalling(parcel, rect_) &&
595 RSMarshallingHelper::Marshalling(parcel, paint_);
596 if (!success) {
597 ROSEN_LOGE("RectOpItem::Marshalling failed!");
598 return false;
599 }
600 return success;
601 }
602
Unmarshalling(Parcel & parcel)603 OpItem* RectOpItem::Unmarshalling(Parcel& parcel)
604 {
605 SkRect rect;
606 SkPaint paint;
607 bool success = RSMarshallingHelper::Unmarshalling(parcel, rect) &&
608 RSMarshallingHelper::Unmarshalling(parcel, paint);
609 if (!success) {
610 ROSEN_LOGE("RectOpItem::Unmarshalling failed!");
611 return nullptr;
612 }
613 return new RectOpItem(rect, paint);
614 }
615
616 // RoundRectOpItem
Marshalling(Parcel & parcel) const617 bool RoundRectOpItem::Marshalling(Parcel& parcel) const
618 {
619 bool success = RSMarshallingHelper::Marshalling(parcel, rrect_) &&
620 RSMarshallingHelper::Marshalling(parcel, paint_);
621 if (!success) {
622 ROSEN_LOGE("RoundRectOpItem::Marshalling failed!");
623 return false;
624 }
625 return success;
626 }
627
Unmarshalling(Parcel & parcel)628 OpItem* RoundRectOpItem::Unmarshalling(Parcel& parcel)
629 {
630 SkRRect rrect;
631 SkPaint paint;
632 bool success = RSMarshallingHelper::Unmarshalling(parcel, rrect) &&
633 RSMarshallingHelper::Unmarshalling(parcel, paint);
634 if (!success) {
635 ROSEN_LOGE("RoundRectOpItem::Unmarshalling failed!");
636 return nullptr;
637 }
638 return new RoundRectOpItem(rrect, paint);
639 }
640
641 // ImageWithParmOpItem
Marshalling(Parcel & parcel) const642 bool ImageWithParmOpItem::Marshalling(Parcel& parcel) const
643 {
644 bool success = RSMarshallingHelper::Marshalling(parcel, rsImage_) &&
645 RSMarshallingHelper::Marshalling(parcel, paint_);
646 if (!success) {
647 ROSEN_LOGE("ImageWithParmOpItem::Marshalling failed!");
648 return false;
649 }
650 return success;
651 }
652
Unmarshalling(Parcel & parcel)653 OpItem* ImageWithParmOpItem::Unmarshalling(Parcel& parcel)
654 {
655 std::shared_ptr<RSImage> rsImage;
656 SkPaint paint;
657 bool success = RSMarshallingHelper::Unmarshalling(parcel, rsImage) &&
658 RSMarshallingHelper::Unmarshalling(parcel, paint);
659 if (!success) {
660 ROSEN_LOGE("ImageWithParmOpItem::Unmarshalling failed!");
661 return nullptr;
662 }
663 return new ImageWithParmOpItem(rsImage, paint);
664 }
665
666 // DRRectOpItem
Marshalling(Parcel & parcel) const667 bool DRRectOpItem::Marshalling(Parcel& parcel) const
668 {
669 bool success = RSMarshallingHelper::Marshalling(parcel, outer_) &&
670 RSMarshallingHelper::Marshalling(parcel, inner_) &&
671 RSMarshallingHelper::Marshalling(parcel, paint_);
672 if (!success) {
673 ROSEN_LOGE("DRRectOpItem::Marshalling failed!");
674 return false;
675 }
676 return success;
677 }
678
Unmarshalling(Parcel & parcel)679 OpItem* DRRectOpItem::Unmarshalling(Parcel& parcel)
680 {
681 SkRRect outer;
682 SkRRect inner;
683 SkPaint paint;
684 bool success = RSMarshallingHelper::Unmarshalling(parcel, outer) &&
685 RSMarshallingHelper::Unmarshalling(parcel, inner) &&
686 RSMarshallingHelper::Unmarshalling(parcel, paint);
687 if (!success) {
688 ROSEN_LOGE("DRRectOpItem::Unmarshalling failed!");
689 return nullptr;
690 }
691 return new DRRectOpItem(outer, inner, paint);
692 }
693
694 // OvalOpItem
Marshalling(Parcel & parcel) const695 bool OvalOpItem::Marshalling(Parcel& parcel) const
696 {
697 bool success = RSMarshallingHelper::Marshalling(parcel, rect_) &&
698 RSMarshallingHelper::Marshalling(parcel, paint_);
699 if (!success) {
700 ROSEN_LOGE("OvalOpItem::Marshalling failed!");
701 return false;
702 }
703 return success;
704 }
705
Unmarshalling(Parcel & parcel)706 OpItem* OvalOpItem::Unmarshalling(Parcel& parcel)
707 {
708 SkRect rect;
709 SkPaint paint;
710 bool success = RSMarshallingHelper::Unmarshalling(parcel, rect) &&
711 RSMarshallingHelper::Unmarshalling(parcel, paint);
712 if (!success) {
713 ROSEN_LOGE("OvalOpItem::Unmarshalling failed!");
714 return nullptr;
715 }
716 return new OvalOpItem(rect, paint);
717 }
718
719 // RegionOpItem
Marshalling(Parcel & parcel) const720 bool RegionOpItem::Marshalling(Parcel& parcel) const
721 {
722 bool success = RSMarshallingHelper::Marshalling(parcel, region_) &&
723 RSMarshallingHelper::Marshalling(parcel, paint_);
724 if (!success) {
725 ROSEN_LOGE("RegionOpItem::Marshalling failed!");
726 return false;
727 }
728 return success;
729 }
730
Unmarshalling(Parcel & parcel)731 OpItem* RegionOpItem::Unmarshalling(Parcel& parcel)
732 {
733 SkRegion region;
734 SkPaint paint;
735 bool success = RSMarshallingHelper::Unmarshalling(parcel, region) &&
736 RSMarshallingHelper::Unmarshalling(parcel, paint);
737 if (!success) {
738 ROSEN_LOGE("RegionOpItem::Unmarshalling failed!");
739 return nullptr;
740 }
741 return new RegionOpItem(region, paint);
742 }
743
744 // ArcOpItem
Marshalling(Parcel & parcel) const745 bool ArcOpItem::Marshalling(Parcel& parcel) const
746 {
747 bool success = RSMarshallingHelper::Marshalling(parcel, rect_) &&
748 RSMarshallingHelper::Marshalling(parcel, startAngle_) &&
749 RSMarshallingHelper::Marshalling(parcel, sweepAngle_) &&
750 RSMarshallingHelper::Marshalling(parcel, useCenter_) &&
751 RSMarshallingHelper::Marshalling(parcel, paint_);
752 if (!success) {
753 ROSEN_LOGE("ArcOpItem::Marshalling failed!");
754 return false;
755 }
756 return success;
757 }
758
Unmarshalling(Parcel & parcel)759 OpItem* ArcOpItem::Unmarshalling(Parcel& parcel)
760 {
761 SkRect rect;
762 float startAngle;
763 float sweepAngle;
764 bool useCenter;
765 SkPaint paint;
766 bool success = RSMarshallingHelper::Unmarshalling(parcel, rect) &&
767 RSMarshallingHelper::Unmarshalling(parcel, startAngle) &&
768 RSMarshallingHelper::Unmarshalling(parcel, sweepAngle) &&
769 RSMarshallingHelper::Unmarshalling(parcel, useCenter) &&
770 RSMarshallingHelper::Unmarshalling(parcel, paint);
771 if (!success) {
772 ROSEN_LOGE("ArcOpItem::Unmarshalling failed!");
773 return nullptr;
774 }
775 return new ArcOpItem(rect, startAngle, sweepAngle, useCenter, paint);
776 }
777
778 // SaveOpItem
Unmarshalling(Parcel & parcel)779 OpItem* SaveOpItem::Unmarshalling(Parcel& parcel)
780 {
781 return new SaveOpItem();
782 }
783
784 // RestoreOpItem
Unmarshalling(Parcel & parcel)785 OpItem* RestoreOpItem::Unmarshalling(Parcel& parcel)
786 {
787 return new RestoreOpItem();
788 }
789
790 // FlushOpItem
Unmarshalling(Parcel & parcel)791 OpItem* FlushOpItem::Unmarshalling(Parcel& parcel)
792 {
793 return new FlushOpItem();
794 }
795
796 // MatrixOpItem
Marshalling(Parcel & parcel) const797 bool MatrixOpItem::Marshalling(Parcel& parcel) const
798 {
799 bool success = RSMarshallingHelper::Marshalling(parcel, matrix_);
800 if (!success) {
801 ROSEN_LOGE("MatrixOpItem::Marshalling failed!");
802 return false;
803 }
804 return success;
805 }
806
Unmarshalling(Parcel & parcel)807 OpItem* MatrixOpItem::Unmarshalling(Parcel& parcel)
808 {
809 SkMatrix matrix;
810 bool success = RSMarshallingHelper::Unmarshalling(parcel, matrix);
811 if (!success) {
812 ROSEN_LOGE("MatrixOpItem::Unmarshalling failed!");
813 return nullptr;
814 }
815 return new MatrixOpItem(matrix);
816 }
817
818 // ClipRectOpItem
Marshalling(Parcel & parcel) const819 bool ClipRectOpItem::Marshalling(Parcel& parcel) const
820 {
821 bool success = RSMarshallingHelper::Marshalling(parcel, rect_) &&
822 RSMarshallingHelper::Marshalling(parcel, clipOp_) &&
823 RSMarshallingHelper::Marshalling(parcel, doAA_);
824 if (!success) {
825 ROSEN_LOGE("ClipRectOpItem::Marshalling failed!");
826 return false;
827 }
828 return success;
829 }
830
Unmarshalling(Parcel & parcel)831 OpItem* ClipRectOpItem::Unmarshalling(Parcel& parcel)
832 {
833 SkRect rect;
834 SkClipOp clipOp;
835 bool doAA;
836 bool success = RSMarshallingHelper::Unmarshalling(parcel, rect) &&
837 RSMarshallingHelper::Unmarshalling(parcel, clipOp) &&
838 RSMarshallingHelper::Unmarshalling(parcel, doAA);
839 if (!success) {
840 ROSEN_LOGE("ClipRectOpItem::Unmarshalling failed!");
841 return nullptr;
842 }
843 return new ClipRectOpItem(rect, clipOp, doAA);
844 }
845
846 // ClipRRectOpItem
Marshalling(Parcel & parcel) const847 bool ClipRRectOpItem::Marshalling(Parcel& parcel) const
848 {
849 bool success = RSMarshallingHelper::Marshalling(parcel, rrect_) &&
850 RSMarshallingHelper::Marshalling(parcel, clipOp_) &&
851 RSMarshallingHelper::Marshalling(parcel, doAA_);
852 if (!success) {
853 ROSEN_LOGE("ClipRRectOpItem::Marshalling failed!");
854 return false;
855 }
856 return success;
857 }
858
Unmarshalling(Parcel & parcel)859 OpItem* ClipRRectOpItem::Unmarshalling(Parcel& parcel)
860 {
861 SkRRect rrect;
862 SkClipOp clipOp;
863 bool doAA;
864 bool success = RSMarshallingHelper::Unmarshalling(parcel, rrect) &&
865 RSMarshallingHelper::Unmarshalling(parcel, clipOp) &&
866 RSMarshallingHelper::Unmarshalling(parcel, doAA);
867 if (!success) {
868 ROSEN_LOGE("ClipRRectOpItem::Unmarshalling failed!");
869 return nullptr;
870 }
871 return new ClipRRectOpItem(rrect, clipOp, doAA);
872 }
873
874 // ClipRegionOpItem
Marshalling(Parcel & parcel) const875 bool ClipRegionOpItem::Marshalling(Parcel& parcel) const
876 {
877 bool success = RSMarshallingHelper::Marshalling(parcel, region_) &&
878 RSMarshallingHelper::Marshalling(parcel, clipOp_);
879 if (!success) {
880 ROSEN_LOGE("ClipRegionOpItem::Marshalling failed!");
881 return false;
882 }
883 return success;
884 }
885
Unmarshalling(Parcel & parcel)886 OpItem* ClipRegionOpItem::Unmarshalling(Parcel& parcel)
887 {
888 SkRegion region;
889 SkClipOp clipOp;
890 bool success = RSMarshallingHelper::Unmarshalling(parcel, region) &&
891 RSMarshallingHelper::Unmarshalling(parcel, clipOp);
892 if (!success) {
893 ROSEN_LOGE("ClipRegionOpItem::Unmarshalling failed!");
894 return nullptr;
895 }
896 return new ClipRegionOpItem(region, clipOp);
897 }
898
899 // TranslateOpItem
Marshalling(Parcel & parcel) const900 bool TranslateOpItem::Marshalling(Parcel& parcel) const
901 {
902 bool success = RSMarshallingHelper::Marshalling(parcel, distanceX_) &&
903 RSMarshallingHelper::Marshalling(parcel, distanceY_);
904 if (!success) {
905 ROSEN_LOGE("TranslateOpItem::Marshalling failed!");
906 return false;
907 }
908 return success;
909 }
910
Unmarshalling(Parcel & parcel)911 OpItem* TranslateOpItem::Unmarshalling(Parcel& parcel)
912 {
913 float distanceX;
914 float distanceY;
915 bool success = RSMarshallingHelper::Unmarshalling(parcel, distanceX) &&
916 RSMarshallingHelper::Unmarshalling(parcel, distanceY);
917 if (!success) {
918 ROSEN_LOGE("TranslateOpItem::Unmarshalling failed!");
919 return nullptr;
920 }
921 return new TranslateOpItem(distanceX, distanceY);
922 }
923
924 // TextBlobOpItem
Marshalling(Parcel & parcel) const925 bool TextBlobOpItem::Marshalling(Parcel& parcel) const
926 {
927 bool success = RSMarshallingHelper::Marshalling(parcel, textBlob_) &&
928 RSMarshallingHelper::Marshalling(parcel, x_) &&
929 RSMarshallingHelper::Marshalling(parcel, y_) &&
930 RSMarshallingHelper::Marshalling(parcel, paint_);
931 if (!success) {
932 ROSEN_LOGE("TextBlobOpItem::Marshalling failed!");
933 return false;
934 }
935 return success;
936 }
937
Unmarshalling(Parcel & parcel)938 OpItem* TextBlobOpItem::Unmarshalling(Parcel& parcel)
939 {
940 sk_sp<SkTextBlob> textBlob;
941 float x;
942 float y;
943 SkPaint paint;
944 bool success = RSMarshallingHelper::Unmarshalling(parcel, textBlob) &&
945 RSMarshallingHelper::Unmarshalling(parcel, x) &&
946 RSMarshallingHelper::Unmarshalling(parcel, y) &&
947 RSMarshallingHelper::Unmarshalling(parcel, paint);
948 if (!success) {
949 ROSEN_LOGE("TextBlobOpItem::Unmarshalling failed!");
950 return nullptr;
951 }
952 return new TextBlobOpItem(textBlob, x, y, paint);
953 }
954
955 // BitmapOpItem
Marshalling(Parcel & parcel) const956 bool BitmapOpItem::Marshalling(Parcel& parcel) const
957 {
958 bool success = RSMarshallingHelper::Marshalling(parcel, bitmapInfo_) &&
959 RSMarshallingHelper::Marshalling(parcel, left_) &&
960 RSMarshallingHelper::Marshalling(parcel, top_) &&
961 RSMarshallingHelper::Marshalling(parcel, paint_);
962 if (!success) {
963 ROSEN_LOGE("BitmapOpItem::Marshalling failed!");
964 return false;
965 }
966 return success;
967 }
968
Unmarshalling(Parcel & parcel)969 OpItem* BitmapOpItem::Unmarshalling(Parcel& parcel)
970 {
971 sk_sp<SkImage> bitmapInfo;
972 float left;
973 float top;
974 SkPaint paint;
975 bool success = RSMarshallingHelper::Unmarshalling(parcel, bitmapInfo) &&
976 RSMarshallingHelper::Unmarshalling(parcel, left) &&
977 RSMarshallingHelper::Unmarshalling(parcel, top) &&
978 RSMarshallingHelper::Unmarshalling(parcel, paint);
979 if (!success) {
980 ROSEN_LOGE("BitmapOpItem::Unmarshalling failed!");
981 return nullptr;
982 }
983 return new BitmapOpItem(bitmapInfo, left, top, &paint);
984 }
985
986 // BitmapRectOpItem
Marshalling(Parcel & parcel) const987 bool BitmapRectOpItem::Marshalling(Parcel& parcel) const
988 {
989 bool success = RSMarshallingHelper::Marshalling(parcel, bitmapInfo_) &&
990 RSMarshallingHelper::Marshalling(parcel, rectSrc_) &&
991 RSMarshallingHelper::Marshalling(parcel, rectDst_) &&
992 RSMarshallingHelper::Marshalling(parcel, paint_);
993 if (!success) {
994 ROSEN_LOGE("BitmapRectOpItem::Marshalling failed!");
995 return false;
996 }
997 return success;
998 }
999
Unmarshalling(Parcel & parcel)1000 OpItem* BitmapRectOpItem::Unmarshalling(Parcel& parcel)
1001 {
1002 sk_sp<SkImage> bitmapInfo;
1003 SkRect rectSrc;
1004 SkRect rectDst;
1005 SkPaint paint;
1006 bool success = RSMarshallingHelper::Unmarshalling(parcel, bitmapInfo) &&
1007 RSMarshallingHelper::Unmarshalling(parcel, rectSrc) &&
1008 RSMarshallingHelper::Unmarshalling(parcel, rectDst) &&
1009 RSMarshallingHelper::Unmarshalling(parcel, paint);
1010 if (!success) {
1011 ROSEN_LOGE("BitmapRectOpItem::Unmarshalling failed!");
1012 return nullptr;
1013 }
1014 return new BitmapRectOpItem(bitmapInfo, &rectSrc, rectDst, &paint);
1015 }
1016
1017 // PixelMapOpItem
Marshalling(Parcel & parcel) const1018 bool PixelMapOpItem::Marshalling(Parcel& parcel) const
1019 {
1020 bool success = RSMarshallingHelper::Marshalling(parcel, pixelmap_) &&
1021 RSMarshallingHelper::Marshalling(parcel, left_) &&
1022 RSMarshallingHelper::Marshalling(parcel, top_) &&
1023 RSMarshallingHelper::Marshalling(parcel, paint_);
1024 if (!success) {
1025 ROSEN_LOGE("PixelMapOpItem::Marshalling failed!");
1026 return false;
1027 }
1028 return success;
1029 }
1030
Unmarshalling(Parcel & parcel)1031 OpItem* PixelMapOpItem::Unmarshalling(Parcel& parcel)
1032 {
1033 std::shared_ptr<Media::PixelMap> pixelmap;
1034 float left;
1035 float top;
1036 SkPaint paint;
1037 bool success = RSMarshallingHelper::Unmarshalling(parcel, pixelmap) &&
1038 RSMarshallingHelper::Unmarshalling(parcel, left) &&
1039 RSMarshallingHelper::Unmarshalling(parcel, top) &&
1040 RSMarshallingHelper::Unmarshalling(parcel, paint);
1041 if (!success) {
1042 ROSEN_LOGE("PixelMapOpItem::Unmarshalling failed!");
1043 return nullptr;
1044 }
1045 return new PixelMapOpItem(pixelmap, left, top, &paint);
1046 }
1047
1048 // PixelMapRectOpItem
Marshalling(Parcel & parcel) const1049 bool PixelMapRectOpItem::Marshalling(Parcel& parcel) const
1050 {
1051 bool success = RSMarshallingHelper::Marshalling(parcel, pixelmap_) &&
1052 RSMarshallingHelper::Marshalling(parcel, src_) &&
1053 RSMarshallingHelper::Marshalling(parcel, dst_) &&
1054 RSMarshallingHelper::Marshalling(parcel, paint_);
1055 if (!success) {
1056 ROSEN_LOGE("PixelMapRectOpItem::Marshalling failed!");
1057 return false;
1058 }
1059 return success;
1060 }
1061
Unmarshalling(Parcel & parcel)1062 OpItem* PixelMapRectOpItem::Unmarshalling(Parcel& parcel)
1063 {
1064 std::shared_ptr<Media::PixelMap> pixelmap;
1065 SkRect rectSrc;
1066 SkRect rectDst;
1067 SkPaint paint;
1068 bool success = RSMarshallingHelper::Unmarshalling(parcel, pixelmap) &&
1069 RSMarshallingHelper::Unmarshalling(parcel, rectSrc) &&
1070 RSMarshallingHelper::Unmarshalling(parcel, rectDst) &&
1071 RSMarshallingHelper::Unmarshalling(parcel, paint);
1072 if (!success) {
1073 ROSEN_LOGE("PixelMapRectOpItem::Unmarshalling failed!");
1074 return nullptr;
1075 }
1076 return new PixelMapRectOpItem(pixelmap, rectSrc, rectDst, &paint);
1077 }
1078
1079 // BitmapNineOpItem
Marshalling(Parcel & parcel) const1080 bool BitmapNineOpItem::Marshalling(Parcel& parcel) const
1081 {
1082 bool success = RSMarshallingHelper::Marshalling(parcel, bitmapInfo_) &&
1083 RSMarshallingHelper::Marshalling(parcel, center_) &&
1084 RSMarshallingHelper::Marshalling(parcel, rectDst_) &&
1085 RSMarshallingHelper::Marshalling(parcel, paint_);
1086 if (!success) {
1087 ROSEN_LOGE("BitmapNineOpItem::Marshalling failed!");
1088 return false;
1089 }
1090 return success;
1091 }
1092
Unmarshalling(Parcel & parcel)1093 OpItem* BitmapNineOpItem::Unmarshalling(Parcel& parcel)
1094 {
1095 sk_sp<SkImage> bitmapInfo;
1096 SkIRect center;
1097 SkRect rectDst;
1098 SkPaint paint;
1099 bool success = RSMarshallingHelper::Unmarshalling(parcel, bitmapInfo) &&
1100 RSMarshallingHelper::Unmarshalling(parcel, center) &&
1101 RSMarshallingHelper::Unmarshalling(parcel, rectDst) &&
1102 RSMarshallingHelper::Unmarshalling(parcel, paint);
1103 if (!success) {
1104 ROSEN_LOGE("BitmapNineOpItem::Unmarshalling failed!");
1105 return nullptr;
1106 }
1107 return new BitmapNineOpItem(bitmapInfo, center, rectDst, &paint);
1108 }
1109
1110 // AdaptiveRRectOpItem
Marshalling(Parcel & parcel) const1111 bool AdaptiveRRectOpItem::Marshalling(Parcel& parcel) const
1112 {
1113 bool success = RSMarshallingHelper::Marshalling(parcel, radius_) &&
1114 RSMarshallingHelper::Marshalling(parcel, paint_);
1115 if (!success) {
1116 ROSEN_LOGE("AdaptiveRRectOpItem::Marshalling failed!");
1117 return false;
1118 }
1119 return success;
1120 }
1121
Unmarshalling(Parcel & parcel)1122 OpItem* AdaptiveRRectOpItem::Unmarshalling(Parcel& parcel)
1123 {
1124 float radius;
1125 SkPaint paint;
1126 bool success = RSMarshallingHelper::Unmarshalling(parcel, radius) &&
1127 RSMarshallingHelper::Unmarshalling(parcel, paint);
1128 if (!success) {
1129 ROSEN_LOGE("AdaptiveRRectOpItem::Unmarshalling failed!");
1130 return nullptr;
1131 }
1132 return new AdaptiveRRectOpItem(radius, paint);
1133 }
1134
1135 // AdaptiveRRectScaleOpItem
Marshalling(Parcel & parcel) const1136 bool AdaptiveRRectScaleOpItem::Marshalling(Parcel& parcel) const
1137 {
1138 bool success = RSMarshallingHelper::Marshalling(parcel, radiusRatio_) &&
1139 RSMarshallingHelper::Marshalling(parcel, paint_);
1140 if (!success) {
1141 ROSEN_LOGE("AdaptiveRRectScaleOpItem::Marshalling failed!");
1142 return false;
1143 }
1144 return success;
1145 }
1146
Unmarshalling(Parcel & parcel)1147 OpItem* AdaptiveRRectScaleOpItem::Unmarshalling(Parcel& parcel)
1148 {
1149 float radiusRatio;
1150 SkPaint paint;
1151 bool success = RSMarshallingHelper::Unmarshalling(parcel, radiusRatio) &&
1152 RSMarshallingHelper::Unmarshalling(parcel, paint);
1153 if (!success) {
1154 ROSEN_LOGE("AdaptiveRRectScaleOpItem::Unmarshalling failed!");
1155 return nullptr;
1156 }
1157 return new AdaptiveRRectScaleOpItem(radiusRatio, paint);
1158 }
1159
1160 // ClipAdaptiveRRectOpItem
Marshalling(Parcel & parcel) const1161 bool ClipAdaptiveRRectOpItem::Marshalling(Parcel& parcel) const
1162 {
1163 bool success = RSMarshallingHelper::Marshalling(parcel, radius_);
1164 if (!success) {
1165 ROSEN_LOGE("ClipAdaptiveRRectOpItem::Marshalling failed!");
1166 return false;
1167 }
1168 return success;
1169 }
1170
Unmarshalling(Parcel & parcel)1171 OpItem* ClipAdaptiveRRectOpItem::Unmarshalling(Parcel& parcel)
1172 {
1173 SkVector radius[CORNER_SIZE];
1174 for (auto i = 0; i < CORNER_SIZE; i++) {
1175 if (!RSMarshallingHelper::Unmarshalling(parcel, radius[i])) {
1176 ROSEN_LOGE("ClipAdaptiveRRectOpItem::Unmarshalling failed!");
1177 return nullptr;
1178 }
1179 }
1180 return new ClipAdaptiveRRectOpItem(radius);
1181 }
1182
1183 // ClipOutsetRectOpItem
Marshalling(Parcel & parcel) const1184 bool ClipOutsetRectOpItem::Marshalling(Parcel& parcel) const
1185 {
1186 bool success = RSMarshallingHelper::Marshalling(parcel, dx_) &&
1187 RSMarshallingHelper::Marshalling(parcel, dy_);
1188 if (!success) {
1189 ROSEN_LOGE("ClipOutsetRectOpItem::Marshalling failed!");
1190 return false;
1191 }
1192 return success;
1193 }
1194
Unmarshalling(Parcel & parcel)1195 OpItem* ClipOutsetRectOpItem::Unmarshalling(Parcel& parcel)
1196 {
1197 float dx;
1198 float dy;
1199 bool success = RSMarshallingHelper::Unmarshalling(parcel, dx) &&
1200 RSMarshallingHelper::Unmarshalling(parcel, dy);
1201 if (!success) {
1202 ROSEN_LOGE("ClipOutsetRectOpItem::Unmarshalling failed!");
1203 return nullptr;
1204 }
1205 return new ClipOutsetRectOpItem(dx, dy);
1206 }
1207
1208 // PathOpItem
Marshalling(Parcel & parcel) const1209 bool PathOpItem::Marshalling(Parcel& parcel) const
1210 {
1211 bool success = RSMarshallingHelper::Marshalling(parcel, path_) &&
1212 RSMarshallingHelper::Marshalling(parcel, paint_);
1213 if (!success) {
1214 ROSEN_LOGE("PathOpItem::Marshalling failed!");
1215 return false;
1216 }
1217 return success;
1218 }
1219
Unmarshalling(Parcel & parcel)1220 OpItem* PathOpItem::Unmarshalling(Parcel& parcel)
1221 {
1222 SkPath path;
1223 SkPaint paint;
1224 bool success = RSMarshallingHelper::Unmarshalling(parcel, path) &&
1225 RSMarshallingHelper::Unmarshalling(parcel, paint);
1226 if (!success) {
1227 ROSEN_LOGE("PathOpItem::Unmarshalling failed!");
1228 return nullptr;
1229 }
1230 return new PathOpItem(path, paint);
1231 }
1232
1233 // ClipPathOpItem
Marshalling(Parcel & parcel) const1234 bool ClipPathOpItem::Marshalling(Parcel& parcel) const
1235 {
1236 bool success = RSMarshallingHelper::Marshalling(parcel, path_) &&
1237 RSMarshallingHelper::Marshalling(parcel, clipOp_) &&
1238 RSMarshallingHelper::Marshalling(parcel, doAA_);
1239 if (!success) {
1240 ROSEN_LOGE("ClipPathOpItem::Marshalling failed!");
1241 return false;
1242 }
1243 return success;
1244 }
1245
Unmarshalling(Parcel & parcel)1246 OpItem* ClipPathOpItem::Unmarshalling(Parcel& parcel)
1247 {
1248 SkPath path;
1249 SkClipOp clipOp;
1250 bool doAA;
1251 bool success = RSMarshallingHelper::Unmarshalling(parcel, path) &&
1252 RSMarshallingHelper::Unmarshalling(parcel, clipOp) &&
1253 RSMarshallingHelper::Unmarshalling(parcel, doAA);
1254 if (!success) {
1255 ROSEN_LOGE("ClipPathOpItem::Unmarshalling failed!");
1256 return nullptr;
1257 }
1258 return new ClipPathOpItem(path, clipOp, doAA);
1259 }
1260
1261 // PaintOpItem
Marshalling(Parcel & parcel) const1262 bool PaintOpItem::Marshalling(Parcel& parcel) const
1263 {
1264 bool success = RSMarshallingHelper::Marshalling(parcel, paint_);
1265 if (!success) {
1266 ROSEN_LOGE("PaintOpItem::Marshalling failed!");
1267 return false;
1268 }
1269 return success;
1270 }
1271
Unmarshalling(Parcel & parcel)1272 OpItem* PaintOpItem::Unmarshalling(Parcel& parcel)
1273 {
1274 SkPaint paint;
1275 bool success = RSMarshallingHelper::Unmarshalling(parcel, paint);
1276 if (!success) {
1277 ROSEN_LOGE("PaintOpItem::Unmarshalling failed!");
1278 return nullptr;
1279 }
1280 return new PaintOpItem(paint);
1281 }
1282
1283 // ConcatOpItem
Marshalling(Parcel & parcel) const1284 bool ConcatOpItem::Marshalling(Parcel& parcel) const
1285 {
1286 bool success = RSMarshallingHelper::Marshalling(parcel, matrix_);
1287 if (!success) {
1288 ROSEN_LOGE("ConcatOpItem::Marshalling failed!");
1289 return false;
1290 }
1291 return success;
1292 }
1293
Unmarshalling(Parcel & parcel)1294 OpItem* ConcatOpItem::Unmarshalling(Parcel& parcel)
1295 {
1296 SkMatrix matrix;
1297 bool success = RSMarshallingHelper::Unmarshalling(parcel, matrix);
1298 if (!success) {
1299 ROSEN_LOGE("ConcatOpItem::Unmarshalling failed!");
1300 return nullptr;
1301 }
1302 return new ConcatOpItem(matrix);
1303 }
1304
1305 // SaveLayerOpItem
Marshalling(Parcel & parcel) const1306 bool SaveLayerOpItem::Marshalling(Parcel& parcel) const
1307 {
1308 bool success = parcel.WriteBool(rectPtr_ != nullptr);
1309 if (rectPtr_) {
1310 success = success && RSMarshallingHelper::Marshalling(parcel, rect_);
1311 }
1312 success = success && RSMarshallingHelper::Marshalling(parcel, backdrop_) &&
1313 RSMarshallingHelper::Marshalling(parcel, mask_) &&
1314 RSMarshallingHelper::Marshalling(parcel, matrix_) &&
1315 RSMarshallingHelper::Marshalling(parcel, flags_) &&
1316 RSMarshallingHelper::Marshalling(parcel, paint_);
1317 if (!success) {
1318 ROSEN_LOGE("SaveLayerOpItem::Marshalling failed!");
1319 return false;
1320 }
1321 return success;
1322 }
1323
Unmarshalling(Parcel & parcel)1324 OpItem* SaveLayerOpItem::Unmarshalling(Parcel& parcel)
1325 {
1326 bool isRectExist;
1327 SkRect rect;
1328 SkRect* rectPtr = nullptr;
1329 sk_sp<SkImageFilter> backdrop;
1330 sk_sp<SkImage> mask;
1331 SkMatrix matrix;
1332 SkCanvas::SaveLayerFlags flags;
1333 SkPaint paint;
1334 bool success = parcel.ReadBool(isRectExist);
1335 if (isRectExist) {
1336 success = success && RSMarshallingHelper::Unmarshalling(parcel, rect);
1337 rectPtr = ▭
1338 }
1339 success = success && RSMarshallingHelper::Unmarshalling(parcel, backdrop) &&
1340 RSMarshallingHelper::Unmarshalling(parcel, mask) &&
1341 RSMarshallingHelper::Unmarshalling(parcel, matrix) &&
1342 RSMarshallingHelper::Unmarshalling(parcel, flags) &&
1343 RSMarshallingHelper::Unmarshalling(parcel, paint);
1344 if (!success) {
1345 ROSEN_LOGE("SaveLayerOpItem::Unmarshalling failed!");
1346 return nullptr;
1347 }
1348 SkCanvas::SaveLayerRec rec = { rectPtr, &paint, backdrop.get(), mask.get(), &matrix, flags };
1349 return new SaveLayerOpItem(rec);
1350 }
1351
1352 // DrawableOpItem
Marshalling(Parcel & parcel) const1353 bool DrawableOpItem::Marshalling(Parcel& parcel) const
1354 {
1355 bool success = RSMarshallingHelper::Marshalling(parcel, drawable_) &&
1356 RSMarshallingHelper::Marshalling(parcel, matrix_);
1357 if (!success) {
1358 ROSEN_LOGE("DrawableOpItem::Marshalling failed!");
1359 return false;
1360 }
1361 return success;
1362 }
1363
Unmarshalling(Parcel & parcel)1364 OpItem* DrawableOpItem::Unmarshalling(Parcel& parcel)
1365 {
1366 sk_sp<SkDrawable> drawable;
1367 SkMatrix matrix;
1368 bool success = RSMarshallingHelper::Unmarshalling(parcel, drawable) &&
1369 RSMarshallingHelper::Unmarshalling(parcel, matrix);
1370 if (!success) {
1371 ROSEN_LOGE("DrawableOpItem::Unmarshalling failed!");
1372 return nullptr;
1373 }
1374 return new DrawableOpItem(drawable.release(), &matrix);
1375 }
1376
1377 // PictureOpItem
Marshalling(Parcel & parcel) const1378 bool PictureOpItem::Marshalling(Parcel& parcel) const
1379 {
1380 bool success = RSMarshallingHelper::Marshalling(parcel, picture_) &&
1381 RSMarshallingHelper::Marshalling(parcel, matrix_) &&
1382 RSMarshallingHelper::Marshalling(parcel, paint_);
1383 if (!success) {
1384 ROSEN_LOGE("PictureOpItem::Marshalling failed!");
1385 return false;
1386 }
1387 return success;
1388 }
1389
Unmarshalling(Parcel & parcel)1390 OpItem* PictureOpItem::Unmarshalling(Parcel& parcel)
1391 {
1392 sk_sp<SkPicture> picture;
1393 SkMatrix matrix;
1394 SkPaint paint;
1395 bool success = RSMarshallingHelper::Unmarshalling(parcel, picture) &&
1396 RSMarshallingHelper::Unmarshalling(parcel, matrix) &&
1397 RSMarshallingHelper::Unmarshalling(parcel, paint);
1398 if (!success) {
1399 ROSEN_LOGE("PictureOpItem::Unmarshalling failed!");
1400 return nullptr;
1401 }
1402 return new PictureOpItem(picture, &matrix, &paint);
1403 }
1404
1405 // PointsOpItem
Marshalling(Parcel & parcel) const1406 bool PointsOpItem::Marshalling(Parcel& parcel) const
1407 {
1408 bool success = RSMarshallingHelper::Marshalling(parcel, mode_) &&
1409 RSMarshallingHelper::Marshalling(parcel, count_) &&
1410 RSMarshallingHelper::MarshallingArray(parcel, processedPoints_, count_) &&
1411 RSMarshallingHelper::Marshalling(parcel, paint_);
1412 if (!success) {
1413 ROSEN_LOGE("PointsOpItem::Marshalling failed!");
1414 return false;
1415 }
1416 return success;
1417 }
1418
Unmarshalling(Parcel & parcel)1419 OpItem* PointsOpItem::Unmarshalling(Parcel& parcel)
1420 {
1421 SkCanvas::PointMode mode;
1422 int count;
1423 const SkPoint* processedPoints = nullptr;
1424 SkPaint paint;
1425 bool success = RSMarshallingHelper::Unmarshalling(parcel, mode) &&
1426 RSMarshallingHelper::Unmarshalling(parcel, count) &&
1427 RSMarshallingHelper::UnmarshallingArray(parcel, processedPoints, count) &&
1428 RSMarshallingHelper::Unmarshalling(parcel, paint);
1429 if (!success) {
1430 ROSEN_LOGE("PointsOpItem::Unmarshalling failed!");
1431 return nullptr;
1432 }
1433 return new PointsOpItem(mode, count, processedPoints, paint);
1434 }
1435
1436 // VerticesOpItem
Marshalling(Parcel & parcel) const1437 bool VerticesOpItem::Marshalling(Parcel& parcel) const
1438 {
1439 bool success = RSMarshallingHelper::Marshalling(parcel, vertices_) &&
1440 RSMarshallingHelper::Marshalling(parcel, boneCount_) &&
1441 RSMarshallingHelper::MarshallingArray(parcel, bones_, boneCount_) &&
1442 RSMarshallingHelper::Marshalling(parcel, mode_) &&
1443 RSMarshallingHelper::Marshalling(parcel, paint_);
1444 if (!success) {
1445 ROSEN_LOGE("VerticesOpItem::Marshalling failed!");
1446 return false;
1447 }
1448 return success;
1449 }
1450
Unmarshalling(Parcel & parcel)1451 OpItem* VerticesOpItem::Unmarshalling(Parcel& parcel)
1452 {
1453 sk_sp<SkVertices> vertices;
1454 const SkVertices::Bone* bones = nullptr;
1455 int boneCount;
1456 SkBlendMode mode;
1457 SkPaint paint;
1458 bool success = RSMarshallingHelper::Unmarshalling(parcel, vertices) &&
1459 RSMarshallingHelper::Unmarshalling(parcel, boneCount) &&
1460 RSMarshallingHelper::UnmarshallingArray(parcel, bones, boneCount) &&
1461 RSMarshallingHelper::Unmarshalling(parcel, mode) &&
1462 RSMarshallingHelper::Unmarshalling(parcel, paint);
1463 if (!success) {
1464 ROSEN_LOGE("VerticesOpItem::Unmarshalling failed!");
1465 return nullptr;
1466 }
1467 return new VerticesOpItem(vertices.get(), bones, boneCount, mode, paint);
1468 }
1469
1470 // ShadowRecOpItem
Marshalling(Parcel & parcel) const1471 bool ShadowRecOpItem::Marshalling(Parcel& parcel) const
1472 {
1473 bool success = RSMarshallingHelper::Marshalling(parcel, path_) &&
1474 RSMarshallingHelper::Marshalling(parcel, rec_);
1475 if (!success) {
1476 ROSEN_LOGE("ShadowRecOpItem::Marshalling failed!");
1477 return false;
1478 }
1479 return success;
1480 }
1481
Unmarshalling(Parcel & parcel)1482 OpItem* ShadowRecOpItem::Unmarshalling(Parcel& parcel)
1483 {
1484 SkPath path;
1485 SkDrawShadowRec rec;
1486 bool success = RSMarshallingHelper::Unmarshalling(parcel, path) &&
1487 RSMarshallingHelper::Unmarshalling(parcel, rec);
1488 if (!success) {
1489 ROSEN_LOGE("ShadowRecOpItem::Unmarshalling failed!");
1490 return nullptr;
1491 }
1492 return new ShadowRecOpItem(path, rec);
1493 }
1494
1495 // MultiplyAlphaOpItem
Marshalling(Parcel & parcel) const1496 bool MultiplyAlphaOpItem::Marshalling(Parcel& parcel) const
1497 {
1498 bool success = RSMarshallingHelper::Marshalling(parcel, alpha_);
1499 if (!success) {
1500 ROSEN_LOGE("MultiplyAlphaOpItem::Marshalling failed!");
1501 return false;
1502 }
1503 return success;
1504 }
1505
Unmarshalling(Parcel & parcel)1506 OpItem* MultiplyAlphaOpItem::Unmarshalling(Parcel& parcel)
1507 {
1508 float alpha;
1509 bool success = RSMarshallingHelper::Unmarshalling(parcel, alpha);
1510 if (!success) {
1511 ROSEN_LOGE("MultiplyAlphaOpItem::Unmarshalling failed!");
1512 return nullptr;
1513 }
1514 return new MultiplyAlphaOpItem(alpha);
1515 }
1516
1517 // SaveAlphaOpItem
Unmarshalling(Parcel & parcel)1518 OpItem* SaveAlphaOpItem::Unmarshalling(Parcel& parcel)
1519 {
1520 return new SaveAlphaOpItem();
1521 }
1522
1523 // RestoreAlphaOpItem
Unmarshalling(Parcel & parcel)1524 OpItem* RestoreAlphaOpItem::Unmarshalling(Parcel& parcel)
1525 {
1526 return new RestoreAlphaOpItem();
1527 }
1528 } // namespace Rosen
1529 } // namespace OHOS
1530