| Index: cc/resources/raster_worker_pool.cc
|
| diff --git a/cc/resources/raster_worker_pool.cc b/cc/resources/raster_worker_pool.cc
|
| index 15b8aa41133312b094cec77d073ab1c5c954e41f..92ae4aec991800f0422bd864182519159578d888 100644
|
| --- a/cc/resources/raster_worker_pool.cc
|
| +++ b/cc/resources/raster_worker_pool.cc
|
| @@ -11,13 +11,28 @@
|
| #include "cc/debug/devtools_instrumentation.h"
|
| #include "cc/debug/traced_value.h"
|
| #include "cc/resources/picture_pile_impl.h"
|
| +#include "cc/resources/resource_provider.h"
|
| #include "skia/ext/lazy_pixel_ref.h"
|
| #include "skia/ext/paint_simplifier.h"
|
| +#include "third_party/skia/include/core/SkBitmap.h"
|
|
|
| namespace cc {
|
|
|
| namespace {
|
|
|
| +// Subclass of Allocator that takes a suitably allocated pointer and uses
|
| +// it as the pixel memory for the bitmap.
|
| +class IdentityAllocator : public SkBitmap::Allocator {
|
| + public:
|
| + explicit IdentityAllocator(void* buffer) : buffer_(buffer) {}
|
| + virtual bool allocPixelRef(SkBitmap* dst, SkColorTable*) OVERRIDE {
|
| + dst->setPixels(buffer_);
|
| + return true;
|
| + }
|
| + private:
|
| + void* buffer_;
|
| +};
|
| +
|
| // Flag to indicate whether we should try and detect that
|
| // a tile is of solid color.
|
| const bool kUseColorEstimator = true;
|
| @@ -34,6 +49,32 @@ class DisableLCDTextFilter : public SkDrawFilter {
|
| }
|
| };
|
|
|
| +SkBitmap::Config SkBitmapConfigFromFormat(ResourceProvider::Format format) {
|
| + switch (format) {
|
| + case ResourceProvider::RGBA_4444:
|
| + return SkBitmap::kARGB_4444_Config;
|
| + case ResourceProvider::RGBA_8888:
|
| + case ResourceProvider::BGRA_8888:
|
| + return SkBitmap::kARGB_8888_Config;
|
| + case ResourceProvider::LUMINANCE_8:
|
| + NOTREACHED();
|
| + break;
|
| + }
|
| + NOTREACHED();
|
| + return SkBitmap::kARGB_8888_Config;
|
| +}
|
| +
|
| +void ChangeBitmapConfigIfPossible(const SkBitmap& bitmap,
|
| + void* buffer,
|
| + ResourceProvider::Format format) {
|
| + TRACE_EVENT0("cc", "ChangeBitmapConfig");
|
| + if (bitmap.getConfig() != SkBitmapConfigFromFormat(format)) {
|
| + SkBitmap bitmap_dest;
|
| + IdentityAllocator allocator(buffer);
|
| + bitmap.copyTo(&bitmap_dest, SkBitmapConfigFromFormat(format), &allocator);
|
| + }
|
| +}
|
| +
|
| class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask {
|
| public:
|
| RasterWorkerPoolTaskImpl(const Resource* resource,
|
| @@ -89,7 +130,10 @@ class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask {
|
| analysis_.is_solid_color &= kUseColorEstimator;
|
| }
|
|
|
| - bool RunRasterOnThread(SkBaseDevice* device, unsigned thread_index) {
|
| + bool RunRasterOnThread(unsigned thread_index,
|
| + void* buffer,
|
| + gfx::Size size,
|
| + int stride) {
|
| TRACE_EVENT2(
|
| benchmark_instrumentation::kCategory,
|
| benchmark_instrumentation::kRunRasterOnThread,
|
| @@ -102,7 +146,7 @@ class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask {
|
| devtools_instrumentation::kRasterTask, layer_id_);
|
|
|
| DCHECK(picture_pile_.get());
|
| - DCHECK(device);
|
| + DCHECK(buffer);
|
|
|
| if (analysis_.is_solid_color)
|
| return false;
|
| @@ -110,8 +154,31 @@ class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask {
|
| PicturePileImpl* picture_clone =
|
| picture_pile_->GetCloneForDrawingOnThread(thread_index);
|
|
|
| - SkCanvas canvas(device);
|
| + SkBitmap bitmap;
|
| + switch (resource()->format()) {
|
| + case ResourceProvider::RGBA_4444:
|
| + // Use the default stride if we will eventually convert this
|
| + // bitmap to 4444.
|
| + bitmap.setConfig(SkBitmap::kARGB_8888_Config,
|
| + size.width(),
|
| + size.height());
|
| + bitmap.allocPixels();
|
| + break;
|
| + case ResourceProvider::RGBA_8888:
|
| + case ResourceProvider::BGRA_8888:
|
| + bitmap.setConfig(SkBitmap::kARGB_8888_Config,
|
| + size.width(),
|
| + size.height(),
|
| + stride);
|
| + bitmap.setPixels(buffer);
|
| + break;
|
| + case ResourceProvider::LUMINANCE_8:
|
| + NOTREACHED();
|
| + break;
|
| + }
|
|
|
| + SkBitmapDevice device(bitmap);
|
| + SkCanvas canvas(&device);
|
| skia::RefPtr<SkDrawFilter> draw_filter;
|
| switch (raster_mode_) {
|
| case LOW_QUALITY_RASTER_MODE:
|
| @@ -149,14 +216,20 @@ class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask {
|
| picture_clone->RasterToBitmap(
|
| &canvas, content_rect_, contents_scale_, NULL);
|
| }
|
| +
|
| + ChangeBitmapConfigIfPossible(bitmap, buffer, resource()->format());
|
| +
|
| return true;
|
| }
|
|
|
| // Overridden from internal::RasterWorkerPoolTask:
|
| - virtual bool RunOnWorkerThread(SkBaseDevice* device, unsigned thread_index)
|
| + virtual bool RunOnWorkerThread(unsigned thread_index,
|
| + void* buffer,
|
| + gfx::Size size,
|
| + int stride)
|
| OVERRIDE {
|
| RunAnalysisOnThread(thread_index);
|
| - return RunRasterOnThread(device, thread_index);
|
| + return RunRasterOnThread(thread_index, buffer, size, stride);
|
| }
|
| virtual void CompleteOnOriginThread() OVERRIDE {
|
| reply_.Run(analysis_, !HasFinishedRunning() || WasCanceled());
|
|
|