Chromium Code Reviews| Index: cc/output/overlay_candidate.cc |
| diff --git a/cc/output/overlay_candidate.cc b/cc/output/overlay_candidate.cc |
| index c05947b3d17956e0980b082d8654ca5582647424..b9e68cd3198943635a6c8edeafd2433ade185bb2 100644 |
| --- a/cc/output/overlay_candidate.cc |
| +++ b/cc/output/overlay_candidate.cc |
| @@ -8,6 +8,10 @@ |
| #include <limits> |
| #include "base/logging.h" |
| #include "cc/base/math_util.h" |
| +#include "cc/quads/io_surface_draw_quad.h" |
| +#include "cc/quads/solid_color_draw_quad.h" |
| +#include "cc/quads/stream_video_draw_quad.h" |
| +#include "cc/quads/texture_draw_quad.h" |
| #include "ui/gfx/geometry/rect_conversions.h" |
| #include "ui/gfx/geometry/vector3d_f.h" |
| @@ -47,6 +51,116 @@ OverlayCandidate::OverlayCandidate() |
| OverlayCandidate::~OverlayCandidate() {} |
| // static |
| +bool OverlayCandidate::FromDrawQuad(const DrawQuad* quad, |
| + OverlayCandidate* candidate) { |
| + if (quad->needs_blending || quad->shared_quad_state->opacity != 1.f || |
| + quad->shared_quad_state->blend_mode != SkXfermode::kSrcOver_Mode) |
| + return false; |
| + |
| + candidate->format = RGBA_8888; |
| + candidate->display_rect = GetOverlayRect( |
|
ccameron
2015/09/29 23:29:55
Remove GetOverlayRect as a function and make it in
Andre
2015/09/30 00:18:38
Done.
|
| + quad->shared_quad_state->quad_to_target_transform, quad->rect); |
| + candidate->quad_rect_in_target_space = MathUtil::MapEnclosingClippedRect( |
| + quad->shared_quad_state->quad_to_target_transform, quad->rect); |
| + candidate->clip_rect = quad->shared_quad_state->clip_rect; |
| + candidate->is_clipped = quad->shared_quad_state->is_clipped; |
| + |
| + switch (quad->material) { |
| + case DrawQuad::TEXTURE_CONTENT: |
| + return FromTextureQuad(TextureDrawQuad::MaterialCast(quad), candidate); |
| + case DrawQuad::STREAM_VIDEO_CONTENT: |
| + return FromStreamVideoQuad(StreamVideoDrawQuad::MaterialCast(quad), |
| + candidate); |
| + case DrawQuad::IO_SURFACE_CONTENT: |
| + return FromIOSurfaceQuad(IOSurfaceDrawQuad::MaterialCast(quad), |
| + candidate); |
| + default: |
| + break; |
| + } |
| + |
| + return false; |
| +} |
| + |
| +// static |
| +bool OverlayCandidate::FromTextureQuad(const TextureDrawQuad* quad, |
| + OverlayCandidate* candidate) { |
| + if (!quad->allow_overlay()) |
| + return false; |
| + gfx::OverlayTransform overlay_transform = GetOverlayTransform( |
| + quad->shared_quad_state->quad_to_target_transform, quad->y_flipped); |
| + if (quad->background_color != SK_ColorTRANSPARENT || |
| + quad->premultiplied_alpha || |
| + overlay_transform == gfx::OVERLAY_TRANSFORM_INVALID) |
| + return false; |
| + candidate->resource_id = quad->resource_id(); |
| + candidate->resource_size_in_pixels = quad->resource_size_in_pixels(); |
| + candidate->transform = overlay_transform; |
| + candidate->uv_rect = BoundingRect(quad->uv_top_left, quad->uv_bottom_right); |
| + return true; |
| +} |
| + |
| +// static |
| +bool OverlayCandidate::FromStreamVideoQuad(const StreamVideoDrawQuad* quad, |
| + OverlayCandidate* candidate) { |
| + if (!quad->allow_overlay()) |
| + return false; |
| + gfx::OverlayTransform overlay_transform = GetOverlayTransform( |
| + quad->shared_quad_state->quad_to_target_transform, false); |
| + if (overlay_transform == gfx::OVERLAY_TRANSFORM_INVALID) |
| + return false; |
| + if (!quad->matrix.IsScaleOrTranslation()) { |
| + // We cannot handle anything other than scaling & translation for texture |
| + // coordinates yet. |
| + return false; |
| + } |
| + candidate->resource_id = quad->resource_id(); |
| + candidate->resource_size_in_pixels = quad->resource_size_in_pixels(); |
| + candidate->transform = overlay_transform; |
| + |
| + gfx::Point3F uv0 = gfx::Point3F(0, 0, 0); |
| + gfx::Point3F uv1 = gfx::Point3F(1, 1, 0); |
| + quad->matrix.TransformPoint(&uv0); |
| + quad->matrix.TransformPoint(&uv1); |
| + gfx::Vector3dF delta = uv1 - uv0; |
| + if (delta.x() < 0) { |
| + candidate->transform = ModifyTransform( |
| + candidate->transform, gfx::OVERLAY_TRANSFORM_FLIP_HORIZONTAL); |
| + float x0 = uv0.x(); |
| + uv0.set_x(uv1.x()); |
| + uv1.set_x(x0); |
| + delta.set_x(-delta.x()); |
| + } |
| + |
| + if (delta.y() < 0) { |
| + // In this situation, uv0y < uv1y. Since we overlay inverted, a request |
| + // to invert the source texture means we can just output the texture |
| + // normally and it will be correct. |
| + candidate->uv_rect = gfx::RectF(uv0.x(), uv1.y(), delta.x(), -delta.y()); |
| + } else { |
| + candidate->transform = ModifyTransform( |
| + candidate->transform, gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL); |
| + candidate->uv_rect = gfx::RectF(uv0.x(), uv0.y(), delta.x(), delta.y()); |
| + } |
| + return true; |
| +} |
| + |
| +// static |
| +bool OverlayCandidate::FromIOSurfaceQuad(const IOSurfaceDrawQuad* quad, |
| + OverlayCandidate* candidate) { |
| + if (!quad->allow_overlay) |
| + return false; |
| + gfx::OverlayTransform overlay_transform = GetOverlayTransform( |
| + quad->shared_quad_state->quad_to_target_transform, false); |
| + if (overlay_transform != gfx::OVERLAY_TRANSFORM_NONE) |
| + return false; |
| + candidate->resource_id = quad->io_surface_resource_id(); |
| + candidate->resource_size_in_pixels = quad->io_surface_size; |
| + candidate->transform = overlay_transform; |
| + candidate->uv_rect = gfx::RectF(1.f, 1.f); |
| + return true; |
| +} |
| + |
| +// static |
| gfx::OverlayTransform OverlayCandidate::GetOverlayTransform( |
| const gfx::Transform& quad_transform, |
| bool y_flipped) { |