| 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());
|
| }
|
|
|
|
|