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..25e1c75ca9b15c05d06e4daa1ee9a76f5f0e5d0a 100644 |
--- a/cc/resources/raster_worker_pool.cc |
+++ b/cc/resources/raster_worker_pool.cc |
@@ -13,11 +13,25 @@ |
#include "cc/resources/picture_pile_impl.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 +48,32 @@ class DisableLCDTextFilter : public SkDrawFilter { |
} |
}; |
+SkBitmap::Config SkBitmapConfigFromFormat(ResourceFormat format) { |
+ switch (format) { |
+ case RGBA_4444: |
+ return SkBitmap::kARGB_4444_Config; |
+ case RGBA_8888: |
+ case BGRA_8888: |
+ return SkBitmap::kARGB_8888_Config; |
+ case LUMINANCE_8: |
+ NOTREACHED(); |
+ break; |
+ } |
+ NOTREACHED(); |
+ return SkBitmap::kARGB_8888_Config; |
+} |
+ |
+void ChangeBitmapConfigIfPossible(const SkBitmap& bitmap, |
reveman
2013/09/14 00:58:39
IfRequired? IfNeeded?
kaanb
2013/09/16 07:22:25
Done.
|
+ void* buffer, |
+ ResourceFormat format) { |
+ TRACE_EVENT0("cc", "ChangeBitmapConfigIfPossible"); |
+ if (bitmap.getConfig() != SkBitmapConfigFromFormat(format)) { |
reveman
2013/09/14 00:58:39
nit: store SkBitmapConfigFromFormat result in temp
kaanb
2013/09/16 07:22:25
Done.
|
+ 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 +129,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 +145,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 +153,31 @@ class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { |
PicturePileImpl* picture_clone = |
picture_pile_->GetCloneForDrawingOnThread(thread_index); |
- SkCanvas canvas(device); |
+ SkBitmap bitmap; |
+ switch (resource()->format()) { |
+ case 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 RGBA_8888: |
+ case BGRA_8888: |
+ bitmap.setConfig(SkBitmap::kARGB_8888_Config, |
+ size.width(), |
+ size.height(), |
+ stride); |
+ bitmap.setPixels(buffer); |
+ break; |
+ case 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 +215,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()); |