| Index: cc/output/gl_renderer.cc
|
| diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc
|
| index 5a15efa89fd9d3587b53d491c9b175b592bb7f34..2612f10e98f17b7472f9ef31a04f70fcc1689538 100644
|
| --- a/cc/output/gl_renderer.cc
|
| +++ b/cc/output/gl_renderer.cc
|
| @@ -624,7 +624,7 @@ void GLRenderer::DrawDebugBorderQuad(const DrawingFrame* frame,
|
| static skia::RefPtr<SkImage> ApplyImageFilter(
|
| scoped_ptr<GLRenderer::ScopedUseGrContext> use_gr_context,
|
| ResourceProvider* resource_provider,
|
| - const gfx::Point& origin,
|
| + const gfx::Rect& rect,
|
| const gfx::Vector2dF& scale,
|
| SkImageFilter* filter,
|
| ScopedResource* source_texture_resource) {
|
| @@ -693,7 +693,12 @@ static skia::RefPtr<SkImage> ApplyImageFilter(
|
| paint.setImageFilter(filter);
|
| canvas->clear(SK_ColorTRANSPARENT);
|
|
|
| - canvas->translate(SkIntToScalar(-origin.x()), SkIntToScalar(-origin.y()));
|
| + // The origin of the filter is top-left and the origin of the source is
|
| + // bottom-left, but the orientation is the same, so we must translate the
|
| + // filter so that it renders at the bottom of the texture to avoid
|
| + // misregistration.
|
| + int y_translate = source.height() - rect.height() - rect.origin().y();
|
| + canvas->translate(-rect.origin().x(), y_translate);
|
| canvas->scale(scale.x(), scale.y());
|
| canvas->drawSprite(source, 0, 0, &paint);
|
|
|
| @@ -858,13 +863,9 @@ skia::RefPtr<SkImage> GLRenderer::ApplyBackgroundFilters(
|
| skia::RefPtr<SkImageFilter> filter = RenderSurfaceFilters::BuildImageFilter(
|
| quad->background_filters, background_texture->size());
|
|
|
| - skia::RefPtr<SkImage> background_with_filters =
|
| - ApplyImageFilter(ScopedUseGrContext::Create(this, frame),
|
| - resource_provider_,
|
| - quad->rect.origin(),
|
| - quad->filters_scale,
|
| - filter.get(),
|
| - background_texture);
|
| + skia::RefPtr<SkImage> background_with_filters = ApplyImageFilter(
|
| + ScopedUseGrContext::Create(this, frame), resource_provider_, quad->rect,
|
| + quad->filters_scale, filter.get(), background_texture);
|
| return background_with_filters;
|
| }
|
|
|
| @@ -970,12 +971,9 @@ void GLRenderer::DrawRenderPassQuad(DrawingFrame* frame,
|
| // in the compositor.
|
| use_color_matrix = true;
|
| } else {
|
| - filter_image = ApplyImageFilter(ScopedUseGrContext::Create(this, frame),
|
| - resource_provider_,
|
| - quad->rect.origin(),
|
| - quad->filters_scale,
|
| - filter.get(),
|
| - contents_texture);
|
| + filter_image = ApplyImageFilter(
|
| + ScopedUseGrContext::Create(this, frame), resource_provider_,
|
| + quad->rect, quad->filters_scale, filter.get(), contents_texture);
|
| }
|
| }
|
| }
|
| @@ -2711,6 +2709,8 @@ bool GLRenderer::BindFramebufferToTexture(DrawingFrame* frame,
|
| const gfx::Rect& target_rect) {
|
| DCHECK(texture->id());
|
|
|
| + // Explicitly release lock, otherwise we can crash when try to lock
|
| + // same texture again.
|
| current_framebuffer_lock_ = nullptr;
|
|
|
| SetStencilEnabled(false);
|
|
|