Chromium Code Reviews| 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/trace_event/trace_event.h" | 7 #include "base/trace_event/trace_event.h" |
| 8 #include "cc/base/math_util.h" | 8 #include "cc/base/math_util.h" |
| 9 #include "cc/output/compositor_frame.h" | 9 #include "cc/output/compositor_frame.h" |
| 10 #include "cc/output/compositor_frame_ack.h" | 10 #include "cc/output/compositor_frame_ack.h" |
| (...skipping 487 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 498 | 498 |
| 499 skia::RefPtr<SkImage> filter_image; | 499 skia::RefPtr<SkImage> filter_image; |
| 500 if (!quad->filters.IsEmpty()) { | 500 if (!quad->filters.IsEmpty()) { |
| 501 skia::RefPtr<SkImageFilter> filter = RenderSurfaceFilters::BuildImageFilter( | 501 skia::RefPtr<SkImageFilter> filter = RenderSurfaceFilters::BuildImageFilter( |
| 502 quad->filters, gfx::SizeF(content_texture->size())); | 502 quad->filters, gfx::SizeF(content_texture->size())); |
| 503 // TODO(ajuma): Apply the filter in the same pass as the content where | 503 // TODO(ajuma): Apply the filter in the same pass as the content where |
| 504 // possible (e.g. when there's no origin offset). See crbug.com/308201. | 504 // possible (e.g. when there's no origin offset). See crbug.com/308201. |
| 505 filter_image = ApplyImageFilter(filter.get(), quad, content); | 505 filter_image = ApplyImageFilter(filter.get(), quad, content); |
| 506 } | 506 } |
| 507 | 507 |
| 508 skia::RefPtr<SkShader> shader; | 508 sk_sp<SkShader> shader; |
| 509 if (!filter_image) { | 509 if (!filter_image) { |
| 510 shader = skia::AdoptRef( | 510 shader = |
| 511 SkShader::CreateBitmapShader(*content, SkShader::kClamp_TileMode, | 511 SkShader::MakeBitmapShader(*content, SkShader::kClamp_TileMode, |
| 512 SkShader::kClamp_TileMode, &content_mat)); | 512 SkShader::kClamp_TileMode, &content_mat); |
| 513 } else { | 513 } else { |
| 514 shader = skia::AdoptRef(filter_image->newShader( | 514 shader = filter_image->makeShader(SkShader::kClamp_TileMode, |
| 515 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, &content_mat)); | 515 SkShader::kClamp_TileMode, &content_mat); |
| 516 } | 516 } |
| 517 | 517 |
| 518 scoped_ptr<ResourceProvider::ScopedReadLockSoftware> mask_lock; | 518 scoped_ptr<ResourceProvider::ScopedReadLockSoftware> mask_lock; |
| 519 if (quad->mask_resource_id()) { | 519 if (quad->mask_resource_id()) { |
| 520 mask_lock = scoped_ptr<ResourceProvider::ScopedReadLockSoftware>( | 520 mask_lock = scoped_ptr<ResourceProvider::ScopedReadLockSoftware>( |
| 521 new ResourceProvider::ScopedReadLockSoftware(resource_provider_, | 521 new ResourceProvider::ScopedReadLockSoftware(resource_provider_, |
| 522 quad->mask_resource_id())); | 522 quad->mask_resource_id())); |
| 523 | 523 |
| 524 if (!mask_lock->valid()) | 524 if (!mask_lock->valid()) |
| 525 return; | 525 return; |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 543 SkLayerRasterizer::Builder builder; | 543 SkLayerRasterizer::Builder builder; |
| 544 builder.addLayer(mask_paint); | 544 builder.addLayer(mask_paint); |
| 545 | 545 |
| 546 skia::RefPtr<SkLayerRasterizer> mask_rasterizer = | 546 skia::RefPtr<SkLayerRasterizer> mask_rasterizer = |
| 547 skia::AdoptRef(builder.detachRasterizer()); | 547 skia::AdoptRef(builder.detachRasterizer()); |
| 548 | 548 |
| 549 current_paint_.setRasterizer(mask_rasterizer.get()); | 549 current_paint_.setRasterizer(mask_rasterizer.get()); |
| 550 } | 550 } |
| 551 | 551 |
| 552 // If we have a background filter shader, render its results first. | 552 // If we have a background filter shader, render its results first. |
| 553 skia::RefPtr<SkShader> background_filter_shader = | 553 sk_sp<SkShader> background_filter_shader = |
| 554 GetBackgroundFilterShader(frame, quad, SkShader::kClamp_TileMode); | 554 GetBackgroundFilterShader(frame, quad, SkShader::kClamp_TileMode); |
| 555 if (background_filter_shader) { | 555 if (background_filter_shader) { |
| 556 SkPaint paint; | 556 SkPaint paint; |
| 557 paint.setShader(background_filter_shader.get()); | 557 paint.setShader(std::move(background_filter_shader)); |
| 558 paint.setRasterizer(current_paint_.getRasterizer()); | 558 paint.setRasterizer(current_paint_.getRasterizer()); |
| 559 current_canvas_->drawRect(dest_visible_rect, paint); | 559 current_canvas_->drawRect(dest_visible_rect, paint); |
| 560 } | 560 } |
| 561 current_paint_.setShader(shader.get()); | 561 current_paint_.setShader(std::move(shader)); |
| 562 current_canvas_->drawRect(dest_visible_rect, current_paint_); | 562 current_canvas_->drawRect(dest_visible_rect, current_paint_); |
| 563 } | 563 } |
| 564 | 564 |
| 565 void SoftwareRenderer::DrawUnsupportedQuad(const DrawingFrame* frame, | 565 void SoftwareRenderer::DrawUnsupportedQuad(const DrawingFrame* frame, |
| 566 const DrawQuad* quad) { | 566 const DrawQuad* quad) { |
| 567 #ifdef NDEBUG | 567 #ifdef NDEBUG |
| 568 current_paint_.setColor(SK_ColorWHITE); | 568 current_paint_.setColor(SK_ColorWHITE); |
| 569 #else | 569 #else |
| 570 current_paint_.setColor(SK_ColorMAGENTA); | 570 current_paint_.setColor(SK_ColorMAGENTA); |
| 571 #endif | 571 #endif |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 675 int top, right, bottom, left; | 675 int top, right, bottom, left; |
| 676 quad->background_filters.GetOutsets(&top, &right, &bottom, &left); | 676 quad->background_filters.GetOutsets(&top, &right, &bottom, &left); |
| 677 backdrop_rect.Inset(-left, -top, -right, -bottom); | 677 backdrop_rect.Inset(-left, -top, -right, -bottom); |
| 678 | 678 |
| 679 backdrop_rect.Intersect(MoveFromDrawToWindowSpace( | 679 backdrop_rect.Intersect(MoveFromDrawToWindowSpace( |
| 680 frame, frame->current_render_pass->output_rect)); | 680 frame, frame->current_render_pass->output_rect)); |
| 681 | 681 |
| 682 return backdrop_rect; | 682 return backdrop_rect; |
| 683 } | 683 } |
| 684 | 684 |
| 685 skia::RefPtr<SkShader> SoftwareRenderer::GetBackgroundFilterShader( | 685 sk_sp<SkShader> SoftwareRenderer::GetBackgroundFilterShader( |
| 686 const DrawingFrame* frame, | 686 const DrawingFrame* frame, |
| 687 const RenderPassDrawQuad* quad, | 687 const RenderPassDrawQuad* quad, |
| 688 SkShader::TileMode content_tile_mode) const { | 688 SkShader::TileMode content_tile_mode) const { |
| 689 if (!ShouldApplyBackgroundFilters(quad)) | 689 if (!ShouldApplyBackgroundFilters(quad)) |
| 690 return skia::RefPtr<SkShader>(); | 690 return sk_sp<SkShader>(); |
|
danakj
2016/03/25 18:18:08
can you just return nullptr? (sk_sp has a nullptr
f(malita)
2016/03/25 18:31:03
+1
tomhudson
2016/03/25 19:27:31
Done.
| |
| 691 | 691 |
| 692 gfx::Transform quad_rect_matrix; | 692 gfx::Transform quad_rect_matrix; |
| 693 QuadRectTransform(&quad_rect_matrix, | 693 QuadRectTransform(&quad_rect_matrix, |
| 694 quad->shared_quad_state->quad_to_target_transform, | 694 quad->shared_quad_state->quad_to_target_transform, |
| 695 gfx::RectF(quad->rect)); | 695 gfx::RectF(quad->rect)); |
| 696 gfx::Transform contents_device_transform = | 696 gfx::Transform contents_device_transform = |
| 697 frame->window_matrix * frame->projection_matrix * quad_rect_matrix; | 697 frame->window_matrix * frame->projection_matrix * quad_rect_matrix; |
| 698 contents_device_transform.FlattenTo2d(); | 698 contents_device_transform.FlattenTo2d(); |
| 699 | 699 |
| 700 gfx::Rect backdrop_rect = GetBackdropBoundingBoxForRenderPassQuad( | 700 gfx::Rect backdrop_rect = GetBackdropBoundingBoxForRenderPassQuad( |
| 701 frame, quad, contents_device_transform); | 701 frame, quad, contents_device_transform); |
| 702 | 702 |
| 703 // Figure out the transformations to move it back to pixel space. | 703 // Figure out the transformations to move it back to pixel space. |
| 704 gfx::Transform contents_device_transform_inverse; | 704 gfx::Transform contents_device_transform_inverse; |
| 705 if (!contents_device_transform.GetInverse(&contents_device_transform_inverse)) | 705 if (!contents_device_transform.GetInverse(&contents_device_transform_inverse)) |
| 706 return skia::RefPtr<SkShader>(); | 706 return sk_sp<SkShader>(); |
|
danakj
2016/03/25 18:18:08
ditto
tomhudson
2016/03/25 19:27:31
Done.
| |
| 707 | 707 |
| 708 SkMatrix filter_backdrop_transform = | 708 SkMatrix filter_backdrop_transform = |
| 709 contents_device_transform_inverse.matrix(); | 709 contents_device_transform_inverse.matrix(); |
| 710 filter_backdrop_transform.preTranslate(backdrop_rect.x(), backdrop_rect.y()); | 710 filter_backdrop_transform.preTranslate(backdrop_rect.x(), backdrop_rect.y()); |
| 711 | 711 |
| 712 // Draw what's behind, and apply the filter to it. | 712 // Draw what's behind, and apply the filter to it. |
| 713 SkBitmap backdrop_bitmap = GetBackdropBitmap(backdrop_rect); | 713 SkBitmap backdrop_bitmap = GetBackdropBitmap(backdrop_rect); |
| 714 | 714 |
| 715 skia::RefPtr<SkImageFilter> filter = RenderSurfaceFilters::BuildImageFilter( | 715 skia::RefPtr<SkImageFilter> filter = RenderSurfaceFilters::BuildImageFilter( |
| 716 quad->background_filters, | 716 quad->background_filters, |
| 717 gfx::SizeF(backdrop_bitmap.width(), backdrop_bitmap.height())); | 717 gfx::SizeF(backdrop_bitmap.width(), backdrop_bitmap.height())); |
| 718 skia::RefPtr<SkImage> filter_backdrop_image = | 718 skia::RefPtr<SkImage> filter_backdrop_image = |
| 719 ApplyImageFilter(filter.get(), quad, &backdrop_bitmap); | 719 ApplyImageFilter(filter.get(), quad, &backdrop_bitmap); |
| 720 | 720 |
| 721 if (!filter_backdrop_image) | 721 if (!filter_backdrop_image) |
| 722 return nullptr; | 722 return nullptr; |
| 723 | 723 |
| 724 return skia::AdoptRef(filter_backdrop_image->newShader( | 724 return filter_backdrop_image->makeShader(content_tile_mode, content_tile_mode, |
| 725 content_tile_mode, content_tile_mode, &filter_backdrop_transform)); | 725 &filter_backdrop_transform); |
| 726 } | 726 } |
| 727 | 727 |
| 728 } // namespace cc | 728 } // namespace cc |
| OLD | NEW |