| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |