in display_list/display_list_canvas_unittests.cc [333:432]
bool should_match(const RenderEnvironment& env,
const SkPaint& paint,
const SkMatrix& matrix,
const SkIRect& device_clip,
bool has_diff_clip,
bool has_mutating_save_layer) const {
if (has_mutating_save_layer) {
return false;
}
if (env.ref_clip_bounds() != device_clip || has_diff_clip) {
return false;
}
if (env.ref_matrix() != matrix && !flags_.is_flood()) {
return false;
}
if (flags_.ignores_paint()) {
return true;
}
const SkPaint& ref_paint = env.ref_paint();
if (flags_.applies_anti_alias() && //
ref_paint.isAntiAlias() != paint.isAntiAlias()) {
return false;
}
if (flags_.applies_dither() && //
ref_paint.isDither() != paint.isDither()) {
return false;
}
if (flags_.applies_color() && //
ref_paint.getColor() != paint.getColor()) {
return false;
}
if (flags_.applies_alpha() && //
ref_paint.getAlpha() != paint.getAlpha()) {
return false;
}
if (flags_.applies_blend() && //
ref_paint.getBlender() != paint.getBlender()) {
return false;
}
if (flags_.applies_color_filter() && //
ref_paint.getColorFilter() != paint.getColorFilter()) {
return false;
}
if (flags_.applies_mask_filter() && //
ref_paint.getMaskFilter() != paint.getMaskFilter()) {
return false;
}
if (flags_.applies_image_filter() && //
ref_paint.getImageFilter() != paint.getImageFilter()) {
return false;
}
if (flags_.applies_shader() && //
ref_paint.getShader() != paint.getShader()) {
return false;
}
DisplayListSpecialGeometryFlags geo_flags =
flags_.WithPathEffect(paint.refPathEffect());
if (flags_.applies_path_effect() && //
ref_paint.getPathEffect() != paint.getPathEffect()) {
SkPathEffect::DashInfo info;
if (paint.getPathEffect()->asADash(&info) !=
SkPathEffect::kDash_DashType) {
return false;
}
if (!ignores_dashes()) {
return false;
}
}
bool is_stroked = flags_.is_stroked(ref_paint.getStyle());
if (flags_.is_stroked(paint.getStyle()) != is_stroked) {
return false;
}
if (!is_stroked) {
return true;
}
if (ref_paint.getStrokeWidth() != paint.getStrokeWidth()) {
return false;
}
if (geo_flags.may_have_end_caps() && //
getCap(ref_paint, geo_flags) != getCap(paint, geo_flags)) {
return false;
}
if (geo_flags.may_have_joins()) {
if (ref_paint.getStrokeJoin() != paint.getStrokeJoin()) {
return false;
}
if (ref_paint.getStrokeJoin() == SkPaint::kMiter_Join) {
SkScalar ref_miter = ref_paint.getStrokeMiter();
SkScalar test_miter = paint.getStrokeMiter();
// miter limit < 1.4 affects right angles
if (geo_flags.may_have_acute_joins() || //
ref_miter < 1.4 || test_miter < 1.4) {
if (ref_miter != test_miter) {
return false;
}
}
}
}
return true;
}