| Index: cc/output/software_renderer.cc
|
| diff --git a/cc/output/software_renderer.cc b/cc/output/software_renderer.cc
|
| index 4c9a168118c8b9f799fb0f4b1289614662a50c72..2131ecba0386dd5b3f5d309eb2862a1d9596353a 100644
|
| --- a/cc/output/software_renderer.cc
|
| +++ b/cc/output/software_renderer.cc
|
| @@ -470,15 +470,17 @@ void SoftwareRenderer::DrawRenderPassQuad(const DrawingFrame* frame,
|
| 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()));
|
| - if (filter) {
|
| + const FilterOperations* filters = FiltersForPass(quad->render_pass_id);
|
| + if (filters) {
|
| + DCHECK(!filters->IsEmpty());
|
| + sk_sp<SkImageFilter> image_filter = RenderSurfaceFilters::BuildImageFilter(
|
| + *filters, gfx::SizeF(content_texture->size()));
|
| + if (image_filter) {
|
| SkIRect result_rect;
|
| // 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, &result_rect);
|
| + ApplyImageFilter(image_filter.get(), quad, *content, &result_rect);
|
| if (result_rect.isEmpty()) {
|
| return;
|
| }
|
| @@ -588,9 +590,11 @@ void SoftwareRenderer::DidChangeVisibility() {
|
| }
|
|
|
| bool SoftwareRenderer::ShouldApplyBackgroundFilters(
|
| - const RenderPassDrawQuad* quad) const {
|
| - if (quad->background_filters.IsEmpty())
|
| + const RenderPassDrawQuad* quad,
|
| + const FilterOperations* background_filters) const {
|
| + if (!background_filters)
|
| return false;
|
| + DCHECK(!background_filters->IsEmpty());
|
|
|
| // TODO(hendrikw): Look into allowing background filters to see pixels from
|
| // other render targets. See crbug.com/314867.
|
| @@ -654,15 +658,15 @@ gfx::Rect SoftwareRenderer::GetBackdropBoundingBoxForRenderPassQuad(
|
| const DrawingFrame* frame,
|
| const RenderPassDrawQuad* quad,
|
| const gfx::Transform& contents_device_transform,
|
| + const FilterOperations* background_filters,
|
| gfx::Rect* unclipped_rect) const {
|
| - DCHECK(ShouldApplyBackgroundFilters(quad));
|
| + DCHECK(ShouldApplyBackgroundFilters(quad, background_filters));
|
| gfx::Rect backdrop_rect = gfx::ToEnclosingRect(
|
| MathUtil::MapClippedRect(contents_device_transform, QuadVertexRect()));
|
|
|
| SkMatrix matrix;
|
| matrix.setScale(quad->filters_scale.x(), quad->filters_scale.y());
|
| - backdrop_rect =
|
| - quad->background_filters.MapRectReverse(backdrop_rect, matrix);
|
| + backdrop_rect = background_filters->MapRectReverse(backdrop_rect, matrix);
|
|
|
| *unclipped_rect = backdrop_rect;
|
| backdrop_rect.Intersect(MoveFromDrawToWindowSpace(
|
| @@ -675,7 +679,9 @@ sk_sp<SkShader> SoftwareRenderer::GetBackgroundFilterShader(
|
| const DrawingFrame* frame,
|
| const RenderPassDrawQuad* quad,
|
| SkShader::TileMode content_tile_mode) const {
|
| - if (!ShouldApplyBackgroundFilters(quad))
|
| + const FilterOperations* background_filters =
|
| + BackgroundFiltersForPass(quad->render_pass_id);
|
| + if (!ShouldApplyBackgroundFilters(quad, background_filters))
|
| return nullptr;
|
|
|
| gfx::Transform quad_rect_matrix;
|
| @@ -688,7 +694,8 @@ sk_sp<SkShader> SoftwareRenderer::GetBackgroundFilterShader(
|
|
|
| gfx::Rect unclipped_rect;
|
| gfx::Rect backdrop_rect = GetBackdropBoundingBoxForRenderPassQuad(
|
| - frame, quad, contents_device_transform, &unclipped_rect);
|
| + frame, quad, contents_device_transform, background_filters,
|
| + &unclipped_rect);
|
|
|
| // Figure out the transformations to move it back to pixel space.
|
| gfx::Transform contents_device_transform_inverse;
|
| @@ -706,7 +713,7 @@ sk_sp<SkShader> SoftwareRenderer::GetBackgroundFilterShader(
|
| (unclipped_rect.top_right() - backdrop_rect.top_right()) +
|
| (backdrop_rect.bottom_left() - unclipped_rect.bottom_left());
|
| sk_sp<SkImageFilter> filter = RenderSurfaceFilters::BuildImageFilter(
|
| - quad->background_filters,
|
| + *background_filters,
|
| gfx::SizeF(backdrop_bitmap.width(), backdrop_bitmap.height()),
|
| clipping_offset);
|
| sk_sp<SkImage> filter_backdrop_image =
|
|
|