| Index: cc/tiles/tile_manager.cc
 | 
| diff --git a/cc/tiles/tile_manager.cc b/cc/tiles/tile_manager.cc
 | 
| index 400fff20646bf77374fab31801f7181d207551f6..da09aa731b057e35647c8aa86bf0271fa225ad2b 100644
 | 
| --- a/cc/tiles/tile_manager.cc
 | 
| +++ b/cc/tiles/tile_manager.cc
 | 
| @@ -55,10 +55,7 @@ class RasterTaskImpl : public RasterTask {
 | 
|                   uint64_t previous_content_id,
 | 
|                   uint64_t resource_content_id,
 | 
|                   int source_frame_number,
 | 
| -                 bool analyze_picture,
 | 
| -                 const base::Callback<
 | 
| -                     void(const DisplayListRasterSource::SolidColorAnalysis&,
 | 
| -                          bool)>& reply,
 | 
| +                 const base::Callback<void(bool)>& reply,
 | 
|                   ImageDecodeTask::Vector* dependencies)
 | 
|        : RasterTask(dependencies),
 | 
|          resource_(resource),
 | 
| @@ -74,7 +71,6 @@ class RasterTaskImpl : public RasterTask {
 | 
|          previous_content_id_(previous_content_id),
 | 
|          resource_content_id_(resource_content_id),
 | 
|          source_frame_number_(source_frame_number),
 | 
| -        analyze_picture_(analyze_picture),
 | 
|          reply_(reply) {}
 | 
|  
 | 
|    // Overridden from Task:
 | 
| @@ -85,12 +81,6 @@ class RasterTaskImpl : public RasterTask {
 | 
|      DCHECK(raster_source_.get());
 | 
|      DCHECK(raster_buffer_);
 | 
|  
 | 
| -    if (analyze_picture_) {
 | 
| -      Analyze(raster_source_.get());
 | 
| -      if (analysis_.is_solid_color)
 | 
| -        return;
 | 
| -    }
 | 
| -
 | 
|      Raster(raster_source_.get());
 | 
|    }
 | 
|  
 | 
| @@ -102,25 +92,13 @@ class RasterTaskImpl : public RasterTask {
 | 
|    }
 | 
|    void CompleteOnOriginThread(TileTaskClient* client) override {
 | 
|      client->ReleaseBufferForRaster(std::move(raster_buffer_));
 | 
| -    reply_.Run(analysis_, !HasFinishedRunning());
 | 
| +    reply_.Run(!HasFinishedRunning());
 | 
|    }
 | 
|  
 | 
|   protected:
 | 
|    ~RasterTaskImpl() override { DCHECK(!raster_buffer_); }
 | 
|  
 | 
|   private:
 | 
| -  void Analyze(const DisplayListRasterSource* raster_source) {
 | 
| -    frame_viewer_instrumentation::ScopedAnalyzeTask analyze_task(
 | 
| -        tile_, tile_resolution_, source_frame_number_, layer_id_);
 | 
| -
 | 
| -    DCHECK(raster_source);
 | 
| -
 | 
| -    raster_source->PerformSolidColorAnalysis(content_rect_, contents_scale_,
 | 
| -                                             &analysis_);
 | 
| -    // Clear the flag if we're not using the estimator.
 | 
| -    analysis_.is_solid_color &= kUseColorEstimator;
 | 
| -  }
 | 
| -
 | 
|    void Raster(const DisplayListRasterSource* raster_source) {
 | 
|      frame_viewer_instrumentation::ScopedRasterTask raster_task(
 | 
|          tile_, tile_resolution_, source_frame_number_, layer_id_);
 | 
| @@ -136,7 +114,6 @@ class RasterTaskImpl : public RasterTask {
 | 
|    }
 | 
|  
 | 
|    const Resource* resource_;
 | 
| -  DisplayListRasterSource::SolidColorAnalysis analysis_;
 | 
|    scoped_refptr<DisplayListRasterSource> raster_source_;
 | 
|    gfx::Rect content_rect_;
 | 
|    gfx::Rect invalid_content_rect_;
 | 
| @@ -149,9 +126,7 @@ class RasterTaskImpl : public RasterTask {
 | 
|    uint64_t previous_content_id_;
 | 
|    uint64_t resource_content_id_;
 | 
|    int source_frame_number_;
 | 
| -  bool analyze_picture_;
 | 
| -  const base::Callback<void(const DisplayListRasterSource::SolidColorAnalysis&,
 | 
| -                            bool)> reply_;
 | 
| +  const base::Callback<void(bool)> reply_;
 | 
|    scoped_ptr<RasterBuffer> raster_buffer_;
 | 
|  
 | 
|    DISALLOW_COPY_AND_ASSIGN(RasterTaskImpl);
 | 
| @@ -593,6 +568,23 @@ void TileManager::AssignGpuMemoryToTiles(
 | 
|        break;
 | 
|      }
 | 
|  
 | 
| +    if (tile->use_picture_analysis() && kUseColorEstimator) {
 | 
| +      // We analyze for solid color here, to decide to continue
 | 
| +      // or drop the tile for scheduling and raster.
 | 
| +      // TODO(sohanjg): Check if we could use a shared analysis
 | 
| +      // canvas which is reset between tiles.
 | 
| +      SkColor color = SK_ColorTRANSPARENT;
 | 
| +      bool is_solid_color =
 | 
| +          prioritized_tile.raster_source()->PerformSolidColorAnalysis(
 | 
| +              tile->content_rect(), tile->contents_scale(), &color);
 | 
| +      if (is_solid_color) {
 | 
| +        tile->draw_info().set_solid_color(color);
 | 
| +        tile->draw_info().set_was_ever_ready_to_draw();
 | 
| +        client_->NotifyTileStateChanged(tile);
 | 
| +        continue;
 | 
| +      }
 | 
| +    }
 | 
| +
 | 
|      // We won't be able to schedule this tile, so break out early.
 | 
|      if (tiles_that_need_to_be_rasterized->size() >=
 | 
|          scheduled_raster_task_limit) {
 | 
| @@ -826,7 +818,6 @@ scoped_refptr<RasterTask> TileManager::CreateRasterTask(
 | 
|        prioritized_tile.priority().resolution, tile->layer_id(),
 | 
|        prepare_tiles_count_, static_cast<const void*>(tile), tile->id(),
 | 
|        tile->invalidated_id(), resource_content_id, tile->source_frame_number(),
 | 
| -      tile->use_picture_analysis(),
 | 
|        base::Bind(&TileManager::OnRasterTaskCompleted, base::Unretained(this),
 | 
|                   tile->id(), resource),
 | 
|        &decode_tasks));
 | 
| @@ -835,11 +826,11 @@ scoped_refptr<RasterTask> TileManager::CreateRasterTask(
 | 
|  void TileManager::OnRasterTaskCompleted(
 | 
|      Tile::Id tile_id,
 | 
|      Resource* resource,
 | 
| -    const DisplayListRasterSource::SolidColorAnalysis& analysis,
 | 
|      bool was_canceled) {
 | 
|    DCHECK(tiles_.find(tile_id) != tiles_.end());
 | 
|  
 | 
|    Tile* tile = tiles_[tile_id];
 | 
| +  TileDrawInfo& draw_info = tile->draw_info();
 | 
|    DCHECK(tile->raster_task_.get());
 | 
|    orphan_tasks_.push_back(tile->raster_task_);
 | 
|    tile->raster_task_ = nullptr;
 | 
| @@ -854,32 +845,12 @@ void TileManager::OnRasterTaskCompleted(
 | 
|      return;
 | 
|    }
 | 
|  
 | 
| -  UpdateTileDrawInfo(tile, resource, analysis);
 | 
| -}
 | 
| -
 | 
| -void TileManager::UpdateTileDrawInfo(
 | 
| -    Tile* tile,
 | 
| -    Resource* resource,
 | 
| -    const DisplayListRasterSource::SolidColorAnalysis& analysis) {
 | 
| -  TileDrawInfo& draw_info = tile->draw_info();
 | 
| -
 | 
|    ++flush_stats_.completed_count;
 | 
|  
 | 
| -  if (analysis.is_solid_color) {
 | 
| -    draw_info.set_solid_color(analysis.solid_color);
 | 
| -    if (resource) {
 | 
| -      // TODO(ericrk): If more partial raster work is done in the future, it may
 | 
| -      // be worth returning the resource to the pool with its previous ID (not
 | 
| -      // currently tracked). crrev.com/1370333002/#ps40001 has a possible method
 | 
| -      // of achieving this.
 | 
| -      resource_pool_->ReleaseResource(resource, 0 /* content_id */);
 | 
| -    }
 | 
| -  } else {
 | 
| -    DCHECK(resource);
 | 
| -    draw_info.set_use_resource();
 | 
| -    draw_info.resource_ = resource;
 | 
| -    draw_info.contents_swizzled_ = DetermineResourceRequiresSwizzle(tile);
 | 
| -  }
 | 
| +  draw_info.set_use_resource();
 | 
| +  draw_info.resource_ = resource;
 | 
| +  draw_info.contents_swizzled_ = DetermineResourceRequiresSwizzle(tile);
 | 
| +
 | 
|    DCHECK(draw_info.IsReadyToDraw());
 | 
|    draw_info.set_was_ever_ready_to_draw();
 | 
|  
 | 
| 
 |