• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023-2025 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 "recording/cmd_list_helper.h"
17 
18 #include "recording/draw_cmd.h"
19 #include "recording/draw_cmd_list.h"
20 #include "skia_adapter/skia_vertices.h"
21 #include "skia_adapter/skia_image_filter.h"
22 #include "skia_adapter/skia_mask_filter.h"
23 #include "skia_adapter/skia_color_filter.h"
24 #include "skia_adapter/skia_shader_effect.h"
25 #include "skia_adapter/skia_path_effect.h"
26 
27 #include "draw/color.h"
28 #include "draw/core_canvas.h"
29 #include "effect/blender.h"
30 #include "utils/log.h"
31 #include "utils/rect.h"
32 
33 #include "skia_adapter/skia_path.h"
34 #include "skia_adapter/skia_picture.h"
35 #include "effect/shader_effect_lazy.h"
36 #include "effect/image_filter_lazy.h"
37 
38 namespace OHOS {
39 namespace Rosen {
40 namespace Drawing {
ColorTypeToBytesPerPixel(ColorType colorType)41 static int ColorTypeToBytesPerPixel(ColorType colorType)
42 {
43     // returns the number of bytes per pixel: 1byte, 2bytes, 4bytes
44     switch (colorType) {
45         case ColorType::COLORTYPE_ALPHA_8:
46             return 1;
47         case ColorType::COLORTYPE_RGB_565:
48         case ColorType::COLORTYPE_ARGB_4444:
49             return 2;
50         case ColorType::COLORTYPE_RGBA_8888:
51         case ColorType::COLORTYPE_BGRA_8888:
52         case ColorType::COLORTYPE_RGB_888X:
53         case ColorType::COLORTYPE_N32:
54             return 4;
55         case ColorType::COLORTYPE_RGBA_F16:
56             return 8;
57         case ColorType::COLORTYPE_UNKNOWN:
58         default:
59             return 0;
60     }
61 }
62 
AddImageToCmdList(CmdList & cmdList,const Image & image)63 OpDataHandle CmdListHelper::AddImageToCmdList(CmdList& cmdList, const Image& image)
64 {
65     return cmdList.AddImage(image);
66 }
67 
AddImageToCmdList(CmdList & cmdList,const std::shared_ptr<Image> & image)68 OpDataHandle CmdListHelper::AddImageToCmdList(CmdList& cmdList, const std::shared_ptr<Image>& image)
69 {
70     if (image == nullptr) {
71         LOGD("image is nullptr!");
72         return { 0 };
73     }
74     return CmdListHelper::AddImageToCmdList(cmdList, *image);
75 }
76 
GetImageFromCmdList(const CmdList & cmdList,const OpDataHandle & opDataHandle)77 std::shared_ptr<Image> CmdListHelper::GetImageFromCmdList(const CmdList& cmdList, const OpDataHandle& opDataHandle)
78 {
79     return (const_cast<CmdList&>(cmdList)).GetImage(opDataHandle);
80 }
81 
AddVerticesToCmdList(CmdList & cmdList,const Vertices & vertices)82 OpDataHandle CmdListHelper::AddVerticesToCmdList(CmdList& cmdList, const Vertices& vertices)
83 {
84     auto data = vertices.Serialize();
85     if (data == nullptr || data->GetSize() == 0) {
86         LOGD("vertices is valid!");
87         return { 0 };
88     }
89 
90     auto offset = cmdList.AddImageData(data->GetData(), data->GetSize());
91     return { offset, data->GetSize() };
92 }
93 
GetVerticesFromCmdList(const CmdList & cmdList,const OpDataHandle & opDataHandle)94 std::shared_ptr<Vertices> CmdListHelper::GetVerticesFromCmdList(
95     const CmdList& cmdList, const OpDataHandle& opDataHandle)
96 {
97     if (opDataHandle.size == 0) {
98         return nullptr;
99     }
100 
101     const void* ptr = cmdList.GetImageData(opDataHandle.offset, opDataHandle.size);
102     if (ptr == nullptr) {
103         LOGD("get vertices data failed!");
104         return nullptr;
105     }
106 
107     auto verticesData = std::make_shared<Data>();
108     verticesData->BuildWithoutCopy(ptr, opDataHandle.size);
109     auto vertices = std::make_shared<Vertices>();
110     if (vertices->Deserialize(verticesData) == false) {
111         LOGD("vertices deserialize failed!");
112         return nullptr;
113     }
114     return vertices;
115 }
116 
AddBitmapToCmdList(CmdList & cmdList,const Bitmap & bitmap)117 ImageHandle CmdListHelper::AddBitmapToCmdList(CmdList& cmdList, const Bitmap& bitmap)
118 {
119     auto format = bitmap.GetFormat();
120     auto bpp = ColorTypeToBytesPerPixel(format.colorType);
121     auto bitmapSize = bitmap.GetHeight() * bitmap.GetWidth() * bpp;
122     if (bitmapSize == 0) {
123         LOGD("bitmap is valid!");
124         return { 0 };
125     }
126 
127     auto offset = cmdList.AddBitmapData(bitmap.GetPixels(), bitmapSize);
128     return { offset, bitmapSize, bitmap.GetWidth(), bitmap.GetHeight(), format.colorType, format.alphaType };
129 }
130 
GetBitmapFromCmdList(const CmdList & cmdList,const ImageHandle & bitmapHandle)131 std::shared_ptr<Bitmap> CmdListHelper::GetBitmapFromCmdList(const CmdList& cmdList, const ImageHandle& bitmapHandle)
132 {
133     if (bitmapHandle.size == 0) {
134         return nullptr;
135     }
136 
137     const void* ptr = cmdList.GetBitmapData(bitmapHandle.offset, bitmapHandle.size);
138     if (ptr == nullptr) {
139         LOGD("get bitmap data failed!");
140         return nullptr;
141     }
142 
143     BitmapFormat format = { bitmapHandle.colorType, bitmapHandle.alphaType };
144     auto bitmap = std::make_shared<Bitmap>();
145     bitmap->Build(bitmapHandle.width, bitmapHandle.height, format);
146     bitmap->SetPixels(const_cast<void*>(ptr));
147 
148     return bitmap;
149 }
150 
AddRecordCmdToCmdList(CmdList & cmdList,const std::shared_ptr<RecordCmd> & recordCmd)151 OpDataHandle DRAWING_API CmdListHelper::AddRecordCmdToCmdList(
152     CmdList& cmdList, const std::shared_ptr<RecordCmd>& recordCmd)
153 {
154     auto index = cmdList.AddRecordCmd(recordCmd);
155     return { index };
156 }
157 
GetRecordCmdFromCmdList(const CmdList & cmdList,const OpDataHandle & recordCmdHandle)158 std::shared_ptr<RecordCmd> CmdListHelper::GetRecordCmdFromCmdList(
159     const CmdList& cmdList, const OpDataHandle& recordCmdHandle)
160 {
161     return (const_cast<CmdList&>(cmdList)).GetRecordCmd(recordCmdHandle.offset);
162 }
163 
AddImageObjectToCmdList(CmdList & cmdList,const std::shared_ptr<ExtendImageObject> & object)164 OpDataHandle CmdListHelper::AddImageObjectToCmdList(CmdList& cmdList, const std::shared_ptr<ExtendImageObject>& object)
165 {
166     auto index = cmdList.AddImageObject(object);
167     return { index };
168 }
169 
GetImageObjectFromCmdList(const CmdList & cmdList,const OpDataHandle & objectHandle)170 std::shared_ptr<ExtendImageObject> CmdListHelper::GetImageObjectFromCmdList(
171     const CmdList& cmdList, const OpDataHandle& objectHandle)
172 {
173     return (const_cast<CmdList&>(cmdList)).GetImageObject(objectHandle.offset);
174 }
175 
AddImageBaseObjToCmdList(CmdList & cmdList,const std::shared_ptr<ExtendImageBaseObj> & object)176 OpDataHandle CmdListHelper::AddImageBaseObjToCmdList(
177     CmdList& cmdList, const std::shared_ptr<ExtendImageBaseObj>& object)
178 {
179     auto index = cmdList.AddImageBaseObj(object);
180     return { index };
181 }
182 
GetImageBaseObjFromCmdList(const CmdList & cmdList,const OpDataHandle & objectHandle)183 std::shared_ptr<ExtendImageBaseObj> CmdListHelper::GetImageBaseObjFromCmdList(
184     const CmdList& cmdList, const OpDataHandle& objectHandle)
185 {
186     return (const_cast<CmdList&>(cmdList)).GetImageBaseObj(objectHandle.offset);
187 }
188 
AddImageNineObjecToCmdList(CmdList & cmdList,const std::shared_ptr<ExtendImageNineObject> & object)189 OpDataHandle CmdListHelper::AddImageNineObjecToCmdList(
190     CmdList& cmdList, const std::shared_ptr<ExtendImageNineObject>& object)
191 {
192     auto index = cmdList.AddImageNineObject(object);
193     return { index };
194 }
195 
GetImageNineObjecFromCmdList(const CmdList & cmdList,const OpDataHandle & objectHandle)196 std::shared_ptr<ExtendImageNineObject> CmdListHelper::GetImageNineObjecFromCmdList(
197     const CmdList& cmdList, const OpDataHandle& objectHandle)
198 {
199     return (const_cast<CmdList&>(cmdList)).GetImageNineObject(objectHandle.offset);
200 }
201 
AddImageLatticeObjecToCmdList(CmdList & cmdList,const std::shared_ptr<ExtendImageLatticeObject> & object)202 OpDataHandle CmdListHelper::AddImageLatticeObjecToCmdList(
203     CmdList& cmdList, const std::shared_ptr<ExtendImageLatticeObject>& object)
204 {
205     auto index = cmdList.AddImageLatticeObject(object);
206     return { index };
207 }
208 
GetImageLatticeObjecFromCmdList(const CmdList & cmdList,const OpDataHandle & objectHandle)209 std::shared_ptr<ExtendImageLatticeObject> CmdListHelper::GetImageLatticeObjecFromCmdList(
210     const CmdList& cmdList, const OpDataHandle& objectHandle)
211 {
212     return (const_cast<CmdList&>(cmdList)).GetImageLatticeObject(objectHandle.offset);
213 }
214 
AddPictureToCmdList(CmdList & cmdList,const Picture & picture)215 OpDataHandle CmdListHelper::AddPictureToCmdList(CmdList& cmdList, const Picture& picture)
216 {
217     auto data = picture.Serialize();
218     if (data == nullptr || data->GetSize() == 0) {
219         LOGD("picture is valid!");
220         return { 0 };
221     }
222 
223     auto offset = cmdList.AddImageData(data->GetData(), data->GetSize());
224     return { offset, data->GetSize() };
225 }
226 
GetPictureFromCmdList(const CmdList & cmdList,const OpDataHandle & pictureHandle)227 std::shared_ptr<Picture> CmdListHelper::GetPictureFromCmdList(const CmdList& cmdList, const OpDataHandle& pictureHandle)
228 {
229     if (pictureHandle.size == 0) {
230         return nullptr;
231     }
232 
233     const void* ptr = cmdList.GetImageData(pictureHandle.offset, pictureHandle.size);
234     if (ptr == nullptr) {
235         LOGD("get picture data failed!");
236         return nullptr;
237     }
238 
239     auto pictureData = std::make_shared<Data>();
240     pictureData->BuildWithoutCopy(ptr, pictureHandle.size);
241     auto picture = std::make_shared<Picture>();
242     if (picture->Deserialize(pictureData) == false) {
243         LOGD("picture deserialize failed!");
244         return nullptr;
245     }
246     return picture;
247 }
248 
AddCompressDataToCmdList(CmdList & cmdList,const std::shared_ptr<Data> & data)249 OpDataHandle CmdListHelper::AddCompressDataToCmdList(CmdList& cmdList, const std::shared_ptr<Data>& data)
250 {
251     if (data == nullptr || data->GetSize() == 0) {
252         LOGD("data is valid!");
253         return { 0 };
254     }
255 
256     auto offset = cmdList.AddImageData(data->GetData(), data->GetSize());
257     return { offset, data->GetSize() };
258 }
259 
GetCompressDataFromCmdList(const CmdList & cmdList,const OpDataHandle & imageHandle)260 std::shared_ptr<Data> CmdListHelper::GetCompressDataFromCmdList(const CmdList& cmdList, const OpDataHandle& imageHandle)
261 {
262     if (imageHandle.size == 0) {
263         return nullptr;
264     }
265 
266     const void* ptr = cmdList.GetImageData(imageHandle.offset, imageHandle.size);
267     if (ptr == nullptr) {
268         LOGD("get image data failed!");
269         return nullptr;
270     }
271 
272     auto imageData = std::make_shared<Data>();
273     imageData->BuildWithoutCopy(ptr, imageHandle.size);
274     return imageData;
275 }
276 
AddChildToCmdList(CmdList & cmdList,const std::shared_ptr<CmdList> & child)277 CmdListHandle CmdListHelper::AddChildToCmdList(CmdList& cmdList, const std::shared_ptr<CmdList>& child)
278 {
279     CmdListHandle childHandle = { 0 };
280 
281     if (child == nullptr) {
282         LOGD("child is invalid!");
283         return childHandle;
284     }
285 
286     childHandle.type = child->GetType();
287 
288     auto childData = child->GetData();
289     if (childData.first != nullptr && childData.second != 0) {
290         childHandle.offset = cmdList.AddCmdListData(childData);
291         childHandle.size = childData.second;
292     } else {
293         return childHandle;
294     }
295 
296     auto childImageData = child->GetAllImageData();
297     if (childImageData.first != nullptr && childImageData.second != 0) {
298         childHandle.imageOffset = cmdList.AddImageData(childImageData.first, childImageData.second);
299         childHandle.imageSize = childImageData.second;
300     }
301 
302     auto childBitmapData = child->GetAllBitmapData();
303     if (childBitmapData.first != nullptr && childBitmapData.second != 0) {
304         childHandle.bitmapOffset = cmdList.AddBitmapData(childBitmapData.first, childBitmapData.second);
305         childHandle.bitmapSize = childBitmapData.second;
306     }
307 
308     return childHandle;
309 }
310 
AddLatticeToCmdList(CmdList & cmdList,const Lattice & lattice)311 LatticeHandle CmdListHelper::AddLatticeToCmdList(CmdList& cmdList, const Lattice& lattice)
312 {
313     LatticeHandle latticeHandle;
314     latticeHandle.fXDivs = AddVectorToCmdList<int>(cmdList, lattice.fXDivs);
315     latticeHandle.fYDivs = AddVectorToCmdList<int>(cmdList, lattice.fYDivs);
316     latticeHandle.fRectTypes = AddVectorToCmdList<Lattice::RectType>(cmdList, lattice.fRectTypes);
317     latticeHandle.fXCount = lattice.fXCount;
318     latticeHandle.fYCount = lattice.fYCount;
319     latticeHandle.fBounds = AddVectorToCmdList<RectI>(cmdList, lattice.fBounds);
320     latticeHandle.fColors = AddVectorToCmdList<Color>(cmdList, lattice.fColors);
321     return latticeHandle;
322 }
323 
GetLatticeFromCmdList(const CmdList & cmdList,const LatticeHandle & latticeHandle)324 Lattice CmdListHelper::GetLatticeFromCmdList(const CmdList& cmdList, const LatticeHandle& latticeHandle)
325 {
326     Lattice lattice;
327     lattice.fXDivs = GetVectorFromCmdList<int>(cmdList, latticeHandle.fXDivs);
328     lattice.fYDivs = GetVectorFromCmdList<int>(cmdList, latticeHandle.fYDivs);
329     lattice.fRectTypes = GetVectorFromCmdList<Lattice::RectType>(cmdList, latticeHandle.fRectTypes);
330     lattice.fXCount = latticeHandle.fXCount;
331     lattice.fYCount = latticeHandle.fYCount;
332     lattice.fBounds = GetVectorFromCmdList<RectI>(cmdList, latticeHandle.fBounds);
333     lattice.fColors = GetVectorFromCmdList<Color>(cmdList, latticeHandle.fColors);
334     return lattice;
335 }
336 
AddSymbolToCmdList(CmdList & cmdList,const DrawingHMSymbolData & symbol)337 SymbolOpHandle CmdListHelper::AddSymbolToCmdList(CmdList& cmdList, const DrawingHMSymbolData& symbol)
338 {
339     auto symbolLayersHandle = AddSymbolLayersToCmdList(cmdList, symbol.symbolInfo_);
340     auto pathHandle = AddPathToCmdList(cmdList, symbol.path_);
341     return {symbolLayersHandle, pathHandle, symbol.symbolId};
342 }
343 
GetSymbolFromCmdList(const CmdList & cmdList,const SymbolOpHandle & symbolHandle)344 DrawingHMSymbolData CmdListHelper::GetSymbolFromCmdList(const CmdList& cmdList,
345     const SymbolOpHandle& symbolHandle)
346 {
347     DrawingHMSymbolData symbol;
348 
349     symbol.symbolInfo_ = GetSymbolLayersFromCmdList(cmdList, symbolHandle.symbolLayerHandle);
350 
351     auto path = GetPathFromCmdList(cmdList, symbolHandle.pathHandle);
352     if (path != nullptr) {
353         symbol.path_ = *path;
354     }
355     symbol.symbolId = symbolHandle.symbolId;
356     return symbol;
357 }
358 
AddSymbolLayersToCmdList(CmdList & cmdList,const DrawingSymbolLayers & symbolLayers)359 SymbolLayersHandle CmdListHelper::AddSymbolLayersToCmdList(CmdList& cmdList, const DrawingSymbolLayers& symbolLayers)
360 {
361     auto layers = symbolLayers.layers;
362     std::vector<std::pair<size_t, size_t>> handleVector1;
363     for (size_t i = 0; i < layers.size(); i++) {
364         handleVector1.push_back(AddVectorToCmdList(cmdList, layers.at(i)));
365     }
366     std::pair<size_t, size_t> layersHandle = AddVectorToCmdList(cmdList, handleVector1);
367 
368     auto groups = symbolLayers.renderGroups;
369     std::vector<RenderGroupHandle> handleVector2;
370     for (size_t i = 0; i < groups.size(); i++) {
371         handleVector2.push_back(AddRenderGroupToCmdList(cmdList, groups.at(i)));
372     }
373     std::pair<size_t, size_t> groupsHandle = AddVectorToCmdList(cmdList, handleVector2);
374 
375     return { symbolLayers.symbolGlyphId, layersHandle, groupsHandle};
376 }
377 
GetSymbolLayersFromCmdList(const CmdList & cmdList,const SymbolLayersHandle & symbolLayersHandle)378 DrawingSymbolLayers CmdListHelper::GetSymbolLayersFromCmdList(const CmdList& cmdList,
379     const SymbolLayersHandle& symbolLayersHandle)
380 {
381     DrawingSymbolLayers symbolLayers;
382     symbolLayers.symbolGlyphId = symbolLayersHandle.id;
383 
384     auto handleVector1 = GetVectorFromCmdList<std::pair<size_t, size_t>>(cmdList, symbolLayersHandle.layers);
385     std::vector<std::vector<size_t>> layers;
386     for (size_t i = 0; i < handleVector1.size(); i++) {
387         layers.push_back(GetVectorFromCmdList<size_t>(cmdList, handleVector1.at(i)));
388     }
389     symbolLayers.layers = layers;
390 
391     auto handleVector2 = GetVectorFromCmdList<RenderGroupHandle>(cmdList, symbolLayersHandle.groups);
392     std::vector<DrawingRenderGroup> renderGroups;
393     for (size_t i = 0; i < handleVector2.size(); i++) {
394         renderGroups.push_back(GetRenderGroupFromCmdList(cmdList, handleVector2.at(i)));
395     }
396     symbolLayers.renderGroups = renderGroups;
397 
398     return symbolLayers;
399 }
400 
AddRenderGroupToCmdList(CmdList & cmdList,const DrawingRenderGroup & group)401 RenderGroupHandle CmdListHelper::AddRenderGroupToCmdList(CmdList& cmdList, const DrawingRenderGroup& group)
402 {
403     auto infos = group.groupInfos;
404     std::vector<GroupInfoHandle> handleVector;
405     for (size_t i = 0; i < infos.size(); i++) {
406         handleVector.push_back(AddGroupInfoToCmdList(cmdList, infos.at(i)));
407     }
408     std::pair<size_t, size_t> groupInfosHandle = AddVectorToCmdList(cmdList, handleVector);
409     return { groupInfosHandle, group.color };
410 }
411 
GetRenderGroupFromCmdList(const CmdList & cmdList,const RenderGroupHandle & renderGroupHandle)412 DrawingRenderGroup CmdListHelper::GetRenderGroupFromCmdList(const CmdList& cmdList,
413     const RenderGroupHandle& renderGroupHandle)
414 {
415     DrawingRenderGroup group;
416     group.color = renderGroupHandle.color;
417 
418     auto handleVector = GetVectorFromCmdList<GroupInfoHandle>(cmdList, renderGroupHandle.infos);
419     std::vector<DrawingGroupInfo> groupInfos;
420     for (size_t i = 0; i < handleVector.size(); i++) {
421         groupInfos.push_back(GetGroupInfoFromCmdList(cmdList, handleVector.at(i)));
422     }
423     group.groupInfos = groupInfos;
424 
425     return group;
426 }
427 
AddGroupInfoToCmdList(CmdList & cmdList,const DrawingGroupInfo & groupInfo)428 GroupInfoHandle CmdListHelper::AddGroupInfoToCmdList(CmdList& cmdList, const DrawingGroupInfo& groupInfo)
429 {
430     std::pair<size_t, size_t> layerIndexes = AddVectorToCmdList(cmdList, groupInfo.layerIndexes);
431     std::pair<size_t, size_t> maskIndexes = AddVectorToCmdList(cmdList, groupInfo.maskIndexes);
432     return { layerIndexes, maskIndexes };
433 }
434 
GetGroupInfoFromCmdList(const CmdList & cmdList,const GroupInfoHandle & groupInfoHandle)435 DrawingGroupInfo CmdListHelper::GetGroupInfoFromCmdList(const CmdList& cmdList, const GroupInfoHandle& groupInfoHandle)
436 {
437     DrawingGroupInfo groupInfo;
438     groupInfo.layerIndexes = GetVectorFromCmdList<size_t>(cmdList, groupInfoHandle.vec1);
439     groupInfo.maskIndexes = GetVectorFromCmdList<size_t>(cmdList, groupInfoHandle.vec2);
440     return groupInfo;
441 }
442 
AddTextBlobToCmdList(CmdList & cmdList,const TextBlob * textBlob,void * ctx)443 OpDataHandle CmdListHelper::AddTextBlobToCmdList(CmdList& cmdList, const TextBlob* textBlob, void* ctx)
444 {
445     if (!textBlob) {
446         return { 0 };
447     }
448     auto data = textBlob->Serialize(ctx);
449     if (!data || data->GetSize() == 0) {
450         LOGD("textBlob serialize invalid, %{public}s, %{public}d", __FUNCTION__, __LINE__);
451         return { 0 };
452     }
453 
454     auto offset = cmdList.AddImageData(data->GetData(), data->GetSize());
455     return { offset, data->GetSize() };
456 }
457 
GetTextBlobFromCmdList(const CmdList & cmdList,const OpDataHandle & textBlobHandle,uint64_t globalUniqueId)458 std::shared_ptr<TextBlob> CmdListHelper::GetTextBlobFromCmdList(const CmdList& cmdList,
459     const OpDataHandle& textBlobHandle, uint64_t globalUniqueId)
460 {
461     if (textBlobHandle.size == 0) {
462         return nullptr;
463     }
464 
465     std::shared_ptr<Drawing::Typeface> typeface = nullptr;
466     if (DrawOpItem::customTypefaceQueryfunc_) {
467         typeface = DrawOpItem::customTypefaceQueryfunc_(globalUniqueId);
468     }
469     TextBlob::Context customCtx {typeface, false};
470 
471     const void* data = cmdList.GetImageData(textBlobHandle.offset, textBlobHandle.size);
472     if (!data) {
473         LOGD("textBlob data nullptr, %{public}s, %{public}d", __FUNCTION__, __LINE__);
474         return nullptr;
475     }
476 
477     auto textBlobData = std::make_shared<Data>();
478     textBlobData->BuildWithoutCopy(data, textBlobHandle.size);
479     return TextBlob::Deserialize(textBlobData->GetData(), textBlobData->GetSize(), &customCtx);
480 }
481 
AddDataToCmdList(CmdList & cmdList,const Data * srcData)482 OpDataHandle CmdListHelper::AddDataToCmdList(CmdList& cmdList, const Data* srcData)
483 {
484     if (!srcData) {
485         LOGD("data nullptr, %{public}s, %{public}d", __FUNCTION__, __LINE__);
486         return { 0 };
487     }
488 
489     auto data = srcData->Serialize();
490     if (data == nullptr || data->GetSize() == 0) {
491         LOGD("srcData is invalid!");
492         return { 0 };
493     }
494 
495     auto offset = cmdList.AddImageData(data->GetData(), data->GetSize());
496     return { offset, data->GetSize() };
497 }
498 
GetDataFromCmdList(const CmdList & cmdList,const OpDataHandle & imageHandle)499 std::shared_ptr<Data> CmdListHelper::GetDataFromCmdList(const CmdList& cmdList, const OpDataHandle& imageHandle)
500 {
501     if (imageHandle.size == 0) {
502         return nullptr;
503     }
504 
505     const void* ptr = cmdList.GetImageData(imageHandle.offset, imageHandle.size);
506     if (ptr == nullptr) {
507         LOGD("get data failed!");
508         return nullptr;
509     }
510 
511     auto imageData = std::make_shared<Data>();
512     imageData->BuildWithoutCopy(ptr, imageHandle.size);
513     return imageData;
514 }
515 
AddPathToCmdList(CmdList & cmdList,const Path & path)516 OpDataHandle CmdListHelper::AddPathToCmdList(CmdList& cmdList, const Path& path)
517 {
518     auto data = path.Serialize();
519     if (data == nullptr || data->GetSize() == 0) {
520         LOGE("path is invalid, %{public}s, %{public}d", __FUNCTION__, __LINE__);
521         return { 0 };
522     }
523 
524     auto offset = cmdList.AddImageData(data->GetData(), data->GetSize());
525     return { offset, data->GetSize() };
526 }
527 
GetPathFromCmdList(const CmdList & cmdList,const OpDataHandle & pathHandle)528 std::shared_ptr<Path> CmdListHelper::GetPathFromCmdList(const CmdList& cmdList,
529     const OpDataHandle& pathHandle)
530 {
531     if (pathHandle.size == 0) {
532         LOGE("pathHandle is invalid!");
533         return nullptr;
534     }
535 
536     const void* ptr = cmdList.GetImageData(pathHandle.offset, pathHandle.size);
537     if (ptr == nullptr) {
538         LOGE("get path data failed!");
539         return nullptr;
540     }
541 
542     auto pathData = std::make_shared<Data>();
543     pathData->BuildWithoutCopy(ptr, pathHandle.size);
544     auto path = std::make_shared<Path>();
545     if (path->Deserialize(pathData) == false) {
546         LOGE("path deserialize failed!");
547         return nullptr;
548     }
549 
550     return path;
551 }
552 
AddRegionToCmdList(CmdList & cmdList,const Region & region)553 OpDataHandle CmdListHelper::AddRegionToCmdList(CmdList& cmdList, const Region& region)
554 {
555     auto data = region.Serialize();
556     if (data == nullptr || data->GetSize() == 0) {
557         LOGD("region is invalid, %{public}s, %{public}d", __FUNCTION__, __LINE__);
558         return { 0 };
559     }
560 
561     auto offset = cmdList.AddImageData(data->GetData(), data->GetSize());
562     return { offset, data->GetSize() };
563 }
564 
GetRegionFromCmdList(const CmdList & cmdList,const OpDataHandle & regionHandle)565 std::shared_ptr<Region> CmdListHelper::GetRegionFromCmdList(const CmdList& cmdList, const OpDataHandle& regionHandle)
566 {
567     if (regionHandle.size == 0) {
568         return nullptr;
569     }
570 
571     const void* ptr = cmdList.GetImageData(regionHandle.offset, regionHandle.size);
572     if (ptr == nullptr) {
573         LOGD("get region data failed!");
574         return nullptr;
575     }
576 
577     auto regionData = std::make_shared<Data>();
578     regionData->BuildWithoutCopy(ptr, regionHandle.size);
579     auto region = std::make_shared<Region>();
580     if (region->Deserialize(regionData) == false) {
581         LOGD("region deserialize failed!");
582         return nullptr;
583     }
584 
585     return region;
586 }
587 
AddColorSpaceToCmdList(CmdList & cmdList,const std::shared_ptr<ColorSpace> colorSpace)588 OpDataHandle CmdListHelper::AddColorSpaceToCmdList(CmdList& cmdList, const std::shared_ptr<ColorSpace> colorSpace)
589 {
590     if (colorSpace == nullptr) {
591         return { 0 };
592     }
593 
594     auto data = colorSpace->Serialize();
595     if (data == nullptr || data->GetSize() == 0) {
596         LOGD("colorSpace is invalid, %{public}s, %{public}d", __FUNCTION__, __LINE__);
597         return { 0 };
598     }
599 
600     auto offset = cmdList.AddImageData(data->GetData(), data->GetSize());
601     return { offset, data->GetSize() };
602 }
603 
GetColorSpaceFromCmdList(const CmdList & cmdList,const OpDataHandle & imageHandle)604 std::shared_ptr<ColorSpace> CmdListHelper::GetColorSpaceFromCmdList(const CmdList& cmdList,
605     const OpDataHandle& imageHandle)
606 {
607     if (imageHandle.size == 0) {
608         return nullptr;
609     }
610 
611     const void* ptr = cmdList.GetImageData(imageHandle.offset, imageHandle.size);
612     if (ptr == nullptr) {
613         return nullptr;
614     }
615     auto colorSpaceData = std::make_shared<Data>();
616     colorSpaceData->BuildWithoutCopy(ptr, imageHandle.size);
617     auto colorSpace = std::make_shared<ColorSpace>(ColorSpace::ColorSpaceType::REF_IMAGE);
618     if (colorSpace->Deserialize(colorSpaceData) == false) {
619         LOGD("colorSpace deserialize failed!");
620         return nullptr;
621     }
622 
623     return colorSpace;
624 }
625 
AddShaderEffectToCmdList(CmdList & cmdList,std::shared_ptr<ShaderEffect> shaderEffect)626 FlattenableHandle CmdListHelper::AddShaderEffectToCmdList(CmdList& cmdList,
627     std::shared_ptr<ShaderEffect> shaderEffect)
628 {
629     if (shaderEffect == nullptr) {
630         return { 0 };
631     }
632 
633     if (shaderEffect->IsLazy()) {
634         // Lazy type: use DrawingObject path
635         auto lazyShader = std::static_pointer_cast<ShaderEffectLazy>(shaderEffect);
636         auto shaderEffectObj = lazyShader->GetShaderEffectObj();
637         if (!shaderEffectObj) {
638             return { 0 };
639         }
640         uint32_t offset = AddDrawingObjectToCmdList(cmdList, shaderEffectObj);
641         return { offset, 1, static_cast<uint32_t>(ShaderEffect::ShaderEffectType::LAZY_SHADER) };
642     }
643 
644     ShaderEffect::ShaderEffectType type = shaderEffect->GetType();
645     if (type == ShaderEffect::ShaderEffectType::EXTEND_SHADER) {
646         std::shared_ptr<ExtendObject> object = shaderEffect->GetExtendObject();
647         if (!object) {
648             return { 0 };
649         }
650         uint32_t offset = AddExtendObjectToCmdList(cmdList, object);
651         return { offset, 1, static_cast<uint32_t>(type) };
652     }
653 
654     // Normal ShaderEffect: use Skia serialization path
655     auto data = shaderEffect->Serialize();
656     if (data == nullptr || data->GetSize() == 0) {
657         LOGD("shaderEffect is invalid, %{public}s, %{public}d", __FUNCTION__, __LINE__);
658         return { 0 };
659     }
660     auto offset = cmdList.AddImageData(data->GetData(), data->GetSize());
661     return { offset, data->GetSize(), static_cast<uint32_t>(type) };
662 }
663 
GetShaderEffectFromCmdList(const CmdList & cmdList,const FlattenableHandle & shaderEffectHandle)664 std::shared_ptr<ShaderEffect> CmdListHelper::GetShaderEffectFromCmdList(const CmdList& cmdList,
665     const FlattenableHandle& shaderEffectHandle)
666 {
667     if (shaderEffectHandle.size == 0) {
668         return nullptr;
669     }
670 
671     ShaderEffect::ShaderEffectType type = static_cast<ShaderEffect::ShaderEffectType>(shaderEffectHandle.type);
672     if (type == ShaderEffect::ShaderEffectType::LAZY_SHADER) {
673         // Lazy type: rebuild from DrawingObject and immediately instantiate
674         auto drawingObj = GetDrawingObjectFromCmdList(cmdList, shaderEffectHandle.offset);
675         if (!drawingObj || drawingObj->GetType() != static_cast<int32_t>(Object::ObjectType::SHADER_EFFECT)) {
676             return nullptr;
677         }
678         auto shaderEffectObj = std::static_pointer_cast<ShaderEffectObj>(drawingObj);
679         auto lazyShader = ShaderEffectLazy::CreateFromShaderEffectObj(shaderEffectObj);
680         if (!lazyShader) {
681             return nullptr;
682         }
683         // Immediately instantiate, return actual ShaderEffect instead of Lazy object
684         return lazyShader->Materialize();
685     }
686 
687     if (type == ShaderEffect::ShaderEffectType::EXTEND_SHADER) {
688         std::shared_ptr<ExtendObject> object = GetExtendObjectFromCmdList(cmdList, shaderEffectHandle.offset);
689         if (!object) {
690             return nullptr;
691         }
692         void* baseObject = object->GenerateBaseObject();
693         if (!baseObject) {
694             return nullptr;
695         }
696         std::shared_ptr<ShaderEffect> shaderEffect;
697         shaderEffect.reset(reinterpret_cast<ShaderEffect*>(baseObject));
698         return shaderEffect;
699     }
700 
701     // Normal type: rebuild from Skia data
702     const void* ptr = cmdList.GetImageData(shaderEffectHandle.offset, shaderEffectHandle.size);
703     if (ptr == nullptr) {
704         return nullptr;
705     }
706 
707     auto shaderEffectData = std::make_shared<Data>();
708     shaderEffectData->BuildWithoutCopy(ptr, shaderEffectHandle.size);
709     auto shaderEffect = std::make_shared<ShaderEffect>(type);
710     if (shaderEffect->Deserialize(shaderEffectData) == false) {
711         LOGD("shaderEffect deserialize failed!");
712         return nullptr;
713     }
714 
715     return shaderEffect;
716 }
717 
AddBlenderToCmdList(CmdList & cmdList,std::shared_ptr<Blender> blender)718 FlattenableHandle CmdListHelper::AddBlenderToCmdList(CmdList& cmdList, std::shared_ptr<Blender> blender)
719 {
720     if (blender == nullptr) {
721         return { 0 };
722     }
723     auto data = blender->Serialize();
724     if (data == nullptr || data->GetSize() == 0) {
725         LOGD("blender is invalid, %{public}s, %{public}d", __FUNCTION__, __LINE__);
726         return { 0 };
727     }
728     auto offset = cmdList.AddImageData(data->GetData(), data->GetSize());
729     return { offset, data->GetSize(), 0 };
730 }
731 
GetBlenderFromCmdList(const CmdList & cmdList,const FlattenableHandle & blenderHandle)732 std::shared_ptr<Blender> CmdListHelper::GetBlenderFromCmdList(const CmdList& cmdList,
733     const FlattenableHandle& blenderHandle)
734 {
735     if (blenderHandle.size == 0) {
736         return nullptr;
737     }
738 
739     const void *ptr = cmdList.GetImageData(blenderHandle.offset, blenderHandle.size);
740     if (ptr == nullptr) {
741         return nullptr;
742     }
743 
744     auto blenderData = std::make_shared<Data>();
745     blenderData->BuildWithoutCopy(ptr, blenderHandle.size);
746     auto blender = std::make_shared<Blender>();
747     if (blender->Deserialize(blenderData) == false) {
748         LOGD("blender deserialize failed!");
749         return nullptr;
750     }
751 
752     return blender;
753 }
754 
AddPathEffectToCmdList(CmdList & cmdList,std::shared_ptr<PathEffect> pathEffect)755 FlattenableHandle CmdListHelper::AddPathEffectToCmdList(CmdList& cmdList, std::shared_ptr<PathEffect> pathEffect)
756 {
757     if (pathEffect == nullptr) {
758         return { 0 };
759     }
760     PathEffect::PathEffectType type = pathEffect->GetType();
761     auto data = pathEffect->Serialize();
762     if (data == nullptr || data->GetSize() == 0) {
763         LOGD("pathEffect is invalid, %{public}s, %{public}d", __FUNCTION__, __LINE__);
764         return { 0 };
765     }
766     auto offset = cmdList.AddImageData(data->GetData(), data->GetSize());
767     return { offset, data->GetSize(), static_cast<uint32_t>(type) };
768 }
769 
GetPathEffectFromCmdList(const CmdList & cmdList,const FlattenableHandle & pathEffectHandle)770 std::shared_ptr<PathEffect> CmdListHelper::GetPathEffectFromCmdList(const CmdList& cmdList,
771     const FlattenableHandle& pathEffectHandle)
772 {
773     if (pathEffectHandle.size == 0) {
774         return nullptr;
775     }
776 
777     const void* ptr = cmdList.GetImageData(pathEffectHandle.offset, pathEffectHandle.size);
778     if (ptr == nullptr) {
779         return nullptr;
780     }
781 
782     auto pathEffectData = std::make_shared<Data>();
783     pathEffectData->BuildWithoutCopy(ptr, pathEffectHandle.size);
784     auto pathEffect = std::make_shared<PathEffect>
785         (static_cast<PathEffect::PathEffectType>(pathEffectHandle.type));
786     if (pathEffect->Deserialize(pathEffectData) == false) {
787         LOGD("pathEffect deserialize failed!");
788         return nullptr;
789     }
790 
791     return pathEffect;
792 }
793 
AddMaskFilterToCmdList(CmdList & cmdList,std::shared_ptr<MaskFilter> maskFilter)794 FlattenableHandle CmdListHelper::AddMaskFilterToCmdList(CmdList& cmdList, std::shared_ptr<MaskFilter> maskFilter)
795 {
796     if (maskFilter == nullptr) {
797         return { 0 };
798     }
799     MaskFilter::FilterType type = maskFilter->GetType();
800     auto data = maskFilter->Serialize();
801     if (data == nullptr || data->GetSize() == 0) {
802         return { 0 };
803     }
804     auto offset = cmdList.AddImageData(data->GetData(), data->GetSize());
805     return { offset, data->GetSize(), static_cast<uint32_t>(type) };
806 }
807 
GetMaskFilterFromCmdList(const CmdList & cmdList,const FlattenableHandle & maskFilterHandle)808 std::shared_ptr<MaskFilter> CmdListHelper::GetMaskFilterFromCmdList(const CmdList& cmdList,
809     const FlattenableHandle& maskFilterHandle)
810 {
811     if (maskFilterHandle.size == 0) {
812         return nullptr;
813     }
814 
815     const void* ptr = cmdList.GetImageData(maskFilterHandle.offset, maskFilterHandle.size);
816     if (ptr == nullptr) {
817         return nullptr;
818     }
819 
820     auto maskFilterData = std::make_shared<Data>();
821     maskFilterData->BuildWithoutCopy(ptr, maskFilterHandle.size);
822     auto maskFilter = std::make_shared<MaskFilter>
823         (static_cast<MaskFilter::FilterType>(maskFilterHandle.type));
824     if (maskFilter->Deserialize(maskFilterData) == false) {
825         LOGD("maskFilter deserialize failed!");
826         return nullptr;
827     }
828 
829     return maskFilter;
830 }
831 
AddColorFilterToCmdList(CmdList & cmdList,std::shared_ptr<ColorFilter> colorFilter)832 FlattenableHandle CmdListHelper::AddColorFilterToCmdList(CmdList& cmdList, std::shared_ptr<ColorFilter> colorFilter)
833 {
834     if (colorFilter == nullptr) {
835         return { 0 };
836     }
837     ColorFilter::FilterType type = colorFilter->GetType();
838     auto data = colorFilter->Serialize();
839     if (data == nullptr || data->GetSize() == 0) {
840         LOGD("colorFilter is invalid, %{public}s, %{public}d", __FUNCTION__, __LINE__);
841         return { 0 };
842     }
843     auto offset = cmdList.AddImageData(data->GetData(), data->GetSize());
844     return { offset, data->GetSize(), static_cast<uint32_t>(type) };
845 }
846 
GetColorFilterFromCmdList(const CmdList & cmdList,const FlattenableHandle & colorFilterHandle)847 std::shared_ptr<ColorFilter> CmdListHelper::GetColorFilterFromCmdList(const CmdList& cmdList,
848     const FlattenableHandle& colorFilterHandle)
849 {
850     if (colorFilterHandle.size == 0) {
851         return nullptr;
852     }
853 
854     const void* ptr = cmdList.GetImageData(colorFilterHandle.offset, colorFilterHandle.size);
855     if (ptr == nullptr) {
856         return nullptr;
857     }
858 
859     auto colorFilterData = std::make_shared<Data>();
860     colorFilterData->BuildWithoutCopy(ptr, colorFilterHandle.size);
861     auto colorFilter = std::make_shared<ColorFilter>
862         (static_cast<ColorFilter::FilterType>(colorFilterHandle.type));
863     if (colorFilter->Deserialize(colorFilterData) == false) {
864         LOGD("colorFilter deserialize failed!");
865         return nullptr;
866     }
867 
868     return colorFilter;
869 }
870 
AddImageFilterToCmdList(CmdList & cmdList,const ImageFilter * imageFilter)871 FlattenableHandle CmdListHelper::AddImageFilterToCmdList(CmdList& cmdList, const ImageFilter* imageFilter)
872 {
873     if (imageFilter == nullptr) {
874         return { 0 };
875     }
876 
877     if (imageFilter->IsLazy()) {
878         // Lazy type: use DrawingObject path
879         auto lazyFilter = static_cast<const ImageFilterLazy*>(imageFilter);
880         auto imageFilterObj = lazyFilter->GetImageFilterObj();
881         if (!imageFilterObj) {
882             return { 0 };
883         }
884         uint32_t offset = AddDrawingObjectToCmdList(cmdList, imageFilterObj);
885         return { offset, 1, static_cast<uint32_t>(ImageFilter::FilterType::LAZY_IMAGE_FILTER) };
886     }
887 
888     ImageFilter::FilterType type = imageFilter->GetType();
889     auto data = imageFilter->Serialize();
890     if (data == nullptr || data->GetSize() == 0) {
891         return { 0 };
892     }
893     auto offset = cmdList.AddImageData(data->GetData(), data->GetSize());
894     return { offset, data->GetSize(), static_cast<uint32_t>(type) };
895 }
896 
AddImageFilterToCmdList(CmdList & cmdList,std::shared_ptr<ImageFilter> imageFilter)897 FlattenableHandle CmdListHelper::AddImageFilterToCmdList(CmdList& cmdList,
898     std::shared_ptr<ImageFilter> imageFilter)
899 {
900     return AddImageFilterToCmdList(cmdList, imageFilter.get());
901 }
902 
GetImageFilterFromCmdList(const CmdList & cmdList,const FlattenableHandle & imageFilterHandle)903 std::shared_ptr<ImageFilter> CmdListHelper::GetImageFilterFromCmdList(const CmdList& cmdList,
904     const FlattenableHandle& imageFilterHandle)
905 {
906     if (imageFilterHandle.size == 0) {
907         return nullptr;
908     }
909 
910     ImageFilter::FilterType type = static_cast<ImageFilter::FilterType>(imageFilterHandle.type);
911     if (type == ImageFilter::FilterType::LAZY_IMAGE_FILTER) {
912         // Lazy type: rebuild from DrawingObject and immediately instantiate
913         auto drawingObj = GetDrawingObjectFromCmdList(cmdList, imageFilterHandle.offset);
914         if (!drawingObj || drawingObj->GetType() != static_cast<int32_t>(Object::ObjectType::IMAGE_FILTER)) {
915             return nullptr;
916         }
917 
918         auto imageFilterObj = std::static_pointer_cast<ImageFilterObj>(drawingObj);
919         auto lazyFilter = ImageFilterLazy::CreateFromImageFilterObj(imageFilterObj);
920         if (!lazyFilter) {
921             return nullptr;
922         }
923         // Immediately instantiate, return actual ImageFilter instead of Lazy object
924         return lazyFilter->Materialize();
925     }
926 
927     const void* ptr = cmdList.GetImageData(imageFilterHandle.offset, imageFilterHandle.size);
928     if (ptr == nullptr) {
929         return nullptr;
930     }
931 
932     auto imageFilterData = std::make_shared<Data>();
933     imageFilterData->BuildWithoutCopy(ptr, imageFilterHandle.size);
934     auto imageFilter = std::make_shared<ImageFilter>(type);
935     if (imageFilter->Deserialize(imageFilterData) == false) {
936         LOGD("imageFilter deserialize failed!");
937         return nullptr;
938     }
939 
940     return imageFilter;
941 }
942 
AddBlurDrawLooperToCmdList(CmdList & cmdList,std::shared_ptr<BlurDrawLooper> blurDrawLooper)943 OpDataHandle CmdListHelper::AddBlurDrawLooperToCmdList(CmdList& cmdList,
944     std::shared_ptr<BlurDrawLooper> blurDrawLooper)
945 {
946     if (blurDrawLooper == nullptr) {
947         LOGD("blurDrawLooper is nullptr");
948         return { 0 };
949     }
950 
951     auto data = blurDrawLooper->Serialize();
952     if (data == nullptr || data->GetSize() == 0) {
953         LOGD("blurDrawLooper serialize failed!");
954         return { 0 };
955     }
956     auto offset = cmdList.AddImageData(data->GetData(), data->GetSize());
957     return { offset, data->GetSize()};
958 }
959 
GetBlurDrawLooperFromCmdList(const CmdList & cmdList,const OpDataHandle & blurDrawLooperHandle)960 std::shared_ptr<BlurDrawLooper> CmdListHelper::GetBlurDrawLooperFromCmdList(const CmdList& cmdList,
961     const OpDataHandle& blurDrawLooperHandle)
962 {
963     if (blurDrawLooperHandle.size == 0) {
964         return nullptr;
965     }
966 
967     const void* ptr = cmdList.GetImageData(blurDrawLooperHandle.offset, blurDrawLooperHandle.size);
968     if (ptr == nullptr) {
969         return nullptr;
970     }
971 
972     auto blurData = std::make_shared<Data>();
973     blurData->BuildWithoutCopy(ptr, blurDrawLooperHandle.size);
974     return BlurDrawLooper::Deserialize(blurData);
975 }
976 
977 #ifdef ROSEN_OHOS
AddSurfaceBufferEntryToCmdList(CmdList & cmdList,const std::shared_ptr<SurfaceBufferEntry> & surfaceBuffer)978 uint32_t CmdListHelper::AddSurfaceBufferEntryToCmdList(
979     CmdList& cmdList, const std::shared_ptr<SurfaceBufferEntry>& surfaceBuffer)
980 {
981     return cmdList.AddSurfaceBufferEntry(surfaceBuffer);
982 }
983 
GetSurfaceBufferEntryFromCmdList(const CmdList & cmdList,uint32_t surfaceBufferHandle)984 std::shared_ptr<SurfaceBufferEntry> CmdListHelper::GetSurfaceBufferEntryFromCmdList(
985     const CmdList& cmdList, uint32_t surfaceBufferHandle)
986 {
987     return (const_cast<CmdList&>(cmdList)).GetSurfaceBufferEntry(surfaceBufferHandle);
988 }
989 #endif
990 
AddDrawFuncObjToCmdList(CmdList & cmdList,const std::shared_ptr<ExtendDrawFuncObj> & object)991 uint32_t CmdListHelper::AddDrawFuncObjToCmdList(CmdList &cmdList, const std::shared_ptr<ExtendDrawFuncObj> &object)
992 {
993     return cmdList.AddDrawFuncOjb(object);
994 }
995 
GetDrawFuncObjFromCmdList(const CmdList & cmdList,uint32_t objectHandle)996 std::shared_ptr<ExtendDrawFuncObj> CmdListHelper::GetDrawFuncObjFromCmdList(
997     const CmdList& cmdList, uint32_t objectHandle)
998 {
999     return (const_cast<CmdList&>(cmdList)).GetDrawFuncObj(objectHandle);
1000 }
1001 
AddExtendObjectToCmdList(CmdList & cmdList,std::shared_ptr<ExtendObject> object)1002 uint32_t CmdListHelper::AddExtendObjectToCmdList(CmdList& cmdList, std::shared_ptr<ExtendObject> object)
1003 {
1004     return cmdList.AddExtendObject(object);
1005 }
1006 
GetExtendObjectFromCmdList(const CmdList & cmdList,uint32_t index)1007 std::shared_ptr<ExtendObject> CmdListHelper::GetExtendObjectFromCmdList(const CmdList& cmdList, uint32_t index)
1008 {
1009     return (const_cast<CmdList&>(cmdList)).GetExtendObject(index);
1010 }
1011 
AddDrawingObjectToCmdList(CmdList & cmdList,std::shared_ptr<Object> object)1012 uint32_t CmdListHelper::AddDrawingObjectToCmdList(CmdList& cmdList, std::shared_ptr<Object> object)
1013 {
1014     return cmdList.AddDrawingObject(object);
1015 }
1016 
GetDrawingObjectFromCmdList(const CmdList & cmdList,uint32_t index)1017 std::shared_ptr<Object> CmdListHelper::GetDrawingObjectFromCmdList(const CmdList& cmdList, uint32_t index)
1018 {
1019     return (const_cast<CmdList&>(cmdList)).GetDrawingObject(index);
1020 }
1021 } // namespace Drawing
1022 } // namespace Rosen
1023 } // namespace OHOS
1024