• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 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 comliance with the License.
5  * You may obtian 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 "dtk_constants.h"
17 #include "dtk_test_ext.h"
18 #include "utils.h"
19 
20 namespace OHOS {
21 namespace Rosen {
22 
23 // Bitmap_Scene_0451
24 // Bitmap构造接口:Bitmap_Build_L1_56
25 // Bitmap操作接口:SetFormat/GetFormat
26 // cilp:null
27 // transform:Rotate
28 // 抗锯齿:非AA
29 // 透明度:不透明
30 // 视效:CreateBlendImageFilter
31 DEF_DTK(Bitmap_Scene16, TestLevel::L2, 1)
32 {
33     /*
34      *绘制流程说明:默认绘制两个Bitmap,即2、3两步,透明度效果只在第3步设置
35      */
36     // 1.创建笔刷,设置笔刷是否为抗锯齿效果
37     using namespace Drawing;
38     Drawing::Brush brush;
39     brush.SetAntiAlias(false); // 设置笔刷抗锯齿,true为AA(抗锯齿),false为非AA(不抗锯齿)
40 
41     // 2.创建Bitmap
42     auto colorspace = Drawing::ColorSpace::CreateCustomRGB(PQ, SRGBMatrix);
43     auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGBA_8888, ALPHATYPE_PREMUL, colorspace); // 511 width & 844 height
44     Drawing::Bitmap bitmap;
45     bitmap.Build(imageInfo);
46     bitmap.ClearWithColor(0xFF789645); // 灰绿色
47 
48     // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明
49     Drawing::Bitmap bitmap1 = BuildRandomBitmap();
50     bitmap1.SetFormat(bitmap.GetFormat());
51     bitmap1.ClearWithColor(0xFF4567FA); // 不透明 粉蓝色
52 
53     // 4.组合transform函数
54     playbackCanvas_->Rotate(30, 10, 10); // 30 angle 10 position
55 
56     brush.SetColor(0x4CB21933);
57 
58     for (auto blendMode : blendModes) {
59         auto background = Drawing::ImageFilter::CreateBlurImageFilter(
60             1.0f, 1.0f, Drawing::TileMode::REPEAT, nullptr, Drawing::ImageBlurType::GAUSS);
61         auto foreground = Drawing::ImageFilter::CreateBlurImageFilter(
62             1.0f, 1.0f, Drawing::TileMode::REPEAT, nullptr, Drawing::ImageBlurType::GAUSS);
63         auto filter = Drawing::Filter();
64         // 5.设置视效效果,将效果添加到笔刷
65         filter.SetImageFilter(Drawing::ImageFilter::CreateBlendImageFilter(blendMode, background, foreground));
66         brush.SetFilter(filter);
67 
68         // 6.绘制结果
69         playbackCanvas_->AttachBrush(brush);
70         playbackCanvas_->DrawBitmap(bitmap, 200, 200); // 200,200 is bitmap position
71         playbackCanvas_->DrawBitmap(bitmap1, 250, 300); // 250,300 is bitmap position
72     }
73     playbackCanvas_->DetachBrush();
74 }
75 
76 // Bitmap_Scene_0452
77 // Bitmap构造接口:Bitmap_Build_L1_56
78 // Bitmap操作接口:GetPixmap
79 // cilp:ClipPath
80 // transform:Scale(正常值)
81 // 抗锯齿:AA
82 // 透明度:透明
83 // 视效:CreateMatrixColorFilter
84 DEF_DTK(Bitmap_Scene16, TestLevel::L2, 2)
85 {
86     /*
87      *绘制流程说明:默认绘制两个Bitmap,即2、3两步,透明度效果只在第3步设置
88      */
89     // 1.创建笔刷,设置笔刷是否为抗锯齿效果
90     using namespace Drawing;
91     Drawing::Brush brush;
92     brush.SetAntiAlias(true); // 设置笔刷抗锯齿,true为AA(抗锯齿),false为非AA(不抗锯齿)
93 
94     // 2.创建Bitmap
95     auto colorspace = Drawing::ColorSpace::CreateCustomRGB(PQ, SRGBMatrix);
96     auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGBA_8888, ALPHATYPE_PREMUL, colorspace); // 511 width & 844 height
97     Drawing::Bitmap bitmap;
98     bitmap.Build(imageInfo);
99     bitmap.ClearWithColor(0xFF789645); // 灰绿色
100 
101     // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明
102     Drawing::Bitmap bitmap1;
103     bitmap1.Build(imageInfo);
104     bitmap1.ClearWithColor(0x004567FA); // 透明 粉蓝色
105     auto image = Drawing::Image::MakeFromRaster(bitmap1.GetPixmap(), nullptr, nullptr);
106 
107     // 4.组合transform函数
108     playbackCanvas_->Scale(2.0f, 2.0f); // ratio
109 
110     // 5.设置视效效果,将效果添加到笔刷
111     Drawing::ColorMatrix matrix1;
112     matrix1.SetArray(ARR);
113     auto cf = Drawing::ColorFilter::CreateMatrixColorFilter(matrix1);
114     auto filter = Drawing::Filter();
115     filter.SetImageFilter(Drawing::ImageFilter::CreateColorFilterImageFilter(*cf, nullptr));
116     brush.SetFilter(filter);
117 
118     // 6.绘制结果
119     playbackCanvas_->AttachBrush(brush);
120     playbackCanvas_->DrawBitmap(bitmap, 200, 200);                   // 200,200 is bitmap position
121     playbackCanvas_->DrawImage(*image, 250, 300, SamplingOptions()); // 250,300 is bitmap position
122     playbackCanvas_->DetachBrush();
123 
124     // 7.组合Clip函数,cilp也有抗锯齿效果,默认和笔刷效果保持一致
125     Drawing::Path path;
126     path.AddRect({ 200, 300, 700, 800 }); // rect region (200, 300, 700, 800)
127     path.SetFillStyle(Drawing::PathFillType::INVERSE_WINDING);
128     playbackCanvas_->Save();
129     playbackCanvas_->ClipPath(path, Drawing::ClipOp::DIFFERENCE, true);
130     playbackCanvas_->Clear(Drawing::Color::COLOR_GREEN);
131     playbackCanvas_->Restore();
132 }
133 
134 // Bitmap_Scene_0453
135 // Bitmap构造接口:Bitmap_Build_L1_56
136 // Bitmap操作接口:MakeImage
137 // cilp:ClipRect
138 // transform:Scale(极大值)
139 // 抗锯齿:非AA
140 // 透明度:半透明
141 // 视效:CreateLinearToSrgbGamma
142 DEF_DTK(Bitmap_Scene16, TestLevel::L2, 3)
143 {
144     /*
145      *绘制流程说明:默认绘制两个Bitmap,即2、3两步,透明度效果只在第3步设置
146      */
147     // 1.创建笔刷,设置笔刷是否为抗锯齿效果
148     using namespace Drawing;
149     Drawing::Brush brush;
150     brush.SetAntiAlias(false); // 设置笔刷抗锯齿,true为AA(抗锯齿),false为非AA(不抗锯齿)
151 
152     // 2.创建Bitmap
153     auto colorspace = Drawing::ColorSpace::CreateCustomRGB(PQ, SRGBMatrix);
154     auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGBA_8888, ALPHATYPE_PREMUL, colorspace); // 511 width & 844 height
155     Drawing::Bitmap bitmap;
156     bitmap.Build(imageInfo);
157     bitmap.ClearWithColor(0xFF789645); // 灰绿色
158 
159     // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明
160     Drawing::Bitmap bitmap1;
161     bitmap1.Build(imageInfo);
162     bitmap1.ClearWithColor(0x894567FA); // 半透明 粉蓝色
163     std::shared_ptr<Image> image = bitmap1.MakeImage();
164 
165     // 4.设置视效效果,将效果添加到笔刷
166     brush.SetColor(0xFF4F7091);
167     auto filter = Drawing::Filter();
168     filter.SetColorFilter(Drawing::ColorFilter::CreateLinearToSrgbGamma());
169     brush.SetFilter(filter);
170 
171     // 5.组合transform函数
172     playbackCanvas_->Scale(1.0f, 10100.0f); // ratio
173 
174     // 6.绘制结果
175     playbackCanvas_->AttachBrush(brush);
176     playbackCanvas_->DrawBitmap(bitmap, 200, 200);                   // 200,200 is bitmap position
177     playbackCanvas_->DrawImage(*image, 250, 300, SamplingOptions()); // 250,300 is bitmap position
178     playbackCanvas_->DetachBrush();
179 
180     // 7.组合Clip函数,cilp也有抗锯齿效果,默认和笔刷效果保持一致
181     auto rect = Drawing::Rect(250, 300, 500, 500); // rect region (250, 300, 500, 500)
182     playbackCanvas_->Save();
183     playbackCanvas_->ClipRect(rect, Drawing::ClipOp::DIFFERENCE, false);
184     playbackCanvas_->Clear(Drawing::Color::COLOR_RED);
185     playbackCanvas_->Restore();
186 }
187 
188 // Bitmap_Scene_0454
189 // Bitmap构造接口:Bitmap_Build_L1_56
190 // Bitmap操作接口:SetImmutable/IsImmutable
191 // cilp:ClipRoundRect(G2)
192 // transform:Scale(极小值)
193 // 抗锯齿:AA
194 // 透明度:不透明
195 // 视效:CreateSrgbGammaToLinear
196 DEF_DTK(Bitmap_Scene16, TestLevel::L2, 4)
197 {
198     /*
199      *绘制流程说明:默认绘制两个Bitmap,即2、3两步,透明度效果只在第3步设置
200      */
201     // 1.创建笔刷,设置笔刷是否为抗锯齿效果
202     using namespace Drawing;
203     Drawing::Brush brush;
204     brush.SetAntiAlias(true); // 设置笔刷抗锯齿,true为AA(抗锯齿),false为非AA(不抗锯齿)
205 
206     // 2.创建Bitmap
207     auto colorspace = Drawing::ColorSpace::CreateCustomRGB(PQ, SRGBMatrix);
208     auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGBA_8888, ALPHATYPE_PREMUL, colorspace); // 511 width & 844 height
209     Drawing::Bitmap bitmap;
210     bitmap.Build(imageInfo);
211     bitmap.ClearWithColor(0xFF789645); // 灰绿色
212 
213     // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明
214     Drawing::Bitmap bitmap1;
215     bitmap1.Build(imageInfo);
216     bitmap1.ClearWithColor(0xFF4567FA); // 不透明 粉蓝色
217     bitmap1.SetImmutable();
218     if (bitmap1.IsImmutable()) {
219         playbackCanvas_->DrawBackground(0xFF675800); // 深棕榈
220     }
221 
222     // 4.设置视效效果,将效果添加到笔刷
223     brush.SetColor(0xFF4F7091);
224     auto filter = Drawing::Filter();
225     filter.SetColorFilter(Drawing::ColorFilter::CreateSrgbGammaToLinear());
226     brush.SetFilter(filter);
227 
228     // 5.组合transform函数
229     playbackCanvas_->Scale(10100.0f, 1.0f); // ratio
230 
231     // 6.绘制结果
232     playbackCanvas_->AttachBrush(brush);
233     playbackCanvas_->DrawBitmap(bitmap, 200, 200); // 200,200 is bitmap position
234     playbackCanvas_->DrawBitmap(bitmap1, 250, 300); // 250,300 is bitmap position
235     playbackCanvas_->DetachBrush();
236 
237     // 7.组合Clip函数,cilp也有抗锯齿效果,默认和笔刷效果保持一致
238     auto rect = Drawing::Rect(250, 250, 400, 400); // rect region (250, 250, 400, 400)
239     auto rrect = Drawing::RoundRect(rect, 30.0f, 30.0f); // 30.0f is angle
240     playbackCanvas_->Save();
241     playbackCanvas_->ClipRoundRect(rrect, Drawing::ClipOp::DIFFERENCE, true);
242     playbackCanvas_->Clear(Drawing::Color::COLOR_RED);
243     playbackCanvas_->Restore();
244 }
245 
246 // Bitmap_Scene_0455
247 // Bitmap构造接口:Bitmap_Build_L1_56
248 // Bitmap操作接口:ClearWithColor
249 // cilp:ClipRoundRect(G2_capsule)
250 // transform:Translate
251 // 抗锯齿:非AA
252 // 透明度:透明
253 // 视效:CreateLumaColorFilter
254 DEF_DTK(Bitmap_Scene16, TestLevel::L2, 5)
255 {
256     /*
257      *绘制流程说明:默认绘制两个Bitmap,即2、3两步,透明度效果只在第3步设置
258      */
259     // 1.创建笔刷,设置笔刷是否为抗锯齿效果
260     using namespace Drawing;
261     Drawing::Brush brush;
262     brush.SetAntiAlias(false); // 设置笔刷抗锯齿,true为AA(抗锯齿),false为非AA(不抗锯齿)
263 
264     // 2.创建Bitmap
265     auto colorspace = Drawing::ColorSpace::CreateCustomRGB(PQ, SRGBMatrix);
266     auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGBA_8888, ALPHATYPE_PREMUL, colorspace); // 511 width & 844 height
267     Drawing::Bitmap bitmap;
268     bitmap.Build(imageInfo);
269     bitmap.ClearWithColor(0xFF789645); // 灰绿色
270 
271     // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明
272     Drawing::Bitmap bitmap1;
273     bitmap1.Build(imageInfo);
274     bitmap1.ClearWithColor(0x004567FA); // 透明效果,粉蓝色
275 
276     // 4.设置视效效果,将效果添加到笔刷
277     brush.SetColor(0xFF0000FF); // 蓝色
278     auto filter = Drawing::Filter();
279     filter.SetColorFilter(Drawing::ColorFilter::CreateLumaColorFilter());
280     brush.SetFilter(filter);
281 
282     // 5.组合transform函数
283     playbackCanvas_->Translate(200, 200); // 200 distance
284 
285     // 6.绘制结果
286     playbackCanvas_->AttachBrush(brush);
287     playbackCanvas_->DrawBitmap(bitmap, 200, 200); // 200,200 is bitmap position
288     playbackCanvas_->DrawBitmap(bitmap1, 250, 300); // 250,300 is bitmap position
289     playbackCanvas_->DetachBrush();
290 
291     // 7.组合Clip函数,cilp也有抗锯齿效果,默认和笔刷效果保持一致
292     auto rect = Drawing::Rect(250, 300, 400, 500); // rect region (250, 300, 400, 500)
293     auto rrect = Drawing::RoundRect(rect, 50.0f, 50.0f); // 50.0f is angle
294     playbackCanvas_->Save();
295     playbackCanvas_->ClipRoundRect(rrect, Drawing::ClipOp::DIFFERENCE, true);
296     playbackCanvas_->Clear(Drawing::Color::COLOR_RED);
297     playbackCanvas_->Restore();
298 }
299 
300 // Bitmap_Scene_0456
301 // Bitmap构造接口:Bitmap_Build_L1_56
302 // Bitmap操作接口:ExtractSubset
303 // cilp:ClipRoundRect(非G2)
304 // transform:Shear
305 // 抗锯齿:AA
306 // 透明度:半透明
307 // 视效:CreateBlendImageFilter
308 DEF_DTK(Bitmap_Scene16, TestLevel::L2, 6)
309 {
310     /*
311      *绘制流程说明:默认绘制两个Bitmap,即2、3两步,透明度效果只在第3步设置
312      */
313     // 1.创建笔刷,设置笔刷是否为抗锯齿效果
314     using namespace Drawing;
315     Drawing::Brush brush;
316     brush.SetAntiAlias(true); // 设置笔刷抗锯齿,true为AA(抗锯齿),false为非AA(不抗锯齿)
317 
318     // 2.创建Bitmap
319     auto colorspace = Drawing::ColorSpace::CreateCustomRGB(PQ, SRGBMatrix);
320     auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGBA_8888, ALPHATYPE_PREMUL, colorspace); // 511 width & 844 height
321     Drawing::Bitmap bitmap;
322     bitmap.Build(imageInfo);
323     bitmap.ClearWithColor(0xFF789645); // 灰绿色
324 
325     // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明
326     Drawing::Bitmap bitmap1;
327     bitmap1.Build(imageInfo);
328     bitmap1.ClearWithColor(0x894567FA);                    // 半透明效果,粉蓝色
329     if (bitmap1.ExtractSubset(bitmap, Rect(0, 1, 2, 2))) { // rect(0, 1, 2, 2)
330         playbackCanvas_->DrawBackground(0xFF675800); // 深棕榈
331     }
332 
333     // 4.组合transform函数
334     playbackCanvas_->Shear(10.0f, 10.0f); // slope
335 
336     brush.SetColor(0x4CB21933);
337 
338     for (auto blendMode : blendModes) {
339         auto background = Drawing::ImageFilter::CreateBlurImageFilter(
340             1.0f, 1.0f, Drawing::TileMode::REPEAT, nullptr, Drawing::ImageBlurType::GAUSS);
341         auto foreground = Drawing::ImageFilter::CreateBlurImageFilter(
342             1.0f, 1.0f, Drawing::TileMode::REPEAT, nullptr, Drawing::ImageBlurType::GAUSS);
343         auto filter = Drawing::Filter();
344         // 5.设置视效效果,将效果添加到笔刷
345         filter.SetImageFilter(Drawing::ImageFilter::CreateBlendImageFilter(blendMode, background, foreground));
346         brush.SetFilter(filter);
347 
348         // 6.绘制结果
349         playbackCanvas_->AttachBrush(brush);
350         playbackCanvas_->DrawBitmap(bitmap, 200, 200); // 200,200 is bitmap position
351         playbackCanvas_->DrawBitmap(bitmap1, 250, 300); // 250,300 is bitmap position
352     }
353     playbackCanvas_->DetachBrush();
354 
355     // 7.组合Clip函数,cilp也有抗锯齿效果,默认和笔刷效果保持一致
356     auto rect = Drawing::Rect(300, 300, 400, 400); // rect region (300, 300, 400, 400)
357     auto rrect = Drawing::RoundRect(rect, 30.0f, 30.0f); // 30.0f is angle
358     playbackCanvas_->Save();
359     playbackCanvas_->ClipRoundRect(rrect, Drawing::ClipOp::DIFFERENCE, true);
360     playbackCanvas_->Clear(Drawing::Color::COLOR_RED);
361     playbackCanvas_->Restore();
362 }
363 
364 // Bitmap_Scene_0457
365 // Bitmap构造接口:Bitmap_Build_L1_56
366 // Bitmap操作接口:PeekPixels
367 // cilp:null
368 // transform:null
369 // 抗锯齿:非AA
370 // 透明度:不透明
371 // 视效:CreateBlendShader
372 DEF_DTK(Bitmap_Scene16, TestLevel::L2, 7)
373 {
374     /*
375      *绘制流程说明:默认绘制两个Bitmap,即2、3两步,透明度效果只在第3步设置
376      */
377     // 1.创建笔刷,设置笔刷是否为抗锯齿效果
378     using namespace Drawing;
379     Drawing::Brush brush;
380     brush.SetAntiAlias(false); // 设置笔刷抗锯齿,true为AA(抗锯齿),false为非AA(不抗锯齿)
381 
382     // 2.创建Bitmap
383     auto colorspace = Drawing::ColorSpace::CreateCustomRGB(PQ, SRGBMatrix);
384     auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGBA_8888, ALPHATYPE_PREMUL, colorspace); // 511 width & 844 height
385     Drawing::Bitmap bitmap;
386     bitmap.Build(imageInfo);
387     bitmap.ClearWithColor(0xFF789645); // 灰绿色
388 
389     // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明
390     Drawing::Bitmap bitmap1;
391     bitmap1.Build(imageInfo);
392     bitmap1.ClearWithColor(0xFF4567FA); // 不透明效果,粉蓝色
393     Drawing::Pixmap pixmap;
394     if (bitmap1.PeekPixels(pixmap)) {
395         auto image = Image::MakeFromRaster(pixmap, nullptr, nullptr);
396 
397         brush.SetColor(0xFFFF0000); // 红色
398 
399         auto dst = Drawing::ShaderEffect::CreateColorShader(Drawing::Color::COLOR_RED);
400         auto src = Drawing::ShaderEffect::CreateColorShader(Drawing::Color::COLOR_GREEN);
401         for (auto BlendMode : blendModes) {
402             auto blendShader = Drawing::ShaderEffect::CreateBlendShader(*dst, *src, BlendMode);
403             // 4.设置视效效果,将效果添加到笔刷
404             brush.SetShaderEffect(blendShader);
405 
406             // 5.绘制结果
407             playbackCanvas_->AttachBrush(brush);
408             playbackCanvas_->DrawBitmap(bitmap, 200, 200);                   // 200,200 is bitmap position
409             playbackCanvas_->DrawImage(*image, 250, 300, SamplingOptions()); // 250,300 is bitmap position
410         }
411         playbackCanvas_->DetachBrush();
412     }
413 }
414 
415 // Bitmap_Scene_0458
416 // Bitmap构造接口:Bitmap_Build_L1_56
417 // Bitmap操作接口:ReadPixels
418 // cilp:ClipPath
419 // transform:ConcatMatrix
420 // 抗锯齿:AA
421 // 透明度:透明
422 // 视效:CreateBlurMaskFilter
423 DEF_DTK(Bitmap_Scene16, TestLevel::L2, 8)
424 {
425     /*
426      *绘制流程说明:默认绘制两个Bitmap,即2、3两步,透明度效果只在第3步设置
427      */
428     // 1.创建笔刷,设置笔刷是否为抗锯齿效果
429     using namespace Drawing;
430     Drawing::Brush brush;
431     brush.SetAntiAlias(true); // 设置笔刷抗锯齿,true为AA(抗锯齿),false为非AA(不抗锯齿)
432 
433     // 2.创建Bitmap
434     auto colorspace = Drawing::ColorSpace::CreateCustomRGB(PQ, SRGBMatrix);
435     auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGBA_8888, ALPHATYPE_PREMUL, colorspace); // 511 width & 844 height
436     Drawing::Bitmap bitmap;
437     bitmap.Build(imageInfo);
438     bitmap.ClearWithColor(0xFF789645); // 灰绿色
439 
440     // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明
441     Drawing::Bitmap bitmap1;
442     bitmap1.Build(imageInfo);
443     bitmap1.ClearWithColor(0x004567FA); // 透明效果,粉蓝色
444     auto imageInfo1 =
445         Drawing::ImageInfo(500, 500, Drawing::COLORTYPE_RGBA_8888, Drawing::ALPHATYPE_PREMUL); // 500 width & Height
446     bitmap1.ReadPixels(imageInfo1, bitmap.GetPixels(), bitmap.GetRowBytes(), 50, 50);          // (50, 50) is position
447 
448     // 4.组合transform函数
449     Drawing::Matrix matrix1;
450     matrix1.Rotate(15, 10, 10); // 15 angle 10 position
451     playbackCanvas_->ConcatMatrix(matrix1);
452 
453     brush.SetColor(0xFFFF0000); // 红色
454     std::vector<Drawing::BlurType> blurTypes = { Drawing::BlurType::NORMAL, Drawing::BlurType::SOLID,
455         Drawing::BlurType::OUTER, Drawing::BlurType::INNER };
456 
457     for (auto& blurType : blurTypes) {
458         auto filter = Drawing::Filter();
459         filter.SetMaskFilter(Drawing::MaskFilter::CreateBlurMaskFilter(blurType, 10.0f, true));
460         // 5.设置视效效果,将效果添加到笔刷
461         brush.SetFilter(filter);
462 
463         // 6.绘制结果
464         playbackCanvas_->AttachBrush(brush);
465         playbackCanvas_->DrawBitmap(bitmap, 200, 200); // 200,200 is bitmap position
466         playbackCanvas_->DrawBitmap(bitmap1, 250, 300); // 250,300 is bitmap position
467     }
468     playbackCanvas_->DetachBrush();
469 
470     // 7.组合Clip函数,cilp也有抗锯齿效果,默认和笔刷效果保持一致
471     Drawing::Path path;
472     path.AddRect({ 200, 300, 700, 800 }); // rect region (200, 300, 700, 800)
473     path.SetFillStyle(Drawing::PathFillType::INVERSE_WINDING);
474     playbackCanvas_->Save();
475     playbackCanvas_->ClipPath(path, Drawing::ClipOp::DIFFERENCE, true);
476     playbackCanvas_->Clear(Drawing::Color::COLOR_GREEN);
477     playbackCanvas_->Restore();
478 }
479 
480 // Bitmap_Scene_0459
481 // Bitmap构造接口:Bitmap_Build_L1_56
482 // Bitmap操作接口:CopyPixels
483 // cilp:ClipRect
484 // transform:Rotate
485 // 抗锯齿:非AA
486 // 透明度:半透明
487 // 视效:null
488 DEF_DTK(Bitmap_Scene16, TestLevel::L2, 9)
489 {
490     /*
491      *绘制流程说明:默认绘制两个Bitmap,即2、3两步,透明度效果只在第3步设置
492      */
493     // 1.创建笔刷,设置笔刷是否为抗锯齿效果
494     using namespace Drawing;
495     Drawing::Brush brush;
496     brush.SetAntiAlias(false); // 设置笔刷抗锯齿,true为AA(抗锯齿),false为非AA(不抗锯齿)
497 
498     // 2.创建Bitmap
499     auto colorspace = Drawing::ColorSpace::CreateCustomRGB(PQ, SRGBMatrix);
500     auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGBA_8888, ALPHATYPE_PREMUL, colorspace); // 511 width & 844 height
501     Drawing::Bitmap bitmap;
502     bitmap.Build(imageInfo);
503     bitmap.ClearWithColor(0xFF789645); // 灰绿色
504 
505     // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明
506     Drawing::Bitmap bitmap1;
507     bitmap1.Build(imageInfo);
508     bitmap1.ClearWithColor(0x894567FA); // 半透明效果,粉蓝色
509     bitmap1.CopyPixels(bitmap, 50, 50); // 50 width & Height
510 
511     // 4.组合transform函数
512     playbackCanvas_->Rotate(30, 10, 10); // 30 angle 10 position
513 
514     // 5.绘制结果
515     playbackCanvas_->AttachBrush(brush);
516     playbackCanvas_->DrawBitmap(bitmap, 200, 200); // 200,200 is bitmap position
517     playbackCanvas_->DrawBitmap(bitmap1, 250, 300); // 250,300 is bitmap position
518     playbackCanvas_->DetachBrush();
519 
520     // 6.组合Clip函数,cilp也有抗锯齿效果,默认和笔刷效果保持一致
521     auto rect = Drawing::Rect(250, 300, 500, 500); // rect region (250, 300, 500, 500)
522     playbackCanvas_->Save();
523     playbackCanvas_->ClipRect(rect, Drawing::ClipOp::DIFFERENCE, false);
524     playbackCanvas_->Clear(Drawing::Color::COLOR_RED);
525     playbackCanvas_->Restore();
526 }
527 
528 // Bitmap_Scene_0460
529 // Bitmap构造接口:Bitmap_Build_L1_56
530 // Bitmap操作接口:InstallPixels
531 // cilp:ClipRoundRect(G2)
532 // transform:Scale(正常值)
533 // 抗锯齿:AA
534 // 透明度:不透明
535 // 视效:CreateLinearGradient
536 DEF_DTK(Bitmap_Scene16, TestLevel::L2, 10)
537 {
538     /*
539      *绘制流程说明:默认绘制两个Bitmap,即2、3两步,透明度效果只在第3步设置
540      */
541     // 1.创建笔刷,设置笔刷是否为抗锯齿效果
542     using namespace Drawing;
543     Drawing::Brush brush;
544     brush.SetAntiAlias(true); // 设置笔刷抗锯齿,true为AA(抗锯齿),false为非AA(不抗锯齿)
545 
546     // 2.创建Bitmap
547     auto colorspace = Drawing::ColorSpace::CreateCustomRGB(PQ, SRGBMatrix);
548     auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGBA_8888, ALPHATYPE_PREMUL, colorspace); // 511 width & 844 height
549     Drawing::Bitmap bitmap;
550     bitmap.Build(imageInfo);
551     bitmap.ClearWithColor(0xFF789645); // 灰绿色
552 
553     // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明
554     Drawing::Bitmap bitmap1;
555     bitmap1.Build(imageInfo);
556     bitmap1.ClearWithColor(0xFF4567FA); // 不透明效果,粉蓝色
557     uint32_t pixels[][5] = { { 0xBFA12345, 0xCB9745D2, 0xD0ACB2F4, 0xD34A1234, 0xCDE7AB9F },
558         { 0xD98289C1, 0xC56A2F1A, 0xF3A807CC, 0xBD31C9A2, 0xF05A5378 },
559         { 0xCF19A7E4, 0xF29074BD, 0xC0C35F1A, 0xE73812A7, 0xD98E2B43 },
560         { 0xB6F10D34, 0xD98289C1, 0xC9A4527A, 0xC03D15A2, 0xF4B2C380 },
561         { 0xBF1D68A3, 0xE5A3D1C4, 0xCBF722ED, 0xD7A9BC64, 0xB4C5F219 } };
562     if (bitmap1.InstallPixels(imageInfo, pixels, bitmap.GetRowBytes())) {
563         Drawing::Image image;
564         image.BuildFromBitmap(bitmap1);
565 
566         // 4.设置视效效果,将效果添加到笔刷
567         std::vector<Drawing::ColorQuad> colors = { Drawing::Color::COLOR_RED, Drawing::Color::COLOR_GREEN,
568             Drawing::Color::COLOR_BLUE };
569         std::vector<Drawing::scalar> pos = { 0.00f, 0.50f, 1.00f };
570         auto linearGradient = Drawing::ShaderEffect::CreateLinearGradient(
571             { 0, 0 }, { 1000, 1000 }, colors, pos, Drawing::TileMode::CLAMP); // 0 start pos & 1000 end pos
572         brush.SetShaderEffect(linearGradient);
573 
574         // 5.组合transform函数
575         playbackCanvas_->Scale(2.0f, 2.0f); // ratio
576 
577         // 6.绘制结果
578         playbackCanvas_->AttachBrush(brush);
579         playbackCanvas_->DrawBitmap(bitmap, 200, 200); // 200,200 is bitmap position
580         playbackCanvas_->DrawImage(image, 250, 300, SamplingOptions()); // 250,300 is bitmap position
581         playbackCanvas_->DetachBrush();
582 
583         // 7.组合Clip函数,cilp也有抗锯齿效果,默认和笔刷效果保持一致
584         auto rect = Drawing::Rect(250, 250, 400, 400); // rect region (250, 250, 400, 400)
585         auto rrect = Drawing::RoundRect(rect, 30.0f, 30.0f); // 30.0f is angle
586         playbackCanvas_->Save();
587         playbackCanvas_->ClipRoundRect(rrect, Drawing::ClipOp::DIFFERENCE, true);
588         playbackCanvas_->Clear(Drawing::Color::COLOR_RED);
589         playbackCanvas_->Restore();
590     }
591 }
592 
593 // Bitmap_Scene_0461
594 // Bitmap构造接口:Bitmap_Build_L1_56
595 // Bitmap操作接口:Serialize/Deserialize
596 // cilp:ClipRoundRect(G2_capsule)
597 // transform:Scale(极大值)
598 // 抗锯齿:非AA
599 // 透明度:透明
600 // 视效:CreateColorShader
601 DEF_DTK(Bitmap_Scene16, TestLevel::L2, 11)
602 {
603     /*
604      *绘制流程说明:默认绘制两个Bitmap,即2、3两步,透明度效果只在第3步设置
605      */
606     // 1.创建笔刷,设置笔刷是否为抗锯齿效果
607     using namespace Drawing;
608     Drawing::Brush brush;
609     brush.SetAntiAlias(false); // 设置笔刷抗锯齿,true为AA(抗锯齿),false为非AA(不抗锯齿)
610 
611     // 2.创建Bitmap
612 
613     Drawing::CMSTransferFunction PQ = { -2.0f, -107 / 128.0f, 32 / 2523.0f, 2413 / 128.0f, -2392 / 128.0f,
614         8192 / 1305.0f };
615     auto colorspace = Drawing::ColorSpace::CreateCustomRGB(PQ, SRGBMatrix);
616     auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGBA_8888, ALPHATYPE_PREMUL, colorspace);
617     Drawing::Bitmap bitmap;
618     bitmap.Build(imageInfo);
619     bitmap.ClearWithColor(0xFF789645); // 固定为不透明,灰绿色
620 
621     // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明
622     Drawing::Bitmap bitmap1;
623     bitmap1.Build(500, 500, bitmap.GetFormat());
624     bitmap1.ClearWithColor(0x004567FA); // 透明效果,粉蓝色
625 
626     auto data = bitmap1.Serialize();
627     if (bitmap1.Deserialize(data)) {
628         playbackCanvas_->DrawBackground(0xFF675800);
629     }
630 
631     // 4.组合transform函数
632     playbackCanvas_->Scale(1.0f, 10100.0f);
633 
634     // 5.设置视效效果,将效果添加到笔刷
635     brush.SetColor(0xFFFF0000);
636     auto colorShader = Drawing::ShaderEffect::CreateColorShader(Drawing::Color::COLOR_RED);
637     brush.SetShaderEffect(colorShader);
638 
639     // 6.绘制结果
640     playbackCanvas_->AttachBrush(brush);
641     playbackCanvas_->DrawBitmap(bitmap, 200, 200); // 200,200 is bitmap position
642     playbackCanvas_->DrawBitmap(bitmap1, 250, 300);
643     playbackCanvas_->DetachBrush();
644 
645     // 7.组合Clip函数,cilp也有抗锯齿效果,默认和笔刷效果保持一致
646     auto rect = Drawing::Rect(250, 300, 400, 500); // rect region (250, 300, 400, 500)
647     auto rrect = Drawing::RoundRect(rect, 50.0f, 50.0f); // 50.0f is angle
648     playbackCanvas_->Save();
649     playbackCanvas_->ClipRoundRect(rrect, Drawing::ClipOp::DIFFERENCE, true);
650     playbackCanvas_->Clear(Drawing::Color::COLOR_RED);
651     playbackCanvas_->Restore();
652 }
653 
654 // Bitmap_Scene_0462
655 // Bitmap构造接口:Bitmap_Build_L1_60
656 // Bitmap操作接口:GetWidth
657 // cilp:ClipPath
658 // transform:Shear
659 // 抗锯齿:AA
660 // 透明度:透明
661 // 视效:CreateSrgbGammaToLinear
662 DEF_DTK(Bitmap_Scene16, TestLevel::L2, 12)
663 {
664     /*
665      *绘制流程说明:默认绘制两个Bitmap,即2、3两步,透明度效果只在第3步设置
666      */
667     // 1.创建笔刷,设置笔刷是否为抗锯齿效果
668     using namespace Drawing;
669     Drawing::Brush brush;
670     brush.SetAntiAlias(true); // 设置笔刷抗锯齿,true为AA(抗锯齿),false为非AA(不抗锯齿)
671 
672     // 2.创建Bitmap
673     auto colorspace = Drawing::ColorSpace::CreateSRGBLinear();
674     auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGBA_F16, ALPHATYPE_UNKNOWN, colorspace);
675     Drawing::Bitmap bitmap;
676     bitmap.Build(imageInfo);
677     bitmap.ClearWithColor(0xFF789645); // 固定为不透明,灰绿色
678 
679     // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明
680     Drawing::Bitmap bitmap1;
681     bitmap1.Build(imageInfo);
682     bitmap1.ClearWithColor(0x004567FA); // 透明效果,粉蓝色
683 
684     auto data = bitmap1.Serialize();
685     if (bitmap1.Deserialize(data)) {
686         playbackCanvas_->DrawBackground(0xFF675800);
687     }
688 
689     // 4.组合transform函数
690     playbackCanvas_->Shear(10.0f, 10.0f);
691 
692     // 5.设置视效效果,将效果添加到笔刷
693     brush.SetColor(0xFF4F7091);
694     auto filter = Drawing::Filter();
695     filter.SetColorFilter(Drawing::ColorFilter::CreateSrgbGammaToLinear());
696     brush.SetFilter(filter);
697 
698     // 6.绘制结果
699     playbackCanvas_->AttachBrush(brush);
700     playbackCanvas_->DrawBitmap(bitmap, 200, 200); // 200,200 is bitmap position
701     playbackCanvas_->DrawBitmap(bitmap1, 250, 300);
702     playbackCanvas_->DetachBrush();
703 
704     // 7.组合Clip函数,cilp也有抗锯齿效果,默认和笔刷效果保持一致
705     Drawing::Path path;
706     path.AddRect({ 200, 300, 700, 800 });
707     path.SetFillStyle(Drawing::PathFillType::INVERSE_WINDING);
708     playbackCanvas_->Save();
709     playbackCanvas_->ClipPath(path, Drawing::ClipOp::DIFFERENCE, true);
710     playbackCanvas_->Clear(Drawing::Color::COLOR_GREEN);
711     playbackCanvas_->Restore();
712 }
713 
714 // Bitmap_Scene_0463
715 // Bitmap构造接口:Bitmap_Build_L1_60
716 // Bitmap操作接口:GetHeight
717 // cilp:ClipRect
718 // transform:null
719 // 抗锯齿:非AA
720 // 透明度:半透明
721 // 视效:CreateLumaColorFilter
722 DEF_DTK(Bitmap_Scene16, TestLevel::L2, 13)
723 {
724     /*
725      *绘制流程说明:默认绘制两个Bitmap,即2、3两步,透明度效果只在第3步设置
726      */
727     // 1.创建笔刷,设置笔刷是否为抗锯齿效果
728     using namespace Drawing;
729     Drawing::Brush brush;
730     brush.SetAntiAlias(false); // 设置笔刷抗锯齿,true为AA(抗锯齿),false为非AA(不抗锯齿)
731 
732     // 2.创建Bitmap
733     auto colorspace = Drawing::ColorSpace::CreateSRGBLinear();
734     auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGBA_F16, ALPHATYPE_UNKNOWN, colorspace);
735     Drawing::Bitmap bitmap;
736     bitmap.Build(imageInfo);
737     bitmap.ClearWithColor(0xFF789645); // 固定为不透明,灰绿色
738 
739     // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明
740     Drawing::Bitmap bitmap1;
741     bitmap1.Build(imageInfo);
742     bitmap1.ClearWithColor(0x894567FA); // 半透明效果,粉蓝色
743 
744     auto data = bitmap1.Serialize();
745     if (bitmap1.Deserialize(data)) {
746         playbackCanvas_->DrawBackground(0xFF675800);
747     }
748 
749     // 4.组合transform函数
750     // null
751 
752     // 5.设置视效效果,将效果添加到笔刷
753     brush.SetColor(0xFF0000FF);
754     auto filter = Drawing::Filter();
755     filter.SetColorFilter(Drawing::ColorFilter::CreateLumaColorFilter());
756     brush.SetFilter(filter);
757 
758     // 6.绘制结果
759     playbackCanvas_->AttachBrush(brush);
760     playbackCanvas_->DrawBitmap(bitmap, 200, 200); // 200,200 is bitmap position
761     playbackCanvas_->DrawBitmap(bitmap1, 250, 300);
762     playbackCanvas_->DetachBrush();
763 
764     // 7.组合Clip函数,cilp也有抗锯齿效果,默认和笔刷效果保持一致
765     auto rect = Drawing::Rect(250, 300, 500, 500); // rect region (250, 300, 500, 500)
766     playbackCanvas_->Save();
767     playbackCanvas_->ClipRect(rect, Drawing::ClipOp::DIFFERENCE, false);
768     playbackCanvas_->Clear(Drawing::Color::COLOR_RED);
769     playbackCanvas_->Restore();
770 }
771 
772 // Bitmap_Scene_0464
773 // Bitmap构造接口:Bitmap_Build_L1_60
774 // Bitmap操作接口:GetColorType
775 // cilp:ClipRoundRect(G2)
776 // transform:ConcatMatrix
777 // 抗锯齿:AA
778 // 透明度:不透明
779 // 视效:CreateBlendImageFilter
780 DEF_DTK(Bitmap_Scene16, TestLevel::L2, 14)
781 {
782     /*
783      *绘制流程说明:默认绘制两个Bitmap,即2、3两步,透明度效果只在第3步设置
784      */
785     // 1.创建笔刷,设置笔刷是否为抗锯齿效果
786     using namespace Drawing;
787     Drawing::Brush brush;
788     brush.SetAntiAlias(true); // 设置笔刷抗锯齿,true为AA(抗锯齿),false为非AA(不抗锯齿)
789 
790     // 2.创建Bitmap
791     auto colorspace = Drawing::ColorSpace::CreateSRGBLinear();
792     auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGBA_F16, ALPHATYPE_UNKNOWN, colorspace);
793     Drawing::Bitmap bitmap;
794     bitmap.Build(imageInfo);
795     bitmap.ClearWithColor(0xFF789645); // 固定为不透明,灰绿色
796 
797     // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明
798     Drawing::Bitmap bitmap1;
799     Drawing::BitmapFormat format1 { bitmap.GetColorType(), Drawing::AlphaType::ALPHATYPE_UNKNOWN };
800     bitmap1.Build(500, 500, format1);
801     bitmap1.ClearWithColor(0x004567FA); // 透明效果,粉蓝色
802 
803     auto data = bitmap1.Serialize();
804     if (bitmap1.Deserialize(data)) {
805         playbackCanvas_->DrawBackground(0xFF675800);
806     }
807     brush.SetColor(0xFFFF0000);
808 
809     // 4.组合transform函数
810     Drawing::Matrix matrix;
811     matrix.Rotate(15, 10, 10);
812     playbackCanvas_->ConcatMatrix(matrix);
813 
814     for (auto blendMode : blendModes) {
815         auto background = Drawing::ImageFilter::CreateBlurImageFilter(
816             1.0f, 1.0f, Drawing::TileMode::REPEAT, nullptr, Drawing::ImageBlurType::GAUSS);
817         auto foreground = Drawing::ImageFilter::CreateBlurImageFilter(
818             1.0f, 1.0f, Drawing::TileMode::REPEAT, nullptr, Drawing::ImageBlurType::GAUSS);
819         auto filter = Drawing::Filter();
820 
821         // 5.设置视效效果,将效果添加到笔刷
822         filter.SetImageFilter(Drawing::ImageFilter::CreateBlendImageFilter(blendMode, background, foreground));
823         brush.SetFilter(filter);
824 
825         // 6.绘制结果
826         playbackCanvas_->AttachBrush(brush);
827         playbackCanvas_->DrawBitmap(bitmap, 200, 200); // 200,200 is bitmap position
828         playbackCanvas_->DrawBitmap(bitmap1, 250, 300);
829     }
830     playbackCanvas_->DetachBrush();
831 
832     // 7.组合Clip函数,cilp也有抗锯齿效果,默认和笔刷效果保持一致
833     auto rect = Drawing::Rect(250, 250, 400, 400); // rect region (250, 250, 400, 400)
834     auto rrect = Drawing::RoundRect(rect, 30.0f, 30.0f); // 30.0f is angle
835     playbackCanvas_->Save();
836     playbackCanvas_->ClipRoundRect(rrect, Drawing::ClipOp::DIFFERENCE, true);
837     playbackCanvas_->Clear(Drawing::Color::COLOR_RED);
838     playbackCanvas_->Restore();
839 }
840 
841 // Bitmap_Scene_0465
842 // Bitmap构造接口:Bitmap_Build_L1_60
843 // Bitmap操作接口:GetAlphaType
844 // cilp:ClipRoundRect(G2_capsule)
845 // transform:Rotate
846 // 抗锯齿:非AA
847 // 透明度:半透明
848 // 视效:CreateBlendShader
849 DEF_DTK(Bitmap_Scene16, TestLevel::L2, 15)
850 {
851     /*
852      *绘制流程说明:默认绘制两个Bitmap,即2、3两步,透明度效果只在第3步设置
853      */
854     // 1.创建笔刷,设置笔刷是否为抗锯齿效果
855     using namespace Drawing;
856     Drawing::Brush brush;
857     brush.SetAntiAlias(false); // 设置笔刷抗锯齿,true为AA(抗锯齿),false为非AA(不抗锯齿)
858 
859     // 2.创建Bitmap
860     auto colorspace = Drawing::ColorSpace::CreateSRGBLinear();
861     auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGBA_F16, ALPHATYPE_UNKNOWN, colorspace);
862     Drawing::Bitmap bitmap;
863     bitmap.Build(imageInfo);
864     bitmap.ClearWithColor(0xFF789645); // 固定为不透明,灰绿色
865 
866     // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明
867     Drawing::Bitmap bitmap1;
868     Drawing::BitmapFormat format1 { COLORTYPE_RGBA_F16, bitmap.GetAlphaType() };
869     bitmap1.Build(500, 500, format1);
870     bitmap1.ClearWithColor(0x894567FA); // 半透明效果,粉蓝色
871     brush.SetColor(0xFFFF0000);
872 
873     // 4.组合transform函数
874     Drawing::Matrix matrix;
875     matrix.Rotate(15, 10, 10);
876     playbackCanvas_->ConcatMatrix(matrix);
877 
878     auto dst = Drawing::ShaderEffect::CreateColorShader(Drawing::Color::COLOR_RED);
879     auto src = Drawing::ShaderEffect::CreateColorShader(Drawing::Color::COLOR_GREEN);
880     for (auto blendMode : blendModes) {
881         auto blendShader = Drawing::ShaderEffect::CreateBlendShader(*dst, *src, blendMode);
882 
883         // 5.设置视效效果,将效果添加到笔刷
884         brush.SetShaderEffect(blendShader);
885 
886         // 6.绘制结果
887         playbackCanvas_->AttachBrush(brush);
888         playbackCanvas_->DrawBitmap(bitmap, 200, 200); // 200,200 is bitmap position
889         playbackCanvas_->DrawBitmap(bitmap1, 250, 300);
890     }
891     playbackCanvas_->DetachBrush();
892 
893     // 7.组合Clip函数,cilp也有抗锯齿效果,默认和笔刷效果保持一致
894     auto rect = Drawing::Rect(250, 300, 400, 500); // rect region (250, 300, 400, 500)
895     auto rrect = Drawing::RoundRect(rect, 50.0f, 50.0f); // 50.0f is angle
896     playbackCanvas_->Save();
897     playbackCanvas_->ClipRoundRect(rrect, Drawing::ClipOp::DIFFERENCE, true);
898     playbackCanvas_->Clear(Drawing::Color::COLOR_RED);
899     playbackCanvas_->Restore();
900 }
901 
902 // Bitmap_Scene_0466
903 // Bitmap构造接口:Bitmap_Build_L1_60
904 // Bitmap操作接口:GetRowBytes
905 // cilp:ClipRoundRect(非G2)
906 // transform:Scale(正常值)
907 // 抗锯齿:AA
908 // 透明度:不透明
909 // 视效:CreateBlurMaskFilter
910 DEF_DTK(Bitmap_Scene16, TestLevel::L2, 16)
911 {
912     /*
913      *绘制流程说明:默认绘制两个Bitmap,即2、3两步,透明度效果只在第3步设置
914      */
915     // 1.创建笔刷,设置笔刷是否为抗锯齿效果
916     using namespace Drawing;
917     Drawing::Brush brush;
918     brush.SetAntiAlias(true); // 设置笔刷抗锯齿,true为AA(抗锯齿),false为非AA(不抗锯齿)
919 
920     // 2.创建Bitmap
921     auto colorspace = Drawing::ColorSpace::CreateSRGBLinear();
922     auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGBA_F16, ALPHATYPE_UNKNOWN, colorspace);
923     Drawing::Bitmap bitmap;
924     bitmap.Build(imageInfo);
925     bitmap.ClearWithColor(0xFF789645); // 固定为不透明,灰绿色
926 
927     // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明
928     Drawing::Bitmap bitmap1;
929     bitmap1.Build(imageInfo);
930     bitmap1.ClearWithColor(0xff4567FA); // 不透明效果,粉蓝色
931 
932     if (bitmap1.GetRowBytes() == sizeof(uint32_t) * bitmap1.GetWidth()) {
933         playbackCanvas_->DrawBackground(0xFF675800);
934     }
935 
936     std::vector<Drawing::BlurType> blurTypes = { Drawing::BlurType::NORMAL, Drawing::BlurType::SOLID,
937         Drawing::BlurType::OUTER, Drawing::BlurType::INNER };
938 
939     brush.SetColor(0xFFFF0000);
940 
941     // 4.组合transform函数
942     playbackCanvas_->Scale(2.0f, 2.0f);
943 
944     for (auto& blurType : blurTypes) {
945         auto filter = Drawing::Filter();
946         filter.SetMaskFilter(Drawing::MaskFilter::CreateBlurMaskFilter(blurType, 10.0f, true));
947 
948         // 5.设置视效效果,将效果添加到笔刷
949         brush.SetFilter(filter);
950 
951         // 6.绘制结果
952         playbackCanvas_->AttachBrush(brush);
953         playbackCanvas_->DrawBitmap(bitmap, 200, 200); // 200,200 is bitmap position
954         playbackCanvas_->DrawBitmap(bitmap1, 250, 300);
955     }
956     playbackCanvas_->DetachBrush();
957 
958     // 7.组合Clip函数,cilp也有抗锯齿效果,默认和笔刷效果保持一致
959     auto rect = Drawing::Rect(300, 300, 400, 400); // rect region (300, 300, 400, 400)
960     auto rrect = Drawing::RoundRect(rect, 30.0f, 30.0f); // 30.0f is angle
961     playbackCanvas_->Save();
962     playbackCanvas_->ClipRoundRect(rrect, Drawing::ClipOp::DIFFERENCE, true);
963     playbackCanvas_->Clear(Drawing::Color::COLOR_RED);
964     playbackCanvas_->Restore();
965 }
966 
967 // Bitmap_Scene_0467
968 // Bitmap构造接口:Bitmap_Build_L1_60
969 // Bitmap操作接口:GetImageInfo
970 // cilp:null
971 // transform:Scale(极大值)
972 // 抗锯齿:非AA
973 // 透明度:透明
974 // 视效:null
975 DEF_DTK(Bitmap_Scene16, TestLevel::L2, 17)
976 {
977     /*
978      *绘制流程说明:默认绘制两个Bitmap,即2、3两步,透明度效果只在第3步设置
979      */
980     // 1.创建笔刷,设置笔刷是否为抗锯齿效果
981     using namespace Drawing;
982     Drawing::Brush brush;
983     brush.SetAntiAlias(false); // 设置笔刷抗锯齿,true为AA(抗锯齿),false为非AA(不抗锯齿)
984 
985     // 2.创建Bitmap
986     auto colorspace = Drawing::ColorSpace::CreateSRGBLinear();
987     auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGBA_F16, ALPHATYPE_UNKNOWN, colorspace);
988     Drawing::Bitmap bitmap;
989     bitmap.Build(imageInfo);
990     bitmap.ClearWithColor(0xFF789645); // 固定为不透明,灰绿色
991 
992     // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明
993     Drawing::Bitmap bitmap1;
994     bitmap1.TryAllocPixels(bitmap.GetImageInfo());
995     bitmap1.ClearWithColor(0x004567FA); // 透明效果,粉蓝色
996 
997     auto data = bitmap1.Serialize();
998     if (bitmap1.Deserialize(data)) {
999         playbackCanvas_->DrawBackground(0xFF675800);
1000     }
1001 
1002     // 4.组合transform函数
1003     playbackCanvas_->Scale(1.0f, 10100.0f);
1004 
1005     // 5.设置视效效果,将效果添加到笔刷
1006     // null
1007 
1008     // 6.绘制结果
1009     playbackCanvas_->AttachBrush(brush);
1010     playbackCanvas_->DrawBitmap(bitmap, 200, 200); // 200,200 is bitmap position
1011     playbackCanvas_->DrawBitmap(bitmap1, 250, 300);
1012     playbackCanvas_->DetachBrush();
1013 
1014     // 7.组合Clip函数,cilp也有抗锯齿效果,默认和笔刷效果保持一致
1015     // null
1016 }
1017 
1018 // Bitmap_Scene_0468
1019 // Bitmap构造接口:Bitmap_Build_L1_60
1020 // Bitmap操作接口:SetInfo
1021 // cilp:ClipRoundRect(非G2)
1022 // transform:Scale(极小值)
1023 // 抗锯齿:AA
1024 // 透明度:半透明
1025 // 视效:CreateLinearGradient
1026 DEF_DTK(Bitmap_Scene16, TestLevel::L2, 18)
1027 {
1028     /*
1029      *绘制流程说明:默认绘制两个Bitmap,即2、3两步,透明度效果只在第3步设置
1030      */
1031     // 1.创建笔刷,设置笔刷是否为抗锯齿效果
1032     using namespace Drawing;
1033     Drawing::Brush brush;
1034     brush.SetAntiAlias(true); // 设置笔刷抗锯齿,true为AA(抗锯齿),false为非AA(不抗锯齿)
1035 
1036     // 2.创建Bitmap
1037     auto colorspace = Drawing::ColorSpace::CreateSRGBLinear();
1038     auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGBA_F16, ALPHATYPE_UNKNOWN, colorspace);
1039     Drawing::Bitmap bitmap;
1040     bitmap.Build(imageInfo);
1041     bitmap.ClearWithColor(0xFF789645); // 固定为不透明,灰绿色
1042 
1043     // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明
1044     Drawing::Bitmap bitmap1;
1045     bitmap1.SetInfo(bitmap.GetImageInfo());
1046     bitmap1.ClearWithColor(0x894567FA); // 半透明效果,粉蓝色
1047 
1048     // 4.组合transform函数
1049     playbackCanvas_->Scale(10100.0f, 1.0f);
1050 
1051     // 5.设置视效效果,将效果添加到笔刷
1052     std::vector<Drawing::ColorQuad> colors = { Drawing::Color::COLOR_RED, Drawing::Color::COLOR_GREEN,
1053         Drawing::Color::COLOR_BLUE };
1054     std::vector<Drawing::scalar> pos = { 0.0f, 0.5f, 1.0f };
1055     auto linearGradient =
1056         Drawing::ShaderEffect::CreateLinearGradient({ 0, 0 }, { 100, 100 }, colors, pos, Drawing::TileMode::CLAMP);
1057     brush.SetShaderEffect(linearGradient);
1058 
1059     // 6.绘制结果
1060     playbackCanvas_->AttachBrush(brush);
1061     playbackCanvas_->DrawBitmap(bitmap, 200, 200); // 200,200 is bitmap position
1062     playbackCanvas_->DrawBitmap(bitmap1, 250, 300);
1063     playbackCanvas_->DetachBrush();
1064 
1065     // 7.组合Clip函数,cilp也有抗锯齿效果,默认和笔刷效果保持一致
1066     auto rect = Drawing::Rect(300, 300, 400, 400); // rect region (300, 300, 400, 400)
1067     auto rrect = Drawing::RoundRect(rect, 30.0f, 30.0f); // 30.0f is angle
1068     playbackCanvas_->Save();
1069     playbackCanvas_->ClipRoundRect(rrect, Drawing::ClipOp::DIFFERENCE, true);
1070     playbackCanvas_->Clear(Drawing::Color::COLOR_RED);
1071     playbackCanvas_->Restore();
1072 }
1073 
1074 // Bitmap_Scene_0469
1075 // Bitmap构造接口:Bitmap_Build_L1_60
1076 // Bitmap操作接口:ComputeByteSize
1077 // cilp:null
1078 // transform:Translate
1079 // 抗锯齿:非AA
1080 // 透明度:不透明
1081 // 视效:CreateColorShader
1082 DEF_DTK(Bitmap_Scene16, TestLevel::L2, 19)
1083 {
1084     /*
1085      *绘制流程说明:默认绘制两个Bitmap,即2、3两步,透明度效果只在第3步设置
1086      */
1087     // 1.创建笔刷,设置笔刷是否为抗锯齿效果
1088     using namespace Drawing;
1089     Drawing::Brush brush;
1090     brush.SetAntiAlias(false); // 设置笔刷抗锯齿,true为AA(抗锯齿),false为非AA(不抗锯齿)
1091 
1092     // 2.创建Bitmap
1093     auto colorspace = Drawing::ColorSpace::CreateSRGBLinear();
1094     auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGBA_F16, ALPHATYPE_UNKNOWN, colorspace);
1095     Drawing::Bitmap bitmap;
1096     bitmap.Build(imageInfo);
1097     bitmap.ClearWithColor(0xFF789645); // 固定为不透明,灰绿色
1098 
1099     // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明
1100     Drawing::Bitmap bitmap1;
1101     bitmap1.Build(imageInfo);
1102     bitmap1.ClearWithColor(0xFF4567FA); // 不透明效果,粉蓝色
1103 
1104     size_t size = bitmap.GetRowBytes() * bitmap.GetHeight();
1105     if (bitmap1.ComputeByteSize() == size) {
1106         playbackCanvas_->DrawBackground(0xFF675800);
1107     }
1108 
1109     // 4.组合transform函数
1110     playbackCanvas_->Translate(200, 200);
1111 
1112     // 5.设置视效效果,将效果添加到笔刷
1113     brush.SetColor(0xFFFF0000);
1114     auto colorShader = Drawing::ShaderEffect::CreateColorShader(Drawing::Color::COLOR_RED);
1115     brush.SetShaderEffect(colorShader);
1116 
1117     // 6.绘制结果
1118     playbackCanvas_->AttachBrush(brush);
1119     playbackCanvas_->DrawBitmap(bitmap, 200, 200); // 200,200 is bitmap position
1120     playbackCanvas_->DrawBitmap(bitmap1, 250, 300);
1121     playbackCanvas_->DetachBrush();
1122 
1123     // 7.组合Clip函数,cilp也有抗锯齿效果,默认和笔刷效果保持一致
1124     // null
1125 }
1126 
1127 // Bitmap_Scene_0470
1128 // Bitmap构造接口:Bitmap_Build_L1_60
1129 // Bitmap操作接口:SetPixel/GetPixel
1130 // cilp:ClipPath
1131 // transform:Scale(极小值)
1132 // 抗锯齿:AA
1133 // 透明度:透明
1134 // 视效:CreateBlurImageFilter
1135 DEF_DTK(Bitmap_Scene16, TestLevel::L2, 20)
1136 {
1137     /*
1138      *绘制流程说明:默认绘制两个Bitmap,即2、3两步,透明度效果只在第3步设置
1139      */
1140     // 1.创建笔刷,设置笔刷是否为抗锯齿效果
1141     using namespace Drawing;
1142     Drawing::Brush brush;
1143     brush.SetAntiAlias(true); // 设置笔刷抗锯齿,true为AA(抗锯齿),false为非AA(不抗锯齿)
1144 
1145     // 2.创建Bitmap
1146     auto colorspace = Drawing::ColorSpace::CreateSRGBLinear();
1147     auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGBA_F16, ALPHATYPE_UNKNOWN, colorspace);
1148     Drawing::Bitmap bitmap;
1149     bitmap.Build(imageInfo);
1150     bitmap.ClearWithColor(0xFF789645); // 固定为不透明,灰绿色
1151 
1152     // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明
1153     Drawing::Bitmap bitmap1;
1154     bitmap1.Build(imageInfo);
1155     bitmap1.ClearWithColor(0x004567FA); // 透明效果,粉蓝色
1156 
1157     bitmap1.SetPixels(bitmap.GetPixels());
1158 
1159     // 4.组合transform函数
1160     playbackCanvas_->Scale(10100.0f, 1.0f);
1161 
1162     // 5.设置视效效果,将效果添加到笔刷
1163     brush.SetColor(0xFFFF0000);
1164     auto filter = Drawing::Filter();
1165     filter.SetImageFilter(Drawing::ImageFilter::CreateBlurImageFilter(
1166         10.0f, 10.0f, Drawing::TileMode::CLAMP, nullptr, Drawing::ImageBlurType::GAUSS));
1167     brush.SetFilter(filter);
1168 
1169     // 6.绘制结果
1170     playbackCanvas_->AttachBrush(brush);
1171     playbackCanvas_->DrawBitmap(bitmap, 200, 200); // 200,200 is bitmap position
1172     playbackCanvas_->DrawBitmap(bitmap1, 250, 300);
1173     playbackCanvas_->DetachBrush();
1174 
1175     // 7.组合Clip函数,cilp也有抗锯齿效果,默认和笔刷效果保持一致
1176     Drawing::Path path;
1177     path.AddRect({ 200, 300, 700, 800 });
1178     path.SetFillStyle(Drawing::PathFillType::INVERSE_WINDING);
1179     playbackCanvas_->Save();
1180     playbackCanvas_->ClipPath(path, Drawing::ClipOp::DIFFERENCE, true);
1181     playbackCanvas_->Clear(Drawing::Color::COLOR_GREEN);
1182     playbackCanvas_->Restore();
1183 }
1184 
1185 // Bitmap_Scene_0471
1186 // Bitmap构造接口:Bitmap_Build_L1_60
1187 // Bitmap操作接口:IsEmpty
1188 // cilp:ClipRect
1189 // transform:Translate
1190 // 抗锯齿:非AA
1191 // 透明度:半透明
1192 // 视效:CreateBlendModeColorFilter
1193 DEF_DTK(Bitmap_Scene16, TestLevel::L2, 21)
1194 {
1195     /*
1196      *绘制流程说明:默认绘制两个Bitmap,即2、3两步,透明度效果只在第3步设置
1197      */
1198     // 1.创建笔刷,设置笔刷是否为抗锯齿效果
1199     using namespace Drawing;
1200     Drawing::Brush brush;
1201     brush.SetAntiAlias(false); // 设置笔刷抗锯齿,true为AA(抗锯齿),false为非AA(不抗锯齿)
1202 
1203     // 2.创建Bitmap
1204     auto colorspace = Drawing::ColorSpace::CreateSRGBLinear();
1205     auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGBA_F16, ALPHATYPE_UNKNOWN, colorspace);
1206     Drawing::Bitmap bitmap;
1207     bitmap.Build(imageInfo);
1208     bitmap.ClearWithColor(0xFF789645); // 固定为不透明,灰绿色
1209 
1210     // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明
1211     Drawing::Bitmap bitmap1;
1212     bitmap1.Build(imageInfo);
1213     bitmap1.ClearWithColor(0x894567FA); // 半透明效果,粉蓝色
1214     if (bitmap1.IsEmpty()) {
1215         playbackCanvas_->DrawBackground(0xFF675800);
1216     }
1217     brush.SetColor(0x4CB21933);
1218 
1219     // 4.组合transform函数
1220     playbackCanvas_->Translate(200, 200);
1221 
1222     for (auto blendMode : blendModes) {
1223         std::shared_ptr<Drawing::ColorFilter> colorFilter =
1224             Drawing::ColorFilter::CreateBlendModeColorFilter(0xFFFF0000, blendMode);
1225         auto filter = Drawing::Filter();
1226 
1227         // 5.设置视效效果,将效果添加到笔刷
1228         filter.SetColorFilter(colorFilter);
1229         brush.SetFilter(filter);
1230 
1231         // 6.绘制结果
1232         playbackCanvas_->AttachBrush(brush);
1233         playbackCanvas_->DrawBitmap(bitmap, 200, 200); // 200,200 is bitmap position
1234         playbackCanvas_->DrawBitmap(bitmap1, 250, 300);
1235         playbackCanvas_->DetachBrush();
1236     }
1237 
1238     // 7.组合Clip函数,cilp也有抗锯齿效果,默认和笔刷效果保持一致
1239     auto rect = Drawing::Rect(250, 300, 500, 500); // rect region (250, 300, 500, 500)
1240     playbackCanvas_->Save();
1241     playbackCanvas_->ClipRect(rect, Drawing::ClipOp::DIFFERENCE, false);
1242     playbackCanvas_->Clear(Drawing::Color::COLOR_RED);
1243     playbackCanvas_->Restore();
1244 }
1245 
1246 // Bitmap_Scene_0472
1247 // Bitmap构造接口:Bitmap_Build_L1_60
1248 // Bitmap操作接口:IsValid
1249 // cilp:ClipRoundRect(G2)
1250 // transform:Shear
1251 // 抗锯齿:AA
1252 // 透明度:不透明
1253 // 视效:CreateComposeColorFilter
1254 DEF_DTK(Bitmap_Scene16, TestLevel::L2, 22)
1255 {
1256     /*
1257      *绘制流程说明:默认绘制两个Bitmap,即2、3两步,透明度效果只在第3步设置
1258      */
1259     // 1.创建笔刷,设置笔刷是否为抗锯齿效果
1260     using namespace Drawing;
1261     Drawing::Brush brush;
1262     brush.SetAntiAlias(false); // 设置笔刷抗锯齿,true为AA(抗锯齿),false为非AA(不抗锯齿)
1263 
1264     // 2.创建Bitmap
1265     auto colorspace = Drawing::ColorSpace::CreateSRGBLinear();
1266     auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGBA_F16, ALPHATYPE_UNKNOWN, colorspace);
1267     Drawing::Bitmap bitmap;
1268     bitmap.Build(imageInfo);
1269     bitmap.ClearWithColor(0xFF789645); // 固定为不透明,灰绿色
1270 
1271     // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明
1272     Drawing::Bitmap bitmap1;
1273     bitmap1.Build(imageInfo);
1274     bitmap1.ClearWithColor(0xFF4567FA); // 不透明效果,粉蓝色
1275     if (bitmap1.IsValid()) {
1276         playbackCanvas_->DrawBackground(0xFF675800);
1277     }
1278     brush.SetColor(0xFFFF0000);
1279 
1280     // 4.组合transform函数
1281     playbackCanvas_->Shear(10.0f, 10.0f);
1282 
1283     for (auto blendMode1 : blendModes) {
1284         std::shared_ptr<Drawing::ColorFilter> colorFilter1 =
1285             Drawing::ColorFilter::CreateBlendModeColorFilter(0xFFFF0000, blendMode1);
1286         for (auto blendMode2 : blendModes) {
1287             std::shared_ptr<Drawing::ColorFilter> colorFilter2 =
1288                 Drawing::ColorFilter::CreateBlendModeColorFilter(0xFFFF00FF, blendMode2);
1289             std::shared_ptr<Drawing::ColorFilter> colorFilter3 =
1290                 Drawing::ColorFilter::CreateComposeColorFilter(*colorFilter1, *colorFilter2);
1291             auto filter = Drawing::Filter();
1292 
1293             // 5.设置视效效果,将效果添加到笔刷
1294             filter.SetColorFilter(colorFilter3);
1295             brush.SetFilter(filter);
1296 
1297             // 6.绘制结果
1298             playbackCanvas_->AttachBrush(brush);
1299             playbackCanvas_->DrawBitmap(bitmap, 200, 200); // 200,200 is bitmap position
1300             playbackCanvas_->DrawBitmap(bitmap1, 250, 300);
1301         }
1302     }
1303     playbackCanvas_->DetachBrush();
1304 
1305     // 7.组合Clip函数,cilp也有抗锯齿效果,默认和笔刷效果保持一致
1306     auto rect = Drawing::Rect(250, 250, 400, 400); // rect region (250, 250, 400, 400)
1307     auto rrect = Drawing::RoundRect(rect, 30.0f, 30.0f); // 30.0f is angle
1308     playbackCanvas_->Save();
1309     playbackCanvas_->ClipRoundRect(rrect, Drawing::ClipOp::DIFFERENCE, true);
1310     playbackCanvas_->Clear(Drawing::Color::COLOR_RED);
1311     playbackCanvas_->Restore();
1312 }
1313 
1314 // Bitmap_Scene_0473
1315 // Bitmap构造接口:Bitmap_Build_L1_60
1316 // Bitmap操作接口:GetColor
1317 // cilp:ClipRoundRect(G2_capsule)
1318 // transform:null
1319 // 抗锯齿:非AA
1320 // 透明度:透明
1321 // 视效:CreateMatrixColorFilter
1322 DEF_DTK(Bitmap_Scene16, TestLevel::L2, 23)
1323 {
1324     /*
1325      *绘制流程说明:默认绘制两个Bitmap,即2、3两步,透明度效果只在第3步设置
1326      */
1327     // 1.创建笔刷,设置笔刷是否为抗锯齿效果
1328     using namespace Drawing;
1329     Drawing::Brush brush;
1330     brush.SetAntiAlias(false); // 设置笔刷抗锯齿,true为AA(抗锯齿),false为非AA(不抗锯齿)
1331 
1332     // 2.创建Bitmap
1333     auto colorspace = Drawing::ColorSpace::CreateSRGBLinear();
1334     auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGBA_F16, ALPHATYPE_UNKNOWN, colorspace);
1335     Drawing::Bitmap bitmap;
1336     bitmap.SetFormat(bitmap.GetFormat());
1337     bitmap.ClearWithColor(0xFF789645); // 固定为不透明,灰绿色
1338 
1339     // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明
1340     Drawing::Bitmap bitmap1;
1341     bitmap1.Build(imageInfo);
1342     bitmap1.ClearWithColor(bitmap.GetColor(1, 1));
1343 
1344     // 4.组合transform函数
1345     // null
1346 
1347     // 5.设置视效效果,将效果添加到笔刷
1348     Drawing::ColorMatrix matrix;
1349     matrix.SetArray(ARR);
1350     auto cf = Drawing::ColorFilter::CreateMatrixColorFilter(matrix);
1351     auto filter = Drawing::Filter();
1352     filter.SetImageFilter(Drawing::ImageFilter::CreateColorFilterImageFilter(*cf, nullptr));
1353     brush.SetFilter(filter);
1354 
1355     // 6.绘制结果
1356     playbackCanvas_->AttachBrush(brush);
1357     playbackCanvas_->DrawBitmap(bitmap, 200, 200); // 200,200 is bitmap position
1358     playbackCanvas_->DrawBitmap(bitmap1, 250, 300);
1359     playbackCanvas_->DetachBrush();
1360 
1361     // 7.组合Clip函数,cilp也有抗锯齿效果,默认和笔刷效果保持一致
1362     auto rect = Drawing::Rect(250, 300, 400, 500); // rect region (250, 300, 400, 500)
1363     auto rrect = Drawing::RoundRect(rect, 50.0f, 50.0f); // 50.0f is angle
1364     playbackCanvas_->Save();
1365     playbackCanvas_->ClipRoundRect(rrect, Drawing::ClipOp::DIFFERENCE, false);
1366     playbackCanvas_->Clear(Drawing::Color::COLOR_RED);
1367     playbackCanvas_->Restore();
1368 }
1369 
1370 // Bitmap_Scene_0474
1371 // Bitmap构造接口:Bitmap_Build_L1_60
1372 // Bitmap操作接口:SetFormat/GetFormat
1373 // cilp:ClipRoundRect(非G2)
1374 // transform:ConcatMatrix
1375 // 抗锯齿:AA
1376 // 透明度:半透明
1377 // 视效:CreateLinearToSrgbGamma
1378 DEF_DTK(Bitmap_Scene16, TestLevel::L2, 24)
1379 {
1380     /*
1381      *绘制流程说明:默认绘制两个Bitmap,即2、3两步,透明度效果只在第3步设置
1382      */
1383     // 1.创建笔刷,设置笔刷是否为抗锯齿效果
1384     using namespace Drawing;
1385     Drawing::Brush brush;
1386     brush.SetAntiAlias(true); // 设置笔刷抗锯齿,true为AA(抗锯齿),false为非AA(不抗锯齿)
1387 
1388     // 2.创建Bitmap
1389     auto colorspace = Drawing::ColorSpace::CreateSRGBLinear();
1390     auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGBA_F16, ALPHATYPE_UNKNOWN, colorspace);
1391     Drawing::Bitmap bitmap;
1392     bitmap.SetFormat(bitmap.GetFormat());
1393     bitmap.ClearWithColor(0xFF789645); // 固定为不透明,灰绿色
1394 
1395     // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明
1396     Drawing::Bitmap bitmap1 = BuildRandomBitmap();
1397     bitmap1.SetFormat(bitmap.GetFormat());
1398     bitmap1.ClearWithColor(0x894567FA); // 半透明效果,粉蓝色
1399 
1400     auto data = bitmap1.Serialize();
1401     if (bitmap1.Deserialize(data)) {
1402         playbackCanvas_->DrawBackground(0xFF675800);
1403     }
1404 
1405     // 4.组合transform函数
1406     Drawing::Matrix matrix;
1407     matrix.Rotate(15, 10, 10);
1408     playbackCanvas_->ConcatMatrix(matrix);
1409 
1410     // 5.设置视效效果,将效果添加到笔刷
1411     brush.SetColor(0xFF4F7091);
1412     auto filter = Drawing::Filter();
1413     filter.SetColorFilter(Drawing::ColorFilter::CreateLinearToSrgbGamma());
1414     brush.SetFilter(filter);
1415 
1416     // 6.绘制结果
1417     playbackCanvas_->AttachBrush(brush);
1418     playbackCanvas_->DrawBitmap(bitmap, 200, 200); // 200,200 is bitmap position
1419     playbackCanvas_->DrawBitmap(bitmap1, 250, 300);
1420     playbackCanvas_->DetachBrush();
1421 
1422     // 7.组合Clip函数,cilp也有抗锯齿效果,默认和笔刷效果保持一致
1423     auto rect = Drawing::Rect(300, 300, 400, 400); // rect region (300, 300, 400, 400)
1424     auto rrect = Drawing::RoundRect(rect, 30.0f, 30.0f); // 30.0f is angle
1425     playbackCanvas_->Save();
1426     playbackCanvas_->ClipRoundRect(rrect, Drawing::ClipOp::DIFFERENCE, true);
1427     playbackCanvas_->Clear(Drawing::Color::COLOR_RED);
1428     playbackCanvas_->Restore();
1429 }
1430 
1431 // Bitmap_Scene_0475
1432 // Bitmap构造接口:Bitmap_Build_L1_60
1433 // Bitmap操作接口:GetPixmap
1434 // cilp:null
1435 // transform:Rotate
1436 // 抗锯齿:非AA
1437 // 透明度:不透明
1438 // 视效:CreateBlurImageFilter
1439 DEF_DTK(Bitmap_Scene16, TestLevel::L2, 25)
1440 {
1441     /*
1442      *绘制流程说明:默认绘制两个Bitmap,即2、3两步,透明度效果只在第3步设置
1443      */
1444     // 1.创建笔刷,设置笔刷是否为抗锯齿效果
1445     using namespace Drawing;
1446     Drawing::Brush brush;
1447     brush.SetAntiAlias(false); // 设置笔刷抗锯齿,true为AA(抗锯齿),false为非AA(不抗锯齿)
1448 
1449     // 2.创建Bitmap
1450     auto colorspace = Drawing::ColorSpace::CreateSRGBLinear();
1451     auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGBA_F16, ALPHATYPE_UNKNOWN, colorspace);
1452     Drawing::Bitmap bitmap;
1453     bitmap.SetFormat(bitmap.GetFormat());
1454     bitmap.ClearWithColor(0xFF789645); // 固定为不透明,灰绿色
1455 
1456     // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明
1457     Drawing::Bitmap bitmap1;
1458     bitmap1.SetFormat(bitmap.GetFormat());
1459     bitmap1.ClearWithColor(0xFF4567FA); // 不透明效果,粉蓝色
1460 
1461     auto image = Drawing::Image::MakeFromRaster(bitmap1.GetPixmap(), nullptr, nullptr);
1462 
1463     // 4.组合transform函数
1464     playbackCanvas_->Rotate(30, 10, 10);
1465 
1466     // 5.设置视效效果,将效果添加到笔刷
1467     brush.SetColor(0xFFFF0000);
1468     auto filter = Drawing::Filter();
1469     filter.SetImageFilter(Drawing::ImageFilter::CreateBlurImageFilter(
1470         10.0f, 10.0f, Drawing::TileMode::CLAMP, nullptr, Drawing::ImageBlurType::GAUSS));
1471     brush.SetFilter(filter);
1472 
1473     // 6.绘制结果
1474     playbackCanvas_->AttachBrush(brush);
1475     playbackCanvas_->DrawBitmap(bitmap, 200, 200); // 200,200 is bitmap position
1476     playbackCanvas_->DrawImage(*image, 250, 300, SamplingOptions());
1477     playbackCanvas_->DetachBrush();
1478 
1479     // 7.组合Clip函数,cilp也有抗锯齿效果,默认和笔刷效果保持一致
1480     // null
1481 }
1482 
1483 // Bitmap_Scene_0476
1484 // Bitmap构造接口:Bitmap_Build_L1_60
1485 // Bitmap操作接口:MakeImage
1486 // cilp:ClipPath
1487 // transform:Scale(正常值)
1488 // 抗锯齿:AA
1489 // 透明度:透明
1490 // 视效:CreateBlendModeColorFilter
1491 DEF_DTK(Bitmap_Scene16, TestLevel::L2, 26)
1492 {
1493     /*
1494      *绘制流程说明:默认绘制两个Bitmap,即2、3两步,透明度效果只在第3步设置
1495      */
1496     // 1.创建笔刷,设置笔刷是否为抗锯齿效果
1497     using namespace Drawing;
1498     Drawing::Brush brush;
1499     brush.SetAntiAlias(true); // 设置笔刷抗锯齿,true为AA(抗锯齿),false为非AA(不抗锯齿)
1500 
1501     // 2.创建Bitmap
1502     auto colorspace = Drawing::ColorSpace::CreateSRGBLinear();
1503     auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGBA_F16, ALPHATYPE_UNKNOWN, colorspace);
1504     Drawing::Bitmap bitmap;
1505     bitmap.SetFormat(bitmap.GetFormat());
1506     bitmap.ClearWithColor(0xFF789645); // 固定为不透明,灰绿色
1507 
1508     // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明
1509     Drawing::Bitmap bitmap1;
1510     bitmap1.SetFormat(bitmap.GetFormat());
1511     bitmap1.ClearWithColor(0x004567FA); // 透明效果,粉蓝色
1512     std::shared_ptr<Image> image = bitmap1.MakeImage();
1513     brush.SetColor(0x4CB21933);
1514 
1515     // 4.组合transform函数
1516     playbackCanvas_->Scale(2.0f, 2.0f);
1517 
1518     for (auto blendMode : blendModes) {
1519         std::shared_ptr<Drawing::ColorFilter> colorFilter =
1520             Drawing::ColorFilter::CreateBlendModeColorFilter(0xFFFF0000, blendMode);
1521         auto filter = Drawing::Filter();
1522 
1523         // 5.设置视效效果,将效果添加到笔刷
1524         filter.SetColorFilter(colorFilter);
1525         brush.SetFilter(filter);
1526 
1527         // 6.绘制结果
1528         playbackCanvas_->AttachBrush(brush);
1529         playbackCanvas_->DrawBitmap(bitmap, 200, 200); // 200,200 is bitmap position
1530         playbackCanvas_->DrawImage(*image, 250, 300, SamplingOptions());
1531         playbackCanvas_->DetachBrush();
1532     }
1533 
1534     // 7.组合Clip函数,cilp也有抗锯齿效果,默认和笔刷效果保持一致
1535     Drawing::Path path;
1536     path.AddRect({ 200, 300, 700, 800 });
1537     path.SetFillStyle(Drawing::PathFillType::INVERSE_WINDING);
1538     playbackCanvas_->Save();
1539     playbackCanvas_->ClipPath(path, Drawing::ClipOp::DIFFERENCE, true);
1540     playbackCanvas_->Clear(Drawing::Color::COLOR_GREEN);
1541     playbackCanvas_->Restore();
1542 }
1543 
1544 // Bitmap_Scene_0477
1545 // Bitmap构造接口:Bitmap_Build_L1_60
1546 // Bitmap操作接口:SetImmutable/IsImmutable
1547 // cilp:ClipRect
1548 // transform:Scale(极大值)
1549 // 抗锯齿:非AA
1550 // 透明度:半透明
1551 // 视效:CreateComposeColorFilter
1552 DEF_DTK(Bitmap_Scene16, TestLevel::L2, 27)
1553 {
1554     /*
1555      *绘制流程说明:默认绘制两个Bitmap,即2、3两步,透明度效果只在第3步设置
1556      */
1557     // 1.创建笔刷,设置笔刷是否为抗锯齿效果
1558     using namespace Drawing;
1559     Drawing::Brush brush;
1560     brush.SetAntiAlias(false); // 设置笔刷抗锯齿,true为AA(抗锯齿),false为非AA(不抗锯齿)
1561 
1562     // 2.创建Bitmap
1563     auto colorspace = Drawing::ColorSpace::CreateSRGBLinear();
1564     auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGBA_F16, ALPHATYPE_UNKNOWN, colorspace);
1565     Drawing::Bitmap bitmap;
1566     bitmap.SetFormat(bitmap.GetFormat());
1567     bitmap.ClearWithColor(0xFF789645); // 固定为不透明,灰绿色
1568 
1569     // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明
1570     Drawing::Bitmap bitmap1;
1571     bitmap1.SetFormat(bitmap.GetFormat());
1572     bitmap1.ClearWithColor(0x894567FA); // 半透明效果,粉蓝色
1573 
1574     bitmap1.SetImmutable();
1575     if (bitmap1.IsImmutable()) {
1576         playbackCanvas_->DrawBackground(0xFF675800);
1577     }
1578     brush.SetColor(0xFFFF0000);
1579 
1580     // 4.组合transform函数
1581     playbackCanvas_->Scale(1.0f, 10100.0f);
1582 
1583     for (auto blendMode1 : blendModes) {
1584         std::shared_ptr<Drawing::ColorFilter> colorFilter1 =
1585             Drawing::ColorFilter::CreateBlendModeColorFilter(0xFFFF0000, blendMode1);
1586         for (auto blendMode2 : blendModes) {
1587             std::shared_ptr<Drawing::ColorFilter> colorFilter2 =
1588                 Drawing::ColorFilter::CreateBlendModeColorFilter(0xFFFF00FF, blendMode2);
1589             std::shared_ptr<Drawing::ColorFilter> colorFilter3 =
1590                 Drawing::ColorFilter::CreateComposeColorFilter(*colorFilter1, *colorFilter2);
1591             auto filter = Drawing::Filter();
1592 
1593             // 5.设置视效效果,将效果添加到笔刷
1594             filter.SetColorFilter(colorFilter3);
1595             brush.SetFilter(filter);
1596 
1597             // 6.绘制结果
1598             playbackCanvas_->AttachBrush(brush);
1599             playbackCanvas_->DrawBitmap(bitmap, 200, 200); // 200,200 is bitmap position
1600             playbackCanvas_->DrawBitmap(bitmap1, 250, 300);
1601         }
1602     }
1603     playbackCanvas_->DetachBrush();
1604 
1605     // 7.组合Clip函数,cilp也有抗锯齿效果,默认和笔刷效果保持一致
1606     auto rect = Drawing::Rect(250, 300, 500, 500); // rect region (250, 300, 500, 500)
1607     playbackCanvas_->Save();
1608     playbackCanvas_->ClipRect(rect, Drawing::ClipOp::DIFFERENCE, false);
1609     playbackCanvas_->Clear(Drawing::Color::COLOR_RED);
1610     playbackCanvas_->Restore();
1611 }
1612 
1613 // Bitmap_Scene_0478
1614 // Bitmap构造接口:Bitmap_Build_L1_60
1615 // Bitmap操作接口:ClearWithColor
1616 // cilp:ClipRoundRect(G2)
1617 // transform:Scale(极小值)
1618 // 抗锯齿:AA
1619 // 透明度:不透明
1620 // 视效:CreateMatrixColorFilter
1621 DEF_DTK(Bitmap_Scene16, TestLevel::L2, 28)
1622 {
1623     /*
1624      *绘制流程说明:默认绘制两个Bitmap,即2、3两步,透明度效果只在第3步设置
1625      */
1626     // 1.创建笔刷,设置笔刷是否为抗锯齿效果
1627     using namespace Drawing;
1628     Drawing::Brush brush;
1629     brush.SetAntiAlias(true); // 设置笔刷抗锯齿,true为AA(抗锯齿),false为非AA(不抗锯齿)
1630 
1631     // 2.创建Bitmap
1632     auto colorspace = Drawing::ColorSpace::CreateSRGBLinear();
1633     auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGBA_F16, ALPHATYPE_UNKNOWN, colorspace);
1634     Drawing::Bitmap bitmap;
1635     bitmap.SetFormat(bitmap.GetFormat());
1636     bitmap.ClearWithColor(0xFF789645); // 固定为不透明,灰绿色
1637 
1638     // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明
1639     Drawing::Bitmap bitmap1;
1640     bitmap1.SetFormat(bitmap.GetFormat());
1641     bitmap1.ClearWithColor(0xFF4567FA); // 不透明效果,粉蓝色
1642 
1643     // 4.组合transform函数
1644     playbackCanvas_->Scale(10100.0f, 1.0f);
1645 
1646     // 5.设置视效效果,将效果添加到笔刷
1647     Drawing::ColorMatrix matrix;
1648 
1649     matrix.SetArray(ARR);
1650     auto cf = Drawing::ColorFilter::CreateMatrixColorFilter(matrix);
1651     auto filter = Drawing::Filter();
1652     filter.SetImageFilter(Drawing::ImageFilter::CreateColorFilterImageFilter(*cf, nullptr));
1653     brush.SetFilter(filter);
1654 
1655     // 6.绘制结果
1656     playbackCanvas_->AttachBrush(brush);
1657     playbackCanvas_->DrawBitmap(bitmap, 200, 200); // 200,200 is bitmap position
1658     playbackCanvas_->DrawBitmap(bitmap1, 250, 300);
1659     playbackCanvas_->DetachBrush();
1660 
1661     // 7.组合Clip函数,cilp也有抗锯齿效果,默认和笔刷效果保持一致
1662     auto rect = Drawing::Rect(250, 250, 400, 400); // rect region (250, 250, 400, 400)
1663     auto rrect = Drawing::RoundRect(rect, 30.0f, 30.0f); // 30.0f is angle
1664     playbackCanvas_->Save();
1665     playbackCanvas_->ClipRoundRect(rrect, Drawing::ClipOp::DIFFERENCE, true);
1666     playbackCanvas_->Clear(Drawing::Color::COLOR_RED);
1667     playbackCanvas_->Restore();
1668 }
1669 
1670 // Bitmap_Scene_0479
1671 // Bitmap构造接口:Bitmap_Build_L1_60
1672 // Bitmap操作接口:ExtractSubset
1673 // cilp:ClipRoundRect(G2_capsule)
1674 // transform:Translate
1675 // 抗锯齿:非AA
1676 // 透明度:透明
1677 // 视效:CreateLinearToSrgbGamma
1678 DEF_DTK(Bitmap_Scene16, TestLevel::L2, 29)
1679 {
1680     /*
1681      *绘制流程说明:默认绘制两个Bitmap,即2、3两步,透明度效果只在第3步设置
1682      */
1683     // 1.创建笔刷,设置笔刷是否为抗锯齿效果
1684     using namespace Drawing;
1685     Drawing::Brush brush;
1686     brush.SetAntiAlias(false); // 设置笔刷抗锯齿,true为AA(抗锯齿),false为非AA(不抗锯齿)
1687 
1688     // 2.创建Bitmap
1689     auto colorspace = Drawing::ColorSpace::CreateSRGBLinear();
1690     auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGBA_F16, ALPHATYPE_UNKNOWN, colorspace);
1691     Drawing::Bitmap bitmap;
1692     bitmap.SetFormat(bitmap.GetFormat());
1693     bitmap.ClearWithColor(0xFF789645); // 固定为不透明,灰绿色
1694 
1695     // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明
1696     Drawing::Bitmap bitmap1;
1697     bitmap1.SetFormat(bitmap.GetFormat());
1698     bitmap1.ClearWithColor(0x004567FA); // 透明效果,粉蓝色
1699 
1700     if (bitmap1.ExtractSubset(bitmap, Rect(0, 1, 2, 2))) {
1701         playbackCanvas_->DrawBackground(0xFF675800);
1702     }
1703 
1704     // 4.组合transform函数
1705     playbackCanvas_->Translate(200, 200);
1706 
1707     // 5.设置视效效果,将效果添加到笔刷
1708     brush.SetColor(0xFF4F7091);
1709     auto filter = Drawing::Filter();
1710     filter.SetColorFilter(Drawing::ColorFilter::CreateLinearToSrgbGamma());
1711     brush.SetFilter(filter);
1712 
1713     // 6.绘制结果
1714     playbackCanvas_->AttachBrush(brush);
1715     playbackCanvas_->DrawBitmap(bitmap, 200, 200); // 200,200 is bitmap position
1716     playbackCanvas_->DrawBitmap(bitmap1, 250, 300);
1717     playbackCanvas_->DetachBrush();
1718 
1719     // 7.组合Clip函数,cilp也有抗锯齿效果,默认和笔刷效果保持一致
1720     auto rect = Drawing::Rect(250, 300, 400, 500); // rect region (250, 300, 400, 500)
1721     auto rrect = Drawing::RoundRect(rect, 50.0f, 50.0f); // 50.0f is angle
1722     playbackCanvas_->Save();
1723     playbackCanvas_->ClipRoundRect(rrect, Drawing::ClipOp::DIFFERENCE, false);
1724     playbackCanvas_->Clear(Drawing::Color::COLOR_RED);
1725     playbackCanvas_->Restore();
1726 }
1727 
1728 // Bitmap_Scene_0480
1729 // Bitmap构造接口:Bitmap_Build_L1_60
1730 // Bitmap操作接口:PeekPixels
1731 // cilp:ClipRoundRect(非G2)
1732 // transform:Shear
1733 // 抗锯齿:AA
1734 // 透明度:半透明
1735 // 视效:CreateSrgbGammaToLinear
1736 DEF_DTK(Bitmap_Scene16, TestLevel::L2, 30)
1737 {
1738     /*
1739      *绘制流程说明:默认绘制两个Bitmap,即2、3两步,透明度效果只在第3步设置
1740      */
1741     // 1.创建笔刷,设置笔刷是否为抗锯齿效果
1742     using namespace Drawing;
1743     Drawing::Brush brush;
1744     brush.SetAntiAlias(true); // 设置笔刷抗锯齿,true为AA(抗锯齿),false为非AA(不抗锯齿)
1745 
1746     // 2.创建Bitmap
1747     auto colorspace = Drawing::ColorSpace::CreateSRGBLinear();
1748     auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGBA_F16, ALPHATYPE_UNKNOWN, colorspace);
1749     Drawing::Bitmap bitmap;
1750     bitmap.SetFormat(bitmap.GetFormat());
1751     bitmap.ClearWithColor(0xFF789645); // 固定为不透明,灰绿色
1752 
1753     // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明
1754     Drawing::Bitmap bitmap1;
1755     bitmap1.SetFormat(bitmap.GetFormat());
1756     bitmap1.ClearWithColor(0x894567FA); // 半透明效果,粉蓝色
1757 
1758     Drawing::Pixmap pixmap;
1759     if (bitmap1.PeekPixels(pixmap)) {
1760         auto image = Image::MakeFromRaster(pixmap, nullptr, nullptr);
1761 
1762         // 4.组合transform函数
1763         playbackCanvas_->Shear(10.0f, 10.0f);
1764 
1765         // 5.设置视效效果,将效果添加到笔刷
1766         brush.SetColor(0xFF4F7091);
1767         auto filter = Drawing::Filter();
1768         filter.SetColorFilter(Drawing::ColorFilter::CreateSrgbGammaToLinear());
1769         brush.SetFilter(filter);
1770 
1771         // 6.绘制结果
1772         playbackCanvas_->AttachBrush(brush);
1773         playbackCanvas_->DrawBitmap(bitmap, 200, 200); // 200,200 is bitmap position
1774         playbackCanvas_->DrawImage(*image, 250, 300, SamplingOptions());
1775         playbackCanvas_->DetachBrush();
1776 
1777         // 7.组合Clip函数,cilp也有抗锯齿效果,默认和笔刷效果保持一致
1778         auto rect = Drawing::Rect(300, 300, 400, 400); // rect region (300, 300, 400, 400)
1779         auto rrect = Drawing::RoundRect(rect, 30.0f, 30.0f); // 30.0f is angle
1780         playbackCanvas_->Save();
1781         playbackCanvas_->ClipRoundRect(rrect, Drawing::ClipOp::DIFFERENCE, true);
1782         playbackCanvas_->Clear(Drawing::Color::COLOR_RED);
1783         playbackCanvas_->Restore();
1784     }
1785 }
1786 
1787 } // namespace Rosen
1788 } // namespace OHOS