| Index: third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp
|
| diff --git a/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp b/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp
|
| index 27e2c82e55af1df7b707e9c8b28c653da4e32d76..1fa9f8a55e340e08a103c0157ce561746d4680d9 100644
|
| --- a/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp
|
| +++ b/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp
|
| @@ -25,8 +25,8 @@
|
| #include "platform/RuntimeEnabledFeatures.h"
|
| #include "platform/bindings/ScriptState.h"
|
| #include "platform/geometry/FloatQuad.h"
|
| +#include "platform/graphics/CanvasHeuristicParameters.h"
|
| #include "platform/graphics/Color.h"
|
| -#include "platform/graphics/ExpensiveCanvasHeuristicParameters.h"
|
| #include "platform/graphics/Image.h"
|
| #include "platform/graphics/ImageBuffer.h"
|
| #include "platform/graphics/StrokeData.h"
|
| @@ -604,12 +604,12 @@ bool BaseRenderingContext2D::IsFullCanvasCompositeMode(SkBlendMode op) {
|
|
|
| static bool IsPathExpensive(const Path& path) {
|
| const SkPath& sk_path = path.GetSkPath();
|
| - if (ExpensiveCanvasHeuristicParameters::kConcavePathsAreExpensive &&
|
| + if (CanvasHeuristicParameters::kConcavePathsAreExpensive &&
|
| !sk_path.isConvex())
|
| return true;
|
|
|
| if (sk_path.countPoints() >
|
| - ExpensiveCanvasHeuristicParameters::kExpensivePathPointCount)
|
| + CanvasHeuristicParameters::kExpensivePathPointCount)
|
| return true;
|
|
|
| return false;
|
| @@ -656,26 +656,22 @@ static SkPath::FillType ParseWinding(const String& winding_rule_string) {
|
| }
|
|
|
| void BaseRenderingContext2D::fill(const String& winding_rule_string) {
|
| - TrackDrawCall(kFillPath);
|
| DrawPathInternal(path_, CanvasRenderingContext2DState::kFillPaintType,
|
| ParseWinding(winding_rule_string));
|
| }
|
|
|
| void BaseRenderingContext2D::fill(Path2D* dom_path,
|
| const String& winding_rule_string) {
|
| - TrackDrawCall(kFillPath, dom_path);
|
| DrawPathInternal(dom_path->GetPath(),
|
| CanvasRenderingContext2DState::kFillPaintType,
|
| ParseWinding(winding_rule_string));
|
| }
|
|
|
| void BaseRenderingContext2D::stroke() {
|
| - TrackDrawCall(kStrokePath);
|
| DrawPathInternal(path_, CanvasRenderingContext2DState::kStrokePaintType);
|
| }
|
|
|
| void BaseRenderingContext2D::stroke(Path2D* dom_path) {
|
| - TrackDrawCall(kStrokePath, dom_path);
|
| DrawPathInternal(dom_path->GetPath(),
|
| CanvasRenderingContext2DState::kStrokePaintType);
|
| }
|
| @@ -684,7 +680,6 @@ void BaseRenderingContext2D::fillRect(double x,
|
| double y,
|
| double width,
|
| double height) {
|
| - TrackDrawCall(kFillRect, nullptr, width, height);
|
| if (!ValidateRectForCanvas(x, y, width, height))
|
| return;
|
|
|
| @@ -719,7 +714,6 @@ void BaseRenderingContext2D::strokeRect(double x,
|
| double y,
|
| double width,
|
| double height) {
|
| - TrackDrawCall(kStrokeRect, nullptr, width, height);
|
| if (!ValidateRectForCanvas(x, y, width, height))
|
| return;
|
|
|
| @@ -751,7 +745,7 @@ void BaseRenderingContext2D::ClipInternal(const Path& path,
|
| ModifiableState().ClipPath(sk_path, clip_antialiasing_);
|
| c->clipPath(sk_path, SkClipOp::kIntersect,
|
| clip_antialiasing_ == kAntiAliased);
|
| - if (ExpensiveCanvasHeuristicParameters::kComplexClipsAreExpensive &&
|
| + if (CanvasHeuristicParameters::kComplexClipsAreExpensive &&
|
| !sk_path.isRect(0) && HasImageBuffer()) {
|
| GetImageBuffer()->SetHasExpensiveOp();
|
| }
|
| @@ -1051,14 +1045,6 @@ void BaseRenderingContext2D::DrawImageInternal(PaintCanvas* c,
|
| const FloatRect& src_rect,
|
| const FloatRect& dst_rect,
|
| const PaintFlags* flags) {
|
| - if (image_source->IsSVGSource()) {
|
| - TrackDrawCall(kDrawVectorImage, nullptr, dst_rect.Width(),
|
| - dst_rect.Height());
|
| - } else {
|
| - TrackDrawCall(kDrawBitmapImage, nullptr, dst_rect.Width(),
|
| - dst_rect.Height());
|
| - }
|
| -
|
| int initial_save_count = c->getSaveCount();
|
| PaintFlags image_flags = *flags;
|
|
|
| @@ -1199,21 +1185,21 @@ void BaseRenderingContext2D::drawImage(ScriptState* script_state,
|
|
|
| // Heuristic for disabling acceleration based on anticipated texture upload
|
| // overhead.
|
| - // See comments in ExpensiveCanvasHeuristicParameters.h for explanation.
|
| + // See comments in CanvasHeuristicParameters.h for explanation.
|
| ImageBuffer* buffer = GetImageBuffer();
|
| if (buffer && buffer->IsAccelerated() && !image_source->IsAccelerated()) {
|
| float src_area = src_rect.Width() * src_rect.Height();
|
| - if (src_area > ExpensiveCanvasHeuristicParameters::
|
| - kDrawImageTextureUploadHardSizeLimit) {
|
| + if (src_area >
|
| + CanvasHeuristicParameters::kDrawImageTextureUploadHardSizeLimit) {
|
| buffer->DisableAcceleration();
|
| - } else if (src_area > ExpensiveCanvasHeuristicParameters::
|
| + } else if (src_area > CanvasHeuristicParameters::
|
| kDrawImageTextureUploadSoftSizeLimit) {
|
| SkRect bounds = dst_rect;
|
| SkMatrix ctm = DrawingCanvas()->getTotalMatrix();
|
| ctm.mapRect(&bounds);
|
| float dst_area = dst_rect.Width() * dst_rect.Height();
|
| if (src_area >
|
| - dst_area * ExpensiveCanvasHeuristicParameters::
|
| + dst_area * CanvasHeuristicParameters::
|
| kDrawImageTextureUploadSoftSizeLimitScaleThreshold) {
|
| buffer->DisableAcceleration();
|
| }
|
| @@ -1342,13 +1328,12 @@ void BaseRenderingContext2D::drawImage(ScriptState* script_state,
|
|
|
| bool is_expensive = false;
|
|
|
| - if (ExpensiveCanvasHeuristicParameters::kSVGImageSourcesAreExpensive &&
|
| + if (CanvasHeuristicParameters::kSVGImageSourcesAreExpensive &&
|
| image_source->IsSVGSource())
|
| is_expensive = true;
|
|
|
| if (image_size.Width() * image_size.Height() >
|
| - Width() * Height() *
|
| - ExpensiveCanvasHeuristicParameters::kExpensiveImageSizeRatio)
|
| + Width() * Height() * CanvasHeuristicParameters::kExpensiveImageSizeRatio)
|
| is_expensive = true;
|
|
|
| if (is_expensive) {
|
| @@ -1889,125 +1874,6 @@ void BaseRenderingContext2D::CheckOverdraw(
|
| GetImageBuffer()->WillOverwriteCanvas();
|
| }
|
|
|
| -void BaseRenderingContext2D::TrackDrawCall(DrawCallType call_type,
|
| - Path2D* path2d,
|
| - int width,
|
| - int height) {
|
| - if (!RuntimeEnabledFeatures::
|
| - enableCanvas2dDynamicRenderingModeSwitchingEnabled()) {
|
| - // Rendering mode switching is disabled so no need to track the usage
|
| - return;
|
| - }
|
| -
|
| - usage_counters_.num_draw_calls[call_type]++;
|
| -
|
| - float bounding_rect_width = static_cast<float>(width);
|
| - float bounding_rect_height = static_cast<float>(height);
|
| - float bounding_rect_area = bounding_rect_width * bounding_rect_height;
|
| - float bounding_rect_perimeter =
|
| - (2.0 * bounding_rect_width) + (2.0 * bounding_rect_height);
|
| -
|
| - if (call_type == kFillText || call_type == kFillPath ||
|
| - call_type == kStrokeText || call_type == kStrokePath ||
|
| - call_type == kFillRect || call_type == kStrokeRect) {
|
| - SkPath sk_path;
|
| - if (path2d) {
|
| - sk_path = path2d->GetPath().GetSkPath();
|
| - } else {
|
| - sk_path = path_.GetSkPath();
|
| - }
|
| -
|
| - if (!(call_type == kFillRect || call_type == kStrokeRect ||
|
| - call_type == kDrawVectorImage || call_type == kDrawBitmapImage)) {
|
| - // The correct width and height were not passed as parameters
|
| - const SkRect& bounding_rect = sk_path.getBounds();
|
| - bounding_rect_width = static_cast<float>(std::abs(bounding_rect.width()));
|
| - bounding_rect_height =
|
| - static_cast<float>(std::abs(bounding_rect.height()));
|
| - bounding_rect_area = bounding_rect_width * bounding_rect_height;
|
| - bounding_rect_perimeter =
|
| - 2.0 * bounding_rect_width + 2.0 * bounding_rect_height;
|
| - }
|
| -
|
| - if (call_type == kFillPath &&
|
| - sk_path.getConvexity() != SkPath::kConvex_Convexity) {
|
| - usage_counters_.num_non_convex_fill_path_calls++;
|
| - usage_counters_.non_convex_fill_path_area += bounding_rect_area;
|
| - }
|
| -
|
| - usage_counters_.bounding_box_perimeter_draw_calls[call_type] +=
|
| - bounding_rect_perimeter;
|
| - usage_counters_.bounding_box_area_draw_calls[call_type] +=
|
| - bounding_rect_area;
|
| -
|
| - CanvasStyle* canvas_style;
|
| - if (call_type == kFillText || call_type == kFillPath ||
|
| - call_type == kFillRect) {
|
| - canvas_style = GetState().FillStyle();
|
| - } else {
|
| - canvas_style = GetState().StrokeStyle();
|
| - }
|
| -
|
| - CanvasGradient* gradient = canvas_style->GetCanvasGradient();
|
| - if (gradient) {
|
| - switch (gradient->GetGradient()->GetType()) {
|
| - case Gradient::Type::kLinear:
|
| - usage_counters_.num_linear_gradients++;
|
| - usage_counters_.bounding_box_area_fill_type
|
| - [BaseRenderingContext2D::kLinearGradientFillType] +=
|
| - bounding_rect_area;
|
| - break;
|
| - case Gradient::Type::kRadial:
|
| - usage_counters_.num_radial_gradients++;
|
| - usage_counters_.bounding_box_area_fill_type
|
| - [BaseRenderingContext2D::kRadialGradientFillType] +=
|
| - bounding_rect_area;
|
| - break;
|
| - default:
|
| - NOTREACHED();
|
| - }
|
| - } else if (canvas_style->GetCanvasPattern()) {
|
| - usage_counters_.num_patterns++;
|
| - usage_counters_.bounding_box_area_fill_type
|
| - [BaseRenderingContext2D::kPatternFillType] += bounding_rect_area;
|
| - } else {
|
| - usage_counters_.bounding_box_area_fill_type
|
| - [BaseRenderingContext2D::kColorFillType] += bounding_rect_area;
|
| - }
|
| - }
|
| -
|
| - if (call_type == kDrawVectorImage || call_type == kDrawBitmapImage) {
|
| - usage_counters_.bounding_box_perimeter_draw_calls[call_type] +=
|
| - bounding_rect_perimeter;
|
| - usage_counters_.bounding_box_area_draw_calls[call_type] +=
|
| - bounding_rect_area;
|
| - }
|
| -
|
| - if (call_type == kFillText || call_type == kFillPath ||
|
| - call_type == kStrokeText || call_type == kStrokePath ||
|
| - call_type == kFillRect || call_type == kStrokeRect ||
|
| - call_type == kDrawVectorImage || call_type == kDrawBitmapImage) {
|
| - if (GetState().ShadowBlur() > 0.0 &&
|
| - SkColorGetA(GetState().ShadowColor()) > 0) {
|
| - usage_counters_.num_blurred_shadows++;
|
| - usage_counters_.bounding_box_area_times_shadow_blur_squared +=
|
| - bounding_rect_area * GetState().ShadowBlur() *
|
| - GetState().ShadowBlur();
|
| - usage_counters_.bounding_box_perimeter_times_shadow_blur_squared +=
|
| - bounding_rect_perimeter * GetState().ShadowBlur() *
|
| - GetState().ShadowBlur();
|
| - }
|
| - }
|
| -
|
| - if (GetState().HasComplexClip()) {
|
| - usage_counters_.num_draw_with_complex_clips++;
|
| - }
|
| -
|
| - if (StateHasFilter()) {
|
| - usage_counters_.num_filters++;
|
| - }
|
| -}
|
| -
|
| const BaseRenderingContext2D::UsageCounters&
|
| BaseRenderingContext2D::GetUsage() {
|
| return usage_counters_;
|
| @@ -2041,107 +1907,4 @@ BaseRenderingContext2D::UsageCounters::UsageCounters()
|
| num_draw_focus_calls(0),
|
| num_frames_since_reset(0) {}
|
|
|
| -float BaseRenderingContext2D::EstimateRenderingCost(
|
| - ExpensiveCanvasHeuristicParameters::RenderingModeCostIndex index) const {
|
| - float basic_cost_of_draw_calls =
|
| - ExpensiveCanvasHeuristicParameters::kFillRectFixedCost[index] *
|
| - usage_counters_.num_draw_calls[BaseRenderingContext2D::kFillRect] +
|
| - ExpensiveCanvasHeuristicParameters::kFillConvexPathFixedCost[index] *
|
| - (usage_counters_.num_draw_calls[BaseRenderingContext2D::kFillPath] -
|
| - usage_counters_.num_non_convex_fill_path_calls) +
|
| - ExpensiveCanvasHeuristicParameters::kFillNonConvexPathFixedCost[index] *
|
| - usage_counters_.num_non_convex_fill_path_calls +
|
| - ExpensiveCanvasHeuristicParameters::kFillTextFixedCost[index] *
|
| - usage_counters_.num_draw_calls[BaseRenderingContext2D::kFillText] +
|
| -
|
| - ExpensiveCanvasHeuristicParameters::kStrokeRectFixedCost[index] *
|
| - usage_counters_.num_draw_calls[BaseRenderingContext2D::kStrokeRect] +
|
| - ExpensiveCanvasHeuristicParameters::kStrokePathFixedCost[index] *
|
| - usage_counters_.num_draw_calls[BaseRenderingContext2D::kStrokePath] +
|
| - ExpensiveCanvasHeuristicParameters::kStrokeTextFixedCost[index] *
|
| - usage_counters_.num_draw_calls[BaseRenderingContext2D::kStrokeText] +
|
| -
|
| - ExpensiveCanvasHeuristicParameters::kFillRectVariableCostPerArea[index] *
|
| - usage_counters_
|
| - .bounding_box_area_draw_calls[BaseRenderingContext2D::kFillRect] +
|
| - ExpensiveCanvasHeuristicParameters::kFillConvexPathVariableCostPerArea
|
| - [index] *
|
| - (usage_counters_.bounding_box_area_draw_calls
|
| - [BaseRenderingContext2D::kFillPath] -
|
| - usage_counters_.non_convex_fill_path_area) +
|
| - ExpensiveCanvasHeuristicParameters::kFillNonConvexPathVariableCostPerArea
|
| - [index] *
|
| - usage_counters_.non_convex_fill_path_area +
|
| - ExpensiveCanvasHeuristicParameters::kFillTextVariableCostPerArea[index] *
|
| - usage_counters_
|
| - .bounding_box_area_draw_calls[BaseRenderingContext2D::kFillText] +
|
| -
|
| - ExpensiveCanvasHeuristicParameters::kStrokeRectVariableCostPerArea
|
| - [index] *
|
| - usage_counters_.bounding_box_area_draw_calls
|
| - [BaseRenderingContext2D::kStrokeRect] +
|
| - ExpensiveCanvasHeuristicParameters::kStrokePathVariableCostPerArea
|
| - [index] *
|
| - usage_counters_.bounding_box_area_draw_calls
|
| - [BaseRenderingContext2D::kStrokePath] +
|
| - ExpensiveCanvasHeuristicParameters::kStrokeTextVariableCostPerArea
|
| - [index] *
|
| - usage_counters_.bounding_box_area_draw_calls
|
| - [BaseRenderingContext2D::kStrokeText] +
|
| -
|
| - ExpensiveCanvasHeuristicParameters::kPutImageDataFixedCost[index] *
|
| - usage_counters_.num_put_image_data_calls +
|
| - ExpensiveCanvasHeuristicParameters::kPutImageDataVariableCostPerArea
|
| - [index] *
|
| - usage_counters_.area_put_image_data_calls +
|
| -
|
| - ExpensiveCanvasHeuristicParameters::kDrawSVGImageFixedCost[index] *
|
| - usage_counters_
|
| - .num_draw_calls[BaseRenderingContext2D::kDrawVectorImage] +
|
| - ExpensiveCanvasHeuristicParameters::kDrawPNGImageFixedCost[index] *
|
| - usage_counters_
|
| - .num_draw_calls[BaseRenderingContext2D::kDrawBitmapImage] +
|
| -
|
| - ExpensiveCanvasHeuristicParameters::kDrawSVGImageVariableCostPerArea
|
| - [index] *
|
| - usage_counters_.bounding_box_area_draw_calls
|
| - [BaseRenderingContext2D::kDrawVectorImage] +
|
| - ExpensiveCanvasHeuristicParameters::kDrawPNGImageVariableCostPerArea
|
| - [index] *
|
| - usage_counters_.bounding_box_area_draw_calls
|
| - [BaseRenderingContext2D::kDrawBitmapImage];
|
| -
|
| - float fill_type_adjustment =
|
| - ExpensiveCanvasHeuristicParameters::kPatternFillTypeFixedCost[index] *
|
| - usage_counters_.num_patterns +
|
| - ExpensiveCanvasHeuristicParameters::kLinearGradientFillTypeFixedCost
|
| - [index] *
|
| - usage_counters_.num_linear_gradients +
|
| - ExpensiveCanvasHeuristicParameters::kRadialGradientFillTypeFixedCost
|
| - [index] *
|
| - usage_counters_.num_radial_gradients +
|
| -
|
| - ExpensiveCanvasHeuristicParameters::kPatternFillTypeVariableCostPerArea
|
| - [index] *
|
| - usage_counters_.bounding_box_area_fill_type
|
| - [BaseRenderingContext2D::kPatternFillType] +
|
| - ExpensiveCanvasHeuristicParameters::kLinearGradientFillVariableCostPerArea
|
| - [index] *
|
| - usage_counters_.bounding_box_area_fill_type
|
| - [BaseRenderingContext2D::kLinearGradientFillType] +
|
| - ExpensiveCanvasHeuristicParameters::kRadialGradientFillVariableCostPerArea
|
| - [index] *
|
| - usage_counters_.bounding_box_area_fill_type
|
| - [BaseRenderingContext2D::kRadialGradientFillType];
|
| -
|
| - float shadow_adjustment =
|
| - ExpensiveCanvasHeuristicParameters::kShadowFixedCost[index] *
|
| - usage_counters_.num_blurred_shadows +
|
| - ExpensiveCanvasHeuristicParameters::
|
| - kShadowVariableCostPerAreaTimesShadowBlurSquared[index] *
|
| - usage_counters_.bounding_box_area_times_shadow_blur_squared;
|
| -
|
| - return basic_cost_of_draw_calls + fill_type_adjustment + shadow_adjustment;
|
| -}
|
| -
|
| } // namespace blink
|
|
|