Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(264)

Side by Side Diff: cc/output/software_renderer.cc

Issue 595593002: Splitting of layers for correct intersections (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixes from issues introduced by the rebase, added tests for video_quads. Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/copy_output_request.h" 12 #include "cc/output/copy_output_request.h"
13 #include "cc/output/output_surface.h" 13 #include "cc/output/output_surface.h"
14 #include "cc/output/render_surface_filters.h" 14 #include "cc/output/render_surface_filters.h"
15 #include "cc/output/software_output_device.h" 15 #include "cc/output/software_output_device.h"
16 #include "cc/quads/checkerboard_draw_quad.h" 16 #include "cc/quads/checkerboard_draw_quad.h"
17 #include "cc/quads/debug_border_draw_quad.h" 17 #include "cc/quads/debug_border_draw_quad.h"
18 #include "cc/quads/picture_draw_quad.h" 18 #include "cc/quads/picture_draw_quad.h"
19 #include "cc/quads/render_pass_draw_quad.h" 19 #include "cc/quads/render_pass_draw_quad.h"
20 #include "cc/quads/solid_color_draw_quad.h" 20 #include "cc/quads/solid_color_draw_quad.h"
21 #include "cc/quads/texture_draw_quad.h" 21 #include "cc/quads/texture_draw_quad.h"
22 #include "cc/quads/tile_draw_quad.h" 22 #include "cc/quads/tile_draw_quad.h"
23 #include "skia/ext/opacity_draw_filter.h" 23 #include "skia/ext/opacity_draw_filter.h"
24 #include "third_party/skia/include/core/SkCanvas.h" 24 #include "third_party/skia/include/core/SkCanvas.h"
25 #include "third_party/skia/include/core/SkColor.h" 25 #include "third_party/skia/include/core/SkColor.h"
26 #include "third_party/skia/include/core/SkImageFilter.h" 26 #include "third_party/skia/include/core/SkImageFilter.h"
27 #include "third_party/skia/include/core/SkMatrix.h" 27 #include "third_party/skia/include/core/SkMatrix.h"
28 #include "third_party/skia/include/core/SkPoint.h"
28 #include "third_party/skia/include/core/SkShader.h" 29 #include "third_party/skia/include/core/SkShader.h"
29 #include "third_party/skia/include/effects/SkLayerRasterizer.h" 30 #include "third_party/skia/include/effects/SkLayerRasterizer.h"
30 #include "ui/gfx/geometry/rect_conversions.h" 31 #include "ui/gfx/geometry/rect_conversions.h"
31 #include "ui/gfx/skia_util.h" 32 #include "ui/gfx/skia_util.h"
32 #include "ui/gfx/transform.h" 33 #include "ui/gfx/transform.h"
33 34
34 namespace cc { 35 namespace cc {
35 namespace { 36 namespace {
36 37
37 static inline bool IsScalarNearlyInteger(SkScalar scalar) { 38 static inline bool IsScalarNearlyInteger(SkScalar scalar) {
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
223 case ResourceProvider::Bitmap: 224 case ResourceProvider::Bitmap:
224 return true; 225 return true;
225 case ResourceProvider::InvalidType: 226 case ResourceProvider::InvalidType:
226 break; 227 break;
227 } 228 }
228 229
229 LOG(FATAL) << "Invalid resource type."; 230 LOG(FATAL) << "Invalid resource type.";
230 return false; 231 return false;
231 } 232 }
232 233
233 void SoftwareRenderer::DoDrawQuad(DrawingFrame* frame, const DrawQuad* quad) { 234 void SoftwareRenderer::DoDrawQuad(DrawingFrame* frame,
235 const DrawQuad* quad,
236 const gfx::QuadF* draw_region) {
237 if (draw_region) {
238 current_canvas_->save();
239 }
240
234 TRACE_EVENT0("cc", "SoftwareRenderer::DoDrawQuad"); 241 TRACE_EVENT0("cc", "SoftwareRenderer::DoDrawQuad");
235 gfx::Transform quad_rect_matrix; 242 gfx::Transform quad_rect_matrix;
236 QuadRectTransform(&quad_rect_matrix, quad->quadTransform(), quad->rect); 243 QuadRectTransform(&quad_rect_matrix, quad->quadTransform(), quad->rect);
237 gfx::Transform contents_device_transform = 244 gfx::Transform contents_device_transform =
238 frame->window_matrix * frame->projection_matrix * quad_rect_matrix; 245 frame->window_matrix * frame->projection_matrix * quad_rect_matrix;
239 contents_device_transform.FlattenTo2d(); 246 contents_device_transform.FlattenTo2d();
240 SkMatrix sk_device_matrix; 247 SkMatrix sk_device_matrix;
241 gfx::TransformToFlattenedSkMatrix(contents_device_transform, 248 gfx::TransformToFlattenedSkMatrix(contents_device_transform,
242 &sk_device_matrix); 249 &sk_device_matrix);
243 current_canvas_->setMatrix(sk_device_matrix); 250 current_canvas_->setMatrix(sk_device_matrix);
(...skipping 14 matching lines...) Expand all
258 } 265 }
259 266
260 if (quad->ShouldDrawWithBlending() || 267 if (quad->ShouldDrawWithBlending() ||
261 quad->shared_quad_state->blend_mode != SkXfermode::kSrcOver_Mode) { 268 quad->shared_quad_state->blend_mode != SkXfermode::kSrcOver_Mode) {
262 current_paint_.setAlpha(quad->opacity() * 255); 269 current_paint_.setAlpha(quad->opacity() * 255);
263 current_paint_.setXfermodeMode(quad->shared_quad_state->blend_mode); 270 current_paint_.setXfermodeMode(quad->shared_quad_state->blend_mode);
264 } else { 271 } else {
265 current_paint_.setXfermodeMode(SkXfermode::kSrc_Mode); 272 current_paint_.setXfermodeMode(SkXfermode::kSrc_Mode);
266 } 273 }
267 274
275 if (draw_region) {
276 gfx::QuadF local_draw_region(*draw_region);
277 SkPath draw_region_clip_path;
278 local_draw_region -=
279 gfx::Vector2dF(quad->visible_rect.x(), quad->visible_rect.y());
280 local_draw_region.Scale(1.0f / quad->visible_rect.width(),
281 1.0f / quad->visible_rect.height());
282 local_draw_region -= gfx::Vector2dF(0.5f, 0.5f);
283
284 SkPoint clip_points[4];
285 QuadFToSkPoints(local_draw_region, clip_points);
286 draw_region_clip_path.addPoly(clip_points, 4, true);
287
288 current_canvas_->clipPath(draw_region_clip_path, SkRegion::kIntersect_Op,
289 false);
290 }
291
268 switch (quad->material) { 292 switch (quad->material) {
269 case DrawQuad::CHECKERBOARD: 293 case DrawQuad::CHECKERBOARD:
270 DrawCheckerboardQuad(frame, CheckerboardDrawQuad::MaterialCast(quad)); 294 // TODO(thildebr) For now since checkerboards shouldn't be part of a 3D
enne (OOO) 2015/02/04 21:24:00 Maybe assign this TODO to somebody else. Me?
awoloszyn 2015/02/12 16:48:52 Done.
295 // context, clipping regions aren't supported so we skip drawing them
296 // if this becomes the case.
297 if (!draw_region) {
298 DrawCheckerboardQuad(frame, CheckerboardDrawQuad::MaterialCast(quad));
299 }
271 break; 300 break;
272 case DrawQuad::DEBUG_BORDER: 301 case DrawQuad::DEBUG_BORDER:
273 DrawDebugBorderQuad(frame, DebugBorderDrawQuad::MaterialCast(quad)); 302 DrawDebugBorderQuad(frame, DebugBorderDrawQuad::MaterialCast(quad));
274 break; 303 break;
275 case DrawQuad::PICTURE_CONTENT: 304 case DrawQuad::PICTURE_CONTENT:
276 DrawPictureQuad(frame, PictureDrawQuad::MaterialCast(quad)); 305 DrawPictureQuad(frame, PictureDrawQuad::MaterialCast(quad));
277 break; 306 break;
278 case DrawQuad::RENDER_PASS: 307 case DrawQuad::RENDER_PASS:
279 DrawRenderPassQuad(frame, RenderPassDrawQuad::MaterialCast(quad)); 308 DrawRenderPassQuad(frame, RenderPassDrawQuad::MaterialCast(quad));
280 break; 309 break;
(...skipping 14 matching lines...) Expand all
295 case DrawQuad::INVALID: 324 case DrawQuad::INVALID:
296 case DrawQuad::IO_SURFACE_CONTENT: 325 case DrawQuad::IO_SURFACE_CONTENT:
297 case DrawQuad::YUV_VIDEO_CONTENT: 326 case DrawQuad::YUV_VIDEO_CONTENT:
298 case DrawQuad::STREAM_VIDEO_CONTENT: 327 case DrawQuad::STREAM_VIDEO_CONTENT:
299 DrawUnsupportedQuad(frame, quad); 328 DrawUnsupportedQuad(frame, quad);
300 NOTREACHED(); 329 NOTREACHED();
301 break; 330 break;
302 } 331 }
303 332
304 current_canvas_->resetMatrix(); 333 current_canvas_->resetMatrix();
334 if (draw_region) {
335 current_canvas_->restore();
336 }
305 } 337 }
306 338
307 void SoftwareRenderer::DrawCheckerboardQuad(const DrawingFrame* frame, 339 void SoftwareRenderer::DrawCheckerboardQuad(const DrawingFrame* frame,
308 const CheckerboardDrawQuad* quad) { 340 const CheckerboardDrawQuad* quad) {
309 gfx::RectF visible_quad_vertex_rect = MathUtil::ScaleRectProportional( 341 gfx::RectF visible_quad_vertex_rect = MathUtil::ScaleRectProportional(
310 QuadVertexRect(), quad->rect, quad->visible_rect); 342 QuadVertexRect(), quad->rect, quad->visible_rect);
311 current_paint_.setColor(quad->color); 343 current_paint_.setColor(quad->color);
312 current_paint_.setAlpha(quad->opacity() * SkColorGetA(quad->color)); 344 current_paint_.setAlpha(quad->opacity() * SkColorGetA(quad->color));
313 current_canvas_->drawRect(gfx::RectFToSkRect(visible_quad_vertex_rect), 345 current_canvas_->drawRect(gfx::RectFToSkRect(visible_quad_vertex_rect),
314 current_paint_); 346 current_paint_);
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after
607 } 639 }
608 640
609 void SoftwareRenderer::DidChangeVisibility() { 641 void SoftwareRenderer::DidChangeVisibility() {
610 if (visible()) 642 if (visible())
611 EnsureBackbuffer(); 643 EnsureBackbuffer();
612 else 644 else
613 DiscardBackbuffer(); 645 DiscardBackbuffer();
614 } 646 }
615 647
616 } // namespace cc 648 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698