| Index: cc/resources/raster_worker_pool.cc
|
| diff --git a/cc/resources/raster_worker_pool.cc b/cc/resources/raster_worker_pool.cc
|
| index 06fd18e62e0ec2bdc9d440ee0ae6eb925c867ef4..671271c667ab4adb5fcdb696d3d83e3e18e31c62 100644
|
| --- a/cc/resources/raster_worker_pool.cc
|
| +++ b/cc/resources/raster_worker_pool.cc
|
| @@ -13,6 +13,8 @@
|
| #include "skia/ext/lazy_pixel_ref.h"
|
| #include "skia/ext/paint_simplifier.h"
|
| #include "third_party/skia/include/core/SkBitmap.h"
|
| +#include "third_party/skia/include/utils/SkNWayCanvas.h"
|
| +#include "ui/gfx/skia_util.h"
|
|
|
| namespace cc {
|
|
|
| @@ -31,10 +33,6 @@ class IdentityAllocator : public SkBitmap::Allocator {
|
| void* buffer_;
|
| };
|
|
|
| -// Flag to indicate whether we should try and detect that
|
| -// a tile is of solid color.
|
| -const bool kUseColorEstimator = true;
|
| -
|
| class DisableLCDTextFilter : public SkDrawFilter {
|
| public:
|
| // SkDrawFilter interface.
|
| @@ -73,35 +71,11 @@ class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask {
|
| rendering_stats_(rendering_stats),
|
| reply_(reply) {}
|
|
|
| - void RunAnalysisOnThread(unsigned thread_index) {
|
| - TRACE_EVENT1("cc",
|
| - "RasterWorkerPoolTaskImpl::RunAnalysisOnThread",
|
| - "data",
|
| - TracedValue::FromValue(DataAsValue().release()));
|
| -
|
| - DCHECK(picture_pile_.get());
|
| - DCHECK(rendering_stats_);
|
| -
|
| - PicturePileImpl* picture_clone =
|
| - picture_pile_->GetCloneForDrawingOnThread(thread_index);
|
| -
|
| - DCHECK(picture_clone);
|
| -
|
| - picture_clone->AnalyzeInRect(
|
| - content_rect_, contents_scale_, &analysis_, rendering_stats_);
|
| -
|
| - // Record the solid color prediction.
|
| - UMA_HISTOGRAM_BOOLEAN("Renderer4.SolidColorTilesAnalyzed",
|
| - analysis_.is_solid_color);
|
| -
|
| - // Clear the flag if we're not using the estimator.
|
| - analysis_.is_solid_color &= kUseColorEstimator;
|
| - }
|
| -
|
| - bool RunRasterOnThread(unsigned thread_index,
|
| - void* buffer,
|
| - gfx::Size size,
|
| - int stride) {
|
| + // Overridden from internal::RasterWorkerPoolTask:
|
| + virtual bool RunOnWorkerThread(unsigned thread_index,
|
| + void* buffer,
|
| + gfx::Size size,
|
| + int stride) OVERRIDE {
|
| TRACE_EVENT2(
|
| "cc", "RasterWorkerPoolTaskImpl::RunRasterOnThread",
|
| "data",
|
| @@ -115,9 +89,6 @@ class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask {
|
| DCHECK(picture_pile_.get());
|
| DCHECK(buffer);
|
|
|
| - if (analysis_.is_solid_color)
|
| - return false;
|
| -
|
| PicturePileImpl* picture_clone =
|
| picture_pile_->GetCloneForDrawingOnThread(thread_index);
|
|
|
| @@ -146,8 +117,22 @@ class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask {
|
| break;
|
| }
|
|
|
| - SkBitmapDevice device(bitmap);
|
| - SkCanvas canvas(&device);
|
| + SkBitmap empty_bitmap;
|
| + empty_bitmap.setConfig(
|
| + SkBitmap::kNo_Config, content_rect_.width(), content_rect_.height());
|
| + gfx::Rect analysis_rect(
|
| + picture_clone->AnalysisRectForRaster(content_rect_, contents_scale_));
|
| + skia::AnalysisDevice analysis_device(empty_bitmap,
|
| + gfx::RectToSkRect(analysis_rect));
|
| + skia::AnalysisCanvas analysis_canvas(&analysis_device);
|
| +
|
| + SkBitmapDevice raster_device(bitmap);
|
| + SkCanvas raster_canvas(&raster_device);
|
| +
|
| + SkNWayCanvas canvas(content_rect_.width(), content_rect_.height());
|
| + canvas.addCanvas(&analysis_canvas);
|
| + canvas.addCanvas(&raster_canvas);
|
| +
|
| skia::RefPtr<SkDrawFilter> draw_filter;
|
| switch (raster_mode_) {
|
| case LOW_QUALITY_RASTER_MODE:
|
| @@ -193,18 +178,17 @@ class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask {
|
|
|
| ChangeBitmapConfigIfNeeded(bitmap, buffer);
|
|
|
| - return true;
|
| - }
|
| + analysis_.is_solid_color =
|
| + analysis_canvas.GetColorIfSolid(&analysis_.solid_color);
|
| + analysis_.has_text = analysis_canvas.HasText();
|
|
|
| - // Overridden from internal::RasterWorkerPoolTask:
|
| - virtual bool RunOnWorkerThread(unsigned thread_index,
|
| - void* buffer,
|
| - gfx::Size size,
|
| - int stride)
|
| - OVERRIDE {
|
| - RunAnalysisOnThread(thread_index);
|
| - return RunRasterOnThread(thread_index, buffer, size, stride);
|
| + // Record the solid color prediction.
|
| + UMA_HISTOGRAM_BOOLEAN("Renderer4.SolidColorTilesAnalyzed",
|
| + analysis_.is_solid_color);
|
| +
|
| + return !analysis_.is_solid_color;
|
| }
|
| +
|
| virtual void CompleteOnOriginThread() OVERRIDE {
|
| reply_.Run(analysis_, !HasFinishedRunning() || WasCanceled());
|
| }
|
|
|