| 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/debug/trace_event.h" | 7 #include "base/debug/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 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 150 | 150 |
| 151 void SoftwareRenderer::BindFramebufferToOutputSurface(DrawingFrame* frame) { | 151 void SoftwareRenderer::BindFramebufferToOutputSurface(DrawingFrame* frame) { |
| 152 DCHECK(!output_surface_->HasExternalStencilTest()); | 152 DCHECK(!output_surface_->HasExternalStencilTest()); |
| 153 current_framebuffer_lock_.reset(); | 153 current_framebuffer_lock_.reset(); |
| 154 current_canvas_ = root_canvas_; | 154 current_canvas_ = root_canvas_; |
| 155 } | 155 } |
| 156 | 156 |
| 157 bool SoftwareRenderer::BindFramebufferToTexture( | 157 bool SoftwareRenderer::BindFramebufferToTexture( |
| 158 DrawingFrame* frame, | 158 DrawingFrame* frame, |
| 159 const ScopedResource* texture, | 159 const ScopedResource* texture, |
| 160 gfx::Rect target_rect) { | 160 const gfx::Rect& target_rect) { |
| 161 current_framebuffer_lock_.reset(); | 161 current_framebuffer_lock_.reset(); |
| 162 current_framebuffer_lock_ = make_scoped_ptr( | 162 current_framebuffer_lock_ = make_scoped_ptr( |
| 163 new ResourceProvider::ScopedWriteLockSoftware( | 163 new ResourceProvider::ScopedWriteLockSoftware( |
| 164 resource_provider_, texture->id())); | 164 resource_provider_, texture->id())); |
| 165 current_canvas_ = current_framebuffer_lock_->sk_canvas(); | 165 current_canvas_ = current_framebuffer_lock_->sk_canvas(); |
| 166 InitializeViewport(frame, | 166 InitializeViewport(frame, |
| 167 target_rect, | 167 target_rect, |
| 168 gfx::Rect(target_rect.size()), | 168 gfx::Rect(target_rect.size()), |
| 169 target_rect.size()); | 169 target_rect.size()); |
| 170 return true; | 170 return true; |
| 171 } | 171 } |
| 172 | 172 |
| 173 void SoftwareRenderer::SetScissorTestRect(gfx::Rect scissor_rect) { | 173 void SoftwareRenderer::SetScissorTestRect(const gfx::Rect& scissor_rect) { |
| 174 is_scissor_enabled_ = true; | 174 is_scissor_enabled_ = true; |
| 175 scissor_rect_ = scissor_rect; | 175 scissor_rect_ = scissor_rect; |
| 176 SetClipRect(scissor_rect); | 176 SetClipRect(scissor_rect); |
| 177 } | 177 } |
| 178 | 178 |
| 179 void SoftwareRenderer::SetClipRect(gfx::Rect rect) { | 179 void SoftwareRenderer::SetClipRect(const gfx::Rect& rect) { |
| 180 // Skia applies the current matrix to clip rects so we reset it temporary. | 180 // Skia applies the current matrix to clip rects so we reset it temporary. |
| 181 SkMatrix current_matrix = current_canvas_->getTotalMatrix(); | 181 SkMatrix current_matrix = current_canvas_->getTotalMatrix(); |
| 182 current_canvas_->resetMatrix(); | 182 current_canvas_->resetMatrix(); |
| 183 current_canvas_->clipRect(gfx::RectToSkRect(rect), SkRegion::kReplace_Op); | 183 current_canvas_->clipRect(gfx::RectToSkRect(rect), SkRegion::kReplace_Op); |
| 184 current_canvas_->setMatrix(current_matrix); | 184 current_canvas_->setMatrix(current_matrix); |
| 185 } | 185 } |
| 186 | 186 |
| 187 void SoftwareRenderer::ClearCanvas(SkColor color) { | 187 void SoftwareRenderer::ClearCanvas(SkColor color) { |
| 188 // SkCanvas::clear doesn't respect the current clipping region | 188 // SkCanvas::clear doesn't respect the current clipping region |
| 189 // so we SkCanvas::drawColor instead if scissoring is active. | 189 // so we SkCanvas::drawColor instead if scissoring is active. |
| (...skipping 12 matching lines...) Expand all Loading... |
| 202 ClearCanvas(SkColorSetARGB(0, 0, 0, 0)); | 202 ClearCanvas(SkColorSetARGB(0, 0, 0, 0)); |
| 203 } else { | 203 } else { |
| 204 #ifndef NDEBUG | 204 #ifndef NDEBUG |
| 205 // On DEBUG builds, opaque render passes are cleared to blue | 205 // On DEBUG builds, opaque render passes are cleared to blue |
| 206 // to easily see regions that were not drawn on the screen. | 206 // to easily see regions that were not drawn on the screen. |
| 207 ClearCanvas(SkColorSetARGB(255, 0, 0, 255)); | 207 ClearCanvas(SkColorSetARGB(255, 0, 0, 255)); |
| 208 #endif | 208 #endif |
| 209 } | 209 } |
| 210 } | 210 } |
| 211 | 211 |
| 212 void SoftwareRenderer::SetDrawViewport(gfx::Rect window_space_viewport) {} | 212 void SoftwareRenderer::SetDrawViewport( |
| 213 const gfx::Rect& window_space_viewport) {} |
| 213 | 214 |
| 214 bool SoftwareRenderer::IsSoftwareResource( | 215 bool SoftwareRenderer::IsSoftwareResource( |
| 215 ResourceProvider::ResourceId resource_id) const { | 216 ResourceProvider::ResourceId resource_id) const { |
| 216 switch (resource_provider_->GetResourceType(resource_id)) { | 217 switch (resource_provider_->GetResourceType(resource_id)) { |
| 217 case ResourceProvider::GLTexture: | 218 case ResourceProvider::GLTexture: |
| 218 return false; | 219 return false; |
| 219 case ResourceProvider::Bitmap: | 220 case ResourceProvider::Bitmap: |
| 220 return true; | 221 return true; |
| 221 case ResourceProvider::InvalidType: | 222 case ResourceProvider::InvalidType: |
| 222 break; | 223 break; |
| (...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 580 } | 581 } |
| 581 | 582 |
| 582 void SoftwareRenderer::EnsureBackbuffer() { | 583 void SoftwareRenderer::EnsureBackbuffer() { |
| 583 if (!is_backbuffer_discarded_) | 584 if (!is_backbuffer_discarded_) |
| 584 return; | 585 return; |
| 585 | 586 |
| 586 output_surface_->EnsureBackbuffer(); | 587 output_surface_->EnsureBackbuffer(); |
| 587 is_backbuffer_discarded_ = false; | 588 is_backbuffer_discarded_ = false; |
| 588 } | 589 } |
| 589 | 590 |
| 590 void SoftwareRenderer::GetFramebufferPixels(void* pixels, gfx::Rect rect) { | 591 void SoftwareRenderer::GetFramebufferPixels(void* pixels, |
| 592 const gfx::Rect& rect) { |
| 591 TRACE_EVENT0("cc", "SoftwareRenderer::GetFramebufferPixels"); | 593 TRACE_EVENT0("cc", "SoftwareRenderer::GetFramebufferPixels"); |
| 592 SkBitmap subset_bitmap; | 594 SkBitmap subset_bitmap; |
| 593 rect += current_viewport_rect_.OffsetFromOrigin(); | 595 gfx::Rect frame_rect(rect); |
| 594 output_device_->CopyToBitmap(rect, &subset_bitmap); | 596 frame_rect += current_viewport_rect_.OffsetFromOrigin(); |
| 597 output_device_->CopyToBitmap(frame_rect, &subset_bitmap); |
| 595 subset_bitmap.copyPixelsTo(pixels, | 598 subset_bitmap.copyPixelsTo(pixels, |
| 596 4 * rect.width() * rect.height(), | 599 4 * frame_rect.width() * frame_rect.height(), |
| 597 4 * rect.width()); | 600 4 * frame_rect.width()); |
| 598 } | 601 } |
| 599 | 602 |
| 600 void SoftwareRenderer::SetVisible(bool visible) { | 603 void SoftwareRenderer::SetVisible(bool visible) { |
| 601 if (visible_ == visible) | 604 if (visible_ == visible) |
| 602 return; | 605 return; |
| 603 visible_ = visible; | 606 visible_ = visible; |
| 604 | 607 |
| 605 if (visible_) | 608 if (visible_) |
| 606 EnsureBackbuffer(); | 609 EnsureBackbuffer(); |
| 607 else | 610 else |
| 608 DiscardBackbuffer(); | 611 DiscardBackbuffer(); |
| 609 } | 612 } |
| 610 | 613 |
| 611 } // namespace cc | 614 } // namespace cc |
| OLD | NEW |