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