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

Side by Side Diff: cc/output/software_renderer.cc

Issue 1831883002: Use sk_sp-based shader creation APIs (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 4 years, 8 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') | chrome/browser/ui/libgtk2ui/gtk2_ui.cc » ('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/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
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
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
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
OLDNEW
« no previous file with comments | « cc/output/software_renderer.h ('k') | chrome/browser/ui/libgtk2ui/gtk2_ui.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698