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

Unified Diff: cc/output/software_renderer.cc

Issue 1942863002: cc: fix pixel-moving filter effects on a rotated layer. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix comment Created 4 years, 8 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
« no previous file with comments | « cc/output/software_renderer.h ('k') | cc/test/data/rotated_drop_shadow_filter_gl.png » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/output/software_renderer.cc
diff --git a/cc/output/software_renderer.cc b/cc/output/software_renderer.cc
index 4753f54b3c529f4eeb49681e6296b1bb1e3d5a6c..673f58c9f687a9957ce1d3a91d1c69f244ce822c 100644
--- a/cc/output/software_renderer.cc
+++ b/cc/output/software_renderer.cc
@@ -492,21 +492,33 @@ void SoftwareRenderer::DrawRenderPassQuad(const DrawingFrame* frame,
gfx::RectF(quad->visible_rect)));
SkRect content_rect = SkRect::MakeWH(quad->rect.width(), quad->rect.height());
- SkMatrix content_mat;
- content_mat.setRectToRect(content_rect, dest_rect,
- SkMatrix::kFill_ScaleToFit);
-
const SkBitmap* content = lock.sk_bitmap();
sk_sp<SkImage> filter_image;
if (!quad->filters.IsEmpty()) {
sk_sp<SkImageFilter> filter = RenderSurfaceFilters::BuildImageFilter(
quad->filters, gfx::SizeF(content_texture->size()));
+ SkMatrix localM;
+ localM.setScale(quad->filters_scale.x(), quad->filters_scale.y());
+ SkIRect result_rect =
+ filter->filterBounds(gfx::RectToSkIRect(quad->rect), localM,
+ SkImageFilter::kForward_MapDirection);
// TODO(ajuma): Apply the filter in the same pass as the content where
// possible (e.g. when there's no origin offset). See crbug.com/308201.
- filter_image = ApplyImageFilter(filter.get(), quad, content);
+ filter_image = ApplyImageFilter(filter.get(), quad, result_rect, content);
+ if (filter_image) {
+ gfx::RectF rect = gfx::SkRectToRectF(SkRect::Make(result_rect));
+ dest_rect = dest_visible_rect =
+ gfx::RectFToSkRect(MathUtil::ScaleRectProportional(
+ QuadVertexRect(), gfx::RectF(quad->rect), rect));
+ content_rect = SkRect::MakeWH(result_rect.width(), result_rect.height());
+ }
}
+ SkMatrix content_mat;
+ content_mat.setRectToRect(content_rect, dest_rect,
+ SkMatrix::kFill_ScaleToFit);
+
sk_sp<SkShader> shader;
if (!filter_image) {
shader =
@@ -631,22 +643,23 @@ bool SoftwareRenderer::ShouldApplyBackgroundFilters(
sk_sp<SkImage> SoftwareRenderer::ApplyImageFilter(
SkImageFilter* filter,
const RenderPassDrawQuad* quad,
+ const SkIRect& dst_rect,
const SkBitmap* to_filter) const {
if (!filter)
return nullptr;
SkImageInfo dst_info =
- SkImageInfo::MakeN32Premul(to_filter->width(), to_filter->height());
+ SkImageInfo::MakeN32Premul(dst_rect.width(), dst_rect.height());
sk_sp<SkSurface> surface = SkSurface::MakeRaster(dst_info);
- SkMatrix localM;
- localM.setTranslate(SkIntToScalar(-quad->rect.origin().x()),
- SkIntToScalar(-quad->rect.origin().y()));
- localM.preScale(quad->filters_scale.x(), quad->filters_scale.y());
+ SkMatrix local_matrix;
+ local_matrix.setScale(quad->filters_scale.x(), quad->filters_scale.y());
SkPaint paint;
- paint.setImageFilter(filter->makeWithLocalMatrix(localM));
- surface->getCanvas()->drawBitmap(*to_filter, 0, 0, &paint);
+ paint.setImageFilter(filter->makeWithLocalMatrix(local_matrix));
+ surface->getCanvas()->translate(-dst_rect.x(), -dst_rect.y());
+ surface->getCanvas()->drawBitmap(*to_filter, quad->rect.x(), quad->rect.y(),
+ &paint);
return surface->makeImageSnapshot();
}
@@ -711,8 +724,8 @@ sk_sp<SkShader> SoftwareRenderer::GetBackgroundFilterShader(
sk_sp<SkImageFilter> filter = RenderSurfaceFilters::BuildImageFilter(
quad->background_filters,
gfx::SizeF(backdrop_bitmap.width(), backdrop_bitmap.height()));
- sk_sp<SkImage> filter_backdrop_image =
- ApplyImageFilter(filter.get(), quad, &backdrop_bitmap);
+ sk_sp<SkImage> filter_backdrop_image = ApplyImageFilter(
+ filter.get(), quad, backdrop_bitmap.bounds(), &backdrop_bitmap);
if (!filter_backdrop_image)
return nullptr;
« no previous file with comments | « cc/output/software_renderer.h ('k') | cc/test/data/rotated_drop_shadow_filter_gl.png » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698