Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/overlay_candidate.h" | 5 #include "cc/output/overlay_candidate.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <limits> | 8 #include <limits> |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "cc/base/math_util.h" | 10 #include "cc/base/math_util.h" |
| 11 #include "cc/quads/io_surface_draw_quad.h" | 11 #include "cc/quads/io_surface_draw_quad.h" |
| 12 #include "cc/quads/solid_color_draw_quad.h" | 12 #include "cc/quads/solid_color_draw_quad.h" |
| 13 #include "cc/quads/stream_video_draw_quad.h" | 13 #include "cc/quads/stream_video_draw_quad.h" |
| 14 #include "cc/quads/texture_draw_quad.h" | 14 #include "cc/quads/texture_draw_quad.h" |
| 15 #include "cc/quads/tile_draw_quad.h" | |
| 15 #include "ui/gfx/geometry/rect_conversions.h" | 16 #include "ui/gfx/geometry/rect_conversions.h" |
| 16 #include "ui/gfx/geometry/vector3d_f.h" | 17 #include "ui/gfx/geometry/vector3d_f.h" |
| 17 | 18 |
| 18 namespace cc { | 19 namespace cc { |
| 19 | 20 |
| 20 namespace { | 21 namespace { |
| 21 // Tolerance for considering axis vector elements to be zero. | 22 // Tolerance for considering axis vector elements to be zero. |
| 22 const SkMScalar kEpsilon = std::numeric_limits<float>::epsilon(); | 23 const SkMScalar kEpsilon = std::numeric_limits<float>::epsilon(); |
| 23 | 24 |
| 24 enum Axis { NONE, AXIS_POS_X, AXIS_NEG_X, AXIS_POS_Y, AXIS_NEG_Y }; | 25 enum Axis { NONE, AXIS_POS_X, AXIS_NEG_X, AXIS_POS_Y, AXIS_NEG_Y }; |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 165 | 166 |
| 166 } // namespace | 167 } // namespace |
| 167 | 168 |
| 168 OverlayCandidate::OverlayCandidate() | 169 OverlayCandidate::OverlayCandidate() |
| 169 : transform(gfx::OVERLAY_TRANSFORM_NONE), | 170 : transform(gfx::OVERLAY_TRANSFORM_NONE), |
| 170 format(RGBA_8888), | 171 format(RGBA_8888), |
| 171 uv_rect(0.f, 0.f, 1.f, 1.f), | 172 uv_rect(0.f, 0.f, 1.f, 1.f), |
| 172 is_clipped(false), | 173 is_clipped(false), |
| 173 use_output_surface_for_resource(false), | 174 use_output_surface_for_resource(false), |
| 174 resource_id(0), | 175 resource_id(0), |
| 176 solid_color(SK_ColorTRANSPARENT), | |
| 175 plane_z_order(0), | 177 plane_z_order(0), |
| 176 overlay_handled(false) {} | 178 overlay_handled(false) {} |
| 177 | 179 |
| 178 OverlayCandidate::~OverlayCandidate() {} | 180 OverlayCandidate::~OverlayCandidate() {} |
| 179 | 181 |
| 180 // static | 182 // static |
| 183 bool OverlayCandidate::IsAllowedQuad(const DrawQuad* quad) { | |
| 184 switch (quad->material) { | |
| 185 case DrawQuad::TEXTURE_CONTENT: | |
| 186 return TextureDrawQuad::MaterialCast(quad)->allow_overlay(); | |
| 187 case DrawQuad::STREAM_VIDEO_CONTENT: | |
| 188 return StreamVideoDrawQuad::MaterialCast(quad)->allow_overlay(); | |
| 189 case DrawQuad::IO_SURFACE_CONTENT: | |
| 190 return IOSurfaceDrawQuad::MaterialCast(quad)->allow_overlay; | |
| 191 default: | |
| 192 break; | |
| 193 } | |
| 194 return false; | |
| 195 } | |
| 196 | |
| 197 // static | |
| 181 bool OverlayCandidate::FromDrawQuad(const DrawQuad* quad, | 198 bool OverlayCandidate::FromDrawQuad(const DrawQuad* quad, |
| 182 OverlayCandidate* candidate) { | 199 OverlayCandidate* candidate) { |
| 183 if (quad->needs_blending || quad->shared_quad_state->opacity != 1.f || | 200 if (quad->needs_blending || quad->shared_quad_state->opacity != 1.f || |
| 184 quad->shared_quad_state->blend_mode != SkXfermode::kSrcOver_Mode) | 201 quad->shared_quad_state->blend_mode != SkXfermode::kSrcOver_Mode) |
| 185 return false; | 202 return false; |
| 186 | 203 |
| 187 auto& transform = quad->shared_quad_state->quad_to_target_transform; | 204 auto& transform = quad->shared_quad_state->quad_to_target_transform; |
| 188 candidate->display_rect = gfx::RectF(quad->rect); | 205 candidate->display_rect = gfx::RectF(quad->rect); |
| 189 transform.TransformRect(&candidate->display_rect); | 206 transform.TransformRect(&candidate->display_rect); |
| 190 candidate->quad_rect_in_target_space = | 207 candidate->quad_rect_in_target_space = |
| 191 MathUtil::MapEnclosingClippedRect(transform, quad->rect); | 208 MathUtil::MapEnclosingClippedRect(transform, quad->rect); |
| 192 | 209 |
| 193 candidate->format = RGBA_8888; | 210 candidate->format = RGBA_8888; |
| 194 candidate->clip_rect = quad->shared_quad_state->clip_rect; | 211 candidate->clip_rect = quad->shared_quad_state->clip_rect; |
| 195 candidate->is_clipped = quad->shared_quad_state->is_clipped; | 212 candidate->is_clipped = quad->shared_quad_state->is_clipped; |
| 196 | 213 |
| 197 switch (quad->material) { | 214 switch (quad->material) { |
| 198 case DrawQuad::TEXTURE_CONTENT: | 215 case DrawQuad::TEXTURE_CONTENT: |
| 199 return FromTextureQuad(TextureDrawQuad::MaterialCast(quad), candidate); | 216 return FromTextureQuad(TextureDrawQuad::MaterialCast(quad), candidate); |
| 200 case DrawQuad::STREAM_VIDEO_CONTENT: | 217 case DrawQuad::STREAM_VIDEO_CONTENT: |
| 201 return FromStreamVideoQuad(StreamVideoDrawQuad::MaterialCast(quad), | 218 return FromStreamVideoQuad(StreamVideoDrawQuad::MaterialCast(quad), |
| 202 candidate); | 219 candidate); |
| 203 case DrawQuad::IO_SURFACE_CONTENT: | 220 case DrawQuad::IO_SURFACE_CONTENT: |
| 204 return FromIOSurfaceQuad(IOSurfaceDrawQuad::MaterialCast(quad), | 221 return FromIOSurfaceQuad(IOSurfaceDrawQuad::MaterialCast(quad), |
| 205 candidate); | 222 candidate); |
|
ccameron
2015/09/30 18:52:09
We're also going to want to make sure that things
Andre
2015/09/30 21:15:15
It's currently using OverlayCandidate::IsAllowedQu
| |
| 223 case DrawQuad::TILED_CONTENT: | |
| 224 return FromTileQuad(TileDrawQuad::MaterialCast(quad), candidate); | |
| 225 case DrawQuad::SOLID_COLOR: | |
| 226 return FromSolidColorQuad(SolidColorDrawQuad::MaterialCast(quad), | |
| 227 candidate); | |
| 206 default: | 228 default: |
| 207 break; | 229 break; |
| 208 } | 230 } |
| 209 | 231 |
| 210 return false; | 232 return false; |
| 211 } | 233 } |
| 212 | 234 |
| 213 // static | 235 // static |
| 214 bool OverlayCandidate::FromTextureQuad(const TextureDrawQuad* quad, | 236 bool OverlayCandidate::FromTextureQuad(const TextureDrawQuad* quad, |
| 215 OverlayCandidate* candidate) { | 237 OverlayCandidate* candidate) { |
| 216 if (!quad->allow_overlay()) | |
| 217 return false; | |
| 218 gfx::OverlayTransform overlay_transform = GetOverlayTransform( | 238 gfx::OverlayTransform overlay_transform = GetOverlayTransform( |
| 219 quad->shared_quad_state->quad_to_target_transform, quad->y_flipped); | 239 quad->shared_quad_state->quad_to_target_transform, quad->y_flipped); |
| 220 if (quad->background_color != SK_ColorTRANSPARENT || | 240 if (quad->background_color != SK_ColorTRANSPARENT || |
| 221 quad->premultiplied_alpha || | 241 quad->premultiplied_alpha || |
| 222 overlay_transform == gfx::OVERLAY_TRANSFORM_INVALID) | 242 overlay_transform == gfx::OVERLAY_TRANSFORM_INVALID) |
| 223 return false; | 243 return false; |
| 224 candidate->resource_id = quad->resource_id(); | 244 candidate->resource_id = quad->resource_id(); |
| 225 candidate->resource_size_in_pixels = quad->resource_size_in_pixels(); | 245 candidate->resource_size_in_pixels = quad->resource_size_in_pixels(); |
| 226 candidate->transform = overlay_transform; | 246 candidate->transform = overlay_transform; |
| 227 candidate->uv_rect = BoundingRect(quad->uv_top_left, quad->uv_bottom_right); | 247 candidate->uv_rect = BoundingRect(quad->uv_top_left, quad->uv_bottom_right); |
| 228 return true; | 248 return true; |
| 229 } | 249 } |
| 230 | 250 |
| 231 // static | 251 // static |
| 232 bool OverlayCandidate::FromStreamVideoQuad(const StreamVideoDrawQuad* quad, | 252 bool OverlayCandidate::FromStreamVideoQuad(const StreamVideoDrawQuad* quad, |
| 233 OverlayCandidate* candidate) { | 253 OverlayCandidate* candidate) { |
| 234 if (!quad->allow_overlay()) | |
| 235 return false; | |
| 236 gfx::OverlayTransform overlay_transform = GetOverlayTransform( | 254 gfx::OverlayTransform overlay_transform = GetOverlayTransform( |
| 237 quad->shared_quad_state->quad_to_target_transform, false); | 255 quad->shared_quad_state->quad_to_target_transform, false); |
| 238 if (overlay_transform == gfx::OVERLAY_TRANSFORM_INVALID) | 256 if (overlay_transform == gfx::OVERLAY_TRANSFORM_INVALID) |
| 239 return false; | 257 return false; |
| 240 if (!quad->matrix.IsScaleOrTranslation()) { | 258 if (!quad->matrix.IsScaleOrTranslation()) { |
| 241 // We cannot handle anything other than scaling & translation for texture | 259 // We cannot handle anything other than scaling & translation for texture |
| 242 // coordinates yet. | 260 // coordinates yet. |
| 243 return false; | 261 return false; |
| 244 } | 262 } |
| 245 candidate->resource_id = quad->resource_id(); | 263 candidate->resource_id = quad->resource_id(); |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 269 candidate->transform = ComposeTransforms( | 287 candidate->transform = ComposeTransforms( |
| 270 gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL, candidate->transform); | 288 gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL, candidate->transform); |
| 271 candidate->uv_rect = gfx::RectF(uv0.x(), uv0.y(), delta.x(), delta.y()); | 289 candidate->uv_rect = gfx::RectF(uv0.x(), uv0.y(), delta.x(), delta.y()); |
| 272 } | 290 } |
| 273 return true; | 291 return true; |
| 274 } | 292 } |
| 275 | 293 |
| 276 // static | 294 // static |
| 277 bool OverlayCandidate::FromIOSurfaceQuad(const IOSurfaceDrawQuad* quad, | 295 bool OverlayCandidate::FromIOSurfaceQuad(const IOSurfaceDrawQuad* quad, |
| 278 OverlayCandidate* candidate) { | 296 OverlayCandidate* candidate) { |
| 279 if (!quad->allow_overlay) | |
| 280 return false; | |
| 281 gfx::OverlayTransform overlay_transform = GetOverlayTransform( | 297 gfx::OverlayTransform overlay_transform = GetOverlayTransform( |
| 282 quad->shared_quad_state->quad_to_target_transform, false); | 298 quad->shared_quad_state->quad_to_target_transform, false); |
| 283 if (overlay_transform != gfx::OVERLAY_TRANSFORM_NONE) | 299 if (overlay_transform != gfx::OVERLAY_TRANSFORM_NONE) |
| 284 return false; | 300 return false; |
| 285 candidate->resource_id = quad->io_surface_resource_id(); | 301 candidate->resource_id = quad->io_surface_resource_id(); |
| 286 candidate->resource_size_in_pixels = quad->io_surface_size; | 302 candidate->resource_size_in_pixels = quad->io_surface_size; |
| 287 candidate->transform = overlay_transform; | 303 candidate->transform = overlay_transform; |
| 288 candidate->uv_rect = gfx::RectF(1.f, 1.f); | 304 candidate->uv_rect = gfx::RectF(1.f, 1.f); |
| 289 return true; | 305 return true; |
| 290 } | 306 } |
| 291 | 307 |
| 308 // static | |
| 309 bool OverlayCandidate::FromTileQuad(const TileDrawQuad* quad, | |
| 310 OverlayCandidate* candidate) { | |
|
ccameron
2015/09/30 18:52:09
We're going to need to plumb through a "allow_over
Andre
2015/09/30 20:57:17
I'm not sure how to do this.
I think we want to Ti
| |
| 311 candidate->transform = GetOverlayTransform( | |
| 312 quad->shared_quad_state->quad_to_target_transform, false); | |
| 313 if (candidate->transform != gfx::OVERLAY_TRANSFORM_NONE) | |
| 314 return false; | |
| 315 candidate->resource_id = quad->resource_id(); | |
| 316 candidate->resource_size_in_pixels = quad->texture_size; | |
| 317 candidate->uv_rect = quad->tex_coord_rect; | |
| 318 candidate->uv_rect.Scale(1.f / quad->texture_size.width(), | |
| 319 1.f / quad->texture_size.height()); | |
| 320 return true; | |
| 321 } | |
| 322 | |
| 323 // static | |
| 324 bool OverlayCandidate::FromSolidColorQuad(const SolidColorDrawQuad* quad, | |
| 325 OverlayCandidate* candidate) { | |
| 326 candidate->transform = GetOverlayTransform( | |
| 327 quad->shared_quad_state->quad_to_target_transform, false); | |
| 328 if (candidate->transform != gfx::OVERLAY_TRANSFORM_NONE) | |
| 329 return false; | |
| 330 candidate->solid_color = quad->color; | |
| 331 return true; | |
| 332 } | |
| 333 | |
| 292 } // namespace cc | 334 } // namespace cc |
| OLD | NEW |