Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2812)

Unified Diff: cc/output/gl_renderer.cc

Issue 1980613003: cc: correctly fix edge-AA for filtered render surfaces. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix typo Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: cc/output/gl_renderer.cc
diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc
index bc35463d638258bd480bcdb9675796d2a258805d..1c33fe663f15adfcab6193ea2b8b2809165fce21 100644
--- a/cc/output/gl_renderer.cc
+++ b/cc/output/gl_renderer.cc
@@ -899,10 +899,13 @@ void GLRenderer::DrawRenderPassQuad(DrawingFrame* frame,
DCHECK(contents_texture);
DCHECK(contents_texture->id());
+ SkMatrix scale_matrix;
+ scale_matrix.setScale(quad->filters_scale.x(), quad->filters_scale.y());
+ gfx::RectF dst_rect(quad->filters.MapRect(quad->rect, scale_matrix));
gfx::Transform quad_rect_matrix;
QuadRectTransform(&quad_rect_matrix,
quad->shared_quad_state->quad_to_target_transform,
- gfx::RectF(quad->rect));
+ dst_rect);
gfx::Transform contents_device_transform =
frame->window_matrix * frame->projection_matrix * quad_rect_matrix;
contents_device_transform.FlattenTo2d();
@@ -1016,21 +1019,6 @@ void GLRenderer::DrawRenderPassQuad(DrawingFrame* frame,
filter = sk_ref_sp(filter->getInput(0));
}
if (filter) {
- gfx::Vector2dF scale = quad->filters_scale;
- SkMatrix scale_matrix;
- scale_matrix.setScale(scale.x(), scale.y());
- SkIRect result_rect =
- filter->filterBounds(gfx::RectToSkIRect(quad->rect), scale_matrix,
- SkImageFilter::kForward_MapDirection);
- gfx::RectF dst_rect = gfx::SkRectToRectF(SkRect::Make(result_rect));
- // If the destination rect is not the same as the source rect, the edges
- // previously computed for AA will be wrong. Rather than recompute them
- // here, disable antialiasing and use a 1-pixel transparent
- // border to achieve a similar effect.
- if (use_aa && dst_rect != rect) {
- dst_rect.Inset(-1.0f, -1.0f);
- use_aa = false;
- }
gfx::Rect clip_rect = quad->shared_quad_state->clip_rect;
if (clip_rect.IsEmpty()) {
clip_rect = current_draw_rect_;
@@ -1050,14 +1038,14 @@ void GLRenderer::DrawRenderPassQuad(DrawingFrame* frame,
RoundUpToPow2(&dst_rect);
filter_image = ApplyImageFilter(
ScopedUseGrContext::Create(this, frame), resource_provider_, rect,
- dst_rect, scale, std::move(filter), contents_texture);
- if (filter_image) {
- filter_image_id = skia::GrBackendObjectToGrGLTextureInfo(
- filter_image->getTextureHandle(true))
- ->fID;
- DCHECK(filter_image_id);
- rect = dst_rect;
+ dst_rect, quad->filters_scale, std::move(filter), contents_texture);
+ if (!filter_image) {
+ return;
}
+ filter_image_id = skia::GrBackendObjectToGrGLTextureInfo(
+ filter_image->getTextureHandle(true))
+ ->fID;
+ DCHECK(filter_image_id);
}
}
}
@@ -1276,7 +1264,7 @@ void GLRenderer::DrawRenderPassQuad(DrawingFrame* frame,
SetShaderOpacity(quad->shared_quad_state->opacity, locations.alpha);
SetShaderQuadF(surface_quad, locations.quad);
DrawQuadGeometry(frame, quad->shared_quad_state->quad_to_target_transform,
- rect, locations.matrix);
+ dst_rect, locations.matrix);
// Flush the compositor context before the filter bitmap goes out of
// scope, so the draw gets processed before the filter texture gets deleted.

Powered by Google App Engine
This is Rietveld 408576698