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

Side by Side 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, 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 unified diff | 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 »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/output/software_renderer.h" 5 #include "cc/output/software_renderer.h"
6 6
7 #include "base/memory/ptr_util.h" 7 #include "base/memory/ptr_util.h"
8 #include "base/trace_event/trace_event.h" 8 #include "base/trace_event/trace_event.h"
9 #include "cc/base/math_util.h" 9 #include "cc/base/math_util.h"
10 #include "cc/output/compositor_frame.h" 10 #include "cc/output/compositor_frame.h"
(...skipping 474 matching lines...) Expand 10 before | Expand all | Expand 10 after
485 content_texture->id()); 485 content_texture->id());
486 if (!lock.valid()) 486 if (!lock.valid())
487 return; 487 return;
488 488
489 SkRect dest_rect = gfx::RectFToSkRect(QuadVertexRect()); 489 SkRect dest_rect = gfx::RectFToSkRect(QuadVertexRect());
490 SkRect dest_visible_rect = gfx::RectFToSkRect( 490 SkRect dest_visible_rect = gfx::RectFToSkRect(
491 MathUtil::ScaleRectProportional(QuadVertexRect(), gfx::RectF(quad->rect), 491 MathUtil::ScaleRectProportional(QuadVertexRect(), gfx::RectF(quad->rect),
492 gfx::RectF(quad->visible_rect))); 492 gfx::RectF(quad->visible_rect)));
493 SkRect content_rect = SkRect::MakeWH(quad->rect.width(), quad->rect.height()); 493 SkRect content_rect = SkRect::MakeWH(quad->rect.width(), quad->rect.height());
494 494
495 SkMatrix content_mat;
496 content_mat.setRectToRect(content_rect, dest_rect,
497 SkMatrix::kFill_ScaleToFit);
498
499 const SkBitmap* content = lock.sk_bitmap(); 495 const SkBitmap* content = lock.sk_bitmap();
500 496
501 sk_sp<SkImage> filter_image; 497 sk_sp<SkImage> filter_image;
502 if (!quad->filters.IsEmpty()) { 498 if (!quad->filters.IsEmpty()) {
503 sk_sp<SkImageFilter> filter = RenderSurfaceFilters::BuildImageFilter( 499 sk_sp<SkImageFilter> filter = RenderSurfaceFilters::BuildImageFilter(
504 quad->filters, gfx::SizeF(content_texture->size())); 500 quad->filters, gfx::SizeF(content_texture->size()));
501 SkMatrix localM;
502 localM.setScale(quad->filters_scale.x(), quad->filters_scale.y());
503 SkIRect result_rect =
504 filter->filterBounds(gfx::RectToSkIRect(quad->rect), localM,
505 SkImageFilter::kForward_MapDirection);
505 // TODO(ajuma): Apply the filter in the same pass as the content where 506 // TODO(ajuma): Apply the filter in the same pass as the content where
506 // possible (e.g. when there's no origin offset). See crbug.com/308201. 507 // possible (e.g. when there's no origin offset). See crbug.com/308201.
507 filter_image = ApplyImageFilter(filter.get(), quad, content); 508 filter_image = ApplyImageFilter(filter.get(), quad, result_rect, content);
509 if (filter_image) {
510 gfx::RectF rect = gfx::SkRectToRectF(SkRect::Make(result_rect));
511 dest_rect = dest_visible_rect =
512 gfx::RectFToSkRect(MathUtil::ScaleRectProportional(
513 QuadVertexRect(), gfx::RectF(quad->rect), rect));
514 content_rect = SkRect::MakeWH(result_rect.width(), result_rect.height());
515 }
508 } 516 }
509 517
518 SkMatrix content_mat;
519 content_mat.setRectToRect(content_rect, dest_rect,
520 SkMatrix::kFill_ScaleToFit);
521
510 sk_sp<SkShader> shader; 522 sk_sp<SkShader> shader;
511 if (!filter_image) { 523 if (!filter_image) {
512 shader = 524 shader =
513 SkShader::MakeBitmapShader(*content, SkShader::kClamp_TileMode, 525 SkShader::MakeBitmapShader(*content, SkShader::kClamp_TileMode,
514 SkShader::kClamp_TileMode, &content_mat); 526 SkShader::kClamp_TileMode, &content_mat);
515 } else { 527 } else {
516 shader = filter_image->makeShader(SkShader::kClamp_TileMode, 528 shader = filter_image->makeShader(SkShader::kClamp_TileMode,
517 SkShader::kClamp_TileMode, &content_mat); 529 SkShader::kClamp_TileMode, &content_mat);
518 } 530 }
519 531
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
624 636
625 // TODO(hendrikw): Look into allowing background filters to see pixels from 637 // TODO(hendrikw): Look into allowing background filters to see pixels from
626 // other render targets. See crbug.com/314867. 638 // other render targets. See crbug.com/314867.
627 639
628 return true; 640 return true;
629 } 641 }
630 642
631 sk_sp<SkImage> SoftwareRenderer::ApplyImageFilter( 643 sk_sp<SkImage> SoftwareRenderer::ApplyImageFilter(
632 SkImageFilter* filter, 644 SkImageFilter* filter,
633 const RenderPassDrawQuad* quad, 645 const RenderPassDrawQuad* quad,
646 const SkIRect& dst_rect,
634 const SkBitmap* to_filter) const { 647 const SkBitmap* to_filter) const {
635 if (!filter) 648 if (!filter)
636 return nullptr; 649 return nullptr;
637 650
638 SkImageInfo dst_info = 651 SkImageInfo dst_info =
639 SkImageInfo::MakeN32Premul(to_filter->width(), to_filter->height()); 652 SkImageInfo::MakeN32Premul(dst_rect.width(), dst_rect.height());
640 sk_sp<SkSurface> surface = SkSurface::MakeRaster(dst_info); 653 sk_sp<SkSurface> surface = SkSurface::MakeRaster(dst_info);
641 654
642 SkMatrix localM; 655 SkMatrix local_matrix;
643 localM.setTranslate(SkIntToScalar(-quad->rect.origin().x()), 656 local_matrix.setScale(quad->filters_scale.x(), quad->filters_scale.y());
644 SkIntToScalar(-quad->rect.origin().y()));
645 localM.preScale(quad->filters_scale.x(), quad->filters_scale.y());
646 657
647 SkPaint paint; 658 SkPaint paint;
648 paint.setImageFilter(filter->makeWithLocalMatrix(localM)); 659 paint.setImageFilter(filter->makeWithLocalMatrix(local_matrix));
649 surface->getCanvas()->drawBitmap(*to_filter, 0, 0, &paint); 660 surface->getCanvas()->translate(-dst_rect.x(), -dst_rect.y());
661 surface->getCanvas()->drawBitmap(*to_filter, quad->rect.x(), quad->rect.y(),
662 &paint);
650 663
651 return surface->makeImageSnapshot(); 664 return surface->makeImageSnapshot();
652 } 665 }
653 666
654 SkBitmap SoftwareRenderer::GetBackdropBitmap( 667 SkBitmap SoftwareRenderer::GetBackdropBitmap(
655 const gfx::Rect& bounding_rect) const { 668 const gfx::Rect& bounding_rect) const {
656 SkBitmap bitmap; 669 SkBitmap bitmap;
657 bitmap.setInfo(SkImageInfo::MakeN32Premul(bounding_rect.width(), 670 bitmap.setInfo(SkImageInfo::MakeN32Premul(bounding_rect.width(),
658 bounding_rect.height())); 671 bounding_rect.height()));
659 current_canvas_->readPixels(&bitmap, bounding_rect.x(), bounding_rect.y()); 672 current_canvas_->readPixels(&bitmap, bounding_rect.x(), bounding_rect.y());
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
704 SkMatrix filter_backdrop_transform = 717 SkMatrix filter_backdrop_transform =
705 contents_device_transform_inverse.matrix(); 718 contents_device_transform_inverse.matrix();
706 filter_backdrop_transform.preTranslate(backdrop_rect.x(), backdrop_rect.y()); 719 filter_backdrop_transform.preTranslate(backdrop_rect.x(), backdrop_rect.y());
707 720
708 // Draw what's behind, and apply the filter to it. 721 // Draw what's behind, and apply the filter to it.
709 SkBitmap backdrop_bitmap = GetBackdropBitmap(backdrop_rect); 722 SkBitmap backdrop_bitmap = GetBackdropBitmap(backdrop_rect);
710 723
711 sk_sp<SkImageFilter> filter = RenderSurfaceFilters::BuildImageFilter( 724 sk_sp<SkImageFilter> filter = RenderSurfaceFilters::BuildImageFilter(
712 quad->background_filters, 725 quad->background_filters,
713 gfx::SizeF(backdrop_bitmap.width(), backdrop_bitmap.height())); 726 gfx::SizeF(backdrop_bitmap.width(), backdrop_bitmap.height()));
714 sk_sp<SkImage> filter_backdrop_image = 727 sk_sp<SkImage> filter_backdrop_image = ApplyImageFilter(
715 ApplyImageFilter(filter.get(), quad, &backdrop_bitmap); 728 filter.get(), quad, backdrop_bitmap.bounds(), &backdrop_bitmap);
716 729
717 if (!filter_backdrop_image) 730 if (!filter_backdrop_image)
718 return nullptr; 731 return nullptr;
719 732
720 return filter_backdrop_image->makeShader(content_tile_mode, content_tile_mode, 733 return filter_backdrop_image->makeShader(content_tile_mode, content_tile_mode,
721 &filter_backdrop_transform); 734 &filter_backdrop_transform);
722 } 735 }
723 736
724 } // namespace cc 737 } // namespace cc
OLDNEW
« 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