| 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 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 95 } | 95 } |
| 96 | 96 |
| 97 SoftwareRenderer::~SoftwareRenderer() {} | 97 SoftwareRenderer::~SoftwareRenderer() {} |
| 98 | 98 |
| 99 const RendererCapabilitiesImpl& SoftwareRenderer::Capabilities() const { | 99 const RendererCapabilitiesImpl& SoftwareRenderer::Capabilities() const { |
| 100 return capabilities_; | 100 return capabilities_; |
| 101 } | 101 } |
| 102 | 102 |
| 103 void SoftwareRenderer::BeginDrawingFrame(DrawingFrame* frame) { | 103 void SoftwareRenderer::BeginDrawingFrame(DrawingFrame* frame) { |
| 104 TRACE_EVENT0("cc", "SoftwareRenderer::BeginDrawingFrame"); | 104 TRACE_EVENT0("cc", "SoftwareRenderer::BeginDrawingFrame"); |
| 105 root_canvas_ = output_device_->BeginPaint( | 105 root_canvas_ = output_device_->BeginPaint(frame->root_damage_rect); |
| 106 gfx::ToEnclosingRect(frame->root_damage_rect)); | |
| 107 } | 106 } |
| 108 | 107 |
| 109 void SoftwareRenderer::FinishDrawingFrame(DrawingFrame* frame) { | 108 void SoftwareRenderer::FinishDrawingFrame(DrawingFrame* frame) { |
| 110 TRACE_EVENT0("cc", "SoftwareRenderer::FinishDrawingFrame"); | 109 TRACE_EVENT0("cc", "SoftwareRenderer::FinishDrawingFrame"); |
| 111 current_framebuffer_lock_ = nullptr; | 110 current_framebuffer_lock_ = nullptr; |
| 112 current_framebuffer_canvas_.clear(); | 111 current_framebuffer_canvas_.clear(); |
| 113 current_canvas_ = NULL; | 112 current_canvas_ = NULL; |
| 114 root_canvas_ = NULL; | 113 root_canvas_ = NULL; |
| 115 | 114 |
| 116 output_device_->EndPaint(); | 115 output_device_->EndPaint(); |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 247 if (!current_canvas_) | 246 if (!current_canvas_) |
| 248 return; | 247 return; |
| 249 if (draw_region) { | 248 if (draw_region) { |
| 250 current_canvas_->save(); | 249 current_canvas_->save(); |
| 251 } | 250 } |
| 252 | 251 |
| 253 TRACE_EVENT0("cc", "SoftwareRenderer::DoDrawQuad"); | 252 TRACE_EVENT0("cc", "SoftwareRenderer::DoDrawQuad"); |
| 254 gfx::Transform quad_rect_matrix; | 253 gfx::Transform quad_rect_matrix; |
| 255 QuadRectTransform(&quad_rect_matrix, | 254 QuadRectTransform(&quad_rect_matrix, |
| 256 quad->shared_quad_state->quad_to_target_transform, | 255 quad->shared_quad_state->quad_to_target_transform, |
| 257 quad->rect); | 256 gfx::RectF(quad->rect)); |
| 258 gfx::Transform contents_device_transform = | 257 gfx::Transform contents_device_transform = |
| 259 frame->window_matrix * frame->projection_matrix * quad_rect_matrix; | 258 frame->window_matrix * frame->projection_matrix * quad_rect_matrix; |
| 260 contents_device_transform.FlattenTo2d(); | 259 contents_device_transform.FlattenTo2d(); |
| 261 SkMatrix sk_device_matrix; | 260 SkMatrix sk_device_matrix; |
| 262 gfx::TransformToFlattenedSkMatrix(contents_device_transform, | 261 gfx::TransformToFlattenedSkMatrix(contents_device_transform, |
| 263 &sk_device_matrix); | 262 &sk_device_matrix); |
| 264 current_canvas_->setMatrix(sk_device_matrix); | 263 current_canvas_->setMatrix(sk_device_matrix); |
| 265 | 264 |
| 266 current_paint_.reset(); | 265 current_paint_.reset(); |
| 267 if (settings_->force_antialiasing || | 266 if (settings_->force_antialiasing || |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 389 &filtered_canvas, quad->content_rect, quad->contents_scale); | 388 &filtered_canvas, quad->content_rect, quad->contents_scale); |
| 390 } else { | 389 } else { |
| 391 quad->raster_source->PlaybackToSharedCanvas( | 390 quad->raster_source->PlaybackToSharedCanvas( |
| 392 current_canvas_, quad->content_rect, quad->contents_scale); | 391 current_canvas_, quad->content_rect, quad->contents_scale); |
| 393 } | 392 } |
| 394 } | 393 } |
| 395 | 394 |
| 396 void SoftwareRenderer::DrawSolidColorQuad(const DrawingFrame* frame, | 395 void SoftwareRenderer::DrawSolidColorQuad(const DrawingFrame* frame, |
| 397 const SolidColorDrawQuad* quad) { | 396 const SolidColorDrawQuad* quad) { |
| 398 gfx::RectF visible_quad_vertex_rect = MathUtil::ScaleRectProportional( | 397 gfx::RectF visible_quad_vertex_rect = MathUtil::ScaleRectProportional( |
| 399 QuadVertexRect(), quad->rect, quad->visible_rect); | 398 QuadVertexRect(), gfx::RectF(quad->rect), gfx::RectF(quad->visible_rect)); |
| 400 current_paint_.setColor(quad->color); | 399 current_paint_.setColor(quad->color); |
| 401 current_paint_.setAlpha(quad->shared_quad_state->opacity * | 400 current_paint_.setAlpha(quad->shared_quad_state->opacity * |
| 402 SkColorGetA(quad->color)); | 401 SkColorGetA(quad->color)); |
| 403 current_canvas_->drawRect(gfx::RectFToSkRect(visible_quad_vertex_rect), | 402 current_canvas_->drawRect(gfx::RectFToSkRect(visible_quad_vertex_rect), |
| 404 current_paint_); | 403 current_paint_); |
| 405 } | 404 } |
| 406 | 405 |
| 407 void SoftwareRenderer::DrawTextureQuad(const DrawingFrame* frame, | 406 void SoftwareRenderer::DrawTextureQuad(const DrawingFrame* frame, |
| 408 const TextureDrawQuad* quad) { | 407 const TextureDrawQuad* quad) { |
| 409 if (!IsSoftwareResource(quad->resource_id())) { | 408 if (!IsSoftwareResource(quad->resource_id())) { |
| 410 DrawUnsupportedQuad(frame, quad); | 409 DrawUnsupportedQuad(frame, quad); |
| 411 return; | 410 return; |
| 412 } | 411 } |
| 413 | 412 |
| 414 // TODO(skaslev): Add support for non-premultiplied alpha. | 413 // TODO(skaslev): Add support for non-premultiplied alpha. |
| 415 ResourceProvider::ScopedReadLockSoftware lock(resource_provider_, | 414 ResourceProvider::ScopedReadLockSoftware lock(resource_provider_, |
| 416 quad->resource_id()); | 415 quad->resource_id()); |
| 417 if (!lock.valid()) | 416 if (!lock.valid()) |
| 418 return; | 417 return; |
| 419 const SkBitmap* bitmap = lock.sk_bitmap(); | 418 const SkBitmap* bitmap = lock.sk_bitmap(); |
| 420 gfx::RectF uv_rect = gfx::ScaleRect(gfx::BoundingRect(quad->uv_top_left, | 419 gfx::RectF uv_rect = gfx::ScaleRect(gfx::BoundingRect(quad->uv_top_left, |
| 421 quad->uv_bottom_right), | 420 quad->uv_bottom_right), |
| 422 bitmap->width(), | 421 bitmap->width(), |
| 423 bitmap->height()); | 422 bitmap->height()); |
| 424 gfx::RectF visible_uv_rect = | 423 gfx::RectF visible_uv_rect = MathUtil::ScaleRectProportional( |
| 425 MathUtil::ScaleRectProportional(uv_rect, quad->rect, quad->visible_rect); | 424 uv_rect, gfx::RectF(quad->rect), gfx::RectF(quad->visible_rect)); |
| 426 SkRect sk_uv_rect = gfx::RectFToSkRect(visible_uv_rect); | 425 SkRect sk_uv_rect = gfx::RectFToSkRect(visible_uv_rect); |
| 427 gfx::RectF visible_quad_vertex_rect = MathUtil::ScaleRectProportional( | 426 gfx::RectF visible_quad_vertex_rect = MathUtil::ScaleRectProportional( |
| 428 QuadVertexRect(), quad->rect, quad->visible_rect); | 427 QuadVertexRect(), gfx::RectF(quad->rect), gfx::RectF(quad->visible_rect)); |
| 429 SkRect quad_rect = gfx::RectFToSkRect(visible_quad_vertex_rect); | 428 SkRect quad_rect = gfx::RectFToSkRect(visible_quad_vertex_rect); |
| 430 | 429 |
| 431 if (quad->y_flipped) | 430 if (quad->y_flipped) |
| 432 current_canvas_->scale(1, -1); | 431 current_canvas_->scale(1, -1); |
| 433 | 432 |
| 434 bool blend_background = quad->background_color != SK_ColorTRANSPARENT && | 433 bool blend_background = quad->background_color != SK_ColorTRANSPARENT && |
| 435 !bitmap->isOpaque(); | 434 !bitmap->isOpaque(); |
| 436 bool needs_layer = blend_background && (current_paint_.getAlpha() != 0xFF); | 435 bool needs_layer = blend_background && (current_paint_.getAlpha() != 0xFF); |
| 437 if (needs_layer) { | 436 if (needs_layer) { |
| 438 current_canvas_->saveLayerAlpha(&quad_rect, current_paint_.getAlpha()); | 437 current_canvas_->saveLayerAlpha(&quad_rect, current_paint_.getAlpha()); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 471 DCHECK(resource_provider_); | 470 DCHECK(resource_provider_); |
| 472 DCHECK(IsSoftwareResource(quad->resource_id())); | 471 DCHECK(IsSoftwareResource(quad->resource_id())); |
| 473 | 472 |
| 474 ResourceProvider::ScopedReadLockSoftware lock(resource_provider_, | 473 ResourceProvider::ScopedReadLockSoftware lock(resource_provider_, |
| 475 quad->resource_id()); | 474 quad->resource_id()); |
| 476 if (!lock.valid()) | 475 if (!lock.valid()) |
| 477 return; | 476 return; |
| 478 DCHECK_EQ(GL_CLAMP_TO_EDGE, lock.wrap_mode()); | 477 DCHECK_EQ(GL_CLAMP_TO_EDGE, lock.wrap_mode()); |
| 479 | 478 |
| 480 gfx::RectF visible_tex_coord_rect = MathUtil::ScaleRectProportional( | 479 gfx::RectF visible_tex_coord_rect = MathUtil::ScaleRectProportional( |
| 481 quad->tex_coord_rect, quad->rect, quad->visible_rect); | 480 quad->tex_coord_rect, gfx::RectF(quad->rect), |
| 481 gfx::RectF(quad->visible_rect)); |
| 482 gfx::RectF visible_quad_vertex_rect = MathUtil::ScaleRectProportional( | 482 gfx::RectF visible_quad_vertex_rect = MathUtil::ScaleRectProportional( |
| 483 QuadVertexRect(), quad->rect, quad->visible_rect); | 483 QuadVertexRect(), gfx::RectF(quad->rect), gfx::RectF(quad->visible_rect)); |
| 484 | 484 |
| 485 SkRect uv_rect = gfx::RectFToSkRect(visible_tex_coord_rect); | 485 SkRect uv_rect = gfx::RectFToSkRect(visible_tex_coord_rect); |
| 486 current_paint_.setFilterQuality( | 486 current_paint_.setFilterQuality( |
| 487 quad->nearest_neighbor ? kNone_SkFilterQuality : kLow_SkFilterQuality); | 487 quad->nearest_neighbor ? kNone_SkFilterQuality : kLow_SkFilterQuality); |
| 488 current_canvas_->drawBitmapRect(*lock.sk_bitmap(), uv_rect, | 488 current_canvas_->drawBitmapRect(*lock.sk_bitmap(), uv_rect, |
| 489 gfx::RectFToSkRect(visible_quad_vertex_rect), | 489 gfx::RectFToSkRect(visible_quad_vertex_rect), |
| 490 ¤t_paint_); | 490 ¤t_paint_); |
| 491 } | 491 } |
| 492 | 492 |
| 493 void SoftwareRenderer::DrawRenderPassQuad(const DrawingFrame* frame, | 493 void SoftwareRenderer::DrawRenderPassQuad(const DrawingFrame* frame, |
| 494 const RenderPassDrawQuad* quad) { | 494 const RenderPassDrawQuad* quad) { |
| 495 ScopedResource* content_texture = | 495 ScopedResource* content_texture = |
| 496 render_pass_textures_.get(quad->render_pass_id); | 496 render_pass_textures_.get(quad->render_pass_id); |
| 497 DCHECK(content_texture); | 497 DCHECK(content_texture); |
| 498 DCHECK(content_texture->id()); | 498 DCHECK(content_texture->id()); |
| 499 DCHECK(IsSoftwareResource(content_texture->id())); | 499 DCHECK(IsSoftwareResource(content_texture->id())); |
| 500 | 500 |
| 501 ResourceProvider::ScopedReadLockSoftware lock(resource_provider_, | 501 ResourceProvider::ScopedReadLockSoftware lock(resource_provider_, |
| 502 content_texture->id()); | 502 content_texture->id()); |
| 503 if (!lock.valid()) | 503 if (!lock.valid()) |
| 504 return; | 504 return; |
| 505 SkShader::TileMode content_tile_mode = WrapModeToTileMode(lock.wrap_mode()); | 505 SkShader::TileMode content_tile_mode = WrapModeToTileMode(lock.wrap_mode()); |
| 506 | 506 |
| 507 SkRect dest_rect = gfx::RectFToSkRect(QuadVertexRect()); | 507 SkRect dest_rect = gfx::RectFToSkRect(QuadVertexRect()); |
| 508 SkRect dest_visible_rect = gfx::RectFToSkRect(MathUtil::ScaleRectProportional( | 508 SkRect dest_visible_rect = gfx::RectFToSkRect( |
| 509 QuadVertexRect(), quad->rect, quad->visible_rect)); | 509 MathUtil::ScaleRectProportional(QuadVertexRect(), gfx::RectF(quad->rect), |
| 510 gfx::RectF(quad->visible_rect))); |
| 510 SkRect content_rect = SkRect::MakeWH(quad->rect.width(), quad->rect.height()); | 511 SkRect content_rect = SkRect::MakeWH(quad->rect.width(), quad->rect.height()); |
| 511 | 512 |
| 512 SkMatrix content_mat; | 513 SkMatrix content_mat; |
| 513 content_mat.setRectToRect(content_rect, dest_rect, | 514 content_mat.setRectToRect(content_rect, dest_rect, |
| 514 SkMatrix::kFill_ScaleToFit); | 515 SkMatrix::kFill_ScaleToFit); |
| 515 | 516 |
| 516 const SkBitmap* content = lock.sk_bitmap(); | 517 const SkBitmap* content = lock.sk_bitmap(); |
| 517 | 518 |
| 518 SkBitmap filter_bitmap; | 519 SkBitmap filter_bitmap; |
| 519 if (!quad->filters.IsEmpty()) { | 520 if (!quad->filters.IsEmpty()) { |
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 705 skia::RefPtr<SkShader> SoftwareRenderer::GetBackgroundFilterShader( | 706 skia::RefPtr<SkShader> SoftwareRenderer::GetBackgroundFilterShader( |
| 706 const DrawingFrame* frame, | 707 const DrawingFrame* frame, |
| 707 const RenderPassDrawQuad* quad, | 708 const RenderPassDrawQuad* quad, |
| 708 SkShader::TileMode content_tile_mode) const { | 709 SkShader::TileMode content_tile_mode) const { |
| 709 if (!ShouldApplyBackgroundFilters(frame, quad)) | 710 if (!ShouldApplyBackgroundFilters(frame, quad)) |
| 710 return skia::RefPtr<SkShader>(); | 711 return skia::RefPtr<SkShader>(); |
| 711 | 712 |
| 712 gfx::Transform quad_rect_matrix; | 713 gfx::Transform quad_rect_matrix; |
| 713 QuadRectTransform(&quad_rect_matrix, | 714 QuadRectTransform(&quad_rect_matrix, |
| 714 quad->shared_quad_state->quad_to_target_transform, | 715 quad->shared_quad_state->quad_to_target_transform, |
| 715 quad->rect); | 716 gfx::RectF(quad->rect)); |
| 716 gfx::Transform contents_device_transform = | 717 gfx::Transform contents_device_transform = |
| 717 frame->window_matrix * frame->projection_matrix * quad_rect_matrix; | 718 frame->window_matrix * frame->projection_matrix * quad_rect_matrix; |
| 718 contents_device_transform.FlattenTo2d(); | 719 contents_device_transform.FlattenTo2d(); |
| 719 | 720 |
| 720 gfx::Rect backdrop_rect = GetBackdropBoundingBoxForRenderPassQuad( | 721 gfx::Rect backdrop_rect = GetBackdropBoundingBoxForRenderPassQuad( |
| 721 frame, quad, contents_device_transform); | 722 frame, quad, contents_device_transform); |
| 722 | 723 |
| 723 // Figure out the transformations to move it back to pixel space. | 724 // Figure out the transformations to move it back to pixel space. |
| 724 gfx::Transform contents_device_transform_inverse; | 725 gfx::Transform contents_device_transform_inverse; |
| 725 if (!contents_device_transform.GetInverse(&contents_device_transform_inverse)) | 726 if (!contents_device_transform.GetInverse(&contents_device_transform_inverse)) |
| (...skipping 14 matching lines...) Expand all Loading... |
| 740 | 741 |
| 741 if (filter_backdrop_bitmap.empty()) | 742 if (filter_backdrop_bitmap.empty()) |
| 742 return skia::RefPtr<SkShader>(); | 743 return skia::RefPtr<SkShader>(); |
| 743 | 744 |
| 744 return skia::AdoptRef(SkShader::CreateBitmapShader( | 745 return skia::AdoptRef(SkShader::CreateBitmapShader( |
| 745 filter_backdrop_bitmap, content_tile_mode, content_tile_mode, | 746 filter_backdrop_bitmap, content_tile_mode, content_tile_mode, |
| 746 &filter_backdrop_transform)); | 747 &filter_backdrop_transform)); |
| 747 } | 748 } |
| 748 | 749 |
| 749 } // namespace cc | 750 } // namespace cc |
| OLD | NEW |