Index: cc/output/gl_renderer.cc |
diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc |
index d14feb6abf50053380bb4785909a3e12352e71bf..e039947695c967740fc7ba88ba0e7df11abea869 100644 |
--- a/cc/output/gl_renderer.cc |
+++ b/cc/output/gl_renderer.cc |
@@ -36,10 +36,10 @@ |
#include "third_party/skia/include/core/SkBitmap.h" |
#include "third_party/skia/include/core/SkColor.h" |
#include "third_party/skia/include/core/SkColorFilter.h" |
+#include "third_party/skia/include/core/SkImage.h" |
#include "third_party/skia/include/core/SkSurface.h" |
#include "third_party/skia/include/gpu/GrContext.h" |
#include "third_party/skia/include/gpu/GrTexture.h" |
-#include "third_party/skia/include/gpu/SkGpuDevice.h" |
#include "third_party/skia/include/gpu/SkGrTexturePixelRef.h" |
#include "third_party/skia/include/gpu/gl/GrGLInterface.h" |
#include "ui/gfx/geometry/quad_f.h" |
@@ -610,7 +610,7 @@ |
GLC(gl_, gl_->DrawElements(GL_LINE_LOOP, 4, GL_UNSIGNED_SHORT, 0)); |
} |
-static SkBitmap ApplyImageFilter( |
+static skia::RefPtr<SkImage> ApplyImageFilter( |
scoped_ptr<GLRenderer::ScopedUseGrContext> use_gr_context, |
ResourceProvider* resource_provider, |
const gfx::Point& origin, |
@@ -618,10 +618,10 @@ |
SkImageFilter* filter, |
ScopedResource* source_texture_resource) { |
if (!filter) |
- return SkBitmap(); |
+ return skia::RefPtr<SkImage>(); |
if (!use_gr_context) |
- return SkBitmap(); |
+ return skia::RefPtr<SkImage>(); |
ResourceProvider::ScopedReadLockGL lock(resource_provider, |
source_texture_resource->id()); |
@@ -664,36 +664,40 @@ |
TRACE_EVENT_INSTANT0("cc", |
"ApplyImageFilter scratch texture allocation failed", |
TRACE_EVENT_SCOPE_THREAD); |
- return SkBitmap(); |
- } |
- |
- // Create a device and canvas using that backing store. |
- skia::RefPtr<SkGpuDevice> device = |
- skia::AdoptRef(SkGpuDevice::Create(backing_store->asRenderTarget())); |
- DCHECK(device.get()); |
- SkCanvas canvas(device.get()); |
+ return skia::RefPtr<SkImage>(); |
+ } |
+ |
+ // Create surface to draw into. |
+ skia::RefPtr<SkSurface> surface = skia::AdoptRef( |
+ SkSurface::NewRenderTargetDirect(backing_store->asRenderTarget())); |
+ skia::RefPtr<SkCanvas> canvas = skia::SharePtr(surface->getCanvas()); |
// Draw the source bitmap through the filter to the canvas. |
SkPaint paint; |
paint.setImageFilter(filter); |
- canvas.clear(SK_ColorTRANSPARENT); |
- |
- canvas.translate(SkIntToScalar(-origin.x()), SkIntToScalar(-origin.y())); |
- canvas.scale(scale.x(), scale.y()); |
- canvas.drawSprite(source, 0, 0, &paint); |
+ canvas->clear(SK_ColorTRANSPARENT); |
+ |
+ canvas->translate(SkIntToScalar(-origin.x()), SkIntToScalar(-origin.y())); |
+ canvas->scale(scale.x(), scale.y()); |
+ canvas->drawSprite(source, 0, 0, &paint); |
+ |
+ skia::RefPtr<SkImage> image = skia::AdoptRef(surface->newImageSnapshot()); |
+ if (!image || !image->getTexture()) { |
+ return skia::RefPtr<SkImage>(); |
+ } |
// Flush the GrContext to ensure all buffered GL calls are drawn to the |
// backing store before we access and return it, and have cc begin using the |
// GL context again. |
- use_gr_context->context()->flush(); |
- |
- return device->accessBitmap(false); |
-} |
- |
-static SkBitmap ApplyBlendModeWithBackdrop( |
+ canvas->flush(); |
+ |
+ return image; |
+} |
+ |
+static skia::RefPtr<SkImage> ApplyBlendModeWithBackdrop( |
scoped_ptr<GLRenderer::ScopedUseGrContext> use_gr_context, |
ResourceProvider* resource_provider, |
- SkBitmap source_bitmap_with_filters, |
+ skia::RefPtr<SkImage> source_bitmap_with_filters, |
ScopedResource* source_texture_resource, |
ScopedResource* background_texture_resource, |
SkXfermode::Mode blend_mode) { |
@@ -711,11 +715,11 @@ |
int source_texture_with_filters_id; |
scoped_ptr<ResourceProvider::ScopedReadLockGL> lock; |
- if (source_bitmap_with_filters.getTexture()) { |
- DCHECK_EQ(source_size.width(), source_bitmap_with_filters.width()); |
- DCHECK_EQ(source_size.height(), source_bitmap_with_filters.height()); |
+ if (source_bitmap_with_filters) { |
+ DCHECK_EQ(source_size.width(), source_bitmap_with_filters->width()); |
+ DCHECK_EQ(source_size.height(), source_bitmap_with_filters->height()); |
GrTexture* texture = |
- reinterpret_cast<GrTexture*>(source_bitmap_with_filters.getTexture()); |
+ reinterpret_cast<GrTexture*>(source_bitmap_with_filters->getTexture()); |
source_texture_with_filters_id = texture->getTextureHandle(); |
} else { |
lock.reset(new ResourceProvider::ScopedReadLockGL( |
@@ -785,24 +789,30 @@ |
} |
// Create a device and canvas using that backing store. |
- skia::RefPtr<SkGpuDevice> device = |
- skia::AdoptRef(SkGpuDevice::Create(backing_store->asRenderTarget())); |
- DCHECK(device.get()); |
- SkCanvas canvas(device.get()); |
+ skia::RefPtr<SkSurface> surface = skia::AdoptRef( |
+ SkSurface::NewRenderTargetDirect(backing_store->asRenderTarget())); |
+ if (!surface) |
+ return skia::RefPtr<SkImage>(); |
+ skia::RefPtr<SkCanvas> canvas = skia::SharePtr(surface->getCanvas()); |
// Draw the source bitmap through the filter to the canvas. |
- canvas.clear(SK_ColorTRANSPARENT); |
- canvas.drawSprite(background, 0, 0); |
+ canvas->clear(SK_ColorTRANSPARENT); |
+ canvas->drawSprite(background, 0, 0); |
SkPaint paint; |
paint.setXfermodeMode(blend_mode); |
- canvas.drawSprite(source, 0, 0, &paint); |
+ canvas->drawSprite(source, 0, 0, &paint); |
+ |
+ skia::RefPtr<SkImage> image = skia::AdoptRef(surface->newImageSnapshot()); |
+ if (!image || !image->getTexture()) { |
+ return skia::RefPtr<SkImage>(); |
+ } |
// Flush the GrContext to ensure all buffered GL calls are drawn to the |
// backing store before we access and return it, and have cc begin using the |
// GL context again. |
- use_gr_context->context()->flush(); |
- |
- return device->accessBitmap(false); |
+ canvas->flush(); |
+ |
+ return image; |
} |
scoped_ptr<ScopedResource> GLRenderer::GetBackgroundWithFilters( |
@@ -873,7 +883,7 @@ |
skia::RefPtr<SkImageFilter> filter = RenderSurfaceFilters::BuildImageFilter( |
quad->background_filters, device_background_texture->size()); |
- SkBitmap filtered_device_background; |
+ skia::RefPtr<SkImage> filtered_device_background; |
if (apply_background_filters) { |
filtered_device_background = |
ApplyImageFilter(ScopedUseGrContext::Create(this, frame), |
@@ -883,13 +893,12 @@ |
filter.get(), |
device_background_texture.get()); |
} |
- *background_changed = (filtered_device_background.getTexture() != NULL); |
+ *background_changed = (filtered_device_background != NULL); |
int filtered_device_background_texture_id = 0; |
scoped_ptr<ResourceProvider::ScopedReadLockGL> lock; |
- if (filtered_device_background.getTexture()) { |
- GrTexture* texture = |
- reinterpret_cast<GrTexture*>(filtered_device_background.getTexture()); |
+ if (filtered_device_background) { |
+ GrTexture* texture = filtered_device_background->getTexture(); |
filtered_device_background_texture_id = texture->getTextureHandle(); |
} else { |
lock.reset(new ResourceProvider::ScopedReadLockGL( |
@@ -988,7 +997,7 @@ |
// TODO(senorblanco): Cache this value so that we don't have to do it for both |
// the surface and its replica. Apply filters to the contents texture. |
- SkBitmap filter_bitmap; |
+ skia::RefPtr<SkImage> filter_bitmap; |
SkScalar color_matrix[20]; |
bool use_color_matrix = false; |
if (!quad->filters.IsEmpty()) { |
@@ -1076,9 +1085,8 @@ |
// this draw instead of having a separate copy of the background texture. |
scoped_ptr<ResourceProvider::ScopedSamplerGL> contents_resource_lock; |
- if (filter_bitmap.getTexture()) { |
- GrTexture* texture = |
- reinterpret_cast<GrTexture*>(filter_bitmap.getTexture()); |
+ if (filter_bitmap) { |
+ GrTexture* texture = filter_bitmap->getTexture(); |
DCHECK_EQ(GL_TEXTURE0, GetActiveTextureUnit(gl_)); |
gl_->BindTexture(GL_TEXTURE_2D, texture->getTextureHandle()); |
} else { |
@@ -1333,7 +1341,7 @@ |
// Flush the compositor context before the filter bitmap goes out of |
// scope, so the draw gets processed before the filter texture gets deleted. |
- if (filter_bitmap.getTexture()) |
+ if (filter_bitmap) |
GLC(gl_, gl_->Flush()); |
} |