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 nullptr; |
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 nullptr; |
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 |