1169 {
1175
1177 ctx.canvas->restore();
1178 };
1180
1181
1182
1183
1184
1185
1186 ctx.canvas->DrawRect(
1188 DlPaint());
1189 ctx.canvas->Restore();
1190 };
1192
1193 ctx.canvas->restore();
1194 };
1196
1197 ctx.canvas->Restore();
1198 };
1201 CaseParameters(
1202 "With prior save/clip/restore",
1204 ctx.canvas->save();
1207 ctx.canvas->drawRect(rect, p2);
1209 ctx.canvas->drawRect(rect, p2);
1210 ctx.canvas->restore();
1211 },
1213 ctx.canvas->Save();
1214 ctx.canvas->ClipRect(
clip, ClipOp::kIntersect,
false);
1215 DlPaint p2;
1216 ctx.canvas->DrawRect(rect, p2);
1218 ctx.canvas->DrawRect(rect, p2);
1219 ctx.canvas->Restore();
1220 }));
1222 CaseParameters(
1223 "saveLayer no paint, no bounds",
1225 ctx.canvas->saveLayer(nullptr, nullptr);
1226 },
1228 ctx.canvas->SaveLayer(nullptr, nullptr);
1229 })
1230 .with_restore(sk_safe_restore, dl_safe_restore, false));
1232 CaseParameters(
1233 "saveLayer no paint, with bounds",
1235 ctx.canvas->saveLayer(layer_bounds, nullptr);
1236 },
1238 ctx.canvas->SaveLayer(&layer_bounds, nullptr);
1239 })
1240 .with_restore(sk_safe_restore, dl_safe_restore, true));
1242 CaseParameters(
1243 "saveLayer with alpha, no bounds",
1247 ctx.canvas->saveLayer(nullptr, &save_p);
1248 },
1250 DlPaint save_p;
1251 save_p.
setColor(alpha_layer_color);
1252 ctx.canvas->SaveLayer(nullptr, &save_p);
1253 })
1254 .with_restore(sk_safe_restore, dl_safe_restore, true));
1256 CaseParameters(
1257 "saveLayer with peephole alpha, no bounds",
1261 ctx.canvas->saveLayer(nullptr, &save_p);
1262 },
1264 DlPaint save_p;
1265 save_p.
setColor(alpha_layer_color);
1266 ctx.canvas->SaveLayer(nullptr, &save_p);
1267 })
1268 .with_restore(sk_opt_restore, dl_opt_restore, true, true));
1270 CaseParameters(
1271 "saveLayer with alpha and bounds",
1275 ctx.canvas->saveLayer(layer_bounds, &save_p);
1276 },
1278 DlPaint save_p;
1279 save_p.
setColor(alpha_layer_color);
1280 ctx.canvas->SaveLayer(&layer_bounds, &save_p);
1281 })
1282 .with_restore(sk_safe_restore, dl_safe_restore, true));
1283 {
1284
1285
1286
1287
1288
1289
1290
1291 RenderEnvironment backdrop_env =
1296 ctx.canvas->drawPaint(setup_p);
1297 };
1299 DlPaint setup_p;
1301 ctx.canvas->DrawPaint(setup_p);
1302 };
1304 ctx.paint.
setAlpha(ctx.paint.getAlpha() / 2);
1305 };
1307 ctx.paint.setAlpha(ctx.paint.getAlpha() / 2);
1308 };
1309 backdrop_env.init_ref(sk_backdrop_setup, testP.sk_renderer(),
1310 dl_backdrop_setup, testP.dl_renderer(),
1311 testP.imp_renderer());
1313
1315 auto sk_backdrop =
1318 CaseParameters(
1319 "saveLayer with backdrop",
1321 sk_backdrop_setup(ctx);
1323 nullptr, nullptr, sk_backdrop.get(), 0));
1324 sk_content_setup(ctx);
1325 },
1327 dl_backdrop_setup(ctx);
1328 ctx.canvas->SaveLayer(nullptr, nullptr, &dl_backdrop);
1329 dl_content_setup(ctx);
1330 })
1331 .with_restore(sk_safe_restore, dl_safe_restore, true));
1333 CaseParameters(
1334 "saveLayer with bounds and backdrop",
1336 sk_backdrop_setup(ctx);
1338 &layer_bounds, nullptr, sk_backdrop.get(), 0));
1339 sk_content_setup(ctx);
1340 },
1342 dl_backdrop_setup(ctx);
1343 ctx.canvas->SaveLayer(&layer_bounds, nullptr,
1344 &dl_backdrop);
1345 dl_content_setup(ctx);
1346 })
1347 .with_restore(sk_safe_restore, dl_safe_restore, true));
1349 CaseParameters(
1350 "clipped saveLayer with backdrop",
1352 sk_backdrop_setup(ctx);
1353 ctx.canvas->clipRect(layer_bounds);
1355 nullptr, nullptr, sk_backdrop.get(), 0));
1356 sk_content_setup(ctx);
1357 },
1359 dl_backdrop_setup(ctx);
1360 ctx.canvas->ClipRect(layer_bounds);
1361 ctx.canvas->SaveLayer(nullptr, nullptr, &dl_backdrop);
1362 dl_content_setup(ctx);
1363 })
1364 .with_restore(sk_safe_restore, dl_safe_restore, true));
1365 }
1366
1367 {
1368
1369 constexpr float rotate_alpha_color_matrix[20] = {
1370 0, 1, 0, 0 , 0,
1371 0, 0, 1, 0 , 0,
1372 1, 0, 0, 0 , 0,
1373 0, 0, 0, 0.5, 0,
1374 };
1375
1376 DlMatrixColorFilter dl_alpha_rotate_filter(rotate_alpha_color_matrix);
1377 auto sk_alpha_rotate_filter =
1379 {
1381 CaseParameters(
1382 "saveLayer ColorFilter, no bounds",
1386 ctx.canvas->saveLayer(nullptr, &save_p);
1387 ctx.paint.setStrokeWidth(5.0);
1388 },
1390 DlPaint save_p;
1392 ctx.canvas->SaveLayer(nullptr, &save_p);
1393 ctx.paint.setStrokeWidth(5.0);
1394 })
1395 .with_restore(sk_safe_restore, dl_safe_restore, true));
1396 }
1397 {
1399 CaseParameters(
1400 "saveLayer ColorFilter and bounds",
1405 ctx.paint.setStrokeWidth(5.0);
1406 },
1408 DlPaint save_p;
1411 ctx.paint.setStrokeWidth(5.0);
1412 })
1413 .with_restore(sk_safe_restore, dl_safe_restore, true));
1414 }
1415 }
1416
1417 {
1418
1419 constexpr float color_matrix[20] = {
1420 0.5, 0, 0, 0, 0.5,
1421 0, 0.5, 0, 0, 0.5,
1422 0, 0, 0.5, 0, 0.5,
1423 0, 0, 0, 1, 0,
1424 };
1425
1426 DlMatrixColorFilter dl_color_filter(color_matrix);
1427 DlColorFilterImageFilter dl_cf_image_filter(dl_color_filter);
1430 {
1432 CaseParameters(
1433 "saveLayer ImageFilter, no bounds",
1437 ctx.canvas->saveLayer(nullptr, &save_p);
1438 ctx.paint.setStrokeWidth(5.0);
1439 },
1441 DlPaint save_p;
1443 ctx.canvas->SaveLayer(nullptr, &save_p);
1444 ctx.paint.setStrokeWidth(5.0);
1445 })
1446 .with_restore(sk_safe_restore, dl_safe_restore, true));
1447 }
1448 {
1450 CaseParameters(
1451 "saveLayer ImageFilter and bounds",
1456 ctx.paint.setStrokeWidth(5.0);
1457 },
1459 DlPaint save_p;
1462 ctx.paint.setStrokeWidth(5.0);
1463 })
1464 .with_restore(sk_safe_restore, dl_safe_restore, true));
1465 }
1466 }
1467 }
static SkPath clip(const SkPath &path, const SkHalfPlane &plane)
static sk_sp< SkImageFilter > ColorFilter(sk_sp< SkColorFilter > cf, sk_sp< SkImageFilter > input, const CropRect &cropRect={})
void setColor(SkColor color)
void setImageFilter(sk_sp< SkImageFilter > imageFilter)
void setShader(sk_sp< SkShader > shader)
void setBlendMode(SkBlendMode mode)
void setColorFilter(sk_sp< SkColorFilter > colorFilter)
sk_sp< SkBlender > blender SkRect rect
const std::function< void(const SkRenderContext &)> SkRenderer
RenderContext< DlCanvas *, const DlPaint &, sk_sp< DlImage > > DlRenderContext
RenderContext< SkCanvas *, const SkPaint &, sk_sp< SkImage > > SkRenderContext
const std::function< void(const DlRenderContext &)> DlRenderer
SkPaint ToSk(const DlPaint &paint)
constexpr SkRect makeOffset(float dx, float dy) const
static constexpr SkRect MakeXYWH(float x, float y, float w, float h)