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