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_Scene_0931 25 // Bitmap构造接口:Bitmap_TryAllocPixels_L1_54 26 // Bitmap操作接口:IsEmpty 27 // cilp:null 28 // transform:Rotate 29 // 抗锯齿:非AA 30 // 透明度:不透明 31 // 视效:CreateLumaColorFilter 32 DEF_DTK(Bitmap_Scene32, TestLevel::L2, 1) 33 { 34 // 1.创建笔刷,设置笔刷是否为抗锯齿效果 35 Drawing::Brush brush; 36 brush.SetAntiAlias(false); // 设置画刷抗锯齿 37 brush.SetColor(0xFF0000FF); 38 39 // 2.创建Bitmap 40 // Bitmap_TryAllocPixels_L1_54 41 auto colorspace = Drawing::ColorSpace::CreateSRGB(); 42 auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGB_888X, ALPHATYPE_UNPREMUL, colorspace); // 511 width & 844 height 43 Drawing::Bitmap bitmap; 44 bitmap.TryAllocPixels(imageInfo); 45 bitmap.ClearWithColor(0xFF789645); // 灰绿色 46 47 // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明 48 Drawing::Bitmap bitmap1; 49 bitmap1.Build(500, 500, bitmap.GetFormat()); // 500 width & Height 50 bitmap1.ClearWithColor(0xFF4567FA); // 不透明粉蓝色 51 52 // IsEmpty,创建Bitmap1的方式和Bitmap保持一致, 此处不展示 53 if (bitmap1.IsEmpty()) { 54 playbackCanvas_->DrawBackground(0xFF675800); // 深棕榈 55 } 56 57 // 4.组合transform函数 58 // Rotate 59 playbackCanvas_->Rotate(30, 10, 10); // 30 angle 10 position 60 61 // 5.设置视效效果,将效果添加到笔刷 62 // CreateLumaColorFilter 63 auto filter = Drawing::Filter(); 64 filter.SetColorFilter(Drawing::ColorFilter::CreateLumaColorFilter()); 65 brush.SetFilter(filter); 66 67 // 6.绘制结果 68 playbackCanvas_->AttachBrush(brush); 69 playbackCanvas_->DrawBitmap(bitmap, 200, 200); // 200,200 is bitmap position 70 playbackCanvas_->DrawBitmap(bitmap1, 250, 300); 71 playbackCanvas_->DetachBrush(); 72 } 73 74 // Bitmap_Scene_0932 75 // Bitmap构造接口:Bitmap_TryAllocPixels_L1_54 76 // Bitmap操作接口:IsValid 77 // cilp:ClipPath 78 // transform:Scale(正常值) 79 // 抗锯齿:AA 80 // 透明度:透明 81 // 视效:CreateBlendImageFilter 82 DEF_DTK(Bitmap_Scene32, TestLevel::L2, 2) 83 { 84 // 1.创建笔刷,设置笔刷是否为抗锯齿效果 85 Drawing::Brush brush; 86 brush.SetAntiAlias(true); // 设置画刷抗锯齿 87 brush.SetColor(0x4CB21933); 88 89 // 2.创建Bitmap 90 // Bitmap_TryAllocPixels_L1_54 91 auto colorspace = Drawing::ColorSpace::CreateSRGB(); 92 auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGB_888X, ALPHATYPE_UNPREMUL, colorspace); // 511 width & 844 height 93 Drawing::Bitmap bitmap; 94 bitmap.TryAllocPixels(imageInfo); 95 bitmap.ClearWithColor(0xFF789645); // 灰绿色 96 97 // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明 98 Drawing::Bitmap bitmap1; 99 bitmap1.Build(500, 500, bitmap.GetFormat()); // 500 width & Height 100 bitmap1.ClearWithColor(0x004567FA); // 透明粉蓝色 101 102 // IsValid,创建Bitmap1的方式和Bitmap保持一致, 此处不展示 103 if (bitmap1.IsValid()) { 104 playbackCanvas_->DrawBackground(0xFF675800); // 深棕榈 105 } 106 107 // 4.组合transform函数 108 // Scale(正常值) 109 playbackCanvas_->Scale(2.0f, 2.0f); // ratio 110 111 // 5.设置视效效果,将效果添加到笔刷 112 // CreateBlendImageFilter 113 for (auto blendMode : blendModes) { 114 auto background = Drawing::ImageFilter::CreateBlurImageFilter( 115 1.0f, 1.0f, Drawing::TileMode::REPEAT, nullptr, Drawing::ImageBlurType::GAUSS); 116 auto foreground = Drawing::ImageFilter::CreateBlurImageFilter( 117 1.0f, 1.0f, Drawing::TileMode::REPEAT, nullptr, Drawing::ImageBlurType::GAUSS); 118 auto filter = Drawing::Filter(); 119 filter.SetImageFilter(Drawing::ImageFilter::CreateBlendImageFilter(blendMode, background, foreground)); 120 brush.SetFilter(filter); 121 122 // 6.绘制结果 123 playbackCanvas_->AttachBrush(brush); 124 playbackCanvas_->DrawBitmap(bitmap, 200, 200); // 200,200 is bitmap position 125 playbackCanvas_->DrawBitmap(bitmap1, 250, 300); // 250,300 is bitmap1 position 126 } 127 playbackCanvas_->DetachBrush(); 128 129 // 7.组合Clip函数,cilp也有抗锯齿效果,默认和笔刷效果保持一致 130 // ClipPath 131 Drawing::Path path; 132 path.AddRect({ 200, 300, 700, 800 }); // rect region (200, 300, 700, 800) 133 path.SetFillStyle(Drawing::PathFillType::INVERSE_WINDING); 134 playbackCanvas_->Save(); 135 playbackCanvas_->ClipPath(path, Drawing::ClipOp::DIFFERENCE, true); 136 playbackCanvas_->Clear(Drawing::Color::COLOR_GREEN); 137 playbackCanvas_->Restore(); 138 } 139 140 // Bitmap_Scene_0933 141 // Bitmap构造接口:Bitmap_TryAllocPixels_L1_54 142 // Bitmap操作接口:GetColor 143 // cilp:ClipRect 144 // transform:Scale(极大值) 145 // 抗锯齿:非AA 146 // 透明度:半透明 147 // 视效:CreateBlendShader 148 DEF_DTK(Bitmap_Scene32, TestLevel::L2, 3) 149 { 150 // 1.创建笔刷,设置笔刷是否为抗锯齿效果 151 Drawing::Brush brush; 152 brush.SetAntiAlias(false); // 设置画刷抗锯齿 153 brush.SetColor(0xFFFF0000); 154 155 // 2.创建Bitmap 156 // Bitmap_TryAllocPixels_L1_54 157 auto colorspace = Drawing::ColorSpace::CreateSRGB(); 158 auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGB_888X, ALPHATYPE_UNPREMUL, colorspace); // 511 width & 844 height 159 Drawing::Bitmap bitmap; 160 bitmap.TryAllocPixels(imageInfo); 161 bitmap.ClearWithColor(0xFF789645); // 灰绿色 162 163 // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明 164 Drawing::Bitmap bitmap1; 165 bitmap1.Build(500, 500, bitmap.GetFormat()); // 500 width & Height 166 bitmap1.ClearWithColor(0x894567FA); // 半透明粉蓝色 167 168 // GetColor,创建Bitmap1的方式和Bitmap保持一致, 此处不展示 169 bitmap1.ClearWithColor(bitmap.GetColor(1, 1)); // 1 is color position 170 171 // 4.组合transform函数 172 // Scale(极大值) 173 playbackCanvas_->Scale(1.0f, 10100.0f); // ratio 174 175 // 5.设置视效效果,将效果添加到笔刷 176 // CreateBlendShader 177 auto dst = Drawing::ShaderEffect::CreateColorShader(Drawing::Color::COLOR_RED); 178 auto src = Drawing::ShaderEffect::CreateColorShader(Drawing::Color::COLOR_GREEN); 179 for (auto blendMode : blendModes) { 180 auto blendShader = Drawing::ShaderEffect::CreateBlendShader(*dst, *src, blendMode); 181 brush.SetShaderEffect(blendShader); 182 // 6.绘制结果 183 playbackCanvas_->AttachBrush(brush); 184 playbackCanvas_->DrawBitmap(bitmap, 200, 200); // 200,200 is bitmap position 185 playbackCanvas_->DrawBitmap(bitmap1, 250, 300); // 250,300 is bitmap1 position 186 } 187 playbackCanvas_->DetachBrush(); 188 189 // 7.组合Clip函数,cilp也有抗锯齿效果,默认和笔刷效果保持一致 190 // ClipRect 191 auto rect = Drawing::Rect(250, 300, 500, 500); // rect region (250, 300, 500, 500) 192 playbackCanvas_->Save(); 193 playbackCanvas_->ClipRect(rect, Drawing::ClipOp::DIFFERENCE, false); 194 playbackCanvas_->Clear(Drawing::Color::COLOR_RED); 195 playbackCanvas_->Restore(); 196 } 197 198 // Bitmap_Scene_0934 199 // Bitmap构造接口:Bitmap_TryAllocPixels_L1_54 200 // Bitmap操作接口:SetFormat/GetFormat 201 // cilp:ClipRoundRect(G2) 202 // transform:Scale(极小值) 203 // 抗锯齿:AA 204 // 透明度:不透明 205 // 视效:CreateBlurMaskFilter 206 DEF_DTK(Bitmap_Scene32, TestLevel::L2, 4) 207 { 208 // 1.创建笔刷,设置笔刷是否为抗锯齿效果 209 Drawing::Brush brush; 210 brush.SetAntiAlias(true); // 设置画刷抗锯齿 211 brush.SetColor(0xFFFF0000); 212 213 // 2.创建Bitmap 214 // Bitmap_TryAllocPixels_L1_54 215 auto colorspace = Drawing::ColorSpace::CreateSRGB(); 216 auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGB_888X, ALPHATYPE_UNPREMUL, colorspace); // 511 width & 844 height 217 Drawing::Bitmap bitmap; 218 bitmap.TryAllocPixels(imageInfo); 219 bitmap.ClearWithColor(0xFF789645); // 灰绿色 220 221 // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明 222 // SetFormat/GetFormat, 固定bitmap1创建方式 223 Drawing::Bitmap bitmap1 = BuildRandomBitmap(); 224 bitmap1.SetFormat(bitmap.GetFormat()); 225 bitmap1.ClearWithColor(0xFF4567FA); // 不透明粉蓝色 226 227 // 4.组合transform函数 228 // Scale(极小值) 229 playbackCanvas_->Scale(10100.0f, 1.0f); // ratio 230 231 // 5.设置视效效果,将效果添加到笔刷 232 // CreateBlurMaskFilter 233 std::vector<Drawing::BlurType> blurTypes = { Drawing::BlurType::NORMAL, Drawing::BlurType::SOLID, 234 Drawing::BlurType::OUTER, Drawing::BlurType::INNER }; 235 for (auto& blurType : blurTypes) { 236 auto filter = Drawing::Filter(); 237 filter.SetMaskFilter(Drawing::MaskFilter::CreateBlurMaskFilter(blurType, 10.0f, true)); 238 brush.SetFilter(filter); 239 240 // 6.绘制结果 241 playbackCanvas_->AttachBrush(brush); 242 playbackCanvas_->DrawBitmap(bitmap, 200, 200); // 200,200 is bitmap position 243 playbackCanvas_->DrawBitmap(bitmap1, 250, 300); // 250,300 is bitmap1 position 244 } 245 playbackCanvas_->DetachBrush(); 246 247 // 7.组合Clip函数,cilp也有抗锯齿效果,默认和笔刷效果保持一致 248 // ClipRoundRect(G2)) 249 auto rect = Drawing::Rect(250, 250, 400, 400); // rect region (250, 250, 400, 400) 250 auto rrect = Drawing::RoundRect(rect, 30.0f, 30.0f); // 30.0f is angle 251 playbackCanvas_->Save(); 252 playbackCanvas_->ClipRoundRect(rrect, Drawing::ClipOp::DIFFERENCE, true); 253 playbackCanvas_->Clear(Drawing::Color::COLOR_RED); 254 playbackCanvas_->Restore(); 255 } 256 257 // Bitmap_Scene_0935 258 // Bitmap构造接口:Bitmap_TryAllocPixels_L1_54 259 // Bitmap操作接口:GetPixmap 260 // cilp:ClipRoundRect(G2_capsule) 261 // transform:Translate 262 // 抗锯齿:非AA 263 // 透明度:透明 264 // 视效:CreateSrgbGammaToLinear 265 DEF_DTK(Bitmap_Scene32, TestLevel::L2, 5) 266 { 267 // 1.创建笔刷,设置笔刷是否为抗锯齿效果 268 Drawing::Brush brush; 269 brush.SetAntiAlias(false); // 设置画刷抗锯齿 270 brush.SetColor(0xFF4F7091); 271 272 // 2.创建Bitmap 273 // Bitmap_TryAllocPixels_L1_54 274 auto colorspace = Drawing::ColorSpace::CreateSRGB(); 275 auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGB_888X, ALPHATYPE_UNPREMUL, colorspace); // 511 width & 844 height 276 Drawing::Bitmap bitmap; 277 bitmap.TryAllocPixels(imageInfo); 278 bitmap.ClearWithColor(0xFF789645); // 灰绿色 279 280 // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明 281 Drawing::Bitmap bitmap1; 282 bitmap1.Build(500, 500, bitmap.GetFormat()); // 500 width & Height 283 bitmap1.ClearWithColor(0x004567FA); // 透明粉蓝色 284 285 // GetPixmap,创建Bitmap1的方式和Bitmap保持一致, 但最后绘制为image 286 auto image1 = Drawing::Image::MakeFromRaster(bitmap1.GetPixmap(), nullptr, nullptr); 287 288 // 4.组合transform函数 289 // Translate 290 playbackCanvas_->Translate(200, 200); // 200 distance 291 292 // 5.设置视效效果,将效果添加到笔刷 293 // CreateSrgbGammaToLinear 294 auto filter = Drawing::Filter(); 295 filter.SetColorFilter(Drawing::ColorFilter::CreateSrgbGammaToLinear()); 296 brush.SetFilter(filter); 297 298 // 6.绘制结果 299 playbackCanvas_->AttachBrush(brush); 300 playbackCanvas_->DrawBitmap(bitmap, 200, 200); // 200,200 is bitmap position 301 playbackCanvas_->DrawImage(*image1, 250, 300, SamplingOptions()); 302 playbackCanvas_->DetachBrush(); 303 304 // 7.组合Clip函数,cilp也有抗锯齿效果,默认和笔刷效果保持一致 305 // ClipRoundRect(G2_capsule)) 306 auto rect = Drawing::Rect(250, 300, 400, 500); // rect region (250, 300, 400, 500) 307 auto rrect = Drawing::RoundRect(rect, 50.0f, 50.0f); // 50.0f is angle 308 playbackCanvas_->Save(); 309 playbackCanvas_->ClipRoundRect(rrect, Drawing::ClipOp::DIFFERENCE, false); 310 playbackCanvas_->Clear(Drawing::Color::COLOR_RED); 311 playbackCanvas_->Restore(); 312 } 313 314 // Bitmap_Scene_0936 315 // Bitmap构造接口:Bitmap_TryAllocPixels_L1_54 316 // Bitmap操作接口:MakeImage 317 // cilp:ClipRoundRect(非G2) 318 // transform:Shear 319 // 抗锯齿:AA 320 // 透明度:半透明 321 // 视效:CreateLumaColorFilter 322 DEF_DTK(Bitmap_Scene32, TestLevel::L2, 6) 323 { 324 // 1.创建笔刷,设置笔刷是否为抗锯齿效果 325 Drawing::Brush brush; 326 brush.SetAntiAlias(true); // 设置画刷抗锯齿 327 brush.SetColor(0xFF0000FF); 328 329 // 2.创建Bitmap 330 // Bitmap_TryAllocPixels_L1_54 331 auto colorspace = Drawing::ColorSpace::CreateSRGB(); 332 auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGB_888X, ALPHATYPE_UNPREMUL, colorspace); // 511 width & 844 height 333 Drawing::Bitmap bitmap; 334 bitmap.TryAllocPixels(imageInfo); 335 bitmap.ClearWithColor(0xFF789645); // 灰绿色 336 337 // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明 338 Drawing::Bitmap bitmap1; 339 bitmap1.Build(500, 500, bitmap.GetFormat()); // 500 width & Height 340 bitmap1.ClearWithColor(0x894567FA); // 半透明粉蓝色 341 342 // MakeImage,创建Bitmap1的方式和Bitmap保持一致, 但最后绘制为image 343 std::shared_ptr<Image> image = bitmap1.MakeImage(); 344 345 // 4.组合transform函数 346 // Shear 347 playbackCanvas_->Shear(10.0f, 10.0f); // slope 348 349 // 5.设置视效效果,将效果添加到笔刷 350 // CreateLumaColorFilter 351 auto filter = Drawing::Filter(); 352 filter.SetColorFilter(Drawing::ColorFilter::CreateLumaColorFilter()); 353 brush.SetFilter(filter); 354 355 // 6.绘制结果 356 playbackCanvas_->AttachBrush(brush); 357 playbackCanvas_->DrawBitmap(bitmap, 200, 200); // 200,200 is bitmap position 358 playbackCanvas_->DrawImage(*image, 250, 300, SamplingOptions()); 359 playbackCanvas_->DetachBrush(); 360 361 // 7.组合Clip函数,cilp也有抗锯齿效果,默认和笔刷效果保持一致 362 // ClipRoundRect(非G2)) 363 auto rect = Drawing::Rect(300, 300, 400, 400); // rect region (300, 300, 400, 400) 364 auto rrect = Drawing::RoundRect(rect, 30.0f, 30.0f); // 30.0f is angle 365 playbackCanvas_->Save(); 366 playbackCanvas_->ClipRoundRect(rrect, Drawing::ClipOp::DIFFERENCE, true); 367 playbackCanvas_->Clear(Drawing::Color::COLOR_RED); 368 playbackCanvas_->Restore(); 369 } 370 371 // Bitmap_Scene_0937 372 // Bitmap构造接口:Bitmap_TryAllocPixels_L1_54 373 // Bitmap操作接口:SetImmutable/IsImmutable 374 // cilp:null 375 // transform:null 376 // 抗锯齿:非AA 377 // 透明度:不透明 378 // 视效:CreateBlendImageFilter 379 DEF_DTK(Bitmap_Scene32, TestLevel::L2, 7) 380 { 381 // 1.创建笔刷,设置笔刷是否为抗锯齿效果 382 Drawing::Brush brush; 383 brush.SetAntiAlias(false); // 设置画刷抗锯齿 384 385 // 2.创建Bitmap 386 // Bitmap_TryAllocPixels_L1_54 387 auto colorspace = Drawing::ColorSpace::CreateSRGB(); 388 auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGB_888X, ALPHATYPE_UNPREMUL, colorspace); // 511 width & 844 height 389 Drawing::Bitmap bitmap; 390 bitmap.TryAllocPixels(imageInfo); 391 bitmap.ClearWithColor(0xFF789645); // 灰绿色 392 393 // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明 394 Drawing::Bitmap bitmap1; 395 bitmap1.Build(500, 500, bitmap.GetFormat()); // 500 width & Height 396 bitmap1.ClearWithColor(0xFF4567FA); // 不透明粉蓝色 397 398 // SetImmutable/IsImmutable,创建Bitmap1的方式和Bitmap保持一致, 此处不展示 399 bitmap1.SetImmutable(); 400 if (bitmap1.IsImmutable()) { 401 playbackCanvas_->DrawBackground(0xFF675800); // 深棕榈 402 } 403 404 // 5.设置视效效果,将效果添加到笔刷 405 // CreateBlendImageFilter 406 for (auto blendMode : blendModes) { 407 auto background = Drawing::ImageFilter::CreateBlurImageFilter( 408 1.0f, 1.0f, Drawing::TileMode::REPEAT, nullptr, Drawing::ImageBlurType::GAUSS); 409 auto foreground = Drawing::ImageFilter::CreateBlurImageFilter( 410 1.0f, 1.0f, Drawing::TileMode::REPEAT, nullptr, Drawing::ImageBlurType::GAUSS); 411 auto filter = Drawing::Filter(); 412 filter.SetImageFilter(Drawing::ImageFilter::CreateBlendImageFilter(blendMode, background, foreground)); 413 brush.SetFilter(filter); 414 415 // 6.绘制结果 416 playbackCanvas_->AttachBrush(brush); 417 playbackCanvas_->DrawBitmap(bitmap, 200, 200); // 200,200 is bitmap position 418 playbackCanvas_->DrawBitmap(bitmap1, 250, 300); // 250,300 is bitmap1 position 419 } 420 playbackCanvas_->DetachBrush(); 421 422 // 6.绘制结果 423 playbackCanvas_->AttachBrush(brush); 424 playbackCanvas_->DrawBitmap(bitmap, 200, 200); // 200,200 is bitmap position 425 playbackCanvas_->DrawBitmap(bitmap1, 250, 300); 426 playbackCanvas_->DetachBrush(); 427 } 428 429 // Bitmap_Scene_0938 430 // Bitmap构造接口:Bitmap_TryAllocPixels_L1_54 431 // Bitmap操作接口:ClearWithColor 432 // cilp:ClipPath 433 // transform:ConcatMatrix 434 // 抗锯齿:AA 435 // 透明度:透明 436 // 视效:CreateBlendShader 437 DEF_DTK(Bitmap_Scene32, TestLevel::L2, 8) 438 { 439 // 1.创建笔刷,设置笔刷是否为抗锯齿效果 440 Drawing::Brush brush; 441 brush.SetAntiAlias(true); // 设置画刷抗锯齿 442 brush.SetColor(0xFFFF0000); 443 444 // 2.创建Bitmap 445 // Bitmap_TryAllocPixels_L1_54 446 auto colorspace = Drawing::ColorSpace::CreateSRGB(); 447 auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGB_888X, ALPHATYPE_UNPREMUL, colorspace); // 511 width & 844 height 448 Drawing::Bitmap bitmap; 449 bitmap.TryAllocPixels(imageInfo); 450 bitmap.ClearWithColor(0xFF789645); // 灰绿色 451 452 // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明 453 Drawing::Bitmap bitmap1; 454 bitmap1.Build(500, 500, bitmap.GetFormat()); // 500 width & Height 455 456 // ClearWithColor,创建Bitmap1的方式和Bitmap保持一致, 此处不展示 457 bitmap1.ClearWithColor(0x004567FA); // 透明粉蓝色 458 459 // 4.组合transform函数 460 // ConcatMatrix 461 Drawing::Matrix matrix; 462 matrix.Rotate(15, 10, 10); // 15 angle 10 position 463 playbackCanvas_->ConcatMatrix(matrix); 464 465 // 5.设置视效效果,将效果添加到笔刷 466 // CreateBlendShader 467 auto dst = Drawing::ShaderEffect::CreateColorShader(Drawing::Color::COLOR_RED); 468 auto src = Drawing::ShaderEffect::CreateColorShader(Drawing::Color::COLOR_GREEN); 469 for (auto blendMode : blendModes) { 470 auto blendShader = Drawing::ShaderEffect::CreateBlendShader(*dst, *src, blendMode); 471 brush.SetShaderEffect(blendShader); 472 // 6.绘制结果 473 playbackCanvas_->AttachBrush(brush); 474 playbackCanvas_->DrawBitmap(bitmap, 200, 200); // 200,200 is bitmap position 475 playbackCanvas_->DrawBitmap(bitmap1, 250, 300); // 250,300 is bitmap1 position 476 } 477 playbackCanvas_->DetachBrush(); 478 479 // 7.组合Clip函数,cilp也有抗锯齿效果,默认和笔刷效果保持一致 480 // ClipPath 481 Drawing::Path path; 482 path.AddRect({ 200, 300, 700, 800 }); // rect region (200, 300, 700, 800) 483 path.SetFillStyle(Drawing::PathFillType::INVERSE_WINDING); 484 playbackCanvas_->Save(); 485 playbackCanvas_->ClipPath(path, Drawing::ClipOp::DIFFERENCE, true); 486 playbackCanvas_->Clear(Drawing::Color::COLOR_GREEN); 487 playbackCanvas_->Restore(); 488 } 489 490 // Bitmap_Scene_0939 491 // Bitmap构造接口:Bitmap_TryAllocPixels_L1_54 492 // Bitmap操作接口:ExtractSubset 493 // cilp:ClipRect 494 // transform:Rotate 495 // 抗锯齿:非AA 496 // 透明度:半透明 497 // 视效:CreateBlurMaskFilter 498 DEF_DTK(Bitmap_Scene32, TestLevel::L2, 9) 499 { 500 // 1.创建笔刷,设置笔刷是否为抗锯齿效果 501 Drawing::Brush brush; 502 brush.SetAntiAlias(false); // 设置画刷抗锯齿 503 brush.SetColor(0xFFFF0000); 504 505 // 2.创建Bitmap 506 // Bitmap_TryAllocPixels_L1_54 507 auto colorspace = Drawing::ColorSpace::CreateSRGB(); 508 auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGB_888X, ALPHATYPE_UNPREMUL, colorspace); // 511 width & 844 height 509 Drawing::Bitmap bitmap; 510 bitmap.TryAllocPixels(imageInfo); 511 bitmap.ClearWithColor(0xFF789645); // 灰绿色 512 513 // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明 514 Drawing::Bitmap bitmap1; 515 bitmap1.Build(500, 500, bitmap.GetFormat()); // 500 width & Height 516 bitmap1.ClearWithColor(0x894567FA); // 半透明粉蓝色 517 518 // ExtractSubset,创建Bitmap1的方式和Bitmap保持一致, 此处不展示 519 if (bitmap1.ExtractSubset(bitmap, Rect(0, 1, 2, 2))) { 520 playbackCanvas_->DrawBackground(0xFF675800); // 深棕榈 521 } 522 523 // 4.组合transform函数 524 // Rotate 525 playbackCanvas_->Rotate(30, 10, 10); // 30 angle 10 position 526 527 // 5.设置视效效果,将效果添加到笔刷 528 // CreateBlurMaskFilter 529 std::vector<Drawing::BlurType> blurTypes = { Drawing::BlurType::NORMAL, Drawing::BlurType::SOLID, 530 Drawing::BlurType::OUTER, Drawing::BlurType::INNER }; 531 for (auto& blurType : blurTypes) { 532 auto filter = Drawing::Filter(); 533 filter.SetMaskFilter(Drawing::MaskFilter::CreateBlurMaskFilter(blurType, 10.0f, true)); 534 brush.SetFilter(filter); 535 536 // 6.绘制结果 537 playbackCanvas_->AttachBrush(brush); 538 playbackCanvas_->DrawBitmap(bitmap, 200, 200); // 200,200 is bitmap position 539 playbackCanvas_->DrawBitmap(bitmap1, 250, 300); // 250,300 is bitmap1 position 540 } 541 playbackCanvas_->DetachBrush(); 542 543 // 7.组合Clip函数,cilp也有抗锯齿效果,默认和笔刷效果保持一致 544 // ClipRect 545 auto rect = Drawing::Rect(250, 300, 500, 500); // rect region (250, 300, 500, 500) 546 playbackCanvas_->Save(); 547 playbackCanvas_->ClipRect(rect, Drawing::ClipOp::DIFFERENCE, false); 548 playbackCanvas_->Clear(Drawing::Color::COLOR_RED); 549 playbackCanvas_->Restore(); 550 } 551 552 // Bitmap_Scene_0940 553 // Bitmap构造接口:Bitmap_TryAllocPixels_L1_54 554 // Bitmap操作接口:PeekPixels 555 // cilp:ClipRoundRect(G2) 556 // transform:Scale(正常值) 557 // 抗锯齿:AA 558 // 透明度:不透明 559 // 视效:null 560 DEF_DTK(Bitmap_Scene32, TestLevel::L2, 10) 561 { 562 // 1.创建笔刷,设置笔刷是否为抗锯齿效果 563 Drawing::Brush brush; 564 brush.SetAntiAlias(true); // 设置画刷抗锯齿 565 566 // 2.创建Bitmap 567 // Bitmap_TryAllocPixels_L1_54 568 auto colorspace = Drawing::ColorSpace::CreateSRGB(); 569 auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGB_888X, ALPHATYPE_UNPREMUL, colorspace); // 511 width & 844 height 570 Drawing::Bitmap bitmap; 571 bitmap.TryAllocPixels(imageInfo); 572 bitmap.ClearWithColor(0xFF789645); // 灰绿色 573 574 // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明 575 Drawing::Bitmap bitmap1; 576 bitmap1.Build(500, 500, bitmap.GetFormat()); // 500 width & Height 577 bitmap1.ClearWithColor(0xFF4567FA); // 不透明粉蓝色 578 579 // PeekPixels,最终绘制为Image,创建Bitmap1的方式和Bitmap保持一致, 此处不展示 580 Drawing::Pixmap pixmap; 581 if (bitmap1.PeekPixels(pixmap)) { 582 auto image = Image::MakeFromRaster(pixmap, nullptr, nullptr); 583 584 // 4.组合transform函数 585 // Scale(正常值) 586 playbackCanvas_->Scale(2.0f, 2.0f); // ratio 587 588 // 6.绘制结果 589 playbackCanvas_->AttachBrush(brush); 590 playbackCanvas_->DrawBitmap(bitmap, 200, 200); // 200,200 is bitmap position 591 playbackCanvas_->DrawImage(*image, 250, 300, SamplingOptions()); 592 playbackCanvas_->DetachBrush(); 593 594 // 7.组合Clip函数,cilp也有抗锯齿效果,默认和笔刷效果保持一致 595 // ClipRoundRect(G2)) 596 auto rect = Drawing::Rect(250, 250, 400, 400); // rect region (250, 250, 400, 400) 597 auto rrect = Drawing::RoundRect(rect, 30.0f, 30.0f); // 30.0f is angle 598 playbackCanvas_->Save(); 599 playbackCanvas_->ClipRoundRect(rrect, Drawing::ClipOp::DIFFERENCE, true); 600 playbackCanvas_->Clear(Drawing::Color::COLOR_RED); 601 playbackCanvas_->Restore(); 602 } 603 } 604 605 // Bitmap_Scene_0941 606 // Bitmap构造接口:Bitmap_TryAllocPixels_L1_54 607 // Bitmap操作接口:ReadPixels 608 // cilp:ClipRoundRect(G2_capsule) 609 // transform:Scale(极大值) 610 // 抗锯齿:非AA 611 // 透明度:透明 612 // 视效:CreateLinearGradient 613 DEF_DTK(Bitmap_Scene94, TestLevel::L2, 11) 614 { 615 /* 616 *绘制流程说明:默认绘制两个Bitmap,即2、3两步,透明度效果只在第3步设置 617 */ 618 // 1.创建笔刷,设置笔刷是否为抗锯齿效果 619 using namespace Drawing; 620 Drawing::Brush brush; 621 brush.SetAntiAlias(false); // 设置笔刷抗锯齿,true为AA(抗锯齿),false为非AA(不抗锯齿) 622 623 // 2.创建Bitmap 624 auto colorspace = Drawing::ColorSpace::CreateSRGB(); 625 auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGB_888X, ALPHATYPE_UNPREMUL, colorspace); // 511 width & 844 height 626 Drawing::Bitmap bitmap; 627 bitmap.TryAllocPixels(imageInfo); 628 bitmap.ClearWithColor(0xFF789645); // 灰绿色 629 630 // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明 631 Drawing::Bitmap bitmap1; 632 bitmap1.TryAllocPixels(imageInfo); 633 bitmap1.ClearWithColor(0x004567FA); // 透明效果,粉蓝色 634 auto imageInfo1 = Drawing::ImageInfo(500, 500, Drawing::ColorType::COLORTYPE_UNKNOWN, Drawing::ALPHATYPE_UNKNOWN); 635 bitmap1.ReadPixels(imageInfo, bitmap.GetPixels(), bitmap.GetRowBytes(), 50, 50); // (50, 50) is position 636 637 // 4.组合transform函数 638 playbackCanvas_->Scale(1.0f, 10100.0f); // ratio 639 640 // 5.设置视效效果,将效果添加到笔刷 641 std::vector<Drawing::ColorQuad> colors = { Drawing::Color::COLOR_RED, Drawing::Color::COLOR_GREEN, 642 Drawing::Color::COLOR_BLUE }; 643 std::vector<Drawing::scalar> pos = { 0.00f, 0.50f, 1.00f }; 644 auto linearGradient = 645 Drawing::ShaderEffect::CreateLinearGradient({ 0, 0 }, { 1000, 1000 }, colors, pos, Drawing::TileMode::CLAMP); 646 brush.SetShaderEffect(linearGradient); 647 648 // 6.绘制结果 649 playbackCanvas_->AttachBrush(brush); 650 playbackCanvas_->DrawBitmap(bitmap, 200, 200); // 200,200 is bitmap position 651 playbackCanvas_->DrawBitmap(bitmap1, 250, 300); // 250,300 is bitmap position 652 playbackCanvas_->DetachBrush(); 653 654 // 7.组合Clip函数,cilp也有抗锯齿效果,默认和笔刷效果保持一致 655 auto rect = Drawing::Rect(250, 300, 400, 500); // rect region (250, 300, 400, 500) 656 auto rrect = Drawing::RoundRect(rect, 50.0f, 50.0f); // 50.0f is angle 657 playbackCanvas_->Save(); 658 playbackCanvas_->ClipRoundRect(rrect, Drawing::ClipOp::DIFFERENCE, false); 659 playbackCanvas_->Clear(Drawing::Color::COLOR_RED); 660 playbackCanvas_->Restore(); 661 } 662 663 // Bitmap_Scene_0942 664 // Bitmap构造接口:Bitmap_TryAllocPixels_L1_54 665 // Bitmap操作接口:CopyPixels 666 // cilp:ClipRoundRect(非G2) 667 // transform:Scale(极小值) 668 // 抗锯齿:AA 669 // 透明度:半透明 670 // 视效:CreateColorShader 671 DEF_DTK(Bitmap_Scene94, TestLevel::L2, 12) 672 { 673 /* 674 *绘制流程说明:默认绘制两个Bitmap,即2、3两步,透明度效果只在第3步设置 675 */ 676 // 1.创建笔刷,设置笔刷是否为抗锯齿效果 677 using namespace Drawing; 678 Drawing::Brush brush; 679 brush.SetAntiAlias(true); // 设置笔刷抗锯齿,true为AA(抗锯齿),false为非AA(不抗锯齿) 680 681 // 2.创建Bitmap 682 auto colorspace = Drawing::ColorSpace::CreateSRGB(); 683 auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGB_888X, ALPHATYPE_UNPREMUL, colorspace); // 511 width & 844 height 684 Drawing::Bitmap bitmap; 685 bitmap.TryAllocPixels(imageInfo); 686 bitmap.ClearWithColor(0xFF789645); // 灰绿色 687 688 // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明 689 Drawing::Bitmap bitmap1; 690 bitmap1.TryAllocPixels(imageInfo); 691 bitmap1.ClearWithColor(0x894567FA); // 半透明效果,粉蓝色 692 bitmap1.CopyPixels(bitmap, 50, 50); // 50 width & Height 693 694 // 4.组合transform函数 695 playbackCanvas_->Scale(10100.0f, 1.0f); // ratio 696 697 // 5.设置视效效果,将效果添加到笔刷 698 brush.SetColor(0xFFFF0000); 699 auto colorShader = Drawing::ShaderEffect::CreateColorShader(Drawing::Color::COLOR_RED); 700 brush.SetShaderEffect(colorShader); 701 702 // 6.绘制结果 703 playbackCanvas_->AttachBrush(brush); 704 playbackCanvas_->DrawBitmap(bitmap, 200, 200); // 200,200 is bitmap position 705 playbackCanvas_->DrawBitmap(bitmap1, 250, 300); // 250,300 is bitmap position 706 playbackCanvas_->DetachBrush(); 707 708 // 7.组合Clip函数,cilp也有抗锯齿效果,默认和笔刷效果保持一致 709 auto rect = Drawing::Rect(300, 300, 400, 400); // rect region (300, 300, 400, 400) 710 auto rrect = Drawing::RoundRect(rect, 30.0f, 30.0f); // 30.0f is angle 711 playbackCanvas_->Save(); 712 playbackCanvas_->ClipRoundRect(rrect, Drawing::ClipOp::DIFFERENCE, true); 713 playbackCanvas_->Clear(Drawing::Color::COLOR_RED); 714 playbackCanvas_->Restore(); 715 } 716 717 // Bitmap_Scene_0943 718 // Bitmap构造接口:Bitmap_TryAllocPixels_L1_54 719 // Bitmap操作接口:InstallPixels 720 // cilp:null 721 // transform:Translate 722 // 抗锯齿:非AA 723 // 透明度:不透明 724 // 视效:CreateBlurImageFilter 725 DEF_DTK(Bitmap_Scene94, TestLevel::L2, 13) 726 { 727 /* 728 *绘制流程说明:默认绘制两个Bitmap,即2、3两步,透明度效果只在第3步设置 729 */ 730 // 1.创建笔刷,设置笔刷是否为抗锯齿效果 731 using namespace Drawing; 732 Drawing::Brush brush; 733 brush.SetAntiAlias(false); // 设置笔刷抗锯齿,true为AA(抗锯齿),false为非AA(不抗锯齿) 734 735 // 2.创建Bitmap 736 auto colorspace = Drawing::ColorSpace::CreateSRGB(); 737 auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGB_888X, ALPHATYPE_UNPREMUL, colorspace); // 511 width & 844 height 738 Drawing::Bitmap bitmap; 739 bitmap.TryAllocPixels(imageInfo); 740 bitmap.ClearWithColor(0xFF789645); // 灰绿色 741 742 // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明 743 Drawing::Bitmap bitmap1; 744 bitmap1.TryAllocPixels(imageInfo); 745 bitmap1.ClearWithColor(0xFF4567FA); // 不透明效果,粉蓝色 746 auto imageInfo1 = Drawing::ImageInfo( 747 500, 500, Drawing::ColorType::COLORTYPE_UNKNOWN, Drawing::ALPHATYPE_UNKNOWN); // 500 width & 500 height 748 uint32_t pixels[][5] = { { 0xBFA12345, 0xCB9745D2, 0xD0ACB2F4, 0xD34A1234, 0xCDE7AB9F }, 749 { 0xD98289C1, 0xC56A2F1A, 0xF3A807CC, 0xBD31C9A2, 0xF05A5378 }, 750 { 0xCF19A7E4, 0xF29074BD, 0xC0C35F1A, 0xE73812A7, 0xD98E2B43 }, 751 { 0xB6F10D34, 0xD98289C1, 0xC9A4527A, 0xC03D15A2, 0xF4B2C380 }, 752 { 0xBF1D68A3, 0xE5A3D1C4, 0xCBF722ED, 0xD7A9BC64, 0xB4C5F219 } }; 753 if (bitmap1.InstallPixels(imageInfo, pixels, bitmap.GetRowBytes())) { 754 Drawing::Image image; 755 image.BuildFromBitmap(bitmap1); 756 757 // 4.组合transform函数 758 playbackCanvas_->Translate(200, 200); // 200 distance 759 760 // 5.设置视效效果,将效果添加到笔刷 761 brush.SetColor(0xFFFF0000); 762 auto filter = Drawing::Filter(); 763 filter.SetImageFilter(Drawing::ImageFilter::CreateBlurImageFilter( 764 10.0f, 10.0f, Drawing::TileMode::CLAMP, nullptr, Drawing::ImageBlurType::GAUSS)); 765 brush.SetFilter(filter); 766 767 // 6.绘制结果 768 playbackCanvas_->AttachBrush(brush); 769 playbackCanvas_->DrawBitmap(bitmap, 200, 200); // 200,200 is bitmap position 770 playbackCanvas_->DrawImage(image, 250, 300, SamplingOptions()); // 250,300 is bitmap position 771 playbackCanvas_->DetachBrush(); 772 } 773 } 774 775 // Bitmap_Scene_0944 776 // Bitmap构造接口:Bitmap_TryAllocPixels_L1_54 777 // Bitmap操作接口:Serialize/Deserialize 778 // cilp:ClipPath 779 // transform:Shear 780 // 抗锯齿:AA 781 // 透明度:透明 782 // 视效:CreateBlendModeColorFilter 783 DEF_DTK(Bitmap_Scene94, TestLevel::L2, 14) 784 { 785 /* 786 *绘制流程说明:默认绘制两个Bitmap,即2、3两步,透明度效果只在第3步设置 787 */ 788 // 1.创建笔刷,设置笔刷是否为抗锯齿效果 789 using namespace Drawing; 790 Drawing::Brush brush; 791 brush.SetAntiAlias(true); // 设置笔刷抗锯齿,true为AA(抗锯齿),false为非AA(不抗锯齿) 792 793 // 2.创建Bitmap 794 auto colorspace = Drawing::ColorSpace::CreateSRGB(); 795 auto imageInfo = ImageInfo(511, 844, COLORTYPE_RGB_888X, ALPHATYPE_UNPREMUL, colorspace); // 511 width & 844 height 796 Drawing::Bitmap bitmap; 797 bitmap.TryAllocPixels(imageInfo); 798 bitmap.ClearWithColor(0xFF789645); // 灰绿色 799 800 // 3.组合Bitmap操作函数,设置透明度, 由最后一步填充的颜色值的前两位控制,00为透明效果,89为半透明,FF为不透明 801 Drawing::Bitmap bitmap1; 802 bitmap1.TryAllocPixels(imageInfo); 803 bitmap1.ClearWithColor(0x004567FA); // 透明效果,粉蓝色 804 auto data = bitmap1.Serialize(); 805 if (bitmap1.Deserialize(data)) { 806 playbackCanvas_->DrawBackground(0xFF675800); // 深棕榈 807 } 808 809 // 4.组合transform函数 810 playbackCanvas_->Shear(10.0f, 10.0f); // slope 811 812 // 5.设置视效效果,将效果添加到笔刷 813 brush.SetColor(0xFFFF0000); 814 815 for (auto blendMode : blendModes) { 816 std::shared_ptr<Drawing::ColorFilter> colorFilter = 817 Drawing::ColorFilter::CreateBlendModeColorFilter(0xFFFF0000, blendMode); 818 auto filter = Drawing::Filter(); 819 filter.SetColorFilter(colorFilter); 820 brush.SetFilter(filter); 821 822 // 6.绘制结果 823 playbackCanvas_->AttachBrush(brush); 824 playbackCanvas_->DrawBitmap(bitmap, 200, 200); // 200,200 is bitmap position 825 playbackCanvas_->DrawBitmap(bitmap1, 250, 300); // 250,300 is bitmap position 826 } 827 playbackCanvas_->DetachBrush(); 828 829 // 7.组合Clip函数,cilp也有抗锯齿效果,默认和笔刷效果保持一致 830 Drawing::Path path; 831 path.AddRect({ 200, 300, 700, 800 }); // rect region (200, 300, 700, 800) 832 path.SetFillStyle(Drawing::PathFillType::INVERSE_WINDING); 833 playbackCanvas_->Save(); 834 playbackCanvas_->ClipPath(path, Drawing::ClipOp::DIFFERENCE, true); 835 playbackCanvas_->Clear(Drawing::Color::COLOR_GREEN); 836 playbackCanvas_->Restore(); 837 } 838 839 } // namespace Rosen 840 } // namespace OHOS 841