• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 = &rect;
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