Chromium Code Reviews| 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" |
| 11 #include "cc/output/compositor_frame_metadata.h" | 11 #include "cc/output/compositor_frame_metadata.h" |
| 12 #include "cc/output/output_surface.h" | 12 #include "cc/output/output_surface.h" |
| 13 #include "cc/output/software_output_device.h" | 13 #include "cc/output/software_output_device.h" |
| 14 #include "cc/quads/debug_border_draw_quad.h" | 14 #include "cc/quads/debug_border_draw_quad.h" |
| 15 #include "cc/quads/picture_draw_quad.h" | |
| 15 #include "cc/quads/render_pass_draw_quad.h" | 16 #include "cc/quads/render_pass_draw_quad.h" |
| 16 #include "cc/quads/solid_color_draw_quad.h" | 17 #include "cc/quads/solid_color_draw_quad.h" |
| 17 #include "cc/quads/texture_draw_quad.h" | 18 #include "cc/quads/texture_draw_quad.h" |
| 18 #include "cc/quads/tile_draw_quad.h" | 19 #include "cc/quads/tile_draw_quad.h" |
| 19 #include "third_party/skia/include/core/SkCanvas.h" | 20 #include "third_party/skia/include/core/SkCanvas.h" |
| 20 #include "third_party/skia/include/core/SkColor.h" | 21 #include "third_party/skia/include/core/SkColor.h" |
| 21 #include "third_party/skia/include/core/SkDevice.h" | 22 #include "third_party/skia/include/core/SkDevice.h" |
| 22 #include "third_party/skia/include/core/SkMatrix.h" | 23 #include "third_party/skia/include/core/SkMatrix.h" |
| 23 #include "third_party/skia/include/core/SkShader.h" | 24 #include "third_party/skia/include/core/SkShader.h" |
| 24 #include "third_party/skia/include/effects/SkLayerRasterizer.h" | 25 #include "third_party/skia/include/effects/SkLayerRasterizer.h" |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 64 SoftwareRenderer::SoftwareRenderer(RendererClient* client, | 65 SoftwareRenderer::SoftwareRenderer(RendererClient* client, |
| 65 OutputSurface* output_surface, | 66 OutputSurface* output_surface, |
| 66 ResourceProvider* resource_provider) | 67 ResourceProvider* resource_provider) |
| 67 : DirectRenderer(client, resource_provider), | 68 : DirectRenderer(client, resource_provider), |
| 68 visible_(true), | 69 visible_(true), |
| 69 is_scissor_enabled_(false), | 70 is_scissor_enabled_(false), |
| 70 is_viewport_changed_(true), | 71 is_viewport_changed_(true), |
| 71 output_surface_(output_surface), | 72 output_surface_(output_surface), |
| 72 output_device_(output_surface->software_device()), | 73 output_device_(output_surface->software_device()), |
| 73 current_canvas_(NULL) { | 74 current_canvas_(NULL) { |
| 74 capabilities_.max_texture_size = resource_provider_->max_texture_size(); | 75 if (resource_provider_) { |
|
enne (OOO)
2013/05/07 06:11:22
Can you fill in these values here with something o
aelias_OOO_until_Jul13
2013/05/07 23:51:47
Hmm, that doesn't seem quite right. Nobody ever l
enne (OOO)
2013/05/09 17:35:43
Ok, I'll buy that argument.
| |
| 75 capabilities_.best_texture_format = resource_provider_->best_texture_format(); | 76 capabilities_.max_texture_size = resource_provider_->max_texture_size(); |
| 77 capabilities_.best_texture_format = | |
| 78 resource_provider_->best_texture_format(); | |
| 79 } | |
| 76 capabilities_.using_set_visibility = true; | 80 capabilities_.using_set_visibility = true; |
| 77 // The updater can access bitmaps while the SoftwareRenderer is using them. | 81 // The updater can access bitmaps while the SoftwareRenderer is using them. |
| 78 capabilities_.allow_partial_texture_updates = true; | 82 capabilities_.allow_partial_texture_updates = true; |
| 79 capabilities_.using_partial_swap = true; | 83 capabilities_.using_partial_swap = true; |
| 80 if (Settings().compositor_frame_message && client_->HasImplThread()) | 84 if (Settings().compositor_frame_message && client_->HasImplThread()) |
| 81 capabilities_.using_swap_complete_callback = true; | 85 capabilities_.using_swap_complete_callback = true; |
| 82 compositor_frame_.software_frame_data.reset(new SoftwareFrameData()); | 86 compositor_frame_.software_frame_data.reset(new SoftwareFrameData()); |
| 83 } | 87 } |
| 84 | 88 |
| 85 SoftwareRenderer::~SoftwareRenderer() {} | 89 SoftwareRenderer::~SoftwareRenderer() {} |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 236 current_paint_.setAlpha(quad->opacity() * 255); | 240 current_paint_.setAlpha(quad->opacity() * 255); |
| 237 current_paint_.setXfermodeMode(SkXfermode::kSrcOver_Mode); | 241 current_paint_.setXfermodeMode(SkXfermode::kSrcOver_Mode); |
| 238 } else { | 242 } else { |
| 239 current_paint_.setXfermodeMode(SkXfermode::kSrc_Mode); | 243 current_paint_.setXfermodeMode(SkXfermode::kSrc_Mode); |
| 240 } | 244 } |
| 241 | 245 |
| 242 switch (quad->material) { | 246 switch (quad->material) { |
| 243 case DrawQuad::DEBUG_BORDER: | 247 case DrawQuad::DEBUG_BORDER: |
| 244 DrawDebugBorderQuad(frame, DebugBorderDrawQuad::MaterialCast(quad)); | 248 DrawDebugBorderQuad(frame, DebugBorderDrawQuad::MaterialCast(quad)); |
| 245 break; | 249 break; |
| 250 case DrawQuad::PICTURE_CONTENT: | |
| 251 DrawPictureQuad(frame, PictureDrawQuad::MaterialCast(quad)); | |
| 252 break; | |
| 246 case DrawQuad::SOLID_COLOR: | 253 case DrawQuad::SOLID_COLOR: |
| 247 DrawSolidColorQuad(frame, SolidColorDrawQuad::MaterialCast(quad)); | 254 DrawSolidColorQuad(frame, SolidColorDrawQuad::MaterialCast(quad)); |
| 248 break; | 255 break; |
| 249 case DrawQuad::TEXTURE_CONTENT: | 256 case DrawQuad::TEXTURE_CONTENT: |
| 250 DrawTextureQuad(frame, TextureDrawQuad::MaterialCast(quad)); | 257 DrawTextureQuad(frame, TextureDrawQuad::MaterialCast(quad)); |
| 251 break; | 258 break; |
| 252 case DrawQuad::TILED_CONTENT: | 259 case DrawQuad::TILED_CONTENT: |
| 253 DrawTileQuad(frame, TileDrawQuad::MaterialCast(quad)); | 260 DrawTileQuad(frame, TileDrawQuad::MaterialCast(quad)); |
| 254 break; | 261 break; |
| 255 case DrawQuad::RENDER_PASS: | 262 case DrawQuad::RENDER_PASS: |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 275 current_canvas_->resetMatrix(); | 282 current_canvas_->resetMatrix(); |
| 276 | 283 |
| 277 current_paint_.setColor(quad->color); | 284 current_paint_.setColor(quad->color); |
| 278 current_paint_.setAlpha(quad->opacity() * SkColorGetA(quad->color)); | 285 current_paint_.setAlpha(quad->opacity() * SkColorGetA(quad->color)); |
| 279 current_paint_.setStyle(SkPaint::kStroke_Style); | 286 current_paint_.setStyle(SkPaint::kStroke_Style); |
| 280 current_paint_.setStrokeWidth(quad->width); | 287 current_paint_.setStrokeWidth(quad->width); |
| 281 current_canvas_->drawPoints(SkCanvas::kPolygon_PointMode, | 288 current_canvas_->drawPoints(SkCanvas::kPolygon_PointMode, |
| 282 4, transformed_vertices, current_paint_); | 289 4, transformed_vertices, current_paint_); |
| 283 } | 290 } |
| 284 | 291 |
| 292 void SoftwareRenderer::DrawPictureQuad(const DrawingFrame* frame, | |
| 293 const PictureDrawQuad* quad) { | |
| 294 SkMatrix content_matrix; | |
| 295 content_matrix.setRectToRect( | |
| 296 gfx::RectFToSkRect(quad->tex_coord_rect), | |
| 297 gfx::RectFToSkRect(QuadVertexRect()), | |
| 298 SkMatrix::kFill_ScaleToFit); | |
| 299 current_canvas_->concat(content_matrix); | |
| 300 | |
| 301 if (quad->ShouldDrawWithBlending()) { | |
| 302 TRACE_EVENT0("cc", "SoftwareRenderer::DrawPictureQuad with blending"); | |
| 303 SkBitmap temp_bitmap; | |
| 304 temp_bitmap.setConfig(SkBitmap::kARGB_8888_Config, | |
| 305 quad->texture_size.width(), | |
| 306 quad->texture_size.height()); | |
| 307 temp_bitmap.allocPixels(); | |
| 308 SkDevice temp_device(temp_bitmap); | |
| 309 SkCanvas temp_canvas(&temp_device); | |
| 310 | |
| 311 quad->picture_pile->Raster( | |
| 312 &temp_canvas, quad->content_rect, quad->contents_scale, NULL); | |
| 313 | |
| 314 current_paint_.setFilterBitmap(true); | |
| 315 current_canvas_->drawBitmap(temp_bitmap, 0, 0, ¤t_paint_); | |
| 316 } else { | |
| 317 TRACE_EVENT0("cc", | |
| 318 "SoftwareRenderer::DrawPictureQuad direct from PicturePile"); | |
| 319 quad->picture_pile->Raster( | |
| 320 current_canvas_, quad->content_rect, quad->contents_scale, NULL); | |
| 321 } | |
| 322 } | |
| 323 | |
| 285 void SoftwareRenderer::DrawSolidColorQuad(const DrawingFrame* frame, | 324 void SoftwareRenderer::DrawSolidColorQuad(const DrawingFrame* frame, |
| 286 const SolidColorDrawQuad* quad) { | 325 const SolidColorDrawQuad* quad) { |
| 287 current_paint_.setColor(quad->color); | 326 current_paint_.setColor(quad->color); |
| 288 current_paint_.setAlpha(quad->opacity() * SkColorGetA(quad->color)); | 327 current_paint_.setAlpha(quad->opacity() * SkColorGetA(quad->color)); |
| 289 current_canvas_->drawRect(gfx::RectFToSkRect(QuadVertexRect()), | 328 current_canvas_->drawRect(gfx::RectFToSkRect(QuadVertexRect()), |
| 290 current_paint_); | 329 current_paint_); |
| 291 } | 330 } |
| 292 | 331 |
| 293 void SoftwareRenderer::DrawTextureQuad(const DrawingFrame* frame, | 332 void SoftwareRenderer::DrawTextureQuad(const DrawingFrame* frame, |
| 294 const TextureDrawQuad* quad) { | 333 const TextureDrawQuad* quad) { |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 308 SkRect sk_uv_rect = gfx::RectFToSkRect(uv_rect); | 347 SkRect sk_uv_rect = gfx::RectFToSkRect(uv_rect); |
| 309 if (quad->flipped) | 348 if (quad->flipped) |
| 310 current_canvas_->scale(1, -1); | 349 current_canvas_->scale(1, -1); |
| 311 current_canvas_->drawBitmapRectToRect(*bitmap, &sk_uv_rect, | 350 current_canvas_->drawBitmapRectToRect(*bitmap, &sk_uv_rect, |
| 312 gfx::RectFToSkRect(QuadVertexRect()), | 351 gfx::RectFToSkRect(QuadVertexRect()), |
| 313 ¤t_paint_); | 352 ¤t_paint_); |
| 314 } | 353 } |
| 315 | 354 |
| 316 void SoftwareRenderer::DrawTileQuad(const DrawingFrame* frame, | 355 void SoftwareRenderer::DrawTileQuad(const DrawingFrame* frame, |
| 317 const TileDrawQuad* quad) { | 356 const TileDrawQuad* quad) { |
| 357 DCHECK(!output_surface_->ForcedDrawToSoftwareDevice()); | |
| 318 DCHECK(IsSoftwareResource(quad->resource_id)); | 358 DCHECK(IsSoftwareResource(quad->resource_id)); |
| 319 ResourceProvider::ScopedReadLockSoftware lock(resource_provider_, | 359 ResourceProvider::ScopedReadLockSoftware lock(resource_provider_, |
| 320 quad->resource_id); | 360 quad->resource_id); |
| 321 | 361 |
| 322 SkRect uv_rect = gfx::RectFToSkRect(quad->tex_coord_rect); | 362 SkRect uv_rect = gfx::RectFToSkRect(quad->tex_coord_rect); |
| 323 current_paint_.setFilterBitmap(true); | 363 current_paint_.setFilterBitmap(true); |
| 324 current_canvas_->drawBitmapRectToRect(*lock.sk_bitmap(), &uv_rect, | 364 current_canvas_->drawBitmapRectToRect(*lock.sk_bitmap(), &uv_rect, |
| 325 gfx::RectFToSkRect(QuadVertexRect()), | 365 gfx::RectFToSkRect(QuadVertexRect()), |
| 326 ¤t_paint_); | 366 ¤t_paint_); |
| 327 } | 367 } |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 427 4 * rect.width()); | 467 4 * rect.width()); |
| 428 } | 468 } |
| 429 | 469 |
| 430 void SoftwareRenderer::SetVisible(bool visible) { | 470 void SoftwareRenderer::SetVisible(bool visible) { |
| 431 if (visible_ == visible) | 471 if (visible_ == visible) |
| 432 return; | 472 return; |
| 433 visible_ = visible; | 473 visible_ = visible; |
| 434 } | 474 } |
| 435 | 475 |
| 436 } // namespace cc | 476 } // namespace cc |
| OLD | NEW |