Index: cc/output/gl_renderer.cc |
diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc |
index 15b2b4094446342de71d13be68421a0b93a3b340..a394a1adfe37f093ae0439057a14b1bdf5f42410 100644 |
--- a/cc/output/gl_renderer.cc |
+++ b/cc/output/gl_renderer.cc |
@@ -625,7 +625,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) { |
@@ -694,7 +694,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); |
@@ -859,13 +864,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; |
} |
@@ -971,12 +972,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); |
} |
} |
} |