// Copyright 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "cc/raster_worker_pool.h"

#include "cc/picture_pile_impl.h"

namespace cc {

namespace {

class RasterWorkerPoolTaskImpl : public internal::WorkerPoolTask {
 public:
  RasterWorkerPoolTaskImpl(PicturePileImpl* picture_pile,
                           const RasterWorkerPool::RasterCallback& task,
                           const base::Closure& reply)
      : internal::WorkerPoolTask(reply),
        picture_pile_(picture_pile),
        task_(task) {
    DCHECK(picture_pile_);
  }

  virtual void Run(RenderingStats* rendering_stats) OVERRIDE {
    task_.Run(picture_pile_.get(), rendering_stats);
  }

 private:
  scoped_refptr<PicturePileImpl> picture_pile_;
  RasterWorkerPool::RasterCallback task_;
};

}  // namespace

RasterWorkerPool::RasterWorkerPool(
    size_t num_threads, bool record_rendering_stats)
    : WorkerPool(num_threads, record_rendering_stats) {
}

RasterWorkerPool::~RasterWorkerPool() {
}

void RasterWorkerPool::PostRasterTaskAndReply(PicturePileImpl* picture_pile,
                                              const RasterCallback& task,
                                              const base::Closure& reply) {
  Worker* worker = GetWorkerForNextTask();

  scoped_refptr<PicturePileImpl> picture_pile_clone =
      picture_pile->GetCloneForDrawingOnThread(worker);

  worker->PostTask(
      make_scoped_ptr(new RasterWorkerPoolTaskImpl(
                          picture_pile_clone.get(),
                          task,
                          reply)).PassAs<internal::WorkerPoolTask>());
}

}  // namespace cc
