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 |