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 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
91 } | 91 } |
92 | 92 |
93 void SoftwareRenderer::BeginDrawingFrame(DrawingFrame* frame) { | 93 void SoftwareRenderer::BeginDrawingFrame(DrawingFrame* frame) { |
94 TRACE_EVENT0("cc", "SoftwareRenderer::BeginDrawingFrame"); | 94 TRACE_EVENT0("cc", "SoftwareRenderer::BeginDrawingFrame"); |
95 root_canvas_ = output_device_->BeginPaint(frame->root_damage_rect); | 95 root_canvas_ = output_device_->BeginPaint(frame->root_damage_rect); |
96 } | 96 } |
97 | 97 |
98 void SoftwareRenderer::FinishDrawingFrame(DrawingFrame* frame) { | 98 void SoftwareRenderer::FinishDrawingFrame(DrawingFrame* frame) { |
99 TRACE_EVENT0("cc", "SoftwareRenderer::FinishDrawingFrame"); | 99 TRACE_EVENT0("cc", "SoftwareRenderer::FinishDrawingFrame"); |
100 current_framebuffer_lock_ = nullptr; | 100 current_framebuffer_lock_ = nullptr; |
101 current_framebuffer_canvas_.clear(); | 101 current_framebuffer_canvas_.reset(); |
102 current_canvas_ = NULL; | 102 current_canvas_ = NULL; |
103 root_canvas_ = NULL; | 103 root_canvas_ = NULL; |
104 | 104 |
105 output_device_->EndPaint(); | 105 output_device_->EndPaint(); |
106 } | 106 } |
107 | 107 |
108 void SoftwareRenderer::SwapBuffers(const CompositorFrameMetadata& metadata) { | 108 void SoftwareRenderer::SwapBuffers(const CompositorFrameMetadata& metadata) { |
109 TRACE_EVENT0("cc,benchmark", "SoftwareRenderer::SwapBuffers"); | 109 TRACE_EVENT0("cc,benchmark", "SoftwareRenderer::SwapBuffers"); |
110 CompositorFrame compositor_frame; | 110 CompositorFrame compositor_frame; |
111 compositor_frame.metadata = metadata; | 111 compositor_frame.metadata = metadata; |
(...skipping 19 matching lines...) Expand all Loading... | |
131 is_scissor_enabled_ = false; | 131 is_scissor_enabled_ = false; |
132 SkISize size = current_canvas_->getBaseLayerSize(); | 132 SkISize size = current_canvas_->getBaseLayerSize(); |
133 SetClipRect(gfx::Rect(size.width(), size.height())); | 133 SetClipRect(gfx::Rect(size.width(), size.height())); |
134 } | 134 } |
135 | 135 |
136 void SoftwareRenderer::Finish() {} | 136 void SoftwareRenderer::Finish() {} |
137 | 137 |
138 void SoftwareRenderer::BindFramebufferToOutputSurface(DrawingFrame* frame) { | 138 void SoftwareRenderer::BindFramebufferToOutputSurface(DrawingFrame* frame) { |
139 DCHECK(!output_surface_->HasExternalStencilTest()); | 139 DCHECK(!output_surface_->HasExternalStencilTest()); |
140 current_framebuffer_lock_ = nullptr; | 140 current_framebuffer_lock_ = nullptr; |
141 current_framebuffer_canvas_.clear(); | 141 current_framebuffer_canvas_.reset(); |
142 current_canvas_ = root_canvas_; | 142 current_canvas_ = root_canvas_; |
143 } | 143 } |
144 | 144 |
145 bool SoftwareRenderer::BindFramebufferToTexture( | 145 bool SoftwareRenderer::BindFramebufferToTexture( |
146 DrawingFrame* frame, | 146 DrawingFrame* frame, |
147 const ScopedResource* texture) { | 147 const ScopedResource* texture) { |
148 DCHECK(texture->id()); | 148 DCHECK(texture->id()); |
149 | 149 |
150 // Explicitly release lock, otherwise we can crash when try to lock | 150 // Explicitly release lock, otherwise we can crash when try to lock |
151 // same texture again. | 151 // same texture again. |
152 current_framebuffer_lock_ = nullptr; | 152 current_framebuffer_lock_ = nullptr; |
153 current_framebuffer_lock_ = | 153 current_framebuffer_lock_ = |
154 base::WrapUnique(new ResourceProvider::ScopedWriteLockSoftware( | 154 base::WrapUnique(new ResourceProvider::ScopedWriteLockSoftware( |
155 resource_provider_, texture->id())); | 155 resource_provider_, texture->id())); |
156 current_framebuffer_canvas_ = | 156 current_framebuffer_canvas_ = |
157 skia::AdoptRef(new SkCanvas(current_framebuffer_lock_->sk_bitmap())); | 157 sk_sp<SkCanvas>(new SkCanvas(current_framebuffer_lock_->sk_bitmap())); |
danakj
2016/04/14 19:37:32
is there nothing like make_scoped_refptr, make_sco
tomhudson
2016/04/25 20:48:13
Done: sk_make_sp<SkCanvas>().
| |
158 current_canvas_ = current_framebuffer_canvas_.get(); | 158 current_canvas_ = current_framebuffer_canvas_.get(); |
159 return true; | 159 return true; |
160 } | 160 } |
161 | 161 |
162 void SoftwareRenderer::SetScissorTestRect(const gfx::Rect& scissor_rect) { | 162 void SoftwareRenderer::SetScissorTestRect(const gfx::Rect& scissor_rect) { |
163 is_scissor_enabled_ = true; | 163 is_scissor_enabled_ = true; |
164 scissor_rect_ = scissor_rect; | 164 scissor_rect_ = scissor_rect; |
165 SetClipRect(scissor_rect); | 165 SetClipRect(scissor_rect); |
166 } | 166 } |
167 | 167 |
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
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; | 495 SkMatrix content_mat; |
496 content_mat.setRectToRect(content_rect, dest_rect, | 496 content_mat.setRectToRect(content_rect, dest_rect, |
497 SkMatrix::kFill_ScaleToFit); | 497 SkMatrix::kFill_ScaleToFit); |
498 | 498 |
499 const SkBitmap* content = lock.sk_bitmap(); | 499 const SkBitmap* content = lock.sk_bitmap(); |
500 | 500 |
501 skia::RefPtr<SkImage> filter_image; | 501 sk_sp<SkImage> filter_image; |
502 if (!quad->filters.IsEmpty()) { | 502 if (!quad->filters.IsEmpty()) { |
503 skia::RefPtr<SkImageFilter> filter = RenderSurfaceFilters::BuildImageFilter( | 503 sk_sp<SkImageFilter> filter = RenderSurfaceFilters::BuildImageFilter( |
504 quad->filters, gfx::SizeF(content_texture->size())); | 504 quad->filters, gfx::SizeF(content_texture->size())); |
505 // TODO(ajuma): Apply the filter in the same pass as the content where | 505 // 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. | 506 // possible (e.g. when there's no origin offset). See crbug.com/308201. |
507 filter_image = ApplyImageFilter(filter.get(), quad, content); | 507 filter_image = ApplyImageFilter(filter.get(), quad, content); |
508 } | 508 } |
509 | 509 |
510 sk_sp<SkShader> shader; | 510 sk_sp<SkShader> shader; |
511 if (!filter_image) { | 511 if (!filter_image) { |
512 shader = | 512 shader = |
513 SkShader::MakeBitmapShader(*content, SkShader::kClamp_TileMode, | 513 SkShader::MakeBitmapShader(*content, SkShader::kClamp_TileMode, |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
621 const RenderPassDrawQuad* quad) const { | 621 const RenderPassDrawQuad* quad) const { |
622 if (quad->background_filters.IsEmpty()) | 622 if (quad->background_filters.IsEmpty()) |
623 return false; | 623 return false; |
624 | 624 |
625 // TODO(hendrikw): Look into allowing background filters to see pixels from | 625 // TODO(hendrikw): Look into allowing background filters to see pixels from |
626 // other render targets. See crbug.com/314867. | 626 // other render targets. See crbug.com/314867. |
627 | 627 |
628 return true; | 628 return true; |
629 } | 629 } |
630 | 630 |
631 skia::RefPtr<SkImage> SoftwareRenderer::ApplyImageFilter( | 631 sk_sp<SkImage> SoftwareRenderer::ApplyImageFilter( |
632 SkImageFilter* filter, | 632 SkImageFilter* filter, |
633 const RenderPassDrawQuad* quad, | 633 const RenderPassDrawQuad* quad, |
634 const SkBitmap* to_filter) const { | 634 const SkBitmap* to_filter) const { |
635 if (!filter) | 635 if (!filter) |
636 return nullptr; | 636 return nullptr; |
637 | 637 |
638 SkImageInfo dst_info = | 638 SkImageInfo dst_info = |
639 SkImageInfo::MakeN32Premul(to_filter->width(), to_filter->height()); | 639 SkImageInfo::MakeN32Premul(to_filter->width(), to_filter->height()); |
640 sk_sp<SkSurface> surface = SkSurface::MakeRaster(dst_info); | 640 sk_sp<SkSurface> surface = SkSurface::MakeRaster(dst_info); |
641 | 641 |
642 SkMatrix localM; | 642 SkMatrix localM; |
643 localM.setTranslate(SkIntToScalar(-quad->rect.origin().x()), | 643 localM.setTranslate(SkIntToScalar(-quad->rect.origin().x()), |
644 SkIntToScalar(-quad->rect.origin().y())); | 644 SkIntToScalar(-quad->rect.origin().y())); |
645 localM.preScale(quad->filters_scale.x(), quad->filters_scale.y()); | 645 localM.preScale(quad->filters_scale.x(), quad->filters_scale.y()); |
646 | 646 |
647 SkPaint paint; | 647 SkPaint paint; |
648 paint.setImageFilter(filter->makeWithLocalMatrix(localM)); | 648 paint.setImageFilter(filter->makeWithLocalMatrix(localM)); |
649 surface->getCanvas()->drawBitmap(*to_filter, 0, 0, &paint); | 649 surface->getCanvas()->drawBitmap(*to_filter, 0, 0, &paint); |
650 | 650 |
651 return skia::AdoptRef(surface->newImageSnapshot()); | 651 return surface->makeImageSnapshot(); |
652 } | 652 } |
653 | 653 |
654 SkBitmap SoftwareRenderer::GetBackdropBitmap( | 654 SkBitmap SoftwareRenderer::GetBackdropBitmap( |
655 const gfx::Rect& bounding_rect) const { | 655 const gfx::Rect& bounding_rect) const { |
656 SkBitmap bitmap; | 656 SkBitmap bitmap; |
657 bitmap.setInfo(SkImageInfo::MakeN32Premul(bounding_rect.width(), | 657 bitmap.setInfo(SkImageInfo::MakeN32Premul(bounding_rect.width(), |
658 bounding_rect.height())); | 658 bounding_rect.height())); |
659 current_canvas_->readPixels(&bitmap, bounding_rect.x(), bounding_rect.y()); | 659 current_canvas_->readPixels(&bitmap, bounding_rect.x(), bounding_rect.y()); |
660 return bitmap; | 660 return bitmap; |
661 } | 661 } |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
701 if (!contents_device_transform.GetInverse(&contents_device_transform_inverse)) | 701 if (!contents_device_transform.GetInverse(&contents_device_transform_inverse)) |
702 return nullptr; | 702 return nullptr; |
703 | 703 |
704 SkMatrix filter_backdrop_transform = | 704 SkMatrix filter_backdrop_transform = |
705 contents_device_transform_inverse.matrix(); | 705 contents_device_transform_inverse.matrix(); |
706 filter_backdrop_transform.preTranslate(backdrop_rect.x(), backdrop_rect.y()); | 706 filter_backdrop_transform.preTranslate(backdrop_rect.x(), backdrop_rect.y()); |
707 | 707 |
708 // Draw what's behind, and apply the filter to it. | 708 // Draw what's behind, and apply the filter to it. |
709 SkBitmap backdrop_bitmap = GetBackdropBitmap(backdrop_rect); | 709 SkBitmap backdrop_bitmap = GetBackdropBitmap(backdrop_rect); |
710 | 710 |
711 skia::RefPtr<SkImageFilter> filter = RenderSurfaceFilters::BuildImageFilter( | 711 sk_sp<SkImageFilter> filter = RenderSurfaceFilters::BuildImageFilter( |
712 quad->background_filters, | 712 quad->background_filters, |
713 gfx::SizeF(backdrop_bitmap.width(), backdrop_bitmap.height())); | 713 gfx::SizeF(backdrop_bitmap.width(), backdrop_bitmap.height())); |
714 skia::RefPtr<SkImage> filter_backdrop_image = | 714 sk_sp<SkImage> filter_backdrop_image = |
715 ApplyImageFilter(filter.get(), quad, &backdrop_bitmap); | 715 ApplyImageFilter(filter.get(), quad, &backdrop_bitmap); |
716 | 716 |
717 if (!filter_backdrop_image) | 717 if (!filter_backdrop_image) |
718 return nullptr; | 718 return nullptr; |
719 | 719 |
720 return filter_backdrop_image->makeShader(content_tile_mode, content_tile_mode, | 720 return filter_backdrop_image->makeShader(content_tile_mode, content_tile_mode, |
721 &filter_backdrop_transform); | 721 &filter_backdrop_transform); |
722 } | 722 } |
723 | 723 |
724 } // namespace cc | 724 } // namespace cc |
OLD | NEW |