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

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

Issue 1430813002: cc: Fork OverlayCandidate to CALayerOverlay (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master1
Patch Set: Rebase Created 5 years, 1 month 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
« no previous file with comments | « cc/output/ca_layer_overlay.h ('k') | cc/output/direct_renderer.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "cc/output/ca_layer_overlay.h"
6
7 #include "cc/quads/io_surface_draw_quad.h"
8 #include "cc/quads/solid_color_draw_quad.h"
9 #include "cc/quads/stream_video_draw_quad.h"
10 #include "cc/quads/texture_draw_quad.h"
11 #include "cc/quads/tile_draw_quad.h"
12 #include "cc/resources/resource_provider.h"
13
14 namespace cc {
15
16 namespace {
17
18 bool FromIOSurfaceQuad(ResourceProvider* resource_provider,
19 const IOSurfaceDrawQuad* quad,
20 CALayerOverlay* ca_layer_overlay) {
21 unsigned resource_id = quad->io_surface_resource_id();
22 if (!resource_provider->IsOverlayCandidate(resource_id))
23 return false;
24 ca_layer_overlay->contents_resource_id = resource_id;
25 ca_layer_overlay->contents_rect = gfx::RectF(0, 0, 1, 1);
26 return true;
27 }
28
29 bool FromStreamVideoQuad(ResourceProvider* resource_provider,
30 const StreamVideoDrawQuad* quad,
31 CALayerOverlay* ca_layer_overlay) {
32 unsigned resource_id = quad->resource_id();
33 if (!resource_provider->IsOverlayCandidate(resource_id))
34 return false;
35 ca_layer_overlay->contents_resource_id = resource_id;
36 // TODO(ccameron): Support merging at least some basic transforms into the
37 // layer transform.
38 if (!quad->matrix.IsIdentity())
39 return false;
40 ca_layer_overlay->contents_rect = gfx::RectF(0, 0, 1, 1);
41 return true;
42 }
43
44 bool FromSolidColorDrawQuad(const SolidColorDrawQuad* quad,
45 CALayerOverlay* ca_layer_overlay,
46 bool* skip) {
47 // Do not generate quads that are completely transparent.
48 if (SkColorGetA(quad->color) == 0) {
49 *skip = true;
50 return true;
51 }
52 ca_layer_overlay->background_color = quad->color;
53 return true;
54 }
55
56 bool FromTextureQuad(ResourceProvider* resource_provider,
57 const TextureDrawQuad* quad,
58 CALayerOverlay* ca_layer_overlay) {
59 unsigned resource_id = quad->resource_id();
60 if (!resource_provider->IsOverlayCandidate(resource_id))
61 return false;
62 // TODO(ccameron): Merge the y flip into the layer transform.
63 if (quad->y_flipped)
64 return false;
65 ca_layer_overlay->contents_resource_id = resource_id;
66 ca_layer_overlay->contents_rect =
67 BoundingRect(quad->uv_top_left, quad->uv_bottom_right);
68 ca_layer_overlay->background_color = quad->background_color;
69 return true;
70 }
71
72 bool FromTileQuad(ResourceProvider* resource_provider,
73 const TileDrawQuad* quad,
74 CALayerOverlay* ca_layer_overlay) {
75 unsigned resource_id = quad->resource_id();
76 if (!resource_provider->IsOverlayCandidate(resource_id))
77 return false;
78 ca_layer_overlay->contents_resource_id = resource_id;
79 ca_layer_overlay->contents_rect = quad->tex_coord_rect;
80 ca_layer_overlay->contents_rect.Scale(1.f / quad->texture_size.width(),
81 1.f / quad->texture_size.height());
82 return true;
83 }
84
85 bool FromDrawQuad(ResourceProvider* resource_provider,
86 const gfx::RectF& display_rect,
87 const DrawQuad* quad,
88 CALayerOverlay* ca_layer_overlay,
89 bool* skip) {
90 if (quad->shared_quad_state->blend_mode != SkXfermode::kSrcOver_Mode)
91 return false;
92
93 // TODO(ccameron): Handle 3D transforms.
94 if (!quad->shared_quad_state->quad_to_target_transform.IsFlat())
95 return false;
96
97 // Early-out for invisible quads.
98 if (quad->shared_quad_state->opacity == 0.f) {
99 *skip = true;
100 return true;
101 }
102
103 // Check rect clipping.
104 gfx::RectF quad_rect(quad->rect);
105 if (quad->shared_quad_state->is_clipped) {
106 gfx::RectF clip_rect = gfx::RectF(quad->shared_quad_state->clip_rect);
107 gfx::RectF quad_rect_in_clip_space = gfx::RectF(quad->rect);
108 quad->shared_quad_state->quad_to_target_transform.TransformRect(
109 &quad_rect_in_clip_space);
110 quad_rect_in_clip_space.Intersect(display_rect);
111 // Skip quads that are entirely clipped.
112 if (!quad_rect_in_clip_space.Intersects(clip_rect)) {
113 *skip = true;
114 return true;
115 }
116 // Fall back if the clip rect actually has an effect.
117 // TODO(ccameron): Handle more clip rects.
118 if (!clip_rect.Contains(quad_rect_in_clip_space)) {
119 return false;
120 }
121 }
122
123 ca_layer_overlay->opacity = quad->shared_quad_state->opacity;
124 ca_layer_overlay->bounds_size = gfx::SizeF(quad->rect.size());
125 ca_layer_overlay->transform.setTranslate(quad->rect.x(), quad->rect.y(), 0);
126 ca_layer_overlay->transform.postConcat(
127 quad->shared_quad_state->quad_to_target_transform.matrix());
128
129 switch (quad->material) {
130 case DrawQuad::IO_SURFACE_CONTENT:
131 return FromIOSurfaceQuad(resource_provider,
132 IOSurfaceDrawQuad::MaterialCast(quad),
133 ca_layer_overlay);
134 case DrawQuad::TEXTURE_CONTENT:
135 return FromTextureQuad(resource_provider,
136 TextureDrawQuad::MaterialCast(quad),
137 ca_layer_overlay);
138 case DrawQuad::TILED_CONTENT:
139 return FromTileQuad(resource_provider, TileDrawQuad::MaterialCast(quad),
140 ca_layer_overlay);
141 case DrawQuad::SOLID_COLOR:
142 return FromSolidColorDrawQuad(SolidColorDrawQuad::MaterialCast(quad),
143 ca_layer_overlay, skip);
144 case DrawQuad::STREAM_VIDEO_CONTENT:
145 return FromStreamVideoQuad(resource_provider,
146 StreamVideoDrawQuad::MaterialCast(quad),
147 ca_layer_overlay);
148 default:
149 return false;
150 break;
151 }
152
153 return true;
154 }
155
156 } // namespace
157
158 CALayerOverlay::CALayerOverlay()
159 : contents_resource_id(0),
160 opacity(1),
161 background_color(SK_ColorTRANSPARENT),
162 transform(SkMatrix44::kIdentity_Constructor) {}
163
164 CALayerOverlay::~CALayerOverlay() {}
165
166 bool ProcessForCALayerOverlays(ResourceProvider* resource_provider,
167 const gfx::RectF& display_rect,
168 const QuadList& quad_list,
169 CALayerOverlayList* ca_layer_overlays) {
170 for (auto it = quad_list.BackToFrontBegin(); it != quad_list.BackToFrontEnd();
171 ++it) {
172 const DrawQuad* quad = *it;
173 CALayerOverlay ca_layer_overlay;
174 bool skip = false;
175 if (!FromDrawQuad(resource_provider, display_rect, quad, &ca_layer_overlay,
176 &skip)) {
177 ca_layer_overlays->clear();
178 return false;
179 }
180 if (skip)
181 continue;
182 ca_layer_overlays->push_back(ca_layer_overlay);
183 }
184 return true;
185 }
186
187 } // namespace cc
OLDNEW
« no previous file with comments | « cc/output/ca_layer_overlay.h ('k') | cc/output/direct_renderer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698