bool should_match()

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;
  }