| Index: cc/output/software_renderer.cc
|
| diff --git a/cc/output/software_renderer.cc b/cc/output/software_renderer.cc
|
| index 0e96c573ddec618e268f01cc50e3b899d3556f8a..7dd4a71b142f9529538b4bdacdf3a5b5aa359d4c 100644
|
| --- a/cc/output/software_renderer.cc
|
| +++ b/cc/output/software_renderer.cc
|
| @@ -12,6 +12,7 @@
|
| #include "cc/output/output_surface.h"
|
| #include "cc/output/software_output_device.h"
|
| #include "cc/quads/debug_border_draw_quad.h"
|
| +#include "cc/quads/picture_draw_quad.h"
|
| #include "cc/quads/render_pass_draw_quad.h"
|
| #include "cc/quads/solid_color_draw_quad.h"
|
| #include "cc/quads/texture_draw_quad.h"
|
| @@ -71,8 +72,11 @@ SoftwareRenderer::SoftwareRenderer(RendererClient* client,
|
| output_surface_(output_surface),
|
| output_device_(output_surface->software_device()),
|
| current_canvas_(NULL) {
|
| - capabilities_.max_texture_size = resource_provider_->max_texture_size();
|
| - capabilities_.best_texture_format = resource_provider_->best_texture_format();
|
| + if (resource_provider_) {
|
| + capabilities_.max_texture_size = resource_provider_->max_texture_size();
|
| + capabilities_.best_texture_format =
|
| + resource_provider_->best_texture_format();
|
| + }
|
| capabilities_.using_set_visibility = true;
|
| // The updater can access bitmaps while the SoftwareRenderer is using them.
|
| capabilities_.allow_partial_texture_updates = true;
|
| @@ -244,6 +248,9 @@ void SoftwareRenderer::DoDrawQuad(DrawingFrame* frame, const DrawQuad* quad) {
|
| case DrawQuad::DEBUG_BORDER:
|
| DrawDebugBorderQuad(frame, DebugBorderDrawQuad::MaterialCast(quad));
|
| break;
|
| + case DrawQuad::PICTURE_CONTENT:
|
| + DrawPictureQuad(frame, PictureDrawQuad::MaterialCast(quad));
|
| + break;
|
| case DrawQuad::SOLID_COLOR:
|
| DrawSolidColorQuad(frame, SolidColorDrawQuad::MaterialCast(quad));
|
| break;
|
| @@ -283,6 +290,38 @@ void SoftwareRenderer::DrawDebugBorderQuad(const DrawingFrame* frame,
|
| 4, transformed_vertices, current_paint_);
|
| }
|
|
|
| +void SoftwareRenderer::DrawPictureQuad(const DrawingFrame* frame,
|
| + const PictureDrawQuad* quad) {
|
| + SkMatrix content_matrix;
|
| + content_matrix.setRectToRect(
|
| + gfx::RectFToSkRect(quad->tex_coord_rect),
|
| + gfx::RectFToSkRect(QuadVertexRect()),
|
| + SkMatrix::kFill_ScaleToFit);
|
| + current_canvas_->concat(content_matrix);
|
| +
|
| + if (quad->ShouldDrawWithBlending()) {
|
| + TRACE_EVENT0("cc", "SoftwareRenderer::DrawPictureQuad with blending");
|
| + SkBitmap temp_bitmap;
|
| + temp_bitmap.setConfig(SkBitmap::kARGB_8888_Config,
|
| + quad->texture_size.width(),
|
| + quad->texture_size.height());
|
| + temp_bitmap.allocPixels();
|
| + SkDevice temp_device(temp_bitmap);
|
| + SkCanvas temp_canvas(&temp_device);
|
| +
|
| + quad->picture_pile->Raster(
|
| + &temp_canvas, quad->content_rect, quad->contents_scale, NULL);
|
| +
|
| + current_paint_.setFilterBitmap(true);
|
| + current_canvas_->drawBitmap(temp_bitmap, 0, 0, ¤t_paint_);
|
| + } else {
|
| + TRACE_EVENT0("cc",
|
| + "SoftwareRenderer::DrawPictureQuad direct from PicturePile");
|
| + quad->picture_pile->Raster(
|
| + current_canvas_, quad->content_rect, quad->contents_scale, NULL);
|
| + }
|
| +}
|
| +
|
| void SoftwareRenderer::DrawSolidColorQuad(const DrawingFrame* frame,
|
| const SolidColorDrawQuad* quad) {
|
| current_paint_.setColor(quad->color);
|
| @@ -316,6 +355,7 @@ void SoftwareRenderer::DrawTextureQuad(const DrawingFrame* frame,
|
|
|
| void SoftwareRenderer::DrawTileQuad(const DrawingFrame* frame,
|
| const TileDrawQuad* quad) {
|
| + DCHECK(!output_surface_->ForcedDrawToSoftwareDevice());
|
| DCHECK(IsSoftwareResource(quad->resource_id));
|
| ResourceProvider::ScopedReadLockSoftware lock(resource_provider_,
|
| quad->resource_id);
|
|
|